From 2b100e0eb540a20cc6d357ec746562595086fdae Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 18 Oct 2022 18:20:17 +0200 Subject: [PATCH] refact: ADC, switches and keys Add "hardware_defs" target to dump hardware defines from hal.h per target Fixed hal.h definitions for switches & ADC inputs Tools to generate hardware definitions from current hal.h generator: add support for EXTx and analog switches WiP Add generated header to hardware_defs target Add support for ADC input direction and index per GPIO port Incredible: it compiles Removed StdPeriph ADC driver Works on QX7 Works on TX16S (VBat missing) Switch driver using generated switches for stm32 targets Switch driver with generated switches for simu Use switch names from switch driver Fixed single conversion handling Fixed horus VBat reading Added switch name Fix warnings about bitfield offsets and GCC 4.4 This is caused by bitfields that cross type boundaries. In this particular case, it happens as the bitfield is not defined the same in `rtc_backup.cpp`. Switches has already been moved to generic driver Jitter measurement for each sample, not just for oversampled values Moved periph clock init to the ADC driver ADC & GPIOs. Add switchInit() to init pins Fix NV14 CMake Fix taranis target Fix NV14 (again) Model audio files: use new interface for switch index Fix X9-lite Fix simu headers Fix getSwitchName() Add support for ADC switches Fix switch warning YAML Test only switches which are defined Conversions tests for QX7 only on QX7 Fix X12S Fix function switch names Enable ADC periph clock before initialising channels NV14: offset inputs for the sticks & fix switches WiP: get rid of VSRCRAW and some more Simu shall use normal ADC driver fix x7 fix nv14 Fix 9x nav fix 212x64 fix xlite fix x9e fix simu lib fix unit tests fix x7 tests PWM stick values should be written directly into adcValues ... just like FlySky sticks. fix x12s fix nv14 Add some support for SPI ADC (only unit tests) Remove `jq` usage fix generate_yaml.py for newer libclang fix pot config fix stick names Some YAML generator improvements Max 16 Pots on COLORLCD Fix some source names Use 10 bits for switches to prevent overflow Removed horus constants for switches & ADC inputs Fix unit tests Fix curve edit Fix libsimulator Fix function switches (tpro) Refine ADC & analog API Moved hardware definitions scripts and templates into own dir cleanup API refine Fix unit tests Mixer: apply calibration only on required inputs Place ADC switches after all other ADC inputs Fix X12S Remove useless TR_POTS_VSRCRAW, TR_SW_VSRCRAW, and TR_VSRCRAW Cleanup redundant generated YAML parsers Fixes Boxer rebase Add boxer to generate-hw-defs.sh Obsolete LUA exports Add boxer ADC_DIRECTION Split generate_hw_defs.py into multiple files Some cleanup (+ LUA switches) Fix AXIS definitions Fixed translation strings declarations Some rebase fixes Remove some useless StdPeriph drivers fix: set pin mode to reset state on usart deinit fix: use canonical names for calibration data fix: ADC driver does not care about unconfigured inputs fix X12S ADC Add support for ADC conversion chaining Better X12S ADC implem Moved X12S ADC driver to HAL/LL Improve ADC driver separation Fixed taranis & nv14 Moved PWM gimbals to HAL/LL Removed useless TR_EXTRA_VSRCRAW Fixed include guards Small fixes Renamed control inputs Moved internal and external module pulse driver def to boards Move more things to the generic_stm32 board Remove STR_VMIXTRIMS Added analog labels Generate main control names Misuse labels / short labels for main controls Backward compatibility: sliders and legacy names New keys driver Let's get rid of StdPeriph headers in simu Add jinja2 to CI workflows Use `grep` instead of `sed` chore: add python jinja2 oto msys setup script Removed more static definitions and use dynamic ones instead Fixes X9E Fix x7 nav too 212 switch display Fix default sliders Removed NUM_STICKS 212 switch display working nicely Surface radio 'stick' replacements fix: switch, trim & rotary pin init Remove old key drivers Removed VKEYS Removed ETX_FOURCC Fixed SURFACE_NAME Removed TR_VSWITCHES & TR_TRIMS_SWITCHES Fix xpot switches Store calibrated analogs in physical order Use getSourceString in drawSource Implement missing YAML read/write Fix isSourceAvailableInInputs() Fix isSourceAvailable() Some surface fixes Fix CLI debug Ported colour UI of analog diagnostics to new ADC API Small fixes Better input mapping Minor tpro fixes Fix trims available Remove TX mode choice on surface radio Rename surface controls Channel order alignement Fix throttle warning Fix checkTrims() Fix pot config casting issue Fix IS_SWITCH_FS() Fixed input mapping Fix fswitch auto-switch Fixed storing / reading function switches in YAML Fix enableVBatBridge() / disableVBatBridge() Fix interesting mode conversion Fix sources issues Fix special funnction list Proper function switch handling 128 GUI improvements Fix compilation Boxer cosmetics 128 hardware screen cosmetic Fix TX12 switches More switches fixes Simplify CPU type handling Fix flash size Fixed page-up / page-down in libopenui --- .github/workflows/macosx_cpn.yml | 2 +- .github/workflows/win_cpn-64.yml | 2 +- cmake/GenericDefinitions.cmake | 1 - cmake/Macros.cmake | 56 +- cmake/toolchain/arm-none-eabi.cmake | 1 + cmake/toolchain/native.cmake | 9 +- companion/src/CMakeLists.txt | 2 - companion/src/tests/CMakeLists.txt | 2 - .../maxlibqt/src/widgets/CMakeLists.txt | 4 - radio/src/CMakeLists.txt | 42 +- radio/src/analogs.cpp | 100 ++ radio/src/analogs.h | 35 + radio/src/audio.cpp | 20 +- radio/src/audio.h | 6 +- radio/src/boards/generic_stm32/CMakeLists.txt | 40 + .../boards/generic_stm32/analog_inputs.cpp | 85 + .../src/boards/generic_stm32/analog_inputs.h | 24 + radio/src/boards/generic_stm32/inputs.cpp | 48 + .../src/boards/generic_stm32/module_ports.cpp | 88 +- radio/src/boards/generic_stm32/switches.cpp | 110 ++ radio/src/cli.cpp | 53 +- radio/src/dataconstants.h | 442 +---- radio/src/datastructs.h | 44 +- radio/src/datastructs_private.h | 112 +- radio/src/disk_cache.h | 1 - radio/src/functions.cpp | 80 +- radio/src/globals.h | 7 +- radio/src/gui/128x64/gui.h | 211 +-- radio/src/gui/128x64/lcd.cpp | 97 +- radio/src/gui/128x64/lcd.h | 2 +- radio/src/gui/128x64/menus.h | 1 + radio/src/gui/128x64/model_curve_edit.cpp | 7 +- radio/src/gui/128x64/model_custom_scripts.cpp | 2 +- radio/src/gui/128x64/model_display.cpp | 2 +- radio/src/gui/128x64/model_flightmodes.cpp | 90 +- radio/src/gui/128x64/model_input_edit.cpp | 20 +- .../src/gui/128x64/model_logical_switches.cpp | 6 +- radio/src/gui/128x64/model_mix_edit.cpp | 2 +- radio/src/gui/128x64/model_select.cpp | 87 +- radio/src/gui/128x64/model_setup.cpp | 77 +- .../gui/128x64/model_special_functions.cpp | 22 +- radio/src/gui/128x64/radio_calibration.cpp | 170 +- radio/src/gui/128x64/radio_diaganas.cpp | 36 +- radio/src/gui/128x64/radio_diagkeys.cpp | 104 +- radio/src/gui/128x64/radio_setup.cpp | 91 +- radio/src/gui/128x64/view_main.cpp | 253 +-- radio/src/gui/128x64/view_statistics.cpp | 5 +- radio/src/gui/128x64/widgets.cpp | 28 + radio/src/gui/212x64/gui.h | 190 +-- radio/src/gui/212x64/lcd.cpp | 85 +- radio/src/gui/212x64/lcd.h | 4 +- radio/src/gui/212x64/model_curve_edit.cpp | 5 +- radio/src/gui/212x64/model_display.cpp | 2 +- radio/src/gui/212x64/model_input_edit.cpp | 17 +- .../src/gui/212x64/model_logical_switches.cpp | 6 +- radio/src/gui/212x64/model_select.cpp | 74 +- radio/src/gui/212x64/model_setup.cpp | 69 +- .../gui/212x64/model_special_functions.cpp | 16 +- radio/src/gui/212x64/radio_calibration.cpp | 166 +- radio/src/gui/212x64/radio_diaganas.cpp | 8 +- radio/src/gui/212x64/radio_diagkeys.cpp | 43 +- radio/src/gui/212x64/radio_setup.cpp | 44 +- radio/src/gui/212x64/view_channels.cpp | 6 +- radio/src/gui/212x64/view_main.cpp | 149 +- radio/src/gui/212x64/view_statistics.cpp | 17 +- radio/src/gui/colorlcd/LvglWrapper.cpp | 21 +- radio/src/gui/colorlcd/curveedit.cpp | 3 +- radio/src/gui/colorlcd/custom_failsafe.cpp | 2 +- radio/src/gui/colorlcd/draw_functions.cpp | 7 +- radio/src/gui/colorlcd/draw_functions.h | 2 +- radio/src/gui/colorlcd/fullscreen_dialog.cpp | 2 + radio/src/gui/colorlcd/hw_inputs.cpp | 101 +- radio/src/gui/colorlcd/hw_inputs.h | 3 - radio/src/gui/colorlcd/input_edit_adv.cpp | 13 +- radio/src/gui/colorlcd/input_mix_group.cpp | 4 +- radio/src/gui/colorlcd/input_source.cpp | 20 +- radio/src/gui/colorlcd/layouts/sliders.cpp | 30 +- radio/src/gui/colorlcd/layouts/sliders.h | 33 +- radio/src/gui/colorlcd/layouts/trims.cpp | 3 +- radio/src/gui/colorlcd/mixer_edit.cpp | 2 +- radio/src/gui/colorlcd/mixer_edit_adv.cpp | 2 +- radio/src/gui/colorlcd/model_flightmodes.cpp | 23 +- radio/src/gui/colorlcd/model_inputs.cpp | 9 +- .../gui/colorlcd/model_logical_switches.cpp | 7 +- radio/src/gui/colorlcd/model_mixes.cpp | 25 +- radio/src/gui/colorlcd/model_outputs.cpp | 4 +- radio/src/gui/colorlcd/model_select.cpp | 10 +- radio/src/gui/colorlcd/model_usbjoystick.cpp | 4 +- radio/src/gui/colorlcd/output_edit.cpp | 2 +- radio/src/gui/colorlcd/popups.cpp | 2 + radio/src/gui/colorlcd/preflight_checks.cpp | 109 +- radio/src/gui/colorlcd/radio_calibration.cpp | 116 +- radio/src/gui/colorlcd/radio_diaganas.cpp | 80 +- radio/src/gui/colorlcd/radio_diagkeys.cpp | 50 +- radio/src/gui/colorlcd/radio_hardware.cpp | 13 +- radio/src/gui/colorlcd/radio_hardware.h | 11 +- radio/src/gui/colorlcd/radio_setup.cpp | 22 +- radio/src/gui/colorlcd/radio_trainer.cpp | 14 +- radio/src/gui/colorlcd/sourcechoice.cpp | 1 + radio/src/gui/colorlcd/special_functions.cpp | 32 +- radio/src/gui/colorlcd/switch_warn_dialog.cpp | 8 +- radio/src/gui/colorlcd/switchchoice.cpp | 1 + radio/src/gui/colorlcd/tabsgroup.cpp | 8 +- .../gui/colorlcd/view_logical_switches.cpp | 2 +- radio/src/gui/colorlcd/view_main.cpp | 16 +- .../src/gui/colorlcd/view_main_decoration.cpp | 86 +- radio/src/gui/colorlcd/view_text.cpp | 4 +- radio/src/gui/colorlcd/widgets/value.cpp | 2 +- radio/src/gui/colorlcd/widgets_setup.cpp | 2 +- radio/src/gui/common/stdlcd/CMakeLists.txt | 1 + radio/src/gui/common/stdlcd/calibration.cpp | 81 + .../common/stdlcd/calibration.h} | 7 +- .../src/gui/common/stdlcd/draw_functions.cpp | 16 +- radio/src/gui/common/stdlcd/model_curves.cpp | 20 +- radio/src/gui/common/stdlcd/model_inputs.cpp | 120 +- radio/src/gui/common/stdlcd/model_mixes.cpp | 94 +- .../gui/common/stdlcd/model_usbjoystick.cpp | 2 +- radio/src/gui/common/stdlcd/popups.cpp | 96 +- .../src/gui/common/stdlcd/radio_hardware.cpp | 723 ++++---- radio/src/gui/common/stdlcd/radio_trainer.cpp | 12 +- radio/src/gui/common/stdlcd/radio_version.cpp | 43 +- .../src/gui/common/stdlcd/view_telemetry.cpp | 4 +- radio/src/gui/common/stdlcd/view_text.cpp | 43 +- radio/src/gui/gui_common.cpp | 112 +- radio/src/gui/gui_common.h | 4 - radio/src/gui/navigation/common.cpp | 66 +- radio/src/gui/navigation/navigation.h | 187 +++ radio/src/gui/navigation/navigation_9x.cpp | 255 +-- radio/src/gui/navigation/navigation_x7.cpp | 160 +- radio/src/gui/navigation/navigation_x9d.cpp | 199 +-- radio/src/gui/navigation/navigation_xlite.cpp | 136 +- radio/src/hal/CMakeLists.txt | 10 + radio/src/hal/adc_driver.cpp | 458 +++-- radio/src/hal/adc_driver.h | 128 +- radio/src/{debounce.h => hal/key_driver.cpp} | 46 +- radio/src/hal/key_driver.h | 70 + radio/src/hal/rotary_encoder.h | 44 + radio/src/hal/switch_driver.h | 82 + radio/src/inactivity_timer.cpp | 81 + radio/src/inactivity_timer.h | 30 + radio/src/input_mapping.cpp | 149 ++ radio/src/input_mapping.h | 60 + radio/src/io/bootloader_flash.cpp | 2 + radio/src/io/multi_firmware_update.cpp | 2 + radio/src/keys.cpp | 296 +++- radio/src/keys.h | 87 +- radio/src/logs.cpp | 64 +- radio/src/lua/.gitignore | 1 - radio/src/lua/CMakeLists.txt | 51 +- radio/src/lua/api_general.cpp | 260 +-- radio/src/lua/api_model.cpp | 12 +- radio/src/lua/interface.cpp | 21 +- radio/src/lua/lua_api.h | 23 - radio/src/lua/lua_widget.cpp | 5 +- radio/src/main.cpp | 5 +- radio/src/mixer.cpp | 176 +- radio/src/model_init.cpp | 39 +- radio/src/myeeprom.h | 35 +- radio/src/opentx.cpp | 273 +-- radio/src/opentx.h | 138 +- radio/src/opentx_constants.h | 10 +- radio/src/opentx_types.h | 18 +- radio/src/pulses/modules_helpers.h | 5 + radio/src/sdcard.h | 44 - radio/src/simu.cpp | 76 +- radio/src/storage/storage_common.cpp | 2 +- radio/src/storage/yaml/CMakeLists.txt | 52 +- radio/src/storage/yaml/yaml_datastructs.cpp | 25 +- ..._xlite.cpp => yaml_datastructs_128x64.cpp} | 120 +- .../storage/yaml/yaml_datastructs_boxer.cpp | 944 ----------- .../storage/yaml/yaml_datastructs_funcs.cpp | 550 +++--- .../storage/yaml/yaml_datastructs_lr3pro.cpp | 943 ----------- .../storage/yaml/yaml_datastructs_nv14.cpp | 120 +- .../src/storage/yaml/yaml_datastructs_t12.cpp | 943 ----------- .../src/storage/yaml/yaml_datastructs_t8.cpp | 943 ----------- .../storage/yaml/yaml_datastructs_tlite.cpp | 943 ----------- .../storage/yaml/yaml_datastructs_tpro.cpp | 136 +- .../storage/yaml/yaml_datastructs_tx12.cpp | 943 ----------- .../storage/yaml/yaml_datastructs_tx12mk2.cpp | 943 ----------- .../src/storage/yaml/yaml_datastructs_x10.cpp | 135 +- .../storage/yaml/yaml_datastructs_x12s.cpp | 133 +- .../src/storage/yaml/yaml_datastructs_x7.cpp | 943 ----------- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 130 +- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 163 +- .../storage/yaml/yaml_datastructs_x9lite.cpp | 115 +- .../storage/yaml/yaml_datastructs_x9lites.cpp | 938 ----------- .../storage/yaml/yaml_datastructs_xlites.cpp | 120 +- .../storage/yaml/yaml_datastructs_zorro.cpp | 943 ----------- radio/src/storage/yaml/yaml_defs.h | 8 +- radio/src/strhelpers.cpp | 319 ++-- radio/src/strhelpers.h | 25 +- radio/src/switches.cpp | 475 +++--- radio/src/switches.h | 40 + radio/src/targets/common/arm/CMakeLists.txt | 2 +- .../targets/common/arm/stm32/CMakeLists.txt | 4 + .../src/targets/common/arm/stm32/ads79xx.cpp | 173 ++ radio/src/targets/common/arm/stm32/ads79xx.h | 28 + .../targets/common/arm/stm32/board_common.h | 74 +- .../arm/stm32/bootloader/CMakeLists.txt | 14 +- .../common/arm/stm32/bootloader/boot.cpp | 38 +- .../common/arm/stm32/extmodule_driver.cpp | 69 - .../common/arm/stm32/f2/CMakeLists.txt | 4 +- .../common/arm/stm32/f4/CMakeLists.txt | 10 +- .../common/arm/stm32/f4/system_stm32f4xx.c | 30 +- .../targets/common/arm/stm32/flash_driver.cpp | 1 + .../common/arm/stm32/flysky_gimbal_driver.cpp | 55 +- .../arm/stm32/mixer_scheduler_driver.cpp | 7 +- .../targets/common/arm/stm32/pwr_driver.cpp | 18 +- .../arm/stm32/rotary_encoder_driver.cpp | 23 + .../targets/common/arm/stm32/rtc_driver.cpp | 9 + radio/src/targets/common/arm/stm32/sdio_sd.c | 6 + .../common/arm/stm32/sticks_pwm_driver.cpp | 126 +- .../common/arm/stm32/sticks_pwm_driver.h | 25 + .../targets/common/arm/stm32/stm32_adc.cpp | 582 +++++++ .../src/targets/common/arm/stm32/stm32_adc.h | 68 + .../targets/common/arm/stm32/stm32_cmsis.h | 42 + .../common/arm/stm32/stm32_gpio_driver.cpp | 30 + .../arm/stm32/stm32_gpio_driver.h} | 5 +- .../common/arm/stm32/stm32_hal_adc.cpp | 474 ------ .../targets/common/arm/stm32/stm32_hal_ll.h | 55 +- .../{stm32_hal_adc.h => stm32_spi_adc.h} | 31 +- .../common/arm/stm32/stm32_switch_driver.cpp | 128 ++ .../common/arm/stm32/stm32_switch_driver.h | 54 + .../common/arm/stm32/stm32_usart_driver.cpp | 4 +- .../common/arm/stm32/timers_driver.cpp | 1 + .../targets/common/arm/stm32/timers_driver.h | 6 +- .../targets/common/arm/stm32/usb_driver.cpp | 14 +- .../common/arm/stm32/watchdog_driver.h | 39 +- radio/src/targets/horus/CMakeLists.txt | 15 +- radio/src/targets/horus/board.cpp | 80 +- radio/src/targets/horus/board.h | 283 +--- radio/src/targets/horus/hal.h | 426 ++--- radio/src/targets/horus/keys_driver.cpp | 223 --- radio/src/targets/horus/lcd_driver.cpp | 3 + radio/src/targets/horus/libopenui_config.h | 2 - radio/src/targets/horus/sdram_driver.c | 3 +- radio/src/targets/horus/tp_gt911.cpp | 17 +- radio/src/targets/horus/x12s_adc_driver.cpp | 281 ---- radio/src/targets/nv14/CMakeLists.txt | 14 +- radio/src/targets/nv14/backlight_driver.cpp | 1 + radio/src/targets/nv14/battery_driver.cpp | 1 + radio/src/targets/nv14/board.cpp | 64 +- radio/src/targets/nv14/board.h | 226 +-- radio/src/targets/nv14/hal.h | 148 +- radio/src/targets/nv14/keys_driver.cpp | 171 -- radio/src/targets/nv14/lcd_driver.cpp | 6 + radio/src/targets/nv14/libopenui_config.h | 3 - radio/src/targets/nv14/sdram_driver.c | 1 + radio/src/targets/nv14/touch_driver.cpp | 18 +- radio/src/targets/simu/CMakeLists.txt | 16 +- radio/src/targets/simu/adc_driver.cpp | 67 + radio/src/targets/simu/led_driver.cpp | 1 + radio/src/targets/simu/opentxsimulator.cpp | 47 +- radio/src/targets/simu/simpgmspace.cpp | 148 +- radio/src/targets/simu/simpgmspace.h | 176 +- radio/src/targets/simu/simulcd.cpp | 3 + radio/src/targets/simu/switch_driver.cpp | 129 ++ radio/src/targets/taranis/CMakeLists.txt | 168 +- .../targets/taranis/bind_button_driver.cpp | 4 +- radio/src/targets/taranis/board.cpp | 53 +- radio/src/targets/taranis/board.h | 514 +----- radio/src/targets/taranis/eeprom_driver.cpp | 19 +- radio/src/targets/taranis/hal.h | 1470 +++++++++-------- .../taranis/intmodule_pulses_driver.cpp | 73 - radio/src/targets/taranis/keys_driver.cpp | 333 ---- radio/src/targets/taranis/led_driver.cpp | 9 +- .../targets/taranis/startup_stm32f413vgtx.s | 575 +++++++ radio/src/targets/taranis/stm32f413_flash.ld | 172 ++ radio/src/tasks.cpp | 6 +- radio/src/tasks/mixer_task.cpp | 3 + radio/src/tests/CMakeLists.txt | 7 +- radio/src/tests/conversions.cpp | 24 +- radio/src/tests/functions.cpp | 12 +- radio/src/tests/gtests.cpp | 21 +- radio/src/tests/gtests.h | 13 +- radio/src/tests/lcd.cpp | 6 +- radio/src/tests/lua.cpp | 6 +- radio/src/tests/mixer.cpp | 196 +-- radio/src/tests/sources.cpp | 117 ++ radio/src/tests/switches.cpp | 16 +- .../STM32_USB_OTG_Driver/src/usb_dcd_int.c | 30 +- radio/src/timers.cpp | 18 +- radio/src/translations.cpp | 48 +- radio/src/translations.h | 49 +- radio/src/translations/cn.h | 155 +- radio/src/translations/cz.h | 136 +- radio/src/translations/da.h | 138 +- radio/src/translations/de.h | 143 +- radio/src/translations/en.h | 143 +- radio/src/translations/es.h | 142 +- radio/src/translations/fi.h | 142 +- radio/src/translations/fr.h | 145 +- radio/src/translations/it.h | 149 +- radio/src/translations/jp.h | 142 +- radio/src/translations/nl.h | 149 +- radio/src/translations/pl.h | 146 +- radio/src/translations/pt.h | 145 +- radio/src/translations/se.h | 148 +- radio/src/translations/tw.h | 143 +- radio/src/translations/untranslated.h | 60 +- radio/util/hw_defs/generate_hw_def.py | 28 + radio/util/hw_defs/generator.py | 84 + radio/util/hw_defs/hal_adc.py | 273 +++ radio/util/hw_defs/hal_adc_inputs.jinja | 67 + radio/util/hw_defs/hal_json.py | 93 ++ radio/util/hw_defs/hal_keys.jinja | 32 + radio/util/hw_defs/hal_keys.py | 113 ++ radio/util/hw_defs/hal_switches.py | 106 ++ radio/util/hw_defs/json_index.py | 86 + radio/util/hw_defs/legacy_names.py | 394 +++++ radio/util/hw_defs/lua_inputs.jinja | 14 + radio/util/hw_defs/pot_config.py | 128 ++ radio/util/hw_defs/simu_keys.jinja | 11 + radio/util/hw_defs/simu_switches.jinja | 33 + radio/util/hw_defs/stm32_adc_inputs.jinja | 92 ++ radio/util/hw_defs/stm32_keys.jinja | 52 + radio/util/hw_defs/stm32_switches.jinja | 77 + radio/util/hw_defs/switch_config.py | 274 +++ radio/util/hw_defs/yaml_inputs.jinja | 28 + radio/util/luaexport.py | 174 -- tools/generate-hw-defs.sh | 118 ++ tools/generate-yaml.sh | 2 +- tools/setup_buildenv_msys2_stage2.sh | 7 + 323 files changed, 12812 insertions(+), 22301 deletions(-) create mode 100644 radio/src/analogs.cpp create mode 100644 radio/src/analogs.h create mode 100644 radio/src/boards/generic_stm32/CMakeLists.txt create mode 100644 radio/src/boards/generic_stm32/analog_inputs.cpp create mode 100644 radio/src/boards/generic_stm32/analog_inputs.h create mode 100644 radio/src/boards/generic_stm32/inputs.cpp create mode 100644 radio/src/boards/generic_stm32/switches.cpp create mode 100644 radio/src/gui/common/stdlcd/calibration.cpp rename radio/src/{targets/common/arm/stm32/extmodule_driver.h => gui/common/stdlcd/calibration.h} (88%) create mode 100644 radio/src/gui/navigation/navigation.h create mode 100644 radio/src/hal/CMakeLists.txt rename radio/src/{debounce.h => hal/key_driver.cpp} (57%) create mode 100644 radio/src/hal/key_driver.h create mode 100644 radio/src/hal/rotary_encoder.h create mode 100644 radio/src/hal/switch_driver.h create mode 100644 radio/src/inactivity_timer.cpp create mode 100644 radio/src/inactivity_timer.h create mode 100644 radio/src/input_mapping.cpp create mode 100644 radio/src/input_mapping.h delete mode 100644 radio/src/lua/.gitignore rename radio/src/storage/yaml/{yaml_datastructs_xlite.cpp => yaml_datastructs_128x64.cpp} (90%) delete mode 100644 radio/src/storage/yaml/yaml_datastructs_boxer.cpp delete mode 100644 radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp delete mode 100644 radio/src/storage/yaml/yaml_datastructs_t12.cpp delete mode 100644 radio/src/storage/yaml/yaml_datastructs_t8.cpp delete mode 100644 radio/src/storage/yaml/yaml_datastructs_tlite.cpp delete mode 100644 radio/src/storage/yaml/yaml_datastructs_tx12.cpp delete mode 100755 radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp delete mode 100644 radio/src/storage/yaml/yaml_datastructs_x7.cpp delete mode 100644 radio/src/storage/yaml/yaml_datastructs_x9lites.cpp delete mode 100644 radio/src/storage/yaml/yaml_datastructs_zorro.cpp create mode 100644 radio/src/targets/common/arm/stm32/ads79xx.cpp create mode 100644 radio/src/targets/common/arm/stm32/ads79xx.h delete mode 100644 radio/src/targets/common/arm/stm32/extmodule_driver.cpp create mode 100644 radio/src/targets/common/arm/stm32/sticks_pwm_driver.h create mode 100644 radio/src/targets/common/arm/stm32/stm32_adc.cpp create mode 100644 radio/src/targets/common/arm/stm32/stm32_adc.h create mode 100644 radio/src/targets/common/arm/stm32/stm32_cmsis.h create mode 100644 radio/src/targets/common/arm/stm32/stm32_gpio_driver.cpp rename radio/src/targets/{taranis/intmodule_pulses_driver.h => common/arm/stm32/stm32_gpio_driver.h} (87%) delete mode 100644 radio/src/targets/common/arm/stm32/stm32_hal_adc.cpp rename radio/src/targets/common/arm/stm32/{stm32_hal_adc.h => stm32_spi_adc.h} (54%) create mode 100644 radio/src/targets/common/arm/stm32/stm32_switch_driver.cpp create mode 100644 radio/src/targets/common/arm/stm32/stm32_switch_driver.h delete mode 100755 radio/src/targets/horus/keys_driver.cpp delete mode 100644 radio/src/targets/horus/x12s_adc_driver.cpp delete mode 100644 radio/src/targets/nv14/keys_driver.cpp create mode 100644 radio/src/targets/simu/adc_driver.cpp create mode 100644 radio/src/targets/simu/switch_driver.cpp delete mode 100644 radio/src/targets/taranis/intmodule_pulses_driver.cpp delete mode 100644 radio/src/targets/taranis/keys_driver.cpp create mode 100644 radio/src/targets/taranis/startup_stm32f413vgtx.s create mode 100644 radio/src/targets/taranis/stm32f413_flash.ld create mode 100644 radio/src/tests/sources.cpp create mode 100644 radio/util/hw_defs/generate_hw_def.py create mode 100644 radio/util/hw_defs/generator.py create mode 100644 radio/util/hw_defs/hal_adc.py create mode 100644 radio/util/hw_defs/hal_adc_inputs.jinja create mode 100644 radio/util/hw_defs/hal_json.py create mode 100644 radio/util/hw_defs/hal_keys.jinja create mode 100644 radio/util/hw_defs/hal_keys.py create mode 100644 radio/util/hw_defs/hal_switches.py create mode 100644 radio/util/hw_defs/json_index.py create mode 100644 radio/util/hw_defs/legacy_names.py create mode 100644 radio/util/hw_defs/lua_inputs.jinja create mode 100644 radio/util/hw_defs/pot_config.py create mode 100644 radio/util/hw_defs/simu_keys.jinja create mode 100644 radio/util/hw_defs/simu_switches.jinja create mode 100644 radio/util/hw_defs/stm32_adc_inputs.jinja create mode 100644 radio/util/hw_defs/stm32_keys.jinja create mode 100644 radio/util/hw_defs/stm32_switches.jinja create mode 100644 radio/util/hw_defs/switch_config.py create mode 100644 radio/util/hw_defs/yaml_inputs.jinja delete mode 100755 radio/util/luaexport.py create mode 100755 tools/generate-hw-defs.sh diff --git a/.github/workflows/macosx_cpn.yml b/.github/workflows/macosx_cpn.yml index 15b0193a0..f24d6c029 100644 --- a/.github/workflows/macosx_cpn.yml +++ b/.github/workflows/macosx_cpn.yml @@ -68,7 +68,7 @@ jobs: setup-python: 'false' - name: Install dependencies - run: python3 -m pip install --upgrade pip Pillow lz4 clang + run: python3 -m pip install --upgrade pip Pillow lz4 clang jinja2 - name: Patch GitHub macOS build run: brew install pkg-config diff --git a/.github/workflows/win_cpn-64.yml b/.github/workflows/win_cpn-64.yml index 56d4602b7..bb660ef30 100644 --- a/.github/workflows/win_cpn-64.yml +++ b/.github/workflows/win_cpn-64.yml @@ -71,7 +71,7 @@ jobs: mingw-w64-x86_64-SDL2 \ mingw-w64-x86_64-clang \ mingw-w64-x86_64-nsis - python -m pip install clang + python -m pip install clang jinja2 - name: Install Qt uses: jurplel/install-qt-action@v3 diff --git a/cmake/GenericDefinitions.cmake b/cmake/GenericDefinitions.cmake index fff07b0c0..d1924d40b 100644 --- a/cmake/GenericDefinitions.cmake +++ b/cmake/GenericDefinitions.cmake @@ -33,7 +33,6 @@ endif() set(CMAKE_COLOR_MAKEFILE ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -set(CMAKE_CXX_STANDARD 11) add_definitions(-D_GLIBCXX_USE_C99=1) # proper to_string definition set(RADIO_DIRECTORY ${PROJECT_SOURCE_DIR}/radio) diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake index 29c76af79..39beb7ac6 100644 --- a/cmake/Macros.cmake +++ b/cmake/Macros.cmake @@ -16,11 +16,6 @@ macro(git_id RESULT) endif() endmacro(git_id) -macro(use_cxx11) - if (CMAKE_VERSION VERSION_LESS "3.1" AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set (CMAKE_CXX_FLAGS "--std=gnu++11 ${CMAKE_CXX_FLAGS}") - endif () -endmacro(use_cxx11) macro(PrintTargetReport targetName) if(CMAKE_CXX_COMPILER MATCHES "/(clang-)?cl\\.exe$") @@ -60,7 +55,6 @@ function(AddCompilerFlags output) endforeach() # Add hotfix for arm64 - set(ARGS ${ARGS} -Wno-asm-operand-widths -Wno-pragma-once-outside-header) set(${output} ${${output}} ${ARGS} PARENT_SCOPE) endfunction() @@ -73,6 +67,8 @@ function(GenerateDatacopy source output) # Fetch defines / include directories in use AddCompilerFlags(GEN_DATACOPY_ARGS) + # Hack to get rid of warnings in StdPeriph lib + set(GEN_DATACOPY_ARGS # source file MUST be the first argument ${CMAKE_CURRENT_SOURCE_DIR}/${source} @@ -80,11 +76,57 @@ function(GenerateDatacopy source output) set(GEN_DATACOPY_CMD ${PYTHON_EXECUTABLE} ${GEN_DATACOPY} ${GEN_DATACOPY_ARGS}) - + add_custom_command( OUTPUT ${output} COMMAND ${GEN_DATACOPY_CMD} > ${output} DEPENDS ${GEN_DATACOPY_DEPEND} ) +endfunction() +function(AddHardwareDefTarget output) + + AddCompilerFlags(HW_DEF_ARGS) + + set(HW_DEF_SRC ${RADIO_DIRECTORY}/src/targets/${TARGET_DIR}/hal.h) + + separate_arguments(flags UNIX_COMMAND ${CMAKE_CXX_FLAGS}) + foreach(flag ${flags}) + set(HW_DEF_ARGS ${HW_DEF_ARGS} ${flag}) + endforeach() + + set(GEN_HW_DEFS ${CMAKE_CXX_COMPILER} ${HW_DEF_ARGS} -x c++-header -E -dM ${HW_DEF_SRC}) + set(GEN_HW_DEFS ${GEN_HW_DEFS} | grep -v "^#define _" | sort) + + set(GEN_JSON ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/hw_defs/generate_hw_def.py) + set(GEN_JSON ${GEN_JSON} -i defines -T ${FLAVOUR} -) + + add_custom_command(OUTPUT ${output} + COMMAND ${GEN_HW_DEFS} | ${GEN_JSON} > ${output} + DEPENDS ${HW_DEF_SRC} ${RADIO_DIRECTORY}/util/hw_defs/generate_hw_def.py + ) + + add_custom_command(OUTPUT ${output}.h + COMMAND ${GEN_HW_DEFS} > ${output}.h + DEPENDS ${HW_DEF_SRC} ${RADIO_DIRECTORY}/util/hw_defs/generate_hw_def.py + ) +endfunction() + +function(AddHWGenTarget input template output) + + # Script + set(GEN_JSON ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/hw_defs/generate_hw_def.py) + + # Inputs + set(INPUT_JSON ${CMAKE_CURRENT_BINARY_DIR}/${input}) + set(TEMPLATE ${RADIO_DIRECTORY}/util/hw_defs/${template}.jinja) + set(LEGACY_JSON ${RADIO_DIRECTORY}/util/hw_defs/legacy_names.py) + + # Command + set(GEN_JSON ${GEN_JSON} -t ${TEMPLATE} -T ${FLAVOUR} ${INPUT_JSON}) + + add_custom_command(OUTPUT ${output} + COMMAND ${GEN_JSON} > ${output} + DEPENDS ${INPUT_JSON} ${LEGACY_JSON} ${TEMPLATE} + ) endfunction() diff --git a/cmake/toolchain/arm-none-eabi.cmake b/cmake/toolchain/arm-none-eabi.cmake index d8c6f0f93..6ec5d6204 100644 --- a/cmake/toolchain/arm-none-eabi.cmake +++ b/cmake/toolchain/arm-none-eabi.cmake @@ -1,6 +1,7 @@ # arm-none-eabi toolchain set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) +set(CMAKE_CXX_STANDARD 11) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) diff --git a/cmake/toolchain/native.cmake b/cmake/toolchain/native.cmake index 4a7fd0448..ff8fd7230 100644 --- a/cmake/toolchain/native.cmake +++ b/cmake/toolchain/native.cmake @@ -1,10 +1,11 @@ # Native toolchain +set(CMAKE_CXX_STANDARD 17) if(APPLE) - set(CMAKE_C_FLAGS "-Wno-asm-operand-widths -Wno-deprecated-declarations") - set(CMAKE_CXX_FLAGS "-Wno-asm-operand-widths -Wno-deprecated-declarations") - set(CMAKE_C_FLAGS_DEBUG "-Wno-asm-operand-widths -Wno-deprecated-declarations") - set(CMAKE_CXX_FLAGS_DEBUG "-Wno-asm-operand-widths -Wno-deprecated-declarations") + set(CMAKE_C_FLAGS "-Wno-deprecated-declarations") + set(CMAKE_CXX_FLAGS "-Wno-deprecated-declarations") + set(CMAKE_C_FLAGS_DEBUG "-Wno-deprecated-declarations") + set(CMAKE_CXX_FLAGS_DEBUG "-Wno-deprecated-declarations") endif() if(MINGW OR WIN32) diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index f3d4bf006..c1b4f4c3f 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -81,8 +81,6 @@ endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS}") -use_cxx11() # ensure gnu++11 in CXX_FLAGS with CMake < 3.1 - include_directories( ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR} diff --git a/companion/src/tests/CMakeLists.txt b/companion/src/tests/CMakeLists.txt index 02dd3dbf5..1718b6d0e 100644 --- a/companion/src/tests/CMakeLists.txt +++ b/companion/src/tests/CMakeLists.txt @@ -20,8 +20,6 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${WARNING_FLAGS}") - use_cxx11() # ensure gnu++11 in CXX_FLAGS with CMake < 3.1 - add_executable(gtests-companion EXCLUDE_FROM_ALL ${TEST_SRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/location.h.in) add_dependencies(gtests-companion gtests-companion-lib) target_link_libraries(gtests-companion gtests-companion-lib simulation firmwares storage common) diff --git a/companion/src/thirdparty/maxlibqt/src/widgets/CMakeLists.txt b/companion/src/thirdparty/maxlibqt/src/widgets/CMakeLists.txt index 1f7c606b8..7a9bf77f1 100644 --- a/companion/src/thirdparty/maxlibqt/src/widgets/CMakeLists.txt +++ b/companion/src/thirdparty/maxlibqt/src/widgets/CMakeLists.txt @@ -1,9 +1,5 @@ cmake_minimum_required(VERSION 2.8.12) cmake_policy(SET CMP0020 NEW) -set(CMAKE_CXX_STANDARD 11) -if (CMAKE_VERSION VERSION_LESS "3.1" AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set (CMAKE_CXX_FLAGS "--std=gnu++11 ${CMAKE_CXX_FLAGS}") -endif () find_package(Qt5Core) find_package(Qt5Widgets) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 2a789937e..1e59d512c 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -11,7 +11,7 @@ set(TRANSLATIONS "EN" CACHE STRING "Radio language, one of: ${RADIO_LANGUAGES}") set_property(CACHE TRANSLATIONS PROPERTY STRINGS ${RADIO_LANGUAGES}) set(SPLASH "DEFAULT" CACHE STRING "Splash (DEFAULT/OFF/FRSKY)") set_property(CACHE SPLASH PROPERTY STRINGS DEFAULT OFF FRSKY) -set(PPM_UNIT "PERCENT_PREC1" CACHE STRING "PPM display unit (US/PERCENT_PREC1/PERCENT_PREC0)") +set(PPM_UNIT "PERCENT_PREC0" CACHE STRING "PPM display unit (US/PERCENT_PREC1/PERCENT_PREC0)") set_property(CACHE PPM_UNIT PROPERTY STRINGS US PERCENT_PREC1 PERCENT_PREC0) set(DEFAULT_MODE "" CACHE STRING "Default sticks mode") set(POPUP_LEVEL 2 CACHE STRING "Popup level") @@ -48,7 +48,6 @@ option(DEBUG_SEGGER_RTT "Debug output to Segger RTT" OFF) option(DEBUG_WINDOWS "Turn on windows traces" OFF) option(DEBUG_YAML "Turn on YAML traces" OFF) option(DEBUG_LABELS "Turn on Labels traces" OFF) -option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF) option(NANO "Use nano newlib and binalloc") option(TEST_BUILD_WARNING "Warn this is a test build" OFF) option(MODULE_PROTOCOL_FCC "Add support for FCC modules" ON) @@ -73,15 +72,6 @@ set(FIRMWARE_C_FLAGS_DEBUG "-g" CACHE STRING "Additional flags for firmware targ set(FIRMWARE_CXX_FLAGS "" CACHE STRING "Additional flags for firmware target c++ compiler (note: all CMAKE_CXX_FLAGS[_*] are ignored for firmware/bootloader).") set(FIRMWARE_CXX_FLAGS_DEBUG "-g" CACHE STRING "Additional flags for firmware target (Debug config) c++ compiler (note: CMAKE_CXX_FLAGS_DEBUG is ignored for firmware/bootloader).") -set(GCC_ARM_PATH "" CACHE STRING "Alternative GCC ARM path") - -set(FIRMWARE_C_COMPILER "${GCC_ARM_PATH}arm-none-eabi-gcc" CACHE STRING "Specific C compiler for firmware target.") -set(FIRMWARE_CXX_COMPILER "${GCC_ARM_PATH}arm-none-eabi-g++" CACHE STRING "Specific C++ compiler for firmware target.") -set(FIRMWARE_ASM_COMPILER "${GCC_ARM_PATH}arm-none-eabi-as" CACHE STRING "Specific assembler for firmware target.") -set(FIRMWARE_OBJCOPY "${GCC_ARM_PATH}arm-none-eabi-objcopy" CACHE STRING "Specific objcopy for firmware target.") -set(FIRMWARE_SIZE "${GCC_ARM_PATH}arm-none-eabi-size" CACHE STRING "Specific size for firmware target.") -set(FIRMWARE_RANLIB "${GCC_ARM_PATH}arm-none-eabi-ranlib" CACHE STRING "Specific ranlib for firmware target.") - set(THIRDPARTY_DIR thirdparty) set(LUA_DIR ${THIRDPARTY_DIR}/Lua/src) set(RTOS_DIR ${THIRDPARTY_DIR}/FreeRTOS) @@ -111,16 +101,17 @@ else() message(FATAL_ERROR "Unknown PCB '${PCB}'") endif() +set(HW_DESC_JSON ${FLAVOUR}.json) +AddHardwareDefTarget(${HW_DESC_JSON}) + +# enable generating JSON definition separately for debugging +add_custom_target(hardware_defs DEPENDS ${HW_DESC_JSON} ${HW_DESC_JSON}.h) + +include(hal/CMakeLists.txt) + add_subdirectory(bitmaps) add_subdirectory(fonts) -if(NOT PCB STREQUAL 9XRPRO) - option(DBLKEYS "Double Keys" ON) - if(DBLKEYS) - add_definitions(-DDBLKEYS) - endif() -endif() - if(CPU_TYPE STREQUAL STM32F4) include(targets/common/arm/stm32/f4/CMakeLists.txt) endif() @@ -131,6 +122,7 @@ endif() if(CPU_FAMILY STREQUAL STM32) include(targets/common/arm/stm32/CMakeLists.txt) + include(boards/generic_stm32/CMakeLists.txt) endif() if(ARCH STREQUAL ARM) @@ -185,7 +177,7 @@ if(RTC_BACKUP_RAM) ) # Add custom target for debugging - add_custom_target(datacopy DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/datacopy.cpp) + add_custom_target(datacopy DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/datacopy.inc) endif() if(LUA) @@ -325,10 +317,6 @@ if(DEBUG_LABELS) add_definitions(-DDEBUG_LABELS) endif() -if(FRSKY_STICKS) - add_definitions(-DFRSKY_STICKS) -endif() - if(IMU_LSM6DS33) add_definitions(-DIMU_LSM6DS33) endif() @@ -405,6 +393,7 @@ set(SRC functions.cpp strhelpers.cpp switches.cpp + analogs.cpp mixer.cpp mixer_scheduler.cpp stamp.cpp @@ -413,7 +402,8 @@ set(SRC model_init.cpp serial.cpp sbus.cpp - hal/module_port.cpp + input_mapping.cpp + inactivity_timer.cpp tasks/mixer_task.cpp ) @@ -556,7 +546,7 @@ endif() add_definitions(-DFREE_RTOS) -add_executable(firmware ${SRC} ${FIRMWARE_HEADERS}) +add_executable(firmware ${SRC}) link_libraries(firmware -lstdc++) add_dependencies(firmware ${RADIO_DEPENDENCIES}) set_target_properties(firmware PROPERTIES EXCLUDE_FROM_ALL TRUE) @@ -618,3 +608,5 @@ if(CPU_FAMILY STREQUAL STM32) endif() PrintTargetReport("firmware") + +AddHardwareDefTarget(hardware_defs ${RADIO_DIRECTORY}/src/targets/hw_defs/${FLAVOUR}.json) diff --git a/radio/src/analogs.cpp b/radio/src/analogs.cpp new file mode 100644 index 000000000..ebe931956 --- /dev/null +++ b/radio/src/analogs.cpp @@ -0,0 +1,100 @@ +/* + * 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 "analogs.h" +#include "dataconstants.h" +#include "opentx_helpers.h" + +#include "hal/adc_driver.h" + +static char _custom_names[MAX_ANALOG_INPUTS][LEN_ANA_NAME + 1] = { 0 }; + +void analogSetCustomLabel(uint8_t type, uint8_t idx, const char* str, size_t len) +{ + if (idx >= adcGetMaxInputs(type)) return; + idx += adcGetInputOffset(type); + + strncpy(_custom_names[idx], str, min(LEN_ANA_NAME, len)); + _custom_names[idx][LEN_ANA_NAME] = '\0'; +} + +const char* analogGetCustomLabel(uint8_t type, uint8_t idx) +{ + if (idx >= adcGetMaxInputs(type)) return ""; + idx += adcGetInputOffset(type); + + return _custom_names[idx]; +} + +bool analogHasCustomLabel(uint8_t type, uint8_t idx) +{ + return *analogGetCustomLabel(type, idx) != 0; +} + +static int _lookup_input_idx(uint8_t type, const char* name, size_t len, + const char* (*fct)(uint8_t,uint8_t)) +{ + auto max_inputs = adcGetMaxInputs(type); + if (!max_inputs) return -1; + + for (uint8_t i = 0; i < max_inputs; i++) { + if (!strncmp(fct(type, i), name, len)) return i; + } + + return -1; +} + +int analogLookupPhysicalIdx(uint8_t type, const char* name, size_t len) +{ + return _lookup_input_idx(type, name, len, adcGetInputName); +} + +static int analogLookupLabelIdx(uint8_t type, const char* name, size_t len) +{ + return _lookup_input_idx(type, name, len, adcGetInputLabel); +} + +const char* analogGetPhysicalName(uint8_t type, uint8_t idx) +{ + return adcGetInputName(type, idx); +} + +const char* analogGetCanonicalName(uint8_t type, uint8_t idx) +{ + // Main controls are special cases here as + // we use the label slot to place the specific names + // (2-gimbal radios vs. surface radios) + + if (type == ADC_INPUT_MAIN) + return adcGetInputLabel(type, idx); + + return adcGetInputName(type, idx); +} + +int analogLookupCanonicalIdx(uint8_t type, const char* name, size_t len) +{ + if (type == ADC_INPUT_MAIN) { + return analogLookupLabelIdx(type, name, len); + } + + return analogLookupPhysicalIdx(type, name, len); +} + diff --git a/radio/src/analogs.h b/radio/src/analogs.h new file mode 100644 index 000000000..37143cfee --- /dev/null +++ b/radio/src/analogs.h @@ -0,0 +1,35 @@ +/* + * 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 +#include + +void analogSetCustomLabel(uint8_t type, uint8_t idx, const char* str, size_t len); +const char* analogGetCustomLabel(uint8_t type, uint8_t idx); +bool analogHasCustomLabel(uint8_t type, uint8_t idx); + +const char* analogGetPhysicalName(uint8_t type, uint8_t idx); +int analogLookupPhysicalIdx(uint8_t type, const char* name, size_t len); + +const char* analogGetCanonicalName(uint8_t type, uint8_t idx); +int analogLookupCanonicalIdx(uint8_t type, const char* name, size_t len); diff --git a/radio/src/audio.cpp b/radio/src/audio.cpp index 07ddc1725..38a5c733f 100644 --- a/radio/src/audio.cpp +++ b/radio/src/audio.cpp @@ -22,6 +22,8 @@ #include "opentx.h" #include +#include "switches.h" + #if defined(LIBOPENUI) #include "libopenui.h" #endif @@ -241,9 +243,12 @@ const char * const audioFilenames[] = { "timovr3" }; +constexpr unsigned int MAX_SWITCH_POSITIONS = + MAX_SWITCHES * 3 + MAX_POTS * XPOTS_MULTIPOS_COUNT; + BitField<(AU_SPECIAL_SOUND_FIRST)> sdAvailableSystemAudioFiles; BitField<(MAX_FLIGHT_MODES * 2/*on, off*/)> sdAvailableFlightmodeAudioFiles; -BitField<(SWSRC_LAST_SWITCH+NUM_XPOTS*XPOTS_MULTIPOS_COUNT)> sdAvailableSwitchAudioFiles; +BitField sdAvailableSwitchAudioFiles; BitField<(MAX_LOGICAL_SWITCHES * 2/*on, off*/)> sdAvailableLogicalSwitchAudioFiles; char * getAudioPath(char * path) @@ -330,22 +335,21 @@ void getSwitchAudioFile(char * filename, swsrc_t index) { char * str = getModelAudioPath(filename); - if (index <= SWSRC_LAST_SWITCH) { + if (index <= MAX_SWITCHES * 3) { div_t swinfo = switchInfo(index); *str++ = 'S'; - *str++ = getRawSwitchFromIdx(swinfo.quot); + *str++ = switchGetLetter(swinfo.quot); const char * positions[] = { "-up", "-mid", "-down" }; strcpy(str, positions[swinfo.rem]); } -#if NUM_XPOTS > 0 else { - div_t swinfo = div(int(index - SWSRC_FIRST_MULTIPOS_SWITCH), XPOTS_MULTIPOS_COUNT); + index -= MAX_SWITCHES * 3; + div_t swinfo = div((int)index, XPOTS_MULTIPOS_COUNT); *str++ = 'S'; *str++ = '1' + swinfo.quot; *str++ = '1' + swinfo.rem; *str = '\0'; } -#endif strcat(str, SOUNDS_EXT); } @@ -407,11 +411,11 @@ void referenceModelAudioFiles() } // Switches Audio Files -[up|mid|down].wav - for (int i=SWSRC_FIRST_SWITCH; i<=SWSRC_LAST_SWITCH+NUM_XPOTS*XPOTS_MULTIPOS_COUNT && !found; i++) { + for (unsigned i = 0; i <= MAX_SWITCH_POSITIONS && !found; i++) { getSwitchAudioFile(path, i); // TRACE("referenceModelAudioFiles(): searching for %s in %s (%d)", path, fno.fname, i); if (!strcasecmp(filename, fno.fname)) { - sdAvailableSwitchAudioFiles.setBit(i-SWSRC_FIRST_SWITCH); + sdAvailableSwitchAudioFiles.setBit(i); found = true; TRACE("\tfound: %s", filename); } diff --git a/radio/src/audio.h b/radio/src/audio.h index 551c2ad88..bbc06d488 100644 --- a/radio/src/audio.h +++ b/radio/src/audio.h @@ -32,9 +32,10 @@ Implements a bit field, number of bits is set by the template, each bit can be modified and read by the provided methods. */ -template class BitField { +template class BitField +{ private: - uint8_t bits[(NUM_BITS+7)/8]; + uint8_t bits[(NUM_BITS + 7) / 8]; public: BitField() { @@ -54,7 +55,6 @@ template class BitField { bool getBit(unsigned int bitNo) const { - // assert(bitNo < NUM_BITS); if (bitNo >= NUM_BITS) return false; return bits[bitNo >> 3] & (1 << (bitNo & 0x07)); } diff --git a/radio/src/boards/generic_stm32/CMakeLists.txt b/radio/src/boards/generic_stm32/CMakeLists.txt new file mode 100644 index 000000000..3e765d010 --- /dev/null +++ b/radio/src/boards/generic_stm32/CMakeLists.txt @@ -0,0 +1,40 @@ + +# Generate hardware struct defs +AddHWGenTarget(${HW_DESC_JSON} stm32_keys stm32_keys.inc) +AddHWGenTarget(${HW_DESC_JSON} stm32_switches stm32_switches.inc) +AddHWGenTarget(${HW_DESC_JSON} stm32_adc_inputs stm32_adc_inputs.inc) +AddHWGenTarget(${HW_DESC_JSON} hal_adc_inputs hal_adc_inputs.inc) + +# Dependencies common to bootloader and firmware +set(MINIMAL_BOARD_LIB_SRC + ${CMAKE_CURRENT_BINARY_DIR}/${HW_DESC_JSON} + ${CMAKE_CURRENT_BINARY_DIR}/stm32_keys.inc + + boards/generic_stm32/inputs.cpp +) + +# Dependencies only used in firmware +set(BOARD_LIB_SRC + ${CMAKE_CURRENT_BINARY_DIR}/stm32_switches.inc + ${CMAKE_CURRENT_BINARY_DIR}/stm32_adc_inputs.inc + ${CMAKE_CURRENT_BINARY_DIR}/hal_adc_inputs.inc + + boards/generic_stm32/module_ports.cpp + boards/generic_stm32/aux_ports.cpp + boards/generic_stm32/sport_update.cpp + boards/generic_stm32/intmodule_heartbeat.cpp + boards/generic_stm32/analog_inputs.cpp + boards/generic_stm32/switches.cpp +) + +add_library(minimal_board_lib OBJECT EXCLUDE_FROM_ALL ${MINIMAL_BOARD_LIB_SRC}) +add_library(board_lib OBJECT EXCLUDE_FROM_ALL ${BOARD_LIB_SRC}) + +set(FIRMWARE_SRC ${FIRMWARE_SRC} + $ + $ +) + +set(BOOTLOADER_SRC ${BOOTLOADER_SRC} + $ +) diff --git a/radio/src/boards/generic_stm32/analog_inputs.cpp b/radio/src/boards/generic_stm32/analog_inputs.cpp new file mode 100644 index 000000000..be19d78b1 --- /dev/null +++ b/radio/src/boards/generic_stm32/analog_inputs.cpp @@ -0,0 +1,85 @@ +/* + * 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 "analog_inputs.h" +#include "stm32_adc.h" +#include "stm32_spi_adc.h" + +#include "hal.h" + +#if defined(ADC_SPI) + #include "ads79xx.h" +#endif + +#include "definitions.h" + +#include "myeeprom.h" +#include "translations.h" + +#include + +// generated files +#include "stm32_adc_inputs.inc" +#include "hal_adc_inputs.inc" + +constexpr uint8_t n_ADC = DIM(_ADC_adc); +constexpr uint8_t n_ADC_spi = DIM(_ADC_spi); +constexpr uint8_t n_GPIO = DIM(_ADC_GPIOs); +constexpr uint8_t n_inputs = DIM(_ADC_inputs); + +static bool adc_init() +{ + bool success = stm32_hal_adc_init(_ADC_adc, n_ADC, _ADC_inputs, _ADC_GPIOs, n_GPIO); +#if defined(ADC_SPI) + if (n_ADC_spi > 0) ads79xx_init(&_ADC_spi[0]); +#endif + return success; +} + +static bool adc_start_read() +{ + bool success = stm32_hal_adc_start_read(_ADC_adc, n_ADC, _ADC_inputs, n_inputs); +#if defined(ADC_SPI) + if (n_ADC_spi > 0) { + success = success && ads79xx_adc_start_read(&_ADC_spi[0], _ADC_inputs); + } +#endif + return success; +} + +static void adc_wait_completion() +{ +#if defined(ADC_SPI) + // ADS79xx does all the work in the completion function + // so it's probably better to poll it first + if (n_ADC_spi > 0) ads79xx_adc_wait_completion(&_ADC_spi[0], _ADC_inputs); +#endif + stm32_hal_adc_wait_completion(_ADC_adc, n_ADC, _ADC_inputs, n_inputs); +} + +const etx_hal_adc_driver_t _adc_driver = { + _hal_inputs, + _pot_default_config, + adc_init, + adc_start_read, + adc_wait_completion +}; + diff --git a/radio/src/boards/generic_stm32/analog_inputs.h b/radio/src/boards/generic_stm32/analog_inputs.h new file mode 100644 index 000000000..c9e7b7b36 --- /dev/null +++ b/radio/src/boards/generic_stm32/analog_inputs.h @@ -0,0 +1,24 @@ +/* + * 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 "hal/adc_driver.h" + +extern const etx_hal_adc_driver_t _adc_driver; diff --git a/radio/src/boards/generic_stm32/inputs.cpp b/radio/src/boards/generic_stm32/inputs.cpp new file mode 100644 index 000000000..385400e03 --- /dev/null +++ b/radio/src/boards/generic_stm32/inputs.cpp @@ -0,0 +1,48 @@ +/* + * 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 "hal/key_driver.h" + +#include "stm32_hal_ll.h" +#include "stm32_gpio_driver.h" + +#include "stm32_keys.inc" + +void keysInit() +{ + _init_keys(); + _init_trims(); +} + +uint32_t readKeys() +{ + return _read_keys(); +} + +uint32_t readTrims() +{ + uint32_t trims = _read_trims(); +#if defined(PCBXLITE) + if (_read_keys() & (1 << KEY_SHIFT)) + return ((trims & 0x03) << 6) | ((trims & 0x0c) << 2); +#endif + return trims; +} diff --git a/radio/src/boards/generic_stm32/module_ports.cpp b/radio/src/boards/generic_stm32/module_ports.cpp index 915a67be3..f36b80833 100644 --- a/radio/src/boards/generic_stm32/module_ports.cpp +++ b/radio/src/boards/generic_stm32/module_ports.cpp @@ -64,13 +64,54 @@ DEFINE_STM32_SERIAL_PORT(InternalModule, intmoduleUSART, INTMODULE_FIFO_SIZE, 0) #include "stm32_pulse_driver.h" #include "timers_driver.h" -extern const stm32_pulse_timer_t intmoduleTimer; +static stm32_pulse_dma_tc_cb_t _int_timer_DMA_TC_Callback; + +static const stm32_pulse_timer_t intmoduleTimer = { + .GPIOx = INTMODULE_TX_GPIO, + .GPIO_Pin = INTMODULE_TX_GPIO_PIN, + .GPIO_Alternate = INTMODULE_TX_GPIO_AF, + .TIMx = INTMODULE_TIMER, + .TIM_Freq = INTMODULE_TIMER_FREQ, + .TIM_Channel = INTMODULE_TIMER_Channel, + .TIM_IRQn = INTMODULE_TIMER_IRQn, + .DMAx = INTMODULE_TIMER_DMA, + .DMA_Stream = INTMODULE_TIMER_DMA_STREAM, + .DMA_Channel = INTMODULE_TIMER_DMA_CHANNEL, + .DMA_IRQn = INTMODULE_TIMER_DMA_STREAM_IRQn, + .DMA_TC_CallbackPtr = &_int_timer_DMA_TC_Callback, +}; + +// Make sure the timer channel is supported +static_assert(__STM32_PULSE_IS_TIMER_CHANNEL_SUPPORTED(INTMODULE_TIMER_Channel), + "Unsupported timer channel"); + +// Make sure the DMA channel is supported +static_assert(__STM32_PULSE_IS_DMA_STREAM_SUPPORTED(INTMODULE_TIMER_DMA_STREAM), + "Unsupported DMA stream"); + +#if !defined(INTMODULE_TIMER_DMA_IRQHandler) +#error "Missing INTMODULE_TIMER_DMA_IRQHandler definition" +#endif + +extern "C" void INTMODULE_TIMER_DMA_IRQHandler() +{ + stm32_pulse_dma_tc_isr(&intmoduleTimer); +} + +#if !defined(INTMODULE_TIMER_IRQHandler) +#error "Missing INTMODULE_TIMER_IRQHandler definition" +#endif + +extern "C" void INTMODULE_TIMER_IRQHandler() +{ + stm32_pulse_tim_update_isr(&intmoduleTimer); +} + DEFINE_STM32_SOFTSERIAL_PORT(InternalModule, intmoduleTimer); #endif #include "module_timer_driver.h" -#include "extmodule_driver.h" #if defined(HARDWARE_EXTERNAL_MODULE) #if defined(EXTMODULE_USART) @@ -135,6 +176,49 @@ DEFINE_STM32_SERIAL_PORT(ExternalModule, extmoduleUSART, INTMODULE_FIFO_SIZE, 0) #endif +static stm32_pulse_dma_tc_cb_t _ext_timer_DMA_TC_Callback; + +static const stm32_pulse_timer_t extmoduleTimer = { + .GPIOx = EXTMODULE_TX_GPIO, + .GPIO_Pin = EXTMODULE_TX_GPIO_PIN, + .GPIO_Alternate = EXTMODULE_TIMER_TX_GPIO_AF, + .TIMx = EXTMODULE_TIMER, + .TIM_Freq = EXTMODULE_TIMER_FREQ, + .TIM_Channel = EXTMODULE_TIMER_Channel, + .TIM_IRQn = EXTMODULE_TIMER_IRQn, + .DMAx = EXTMODULE_TIMER_DMA, + .DMA_Stream = EXTMODULE_TIMER_DMA_STREAM_LL, + .DMA_Channel = EXTMODULE_TIMER_DMA_CHANNEL, + .DMA_IRQn = EXTMODULE_TIMER_DMA_STREAM_IRQn, + .DMA_TC_CallbackPtr = &_ext_timer_DMA_TC_Callback, +}; + +// Make sure the timer channel is supported +static_assert(__STM32_PULSE_IS_TIMER_CHANNEL_SUPPORTED(EXTMODULE_TIMER_Channel), + "Unsupported timer channel"); + +// Make sure the DMA channel is supported +static_assert(__STM32_PULSE_IS_DMA_STREAM_SUPPORTED(EXTMODULE_TIMER_DMA_STREAM_LL), + "Unsupported DMA stream"); + +#if !defined(EXTMODULE_TIMER_DMA_IRQHandler) +#error "Missing EXTMODULE_TIMER_DMA_IRQHandler definition" +#endif + +extern "C" void EXTMODULE_TIMER_DMA_IRQHandler() +{ + stm32_pulse_dma_tc_isr(&extmoduleTimer); +} + +#if !defined(EXTMODULE_TIMER_IRQHandler) +#error "Missing EXTMODULE_TIMER_IRQHandler definition" +#endif + +extern "C" void EXTMODULE_TIMER_IRQHandler() +{ + stm32_pulse_tim_update_isr(&extmoduleTimer); +} + DEFINE_STM32_SOFTSERIAL_PORT(ExternalModule, extmoduleTimer); #endif diff --git a/radio/src/boards/generic_stm32/switches.cpp b/radio/src/boards/generic_stm32/switches.cpp new file mode 100644 index 000000000..f6a78b18e --- /dev/null +++ b/radio/src/boards/generic_stm32/switches.cpp @@ -0,0 +1,110 @@ +/* + * 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 "hal/switch_driver.h" +#include "stm32_switch_driver.h" +#include "stm32_gpio_driver.h" + +#include "definitions.h" +#include "opentx_constants.h" +#include "myeeprom.h" + +// generated switch structs +#include "stm32_switches.inc" + +#include + +void switchInit() +{ + _init_switches(); +} + +swconfig_t switchGetDefaultConfig() +{ + return _switch_default_config; +} + +switch_display_pos_t switchGetDisplayPosition(uint8_t idx) +{ + if (idx >= DIM(_switch_display)) + return {0, 0}; + + return _switch_display[idx]; +} + +uint8_t switchGetMaxSwitches() +{ + return n_switches; +} + +uint8_t getSwitchCount() +{ + int count = 0; + for (int i = 0; i < switchGetMaxSwitches(); ++i) { + if (SWITCH_EXISTS(i)) { + ++count; + } + } + return count; +} + +uint8_t switchGetMaxRow(uint8_t col) +{ + uint8_t lastrow = 0; + for (int i = 0; i < switchGetMaxSwitches(); ++i) { + if (SWITCH_EXISTS(i)) { + auto switch_display = switchGetDisplayPosition(i); + if (switch_display.col == col) + lastrow = switch_display.row > lastrow ? switch_display.row : lastrow; + } + } + return lastrow; +} + +uint8_t switchGetMaxFctSwitches() +{ + return n_fct_switches; +} + +// returns state (0 / 1) of a specific switch position +uint32_t switchState(uint8_t pos_idx) +{ + auto d = div(pos_idx, 3); + return stm32_switch_get_state(&_switch_defs[d.quot], (SwitchHwPos)d.rem); +} + +SwitchHwPos switchGetPosition(uint8_t idx) +{ + if (idx >= n_total_switches) return SWITCH_HW_UP; + return stm32_switch_get_position(&_switch_defs[idx]); +} + +const char* switchGetName(uint8_t idx) +{ + if (idx >= n_total_switches) return ""; + return _switch_defs[idx].name; +} + +SwitchHwType switchGetHwType(uint8_t idx) +{ + if (idx >= n_total_switches) return SWITCH_HW_2POS; + return _switch_defs[idx].type; +} diff --git a/radio/src/cli.cpp b/radio/src/cli.cpp index cee7c43e6..0635b425e 100644 --- a/radio/src/cli.cpp +++ b/radio/src/cli.cpp @@ -25,11 +25,13 @@ #include "opentx.h" #include "diskio.h" #include "timers_driver.h" +#include "watchdog_driver.h" #if defined(BLUETOOTH) #include "bluetooth_driver.h" #endif +#include "hal/adc_driver.h" #include "hal/module_port.h" #include "tasks.h" @@ -1254,6 +1256,9 @@ void printAudioVars() #endif #if defined(DEBUG) + +#include "hal/switch_driver.h" + int cliDisplay(const char ** argv) { long long int address = 0; @@ -1266,32 +1271,32 @@ int cliDisplay(const char ** argv) } if (!strcmp(argv[1], "keys")) { - for (int i=0; icount; j++) { + for (int i = 0; i < MAX_ANALOG_INPUTS; i++) { + cliSerialPrint("A%02d %04X %04X %3d %3d", i, getAnalogValue(i), anaIn(i), + rawJitter[i].get(), avgJitter[i].get()); + + if (i >= MAX_STICKS && IS_POT_MULTIPOS(i - MAX_STICKS)) { + StepsCalibData *calib = (StepsCalibData *)&g_eeGeneral.calib[i]; + for (int j = 0; j < calib->count; j++) { cliSerialPrint(" s%d %04X", j, calib->steps[j]); } } diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 85206545b..100857ac3 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -25,7 +25,6 @@ #include "board.h" #include "storage/yaml/yaml_defs.h" -#define NUM_STICKS 4 #if defined(EXPORT) #define LUA_EXPORT(...) LEXP(__VA_ARGS__) @@ -136,12 +135,7 @@ enum CurveType { #define MAX_CURVE_POINTS 512 #endif -// TODO: remove this -#if defined(PCBFRSKY) || defined(PCBNV14) - #define NUM_MODULES 2 -#else - #define NUM_MODULES 1 -#endif +#define NUM_MODULES 2 #define XPOTS_MULTIPOS_COUNT 6 @@ -315,11 +309,6 @@ enum TelemetryUnit { UNIT_KM, UNIT_DBM, UNIT_MAX = UNIT_DBM, - UNIT_SPARE6, - UNIT_SPARE7, - UNIT_SPARE8, - UNIT_SPARE9, - UNIT_SPARE10, UNIT_HOURS, UNIT_MINUTES, UNIT_SECONDS, @@ -339,6 +328,7 @@ enum TelemetryUnit { UNIT_DATETIME_SEC }; +// TODO: move to stdlcd UI #if LCD_W >= 212 #define NUM_LINE_ITEMS 3 #else @@ -360,9 +350,14 @@ enum TelemetryScreenType { TELEMETRY_SCREEN_TYPE_MAX = TELEMETRY_SCREEN_TYPE_BARS #endif }; + #define MAX_TELEMETRY_SCREENS 4 -#define TELEMETRY_SCREEN_TYPE(screenIndex) TelemetryScreenType((g_model.screensType >> (2*(screenIndex))) & 0x03) -#define IS_BARS_SCREEN(screenIndex) (TELEMETRY_SCREEN_TYPE(screenIndex) == TELEMETRY_SCREEN_TYPE_BARS) + +#define TELEMETRY_SCREEN_TYPE(screenIndex) \ + TelemetryScreenType((g_model.screensType >> (2 * (screenIndex))) & 0x03) + +#define IS_BARS_SCREEN(screenIndex) \ + (TELEMETRY_SCREEN_TYPE(screenIndex) == TELEMETRY_SCREEN_TYPE_BARS) constexpr int16_t FAILSAFE_CHANNEL_HOLD = 2000; constexpr int16_t FAILSAFE_CHANNEL_NOPULSE = 2001; @@ -382,161 +377,47 @@ enum PotsWarnMode { #define GVAR_MAX 1024 #define GVAR_MIN -GVAR_MAX -#define RESERVE_RANGE_FOR_GVARS 10 -// even we do not spend space in EEPROM for 10 GVARS, we reserve the space inside the range of values, like offset, weight, etc. +// we reserve the space inside the range of values, like offset, weight, etc. +#define RESERVE_RANGE_FOR_GVARS 10 #define MAX_GVARS 9 +// Maximum number analog inputs by type +#define MAX_STICKS 4 + +#if defined(COLORLCD) + #define MAX_POTS 16 + #define MAX_AXIS 2 +#else + #define MAX_POTS 8 + #define MAX_AXIS 0 +#endif + +#define MAX_VBAT 1 +#define MAX_RTC_BAT 1 + +#define MAX_ANALOG_INPUTS (MAX_STICKS + MAX_POTS + MAX_AXIS + MAX_VBAT + MAX_RTC_BAT) +#define MAX_CALIB_ANALOG_INPUTS (MAX_STICKS + MAX_POTS + MAX_AXIS) + +#define MAX_SWITCHES 20 +#define MAX_TRIMS 6 + +#define MAX_XPOTS_POSITIONS (MAX_POTS * XPOTS_MULTIPOS_COUNT) + enum SwitchSources { SWSRC_NONE = 0, SWSRC_FIRST_SWITCH SKIP, + SWSRC_LAST_SWITCH SKIP = SWSRC_FIRST_SWITCH + (MAX_SWITCHES * 3) - 1, -#if defined(STORAGE_SWITCH_A) - SWSRC_SA0 = SWSRC_FIRST_SWITCH, - SWSRC_SA1, - SWSRC_SA2, -#endif - -#if defined(STORAGE_SWITCH_B) - SWSRC_SB0, - SWSRC_SB1, - SWSRC_SB2, -#endif - -#if defined(STORAGE_SWITCH_C) - SWSRC_SC0, - SWSRC_SC1, - SWSRC_SC2, -#endif - -#if defined(STORAGE_SWITCH_D) - SWSRC_SD0, - SWSRC_SD1, - SWSRC_SD2, -#endif - -#if defined(FUNCTION_SWITCHES) && defined(RADIO_TPRO) - SWSRC_FIRST_FUNCTION_SWITCH SKIP, - SWSRC_SE0 = SWSRC_FIRST_FUNCTION_SWITCH, - SWSRC_SE1, - SWSRC_SE2, -#elif defined(STORAGE_SWITCH_E) - SWSRC_SE0, - SWSRC_SE1, - SWSRC_SE2, -#endif - -#if defined(STORAGE_SWITCH_F) - SWSRC_SF0, - SWSRC_SF1, - SWSRC_SF2, -#endif - -#if defined(STORAGE_SWITCH_G) - SWSRC_SG0, - SWSRC_SG1, - SWSRC_SG2, -#endif - -#if defined(STORAGE_SWITCH_H) - SWSRC_SH0, - SWSRC_SH1, - SWSRC_SH2, -#endif - -#if defined(STORAGE_SWITCH_I) - SWSRC_SI0, - SWSRC_SI1, - SWSRC_SI2, -#endif - -#if defined(STORAGE_SWITCH_J) - SWSRC_SJ0, - SWSRC_SJ1, - SWSRC_SJ2, -#endif - -#if defined(STORAGE_SWITCH_K) - SWSRC_SK0, - SWSRC_SK1, - SWSRC_SK2, -#endif - -#if defined(STORAGE_SWITCH_L) - SWSRC_SL0, - SWSRC_SL1, - SWSRC_SL2, -#endif - -#if defined(STORAGE_SWITCH_M) - SWSRC_SM0, - SWSRC_SM1, - SWSRC_SM2, -#endif - -#if defined(STORAGE_SWITCH_N) - SWSRC_SN0, - SWSRC_SN1, - SWSRC_SN2, -#endif - -#if defined(STORAGE_SWITCH_O) - SWSRC_SO0, - SWSRC_SO1, - SWSRC_SO2, -#endif - -#if defined(STORAGE_SWITCH_P) - SWSRC_SP0, - SWSRC_SP1, - SWSRC_SP2, -#endif - -#if defined(STORAGE_SWITCH_Q) - SWSRC_SQ0, - SWSRC_SQ1, - SWSRC_SQ2, -#endif - -#if defined(STORAGE_SWITCH_R) - SWSRC_SR0, - SWSRC_SR1, - SWSRC_SR2, -#endif - - SWSRC_LAST_SWITCH SKIP = SWSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES_POSITIONS - 1, - -#if NUM_XPOTS > 0 SWSRC_FIRST_MULTIPOS_SWITCH SKIP, - SWSRC_LAST_MULTIPOS_SWITCH SKIP = SWSRC_FIRST_MULTIPOS_SWITCH + (NUM_XPOTS * XPOTS_MULTIPOS_COUNT) - 1, -#endif + SWSRC_LAST_MULTIPOS_SWITCH SKIP = SWSRC_FIRST_MULTIPOS_SWITCH + MAX_XPOTS_POSITIONS - 1, SWSRC_FIRST_TRIM SKIP, - SWSRC_TrimRudLeft = SWSRC_FIRST_TRIM, - SWSRC_TrimRudRight, - SWSRC_TrimEleDown, - SWSRC_TrimEleUp, - -#if NUM_TRIMS > 2 - SWSRC_TrimThrDown, - SWSRC_TrimThrUp, - SWSRC_TrimAilLeft, - SWSRC_TrimAilRight, -#endif - -#if NUM_TRIMS > 4 - SWSRC_TrimT5Down, - SWSRC_TrimT5Up, - SWSRC_TrimT6Down, - SWSRC_TrimT6Up, -#endif + SWSRC_LAST_TRIM SKIP = SWSRC_FIRST_TRIM + 2 * MAX_TRIMS - 1, SWSRC_FIRST_LOGICAL_SWITCH SKIP, - SWSRC_SW1 = SWSRC_FIRST_LOGICAL_SWITCH, - SWSRC_SW2, - // ... - SWSRC_LAST_LOGICAL_SWITCH SKIP = SWSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1, + SWSRC_LAST_LOGICAL_SWITCH SKIP = SWSRC_FIRST_LOGICAL_SWITCH + MAX_LOGICAL_SWITCHES - 1, SWSRC_ON, SWSRC_ONE, @@ -571,247 +452,100 @@ enum SwitchSources { SWSRC_INVERT SKIP = SWSRC_COUNT+1, }; -#if NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES >= 8 - #define SWSRC_TRAINER SWSRC_SH2 -#else - #define SWSRC_TRAINER SWSRC_LAST_SWITCH, -#endif - -#define SWSRC_LAST_TRIM (SWSRC_FIRST_TRIM + 2 * NUM_TRIMS - 1) - enum MixSources { MIXSRC_NONE, - MIXSRC_FIRST_INPUT SKIP, LUA_EXPORT_MULTIPLE("input", "Input [I%d]", MAX_INPUTS) - MIXSRC_LAST_INPUT SKIP = MIXSRC_FIRST_INPUT+MAX_INPUTS-1, + MIXSRC_FIRST SKIP, + MIXSRC_FIRST_INPUT SKIP = MIXSRC_FIRST, + MIXSRC_LAST_INPUT SKIP = MIXSRC_FIRST_INPUT + MAX_INPUTS - 1, #if defined(LUA_INPUTS) - MIXSRC_FIRST_LUA SKIP, LUA_EXPORT_MULTIPLE("lua", "Lua mix output %d", MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS) - MIXSRC_LAST_LUA SKIP = MIXSRC_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1, + MIXSRC_FIRST_LUA SKIP, + MIXSRC_LAST_LUA SKIP = MIXSRC_FIRST_LUA + (MAX_SCRIPTS * MAX_SCRIPT_OUTPUTS) - 1, #endif + // Semantic sticks MIXSRC_FIRST_STICK SKIP, - MIXSRC_Rud = MIXSRC_FIRST_STICK, LUA_EXPORT("rud", "Rudder") - MIXSRC_Ele, LUA_EXPORT("ele", "Elevator") - MIXSRC_Thr, LUA_EXPORT("thr", "Throttle") - MIXSRC_Ail, LUA_EXPORT("ail", "Aileron") + MIXSRC_LAST_STICK SKIP = MIXSRC_FIRST_STICK + MAX_STICKS - 1, - MIXSRC_LAST_STICK SKIP = MIXSRC_Ail, MIXSRC_FIRST_POT SKIP, -#if defined(PCBHORUS) - MIXSRC_S1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer S1") - MIXSRC_6POS, LUA_EXPORT("6pos", "Multipos Switch") - MIXSRC_S2, LUA_EXPORT("s2", "Potentiometer S2") -#if defined(PCBX10) - MIXSRC_EXT1, LUA_EXPORT("ext1", "Ext 1") - MIXSRC_EXT2, LUA_EXPORT("ext2", "Ext 2") - MIXSRC_EXT3, LUA_EXPORT("ext3", "Ext 3") - MIXSRC_EXT4, LUA_EXPORT("ext4", "Ext 4") -#endif - MIXSRC_FIRST_SLIDER SKIP, -#if defined(PCBX12S) - MIXSRC_S3 = MIXSRC_FIRST_SLIDER, LUA_EXPORT("s3", "Slider S3") - MIXSRC_S4, LUA_EXPORT("s4", "Slider S4") - MIXSRC_LS, LUA_EXPORT("ls", "Left rear slider") - MIXSRC_RS, LUA_EXPORT("rs", "Right rear slider") -#else - MIXSRC_LS = MIXSRC_FIRST_SLIDER, LUA_EXPORT("ls", "Left slider") - MIXSRC_RS, LUA_EXPORT("rs", "Right slider") -#endif - MIXSRC_LAST_POT SKIP = MIXSRC_RS, -#elif defined(PCBX9E) - MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") - MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2") - MIXSRC_POT3, LUA_EXPORT("s3", "Potentiometer 3") - MIXSRC_POT4, LUA_EXPORT("s4", "Potentiometer 4 (X9E only)") - MIXSRC_FIRST_SLIDER SKIP, - MIXSRC_SLIDER1 = MIXSRC_FIRST_SLIDER, LUA_EXPORT("ls", "Left slider") - MIXSRC_SLIDER2, LUA_EXPORT("rs", "Right slider") - MIXSRC_SLIDER3, LUA_EXPORT("lcs", "Left center slider (X9E only)") - MIXSRC_SLIDER4, LUA_EXPORT("rcs", "Right center slider (X9E only)") - MIXSRC_LAST_POT SKIP = MIXSRC_SLIDER4, -#elif defined(RADIO_BOXER) - MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") - MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2") - MIXSRC_POT3, LUA_EXPORT("s3", "6 POS") - MIXSRC_FIRST_SLIDER SKIP = MIXSRC_POT3, - MIXSRC_LAST_POT SKIP = MIXSRC_POT3, -#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBNV14) - MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") - MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2") - MIXSRC_FIRST_SLIDER SKIP = MIXSRC_POT2, - MIXSRC_LAST_POT SKIP = MIXSRC_POT2, -#elif defined(PCBX9LITE) - MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") - MIXSRC_FIRST_SLIDER SKIP = MIXSRC_POT1, - MIXSRC_LAST_POT SKIP = MIXSRC_POT1, -#elif defined(PCBTARANIS) - MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") - MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2") - MIXSRC_POT3, LUA_EXPORT("s3", "Potentiometer 3") - MIXSRC_FIRST_SLIDER SKIP, - MIXSRC_SLIDER1 = MIXSRC_FIRST_SLIDER, LUA_EXPORT("ls", "Left slider") - MIXSRC_SLIDER2, LUA_EXPORT("rs", "Right slider") - MIXSRC_LAST_POT SKIP = MIXSRC_SLIDER2, -#else - MIXSRC_P1 = MIXSRC_FIRST_POT, - MIXSRC_P2, - MIXSRC_P3, - MIXSRC_LAST_POT SKIP = MIXSRC_P3, -#endif + MIXSRC_LAST_POT SKIP = MIXSRC_FIRST_POT + MAX_POTS - 1, -#if defined(PCBHORUS) - MIXSRC_MOUSE1, LUA_EXPORT("jsx", "Joystick X") - MIXSRC_MOUSE2, LUA_EXPORT("jsy", "Joystick Y") +#if MAX_AXIS > 0 + MIXSRC_FIRST_AXIS SKIP, + MIXSRC_LAST_AXIS SKIP = MIXSRC_FIRST_AXIS + MAX_AXIS - 1, #endif #if defined(IMU) - MIXSRC_TILT_X, LUA_EXPORT("tiltx", "Tilt X") - MIXSRC_TILT_Y, LUA_EXPORT("tilty", "Tilt Y") + MIXSRC_TILT_X, + MIXSRC_TILT_Y, #endif #if defined(PCBHORUS) MIXSRC_FIRST_SPACEMOUSE SKIP, - MIXSRC_SPACEMOUSE_A = MIXSRC_FIRST_SPACEMOUSE, LUA_EXPORT("sma", "SpaceMouse A") - MIXSRC_SPACEMOUSE_B, LUA_EXPORT("smb", "SpaceMouse B") - MIXSRC_SPACEMOUSE_C, LUA_EXPORT("smc", "SpaceMouse C") - MIXSRC_SPACEMOUSE_D, LUA_EXPORT("smd", "SpaceMouse D") - MIXSRC_SPACEMOUSE_E, LUA_EXPORT("sme", "SpaceMouse E") - MIXSRC_SPACEMOUSE_F, LUA_EXPORT("smf", "SpaceMouse F") + MIXSRC_SPACEMOUSE_A = MIXSRC_FIRST_SPACEMOUSE, + MIXSRC_SPACEMOUSE_B, + MIXSRC_SPACEMOUSE_C, + MIXSRC_SPACEMOUSE_D, + MIXSRC_SPACEMOUSE_E, + MIXSRC_SPACEMOUSE_F, MIXSRC_LAST_SPACEMOUSE SKIP = MIXSRC_SPACEMOUSE_F, #endif - MIXSRC_MAX, LUA_EXPORT("max", "MAX") + MIXSRC_MAX, MIXSRC_FIRST_HELI SKIP, - MIXSRC_CYC1 = MIXSRC_FIRST_HELI, LUA_EXPORT("cyc1", "Cyclic 1") - MIXSRC_CYC2, LUA_EXPORT("cyc2", "Cyclic 2") - MIXSRC_CYC3, LUA_EXPORT("cyc3", "Cyclic 3") - MIXSRC_LAST_HELI SKIP = MIXSRC_CYC3, + MIXSRC_LAST_HELI SKIP = MIXSRC_FIRST_HELI + 2, MIXSRC_FIRST_TRIM SKIP, - MIXSRC_TrimRud = MIXSRC_FIRST_TRIM, LUA_EXPORT("trim-rud", "Rudder trim") - MIXSRC_TrimEle, LUA_EXPORT("trim-ele", "Elevator trim") - MIXSRC_TrimThr, LUA_EXPORT("trim-thr", "Throttle trim") - MIXSRC_TrimAil, LUA_EXPORT("trim-ail", "Aileron trim") -#if defined(PCBHORUS) - MIXSRC_TrimT5, LUA_EXPORT("trim-t5", "Aux trim T5") - MIXSRC_TrimT6, LUA_EXPORT("trim-t6", "Aux trim T6") + MIXSRC_TrimRud = MIXSRC_FIRST_TRIM, + MIXSRC_TrimEle, + MIXSRC_TrimThr, + MIXSRC_TrimAil, + //#if defined(PCBHORUS) + MIXSRC_TrimT5, + MIXSRC_TrimT6, MIXSRC_LAST_TRIM SKIP = MIXSRC_TrimT6, -#else - MIXSRC_LAST_TRIM SKIP = MIXSRC_TrimAil, -#endif + //#else + //MIXSRC_LAST_TRIM SKIP = MIXSRC_TrimAil, + //#endif MIXSRC_FIRST_SWITCH SKIP, + MIXSRC_LAST_SWITCH SKIP = MIXSRC_FIRST_SWITCH + MAX_SWITCHES - 1, -#if defined(HARDWARE_SWITCH_A) - MIXSRC_SA = MIXSRC_FIRST_SWITCH, LUA_EXPORT("sa", "Switch A") - MIXSRC_SB, LUA_EXPORT("sb", "Switch B") - MIXSRC_SC, LUA_EXPORT("sc", "Switch C") -#endif -#if defined(HARDWARE_SWITCH_D) - MIXSRC_SD, LUA_EXPORT("sd", "Switch D") -#elif defined(STORAGE_SWITCH_D) - MIXSRC_SD, -#endif -#if defined(HARDWARE_SWITCH_E) - MIXSRC_SE, LUA_EXPORT("se", "Switch E") -#elif defined(STORAGE_SWITCH_E) - MIXSRC_SE, -#endif -#if defined(HARDWARE_SWITCH_F) - MIXSRC_SF, LUA_EXPORT("sf", "Switch F") -#elif defined(STORAGE_SWITCH_F) - MIXSRC_SF, -#endif -#if defined(HARDWARE_SWITCH_G) - MIXSRC_SG, LUA_EXPORT("sg", "Switch G") -#elif defined(STORAGE_SWITCH_G) - MIXSRC_SG, -#endif -#if defined(HARDWARE_SWITCH_H) - MIXSRC_SH, LUA_EXPORT("sh", "Switch H") -#elif defined(STORAGE_SWITCH_H) - MIXSRC_SH, -#endif -#if defined(HARDWARE_SWITCH_I) - MIXSRC_SI, LUA_EXPORT("si", "Switch I") -#elif defined(STORAGE_SWITCH_I) - MIXSRC_SI, -#endif -#if defined(HARDWARE_SWITCH_J) - MIXSRC_SJ, LUA_EXPORT("sj", "Switch J") -#elif defined(STORAGE_SWITCH_J) - MIXSRC_SJ, -#endif -#if defined(HARDWARE_SWITCH_K) - MIXSRC_SK, LUA_EXPORT("sk", "Switch K") - MIXSRC_SL, LUA_EXPORT("sl", "Switch L") - MIXSRC_SM, LUA_EXPORT("sm", "Switch M") - MIXSRC_SN, LUA_EXPORT("sn", "Switch N") - MIXSRC_SO, LUA_EXPORT("so", "Switch O") - MIXSRC_SP, LUA_EXPORT("sp", "Switch P") - MIXSRC_SQ, LUA_EXPORT("sq", "Switch Q") - MIXSRC_SR, LUA_EXPORT("sr", "Switch R") -#endif MIXSRC_FIRST_LOGICAL_SWITCH SKIP, - MIXSRC_SW1 = MIXSRC_FIRST_LOGICAL_SWITCH, LUA_EXPORT_MULTIPLE("ls", "Logical switch L%d", MAX_LOGICAL_SWITCHES) - MIXSRC_LAST_LOGICAL_SWITCH SKIP = MIXSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1, + MIXSRC_LAST_LOGICAL_SWITCH SKIP = MIXSRC_FIRST_LOGICAL_SWITCH + MAX_LOGICAL_SWITCHES - 1, - MIXSRC_FIRST_TRAINER SKIP, LUA_EXPORT_MULTIPLE("trn", "Trainer input %d", MAX_TRAINER_CHANNELS) - MIXSRC_LAST_TRAINER SKIP = MIXSRC_FIRST_TRAINER+MAX_TRAINER_CHANNELS-1, + MIXSRC_FIRST_TRAINER SKIP, + MIXSRC_LAST_TRAINER SKIP = MIXSRC_FIRST_TRAINER + MAX_TRAINER_CHANNELS - 1, MIXSRC_FIRST_CH SKIP, - MIXSRC_CH1 = MIXSRC_FIRST_CH, LUA_EXPORT_MULTIPLE("ch", "Channel CH%d", MAX_OUTPUT_CHANNELS) - MIXSRC_CH2, - MIXSRC_CH3, - MIXSRC_CH4, - MIXSRC_CH5, - MIXSRC_CH6, - MIXSRC_CH7, - MIXSRC_CH8, - MIXSRC_CH9, - MIXSRC_CH10, - MIXSRC_CH11, - MIXSRC_CH12, - MIXSRC_CH13, - MIXSRC_CH14, - MIXSRC_CH15, - MIXSRC_CH16, - MIXSRC_LAST_CH SKIP = MIXSRC_CH1+MAX_OUTPUT_CHANNELS-1, + MIXSRC_LAST_CH SKIP = MIXSRC_FIRST_CH + MAX_OUTPUT_CHANNELS - 1, MIXSRC_FIRST_GVAR SKIP, - MIXSRC_GVAR1 = MIXSRC_FIRST_GVAR, LUA_EXPORT_MULTIPLE("gvar", "Global variable %d", MAX_GVARS) - MIXSRC_LAST_GVAR SKIP = MIXSRC_FIRST_GVAR+MAX_GVARS-1, + MIXSRC_LAST_GVAR SKIP = MIXSRC_FIRST_GVAR + MAX_GVARS - 1, - MIXSRC_TX_VOLTAGE, LUA_EXPORT("tx-voltage", "Transmitter battery voltage [volts]") - MIXSRC_TX_TIME, LUA_EXPORT("clock", "RTC clock [minutes from midnight]") + MIXSRC_TX_VOLTAGE, + MIXSRC_TX_TIME, MIXSRC_TX_GPS, - MIXSRC_FIRST_RESERVE SKIP, - MIXSRC_RESERVE3 SKIP, - MIXSRC_RESERVE4 SKIP, - MIXSRC_LAST_RESERVE SKIP, - MIXSRC_FIRST_TIMER SKIP, - MIXSRC_TIMER1 = MIXSRC_FIRST_TIMER, LUA_EXPORT("timer1", "Timer 1 value [seconds]") - MIXSRC_TIMER2, LUA_EXPORT("timer2", "Timer 2 value [seconds]") - MIXSRC_TIMER3, LUA_EXPORT("timer3", "Timer 3 value [seconds]") - MIXSRC_LAST_TIMER SKIP = MIXSRC_TIMER3, - MIXSRC_FIRST_TELEM SKIP, LUA_EXPORT_MULTIPLE("telem", "Telemetry sensor %d", MAX_TELEMETRY_SENSORS) - MIXSRC_LAST_TELEM SKIP = MIXSRC_FIRST_TELEM+3*MAX_TELEMETRY_SENSORS-1 + MIXSRC_FIRST_TIMER SKIP, + MIXSRC_LAST_TIMER SKIP = MIXSRC_FIRST_TIMER + MAX_TIMERS - 1, + + MIXSRC_FIRST_TELEM SKIP, + MIXSRC_LAST_TELEM SKIP = MIXSRC_FIRST_TELEM + 3 * MAX_TELEMETRY_SENSORS - 1, }; -#if defined(__cplusplus) -static_assert(MIXSRC_FIRST_LOGICAL_SWITCH == MIXSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES, "Wrong switches definition in MIXSRC list"); -#endif -#define MIXSRC_FIRST (MIXSRC_NONE + 1) #define MIXSRC_LAST MIXSRC_LAST_CH -#define MIXSRC_LAST_SWITCH (MIXSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES - 1) -#define INPUTSRC_FIRST MIXSRC_Rud +#define INPUTSRC_FIRST MIXSRC_FIRST_STICK #define INPUTSRC_LAST MIXSRC_LAST_TELEM + +// TODO: this won't work forever (what about ground radios?) +#define MIXSRC_Thr (MIXSRC_FIRST_STICK + 2) + #if defined(FUNCTION_SWITCHES) -#define MIXSRC_LAST_REGULAR_SWITCH (MIXSRC_FIRST_SWITCH + NUM_REGULAR_SWITCHES - 1) +#define MIXSRC_LAST_REGULAR_SWITCH (MIXSRC_FIRST_SWITCH + switchGetMaxSwitches() - 1) #define MIXSRC_FIRST_FS_SWITCH (MIXSRC_LAST_REGULAR_SWITCH + 1) #endif @@ -840,9 +574,7 @@ enum Functions { FUNC_PLAY_SOUND = FUNC_FIRST_WITHOUT_ENABLE, FUNC_PLAY_TRACK, FUNC_PLAY_VALUE, - FUNC_RESERVE4, FUNC_PLAY_SCRIPT, - FUNC_RESERVE5, FUNC_BACKGND_MUSIC, FUNC_BACKGND_MUSIC_PAUSE, FUNC_VARIO, diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 1aa1dbe7a..f0c86ee88 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -53,7 +53,7 @@ static inline void check_struct() CHKSIZE(LimitData, 11); CHKSIZE(LogicalSwitchData, 9); CHKSIZE(CustomFunctionData, 11); - CHKSIZE(FlightModeData, 28 + 2*NUM_TRIMS); + CHKSIZE(FlightModeData, 28 + 2 * MAX_TRIMS); CHKSIZE(TimerData, 12); CHKSIZE(SwashRingData, 8); CHKSIZE(FrSkyBarData, 6); @@ -67,7 +67,7 @@ static inline void check_struct() CHKSIZE(LimitData, 13); CHKSIZE(LogicalSwitchData, 9); CHKSIZE(CustomFunctionData, 11); - CHKSIZE(FlightModeData, 40); + CHKSIZE(FlightModeData, 44); CHKSIZE(TimerData, 17); CHKSIZE(SwashRingData, 8); CHKSIZE(FrSkyBarData, 6); @@ -117,37 +117,37 @@ static inline void check_struct() CHKSIZE(TrainerData, 16); #if defined(PCBXLITES) - CHKSIZE(RadioData, 864); - CHKSIZE(ModelData, 6220); + CHKSIZE(RadioData, 872); + CHKSIZE(ModelData, 6265); #elif defined(PCBXLITE) - CHKSIZE(RadioData, 862); - CHKSIZE(ModelData, 6220); + CHKSIZE(RadioData, 870); + CHKSIZE(ModelData, 6265); #elif defined(RADIO_TPRO) - CHKSIZE(RadioData, 845); - CHKSIZE(ModelData, 6245); + CHKSIZE(RadioData, 859); + CHKSIZE(ModelData, 6292); #elif defined(RADIO_BOXER) - CHKSIZE(RadioData, 877); - CHKSIZE(ModelData, 6221); + CHKSIZE(RadioData, 870); + CHKSIZE(ModelData, 6265); #elif defined(PCBX7) - CHKSIZE(RadioData, 868); - CHKSIZE(ModelData, 6220); + CHKSIZE(RadioData, 870); + CHKSIZE(ModelData, 6265); #elif defined(PCBX9E) - CHKSIZE(RadioData, 958); - CHKSIZE(ModelData, 6672); + CHKSIZE(RadioData, 870); + CHKSIZE(ModelData, 6707); #elif defined(PCBX9D) || defined(PCBX9DP) - CHKSIZE(RadioData, 900); - CHKSIZE(ModelData, 6664); + CHKSIZE(RadioData, 870); + CHKSIZE(ModelData, 6706); #elif defined(PCBHORUS) #if defined(PCBX10) - CHKSIZE(RadioData, 952); - CHKSIZE(ModelData, 15454); + CHKSIZE(RadioData, 916); + CHKSIZE(ModelData, 15463); #else - CHKSIZE(RadioData, 934); - CHKSIZE(ModelData, 15452); + CHKSIZE(RadioData, 916); + CHKSIZE(ModelData, 15463); #endif #elif defined(PCBNV14) - CHKSIZE(RadioData, 880); - CHKSIZE(ModelData, 15268); + CHKSIZE(RadioData, 916); + CHKSIZE(ModelData, 15319); #endif #undef CHKSIZE diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 688aba4be..7be5792a2 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -30,6 +30,7 @@ #include "globals.h" #include "serial.h" #include "usb_joystick.h" +#include "input_mapping.h" #if defined(PCBTARANIS) #define N_TARANIS_FIELD(x) @@ -78,8 +79,8 @@ PACK(struct MixData { uint16_t mixWarn:2; // mixer warning uint16_t mltpx:2 ENUM(MixerMultiplex); uint16_t spare:1 SKIP; - int32_t offset:14 CUST(in_read_weight,in_write_weight); - int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); + int32_t offset:13 CUST(in_read_weight,in_write_weight); + int32_t swtch:10 CUST(r_swtchSrc,w_swtchSrc); uint32_t flightModes:9 CUST(r_flightModes, w_flightModes); CurveRef curve; uint8_t delayUp; @@ -100,10 +101,9 @@ PACK(struct ExpoData { int16_t trimSource:6; uint16_t srcRaw:10 ENUM(MixSources) CUST(r_mixSrcRaw,w_mixSrcRaw); uint32_t chn:5; - int32_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); + int32_t swtch:10 CUST(r_swtchSrc,w_swtchSrc); uint32_t flightModes:9 CUST(r_flightModes, w_flightModes); int32_t weight:8 CUST(in_read_weight,in_write_weight); - int32_t spare:1 SKIP; NOBACKUP(char name[LEN_EXPOMIX_NAME]); int8_t offset CUST(in_read_weight,in_write_weight); CurveRef curve; @@ -134,9 +134,9 @@ PACK(struct LogicalSwitchData { CUST_ATTR(def,r_logicSw,w_logicSw); int32_t v1:10 SKIP; int32_t v3:10 SKIP; - int32_t andsw:9 CUST(r_swtchSrc,w_swtchSrc); // TODO rename to xswtch + int32_t andsw:10 CUST(r_swtchSrc,w_swtchSrc); // TODO rename to xswtch uint32_t andswtype:1 SKIP; // TODO rename to xswtchType (AND / OR) - uint32_t spare:2 SKIP; // anything else needed? + uint32_t spare:1 SKIP; // anything else needed? int16_t v2 SKIP; uint8_t delay; uint8_t duration; @@ -154,8 +154,8 @@ PACK(struct LogicalSwitchData { #endif PACK(struct CustomFunctionData { - int16_t swtch:9 CUST(r_swtchSrc,w_swtchSrc); - uint16_t func:7 ENUM(Functions); + int16_t swtch:10 CUST(r_swtchSrc,w_swtchSrc); + uint16_t func:6 ENUM(Functions); // TODO: 6 bits for Functions? CUST_ATTR(def,r_customFn,w_customFn); PACK(union { NOBACKUP(PACK(struct { @@ -192,10 +192,11 @@ PACK(struct trim_t { }); PACK(struct FlightModeData { - trim_t trim[NUM_TRIMS]; + trim_t trim[MAX_TRIMS]; NOBACKUP(char name[LEN_FLIGHT_MODE_NAME]); - int16_t swtch:9 ENUM(SwitchSources) CUST(r_swtchSrc,w_swtchSrc); // swtch of phase[0] is not used - int16_t spare:7 SKIP; + // swtch of phase[0] is not used + int16_t swtch:10 ENUM(SwitchSources) CUST(r_swtchSrc,w_swtchSrc); + int16_t spare:6 SKIP; uint8_t fadeIn; uint8_t fadeOut; gvar_t gvars[MAX_GVARS] FUNC(gvar_is_active); @@ -555,19 +556,20 @@ PACK(struct ModelHeader { #endif }); -#if defined(COLORLCD) -typedef uint32_t swconfig_t; -typedef uint32_t swarnstate_t; -#elif defined(PCBX9E) -typedef uint64_t swconfig_t; -typedef uint64_t swarnstate_t; -#elif defined(PCBX9D) || defined(PCBX9DP) -typedef uint32_t swconfig_t; -typedef uint32_t swarnstate_t; -#else -typedef uint16_t swconfig_t; -typedef uint32_t swarnstate_t; -#endif +// 2 bits per switch, max 32 switches +static_assert(sizeof(swconfig_t) >= (MAX_SWITCHES * 2 + 7) / 8, + "MAX_SWITCHES must fit swconfig_t"); + +static_assert(sizeof(swarnstate_t) >= (MAX_SWITCHES * 2 + 7) / 8, + "MAX_SWITCHES must fit swarnstate_t"); + +// pot config: 4 bits per pot +static_assert(sizeof(potconfig_t) * 8 >= ((MAX_POTS - 1) / 4) + 1, + "MAX_POTS must fit potconfig_t"); + +// pot warning enabled: 1 bit per pot +static_assert(sizeof(potwarnen_t) * 8 >= MAX_POTS, + "MAX_POTS must fit potwarnen_t"); #if defined(COLORLCD) && defined(BACKUP) #define CUSTOM_SCREENS_DATA @@ -606,7 +608,7 @@ PACK(struct CustomScreenData { #define SCRIPT_DATA #endif -#if defined(FUNCTION_SWITCHES) && NUM_FUNCTIONS_SWITCHES < 8 +#if defined(FUNCTION_SWITCHES) #define FUNCTION_SWITCHS_FIELDS \ uint16_t functionSwitchConfig; \ uint16_t functionSwitchGroup; \ @@ -719,8 +721,8 @@ PACK(struct ModelData { SCRIPT_DATA NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); - NOBACKUP(uint16_t potsWarnEnabled); - NOBACKUP(int8_t potsWarnPosition[STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS]); + NOBACKUP(potwarnen_t potsWarnEnabled); + NOBACKUP(int8_t potsWarnPosition[MAX_POTS]); NOBACKUP(TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS];) @@ -734,30 +736,26 @@ PACK(struct ModelData { uint8_t getThrottleStickTrimSource() const { - // The order here is TERA, so that 0 (default) means Throttle - switch (thrTrimSw) { - case 0: - return MIXSRC_TrimThr; - case 2: - return MIXSRC_TrimRud; - default: - return thrTrimSw + MIXSRC_FIRST_TRIM; + // Makes Throttle the default (=0) + auto thr = inputMappingGetThrottle(); + if (thrTrimSw == 0) { + return MIXSRC_FIRST_TRIM + thr; + } else if (thrTrimSw == thr) { + return MIXSRC_FIRST_TRIM; + } else { + return MIXSRC_FIRST_TRIM + thrTrimSw; } } void setThrottleStickTrimSource(int16_t src) { - // The order here is TERA, so that 0 (default) means Throttle - switch (src) { - case MIXSRC_TrimThr: - thrTrimSw = 0; - break; - case MIXSRC_TrimRud: - thrTrimSw = 2; - break; - default: - thrTrimSw = src - MIXSRC_FIRST_TRIM; - break; + auto thr = inputMappingGetThrottle(); + if (src == MIXSRC_FIRST_TRIM + thr) { + thrTrimSw = 0; + } else if (src == MIXSRC_FIRST_TRIM) { + thrTrimSw = thr; + } else { + thrTrimSw = src - MIXSRC_FIRST_TRIM; } } @@ -820,12 +818,6 @@ PACK(struct TrainerData { #if defined(COLORLCD) #define EXTRA_GENERAL_FIELDS \ - CUST_ARRAY(sticksConfig, struct_sticksConfig, stick_name_valid); \ - swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ - uint16_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */ \ - uint8_t slidersConfig ARRAY(1,struct_sliderConfig,nullptr); /* 1 bit per slider */ \ - NOBACKUP(char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME] SKIP); \ - NOBACKUP(char anaNames[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS][LEN_ANA_NAME] SKIP); \ NOBACKUP(char currModelFilename[LEN_MODEL_FILENAME+1]); \ NOBACKUP(uint8_t modelQuickSelect:1); \ NOBACKUP(uint8_t blOffBright:7); \ @@ -839,14 +831,7 @@ PACK(struct TrainerData { #define BLUETOOTH_FIELDS #endif #define EXTRA_GENERAL_FIELDS \ - uint8_t slidersConfig:4 ARRAY(1,struct_sliderConfig,nullptr); \ - uint8_t spare5:4 SKIP; \ - uint8_t potsConfig ARRAY(2,struct_potConfig,nullptr); /* two bits per pot */\ uint8_t backlightColor; \ - CUST_ARRAY(sticksConfig, struct_sticksConfig, stick_name_valid); \ - swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); \ - char switchNames[STORAGE_NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES][LEN_SWITCH_NAME] SKIP; \ - char anaNames[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS][LEN_ANA_NAME] SKIP; \ BLUETOOTH_FIELDS #endif @@ -873,7 +858,7 @@ PACK(struct RadioData { NOBACKUP(int8_t spare0:7 SKIP); CUST_ATTR(semver,nullptr,w_semver); CUST_ATTR(board,nullptr,w_board); - CalibData calib[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS] NO_IDX; + CalibData calib[MAX_CALIB_ANALOG_INPUTS] NO_IDX; NOBACKUP(uint16_t chkSum SKIP); N_HORUS_FIELD(int8_t currModel); N_HORUS_FIELD(uint8_t contrast); @@ -883,7 +868,7 @@ PACK(struct RadioData { int8_t antennaMode:2 ENUM(AntennaModes); uint8_t disableRtcWarning:1; uint8_t keysBacklight:1; - NOBACKUP(uint8_t spare1:1 SKIP); + uint8_t spare1:1 SKIP; uint8_t internalModule ENUM(ModuleType); NOBACKUP(TrainerData trainer); NOBACKUP(uint8_t view); // index of view in main screen @@ -946,6 +931,11 @@ PACK(struct RadioData { CUST_ATTR(aux2SerialMode, r_serialMode, nullptr); NOBACKUP(uint32_t serialPort ARRAY(SERIAL_CONF_BITS_PER_PORT,struct_serialConfig,nullptr)); + CUST_ARRAY(sticksConfig, struct_stickConfig, MAX_STICKS, stick_name_valid); + CUST_ARRAY(slidersConfig, struct_sliderConfig, MAX_POTS, nullptr); + potconfig_t potsConfig ARRAY(4,struct_potConfig,nullptr); + swconfig_t switchConfig ARRAY(2,struct_switchConfig,nullptr); + EXTRA_GENERAL_FIELDS THEME_DATA diff --git a/radio/src/disk_cache.h b/radio/src/disk_cache.h index f5260bdab..8022c4501 100644 --- a/radio/src/disk_cache.h +++ b/radio/src/disk_cache.h @@ -23,7 +23,6 @@ #define _DISK_CACHE_H_ #include "diskio.h" -#include "sdio_sd.h" // tunable parameters #define DISK_CACHE_BLOCKS_NUM 32 // no cache blocks diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp index b717fbd21..e3da70f9e 100644 --- a/radio/src/functions.cpp +++ b/radio/src/functions.cpp @@ -20,6 +20,7 @@ */ #include "opentx.h" +#include "switches.h" #if defined(COLORLCD) void setRequestedMainView(uint8_t view); @@ -143,7 +144,7 @@ void evalFunctions(const CustomFunctionData * functions, CustomFunctionsContext #endif #if defined(GVARS) - for (uint8_t i=0; i= 0x0e) - void repeatLastCursorMove(event_t event); - #define REPEAT_LAST_CURSOR_MOVE() { if (EVT_KEY_MASK(event) >= 0x0e) pushEvent(event); else repeatLastCursorMove(event); } -#else - #define IS_ROTARY_LEFT(evt) (0) - #define IS_ROTARY_RIGHT(evt) (0) - #define IS_ROTARY_BREAK(evt) (0) - #define IS_ROTARY_LONG(evt) (0) - #define IS_ROTARY_EVENT(evt) (0) - void repeatLastCursorMove(event_t event); - #define REPEAT_LAST_CURSOR_MOVE() repeatLastCursorMove(event) -#endif - -// TODO enum -#if defined(PCBX7) || defined(PCBX9LITE) -#define EDIT_MODE_INIT 0 -#else -#define EDIT_MODE_INIT -1 -#endif +#define EDIT_MODE_INIT 0 extern uint8_t editNameCursorPos; @@ -280,6 +162,7 @@ uint8_t getMixesCount(); void insertMix(uint8_t idx); void deleteMix(uint8_t idx); +void onSwitchLongEnterPress(const char *result); void onSourceLongEnterPress(const char *result); uint8_t switchToMix(uint8_t source); @@ -291,6 +174,8 @@ extern const unsigned char sticks[] ; void drawSplash(); void drawScreenIndex(uint8_t index, uint8_t count, uint8_t attr); void drawStick(coord_t centrex, int16_t xval, int16_t yval); +void drawWheel(coord_t centrex, int16_t wval); +void drawThrottle(coord_t centrex, int16_t tval); void drawPotsBars(); void doMainScreenGraphics(); diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index e629410be..9446ad308 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -35,6 +35,9 @@ #if !defined(BOOT) #include "opentx.h" + #include "hal/switch_driver.h" + #include "hal/adc_driver.h" + #include "switches.h" #endif pixel_t displayBuf[DISPLAY_BUFFER_SIZE] __DMA; @@ -707,7 +710,7 @@ void putsVBat(coord_t x, coord_t y, LcdFlags att) void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att) { if (idx == MIXSRC_NONE) { - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, 0, att); // TODO macro + lcdDrawText(x, y, STR_EMPTY, att); } else if (idx <= MIXSRC_LAST_INPUT) { lcdDrawChar(x+2, y+1, CHR_INPUT, TINSIZE); @@ -734,98 +737,14 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att) } } #endif - else if (idx <= MIXSRC_LAST_POT) { - idx = idx - MIXSRC_Rud; - if (g_eeGeneral.anaNames[idx][0]) { - if (idx < MIXSRC_FIRST_POT-MIXSRC_Rud ) - lcdDrawSizedText(x, y, STR_CHAR_STICK, 2, att); - else if (idx <= MIXSRC_LAST_POT-MIXSRC_Rud ) - lcdDrawSizedText(x, y, STR_CHAR_POT, 2, att); - else - lcdDrawSizedText(x, y, STR_CHAR_SLIDER, 2, att); - lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.anaNames[idx], LEN_ANA_NAME, att); - } - else { - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx + 1, att); - } - } - else if (idx >= MIXSRC_FIRST_SWITCH && idx <= MIXSRC_LAST_SWITCH) { - -#if defined(FUNCTION_SWITCHES) - if(idx >= MIXSRC_FIRST_FS_SWITCH) { - idx = idx-(MIXSRC_FIRST_SWITCH+NUM_REGULAR_SWITCHES); - if (ZEXIST(g_model.switchNames[idx])) { - lcdDrawSizedText(x, y, STR_CHAR_SWITCH, 2, att); - lcdDrawSizedText(lcdNextPos, y, g_model.switchNames[idx], LEN_SWITCH_NAME, att); - } - else { - char s[LEN_SWITCH_NAME] = {'S', 'W'}; - s[LEN_SWITCH_NAME-1] = '1' + idx; - lcdDrawSizedText(x, y, STR_CHAR_SWITCH, 2, att); - lcdDrawSizedText(lcdNextPos, y, s, LEN_SWITCH_NAME, att); - } - } - else { - idx = idx-MIXSRC_FIRST_SWITCH; - if (ZEXIST(g_eeGeneral.switchNames[idx])) { - lcdDrawSizedText(x, y, STR_CHAR_SWITCH, 2, att); - lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.switchNames[idx], LEN_SWITCH_NAME, att); - } - else - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1, att); - } -#else - idx = idx-MIXSRC_FIRST_SWITCH; - if (ZEXIST(g_eeGeneral.switchNames[idx])) { - lcdDrawSizedText(x, y, STR_CHAR_SWITCH, 2, att); //switch symbol - lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.switchNames[idx], LEN_SWITCH_NAME, att); - } - else - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1, att); -#endif - - } - else if (idx < MIXSRC_SW1) - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1, att); - else if (idx <= MIXSRC_LAST_LOGICAL_SWITCH) - drawSwitch(x, y, SWSRC_SW1+idx-MIXSRC_SW1, att); - else if (idx < MIXSRC_CH1) - drawStringWithIndex(x, y, STR_PPM_TRAINER, idx-MIXSRC_FIRST_TRAINER+1, att); - else if (idx <= MIXSRC_LAST_CH) { - if (ZEXIST(g_model.limitData[idx-MIXSRC_CH1].name) && (att & STREXPANDED)) { - char s[LEN_CHANNEL_NAME + 3]; - strcpy(s, STR_CHAR_CHANNEL); - strcat(s, g_model.limitData[idx-MIXSRC_CH1].name); - lcdDrawSizedText(x, y, s, LEN_CHANNEL_NAME+2, att); - } else { - drawStringWithIndex(x, y, STR_CH, idx-MIXSRC_CH1+1, att); - } - } - else if (idx <= MIXSRC_LAST_GVAR) { - drawStringWithIndex(x, y, STR_GV, idx-MIXSRC_GVAR1+1, att); - } - else if (idx < MIXSRC_FIRST_TIMER) { - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1-MAX_LOGICAL_SWITCHES-MAX_TRAINER_CHANNELS-MAX_OUTPUT_CHANNELS-MAX_GVARS, att); - } - else if (idx <= MIXSRC_LAST_TIMER) { - if(ZEXIST(g_model.timers[idx-MIXSRC_FIRST_TIMER].name)) { - lcdDrawSizedText(x, y, g_model.timers[idx-MIXSRC_FIRST_TIMER].name, LEN_TIMER_NAME, att); - } - else { - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1-MAX_LOGICAL_SWITCHES-MAX_TRAINER_CHANNELS-MAX_OUTPUT_CHANNELS-MAX_GVARS, att); - } - } else { - idx -= MIXSRC_FIRST_TELEM; - div_t qr = div(idx, 3); - lcdDrawSizedText(x, y, g_model.telemetrySensors[qr.quot].label, TELEM_LABEL_LEN, att); - if (qr.rem) lcdDrawChar(lcdLastRightPos, y, qr.rem==2 ? '+' : '-', att); + lcdDrawText(x, y, getSourceString(idx), att); } } void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags att) { - lcdDrawTextAtIndex(x, y, STR_RETA123, idx-1, att); + lcdDrawText(x, y, getAnalogShortLabel(idx), att); } void drawModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att) @@ -873,10 +792,10 @@ void drawShortTrimMode(coord_t x, coord_t y, uint8_t fm, uint8_t idx, LcdFlags a uint8_t mode = v.mode; uint8_t p = v.mode >> 1; if (mode == TRIM_MODE_NONE) { - putsChnLetter(x, y, idx+1, att); + putsChnLetter(x, y, idx, att); } else { - lcdDrawChar(x, y, '0'+p, att); + lcdDrawChar(x, y, '0' + p, att); } } diff --git a/radio/src/gui/128x64/lcd.h b/radio/src/gui/128x64/lcd.h index ea3858a08..1dc5e8669 100644 --- a/radio/src/gui/128x64/lcd.h +++ b/radio/src/gui/128x64/lcd.h @@ -126,7 +126,7 @@ void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att=0); void drawShortTrimMode(coord_t x, coord_t y, uint8_t mode, uint8_t idx, LcdFlags att); -#define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_CH1+idx-1, att) +#define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_FIRST_CH + idx - 1, att) void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags attr); void putsVolts(coord_t x, coord_t y, uint16_t volts, LcdFlags att); diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index cf2cedf82..620c5ebc4 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -70,6 +70,7 @@ void menuRadioTrainer(event_t event); void menuRadioVersion(event_t event); void menuRadioDiagKeys(event_t event); void menuRadioDiagAnalogs(event_t event); +void menuRadioDiagFS(event_t event); void menuRadioHardware(event_t event); void menuRadioTools(event_t event); void menuRadioSpectrumAnalyser(event_t event); diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp index 8f0d98f10..cbaff9461 100644 --- a/radio/src/gui/128x64/model_curve_edit.cpp +++ b/radio/src/gui/128x64/model_curve_edit.cpp @@ -20,6 +20,7 @@ */ #include "opentx.h" +#include "hal/rotary_encoder.h" void runPopupCurvePreset(event_t event) { @@ -122,9 +123,7 @@ void menuModelCurveOne(event_t event) lcdDrawNumber(INDENT_WIDTH, 6*FH+1, 5+crv.points, LEFT|attr); lcdDrawText(lcdLastRightPos, 6*FH+1, STR_PTS, attr); if (attr) { -#if defined(ROTARY_ENCODER_NAVIGATION) - rotencSpeed = ROTENC_LOWSPEED; -#endif + rotaryEncoderResetAccel(); int8_t count = checkIncDecModel(event, crv.points, -3, 12); // 2pts - 17pts if (checkIncDec_Ret) { int8_t newPoints[MAX_POINTS_PER_CURVE]; @@ -174,7 +173,7 @@ void menuModelCurveOne(event_t event) break; #elif defined(NAVIGATION_XLITE) case EVT_KEY_FIRST(KEY_ENTER): - if (IS_SHIFT_PRESSED()) { + if (keysGetState(KEY_SHIFT)) { pushMenu(menuChannelsView); killEvents(event); } diff --git a/radio/src/gui/128x64/model_custom_scripts.cpp b/radio/src/gui/128x64/model_custom_scripts.cpp index 386d62bad..7727034a6 100644 --- a/radio/src/gui/128x64/model_custom_scripts.cpp +++ b/radio/src/gui/128x64/model_custom_scripts.cpp @@ -118,7 +118,7 @@ void menuModelCustomScriptOne(event_t event) scriptInputsOutputs[s_currIdx].inputsCount + 1) { lcdDrawTextAlignedLeft(y, STR_OUTPUTS); if (attr) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } } else if (i <= ITEM_MODEL_CUSTOMSCRIPT_PARAMS_LABEL + scriptInputsOutputs[s_currIdx].inputsCount + diff --git a/radio/src/gui/128x64/model_display.cpp b/radio/src/gui/128x64/model_display.cpp index b6d20d3eb..bf5365b52 100644 --- a/radio/src/gui/128x64/model_display.cpp +++ b/radio/src/gui/128x64/model_display.cpp @@ -262,7 +262,7 @@ void menuModelDisplay(event_t event) } } if (attr && menuHorizontalPosition == NUM_LINE_ITEMS) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } } break; diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp index 781994445..00b6a00e2 100644 --- a/radio/src/gui/128x64/model_flightmodes.cpp +++ b/radio/src/gui/128x64/model_flightmodes.cpp @@ -111,15 +111,14 @@ void menuModelFlightModeOne(event_t event) case ITEM_MODEL_FLIGHT_MODE_TRIMS: lcdDrawTextAlignedLeft(y, STR_TRIMS); - for (uint8_t t = 0; t < NUM_STICKS; t++) { - drawTrimMode(MIXES_2ND_COLUMN + (t*2*FW), y, s_currIdx, t, menuHorizontalPosition == t ? attr : 0); -#if defined(NAVIGATION_9X) - if (s_editMode > 0 && attr && menuHorizontalPosition == t) { -#else - if (s_editMode >= 0 && attr && menuHorizontalPosition == t) { -#endif - trim_t & v = fm->trim[t]; - v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, k==0 ? 0 : 2*MAX_FLIGHT_MODES-1, EE_MODEL, isTrimModeAvailable); + { + auto trims = keysGetMaxTrims(); + for (uint8_t t = 0; t < trims; t++) { + drawTrimMode(MIXES_2ND_COLUMN + (t*2*FW), y, s_currIdx, t, menuHorizontalPosition == t ? attr : 0); + if (s_editMode > 0 && attr && menuHorizontalPosition == t) { + trim_t & v = fm->trim[t]; + v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, k==0 ? 0 : 2*MAX_FLIGHT_MODES-1, EE_MODEL, isTrimModeAvailable); + } } } break; @@ -188,64 +187,41 @@ void menuModelFlightModeOne(event_t event) void menuModelFlightModesAll(event_t event) { - SIMPLE_MENU(STR_MENUFLIGHTMODES, menuTabModel, MENU_MODEL_FLIGHT_MODES, HEADER_LINE+MAX_FLIGHT_MODES+1); + SIMPLE_MENU(STR_MENUFLIGHTMODES, menuTabModel, MENU_MODEL_FLIGHT_MODES, + HEADER_LINE+MAX_FLIGHT_MODES+1); int8_t sub = menuVerticalPosition - HEADER_LINE; - switch (event) { - case EVT_KEY_FIRST(KEY_ENTER): - if (sub == MAX_FLIGHT_MODES) { - s_editMode = 0; - trimsCheckTimer = 200; // 2 seconds - } - // no break -#if !defined(PCBX7) - case EVT_KEY_FIRST(KEY_RIGHT): -#endif - if (sub >= 0 && sub < MAX_FLIGHT_MODES) { - s_currIdx = sub; - pushMenu(menuModelFlightModeOne); - } - break; + // "Check trims" button + if (sub == MAX_FLIGHT_MODES && event == EVT_KEY_FIRST(KEY_ENTER)) { + s_editMode = 0; + trimsCheckTimer = 200; // 2 seconds + } + + // Flight mode lines + if (sub >= 0 && sub < MAX_FLIGHT_MODES && + (event == EVT_KEY_FIRST(KEY_ENTER) || event == EVT_KEY_FIRST(KEY_RIGHT))) { + s_currIdx = sub; + pushMenu(menuModelFlightModeOne); } uint8_t att; - for (uint8_t i=0; i(LCD_LINES-1)*FH+1) continue; - att = (i==sub ? INVERS : 0); - FlightModeData * p = flightModeAddress(i); - drawFlightMode(0, y, i+1, att|(getFlightMode()==i ? BOLD : 0)); -#if defined(PCBTARANIS) + for (uint8_t i = 0; i < MAX_FLIGHT_MODES; i++) { + int8_t y = 1 + (1 + i - menuVerticalOffset) * FH; + if (y < 1 * FH + 1 || y > (LCD_LINES - 1) * FH + 1) continue; + att = (i == sub ? INVERS : 0); + FlightModeData* p = flightModeAddress(i); + drawFlightMode(0, y, i + 1, att | (getFlightMode() == i ? BOLD : 0)); lcdDrawSizedText(NAME_POS, y, p->name, sizeof(p->name), 0); -#else - lcdDrawSizedText(4*FW+NAME_OFS, y, p->name, sizeof(p->name), 0); -#endif - if (i == 0) { - for (uint8_t t=0; tswtch, 0); - for (uint8_t t=0; tswtch, 0); - for (uint8_t t=0; t 0) drawSwitch(SWITCH_POS, y, p->swtch, 0); + for (uint8_t t = 0; t < trims; t++) { + drawTrimMode(TRIMS_POS + t * FW * 2, y, i, t, 0); } if (p->fadeIn || p->fadeOut) { - lcdDrawChar(LCD_W-FW, y, (p->fadeIn && p->fadeOut) ? '*' : (p->fadeIn ? 'I' : 'O')); + lcdDrawChar(LCD_W - FW, y, + (p->fadeIn && p->fadeOut) ? '*' : (p->fadeIn ? 'I' : 'O')); } } diff --git a/radio/src/gui/128x64/model_input_edit.cpp b/radio/src/gui/128x64/model_input_edit.cpp index 88aec566a..eda89de1d 100644 --- a/radio/src/gui/128x64/model_input_edit.cpp +++ b/radio/src/gui/128x64/model_input_edit.cpp @@ -68,7 +68,7 @@ void menuModelExpoOne(event_t event) killEvents(event); } #elif defined(NAVIGATION_XLITE) - if (event == EVT_KEY_FIRST(KEY_ENTER) && IS_SHIFT_PRESSED()) { + if (event == EVT_KEY_FIRST(KEY_ENTER) && keysGetState(KEY_SHIFT)) { pushMenu(menuChannelsView); killEvents(event); } @@ -159,12 +159,20 @@ void menuModelExpoOne(event_t event) break; case EXPO_FIELD_TRIM: - uint8_t notStick = (ed->srcRaw > MIXSRC_Ail); - int8_t trimSource = -ed->trimSource; lcdDrawTextAlignedLeft(y, STR_TRIM); - lcdDrawTextAtIndex(EXPO_ONE_2ND_COLUMN, y, STR_VMIXTRIMS, (notStick && trimSource == 0) ? 0 : trimSource + 1, RIGHT | (menuHorizontalPosition==0 ? attr : 0)); - if (attr) - ed->trimSource = -checkIncDecModel(event, trimSource, notStick ? TRIM_ON : -TRIM_OFF, -TRIM_LAST); + { + const char* trim_str = getTrimSourceLabel(ed->srcRaw, ed->trimSource); + LcdFlags flags = RIGHT | (menuHorizontalPosition==0 ? attr : 0); + lcdDrawText(EXPO_ONE_2ND_COLUMN, y, trim_str, flags); + + if (attr) { + int8_t min = TRIM_ON; + if (ed->srcRaw >= MIXSRC_FIRST_STICK && ed->srcRaw <= MIXSRC_LAST_STICK) { + min = -TRIM_OFF; + } + ed->trimSource = -checkIncDecModel(event, -ed->trimSource, min, keysGetMaxTrims()); + } + } break; } y += FH; diff --git a/radio/src/gui/128x64/model_logical_switches.cpp b/radio/src/gui/128x64/model_logical_switches.cpp index f8880710a..08ad19270 100644 --- a/radio/src/gui/128x64/model_logical_switches.cpp +++ b/radio/src/gui/128x64/model_logical_switches.cpp @@ -60,7 +60,7 @@ void menuModelLogicalSwitchOne(event_t event) LogicalSwitchData * cs = lswAddress(s_currIdx); - uint8_t sw = SWSRC_SW1+s_currIdx; + uint8_t sw = SWSRC_FIRST_LOGICAL_SWITCH+s_currIdx; uint8_t cstate = lswFamily(cs->func); drawSwitch(14*FW, 0, sw, (getSwitch(sw) ? BOLD : 0)); @@ -209,7 +209,7 @@ void menuModelLogicalSwitchOne(event_t event) if (cstate == LS_FAMILY_EDGE) { lcdDrawText(CSWONE_2ND_COLUMN, y, STR_NA); if (attr) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } break; } @@ -285,7 +285,7 @@ void menuModelLogicalSwitches(event_t event) LogicalSwitchData * cs = lswAddress(k); // CSW name - uint8_t sw = SWSRC_SW1+k; + uint8_t sw = SWSRC_FIRST_LOGICAL_SWITCH+k; drawSwitch(0, y, sw, (sub==k ? INVERS : 0) | (getSwitch(sw) ? BOLD : 0)); diff --git a/radio/src/gui/128x64/model_mix_edit.cpp b/radio/src/gui/128x64/model_mix_edit.cpp index eadfd18f7..735157111 100644 --- a/radio/src/gui/128x64/model_mix_edit.cpp +++ b/radio/src/gui/128x64/model_mix_edit.cpp @@ -99,7 +99,7 @@ void menuModelMixOne(event_t event) killEvents(event); } #elif defined(NAVIGATION_XLITE) - if (event == EVT_KEY_FIRST(KEY_ENTER) && IS_SHIFT_PRESSED()) { + if (event == EVT_KEY_FIRST(KEY_ENTER) && keysGetState(KEY_SHIFT)) { pushMenu(menuChannelsView); killEvents(event); } diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index 29d79db49..9e4fcec2c 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -90,10 +90,35 @@ void onModelSelectMenu(const char * result) #endif } +static void moveToFreeModelSlot(bool forward, int8_t& sub, int8_t oldSub) +{ + int8_t next_ofs = s_copyTgtOfs + oldSub - menuVerticalPosition; + if (next_ofs == MAX_MODELS || next_ofs == -MAX_MODELS) next_ofs = 0; + + if (s_copySrcRow < 0 && s_copyMode == COPY_MODE) { + s_copySrcRow = oldSub; + // find a hole (in the first empty slot above / below) + sub = findEmptyModel(s_copySrcRow, forward); + if (sub < 0) { + // no free room for duplicating the model + AUDIO_ERROR(); + sub = oldSub; + s_copyMode = 0; + } + next_ofs = 0; + menuVerticalPosition = sub; + } + s_copyTgtOfs = next_ofs; +} + void menuModelSelect(event_t event) { + // Suppress "edit mode": model select has none + // Suppress exit in "copy mode": handled in this function event_t _event_ = event; - if ((s_copyMode && IS_KEY_EVT(event, KEY_EXIT)) || event == EVT_KEY_BREAK(KEY_EXIT) || IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event)) { + if ((s_copyMode && IS_KEY_EVT(event, KEY_EXIT)) || + event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER) || + event == EVT_KEY_LONG(KEY_ENTER)) { _event_ = 0; } @@ -179,7 +204,9 @@ void menuModelSelect(event_t event) s_copyMode = 0; event = EVT_ENTRY_UP; } - else if (event == EVT_KEY_LONG(KEY_ENTER) || IS_ROTARY_BREAK(event)) { + else if (event == EVT_KEY_BREAK(KEY_ENTER) || + event == EVT_KEY_LONG(KEY_ENTER)) { + s_copyMode = 0; killEvents(event); if (g_eeGeneral.currModel != sub) { @@ -232,57 +259,25 @@ void menuModelSelect(event_t event) chainMenu(menuModelSetup); break; #else -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_LEFT: - case EVT_ROTARY_RIGHT: -#endif case EVT_KEY_FIRST(KEY_LEFT): case EVT_KEY_FIRST(KEY_RIGHT): -#if defined(ROTARY_ENCODER_NAVIGATION) - if ((!IS_ROTARY_RIGHT(event) && !IS_ROTARY_LEFT(event)) || s_editMode < 0) { -#endif if (sub == g_eeGeneral.currModel) { - chainMenu((IS_ROTARY_RIGHT(event) || event == EVT_KEY_FIRST(KEY_RIGHT)) ? menuModelSetup : menuTabModel[DIM(menuTabModel)-1].menuFunc); - } - else { + bool forward = (event == EVT_KEY_FIRST(KEY_RIGHT)); + chainMenu(forward ? menuModelSetup + : menuTabModel[DIM(menuTabModel) - 1].menuFunc); + } else { AUDIO_WARNING2(); } break; -#if defined(ROTARY_ENCODER_NAVIGATION) - } - // no break -#endif #endif + } -#if defined(ROTARY_ENCODER_NAVIGATION) && defined(NAVIGATION_X7) - case EVT_ROTARY_LEFT: - case EVT_ROTARY_RIGHT: -#endif - case EVT_KEY_FIRST(KEY_UP): - case EVT_KEY_REPT(KEY_UP): - case EVT_KEY_FIRST(KEY_DOWN): - case EVT_KEY_REPT(KEY_DOWN): - if (s_copyMode) { - int8_t next_ofs = s_copyTgtOfs + oldSub - menuVerticalPosition; - if (next_ofs == MAX_MODELS || next_ofs == -MAX_MODELS) - next_ofs = 0; - - if (s_copySrcRow < 0 && s_copyMode==COPY_MODE) { - s_copySrcRow = oldSub; - // find a hole (in the first empty slot above / below) - sub = findEmptyModel(s_copySrcRow, IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_DOWN)); - if (sub < 0) { - // no free room for duplicating the model - AUDIO_ERROR(); - sub = oldSub; - s_copyMode = 0; - } - next_ofs = 0; - menuVerticalPosition = sub; - } - s_copyTgtOfs = next_ofs; - } - break; + if (s_copyMode) { + if (IS_PREVIOUS_EVENT(event)) { + moveToFreeModelSlot(false, sub, oldSub); + } else if (IS_NEXT_EVENT(event)) { + moveToFreeModelSlot(true, sub, oldSub); + } } #if defined(EEPROM) @@ -295,8 +290,6 @@ void menuModelSelect(event_t event) uint8_t sz = menuSize(menuTabModel, DIM(menuTabModel)); #if defined(NAVIGATION_X7) drawScreenIndex(MENU_MODEL_SELECT, sz, 0); -#elif defined(ROTARY_ENCODER_NAVIGATION) - drawScreenIndex(MENU_MODEL_SELECT, sz, (sub == g_eeGeneral.currModel) ? ((IS_ROTARY_ENCODER_NAVIGATION_ENABLE() && s_editMode < 0) ? INVERS|BLINK : INVERS) : 0); #else drawScreenIndex(MENU_MODEL_SELECT, sz, (sub == g_eeGeneral.currModel) ? INVERS : 0); #endif diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index b7df295e2..d2a960af8 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -21,6 +21,9 @@ #include "opentx.h" #include "mixer_scheduler.h" +#include "hal/adc_driver.h" +#include "hal/switch_driver.h" +#include "switches.h" #if defined(USBJ_EX) #include "usb_joystick.h" @@ -44,18 +47,16 @@ uint8_t g_moduleIdx; -#if defined(PCBTARANIS) uint8_t getSwitchWarningsCount() { uint8_t count = 0; - for (int i=0; i 0 && menuHorizontalPosition == 0)) editName(35, y, g_model.switchNames[index], LEN_SWITCH_NAME, event, menuHorizontalPosition == 0 ? attr : 0, 0, old_editMode); else @@ -822,7 +819,7 @@ void menuModelSetup(event_t event) } } else if (attr && menuHorizontalPosition == 3) { // Non visible checkbox - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } break; } @@ -891,7 +888,7 @@ void menuModelSetup(event_t event) if (attr) CHECK_INCDEC_MODELVAR_ZERO_CHECK( event, g_model.thrTraceSrc, - NUM_POTS + NUM_SLIDERS + MAX_OUTPUT_CHANNELS, + adcGetMaxInputs(ADC_INPUT_POT) + MAX_OUTPUT_CHANNELS, isThrottleSourceAvailable); uint8_t idx = throttleSource2Source(g_model.thrTraceSrc); @@ -907,7 +904,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_THROTTLE_TRIM_SWITCH: lcdDrawText(INDENT_WIDTH, y, STR_TTRIM_SW); if (attr) - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.thrTrimSw, NUM_TRIMS - 1); + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.thrTrimSw, keysGetMaxTrims() - 1); drawSource(MODEL_SETUP_2ND_COLUMN+20, y, g_model.getThrottleStickTrimSource(), attr); break; @@ -939,7 +936,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_SWITCHES_WARNING2: if (i==0) { - if (CURSOR_MOVED_LEFT(event)) + if (IS_PREVIOUS_EVENT(event)) menuVerticalOffset--; else menuVerticalOffset++; @@ -948,13 +945,12 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_SWITCHES_WARNING1: { - #define FIRSTSW_STR (&STR_VSRCRAW[MIXSRC_FIRST_SWITCH-MIXSRC_FIRST_STICK+1]) uint8_t switchWarningsCount = getSwitchWarningsCount(); //uint8_t length = STR_VSRCRAW[0]; horzpos_t l_posHorz = menuHorizontalPosition; if (i>=NUM_BODY_LINES-2 && getSwitchWarningsCount() > MAX_SWITCH_PER_LINE*(NUM_BODY_LINES-i)) { - if (CURSOR_MOVED_LEFT(event)) + if (IS_PREVIOUS_EVENT(event)) menuVerticalOffset--; else menuVerticalOffset++; @@ -987,7 +983,7 @@ void menuModelSetup(event_t event) getMovedSwitch(); // Mask switches enabled for warnings swarnstate_t sw_mask = 0; - for(uint8_t i=0; i= 0) && (g_model.potsWarnEnabled & (1 << i))) { + if ((!attr || menuHorizontalPosition >= 0) && + (g_model.potsWarnEnabled & (1 << i))) { flags |= INVERS; } - // skip "---" (+1) and source symbol (+2) - const char* source = STR_VSRCRAW[NUM_STICKS + 1 + i] + 2; - lcdDrawSizedText(x, y, source, UINT8_MAX, flags); + lcdDrawText(x, y, getPotLabel(i), flags); x = lcdNextPos+3; } } } break; - case ITEM_MODEL_SETUP_BEEP_CENTER: + case ITEM_MODEL_SETUP_BEEP_CENTER: { lcdDrawTextAlignedLeft(y, STR_BEEPCTR); - for (uint8_t i = 0; i < NUM_STICKS+NUM_POTS+NUM_SLIDERS; i++) { + uint8_t input_max = adcGetMaxInputs(ADC_INPUT_MAIN) + adcGetMaxInputs(ADC_INPUT_POT); + for (uint8_t i = 0; i < input_max; i++) { coord_t x = MODEL_SETUP_2ND_COLUMN + i*FW; - lcdDrawTextAtIndex(x, y, STR_RETA123, i, ((menuHorizontalPosition==i) && attr) ? BLINK | INVERS : (((g_model.beepANACenter & ((BeepANACenter)1< 0) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } } break; @@ -227,31 +227,31 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF else #endif if (func == FUNC_TRAINER) { - maxParam = NUM_STICKS + 1; + maxParam = MAX_STICKS + 1; uint8_t param = CFN_CH_INDEX(cfn); if (param == 0) lcdDrawText(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, STR_STICKS, attr); - else if (param == NUM_STICKS + 1) + else if (param == MAX_STICKS + 1) lcdDrawText(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, STR_CHANS, attr); else - drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, MIXSRC_Rud + param - 1, attr); + drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, MIXSRC_FIRST_STICK + param - 1, attr); } #if defined(GVARS) else if (func == FUNC_ADJUST_GVAR) { - maxParam = MAX_GVARS-1; + maxParam = MAX_GVARS - 1; drawStringWithIndex(lcdNextPos + 2, y, STR_GV, CFN_GVAR_INDEX(cfn)+1, attr); if (active) CFN_GVAR_INDEX(cfn) = checkIncDec(event, CFN_GVAR_INDEX(cfn), 0, maxParam, eeFlags); break; } #endif // GVARS else if (func == FUNC_SET_TIMER) { - maxParam = MAX_TIMERS-1; + maxParam = MAX_TIMERS - 1; lcdDrawTextAtIndex(lcdNextPos, y, STR_VFSWRESET, CFN_TIMER_INDEX(cfn), attr); if (active) CFN_TIMER_INDEX(cfn) = checkIncDec(event, CFN_TIMER_INDEX(cfn), 0, maxParam, eeFlags); break; } else if (attr) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } if (active) CHECK_INCDEC_MODELVAR_ZERO(event, CFN_CH_INDEX(cfn), maxParam); break; @@ -406,7 +406,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF } #endif // GVARS else if (attr) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } #if defined(NAVIGATION_X7) if (active || event==EVT_KEY_LONG(KEY_ENTER)) { @@ -456,7 +456,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF } } else if (attr) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } break; } diff --git a/radio/src/gui/128x64/radio_calibration.cpp b/radio/src/gui/128x64/radio_calibration.cpp index b813f5339..a07a1bcab 100644 --- a/radio/src/gui/128x64/radio_calibration.cpp +++ b/radio/src/gui/128x64/radio_calibration.cpp @@ -21,175 +21,7 @@ #include "opentx.h" #include "hal/adc_driver.h" - -#define XPOT_DELTA 10 -#define XPOT_DELAY 10 /* cycles */ - -void menuCommonCalib(event_t event) -{ - for (uint8_t i=0; i= POT1 && i <= POT_LAST) { - if (IS_POT_WITHOUT_DETENT(i)) { - reusableBuffer.calib.midVals[i] = (reusableBuffer.calib.hiVals[i] + reusableBuffer.calib.loVals[i]) / 2; - } -#if defined(PCBTARANIS) - uint8_t idx = i - POT1; - int count = reusableBuffer.calib.xpotsCalib[idx].stepsCount; - if (IS_POT_MULTIPOS(i) && count <= XPOTS_MULTIPOS_COUNT) { - // use raw analog value for multipos calibraton, anaIn() already has multipos decoded value - vt = getAnalogValue(i) >> 1; - if (reusableBuffer.calib.xpotsCalib[idx].lastCount == 0 || - vt < reusableBuffer.calib.xpotsCalib[idx].lastPosition - XPOT_DELTA || - vt > reusableBuffer.calib.xpotsCalib[idx].lastPosition + XPOT_DELTA) { - reusableBuffer.calib.xpotsCalib[idx].lastPosition = vt; - reusableBuffer.calib.xpotsCalib[idx].lastCount = 1; - } - else { - if (reusableBuffer.calib.xpotsCalib[idx].lastCount < 255) - reusableBuffer.calib.xpotsCalib[idx].lastCount++; - } - if (reusableBuffer.calib.xpotsCalib[idx].lastCount == XPOT_DELAY) { - int16_t position = reusableBuffer.calib.xpotsCalib[idx].lastPosition; - bool found = false; - for (int j=0; j= step-XPOT_DELTA && position <= step+XPOT_DELTA) { - found = true; - break; - } - } - if (!found) { - if (count < XPOTS_MULTIPOS_COUNT) { - reusableBuffer.calib.xpotsCalib[idx].steps[count] = position; - } - reusableBuffer.calib.xpotsCalib[idx].stepsCount += 1; - } - } - } -#endif - } - } - - menuCalibrationState = reusableBuffer.calib.state; // make sure we don't scroll while calibrating - - switch (event) { - case EVT_ENTRY: - case EVT_KEY_BREAK(KEY_EXIT): - reusableBuffer.calib.state = CALIB_START; - break; - - case EVT_KEY_BREAK(KEY_ENTER): - reusableBuffer.calib.state++; - break; - } - - switch (reusableBuffer.calib.state) { - case CALIB_START: - // START CALIBRATION - if (!READ_ONLY()) { - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+2*FH, STR_MENUTOSTART); - } - break; - - case CALIB_SET_MIDPOINT: - // SET MIDPOINT - lcdDrawText(0*FW, MENU_HEADER_HEIGHT+FH, STR_SETMIDPOINT, INVERS); - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+2*FH, STR_MENUWHENDONE); - for (uint8_t i=0; i> 1; - } - if (i 50) { - g_eeGeneral.calib[i].mid = reusableBuffer.calib.midVals[i]; - int16_t v = reusableBuffer.calib.midVals[i] - reusableBuffer.calib.loVals[i]; - g_eeGeneral.calib[i].spanNeg = v - v/STICK_TOLERANCE; - v = reusableBuffer.calib.hiVals[i] - reusableBuffer.calib.midVals[i]; - g_eeGeneral.calib[i].spanPos = v - v/STICK_TOLERANCE; - } - } -#if defined(PCBTARANIS) - for (uint8_t i=POT1; i<=POT_LAST; i++) { - int idx = i - POT1; - int count = reusableBuffer.calib.xpotsCalib[idx].stepsCount; - if (IS_POT_MULTIPOS(i)) { - if (count > 1 && count <= XPOTS_MULTIPOS_COUNT) { - for (int j=0; jcount = count - 1; - for (int j=0; jcount; j++) { - calib->steps[j] = (reusableBuffer.calib.xpotsCalib[idx].steps[j+1] + reusableBuffer.calib.xpotsCalib[idx].steps[j]) >> 5; - } - } - } - } -#endif - break; - - case CALIB_STORE: -#if defined(RADIO_BOXER) - for (uint8_t i=POT1; i<=POT_LAST; i++) { - int idx = i - POT1; - if (IS_POT_MULTIPOS(i)) { - int count = reusableBuffer.calib.xpotsCalib[idx].stepsCount; - if (count < XPOTS_MULTIPOS_COUNT) - { - // load 6-pos calib with factory data if 6-pos was not manually calibrated - constexpr int16_t factoryValues[]= {0x5,0xd,0x16,0x1f,0x28}; - StepsCalibData * calib = (StepsCalibData *) &g_eeGeneral.calib[POT3]; - calib->count = 5; - for (int j=0; jcount ; j++) { - calib->steps[j] = factoryValues[j]; - } - } - } - } -#endif - g_eeGeneral.chkSum = evalChkSum(); - storageDirty(EE_GENERAL); - reusableBuffer.calib.state = CALIB_FINISHED; - break; - - default: - reusableBuffer.calib.state = CALIB_START; - break; - } - - doMainScreenGraphics(); -} +#include "gui/common/stdlcd/calibration.h" void menuRadioCalibration(event_t event) { diff --git a/radio/src/gui/128x64/radio_diaganas.cpp b/radio/src/gui/128x64/radio_diaganas.cpp index c93dd3458..506846ef7 100644 --- a/radio/src/gui/128x64/radio_diaganas.cpp +++ b/radio/src/gui/128x64/radio_diaganas.cpp @@ -20,18 +20,14 @@ */ #include "opentx.h" -#include "../../hal/adc_driver.h" - -#if defined(FLYSKY_GIMBAL) - #include "flysky_gimbal_driver.h" -#endif +#include "hal/adc_driver.h" #define HOLDANAVALUEFRAMES 4 /* 4* 50ms = 200 ms update rate */ void menuRadioDiagAnalogs(event_t event) { static int8_t entryCount = 0; - static int16_t lastShownAnalogValue[NUM_STICKS+NUM_POTS+NUM_SLIDERS]; + static uint16_t lastShownAnalogValue[MAX_ANALOG_INPUTS]; enum ANAVIEWS{ ANAVIEW_FIRST, @@ -50,12 +46,9 @@ void menuRadioDiagAnalogs(event_t event) #endif switch (event) { - case EVT_KEY_FIRST(KEY_UP): -#if defined(KEYS_GPIO_REG_PAGEDN) + case EVT_KEY_FIRST(KEY_RIGHT): case EVT_KEY_BREAK(KEY_PAGEDN): -#elif defined(NAVIGATION_X7) case EVT_KEY_BREAK(KEY_PAGE): -#endif { if (viewpage == ANAVIEW_LAST) viewpage = ANAVIEW_FIRST; @@ -65,12 +58,9 @@ void menuRadioDiagAnalogs(event_t event) break; } - case EVT_KEY_FIRST(KEY_DOWN): -#if defined(KEYS_GPIO_REG_PAGEUP) + case EVT_KEY_FIRST(KEY_LEFT): case EVT_KEY_BREAK(KEY_PAGEUP): -#elif defined(NAVIGATION_X7) case EVT_KEY_LONG(KEY_PAGE): -#endif { if (viewpage == ANAVIEW_FIRST) viewpage = ANAVIEW_LAST; @@ -94,10 +84,10 @@ void menuRadioDiagAnalogs(event_t event) coord_t y = MENU_HEADER_HEIGHT + 1; - lcdDrawTextAlignedLeft(y, STICKS_PWM_ENABLED() ? STR_PWM_STICKS_POTS_SLIDERS - : STR_STICKS_POTS_SLIDERS); + lcdDrawTextAlignedLeft(y, STR_STICKS_POTS_SLIDERS); - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) { + for (uint8_t i = 0; i < adcGetMaxInputs(ADC_INPUT_ALL); i++) { + // TODO: if available uint8_t x; if (i & 1) { x = LCD_W / 2 + INDENT_WIDTH; @@ -110,15 +100,7 @@ void menuRadioDiagAnalogs(event_t event) switch (viewpage) { case (ANAVIEW_RAWLOWFPS): if (entryCount == 0) { -#if !defined(SIMU) && defined(FLYSKY_GIMBAL) - if (globalData.flyskygimbals && i < FIRST_ANALOG_ADC_FS) - { - lastShownAnalogValue[i] = hall_raw_values[i]; - } else -#endif - { - lastShownAnalogValue[i] = getAnalogValue(i); // Update value - } + lastShownAnalogValue[i] = getAnalogValue(i); // Update value } lcdDrawNumber(x+3*FW-1, y, lastShownAnalogValue[i], LEADING0|LEFT, 4); @@ -129,7 +111,7 @@ void menuRadioDiagAnalogs(event_t event) break; } lcdDrawNumber(x+10*FW-1, y, - (int16_t)calibratedAnalogs[CONVERT_MODE(i)]*25/256, + (int16_t)calibratedAnalogs[i]*25/256, RIGHT); } diff --git a/radio/src/gui/128x64/radio_diagkeys.cpp b/radio/src/gui/128x64/radio_diagkeys.cpp index ff1b9a46e..9e8c324ed 100644 --- a/radio/src/gui/128x64/radio_diagkeys.cpp +++ b/radio/src/gui/128x64/radio_diagkeys.cpp @@ -20,18 +20,56 @@ */ #include "opentx.h" +#include "hal/rotary_encoder.h" +#include "hal/switch_driver.h" +#include "hal/key_driver.h" +#include "switches.h" void displayKeyState(uint8_t x, uint8_t y, uint8_t key) { - uint8_t t = keys[key].state(); + uint8_t t = keysGetState(key); lcdDrawChar(x, y, t+'0', t ? INVERS : 0); } -#if !defined(PCBTARANIS) -void displaySwitchState(uint8_t x, uint8_t y, uint8_t sw) +void displayTrimState(uint8_t x, uint8_t y, uint8_t trim) { - swsrc_t t = switchState(sw); - lcdDrawChar(x, y, (t ? '1' : '0'), t ? INVERS : 0); + uint8_t t = keysGetTrimState(trim); + lcdDrawChar(x, y, t+'0', t ? INVERS : 0); +} + +static EnumKeys get_ith_key(uint8_t i) +{ + auto supported_keys = keysGetSupported(); + for (uint8_t k = 0; k < MAX_KEYS; k++) { + if (supported_keys & (1 << k)) { + if (i-- == 0) return (EnumKeys)k; + } + } + + // should not get here, + // we assume: i < keysGetMaxKeys() + return (EnumKeys)0; +} + +#if defined(FUNCTION_SWITCHES) +void menuRadioDiagFS(event_t event) +{ + constexpr coord_t FS_1ST_COLUMN = 40; + constexpr coord_t FS_2ND_COLUMN = 70; + constexpr coord_t FS_3RD_COLUMN = 100; + SIMPLE_SUBMENU(STR_MENU_FSWITCH, 1); + lcdDrawText(FS_1ST_COLUMN, MENU_HEADER_HEIGHT + 1, "Phys"); + lcdDrawText(FS_2ND_COLUMN, MENU_HEADER_HEIGHT + 1, "Log"); + lcdDrawText(FS_3RD_COLUMN, MENU_HEADER_HEIGHT + 1, "Led"); + + for(uint8_t i=0; i < NUM_FUNCTIONS_SWITCHES; i++) { + coord_t y = 2*FH + i*FH; + lcdDrawText(INDENT_WIDTH, y, STR_CHAR_SWITCH, 0); + lcdDrawText(lcdNextPos, y, switchGetName(i+switchGetMaxSwitches()), 0); + lcdDrawNumber(FS_1ST_COLUMN + 2, y, getFSPhysicalState(i)); + lcdDrawNumber(FS_2ND_COLUMN + 5, y, getFSLogicalState(i)); + lcdDrawNumber(FS_3RD_COLUMN + 5, y, getFSLedState(i)); + } } #endif @@ -41,62 +79,50 @@ void menuRadioDiagKeys(event_t event) lcdDrawText(14*FW, MENU_HEADER_HEIGHT + 1, STR_VTRIM); - for (uint8_t i=0; i<10; i++) { + for (uint8_t i = 0; i < 10; i++) { coord_t y; - if (i < NUM_TRIMS_KEYS) { - y = MENU_HEADER_HEIGHT + 1 + FH + FH*(i/2); - if (i&1) lcdDraw1bitBitmap(14*FW, y, sticks, i/2, 0); - displayKeyState(i&1? 20*FW : 18*FW, y, TRM_BASE+i); + if (i < keysGetMaxTrims() * 2) { + y = MENU_HEADER_HEIGHT + 1 + FH + FH * (i / 2); + if (i & 1) lcdDraw1bitBitmap(14 * FW, y, sticks, i / 2, 0); + displayTrimState(i & 1 ? 20 * FW : 18 * FW, y, i); } - if (i <= KEY_MAX) { - if (i == 7) { // T8 8th key??? + if (i < keysGetMaxKeys()) { + auto k = get_ith_key(i); + if (i >= 7) { // max 7 lines on display y = MENU_HEADER_HEIGHT + 1 + FH * 6; - lcdDrawTextAtIndex(8, y, STR_VKEYS, i, 0); + lcdDrawText(8, y, keysGetLabel(k), 0); displayKeyState(lcdNextPos + 10, y, i); } else { y = MENU_HEADER_HEIGHT + 1 + FH * i; - lcdDrawTextAtIndex(0, y, STR_VKEYS, i, 0); + lcdDrawText(0, y, keysGetLabel(k), 0); displayKeyState(5 * FW + 2, y, i); } } -#if (NUM_SWITCHES > 6) - if (i < NUM_SWITCHES) { + if (i < switchGetMaxSwitches()) { if (SWITCH_EXISTS(i)) { - y = (i > 4) ? FH*(i-4)+1 : MENU_HEADER_HEIGHT + FH*i + 1; - getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i); - getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3)); - drawSwitch(i > 4 ? 11*FW-5: 8*FW-9, y, sw, 0, false); + y = (i > 4) ? FH * (i - 4) + 1 : MENU_HEADER_HEIGHT + FH * i + 1; + getvalue_t val = getValue(MIXSRC_FIRST_SWITCH + i); + getvalue_t sw = + ((val < 0) ? 3 * i + 1 : ((val == 0) ? 3 * i + 2 : 3 * i + 3)); + drawSwitch(i > 4 ? 11 * FW - 5 : 8 * FW - 9, y, sw, 0, false); } } -#else - if (i < NUM_SWITCHES) { - if (SWITCH_EXISTS(i)) { - y = (NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES > 6 ? 0 : MENU_HEADER_HEIGHT) + FH*i; - getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i); - getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3)); - drawSwitch(8*FW+4, y, sw, 0); - } - } -#endif } -#if defined(FUNCTION_SWITCHES) && defined(DEBUG) - lcdDrawText(LCD_W / 2 , LCD_H - 2 * FH, "Phys"); - lcdDrawText(LCD_W / 2 , LCD_H - 1 * FH, "Log"); - - for (uint8_t i = 0; i < NUM_FUNCTIONS_SWITCHES; i++) { - lcdDrawNumber(LCD_W / 2 + 20 + (i + 1) * FW , LCD_H - 2 * FH, getFSPhysicalState(i)); - lcdDrawNumber(LCD_W / 2 + 20 + (i + 1) * FW , LCD_H - 1 * FH, getFSLogicalState(i)); - } +#if defined(AUTOSWITCH) + lcdDrawText(13*FW+FWNUM, LCD_H - FH + 1,"Last"); + swsrc_t swtch = getMovedSwitch(); + if (swtch) + drawSwitch(17*FW+FWNUM+2, LCD_H - FH + 1, swtch, 0); #endif #if defined(ROTARY_ENCODER_NAVIGATION) coord_t y = LCD_H - FH + 1; lcdDrawText(8*FW-9, y, STR_ROTARY_ENCODER); - lcdDrawNumber(12*FW+FWNUM+2, y, rotencValue / ROTARY_ENCODER_GRANULARITY, RIGHT); + lcdDrawNumber(12*FW+FWNUM+2, y, rotaryEncoderGetValue(), RIGHT); #endif } diff --git a/radio/src/gui/128x64/radio_setup.cpp b/radio/src/gui/128x64/radio_setup.cpp index 9ddc46e02..a78632b2a 100644 --- a/radio/src/gui/128x64/radio_setup.cpp +++ b/radio/src/gui/128x64/radio_setup.cpp @@ -23,6 +23,8 @@ #include "opentx.h" #include "tasks/mixer_task.h" +#include "hal/adc_driver.h" +#include "input_mapping.h" const unsigned char sticks[] = { #include "sticks.lbm" @@ -48,6 +50,12 @@ const unsigned char sticks[] = { #define CASE_BATTGRAPH(x) #endif +#if !defined(SURFACE_RTADIO) +#define CASE_TX_MODE(x) x, +#else +#define CASE_TX_MODE(x) +#endif + enum { CASE_RTCLOCK(ITEM_RADIO_SETUP_DATE) CASE_RTCLOCK(ITEM_RADIO_SETUP_TIME) @@ -104,8 +112,10 @@ enum { CASE_JACK_DETECT(ITEM_RADIO_SETUP_JACK_MODE) ITEM_RADIO_SETUP_RX_CHANNEL_ORD, CASE_ROTARY_ENCODER(ITEM_RADIO_SETUP_ROTARY_ENC_MODE) +#if !defined(SURFACE_RADIO) ITEM_RADIO_SETUP_STICK_MODE_LABELS, ITEM_RADIO_SETUP_STICK_MODE, +#endif ITEM_VIEW_OPTIONS_LABEL, ITEM_VIEW_OPTIONS_RADIO_TAB, ITEM_VIEW_OPTIONS_GF, @@ -121,12 +131,6 @@ enum { ITEM_RADIO_SETUP_MAX }; -#if defined(FRSKY_STICKS) && !defined(PCBTARANIS) - #define COL_TX_MODE 0 -#else - #define COL_TX_MODE LABEL(TX_MODE) -#endif - uint8_t viewOptCheckBox(coord_t y, const char* title, uint8_t value, uint8_t attr, event_t event) { lcdDrawText(INDENT_WIDTH, y, title); @@ -139,9 +143,11 @@ void menuRadioSetup(event_t event) struct gtm t; gettime(&t); - if ((menuVerticalPosition==ITEM_RADIO_SETUP_DATE+HEADER_LINE || menuVerticalPosition==ITEM_RADIO_SETUP_TIME+HEADER_LINE) && - (s_editMode>0) && - (event==EVT_KEY_FIRST(KEY_ENTER) || event==EVT_KEY_FIRST(KEY_EXIT) || IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event))) { + if ((menuVerticalPosition == ITEM_RADIO_SETUP_DATE + HEADER_LINE || + menuVerticalPosition == ITEM_RADIO_SETUP_TIME + HEADER_LINE) && + (s_editMode > 0) && + (event == EVT_KEY_FIRST(KEY_ENTER) || event == EVT_KEY_LONG(KEY_ENTER) || + event == EVT_KEY_FIRST(KEY_EXIT))) { // set the date and time into RTC chip rtcSetTime(&t); } @@ -198,7 +204,9 @@ void menuRadioSetup(event_t event) 0, // USB mode CASE_JACK_DETECT(0) // Jack mode CASE_ROTARY_ENCODER(0) - 0, COL_TX_MODE, 0, + 0, + CASE_TX_MODE(LABEL(TX_MODE)) + CASE_TX_MODE(0) LABEL(ViewOptions), LABEL(RadioMenuTabs), 0, 0, LABEL(ModelMenuTabs), CASE_HELI(0) CASE_FLIGHT_MODES(0) 0, 0, 0, CASE_LUA_MODEL_SCRIPTS(0) 0, 1/*to force edit mode*/}); @@ -661,31 +669,47 @@ void menuRadioSetup(event_t event) case ITEM_RADIO_SETUP_RX_CHANNEL_ORD: lcdDrawTextAlignedLeft(y, STR_DEF_CHAN_ORD); // RAET->AETR - for (uint8_t i=1; i<=4; i++) { - putsChnLetter(RADIO_SETUP_2ND_COLUMN - FW + i*FW, y, channelOrder(i), attr); + { + for (uint8_t i = 0; i < adcGetMaxInputs(ADC_INPUT_MAIN); i++) { + putsChnLetter(RADIO_SETUP_2ND_COLUMN + i*FW, y, inputMappingChannelOrder(i), attr); + } + if (attr) { + auto max_order = inputMappingGetMaxChannelOrder() - 1; + CHECK_INCDEC_GENVAR(event, g_eeGeneral.templateSetup, 0, max_order); + } } - if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.templateSetup, 0, 23); break; +#if !defined(SURFACE_RADIO) case ITEM_RADIO_SETUP_STICK_MODE_LABELS: lcdDrawTextAlignedLeft(y, STR_MODE); for (uint8_t i=0; i<4; i++) { lcdDraw1bitBitmap(5*FW+i*(4*FW+2), y, sticks, i, 0); -#if defined(FRSKY_STICKS) && !defined(PCBTARANIS) - if (g_eeGeneral.stickReverse & (1< 0) { + CHECK_INCDEC_GENVAR(event, reusableBuffer.generalSettings.stickMode, 0, 3); + } else if (reusableBuffer.generalSettings.stickMode != + g_eeGeneral.stickMode) { + mixerTaskStop(); + g_eeGeneral.stickMode = reusableBuffer.generalSettings.stickMode; + checkThrottleStick(); + mixerTaskStart(); + waitKeysReleased(); + } + break; +#endif #if defined(ROTARY_ENCODER_NAVIGATION) case ITEM_RADIO_SETUP_ROTARY_ENC_MODE: lcdDrawTextAlignedLeft(y, STR_ROTARY_ENC_MODE); @@ -705,23 +729,6 @@ void menuRadioSetup(event_t event) break; #endif - case ITEM_RADIO_SETUP_STICK_MODE: - lcdDrawChar(2*FW, y, '1'+reusableBuffer.generalSettings.stickMode, attr); - for (uint8_t i=0; i0) { - CHECK_INCDEC_GENVAR(event, reusableBuffer.generalSettings.stickMode, 0, 3); - } - else if (reusableBuffer.generalSettings.stickMode != g_eeGeneral.stickMode) { - mixerTaskStop(); - g_eeGeneral.stickMode = reusableBuffer.generalSettings.stickMode; - checkThrottleStick(); - mixerTaskStart(); - waitKeysReleased(); - } - break; - case ITEM_VIEW_OPTIONS_LABEL: lcdDrawTextAlignedLeft(y, STR_ENABLED_FEATURES); break; diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index 48e8fddc7..6c3d78d6c 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -20,6 +20,11 @@ */ #include "opentx.h" +#include "hal/adc_driver.h" +#include "hal/switch_driver.h" + +#include "switches.h" +#include "input_mapping.h" #define BIGSIZE DBLSIZE #if defined (PCBTARANIS) @@ -76,38 +81,58 @@ void drawExternalAntennaAndRSSI() void drawPotsBars() { - // Optimization by Mike Blandford - for (uint8_t x = LCD_W / 2 - (NUM_POTS + NUM_SLIDERS - 1) * 5 / 2 - 1, i = NUM_STICKS; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; x += 5, i++) { + uint8_t max_pots = adcGetMaxInputs(ADC_INPUT_POT); + uint8_t offset = adcGetInputOffset(ADC_INPUT_POT); + uint8_t configured_pots = 0; + + for (uint8_t i = 0; i < max_pots; i++) { if (IS_POT_SLIDER_AVAILABLE(i)) { - uint8_t len = ((calibratedAnalogs[i] + RESX) * BAR_HEIGHT / (RESX * 2)) + 1l; // calculate once per loop - V_BAR(x, LCD_H - 8, len); + configured_pots ++; + } + } + + uint8_t lines = configured_pots > 3 ? 2 : 1; + uint8_t cols = configured_pots > 4 ? 3 : configured_pots % 2 ? 3 : 2; + coord_t xstart = LCD_W / 2 - (cols % 2 ? 5 : 3); + + for (uint8_t i = 0; i < max_pots; i++) { + if (IS_POT_SLIDER_AVAILABLE(i)) { + coord_t x = xstart + (i % cols) * 5; + coord_t y = i >= cols ? (LCD_H - 8 - BAR_HEIGHT / 2) : (LCD_H - 8); + auto v = calibratedAnalogs[offset + i] + RESX; + uint8_t len = (v * BAR_HEIGHT / (RESX * 2 * lines)) + 1l; + V_BAR(x, y, len); } } } void doMainScreenGraphics() { - int16_t calibStickVert = calibratedAnalogs[CONVERT_MODE(1)]; - if (g_model.throttleReversed && CONVERT_MODE(1) == THR_STICK) +#if defined(SURFACE_RADIO) + drawWheel(LBOX_CENTERX, calibratedAnalogs[ADC_MAIN_ST]); + drawThrottle(RBOX_CENTERX, calibratedAnalogs[ADC_MAIN_TH]); +#else + int16_t calibStickVert = calibratedAnalogs[ADC_MAIN_LV]; + if (g_model.throttleReversed && inputMappingConvertMode(ADC_MAIN_LV) == THR_STICK) calibStickVert = -calibStickVert; - drawStick(LBOX_CENTERX, calibratedAnalogs[CONVERT_MODE(0)], calibStickVert); + drawStick(LBOX_CENTERX, calibratedAnalogs[ADC_MAIN_LH], calibStickVert); - calibStickVert = calibratedAnalogs[CONVERT_MODE(2)]; - if (g_model.throttleReversed && CONVERT_MODE(2) == THR_STICK) + calibStickVert = calibratedAnalogs[ADC_MAIN_RV]; + if (g_model.throttleReversed && inputMappingConvertMode(ADC_MAIN_RV) == THR_STICK) calibStickVert = -calibStickVert; - drawStick(RBOX_CENTERX, calibratedAnalogs[CONVERT_MODE(3)], calibStickVert); -#if defined(HARDWARE_POT1) - drawPotsBars(); + drawStick(RBOX_CENTERX, calibratedAnalogs[ADC_MAIN_RH], calibStickVert); #endif + + drawPotsBars(); } void displayTrims(uint8_t phase) { - for (uint8_t i = 0; i < 4; i++) { - static coord_t x[4] = {TRIM_LH_X, TRIM_LV_X, TRIM_RV_X, TRIM_RH_X}; - static uint8_t vert[4] = {0, 1, 1, 0}; + for (uint8_t i = 0; i < keysGetMaxTrims(); i++) { + static coord_t x[] = {TRIM_LH_X, TRIM_LV_X, TRIM_RV_X, TRIM_RH_X, TRIM_LH_X, TRIM_LV_X, TRIM_RH_X, TRIM_RV_X}; + static uint8_t vert[] = {0, 1, 1, 0, 0, 1, 0, 1}; coord_t xm, ym; - uint8_t stickIndex = CONVERT_MODE(i); + uint8_t stickIndex = inputMappingConvertMode(i); xm = x[stickIndex]; uint8_t att = ROUND; int16_t val = getTrimValue(phase, i); @@ -132,51 +157,91 @@ void displayTrims(uint8_t phase) if (vert[i]) { ym = 31; - lcdDrawSolidVerticalLine(xm, ym - TRIM_LEN, TRIM_LEN * 2 + 1); - if (i != 2 || !g_model.thrTrim) { - lcdDrawSolidVerticalLine(xm - 1, ym - 1, 3); - lcdDrawSolidVerticalLine(xm + 1, ym - 1, 3); + if (i < 4) + lcdDrawSolidVerticalLine(xm, ym - TRIM_LEN, TRIM_LEN * 2 + 1); + if (keysGetMaxTrims() <= 4) { + if (i != 2 || !g_model.thrTrim) { + lcdDrawSolidVerticalLine(xm - 1, ym - 1, 3); + lcdDrawSolidVerticalLine(xm + 1, ym - 1, 3); + } + ym -= val; + lcdDrawFilledRect(xm - 3, ym - 3, 7, 7, SOLID, att | ERASE); + if (dir >= 0) { + lcdDrawSolidHorizontalLine(xm - 1, ym - 1, 3); + } + if (dir <= 0) { + lcdDrawSolidHorizontalLine(xm - 1, ym + 1, 3); + } + if (exttrim) { + lcdDrawSolidHorizontalLine(xm - 1, ym, 3); + } + if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) { + if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || + (trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) { + lcdDrawNumber(dir > 0 ? 12 : 40, xm - 2, -abs(dir), + TINSIZE | VERTICAL); + } + } + lcdDrawSquare(xm - 3, ym - 3, 7, att); } - ym -= val; - lcdDrawFilledRect(xm - 3, ym - 3, 7, 7, SOLID, att | ERASE); - if (dir >= 0) { - lcdDrawSolidHorizontalLine(xm - 1, ym - 1, 3); - } - if (dir <= 0) { - lcdDrawSolidHorizontalLine(xm - 1, ym + 1, 3); - } - if (exttrim) { - lcdDrawSolidHorizontalLine(xm - 1, ym, 3); - } - if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) { - if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) { - lcdDrawNumber(dir > 0 ? 12 : 40, xm - 2, -abs(dir), TINSIZE | VERTICAL); + else { + ym -= val; + if ((i > 4 && xm < LCD_W / 2) || (i < 4 && xm > LCD_W / 2) ) { + lcdDrawSolidVerticalLine(xm - 1, ym, 1); + lcdDrawSolidVerticalLine(xm - 2, ym - 1, 3); + lcdDrawSolidVerticalLine(xm - 3, ym - 2, 5); + } + else { + lcdDrawSolidVerticalLine(xm + 1, ym, 1); + lcdDrawSolidVerticalLine(xm + 2, ym - 1, 3); + lcdDrawSolidVerticalLine(xm + 3, ym - 2, 5); } } } else { ym = 60; - lcdDrawSolidHorizontalLine(xm - TRIM_LEN, ym, TRIM_LEN * 2 + 1); - lcdDrawSolidHorizontalLine(xm - 1, ym - 1, 3); - lcdDrawSolidHorizontalLine(xm - 1, ym + 1, 3); - xm += val; - lcdDrawFilledRect(xm - 3, ym - 3, 7, 7, SOLID, att | ERASE); - if (dir >= 0) { - lcdDrawSolidVerticalLine(xm + 1, ym - 1, 3); + if (i < 4) + lcdDrawSolidHorizontalLine(xm - TRIM_LEN, ym, TRIM_LEN * 2 + 1); + if (keysGetMaxTrims() <= 4) { + lcdDrawSolidHorizontalLine(xm - 1, ym - 1, 3); + lcdDrawSolidHorizontalLine(xm - 1, ym + 1, 3); + xm += val; + lcdDrawFilledRect(xm - 3, ym - 3, 7, 7, SOLID, att | ERASE); + if (dir >= 0) { + lcdDrawSolidVerticalLine(xm + 1, ym - 1, 3); + } + if (dir <= 0) { + lcdDrawSolidVerticalLine(xm - 1, ym - 1, 3); + } + if (exttrim) { + lcdDrawSolidVerticalLine(xm, ym - 1, 3); + } + if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) { + if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || + (trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) { + lcdDrawNumber( + (stickIndex == 0 ? (dir > 0 ? TRIM_LH_POS : TRIM_LH_NEG) + : (dir > 0 ? TRIM_RH_POS : TRIM_RH_NEG)), + ym - 2, -abs(dir), TINSIZE); + } + } + lcdDrawSquare(xm - 3, ym - 3, 7, att); } - if (dir <= 0) { - lcdDrawSolidVerticalLine(xm - 1, ym - 1, 3); - } - if (exttrim) { - lcdDrawSolidVerticalLine(xm, ym - 1, 3); - } - if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) { - if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) { - lcdDrawNumber((stickIndex == 0 ? (dir > 0 ? TRIM_LH_POS : TRIM_LH_NEG) : (dir > 0 ? TRIM_RH_POS : TRIM_RH_NEG)), ym - 2, -abs(dir), TINSIZE); + else { + xm += val; + if (i > 3) { + lcdDrawSolidHorizontalLine(xm, ym + 1, 1); + lcdDrawSolidHorizontalLine(xm - 1, ym + 2, 3); + lcdDrawSolidHorizontalLine(xm - 2, ym + 3, 5); + } + else { + lcdDrawSolidHorizontalLine(xm, ym - 1, 1); + lcdDrawSolidHorizontalLine(xm - 1, ym - 2, 3); + lcdDrawSolidHorizontalLine(xm - 2, ym - 3, 5); } } } - lcdDrawSquare(xm - 3, ym - 3, 7, att); + } } @@ -489,66 +554,48 @@ void menuMainView(event_t event) if (view == VIEW_INPUTS) { // Sticks + Pots doMainScreenGraphics(); - + // Switches -#if defined(PCBX9LITES) - static const uint8_t x[NUM_SWITCHES-2] = {2*FW-2, 2*FW-2, 17*FW+1, 2*FW-2, 17*FW+1}; - static const uint8_t y[NUM_SWITCHES-2] = {4*FH+1, 5*FH+1, 5*FH+1, 6*FH+1, 6*FH+1}; - for (int i=0; i 2 columns: one for each side + // -> 4 slots on each side (3 normal / 1 small) + uint8_t switches = switchGetMaxSwitches(); + uint8_t configured_switches = 0; + + for (uint8_t i = 0; i < switches; i++) { if (SWITCH_EXISTS(i)) { - getvalue_t val = getValue(MIXSRC_FIRST_SWITCH + i); - getvalue_t sw = ((val < 0) ? 3 * i + 1 : ((val == 0) ? 3 * i + 2 : 3 * i + 3)); - drawSwitch(x[i], y[i], sw, 0, false); + configured_switches ++; } } - drawSmallSwitch(29, 5*FH+1, 4, SW_SF); - drawSmallSwitch(16*FW+1, 5*FH+1, 4, SW_SG); -#elif defined(PCBX9LITE) - static const uint8_t x[NUM_SWITCHES] = {2 * FW - 2, 2 * FW - 2, 16 * FW + 1, 2 * FW - 2, 16 * FW + 1}; - static const uint8_t y[NUM_SWITCHES] = {4 * FH + 1, 5 * FH + 1, 5 * FH + 1, 6 * FH + 1, 6 * FH + 1}; - for (int i = 0; i < NUM_SWITCHES; ++i) { - if (SWITCH_EXISTS(i)) { - getvalue_t val = getValue(MIXSRC_FIRST_SWITCH + i); - getvalue_t sw = ((val < 0) ? 3 * i + 1 : ((val == 0) ? 3 * i + 2 : 3 * i + 3)); - drawSwitch(x[i], y[i], sw, 0, false); - } - } -#elif defined(PCBXLITES) - static const uint8_t x[NUM_SWITCHES] = {2*FW-2, 16*FW+1, 2*FW-2, 16*FW+1, 2*FW-2, 16*FW+1}; - static const uint8_t y[NUM_SWITCHES] = {4*FH+1, 4*FH+1, 6*FH+1, 6*FH+1, 5*FH+1, 5*FH+1}; - for (int i=0; i= switches / 2) { - x = 16 * FW + 1; - y -= (switches / 2) * FH; + + if (configured_switches < 9) { + for (int i = 0; i < switches; ++i) { + if (SWITCH_EXISTS(i)) { + auto switch_display = switchGetDisplayPosition(i); + if (switch_display.row >= 3) { + drawSmallSwitch(switch_display.col == 0 ? 28 : 16 * FW + 1, + 5 * FH + 1, 4, i); + } + else { + coord_t x = switch_display.col == 0 ? 2 * FW - 2 : 16 * FW + 7; + coord_t y = 33 + switch_display.row * FH; + getvalue_t val = getValue(MIXSRC_FIRST_SWITCH + i); + getvalue_t sw = + ((val < 0) ? 3 * i + 1 + : ((val == 0) ? 3 * i + 2 : 3 * i + 3)); + drawSwitch(x, y, sw, 0, false); + } } - getvalue_t val = getValue(MIXSRC_FIRST_SWITCH + i); - getvalue_t sw = ((val < 0) ? 3 * i + 1 : ((val == 0) ? 3 * i + 2 : 3 * i + 3)); - drawSwitch(x, y, sw, 0, false); } } -#else - // The ID0 3-POS switch is merged with the TRN switch - for (uint8_t i = SWSRC_THR; i <= SWSRC_TRN; i++) { - int8_t sw = (i == SWSRC_TRN ? (switchState(SW_ID0) ? SWSRC_ID0 : (switchState(SW_ID1) ? SWSRC_ID1 : SWSRC_ID2)) : i); - uint8_t x = 2 * FW - 2, y = i * FH + 1; - if (i >= SWSRC_AIL) { - x = 17 * FW - 1; - y -= 3 * FH; + else { + for (int i = 0; i < switches; ++i) { + if (SWITCH_EXISTS(i)) { + auto switch_display = switchGetDisplayPosition(i); + coord_t x = (switch_display.col == 0 ? 8 : 96) + switch_display.row * 5; + drawSmallSwitch(x, 5 * FH + 1, 4, i); + } } - drawSwitch(x, y, sw, getSwitch(i) ? INVERS : 0, false); } -#endif } else { // Logical Switches @@ -556,7 +603,7 @@ void menuMainView(event_t event) uint8_t y = LCD_H - 20; for (uint8_t line = 0; line < 2; line++) { for (uint8_t column = 0; column < MAX_LOGICAL_SWITCHES / 2; column++) { - int8_t len = getSwitch(SWSRC_SW1 + index) ? 10 : 1; + int8_t len = getSwitch(SWSRC_FIRST_LOGICAL_SWITCH + index) ? 10 : 1; uint8_t x = (16 + 3 * column); lcdDrawSolidVerticalLine(x - 1, y - len, len); lcdDrawSolidVerticalLine(x, y - len, len); diff --git a/radio/src/gui/128x64/view_statistics.cpp b/radio/src/gui/128x64/view_statistics.cpp index 77eb7de2b..d3951f93f 100644 --- a/radio/src/gui/128x64/view_statistics.cpp +++ b/radio/src/gui/128x64/view_statistics.cpp @@ -22,6 +22,8 @@ #include "opentx.h" #include "tasks.h" +#include "hal/adc_driver.h" + #if defined(BLUETOOTH) #include "bluetooth_driver.h" #endif @@ -60,9 +62,6 @@ void menuStatisticsView(event_t event) #endif break; -#if !defined(PCBTARANIS) - case EVT_KEY_LONG(KEY_MENU): // historical -#endif case EVT_KEY_LONG(KEY_ENTER): g_eeGeneral.globalTimer = 0; storageDirty(EE_GENERAL); diff --git a/radio/src/gui/128x64/widgets.cpp b/radio/src/gui/128x64/widgets.cpp index b90ed94d2..459678eb6 100644 --- a/radio/src/gui/128x64/widgets.cpp +++ b/radio/src/gui/128x64/widgets.cpp @@ -21,6 +21,34 @@ #include "opentx.h" +// For surface radio +void drawWheel(coord_t centrex, int16_t tval) +{ + constexpr coord_t BOX_CENTERY = (LCD_H - 9 - BOX_WIDTH / 2); + constexpr coord_t MARKER_WIDTH = 5; + lcdDrawSquare(centrex-BOX_WIDTH/2, BOX_CENTERY-BOX_WIDTH/2, BOX_WIDTH); + lcdDrawSolidHorizontalLine(centrex - MARKER_WIDTH /2 , BOX_CENTERY, MARKER_WIDTH); + coord_t x1 = centrex - MARKER_WIDTH - tval / 300; + coord_t x2 = centrex - MARKER_WIDTH + tval / 300; + lcdDrawLine( x1, BOX_CENTERY+BOX_WIDTH / MARKER_WIDTH, x2, BOX_CENTERY-BOX_WIDTH / MARKER_WIDTH, SOLID, FORCE); + lcdDrawLine( x1 + BOX_WIDTH/2, BOX_CENTERY+BOX_WIDTH / MARKER_WIDTH, + x2 + BOX_WIDTH / 2, BOX_CENTERY-BOX_WIDTH / MARKER_WIDTH, SOLID, FORCE); +#undef BOX_CENTERY +#undef MARKER_WIDTH +} + +// For surface radio +void drawThrottle(coord_t centrex, int16_t wval) +{ + constexpr coord_t BOX_CENTERY = (LCD_H - 9 - BOX_WIDTH / 2); + constexpr coord_t MARKER_WIDTH = 5; + lcdDrawSquare(centrex-BOX_WIDTH/2, BOX_CENTERY-BOX_WIDTH/2, BOX_WIDTH); + lcdDrawSolidHorizontalLine(centrex - MARKER_WIDTH, BOX_CENTERY, 2 * MARKER_WIDTH + 1); + coord_t tsize = wval / 150; + lcdDrawLine( centrex - tsize, BOX_CENTERY, centrex, BOX_CENTERY + tsize, SOLID, FORCE); + lcdDrawLine( centrex + tsize, BOX_CENTERY, centrex, BOX_CENTERY + tsize, SOLID, FORCE); +} + void drawStick(coord_t centrex, int16_t xval, int16_t yval) { #define BOX_CENTERY (LCD_H-9-BOX_WIDTH/2) diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index c8bbe2524..0bee01de8 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -26,6 +26,8 @@ #include "lcd.h" #include "menus.h" #include "popups.h" + +#include "navigation/navigation.h" #include "common/stdlcd/draw_functions.h" #define HEADER_LINE 0 @@ -76,153 +78,45 @@ void showAlertBox(const char * title, const char * text, const char * action, ui void doMainScreenGraphics(); -extern int8_t checkIncDec_Ret; // global helper vars - -#define EDIT_SELECT_FIELD 0 -#define EDIT_MODIFY_FIELD 1 -#define EDIT_MODIFY_STRING 2 -extern int8_t s_editMode; // global editmode - -// checkIncDec flags -// we leave room for EE_MODEL and EE_GENERAL -#define NO_INCDEC_MARKS 0x04 -#define INCDEC_SWITCH 0x08 -#define INCDEC_SOURCE 0x10 -#define INCDEC_REP10 0x40 -#define NO_DBLKEYS 0x80 - -#define INCDEC_DECLARE_VARS(f) uint8_t incdecFlag = (f); IsValueAvailable isValueAvailable = nullptr -#define INCDEC_SET_FLAG(f) incdecFlag = (f) -#define INCDEC_ENABLE_CHECK(fn) isValueAvailable = fn -#define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, incdecFlag, isValueAvailable) - -struct CheckIncDecStops -{ - const int count; - const int stops[]; - int min() const - { - return stops[0]; - } - int max() const - { - return stops[count-1]; - } - bool contains(int value) const - { - for (int i=0; i= MIXSRC_FIRST_SWITCH && idx <= MIXSRC_LAST_SWITCH) { - idx = idx - MIXSRC_FIRST_SWITCH; - if (g_eeGeneral.switchNames[idx][0]) { - lcdDrawSizedText(x, y, STR_CHAR_SWITCH, 2, att); - lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.switchNames[idx], LEN_SWITCH_NAME, att); - } - else { - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1, att); - } + lcdDrawText(x, y, getSourceString(idx), att); } - else if (idx < MIXSRC_SW1) - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1, att); - else if (idx <= MIXSRC_LAST_LOGICAL_SWITCH) - drawSwitch(x, y, SWSRC_SW1+idx-MIXSRC_SW1, att); - else if (idx < MIXSRC_CH1) - drawStringWithIndex(x, y, STR_PPM_TRAINER, idx-MIXSRC_FIRST_TRAINER+1, att); - else if (idx <= MIXSRC_LAST_CH) { - drawStringWithIndex(x, y, STR_CH, idx-MIXSRC_CH1+1, att); - if (ZEXIST(g_model.limitData[idx-MIXSRC_CH1].name) && (att & STREXPANDED)) { + else if (idx <= MIXSRC_LAST_LOGICAL_SWITCH) { + idx -= MIXSRC_FIRST_LOGICAL_SWITCH; + drawSwitch(x, y, idx + SWSRC_FIRST_LOGICAL_SWITCH, att); + } else if (idx <= MIXSRC_LAST_TRAINER) { + idx -= MIXSRC_FIRST_TRAINER; + drawStringWithIndex(x, y, STR_PPM_TRAINER, idx + 1, att); + } else if (idx <= MIXSRC_LAST_CH) { + idx -= MIXSRC_FIRST_CH; + drawStringWithIndex(x, y, STR_CH, idx + 1, att); + if (ZEXIST(g_model.limitData[idx].name) && (att & STREXPANDED)) { lcdDrawChar(lcdLastRightPos, y, ' ', att|SMLSIZE); - lcdDrawSizedText(lcdLastRightPos+3, y, g_model.limitData[idx-MIXSRC_CH1].name, LEN_CHANNEL_NAME, att|SMLSIZE); + lcdDrawSizedText(lcdLastRightPos+3, y, g_model.limitData[idx].name, LEN_CHANNEL_NAME, att|SMLSIZE); } } else if (idx <= MIXSRC_LAST_GVAR) { - drawStringWithIndex(x, y, STR_GV, idx-MIXSRC_GVAR1+1, att); + idx -= MIXSRC_FIRST_GVAR - 1; + drawStringWithIndex(x, y, STR_GV, idx, att); } else if (idx < MIXSRC_FIRST_TIMER) { - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1-MAX_LOGICAL_SWITCHES-MAX_TRAINER_CHANNELS-MAX_OUTPUT_CHANNELS-MAX_GVARS, att); + // Built-in sources: TX Voltage, Time, GPS (+ reserved) + const char* src_str; + switch(idx) { + case MIXSRC_TX_VOLTAGE: + src_str = STR_SRC_BATT; + break; + case MIXSRC_TX_TIME: + src_str = STR_SRC_TIME; + break; + case MIXSRC_TX_GPS: + src_str = STR_SRC_BATT; + break; + default: + src_str = ""; + break; + } + lcdDrawText(x, y, src_str, att); } else if (idx <= MIXSRC_LAST_TIMER) { - if(ZEXIST(g_model.timers[idx-MIXSRC_FIRST_TIMER].name)) { - lcdDrawSizedText(x, y, g_model.timers[idx-MIXSRC_FIRST_TIMER].name, LEN_TIMER_NAME, att); + idx -= MIXSRC_FIRST_TIMER; + if(g_model.timers[idx].name[0]) { + lcdDrawSizedText(x, y, g_model.timers[idx].name, LEN_TIMER_NAME, att); } else { - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1-MAX_LOGICAL_SWITCHES-MAX_TRAINER_CHANNELS-MAX_OUTPUT_CHANNELS-MAX_GVARS, att); + drawStringWithIndex(x, y, STR_SRC_TIMER, idx, att); } } else { @@ -714,7 +715,7 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att) void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags att) { - lcdDrawTextAtIndex(x, y, STR_RETA123, idx-1, att); + lcdDrawText(x, y, getAnalogShortLabel(idx), att); } void drawModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att) diff --git a/radio/src/gui/212x64/lcd.h b/radio/src/gui/212x64/lcd.h index c3b20aba7..99b55dd3a 100644 --- a/radio/src/gui/212x64/lcd.h +++ b/radio/src/gui/212x64/lcd.h @@ -123,12 +123,12 @@ void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode=0); void drawModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att); void drawSwitch(coord_t x, coord_t y, int32_t swtch, LcdFlags att=0, bool autoBold = true); -void drawStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att=0); +void drawMainControlLabel(coord_t x, coord_t y, uint8_t idx, LcdFlags att=0); void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att=0); void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att=0); -#define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_CH1+idx-1, att) +#define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_FIRST_CH+idx-1, att) void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags attr); void putsVolts(coord_t x, coord_t y, uint16_t volts, LcdFlags att); diff --git a/radio/src/gui/212x64/model_curve_edit.cpp b/radio/src/gui/212x64/model_curve_edit.cpp index 22e324be2..c9e257fb3 100644 --- a/radio/src/gui/212x64/model_curve_edit.cpp +++ b/radio/src/gui/212x64/model_curve_edit.cpp @@ -20,6 +20,7 @@ */ #include "opentx.h" +#include "hal/rotary_encoder.h" void runPopupCurvePreset(event_t event) { @@ -128,9 +129,7 @@ void menuModelCurveOne(event_t event) lcdDrawNumber(INDENT_WIDTH, 6*FH+1, 5+crv.points, LEFT|attr); lcdDrawText(lcdLastRightPos, 6*FH+1, STR_PTS, attr); if (attr) { -#if defined(ROTARY_ENCODER_NAVIGATION) - rotencSpeed = ROTENC_LOWSPEED; -#endif + rotaryEncoderResetAccel(); int8_t count = checkIncDecModel(event, crv.points, -3, 12); // 2pts - 17pts if (checkIncDec_Ret) { int8_t newPoints[MAX_POINTS_PER_CURVE]; diff --git a/radio/src/gui/212x64/model_display.cpp b/radio/src/gui/212x64/model_display.cpp index 6fecfbc59..d9115e29c 100644 --- a/radio/src/gui/212x64/model_display.cpp +++ b/radio/src/gui/212x64/model_display.cpp @@ -265,7 +265,7 @@ void menuModelDisplay(event_t event) } } if (attr && menuHorizontalPosition == NUM_LINE_ITEMS) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } } break; diff --git a/radio/src/gui/212x64/model_input_edit.cpp b/radio/src/gui/212x64/model_input_edit.cpp index 65c92c486..fbaff3091 100644 --- a/radio/src/gui/212x64/model_input_edit.cpp +++ b/radio/src/gui/212x64/model_input_edit.cpp @@ -150,11 +150,20 @@ void menuModelExpoOne(event_t event) break; case EXPO_FIELD_TRIM: - uint8_t not_stick = (ed->srcRaw > MIXSRC_Ail); - int8_t trimSource = -ed->trimSource; lcdDrawTextAlignedLeft(y, STR_TRIM); - lcdDrawTextAtIndex(EXPO_ONE_2ND_COLUMN, y, STR_VMIXTRIMS, (not_stick && trimSource == 0) ? 0 : trimSource + 1, menuHorizontalPosition==0 ? attr : 0); - if (attr) ed->trimSource = -checkIncDecModel(event, trimSource, not_stick ? TRIM_ON : -TRIM_OFF, -TRIM_LAST); + { + const char* trim_str = getTrimSourceLabel(ed->srcRaw, ed->trimSource); + LcdFlags flags = RIGHT | (menuHorizontalPosition==0 ? attr : 0); + lcdDrawText(EXPO_ONE_2ND_COLUMN, y, trim_str, flags); + + if (attr) { + int8_t min = TRIM_ON; + if (ed->srcRaw >= MIXSRC_FIRST_STICK && ed->srcRaw <= MIXSRC_LAST_STICK) { + min = -TRIM_OFF; + } + ed->trimSource = -checkIncDecModel(event, -ed->trimSource, min, keysGetMaxTrims()); + } + } break; } y += FH; diff --git a/radio/src/gui/212x64/model_logical_switches.cpp b/radio/src/gui/212x64/model_logical_switches.cpp index 7f17e7fbe..21cceeed5 100644 --- a/radio/src/gui/212x64/model_logical_switches.cpp +++ b/radio/src/gui/212x64/model_logical_switches.cpp @@ -109,7 +109,7 @@ void menuModelLogicalSwitches(event_t event) LogicalSwitchData * cs = lswAddress(k); // CSW name - unsigned int sw = SWSRC_SW1+k; + unsigned int sw = SWSRC_FIRST_LOGICAL_SWITCH+k; drawSwitch(0, y, sw, (getSwitch(sw) ? BOLD : 0) | ((sub==k && CURSOR_ON_LINE()) ? INVERS : 0)); // CSW func @@ -189,7 +189,7 @@ void menuModelLogicalSwitches(event_t event) if (cstate == LS_FAMILY_EDGE) { lcdDrawText(CSW_6TH_COLUMN, y, STR_NA); if (attr && horz == LS_FIELD_DELAY) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } } else if (cs->delay > 0) { @@ -200,7 +200,7 @@ void menuModelLogicalSwitches(event_t event) } if (attr && horz == LS_FIELD_V3 && cstate != LS_FAMILY_EDGE) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } if (s_editMode>0 && attr) { diff --git a/radio/src/gui/212x64/model_select.cpp b/radio/src/gui/212x64/model_select.cpp index f776972ff..fe24899c8 100644 --- a/radio/src/gui/212x64/model_select.cpp +++ b/radio/src/gui/212x64/model_select.cpp @@ -79,6 +79,27 @@ void onModelSelectMenu(const char * result) } } +static void moveToFreeModelSlot(bool forward, int8_t& sub, int8_t oldSub) +{ + int8_t next_ofs = s_copyTgtOfs + oldSub - menuVerticalPosition; + if (next_ofs == MAX_MODELS || next_ofs == -MAX_MODELS) next_ofs = 0; + + if (s_copySrcRow < 0 && s_copyMode == COPY_MODE) { + s_copySrcRow = oldSub; + // find a hole (in the first empty slot above / below) + sub = findEmptyModel(s_copySrcRow, forward); + if (sub < 0) { + // no free room for duplicating the model + AUDIO_ERROR(); + sub = oldSub; + s_copyMode = 0; + } + next_ofs = 0; + menuVerticalPosition = sub; + } + s_copyTgtOfs = next_ofs; +} + void menuModelSelect(event_t event) { if (warningResult) { @@ -89,10 +110,13 @@ void menuModelSelect(event_t event) event = EVT_ENTRY_UP; } - event_t _event_ = ((event==EVT_KEY_BREAK(KEY_ENTER) || event==EVT_KEY_LONG(KEY_ENTER)) ? 0 : event); - - if ((s_copyMode && EVT_KEY_MASK(event) == KEY_EXIT) || event == EVT_KEY_BREAK(KEY_EXIT)) { - _event_ -= KEY_EXIT; + // Suppress "edit mode": model select has none + // Suppress exit in "copy mode": handled in this function + event_t _event_ = event; + if ((s_copyMode && IS_KEY_EVT(event, KEY_EXIT)) || + event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER) || + event == EVT_KEY_LONG(KEY_ENTER)) { + _event_ = 0; } int8_t oldSub = menuVerticalPosition; @@ -101,7 +125,7 @@ void menuModelSelect(event_t event) if (s_editMode > 0) s_editMode = 0; - int sub = menuVerticalPosition; + int8_t sub = menuVerticalPosition; switch (event) { case EVT_ENTRY: @@ -208,39 +232,19 @@ void menuModelSelect(event_t event) case EVT_KEY_BREAK(KEY_PAGE): case EVT_KEY_LONG(KEY_PAGE): - chainMenu(event == EVT_KEY_BREAK(KEY_PAGE) ? menuModelSetup : menuTabModel[DIM(menuTabModel)-1].menuFunc); + chainMenu(event == EVT_KEY_BREAK(KEY_PAGE) + ? menuModelSetup + : menuTabModel[DIM(menuTabModel) - 1].menuFunc); killEvents(event); break; + } - case EVT_KEY_FIRST(KEY_UP): - case EVT_KEY_REPT(KEY_UP): - case EVT_KEY_FIRST(KEY_DOWN): - case EVT_KEY_REPT(KEY_DOWN): -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_LEFT: - case EVT_ROTARY_RIGHT: -#endif - if (s_copyMode) { - int8_t next_ofs = s_copyTgtOfs + oldSub - menuVerticalPosition; - if (next_ofs == MAX_MODELS || next_ofs == -MAX_MODELS) - next_ofs = 0; - - if (s_copySrcRow < 0 && s_copyMode==COPY_MODE) { - s_copySrcRow = oldSub; - // find a hole (in the first empty slot above / below) - sub = findEmptyModel(s_copySrcRow, event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)); - if (sub < 0) { - // no free room for duplicating the model - AUDIO_ERROR(); - sub = oldSub; - s_copyMode = 0; - } - next_ofs = 0; - menuVerticalPosition = sub; - } - s_copyTgtOfs = next_ofs; - } - break; + if (s_copyMode) { + if (IS_PREVIOUS_EVENT(event)) { + moveToFreeModelSlot(false, sub, oldSub); + } else if (IS_NEXT_EVENT(event)) { + moveToFreeModelSlot(true, sub, oldSub); + } } #if defined(EEPROM) diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 0e120d05f..a28c8d5aa 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -19,8 +19,13 @@ * GNU General Public License for more details. */ +#include "hal/adc_driver.h" +#include "hal/adc_driver.h" +#include "hal/switch_driver.h" + #include "opentx.h" #include "mixer_scheduler.h" +#include "switches.h" #if defined(USBJ_EX) #include "usb_joystick.h" @@ -35,7 +40,7 @@ uint8_t g_moduleIdx; uint8_t getSwitchWarningsCount() { uint8_t count = 0; - for (int i=0; i 8 ? TITLE_ROW : HIDDEN_ROW)), \ PREFLIGHT_ROW(uint8_t(getSwitchWarningsCount() > 16 ? TITLE_ROW : HIDDEN_ROW)) #define POT_WARN_ROWS \ - PREFLIGHT_ROW(uint8_t(g_model.potsWarnMode ? NAVIGATION_LINE_BY_LINE|(NUM_POTS+NUM_SLIDERS) : 0)), \ + PREFLIGHT_ROW(uint8_t(g_model.potsWarnMode ? NAVIGATION_LINE_BY_LINE|(MAX_POTS) : 0)), \ PREFLIGHT_ROW(uint8_t(g_model.potsWarnMode ? TITLE_ROW : HIDDEN_ROW)) #define TOPLCD_ROWS 0, #else #define SW_WARN_ROWS \ PREFLIGHT_ROW(uint8_t(NAVIGATION_LINE_BY_LINE|getSwitchWarningsCount())) #define POT_WARN_ROWS \ - PREFLIGHT_ROW(uint8_t(g_model.potsWarnMode ? NAVIGATION_LINE_BY_LINE|(NUM_POTS+NUM_SLIDERS) : 0)) + PREFLIGHT_ROW(uint8_t(g_model.potsWarnMode ? NAVIGATION_LINE_BY_LINE|(MAX_POTS) : 0)) #define TOPLCD_ROWS #endif @@ -537,7 +543,7 @@ void menuModelSetup(event_t event) SW_WARN_ROWS, // Switch warning POT_WARN_ROWS, // Pot warning - NAVIGATION_LINE_BY_LINE | (NUM_STICKS+NUM_POTS+NUM_SLIDERS-1), // Center beeps + uint8_t(NAVIGATION_LINE_BY_LINE | (adcGetInputOffset(ADC_INPUT_POT + 1) - 1)), // Center beeps 0, // ADC Jitter filter @@ -796,7 +802,7 @@ void menuModelSetup(event_t event) if (attr) CHECK_INCDEC_MODELVAR_ZERO_CHECK( event, g_model.thrTraceSrc, - NUM_POTS + NUM_SLIDERS + MAX_OUTPUT_CHANNELS, + MAX_POTS + MAX_OUTPUT_CHANNELS, isThrottleSourceAvailable); uint8_t idx = throttleSource2Source(g_model.thrTraceSrc); @@ -811,7 +817,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_THROTTLE_TRIM_SWITCH: lcdDrawTextAlignedLeft(y, STR_TTRIM_SW); if (attr) - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.thrTrimSw, NUM_TRIMS - 1); + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.thrTrimSw, MAX_TRIMS - 1); drawSource(MODEL_SETUP_2ND_COLUMN, y, g_model.getThrottleStickTrimSource(), attr); break; @@ -846,7 +852,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_SWITCHES_WARNING3: case ITEM_MODEL_SETUP_POTS_WARNING2: if (i==0) { - if (CURSOR_MOVED_LEFT(event)) + if (IS_PREVIOUS_EVENT(event)) menuVerticalOffset--; else menuVerticalOffset++; @@ -858,7 +864,7 @@ void menuModelSetup(event_t event) { #if defined(PCBX9E) if (i>=NUM_BODY_LINES-2 && getSwitchWarningsCount() > 8*(NUM_BODY_LINES-i)) { - if (CURSOR_MOVED_LEFT(event)) + if (IS_PREVIOUS_EVENT(event)) menuVerticalOffset--; else menuVerticalOffset++; @@ -881,7 +887,7 @@ void menuModelSetup(event_t event) getMovedSwitch(); // Mask switches enabled for warnings swarnstate_t sw_mask = 0; - for(uint8_t i=0; i 5 && i == 3) { y += FH; x = MODEL_SETUP_2ND_COLUMN; } -#endif LcdFlags flags = ((menuHorizontalPosition==i+1) && attr) ? BLINK : 0; - if ((!attr || menuHorizontalPosition >= 0) && (g_model.potsWarnEnabled & (1 << i))) { + if ((!attr || menuHorizontalPosition >= 0) && + (g_model.potsWarnEnabled & (1 << i))) { flags |= INVERS; } - // skip "---" (+1) and source symbol (+2) - const char* source = STR_VSRCRAW[NUM_STICKS + 1 + i] + 2; - lcdDrawSizedText(x, y, source, UINT8_MAX, flags); + lcdDrawText(x, y, getPotLabel(i), flags); x = lcdNextPos+3; } } @@ -1003,17 +1009,22 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_SETUP_BEEP_CENTER: - { + case ITEM_MODEL_SETUP_BEEP_CENTER: { lcdDrawTextAlignedLeft(y, STR_BEEPCTR); - coord_t x = MODEL_SETUP_2ND_COLUMN; - for (int i=0; i=POT1 && i= pot_offset && IS_POT_MULTIPOS(i - pot_offset) ) { + if (attr && menuHorizontalPosition == i) repeatLastCursorMove(event); continue; } - lcdDrawTextAtIndex(x, y, STR_RETA123, i, ((menuHorizontalPosition==i) && attr) ? BLINK|INVERS : (((g_model.beepANACenter & ((BeepANACenter)1< 0) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } } break; @@ -219,14 +219,14 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF else #endif if (func == FUNC_TRAINER) { - maxParam = NUM_STICKS + 1; + maxParam = MAX_STICKS + 1; uint8_t param = CFN_CH_INDEX(cfn); if (param == 0) lcdDrawText(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, STR_STICKS, attr); - else if (param == NUM_STICKS + 1) + else if (param == MAX_STICKS + 1) lcdDrawText(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, STR_CHANS, attr); else - drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, MIXSRC_Rud + param - 1, attr); + drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, MIXSRC_FIRST_STICK + param - 1, attr); } #if defined(GVARS) else if (func == FUNC_ADJUST_GVAR) { @@ -243,7 +243,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF break; } else if (attr) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } if (active) CHECK_INCDEC_MODELVAR_ZERO(event, CFN_CH_INDEX(cfn), maxParam); break; @@ -388,7 +388,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF } #endif else if (attr) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } if (active || event==EVT_KEY_LONG(KEY_ENTER)) { @@ -436,7 +436,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF } } else if (attr) { - REPEAT_LAST_CURSOR_MOVE(); + repeatLastCursorMove(event); } break; } diff --git a/radio/src/gui/212x64/radio_calibration.cpp b/radio/src/gui/212x64/radio_calibration.cpp index a62075ebe..33fb1241f 100644 --- a/radio/src/gui/212x64/radio_calibration.cpp +++ b/radio/src/gui/212x64/radio_calibration.cpp @@ -21,6 +21,7 @@ #include "opentx.h" #include "hal/adc_driver.h" +#include "gui/common/stdlcd/calibration.h" #define XPOT_DELTA 10 #define XPOT_DELAY 10 /* cycles */ @@ -30,168 +31,28 @@ void drawPotsBars() { // Optimization by Mike Blandford - for (uint8_t x=LCD_W/2-(NUM_POTS+NUM_SLIDERS)/2*BAR_SPACING+BAR_SPACING/2, i=NUM_STICKS; i= POT1 && i <= POT_LAST) { - if (IS_POT_WITHOUT_DETENT(i)) { - reusableBuffer.calib.midVals[i] = (reusableBuffer.calib.hiVals[i] + reusableBuffer.calib.loVals[i]) / 2; - } - uint8_t idx = i - POT1; - int count = reusableBuffer.calib.xpotsCalib[idx].stepsCount; - if (IS_POT_MULTIPOS(i) && count <= XPOTS_MULTIPOS_COUNT) { - // use raw analog value for multipos calibraton, anaIn() already has multipos decoded value - vt = getAnalogValue(i) >> 1; - if (reusableBuffer.calib.xpotsCalib[idx].lastCount == 0 || vt < reusableBuffer.calib.xpotsCalib[idx].lastPosition - XPOT_DELTA || vt > reusableBuffer.calib.xpotsCalib[idx].lastPosition + XPOT_DELTA) { - reusableBuffer.calib.xpotsCalib[idx].lastPosition = vt; - reusableBuffer.calib.xpotsCalib[idx].lastCount = 1; - } - else { - if (reusableBuffer.calib.xpotsCalib[idx].lastCount < 255) reusableBuffer.calib.xpotsCalib[idx].lastCount++; - } - if (reusableBuffer.calib.xpotsCalib[idx].lastCount == XPOT_DELAY) { - int16_t position = reusableBuffer.calib.xpotsCalib[idx].lastPosition; - bool found = false; - for (int j=0; j= step-XPOT_DELTA && position <= step+XPOT_DELTA) { - found = true; - break; - } - } - if (!found) { - if (count < XPOTS_MULTIPOS_COUNT) { - reusableBuffer.calib.xpotsCalib[idx].steps[count] = position; - } - reusableBuffer.calib.xpotsCalib[idx].stepsCount += 1; - } - } - } - } - } - - menuCalibrationState = reusableBuffer.calib.state; // make sure we don't scroll while calibrating - - switch (event) { - case EVT_ENTRY: - case EVT_KEY_BREAK(KEY_EXIT): - reusableBuffer.calib.state = CALIB_START; - break; - - case EVT_KEY_BREAK(KEY_ENTER): - reusableBuffer.calib.state++; - break; - } - - switch (reusableBuffer.calib.state) { - case CALIB_START: - // START CALIBRATION - if (!READ_ONLY()) { - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+2*FH, STR_MENUTOSTART); - } - break; - - case CALIB_SET_MIDPOINT: - // SET MIDPOINT - lcdDrawText(0*FW, MENU_HEADER_HEIGHT+FH, STR_SETMIDPOINT, INVERS); - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+2*FH, STR_MENUWHENDONE); - for (uint8_t i=0; i> 1; - if (i 50) { - g_eeGeneral.calib[i].mid = reusableBuffer.calib.midVals[i]; - int16_t v = reusableBuffer.calib.midVals[i] - reusableBuffer.calib.loVals[i]; - g_eeGeneral.calib[i].spanNeg = v - v/STICK_TOLERANCE; - v = reusableBuffer.calib.hiVals[i] - reusableBuffer.calib.midVals[i]; - g_eeGeneral.calib[i].spanPos = v - v/STICK_TOLERANCE; - } - } - break; - - case CALIB_STORE: - for (uint8_t i=POT1; i<=POT_LAST; i++) { - int idx = i - POT1; - int count = reusableBuffer.calib.xpotsCalib[idx].stepsCount; - if (IS_POT_MULTIPOS(i)) { - if (count > 1 && count <= XPOTS_MULTIPOS_COUNT) { - for (int j=0; jcount = count - 1; - for (int j=0; jcount; j++) { - calib->steps[j] = (reusableBuffer.calib.xpotsCalib[idx].steps[j+1] + reusableBuffer.calib.xpotsCalib[idx].steps[j]) >> 5; - } - } - else { - g_eeGeneral.potsConfig &= ~(0x03<<(2*idx)); - } - } - } - g_eeGeneral.chkSum = evalChkSum(); - storageDirty(EE_GENERAL); - reusableBuffer.calib.state = CALIB_FINISHED; - break; - - default: - reusableBuffer.calib.state = CALIB_START; - break; - } - - doMainScreenGraphics(); - drawPotsBars(); - -#if 0 - for (int i=POT1; i<=POT_LAST; i++) { - uint8_t steps = 0; - if (reusableBuffer.calib.state == CALIB_MOVE_STICKS) { - steps = reusableBuffer.calib.xpotsCalib[i-POT1].stepsCount; - } - else if (IS_POT_MULTIPOS(i)) { - StepsCalibData * calib = (StepsCalibData *) &g_eeGeneral.calib[i]; - steps = calib->count + 1; - } - if (steps > 0 && steps <= XPOTS_MULTIPOS_COUNT) { - lcdDrawNumber(LCD_W/2-2+(i-POT1)*5, LCD_H-6, steps, TINSIZE|RIGHT); - } - } -#endif -} - void menuRadioCalibration(event_t event) { check_submenu_simple(event, 0); title(STR_MENUCALIBRATION); menuCommonCalib(READ_ONLY() ? 0 : event); + drawPotsBars(); if (menuEvent) { menuCalibrationState = CALIB_START; } @@ -207,5 +68,6 @@ void menuFirstCalib(event_t event) lcdDrawText(LCD_W / 2, 0, STR_MENUCALIBRATION, CENTERED); lcdInvertLine(0); menuCommonCalib(event); + drawPotsBars(); } } diff --git a/radio/src/gui/212x64/radio_diaganas.cpp b/radio/src/gui/212x64/radio_diaganas.cpp index 141c57cd0..f8f1605d1 100644 --- a/radio/src/gui/212x64/radio_diaganas.cpp +++ b/radio/src/gui/212x64/radio_diaganas.cpp @@ -27,7 +27,7 @@ void menuRadioDiagAnalogs(event_t event) { static int8_t entryCount = 0; - static uint16_t lastShownAnalogValue[NUM_STICKS+NUM_POTS+NUM_SLIDERS]; + static uint16_t lastShownAnalogValue[MAX_ANALOG_INPUTS]; enum ANAVIEWS{ ANAVIEW_FIRST, @@ -53,7 +53,7 @@ void menuRadioDiagAnalogs(event_t event) case (ANAVIEW_RAWLOWFPS): SIMPLE_SUBMENU(STR_MENU_RADIO_ANALOGS_RAWLOWFPS, 0); break; } - for (uint8_t i=0; iAETR - for (uint8_t i=1; i<=4; i++) { - putsChnLetter(RADIO_SETUP_2ND_COLUMN - FW + i*FW, y, channelOrder(i), attr); + { + for (uint8_t i = 0; i < adcGetMaxInputs(ADC_INPUT_MAIN); i++) { + putsChnLetter(RADIO_SETUP_2ND_COLUMN - FW + i*FW, y, inputMappingChannelOrder(i), attr); + } + if (attr) { + auto max_order = inputMappingGetMaxChannelOrder() - 1; + CHECK_INCDEC_GENVAR(event, g_eeGeneral.templateSetup, 0, max_order); + } } - if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.templateSetup, 0, 23); break; case ITEM_RADIO_SETUP_STICK_MODE_LABELS: @@ -641,19 +649,23 @@ void menuRadioSetup(event_t event) #endif case ITEM_RADIO_SETUP_STICK_MODE: - lcdDrawChar(2*FW, y, '1'+reusableBuffer.generalSettings.stickMode, attr); - for (uint8_t i=0; i<4; i++) { - drawStickName((6+4*i)*FW, y, *(modn12x3 + 4*reusableBuffer.generalSettings.stickMode + i), 0); - } - if (attr && s_editMode>0) { - CHECK_INCDEC_GENVAR(event, reusableBuffer.generalSettings.stickMode, 0, 3); - } - else if (reusableBuffer.generalSettings.stickMode != g_eeGeneral.stickMode) { - mixerTaskStop(); - g_eeGeneral.stickMode = reusableBuffer.generalSettings.stickMode; - checkThrottleStick(); - mixerTaskStart(); - waitKeysReleased(); + { + auto& mode = reusableBuffer.generalSettings.stickMode; + lcdDrawChar(2*FW, y, '1' + mode, attr); + for (uint8_t i=0; i<4; i++) { + auto ctrl = inputMappingConvertMode(mode, i); + drawMainControlLabel((6+4*i)*FW, y, ctrl, 0); + } + if (attr && s_editMode > 0) { + CHECK_INCDEC_GENVAR(event, mode, 0, 3); + } + else if (mode != g_eeGeneral.stickMode) { + mixerTaskStop(); + g_eeGeneral.stickMode = mode; + checkThrottleStick(); + mixerTaskStart(); + waitKeysReleased(); + } } break; diff --git a/radio/src/gui/212x64/view_channels.cpp b/radio/src/gui/212x64/view_channels.cpp index db32f591a..28c46e2f6 100644 --- a/radio/src/gui/212x64/view_channels.cpp +++ b/radio/src/gui/212x64/view_channels.cpp @@ -40,12 +40,10 @@ void menuChannelsView(event_t event) popMenu(); break; - case EVT_KEY_FIRST(KEY_RIGHT): - case EVT_KEY_FIRST(KEY_LEFT): -#if defined(ROTARY_ENCODER_NAVIGATION) case EVT_ROTARY_LEFT: case EVT_ROTARY_RIGHT: -#endif + case EVT_KEY_FIRST(KEY_PLUS): + case EVT_KEY_FIRST(KEY_MINUS): reusableBuffer.viewChannels.secondPage = !reusableBuffer.viewChannels.secondPage; break; diff --git a/radio/src/gui/212x64/view_main.cpp b/radio/src/gui/212x64/view_main.cpp index b5915ff60..eed0bdcb0 100644 --- a/radio/src/gui/212x64/view_main.cpp +++ b/radio/src/gui/212x64/view_main.cpp @@ -21,6 +21,11 @@ #include "opentx.h" #include "hal/trainer_driver.h" +#include "hal/adc_driver.h" +#include "hal/switch_driver.h" + +#include "switches.h" +#include "input_mapping.h" #define BIGSIZE MIDSIZE #define LBOX_CENTERX (BOX_WIDTH/2 + 16) @@ -73,24 +78,24 @@ const unsigned char icons[] = { void doMainScreenGraphics() { - int16_t calibStickVert = calibratedAnalogs[CONVERT_MODE(1)]; - if (g_model.throttleReversed && CONVERT_MODE(1) == THR_STICK) + int16_t calibStickVert = calibratedAnalogs[ADC_MAIN_LV]; + if (g_model.throttleReversed && inputMappingConvertMode(ADC_MAIN_LV) == THR_STICK) calibStickVert = -calibStickVert; - drawStick(LBOX_CENTERX, calibratedAnalogs[CONVERT_MODE(0)], calibStickVert); + drawStick(LBOX_CENTERX, calibratedAnalogs[ADC_MAIN_LH], calibStickVert); - calibStickVert = calibratedAnalogs[CONVERT_MODE(2)]; - if (g_model.throttleReversed && CONVERT_MODE(2) == THR_STICK) + calibStickVert = calibratedAnalogs[ADC_MAIN_RV]; + if (g_model.throttleReversed && inputMappingConvertMode(ADC_MAIN_RV) == THR_STICK) calibStickVert = -calibStickVert; - drawStick(RBOX_CENTERX, calibratedAnalogs[CONVERT_MODE(3)], calibStickVert); + drawStick(RBOX_CENTERX, calibratedAnalogs[ADC_MAIN_RH], calibStickVert); } void displayTrims(uint8_t phase) { - for (unsigned int i=0; i=SLIDER1 ? LCD_H/2+1 : 1); + // Skip POT3 + if (i == 2) continue; #endif - lcdDrawSolidVerticalLine(x, y, LCD_H/2-2); - lcdDrawSolidVerticalLine(x+1, y, LCD_H/2-2); + + coord_t x = _pot_slots[slot_idx++]; + coord_t y = _pot_slots[slot_idx++]; + + lcdDrawSolidVerticalLine(x, y, LCD_H / 2 - 2); + lcdDrawSolidVerticalLine(x + 1, y, LCD_H / 2 - 2); + + // calculate once per loop y += LCD_H / 2 - 4; - y -= ((calibratedAnalogs[i]+RESX)*(LCD_H/2-4)/(RESX*2)); // calculate once per loop - lcdDrawSolidVerticalLine(x-1, y, 2); - lcdDrawSolidVerticalLine(x+2, y, 2); + y -= ((calibratedAnalogs[offset + i] + RESX) * (LCD_H / 2 - 4) / (RESX * 2)); + lcdDrawSolidVerticalLine(x - 1, y, 2); + lcdDrawSolidVerticalLine(x + 2, y, 2); } } @@ -417,17 +441,6 @@ void displaySwitch(coord_t x, coord_t y, int width, unsigned int index) } } -int getSwitchCount() -{ - int count = 0; - for (int i=0; i 8) { - for (int i=0; i= 14) qr2.rem += 1; - const coord_t x[4] = { 50, 142 }; - const coord_t y[4] = { 25, 42, 25, 42 }; - displaySwitch(x[qr.quot]+qr2.rem*4, y[qr2.quot], 3, i); - } - else { - displaySwitch(17+qr.rem*6, 25+qr.quot*17, 5, i); + // Regular radio + // -> 2 columns: one for each side + // -> 8 slots on each side (2 columns of 4) + + uint8_t switches = switchGetMaxSwitches(); + if (getSwitchCount() > 16) { // beware, there is a desired col/row swap in this special mode + for (int i = 0; i < switches; ++i) { + if (SWITCH_EXISTS(i)) { + auto switch_display = switchGetDisplayPosition(i); + if (g_model.view == VIEW_INPUTS) { + coord_t x = 50 + (switch_display.row % 5) * 4 + + (switch_display.col == 0 ? 0 : 93) + + (switch_display.row < 5 ? 0 : 2); + coord_t y = switch_display.row < 5 ? 25 : 40; + displaySwitch(x, y, 3, i); + } else { + displaySwitch(17 + switch_display.row * 6, + 25 + switch_display.col * 17, 5, i); + } } } } else { - int index = 0; - for (int i=0; ikey = 0; - if (isEvent()) { // event waiting - event_t evt = getEvent(false); // get keyEvent for hard keys other than trim switches + if (isEvent()) { // event waiting + event_t evt = getEvent(); - if(evt == EVT_KEY_FIRST(KEY_PGUP) || // generate acoustic/haptic feedback if radio settings allow - evt == EVT_KEY_FIRST(KEY_PGDN) || + if(evt == EVT_KEY_FIRST(KEY_PAGEUP) || + evt == EVT_KEY_FIRST(KEY_PAGEDN) || evt == EVT_KEY_FIRST(KEY_ENTER) || evt == EVT_KEY_FIRST(KEY_MODEL) || evt == EVT_KEY_FIRST(KEY_EXIT) || - evt == EVT_KEY_FIRST(KEY_TELEM) || - evt == EVT_KEY_FIRST(KEY_RADIO)) { + evt == EVT_KEY_FIRST(KEY_TELE) || + evt == EVT_KEY_FIRST(KEY_SYS)) { + // generate acoustic/haptic feedback if radio settings allow audioKeyPress(); } @@ -244,7 +246,7 @@ static void rotaryDriverRead(lv_indev_drv_t *drv, lv_indev_data_t *data) static int8_t prevDir = 0; static uint32_t lastDt = 0; - rotenc_t newPos = ROTARY_ENCODER_NAVIGATION_VALUE; + rotenc_t newPos = rotaryEncoderGetRawValue(); rotenc_t diff = (newPos - prevPos) / ROTARY_ENCODER_GRANULARITY; prevPos += diff * ROTARY_ENCODER_GRANULARITY; @@ -270,9 +272,6 @@ static void rotaryDriverRead(lv_indev_drv_t *drv, lv_indev_data_t *data) _rotary_enc_accel = 0; } - // For Lua getRotEncSpeed() function - rotencSpeed = max(_rotary_enc_accel, (int8_t)1); - prevDir = dir; lastDt = rotencDt; } @@ -299,7 +298,7 @@ uint32_t makeLvColor32(uint32_t colorFlags) std::string makeRecolor(std::string value, uint32_t colorFlags) { char s[32]; - snprintf(s, 32, "#%06x %s#", makeLvColor32(colorFlags), value.c_str()); + snprintf(s, 32, "#%06" PRIx32 " %s#", makeLvColor32(colorFlags), value.c_str()); return std::string(s); } diff --git a/radio/src/gui/colorlcd/curveedit.cpp b/radio/src/gui/colorlcd/curveedit.cpp index 00382115e..b0133f981 100644 --- a/radio/src/gui/colorlcd/curveedit.cpp +++ b/radio/src/gui/colorlcd/curveedit.cpp @@ -346,7 +346,8 @@ void CurveEdit::checkEvents() if (!lockSource) { int16_t val = getMovedSource(MIXSRC_FIRST_INPUT); if (val > 0) { - if (val > NUM_STICKS + NUM_POTS + NUM_SLIDERS) + // TODO: this code seems odd + if (val > MAX_STICKS + MAX_POTS) CurveEdit::currentSource = val + 1 - MIXSRC_FIRST_INPUT; else { CurveEdit::currentSource = expoAddress(val - 1)->srcRaw; diff --git a/radio/src/gui/colorlcd/custom_failsafe.cpp b/radio/src/gui/colorlcd/custom_failsafe.cpp index 78035846b..7dbde06c7 100644 --- a/radio/src/gui/colorlcd/custom_failsafe.cpp +++ b/radio/src/gui/colorlcd/custom_failsafe.cpp @@ -239,7 +239,7 @@ FailSafePage::FailSafePage(uint8_t moduleIdx) : // Channel name auto line = form->newLine(&grid); - const char* ch_label = getSourceString(MIXSRC_CH1 + ch); + const char* ch_label = getSourceString(MIXSRC_FIRST_CH + ch); new StaticText(line, rect_t{}, ch_label, 0, COLOR_THEME_PRIMARY1); // Channel value diff --git a/radio/src/gui/colorlcd/draw_functions.cpp b/radio/src/gui/colorlcd/draw_functions.cpp index 631802c34..452bab688 100644 --- a/radio/src/gui/colorlcd/draw_functions.cpp +++ b/radio/src/gui/colorlcd/draw_functions.cpp @@ -24,6 +24,8 @@ #include "theme_manager.h" #include "libopenui.h" +#include "watchdog_driver.h" + coord_t drawStringWithIndex(BitmapBuffer * dc, coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix) { char s[64]; @@ -237,11 +239,6 @@ void drawCurveRef(BitmapBuffer * dc, coord_t x, coord_t y, const CurveRef & curv } } -void drawStickName(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t idx, LcdFlags att) -{ - dc->drawText(x, y, STR_VSRCRAW[idx]+1, att); -} - void drawModelName(BitmapBuffer * dc, coord_t x, coord_t y, char * name, uint8_t id, LcdFlags att) { uint8_t len = sizeof(g_model.header.name); diff --git a/radio/src/gui/colorlcd/draw_functions.h b/radio/src/gui/colorlcd/draw_functions.h index bd376e112..908fc0796 100644 --- a/radio/src/gui/colorlcd/draw_functions.h +++ b/radio/src/gui/colorlcd/draw_functions.h @@ -81,7 +81,7 @@ void drawHexNumber(BitmapBuffer * dc, coord_t x, coord_t y, uint32_t val, LcdFla void drawTextLines(BitmapBuffer * dc, coord_t left, coord_t top, coord_t width, coord_t height, const char * str, LcdFlags flags); inline void drawChn(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t idx, LcdFlags flags) { - drawSource(dc, x, y, MIXSRC_CH1 + idx - 1, flags); + drawSource(dc, x, y, MIXSRC_FIRST_CH + idx - 1, flags); } // Screen templates diff --git a/radio/src/gui/colorlcd/fullscreen_dialog.cpp b/radio/src/gui/colorlcd/fullscreen_dialog.cpp index b24d50ff5..afa745e1c 100644 --- a/radio/src/gui/colorlcd/fullscreen_dialog.cpp +++ b/radio/src/gui/colorlcd/fullscreen_dialog.cpp @@ -25,6 +25,8 @@ #include "opentx.h" #include "libopenui.h" +#include "watchdog_driver.h" + static Window* _get_parent() { Window* p = Layer::back(); diff --git a/radio/src/gui/colorlcd/hw_inputs.cpp b/radio/src/gui/colorlcd/hw_inputs.cpp index d2754b5d6..29d6efb6c 100644 --- a/radio/src/gui/colorlcd/hw_inputs.cpp +++ b/radio/src/gui/colorlcd/hw_inputs.cpp @@ -22,6 +22,11 @@ #include "hw_inputs.h" #include "opentx.h" +#include "hal/adc_driver.h" +#include "hal/switch_driver.h" +#include "analogs.h" +#include "switches.h" + #define SET_DIRTY() storageDirty(EE_GENERAL) struct HWInputEdit : public RadioTextEdit { @@ -42,10 +47,13 @@ HWSticks::HWSticks(Window* parent) : FormGroup(parent, rect_t{}) FlexGridLayout grid(col_two_dsc, row_dsc, 2); setFlexLayout(); - for (int i = 0; i < NUM_STICKS; i++) { + auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN); + for (int i = 0; i < max_sticks; i++) { auto line = newLine(&grid); - new StaticText(line, rect_t{}, STR_VSRCRAW[i + 1], 0, COLOR_THEME_PRIMARY1); - new HWInputEdit(line, g_eeGeneral.anaNames[i], LEN_ANA_NAME); + new StaticText(line, rect_t{}, analogGetCanonicalName(ADC_INPUT_MAIN, i), + 0, COLOR_THEME_PRIMARY1); + new HWInputEdit(line, (char*)analogGetCustomLabel(ADC_INPUT_MAIN, i), + LEN_ANA_NAME); } #if defined(STICK_DEAD_ZONE) @@ -64,13 +72,17 @@ HWPots::HWPots(Window* parent) : FormGroup(parent, rect_t{}) FlexGridLayout grid(col_two_dsc, row_dsc, 2); setFlexLayout(); - for (int i = 0; i < NUM_POTS; i++) { + auto max_pots = adcGetMaxInputs(ADC_INPUT_POT); + for (int i = 0; i < max_pots; i++) { + // TODO: check initialised ADC inputs instead! + // Display EX3 & EX4 (= last two pots) only when FlySky gimbals are present -#if !defined(SIMU) && defined(FLYSKY_GIMBAL) - if (!globalData.flyskygimbals && (i >= (NUM_POTS - 2))) continue; -#endif + // TODO: use input disabled mask instead +// #if !defined(SIMU) && defined(RADIO_FAMILY_T16) +// if (!globalData.flyskygimbals && (i >= (NUM_POTS - 2))) continue; +// #endif auto line = newLine(&grid); - new StaticText(line, rect_t{}, STR_VSRCRAW[i + NUM_STICKS + 1], 0, + new StaticText(line, rect_t{}, analogGetCanonicalName(ADC_INPUT_POT, i), 0, COLOR_THEME_PRIMARY1); auto box = new FormGroup(line, rect_t{}); @@ -79,56 +91,21 @@ HWPots::HWPots(Window* parent) : FormGroup(parent, rect_t{}) auto box_obj = box->getLvObj(); lv_obj_set_style_flex_cross_place(box_obj, LV_FLEX_ALIGN_CENTER, 0); - new HWInputEdit(box, g_eeGeneral.anaNames[i + NUM_STICKS], LEN_ANA_NAME); + new HWInputEdit(box, (char*)analogGetCustomLabel(ADC_INPUT_POT, i), LEN_ANA_NAME); new Choice( - box, rect_t{}, STR_POTTYPES, POT_NONE, POT_WITHOUT_DETENT, + box, rect_t{}, STR_POTTYPES, POT_NONE, POT_SLIDER_WITH_DETENT, [=]() -> int { - return bfGet(g_eeGeneral.potsConfig, 2 * i, 2); + return bfGet(g_eeGeneral.potsConfig, POT_CFG_BITS * i, + POT_CFG_BITS); }, [=](int newValue) { - g_eeGeneral.potsConfig = - bfSet(g_eeGeneral.potsConfig, newValue, 2 * i, 2); + g_eeGeneral.potsConfig = bfSet( + g_eeGeneral.potsConfig, newValue, POT_CFG_BITS * i, POT_CFG_BITS); SET_DIRTY(); }); } } -HWSliders::HWSliders(Window* parent) : FormGroup(parent, rect_t{}) -{ - FlexGridLayout grid(col_two_dsc, row_dsc, 2); - setFlexLayout(); - -#if (NUM_SLIDERS > 0) - for (int i = 0; i < NUM_SLIDERS; i++) { - const int idx = i + NUM_STICKS + NUM_POTS; - - auto line = newLine(&grid); - new StaticText(line, rect_t{}, STR_VSRCRAW[idx + 1], 0, - COLOR_THEME_PRIMARY1); - - auto box = new FormGroup(line, rect_t{}); - box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(4)); - - auto box_obj = box->getLvObj(); - lv_obj_set_style_flex_cross_place(box_obj, LV_FLEX_ALIGN_CENTER, 0); - - new HWInputEdit(box, g_eeGeneral.anaNames[idx], LEN_ANA_NAME); - new Choice( - box, rect_t{}, STR_SLIDERTYPES, SLIDER_NONE, SLIDER_WITH_DETENT, - [=]() -> int { - uint8_t mask = (0x01 << i); - return (g_eeGeneral.slidersConfig & mask) >> i; - }, - [=](int newValue) { - uint8_t mask = (0x01 << i); - g_eeGeneral.slidersConfig &= ~mask; - g_eeGeneral.slidersConfig |= (newValue << i); - SET_DIRTY(); - }); - } -#endif -} - class SwitchDynamicLabel : public StaticText { public: @@ -141,7 +118,7 @@ class SwitchDynamicLabel : public StaticText std::string label() { - std::string str(STR_VSRCRAW[index + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1]); + std::string str(switchGetName(index)); return str + getSwitchPositionSymbol(lastpos); } @@ -170,22 +147,12 @@ class SwitchDynamicLabel : public StaticText uint8_t lastpos = 0xff; }; -#if defined(PCBHORUS) -#define SWITCH_TYPE_MAX(sw) \ - ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || \ - MIXSRC_SH - MIXSRC_FIRST_SWITCH == sw) \ - ? SWITCH_2POS \ - : SWITCH_3POS) -#else -#define SWITCH_TYPE_MAX(sw) (SWITCH_3POS) -#endif - HWSwitches::HWSwitches(Window* parent) : FormGroup(parent, rect_t{}) { FlexGridLayout grid(col_two_dsc, row_dsc, 2); setFlexLayout(); - for (int i = 0; i < NUM_SWITCHES; i++) { + for (int i = 0; i < switchGetMaxSwitches(); i++) { auto line = newLine(&grid); new SwitchDynamicLabel(line, i); @@ -195,14 +162,15 @@ HWSwitches::HWSwitches(Window* parent) : FormGroup(parent, rect_t{}) auto box_obj = box->getLvObj(); lv_obj_set_style_flex_cross_place(box_obj, LV_FLEX_ALIGN_CENTER, 0); - new HWInputEdit(box, g_eeGeneral.switchNames[i], LEN_SWITCH_NAME); + new HWInputEdit(box, (char*)switchGetCustomName(i), LEN_SWITCH_NAME); new Choice( - box, rect_t{}, STR_SWTYPES, SWITCH_NONE, SWITCH_TYPE_MAX(i), + box, rect_t{}, STR_SWTYPES, SWITCH_NONE, switchGetMaxType(i), [=]() -> int { return SWITCH_CONFIG(i); }, [=](int newValue) { - swconfig_t mask = (swconfig_t)0x03 << (2 * i); - g_eeGeneral.switchConfig = (g_eeGeneral.switchConfig & ~mask) | - ((swconfig_t(newValue) & 0x03) << (2 * i)); + swconfig_t mask = (swconfig_t)SWITCH_CONFIG_MASK(i); + g_eeGeneral.switchConfig = + (g_eeGeneral.switchConfig & ~mask) | + ((swconfig_t(newValue) & SW_CFG_MASK) << (SW_CFG_BITS * i)); SET_DIRTY(); }); } @@ -221,5 +189,4 @@ HWInputDialog::HWInputDialog(const char* title) : template struct HWInputDialog; template struct HWInputDialog; -template struct HWInputDialog; template struct HWInputDialog; diff --git a/radio/src/gui/colorlcd/hw_inputs.h b/radio/src/gui/colorlcd/hw_inputs.h index 6434ed751..b4254251e 100644 --- a/radio/src/gui/colorlcd/hw_inputs.h +++ b/radio/src/gui/colorlcd/hw_inputs.h @@ -33,9 +33,6 @@ struct HWPots : public FormGroup { HWPots(Window* parent); }; -struct HWSliders : public FormGroup { - HWSliders(Window* parent); -}; struct HWSwitches : public FormGroup { HWSwitches(Window* parent); diff --git a/radio/src/gui/colorlcd/input_edit_adv.cpp b/radio/src/gui/colorlcd/input_edit_adv.cpp index 84a88e7fc..0d1024588 100644 --- a/radio/src/gui/colorlcd/input_edit_adv.cpp +++ b/radio/src/gui/colorlcd/input_edit_adv.cpp @@ -59,11 +59,16 @@ InputEditAdvanced::InputEditAdvanced(uint8_t input_n, uint8_t index) : // Trim line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_TRIM, 0, COLOR_THEME_PRIMARY1); - auto c = new Choice(line, rect_t{}, STR_VMIXTRIMS, -TRIM_OFF, - -TRIM_LAST, GET_VALUE(-input->trimSource), - SET_VALUE(input->trimSource, -newValue)); + auto c = new Choice(line, rect_t{}, -TRIM_OFF, -TRIM_LAST, + GET_VALUE(-input->trimSource), + SET_VALUE(input->trimSource, -newValue)); + + uint16_t srcRaw = input->srcRaw; c->setAvailableHandler([=](int value) { - return value != TRIM_ON || input->srcRaw <= MIXSRC_Ail; + return value != TRIM_ON || srcRaw <= MIXSRC_LAST_STICK; + }); + c->setTextHandler([=](int value) -> std::string { + return getTrimSourceLabel(srcRaw, -value); }); // Flight modes diff --git a/radio/src/gui/colorlcd/input_mix_group.cpp b/radio/src/gui/colorlcd/input_mix_group.cpp index 2bfb3cc94..723a27fb4 100644 --- a/radio/src/gui/colorlcd/input_mix_group.cpp +++ b/radio/src/gui/colorlcd/input_mix_group.cpp @@ -55,9 +55,9 @@ InputMixGroup::InputMixGroup(Window* parent, mixsrc_t idx) : lv_obj_t* chText = nullptr; if (idx >= MIXSRC_FIRST_CH && idx <= MIXSRC_LAST_CH - && g_model.limitData[idx - MIXSRC_CH1].name[0] != '\0') { + && g_model.limitData[idx - MIXSRC_FIRST_CH].name[0] != '\0') { chText = lv_label_create(lvobj); - lv_label_set_text_fmt(chText, TR_CH "%zu", (size_t)(idx - MIXSRC_CH1 + 1)); + lv_label_set_text_fmt(chText, TR_CH "%zu", (size_t)(idx - MIXSRC_FIRST_CH + 1)); lv_obj_set_style_text_font(chText, getFont(FONT(XS)), 0); #if LCD_H > LCD_W lv_obj_set_style_pad_bottom(chText, -2, 0); diff --git a/radio/src/gui/colorlcd/input_source.cpp b/radio/src/gui/colorlcd/input_source.cpp index 5e8923262..eab6a2dce 100644 --- a/radio/src/gui/colorlcd/input_source.cpp +++ b/radio/src/gui/colorlcd/input_source.cpp @@ -32,24 +32,6 @@ class SensorValue : public StaticText { } -// void paint(BitmapBuffer *dc) override -// { -// if (isTelemetryValue()) { -// uint8_t sensorIndex = (input->srcRaw - MIXSRC_FIRST_TELEM) / 3; -// #if defined(SIMU) -// if (true) { -// #else -// TelemetryItem &telemetryItem = telemetryItems[sensorIndex]; -// if (telemetryItem.isAvailable()) { -// #endif -// LcdFlags flags = LEFT | COLOR_THEME_PRIMARY1; -// drawSensorCustomValue(dc, 3, 2, sensorIndex, lastSensorVal, flags); -// } else { -// dc->drawText(3, 2, "---", COLOR_THEME_PRIMARY1); -// } -// } -// } - bool isTelemetryValue() { return input->srcRaw >= MIXSRC_FIRST_TELEM && @@ -143,7 +125,7 @@ InputSource::InputSource(Window* parent, ExpoData* input) : void InputSource::update() { - if (input->srcRaw > MIXSRC_Ail && input->trimSource == TRIM_ON) { + if (input->srcRaw > MIXSRC_LAST_STICK && input->trimSource == TRIM_ON) { input->trimSource = TRIM_OFF; } diff --git a/radio/src/gui/colorlcd/layouts/sliders.cpp b/radio/src/gui/colorlcd/layouts/sliders.cpp index 9da4d4fa6..dc98296d5 100644 --- a/radio/src/gui/colorlcd/layouts/sliders.cpp +++ b/radio/src/gui/colorlcd/layouts/sliders.cpp @@ -21,6 +21,9 @@ #include "sliders.h" #include "opentx.h" +#include "switches.h" + +#include "hal/adc_driver.h" enum slider_type { SLIDER_HORIZ, @@ -43,6 +46,23 @@ static void slider_self_size(lv_event_t* e) } } +MainViewSlider::MainViewSlider(Window* parent, const rect_t& rect, + uint8_t idx) : + Window(parent, rect), idx(idx) +{ +} + +void MainViewSlider::checkEvents() +{ + Window::checkEvents(); + auto pot_idx = adcGetInputOffset(ADC_INPUT_POT) + idx; + int16_t newValue = calibratedAnalogs[pot_idx]; + if (value != newValue) { + value = newValue; + invalidate(); + } +} + MainViewHorizontalSlider::MainViewHorizontalSlider(Window* parent, uint8_t idx) : MainViewSlider(parent, rect_t{}, idx) @@ -86,7 +106,6 @@ MainView6POS::MainView6POS(Window* parent, uint8_t idx) : void MainView6POS::paint(BitmapBuffer * dc) { -#if NUM_XPOTS > 0 // prevent compiler warning coord_t x = MULTIPOS_W_SPACING/4; for (uint8_t value = 0; value < XPOTS_MULTIPOS_COUNT; value++) { dc->drawNumber(x+TRIM_SQUARE_SIZE/4, 0, value+1, FONT(XS) | COLOR_THEME_SECONDARY1); @@ -94,23 +113,20 @@ void MainView6POS::paint(BitmapBuffer * dc) } // The square - value = (potsPos[idx] & 0x0f); - x = MULTIPOS_W_SPACING/4+MULTIPOS_W_SPACING*value; + value = getXPotPosition(idx); + x = MULTIPOS_W_SPACING / 4 + MULTIPOS_W_SPACING * value; drawTrimSquare(dc, x, 0, COLOR_THEME_FOCUS); dc->drawNumber(x+MULTIPOS_W_SPACING/4, -2, value+1, FONT(BOLD) | COLOR_THEME_PRIMARY2); -#endif } void MainView6POS::checkEvents() { Window::checkEvents(); -#if NUM_XPOTS > 0 // prevent compiler warning - int16_t newValue = (potsPos[idx] & 0x0f); + int16_t newValue = getXPotPosition(idx); if (value != newValue) { value = newValue; invalidate(); } -#endif } MainViewVerticalSlider::MainViewVerticalSlider(Window* parent, uint8_t idx) : diff --git a/radio/src/gui/colorlcd/layouts/sliders.h b/radio/src/gui/colorlcd/layouts/sliders.h index 899e32363..711384904 100644 --- a/radio/src/gui/colorlcd/layouts/sliders.h +++ b/radio/src/gui/colorlcd/layouts/sliders.h @@ -38,34 +38,21 @@ constexpr coord_t VERTICAL_SLIDERS_HEIGHT = SLIDER_TICKS_COUNT * 4 + TRIM_SQUARE class MainViewSlider : public Window { - public: - MainViewSlider(Window * parent, const rect_t & rect, uint8_t idx): - Window(parent, rect), - idx(idx) - { - } + public: + MainViewSlider(Window* parent, const rect_t& rect, uint8_t idx); + void checkEvents() override; - void checkEvents() override - { - Window::checkEvents(); - int16_t newValue = calibratedAnalogs[idx]; - if (value != newValue) { - value = newValue; - invalidate(); - } - } - - protected: - uint8_t idx; - int16_t value = 0; + protected: + uint8_t idx; + int16_t value = 0; }; class MainViewHorizontalSlider : public MainViewSlider { - public: - using MainViewSlider::MainViewSlider; - MainViewHorizontalSlider(Window* parent, uint8_t idx); - void paint(BitmapBuffer * dc) override; + public: + using MainViewSlider::MainViewSlider; + MainViewHorizontalSlider(Window* parent, uint8_t idx); + void paint(BitmapBuffer* dc) override; }; class MainView6POS : public MainViewSlider diff --git a/radio/src/gui/colorlcd/layouts/trims.cpp b/radio/src/gui/colorlcd/layouts/trims.cpp index 57ec17f4c..64b7e2a0e 100644 --- a/radio/src/gui/colorlcd/layouts/trims.cpp +++ b/radio/src/gui/colorlcd/layouts/trims.cpp @@ -21,6 +21,7 @@ #include "trims.h" #include "sliders.h" +#include "input_mapping.h" #include "opentx.h" @@ -67,7 +68,7 @@ void MainViewTrim::setRange() void MainViewTrim::checkEvents() { Window::checkEvents(); - int8_t stickIndex = CONVERT_MODE(idx); + int8_t stickIndex = inputMappingConvertMode(idx); int newValue = getTrimValue(mixerCurrentFlightMode, stickIndex); setRange(); diff --git a/radio/src/gui/colorlcd/mixer_edit.cpp b/radio/src/gui/colorlcd/mixer_edit.cpp index 0688d7289..2ff64b9ae 100644 --- a/radio/src/gui/colorlcd/mixer_edit.cpp +++ b/radio/src/gui/colorlcd/mixer_edit.cpp @@ -72,7 +72,7 @@ MixEditWindow::MixEditWindow(int8_t channel, uint8_t index) : void MixEditWindow::buildHeader(Window *window) { - std::string title2(getSourceString(MIXSRC_CH1 + channel)); + std::string title2(getSourceString(MIXSRC_FIRST_CH + channel)); header.setTitle(STR_MIXES); header.setTitle2(title2); diff --git a/radio/src/gui/colorlcd/mixer_edit_adv.cpp b/radio/src/gui/colorlcd/mixer_edit_adv.cpp index fd3420285..53f8d0553 100644 --- a/radio/src/gui/colorlcd/mixer_edit_adv.cpp +++ b/radio/src/gui/colorlcd/mixer_edit_adv.cpp @@ -32,7 +32,7 @@ MixEditAdvanced::MixEditAdvanced(int8_t channel, uint8_t index) : { std::string title(STR_MIXES); title += "\n"; - title += getSourceString(MIXSRC_CH1 + channel); + title += getSourceString(MIXSRC_FIRST_CH + channel); header.setTitle(title); auto form = new FormWindow(&body, rect_t{}); diff --git a/radio/src/gui/colorlcd/model_flightmodes.cpp b/radio/src/gui/colorlcd/model_flightmodes.cpp index 1f098f045..dce3f8f0f 100644 --- a/radio/src/gui/colorlcd/model_flightmodes.cpp +++ b/radio/src/gui/colorlcd/model_flightmodes.cpp @@ -23,6 +23,7 @@ #include "opentx.h" #include "libopenui.h" #include "lvgl_widgets/input_mix_line.h" +#include "hal/key_driver.h" #define SET_DIRTY() storageDirty(EE_MODEL) @@ -107,7 +108,7 @@ class FlightModeEdit : public Page FlexGridLayout trim_grid(trims_col_dsc, line_row_dsc); - for (int t = 0; t < NUM_TRIMS; t++) { + for (int t = 0; t < MAX_TRIMS; t++) { lastTrim[t] = p_fm->trim[t].value; if ((t % TRIMS_PER_LINE) == 0) { @@ -160,7 +161,7 @@ class FlightModeEdit : public Page void checkEvents() override { - for (int i = 0; i < NUM_TRIMS; i += 1) { + for (int i = 0; i < keysGetMaxTrims(); i += 1) { const auto& fm = g_model.flightModeData[index]; if (lastTrim[i] != fm.trim[i].value) { lastTrim[i] = fm.trim[i].value; @@ -171,9 +172,9 @@ class FlightModeEdit : public Page protected: uint8_t index; - Choice* tr_mode[NUM_TRIMS] = {nullptr}; - NumberEdit* tr_value[NUM_TRIMS] = {nullptr}; - int lastTrim[NUM_TRIMS]; + Choice* tr_mode[MAX_TRIMS] = {nullptr}; + NumberEdit* tr_value[MAX_TRIMS] = {nullptr}; + int lastTrim[MAX_TRIMS]; void showControls(int trim, uint8_t mode) { @@ -413,7 +414,7 @@ class FlightModeBtn : public Button lv_obj_t* trims_cont = fmStyle.newTrimCont(container); lv_obj_set_user_data(trims_cont, this); - for (int i = 0; i < NUM_TRIMS; i += 1) { + for (int i = 0; i < keysGetMaxTrims(); i += 1) { fmTrimMode[i] = fmStyle.newTrimMode(trims_cont, i); fmTrimValue[i] = fmStyle.newTrimValue(trims_cont, i); } @@ -446,7 +447,7 @@ class FlightModeBtn : public Button if (!refreshing && init) { refreshing = true; const auto& fm = g_model.flightModeData[index]; - for (int t = 0; t < NUM_TRIMS; t += 1) { + for (int t = 0; t < keysGetMaxTrims(); t += 1) { if (lastTrim[t] != fm.trim[t].value) { lastTrim[t] = fm.trim[t].value; @@ -485,7 +486,7 @@ class FlightModeBtn : public Button lv_label_set_text(fmSwitch, ""); } - for (int i = 0; i < NUM_TRIMS; i += 1) { + for (int i = 0; i < keysGetMaxTrims(); i += 1) { uint8_t mode = fm.trim[i].mode; bool checked = (mode != TRIM_MODE_NONE); bool showValue = (index == 0) || ((mode & 1) || (mode >> 1 == index)); @@ -510,11 +511,11 @@ class FlightModeBtn : public Button lv_obj_t* fmID = nullptr; lv_obj_t* fmName = nullptr; lv_obj_t* fmSwitch = nullptr; - lv_obj_t* fmTrimMode[NUM_TRIMS] = {nullptr}; - lv_obj_t* fmTrimValue[NUM_TRIMS] = {nullptr}; + lv_obj_t* fmTrimMode[MAX_TRIMS] = {nullptr}; + lv_obj_t* fmTrimValue[MAX_TRIMS] = {nullptr}; lv_obj_t* fmFadeIn = nullptr; lv_obj_t* fmFadeOut = nullptr; - int lastTrim[NUM_TRIMS]; + int lastTrim[MAX_TRIMS]; }; ModelFlightModesPage::ModelFlightModesPage(): diff --git a/radio/src/gui/colorlcd/model_inputs.cpp b/radio/src/gui/colorlcd/model_inputs.cpp index 8ffb43de0..833aaf22e 100644 --- a/radio/src/gui/colorlcd/model_inputs.cpp +++ b/radio/src/gui/colorlcd/model_inputs.cpp @@ -28,8 +28,11 @@ #include "input_edit.h" #include "input_mix_group.h" #include "input_mix_button.h" +#include "input_mapping.h" #include "tasks/mixer_task.h" +#include "hal/adc_driver.h" + #include #define SET_DIRTY() storageDirty(EE_MODEL) @@ -90,7 +93,11 @@ void insertExpo(uint8_t idx, uint8_t input) ExpoData * expo = expoAddress(idx); memmove(expo+1, expo, (MAX_EXPOS-(idx+1))*sizeof(ExpoData)); memclear(expo, sizeof(ExpoData)); - expo->srcRaw = (input >= 4 ? MIXSRC_Rud + input : MIXSRC_Rud + channelOrder(input + 1) - 1); + if (input >= adcGetMaxInputs(ADC_INPUT_MAIN)) { + expo->srcRaw = MIXSRC_FIRST_STICK + input; + } else { + expo->srcRaw = MIXSRC_FIRST_STICK + inputMappingChannelOrder(input); + } expo->curve.type = CURVE_REF_EXPO; expo->mode = 3; // pos+neg expo->chn = input; diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index 0a2068a03..9c74270fc 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -72,7 +72,8 @@ class LogicalSwitchEditPage : public Page void buildHeader(Window* window) { header.setTitle(STR_MENULOGICALSWITCHES); - headerSwitchName = header.setTitle2(getSwitchPositionName(SWSRC_SW1 + index)); + headerSwitchName = header.setTitle2( + getSwitchPositionName(SWSRC_FIRST_LOGICAL_SWITCH + index)); lv_obj_set_style_text_color(headerSwitchName->getLvObj(), makeLvColor(COLOR_THEME_ACTIVE), @@ -413,7 +414,7 @@ class LogicalSwitchButton : public Button LogicalSwitchData* ls = lswAddress(lsIndex); uint8_t lsFamily = lswFamily(ls->func); - lv_label_set_text(lsName, getSwitchPositionName(SWSRC_SW1 + lsIndex)); + lv_label_set_text(lsName, getSwitchPositionName(SWSRC_FIRST_LOGICAL_SWITCH + lsIndex)); lv_label_set_text(lsFunc, STR_VCSWFUNC[ls->func]); // CSW params - V1 @@ -528,7 +529,7 @@ void ModelLogicalSwitchesPage::newLS(FormWindow* window, bool pasteLS) for (uint8_t i = 0; i < MAX_LOGICAL_SWITCHES; i++) { LogicalSwitchData* ls = lswAddress(i); if (ls->func == LS_FUNC_NONE) { - std::string ch_name(getSwitchPositionName(SWSRC_SW1 + i)); + std::string ch_name(getSwitchPositionName(SWSRC_FIRST_LOGICAL_SWITCH + i)); menu->addLineBuffered(ch_name.c_str(), [=]() { if (pasteLS) { *ls = clipboard.data.csw; diff --git a/radio/src/gui/colorlcd/model_mixes.cpp b/radio/src/gui/colorlcd/model_mixes.cpp index dbc4be13e..b05a83422 100644 --- a/radio/src/gui/colorlcd/model_mixes.cpp +++ b/radio/src/gui/colorlcd/model_mixes.cpp @@ -30,8 +30,10 @@ #include "input_mix_group.h" #include "input_mix_button.h" #include "mixer_edit.h" +#include "input_mapping.h" #include "tasks/mixer_task.h" +#include "hal/adc_driver.h" #define SET_DIRTY() storageDirty(EE_MODEL) #define PASTE_BEFORE -2 @@ -75,8 +77,11 @@ void insertMix(uint8_t idx, uint8_t channel) mix->destCh = channel; mix->srcRaw = channel + 1; if (!isSourceAvailable(mix->srcRaw)) { - mix->srcRaw = (channel > 3 ? MIXSRC_Rud - 1 + channel - : MIXSRC_Rud - 1 + channelOrder(channel)); + if (channel >= adcGetMaxInputs(ADC_INPUT_MAIN)) { + mix->srcRaw = MIXSRC_FIRST_STICK + channel; + } else { + mix->srcRaw = MIXSRC_FIRST_STICK + inputMappingChannelOrder(channel); + } while (!isSourceAvailable(mix->srcRaw)) { mix->srcRaw += 1; } @@ -320,13 +325,13 @@ InputMixGroup* ModelMixesPage::getGroupByIndex(uint8_t index) if (is_memclear(mix, sizeof(MixData))) return nullptr; int ch = mix->destCh; - return getGroupBySrc(MIXSRC_CH1 + ch); + return getGroupBySrc(MIXSRC_FIRST_CH + ch); } InputMixGroup* ModelMixesPage::createGroup(FormWindow* form, mixsrc_t src) { auto group = new InputMixGroup(form, src); - if (showMonitors) group->enableMixerMonitor(src - MIXSRC_CH1); + if (showMonitors) group->enableMixerMonitor(src - MIXSRC_FIRST_CH); return group; } @@ -338,7 +343,7 @@ InputMixButton* ModelMixesPage::createLineButton(InputMixGroup *group, uint8_t i lines.emplace_back(button); group->addLine(button); - uint8_t ch = group->getMixSrc() - MIXSRC_CH1; + uint8_t ch = group->getMixSrc() - MIXSRC_FIRST_CH; button->setPressHandler([=]() -> uint8_t { Menu *menu = new Menu(form); menu->addLine(STR_EDIT, [=]() { @@ -394,7 +399,7 @@ void ModelMixesPage::addLineButton(uint8_t index) if (is_memclear(mix, sizeof(MixData))) return; int channel = mix->destCh; - addLineButton(MIXSRC_CH1 + channel, index); + addLineButton(MIXSRC_FIRST_CH + channel, index); } void ModelMixesPage::newMix() @@ -416,7 +421,7 @@ void ModelMixesPage::newMix() skip_mix = (ch == 0 && is_memclear(line, sizeof(MixData))); } } else { - std::string ch_name(getSourceString(MIXSRC_CH1 + ch)); + std::string ch_name(getSourceString(MIXSRC_FIRST_CH + ch)); menu->addLineBuffered(ch_name.c_str(), [=]() { insertMix(ch, index); }); } } @@ -447,7 +452,7 @@ void ModelMixesPage::insertMix(uint8_t channel, uint8_t index) _copyMode = 0; ::insertMix(index, channel); - addLineButton(MIXSRC_CH1 + channel, index); + addLineButton(MIXSRC_FIRST_CH + channel, index); editMix(channel, index); } @@ -531,7 +536,7 @@ void ModelMixesPage::build(FormWindow * window) if (line->destCh == ch && !skip_mix) { // one group for the complete mixer channel - auto group = createGroup(form, MIXSRC_CH1 + ch); + auto group = createGroup(form, MIXSRC_FIRST_CH + ch); groups.emplace_back(group); while (index < MAX_MIXERS && (line->destCh == ch) && !skip_mix) { // one button per input line @@ -573,7 +578,7 @@ void ModelMixesPage::enableMonitors(bool enabled) auto h = lv_obj_get_height(form_obj); for(auto* group : groups) { if (enabled) { - group->enableMixerMonitor(group->getMixSrc() - MIXSRC_CH1); + group->enableMixerMonitor(group->getMixSrc() - MIXSRC_FIRST_CH); } else { group->disableMixerMonitor(); } diff --git a/radio/src/gui/colorlcd/model_outputs.cpp b/radio/src/gui/colorlcd/model_outputs.cpp index a679a1a32..2793fcc0e 100644 --- a/radio/src/gui/colorlcd/model_outputs.cpp +++ b/radio/src/gui/colorlcd/model_outputs.cpp @@ -191,10 +191,10 @@ class OutputLineButton : public ListLineButton lv_obj_set_style_pad_top(source, -7, 0); lv_obj_set_style_pad_bottom(source, -7, 0); #endif - lv_label_set_text_fmt(source, "%s\n" TR_CH "%u", getSourceString(MIXSRC_CH1 + index), index + 1); + lv_label_set_text_fmt(source, "%s\n" TR_CH "%u", getSourceString(MIXSRC_FIRST_CH + index), index + 1); } else { lv_obj_set_style_text_font(source, getFont(FONT(STD)), 0); - lv_label_set_text(source, getSourceString(MIXSRC_CH1 + index)); + lv_label_set_text(source, getSourceString(MIXSRC_FIRST_CH + index)); } if (output->revert) { lv_obj_clear_flag(revert, LV_OBJ_FLAG_HIDDEN); diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index 6e99eaf96..37042bb8f 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -667,18 +667,18 @@ ModelLabelsWindow::ModelLabelsWindow() : Page(ICON_MODEL) void ModelLabelsWindow::onEvent(event_t event) { #if defined(KEYS_GPIO_REG_PGUP) - if (event == EVT_KEY_BREAK(KEY_PGUP) || - event == EVT_KEY_BREAK(KEY_PGDN)) { + if (event == EVT_KEY_BREAK(KEY_PAGEUP) || + event == EVT_KEY_BREAK(KEY_PAGEDN)) { #else - if (event == EVT_KEY_LONG(KEY_PGDN) || - event == EVT_KEY_BREAK(KEY_PGDN)) { + if (event == EVT_KEY_LONG(KEY_PAGEDN) || + event == EVT_KEY_BREAK(KEY_PAGEDN)) { #endif std::set curSel = lblselector->getSelection(); std::set sellist; int select = 0; int rowcount = lblselector->getRowCount(); - if (event == EVT_KEY_BREAK(KEY_PGDN)) { + if (event == EVT_KEY_BREAK(KEY_PAGEDN)) { if(curSel.size()) select = (*curSel.rbegin() + 1) % rowcount; } else { diff --git a/radio/src/gui/colorlcd/model_usbjoystick.cpp b/radio/src/gui/colorlcd/model_usbjoystick.cpp index 9e3fc7839..b431cbc3f 100644 --- a/radio/src/gui/colorlcd/model_usbjoystick.cpp +++ b/radio/src/gui/colorlcd/model_usbjoystick.cpp @@ -280,7 +280,7 @@ class USBChannelEditWindow : public Page void buildHeader(Window *window) { header.setTitle(STR_USBJOYSTICK_LABEL); - header.setTitle2(getSourceString(MIXSRC_CH1 + channel)); + header.setTitle2(getSourceString(MIXSRC_FIRST_CH + channel)); statusBar = new USBChannelEditStatusBar( window, @@ -418,7 +418,7 @@ class USBChannelLineButton : public Button lv_obj_set_grid_cell(m_btns, LV_GRID_ALIGN_START, USBCH_BTN_MODE_COL+1, 1, LV_GRID_ALIGN_CENTER, USBCH_BTN_MODE_ROW, 1); - lv_label_set_text(m_chn, getSourceString(MIXSRC_CH1 + index)); + lv_label_set_text(m_chn, getSourceString(MIXSRC_FIRST_CH + index)); lv_label_set_text(m_mode, ""); lv_label_set_text(m_param, ""); lv_label_set_text(m_btn_mode, ""); diff --git a/radio/src/gui/colorlcd/output_edit.cpp b/radio/src/gui/colorlcd/output_edit.cpp index e560c2b59..66d040a7a 100644 --- a/radio/src/gui/colorlcd/output_edit.cpp +++ b/radio/src/gui/colorlcd/output_edit.cpp @@ -62,7 +62,7 @@ class OutputEditStatusBar : public Window OutputEditWindow::OutputEditWindow(uint8_t channel) : Page(ICON_MODEL_OUTPUTS), channel(channel) { - std::string title2(getSourceString(MIXSRC_CH1 + channel)); + std::string title2(getSourceString(MIXSRC_FIRST_CH + channel)); header.setTitle(STR_MENULIMITS); header.setTitle2(title2); diff --git a/radio/src/gui/colorlcd/popups.cpp b/radio/src/gui/colorlcd/popups.cpp index 1e7ebe1b7..878d806a5 100644 --- a/radio/src/gui/colorlcd/popups.cpp +++ b/radio/src/gui/colorlcd/popups.cpp @@ -23,6 +23,8 @@ #include "libopenui.h" #include "pwr.h" +#include "watchdog_driver.h" + static void _run_popup_dialog(const char* title, const char* msg, const char* info = nullptr) { diff --git a/radio/src/gui/colorlcd/preflight_checks.cpp b/radio/src/gui/colorlcd/preflight_checks.cpp index 4875e9c36..2b2a5c306 100644 --- a/radio/src/gui/colorlcd/preflight_checks.cpp +++ b/radio/src/gui/colorlcd/preflight_checks.cpp @@ -23,6 +23,10 @@ #include "button_matrix.h" #include "opentx.h" +#include "hal/adc_driver.h" +#include "hal/switch_driver.h" +#include "strhelpers.h" + #define SET_DIRTY() storageDirty(EE_MODEL) static const lv_coord_t line_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), @@ -79,7 +83,7 @@ struct SwitchWarnMatrix : public ButtonMatrix { bool isActive(uint8_t btn_id); void setTextWithColor(uint8_t btn_id); private: - uint8_t sw_idx[NUM_SWITCHES]; + uint8_t sw_idx[MAX_SWITCHES]; }; struct PotWarnMatrix : public ButtonMatrix { @@ -88,7 +92,7 @@ struct PotWarnMatrix : public ButtonMatrix { bool isActive(uint8_t btn_id); void setTextWithColor(uint8_t btn_id); private: - uint8_t pot_idx[NUM_POTS + NUM_SLIDERS]; + uint8_t pot_idx[MAX_POTS]; }; struct CenterBeepsMatrix : public ButtonMatrix { @@ -97,7 +101,8 @@ struct CenterBeepsMatrix : public ButtonMatrix { bool isActive(uint8_t btn_id); void setTextWithColor(uint8_t btn_id); private: - uint8_t ana_idx[NUM_STICKS + NUM_POTS + NUM_SLIDERS]; + uint8_t max_analogs; + uint8_t ana_idx[MAX_ANALOG_INPUTS]; }; PreflightChecks::PreflightChecks() : Page(ICON_MODEL_SETUP) @@ -145,19 +150,18 @@ PreflightChecks::PreflightChecks() : Page(ICON_MODEL_SETUP) new SwitchWarnMatrix(line, rect_t{}); // Pots and sliders warning -#if NUM_POTS + NUM_SLIDERS - line = form->newLine(&grid); - new StaticText(line, rect_t{}, STR_POTWARNINGSTATE, 0, COLOR_THEME_PRIMARY1); - auto pots_wm = new Choice(line, rect_t{}, STR_PREFLIGHT_POTSLIDER_CHECK, 0, 2, - GET_SET_DEFAULT(g_model.potsWarnMode)); -#if (NUM_POTS) - // Pot warnings - line = form->newLine(&grid); - line->padTop(0); - auto pwm = new PotWarnMatrix(line, rect_t{}); - make_conditional(pwm, pots_wm); -#endif -#endif + if (adcGetMaxInputs(ADC_INPUT_POT) > 0) { + line = form->newLine(&grid); + new StaticText(line, rect_t{}, STR_POTWARNINGSTATE, 0, COLOR_THEME_PRIMARY1); + auto pots_wm = new Choice(line, rect_t{}, {STR_PREFLIGHT_POTSLIDER_CHECK}, 0, 2, + GET_SET_DEFAULT(g_model.potsWarnMode)); + + // Pot warnings + line = form->newLine(&grid); + line->padTop(0); + auto pwm = new PotWarnMatrix(line, rect_t{}); + make_conditional(pwm, pots_wm); + } // Center beeps line = form->newLine(&grid); @@ -170,8 +174,7 @@ PreflightChecks::PreflightChecks() : Page(ICON_MODEL_SETUP) static std::string switchWarninglabel(swsrc_t index) { auto warn_pos = g_model.switchWarningState >> (3 * index) & 0x07; - return TEXT_AT_INDEX(STR_VSRCRAW, - (index + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1)) + + return std::string(switchGetName(index)) + std::string(getSwitchWarnSymbol(warn_pos)); } @@ -187,7 +190,7 @@ SwitchWarnMatrix::SwitchWarnMatrix(Window* parent, const rect_t& r) : { // Setup button layout & texts uint8_t btn_cnt = 0; - for (uint8_t i = 0; i < NUM_SWITCHES; i++) { + for (uint8_t i = 0; i < MAX_SWITCHES; i++) { if (SWITCH_EXISTS(i)) { sw_idx[btn_cnt] = i; btn_cnt++; @@ -198,7 +201,7 @@ SwitchWarnMatrix::SwitchWarnMatrix(Window* parent, const rect_t& r) : update(); uint8_t btn_id = 0; - for (uint8_t i = 0; i < NUM_SWITCHES; i++) { + for (uint8_t i = 0; i < MAX_SWITCHES; i++) { if (SWITCH_EXISTS(i)) { lv_btnmatrix_set_btn_ctrl(lvobj, btn_id, LV_BTNMATRIX_CTRL_RECOLOR); setTextWithColor(i); @@ -225,12 +228,13 @@ SwitchWarnMatrix::SwitchWarnMatrix(Window* parent, const rect_t& r) : void SwitchWarnMatrix::setTextWithColor(uint8_t btn_id) { - setText(btn_id, makeRecolor(switchWarninglabel(sw_idx[btn_id]), isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1).c_str()); + auto color = isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1; + setText(btn_id, makeRecolor(switchWarninglabel(sw_idx[btn_id]), color).c_str()); } void SwitchWarnMatrix::onPress(uint8_t btn_id) { - if (btn_id >= NUM_SWITCHES) return; + if (btn_id >= MAX_SWITCHES) return; auto sw = sw_idx[btn_id]; swarnstate_t newstate = bfGet(g_model.switchWarningState, 3 * sw, 3); @@ -249,7 +253,7 @@ void SwitchWarnMatrix::onPress(uint8_t btn_id) bool SwitchWarnMatrix::isActive(uint8_t btn_id) { - if (btn_id >= NUM_SWITCHES) return false; + if (btn_id >= MAX_SWITCHES) return false; return bfGet(g_model.switchWarningState, 3 * sw_idx[btn_id], 3) != 0; } @@ -258,16 +262,9 @@ PotWarnMatrix::PotWarnMatrix(Window* parent, const rect_t& r) : { // Setup button layout & texts uint8_t btn_cnt = 0; - for (uint8_t i = POT_FIRST; i <= POT_LAST; i++) { - if ((IS_POT(i) || IS_POT_MULTIPOS(i)) && IS_POT_AVAILABLE(i)) { - pot_idx[btn_cnt] = i - POT_FIRST; - btn_cnt++; - } - } - - for (int8_t i = SLIDER_FIRST; i <= SLIDER_LAST; i++) { - if (IS_SLIDER(i)) { - pot_idx[btn_cnt] = i - POT_FIRST; + for (uint8_t i = 0; i <= MAX_POTS; i++) { + if (IS_POT_AVAILABLE(i)) { + pot_idx[btn_cnt] = i; btn_cnt++; } } @@ -276,15 +273,8 @@ PotWarnMatrix::PotWarnMatrix(Window* parent, const rect_t& r) : update(); uint8_t btn_id = 0; - for (uint16_t i = POT_FIRST; i <= POT_LAST; i++) { - if ((IS_POT(i) || IS_POT_MULTIPOS(i)) && IS_POT_AVAILABLE(i)) { - lv_btnmatrix_set_btn_ctrl(lvobj, btn_id, LV_BTNMATRIX_CTRL_RECOLOR); - setTextWithColor(btn_id); - btn_id++; - } - } - for (int8_t i = SLIDER_FIRST; i <= SLIDER_LAST; i++) { - if (IS_SLIDER(i)) { + for (uint16_t i = 0; i <= MAX_POTS; i++) { + if (IS_POT_AVAILABLE(i)) { lv_btnmatrix_set_btn_ctrl(lvobj, btn_id, LV_BTNMATRIX_CTRL_RECOLOR); setTextWithColor(btn_id); btn_id++; @@ -310,12 +300,14 @@ PotWarnMatrix::PotWarnMatrix(Window* parent, const rect_t& r) : void PotWarnMatrix::setTextWithColor(uint8_t btn_id) { - setText(btn_id, makeRecolor(STR_VSRCRAW[pot_idx[btn_id] + POT_FIRST + 1], isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1).c_str()); + auto idx = pot_idx[btn_id]; + auto color = isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1; + setText(btn_id, makeRecolor(getPotLabel(idx), color).c_str()); } void PotWarnMatrix::onPress(uint8_t btn_id) { - if (btn_id >= NUM_POTS + NUM_SLIDERS) return; + if (btn_id >= MAX_POTS) return; auto pot = pot_idx[btn_id]; g_model.potsWarnEnabled ^= (1 << pot); @@ -329,7 +321,7 @@ void PotWarnMatrix::onPress(uint8_t btn_id) bool PotWarnMatrix::isActive(uint8_t btn_id) { - if (btn_id >= NUM_POTS + NUM_SLIDERS) return false; + if (btn_id >= MAX_POTS) return false; return (g_model.potsWarnEnabled & (1 << pot_idx[btn_id])) != 0; } @@ -338,9 +330,15 @@ CenterBeepsMatrix::CenterBeepsMatrix(Window* parent, const rect_t& r) : { // Setup button layout & texts uint8_t btn_cnt = 0; - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) { + + auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN); + auto max_pots = adcGetMaxInputs(ADC_INPUT_POT); + max_analogs = max_sticks + max_pots; + + for (uint8_t i = 0; i < max_analogs; i++) { // multipos cannot be centered - if (i < NUM_STICKS || (IS_POT_SLIDER_AVAILABLE(i) && !IS_POT_MULTIPOS(i))) { + if (i < max_sticks || (IS_POT_SLIDER_AVAILABLE(i - max_sticks) && + !IS_POT_MULTIPOS(i - max_sticks))) { ana_idx[btn_cnt] = i; btn_cnt++; } @@ -350,8 +348,9 @@ CenterBeepsMatrix::CenterBeepsMatrix(Window* parent, const rect_t& r) : update(); uint8_t btn_id = 0; - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) { - if (i < NUM_STICKS || (IS_POT_SLIDER_AVAILABLE(i) && !IS_POT_MULTIPOS(i))) { + for (uint8_t i = 0; i < max_analogs; i++) { + if (i < max_sticks || (IS_POT_SLIDER_AVAILABLE(i - max_sticks) && + !IS_POT_MULTIPOS(i - max_sticks))) { lv_btnmatrix_set_btn_ctrl(lvobj, btn_id, LV_BTNMATRIX_CTRL_RECOLOR); setTextWithColor(btn_id); btn_id++; @@ -377,15 +376,15 @@ CenterBeepsMatrix::CenterBeepsMatrix(Window* parent, const rect_t& r) : void CenterBeepsMatrix::setTextWithColor(uint8_t btn_id) { - if (btn_id < NUM_STICKS) - setText(btn_id, makeRecolor(STR_RETA123[ana_idx[btn_id]], isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1).c_str()); - else - setText(btn_id, makeRecolor(STR_VSRCRAW[ana_idx[btn_id] + 1], isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1).c_str()); + setText(btn_id, makeRecolor(getAnalogShortLabel(ana_idx[btn_id]), + isActive(btn_id) ? COLOR_THEME_PRIMARY1 + : COLOR_THEME_SECONDARY1) + .c_str()); } void CenterBeepsMatrix::onPress(uint8_t btn_id) { - if (btn_id >= NUM_STICKS + NUM_POTS + NUM_SLIDERS) return; + if (btn_id >= max_analogs) return; uint8_t i = ana_idx[btn_id]; BFBIT_FLIP(g_model.beepANACenter, bfBit(i)); setTextWithColor(btn_id); @@ -394,7 +393,7 @@ void CenterBeepsMatrix::onPress(uint8_t btn_id) bool CenterBeepsMatrix::isActive(uint8_t btn_id) { - if (btn_id >= NUM_STICKS + NUM_POTS + NUM_SLIDERS) return false; + if (btn_id >= max_analogs) return false; uint8_t i = ana_idx[btn_id]; return bfSingleBitGet(g_model.beepANACenter, i) != 0; } diff --git a/radio/src/gui/colorlcd/radio_calibration.cpp b/radio/src/gui/colorlcd/radio_calibration.cpp index 4aec22dcc..df09a6399 100644 --- a/radio/src/gui/colorlcd/radio_calibration.cpp +++ b/radio/src/gui/colorlcd/radio_calibration.cpp @@ -45,8 +45,8 @@ class StickCalibrationWindow: public Window { void paint(BitmapBuffer * dc) override { dc->drawBitmap(0, 0, calibStickBackground); - int16_t x = calibratedAnalogs[CONVERT_MODE(stickX)]; - int16_t y = calibratedAnalogs[CONVERT_MODE(stickY)]; + int16_t x = calibratedAnalogs[stickX]; + int16_t y = calibratedAnalogs[stickY]; dc->drawBitmap(width() / 2 - 9 + (bitmapSize / 2 * x) / RESX, height() / 2 - 9 - (bitmapSize / 2 * y) / RESX, calibStick); @@ -78,13 +78,15 @@ void RadioCalibrationPage::buildBody(FormWindow * window) // The two sticks //TODO: dynamic placing - new StickCalibrationWindow(window, - {window->width() / 3, window->height() / 2, 0, 0}, - STICK1, STICK2); + new StickCalibrationWindow( + window, {window->width() / 3, window->height() / 2, 0, 0}, 0, 1); - new StickCalibrationWindow(window, - {(2 * window->width()) / 3, window->height() / 2, 0, 0}, - STICK4, STICK3); + auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN); + if (max_sticks > 2) { + new StickCalibrationWindow( + window, {(2 * window->width()) / 3, window->height() / 2, 0, 0}, 3, + 2); + } std::unique_ptr deco(new ViewMainDecoration(window)); deco->setTrimsVisible(false); @@ -104,100 +106,15 @@ void RadioCalibrationPage::checkEvents() { Page::checkEvents(); - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_MOUSE_ANALOGS; i++) { // get low and high vals for sticks and trims - int16_t vt = i < TX_VOLTAGE ? anaIn(i) : anaIn(i + 1); - reusableBuffer.calib.loVals[i] = min(vt, reusableBuffer.calib.loVals[i]); - reusableBuffer.calib.hiVals[i] = max(vt, reusableBuffer.calib.hiVals[i]); - if (i >= POT1 && i <= POT_LAST) { - if (IS_POT_WITHOUT_DETENT(i)) { - reusableBuffer.calib.midVals[i] = (reusableBuffer.calib.hiVals[i] + reusableBuffer.calib.loVals[i]) / 2; - } -#if NUM_XPOTS > 0 - uint8_t idx = i - POT1; - int count = reusableBuffer.calib.xpotsCalib[idx].stepsCount; - if (IS_POT_MULTIPOS(i) && count <= XPOTS_MULTIPOS_COUNT) { - // use raw analog value for multipos calibraton, anaIn() already has multipos decoded value - vt = getAnalogValue(i) >> 1; - if (reusableBuffer.calib.xpotsCalib[idx].lastCount == 0 || vt < reusableBuffer.calib.xpotsCalib[idx].lastPosition - XPOT_DELTA || - vt > reusableBuffer.calib.xpotsCalib[idx].lastPosition + XPOT_DELTA) { - reusableBuffer.calib.xpotsCalib[idx].lastPosition = vt; - reusableBuffer.calib.xpotsCalib[idx].lastCount = 1; - } - else { - if (reusableBuffer.calib.xpotsCalib[idx].lastCount < 255) { - reusableBuffer.calib.xpotsCalib[idx].lastCount++; - } - } - if (reusableBuffer.calib.xpotsCalib[idx].lastCount == XPOT_DELAY) { - int16_t position = reusableBuffer.calib.xpotsCalib[idx].lastPosition; - bool found = false; - for (int j = 0; j < count; j++) { - int16_t step = reusableBuffer.calib.xpotsCalib[idx].steps[j]; - if (position >= step - XPOT_DELTA && position <= step + XPOT_DELTA) { - found = true; - break; - } - } - if (!found) { - if (count < XPOTS_MULTIPOS_COUNT) { - reusableBuffer.calib.xpotsCalib[idx].steps[count] = position; - } - reusableBuffer.calib.xpotsCalib[idx].stepsCount += 1; - } - } - } -#endif - } - } + // Get min / max values + adcCalibMinMax(); if (menuCalibrationState == CALIB_SET_MIDPOINT) { - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_MOUSE_ANALOGS; i++) { - reusableBuffer.calib.loVals[i] = 15000; - reusableBuffer.calib.hiVals[i] = -15000; - reusableBuffer.calib.midVals[i] = i < TX_VOLTAGE ? anaIn(i) : anaIn(i + 1); -#if NUM_XPOTS > 0 - if (i < NUM_XPOTS) { - reusableBuffer.calib.xpotsCalib[i].stepsCount = 0; - reusableBuffer.calib.xpotsCalib[i].lastCount = 0; - } -#endif - } + adcCalibSetMidPoint(); } else if (menuCalibrationState == CALIB_MOVE_STICKS) { - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_MOUSE_ANALOGS; i++) { - if (abs(reusableBuffer.calib.loVals[i] - reusableBuffer.calib.hiVals[i]) > 50) { - g_eeGeneral.calib[i].mid = reusableBuffer.calib.midVals[i]; - int16_t v = reusableBuffer.calib.midVals[i] - reusableBuffer.calib.loVals[i]; - g_eeGeneral.calib[i].spanNeg = v - v / STICK_TOLERANCE; - v = reusableBuffer.calib.hiVals[i] - reusableBuffer.calib.midVals[i]; - g_eeGeneral.calib[i].spanPos = v - v / STICK_TOLERANCE; - } - } -#if NUM_XPOTS > 0 - for (int i = POT1; i <= POT_LAST; i++) { - int idx = i - POT1; - int count = reusableBuffer.calib.xpotsCalib[idx].stepsCount; - if (IS_POT_MULTIPOS(i)) { - if (count > 1 && count <= XPOTS_MULTIPOS_COUNT) { - for (int j = 0; j < count; j++) { - for (int k = j + 1; k < count; k++) { - if (reusableBuffer.calib.xpotsCalib[idx].steps[k] < reusableBuffer.calib.xpotsCalib[idx].steps[j]) { - SWAP(reusableBuffer.calib.xpotsCalib[idx].steps[j], reusableBuffer.calib.xpotsCalib[idx].steps[k]); - } - } - } - StepsCalibData * calib = (StepsCalibData *) &g_eeGeneral.calib[i]; - calib->count = count - 1; - for (int j = 0; j < calib->count; j++) { - calib->steps[j] = (reusableBuffer.calib.xpotsCalib[idx].steps[j + 1] + reusableBuffer.calib.xpotsCalib[idx].steps[j]) >> 5; - } - } - else { - // g_eeGeneral.potsConfig &= ~(0x03<<(2*idx)); - } - } - } -#endif + adcCalibSetMinMax(); + adcCalibSetXPot(); } } @@ -235,8 +152,7 @@ void RadioCalibrationPage::nextStep() case CALIB_STORE: text->setText(STR_CALIB_DONE); - g_eeGeneral.chkSum = evalChkSum(); - storageDirty(EE_GENERAL); + adcCalibStore(); menuCalibrationState = CALIB_FINISHED; // initial calibration completed diff --git a/radio/src/gui/colorlcd/radio_diaganas.cpp b/radio/src/gui/colorlcd/radio_diaganas.cpp index 7b845db04..5f478e08a 100644 --- a/radio/src/gui/colorlcd/radio_diaganas.cpp +++ b/radio/src/gui/colorlcd/radio_diaganas.cpp @@ -22,16 +22,12 @@ #include "opentx.h" #include "radio_diaganas.h" #include "libopenui.h" -#include "../../hal/adc_driver.h" +#include "hal/adc_driver.h" // #if defined(IMU_LSM6DS33) // #include "imu_lsm6ds33.h" // #endif -#if defined(FLYSKY_GIMBAL) - #include "flysky_gimbal_driver.h" -#endif - #define STATSDEPTH 8 // ideally a value of power of 2 #if LCD_W > LCD_H @@ -74,7 +70,10 @@ class AnaViewWindow: public FormWindow { { char s[10]; - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) { + auto max_inputs = adcGetMaxInputs(ADC_INPUT_MAIN) + + adcGetMaxInputs(ADC_INPUT_POT); + + for (uint8_t i = 0; i < max_inputs; i++) { #if LCD_W > LCD_H if ((i & 1) == 0) line = newLine(grid); @@ -88,7 +87,7 @@ class AnaViewWindow: public FormWindow { new StaticText(line, rect_t{}, s, COLOR_THEME_PRIMARY1); auto lbl = new DynamicText(line, rect_t{}, [=]() { - return std::to_string((int16_t)calibratedAnalogs[CONVERT_MODE(i)] * 25 / 256); + return std::to_string((int16_t)calibratedAnalogs[i] * 25 / 256); }, COLOR_THEME_PRIMARY1); lv_obj_set_style_text_align(lbl->getLvObj(), LV_TEXT_ALIGN_RIGHT, 0); @@ -209,14 +208,7 @@ class AnaCalibratedViewWindow: public AnaViewWindow { protected: int16_t column3(int i) override { -#if !defined(SIMU) && defined(FLYSKY_GIMBAL) - if (globalData.flyskygimbals && (i < FLYSKY_HALL_CHANNEL_COUNT)) - return hall_raw_values[i]; - else - return anaIn(i); -#else return anaIn(i); -#endif } }; @@ -301,24 +293,11 @@ class AnaFilteredDevViewWindow: public AnaViewWindow { } }; - Stats stats[NUM_STICKS+NUM_POTS+NUM_SLIDERS]; + Stats stats[MAX_CALIB_ANALOG_INPUTS]; int16_t column3(int i) override { - extern uint32_t s_anaFilt[NUM_ANALOGS]; - -#if !defined(SIMU) && defined(FLYSKY_GIMBAL) - if (globalData.flyskygimbals && (i < FLYSKY_HALL_CHANNEL_COUNT)) - return hall_raw_values[i]; - else - return s_anaFilt[i]/JITTER_ALPHA; -#else -#if !defined(SIMU) - return s_anaFilt[i]/JITTER_ALPHA; -#else - return anaIn(i); -#endif -#endif + return anaIn_diag(i); } const char* column4prefix() override { return "+/- "; } @@ -333,21 +312,20 @@ class AnaFilteredDevViewWindow: public AnaViewWindow { AnaFilteredDevViewWindow(Window * parent): AnaViewWindow(parent) { - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) + auto max_inputs = adcGetMaxInputs(ADC_INPUT_MAIN) + + adcGetMaxInputs(ADC_INPUT_POT); + + for (uint8_t i = 0; i < max_inputs; i++) stats[i].clear(); } void checkEvents() override { - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) { -#if !defined(SIMU) && defined(FLYSKY_GIMBAL) - if (globalData.flyskygimbals && (i < FLYSKY_HALL_CHANNEL_COUNT)) - stats[i].write(hall_raw_values[i]); - else - stats[i].write(getAnalogValue(i)); -#else + auto max_inputs = adcGetMaxInputs(ADC_INPUT_MAIN) + + adcGetMaxInputs(ADC_INPUT_POT); + + for (uint8_t i = 0; i < max_inputs; i++) { stats[i].write(getAnalogValue(i)); -#endif } AnaViewWindow::checkEvents(); } @@ -363,14 +341,7 @@ class AnaUnfilteredRawViewWindow: public AnaViewWindow { protected: int16_t column3(int i) override { -#if !defined(SIMU) && defined(FLYSKY_GIMBAL) - if (globalData.flyskygimbals && (i < FLYSKY_HALL_CHANNEL_COUNT)) - return hall_raw_values[i]; - else - return getAnalogValue(i); -#else return getAnalogValue(i); -#endif } }; @@ -419,7 +390,7 @@ class AnaMinMaxViewWindow: public AnaViewWindow { } }; - MinMax minmax[NUM_STICKS+NUM_POTS+NUM_SLIDERS]; + MinMax minmax[MAX_CALIB_ANALOG_INPUTS]; int16_t column3(int i) override { @@ -444,7 +415,10 @@ class AnaMinMaxViewWindow: public AnaViewWindow { AnaMinMaxViewWindow(Window * parent): AnaViewWindow(parent) { - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) + auto max_inputs = adcGetMaxInputs(ADC_INPUT_MAIN) + + adcGetMaxInputs(ADC_INPUT_POT); + + for (uint8_t i = 0; i < max_inputs; i++) minmax[i].clear(); } @@ -459,15 +433,11 @@ class AnaMinMaxViewWindow: public AnaViewWindow { void checkEvents() override { - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) { -#if !defined(SIMU) && defined(FLYSKY_GIMBAL) - if (globalData.flyskygimbals && (i < FLYSKY_HALL_CHANNEL_COUNT)) - minmax[i].write(hall_raw_values[i]); - else - minmax[i].write(getAnalogValue(i)); -#else + auto max_inputs = adcGetMaxInputs(ADC_INPUT_MAIN) + + adcGetMaxInputs(ADC_INPUT_POT); + + for (uint8_t i = 0; i < max_inputs; i++) { minmax[i].write(getAnalogValue(i)); -#endif } AnaViewWindow::checkEvents(); } diff --git a/radio/src/gui/colorlcd/radio_diagkeys.cpp b/radio/src/gui/colorlcd/radio_diagkeys.cpp index 4a9d254b7..4d953758d 100644 --- a/radio/src/gui/colorlcd/radio_diagkeys.cpp +++ b/radio/src/gui/colorlcd/radio_diagkeys.cpp @@ -23,11 +23,21 @@ #include "radio_diagkeys.h" #include "libopenui.h" -#if defined(KEYS_GPIO_PIN_PGUP) -constexpr uint8_t KEY_START = 0; -#else -constexpr uint8_t KEY_START = 1; -#endif +#include "hal/rotary_encoder.h" + +static EnumKeys get_ith_key(uint8_t i) +{ + auto supported_keys = keysGetSupported(); + for (uint8_t k = 0; k < MAX_KEYS; k++) { + if (supported_keys & (1 << k)) { + if (i-- == 0) return (EnumKeys)k; + } + } + + // should not get here, + // we assume: i < keysGetMaxKeys() + return (EnumKeys)0; +} class RadioKeyDiagsWindow : public Window { @@ -45,7 +55,7 @@ class RadioKeyDiagsWindow : public Window void displayKeyState(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t key) { - uint8_t t = keys[key].state(); + uint8_t t = keysGetState(key); // TODO use drawChar when done char status[2]; status[0] = t + '0'; @@ -73,29 +83,31 @@ class RadioKeyDiagsWindow : public Window #if !defined(PCBNV14) // KEYS - for (uint8_t i = KEY_START; i <= 6; i++) { - coord_t y = 1 + FH * (i - KEY_START); - dc->drawTextAtIndex(KEY_COLUMN, y, STR_VKEYS, i, COLOR_THEME_PRIMARY1); + coord_t y = 1; + for (uint8_t i = 0; i < keysGetMaxKeys(); i++) { + auto k = get_ith_key(i); + y += FH; + dc->drawText(KEY_COLUMN, y, keysGetLabel(k), COLOR_THEME_PRIMARY1); displayKeyState(dc, 70, y, i); } #if defined(ROTARY_ENCODER_NAVIGATION) - coord_t y = FH * (8 - KEY_START); + y += FH; dc->drawText(KEY_COLUMN, y, STR_ROTARY_ENCODER, COLOR_THEME_PRIMARY1); - dc->drawNumber(70, y, rotencValue, COLOR_THEME_PRIMARY1); + dc->drawNumber(70, y, rotaryEncoderGetValue(), COLOR_THEME_PRIMARY1); #endif #else // defined(PCBNV14) // KEYS { coord_t y = 1; - dc->drawTextAtIndex(KEY_COLUMN, y, STR_VKEYS, KEY_ENTER, COLOR_THEME_PRIMARY1); + dc->drawText(KEY_COLUMN, y, keysGetLabel(KEY_ENTER), COLOR_THEME_PRIMARY1); displayKeyState(dc, 70, y, KEY_ENTER); y += FH; - dc->drawTextAtIndex(KEY_COLUMN, y, STR_VKEYS, KEY_EXIT, COLOR_THEME_PRIMARY1); + dc->drawText(KEY_COLUMN, y, keysGetLabel(KEY_EXIT), COLOR_THEME_PRIMARY1); displayKeyState(dc, 70, y, KEY_EXIT); } #endif // SWITCHES - for (uint8_t i = 0; i < NUM_SWITCHES; i++) { + for (uint8_t i = 0; i < MAX_SWITCHES; i++) { if (SWITCH_EXISTS(i)) { coord_t y = 1 + FH * i; getvalue_t val = getValue(MIXSRC_FIRST_SWITCH + i); @@ -105,18 +117,18 @@ class RadioKeyDiagsWindow : public Window } // TRIMS - for (uint8_t i = 0; i < NUM_TRIMS_KEYS; i++) { -#if NUM_TRIMS_KEYS == 12 - const uint8_t trimMap[NUM_TRIMS_KEYS] = {6, 7, 4, 5, 2, 3, 0, 1, 8, 9, 10, 11}; + for (uint8_t i = 0; i < MAX_TRIMS * 2; i++) { +#if MAX_TRIMS * 2 == 12 + const uint8_t trimMap[MAX_TRIMS * 2] = {6, 7, 4, 5, 2, 3, 0, 1, 8, 9, 10, 11}; #else - const uint8_t trimMap[NUM_TRIMS_KEYS] = {6, 7, 4, 5, 2, 3, 0, 1}; + const uint8_t trimMap[MAX_TRIMS * 2] = {6, 7, 4, 5, 2, 3, 0, 1}; #endif coord_t y = 1 + FH + FH * (i / 2); if (i & 1) { dc->drawText(TRIM_COLUMN, y, "T", COLOR_THEME_PRIMARY1); dc->drawNumber(TRIM_COLUMN + 10, y, i / 2 + 1, COLOR_THEME_PRIMARY1); } - displayKeyState(dc, i & 1 ? TRIM_PLUS_COLUMN : TRIM_MINUS_COLUMN, y, TRM_BASE + trimMap[i]); + // displayKeyState(dc, i & 1 ? TRIM_PLUS_COLUMN : TRIM_MINUS_COLUMN, y, TRM_BASE + trimMap[i]); } }; diff --git a/radio/src/gui/colorlcd/radio_hardware.cpp b/radio/src/gui/colorlcd/radio_hardware.cpp index 31afeed67..a20fe08d6 100644 --- a/radio/src/gui/colorlcd/radio_hardware.cpp +++ b/radio/src/gui/colorlcd/radio_hardware.cpp @@ -48,6 +48,11 @@ RadioHardwarePage::RadioHardwarePage(): { } +void RadioHardwarePage::checkEvents() +{ + enableVBatBridge(); +} + void RadioHardwarePage::build(FormWindow * window) { window->setFlexLayout(LV_FLEX_FLOW_COLUMN, 0); @@ -163,16 +168,10 @@ void RadioHardwarePage::build(FormWindow * window) auto btn = makeHWInputButton(box, STR_STICKS); lv_obj_set_style_min_width(btn->getLvObj(), LV_DPI_DEF, 0); - // Pots + // Pots & Sliders btn = makeHWInputButton(box, STR_POTS); lv_obj_set_style_min_width(btn->getLvObj(), LV_DPI_DEF, 0); - // Sliders -#if (NUM_SLIDERS > 0) - btn = makeHWInputButton(box, STR_SLIDERS); - lv_obj_set_style_min_width(btn->getLvObj(), LV_DPI_DEF, 0); -#endif - // Switches btn = makeHWInputButton(box, STR_SWITCHES); lv_obj_set_style_min_width(btn->getLvObj(), LV_DPI_DEF, 0); diff --git a/radio/src/gui/colorlcd/radio_hardware.h b/radio/src/gui/colorlcd/radio_hardware.h index 0401b9ec9..d000e942d 100644 --- a/radio/src/gui/colorlcd/radio_hardware.h +++ b/radio/src/gui/colorlcd/radio_hardware.h @@ -24,11 +24,14 @@ #include "tabsgroup.h" -class RadioHardwarePage: public PageTab { - public: - RadioHardwarePage(); +class RadioHardwarePage : public PageTab +{ + void checkEvents() override; - void build(FormWindow * window) override; + public: + RadioHardwarePage(); + + void build(FormWindow* window) override; }; #endif //_RADIO_HARDWARE_H_ diff --git a/radio/src/gui/colorlcd/radio_setup.cpp b/radio/src/gui/colorlcd/radio_setup.cpp index 447d9c6e3..43d9412bf 100644 --- a/radio/src/gui/colorlcd/radio_setup.cpp +++ b/radio/src/gui/colorlcd/radio_setup.cpp @@ -24,8 +24,10 @@ #include "radio_setup.h" #include "opentx.h" #include "libopenui.h" +#include "input_mapping.h" #include "tasks/mixer_task.h" +#include "hal/adc_driver.h" #define SET_DIRTY() storageDirty(EE_GENERAL) @@ -781,12 +783,16 @@ void RadioSetupPage::build(FormWindow * window) line = window->newLine(&grid); new StaticText(line, rect_t{}, STR_DEF_CHAN_ORD, 0, COLOR_THEME_PRIMARY1); // RAET->AETR - choice = new Choice(line, rect_t{}, 0, 4 * 3 * 2 - 1, + + uint8_t mains = adcGetMaxInputs(ADC_INPUT_MAIN); + auto max_order = inputMappingGetMaxChannelOrder() - 1; + choice = new Choice(line, rect_t{}, 0, max_order, GET_SET_DEFAULT(g_eeGeneral.templateSetup)); - choice->setTextHandler([](uint8_t value) { + + choice->setTextHandler([=](uint8_t value) { std::string s; - for (uint8_t i = 0; i < 4; i++) { - s += STR_RETA123[channelOrder(value, i + 1) - 1]; + for (uint8_t i = 0; i < mains; i++) { + s += getAnalogShortLabel(inputMappingChannelOrder(value, i)); } return s; }); @@ -803,11 +809,11 @@ void RadioSetupPage::build(FormWindow * window) mixerTaskStart(); }); choice->setTextHandler([](uint8_t value) { + auto stick0 = inputMappingConvertMode(value, 0); + auto stick1 = inputMappingConvertMode(value, 1); return std::to_string(1 + value) + ": " + STR_LEFT_STICK + " = " + - std::string(&getSourceString(MIXSRC_Rud + modn12x3[4 * value])[1]) + - "+" + - std::string( - &getSourceString(MIXSRC_Rud + modn12x3[4 * value + 1])[1]); + std::string(getMainControlLabel(stick0)) + "+" + + std::string(getMainControlLabel(stick1)); }); // Model quick select diff --git a/radio/src/gui/colorlcd/radio_trainer.cpp b/radio/src/gui/colorlcd/radio_trainer.cpp index 802ceccf3..cfcc60a4c 100644 --- a/radio/src/gui/colorlcd/radio_trainer.cpp +++ b/radio/src/gui/colorlcd/radio_trainer.cpp @@ -22,6 +22,10 @@ #include "radio_trainer.h" #include "opentx.h" #include "libopenui.h" +#include "input_mapping.h" + +#include "hal/adc_driver.h" +#include "strhelpers.h" #define SET_DIRTY() storageDirty(EE_GENERAL) @@ -59,13 +63,13 @@ void RadioTrainerPage::build(FormWindow * form) form->padRight(8); #endif - for (uint8_t i = 0; i < NUM_STICKS; i++) { - uint8_t chan = channelOrder(i + 1); - TrainerMix* td = &g_eeGeneral.trainer.mix[chan - 1]; + auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN); + for (uint8_t i = 0; i < max_sticks; i++) { + uint8_t chan = inputMappingChannelOrder(i); + TrainerMix* td = &g_eeGeneral.trainer.mix[chan]; auto line = form->newLine(&grid); - - new StaticText(line, rect_t{}, STR_VSRCRAW[chan], 0, COLOR_THEME_PRIMARY1); + new StaticText(line, rect_t{}, getMainControlLabel(chan), 0, COLOR_THEME_PRIMARY1); new Choice(line, rect_t{}, STR_TRNMODE, 0, 2, GET_SET_DEFAULT(td->mode)); new Choice(line, rect_t{}, STR_TRNCHN, 0, 3, GET_SET_DEFAULT(td->srcChn)); diff --git a/radio/src/gui/colorlcd/sourcechoice.cpp b/radio/src/gui/colorlcd/sourcechoice.cpp index 905925cf5..5acb43574 100644 --- a/radio/src/gui/colorlcd/sourcechoice.cpp +++ b/radio/src/gui/colorlcd/sourcechoice.cpp @@ -28,6 +28,7 @@ #include "strhelpers.h" #include "draw_functions.h" #include "opentx.h" +#include "switches.h" class SourceChoiceMenuToolbar : public MenuToolbar { diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 290ddb92c..7561aa2d6 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -25,6 +25,9 @@ #include "view_main.h" #include "lvgl_widgets/input_mix_line.h" +#include "hal/adc_driver.h" +#include "strhelpers.h" + #define SET_DIRTY() storageDirty(functions == g_model.customFn ? EE_MODEL : EE_GENERAL) static const lv_coord_t col_dsc[] = {LV_GRID_FR(2), LV_GRID_FR(3), @@ -125,17 +128,16 @@ class SpecialFunctionEditPage : public Page case FUNC_TRAINER: { new StaticText(line, rect_t{}, STR_VALUE, 0, COLOR_THEME_PRIMARY1); - auto choice = - new Choice(line, rect_t{}, 0, - NUM_STICKS + 1, GET_SET_DEFAULT(CFN_CH_INDEX(cfn))); + auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN); + auto choice = new Choice(line, rect_t{}, 0, max_sticks + 1, + GET_SET_DEFAULT(CFN_CH_INDEX(cfn))); choice->setTextHandler([=](int32_t value) { if (value == 0) return std::string(STR_STICKS); - else if (value == NUM_STICKS + 1) + else if (value == MAX_STICKS + 1) return std::string(STR_CHANS); - else - return TEXT_AT_INDEX(STR_VSRCRAW, value); - ; + + return std::string(getMainControlLabel(value)); }); break; } @@ -398,9 +400,11 @@ class SpecialFunctionEditPage : public Page line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_FUNC, 0, COLOR_THEME_PRIMARY1); auto functionChoice = - new Choice(line, rect_t{}, STR_VFSWFUNC, - 0, FUNC_MAX - 1, + new Choice(line, rect_t{}, 0, FUNC_MAX - 1, GET_DEFAULT(CFN_FUNC(cfn))); + functionChoice->setTextHandler([=](int val) { + return funcGetLabel(val); + }); functionChoice->setSetValueHandler([=](int32_t newValue) { CFN_FUNC(cfn) = newValue; CFN_RESET(cfn); @@ -560,22 +564,22 @@ class SpecialFunctionButton : public Button lv_label_set_text(sfName, s); lv_label_set_text(sfSwitch, getSwitchPositionName(CFN_SWITCH(cfn))); - strcpy(s, STR_VFSWFUNC[func]); + strcpy(s, funcGetLabel(func)); strcat(s, " - "); switch (func) { case FUNC_OVERRIDE_CHANNEL: - sprintf(s+strlen(s), "%s = %s", getSourceString(MIXSRC_CH1 + CFN_CH_INDEX(cfn)), formatNumberAsString(CFN_PARAM(cfn)).c_str()); + sprintf(s+strlen(s), "%s = %s", getSourceString(MIXSRC_FIRST_CH + CFN_CH_INDEX(cfn)), formatNumberAsString(CFN_PARAM(cfn)).c_str()); break; case FUNC_TRAINER: { int16_t value = CFN_CH_INDEX(cfn); if (value == 0) strcat(s, STR_STICKS); - else if (value == NUM_STICKS + 1) + else if (value == MAX_STICKS + 1) strcat(s, STR_CHANS); else - strcat(s, STR_VSRCRAW[value]); + strcat(s, getMainControlLabel(value - 1)); break; } @@ -646,7 +650,7 @@ class SpecialFunctionButton : public Button break; default: - strcpy(s, STR_VFSWFUNC[func]); + strcpy(s, funcGetLabel(func)); break; } diff --git a/radio/src/gui/colorlcd/switch_warn_dialog.cpp b/radio/src/gui/colorlcd/switch_warn_dialog.cpp index c93db9b2b..f6e117a64 100644 --- a/radio/src/gui/colorlcd/switch_warn_dialog.cpp +++ b/radio/src/gui/colorlcd/switch_warn_dialog.cpp @@ -72,7 +72,7 @@ void SwitchWarnDialog::checkEvents() std::string warn_txt; swarnstate_t states = g_model.switchWarningState; - for (int i = 0; i < NUM_SWITCHES; ++i) { + for (int i = 0; i < MAX_SWITCHES; ++i) { if (SWITCH_WARNING_ALLOWED(i)) { swarnstate_t mask = ((swarnstate_t)0x07 << (i*3)); if (states & mask) { @@ -86,11 +86,11 @@ void SwitchWarnDialog::checkEvents() if (g_model.potsWarnMode) { if (!warn_txt.empty()) { warn_txt += '\n'; } - for (int i = 0; i < NUM_POTS + NUM_SLIDERS; i++) { - if (!IS_POT_SLIDER_AVAILABLE(POT1 + i)) { continue; } + for (int i = 0; i < MAX_POTS; i++) { + if (!IS_POT_SLIDER_AVAILABLE(i)) { continue; } if ( (g_model.potsWarnEnabled & (1 << i))) { if (abs(g_model.potsWarnPosition[i] - GET_LOWRES_POT_POSITION(i)) > 1) { - warn_txt += STR_VSRCRAW[POT1 + i + 1]; + warn_txt += getPotLabel(i); } } } diff --git a/radio/src/gui/colorlcd/switchchoice.cpp b/radio/src/gui/colorlcd/switchchoice.cpp index 4baba4c0f..81cc81e45 100644 --- a/radio/src/gui/colorlcd/switchchoice.cpp +++ b/radio/src/gui/colorlcd/switchchoice.cpp @@ -27,6 +27,7 @@ #include "menutoolbar.h" #include "opentx.h" #include "strhelpers.h" +#include "switches.h" class SwitchChoiceMenuToolbar : public MenuToolbar { diff --git a/radio/src/gui/colorlcd/tabsgroup.cpp b/radio/src/gui/colorlcd/tabsgroup.cpp index 369e44def..a5fc4dc29 100644 --- a/radio/src/gui/colorlcd/tabsgroup.cpp +++ b/radio/src/gui/colorlcd/tabsgroup.cpp @@ -278,18 +278,18 @@ void TabsGroup::onEvent(event_t event) TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); #if defined(KEYS_GPIO_REG_PGUP) - if (event == EVT_KEY_FIRST(KEY_PGDN)) { + if (event == EVT_KEY_FIRST(KEY_PAGEDN)) { #else - if (event == EVT_KEY_BREAK(KEY_PGDN)) { + if (event == EVT_KEY_BREAK(KEY_PAGEDN)) { #endif killEvents(event); uint8_t current = header.carousel.getCurrentIndex() + 1; setCurrentTab(current >= tabs.size() ? 0 : current); } #if defined(KEYS_GPIO_REG_PGUP) - else if (event == EVT_KEY_FIRST(KEY_PGUP)) { + else if (event == EVT_KEY_FIRST(KEY_PAGEUP)) { #else - else if (event == EVT_KEY_LONG(KEY_PGDN)) { + else if (event == EVT_KEY_LONG(KEY_PAGEDN)) { #endif killEvents(event); uint8_t current = header.carousel.getCurrentIndex(); diff --git a/radio/src/gui/colorlcd/view_logical_switches.cpp b/radio/src/gui/colorlcd/view_logical_switches.cpp index 7132158d3..53a9bb4e9 100644 --- a/radio/src/gui/colorlcd/view_logical_switches.cpp +++ b/radio/src/gui/colorlcd/view_logical_switches.cpp @@ -230,7 +230,7 @@ class LogicalSwitchDisplayButton : public TextButton void checkEvents() override { - bool newvalue = getSwitch(SWSRC_SW1 + index); + bool newvalue = getSwitch(SWSRC_FIRST_LOGICAL_SWITCH + index); if (value != newvalue) { if (newvalue) { lv_obj_add_state(lvobj, LV_STATE_CHECKED); diff --git a/radio/src/gui/colorlcd/view_main.cpp b/radio/src/gui/colorlcd/view_main.cpp index a02332ce9..dfe51f669 100644 --- a/radio/src/gui/colorlcd/view_main.cpp +++ b/radio/src/gui/colorlcd/view_main.cpp @@ -260,29 +260,29 @@ void ViewMain::onEvent(event_t event) new ModelLabelsWindow(); break; - case EVT_KEY_BREAK(KEY_RADIO): + case EVT_KEY_BREAK(KEY_SYS): if (viewMainMenu) viewMainMenu->onCancel(); new RadioMenu(); break; - case EVT_KEY_LONG(KEY_RADIO): + case EVT_KEY_LONG(KEY_SYS): { - killEvents(KEY_RADIO); + killEvents(KEY_SYS); // Radio setup auto m = new RadioMenu(); m->setCurrentTab(2); } break; - case EVT_KEY_FIRST(KEY_TELEM): + case EVT_KEY_FIRST(KEY_TELE): if (viewMainMenu) viewMainMenu->onCancel(); new ScreenMenu(); break; #if defined(KEYS_GPIO_REG_PGUP) - case EVT_KEY_FIRST(KEY_PGDN): + case EVT_KEY_FIRST(KEY_PAGEDN): #else - case EVT_KEY_BREAK(KEY_PGDN): + case EVT_KEY_BREAK(KEY_PAGEDN): #endif if (!widget_select) { if (viewMainMenu) viewMainMenu->onCancel(); @@ -293,9 +293,9 @@ void ViewMain::onEvent(event_t event) //TODO: these need to go away! // -> board code should map the keys as required #if defined(KEYS_GPIO_REG_PGUP) - case EVT_KEY_FIRST(KEY_PGUP): + case EVT_KEY_FIRST(KEY_PAGEUP): #else - case EVT_KEY_LONG(KEY_PGDN): + case EVT_KEY_LONG(KEY_PAGEDN): #endif killEvents(event); if (!widget_select) { diff --git a/radio/src/gui/colorlcd/view_main_decoration.cpp b/radio/src/gui/colorlcd/view_main_decoration.cpp index 30514a7c5..572a59b41 100644 --- a/radio/src/gui/colorlcd/view_main_decoration.cpp +++ b/radio/src/gui/colorlcd/view_main_decoration.cpp @@ -30,6 +30,7 @@ #include "layouts/trims.h" #include "board.h" +#include "hal/adc_driver.h" static Window* create_layout_box(Window* parent, lv_align_t align, lv_flex_flow_t flow) @@ -130,64 +131,57 @@ rect_t ViewMainDecoration::getMainZone() const void ViewMainDecoration::createSliders(Window* ml, Window* mr, Window* bl, Window* bc, Window* br) { - Window* sl = new MainViewHorizontalSlider(bl, CALIBRATED_POT1); + // TODO: make dynamic + //uint8_t pot_idx = 0; + Window* sl = new MainViewHorizontalSlider(bl, 0); sl->updateSize(); - sliders[SLIDERS_POT1] = sl; + sliders[0] = sl; -#if !defined(HARDWARE_POT3) - bc = br; -#endif - - if (IS_POT_MULTIPOS(POT2)) { + if (!IS_POT_AVAILABLE(2)) { + bc = br; + } + + if (IS_POT_MULTIPOS(1)) { sl = new MainView6POS(bc, 1); sl->updateSize(); - sliders[SLIDERS_POT2] = sl; + sliders[1] = sl; } - else if (IS_POT(POT2)) { - sl = new MainViewHorizontalSlider(bc, CALIBRATED_POT2); + else if (IS_POT_AVAILABLE(1)) { + sl = new MainViewHorizontalSlider(bc, 1); sl->updateSize(); - sliders[SLIDERS_POT2] = sl; + sliders[1] = sl; } -#if defined(HARDWARE_POT3) - sl = new MainViewHorizontalSlider(br, CALIBRATED_POT3); - sl->updateSize(); - sliders[SLIDERS_POT3] = sl; -#endif - -#if NUM_SLIDERS > 0 - // create containers for the sliders, so that they are at the borders of the display - // on top of each other, when there are two sliders to display per side - auto leftPots = create_layout_box(ml, LV_ALIGN_LEFT_MID, LV_FLEX_FLOW_COLUMN); - leftPots->setHeight(VERTICAL_SLIDERS_HEIGHT); - - auto rightPots = create_layout_box(mr, LV_ALIGN_RIGHT_MID, LV_FLEX_FLOW_COLUMN); - rightPots->setHeight(VERTICAL_SLIDERS_HEIGHT); - - auto vertSlLeft1 = new MainViewVerticalSlider(leftPots, CALIBRATED_SLIDER_REAR_LEFT); - sliders[SLIDERS_REAR_LEFT] = vertSlLeft1; - - auto vertSlRight1 = new MainViewVerticalSlider(rightPots, CALIBRATED_SLIDER_REAR_RIGHT); - sliders[SLIDERS_REAR_RIGHT] = vertSlRight1; - -#if defined(HARDWARE_EXT1) || defined(PCBX12S) - if (IS_POT_SLIDER_AVAILABLE(EXT1)) { - sl = new MainViewVerticalSlider(leftPots, CALIBRATED_POT_EXT1); + if (IS_POT_AVAILABLE(2)) { + sl = new MainViewHorizontalSlider(br, 2); sl->updateSize(); - sliders[SLIDERS_EXT1] = sl; + sliders[2] = sl; } -#endif -#if defined(HARDWARE_EXT2) || defined(PCBX12S) - if (IS_POT_SLIDER_AVAILABLE(EXT2)) { - sl = new MainViewVerticalSlider(rightPots, CALIBRATED_POT_EXT2); - sl->updateSize(); - sliders[SLIDERS_EXT2] = sl; + // TODO: check how many pots are configured instead + auto max_pots = adcGetMaxInputs(ADC_INPUT_POT); + if (max_pots > 3) { + // create containers for the sliders, so that they are at the borders of the display + // on top of each other, when there are two sliders to display per side + auto leftPots = create_layout_box(ml, LV_ALIGN_LEFT_MID, LV_FLEX_FLOW_COLUMN); + leftPots->setHeight(VERTICAL_SLIDERS_HEIGHT); + + auto rightPots = create_layout_box(mr, LV_ALIGN_RIGHT_MID, LV_FLEX_FLOW_COLUMN); + rightPots->setHeight(VERTICAL_SLIDERS_HEIGHT); + + for (int i = 3; i <= 6; i++) { + if (IS_POT_AVAILABLE(i)) { + sl = new MainViewVerticalSlider(i & 1 ? leftPots : rightPots, i); + sliders[i] = sl; + } + } + + // update size AFTER all pots/sliders are created + for (int i = 3; i <= 6; i++) { + if (sliders[i] != nullptr) + sliders[i]->updateSize(); + } } -#endif - vertSlLeft1->updateSize(); - vertSlRight1->updateSize(); -#endif // NUM_SLIDERS > 0 } void ViewMainDecoration::createTrims(Window* ml, Window* mr, Window* bl, Window* br) diff --git a/radio/src/gui/colorlcd/view_text.cpp b/radio/src/gui/colorlcd/view_text.cpp index e115982b9..f4e633ca5 100644 --- a/radio/src/gui/colorlcd/view_text.cpp +++ b/radio/src/gui/colorlcd/view_text.cpp @@ -156,12 +156,12 @@ void ViewTextWindow::onEvent(event_t event) #if defined(HARDWARE_KEYS) if (int(bufSize) < fileLength) { TRACE("BEFORE offset=%d", offset); - if (event == EVT_KEY_BREAK(KEY_PGDN)) { + if (event == EVT_KEY_BREAK(KEY_PAGEDN)) { offset += bufSize; TRACE("event=DOWN"); } - if (event == EVT_KEY_BREAK(KEY_PGUP)) { + if (event == EVT_KEY_BREAK(KEY_PAGEUP)) { TRACE("event=UP"); offset -= bufSize; } diff --git a/radio/src/gui/colorlcd/widgets/value.cpp b/radio/src/gui/colorlcd/widgets/value.cpp index ffd3f4bb3..71313696a 100644 --- a/radio/src/gui/colorlcd/widgets/value.cpp +++ b/radio/src/gui/colorlcd/widgets/value.cpp @@ -204,7 +204,7 @@ class ValueWidget: public Widget }; const ZoneOption ValueWidget::options[] = { - { STR_SOURCE, ZoneOption::Source, OPTION_VALUE_UNSIGNED(MIXSRC_Rud) }, + { STR_SOURCE, ZoneOption::Source, OPTION_VALUE_UNSIGNED(MIXSRC_FIRST_STICK) }, { STR_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(COLOR_THEME_PRIMARY2) }, { STR_SHADOW, ZoneOption::Bool, OPTION_VALUE_BOOL(false) }, { STR_ALIGN_LABEL, ZoneOption::Align, OPTION_VALUE_UNSIGNED(ALIGN_LEFT) }, diff --git a/radio/src/gui/colorlcd/widgets_setup.cpp b/radio/src/gui/colorlcd/widgets_setup.cpp index 68e98f338..7e7b1a62d 100644 --- a/radio/src/gui/colorlcd/widgets_setup.cpp +++ b/radio/src/gui/colorlcd/widgets_setup.cpp @@ -137,7 +137,7 @@ void SetupWidgetsPage::deleteLater(bool detach, bool trash) void SetupWidgetsPage::onEvent(event_t event) { - if (event == EVT_KEY_FIRST(KEY_PGUP) || event == EVT_KEY_FIRST(KEY_PGDN)) { + if (event == EVT_KEY_FIRST(KEY_PAGEUP) || event == EVT_KEY_FIRST(KEY_PAGEDN)) { killEvents(event); } else { FormWindow::onEvent(event); diff --git a/radio/src/gui/common/stdlcd/CMakeLists.txt b/radio/src/gui/common/stdlcd/CMakeLists.txt index bf055f851..e090843e3 100644 --- a/radio/src/gui/common/stdlcd/CMakeLists.txt +++ b/radio/src/gui/common/stdlcd/CMakeLists.txt @@ -16,6 +16,7 @@ set(GUI_SRC ../common/stdlcd/radio_version.cpp ../common/stdlcd/radio_trainer.cpp ../common/stdlcd/view_telemetry.cpp + ../common/stdlcd/calibration.cpp model_curve_edit.cpp ) diff --git a/radio/src/gui/common/stdlcd/calibration.cpp b/radio/src/gui/common/stdlcd/calibration.cpp new file mode 100644 index 000000000..f422d00fc --- /dev/null +++ b/radio/src/gui/common/stdlcd/calibration.cpp @@ -0,0 +1,81 @@ +/* + * 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 "opentx.h" +#include "calibration.h" +#include "gui.h" + +#include "hal/adc_driver.h" + +void menuCommonCalib(event_t event) +{ + adcCalibMinMax(); + + // make sure we don't scroll while calibrating + menuCalibrationState = reusableBuffer.calib.state; + + switch (event) { + case EVT_ENTRY: + case EVT_KEY_BREAK(KEY_EXIT): + reusableBuffer.calib.state = CALIB_START; + break; + + case EVT_KEY_BREAK(KEY_ENTER): + reusableBuffer.calib.state++; + break; + } + + switch (reusableBuffer.calib.state) { + case CALIB_START: + // START CALIBRATION + if (!READ_ONLY()) { + lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+2*FH, STR_MENUTOSTART); + } + break; + + case CALIB_SET_MIDPOINT: + // SET MIDPOINT + lcdDrawText(0*FW, MENU_HEADER_HEIGHT+FH, STR_SETMIDPOINT, INVERS); + lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+2*FH, STR_MENUWHENDONE); + adcCalibSetMidPoint(); + break; + + case CALIB_MOVE_STICKS: + // MOVE STICKS/POTS + lcdDrawText(0*FW, MENU_HEADER_HEIGHT+FH, STR_MOVESTICKSPOTS, INVERS); + lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+2*FH, STR_MENUWHENDONE); + adcCalibSetMinMax(); + break; + + case CALIB_STORE: + adcCalibSetXPot(); + adcCalibStore(); + reusableBuffer.calib.state = CALIB_FINISHED; + break; + + default: + reusableBuffer.calib.state = CALIB_START; + break; + } + + doMainScreenGraphics(); +} + diff --git a/radio/src/targets/common/arm/stm32/extmodule_driver.h b/radio/src/gui/common/stdlcd/calibration.h similarity index 88% rename from radio/src/targets/common/arm/stm32/extmodule_driver.h rename to radio/src/gui/common/stdlcd/calibration.h index 89383228b..924438a6f 100644 --- a/radio/src/targets/common/arm/stm32/extmodule_driver.h +++ b/radio/src/gui/common/stdlcd/calibration.h @@ -21,8 +21,7 @@ #pragma once -#include +#include "opentx_types.h" -#include "stm32_pulse_driver.h" - -extern const stm32_pulse_timer_t extmoduleTimer; +// Runs the main calibration steps +void menuCommonCalib(event_t event); diff --git a/radio/src/gui/common/stdlcd/draw_functions.cpp b/radio/src/gui/common/stdlcd/draw_functions.cpp index 6b7d0b63c..29001cdf4 100644 --- a/radio/src/gui/common/stdlcd/draw_functions.cpp +++ b/radio/src/gui/common/stdlcd/draw_functions.cpp @@ -22,6 +22,9 @@ #include "opentx.h" #include +#include "hal/adc_driver.h" +#include "analogs.h" + #if defined(MULTIMODULE) void lcdDrawMultiProtocolString(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t protocol, LcdFlags flags) { @@ -305,12 +308,15 @@ void drawGVarName(coord_t x, coord_t y, int8_t idx, LcdFlags flags) lcdDrawText(x, y, s, flags); } -void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags, uint8_t old_editMode) +void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, + LcdFlags flags, uint8_t old_editMode) { - lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, idx+1, 0); - if (g_eeGeneral.anaNames[idx][0] || (flags && s_editMode > 0)) - editName(x, y, g_eeGeneral.anaNames[idx], LEN_ANA_NAME, event, (flags != 0), - flags, old_editMode); + lcdDrawText(INDENT_WIDTH, y, STR_CHAR_STICK, 0); + lcdDrawText(lcdNextPos, y, analogGetCanonicalName(ADC_INPUT_MAIN, idx), 0); + + if (analogHasCustomLabel(ADC_INPUT_MAIN, idx) || (flags && s_editMode > 0)) + editName(x, y, (char*)analogGetCustomLabel(ADC_INPUT_MAIN, idx), + LEN_ANA_NAME, event, (flags != 0), flags, old_editMode); else lcdDrawMMM(x, y, flags); } diff --git a/radio/src/gui/common/stdlcd/model_curves.cpp b/radio/src/gui/common/stdlcd/model_curves.cpp index 7df683897..12f216be0 100644 --- a/radio/src/gui/common/stdlcd/model_curves.cpp +++ b/radio/src/gui/common/stdlcd/model_curves.cpp @@ -52,20 +52,12 @@ void menuModelCurvesAll(event_t event) int8_t sub = menuVerticalPosition - HEADER_LINE; - switch (event) { -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_BREAK: -#endif -#if !defined(PCBTARANIS) - case EVT_KEY_FIRST(KEY_RIGHT): -#endif - case EVT_KEY_FIRST(KEY_ENTER): - if (CURVE_SELECTED() && !READ_ONLY()) { - s_currIdxSubMenu = sub; - s_currSrcRaw = MIXSRC_NONE; - pushMenu(menuModelCurveOne); - } - break; + if (event == EVT_KEY_BREAK(KEY_ENTER) && + CURVE_SELECTED() && !READ_ONLY()) { + + s_currIdxSubMenu = sub; + s_currSrcRaw = MIXSRC_NONE; + pushMenu(menuModelCurveOne); } for (uint8_t i=0; isrcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + i: MIXSRC_Rud - 1 + channelOrder(i)); + if (i > adcGetMaxInputs(ADC_INPUT_MAIN)) { + expo->srcRaw = MIXSRC_FIRST_STICK - 1 + i; + } else { + expo->srcRaw = MIXSRC_FIRST_STICK + inputMappingChannelOrder(i - 1); + } if (isSourceAvailableInInputs(expo->srcRaw)) { break; } @@ -178,12 +184,17 @@ void displayExpoInfos(coord_t y, ExpoData * ed) drawSwitch(EXPO_LINE_SWITCH_POS, y, ed->swtch, 0); } -void displayExpoLine(coord_t y, ExpoData * ed) +void displayExpoLine(coord_t y, ExpoData * ed, LcdFlags attr) { - drawSource(EXPO_LINE_SRC_POS, y, ed->srcRaw, 0); + drawSource(EXPO_LINE_SRC_POS, y, ed->srcRaw, attr); if (ed->trimSource != TRIM_ON) { - lcdDrawChar(EXPO_LINE_TRIM_POS, y, ed->trimSource > 0 ? '-' : STR_RETA123[-ed->trimSource][0]); + if (ed->trimSource > 0) { + lcdDrawChar(EXPO_LINE_TRIM_POS, y, '-', attr); + } else { + const char* short_label = getAnalogShortLabel(-ed->trimSource); + lcdDrawChar(EXPO_LINE_TRIM_POS, y, short_label ? short_label[0] : ' ', attr); + } } if (!ed->flightModes || ((ed->curve.value || ed->swtch) && ((get_tmr10ms() / 200) & 1))) @@ -192,7 +203,7 @@ void displayExpoLine(coord_t y, ExpoData * ed) displayFlightModes(EXPO_LINE_FM_POS, y, ed->flightModes); if (ed->name[0]) { - lcdDrawSizedText(EXPO_LINE_NAME_POS, y, ed->name, sizeof(ed->name), 0); + lcdDrawSizedText(EXPO_LINE_NAME_POS, y, ed->name, sizeof(ed->name), attr); } #if LCD_DEPTH > 1 @@ -201,7 +212,7 @@ void displayExpoLine(coord_t y, ExpoData * ed) } #endif } -#else +#else // LCD_W < 212 #define EXPO_LINE_WEIGHT_POS 7*FW+8 #define EXPO_LINE_SRC_POS 8*FW+3 #define EXPO_LINE_INFOS_POS 11*FW+11 @@ -219,12 +230,12 @@ void displayExpoInfos(coord_t y, ExpoData * ed) } } -void displayExpoLine(coord_t y, ExpoData * ed) +void displayExpoLine(coord_t y, ExpoData * ed, LcdFlags attr) { - drawSource(EXPO_LINE_SRC_POS, y, ed->srcRaw, 0); + drawSource(EXPO_LINE_SRC_POS, y, ed->srcRaw, attr); if (ed->name[0]) - lcdDrawSizedText(EXPO_LINE_INFOS_POS, y, ed->name, LEN_EXPOMIX_NAME, 0); + lcdDrawSizedText(EXPO_LINE_INFOS_POS, y, ed->name, LEN_EXPOMIX_NAME, attr); else if (!ed->flightModes || ((ed->curve.value || ed->swtch) && ((get_tmr10ms() / 200) & 1))) displayExpoInfos(y, ed); else @@ -319,54 +330,51 @@ void menuModelExposAll(event_t event) } } break; - case EVT_KEY_LONG(KEY_LEFT): - case EVT_KEY_LONG(KEY_RIGHT): - if (s_copyMode && !s_copyTgtOfs) { - if (reachExposLimit()) break; - s_currCh = chn; - if (event == EVT_KEY_LONG(KEY_RIGHT)) { s_currIdx++; menuVerticalPosition++; } - insertExpo(s_currIdx); - pushMenu(menuModelExpoOne); - s_copyMode = 0; - killEvents(event); - } - break; - case EVT_KEY_FIRST(KEY_UP): - case EVT_KEY_REPT(KEY_UP): - case EVT_KEY_FIRST(KEY_DOWN): - case EVT_KEY_REPT(KEY_DOWN): -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_RIGHT: - case EVT_ROTARY_LEFT: -#endif - if (s_copyMode) { - uint8_t next_ofs = (IS_PREVIOUS_EVENT(event) ? s_copyTgtOfs - 1 : s_copyTgtOfs + 1); + + // TODO: add PLUS / MINUS? + // case EVT_KEY_LONG(KEY_LEFT): + // case EVT_KEY_LONG(KEY_RIGHT): + // if (s_copyMode && !s_copyTgtOfs) { + // if (reachExposLimit()) break; + // s_currCh = chn; + // if (event == EVT_KEY_LONG(KEY_RIGHT)) { s_currIdx++; menuVerticalPosition++; } + // insertExpo(s_currIdx); + // pushMenu(menuModelExpoOne); + // s_copyMode = 0; + // killEvents(event); + // } + // break; + } + + if (s_copyMode && + (IS_NEXT_EVENT(event) || IS_PREVIOUS_EVENT(event))) { + + uint8_t next_ofs = (IS_PREVIOUS_EVENT(event) ? s_copyTgtOfs - 1 : s_copyTgtOfs + 1); - if (s_copyTgtOfs==0 && s_copyMode==COPY_MODE) { - // insert a mix on the same channel (just above / just below) - if (reachExposLimit()) break; - copyExpo(s_currIdx); - if (IS_NEXT_EVENT(event)) - s_currIdx++; - else if (sub-menuVerticalOffset >= 6) - menuVerticalOffset++; - } - else if (next_ofs==0 && s_copyMode==COPY_MODE) { - // delete the mix - deleteExpo(s_currIdx); - if (IS_PREVIOUS_EVENT(event)) - s_currIdx--; - } - else { - // only swap the mix with its neighbor - if (!swapExpos(s_currIdx, IS_PREVIOUS_EVENT(event))) - break; - storageDirty(EE_MODEL); - } - - s_copyTgtOfs = next_ofs; + if (s_copyTgtOfs==0 && s_copyMode==COPY_MODE) { + // insert a mix on the same channel (just above / just below) + if (!reachExposLimit()) { + copyExpo(s_currIdx); + if (IS_NEXT_EVENT(event)) + s_currIdx++; + else if (sub-menuVerticalOffset >= 6) + menuVerticalOffset++; } - break; + } + else if (next_ofs==0 && s_copyMode==COPY_MODE) { + // delete the mix + deleteExpo(s_currIdx); + if (IS_PREVIOUS_EVENT(event)) + s_currIdx--; + } + else { + // only swap the mix with its neighbor + if (swapExpos(s_currIdx, IS_PREVIOUS_EVENT(event))) { + storageDirty(EE_MODEL); + } + } + + s_copyTgtOfs = next_ofs; } lcdDrawNumber(FW*sizeof(TR_MENUINPUTS)+FW+FW/2, 0, getExposCount(), RIGHT); @@ -421,7 +429,7 @@ void menuModelExposAll(event_t event) LcdFlags attr = ((s_copyMode || sub != cur) ? 0 : INVERS); GVAR_MENU_ITEM(EXPO_LINE_WEIGHT_POS, y, ed->weight, -100, 100, RIGHT | attr | (isExpoActive(i) ? BOLD : 0), 0, 0); - displayExpoLine(y, ed); + displayExpoLine(y, ed, attr); if (s_copyMode) { if ((s_copyMode==COPY_MODE || s_copyTgtOfs == 0) && s_copySrcCh == ch && i == (s_copySrcIdx + (s_copyTgtOfs<0))) { diff --git a/radio/src/gui/common/stdlcd/model_mixes.cpp b/radio/src/gui/common/stdlcd/model_mixes.cpp index a8141701c..3cf4bb0a7 100644 --- a/radio/src/gui/common/stdlcd/model_mixes.cpp +++ b/radio/src/gui/common/stdlcd/model_mixes.cpp @@ -21,6 +21,8 @@ #include "opentx.h" #include "tasks/mixer_task.h" +#include "hal/adc_driver.h" +#include "input_mapping.h" #define _STR_MAX(x) "/" #x #define STR_MAX(x) _STR_MAX(x) @@ -67,7 +69,11 @@ void insertMix(uint8_t idx) mix->destCh = s_currCh-1; mix->srcRaw = s_currCh; if (!isSourceAvailable(mix->srcRaw)) { - mix->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channelOrder(s_currCh)); + if (s_currCh > adcGetMaxInputs(ADC_INPUT_MAIN)) { + mix->srcRaw = MIXSRC_FIRST_STICK - 1 + s_currCh; + } else { + mix->srcRaw = MIXSRC_FIRST_STICK + inputMappingChannelOrder(s_currCh - 1); + } while (!isSourceAvailable(mix->srcRaw)) { mix->srcRaw += 1; } @@ -339,53 +345,51 @@ void menuModelMixAll(event_t event) } } break; - case EVT_KEY_LONG(KEY_LEFT): - case EVT_KEY_LONG(KEY_RIGHT): - if (s_copyMode && !s_copyTgtOfs) { - if (reachMixesLimit()) break; - s_currCh = chn; - if (event == EVT_KEY_LONG(KEY_RIGHT)) { s_currIdx++; menuVerticalPosition++; } - insertMix(s_currIdx); - pushMenu(menuModelMixOne); - s_copyMode = 0; - killEvents(event); - } - break; - case EVT_KEY_FIRST(KEY_UP): - case EVT_KEY_REPT(KEY_UP): - case EVT_KEY_FIRST(KEY_DOWN): - case EVT_KEY_REPT(KEY_DOWN): -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_RIGHT: - case EVT_ROTARY_LEFT: -#endif - if (s_copyMode) { - uint8_t next_ofs = (IS_PREVIOUS_EVENT(event) ? s_copyTgtOfs - 1 : s_copyTgtOfs + 1); - if (s_copyTgtOfs==0 && s_copyMode==COPY_MODE) { - // insert a mix on the same channel (just above / just below) - if (reachMixesLimit()) break; - copyMix(s_currIdx); - if (IS_NEXT_EVENT(event)) - s_currIdx++; - else if (sub - menuVerticalOffset >= 6) - menuVerticalOffset++; - } - else if (next_ofs==0 && s_copyMode==COPY_MODE) { - // delete the mix - deleteMix(s_currIdx); - if (IS_PREVIOUS_EVENT(event)) - s_currIdx--; - } - else { - // only swap the mix with its neighbor - if (!swapMixes(s_currIdx, IS_PREVIOUS_EVENT(event))) break; - storageDirty(EE_MODEL); - } + // TODO: add PLUS / MINUS? + // case EVT_KEY_LONG(KEY_LEFT): + // case EVT_KEY_LONG(KEY_RIGHT): + // if (s_copyMode && !s_copyTgtOfs) { + // if (reachMixesLimit()) break; + // s_currCh = chn; + // if (event == EVT_KEY_LONG(KEY_RIGHT)) { s_currIdx++; menuVerticalPosition++; } + // insertMix(s_currIdx); + // pushMenu(menuModelMixOne); + // s_copyMode = 0; + // killEvents(event); + // } + // break; + } - s_copyTgtOfs = next_ofs; + if (s_copyMode && + (IS_NEXT_EVENT(event) || IS_PREVIOUS_EVENT(event))) { + + uint8_t next_ofs = (IS_PREVIOUS_EVENT(event) ? s_copyTgtOfs - 1 : s_copyTgtOfs + 1); + + if (s_copyTgtOfs==0 && s_copyMode==COPY_MODE) { + // insert a mix on the same channel (just above / just below) + if (!reachMixesLimit()) { + copyMix(s_currIdx); + if (IS_NEXT_EVENT(event)) + s_currIdx++; + else if (sub - menuVerticalOffset >= 6) + menuVerticalOffset++; } - break; + } + else if (next_ofs==0 && s_copyMode==COPY_MODE) { + // delete the mix + deleteMix(s_currIdx); + if (IS_PREVIOUS_EVENT(event)) + s_currIdx--; + } + else { + // only swap the mix with its neighbor + if (swapMixes(s_currIdx, IS_PREVIOUS_EVENT(event))) { + storageDirty(EE_MODEL); + } + } + + s_copyTgtOfs = next_ofs; } lcdDrawNumber(FW*sizeof(TR_MIXES)+FW/2, 0, getMixesCount(), 0); diff --git a/radio/src/gui/common/stdlcd/model_usbjoystick.cpp b/radio/src/gui/common/stdlcd/model_usbjoystick.cpp index dc5b2060d..2d9418b44 100644 --- a/radio/src/gui/common/stdlcd/model_usbjoystick.cpp +++ b/radio/src/gui/common/stdlcd/model_usbjoystick.cpp @@ -61,7 +61,7 @@ void menuModelUSBJoystickOne(event_t event) killEvents(event); } #elif defined(NAVIGATION_XLITE) - if (event == EVT_KEY_FIRST(KEY_ENTER) && IS_SHIFT_PRESSED()) { + if (event == EVT_KEY_FIRST(KEY_ENTER) && keysGetState(KEY_SHIFT)) { pushMenu(menuChannelsView); killEvents(event); } diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index ecef23586..313d740ca 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -106,72 +106,56 @@ const char * runPopupMenu(event_t event) } #endif - switch (eventTemp) { -#if defined(ROTARY_ENCODER_NAVIGATION) - CASE_EVT_ROTARY_LEFT -#endif - case EVT_KEY_FIRST(KEY_UP): - case EVT_KEY_REPT(KEY_UP): - if (popupMenuSelectedItem > 0) { - popupMenuSelectedItem--; - } + if (IS_PREVIOUS_EVENT(eventTemp)) { + if (popupMenuSelectedItem > 0) { + popupMenuSelectedItem--; + } #if defined(SDCARD) - else if (popupMenuOffset > 0) { - popupMenuOffset--; + else if (popupMenuOffset > 0) { + popupMenuOffset--; + result = STR_UPDATE_LIST; + } +#endif + else { + popupMenuSelectedItem = min(display_count, MENU_MAX_DISPLAY_LINES) - 1; +#if defined(SDCARD) + if (popupMenuItemsCount > MENU_MAX_DISPLAY_LINES) { + popupMenuOffset = popupMenuItemsCount - display_count; result = STR_UPDATE_LIST; } #endif - else { - popupMenuSelectedItem = min(display_count, MENU_MAX_DISPLAY_LINES) - 1; + } + } else if (IS_NEXT_EVENT(eventTemp)) { + if (popupMenuSelectedItem < display_count - 1 && popupMenuOffset + popupMenuSelectedItem + 1 < popupMenuItemsCount) { + popupMenuSelectedItem++; + } #if defined(SDCARD) - if (popupMenuItemsCount > MENU_MAX_DISPLAY_LINES) { - popupMenuOffset = popupMenuItemsCount - display_count; - result = STR_UPDATE_LIST; - } + else if (popupMenuItemsCount > popupMenuOffset + display_count) { + popupMenuOffset++; + result = STR_UPDATE_LIST; + } #endif - } - break; - -#if defined(ROTARY_ENCODER_NAVIGATION) - CASE_EVT_ROTARY_RIGHT -#endif - case EVT_KEY_FIRST(KEY_DOWN): - case EVT_KEY_REPT(KEY_DOWN): - if (popupMenuSelectedItem < display_count - 1 && popupMenuOffset + popupMenuSelectedItem + 1 < popupMenuItemsCount) { - popupMenuSelectedItem++; - } + else { + popupMenuSelectedItem = 0; #if defined(SDCARD) - else if (popupMenuItemsCount > popupMenuOffset + display_count) { - popupMenuOffset++; + if (popupMenuOffset) { + popupMenuOffset = 0; result = STR_UPDATE_LIST; } #endif - else { - popupMenuSelectedItem = 0; -#if defined(SDCARD) - if (popupMenuOffset) { - popupMenuOffset = 0; - result = STR_UPDATE_LIST; - } -#endif - } - break; - - case EVT_KEY_BREAK(KEY_ENTER): - result = popupMenuItems[popupMenuSelectedItem + (popupMenuOffsetType == MENU_OFFSET_INTERNAL ? popupMenuOffset : 0)]; - popupMenuItemsCount = 0; - popupMenuSelectedItem = 0; - popupMenuOffset = 0; - popupMenuTitle = nullptr; - break; - - case EVT_KEY_BREAK(KEY_EXIT): - result = STR_EXIT; - popupMenuItemsCount = 0; - popupMenuSelectedItem = 0; - popupMenuOffset = 0; - popupMenuTitle = nullptr; - break; + } + } else if (eventTemp == EVT_KEY_BREAK(KEY_ENTER)) { + result = popupMenuItems[popupMenuSelectedItem + (popupMenuOffsetType == MENU_OFFSET_INTERNAL ? popupMenuOffset : 0)]; + popupMenuItemsCount = 0; + popupMenuSelectedItem = 0; + popupMenuOffset = 0; + popupMenuTitle = nullptr; + } else if (eventTemp == EVT_KEY_BREAK(KEY_EXIT)) { + result = STR_EXIT; + popupMenuItemsCount = 0; + popupMenuSelectedItem = 0; + popupMenuOffset = 0; + popupMenuTitle = nullptr; } return result; diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp index e51bcf4d5..f2d8f20b2 100644 --- a/radio/src/gui/common/stdlcd/radio_hardware.cpp +++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp @@ -19,250 +19,21 @@ * GNU General Public License for more details. */ -#include -#include "hal/adc_driver.h" -#include "io/frsky_firmware_update.h" +#include "opentx.h" -#if defined(CROSSFIRE) - #include "telemetry/crossfire.h" -#endif +#include "hal/adc_driver.h" +#include "hal/switch_driver.h" +#include "hal/module_port.h" + +#include "analogs.h" +#include "switches.h" #if defined(BLUETOOTH) #include "bluetooth_driver.h" #endif -#if defined(PCBTARANIS) -enum { - ITEM_RADIO_HARDWARE_LABEL_STICKS, - ITEM_RADIO_HARDWARE_STICK1, - ITEM_RADIO_HARDWARE_STICK2, - ITEM_RADIO_HARDWARE_STICK3, - ITEM_RADIO_HARDWARE_STICK4, -#if (NUM_POTS + NUM_SLIDERS) > 0 - ITEM_RADIO_HARDWARE_LABEL_POTS, - ITEM_RADIO_HARDWARE_POT1, -#endif -#if defined(HARDWARE_POT2) - ITEM_RADIO_HARDWARE_POT2, -#endif -#if defined(HARDWARE_POT3) || defined(PCBX9D) // TODO #if defined(STORAGE_POT3) - ITEM_RADIO_HARDWARE_POT3, -#endif -#if defined(HARDWARE_POT4) - ITEM_RADIO_HARDWARE_POT4, -#endif -#if NUM_SLIDERS > 0 - ITEM_RADIO_HARDWARE_SLIDER1, - ITEM_RADIO_HARDWARE_SLIDER2, -#endif -#if NUM_SLIDERS > 2 - ITEM_RADIO_HARDWARE_SLIDER3, - ITEM_RADIO_HARDWARE_SLIDER4, -#endif - ITEM_RADIO_HARDWARE_LABEL_SWITCHES, - ITEM_RADIO_HARDWARE_SA, - ITEM_RADIO_HARDWARE_SB, - ITEM_RADIO_HARDWARE_SC, - ITEM_RADIO_HARDWARE_SD, -#if !defined(RADIO_TPRO) -#if defined(HARDWARE_SWITCH_E) - ITEM_RADIO_HARDWARE_SE, -#endif -#if defined(HARDWARE_SWITCH_F) - ITEM_RADIO_HARDWARE_SF, -#endif -#if defined(HARDWARE_SWITCH_G) - ITEM_RADIO_HARDWARE_SG, -#endif -#if defined(HARDWARE_SWITCH_H) - ITEM_RADIO_HARDWARE_SH, -#endif -#if defined(HARDWARE_SWITCH_I) - ITEM_RADIO_HARDWARE_SI, -#endif -#if defined(HARDWARE_SWITCH_J) - ITEM_RADIO_HARDWARE_SJ, -#endif -#endif -#if defined(HARDWARE_SWITCH_K) - ITEM_RADIO_HARDWARE_SK, - ITEM_RADIO_HARDWARE_SL, - ITEM_RADIO_HARDWARE_SM, - ITEM_RADIO_HARDWARE_SN, - ITEM_RADIO_HARDWARE_SO, - ITEM_RADIO_HARDWARE_SP, - ITEM_RADIO_HARDWARE_SQ, - ITEM_RADIO_HARDWARE_SR, -#endif - - ITEM_RADIO_HARDWARE_BATTERY_CALIB, - - ITEM_RADIO_HARDWARE_RTC_BATTERY, - ITEM_RADIO_HARDWARE_RTC_CHECK, - -#if defined(TX_CAPACITY_MEASUREMENT) - ITEM_RADIO_HARDWARE_CAPACITY_CALIB, -#endif - -#if !defined(PCBX9D) && !defined(PCBX9DP) && !defined(PCBX9E) - ITEM_RADIO_HARDWARE_LABEL_INTERNAL_MODULE, - ITEM_RADIO_HARDWARE_INTERNAL_MODULE_TYPE, - ITEM_RADIO_HARDWARE_INTERNAL_MODULE_BAUDRATE, -#endif -#if defined(HARDWARE_EXTERNAL_MODULE) - ITEM_RADIO_HARDWARE_SERIAL_SAMPLE_MODE, -#endif -#if defined(BLUETOOTH) - ITEM_RADIO_HARDWARE_BLUETOOTH_MODE, - ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE, - ITEM_RADIO_HARDWARE_BLUETOOTH_LOCAL_ADDR, - ITEM_RADIO_HARDWARE_BLUETOOTH_DISTANT_ADDR, - ITEM_RADIO_HARDWARE_BLUETOOTH_NAME, -#endif - -#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA) - ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA, -#endif - -#if defined(AUX_SERIAL) || defined(USB_SERIAL) - ITEM_RADIO_HARDWARE_SERIAL_PORT_LABEL, - ITEM_RADIO_HARDWARE_AUX1_SERIAL_MODE, - ITEM_RADIO_HARDWARE_AUX2_SERIAL_MODE, - ITEM_RADIO_HARDWARE_VCP_SERIAL_MODE, -#endif - - ITEM_RADIO_HARDWARE_JITTER_FILTER, - ITEM_RADIO_HARDWARE_RAS, - ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER, - ITEM_RADIO_HARDWARE_DEBUG, -#if defined(EEPROM) - ITEM_RADIO_BACKUP_EEPROM, - ITEM_RADIO_FACTORY_RESET, -#endif - ITEM_RADIO_HARDWARE_MAX -}; - -#if (NUM_POTS + NUM_SLIDERS) == 0 - #define POTS_ROWS -#elif (NUM_POTS + NUM_SLIDERS) == 1 - #define POTS_ROWS LABEL(Pots), NAVIGATION_LINE_BY_LINE|1, -#elif (NUM_POTS + NUM_SLIDERS) == 2 - #define POTS_ROWS LABEL(Pots), NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, -#elif (NUM_POTS + NUM_SLIDERS) == 3 - #define POTS_ROWS LABEL(Pots), NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, -#elif defined(PCBX9D) // TODO defined(STORAGE_POT3) && !defined(STORAGE_POT3) - #define POTS_ROWS LABEL(Pots), NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, HIDDEN_ROW, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, -#elif (NUM_POTS + NUM_SLIDERS) == 4 - #define POTS_ROWS LABEL(Pots), NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, -#elif (NUM_POTS + NUM_SLIDERS) == 5 - #define POTS_ROWS LABEL(Pots), NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, -#elif (NUM_POTS + NUM_SLIDERS) == 8 - #define POTS_ROWS LABEL(Pots), NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, -#endif - -#if defined(PCBX9E) - #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#elif defined(RADIO_TPRO) - #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#elif defined(RADIO_T12) - #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW -#elif NUM_SWITCHES == 9 - #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#elif NUM_SWITCHES == 8 - #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#elif NUM_SWITCHES == 7 - #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#elif NUM_SWITCHES == 6 - #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#elif NUM_SWITCHES == 5 - #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#elif NUM_SWITCHES == 4 - #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#endif - -#if !defined(BLUETOOTH) - #define BLUETOOTH_ROWS -#elif defined(PCBX9E) - #define BLUETOOTH_ROWS 0, uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), -#else - #define BLUETOOTH_ROWS uint8_t(IS_BLUETOOTH_CHIP_PRESENT() ? 0 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY ? READONLY_ROW : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), -#endif - -#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA) - #define EXTERNAL_ANTENNA_ROW 0, - void onHardwareAntennaSwitchConfirm(const char * result) - { - if (result == STR_OK) { - // Switch to external antenna confirmation - g_eeGeneral.antennaMode = reusableBuffer.radioHardware.antennaMode; - storageDirty(EE_GENERAL); - } - else { - reusableBuffer.radioHardware.antennaMode = g_eeGeneral.antennaMode; - } - } -#else - #define EXTERNAL_ANTENNA_ROW -#endif - -#if defined(PCBX9LITE) - #define SWITCH_TYPE_MAX(sw) (sw == MIXSRC_SD-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS) -#elif defined(PCBXLITES) - #define SWITCH_TYPE_MAX(sw) (sw >= MIXSRC_SE-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS) -#elif defined(PCBXLITE) - #define SWITCH_TYPE_MAX(sw) (SWITCH_3POS) -#elif defined(PCBX9E) - #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) -#elif defined(RADIO_ZORRO) - #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SB - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SC - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_3POS : SWITCH_2POS) -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SA - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SD - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) -#elif defined(RADIO_TX12) - #define SWITCH_TYPE_MAX(sw) (((MIXSRC_SA - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SD - MIXSRC_FIRST_SWITCH == sw) || \ - (MIXSRC_SI - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SJ - MIXSRC_FIRST_SWITCH == sw)) ? SWITCH_2POS : SWITCH_3POS) -#elif defined(RADIO_TX12MK2) - #define SWITCH_TYPE_MAX(sw) (((MIXSRC_SA - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SD - MIXSRC_FIRST_SWITCH == sw)) ? SWITCH_2POS : SWITCH_3POS) -#elif defined(RADIO_BOXER) - #define SWITCH_TYPE_MAX(sw) (((MIXSRC_SB - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SC - MIXSRC_FIRST_SWITCH == sw)) ? SWITCH_3POS : SWITCH_2POS) -#elif defined(RADIO_T12) - #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SG - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) -#else - #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH <= sw) ? SWITCH_2POS : SWITCH_3POS) -#endif - - #define RTC_ROW READONLY_ROW, 0, - -#if defined(TX_CAPACITY_MEASUREMENT) - #define TX_CAPACITY_MEASUREMENT_ROWS 0, -#else - #define TX_CAPACITY_MEASUREMENT_ROWS -#endif - -#if !defined(PCBX9D) && !defined(PCBX9DP) && !defined(PCBX9E) - #define INTERNAL_MODULE_ROWS \ - LABEL(InternalModule), 0, \ - (isInternalModuleCrossfire() ? (uint8_t)0 : HIDDEN_ROW), -#else - #define INTERNAL_MODULE_ROWS -#endif -#if defined(HARDWARE_EXTERNAL_MODULE) -#define SERIAL_SAMPLE_MODE_ROWS 0, -#else -#define SERIAL_SAMPLE_MODE_ROWS -#endif - -#if defined(AUX_SERIAL) || defined(USB_SERIAL) -static uint8_t _dispSerialPort(uint8_t port_nr) -{ - auto port = serialGetPort(port_nr); - if (!port || !port->name) return HIDDEN_ROW; - return 0; -} -#define SERIAL_PORT_ROWS \ - LABEL(SerialPorts), _dispSerialPort(SP_AUX1), _dispSerialPort(SP_AUX2), \ - _dispSerialPort(SP_VCP), -#else - #define SERIAL_PORT_ROWS +#if defined(CROSSFIRE) + #include "telemetry/crossfire.h" #endif #if LCD_W >= 212 @@ -273,22 +44,69 @@ static uint8_t _dispSerialPort(uint8_t port_nr) #define HW_SETTINGS_COLUMN2 (HW_SETTINGS_COLUMN1 + 5*FW) #endif -#define SPORT_PWR_ROW (hasSportPower() ? (uint8_t)0 : HIDDEN_ROW) - +enum { + ITEM_RADIO_HARDWARE_LABEL_STICKS = 0, + ITEM_RADIO_HARDWARE_STICK, + ITEM_RADIO_HARDWARE_STICK_END = ITEM_RADIO_HARDWARE_STICK + MAX_STICKS - 1, + ITEM_RADIO_HARDWARE_LABEL_POTS, + ITEM_RADIO_HARDWARE_POT, + ITEM_RADIO_HARDWARE_POT_END = ITEM_RADIO_HARDWARE_POT + MAX_POTS - 1, + ITEM_RADIO_HARDWARE_LABEL_SWITCHES, + ITEM_RADIO_HARDWARE_SWITCH, + ITEM_RADIO_HARDWARE_SWITCH_END = ITEM_RADIO_HARDWARE_SWITCH + MAX_SWITCHES - 1, + ITEM_RADIO_HARDWARE_BATTERY_CALIB, + ITEM_RADIO_HARDWARE_RTC_BATTERY, + ITEM_RADIO_HARDWARE_RTC_CHECK, + ITEM_RADIO_HARDWARE_LABEL_INTERNAL_MODULE, + ITEM_RADIO_HARDWARE_INTERNAL_MODULE_TYPE, + ITEM_RADIO_HARDWARE_INTERNAL_MODULE_BAUDRATE, + ITEM_RADIO_HARDWARE_SERIAL_SAMPLE_MODE, +#if defined(BLUETOOTH) + ITEM_RADIO_HARDWARE_BLUETOOTH_MODE, + ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE, + ITEM_RADIO_HARDWARE_BLUETOOTH_LOCAL_ADDR, + ITEM_RADIO_HARDWARE_BLUETOOTH_DISTANT_ADDR, + ITEM_RADIO_HARDWARE_BLUETOOTH_NAME, +#endif + ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA, + ITEM_RADIO_HARDWARE_SERIAL_PORT_LABEL, + ITEM_RADIO_HARDWARE_SERIAL_PORT, + ITEM_RADIO_HARDWARE_SERIAL_PORT_END = ITEM_RADIO_HARDWARE_SERIAL_PORT + MAX_SERIAL_PORTS - 1, + ITEM_RADIO_HARDWARE_JITTER_FILTER, + ITEM_RADIO_HARDWARE_RAS, + ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER, + ITEM_RADIO_HARDWARE_DEBUG, +#if defined(FUNCTION_SWITCHES) + ITEM_RADIO_HARDWARE_DEBUG_FS, +#endif #if defined(EEPROM) -#define EEPROM_ROWS 0 /* EEPROM backup */, 0 /* Factory reset */, -void onFactoryResetConfirm(const char* result) + ITEM_RADIO_BACKUP_EEPROM, + ITEM_RADIO_FACTORY_RESET, +#endif + ITEM_RADIO_HARDWARE_MAX +}; + +#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA) +static void onHardwareAntennaSwitchConfirm(const char * result) { if (result == STR_OK) { - showMessageBox(STR_STORAGE_FORMAT); - storageEraseAll(false); - NVIC_SystemReset(); + // Switch to external antenna confirmation + g_eeGeneral.antennaMode = reusableBuffer.radioHardware.antennaMode; + storageDirty(EE_GENERAL); + } + else { + reusableBuffer.radioHardware.antennaMode = g_eeGeneral.antennaMode; } } -#else -#define EEPROM_ROWS #endif +static uint8_t _dispSerialPort(uint8_t port_nr) +{ + auto port = serialGetPort(port_nr); + if (!port || !port->name) return HIDDEN_ROW; + return 0; +} + static bool _isAux1ModeAvailable(int m) { return isSerialModeAvailable(SP_AUX1, m); } static bool _isAux2ModeAvailable(int m) { return isSerialModeAvailable(SP_AUX2, m); } static bool _isVCPModeAvailable(int m) { return isSerialModeAvailable(SP_VCP, m); } @@ -297,34 +115,116 @@ static const IsValueAvailable _isSerialModeAvailable[MAX_SERIAL_PORTS] = { _isAux1ModeAvailable, _isAux2ModeAvailable, _isVCPModeAvailable }; +#if defined(EEPROM) +void onFactoryResetConfirm(const char* result) +{ + if (result == STR_OK) { + showMessageBox(STR_STORAGE_FORMAT); + storageEraseAll(false); + NVIC_SystemReset(); + } +} +#endif + +static void _init_menu_tab_array(uint8_t* tab, size_t len) +{ + memset((void*)tab, READONLY_ROW, sizeof(MENU_TAB_ARRAY_TYPE) * len); + tab += HEADER_LINE; // skip header line + + tab[ITEM_RADIO_HARDWARE_LABEL_STICKS] = 0; // calib button + auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN); + for (int i = ITEM_RADIO_HARDWARE_STICK; i <= ITEM_RADIO_HARDWARE_STICK_END; i++) { + uint8_t idx = i - ITEM_RADIO_HARDWARE_STICK; + tab[i] = idx < max_sticks ? 0 : HIDDEN_ROW; + } + + auto max_pots = adcGetMaxInputs(ADC_INPUT_POT); + for (int i = ITEM_RADIO_HARDWARE_POT; i <= ITEM_RADIO_HARDWARE_POT_END; i++) { + uint8_t idx = i - ITEM_RADIO_HARDWARE_POT; + tab[i] = idx < max_pots ? 1 : HIDDEN_ROW; + } + + auto max_switches = switchGetMaxSwitches(); + for (int i = ITEM_RADIO_HARDWARE_SWITCH; i <= ITEM_RADIO_HARDWARE_SWITCH_END; i++) { + uint8_t idx = i - ITEM_RADIO_HARDWARE_SWITCH; + tab[i] = idx < max_switches ? 1 : HIDDEN_ROW; + } + + tab[ITEM_RADIO_HARDWARE_BATTERY_CALIB] = 0; + tab[ITEM_RADIO_HARDWARE_RTC_BATTERY] = READONLY_ROW; + tab[ITEM_RADIO_HARDWARE_RTC_CHECK] = 0; + +#if defined(HARDWARE_INTERNAL_MODULE) + tab[ITEM_RADIO_HARDWARE_INTERNAL_MODULE_TYPE] = 0; + tab[ITEM_RADIO_HARDWARE_INTERNAL_MODULE_BAUDRATE] = + isInternalModuleCrossfire() ? (uint8_t)0 : HIDDEN_ROW; +#else + memset((void*)&tab[ITEM_RADIO_HARDWARE_LABEL_INTERNAL_MODULE], HIDDEN_ROW, 3); +#endif + +#if defined(HARDWARE_EXTERNAL_MODULE) + tab[ITEM_RADIO_HARDWARE_SERIAL_SAMPLE_MODE] = 0; +#else + tab[ITEM_RADIO_HARDWARE_SERIAL_SAMPLE_MODE] = HIDDEN_ROW; +#endif + +#if defined(BLUETOOTH) + bool has_bt = IS_BLUETOOTH_CHIP_PRESENT(); + tab[ITEM_RADIO_HARDWARE_BLUETOOTH_MODE] = has_bt ? 0 : HIDDEN_ROW; + + bool bt_telem = g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY; + tab[ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE] = bt_telem ? READONLY_ROW : HIDDEN_ROW; + + bool bt_off = g_eeGeneral.bluetoothMode == BLUETOOTH_OFF; + tab[ITEM_RADIO_HARDWARE_BLUETOOTH_LOCAL_ADDR] = bt_off ? HIDDEN_ROW : READONLY_ROW; + tab[ITEM_RADIO_HARDWARE_BLUETOOTH_DISTANT_ADDR] = bt_off ? HIDDEN_ROW : READONLY_ROW; + tab[ITEM_RADIO_HARDWARE_BLUETOOTH_NAME] = bt_off ? HIDDEN_ROW : 0; +#endif + +#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA) + tab[ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA] = + g_eeGeneral.internalModule == MODULE_TYPE_XJT_PXX1 ? 0 : HIDDEN_ROW; +#else + tab[ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA] = HIDDEN_ROW; +#endif + + bool has_serial = false; + for (int i = 0; i < MAX_SERIAL_PORTS; i++) { + uint8_t idx = ITEM_RADIO_HARDWARE_SERIAL_PORT + i; + auto r = _dispSerialPort(i); + tab[idx] = r; + has_serial = has_serial || (!r); + } + tab[ITEM_RADIO_HARDWARE_SERIAL_PORT_LABEL] = has_serial ? 0 : HIDDEN_ROW; + tab[ITEM_RADIO_HARDWARE_JITTER_FILTER] = 0; + tab[ITEM_RADIO_HARDWARE_RAS] = READONLY_ROW; + + auto mod_desc = modulePortGetModuleDescription(SPORT_MODULE); + if (mod_desc && mod_desc->set_pwr) { + tab[ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER] = 0; + } else { + tab[ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER] = HIDDEN_ROW; + } + + tab[ITEM_RADIO_HARDWARE_DEBUG] = 1; +#if defined(FUNCTIONS_SWITCHES) + tab[ITEM_RADIO_HARDWARE_DEBUG_FS] = 0; +#endif +#if defined(EEPROM) + tab[ITEM_RADIO_BACKUP_EEPROM] = 0; + tab[ITEM_RADIO_FACTORY_RESET] = 0; +#endif +} + void menuRadioHardware(event_t event) { uint8_t old_editMode = s_editMode; - - MENU(STR_HARDWARE, menuTabGeneral, MENU_RADIO_HARDWARE, HEADER_LINE + ITEM_RADIO_HARDWARE_MAX, { - HEADER_LINE_COLUMNS - 0 /* calibration button */, - 0 /* stick 1 */, - 0 /* stick 2 */, - 0 /* stick 3 */, - 0 /* stick 4 */, - POTS_ROWS - LABEL(Switches), - SWITCHES_ROWS, - 0 /* battery calib */, - RTC_ROW - TX_CAPACITY_MEASUREMENT_ROWS - INTERNAL_MODULE_ROWS - SERIAL_SAMPLE_MODE_ROWS - BLUETOOTH_ROWS - EXTERNAL_ANTENNA_ROW - SERIAL_PORT_ROWS - 0 /* ADC filter */, - READONLY_ROW /* RAS */, - SPORT_PWR_ROW, - 1 /* debugs */, - EEPROM_ROWS - }); + + uint8_t MENU_TAB_ARRAY_NAME[HEADER_LINE + ITEM_RADIO_HARDWARE_MAX]; + _init_menu_tab_array(MENU_TAB_ARRAY_NAME, HEADER_LINE + ITEM_RADIO_HARDWARE_MAX); + + MENU_CHECK(menuTabGeneral, MENU_RADIO_HARDWARE, HEADER_LINE + ITEM_RADIO_HARDWARE_MAX); + title(STR_HARDWARE); uint8_t sub = menuVerticalPosition - HEADER_LINE; @@ -347,9 +247,9 @@ void menuRadioHardware(event_t event) for (uint8_t i=0; i 0 case ITEM_RADIO_HARDWARE_LABEL_POTS: lcdDrawTextAlignedLeft(y, STR_POTS); break; - case ITEM_RADIO_HARDWARE_POT1: -#if defined(HARDWARE_POT2) - case ITEM_RADIO_HARDWARE_POT2: -#endif -#if defined(HARDWARE_POT3) - case ITEM_RADIO_HARDWARE_POT3: -#endif -#if defined(HARDWARE_POT4) - case ITEM_RADIO_HARDWARE_POT4: -#endif - { - int idx = k - ITEM_RADIO_HARDWARE_POT1; - uint8_t shift = (2*idx); - uint8_t mask = (0x03 << shift); - lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+idx+1, menuHorizontalPosition < 0 ? attr : 0); - if (g_eeGeneral.anaNames[NUM_STICKS+idx][0] || (attr && s_editMode > 0 && menuHorizontalPosition == 0)) - editName(HW_SETTINGS_COLUMN1, y, - g_eeGeneral.anaNames[NUM_STICKS + idx], LEN_ANA_NAME, event, - attr && menuHorizontalPosition == 0, 0, old_editMode); - else - lcdDrawMMM(HW_SETTINGS_COLUMN1, y, menuHorizontalPosition==0 ? attr : 0); - uint8_t potType = (g_eeGeneral.potsConfig & mask) >> shift; - potType = editChoice(HW_SETTINGS_COLUMN2, y, "", STR_POTTYPES, potType, POT_NONE, POT_WITHOUT_DETENT, menuHorizontalPosition == 1 ? attr : 0, event); - g_eeGeneral.potsConfig &= ~mask; - g_eeGeneral.potsConfig |= (potType << shift); - break; - } - -#if NUM_SLIDERS > 0 - case ITEM_RADIO_HARDWARE_SLIDER1: - case ITEM_RADIO_HARDWARE_SLIDER2: -#if NUM_SLIDERS > 2 - case ITEM_RADIO_HARDWARE_SLIDER3: - case ITEM_RADIO_HARDWARE_SLIDER4: -#endif - { - int idx = k - ITEM_RADIO_HARDWARE_SLIDER1; - lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+NUM_POTS+idx+1, menuHorizontalPosition < 0 ? attr : 0); - if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx]) || (attr && menuHorizontalPosition == 0 && s_editMode > 0)) - editName(HW_SETTINGS_COLUMN1, y, - g_eeGeneral.anaNames[NUM_STICKS + NUM_POTS + idx], - LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0, - 0, old_editMode); - else - lcdDrawMMM(HW_SETTINGS_COLUMN1, y, menuHorizontalPosition == 0 ? attr : 0); - uint8_t mask = (0x01 << idx); - uint8_t potType = (g_eeGeneral.slidersConfig & mask) >> idx; - potType = editChoice(HW_SETTINGS_COLUMN2, y, "", STR_SLIDERTYPES, potType, SLIDER_NONE, SLIDER_WITH_DETENT, menuHorizontalPosition == 1 ? attr : 0, event); - g_eeGeneral.slidersConfig &= ~mask; - g_eeGeneral.slidersConfig |= (potType << idx); - break; - } -#endif -#endif - case ITEM_RADIO_HARDWARE_LABEL_SWITCHES: lcdDrawTextAlignedLeft(y, STR_SWITCHES); break; - case ITEM_RADIO_HARDWARE_SA: - case ITEM_RADIO_HARDWARE_SB: - case ITEM_RADIO_HARDWARE_SC: - case ITEM_RADIO_HARDWARE_SD: -#if !defined(RADIO_TPRO) -#if defined(HARDWARE_SWITCH_E) - case ITEM_RADIO_HARDWARE_SE: -#endif -#if defined(HARDWARE_SWITCH_F) - case ITEM_RADIO_HARDWARE_SF: -#endif -#if defined(HARDWARE_SWITCH_G) - case ITEM_RADIO_HARDWARE_SG: -#endif -#if defined(HARDWARE_SWITCH_H) - case ITEM_RADIO_HARDWARE_SH: -#endif -#if defined(HARDWARE_SWITCH_I) - case ITEM_RADIO_HARDWARE_SI: -#endif -#if defined(HARDWARE_SWITCH_J) - case ITEM_RADIO_HARDWARE_SJ: -#endif -#endif -#if defined(HARDWARE_SWITCH_K) - case ITEM_RADIO_HARDWARE_SK: - case ITEM_RADIO_HARDWARE_SL: - case ITEM_RADIO_HARDWARE_SM: - case ITEM_RADIO_HARDWARE_SN: - case ITEM_RADIO_HARDWARE_SO: - case ITEM_RADIO_HARDWARE_SP: - case ITEM_RADIO_HARDWARE_SQ: - case ITEM_RADIO_HARDWARE_SR: -#endif - { - int index = k - ITEM_RADIO_HARDWARE_SA; - int config = SWITCH_CONFIG(index); - lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH - MIXSRC_Rud + index + 1, menuHorizontalPosition < 0 ? attr : 0); - if (ZEXIST(g_eeGeneral.switchNames[index]) || (attr && s_editMode > 0 && menuHorizontalPosition == 0)) - editName(HW_SETTINGS_COLUMN1, y, g_eeGeneral.switchNames[index], - LEN_SWITCH_NAME, event, - menuHorizontalPosition == 0 ? attr : 0, 0, old_editMode); - else - lcdDrawMMM(HW_SETTINGS_COLUMN1, y, menuHorizontalPosition == 0 ? attr : 0); - config = editChoice(HW_SETTINGS_COLUMN2, y, "", STR_SWTYPES, config, SWITCH_NONE, SWITCH_TYPE_MAX(index), menuHorizontalPosition == 1 ? attr : 0, event); - if (attr && checkIncDec_Ret) { - swconfig_t mask = (swconfig_t)0x03 << (2*index); - g_eeGeneral.switchConfig = (g_eeGeneral.switchConfig & ~mask) | ((swconfig_t(config) & 0x03) << (2*index)); - } - break; - } - case ITEM_RADIO_HARDWARE_BATTERY_CALIB: -#if defined(PCBTARANIS) lcdDrawTextAlignedLeft(y, STR_BATT_CALIB); putsVolts(HW_SETTINGS_COLUMN2, y, getBatteryVoltage(), attr|PREC2|LEFT); -#else - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH, STR_BATT_CALIB); - putsVolts(HW_SETTINGS_COLUMN2, y, g_vbat100mV, attr|LEFT); -#endif if (attr) { CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127); } @@ -512,17 +290,6 @@ void menuRadioHardware(event_t event) g_eeGeneral.disableRtcWarning = 1 - editCheckBox(1 - g_eeGeneral.disableRtcWarning, HW_SETTINGS_COLUMN2, y, STR_RTC_CHECK, attr, event); break; -#if defined(TX_CAPACITY_MEASUREMENT) - case ITEM_RADIO_HARDWARE_CAPACITY_CALIB: - lcdDrawTextAlignedLeft(y, STR_CURRENT_CALIB); - drawValueWithUnit(HW_SETTINGS_COLUMN2, y, getCurrent(), UNIT_MILLIAMPS, attr); - if (attr) { - CHECK_INCDEC_GENVAR(event, g_eeGeneral.txCurrentCalibration, -49, 49); - } - break; -#endif - -#if !defined(PCBX9D) && !defined(PCBX9DP) && !defined(PCBX9E) case ITEM_RADIO_HARDWARE_LABEL_INTERNAL_MODULE: lcdDrawTextAlignedLeft(y, STR_INTERNALRF); break; @@ -545,9 +312,7 @@ void menuRadioHardware(event_t event) #endif } } break; -#endif -#if !defined(PCBX9D) && !defined(PCBX9DP) && !defined(PCBX9E) case ITEM_RADIO_HARDWARE_INTERNAL_MODULE_BAUDRATE: lcdDrawText(INDENT_WIDTH, y, STR_BAUDRATE); lcdDrawTextAtIndex(HW_SETTINGS_COLUMN2, y, STR_CRSF_BAUDRATE, CROSSFIRE_STORE_TO_INDEX(g_eeGeneral.internalModuleBaudrate),attr | LEFT); @@ -558,15 +323,14 @@ void menuRadioHardware(event_t event) } } break; -#endif -#if defined(HARDWARE_EXTERNAL_MODULE) + case ITEM_RADIO_HARDWARE_SERIAL_SAMPLE_MODE: g_eeGeneral.uartSampleMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_SAMPLE_MODE, STR_SAMPLE_MODES, g_eeGeneral.uartSampleMode, 0, UART_SAMPLE_MODE_MAX, attr, event); if (attr && checkIncDec_Ret) { restartModule(EXTERNAL_MODULE); } break; -#endif + #if defined(BLUETOOTH) case ITEM_RADIO_HARDWARE_BLUETOOTH_MODE: lcdDrawTextAlignedLeft(y, STR_BLUETOOTH); @@ -614,33 +378,15 @@ void menuRadioHardware(event_t event) break; #endif -#if defined(AUX_SERIAL) || defined(USB_SERIAL) case ITEM_RADIO_HARDWARE_SERIAL_PORT_LABEL: lcdDrawTextAlignedLeft(y, STR_AUX_SERIAL_MODE); break; - case ITEM_RADIO_HARDWARE_AUX1_SERIAL_MODE: - case ITEM_RADIO_HARDWARE_AUX2_SERIAL_MODE: - case ITEM_RADIO_HARDWARE_VCP_SERIAL_MODE: - { - auto port_nr = k - ITEM_RADIO_HARDWARE_AUX1_SERIAL_MODE; - auto port = serialGetPort(port_nr); - if (port && port->name) { - lcdDrawText(INDENT_WIDTH, y, port->name); - auto mode = serialGetMode(port_nr); - mode = editChoice(HW_SETTINGS_COLUMN2, y, nullptr, - STR_AUX_SERIAL_MODES, mode, 0, UART_MODE_MAX, attr, - event, _isSerialModeAvailable[port_nr]); - - if (attr && checkIncDec_Ret) { - serialSetMode(port_nr, mode); - serialInit(port_nr, mode); - } - } - } break; -#endif case ITEM_RADIO_HARDWARE_JITTER_FILTER: - g_eeGeneral.noJitterFilter = 1 - editCheckBox(1 - g_eeGeneral.noJitterFilter, HW_SETTINGS_COLUMN2, y, STR_JITTER_FILTER, attr, event); + g_eeGeneral.noJitterFilter = + 1 - editCheckBox(1 - g_eeGeneral.noJitterFilter, + HW_SETTINGS_COLUMN2, y, STR_JITTER_FILTER, attr, + event); break; case ITEM_RADIO_HARDWARE_RAS: @@ -661,15 +407,12 @@ void menuRadioHardware(event_t event) lcdDrawText(lcdNextPos, y, "---"); break; - case ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER: - g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN2, y, STR_SPORT_UPDATE_POWER_MODE, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event); - if (attr && checkIncDec_Ret) { - auto mod_desc = modulePortGetModuleDescription(SPORT_MODULE); - if (mod_desc && mod_desc->set_pwr) { - mod_desc->set_pwr(g_eeGeneral.sportUpdatePower); - } - } - break; + case ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER: + g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN2, y, STR_SPORT_UPDATE_POWER_MODE, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event); + if (attr && checkIncDec_Ret) { + modulePortSetPower(SPORT_MODULE, g_eeGeneral.sportUpdatePower); + } + break; case ITEM_RADIO_HARDWARE_DEBUG: lcdDrawTextAlignedLeft(y, STR_DEBUG); @@ -682,6 +425,14 @@ void menuRadioHardware(event_t event) pushMenu(menuRadioDiagKeys); } break; +#if defined(FUNCTION_SWITCHES) + case ITEM_RADIO_HARDWARE_DEBUG_FS: + lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_FS_BTN, attr); + if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { + pushMenu(menuRadioDiagFS); + } + break; +#endif #if defined(EEPROM) case ITEM_RADIO_BACKUP_EEPROM: @@ -706,7 +457,89 @@ void menuRadioHardware(event_t event) } break; #endif + + default: + if (k <= ITEM_RADIO_HARDWARE_STICK_END) { + // Sticks + editStickHardwareSettings(HW_SETTINGS_COLUMN1, y, + k - ITEM_RADIO_HARDWARE_STICK, event, + attr, old_editMode); + + } else if (k <= ITEM_RADIO_HARDWARE_POT_END) { + // Pots & sliders + int idx = k - ITEM_RADIO_HARDWARE_POT; + uint8_t shift = (POT_CFG_BITS * idx); + potconfig_t mask = POT_CONFIG_MASK(idx); + + // draw hw name + LcdFlags flags = menuHorizontalPosition < 0 ? attr : 0; + lcdDrawText(INDENT_WIDTH, y, STR_CHAR_POT, flags); + lcdDrawText(lcdNextPos, y, adcGetInputName(ADC_INPUT_POT, idx), flags); + + // draw custom name + if (analogHasCustomLabel(ADC_INPUT_POT, idx) || + (attr && s_editMode > 0 && menuHorizontalPosition == 0)) { + editName(HW_SETTINGS_COLUMN1, y, + (char*)analogGetCustomLabel(ADC_INPUT_POT, idx), LEN_ANA_NAME, event, + attr && menuHorizontalPosition == 0, 0, old_editMode); + } else { + lcdDrawMMM(HW_SETTINGS_COLUMN1, y, menuHorizontalPosition==0 ? attr : 0); + } + + // pot config + uint8_t potType = (g_eeGeneral.potsConfig & mask) >> shift; + potType = editChoice(HW_SETTINGS_COLUMN2, y, "", STR_POTTYPES, potType, + POT_NONE, POT_SLIDER_WITH_DETENT, + menuHorizontalPosition == 1 ? attr : 0, event); + g_eeGeneral.potsConfig &= ~mask; + g_eeGeneral.potsConfig |= (potType << shift); + + } else if (k <= ITEM_RADIO_HARDWARE_SWITCH_END) { + // Switches + int index = k - ITEM_RADIO_HARDWARE_SWITCH; + int config = SWITCH_CONFIG(index); + + LcdFlags flags = menuHorizontalPosition < 0 ? attr : 0; + lcdDrawText(INDENT_WIDTH, y, STR_CHAR_SWITCH, flags); + lcdDrawText(lcdNextPos, y, switchGetName(index), flags); + + flags = menuHorizontalPosition == 0 ? attr : 0; + if (switchHasCustomName(index) || + (attr && s_editMode > 0 && menuHorizontalPosition == 0)) { + editName(HW_SETTINGS_COLUMN1, y, (char*)switchGetCustomName(index), + LEN_SWITCH_NAME, event, flags, 0, old_editMode); + } else { + lcdDrawMMM(HW_SETTINGS_COLUMN1, y, flags); + } + + flags = menuHorizontalPosition == 1 ? attr : 0; + config = editChoice(HW_SETTINGS_COLUMN2, y, "", STR_SWTYPES, config, + SWITCH_NONE, switchGetMaxType(index), flags, event); + + if (attr && checkIncDec_Ret) { + swconfig_t mask = SWITCH_CONFIG_MASK(index); + g_eeGeneral.switchConfig = + (g_eeGeneral.switchConfig & ~mask) | + ((swconfig_t(config) & SW_CFG_MASK) << (SW_CFG_BITS * index)); + } + } else if (k <= ITEM_RADIO_HARDWARE_SERIAL_PORT_END) { + auto port_nr = k - ITEM_RADIO_HARDWARE_SERIAL_PORT; + auto port = serialGetPort(port_nr); + if (port && port->name) { + lcdDrawText(INDENT_WIDTH, y, port->name); + + auto mode = serialGetMode(port_nr); + mode = editChoice(HW_SETTINGS_COLUMN2, y, nullptr, + STR_AUX_SERIAL_MODES, mode, 0, UART_MODE_MAX, attr, + event, _isSerialModeAvailable[port_nr]); + + if (attr && checkIncDec_Ret) { + serialSetMode(port_nr, mode); + serialInit(port_nr, mode); + } + } + } + break; } } } -#endif diff --git a/radio/src/gui/common/stdlcd/radio_trainer.cpp b/radio/src/gui/common/stdlcd/radio_trainer.cpp index 07f48589f..038b7fae2 100644 --- a/radio/src/gui/common/stdlcd/radio_trainer.cpp +++ b/radio/src/gui/common/stdlcd/radio_trainer.cpp @@ -20,6 +20,8 @@ */ #include "opentx.h" +#include "hal/adc_driver.h" +#include "input_mapping.h" #if LCD_W >= 212 #define TRAINER_CALIB_COLUMN_WIDTH (6 * FW) @@ -48,11 +50,13 @@ void menuRadioTrainer(event_t event) y = MENU_HEADER_HEIGHT + 1 + FH; - for (uint8_t i=HEADER_LINE; i NUM_BODY_LINES) { - if (menuVerticalOffset-- == 0) - menuVerticalOffset = lines - 1; - } - break; - - case EVT_KEY_NEXT_LINE: - if (lines > NUM_BODY_LINES) { - if (++menuVerticalOffset + NUM_BODY_LINES > lines) - menuVerticalOffset = 0; - } - break; - - case EVT_KEY_BREAK(KEY_EXIT): - if (menuVerticalOffset != 0) + if (IS_PREVIOUS_EVENT(event)) { + if (lines > NUM_BODY_LINES) { + if (menuVerticalOffset-- == 0) + menuVerticalOffset = lines - 1; + } + } else if (IS_NEXT_EVENT(event)) { + if (lines > NUM_BODY_LINES) { + if (++menuVerticalOffset + NUM_BODY_LINES > lines) menuVerticalOffset = 0; - else - popMenu(); - break; + } + } else if (event == EVT_KEY_BREAK(KEY_EXIT)) { + if (menuVerticalOffset != 0) + menuVerticalOffset = 0; + else + popMenu(); } } #endif diff --git a/radio/src/gui/common/stdlcd/view_telemetry.cpp b/radio/src/gui/common/stdlcd/view_telemetry.cpp index f5352d6c8..0b6fc8b69 100644 --- a/radio/src/gui/common/stdlcd/view_telemetry.cpp +++ b/radio/src/gui/common/stdlcd/view_telemetry.cpp @@ -33,8 +33,8 @@ enum NavigationDirection { #define incrTelemetryScreen() direction = NAVIGATION_DIRECTION_DOWN #if defined(NAVIGATION_XLITE) - #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_LEFT) && IS_SHIFT_PRESSED()) - #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_RIGHT) && IS_SHIFT_PRESSED()) + #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_LEFT) && keysGetState(KEY_SHIFT)) + #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_RIGHT) && keysGetState(KEY_SHIFT)) #elif defined(KEYS_GPIO_REG_PAGEDN) #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_PAGEUP)) #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_PAGEDN)) diff --git a/radio/src/gui/common/stdlcd/view_text.cpp b/radio/src/gui/common/stdlcd/view_text.cpp index 35dbea976..5185074ee 100644 --- a/radio/src/gui/common/stdlcd/view_text.cpp +++ b/radio/src/gui/common/stdlcd/view_text.cpp @@ -21,14 +21,6 @@ #include "opentx.h" -#if defined(ROTARY_ENCODER_NAVIGATION) -#define EVT_KEY_NEXT_LINE EVT_ROTARY_RIGHT -#define EVT_KEY_PREVIOUS_LINE EVT_ROTARY_LEFT -#else -#define EVT_KEY_NEXT_LINE EVT_KEY_FIRST(KEY_DOWN) -#define EVT_KEY_PREVIOUS_LINE EVT_KEY_FIRST(KEY_UP) -#endif - constexpr uint32_t TEXT_FILE_MAXSIZE = 2048; static void sdReadTextFile(const char * filename, char lines[TEXT_VIEWER_LINES][LCD_COLS + 1], int & lines_count) @@ -132,32 +124,22 @@ void readModelNotes() void menuTextView(event_t event) { - switch (event) { - case EVT_ENTRY: + if (event == EVT_ENTRY) { menuVerticalOffset = 0; reusableBuffer.viewText.linesCount = 0; sdReadTextFile(reusableBuffer.viewText.filename, reusableBuffer.viewText.lines, reusableBuffer.viewText.linesCount); - break; - - case EVT_KEY_PREVIOUS_LINE: - if (menuVerticalOffset == 0) - break; - else - menuVerticalOffset--; + } else if (IS_PREVIOUS_EVENT(event)) { + if (menuVerticalOffset > 0) { + menuVerticalOffset--; sdReadTextFile(reusableBuffer.viewText.filename, reusableBuffer.viewText.lines, reusableBuffer.viewText.linesCount); - break; - - case EVT_KEY_NEXT_LINE: - if (menuVerticalOffset+LCD_LINES-1 >= reusableBuffer.viewText.linesCount) - break; - else - ++menuVerticalOffset; + } + } else if (IS_NEXT_EVENT(event)) { + if (menuVerticalOffset + LCD_LINES-1 < reusableBuffer.viewText.linesCount) { + ++menuVerticalOffset; sdReadTextFile(reusableBuffer.viewText.filename, reusableBuffer.viewText.lines, reusableBuffer.viewText.linesCount); - break; - - case EVT_KEY_BREAK(KEY_EXIT): - popMenu(); - break; + } + } else if (event == EVT_KEY_BREAK(KEY_EXIT)) { + popMenu(); } for (int i=0; i= MIXSRC_FIRST_LUA && source <= MIXSRC_LAST_LUA) { if (modelCustomScriptsEnabled()) { div_t qr = div(source - MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS); - return (qr.rem= MIXSRC_FIRST_POT && source <= MIXSRC_LAST_POT) { - return IS_POT_SLIDER_AVAILABLE(POT1+source - MIXSRC_FIRST_POT); + if (source >= MIXSRC_FIRST_STICK && source <= MIXSRC_LAST_STICK) { + auto idx = source - MIXSRC_FIRST_STICK; + return idx < adcGetMaxInputs(ADC_INPUT_MAIN); } -#if defined(PCBX10) - if (source >= MIXSRC_MOUSE1 && source <= MIXSRC_MOUSE2) - return false; + if (source >= MIXSRC_FIRST_POT && source <= MIXSRC_LAST_POT) { + return IS_POT_SLIDER_AVAILABLE(source - MIXSRC_FIRST_POT); + } + +#if MAX_AXIS > 0 + if (source >= MIXSRC_FIRST_AXIS && source <= MIXSRC_LAST_AXIS) + return source - MIXSRC_FIRST_AXIS < adcGetMaxInputs(ADC_INPUT_AXIS); #endif #if defined(PCBHORUS) && !defined(SPACEMOUSE) @@ -217,15 +216,15 @@ bool isSourceAvailable(int source) } #if !defined(HELI) - if (source >= MIXSRC_CYC1 && source <= MIXSRC_CYC3) + if (source >= MIXSRC_FIRST_HELI && source <= MIXSRC_LAST_HELI) return false; #else if (!modelHeliEnabled() && source >= MIXSRC_CYC1 && source <= MIXSRC_CYC3) return false; #endif - if (source >= MIXSRC_FIRST_CH && source <= MIXSRC_LAST_CH) { - return isChannelUsed(source - MIXSRC_FIRST_CH); + if (source >= MIXSRC_FIRST_TRIM && source <= MIXSRC_LAST_TRIM) { + return (source - MIXSRC_FIRST_TRIM) < keysGetMaxTrims(); } if (source >= MIXSRC_FIRST_LOGICAL_SWITCH && source <= MIXSRC_LAST_LOGICAL_SWITCH) { @@ -233,6 +232,13 @@ bool isSourceAvailable(int source) return (cs->func != LS_FUNC_NONE); } + if (source >= MIXSRC_FIRST_TRAINER && source <= MIXSRC_LAST_TRAINER) + return g_model.trainerData.mode > 0; + + if (source >= MIXSRC_FIRST_CH && source <= MIXSRC_LAST_CH) { + return isChannelUsed(source - MIXSRC_FIRST_CH); + } + #if !defined(GVARS) if (source >= MIXSRC_GVAR1 && source <= MIXSRC_LAST_GVAR) return false; @@ -241,11 +247,12 @@ bool isSourceAvailable(int source) return false; #endif - if (source >= MIXSRC_FIRST_RESERVE && source <= MIXSRC_LAST_RESERVE) - return false; + // TX VOLTAGE, TIME and GPS are always true - if (source >= MIXSRC_FIRST_TRAINER && source <= MIXSRC_LAST_TRAINER) - return g_model.trainerData.mode > 0; + if (source >= MIXSRC_FIRST_TIMER && source <= MIXSRC_LAST_TIMER) { + TimerData *timer = &g_model.timers[source - MIXSRC_FIRST_TIMER]; + return timer->mode != 0; + } if (source >= MIXSRC_FIRST_TELEM && source <= MIXSRC_LAST_TELEM) { if (!modelTelemetryEnabled()) @@ -282,19 +289,38 @@ bool isSourceAvailableInCustomSwitches(int source) bool isSourceAvailableInInputs(int source) { - if (source >= MIXSRC_FIRST_POT && source <= MIXSRC_LAST_POT) - return IS_POT_SLIDER_AVAILABLE(POT1+source - MIXSRC_FIRST_POT); + if (source >= MIXSRC_FIRST_STICK && source <= MIXSRC_LAST_STICK) { + auto idx = source - MIXSRC_FIRST_STICK; + return idx < adcGetMaxInputs(ADC_INPUT_MAIN); + } -#if defined(PCBX10) - if (source >= MIXSRC_MOUSE1 && source <= MIXSRC_MOUSE2) - return false; + if (source >= MIXSRC_FIRST_POT && source <= MIXSRC_LAST_POT) + return IS_POT_SLIDER_AVAILABLE(source - MIXSRC_FIRST_POT); + +#if MAX_AXIS > 0 + if (source >= MIXSRC_FIRST_AXIS && source <= MIXSRC_LAST_AXIS) { + auto idx = source - MIXSRC_FIRST_AXIS; + return idx < adcGetMaxInputs(ADC_INPUT_AXIS); + } #endif - if (source >= MIXSRC_Rud && source <= MIXSRC_MAX) +#if defined(IMU) + if (source == MIXSRC_TILT_X || source == MIXSRC_TILT_Y) + return true; +#endif + +#if defined(PCBHORUS) && defined(SPACEMOUSE) + if (source >= MIXSRC_FIRST_SPACEMOUSE && source <= MIXSRC_LAST_SPACEMOUSE) + return true; +#endif + + if (source == MIXSRC_MAX) return true; - if (source >= MIXSRC_FIRST_TRIM && source <= MIXSRC_LAST_TRIM) - return true; + if (source >= MIXSRC_FIRST_TRIM && source <= MIXSRC_LAST_TRIM) { + auto idx = source - MIXSRC_FIRST_TRIM; + return idx < keysGetMaxTrims(); + } if (source >= MIXSRC_FIRST_SWITCH && source <= MIXSRC_LAST_SWITCH) return SWITCH_EXISTS(source - MIXSRC_FIRST_SWITCH); @@ -303,7 +329,7 @@ bool isSourceAvailableInInputs(int source) return true; if (source >= MIXSRC_FIRST_LOGICAL_SWITCH && source <= MIXSRC_LAST_LOGICAL_SWITCH) { - LogicalSwitchData * cs = lswAddress(source - MIXSRC_SW1); + LogicalSwitchData * cs = lswAddress(source - MIXSRC_FIRST_LOGICAL_SWITCH); return (cs->func != LS_FUNC_NONE); } @@ -359,13 +385,16 @@ bool isSwitchAvailable(int swtch, SwitchContext context) return true; } -#if NUM_XPOTS > 0 if (swtch >= SWSRC_FIRST_MULTIPOS_SWITCH && swtch <= SWSRC_LAST_MULTIPOS_SWITCH) { - int index __attribute__((unused)) = (swtch - SWSRC_FIRST_MULTIPOS_SWITCH) / XPOTS_MULTIPOS_COUNT; - return IS_POT_MULTIPOS(POT1+index); + int index = (swtch - SWSRC_FIRST_MULTIPOS_SWITCH) / XPOTS_MULTIPOS_COUNT; + return IS_POT_MULTIPOS(index); } -#endif + if (swtch >= SWSRC_FIRST_TRIM && swtch <= SWSRC_LAST_TRIM) { + int index = (swtch - SWSRC_FIRST_TRIM) / 2; + return index < keysGetMaxTrims(); + } + if (swtch >= SWSRC_FIRST_LOGICAL_SWITCH && swtch <= SWSRC_LAST_LOGICAL_SWITCH) { if (context == GeneralCustomFunctionsContext) { return false; @@ -525,7 +554,7 @@ bool isThrottleSourceAvailable(int src) src = throttleSource2Source(src); #endif return isSourceAvailable(src) && - ((src == MIXSRC_Thr) || + ((src == MIXSRC_FIRST_STICK + inputMappingGetThrottle()) || ((src >= MIXSRC_FIRST_POT) && (src <= MIXSRC_LAST_POT)) || ((src >= MIXSRC_FIRST_CH) && (src <= MIXSRC_LAST_CH))); } @@ -555,18 +584,17 @@ bool isAssignableFunctionAvailable(int function, CustomFunctionData * functions) return false; #endif #if !defined(HAPTIC) - case FUNC_HAPTIC: + case FUNC_HAPTIC: #endif - case FUNC_RESERVE4: #if !defined(DANGEROUS_MODULE_FUNCTIONS) case FUNC_RANGECHECK: case FUNC_BIND: + return false; #endif #if !defined(LUA) case FUNC_PLAY_SCRIPT: -#endif - case FUNC_RESERVE5: return false; +#endif default: return true; diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 6b7b05a2e..7787498d9 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -34,12 +34,8 @@ #if defined(ROTARY_ENCODER_NAVIGATION) #define CASE_ROTARY_ENCODER(x) x, - #define CASE_EVT_ROTARY_LEFT case EVT_ROTARY_LEFT: - #define CASE_EVT_ROTARY_RIGHT case EVT_ROTARY_RIGHT: #else #define CASE_ROTARY_ENCODER(x) - #define CASE_EVT_ROTARY_LEFT - #define CASE_EVT_ROTARY_RIGHT #endif #if defined(NAVIGATION_X7) || defined(NAVIGATION_X9D) diff --git a/radio/src/gui/navigation/common.cpp b/radio/src/gui/navigation/common.cpp index adc729423..e4feec27d 100644 --- a/radio/src/gui/navigation/common.cpp +++ b/radio/src/gui/navigation/common.cpp @@ -20,31 +20,24 @@ */ #include "opentx.h" +#include "navigation.h" + +#include "hal/switch_driver.h" +#include "switches.h" #if defined(AUTOSWITCH) swsrc_t checkIncDecMovedSwitch(swsrc_t val) { - if (s_editMode>0) { - swsrc_t swtch = getMovedSwitch(); - if (swtch) { -#if defined(PCBFRSKY) - div_t info = switchInfo(swtch); - if (IS_CONFIG_TOGGLE(info.quot)) { - if (info.rem != 0) { - val = (val == swtch ? swtch-2 : swtch); - } + swsrc_t swtch = getMovedSwitch(); + if (swtch) { + div_t info = switchInfo(swtch); + if (IS_CONFIG_TOGGLE(info.quot)) { + if (info.rem != 0) { + val = (val == swtch ? swtch-2 : swtch); } - else { - val = swtch; - } -#else - if (IS_CONFIG_TOGGLE(swtch) && swtch==val) { - val = -val; - } - else { - val = swtch; - } -#endif + } + else { + val = swtch; } } return val; @@ -55,7 +48,7 @@ int checkIncDecSelection = 0; void repeatLastCursorMove(event_t event) { - if (CURSOR_MOVED_LEFT(event) || CURSOR_MOVED_RIGHT(event)) { + if (IS_PREVIOUS_EVENT(event) || IS_NEXT_EVENT(event)) { pushEvent(event); } else { @@ -63,13 +56,36 @@ void repeatLastCursorMove(event_t event) } } +void onSwitchLongEnterPress(const char * result) +{ + if (result == STR_MENU_SWITCHES) { + checkIncDecSelection = SWSRC_FIRST_SWITCH; + } else if (result == STR_MENU_TRIMS) { + checkIncDecSelection = SWSRC_FIRST_TRIM; + } else if (result == STR_MENU_LOGICAL_SWITCHES) { + checkIncDecSelection = + SWSRC_FIRST_LOGICAL_SWITCH + + getFirstAvailable(0, MAX_LOGICAL_SWITCHES, isLogicalSwitchAvailable); + } else if (result == STR_MENU_OTHER) { + checkIncDecSelection = SWSRC_ON; + } else if (result == STR_MENU_INVERT) { + checkIncDecSelection = SWSRC_INVERT; + } +} + void onSourceLongEnterPress(const char * result) { - if (result == STR_MENU_INPUTS) - checkIncDecSelection = getFirstAvailable(MIXSRC_FIRST_INPUT, MIXSRC_LAST_INPUT, isInputAvailable)+1; + if (result == STR_MENU_INPUTS) { + checkIncDecSelection = + getFirstAvailable(MIXSRC_FIRST_INPUT, MIXSRC_LAST_INPUT, + isInputAvailable) + + 1; + } #if defined(LUA_MODEL_SCRIPTS) - else if (result == STR_MENU_LUA) - checkIncDecSelection = getFirstAvailable(MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA, isSourceAvailable); + else if (result == STR_MENU_LUA) { + checkIncDecSelection = + getFirstAvailable(MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA, isSourceAvailable); + } #endif else if (result == STR_MENU_STICKS) checkIncDecSelection = MIXSRC_FIRST_STICK; diff --git a/radio/src/gui/navigation/navigation.h b/radio/src/gui/navigation/navigation.h new file mode 100644 index 000000000..bb6d2a394 --- /dev/null +++ b/radio/src/gui/navigation/navigation.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 + +struct CheckIncDecStops +{ + const int count; + const int stops[]; + int min() const + { + return stops[0]; + } + int max() const + { + return stops[count-1]; + } + bool contains(int value) const + { + for (int i=0; i stops.max() ? stops.max() : i_max); - while (isValueAvailable && !isValueAvailable(newval) && newval>i_min) { - --newval; - } - } - else if (DBLKEYS_PRESSED_LFT_DWN(in)) { - newval = (i_min < stops.min() ? stops.min() : i_min); - while (isValueAvailable && !isValueAvailable(newval) && newval0 && (IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)))) { + if (s_editMode > 0) { + if (event == EVT_KEY_FIRST(KEY_UP) || event == EVT_KEY_REPT(KEY_UP) || + event == EVT_KEY_FIRST(KEY_RIGHT) || event == EVT_KEY_REPT(KEY_RIGHT)) { do { if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { - newval += min(10, i_max-val); + newval += min(10, i_max - val); } else { newval++; } - } while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max); + } while (isValueAvailable && !isValueAvailable(newval) && + newval <= i_max); if (newval > i_max) { newval = val; killEvents(event); AUDIO_KEY_ERROR(); } - } - else if ((s_editMode>0 && (IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)))) { + } else if (event == EVT_KEY_FIRST(KEY_DOWN) || event == EVT_KEY_REPT(KEY_DOWN) || + event == EVT_KEY_FIRST(KEY_LEFT) || event == EVT_KEY_REPT(KEY_LEFT)) { do { if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { - newval -= min(10, val-i_min); - } - else { + newval -= min(10, val - i_min); + } else { newval--; } - } while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min); - + } while (isValueAvailable && !isValueAvailable(newval) && + newval >= i_min); + if (newval < i_min) { newval = val; killEvents(event); @@ -116,20 +87,14 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla } } - if (!READ_ONLY() && i_min==0 && i_max==1 && (event==EVT_KEY_BREAK(KEY_ENTER) || IS_ROTARY_BREAK(event))) { - s_editMode = 0; - newval = !val; - } - #if defined(AUTOSWITCH) - if (i_flags & INCDEC_SWITCH) { - newval = checkIncDecMovedSwitch(newval); - } + if (i_flags & INCDEC_SWITCH) { + newval = checkIncDecMovedSwitch(newval); + } #endif #if defined(AUTOSOURCE) - if (i_flags & INCDEC_SOURCE) { - if (s_editMode>0) { + if (i_flags & INCDEC_SOURCE) { int8_t source = GET_MOVED_SOURCE(i_min, i_max); if (source) { newval = source; @@ -143,14 +108,27 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla } #endif } - } #endif + } + + if (!READ_ONLY() && i_min == 0 && i_max == 1 && + (event == EVT_KEY_BREAK(KEY_ENTER))) { + s_editMode = 0; + newval = !val; + } if (newval != val) { - if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && (newval==0 || newval==-100 || newval==+100) && !IS_ROTARY_EVENT(event)) { - pauseEvents(event); // delay before auto-repeat continues + if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && + (newval != i_min) && stops.contains(newval)) { + bool pause = (newval > val ? !stops.contains(newval + 1) + : !stops.contains(newval - 1)); + if (pause) { + pauseEvents(event); // delay before auto-repeat continues + } + } + if (!IS_KEY_REPT(event)) { + AUDIO_KEY_PRESS(); } - AUDIO_KEY_PRESS(); storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); checkIncDec_Ret = (newval > val ? 1 : -1); } @@ -204,7 +182,9 @@ uint8_t menuIdx(const MenuHandler * menuTab, uint8_t curr) return menuSize(menuTab, curr + 1) - 1; } -void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menuTabSize, const uint8_t *horTab, uint8_t horTabMax, vertpos_t maxrow) +void check(event_t event, uint8_t curr, const MenuHandler *menuTab, + uint8_t menuTabSize, const uint8_t *horTab, uint8_t horTabMax, + vertpos_t maxrow, uint8_t flags) { vertpos_t l_posVert = menuVerticalPosition; horzpos_t l_posHorz = menuHorizontalPosition; @@ -220,34 +200,10 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menu int8_t cc = curr; switch (event) { -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_BREAK: - if (s_editMode < 0 && maxrow > 0) { - s_editMode = 0; - // TODO ? l_posVert = (horTab && horTab[1]==0xff) ? 2 : 1; - l_posHorz = 0; - } - else { - s_editMode = -1; - } - event = 0; - break; -#endif - -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_LEFT: - if (s_editMode >= 0) - break; -#endif case EVT_KEY_FIRST(KEY_LEFT): cc = chgMenu(curr, menuTab, menuTabSize, -1); break; -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_RIGHT: - if (s_editMode >= 0) - break; -#endif case EVT_KEY_FIRST(KEY_RIGHT): cc = chgMenu(curr, menuTab, menuTabSize, 1); break; @@ -256,11 +212,6 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menu if (cc != curr) { chainMenu(menuTab[cc].menuFunc); } - -#if defined(ROTARY_ENCODER_NAVIGATION) - if (IS_ROTARY_ENCODER_NAVIGATION_ENABLE() && s_editMode < 0) - attr = INVERS|BLINK; -#endif } menuCalibrationState = 0; @@ -273,25 +224,8 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menu menuEntryTime = get_tmr10ms(); l_posVert = 0; l_posHorz = POS_HORZ_INIT(l_posVert); -#if defined(ROTARY_ENCODER_NAVIGATION) - if (menuTab) { - s_editMode = EDIT_MODE_INIT; - break; - } - // no break -#else s_editMode = EDIT_MODE_INIT; break; -#endif - -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ENTRY_UP: - s_editMode = 0; - break; - - case EVT_ROTARY_BREAK: - if (s_editMode > 1) break; -#endif case EVT_KEY_FIRST(KEY_ENTER): if (!menuTab || l_posVert>0) { @@ -301,18 +235,6 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menu } break; -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_LONG: - if (s_editMode > 1) break; - killEvents(event); - if (l_posVert != 0) { - l_posVert = 0; - s_editMode = EDIT_MODE_INIT; - break; - } - // no break -#endif - case EVT_KEY_LONG(KEY_EXIT): s_editMode = 0; // TODO needed? we call ENTRY_UP after which does the same popMenu(); @@ -320,11 +242,6 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menu case EVT_KEY_BREAK(KEY_EXIT): AUDIO_KEY_PRESS(); -#if defined(ROTARY_ENCODER_NAVIGATION) - if (s_editMode == 0) - s_editMode = EDIT_MODE_INIT; - else -#endif if (s_editMode>0) { s_editMode = 0; break; @@ -345,47 +262,18 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menu case EVT_KEY_FIRST(KEY_RIGHT)://inc if (!horTab || s_editMode>0) break; - -#if defined(ROTARY_ENCODER_NAVIGATION) - CASE_EVT_ROTARY_RIGHT - if (s_editMode != 0) break; - if (l_posHorz < maxcol) { - l_posHorz++; - break; - } - else { - l_posHorz = 0; - if (!IS_ROTARY_RIGHT(event)) - break; - } -#else INC(l_posHorz, 0, maxcol); break; -#endif case EVT_KEY_REPT(KEY_DOWN): - if (!IS_ROTARY_RIGHT(event) && l_posVert==maxrow) break; + if (l_posVert==maxrow) break; // no break case EVT_KEY_FIRST(KEY_DOWN): if (s_editMode>0) break; do { -#if defined(ROTARY_ENCODER_NAVIGATION) - if (g_eeGeneral.rotEncMode >= - ROTARY_ENCODER_MODE_INVERT_VERT_HORZ_NORM) { - DEC(l_posVert, 0, maxrow); - } else { - INC(l_posVert, 0, maxrow); - } -#else INC(l_posVert, 0, maxrow); -#endif } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); - -#if defined(ROTARY_ENCODER_NAVIGATION) - s_editMode = 0; // if we go down, we must be in this mode -#endif - l_posHorz = min(l_posHorz, MAXCOL(l_posVert)); break; @@ -395,50 +283,18 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menu case EVT_KEY_FIRST(KEY_LEFT)://dec if (!horTab || s_editMode>0) break; - -#if defined(ROTARY_ENCODER_NAVIGATION) - CASE_EVT_ROTARY_LEFT - if (s_editMode != 0) break; - if (l_posHorz > 0) { - l_posHorz--; - break; - } else if (IS_ROTARY_LEFT(event) && s_editMode == 0) { - l_posHorz = 0xff; - } else { - l_posHorz = - g_eeGeneral.rotEncMode == ROTARY_ENCODER_MODE_INVERT_VERT_HORZ_ALT - ? 0 - : maxcol; - break; - } -#else DEC(l_posHorz, 0, maxcol); break; -#endif case EVT_KEY_REPT(KEY_UP): - if (!IS_ROTARY_LEFT(event) && l_posVert==0) break; + if (l_posVert==0) break; // no break case EVT_KEY_FIRST(KEY_UP): if (s_editMode>0) break; do { -#if defined(ROTARY_ENCODER_NAVIGATION) - if (g_eeGeneral.rotEncMode >= - ROTARY_ENCODER_MODE_INVERT_VERT_HORZ_NORM) { - INC(l_posVert, 0, maxrow); - } else { - DEC(l_posVert, 0, maxrow); - } -#else DEC(l_posVert, 0, maxrow); -#endif } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); - -#if defined(ROTARY_ENCODER_NAVIGATION) - s_editMode = 0; // if we go up, we must be in this mode -#endif - l_posHorz = min((uint8_t)l_posHorz, MAXCOL(l_posVert)); break; } @@ -511,4 +367,3 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menu } } } - diff --git a/radio/src/gui/navigation/navigation_x7.cpp b/radio/src/gui/navigation/navigation_x7.cpp index d714ac8c4..72bc5b42c 100644 --- a/radio/src/gui/navigation/navigation_x7.cpp +++ b/radio/src/gui/navigation/navigation_x7.cpp @@ -20,86 +20,83 @@ */ #include "opentx.h" +#include "navigation.h" + +#include "switches.h" +#include "hal/rotary_encoder.h" vertpos_t menuVerticalOffset; +vertpos_t menuVerticalPosition; +horzpos_t menuHorizontalPosition; + int8_t s_editMode; uint8_t noHighlightCounter; uint8_t menuCalibrationState; -vertpos_t menuVerticalPosition; -horzpos_t menuHorizontalPosition; -int8_t checkIncDec_Ret; -#define DBLKEYS_PRESSED_RGT_LFT(in) (false) -#define DBLKEYS_PRESSED_UP_DWN(in) (false) -#define DBLKEYS_PRESSED_RGT_UP(in) (false) -#define DBLKEYS_PRESSED_LFT_DWN(in) (false) +int8_t checkIncDec_Ret; INIT_STOPS(stops100, 3, -100, 0, 100) INIT_STOPS(stops1000, 3, -1000, 0, 1000) -INIT_STOPS(stopsSwitch, 15, SWSRC_FIRST, CATEGORY_END(-SWSRC_FIRST_LOGICAL_SWITCH), CATEGORY_END(-SWSRC_FIRST_TRIM), CATEGORY_END(-SWSRC_LAST_SWITCH+1), 0, CATEGORY_END(SWSRC_LAST_SWITCH), CATEGORY_END(SWSRC_FIRST_TRIM-1), CATEGORY_END(SWSRC_FIRST_LOGICAL_SWITCH-1), SWSRC_LAST) +INIT_STOPS(stopsSwitch, 15, SWSRC_FIRST, + CATEGORY_END(-SWSRC_FIRST_LOGICAL_SWITCH), + CATEGORY_END(-SWSRC_FIRST_TRIM), + CATEGORY_END(-SWSRC_LAST_SWITCH + 1), 0, + CATEGORY_END(SWSRC_LAST_SWITCH), CATEGORY_END(SWSRC_FIRST_TRIM - 1), + CATEGORY_END(SWSRC_FIRST_LOGICAL_SWITCH - 1), SWSRC_LAST) extern int checkIncDecSelection; -void onSwitchLongEnterPress(const char * result) -{ - if (result == STR_MENU_SWITCHES) - checkIncDecSelection = SWSRC_FIRST_SWITCH; - else if (result == STR_MENU_TRIMS) - checkIncDecSelection = SWSRC_FIRST_TRIM; - else if (result == STR_MENU_LOGICAL_SWITCHES) - checkIncDecSelection = SWSRC_FIRST_LOGICAL_SWITCH + getFirstAvailable(0, MAX_LOGICAL_SWITCHES, isLogicalSwitchAvailable); - else if (result == STR_MENU_OTHER) - checkIncDecSelection = SWSRC_ON; - else if (result == STR_MENU_INVERT) - checkIncDecSelection = SWSRC_INVERT; -} - -int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_flags, IsValueAvailable isValueAvailable, const CheckIncDecStops &stops) +int checkIncDec(event_t event, int val, int i_min, int i_max, + unsigned int i_flags, IsValueAvailable isValueAvailable, + const CheckIncDecStops &stops) { int newval = val; -#if defined(ROTARY_ENCODER_NAVIGATION) - if (s_editMode>0 && event==EVT_ROTARY_RIGHT) { -#else - if (s_editMode>0 && (event==EVT_KEY_FIRST(KEY_PLUS) || event==EVT_KEY_REPT(KEY_PLUS))) { -#endif - newval += min(rotencSpeed, i_max-val); - while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max) { - newval++; - } - if (newval > i_max) { - newval = val; - AUDIO_KEY_ERROR(); - } - } -#if defined(ROTARY_ENCODER_NAVIGATION) - else if (s_editMode>0 && event==EVT_ROTARY_LEFT) { -#else - if (s_editMode>0 && (event==EVT_KEY_FIRST(KEY_MINUS) || event==EVT_KEY_REPT(KEY_MINUS))) { -#endif - newval -= min(rotencSpeed, val-i_min); - while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min) { - newval--; - } - if (newval < i_min) { - newval = val; - AUDIO_KEY_ERROR(); - } - } - if (!READ_ONLY() && i_min==0 && i_max==1 && event==EVT_KEY_BREAK(KEY_ENTER)) { - s_editMode = 0; - newval = !val; - } + if (s_editMode > 0) { + if (event == EVT_ROTARY_RIGHT || event == EVT_KEY_FIRST(KEY_PLUS) || + event == EVT_KEY_REPT(KEY_PLUS)) { + + if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { + newval += min(10, i_max - val); + } else { + newval += min(rotaryEncoderGetAccel(), i_max - val); + } + + while (isValueAvailable && !isValueAvailable(newval) && newval <= i_max) { + newval++; + } + + if (newval > i_max) { + newval = val; + AUDIO_KEY_ERROR(); + } + } else if (event == EVT_ROTARY_LEFT || event == EVT_KEY_FIRST(KEY_MINUS) || + event == EVT_KEY_REPT(KEY_MINUS)) { + + if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { + newval -= min(10, val - i_min); + } else { + newval -= min(rotaryEncoderGetAccel(), val - i_min); + } + + while (isValueAvailable && !isValueAvailable(newval) && newval >= i_min) { + newval--; + } + + if (newval < i_min) { + newval = val; + AUDIO_KEY_ERROR(); + } + } #if defined(AUTOSWITCH) - if (i_flags & INCDEC_SWITCH) { - newval = checkIncDecMovedSwitch(newval); - } + if (i_flags & INCDEC_SWITCH) { + newval = checkIncDecMovedSwitch(newval); + } #endif #if defined(AUTOSOURCE) - if (i_flags & INCDEC_SOURCE) { - if (s_editMode>0) { + if (i_flags & INCDEC_SOURCE) { int source = GET_MOVED_SOURCE(i_min, i_max); if (source) { newval = source; @@ -113,8 +110,14 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla } #endif } - } #endif + } + + if (!READ_ONLY() && i_min == 0 && i_max == 1 && + event == EVT_KEY_BREAK(KEY_ENTER)) { + s_editMode = 0; + newval = !val; + } if (newval != val) { storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); @@ -248,7 +251,9 @@ uint8_t menuIdx(const MenuHandler * menuTab, uint8_t curr) return menuSize(menuTab, curr + 1) - 1; } -void check(event_t event, uint8_t curr, const MenuHandler * menuTab, uint8_t menuTabSize, const uint8_t * horTab, uint8_t horTabMax, vertpos_t rowcount) +void check(event_t event, uint8_t curr, const MenuHandler *menuTab, + uint8_t menuTabSize, const uint8_t *horTab, uint8_t horTabMax, + vertpos_t rowcount, uint8_t flags) { vertpos_t l_posVert = menuVerticalPosition; horzpos_t l_posHorz = menuHorizontalPosition; @@ -303,7 +308,7 @@ void check(event_t event, uint8_t curr, const MenuHandler * menuTab, uint8_t men l_posHorz = POS_HORZ_INIT(l_posVert); break; - case EVT_ROTARY_BREAK: + case EVT_KEY_BREAK(KEY_ENTER): if (s_editMode > 1) break; if (menuHorizontalPosition < 0 && maxcol > 0 && READ_ONLY_UNLOCKED()) { @@ -345,14 +350,11 @@ void check(event_t event, uint8_t curr, const MenuHandler * menuTab, uint8_t men } } break; -#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_ROTARY_RIGHT: + case EVT_KEY_FIRST(KEY_MINUS): + case EVT_KEY_REPT(KEY_MINUS): AUDIO_KEY_PRESS(); - // no break -#else - case EVT_KEY_FIRST(KEY_DOWN): - case EVT_KEY_REPT(KEY_DOWN): -#endif if (s_editMode > 0) break; // TODO it was != if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { if (l_posHorz >= 0) { @@ -387,14 +389,11 @@ void check(event_t event, uint8_t curr, const MenuHandler * menuTab, uint8_t men l_posHorz = POS_HORZ_INIT(l_posVert); break; -#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_ROTARY_LEFT: + case EVT_KEY_FIRST(KEY_PLUS): + case EVT_KEY_REPT(KEY_PLUS): AUDIO_KEY_PRESS(); - // no break -#else - case EVT_KEY_FIRST(KEY_UP): - case EVT_KEY_REPT(KEY_UP): -#endif if (s_editMode > 0) break; // TODO it was != if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { if (l_posHorz >= 0) { @@ -440,7 +439,10 @@ void check(event_t event, uint8_t curr, const MenuHandler * menuTab, uint8_t men int linesCount = rowcount; - if (l_posVert == 0 || (l_posVert==1 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW) || (l_posVert==2 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW && MAXCOL(vertpos_t(1)) >= HIDDEN_ROW)) { + if (l_posVert == 0 || + (l_posVert == 1 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW) || + (l_posVert == 2 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW && + MAXCOL(vertpos_t(1)) >= HIDDEN_ROW)) { menuVerticalOffset = 0; if (horTab) { linesCount = 0; @@ -450,8 +452,7 @@ void check(event_t event, uint8_t curr, const MenuHandler * menuTab, uint8_t men } } } - } - else if (horTab) { + } else if (horTab) { if (rowcount > NUM_BODY_LINES) { while (1) { vertpos_t firstLine = 0; @@ -485,8 +486,7 @@ void check(event_t event, uint8_t curr, const MenuHandler * menuTab, uint8_t men } } } - } - else { + } else { if (l_posVert>=NUM_BODY_LINES+menuVerticalOffset) { menuVerticalOffset = l_posVert-NUM_BODY_LINES+1; } diff --git a/radio/src/gui/navigation/navigation_x9d.cpp b/radio/src/gui/navigation/navigation_x9d.cpp index ea973c19b..343b9126f 100644 --- a/radio/src/gui/navigation/navigation_x9d.cpp +++ b/radio/src/gui/navigation/navigation_x9d.cpp @@ -20,153 +20,83 @@ */ #include "opentx.h" +#include "navigation.h" + +#include "switches.h" +#include "hal/rotary_encoder.h" vertpos_t menuVerticalOffset; vertpos_t menuVerticalPosition; horzpos_t menuHorizontalPosition; + int8_t s_editMode; uint8_t noHighlightCounter; uint8_t menuCalibrationState; -extern int checkIncDecSelection; + int8_t checkIncDec_Ret; INIT_STOPS(stops100, 3, -100, 0, 100) INIT_STOPS(stops1000, 3, -1000, 0, 1000) -INIT_STOPS(stopsSwitch, 15, SWSRC_FIRST, CATEGORY_END(-SWSRC_FIRST_LOGICAL_SWITCH), CATEGORY_END(-SWSRC_FIRST_TRIM), CATEGORY_END(-SWSRC_LAST_SWITCH+1), 0, CATEGORY_END(SWSRC_LAST_SWITCH), CATEGORY_END(SWSRC_FIRST_TRIM-1), CATEGORY_END(SWSRC_FIRST_LOGICAL_SWITCH-1), SWSRC_LAST) +INIT_STOPS(stopsSwitch, 15, SWSRC_FIRST, + CATEGORY_END(-SWSRC_FIRST_LOGICAL_SWITCH), + CATEGORY_END(-SWSRC_FIRST_TRIM), + CATEGORY_END(-SWSRC_LAST_SWITCH + 1), 0, + CATEGORY_END(SWSRC_LAST_SWITCH), CATEGORY_END(SWSRC_FIRST_TRIM - 1), + CATEGORY_END(SWSRC_FIRST_LOGICAL_SWITCH - 1), SWSRC_LAST) -void onSwitchLongEnterPress(const char * result) -{ - if (result == STR_MENU_SWITCHES) - checkIncDecSelection = SWSRC_FIRST_SWITCH; - else if (result == STR_MENU_TRIMS) - checkIncDecSelection = SWSRC_FIRST_TRIM; - else if (result == STR_MENU_LOGICAL_SWITCHES) - checkIncDecSelection = SWSRC_FIRST_LOGICAL_SWITCH + getFirstAvailable(0, MAX_LOGICAL_SWITCHES, isLogicalSwitchAvailable); - else if (result == STR_MENU_OTHER) - checkIncDecSelection = SWSRC_ON; - else if (result == STR_MENU_INVERT) - checkIncDecSelection = SWSRC_INVERT; -} +extern int checkIncDecSelection; -#define DBLKEYS_PRESSED_RGT_LFT(in) ((in & ((1< stops.max() ? stops.max() : i_max); - while (isValueAvailable && !isValueAvailable(newval) && newval>i_min) { - --newval; - } - } - else if (DBLKEYS_PRESSED_LFT_DWN(in)) { - newval = (i_min < stops.min() ? stops.min() : i_min); - while (isValueAvailable && !isValueAvailable(newval) && newval 0) { + if (event == EVT_ROTARY_RIGHT || event == EVT_KEY_FIRST(KEY_PLUS) || + event == EVT_KEY_REPT(KEY_PLUS)) { - if (dblkey) { - killEvents(KEY_UP); - killEvents(KEY_DOWN); - killEvents(KEY_RIGHT); - killEvents(KEY_LEFT); - killEvents(KEY_PAGE); - killEvents(KEY_MENU); - killEvents(KEY_ENTER); - killEvents(KEY_EXIT); - event = 0; - } - } -#endif - -#if defined(ROTARY_ENCODER_NAVIGATION) - if (s_editMode>0 && event==EVT_ROTARY_RIGHT) { - newval += min(rotencSpeed, i_max-val); - while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max) { - newval++; - } - if (newval > i_max) { - newval = val; - AUDIO_KEY_ERROR(); - } - } - else if (s_editMode>0 && event==EVT_ROTARY_LEFT) { - newval -= min(rotencSpeed, val-i_min); - while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min) { - newval--; - } - if (newval < i_min) { - newval = val; - AUDIO_KEY_ERROR(); - } - } -#else - if (s_editMode>0 && (event==EVT_KEY_FIRST(KEY_PLUS) || event==EVT_KEY_REPT(KEY_PLUS))) { - do { if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { - newval += min(10, i_max-val); + newval += min(10, i_max - val); + } else { + newval += min(rotaryEncoderGetAccel(), i_max - val); } - else { + + while (isValueAvailable && !isValueAvailable(newval) && newval <= i_max) { newval++; } - } while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max); - if (newval > i_max) { - newval = val; - killEvents(event); - AUDIO_KEY_ERROR(); - } - } - else if (s_editMode>0 && (event==EVT_KEY_FIRST(KEY_MINUS) || event==EVT_KEY_REPT(KEY_MINUS))) { - do { - if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { - newval -= min(10, val-i_min); + + if (newval > i_max) { + newval = val; + AUDIO_KEY_ERROR(); } - else { + } else if (event == EVT_ROTARY_LEFT || event == EVT_KEY_FIRST(KEY_MINUS) || + event == EVT_KEY_REPT(KEY_MINUS)) { + + if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { + newval -= min(10, val - i_min); + } else { + newval -= min(rotaryEncoderGetAccel(), val - i_min); + } + + while (isValueAvailable && !isValueAvailable(newval) && newval >= i_min) { newval--; } - } while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min); - if (newval < i_min) { - newval = val; - killEvents(event); - AUDIO_KEY_ERROR(); - } - } -#endif - if (!READ_ONLY() && i_min==0 && i_max==1 && event==EVT_KEY_BREAK(KEY_ENTER)) { - s_editMode = 0; - newval = !val; - } + if (newval < i_min) { + newval = val; + AUDIO_KEY_ERROR(); + } + } #if defined(AUTOSWITCH) - if (i_flags & INCDEC_SWITCH) { - newval = checkIncDecMovedSwitch(newval); - } + if (i_flags & INCDEC_SWITCH) { + newval = checkIncDecMovedSwitch(newval); + } #endif #if defined(AUTOSOURCE) - if (i_flags & INCDEC_SOURCE) { - if (s_editMode>0) { + if (i_flags & INCDEC_SOURCE) { int source = GET_MOVED_SOURCE(i_min, i_max); if (source) { newval = source; @@ -180,15 +110,23 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla } #endif } - } #endif + } + + if (!READ_ONLY() && i_min == 0 && i_max == 1 && + event == EVT_KEY_BREAK(KEY_ENTER)) { + s_editMode = 0; + newval = !val; + } if (newval != val) { #if !defined(ROTARY_ENCODER_NAVIGATION) - if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && stops.contains(newval)) { - bool pause = (newval > val ? !stops.contains(newval+1) : !stops.contains(newval-1)); + if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && + (newval != i_min) && stops.contains(newval)) { + bool pause = (newval > val ? !stops.contains(newval + 1) + : !stops.contains(newval - 1)); if (pause) { - pauseEvents(event); // delay before auto-repeat continues + pauseEvents(event); // delay before auto-repeat continues } } if (!IS_KEY_REPT(event)) { @@ -333,7 +271,9 @@ uint8_t menuIdx(const MenuHandler * menuTab, uint8_t curr) return menuSize(menuTab, curr + 1) - 1; } -void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menuTabSize, const uint8_t *horTab, uint8_t horTabMax, vertpos_t rowcount, uint8_t flags) +void check(event_t event, uint8_t curr, const MenuHandler *menuTab, + uint8_t menuTabSize, const uint8_t *horTab, uint8_t horTabMax, + vertpos_t rowcount, uint8_t flags) { vertpos_t l_posVert = menuVerticalPosition; horzpos_t l_posHorz = menuHorizontalPosition; @@ -443,11 +383,10 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menu } break; - CASE_EVT_ROTARY_RIGHT - case EVT_KEY_FIRST(KEY_RIGHT): + case EVT_ROTARY_RIGHT: + case EVT_KEY_FIRST(KEY_MINUS): + case EVT_KEY_REPT(KEY_MINUS): AUDIO_KEY_PRESS(); - // no break - case EVT_KEY_REPT(KEY_RIGHT): if (s_editMode != 0) break; if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { if (l_posHorz >= 0) { @@ -483,11 +422,10 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menu l_posHorz = POS_HORZ_INIT(l_posVert); break; - CASE_EVT_ROTARY_LEFT - case EVT_KEY_FIRST(KEY_LEFT): + case EVT_ROTARY_LEFT: + case EVT_KEY_FIRST(KEY_PLUS): + case EVT_KEY_REPT(KEY_PLUS): AUDIO_KEY_PRESS(); - // no break - case EVT_KEY_REPT(KEY_LEFT): if (s_editMode != 0) break; if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { if (l_posHorz >= 0) { @@ -595,4 +533,3 @@ void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menu menuVerticalPosition = l_posVert; menuHorizontalPosition = l_posHorz; } - diff --git a/radio/src/gui/navigation/navigation_xlite.cpp b/radio/src/gui/navigation/navigation_xlite.cpp index 9c007002b..cf801b814 100644 --- a/radio/src/gui/navigation/navigation_xlite.cpp +++ b/radio/src/gui/navigation/navigation_xlite.cpp @@ -20,89 +20,38 @@ */ #include "opentx.h" +#include "switches.h" vertpos_t menuVerticalOffset; -int8_t s_editMode; -uint8_t noHighlightCounter; -uint8_t menuCalibrationState; vertpos_t menuVerticalPosition; horzpos_t menuHorizontalPosition; -int8_t checkIncDec_Ret; +int8_t s_editMode; +uint8_t noHighlightCounter; +uint8_t menuCalibrationState; -// invert the value -#define DBLKEYS_PRESSED_RGT_LFT(in) ((in & ((1< stops.max() ? stops.max() : i_max); - while (isValueAvailable && !isValueAvailable(newval) && newval>i_min) { - --newval; - } - } - else if (DBLKEYS_PRESSED_LFT_DWN(in)) { - newval = (i_min < stops.min() ? stops.min() : i_min); - while (isValueAvailable && !isValueAvailable(newval) && newval 0) { - if (event==EVT_KEY_FIRST(KEY_RIGHT) || event==EVT_KEY_REPT(KEY_RIGHT) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)) { + if (event == EVT_KEY_FIRST(KEY_RIGHT) || event == EVT_KEY_REPT(KEY_RIGHT) || + event == EVT_KEY_FIRST(KEY_UP) || event == EVT_KEY_REPT(KEY_UP)) { do { if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { newval += min(10, i_max-val); @@ -110,15 +59,18 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla else { newval++; } - } while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max); + } while (isValueAvailable && !isValueAvailable(newval) && + newval <= i_max); if (newval > i_max) { newval = val; killEvents(event); AUDIO_KEY_ERROR(); } - } - else if (event==EVT_KEY_FIRST(KEY_LEFT) || event==EVT_KEY_REPT(KEY_LEFT) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)) { + } else if (event == EVT_KEY_FIRST(KEY_LEFT) || + event == EVT_KEY_REPT(KEY_LEFT) || + event == EVT_KEY_FIRST(KEY_DOWN) || + event == EVT_KEY_REPT(KEY_DOWN)) { do { if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { newval -= min(10, val-i_min); @@ -134,22 +86,15 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla AUDIO_KEY_ERROR(); } } - } - - if (!READ_ONLY() && i_min == 0 && i_max == 1 && event == EVT_KEY_BREAK(KEY_ENTER)) { - s_editMode = 0; - newval = !val; - } #if defined(AUTOSWITCH) - if (i_flags & INCDEC_SWITCH) { - newval = checkIncDecMovedSwitch(newval); - } + if (i_flags & INCDEC_SWITCH) { + newval = checkIncDecMovedSwitch(newval); + } #endif #if defined(AUTOSOURCE) - if (i_flags & INCDEC_SOURCE) { - if (s_editMode > 0) { + if (i_flags & INCDEC_SOURCE) { int8_t source = GET_MOVED_SOURCE(i_min, i_max); if (source) { newval = source; @@ -163,14 +108,27 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla } #endif } - } #endif + } + + if (!READ_ONLY() && i_min == 0 && i_max == 1 && + event == EVT_KEY_BREAK(KEY_ENTER)) { + s_editMode = 0; + newval = !val; + } if (newval != val) { - if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && (newval==0 || newval==-100 || newval==+100)) { - pauseEvents(event); // delay before auto-repeat continues + if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && + (newval != i_min) && stops.contains(newval)) { + bool pause = (newval > val ? !stops.contains(newval + 1) + : !stops.contains(newval - 1)); + if (pause) { + pauseEvents(event); // delay before auto-repeat continues + } + } + if (!IS_KEY_REPT(event)) { + AUDIO_KEY_PRESS(); } - AUDIO_KEY_PRESS(); storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); checkIncDec_Ret = (newval > val ? 1 : -1); } @@ -179,7 +137,7 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla } if (i_flags & INCDEC_SOURCE) { - if (event == EVT_KEY_LONG(KEY_ENTER) && !IS_SHIFT_PRESSED()) { + if (event == EVT_KEY_LONG(KEY_ENTER) && !keysGetState(KEY_SHIFT)) { killEvents(event); checkIncDecSelection = MIXSRC_NONE; @@ -230,7 +188,7 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla } } else if (i_flags & INCDEC_SWITCH) { - if (event == EVT_KEY_LONG(KEY_ENTER) && !IS_SHIFT_PRESSED()) { + if (event == EVT_KEY_LONG(KEY_ENTER) && !keysGetState(KEY_SHIFT)) { killEvents(event); checkIncDecSelection = SWSRC_NONE; if (i_min <= SWSRC_FIRST_SWITCH && i_max >= SWSRC_LAST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); @@ -302,7 +260,9 @@ uint8_t menuIdx(const MenuHandler * menuTab, uint8_t curr) return menuSize(menuTab, curr + 1) - 1; } -void check(event_t event, uint8_t curr, const MenuHandler *menuTab, uint8_t menuTabSize, const uint8_t *horTab, uint8_t horTabMax, vertpos_t maxrow) +void check(event_t event, uint8_t curr, const MenuHandler *menuTab, + uint8_t menuTabSize, const uint8_t *horTab, uint8_t horTabMax, + vertpos_t maxrow, uint8_t flags) { vertpos_t l_posVert = menuVerticalPosition; horzpos_t l_posHorz = menuHorizontalPosition; diff --git a/radio/src/hal/CMakeLists.txt b/radio/src/hal/CMakeLists.txt new file mode 100644 index 000000000..92b0f5ee2 --- /dev/null +++ b/radio/src/hal/CMakeLists.txt @@ -0,0 +1,10 @@ + +AddHWGenTarget(${HW_DESC_JSON} hal_keys hal_keys.inc) + +set(SRC ${SRC} + ${CMAKE_CURRENT_BINARY_DIR}/hal_keys.inc + + hal/module_port.cpp + hal/adc_driver.cpp + hal/key_driver.cpp +) diff --git a/radio/src/hal/adc_driver.cpp b/radio/src/hal/adc_driver.cpp index 33bb58a0e..ebfdee4cc 100644 --- a/radio/src/hal/adc_driver.cpp +++ b/radio/src/hal/adc_driver.cpp @@ -25,189 +25,212 @@ // IS_POT_SLIDER_AVAILABLE() #include "opentx.h" -const etx_hal_adc_driver_t* etx_hal_adc_driver = nullptr; -#if defined(SIMU) - // not needed -#elif defined(RADIO_T16) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1,1,1, -1,1 }; -#elif defined(RADIO_T18) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, -1,1,1,1, -1,1 }; -#elif defined(RADIO_TX16S) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1,1,1, -1,1 }; -#elif defined(PCBX10) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, 1,1,1,1, 1,-1 }; -#elif defined(PCBX9E) - const int8_t adcDirection[NUM_ANALOGS] = { -#if defined(HORUS_STICKS) - 1,-1,1,-1, -#else - 1,1,-1,-1, -#endif // HORUS_STICKS - // other analogs are the same - -1,-1,-1,1, -1,1,1,-1, -1,-1 }; +const etx_hal_adc_driver_t* _hal_adc_driver = nullptr; +const etx_hal_adc_inputs_t* _hal_adc_inputs = nullptr; - const uint8_t adcMapping[NUM_ANALOGS] = { 0 /*STICK1*/, 1 /*STICK2*/, 2 /*STICK3*/, 3 /*STICK4*/, - 11 /*POT1*/, 4 /*POT2*/, 5 /*POT3*/, 6 /*POT4*/, - 12 /*SLIDER1*/, 13 /*SLIDER2*/, 7 /*SLIDER3*/, 8 /*SLIDER4*/, - 9 /*TX_VOLTAGE*/, 10 /*TX_VBAT*/ }; -#elif defined(PCBX9DP) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,-1, 1,1, 1, 1}; -#elif defined(PCBX9D) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,0, 1,1, 1, 1}; -#elif defined(RADIO_TX12) - const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, -1,-1, 1, 1}; -#elif defined(RADIO_TX12MK2) - const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,-1}; -#elif defined(RADIO_BOXER) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,-1}; -#elif defined(RADIO_ZORRO) - const int8_t adcDirection[NUM_ANALOGS] = {-1, 1, 1, -1, -1, 1, 1, 1}; -#elif defined(RADIO_TPRO) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1, 1, 1}; -#elif defined(PCBX7) - const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,1, 1, 1}; -#elif defined(PCBX9LITE) - const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,1, 1}; -#elif defined(PCBXLITE) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,-1,1, -1,1, 1, 1}; -#elif defined(PCBNV14) - const uint8_t adcMapping[NUM_ANALOGS] = { 0 /*STICK1*/, 1 /*STICK2*/, 2 /*STICK3*/, 3 /*STICK4*/, - 4 /*POT1*/, 5 /*POT2*/, 6 /*SWA*/, 14 /*SWB*/, - 7 /*SWC*/, 15 /*SWD*/, 8 /*SWE*/, 9 /*SWF*/, - 11/*SWG*/, 10/*SWH*/, - 12 /*TX_VOLTAGE*/, 13 /* TX_VBAT */ }; - - const int8_t adcDirection[NUM_ANALOGS] = { 0 /*STICK1*/, 0 /*STICK2*/, 0 /*STICK3*/, 0 /*STICK4*/, - -1 /*POT1*/, 0 /*POT2*/, 0 /*SWA*/, 0 /*SWC*/, - 0 /*SWE*/, -1 /*SWF*/, 0 /*SWG*/, -1 /*SWH*/, - 0 /*TX_VOLTAGE*/, 0 /*TX_VBAT*/, - 0 /*SWB*/, 0 /*SWD*/}; - -#elif defined(PCBX12S) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, -1,-1, -1,1, 0,0,0}; -#else - #error "ADC driver does not suppport this target" -#endif - -uint16_t adcValues[NUM_ANALOGS] __DMA; - -#if defined(PCBX10) || defined(PCBX12S) -uint16_t rtcBatteryVoltage; -#endif +static uint16_t adcValues[MAX_ANALOG_INPUTS] __DMA; bool adcInit(const etx_hal_adc_driver_t* driver) { - etx_hal_adc_driver = driver; - if (!etx_hal_adc_driver) - return false; - - // If there is an init function - // it should succeed - if (etx_hal_adc_driver->init && - !etx_hal_adc_driver->init()) { - return false; + // If there is an init function, it MUST succeed + if (driver && (!driver->init || driver->init())) { + _hal_adc_driver = driver; + _hal_adc_inputs = driver->inputs; + return true; } - return true; + _hal_adc_driver = nullptr; + return false; } static bool adcSingleRead() { - if (!etx_hal_adc_driver) - return false; - - if (etx_hal_adc_driver->start_conversion && - !etx_hal_adc_driver->start_conversion()) + if (!_hal_adc_driver) return false; - if (etx_hal_adc_driver->wait_completion) - etx_hal_adc_driver->wait_completion(); + if (_hal_adc_driver->start_conversion && + !_hal_adc_driver->start_conversion()) + return false; + + if (_hal_adc_driver->wait_completion) + _hal_adc_driver->wait_completion(); return true; } -// Declare adcRead() weak so it can be re-declared -#pragma weak adcRead bool adcRead() { - uint16_t temp[NUM_ANALOGS] = { 0 }; - - uint8_t first_analog_adc; - -#if defined(FLYSKY_GIMBAL) - if (globalData.flyskygimbals) - { - first_analog_adc = FIRST_ANALOG_ADC_FS; - } else - { - first_analog_adc = FIRST_ANALOG_ADC; - } -#else - first_analog_adc = FIRST_ANALOG_ADC; -#endif - - for (int i=0; i<4; i++) { - if (!adcSingleRead()) - return false; - for (uint8_t x=first_analog_adc; x> 2; - } - -#if NUM_PWMSTICKS > 0 - if (STICKS_PWM_ENABLED()) { - sticksPwmRead(adcValues); - } -#endif return true; } -#if !defined(SIMU) +#define XPOT_DELTA 10 +#define XPOT_DELAY 10 /* cycles */ + +void adcCalibMinMax() +{ + // get low and high vals for sticks and pots + for (uint8_t i = 0; i < MAX_ANALOG_INPUTS; i++) { + + int16_t vt = anaIn(i); + auto& calib = reusableBuffer.calib.inputs[i]; + calib.input.loVal = min(vt, calib.input.loVal); + calib.input.hiVal = max(vt, calib.input.hiVal); + + if (i >= MAX_STICKS) { + uint8_t idx = i - MAX_STICKS; + if (IS_POT_WITHOUT_DETENT(idx)) { + calib.input.midVal = (calib.input.hiVal + calib.input.loVal) / 2; + } else if (IS_POT_MULTIPOS(idx)) { + auto& xpot = calib.xpot; + int count = xpot.stepsCount; + if (count <= XPOTS_MULTIPOS_COUNT) { + // use raw analog value for multipos calibraton, + // anaIn() already has multipos decoded value + vt = getAnalogValue(i) >> 1; + if (xpot.lastCount == 0 || vt < xpot.lastPosition - XPOT_DELTA || + vt > xpot.lastPosition + XPOT_DELTA) { + xpot.lastPosition = vt; + xpot.lastCount = 1; + } else { + if (xpot.lastCount < 255) xpot.lastCount++; + } + if (xpot.lastCount == XPOT_DELAY) { + int16_t position = xpot.lastPosition; + bool found = false; + for (int j = 0; j < count; j++) { + int16_t step = xpot.steps[j]; + if (position >= step - XPOT_DELTA && + position <= step + XPOT_DELTA) { + found = true; + break; + } + } + if (!found) { + if (count < XPOTS_MULTIPOS_COUNT) { + xpot.steps[count] = position; + } + xpot.stepsCount += 1; + } + } + } + } + } + } +} + +void adcCalibSetMidPoint() +{ + for (uint8_t i = 0; i < MAX_ANALOG_INPUTS; i++) { + auto& calib = reusableBuffer.calib.inputs[i]; + if (i < MAX_STICKS || !IS_POT_MULTIPOS(i - MAX_STICKS)) { + calib.input.loVal = 15000; + calib.input.hiVal = -15000; + calib.input.midVal = getAnalogValue(i) >> 1; + } else { + calib.xpot.stepsCount = 0; + calib.xpot.lastCount = 0; + } + } +} + +void adcCalibSetMinMax() +{ + for (uint8_t i = 0; i < MAX_ANALOG_INPUTS; i++) { + auto& calib = reusableBuffer.calib.inputs[i]; + if (abs(calib.input.loVal - calib.input.hiVal) > 50) { + g_eeGeneral.calib[i].mid = calib.input.midVal; + int16_t v = calib.input.midVal - calib.input.loVal; + g_eeGeneral.calib[i].spanNeg = v - v / STICK_TOLERANCE; + v = calib.input.hiVal - calib.input.midVal; + g_eeGeneral.calib[i].spanPos = v - v / STICK_TOLERANCE; + } + } +} + +void adcCalibSetXPot() +{ + for (uint8_t i = MAX_STICKS; i < MAX_ANALOG_INPUTS; i++) { + int idx = i - MAX_STICKS; + if (!IS_POT_MULTIPOS(idx)) continue; + + auto& xpot = reusableBuffer.calib.inputs[i].xpot; + int count = xpot.stepsCount; + if (count > 1 && count <= XPOTS_MULTIPOS_COUNT) { + for (int j = 0; j < count; j++) { + for (int k = j + 1; k < count; k++) { + if (xpot.steps[k] < xpot.steps[j]) { + SWAP(xpot.steps[j], xpot.steps[k]); + } + } + } + StepsCalibData* calib = (StepsCalibData*)&g_eeGeneral.calib[i]; + calib->count = count - 1; + for (int j = 0; j < calib->count; j++) { + calib->steps[j] = (xpot.steps[j + 1] + xpot.steps[j]) >> 5; + } + } else { + // TODO: a way to provide to 6POS default calibration values + // + // // load 6pos calib with factory data if 6 pos was not manually calibrated + // constexpr int16_t factoryValues[]= {0x5,0xd,0x16,0x1f,0x28}; + // StepsCalibData * calib = (StepsCalibData *) &g_eeGeneral.calib[POT3]; + // calib->count = 5; + // for (int j=0; jcount ; j++) { + // calib->steps[j] = factoryValues[j]; + // } + + // not enough config points -> disable + g_eeGeneral.potsConfig &= POT_CONFIG_DISABLE_MASK(idx); + } + } +} + +void adcCalibStore() +{ + g_eeGeneral.chkSum = evalChkSum(); + storageDirty(EE_GENERAL); +} + uint16_t getRTCBatteryVoltage() { -#if defined(HAS_TX_RTC_VOLTAGE) - return (getAnalogValue(TX_RTC_VOLTAGE) * ADC_VREF_PREC2) / 2048; -#elif defined(PCBX10) || defined(PCBX12S) - return (rtcBatteryVoltage * 2 * ADC_VREF_PREC2) / 2048; -#elif defined(PCBNV14) - #warning "TODO RTC voltage" - return 330; + // anaIn() outputs value divided by (1 << ANALOG_SCALE) + if (adcGetMaxInputs(ADC_INPUT_RTC_BAT) < 1) return 0; +#if defined(STM32F413xx) + return (anaIn(adcGetInputOffset(ADC_INPUT_RTC_BAT)) * ADC_VREF_PREC2) / + (1024 >> ANALOG_SCALE); #else - #warning "RTC battery not supported on this target" - return 0; + return (anaIn(adcGetInputOffset(ADC_INPUT_RTC_BAT)) * ADC_VREF_PREC2) / + (2048 >> ANALOG_SCALE); #endif } uint16_t getAnalogValue(uint8_t index) { - if (IS_POT(index) && !IS_POT_SLIDER_AVAILABLE(index)) { - // Use fixed analog value for non-existing and/or non-connected pots. - // Non-connected analog inputs will slightly follow the adjacent connected analog inputs, - // which produces ghost readings on these inputs. - return 0; - } -#if defined(PCBX9E) || defined(PCBNV14) - index = adcMapping[index]; -#endif - if (adcDirection[index] < 0) - return ADCMAXVALUE - adcValues[index]; - else - return adcValues[index]; + if (index >= MAX_ANALOG_INPUTS) return 0; + return adcValues[index]; +} + +void setAnalogValue(uint8_t index, uint16_t value) +{ + if (index >= MAX_ANALOG_INPUTS) return; + adcValues[index] = value; +} + +uint16_t* getAnalogValues() +{ + return adcValues; } // used by diaganas -uint32_t s_anaFilt[NUM_ANALOGS]; +uint32_t s_anaFilt[MAX_ANALOG_INPUTS]; #define ANALOG_MULTIPLIER (1<= MAX_ANALOG_INPUTS) return 0; return ANA_FILT(chan); } +uint32_t anaIn_diag(uint8_t chan) +{ + if (chan >= MAX_ANALOG_INPUTS) return 0; + return s_anaFilt[chan] / JITTER_ALPHA; +} + +void anaSetFiltered(uint8_t chan, uint16_t val) +{ + val += RESX; + s_anaFilt[chan] = val * (JITTER_ALPHA * ANALOG_MULTIPLIER); +} + +void anaResetFiltered() +{ + memset(s_anaFilt, 0, sizeof(s_anaFilt)); +} + #if defined(JITTER_MEASURE) -JitterMeter rawJitter[NUM_ANALOGS]; -JitterMeter avgJitter[NUM_ANALOGS]; +JitterMeter rawJitter[MAX_ANALOG_INPUTS]; +JitterMeter avgJitter[MAX_ANALOG_INPUTS]; tmr10ms_t jitterResetTime = 0; #endif uint16_t getBatteryVoltage() { // using filtered ADC value on purpose - int32_t instant_vbat = anaIn(TX_VOLTAGE); + if (adcGetMaxInputs(ADC_INPUT_VBAT) < 1) return 0; + int32_t instant_vbat = anaIn(adcGetInputOffset(ADC_INPUT_VBAT)); + // TODO: remove BATT_SCALE / BATTERY_DIVIDER defines #if defined(BATT_SCALE) instant_vbat = (instant_vbat * BATT_SCALE * (128 + g_eeGeneral.txVoltageCalibration)) / @@ -245,14 +288,14 @@ uint16_t getBatteryVoltage() #endif } -extern uint16_t get_flysky_hall_adc_value(uint8_t ch); - void getADC() { + uint8_t max_analogs = adcGetMaxInputs(ADC_INPUT_ALL); + #if defined(JITTER_MEASURE) if (JITTER_MEASURE_ACTIVE() && jitterResetTime < get_tmr10ms()) { // reset jitter measurement every second - for (uint32_t x=0; x> (1 - ANALOG_SCALE); - } else { - v = getAnalogValue(x) >> (1 - ANALOG_SCALE); - } - } - else -#endif - { - v = getAnalogValue(x) >> (1 - ANALOG_SCALE); - } + // TODO: jitter filter should probably still be applied + // to VBAT and RTC_BAT, no matter what is configured + // + for (uint8_t x = 0; x < max_analogs; x++) { + + uint32_t v = getAnalogValue(x) >> (1 - ANALOG_SCALE); // Jitter filter: // * pass trough any big change directly @@ -362,4 +395,87 @@ void getADC() } } -#endif // #if !defined(SIMU) +potconfig_t adcGetDefaultPotsConfig() +{ + if (!_hal_adc_driver) return 0; + return _hal_adc_driver->default_pots_cfg; +} + +uint8_t adcGetMaxInputs(uint8_t type) +{ + if (type > ADC_INPUT_ALL) return 0; + return _hal_adc_inputs[type].n_inputs; +} + +uint8_t adcGetInputOffset(uint8_t type) +{ + if (type > ADC_INPUT_ALL) return 0; + return _hal_adc_inputs[type].offset; +} + +uint16_t adcGetInputValue(uint8_t type, uint8_t idx) +{ + if (type >= ADC_INPUT_ALL) return 0; + + const auto& inputs = _hal_adc_inputs[type]; + auto n_inputs = inputs.n_inputs; + auto offset = inputs.offset; + if (!n_inputs || idx >= n_inputs) return 0; + + return getAnalogValue(offset + idx); +} + +const char* adcGetInputName(uint8_t type, uint8_t idx) +{ + if (type >= ADC_INPUT_ALL || + idx >= _hal_adc_inputs[type].n_inputs) + return ""; + + return _hal_adc_inputs[type].inputs[idx].name; +} + +const char* adcGetInputName(uint8_t idx) +{ + uint8_t type = ADC_INPUT_MAIN; + + // find the proper input type + while (_hal_adc_inputs[type].offset + _hal_adc_inputs[type].n_inputs <= idx) { + if (++type > ADC_INPUT_AXIS) return nullptr; + } + + idx -= _hal_adc_inputs[type].offset; + return _hal_adc_inputs[type].inputs[idx].name; +} + +int adcGetInputIdx(const char* input, uint8_t len) +{ + int idx = 0; + uint8_t type = ADC_INPUT_MAIN; + + do { + for (uint8_t i = 0; i < _hal_adc_inputs[type].n_inputs; i++, idx++) { + if (!strncmp(_hal_adc_inputs[type].inputs[i].name, input, len)) + return idx; + } + } while(++type < ADC_INPUT_ALL); + + return -1; +} + +const char* adcGetInputLabel(uint8_t type, uint8_t idx) +{ + if (type >= ADC_INPUT_ALL || + idx >= _hal_adc_inputs[type].n_inputs) + return ""; + + return _hal_adc_inputs[type].inputs[idx].label; +} + +const char* adcGetInputShortLabel(uint8_t type, uint8_t idx) +{ + if (type >= ADC_INPUT_ALL || + idx >= _hal_adc_inputs[type].n_inputs) + return ""; + + return _hal_adc_inputs[type].inputs[idx].short_label; +} diff --git a/radio/src/hal/adc_driver.h b/radio/src/hal/adc_driver.h index 817e456a6..e2f157a9f 100644 --- a/radio/src/hal/adc_driver.h +++ b/radio/src/hal/adc_driver.h @@ -22,38 +22,62 @@ #pragma once #include +#include "opentx_types.h" -// TODO: move this to the targets -#if NUM_PWMSTICKS > 0 - #define FIRST_ANALOG_ADC (STICKS_PWM_ENABLED() ? NUM_PWMSTICKS : 0) - #define NUM_ANALOGS_ADC (STICKS_PWM_ENABLED() ? (NUM_ANALOGS - NUM_PWMSTICKS) : NUM_ANALOGS) -#elif defined(PCBX9E) - #define FIRST_ANALOG_ADC 0 - #define NUM_ANALOGS_ADC 11 - #define NUM_ANALOGS_ADC_EXT (NUM_ANALOGS - NUM_ANALOGS_ADC) -#else - #define FIRST_ANALOG_ADC_FS 4 - #if defined (RADIO_BOXER) - #define NUM_ANALOGS_ADC_FS 5 - #else - #define NUM_ANALOGS_ADC_FS 10 - #define NUM_ANALOGS_ADC_EXT 2 - #endif - #define FIRST_ANALOG_ADC 0 - #define NUM_ANALOGS_ADC NUM_ANALOGS -#endif +// 12-bit values +#define ADC_MAX_VALUE 4095 -#define ADCMAXVALUE 4095 +#define ADC_INVERT_VALUE(v) (ADC_MAX_VALUE - (v)) -// TODO: get rid of this special case -#if defined(PCBX10) || defined(PCBX12S) -extern uint16_t rtcBatteryVoltage; -#endif +// tune this value, bigger value - more filtering (range: 1-5) (see explanation below) +#define JITTER_FILTER_STRENGTH 4 +// tune this value, bigger value - more filtering (range: 0-1) (see explanation below) +#define ANALOG_SCALE 1 +#define JITTER_ALPHA (1< rawJitter[NUM_ANALOGS]; -extern JitterMeter avgJitter[NUM_ANALOGS]; -#if defined(PCBHORUS) || defined(PCBTARANIS) - #define JITTER_MEASURE_ACTIVE() (menuHandlers[menuLevel] == menuRadioDiagAnalogs) -#elif defined(CLI) - #define JITTER_MEASURE_ACTIVE() (1) -#else - #define JITTER_MEASURE_ACTIVE() (0) -#endif +extern JitterMeter rawJitter[MAX_ANALOG_INPUTS]; +extern JitterMeter avgJitter[MAX_ANALOG_INPUTS]; #endif void getADC(); uint16_t anaIn(uint8_t chan); +uint32_t anaIn_diag(uint8_t chan); +uint16_t getBatteryVoltage(); + +// Warning: +// STM32 uses a 25K+25K voltage divider bridge to measure the battery voltage +// Measuring VBAT puts considerable drain (22 µA) on the battery instead of +// normal drain (~10 nA) +void enableVBatBridge(); +void disableVBatBridge(); +bool isVBatBridgeEnabled(); + +potconfig_t adcGetDefaultPotsConfig(); + +uint8_t adcGetMaxInputs(uint8_t type); +uint8_t adcGetInputOffset(uint8_t type); + +uint16_t adcGetInputValue(uint8_t type, uint8_t idx); +const char* adcGetInputName(uint8_t type, uint8_t idx); + +const char* adcGetInputName(uint8_t idx); +int adcGetInputIdx(const char* input, uint8_t len); + +const char* adcGetInputLabel(uint8_t type, uint8_t idx); +const char* adcGetInputShortLabel(uint8_t type, uint8_t idx); + +// To be implemented by the target driver +// int8_t adcGetVRTC(); +// int8_t adcGetVBAT(); +// const char* adcGetStickName(uint8_t idx); +// const char* adcGetPotName(uint8_t idx); +// uint8_t adcGetMaxSticks(); +// uint8_t adcGetMaxPots(); diff --git a/radio/src/debounce.h b/radio/src/hal/key_driver.cpp similarity index 57% rename from radio/src/debounce.h rename to radio/src/hal/key_driver.cpp index d25365669..6529bc04d 100644 --- a/radio/src/debounce.h +++ b/radio/src/hal/key_driver.cpp @@ -19,36 +19,28 @@ * GNU General Public License for more details. */ -#ifndef _DEBOUNCE_H_ -#define _DEBOUNCE_H_ +#include "key_driver.h" -#include "board.h" +#include "definitions.h" +#include "hal_keys.inc" -template -class Debounce +uint32_t keysGetSupported() { - public: - T debounce(T state) - { - if (state == lastState) - debouncedState = state; - else - lastState = state; - return debouncedState; - } + return _defined_keys; +} - private: - T lastState; - T debouncedState; -}; - -class PinDebounce: public Debounce +uint8_t keysGetMaxKeys() { - public: - uint8_t debounce(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin) - { - return Debounce::debounce(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)); - } -}; + return _n_keys; +} + +uint8_t keysGetMaxTrims() +{ + return _n_trims; +} + +const char* keysGetLabel(EnumKeys key) +{ + return _key_labels[key]; +} -#endif // _DEBOUNCE_H_ diff --git a/radio/src/hal/key_driver.h b/radio/src/hal/key_driver.h new file mode 100644 index 000000000..d7a055902 --- /dev/null +++ b/radio/src/hal/key_driver.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 + +enum EnumKeys { + KEY_MENU, + KEY_EXIT, + KEY_ENTER, + + KEY_PAGE, + KEY_PAGEUP, + KEY_PAGEDN, + + KEY_UP, + KEY_DOWN, + + KEY_LEFT, + KEY_RIGHT, + + KEY_PLUS, + KEY_MINUS, + + KEY_MODEL, + KEY_TELE, + KEY_SYS, + + KEY_SHIFT, + KEY_BIND, + + MAX_KEYS +}; + +#define MAX_TRIMS 6 + +// returns a bit field with each key set as (1 << KEY_xxx) +uint32_t readKeys(); + +// returns a bit field with each trim key +uint32_t readTrims(); + +// Init GPIO ports +void keysInit(); + +uint32_t keysGetSupported(); + +uint8_t keysGetMaxKeys(); +uint8_t keysGetMaxTrims(); + +const char* keysGetLabel(EnumKeys key); diff --git a/radio/src/hal/rotary_encoder.h b/radio/src/hal/rotary_encoder.h new file mode 100644 index 000000000..5489c8651 --- /dev/null +++ b/radio/src/hal/rotary_encoder.h @@ -0,0 +1,44 @@ +/* + * 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 + +#define ROTENC_LOWSPEED 1 +#define ROTENC_MIDSPEED 5 +#define ROTENC_HIGHSPEED 50 + +#define ROTARY_ENCODER_GRANULARITY 2 + +typedef int32_t rotenc_t; + +void rotaryEncoderInit(); + +// return impulses / granularity +rotenc_t rotaryEncoderGetValue(); + +// returns raw # impulses +rotenc_t rotaryEncoderGetRawValue(); + + +int8_t rotaryEncoderGetAccel(); +void rotaryEncoderResetAccel(); diff --git a/radio/src/hal/switch_driver.h b/radio/src/hal/switch_driver.h new file mode 100644 index 000000000..bdb9a5033 --- /dev/null +++ b/radio/src/hal/switch_driver.h @@ -0,0 +1,82 @@ +/* + * 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 +#include "opentx_types.h" + +enum SwitchHwType { + SWITCH_HW_2POS = 0, + SWITCH_HW_3POS, + SWITCH_HW_ADC, +}; + +enum SwitchHwPos { + SWITCH_HW_UP = 0, + SWITCH_HW_MID, + SWITCH_HW_DOWN, +}; + +#define SWITCH_HW_INVERTED 1 + +// init hardware for switches +void switchInit(); + +// returns the factory configuration for all switches +swconfig_t switchGetDefaultConfig(); + +// returns the maximum number of regular switches supported in hardware +uint8_t switchGetMaxSwitches(); + +// returns the number of configured switches +uint8_t getSwitchCount(); + +// returns the highest row for a specified column +uint8_t switchGetMaxRow(uint8_t col); + +// returns the maximum number of function switches supported in hardware +uint8_t switchGetMaxFctSwitches(); + +struct switch_display_pos_t { + uint8_t col; + uint8_t row; +}; + +switch_display_pos_t switchGetDisplayPosition(uint8_t idx); + +// The functions bellow support regular as well as function switches. +// +// Regular switches are indexed from `0` to `switchGetMaxSwitches() - 1` +// Function switches are indexed above the previous range. +// +// The total number of switches (and max index + 1) is: +// switchGetMaxSwitches() + switchGetMaxFctSwitches() +// + +// returns state (0 / 1) of a specific switch position +uint32_t switchState(uint8_t pos_idx); + +// returns a position for a switch index +SwitchHwPos switchGetPosition(uint8_t idx); + +const char* switchGetName(uint8_t idx); +SwitchHwType switchGetHwType(uint8_t idx); diff --git a/radio/src/inactivity_timer.cpp b/radio/src/inactivity_timer.cpp new file mode 100644 index 000000000..af1c164d9 --- /dev/null +++ b/radio/src/inactivity_timer.cpp @@ -0,0 +1,81 @@ +/* + * 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 "inactivity_timer.h" +#include "opentx.h" + +void inactivityTimerReset(ActivitySource src) +{ + bool reset_backlight_timer = false; + + switch(src) { + + case ActivitySource::Keys: + if (g_eeGeneral.backlightMode & e_backlight_mode_keys) { + reset_backlight_timer = true; + } + break; + + case ActivitySource::MainControls: + if (g_eeGeneral.backlightMode & e_backlight_mode_sticks) { + reset_backlight_timer = true; + } + break; + } + + if (reset_backlight_timer) { + resetBacklightTimeout(); + } + + inactivity.counter = 0; +} + +#define INAC_STICKS_SHIFT 6 +#define INAC_SWITCHES_SHIFT 8 + +bool inactivityCheckInputs() +{ + uint8_t sum = 0; + + for (uint8_t i = 0; i < MAX_ANALOG_INPUTS; i++) + sum += anaIn(i) >> INAC_STICKS_SHIFT; + + for (uint8_t i = 0; i < MAX_SWITCHES; i++) + sum += getValue(MIXSRC_FIRST_SWITCH + i) >> INAC_SWITCHES_SHIFT; + +#if defined(IMU) + for (uint8_t i = 0; i < 2; i++) + sum += getValue(MIXSRC_TILT_X + i) >> INAC_STICKS_SHIFT; +#endif + +#if defined(SPACEMOUSE) + for (uint8_t i = 0; i < (MIXSRC_LAST_SPACEMOUSE - MIXSRC_FIRST_SPACEMOUSE + 1); + i++) + sum += get_spacemouse_value(i) >> INAC_STICKS_SHIFT; +#endif + + if (abs((int8_t)(sum - inactivity.sum)) > 1) { + inactivity.sum = sum; + return true; + } else { + return false; + } +} diff --git a/radio/src/inactivity_timer.h b/radio/src/inactivity_timer.h new file mode 100644 index 000000000..6635af900 --- /dev/null +++ b/radio/src/inactivity_timer.h @@ -0,0 +1,30 @@ +/* + * 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 + +enum class ActivitySource { + Keys, + MainControls, +}; + +void inactivityTimerReset(ActivitySource src); +bool inactivityCheckInputs(); diff --git a/radio/src/input_mapping.cpp b/radio/src/input_mapping.cpp new file mode 100644 index 000000000..5e870964b --- /dev/null +++ b/radio/src/input_mapping.cpp @@ -0,0 +1,149 @@ +/* + * 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 "input_mapping.h" +#include "hal/adc_driver.h" + +#include "opentx.h" + +#define _CHANNEL_ORDER(a,b,c,d) \ + (((a) & 0x3) | (((b) & 0x3) << 2) | (((c) & 0x3) << 4) | (((d) & 0x3) << 6)) + +#if defined(SURFACE_RADIO) + +#define ST 0 +#define TH 1 + +const uint8_t _channel_order_lut[] = { + _CHANNEL_ORDER(ST,TH,0,0), + _CHANNEL_ORDER(TH,ST,0,0), +}; + +#else + +#define RUD 0 +#define ELE 1 +#define THR 2 +#define AIL 3 + +const uint8_t _channel_order_lut[] = { + _CHANNEL_ORDER(RUD,ELE,THR,AIL), + _CHANNEL_ORDER(RUD,ELE,AIL,THR), + _CHANNEL_ORDER(RUD,THR,ELE,AIL), + _CHANNEL_ORDER(RUD,THR,AIL,ELE), + _CHANNEL_ORDER(RUD,AIL,ELE,THR), + _CHANNEL_ORDER(RUD,AIL,THR,ELE), + _CHANNEL_ORDER(ELE,RUD,THR,AIL), + _CHANNEL_ORDER(ELE,RUD,AIL,THR), + _CHANNEL_ORDER(ELE,THR,RUD,AIL), + _CHANNEL_ORDER(ELE,THR,AIL,RUD), + _CHANNEL_ORDER(ELE,AIL,RUD,THR), + _CHANNEL_ORDER(ELE,AIL,THR,RUD), + _CHANNEL_ORDER(THR,RUD,ELE,AIL), + _CHANNEL_ORDER(THR,RUD,AIL,ELE), + _CHANNEL_ORDER(THR,ELE,RUD,AIL), + _CHANNEL_ORDER(THR,ELE,AIL,RUD), + _CHANNEL_ORDER(THR,AIL,RUD,ELE), + _CHANNEL_ORDER(THR,AIL,ELE,RUD), + _CHANNEL_ORDER(AIL,RUD,ELE,THR), + _CHANNEL_ORDER(AIL,RUD,THR,ELE), + _CHANNEL_ORDER(AIL,ELE,RUD,THR), + _CHANNEL_ORDER(AIL,ELE,THR,RUD), + _CHANNEL_ORDER(AIL,THR,RUD,ELE), + _CHANNEL_ORDER(AIL,THR,ELE,RUD), +}; +#endif + +#if !defined(SURFACE_RADIO) + +/* +mode1 rud ele thr ail +mode2 rud thr ele ail +mode3 ail ele thr rud +mode4 ail thr ele rud +*/ + +const uint8_t _input_mode_lut[] = { + RUD, ELE, THR, AIL, + RUD, THR, ELE, AIL, + AIL, ELE, THR, RUD, + AIL, THR, ELE, RUD +}; + +#endif + +bool inputMappingModesUsed() +{ +#if defined(SURFACE_RADIO) + return false; +#else + return true; +#endif +} + +uint8_t inputMappingGetThrottle() +{ +#if defined(SURFACE_RADIO) + return TH; +#else + return THR; +#endif +} + +uint8_t inputMappingConvertMode(uint8_t mode, uint8_t ch) +{ +#if !defined(SURFACE_RADIO) + if (ch < adcGetMaxInputs(ADC_INPUT_MAIN)) { + mode = min(mode, uint8_t(MAX_INPUT_MODES - 1)); + return _input_mode_lut[mode * MAX_STICKS + ch]; + } +#endif + return ch; +} + +uint8_t inputMappingConvertMode(uint8_t ch) +{ + return inputMappingConvertMode(g_eeGeneral.stickMode, ch); +} + +uint8_t inputMappingChannelOrder(uint8_t order, uint8_t ch) +{ + ch = min(ch, uint8_t(MAX_STICKS - 1)); + order = min(order, uint8_t(DIM(_channel_order_lut) - 1)); + return (_channel_order_lut[order] >> (ch * 2)) & 0x3; +} + +uint8_t inputMappingChannelOrder(uint8_t ch) +{ + return inputMappingChannelOrder(g_eeGeneral.templateSetup, ch); +} + +uint8_t inputMappingGetChannelOrder(uint8_t order) +{ + order = min(order, uint8_t(DIM(_channel_order_lut) - 1)); + return _channel_order_lut[order]; +} + +uint8_t inputMappingGetMaxChannelOrder() +{ + return DIM(_channel_order_lut); +} + diff --git a/radio/src/input_mapping.h b/radio/src/input_mapping.h new file mode 100644 index 000000000..bb5772538 --- /dev/null +++ b/radio/src/input_mapping.h @@ -0,0 +1,60 @@ +/* + * 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 + +// Air radios / input order in mode 1 +#define RUD_STICK 0 +#define ELE_STICK 1 +#define THR_STICK 2 +#define AIL_STICK 3 + +#define MAX_INPUT_MODES 4 + +// Is mapping of main controls used? (aka. "Modes") +bool inputMappingModesUsed(); + +// Return the throttle input regardless of radio type +uint8_t inputMappingGetThrottle(); + +// Map first 4 channels from/to Mode 1 +// according to radio settings +uint8_t inputMappingConvertMode(uint8_t ch); + +// Map first 4 channels from/to Mode 1 +// according to mode +uint8_t inputMappingConvertMode(uint8_t mode, uint8_t ch); + +// Return channels in order (ex: RETA, AETR, etc.) +// according to radio settings +uint8_t inputMappingChannelOrder(uint8_t ch); + +// Return channels in order (ex: RETA, AETR, etc.) +// according to the order index passed (0..23) +uint8_t inputMappingChannelOrder(uint8_t order, uint8_t ch); + +// Return channel order from an index (0..23) +uint8_t inputMappingGetChannelOrder(uint8_t order); + +// Return the maximum number of order permutations +uint8_t inputMappingGetMaxChannelOrder(); diff --git a/radio/src/io/bootloader_flash.cpp b/radio/src/io/bootloader_flash.cpp index be45400c3..6f0c738a0 100644 --- a/radio/src/io/bootloader_flash.cpp +++ b/radio/src/io/bootloader_flash.cpp @@ -21,8 +21,10 @@ #include #include "opentx.h" + #include "bootloader_flash.h" #include "timers_driver.h" +#include "watchdog_driver.h" #if defined(LIBOPENUI) #include "libopenui.h" diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp index 14046ba47..b3651a240 100644 --- a/radio/src/io/multi_firmware_update.cpp +++ b/radio/src/io/multi_firmware_update.cpp @@ -29,7 +29,9 @@ #include "multi_firmware_update.h" #include "stk500.h" #include "debug.h" + #include "timers_driver.h" +#include "watchdog_driver.h" #include diff --git a/radio/src/keys.cpp b/radio/src/keys.cpp index 2a24dfcb7..42c863528 100644 --- a/radio/src/keys.cpp +++ b/radio/src/keys.cpp @@ -20,54 +20,71 @@ */ #include "keys.h" -#include "timers_driver.h" -#include "opentx_helpers.h" -#define KEY_LONG_DELAY 32 // long key press minimum duration (x10ms), must be less than KEY_REPEAT_DELAY -#define KEY_REPEAT_DELAY 40 // press longer than this enables repeat (but does not fire it yet) -#define KEY_REPEAT_TRIGGER 48 // repeat trigger, used in combination with m_state to produce decreasing times between repeat events +#include "opentx_helpers.h" +#include "definitions.h" + +#include "timers_driver.h" +#include "watchdog_driver.h" +#include "hal/rotary_encoder.h" + +// required by watchdog macro.. +#if !defined(SIMU) +#include "stm32_cmsis.h" +#endif + +// long key press minimum duration (x10ms), +// must be less than KEY_REPEAT_DELAY +#define KEY_LONG_DELAY 32 + +// press longer than this enables repeat (but does not fire it yet) +#define KEY_REPEAT_DELAY 40 + +// repeat trigger, used in combination with m_state +// to produce decreasing times between repeat events +#define KEY_REPEAT_TRIGGER 48 + #define KEY_REPEAT_PAUSE_DELAY 64 -#ifdef SIMU - #define FILTERBITS 1 // defines how many bits are used for debounce +// defines how many bits are used for debounce +#if defined(SIMU) + #define FILTERBITS 1 #else - #define FILTERBITS 4 // defines how many bits are used for debounce + #define FILTERBITS 4 #endif +#define FILTER_MASK ((1 << FILTERBITS) - 1) + #define KSTATE_OFF 0 #define KSTATE_RPTDELAY 95 #define KSTATE_START 97 #define KSTATE_PAUSE 98 #define KSTATE_KILLED 99 - +// global last event event_t s_evt; -struct InactivityData inactivity = {0}; -Key keys[NUM_KEYS]; +event_t s_trim_evt; -/** - * @brief returns true if there is an event waiting. - * - */ -bool isEvent() -{ - return s_evt != 0; -} +InactivityData inactivity = {0}; -event_t getEvent(bool trim) +class Key { - event_t event = s_evt; - if (trim == IS_TRIM_EVENT(event)) { - s_evt = 0; - return event; - } - else { - return 0; - } -} + private: + uint8_t m_vals = 0; + uint8_t m_cnt = 0; + uint8_t m_state = 0; -void Key::input(bool val) + public: + event_t input(bool val); + bool pressed() const { return (m_vals & FILTER_MASK) == FILTER_MASK; } + void pauseEvents(); + void killEvents(); +}; + +event_t Key::input(bool val) { + event_t evt = 0; + // store new value in the bits that hold the key state history (used for debounce) uint8_t t_vals = m_vals ; t_vals <<= 1 ; @@ -79,25 +96,23 @@ void Key::input(bool val) if (m_state && m_vals == 0) { // key is released if (m_state != KSTATE_KILLED) { - // TRACE("key %d BREAK", key()); - pushEvent(EVT_KEY_BREAK(key())); + evt = _MSK_KEY_BREAK; } m_state = KSTATE_OFF; m_cnt = 0; - return; + return evt; } switch (m_state) { case KSTATE_OFF: - if (m_vals == ((1<= MAX_KEYS) return 0; + return keys[key].pressed(); +} + +uint8_t keysGetTrimState(uint8_t trim) +{ + if (trim >= keysGetMaxTrims() * 2) return 0; + return trim_keys[trim].pressed(); +} + +#if defined(USE_TRIMS_AS_BUTTONS) +static bool _trims_as_buttons = false; + +void setTrimsAsButtons(bool val) { _trims_as_buttons = val; } +bool getTrimsAsButtons() { return _trims_as_buttons; } + +static uint32_t transpose_trims() +{ + uint32_t keys = 0; + auto trims = readTrims(); + + if (trims & (1 << 0)) keys |= 1 << KEY_SYS; + if (trims & (1 << 1)) keys |= 1 << KEY_TELE; + if (trims & (1 << 2)) keys |= 1 << KEY_PAGEUP; + if (trims & (1 << 3)) keys |= 1 << KEY_PAGEDN; + if (trims & (1 << 4)) keys |= 1 << KEY_DOWN; + if (trims & (1 << 5)) keys |= 1 << KEY_UP; + if (trims & (1 << 6)) keys |= 1 << KEY_LEFT; + if (trims & (1 << 7)) keys |= 1 << KEY_RIGHT; + + return keys; +} +#endif + +bool keysPollingCycle() +{ + uint32_t i; + + uint32_t trims_input; + uint32_t keys_input = readKeys(); + +#if defined(USE_TRIMS_AS_BUTTONS) + if (getTrimsAsButtons()) { + keys_input |= transpose_trims(); + trims_input = 0; + } else { + trims_input = readTrims(); + } +#else + trims_input = readTrims(); +#endif + + for (i = 0; i < MAX_KEYS; i++) { + event_t evt = keys[i].input(keys_input & (1 << i)); + if (evt) { + if (i != KEY_SHIFT && evt != _MSK_KEY_REPT) { + pushEvent(evt | i); + } + } + } + + for (i = 0; i < MAX_TRIMS * 2; i++) { + event_t evt = trim_keys[i].input(trims_input & (1 << i)); + if (evt) pushTrimEvent(evt | i); + } + + return keys_input || trims_input; +} + +#if !defined(COLORLCD) + +#define ROTENC_DELAY_MIDSPEED 32 +#define ROTENC_DELAY_HIGHSPEED 16 + +int8_t rotencSpeed = ROTENC_LOWSPEED; + +int8_t rotaryEncoderGetAccel() +{ + return rotencSpeed; +} + +void rotaryEncoderResetAccel() +{ + rotencSpeed = ROTENC_LOWSPEED; +} + +bool rotaryEncoderPollingCycle() +{ + static rotenc_t rePreviousValue; + static bool cw = false; + rotenc_t reNewValue = rotaryEncoderGetValue(); + rotenc_t scrollRE = reNewValue - rePreviousValue; + if (scrollRE) { + static uint32_t lastEvent; + rePreviousValue = reNewValue; + + bool new_cw = (scrollRE < 0) ? false : true; + if ((g_tmr10ms - lastEvent >= 10) || (cw == new_cw)) { // 100ms + + pushEvent(new_cw ? EVT_ROTARY_RIGHT : EVT_ROTARY_LEFT); + + // rotary encoder navigation speed (acceleration) detection/calculation + static uint32_t delay = 2 * ROTENC_DELAY_MIDSPEED; + + if (new_cw == cw) { + // Modified moving average filter used for smoother change of speed + delay = (((g_tmr10ms - lastEvent) << 3) + delay) >> 1; + } else { + delay = 2 * ROTENC_DELAY_MIDSPEED; + } + + if (delay < ROTENC_DELAY_HIGHSPEED) + rotencSpeed = ROTENC_HIGHSPEED; + else if (delay < ROTENC_DELAY_MIDSPEED) + rotencSpeed = ROTENC_MIDSPEED; + else + rotencSpeed = ROTENC_LOWSPEED; + cw = new_cw; + lastEvent = g_tmr10ms; + } + + return true; + } + + return false; +} + +#elif !defined(COLORLCD) + +int8_t rotaryEncoderGetAccel() { return ROTENC_LOWSPEED; } +void rotaryEncoderResetAccel() {} + +#endif diff --git a/radio/src/keys.h b/radio/src/keys.h index af016f141..ea146282d 100644 --- a/radio/src/keys.h +++ b/radio/src/keys.h @@ -23,10 +23,11 @@ #define _KEYS_H_ #include -#include "board.h" #include "opentx_types.h" #include "libopenui/src/libopenui_types.h" +#include "hal/key_driver.h" + constexpr event_t EVT_REFRESH = 0x1000; constexpr event_t EVT_ENTRY = 0x1001; constexpr event_t EVT_ENTRY_UP = 0x1002; @@ -89,7 +90,7 @@ constexpr bool IS_TOUCH_EVENT(event_t event) #endif // normal order of events is: FIRST, LONG, REPEAT, REPEAT, ..., BREAK -#define EVT_KEY_MASK(e) ((e) & 0x1F) +#define EVT_KEY_MASK(e) ((e) & 0x1F) constexpr event_t EVT_KEY_FIRST(uint8_t key) { @@ -116,10 +117,10 @@ constexpr bool IS_KEY_EVENT(event_t event) return (event & 0xF000) == 0; // fired when key is released (short or long), but only if the event was not killed } -constexpr bool IS_TRIM_EVENT(event_t event) -{ - return (IS_KEY_EVENT(event) && EVT_KEY_MASK(event) >= TRM_BASE); -} +// constexpr bool IS_TRIM_EVENT(event_t event) +// { +// return (IS_KEY_EVENT(event) && EVT_KEY_MASK(event) >= TRM_BASE); +// } inline bool IS_KEY_FIRST(event_t evt) { @@ -146,63 +147,43 @@ inline bool IS_KEY_EVT(event_t evt, uint8_t key) return (evt & _MSK_KEY_FLAGS) && (EVT_KEY_MASK(evt) == key); } -#if defined(PCBXLITE) - #define EVT_ROTARY_BREAK EVT_KEY_BREAK(KEY_ENTER) - #define EVT_ROTARY_LONG EVT_KEY_LONG(KEY_ENTER) - #define IS_NEXT_EVENT(event) (event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)) - #define IS_PREVIOUS_EVENT(event) (event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)) -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define EVT_ROTARY_BREAK EVT_KEY_BREAK(KEY_ENTER) - #define EVT_ROTARY_LONG EVT_KEY_LONG(KEY_ENTER) - #define IS_NEXT_EVENT(event) (event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)) - #define IS_PREVIOUS_EVENT(event) (event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)) -#elif defined(PCBFRSKY) && defined(ROTARY_ENCODER_NAVIGATION) - #define EVT_ROTARY_BREAK EVT_KEY_BREAK(KEY_ENTER) - #define EVT_ROTARY_LONG EVT_KEY_LONG(KEY_ENTER) - #define IS_NEXT_EVENT(event) (event==EVT_ROTARY_RIGHT) - #define IS_PREVIOUS_EVENT(event) (event==EVT_ROTARY_LEFT) -#elif defined(ROTARY_ENCODER_NAVIGATION) - #define EVT_ROTARY_BREAK 0xcf - #define EVT_ROTARY_LONG 0xce - #define IS_NEXT_EVENT(event) (event==EVT_ROTARY_RIGHT || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)) - #define IS_PREVIOUS_EVENT(event) (event==EVT_ROTARY_LEFT || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)) -#else - #define IS_NEXT_EVENT(event) (event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)) - #define IS_PREVIOUS_EVENT(event) (event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)) -#endif - -class Key +inline bool IS_NEXT_EVENT(event_t evt) { - private: - uint8_t m_vals = 0; - uint8_t m_cnt = 0; - uint8_t m_state = 0; - public: - void input(bool val); - bool state() const { return m_vals > 0; } - void pauseEvents(); - void killEvents(); - uint8_t key() const; -}; - -extern Key keys[NUM_KEYS]; -extern event_t s_evt; - -inline void pushEvent(event_t evt) -{ - s_evt = evt; + return evt == EVT_KEY_FIRST(KEY_DOWN) || evt == EVT_KEY_REPT(KEY_DOWN) || + evt == EVT_KEY_FIRST(KEY_MINUS) || evt == EVT_KEY_REPT(KEY_MINUS) || + evt == EVT_ROTARY_RIGHT; } +inline bool IS_PREVIOUS_EVENT(event_t evt) +{ + return evt == EVT_KEY_FIRST(KEY_UP) || evt == EVT_KEY_REPT(KEY_UP) || + evt == EVT_KEY_FIRST(KEY_PLUS) || evt == EVT_KEY_REPT(KEY_PLUS) || + evt == EVT_ROTARY_LEFT; +} + +void pushEvent(event_t evt); +event_t getEvent(); + void pauseEvents(event_t event); void killEvents(event_t event); void killAllEvents(); bool waitKeysReleased(); -event_t getEvent(bool trim=false); bool isEvent(); bool keyDown(); -#if defined(ROTARY_ENCODER_NAVIGATION) -extern uint8_t rotencSpeed; +event_t getTrimEvent(); +void pauseTrimEvents(event_t event); +void killTrimEvents(event_t event); + +uint8_t keysGetState(uint8_t key); +uint8_t keysGetTrimState(uint8_t trim); + +bool keysPollingCycle(); +bool rotaryEncoderPollingCycle(); + +#if defined(USE_TRIMS_AS_BUTTONS) +void setTrimsAsButtons(bool val); +bool getTrimsAsButtons(); #endif struct InactivityData diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index b1017085d..6758d6d80 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -22,6 +22,11 @@ #include "opentx.h" #include "ff.h" +#include "analogs.h" +#include "switches.h" +#include "hal/adc_driver.h" +#include "hal/switch_driver.h" + #if defined(LIBOPENUI) #include "libopenui.h" #endif @@ -225,23 +230,26 @@ void writeHeader() } } -#if defined(PCBFRSKY) || defined(PCBNV14) - for (uint8_t i=1; i lua_exports_${target}.txt - COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/luaexport.py ${VERSION} lua_exports_${target}.txt lua_exports_${target}.inc lua_fields_${target}.txt - ) - add_custom_target(lua_export_${target} DEPENDS lua_exports_${target}.inc) -endmacro(add_lua_export_target) - -set(LUA_INCLUDES - -DCPUARM -DLUA -DLUA_INPUTS -DLUA_EXPORT_GENERATION -DSIMU ${SYSROOT_ARG} - -I${RADIO_SRC_DIR} - -I${RADIO_SRC_DIR}/targets/${TARGET_DIR} - -I${RADIO_SRC_DIR}/thirdparty - -I${RADIO_SRC_DIR}/targets/common/arm/stm32 - ) - -if(PYTHONINTERP_FOUND) - add_lua_export_target(x9lite ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9LITE -DPCBX9) - add_lua_export_target(x9lites ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9LITES -DPCBX9LITE -DPCBX9) - add_lua_export_target(x7 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_X7) - add_lua_export_target(x7access ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7ACCESS -DPCBX7 -DRADIO_X7ACCESS) - add_lua_export_target(xlite ${LUA_INCLUDES} -DPCBTARANIS -DPCBXLITE) - add_lua_export_target(xlites ${LUA_INCLUDES} -DPCBTARANIS -DPCBXLITES -DPCBXLITE -DIMU) - add_lua_export_target(x9d ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9D -DPCBX9) - add_lua_export_target(x9d+2019 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9D -DPCBX9 -DRADIO_X9DP2019) - add_lua_export_target(x9e ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9E -DPCBX9) - add_lua_export_target(x10 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10) - add_lua_export_target(x12s ${LUA_INCLUDES} -DPCBHORUS -DPCBX12S) - add_lua_export_target(t12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T12) - add_lua_export_target(tlite ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TLITE) - add_lua_export_target(lr3pro ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_LR3PRO) - add_lua_export_target(tpro ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TPRO) - add_lua_export_target(tx12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TX12) - add_lua_export_target(tx12mk2 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TX12MK2) - add_lua_export_target(boxer ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_BOXER) - add_lua_export_target(zorro ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_ZORRO) - add_lua_export_target(t8 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T8) - add_lua_export_target(commando8 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_COMMANDO8) - add_lua_export_target(t16 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10 -DRADIO_T16) - add_lua_export_target(nv14 ${LUA_INCLUDES} -I${RADIO_SRC_DIR}/targets/nv14 -DPCBNV14) -endif() - add_definitions(-DLUA) if(LUA_COMPILER) @@ -58,8 +15,6 @@ endif() include_directories(${LUA_DIR}) -set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} ${LUA_EXPORT}) - if(LUA_MIXER) add_definitions(-DLUA_MODEL_SCRIPTS) endif() @@ -72,6 +27,12 @@ set(SRC ${SRC} lua/lua_event.cpp ) +AddHWGenTarget(${HW_DESC_JSON} lua_inputs lua_inputs.inc) +set(SRC ${SRC} ${CMAKE_CURRENT_BINARY_DIR}/lua_inputs.inc) + +# helper target for testing purposes +add_custom_target(lua_inputs DEPENDS ${HW_DESC_JSON} lua_inputs.inc) + if(GUI_DIR STREQUAL colorlcd) set(SRC ${SRC} lua/api_colorlcd.cpp lua/widgets.cpp) else() diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index d34a7e582..4c85a5a7b 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -28,6 +28,10 @@ #include "lua_api.h" #include "api_filesystem.h" #include "hal/module_port.h" +#include "hal/adc_driver.h" +#include "hal/rotary_encoder.h" +#include "switches.h" +#include "input_mapping.h" #if defined(LIBOPENUI) #include "libopenui.h" @@ -35,54 +39,6 @@ #include "standalone_lua.h" #endif -#if defined(PCBX12S) - #include "lua_exports_x12s.inc" // this line must be after lua headers -#elif defined(RADIO_FAMILY_T16) - #include "lua_exports_t16.inc" -#elif defined(PCBX10) - #include "lua_exports_x10.inc" -#elif defined(PCBX9E) - #include "lua_exports_x9e.inc" -#elif defined(RADIO_X7ACCESS) - #include "lua_exports_x7access.inc" -#elif defined(RADIO_X7) - #include "lua_exports_x7.inc" -#elif defined(RADIO_T12) - #include "lua_exports_t12.inc" -#elif defined(RADIO_TLITE) - #include "lua_exports_tlite.inc" -#elif defined(RADIO_TPRO) - #include "lua_exports_tpro.inc" -#elif defined(RADIO_TX12) - #include "lua_exports_tx12.inc" -#elif defined(RADIO_TX12MK2) - #include "lua_exports_tx12mk2.inc" -#elif defined(RADIO_LR3PRO) - #include "lua_exports_lr3pro.inc" -#elif defined(RADIO_BOXER) - #include "lua_exports_boxer.inc" -#elif defined(RADIO_ZORRO) - #include "lua_exports_zorro.inc" -#elif defined(RADIO_T8) - #include "lua_exports_t8.inc" -#elif defined(RADIO_COMMANDO8) - #include "lua_exports_commando8.inc" -#elif defined(PCBX9LITES) - #include "lua_exports_x9lites.inc" -#elif defined(PCBX9LITE) - #include "lua_exports_x9lite.inc" -#elif defined(PCBXLITES) - #include "lua_exports_xlites.inc" -#elif defined(PCBXLITE) - #include "lua_exports_xlite.inc" -#elif defined(RADIO_X9DP2019) - #include "lua_exports_x9d+2019.inc" -#elif defined(PCBTARANIS) - #include "lua_exports_x9d.inc" -#elif defined(PCBNV14) - #include "lua_exports_nv14.inc" -#endif - #include "telemetry/frsky.h" #if defined(MULTIMODULE) @@ -401,30 +357,126 @@ void luaGetValueAndPush(lua_State* L, int src) } } -/** - Return field data for a given field name -*/ -bool luaFindFieldByName(const char * name, LuaField & field, unsigned int flags) +struct LuaSingleField { + uint16_t id; + const char* name; + const char* desc; +}; + +const LuaSingleField luaSingleFields[] = { + {MIXSRC_FIRST_STICK, "rud", "Rudder"}, + {MIXSRC_FIRST_STICK + 1, "ele", "Elevator"}, + {MIXSRC_FIRST_STICK + 2, "thr", "Throttle"}, + {MIXSRC_FIRST_STICK + 3, "ail", "Aileron"}, + +#if defined(IMU) + {MIXSRC_TILT_X, "tiltx", "Tilt X"}, + {MIXSRC_TILT_Y, "tilty", "Tilt Y"}, +#endif + +#if defined(PCBHORUS) + {MIXSRC_SPACEMOUSE_A, "sma", "SpaceMouse A"}, + {MIXSRC_SPACEMOUSE_B, "smb", "SpaceMouse B"}, + {MIXSRC_SPACEMOUSE_C, "smc", "SpaceMouse C"}, + {MIXSRC_SPACEMOUSE_D, "smd", "SpaceMouse D"}, + {MIXSRC_SPACEMOUSE_E, "sme", "SpaceMouse E"}, + {MIXSRC_SPACEMOUSE_F, "smf", "SpaceMouse F"}, +#endif + + {MIXSRC_MAX, "max", "MAX"}, + + {MIXSRC_TrimRud, "trim-rud", "Rudder trim"}, + {MIXSRC_TrimEle, "trim-ele", "Elevator trim"}, + {MIXSRC_TrimThr, "trim-thr", "Throttle trim"}, + {MIXSRC_TrimAil, "trim-ail", "Aileron trim"}, + +#if MAX_TRIMS > 4 + {MIXSRC_TrimT5, "trim-t5", "Aux trim T5"}, + {MIXSRC_TrimT6, "trim-t6", "Aux trim T6"}, +#endif + + {MIXSRC_TX_VOLTAGE, "tx-voltage", "Transmitter battery voltage [volts]"}, + {MIXSRC_TX_TIME, "clock", "RTC clock [minutes from midnight]"}, +}; + +// Legacy input names +// TODO: move to some HAL/driver functions +#include "lua_inputs.inc" + +struct LuaMultipleField { + uint16_t id; + const char* name; + const char* desc; + uint8_t count; +}; + +// The list of Lua fields that have a range of values +const LuaMultipleField luaMultipleFields[] = { + {MIXSRC_FIRST_INPUT, "input", "Input [I%d]", MAX_INPUTS}, + {MIXSRC_FIRST_LUA, "lua", "Lua mix output %d", MAX_SCRIPTS * MAX_SCRIPT_OUTPUTS}, + {MIXSRC_FIRST_LOGICAL_SWITCH, "ls", "Logical switch L%d", MAX_LOGICAL_SWITCHES}, + {MIXSRC_FIRST_TRAINER, "trn", "Trainer input %d", MAX_TRAINER_CHANNELS}, + {MIXSRC_FIRST_CH, "ch", "Channel CH%d", MAX_OUTPUT_CHANNELS}, + {MIXSRC_FIRST_GVAR, "gvar", "Global variable %d", MAX_GVARS}, + {MIXSRC_FIRST_TELEM, "telem", "Telemetry sensor %d", MAX_TELEMETRY_SENSORS}, + {MIXSRC_FIRST_TIMER, "timer", "Timer %d value [seconds]", MAX_TIMERS}, + {MIXSRC_FIRST_HELI, "cyc", "Cyclic %d", 3}, +}; + +static bool _searchSingleFields(const char* name, LuaField& field, + unsigned int flags, + const LuaSingleField* fields, size_t n_fields) { - strncpy(field.name, name, sizeof(field.name) - 1); - field.name[sizeof(field.name) - 1] = '\0'; - // TODO better search method (binary lookup) - for (unsigned int n=0; n= 'a' && name[1] <= 'z') { + auto c = name[1] - 'a' + 'A'; + auto sw_idx = switchLookupIdx(c); + if (sw_idx >= 0) { + field.id = MIXSRC_FIRST_SWITCH + sw_idx; + if (flags & FIND_FIELD_DESC) { + snprintf(field.desc, sizeof(field.desc)-1, "Switch %c", c); + field.desc[sizeof(field.desc)-1] = '\0'; + } else { + field.desc[0] = '\0'; + } + return true; + } + } + // search in multiples - unsigned int len = strlen(name); for (unsigned int n=0; nfadeOut); lua_pushstring(L, "trimsValues"); lua_newtable(L); - for (uint8_t i = 0; i < NUM_TRIMS; i++) { + for (uint8_t i = 0; i < MAX_TRIMS; i++) { lua_pushinteger(L, i + 1); lua_pushinteger(L, fm->trim[i].value); lua_settable(L, -3); @@ -496,7 +496,7 @@ static int luaModelGetFlightMode(lua_State * L) lua_settable(L, -3); lua_pushstring(L, "trimsModes"); lua_newtable(L); - for (uint8_t i = 0; i < NUM_TRIMS; i++) { + for (uint8_t i = 0; i < MAX_TRIMS; i++) { lua_pushinteger(L, i + 1); lua_pushinteger(L, fm->trim[i].mode); lua_settable(L, -3); @@ -550,13 +550,13 @@ static int luaModelSetFlightMode(lua_State * L) luaL_checktype(L, -1, LUA_TTABLE); for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { int idx = luaL_checkinteger(L, -2) - 1; // key is integer - if (idx < 0 || idx >= NUM_TRIMS) continue; + if (idx < 0 || idx >= MAX_TRIMS) continue; int16_t val = luaL_checkinteger(L, -1); if (g_model.extendedTrims) val = limit(val, TRIM_EXTENDED_MIN, TRIM_EXTENDED_MAX); else val = limit(val, TRIM_MIN, TRIM_MAX); - if (idx < NUM_TRIMS) + if (idx < MAX_TRIMS) fm->trim[idx].value = val; } } @@ -564,9 +564,9 @@ static int luaModelSetFlightMode(lua_State * L) luaL_checktype(L, -1, LUA_TTABLE); for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { int idx = luaL_checkinteger(L, -2) - 1; // key is integer - if (idx < 0 || idx >= NUM_TRIMS) continue; + if (idx < 0 || idx >= MAX_TRIMS) continue; uint16_t val = luaL_checkinteger(L, -1); - if (idx < NUM_TRIMS) + if (idx < MAX_TRIMS) fm->trim[idx].mode = (val & 0x1F); } } diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index aabf747f5..bd24e49ff 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -33,6 +33,7 @@ #include "sdcard.h" #include "api_filesystem.h" +#include "switches.h" #if defined(LIBOPENUI) #include "libopenui.h" @@ -78,6 +79,11 @@ struct our_longjmp * global_lj = 0; uint32_t luaExtraMemoryUsage = 0; #endif +static bool _is_standalone_script() +{ + return scriptInternalData[0].reference == SCRIPT_STANDALONE; +} + #if defined(LUA_ALLOCATOR_TRACER) LuaMemTracer lsScriptsTrace; @@ -245,6 +251,10 @@ void luaDisable() { POPUP_WARNING("Lua disabled!"); luaState = INTERPRETER_PANIC; + +#if defined(USE_TRIMS_AS_BUTTONS) + if (_is_standalone_script()) setTrimsAsButtons(false); +#endif } void luaClose(lua_State ** L) @@ -980,6 +990,7 @@ static void luaLoadScripts(bool init, const char * filename = nullptr) // Loading has finished - start running scripts luaState = INTERPRETER_START_RUNNING; + } // luaLoadScripts void luaExec(const char * filename) @@ -1241,6 +1252,10 @@ bool luaTask(event_t evt, bool allowLcdUsage) case INTERPRETER_RELOAD_PERMANENT_SCRIPTS: init = true; luaState = INTERPRETER_LOADING; + +#if defined(USE_TRIMS_AS_BUTTONS) + if (_is_standalone_script()) setTrimsAsButtons(false); +#endif case INTERPRETER_LOADING: PROTECT_LUA() { @@ -1253,7 +1268,11 @@ bool luaTask(event_t evt, bool allowLcdUsage) case INTERPRETER_START_RUNNING: init = true; luaState = INTERPRETER_RUNNING; - + +#if defined(USE_TRIMS_AS_BUTTONS) + if (_is_standalone_script()) setTrimsAsButtons(true); +#endif + case INTERPRETER_RUNNING: PROTECT_LUA() { scriptWasRun = resumeLua(init, allowLcdUsage); diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h index 5cef63088..3e992c694 100644 --- a/radio/src/lua/lua_api.h +++ b/radio/src/lua/lua_api.h @@ -223,12 +223,6 @@ extern uint16_t maxLuaInterval; extern uint16_t maxLuaDuration; extern uint8_t instructionsPercent; -#if defined(KEYS_GPIO_REG_PAGE) - #define IS_MASKABLE(key) ((key) != KEY_EXIT && (key) != KEY_ENTER && ((scriptInternalData[0].reference == SCRIPT_STANDALONE) || (key) != KEY_PAGE)) -#else - #define IS_MASKABLE(key) ((key) != KEY_EXIT && (key) != KEY_ENTER) -#endif - struct LuaField { uint16_t id; char name[20]; @@ -266,23 +260,6 @@ struct LuaMemTracer { void * tracer_alloc(void * ud, void * ptr, size_t osize, size_t nsize); -inline bool isLuaStandaloneRunning() { - return scriptInternalData[0].reference == SCRIPT_STANDALONE; -} - -// #if defined(HARDWARE_TOUCH) -// struct LuaTouchData { -// coord_t touchX; -// coord_t touchY; -// coord_t startX; -// coord_t startY; -// coord_t slideX; -// coord_t slideY; -// short tapCount; -// }; - -// extern LuaTouchData touches[EVENT_BUFFER_SIZE]; -// #endif #else // defined(LUA) diff --git a/radio/src/lua/lua_widget.cpp b/radio/src/lua/lua_widget.cpp index 135912825..7052ac0b9 100644 --- a/radio/src/lua/lua_widget.cpp +++ b/radio/src/lua/lua_widget.cpp @@ -25,6 +25,7 @@ #include "lua_api.h" #include "lua_event.h" #include "draw_functions.h" +#include "touch.h" #define MAX_INSTRUCTIONS (20000/100) @@ -175,8 +176,8 @@ void LuaEventHandler::onEvent(event_t event) killEvents(KEY_EXIT); } #if !defined(KEYS_GPIO_REG_PGUP) - else if (event == EVT_KEY_LONG(KEY_PGDN)) { - killEvents(KEY_PGDN); + else if (event == EVT_KEY_LONG(KEY_PAGEDN)) { + killEvents(KEY_PAGEDN); } #endif luaPushEvent(event); diff --git a/radio/src/main.cpp b/radio/src/main.cpp index a019e184c..a7df1c5db 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -401,7 +401,8 @@ bool handleGui(event_t event) { bool refreshNeeded; #if defined(LUA) refreshNeeded = luaTask(event, true); - if (menuHandlers[menuLevel] == menuViewTelemetry && TELEMETRY_SCREEN_TYPE(s_frsky_view) == TELEMETRY_SCREEN_TYPE_SCRIPT) { + if (menuHandlers[menuLevel] == menuViewTelemetry && + TELEMETRY_SCREEN_TYPE(s_frsky_view) == TELEMETRY_SCREEN_TYPE_SCRIPT) { menuHandlers[menuLevel](event); } else if (scriptInternalData[0].reference != SCRIPT_STANDALONE) @@ -525,7 +526,7 @@ void perMain() checkBacklight(); #if !defined(LIBOPENUI) - event_t evt = getEvent(false); + event_t evt = getEvent(); #endif #if defined(RTC_BACKUP_RAM) diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index e68207851..6904a769d 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -22,12 +22,16 @@ #include "opentx.h" #include "timers.h" #include "switches.h" +#include "input_mapping.h" + +#include "hal/adc_driver.h" +#include "hal/switch_driver.h" uint8_t s_mixer_first_run_done = false; int8_t virtualInputsTrims[MAX_INPUTS]; int16_t anas [MAX_INPUTS] = {0}; -int16_t trims[NUM_TRIMS] = {0}; +int16_t trims[MAX_TRIMS] = {0}; int32_t chans[MAX_OUTPUT_CHANNELS] = {0}; BeepANACenter bpanaCenter = 0; @@ -36,7 +40,7 @@ SwOn swOn [MAX_MIXERS]; // TODO better name later... uint8_t mixWarning; -int16_t calibratedAnalogs[NUM_CALIBRATED_ANALOGS]; +int16_t calibratedAnalogs[MAX_ANALOG_INPUTS]; int16_t channelOutputs[MAX_OUTPUT_CHANNELS] = {0}; int16_t ex_chans[MAX_OUTPUT_CHANNELS] = {0}; // Outputs (before LIMITS) of the last perMain; @@ -192,8 +196,9 @@ void applyExpos(int16_t * anas, uint8_t mode, uint8_t ovwrIdx, int16_t ovwrValue //========== TRIMS ================ if (ed->trimSource < TRIM_ON) virtualInputsTrims[cur_chn] = -ed->trimSource - 1; - else if (ed->trimSource == TRIM_ON && ed->srcRaw >= MIXSRC_Rud && ed->srcRaw <= MIXSRC_Ail) - virtualInputsTrims[cur_chn] = ed->srcRaw - MIXSRC_Rud; + else if (ed->trimSource == TRIM_ON && ed->srcRaw >= MIXSRC_FIRST_STICK && + ed->srcRaw <= MIXSRC_LAST_STICK) + virtualInputsTrims[cur_chn] = ed->srcRaw - MIXSRC_FIRST_STICK; else virtualInputsTrims[cur_chn] = -1; anas[cur_chn] = v; @@ -298,7 +303,7 @@ getvalue_t getValue(mixsrc_t i, bool* valid) return 0; } else if (i <= MIXSRC_LAST_INPUT) { - return anas[i-MIXSRC_FIRST_INPUT]; + return anas[i - MIXSRC_FIRST_INPUT]; } #if defined(LUA_INPUTS) else if (i <= MIXSRC_LAST_LUA) { @@ -312,9 +317,33 @@ getvalue_t getValue(mixsrc_t i, bool* valid) } #endif - else if (i <= MIXSRC_LAST_POT + NUM_MOUSE_ANALOGS) { - return calibratedAnalogs[i - MIXSRC_Rud]; + else if (i <= MIXSRC_LAST_STICK) { + i -= MIXSRC_FIRST_STICK; + if (i >= adcGetMaxInputs(ADC_INPUT_MAIN)) { + if (valid != nullptr) *valid = false; + return 0; + } + return calibratedAnalogs[inputMappingConvertMode(i)]; } + else if (i <= MIXSRC_LAST_POT) { + i -= MIXSRC_FIRST_POT; + if (i >= adcGetMaxInputs(ADC_INPUT_POT)) { + if (valid != nullptr) *valid = false; + return 0; + } + return calibratedAnalogs[i + adcGetInputOffset(ADC_INPUT_POT)]; + } + +#if MAX_AXIS > 0 + else if (i <= MIXSRC_LAST_AXIS) { + i -= MIXSRC_FIRST_AXIS; + if (i >= adcGetMaxInputs(ADC_INPUT_AXIS)) { + if (valid != nullptr) *valid = false; + return 0; + } + return calibratedAnalogs[i + adcGetInputOffset(ADC_INPUT_AXIS)]; + } +#endif #if defined(IMU) else if (i == MIXSRC_TILT_X) { @@ -332,12 +361,12 @@ getvalue_t getValue(mixsrc_t i, bool* valid) #endif else if (i == MIXSRC_MAX) { - return 1024; + return RESX; } - else if (i <= MIXSRC_CYC3) { + else if (i <= MIXSRC_LAST_HELI) { #if defined(HELI) - return cyc_anas[i - MIXSRC_CYC1]; + return cyc_anas[i - MIXSRC_FIRST_HELI]; #else if (valid != nullptr) *valid = false; return 0; @@ -345,11 +374,10 @@ getvalue_t getValue(mixsrc_t i, bool* valid) } else if (i <= MIXSRC_LAST_TRIM) { - return calc1000toRESX((int16_t)8 * getTrimValue(mixerCurrentFlightMode, i-MIXSRC_FIRST_TRIM)); + i -= MIXSRC_FIRST_TRIM; + auto trim_value = getTrimValue(mixerCurrentFlightMode, i); + return calc1000toRESX((int16_t)8 * trim_value); } - - // TODO : find a better define -#if defined(PCBFRSKY) || defined(PCBFLYSKY) #if defined(FUNCTION_SWITCHES) else if (i >= MIXSRC_FIRST_SWITCH && i <= MIXSRC_LAST_REGULAR_SWITCH) { mixsrc_t sw = i - MIXSRC_FIRST_SWITCH; @@ -360,9 +388,8 @@ getvalue_t getValue(mixsrc_t i, bool* valid) if (valid != nullptr) *valid = false; return 0; } - } - else if (i >= MIXSRC_FIRST_FS_SWITCH && i <= MIXSRC_LAST_SWITCH) { - return getFSLogicalState(i - MIXSRC_FIRST_SWITCH - NUM_REGULAR_SWITCHES) ? +1024 : -1024; + } else if (i >= MIXSRC_FIRST_FS_SWITCH && i <= MIXSRC_LAST_SWITCH) { + return getFSLogicalState(i - MIXSRC_FIRST_SWITCH - switchGetMaxSwitches()) ? +1024 : -1024; } #else else if (i >= MIXSRC_FIRST_SWITCH && i <= MIXSRC_LAST_SWITCH) { @@ -376,33 +403,22 @@ getvalue_t getValue(mixsrc_t i, bool* valid) } } #endif -#else - else if (i == MIXSRC_3POS) { - return (getSwitch(SW_ID0+1) ? -1024 : (getSwitch(SW_ID1+1) ? 0 : 1024)); - } - // don't use switchState directly to give getSwitch possibility to hack values if needed for switch warning - else if (i < MIXSRC_SW1) { - return getSwitch(SWSRC_THR+i-MIXSRC_THR) ? 1024 : -1024; - } -#endif else if (i <= MIXSRC_LAST_LOGICAL_SWITCH) { return getSwitch(SWSRC_FIRST_LOGICAL_SWITCH + i - MIXSRC_FIRST_LOGICAL_SWITCH) ? 1024 : -1024; - } - else if (i <= MIXSRC_LAST_TRAINER) { + } else if (i <= MIXSRC_LAST_TRAINER) { int16_t x = ppmInput[i - MIXSRC_FIRST_TRAINER]; if (i < MIXSRC_FIRST_TRAINER + NUM_CAL_PPM) { x -= g_eeGeneral.trainer.calib[i - MIXSRC_FIRST_TRAINER]; } return x * 2; - } - else if (i <= MIXSRC_LAST_CH) { - return ex_chans[i - MIXSRC_CH1]; + } else if (i <= MIXSRC_LAST_CH) { + return ex_chans[i - MIXSRC_FIRST_CH]; } else if (i <= MIXSRC_LAST_GVAR) { #if defined(GVARS) - return GVAR_VALUE(i - MIXSRC_GVAR1, getGVarFlightMode(mixerCurrentFlightMode, i - MIXSRC_GVAR1)); + return GVAR_VALUE(i - MIXSRC_FIRST_GVAR, getGVarFlightMode(mixerCurrentFlightMode, i - MIXSRC_FIRST_GVAR)); #else if (valid != nullptr) *valid = false; return 0; @@ -411,8 +427,7 @@ getvalue_t getValue(mixsrc_t i, bool* valid) else if (i == MIXSRC_TX_VOLTAGE) { return g_vbat100mV; - } - else if (i < MIXSRC_FIRST_TIMER) { + } else if (i < MIXSRC_FIRST_TIMER) { // TX_TIME + SPARES #if defined(RTCLOCK) return (g_rtcTime % SECS_PER_DAY) / 60; // number of minutes from midnight @@ -420,8 +435,7 @@ getvalue_t getValue(mixsrc_t i, bool* valid) if (valid != nullptr) *valid = false; return 0; #endif - } - else if (i <= MIXSRC_LAST_TIMER) { + } else if (i <= MIXSRC_LAST_TIMER) { return timersStates[i - MIXSRC_FIRST_TIMER].val; } @@ -441,8 +455,7 @@ getvalue_t getValue(mixsrc_t i, bool* valid) default: return telemetryItem.value; } - } - else { + } else { if (valid != nullptr) *valid = false; return 0; } @@ -451,7 +464,7 @@ getvalue_t getValue(mixsrc_t i, bool* valid) void evalTrims() { uint8_t phase = mixerCurrentFlightMode; - for (uint8_t i=0; i throttle trim if applicable int16_t trim = getTrimValue(phase, i); if (trimsCheckTimer > 0) { @@ -462,6 +475,8 @@ void evalTrims() } } + +// TODO: move to analogs.cpp void evalInputs(uint8_t mode) { BeepANACenter anaCenter = 0; @@ -483,22 +498,29 @@ void evalInputs(uint8_t mode) } #endif - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) { + auto max_calib_analogs = adcGetInputOffset(ADC_INPUT_VBAT); + auto pots_offset = adcGetInputOffset(ADC_INPUT_POT); + + for (uint8_t i = 0; i < max_calib_analogs; i++) { // normalization [0..2048] -> [-1024..1024] - uint8_t ch = (i < NUM_STICKS ? CONVERT_MODE(i) : i); int16_t v = anaIn(i); + uint8_t ch = (i < pots_offset ? inputMappingConvertMode(i) : i); - if (IS_POT_MULTIPOS(i)) { + if (i >= pots_offset && IS_POT_MULTIPOS(i - pots_offset)) { v -= RESX; } -#if !defined(SIMU) else { +#if defined(SIMU) + // Simu uses normed inputs + v -= RESX; +#else CalibData * calib = &g_eeGeneral.calib[i]; v -= calib->mid; v = v * (int32_t) RESX / (max((int16_t) 100, (v > 0 ? calib->spanPos : calib->spanNeg))); - } #endif + } + // Limit values to supported range if (v < -RESX) v = -RESX; if (v > RESX) v = RESX; @@ -522,9 +544,9 @@ void evalInputs(uint8_t mode) v = -v; } - BeepANACenter mask = (BeepANACenter)1 << ch; + BeepANACenter mask = (BeepANACenter)1 << ch; // TODO - calibratedAnalogs[ch] = v; // for show in expo + calibratedAnalogs[i] = v; // for show in expo // filtering for center beep uint8_t tmp = (uint16_t)abs(v) / 16; @@ -533,30 +555,33 @@ void evalInputs(uint8_t mode) anaCenter |= mask; if ((g_model.beepANACenter & mask) && !(bpanaCenter & mask) && s_mixer_first_run_done && !menuCalibrationState) { - if (!IS_POT(i) || IS_POT_SLIDER_AVAILABLE(i)) { + if (i < pots_offset || IS_POT_SLIDER_AVAILABLE(i - pots_offset)) { AUDIO_POT_MIDDLE(i); } } } } - if (ch < NUM_STICKS) { // only do this for sticks + if (ch < pots_offset) { // only do this for sticks if (mode & e_perout_mode_nosticks) { v = 0; } - if (mode <= e_perout_mode_inactive_flight_mode && isFunctionActive(FUNCTION_TRAINER_STICK1+ch) && IS_TRAINER_INPUT_VALID()) { + if (mode <= e_perout_mode_inactive_flight_mode && + isFunctionActive(FUNCTION_TRAINER_STICK1 + ch) && + IS_TRAINER_INPUT_VALID()) { // trainer mode TrainerMix* td = &g_eeGeneral.trainer.mix[ch]; if (td->mode) { uint8_t chStud = td->srcChn; - int32_t vStud = (ppmInput[chStud] - g_eeGeneral.trainer.calib[chStud]); + int32_t vStud = + (ppmInput[chStud] - g_eeGeneral.trainer.calib[chStud]); vStud *= td->studWeight; vStud /= 50; switch (td->mode) { case TRAINER_ADD: // add-mode - v = limit(-RESX, v+vStud, RESX); + v = limit(-RESX, v + vStud, RESX); break; case TRAINER_REPL: // subst-mode @@ -565,28 +590,17 @@ void evalInputs(uint8_t mode) } } } - calibratedAnalogs[ch] = v; + calibratedAnalogs[i] = v; } } -#if NUM_MOUSE_ANALOGS > 0 - for (uint8_t i=0; imid; - v = v * (int32_t) RESX / (max((int16_t) 100, (v > 0 ? calib->spanPos : calib->spanNeg))); - if (v < -RESX) v = -RESX; - if (v > RESX) v = RESX; - calibratedAnalogs[ch] = v; - } -#endif - - /* EXPOs */ + // EXPOs applyExpos(anas, mode); - /* TRIMs */ - evalTrims(); // when no virtual inputs, the trims need the anas array calculated above (when throttle trim enabled) + // TRIMs + // when no virtual inputs, the trims need the anas array calculated above + // (when throttle trim enabled) + evalTrims(); if (mode == e_perout_mode_normal) { bpanaCenter = anaCenter; @@ -601,11 +615,11 @@ int getStickTrimValue(int stick, int stickValue) int trim = trims[stick]; uint8_t thrTrimSw = g_model.getThrottleStickTrimSource() - MIXSRC_FIRST_TRIM; if (stick == thrTrimSw) { - if (g_model.throttleReversed) - trim = -trim; + if (g_model.throttleReversed) trim = -trim; if (g_model.thrTrim) { - trim = (g_model.extendedTrims) ? 2*TRIM_EXTENDED_MAX + trim : 2*TRIM_MAX + trim; - trim = trim * (1024 - stickValue) / (2*RESX); + trim = (g_model.extendedTrims) ? 2 * TRIM_EXTENDED_MAX + trim + : 2 * TRIM_MAX + trim; + trim = trim * (1024 - stickValue) / (2 * RESX); } } return trim; @@ -613,8 +627,8 @@ int getStickTrimValue(int stick, int stickValue) int getSourceTrimOrigin(int source) { - if (source >= MIXSRC_Rud && source <= MIXSRC_Ail) - return source - MIXSRC_Rud; + if (source >= MIXSRC_FIRST_STICK && source <= MIXSRC_LAST_STICK) + return source - MIXSRC_FIRST_STICK; else if (source >= MIXSRC_FIRST_INPUT && source <= MIXSRC_LAST_INPUT) return virtualInputsTrims[source - MIXSRC_FIRST_INPUT]; else @@ -734,7 +748,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) break; #endif - mixsrc_t stickIndex = md->srcRaw - MIXSRC_Rud; + mixsrc_t stickIndex = md->srcRaw - MIXSRC_FIRST_STICK; if (!(dirtyChannels & ((bitfield_channels_t)1 << md->destCh))) continue; @@ -772,10 +786,10 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) continue; } else { - mixsrc_t srcRaw = MIXSRC_Rud + stickIndex; + mixsrc_t srcRaw = MIXSRC_FIRST_STICK + stickIndex; v = getValue(srcRaw); - srcRaw -= MIXSRC_CH1; - if (srcRaw <= MIXSRC_LAST_CH-MIXSRC_CH1 && md->destCh != srcRaw) { + srcRaw -= MIXSRC_FIRST_CH; + if (srcRaw <= MIXSRC_LAST_CH-MIXSRC_FIRST_CH && md->destCh != srcRaw) { if (dirtyChannels & ((bitfield_channels_t)1 << srcRaw) & (passDirtyChannels|~(((bitfield_channels_t) 1 << md->destCh)-1))) passDirtyChannels |= (bitfield_channels_t) 1 << md->destCh; if (srcRaw < md->destCh || pass > 0) @@ -1131,8 +1145,8 @@ void doMixerPeriodicUpdates() /* Throttle trace */ int16_t val; - if (g_model.thrTraceSrc > NUM_POTS+NUM_SLIDERS) { - uint8_t ch = g_model.thrTraceSrc-NUM_POTS-NUM_SLIDERS-1; + if (g_model.thrTraceSrc > MAX_POTS) { + uint8_t ch = g_model.thrTraceSrc - MAX_POTS - 1; val = channelOutputs[ch]; LimitData * lim = limitAddress(ch); @@ -1160,7 +1174,7 @@ void doMixerPeriodicUpdates() val=0; // prevent val be negative, which would corrupt throttle trace and timers; could occur if safetyswitch is smaller than limits } else { - val = RESX + calibratedAnalogs[g_model.thrTraceSrc == 0 ? THR_STICK : g_model.thrTraceSrc+NUM_STICKS-1]; + val = RESX + calibratedAnalogs[g_model.thrTraceSrc == 0 ? THR_STICK : g_model.thrTraceSrc + MAX_STICKS - 1]; } val >>= (RESX_SHIFT-6); // calibrate it (resolution increased by factor 4) diff --git a/radio/src/model_init.cpp b/radio/src/model_init.cpp index 8eaabb8f0..acd2e9625 100644 --- a/radio/src/model_init.cpp +++ b/radio/src/model_init.cpp @@ -20,6 +20,8 @@ */ #include "opentx.h" +#include "hal/adc_driver.h" +#include "input_mapping.h" void clearInputs() { @@ -28,18 +30,18 @@ void clearInputs() void setDefaultInputs() { - for (int i=0; isrcRaw = MIXSRC_Rud - 1 + stick_index; + expo->srcRaw = MIXSRC_FIRST_STICK + stick_index; expo->curve.type = CURVE_REF_EXPO; expo->chn = i; expo->weight = 100; expo->mode = 3; // TODO constant - strncpy(g_model.inputNames[i], - STR_VSRCRAW[stick_index] + sizeof(STR_CHAR_STICK) - 1, - LEN_INPUT_NAME); + strncpy(g_model.inputNames[i], getMainControlLabel(stick_index), LEN_INPUT_NAME); } + storageDirty(EE_MODEL); } @@ -50,7 +52,8 @@ void clearMixes() void setDefaultMixes() { - for (int i=0; idestCh = i; mix->weight = 100; @@ -86,22 +89,6 @@ void setDefaultRSSIValues() void setVendorSpecificModelDefaults(uint8_t id) { -#if defined(FRSKY_RELEASE) - g_model.moduleData[INTERNAL_MODULE].type = IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_ISRM_PXX2 : MODULE_TYPE_XJT_PXX1; - g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); - #if defined(EEPROM) - g_model.header.modelId[INTERNAL_MODULE] = findNextUnusedModelId(id, INTERNAL_MODULE); - modelHeaders[id].modelId[INTERNAL_MODULE] = g_model.header.modelId[INTERNAL_MODULE]; - #endif -#endif - - // TODO: we should probably have some default trainer mode - // per radio, depending on what is supported - // -#if defined(PCBXLITE) - g_model.trainerData.mode = TRAINER_MODE_MASTER_BLUETOOTH; -#endif - #if defined(RADIOMASTER_RTF_RELEASE) // Those settings are for headless radio g_model.trainerData.mode = TRAINER_MODE_SLAVE; @@ -133,8 +120,10 @@ void applyDefaultTemplate() loadDefaultLayout(); // enable switch warnings - for (int i = 0; i < NUM_SWITCHES; i++) { - g_model.switchWarningState |= (1 << (3*i)); + for (int i = 0; i < MAX_SWITCHES; i++) { + if (SWITCH_EXISTS(i)) { + g_model.switchWarningState |= (1 << (3 * i)); + } } #endif diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 4b4bd2969..0539a59a2 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -84,29 +84,34 @@ #define MODEL_GVAR_MIN(idx) (CFN_GVAR_CST_MIN + g_model.gvars[idx].min) #define MODEL_GVAR_MAX(idx) (CFN_GVAR_CST_MAX - g_model.gvars[idx].max) -#if defined(PCBFRSKY) || defined(PCBNV14) - #define SWITCH_CONFIG(x) (bfGet(g_eeGeneral.switchConfig, 2*(x), 2)) +// pots config +#define POT_CFG_BITS 4 // 4 bits per pot +#define POT_CFG_MASK ((1 << POT_CFG_BITS) - 1) +#define POT_CONFIG_POS(x) (POT_CFG_BITS * (x)) +#define POT_CONFIG_MASK(x) (POT_CFG_MASK << POT_CONFIG_POS(x)) +#define POT_CONFIG_DISABLE_MASK(x) (~POT_CONFIG_MASK(x)) + +#define SW_CFG_BITS 2 +#define SW_CFG_MASK ((1 << SW_CFG_BITS) - 1) +#define SWITCH_CONFIG_MASK(x) ((swconfig_t)SW_CFG_MASK << (SW_CFG_BITS * (x))) + +#define SWITCH_CONFIG(x) (bfGet(g_eeGeneral.switchConfig, SW_CFG_BITS * (x), SW_CFG_BITS)) #if defined(FUNCTION_SWITCHES) - #define FSWITCH_CONFIG(x) (bfGet(g_model.functionSwitchConfig, 2*(x), 2)) - #define FSWITCH_GROUP(x) (bfGet(g_model.functionSwitchGroup, 2*(x), 2)) - #define IS_FSWITCH_GROUP_ON(x) (bfGet(g_model.functionSwitchGroup, 2 * NUM_FUNCTIONS_SWITCHES + x, 1)) - #define IS_SWITCH_FS(x) (x >= NUM_REGULAR_SWITCHES) + #define FSW_CFG_BITS 2 + #define FSWITCH_CONFIG(x) (bfGet(g_model.functionSwitchConfig, FSW_CFG_BITS * (x), FSW_CFG_BITS)) + #define FSWITCH_GROUP(x) (bfGet(g_model.functionSwitchGroup, FSW_CFG_BITS * (x), FSW_CFG_BITS)) + #define IS_FSWITCH_GROUP_ON(x) (bfGet(g_model.functionSwitchGroup, FSW_CFG_BITS * NUM_FUNCTIONS_SWITCHES + x, 1)) + #define IS_SWITCH_FS(x) (x >= switchGetMaxSwitches() && x < (switchGetMaxSwitches() + switchGetMaxFctSwitches())) #define SWITCH_EXISTS(x) (IS_SWITCH_FS(x) ? true : (SWITCH_CONFIG(x) != SWITCH_NONE)) - #define IS_CONFIG_3POS(x) (IS_SWITCH_FS(x) ? (FSWITCH_CONFIG(x - NUM_REGULAR_SWITCHES) == SWITCH_3POS) : (SWITCH_CONFIG(x) == SWITCH_3POS)) - #define IS_CONFIG_TOGGLE(x) (IS_SWITCH_FS(x) ? (FSWITCH_CONFIG(x - NUM_REGULAR_SWITCHES) == SWITCH_TOGGLE) : (SWITCH_CONFIG(x) == SWITCH_TOGGLE)) + #define IS_CONFIG_3POS(x) (IS_SWITCH_FS(x) ? (FSWITCH_CONFIG(x - switchGetMaxSwitches()) == SWITCH_3POS) : (SWITCH_CONFIG(x) == SWITCH_3POS)) + #define IS_CONFIG_TOGGLE(x) (IS_SWITCH_FS(x) ? (FSWITCH_CONFIG(x - switchGetMaxSwitches()) == SWITCH_TOGGLE) : (SWITCH_CONFIG(x) == SWITCH_TOGGLE)) #else #define SWITCH_EXISTS(x) (SWITCH_CONFIG(x) != SWITCH_NONE) #define IS_CONFIG_3POS(x) (SWITCH_CONFIG(x) == SWITCH_3POS) #define IS_CONFIG_TOGGLE(x) (SWITCH_CONFIG(x) == SWITCH_TOGGLE) #define IS_SWITCH_FS(x) (false) #endif - #define SWITCH_WARNING_ALLOWED(x) (SWITCH_EXISTS(x) && !(IS_CONFIG_TOGGLE(x) || IS_SWITCH_FS(x))) -#else - #define IS_CONFIG_3POS(x) IS_3POS(x) - #define IS_CONFIG_TOGGLE(x) IS_TOGGLE(x) - #define switchInfo(x) ((x) >= 3 ? (x)-2 : 0) - #define SWITCH_EXISTS(x) true -#endif +#define SWITCH_WARNING_ALLOWED(x) (SWITCH_EXISTS(x) && !(IS_CONFIG_TOGGLE(x) || IS_SWITCH_FS(x))) #define ALTERNATE_VIEW 0x10 diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index dcf7330b6..658cd6bd6 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -22,7 +22,13 @@ #include "opentx.h" #include "io/frsky_firmware_update.h" #include "hal/adc_driver.h" +#include "hal/switch_driver.h" #include "timers_driver.h" +#include "watchdog_driver.h" + +#include "switches.h" +#include "inactivity_timer.h" +#include "input_mapping.h" #include "tasks.h" #include "tasks/mixer_task.h" @@ -66,35 +72,6 @@ uint8_t* MSC_BOT_Data = reusableBuffer.MSC_BOT_Data; uint8_t latencyToggleSwitch = 0; #endif -const uint8_t bchout_ar[] = { - 0x1B, 0x1E, 0x27, 0x2D, 0x36, 0x39, - 0x4B, 0x4E, 0x63, 0x6C, 0x72, 0x78, - 0x87, 0x8D, 0x93, 0x9C, 0xB1, 0xB4, - 0xC6, 0xC9, 0xD2, 0xD8, 0xE1, 0xE4 }; - -uint8_t channelOrder(uint8_t setup, uint8_t x) -{ - if (setup >= sizeof(bchout_ar)) return x; - return ((*(bchout_ar + setup) >> (6 - (x - 1) * 2)) & 3) + 1; -} - -uint8_t channelOrder(uint8_t x) -{ - return channelOrder(g_eeGeneral.templateSetup, x); -} - -/* -mode1 rud ele thr ail -mode2 rud thr ele ail -mode3 ail ele thr rud -mode4 ail thr ele rud -*/ -const uint8_t modn12x3[] = { - 0, 1, 2, 3, - 0, 2, 1, 3, - 3, 1, 2, 0, - 3, 2, 1, 0 }; - volatile uint8_t rtc_count = 0; #if defined(DEBUG_LATENCY) @@ -116,33 +93,6 @@ void toggleLatencySwitch() } #endif -static void readKeysAndTrims() -{ - uint32_t i; - - uint8_t index = 0; - uint32_t keys_input = readKeys(); - for (i = 0; i < TRM_BASE; i++) { - keys[index++].input(keys_input & (1 << i)); - } - - uint32_t trims_input = readTrims(); - for (i = 1; i <= 1 << (TRM_LAST-TRM_BASE); i <<= 1) { - keys[index++].input(trims_input & i); - } - -#if defined(PWR_BUTTON_PRESS) - if ((keys_input || trims_input || pwrPressed()) && - (g_eeGeneral.backlightMode & e_backlight_mode_keys)) { -#else - if ((keys_input || trims_input) && - (g_eeGeneral.backlightMode & e_backlight_mode_keys)) { -#endif - // on keypress turn the light on - resetBacklightTimeout(); - } -} - void checkValidMCU(void) { #if !defined(SIMU) @@ -202,54 +152,17 @@ void per10ms() } #endif - // TODO: to board... - readKeysAndTrims(); + if (keysPollingCycle()) { + inactivityTimerReset(ActivitySource::Keys); + } #if defined(FUNCTION_SWITCHES) evalFunctionSwitches(); #endif #if defined(ROTARY_ENCODER_NAVIGATION) && !defined(LIBOPENUI) - if (IS_ROTARY_ENCODER_NAVIGATION_ENABLE()) { - static rotenc_t rePreviousValue; - static bool cw = false; - rotenc_t reNewValue = (ROTARY_ENCODER_NAVIGATION_VALUE / ROTARY_ENCODER_GRANULARITY); - rotenc_t scrollRE = reNewValue - rePreviousValue; - if (scrollRE) { - static uint32_t lastEvent; - rePreviousValue = reNewValue; - - bool new_cw = (scrollRE < 0) ? false : true; - if ((g_tmr10ms - lastEvent >= 10) || (cw == new_cw)) { // 100ms - - pushEvent(new_cw ? EVT_ROTARY_RIGHT : EVT_ROTARY_LEFT); - - // rotary encoder navigation speed (acceleration) detection/calculation - static uint32_t delay = 2*ROTENC_DELAY_MIDSPEED; - - if (new_cw == cw) { - // Modified moving average filter used for smoother change of speed - delay = (((g_tmr10ms - lastEvent) << 3) + delay) >> 1; - } - else { - delay = 2*ROTENC_DELAY_MIDSPEED; - } - - if (delay < ROTENC_DELAY_HIGHSPEED) - rotencSpeed = ROTENC_HIGHSPEED; - else if (delay < ROTENC_DELAY_MIDSPEED) - rotencSpeed = ROTENC_MIDSPEED; - else - rotencSpeed = ROTENC_LOWSPEED; - cw = new_cw; - lastEvent = g_tmr10ms; - } - - if (g_eeGeneral.backlightMode & e_backlight_mode_keys) { - resetBacklightTimeout(); - } - inactivity.counter = 0; - } + if (rotaryEncoderPollingCycle()) { + inactivityTimerReset(ActivitySource::Keys); } #endif @@ -343,17 +256,8 @@ void generalDefault() g_eeGeneral.internalModule = DEFAULT_INTERNAL_MODULE; #endif -#if defined(DEFAULT_POTS_CONFIG) - g_eeGeneral.potsConfig = DEFAULT_POTS_CONFIG; -#endif - -#if defined(DEFAULT_SWITCH_CONFIG) - g_eeGeneral.switchConfig = DEFAULT_SWITCH_CONFIG; -#endif - -#if defined(DEFAULT_SLIDERS_CONFIG) - g_eeGeneral.slidersConfig = DEFAULT_SLIDERS_CONFIG; -#endif + g_eeGeneral.potsConfig = adcGetDefaultPotsConfig(); + g_eeGeneral.switchConfig = switchGetDefaultConfig(); #if defined(STICK_DEAD_ZONE) g_eeGeneral.stickDeadZone = DEFAULT_STICK_DEADZONE; @@ -367,11 +271,14 @@ void generalDefault() if (BATTERY_MAX != 120) g_eeGeneral.vBatMax = BATTERY_MAX - 120; -#if defined(DEFAULT_MODE) +#if defined(SURFACE_RADIO) + g_eeGeneral.stickMode = 0; + g_eeGeneral.templateSetup = 0; +#elif defined(DEFAULT_MODE) g_eeGeneral.stickMode = DEFAULT_MODE - 1; + g_eeGeneral.templateSetup = DEFAULT_TEMPLATE_SETUP; #endif - g_eeGeneral.templateSetup = DEFAULT_TEMPLATE_SETUP; g_eeGeneral.backlightMode = e_backlight_mode_all; g_eeGeneral.lightAutoOff = 2; @@ -382,9 +289,10 @@ void generalDefault() g_eeGeneral.wavVolume = 2; g_eeGeneral.backgroundVolume = 1; - for (int i=0; i MULTIPOS_STEP_SIZE) { if (!isInputRecursive(i)) { - result = MIXSRC_FIRST_INPUT+i; + result = MIXSRC_FIRST_INPUT + i; break; } } } } - static int16_t sourcesStates[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; + static int16_t sourcesStates[MAX_ANALOG_INPUTS]; if (result == 0) { - for (uint8_t i=0; i MULTIPOS_STEP_SIZE) { - result = MIXSRC_Rud+i; + auto offset = adcGetInputOffset(ADC_INPUT_POT); + if (i >= offset) { + result = MIXSRC_FIRST_POT + i - offset; + break; + } +#if MAX_AXIS > 0 + offset = adcGetInputOffset(ADC_INPUT_AXIS); + if (i >= offset) { + result = MIXSRC_FIRST_AXIS + i - offset; + break; + } +#endif + result = MIXSRC_FIRST_STICK + inputMappingConvertMode(i); break; } } @@ -567,34 +487,6 @@ ls_telemetry_value_t maxTelemValue(source_t channel) return 30000; } -#define INAC_STICKS_SHIFT 6 -#define INAC_SWITCHES_SHIFT 8 -bool inputsMoved() -{ - uint8_t sum = 0; - for (uint8_t i=0; i> INAC_STICKS_SHIFT; - for (uint8_t i=0; i> INAC_SWITCHES_SHIFT; -#if defined(IMU) - for (uint8_t i=0; i<2; i++) - sum += getValue(MIXSRC_TILT_X+i) >> INAC_STICKS_SHIFT; -#endif - -#if defined(SPACEMOUSE) - for (uint8_t i=0; i<(MIXSRC_LAST_SPACEMOUSE - MIXSRC_FIRST_SPACEMOUSE); i++) - sum += get_spacemouse_value(i) >> INAC_STICKS_SHIFT; -#endif - - if (abs((int8_t)(sum-inactivity.sum)) > 1) { - inactivity.sum = sum; - return true; - } - else { - return false; - } -} - void checkBacklight() { static uint8_t tmr10ms ; @@ -602,11 +494,8 @@ void checkBacklight() uint8_t x = g_blinkTmr10ms; if (tmr10ms != x) { tmr10ms = x; - if (inputsMoved()) { - inactivity.counter = 0; - if (g_eeGeneral.backlightMode & e_backlight_mode_sticks) { - resetBacklightTimeout(); - } + if (inactivityCheckInputs()) { + inactivityTimerReset(ActivitySource::MainControls); } if (requiredBacklightBright == BACKLIGHT_FORCED_ON) { @@ -661,7 +550,7 @@ void doSplash() getADC(); // init ADC array - inputsMoved(); + inactivityCheckInputs(); tmr10ms_t tgtime = get_tmr10ms() + SPLASH_TIMEOUT; @@ -670,7 +559,7 @@ void doSplash() getADC(); - if (getEvent() || inputsMoved()) + if (getEvent() || inactivityCheckInputs()) return; #if defined(PWR_BUTTON_PRESS) @@ -791,9 +680,9 @@ void checkAll() uint32_t keys = readKeys(); std::string strKeys; - for (int i = 0; i < (int)TRM_BASE; i++) { + for (int i = 0; i < (int)MAX_KEYS; i++) { if (keys & (1 << i)) { - strKeys += std::string(STR_VKEYS[i]); + strKeys += std::string(keysGetLabel(EnumKeys(i))); } } @@ -844,26 +733,35 @@ bool isThrottleWarningAlertNeeded() return false; } - // throttle channel is either the stick according stick mode (already handled in evalInputs) - // or P1 to P3; - // in case an output channel is choosen as throttle source (thrTraceSrc>NUM_POTS+NUM_SLIDERS) we assume the throttle stick is the input - // no other information available at the moment, and good enough to my option (otherwise too much exceptions...) - uint8_t thrchn = ((g_model.thrTraceSrc==0) || (g_model.thrTraceSrc>NUM_POTS+NUM_SLIDERS)) ? THR_STICK : g_model.thrTraceSrc+NUM_STICKS-1; + uint8_t thr_src = throttleSource2Source(g_model.thrTraceSrc); + + // in case an output channel is choosen as throttle source + // we assume the throttle stick is the input (no computed channels yet) + if (thr_src >= MIXSRC_FIRST_CH) { + thr_src = throttleSource2Source(0); + } if (!mixerTaskRunning()) getADC(); evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job - int16_t v = calibratedAnalogs[thrchn]; - if (g_model.thrTraceSrc && g_model.throttleReversed) { // TODO : proper review of THR source definition and handling + int16_t v = getValue(thr_src); + + // TODO: this looks fishy.... + if (g_model.thrTraceSrc && g_model.throttleReversed) { v = -v; } if (g_model.enableCustomThrottleWarning) { - int16_t idleValue = (int32_t)RESX * (int32_t)g_model.customThrottleWarningPosition / (int32_t)100; + int16_t idleValue = (int32_t)RESX * + (int32_t)g_model.customThrottleWarningPosition / + (int32_t)100; return abs(v - idleValue) > THRCHK_DEADBAND; - } - else { + } else { +#if defined(SURFACE_RADIO) // surface radio, stick centered + return v > THRCHK_DEADBAND; +#else return v > THRCHK_DEADBAND - RESX; +#endif } } @@ -999,22 +897,21 @@ void alert(const char * title, const char * msg , uint8_t sound) } #if defined(GVARS) -#if NUM_TRIMS == 6 - int8_t trimGvar[NUM_TRIMS] = { -1, -1, -1, -1, -1, -1 }; -#elif NUM_TRIMS == 4 - int8_t trimGvar[NUM_TRIMS] = { -1, -1, -1, -1 }; -#elif NUM_TRIMS == 2 - int8_t trimGvar[NUM_TRIMS] = { -1, -1 }; +#if MAX_TRIMS == 6 + int8_t trimGvar[MAX_TRIMS] = { -1, -1, -1, -1, -1, -1 }; +#elif MAX_TRIMS == 4 + int8_t trimGvar[MAX_TRIMS] = { -1, -1, -1, -1 }; +#elif MAX_TRIMS == 2 + int8_t trimGvar[MAX_TRIMS] = { -1, -1 }; #endif #endif void checkTrims() { - event_t event = getEvent(true); + event_t event = getTrimEvent(); if (event && !IS_KEY_BREAK(event)) { - int8_t k = EVT_KEY_MASK(event) - TRM_BASE; - // LH_DWN LH_UP LV_DWN LV_UP RV_DWN RV_UP RH_DWN RH_UP - uint8_t idx = CONVERT_MODE_TRIMS((uint8_t)k/2); + int8_t k = EVT_KEY_MASK(event); + uint8_t idx = inputMappingConvertMode(uint8_t(k / 2)); uint8_t phase; int before; bool thro; @@ -1051,7 +948,7 @@ void checkTrims() after = 0; beepTrim = true; AUDIO_TRIM_MIDDLE(); - pauseEvents(event); + pauseTrimEvents(event); } #if defined(GVARS) @@ -1063,13 +960,13 @@ void checkTrims() after = vmin; beepTrim = false; AUDIO_TRIM_MIN(); - killEvents(event); + killTrimEvents(event); } else if (after > vmax) { after = vmax; beepTrim = false; AUDIO_TRIM_MAX(); - killEvents(event); + killTrimEvents(event); } SET_GVAR_VALUE(gvar, phase, after); @@ -1085,12 +982,12 @@ void checkTrims() if (before >= tMin && after <= tMin) { beepTrim = false; AUDIO_TRIM_MIN(); - killEvents(event); + killTrimEvents(event); } else if (before <= tMax && after >= tMax) { beepTrim = false; AUDIO_TRIM_MAX(); - killEvents(event); + killTrimEvents(event); } // If the new value is outside the limit, set it to the limit. This could have @@ -1318,7 +1215,8 @@ void instantTrim() evalInputs(e_perout_mode_notrainer); - for (uint8_t stick = 0; stick < NUM_STICKS; stick++) { + auto controls = adcGetMaxInputs(ADC_INPUT_MAIN); + for (uint8_t stick = 0; stick < controls; stick++) { if (stick != THR_STICK) { // don't instant trim the throttle stick bool addTrim = false; int16_t delta = 0; @@ -1479,7 +1377,7 @@ void moveTrimsToOffsets() // copy state of 3 primary to subtrim } // reset all trims, except throttle (if throttle trim) - for (uint8_t i=0; i -#include "debounce.h" #include "definitions.h" #include "opentx_types.h" #include "opentx_helpers.h" @@ -246,52 +245,33 @@ enum RotaryEncoderMode { #include "debug.h" -#if defined(PCBFRSKY) || defined(PCBFLYSKY) - #define SWSRC_THR SWSRC_SB2 - #define SWSRC_GEA SWSRC_SG2 - #define SWSRC_ID0 SWSRC_SA0 - #define SWSRC_ID1 SWSRC_SA1 - #define SWSRC_ID2 SWSRC_SA2 - #define IS_MOMENTARY(sw) false // TODO -#else - #define SW_DSM2_BIND SW_TRN -#endif #include "myeeprom.h" #include "curves.h" void memswap(void * a, void * b, uint8_t size); -#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBHORUS) - #define POT_CONFIG(x) ((g_eeGeneral.potsConfig >> (2*((x)-POT1)))&0x03) - #define IS_POT_MULTIPOS(x) (IS_POT(x) && POT_CONFIG(x)==POT_MULTIPOS_SWITCH) - #define IS_POT_WITHOUT_DETENT(x) (IS_POT(x) && POT_CONFIG(x)==POT_WITHOUT_DETENT) - #define IS_SLIDER_AVAILABLE(x) ((x) == SLIDER1 || (x) == SLIDER2 || (IS_SLIDER(x) && (g_eeGeneral.slidersConfig & (0x01 << ((x)-SLIDER1))))) - #define IS_POT_AVAILABLE(x) (IS_POT(x) && POT_CONFIG(x)!=POT_NONE) - #define IS_POT_SLIDER_AVAILABLE(x) (IS_POT_AVAILABLE(x) || IS_SLIDER_AVAILABLE(x)) - #define IS_MULTIPOS_CALIBRATED(cal) (cal->count>0 && cal->count> (2*((x)-POT1)))&0x03) - #define IS_POT_MULTIPOS(x) (IS_POT(x) && POT_CONFIG(x)==POT_MULTIPOS_SWITCH) - #define IS_POT_WITHOUT_DETENT(x) (IS_POT(x) && POT_CONFIG(x)==POT_WITHOUT_DETENT) - #define IS_POT_AVAILABLE(x) (IS_POT(x) && POT_CONFIG(x)!=POT_NONE) - #define IS_POT_SLIDER_AVAILABLE(x) (IS_POT_AVAILABLE(x)) - #define IS_MULTIPOS_CALIBRATED(cal) (cal->count>0 && cal->count> POT_CONFIG_POS(x)) & POT_CFG_MASK) -#if NUM_XPOTS > 0 - #define IS_SWITCH_MULTIPOS(x) (SWSRC_FIRST_MULTIPOS_SWITCH <= (x) && (x) <= SWSRC_LAST_MULTIPOS_SWITCH) -#else - #define IS_SWITCH_MULTIPOS(x) (false) -#endif +#define IS_POT_MULTIPOS(x) (POT_CONFIG(x) == POT_MULTIPOS_SWITCH) +#define IS_POT_WITHOUT_DETENT(x) (POT_CONFIG(x) == POT_WITHOUT_DETENT) +#define IS_SLIDER(x) (POT_CONFIG(x) == POT_SLIDER_WITH_DETENT) +#define IS_POT_AVAILABLE(x) (POT_CONFIG(x) != POT_NONE) +#define IS_POT_SLIDER_AVAILABLE(x) (IS_POT_AVAILABLE(x)) +#define IS_MULTIPOS_CALIBRATED(cal) (cal->count > 0 && cal->count < XPOTS_MULTIPOS_COUNT) -#define GET_LOWRES_POT_POSITION(i) (getValue(MIXSRC_FIRST_POT+(i)) >> 4) -#define SAVE_POT_POSITION(i) g_model.potsWarnPosition[i] = GET_LOWRES_POT_POSITION(i) +#define IS_SWITCH_MULTIPOS(x) \ + (SWSRC_FIRST_MULTIPOS_SWITCH <= (x) && (x) <= SWSRC_LAST_MULTIPOS_SWITCH) + +#define GET_LOWRES_POT_POSITION(i) (getValue(MIXSRC_FIRST_POT + (i)) >> 4) + +#define SAVE_POT_POSITION(i) \ + g_model.potsWarnPosition[i] = GET_LOWRES_POT_POSITION(i) + +#define ANALOG_CENTER_BEEP(x) \ + (g_model.beepANACenter & ((BeepANACenter)1 << (x))) #define PPM_CENTER 1500 @@ -342,26 +322,6 @@ struct CustomFunctionsContext { #endif #endif -extern const uint8_t bchout_ar[]; -extern const uint8_t modn12x3[]; - -//convert from mode 1 to mode stickMode -//NOTICE! => 0..3 -> 0..3 -#define RUD_STICK 0 -#define ELE_STICK 1 -#define THR_STICK 2 -#define AIL_STICK 3 -#define CONVERT_MODE(x) (((x)<=AIL_STICK) ? *(modn12x3 + 4*g_eeGeneral.stickMode + (x)) : (x) ) - -#if defined(PCBXLITE) - #define CONVERT_MODE_TRIMS(x) (((x) == RUD_STICK) ? AIL_STICK : ((x) == AIL_STICK) ? RUD_STICK : (x)) -#else - #define CONVERT_MODE_TRIMS(x) CONVERT_MODE(x) -#endif - -extern uint8_t channelOrder(uint8_t x); -extern uint8_t channelOrder(uint8_t setup, uint8_t x); - #define THRCHK_DEADBAND 16 inline bool SPLASH_NEEDED() @@ -408,10 +368,9 @@ extern uint8_t heartbeat; #include "keys.h" #include "pwr.h" -#if defined(PCBFRSKY) || defined(PCBNV14) -div_t switchInfo(int switchPosition); -extern uint8_t potsPos[NUM_XPOTS]; -#endif +// #if defined(PCBFRSKY) || defined(PCBNV14) +// extern uint8_t potsPos[NUM_XPOTS]; +// #endif bool trimDown(uint8_t idx); @@ -490,24 +449,6 @@ void per10ms(); getvalue_t getValue(mixsrc_t i, bool* valid = nullptr); -#define GETSWITCH_MIDPOS_DELAY 1 -bool getSwitch(swsrc_t swtch, uint8_t flags=0); - -void logicalSwitchesTimerTick(); -void logicalSwitchesReset(); - -void evalLogicalSwitches(bool isCurrentFlightmode=true); -void logicalSwitchesCopyState(uint8_t src, uint8_t dst); - -#if defined(PCBFRSKY) || defined(PCBFLYSKY) - void getSwitchesPosition(bool startup); -#else - #define getSwitchesPosition(...) -#endif - -extern swarnstate_t switches_states; -swsrc_t getMovedSwitch(); - int8_t getMovedSource(uint8_t min); #define GET_MOVED_SOURCE(min, max) getMovedSource(min) @@ -520,7 +461,7 @@ int8_t getMovedSource(uint8_t min); #define getTrimFlightMode(phase, idx) (phase) #if defined(GVARS) - extern int8_t trimGvar[NUM_TRIMS]; + extern int8_t trimGvar[MAX_TRIMS]; #define TRIM_REUSED(idx) trimGvar[idx] >= 0 #else #define TRIM_REUSED(idx) 0 @@ -711,7 +652,7 @@ inline bool isMixActive(uint8_t mix) enum FunctionsActive { FUNCTION_TRAINER_STICK1, - FUNCTION_TRAINER_CHANNELS = FUNCTION_TRAINER_STICK1 + NUM_STICKS, + FUNCTION_TRAINER_CHANNELS = FUNCTION_TRAINER_STICK1 + MAX_STICKS, FUNCTION_INSTANT_TRIM, FUNCTION_VARIO, #if defined(SDCARD) @@ -744,6 +685,9 @@ inline void customFunctionsReset() modelFunctionsContext.reset(); } +const char* funcGetLabel(uint8_t func); + + #include "telemetry/telemetry.h" #include "crc.h" @@ -867,9 +811,7 @@ constexpr uint8_t OPENTX_START_NO_CHECKS = 0x04; #if defined(STATUS_LEDS) #define LED_ERROR_BEGIN() ledRed() // Green is preferred "ready to use" color for these radios -#if defined(RADIO_T8) || defined(RADIO_COMMANDO8) || defined(RADIO_TLITE) || \ - defined(RADIO_TPRO) || defined(RADIO_TX12) || defined(RADIO_TX12MK2) || \ - defined(RADIO_ZORRO) || defined(RADIO_BOXER) +#if defined(MANUFACTURER_RADIOMASTER) || defined(MANUFACTURER_JUMPER) || defined(RADIO_COMMANDO8) #define LED_ERROR_END() ledGreen() #define LED_BIND() ledBlue() #else @@ -931,18 +873,20 @@ union ReusableBuffer } moduleSetup; struct { - int16_t midVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+STORAGE_NUM_MOUSE_ANALOGS]; - int16_t loVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+STORAGE_NUM_MOUSE_ANALOGS]; - int16_t hiVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+STORAGE_NUM_MOUSE_ANALOGS]; uint8_t state; -#if defined(PCBFRSKY) - struct { - uint8_t stepsCount; - int16_t steps[XPOTS_MULTIPOS_COUNT]; - uint8_t lastCount; - int16_t lastPosition; - } xpotsCalib[NUM_XPOTS]; -#endif + union { + struct { + int16_t midVal; + int16_t loVal; + int16_t hiVal; + } input; + struct { + uint8_t stepsCount; + int16_t steps[XPOTS_MULTIPOS_COUNT]; + uint8_t lastCount; + int16_t lastPosition; + } xpot; + } inputs[MAX_ANALOG_INPUTS]; } calib; #if defined(SDCARD) diff --git a/radio/src/opentx_constants.h b/radio/src/opentx_constants.h index bcb934df5..45d40b882 100644 --- a/radio/src/opentx_constants.h +++ b/radio/src/opentx_constants.h @@ -30,15 +30,11 @@ enum SwitchConfig { }; enum PotConfig { - POT_NONE, + POT_NONE=0, POT_WITH_DETENT, POT_MULTIPOS_SWITCH, - POT_WITHOUT_DETENT -}; - -enum SliderConfig { - SLIDER_NONE, - SLIDER_WITH_DETENT, + POT_WITHOUT_DETENT, + POT_SLIDER_WITH_DETENT, }; enum fsStartPositionType { diff --git a/radio/src/opentx_types.h b/radio/src/opentx_types.h index 94622cf38..352a53ad8 100644 --- a/radio/src/opentx_types.h +++ b/radio/src/opentx_types.h @@ -32,10 +32,24 @@ typedef int16_t safetych_t; typedef int16_t gvar_t; typedef uint32_t bitfield_channels_t; typedef uint16_t FlightModesType; -#if defined(PCBFRSKY) || defined(PCBNV14) typedef uint16_t source_t; + +// 2 bits per switch, max 32 switches +typedef uint64_t swconfig_t; +typedef uint64_t swarnstate_t; + +#if defined(COLORLCD) + // pot config: 4 bits per pot + typedef uint64_t potconfig_t; + + // pot warning enabled: 1 bit per pot + typedef uint16_t potwarnen_t; #else -typedef uint8_t source_t; + // pot config: 4 bits per pot + typedef uint32_t potconfig_t; + + // pot warning enabled: 1 bit per pot + typedef uint8_t potwarnen_t; #endif #endif // _OPENTX_TYPES_H_ diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index e0605bd90..e5c918e91 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -236,6 +236,11 @@ inline bool isModuleCrossfire(uint8_t idx) { return false; } + +inline bool isInternalModuleCrossfire() +{ + return false; +} #endif #if defined(GHOST) diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 86b269fbc..ad777092e 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -142,50 +142,6 @@ inline const char * SDCARD_ERROR(FRESULT result) // NOTE: 'size' must = 0 or be a valid character position within 'filename' array -- it is NOT validated const char * getBasename(const char * path); -#if defined(PCBX12S) - #define ETX_FOURCC 0x3478746F // etx for X12S -#elif defined(RADIO_T16) - #define ETX_FOURCC 0x3F78746F // etx for Jumper T16 -#elif defined(RADIO_T18) - #define ETX_FOURCC 0x4078746F // etx for Jumper T18 -#elif defined(RADIO_TX16S) - #define ETX_FOURCC 0x3878746F // etx for Radiomaster TX16S -#elif defined(PCBX10) - #define ETX_FOURCC 0x3778746F // etx for X10 -#elif defined(PCBX9E) - #define ETX_FOURCC 0x3578746F // etx for Taranis X9E -#elif defined(PCBXLITES) - #define ETX_FOURCC 0x3B78746F // etx for Taranis X-Lite S -#elif defined(PCBXLITE) - #define ETX_FOURCC 0x3978746F // etx for Taranis X-Lite -#elif defined(RADIO_T12) - #define ETX_FOURCC 0x3D78746F // etx for Jumper T12 -#elif defined(RADIO_TLITE) - #define ETX_FOURCC 0x4278746F // etx for Jumper TLite -#elif defined(RADIO_TPRO) - #define ETX_FOURCC 0x4678746F // etx for Jumper TPro -#elif defined(RADIO_LR3PRO) - #define ETX_FOURCC 0x4478746F // etx for BETAFPV LR3PRO -#elif defined(RADIO_TX12) - #define ETX_FOURCC 0x4178746F // etx for Radiomaster TX12 -#elif defined(RADIO_TX12MK2) - #define ETX_FOURCC 0x4878746F // etx for Radiomaster TX12MK2 -#elif defined(RADIO_ZORRO) - #define ETX_FOURCC 0x4778746F // otx for Radiomaster Zorro -#elif defined(RADIO_T8) - #define ETX_FOURCC 0x4378746F // etx for Radiomaster T8 -#elif defined(PCBX7) - #define ETX_FOURCC 0x3678746F // etx for Taranis X7 / X7S / X7 Express / X7S Express -#elif defined(PCBX9LITES) - #define ETX_FOURCC 0x3E78746F // etx for Taranis X9-Lite S -#elif defined(PCBX9LITE) - #define ETX_FOURCC 0x3C78746F // etx for Taranis X9-Lite -#elif defined(PCBX9D) || defined(PCBX9DP) - #define ETX_FOURCC 0x3378746F // etx for Taranis X9D -#elif defined(PCBNV14) - #define ETX_FOURCC 0x3A78746F // etx for NV14 -#endif - bool isFileAvailable(const char * filename, bool exclDir = false); unsigned int findNextFileIndex(char * filename, uint8_t size, const char * directory); diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index 67747a86e..fef343a32 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -32,7 +32,10 @@ #include "opentx.h" #include #include + #include "targets/simu/simulcd.h" +#include "hal/adc_driver.h" +#include "hal/rotary_encoder.h" #if LCD_W > 212 #define LCD_ZOOM 1 @@ -77,8 +80,8 @@ class OpenTxSim: public FXMainWindow FXImageFrame * bmf; public: - FXSlider * sliders[NUM_STICKS]; - FXKnob * knobs[NUM_POTS+NUM_SLIDERS]; + FXSlider * sliders[MAX_STICKS]; + FXKnob * knobs[MAX_POTS]; }; // Message Map @@ -126,25 +129,27 @@ OpenTxSim::OpenTxSim(FXApp* a): break; default:; } - sliders[i]->setRange(-1024, 1024); - sliders[i]->setTickDelta(7); - sliders[i]->setValue(0); + sliders[i]->setTickDelta(14); + sliders[i]->setRange(0, 4095); + sliders[i]->setValue(2047); } - for (int i = 0; i < NUM_POTS + NUM_SLIDERS; i++) { + auto max_pots = adcGetMaxInputs(ADC_INPUT_POT); + memset(knobs, 0, sizeof(knobs)); + + for (int i = 0; i < max_pots; i++) { knobs[i]= new FXKnob(hf11, nullptr, 0, KNOB_TICKS|LAYOUT_LEFT); - knobs[i]->setValue(0); + knobs[i]->setRange(0, 4095); + knobs[i]->setValue(2047); #if defined(PCBHORUS) if (i == 1) { // 6-pos switch - knobs[i]->setRange(0, 2048); - knobs[i]->setIncrement(2048 / 5); - knobs[i]->setTickDelta(2048 / 5); + knobs[i]->setIncrement(4095 / 5); + knobs[i]->setTickDelta(4095 / 5); + knobs[i]->setValue(0); continue; } #endif - - knobs[i]->setRange(-1024, 1024); } bmf = new FXImageFrame(this, bmp); @@ -173,7 +178,7 @@ OpenTxSim::~OpenTxSim() delete sliders[2]; delete sliders[3]; - for (int i = 0; i < NUM_POTS + NUM_SLIDERS; i++) { + for (int i = 0; i < MAX_POTS; i++) { delete knobs[i]; } @@ -346,8 +351,8 @@ void OpenTxSim::updateKeysAndSwitches(bool start) #if defined(PCBNV14) // no keys #elif defined(PCBHORUS) - KEY_Page_Up, KEY_PGUP, - KEY_Page_Down, KEY_PGDN, + KEY_Page_Up, KEY_PAGEUP, + KEY_Page_Down, KEY_PAGEDN, KEY_Return, KEY_ENTER, KEY_Up, KEY_UP, KEY_Down, KEY_DOWN, @@ -469,6 +474,7 @@ void OpenTxSim::updateKeysAndSwitches(bool start) #endif } +extern volatile rotenc_t rotencValue; extern volatile uint32_t rotencDt; long OpenTxSim::onTimeout(FXObject*, FXSelector, void*) @@ -480,11 +486,11 @@ long OpenTxSim::onTimeout(FXObject*, FXSelector, void*) #if defined(ROTARY_ENCODER_NAVIGATION) static bool rotencAction = false; if (getApp()->getKeyState(KEY_X) || getApp()->getKeyState(KEY_plus)) { - if (!rotencAction) ROTARY_ENCODER_NAVIGATION_VALUE += ROTARY_ENCODER_GRANULARITY; + if (!rotencAction) rotencValue += ROTARY_ENCODER_GRANULARITY; rotencAction = true; } else if (getApp()->getKeyState(KEY_W) || getApp()->getKeyState(KEY_minus)) { - if (!rotencAction) ROTARY_ENCODER_NAVIGATION_VALUE -= ROTARY_ENCODER_GRANULARITY; + if (!rotencAction) rotencValue -= ROTARY_ENCODER_GRANULARITY; rotencAction = true; } else { @@ -623,6 +629,8 @@ int main(int argc, char ** argv) // so that persistent settings are now available. application.init(argc, argv); + simuInit(); + // This creates the main window. We pass in the title to be displayed // above the window, and possibly some icons for when its iconified. // The decorations determine stuff like the borders, close buttons, @@ -643,8 +651,6 @@ int main(int argc, char ** argv) printf("Model size = %d\n", (int)sizeof(g_model)); - simuInit(); - #if defined(EEPROM) || defined(EEPROM_RLC) startEepromThread(argc >= 2 ? argv[1] : "eeprom.bin"); #endif @@ -657,23 +663,25 @@ int main(int argc, char ** argv) return application.run(); } -uint16_t anaIn(uint8_t chan) +uint16_t simu_get_analog(uint8_t idx) { - if (chan < NUM_STICKS) - return opentxSim->sliders[chan]->getValue(); - else if (chan < NUM_STICKS + NUM_POTS + NUM_SLIDERS) - return opentxSim->knobs[chan - NUM_STICKS]->getValue(); -#if defined(PCBTARANIS) - else if (chan == TX_RTC_VOLTAGE) - return 800; // 2.34V -#endif - else - return 0; -} + auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN); + if (idx < max_sticks) + return opentxSim->sliders[idx]->getValue(); -uint16_t getAnalogValue(uint8_t index) -{ - return anaIn(index); + idx -= max_sticks; + + auto max_pots = adcGetMaxInputs(ADC_INPUT_POT); + if (idx < max_pots) + return opentxSim->knobs[idx]->getValue(); + + idx -= max_pots; + + auto max_axes = adcGetMaxInputs(ADC_INPUT_AXIS); + if (idx < max_axes) return 0; + + // probably RTC_BAT + return 0; } void createBitmap(int index, uint16_t *data, int x, int y, int w, int h) diff --git a/radio/src/storage/storage_common.cpp b/radio/src/storage/storage_common.cpp index 7534877b7..755e5c41e 100644 --- a/radio/src/storage/storage_common.cpp +++ b/radio/src/storage/storage_common.cpp @@ -247,7 +247,7 @@ void storageFlushCurrentModel() } if (g_model.potsWarnMode == POTS_WARN_AUTO) { - for (int i=0; i ${YAML_GEN_OUTPUT} + COMMAND ${PYTHON_EXECUTABLE} ${YAML_GEN} ${YAML_GEN_ARGS} > ${YAML_GEN_OUTPUT} DEPENDS ${RADIO_DIRECTORY}/src/datastructs.h ${RADIO_DIRECTORY}/src/dataconstants.h ${RADIO_DIRECTORY}/src/myeeprom.h ${RADIO_DIRECTORY}/util/generate_yaml.py ) + +AddHWGenTarget(${HW_DESC_JSON} yaml_inputs yaml_inputs.inc) +set(SRC ${SRC} ${CMAKE_CURRENT_BINARY_DIR}/yaml_inputs.inc) + +# helper target for testing purposes +add_custom_target(yaml_inputs DEPENDS ${HW_DESC_JSON} yaml_inputs.inc) + diff --git a/radio/src/storage/yaml/yaml_datastructs.cpp b/radio/src/storage/yaml/yaml_datastructs.cpp index 69156241b..6a4230c13 100644 --- a/radio/src/storage/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs.cpp @@ -25,6 +25,7 @@ // Warning: this file must be kept in sync with the CMakeLists.txt // in the same directory. +#include "yaml_inputs.inc" #include "yaml_datastructs_funcs.cpp" #if defined(PCBX12S) @@ -34,33 +35,17 @@ #elif defined(PCBNV14) #include "yaml_datastructs_nv14.cpp" #elif defined(PCBX7) - #if defined(RADIO_T12) - #include "yaml_datastructs_t12.cpp" - #elif defined(RADIO_TLITE) - #include "yaml_datastructs_tlite.cpp" - #elif defined(RADIO_TX12) - #include "yaml_datastructs_tx12.cpp" - #elif defined(RADIO_TX12MK2) - #include "yaml_datastructs_tx12mk2.cpp" -#elif defined(RADIO_BOXER) - #include "yaml_datastructs_boxer.cpp" - #elif defined(RADIO_ZORRO) - #include "yaml_datastructs_zorro.cpp" - #elif defined(RADIO_T8) - #include "yaml_datastructs_t8.cpp" - #elif defined(RADIO_TPRO) + #if defined(RADIO_TPRO) #include "yaml_datastructs_tpro.cpp" - #elif defined(RADIO_LR3PRO) - #include "yaml_datastructs_lr3pro.cpp" #else - #include "yaml_datastructs_x7.cpp" + #include "yaml_datastructs_128x64.cpp" #endif #elif defined(PCBX9LITE) && !defined(PCBX9LITES) #include "yaml_datastructs_x9lite.cpp" #elif defined(PCBX9LITES) - #include "yaml_datastructs_x9lites.cpp" + #include "yaml_datastructs_128x64.cpp" #elif defined(PCBXLITE) && !defined(PCBXLITES) - #include "yaml_datastructs_xlite.cpp" + #include "yaml_datastructs_128x64.cpp" #elif defined(PCBXLITES) #include "yaml_datastructs_xlites.cpp" #elif defined(PCBX9E) diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_128x64.cpp similarity index 90% rename from radio/src/storage/yaml/yaml_datastructs_xlite.cpp rename to radio/src/storage/yaml/yaml_datastructs_128x64.cpp index 506b14fc0..a164ffa52 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_128x64.cpp @@ -72,9 +72,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_PLAY_SOUND, "PLAY_SOUND" }, { FUNC_PLAY_TRACK, "PLAY_TRACK" }, { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, { FUNC_VARIO, "VARIO" }, @@ -102,50 +100,16 @@ const struct YamlIdStr enum_MixerMultiplex[] = { }; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, { MIXSRC_TrimRud, "TrimRud" }, { MIXSRC_TrimEle, "TrimEle" }, { MIXSRC_TrimThr, "TrimThr" }, { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TrimT5, "TrimT5" }, + { MIXSRC_TrimT6, "TrimT6" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, { 0, NULL } }; const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { @@ -180,34 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, { SWSRC_ON, "ON" }, { SWSRC_ONE, "ONE" }, { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, @@ -318,24 +254,19 @@ static const struct YamlNode union_anonymous_0_elmts[] = { }; static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 6, enum_Functions), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), YAML_END }; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "manuallyEdited", 1 ), YAML_PADDING( 7 ), YAML_CUSTOM("semver",nullptr,w_semver), YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL), YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), @@ -402,14 +333,11 @@ static const struct YamlNode struct_RadioData[] = { YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_ARRAY("sticksConfig", 0, MAX_STICKS, struct_stickConfig, stick_name_valid), + YAML_ARRAY("slidersConfig", 0, MAX_POTS, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 4, 8, struct_potConfig, nullptr), + YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 144 ), - YAML_PADDING( 144 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), @@ -469,8 +397,8 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), @@ -500,10 +428,9 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "trimSource", 6 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), YAML_STRING("name", 6), YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), @@ -528,9 +455,9 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_CUSTOM("def",r_logicSw,w_logicSw), YAML_PADDING( 10 ), YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "andsw", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 1 ), - YAML_PADDING( 2 ), YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), @@ -555,10 +482,10 @@ static const struct YamlNode struct_trim_t[] = { }; static const struct YamlNode struct_FlightModeData[] = { YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_ARRAY("trim", 16, 6, struct_trim_t, NULL), YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "fadeIn", 8 ), YAML_UNSIGNED( "fadeOut", 8 ), YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), @@ -723,6 +650,11 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; static const struct YamlNode union_anonymous_14_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), @@ -865,10 +797,10 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), + YAML_PADDING( 64 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), @@ -883,8 +815,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 8, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), YAML_PADDING( 8 ), YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_boxer.cpp b/radio/src/storage/yaml/yaml_datastructs_boxer.cpp deleted file mode 100644 index fccdafaa8..000000000 --- a/radio/src/storage/yaml/yaml_datastructs_boxer.cpp +++ /dev/null @@ -1,944 +0,0 @@ -// generated by generate_yaml.py - -// -// Enums first -// - -const struct YamlIdStr enum_BacklightMode[] = { - { e_backlight_mode_off, "backlight_mode_off" }, - { e_backlight_mode_keys, "backlight_mode_keys" }, - { e_backlight_mode_sticks, "backlight_mode_sticks" }, - { e_backlight_mode_all, "backlight_mode_all" }, - { e_backlight_mode_on, "backlight_mode_on" }, - { 0, NULL } -}; -const struct YamlIdStr enum_AntennaModes[] = { - { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, - { ANTENNA_MODE_ASK, "MODE_ASK" }, - { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, - { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModuleType[] = { - { MODULE_TYPE_NONE, "TYPE_NONE" }, - { MODULE_TYPE_PPM, "TYPE_PPM" }, - { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, - { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, - { MODULE_TYPE_DSM2, "TYPE_DSM2" }, - { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, - { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, - { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, - { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, - { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, - { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, - { MODULE_TYPE_GHOST, "TYPE_GHOST" }, - { MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" }, - { MODULE_TYPE_SBUS, "TYPE_SBUS" }, - { MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" }, - { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, - { MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TrainerMultiplex[] = { - { TRAINER_OFF, "OFF" }, - { TRAINER_ADD, "ADD" }, - { TRAINER_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BeeperMode[] = { - { e_mode_quiet, "mode_quiet" }, - { e_mode_alarms, "mode_alarms" }, - { e_mode_nokeys, "mode_nokeys" }, - { e_mode_all, "mode_all" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BluetoothModes[] = { - { BLUETOOTH_OFF, "OFF" }, - { BLUETOOTH_TELEMETRY, "TELEMETRY" }, - { BLUETOOTH_TRAINER, "TRAINER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_Functions[] = { - { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, - { FUNC_TRAINER, "TRAINER" }, - { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, - { FUNC_RESET, "RESET" }, - { FUNC_SET_TIMER, "SET_TIMER" }, - { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, - { FUNC_VOLUME, "VOLUME" }, - { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, - { FUNC_RANGECHECK, "RANGECHECK" }, - { FUNC_BIND, "BIND" }, - { FUNC_PLAY_SOUND, "PLAY_SOUND" }, - { FUNC_PLAY_TRACK, "PLAY_TRACK" }, - { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, - { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, - { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, - { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, - { FUNC_VARIO, "VARIO" }, - { FUNC_HAPTIC, "HAPTIC" }, - { FUNC_LOGS, "LOGS" }, - { FUNC_BACKLIGHT, "BACKLIGHT" }, - { FUNC_SCREENSHOT, "SCREENSHOT" }, - { FUNC_RACING_MODE, "RACING_MODE" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TimerModes[] = { - { TMRMODE_OFF, "OFF" }, - { TMRMODE_ON, "ON" }, - { TMRMODE_START, "START" }, - { TMRMODE_THR, "THR" }, - { TMRMODE_THR_REL, "THR_REL" }, - { TMRMODE_THR_START, "THR_START" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixerMultiplex[] = { - { MLTPX_ADD, "ADD" }, - { MLTPX_MUL, "MUL" }, - { MLTPX_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixSources[] = { - { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, - { MIXSRC_POT3, "POT3" }, - { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, - { MIXSRC_TrimRud, "TrimRud" }, - { MIXSRC_TrimEle, "TrimEle" }, - { MIXSRC_TrimThr, "TrimThr" }, - { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SG, "SG" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, - { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, - { MIXSRC_TX_TIME, "TX_TIME" }, - { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, - { 0, NULL } -}; -const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { - { LS_FUNC_NONE, "FUNC_NONE" }, - { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, - { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, - { LS_FUNC_VPOS, "FUNC_VPOS" }, - { LS_FUNC_VNEG, "FUNC_VNEG" }, - { LS_FUNC_RANGE, "FUNC_RANGE" }, - { LS_FUNC_APOS, "FUNC_APOS" }, - { LS_FUNC_ANEG, "FUNC_ANEG" }, - { LS_FUNC_AND, "FUNC_AND" }, - { LS_FUNC_OR, "FUNC_OR" }, - { LS_FUNC_XOR, "FUNC_XOR" }, - { LS_FUNC_EDGE, "FUNC_EDGE" }, - { LS_FUNC_EQUAL, "FUNC_EQUAL" }, - { LS_FUNC_GREATER, "FUNC_GREATER" }, - { LS_FUNC_LESS, "FUNC_LESS" }, - { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, - { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, - { LS_FUNC_TIMER, "FUNC_TIMER" }, - { LS_FUNC_STICKY, "FUNC_STICKY" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwashType[] = { - { SWASH_TYPE_NONE, "TYPE_NONE" }, - { SWASH_TYPE_120, "TYPE_120" }, - { SWASH_TYPE_120X, "TYPE_120X" }, - { SWASH_TYPE_140, "TYPE_140" }, - { SWASH_TYPE_90, "TYPE_90" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwitchSources[] = { - { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, - { SWSRC_ON, "ON" }, - { SWSRC_ONE, "ONE" }, - { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, - { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, - { SWSRC_OFF, "OFF" }, - { 0, NULL } -}; -const struct YamlIdStr enum_PotsWarnMode[] = { - { POTS_WARN_OFF, "WARN_OFF" }, - { POTS_WARN_MANUAL, "WARN_MANUAL" }, - { POTS_WARN_AUTO, "WARN_AUTO" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModelOverridableEnable[] = { - { OVERRIDE_GLOBAL, "GLOBAL" }, - { OVERRIDE_OFF, "OFF" }, - { OVERRIDE_ON, "ON" }, - { 0, NULL } -}; -const struct YamlIdStr enum_FailsafeModes[] = { - { FAILSAFE_NOT_SET, "NOT_SET" }, - { FAILSAFE_HOLD, "HOLD" }, - { FAILSAFE_CUSTOM, "CUSTOM" }, - { FAILSAFE_NOPULSES, "NOPULSES" }, - { FAILSAFE_RECEIVER, "RECEIVER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorFormula[] = { - { TELEM_FORMULA_ADD, "FORMULA_ADD" }, - { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, - { TELEM_FORMULA_MIN, "FORMULA_MIN" }, - { TELEM_FORMULA_MAX, "FORMULA_MAX" }, - { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, - { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, - { TELEM_FORMULA_CELL, "FORMULA_CELL" }, - { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, - { TELEM_FORMULA_DIST, "FORMULA_DIST" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorType[] = { - { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, - { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickIfMode[] = { - { USBJOYS_JOYSTICK, "JOYSTICK" }, - { USBJOYS_GAMEPAD, "GAMEPAD" }, - { USBJOYS_MULTIAXIS, "MULTIAXIS" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickCh[] = { - { USBJOYS_CH_NONE, "CH_NONE" }, - { USBJOYS_CH_BUTTON, "CH_BUTTON" }, - { USBJOYS_CH_AXIS, "CH_AXIS" }, - { USBJOYS_CH_SIM, "CH_SIM" }, - { 0, NULL } -}; - -// -// Structs last -// - -static const struct YamlNode struct_CalibData[] = { - YAML_IDX_CUST("calib",r_calib,w_calib), - YAML_SIGNED( "mid", 16 ), - YAML_SIGNED( "spanNeg", 16 ), - YAML_SIGNED( "spanPos", 16 ), - YAML_END -}; -static const struct YamlNode struct_signed_16[] = { - YAML_IDX, - YAML_SIGNED( "val", 16 ), - YAML_END -}; -static const struct YamlNode struct_TrainerMix[] = { - YAML_IDX, - YAML_UNSIGNED( "srcChn", 6 ), - YAML_ENUM("mode", 2, enum_TrainerMultiplex), - YAML_SIGNED( "studWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_TrainerData[] = { - YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), - YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_1[] = { - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_anonymous_2[] = { - YAML_SIGNED( "val", 16 ), - YAML_UNSIGNED( "mode", 8 ), - YAML_UNSIGNED( "param", 8 ), - YAML_SIGNED( "spare", 32 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_3[] = { - YAML_SIGNED( "val1", 32 ), - YAML_SIGNED( "val2", 32 ), - YAML_END -}; -static const struct YamlNode union_anonymous_0_elmts[] = { - YAML_STRUCT("play", 48, struct_anonymous_1, NULL), - YAML_STRUCT("all", 64, struct_anonymous_2, NULL), - YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), - YAML_END -}; -static const struct YamlNode struct_CustomFunctionData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), - YAML_CUSTOM("def",r_customFn,w_customFn), - YAML_PADDING( 64 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; -static const struct YamlNode struct_RadioData[] = { - YAML_UNSIGNED( "manuallyEdited", 1 ), - YAML_PADDING( 7 ), - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 7, struct_CalibData, NULL), - YAML_PADDING( 16 ), - YAML_SIGNED( "currModel", 8 ), - YAML_UNSIGNED( "contrast", 8 ), - YAML_UNSIGNED( "vBatWarn", 8 ), - YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_ENUM("backlightMode", 3, enum_BacklightMode), - YAML_ENUM("antennaMode", 2, enum_AntennaModes), - YAML_UNSIGNED( "disableRtcWarning", 1 ), - YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), - YAML_ENUM("internalModule", 8, enum_ModuleType), - YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), - YAML_UNSIGNED( "alarmsFlash", 1 ), - YAML_UNSIGNED( "disableMemoryWarning", 1 ), - YAML_UNSIGNED( "disableAlarmWarning", 1 ), - YAML_UNSIGNED( "stickMode", 2 ), - YAML_SIGNED( "timezone", 5 ), - YAML_UNSIGNED( "adjustRTC", 1 ), - YAML_UNSIGNED( "inactivityTimer", 8 ), - YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr), - YAML_UNSIGNED( "internalModuleBaudrate", 3 ), - YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), - YAML_SIGNED( "switchesDelay", 8 ), - YAML_UNSIGNED( "lightAutoOff", 8 ), - YAML_UNSIGNED( "templateSetup", 8 ), - YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), - YAML_UNSIGNED( "gpsFormat", 1 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), - YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), - YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), - YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), - YAML_UNSIGNED( "backlightBright", 8 ), - YAML_UNSIGNED( "globalTimer", 32 ), - YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), - YAML_UNSIGNED( "countryCode", 2 ), - YAML_SIGNED( "pwrOnSpeed", 3 ), - YAML_SIGNED( "pwrOffSpeed", 3 ), - YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr), - YAML_UNSIGNED( "noJitterFilter", 1 ), - YAML_UNSIGNED( "imperial", 1 ), - YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), - YAML_UNSIGNED( "USBMode", 2 ), - YAML_UNSIGNED( "jackMode", 2 ), - YAML_PADDING( 1 ), - YAML_STRING("ttsLanguage", 2), - YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), - YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), - YAML_SIGNED( "varioRepeat", 8 ), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), - YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), - YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), - YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 192 ), - YAML_PADDING( 168 ), - YAML_PADDING( 8 ), - YAML_STRING("bluetoothName", 10), - YAML_STRING("ownerRegistrationID", 8), - YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), - YAML_UNSIGNED( "rotEncMode", 2 ), - YAML_SIGNED( "uartSampleMode", 2 ), - YAML_PADDING( 3 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "radioGFDisabled", 1 ), - YAML_UNSIGNED( "radioTrainerDisabled", 1 ), - YAML_UNSIGNED( "modelHeliDisabled", 1 ), - YAML_UNSIGNED( "modelFMDisabled", 1 ), - YAML_UNSIGNED( "modelCurvesDisabled", 1 ), - YAML_UNSIGNED( "modelGVDisabled", 1 ), - YAML_UNSIGNED( "modelLSDisabled", 1 ), - YAML_UNSIGNED( "modelSFDisabled", 1 ), - YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ), - YAML_UNSIGNED( "modelTelemetryDisabled", 1 ), - YAML_END -}; -static const struct YamlNode struct_unsigned_8[] = { - YAML_IDX, - YAML_UNSIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_ModelHeader[] = { - YAML_STRING("name", 10), - YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_TimerData[] = { - YAML_IDX, - YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), - YAML_SIGNED( "value", 22 ), - YAML_ENUM("mode", 3, enum_TimerModes), - YAML_UNSIGNED( "countdownBeep", 2 ), - YAML_UNSIGNED( "minuteBeep", 1 ), - YAML_UNSIGNED( "persistent", 2 ), - YAML_SIGNED( "countdownStart", 2 ), - YAML_UNSIGNED( "showElapsed", 1 ), - YAML_UNSIGNED( "extraHaptic", 1 ), - YAML_PADDING( 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_CurveRef[] = { - YAML_UNSIGNED( "type", 8 ), - YAML_SIGNED_CUST( "value", 8, in_read_weight, in_write_weight ), - YAML_END -}; -static const struct YamlNode struct_MixData[] = { - YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "destCh", 5 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "carryTrim", 1 ), - YAML_UNSIGNED( "mixWarn", 2 ), - YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_UNSIGNED( "delayUp", 8 ), - YAML_UNSIGNED( "delayDown", 8 ), - YAML_UNSIGNED( "speedUp", 8 ), - YAML_UNSIGNED( "speedDown", 8 ), - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_LimitData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ), - YAML_SIGNED( "ppmCenter", 10 ), - YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "symetrical", 1 ), - YAML_UNSIGNED( "revert", 1 ), - YAML_PADDING( 3 ), - YAML_SIGNED( "curve", 8 ), - YAML_STRING("name", 4), - YAML_END -}; -static const struct YamlNode struct_ExpoData[] = { - YAML_UNSIGNED( "mode", 2 ), - YAML_UNSIGNED( "scale", 14 ), - YAML_CUSTOM("carryTrim",r_carryTrim,nullptr), - YAML_SIGNED( "trimSource", 6 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_END -}; -static const struct YamlNode struct_CurveHeader[] = { - YAML_IDX, - YAML_UNSIGNED( "type", 1 ), - YAML_UNSIGNED( "smooth", 1 ), - YAML_SIGNED( "points", 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_signed_8[] = { - YAML_IDX, - YAML_SIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_LogicalSwitchData[] = { - YAML_IDX, - YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_CUSTOM("def",r_logicSw,w_logicSw), - YAML_PADDING( 10 ), - YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 1 ), - YAML_PADDING( 2 ), - YAML_PADDING( 16 ), - YAML_UNSIGNED( "delay", 8 ), - YAML_UNSIGNED( "duration", 8 ), - YAML_END -}; -static const struct YamlNode struct_SwashRingData[] = { - YAML_ENUM("type", 8, enum_SwashType), - YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "collectiveWeight", 8 ), - YAML_SIGNED( "aileronWeight", 8 ), - YAML_SIGNED( "elevatorWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_trim_t[] = { - YAML_IDX, - YAML_SIGNED( "value", 11 ), - YAML_UNSIGNED( "mode", 5 ), - YAML_END -}; -static const struct YamlNode struct_FlightModeData[] = { - YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), - YAML_UNSIGNED( "fadeIn", 8 ), - YAML_UNSIGNED( "fadeOut", 8 ), - YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), - YAML_END -}; -static const struct YamlNode struct_GVarData[] = { - YAML_IDX, - YAML_STRING("name", 3), - YAML_UNSIGNED( "min", 12 ), - YAML_UNSIGNED( "max", 12 ), - YAML_UNSIGNED( "popup", 1 ), - YAML_UNSIGNED( "prec", 1 ), - YAML_UNSIGNED( "unit", 2 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), - YAML_UNSIGNED( "centerSilent", 1 ), - YAML_SIGNED( "centerMax", 8 ), - YAML_SIGNED( "centerMin", 8 ), - YAML_SIGNED( "min", 8 ), - YAML_SIGNED( "max", 8 ), - YAML_END -}; -static const struct YamlNode struct_RssiAlarmData[] = { - YAML_CUSTOM("disabled",r_rssiDisabled,nullptr), - YAML_CUSTOM("warning",r_rssiWarning,nullptr), - YAML_CUSTOM("critical",r_rssiCritical,nullptr), - YAML_END -}; -static const struct YamlNode struct_RFAlarmData[] = { - YAML_SIGNED( "warning", 8 ), - YAML_SIGNED( "critical", 8 ), - YAML_END -}; -static const struct YamlNode struct_PpmModule[] = { - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_UNSIGNED( "outputType", 1 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_5[] = { - YAML_PADDING( 8 ), - YAML_UNSIGNED( "disableTelemetry", 1 ), - YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "autoBindMode", 1 ), - YAML_UNSIGNED( "lowPowerMode", 1 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_PADDING( 2 ), - YAML_SIGNED( "optionValue", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "power", 2 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_SIGNED( "antennaMode", 2 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_7[] = { - YAML_PADDING( 6 ), - YAML_UNSIGNED( "noninverted", 1 ), - YAML_PADDING( 1 ), - YAML_SIGNED( "refreshRate", 8 ), - YAML_END -}; -static const struct YamlNode struct_string_64[] = { - YAML_IDX, - YAML_STRING("val", 8), - YAML_END -}; -static const struct YamlNode struct_anonymous_8[] = { - YAML_UNSIGNED( "receivers", 7 ), - YAML_UNSIGNED( "racingMode", 1 ), - YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_9[] = { - YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), - YAML_UNSIGNED( "mode", 3 ), - YAML_UNSIGNED( "rfPower", 1 ), - YAML_UNSIGNED( "reserved", 4 ), - YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_10[] = { - YAML_UNSIGNED( "emi", 2 ), - YAML_UNSIGNED( "telemetry", 1 ), - YAML_UNSIGNED( "phyMode", 3 ), - YAML_UNSIGNED( "reserved", 2 ), - YAML_UNSIGNED( "rfPower", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_11[] = { - YAML_UNSIGNED( "raw12bits", 1 ), - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_12[] = { - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_13[] = { - YAML_UNSIGNED( "flags", 8 ), - YAML_END -}; -static const struct YamlNode union_anonymous_4_elmts[] = { - YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), - YAML_STRUCT("ppm", 16, struct_PpmModule, NULL), - YAML_STRUCT("multi", 24, struct_anonymous_5, NULL), - YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL), - YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL), - YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL), - YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), - YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), - YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), - YAML_END -}; -static const struct YamlNode struct_ModuleData[] = { - YAML_IDX, - YAML_ENUM("type", 8, enum_ModuleType), - YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), - YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), - YAML_PADDING( 4 ), - YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), - YAML_END -}; -static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_PADDING( 1 ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput_elmts[] = { - YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput[] = { - YAML_IDX, - YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), - YAML_END -}; -static const struct YamlNode struct_ScriptData[] = { - YAML_IDX, - YAML_STRING("file", 6), - YAML_STRING("name", 6), - YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), - YAML_END -}; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_UNSIGNED( "id", 16 ), - YAML_UNSIGNED( "persistentValue", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_16[] = { - YAML_UNSIGNED( "physID", 5 ), - YAML_UNSIGNED( "rxIndex", 3 ), - YAML_END -}; -static const struct YamlNode union_anonymous_15_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL), - YAML_UNSIGNED( "instance", 8 ), - YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), - YAML_END -}; -static const struct YamlNode struct_anonymous_18[] = { - YAML_UNSIGNED( "ratio", 16 ), - YAML_SIGNED( "offset", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_19[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_UNSIGNED( "index", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_20[] = { - YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_21[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_PADDING( 24 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_22[] = { - YAML_UNSIGNED( "gps", 8 ), - YAML_UNSIGNED( "alt", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode union_anonymous_17_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_18, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_19, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_20, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_22, NULL), - YAML_UNSIGNED( "param", 32 ), - YAML_END -}; -static const struct YamlNode struct_TelemetrySensor[] = { - YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2), - YAML_STRING("label", 4), - YAML_UNSIGNED( "subId", 8 ), - YAML_ENUM("type", 1, enum_TelemetrySensorType), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "unit", 6 ), - YAML_UNSIGNED( "prec", 2 ), - YAML_UNSIGNED( "autoOffset", 1 ), - YAML_UNSIGNED( "filter", 1 ), - YAML_UNSIGNED( "logs", 1 ), - YAML_UNSIGNED( "persistent", 1 ), - YAML_UNSIGNED( "onlyPositive", 1 ), - YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg), - YAML_END -}; -static const struct YamlNode struct_FrSkyBarData[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "barMin", 16 ), - YAML_SIGNED( "barMax", 16 ), - YAML_END -}; -static const struct YamlNode struct_LineDataSource[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode struct_FrSkyLineData[] = { - YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScriptData[] = { - YAML_STRING("file", 6), - YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), - YAML_END -}; -static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { - YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), - YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), - YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScreenData[] = { - YAML_IDX, - YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), - YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), - YAML_END -}; -static const struct YamlNode struct_USBJoystickChData[] = { - YAML_IDX, - YAML_ENUM("mode", 3, enum_USBJoystickCh), - YAML_UNSIGNED( "inversion", 1 ), - YAML_UNSIGNED( "param", 4 ), - YAML_UNSIGNED( "btn_num", 5 ), - YAML_UNSIGNED( "switch_npos", 3 ), - YAML_END -}; -static const struct YamlNode struct_ModelData[] = { - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_UNSIGNED( "telemetryProtocol", 3 ), - YAML_UNSIGNED( "thrTrim", 1 ), - YAML_UNSIGNED( "noGlobalFunctions", 1 ), - YAML_UNSIGNED( "displayTrims", 2 ), - YAML_UNSIGNED( "ignoreSensorIds", 1 ), - YAML_SIGNED( "trimInc", 3 ), - YAML_UNSIGNED( "disableThrottleWarning", 1 ), - YAML_UNSIGNED( "displayChecklist", 1 ), - YAML_UNSIGNED( "extendedLimits", 1 ), - YAML_UNSIGNED( "extendedTrims", 1 ), - YAML_UNSIGNED( "throttleReversed", 1 ), - YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ), - YAML_UNSIGNED( "disableTelemetryWarning", 1 ), - YAML_UNSIGNED( "showInstanceIds", 1 ), - YAML_PADDING( 5 ), - YAML_SIGNED( "customThrottleWarningPosition", 8 ), - YAML_UNSIGNED( "beepANACenter", 16 ), - YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), - YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), - YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), - YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), - YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), - YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), - YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), - YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), - YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), - YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL), - YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL), - YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), - YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable), - YAML_PADDING( 1 ), - YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), - YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), - YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), - YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), - YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 3, struct_signed_8, NULL), - YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_PADDING( 8 ), - YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_STRING("modelRegistrationID", 8), - YAML_UNSIGNED( "usbJoystickExtMode", 1 ), - YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode), - YAML_UNSIGNED( "usbJoystickCircularCut", 4 ), - YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL), - YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable), - YAML_END -}; -static const struct YamlNode struct_PartialModel[] = { - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_END -}; - -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29 - -static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); - -const YamlNode* get_radiodata_nodes() -{ - return &__RadioData_root_node; -} -static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); - -const YamlNode* get_modeldata_nodes() -{ - return &__ModelData_root_node; -} -static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); - -const YamlNode* get_partialmodel_nodes() -{ - return &__PartialModel_root_node; -} - diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 34f500195..dbf33647a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -24,8 +24,13 @@ #include "yaml_tree_walker.h" #include "pulses/multi.h" +#include "switches.h" +#include "analogs.h" #include "stamp.h" +#include "hal/switch_driver.h" +#include "hal/adc_driver.h" + // // WARNING: // ======== @@ -41,25 +46,6 @@ static inline void check_yaml_funcs() static_assert(offsetof(ModuleData, ppm) == 4,""); check_size(); static_assert(MAX_GVARS == 9,""); -#if defined(PCBHORUS) - static_assert(offsetof(FlightModeData, gvars) == 26,""); - check_size(); - check_size(); -#elif defined(PCBNV14) - static_assert(offsetof(FlightModeData, gvars) == 22,""); - check_size(); - check_size(); -#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) - static_assert(offsetof(FlightModeData, gvars) == 18,""); - check_size(); - check_size(); - check_size(); -#else - static_assert(offsetof(FlightModeData, gvars) == 22,""); - check_size(); - check_size(); - check_size(); -#endif } static bool w_semver(void* user, uint8_t* data, uint32_t bitoffs, @@ -120,6 +106,25 @@ bool in_write_weight(const YamlNode* node, uint32_t val, yaml_writer_func wf, return wf(opaque, s, strlen(s)); } +static int _legacy_input_idx(const char* val, uint8_t val_len) +{ + for (uint8_t i = 0; i < DIM(_legacy_inputs); i++){ + if (!strncmp(_legacy_inputs[i].legacy, val, val_len)) + return i; + } + + return -1; +} + +static int _legacy_mix_src(const char* val, uint8_t val_len) +{ + auto idx = _legacy_input_idx(val, val_len); + if (idx >= 0) + return _legacy_inputs[idx].src_raw; + + return -1; +} + extern const struct YamlIdStr enum_MixSources[]; // sources: parse/output @@ -132,6 +137,7 @@ extern const struct YamlIdStr enum_MixSources[]; // static uint32_t r_mixSrcRaw(const YamlNode* node, const char* val, uint8_t val_len) { + // TODO: parse switch name as well if (val_len > 0 && val[0] == 'I') { return yaml_str2uint(val+1, val_len-1) + MIXSRC_FIRST_INPUT; } else if (val_len > 4 && @@ -208,8 +214,40 @@ static uint32_t r_mixSrcRaw(const YamlNode* node, const char* val, uint8_t val_l // parse int and ignore closing ')' return yaml_str2uint(val, val_len) * 3 + sign + MIXSRC_FIRST_TELEM; + + } else if (val_len > 3 && + val[0] == 'C' && + val[1] == 'Y' && + val[2] == 'C' && + val[3] >= '1' && + val[3] <= '3') { + + return MIXSRC_FIRST_HELI + (val[3] - '1'); + + } else if (val_len > 1 && + val[0] == 'T' && + val[1] >= '1' && + val[1] <= '9') { + return yaml_str2uint(val + 1, val_len - 1) + MIXSRC_FIRST_TRIM - 1; } + auto idx = analogLookupCanonicalIdx(ADC_INPUT_MAIN, val, val_len); + if (idx >= 0) return idx + MIXSRC_FIRST_STICK; + + idx = analogLookupCanonicalIdx(ADC_INPUT_POT, val, val_len); + if (idx >= 0) return idx + MIXSRC_FIRST_POT; + +#if MAX_AXIS > 0 + idx = analogLookupCanonicalIdx(ADC_INPUT_AXIS, val, val_len); + if (idx >= 0) return idx + MIXSRC_FIRST_POT; +#endif + + idx = switchLookupIdx(val, val_len); + if (idx >= 0) return idx + MIXSRC_FIRST_SWITCH; + + idx = _legacy_mix_src(val, val_len); + if (idx >= 0) return idx; + return yaml_parse_enum(enum_MixSources, val, val_len); } @@ -228,8 +266,11 @@ static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, { const char* str = nullptr; - if (val >= MIXSRC_FIRST_INPUT - && val <= MIXSRC_LAST_INPUT) { + if (val == MIXSRC_NONE) { + + return wf(opaque, "NONE", 4); + + } else if (val <= MIXSRC_LAST_INPUT) { if (!wf(opaque, "I", 1)) return false; @@ -237,8 +278,7 @@ static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, str = yaml_unsigned2str(val - MIXSRC_FIRST_INPUT); } #if defined(LUA_INPUTS) - else if (val >= MIXSRC_FIRST_LUA - && val <= MIXSRC_LAST_LUA) { + else if (val <= MIXSRC_LAST_LUA) { val -= MIXSRC_FIRST_LUA; uint32_t script = val / MAX_SCRIPT_OUTPUTS; @@ -254,6 +294,31 @@ static bool w_mixSrcRaw(const YamlNode* node, uint32_t val, yaml_writer_func wf, str = closing_parenthesis; } #endif + else if (val <= MIXSRC_LAST_STICK) { + str = analogGetCanonicalName(ADC_INPUT_MAIN, val - MIXSRC_FIRST_STICK); + } + else if (val <= MIXSRC_LAST_POT) { + str = analogGetCanonicalName(ADC_INPUT_POT, val - MIXSRC_FIRST_POT); + } +#if MAX_AXIS > 0 + else if (val <= MIXSRC_LAST_AXIS) { + str = analogGetCanonicalName(ADC_INPUT_AXIS, val - MIXSRC_FIRST_AXIS); + } +#endif + else if (val >= MIXSRC_FIRST_HELI + && val <= MIXSRC_LAST_HELI) { + if (!wf(opaque, "CYC", 3)) return false; + str = yaml_unsigned2str(val - MIXSRC_FIRST_HELI + 1); + } + else if (val >= MIXSRC_FIRST_TRIM + && val <= MIXSRC_LAST_TRIM) { + if (!wf(opaque, "T", 1)) return false; + str = yaml_unsigned2str(val - MIXSRC_FIRST_TRIM + 1); + } + else if (val >= MIXSRC_FIRST_SWITCH + && val <= MIXSRC_LAST_SWITCH) { + str = switchGetCanonicalName(val - MIXSRC_FIRST_SWITCH); + } else if (val >= MIXSRC_FIRST_LOGICAL_SWITCH && val <= MIXSRC_LAST_LOGICAL_SWITCH) { @@ -517,8 +582,11 @@ static uint32_t r_calib(void* user, const char* val, uint8_t val_len) { (void)user; - uint32_t sw = yaml_parse_enum(enum_MixSources, val, val_len); - if (sw >= MIXSRC_Rud) return sw - MIXSRC_Rud; + int idx = adcGetInputIdx(val, val_len); + if (idx >= 0) return idx; + + idx = _legacy_input_idx(val, val_len); + if (idx >= 0) return idx; // detect invalid values if (val_len == 0 || (val[0] < '0') || (val[0] > '9')) { @@ -533,18 +601,102 @@ static bool w_calib(void* user, yaml_writer_func wf, void* opaque) auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(); - const char* str = - yaml_output_enum(idx + MIXSRC_Rud, enum_MixSources); + const char* str = adcGetInputName(idx); return str ? wf(opaque, str, strlen(str)) : true; } +static void _read_analog_name(uint8_t type, void* user, uint8_t* data, + uint32_t bitoffs, const char* val, + uint8_t val_len) +{ + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); + analogSetCustomLabel(type, idx, val, val_len); +} + +static bool _write_analog_name(uint8_t type, void* user, uint8_t* data, + uint32_t bitoffs, yaml_writer_func wf, void* opaque) +{ + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); + + const char* name = analogGetCustomLabel(ADC_INPUT_MAIN, idx); + if (!wf(opaque, "\"", 1)) return false; + if (!wf(opaque, name, strlen(name))) return false; + return wf(opaque, "\"", 1); +} + +static void r_stick_name(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len) +{ + _read_analog_name(ADC_INPUT_MAIN, user, data, bitoffs, val, val_len); +} + +static bool w_stick_name(void* user, uint8_t* data, uint32_t bitoffs, + yaml_writer_func wf, void* opaque) +{ + return _write_analog_name(ADC_INPUT_MAIN, user, data, bitoffs, wf, opaque); +} + +static bool stick_name_valid(void* user, uint8_t* data, uint32_t bitoffs) +{ + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(); + return analogHasCustomLabel(ADC_INPUT_MAIN, idx); +} + +static const struct YamlNode struct_stickConfig[] = { + YAML_IDX, + YAML_CUSTOM( "name", r_stick_name, w_stick_name), + YAML_END +}; + +static uint32_t slider_read(void* user, const char* val, uint8_t val_len) +{ + (void)user; + auto idx = _legacy_mix_src(val, val_len); + if (idx >= 0) return idx - MIXSRC_FIRST_POT; + + return -1; +} + +static const struct YamlIdStr enum_SliderConfig[] = { + { POT_NONE, "none" }, + { POT_SLIDER_WITH_DETENT, "with_detent" }, + { 0, NULL } +}; + +static void sl_type_read(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len) +{ + auto tw = reinterpret_cast(user); + uint16_t idx = tw->getElmts(1); + + bitoffs += POT_CFG_BITS * idx; + data += bitoffs >> 3UL; + bitoffs &= 7; + + auto cfg = yaml_parse_enum(enum_SliderConfig, val, val_len); + yaml_put_bits(data, cfg, bitoffs, POT_CFG_BITS); +} + +static void sl_name_read(void* user, uint8_t* data, uint32_t bitoffs, + const char* val, uint8_t val_len) +{ + _read_analog_name(ADC_INPUT_POT, user, data, bitoffs, val, val_len); +} + +static const struct YamlNode struct_sliderConfig[] = { + YAML_IDX_CUST( "sl", slider_read, nullptr ), + YAML_CUSTOM( "type", sl_type_read, nullptr ), + YAML_CUSTOM( "name", sl_name_read, nullptr ), + YAML_END +}; + static uint32_t sw_read(void* user, const char* val, uint8_t val_len) { (void)user; - uint32_t sw = yaml_parse_enum(enum_MixSources, val, val_len); - if (sw >= MIXSRC_FIRST_SWITCH) return sw - MIXSRC_FIRST_SWITCH; - - return -1; + return switchLookupIdx(val, val_len); } bool sw_write(void* user, yaml_writer_func wf, void* opaque) @@ -552,65 +704,18 @@ bool sw_write(void* user, yaml_writer_func wf, void* opaque) auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(); - const char* str = - yaml_output_enum(idx + MIXSRC_FIRST_SWITCH, enum_MixSources); + const char* str = switchGetCanonicalName(idx); return str ? wf(opaque, str, strlen(str)) : true; } -static void r_stick_name(void* user, uint8_t* data, uint32_t bitoffs, - const char* val, uint8_t val_len) -{ - auto tw = reinterpret_cast(user); - uint16_t idx = tw->getElmts(1); - if (idx >= NUM_STICKS) return; - - data -= offsetof(RadioData, switchConfig); - RadioData* rd = reinterpret_cast(data); - strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); -} - -static bool w_stick_name(void* user, uint8_t* data, uint32_t bitoffs, - yaml_writer_func wf, void* opaque) -{ - auto tw = reinterpret_cast(user); - uint16_t idx = tw->getElmts(1); - - data -= offsetof(RadioData, switchConfig); - RadioData* rd = reinterpret_cast(data); - if (!wf(opaque, "\"", 1)) return false; - if (!wf(opaque, rd->anaNames[idx], - strnlen(rd->anaNames[idx], LEN_ANA_NAME))) - return false; - return wf(opaque, "\"", 1); -} - -static bool stick_name_valid(void* user, uint8_t* data, uint32_t bitoffs) -{ - auto tw = reinterpret_cast(user); - uint16_t idx = tw->getElmts(); - RadioData* rd = reinterpret_cast(data); - return rd->anaNames[idx][0] != '\0'; -} - -static const struct YamlNode struct_sticksConfig[] = { - YAML_IDX, - YAML_CUSTOM( "name", r_stick_name, w_stick_name), - YAML_END -}; - static void sw_name_read(void* user, uint8_t* data, uint32_t bitoffs, const char* val, uint8_t val_len) { auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(1); - // data / bitoffs already incremented - data -= ((idx + 1) * 2) / 8; - data -= offsetof(RadioData, switchConfig); - RadioData* rd = reinterpret_cast(data); - strncpy(rd->switchNames[idx], val, - std::min(val_len, LEN_SWITCH_NAME)); + switchSetCustomName(idx, val, val_len); } static bool sw_name_write(void* user, uint8_t* data, uint32_t bitoffs, @@ -619,12 +724,8 @@ static bool sw_name_write(void* user, uint8_t* data, uint32_t bitoffs, auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(1); - // data / bitoffs already incremented - data -= ((idx + 1) * 2) / 8; - data -= offsetof(RadioData, switchConfig); - RadioData* rd = reinterpret_cast(data); - const char* str = rd->switchNames[idx]; + const char* str = switchGetCustomName(idx); if (!wf(opaque, "\"", 1)) return false; if (!wf(opaque, str, strnlen(str, LEN_SWITCH_NAME))) return false; @@ -649,8 +750,12 @@ static const struct YamlNode struct_switchConfig[] = { static uint32_t pot_read(void* user, const char* val, uint8_t val_len) { (void)user; - uint32_t pot = yaml_parse_enum(enum_MixSources, val, val_len); - if (pot >= MIXSRC_FIRST_POT) return pot - MIXSRC_FIRST_POT; + auto idx = analogLookupPhysicalIdx(ADC_INPUT_POT, val, val_len); + if (idx >= 0) return idx; + + idx = _legacy_mix_src(val, val_len); + if (idx >= MIXSRC_FIRST_POT && idx <= MIXSRC_LAST_POT) + return idx - MIXSRC_FIRST_POT; return -1; } @@ -660,42 +765,20 @@ static bool pot_write(void* user, yaml_writer_func wf, void* opaque) auto tw = reinterpret_cast(user); uint16_t idx = tw->getElmts(); - const char* str = yaml_output_enum(idx + MIXSRC_FIRST_POT, enum_MixSources); + const char* str = analogGetPhysicalName(ADC_INPUT_POT, idx); return str ? wf(opaque, str, strlen(str)) : true; } static void pot_name_read(void* user, uint8_t* data, uint32_t bitoffs, const char* val, uint8_t val_len) { - auto tw = reinterpret_cast(user); - uint16_t idx = tw->getElmts(1); - - // data / bitoffs already incremented - data -= ((idx + 1) * 2) / 8; - data -= offsetof(RadioData, potsConfig); - - RadioData* rd = reinterpret_cast(data); - idx += NUM_STICKS; - strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); + _read_analog_name(ADC_INPUT_POT, user, data, bitoffs, val, val_len); } static bool pot_name_write(void* user, uint8_t* data, uint32_t bitoffs, yaml_writer_func wf, void* opaque) { - auto tw = reinterpret_cast(user); - uint16_t idx = tw->getElmts(1); - - // data / bitoffs already incremented - data -= ((idx + 1) * 2) / 8; - data -= offsetof(RadioData, potsConfig); - - RadioData* rd = reinterpret_cast(data); - idx += NUM_STICKS; - const char* str = rd->anaNames[idx]; - if (!wf(opaque, "\"", 1)) return false; - if (!wf(opaque, str, strnlen(str, LEN_ANA_NAME))) - return false; - return wf(opaque, "\"", 1); + return _write_analog_name(ADC_INPUT_POT, user, data, bitoffs, wf, opaque); } static const struct YamlIdStr enum_PotConfig[] = { @@ -703,100 +786,17 @@ static const struct YamlIdStr enum_PotConfig[] = { { POT_WITH_DETENT, "with_detent" }, { POT_MULTIPOS_SWITCH, "multipos_switch" }, { POT_WITHOUT_DETENT, "without_detent" }, + { POT_SLIDER_WITH_DETENT, "slider" }, { 0, NULL } }; static const struct YamlNode struct_potConfig[] = { YAML_IDX_CUST( "pot", pot_read, pot_write ), - YAML_ENUM( "type", 2, enum_PotConfig), + YAML_ENUM( "type", POT_CFG_BITS, enum_PotConfig), YAML_CUSTOM( "name", pot_name_read, pot_name_write), YAML_END }; -static uint32_t slider_read(void* user, const char* val, uint8_t val_len) -{ - (void)user; - uint32_t sl = yaml_parse_enum(enum_MixSources, val, val_len); - if (sl >= MIXSRC_FIRST_SLIDER) return sl - MIXSRC_FIRST_SLIDER; - - return -1; -} - -static bool slider_write(void* user, yaml_writer_func wf, void* opaque) -{ - auto tw = reinterpret_cast(user); - uint16_t idx = tw->getElmts(); - - const char* str = - yaml_output_enum(idx + MIXSRC_FIRST_SLIDER, enum_MixSources); - return str ? wf(opaque, str, strlen(str)) : true; -} - -static void sl_name_read(void* user, uint8_t* data, uint32_t bitoffs, - const char* val, uint8_t val_len) -{ - auto tw = reinterpret_cast(user); - uint16_t idx = tw->getElmts(1); - - // data / bitoffs already incremented -#if defined(PCBTARANIS) - // Please note: - // slidersConfig is defined as a bit-field member, - // so let's take the next field and subtract 1 - // - data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; - data -= offsetof(RadioData, potsConfig) - 1; -#else - data -= (idx + 1) / 8; - data -= offsetof(RadioData, slidersConfig); -#endif - - RadioData* rd = reinterpret_cast(data); - idx += NUM_STICKS + STORAGE_NUM_POTS; - strncpy(rd->anaNames[idx], val, std::min(val_len, LEN_ANA_NAME)); -} - -static bool sl_name_write(void* user, uint8_t* data, uint32_t bitoffs, - yaml_writer_func wf, void* opaque) -{ - auto tw = reinterpret_cast(user); - uint16_t idx = tw->getElmts(1); - - // data / bitoffs already incremented -#if defined(PCBTARANIS) - // Please note: - // slidersConfig is defined as a bit-field member, - // so let's take the next field and subtract 1 - // - data -= (idx + 4 /* bitsize previous field (auxSerialMode) */ + 1) / 8; - data -= offsetof(RadioData, potsConfig) - 1; -#else - data -= (idx + 1) / 8; - data -= offsetof(RadioData, slidersConfig); -#endif - - RadioData* rd = reinterpret_cast(data); - idx += NUM_STICKS + STORAGE_NUM_POTS; - const char* str = rd->anaNames[idx]; - if (!wf(opaque, "\"", 1)) return false; - if (!wf(opaque, str, strnlen(str, LEN_ANA_NAME))) - return false; - return wf(opaque, "\"", 1); -} - -static const struct YamlIdStr enum_SliderConfig[] = { - { SLIDER_NONE, "none" }, - { SLIDER_WITH_DETENT, "with_detent" }, - { 0, NULL } -}; - -static const struct YamlNode struct_sliderConfig[] = { - YAML_IDX_CUST( "sl", slider_read, slider_write ), - YAML_ENUM( "type", 1, enum_SliderConfig), - YAML_CUSTOM( "name", sl_name_read, sl_name_write), - YAML_END -}; - extern const struct YamlIdStr enum_SwitchSources[]; static uint32_t r_swtchSrc(const YamlNode* node, const char* val, uint8_t val_len) @@ -809,23 +809,46 @@ static uint32_t r_swtchSrc(const YamlNode* node, const char* val, uint8_t val_le val_len--; } - if (val_len >= 2 - && val[0] == 'L' - && (val[1] >= '0' && val[1] <= '9')) { + if (val_len > 3 && val[0] == 'S' && val[1] >= 'W' + && val[2] >= '0' && val[2] <= '9' + && val[3] >= '0' && val[2] <= '2') { - ival = SWSRC_FIRST_LOGICAL_SWITCH + yaml_str2int(val+1, val_len-1) - 1; + ival = switchLookupIdx(val, val_len - 1) * 3; + ival += yaml_str2int(val + 3, val_len - 2); + ival += SWSRC_FIRST_SWITCH; + + } else if (val_len > 2 && val[0] == 'S' + && val[1] >= 'A' && val[1] <= 'Z' + && val[2] >= '0' && val[2] <= '2') { + + ival = switchLookupIdx(val, val_len - 1) * 3; + ival += yaml_str2int(val + 2, val_len - 2); + ival += SWSRC_FIRST_SWITCH; + } -#if NUM_XPOTS > 0 else if (val_len > 3 && val[0] == '6' && val[1] == 'P' && (val[2] >= '0' && val[2] <= '9') && (val[3] >= '0' && val[3] < (XPOTS_MULTIPOS_COUNT + '0'))) { - ival = (val[2] - '0') * XPOTS_MULTIPOS_COUNT + (val[3] - '0') - + SWSRC_FIRST_MULTIPOS_SWITCH; + ival = (val[2] - '0') * XPOTS_MULTIPOS_COUNT + (val[3] - '0') + + SWSRC_FIRST_MULTIPOS_SWITCH; + } + else if (val_len > 3 + && val[0] == 'T' && val[1] == 'R' + && val[2] >= '1' && val[2] <= '9') { + + ival = SWSRC_FIRST_TRIM + yaml_str2int(val + 2, val_len - 3) * 2; + if (val[val_len - 1] == '+') ival++; + + } + else if (val_len >= 2 + && val[0] == 'L' + && (val[1] >= '0' && val[1] <= '9')) { + + ival = SWSRC_FIRST_LOGICAL_SWITCH + yaml_str2int(val+1, val_len-1) - 1; } -#endif else if (val_len == 3 && val[0] == 'F' && val[1] == 'M' @@ -856,46 +879,60 @@ static bool w_swtchSrc_unquoted(const YamlNode* node, uint32_t val, } const char* str = NULL; - if (sval >= SWSRC_FIRST_LOGICAL_SWITCH - && sval <= SWSRC_LAST_LOGICAL_SWITCH) { - wf(opaque, "L", 1); - str = yaml_unsigned2str(sval - SWSRC_FIRST_LOGICAL_SWITCH + 1); - return wf(opaque,str, strlen(str)); - } -#if NUM_XPOTS > 0 - else if (sval >= SWSRC_FIRST_MULTIPOS_SWITCH - && sval <= SWSRC_LAST_MULTIPOS_SWITCH) { - - wf(opaque, "6P", 2); - - // pot #: start with 6P1 - sval -= SWSRC_FIRST_MULTIPOS_SWITCH; - str = yaml_unsigned2str(sval / XPOTS_MULTIPOS_COUNT); - wf(opaque,str, strlen(str)); - - // position - str = yaml_unsigned2str(sval % XPOTS_MULTIPOS_COUNT); - return wf(opaque,str, strlen(str)); - } -#endif - else if (sval >= SWSRC_FIRST_FLIGHT_MODE - && sval <= SWSRC_LAST_FLIGHT_MODE) { - - wf(opaque, "FM", 2); - str = yaml_unsigned2str(sval - SWSRC_FIRST_FLIGHT_MODE); - return wf(opaque,str, strlen(str)); - } - else if (sval >= SWSRC_FIRST_SENSOR - && sval <= SWSRC_LAST_SENSOR) { - - wf(opaque, "T", 1); - str = yaml_unsigned2str(sval - SWSRC_FIRST_SENSOR + 1); - return wf(opaque,str, strlen(str)); - } - str = yaml_output_enum(sval, enum_SwitchSources); - return wf(opaque, str, strlen(str)); + if (str) return wf(opaque, str, strlen(str)); + + if (sval <= SWSRC_LAST_SWITCH) { + + auto sw_info = switchInfo(sval); + str = switchGetCanonicalName(sw_info.quot); + if (!str) return true; + wf(opaque, str, strlen(str)); + str = yaml_unsigned2str(sw_info.rem); + return wf(opaque, str, strlen(str)); + + } else if (sval <= SWSRC_LAST_MULTIPOS_SWITCH) { + + wf(opaque, "6P", 2); + + // pot #: start with 6P1 + sval -= SWSRC_FIRST_MULTIPOS_SWITCH; + str = yaml_unsigned2str(sval / XPOTS_MULTIPOS_COUNT); + wf(opaque,str, strlen(str)); + + // position + str = yaml_unsigned2str(sval % XPOTS_MULTIPOS_COUNT); + return wf(opaque,str, strlen(str)); + + } else if (sval <= SWSRC_LAST_TRIM) { + + wf(opaque, "TR", 2); + auto trim = (sval - SWSRC_FIRST_TRIM) / 2; + str = yaml_unsigned2str(trim + 1); + wf(opaque, str, strlen(str)); + return wf(opaque, sval & 1 ? "+" : "-", 1); + + } else if (sval <= SWSRC_LAST_LOGICAL_SWITCH) { + + wf(opaque, "L", 1); + str = yaml_unsigned2str(sval - SWSRC_FIRST_LOGICAL_SWITCH + 1); + return wf(opaque,str, strlen(str)); + } + else if (sval <= SWSRC_LAST_FLIGHT_MODE) { + + wf(opaque, "FM", 2); + str = yaml_unsigned2str(sval - SWSRC_FIRST_FLIGHT_MODE); + return wf(opaque,str, strlen(str)); + } + else if (sval <= SWSRC_LAST_SENSOR) { + + wf(opaque, "T", 1); + str = yaml_unsigned2str(sval - SWSRC_FIRST_SENSOR + 1); + return wf(opaque,str, strlen(str)); + } + + return true; // ignore error } bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* opaque) @@ -904,6 +941,7 @@ bool w_swtchSrc(const YamlNode* node, uint32_t val, yaml_writer_func wf, void* o || !w_swtchSrc_unquoted(node, val, wf, opaque) || !wf(opaque,"\"",1)) return false; + return true; } @@ -935,8 +973,8 @@ static bool fmd_is_active(void* user, uint8_t* data, uint32_t bitoffs) data += bitoffs >> 3UL; FlightModeData* fmd = (FlightModeData*)(data); - for (uint8_t i=0; igvars[i] != GVAR_MAX+1; // FM0 -> default + for (uint8_t i = 0; i < MAX_GVARS; i++) { + is_active |= fmd->gvars[i] != GVAR_MAX + 1; // FM0 -> default } return is_active; @@ -965,7 +1003,7 @@ static void r_swtchWarn(void* user, uint8_t* data, uint32_t bitoffs, swarnstate_t swtchWarn = 0; while (val_len--) { - signed swtch = getRawSwitchIdx(*(val++)); + signed swtch = switchLookupIdx(*(val++)); if (swtch < 0) break; swarnstate_t state = 0; @@ -999,7 +1037,7 @@ static bool w_swtchWarn(void* user, uint8_t* data, uint32_t bitoffs, swarnstate_t states; memcpy(&states, data, sizeof(states)); - for (int i = 0; i < NUM_SWITCHES; i++) { + for (uint8_t i = 0; i < switchGetMaxSwitches(); i++) { // TODO: SWITCH_EXISTS() uses the g_eeGeneral stucture, which might not be // avail if (SWITCH_EXISTS(i)) { @@ -1011,7 +1049,7 @@ static bool w_swtchWarn(void* user, uint8_t* data, uint32_t bitoffs, // state == 1 -> UP // state == 2 -> MIDDLE // state == 3 -> DOWN - char swtchWarn[2] = {getRawSwitchFromIdx(i), 0}; + char swtchWarn[2] = {switchGetLetter(i), 0}; switch (state) { case 0: @@ -1031,7 +1069,7 @@ static bool w_swtchWarn(void* user, uint8_t* data, uint32_t bitoffs, break; } - if (swtchWarn[1] != 0) { + if (swtchWarn[0] >= 'A' && swtchWarn[1] != 0) { if (!wf(opaque, swtchWarn, 2)) { return false; } @@ -1303,11 +1341,11 @@ static void r_customFn(void* user, uint8_t* data, uint32_t bitoffs, && val[2] == 'a' && val[3] == 'n' && val[4] == 's') { - CFN_CH_INDEX(cfn) = NUM_STICKS + 1; + CFN_CH_INDEX(cfn) = MAX_STICKS + 1; } else { - uint32_t stick = yaml_parse_enum(enum_MixSources, val, l_sep); - if (stick >= MIXSRC_FIRST_STICK && stick <= MIXSRC_LAST_STICK) { - CFN_CH_INDEX(cfn) = stick - MIXSRC_FIRST_STICK + 1; + auto stick = analogLookupCanonicalIdx(ADC_INPUT_MAIN, val, val_len); + if (stick >= 0) { + CFN_CH_INDEX(cfn) = stick + 1; } } break; @@ -1526,12 +1564,12 @@ static bool w_customFn(void* user, uint8_t* data, uint32_t bitoffs, case 0: if (!wf(opaque, "sticks", 6)) return false; break; - case NUM_STICKS + 1: + case MAX_STICKS + 1: if (!wf(opaque, "chans", 5)) return false; break; default: - if (value > 0 && value < NUM_STICKS + 1) { - str = yaml_output_enum(value - 1 + MIXSRC_FIRST_STICK, enum_MixSources); + if (value > 0 && value <= MAX_STICKS) { + str = analogGetCanonicalName(ADC_INPUT_MAIN, value - 1); if (str && !wf(opaque, str, strlen(str))) return false; } } diff --git a/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp b/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp deleted file mode 100644 index 64acd6958..000000000 --- a/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp +++ /dev/null @@ -1,943 +0,0 @@ -// generated by generate_yaml.py - -// -// Enums first -// - -const struct YamlIdStr enum_BacklightMode[] = { - { e_backlight_mode_off, "backlight_mode_off" }, - { e_backlight_mode_keys, "backlight_mode_keys" }, - { e_backlight_mode_sticks, "backlight_mode_sticks" }, - { e_backlight_mode_all, "backlight_mode_all" }, - { e_backlight_mode_on, "backlight_mode_on" }, - { 0, NULL } -}; -const struct YamlIdStr enum_AntennaModes[] = { - { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, - { ANTENNA_MODE_ASK, "MODE_ASK" }, - { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, - { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModuleType[] = { - { MODULE_TYPE_NONE, "TYPE_NONE" }, - { MODULE_TYPE_PPM, "TYPE_PPM" }, - { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, - { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, - { MODULE_TYPE_DSM2, "TYPE_DSM2" }, - { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, - { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, - { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, - { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, - { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, - { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, - { MODULE_TYPE_GHOST, "TYPE_GHOST" }, - { MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" }, - { MODULE_TYPE_SBUS, "TYPE_SBUS" }, - { MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" }, - { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, - { MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TrainerMultiplex[] = { - { TRAINER_OFF, "OFF" }, - { TRAINER_ADD, "ADD" }, - { TRAINER_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BeeperMode[] = { - { e_mode_quiet, "mode_quiet" }, - { e_mode_alarms, "mode_alarms" }, - { e_mode_nokeys, "mode_nokeys" }, - { e_mode_all, "mode_all" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BluetoothModes[] = { - { BLUETOOTH_OFF, "OFF" }, - { BLUETOOTH_TELEMETRY, "TELEMETRY" }, - { BLUETOOTH_TRAINER, "TRAINER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_Functions[] = { - { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, - { FUNC_TRAINER, "TRAINER" }, - { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, - { FUNC_RESET, "RESET" }, - { FUNC_SET_TIMER, "SET_TIMER" }, - { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, - { FUNC_VOLUME, "VOLUME" }, - { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, - { FUNC_RANGECHECK, "RANGECHECK" }, - { FUNC_BIND, "BIND" }, - { FUNC_PLAY_SOUND, "PLAY_SOUND" }, - { FUNC_PLAY_TRACK, "PLAY_TRACK" }, - { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, - { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, - { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, - { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, - { FUNC_VARIO, "VARIO" }, - { FUNC_HAPTIC, "HAPTIC" }, - { FUNC_LOGS, "LOGS" }, - { FUNC_BACKLIGHT, "BACKLIGHT" }, - { FUNC_SCREENSHOT, "SCREENSHOT" }, - { FUNC_RACING_MODE, "RACING_MODE" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TimerModes[] = { - { TMRMODE_OFF, "OFF" }, - { TMRMODE_ON, "ON" }, - { TMRMODE_START, "START" }, - { TMRMODE_THR, "THR" }, - { TMRMODE_THR_REL, "THR_REL" }, - { TMRMODE_THR_START, "THR_START" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixerMultiplex[] = { - { MLTPX_ADD, "ADD" }, - { MLTPX_MUL, "MUL" }, - { MLTPX_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixSources[] = { - { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, - { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, - { MIXSRC_TrimRud, "TrimRud" }, - { MIXSRC_TrimEle, "TrimEle" }, - { MIXSRC_TrimThr, "TrimThr" }, - { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SI, "SI" }, - { MIXSRC_SJ, "SJ" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, - { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, - { MIXSRC_TX_TIME, "TX_TIME" }, - { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, - { 0, NULL } -}; -const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { - { LS_FUNC_NONE, "FUNC_NONE" }, - { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, - { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, - { LS_FUNC_VPOS, "FUNC_VPOS" }, - { LS_FUNC_VNEG, "FUNC_VNEG" }, - { LS_FUNC_RANGE, "FUNC_RANGE" }, - { LS_FUNC_APOS, "FUNC_APOS" }, - { LS_FUNC_ANEG, "FUNC_ANEG" }, - { LS_FUNC_AND, "FUNC_AND" }, - { LS_FUNC_OR, "FUNC_OR" }, - { LS_FUNC_XOR, "FUNC_XOR" }, - { LS_FUNC_EDGE, "FUNC_EDGE" }, - { LS_FUNC_EQUAL, "FUNC_EQUAL" }, - { LS_FUNC_GREATER, "FUNC_GREATER" }, - { LS_FUNC_LESS, "FUNC_LESS" }, - { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, - { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, - { LS_FUNC_TIMER, "FUNC_TIMER" }, - { LS_FUNC_STICKY, "FUNC_STICKY" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwashType[] = { - { SWASH_TYPE_NONE, "TYPE_NONE" }, - { SWASH_TYPE_120, "TYPE_120" }, - { SWASH_TYPE_120X, "TYPE_120X" }, - { SWASH_TYPE_140, "TYPE_140" }, - { SWASH_TYPE_90, "TYPE_90" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwitchSources[] = { - { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, - { SWSRC_ON, "ON" }, - { SWSRC_ONE, "ONE" }, - { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, - { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, - { SWSRC_OFF, "OFF" }, - { 0, NULL } -}; -const struct YamlIdStr enum_PotsWarnMode[] = { - { POTS_WARN_OFF, "WARN_OFF" }, - { POTS_WARN_MANUAL, "WARN_MANUAL" }, - { POTS_WARN_AUTO, "WARN_AUTO" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModelOverridableEnable[] = { - { OVERRIDE_GLOBAL, "GLOBAL" }, - { OVERRIDE_OFF, "OFF" }, - { OVERRIDE_ON, "ON" }, - { 0, NULL } -}; -const struct YamlIdStr enum_FailsafeModes[] = { - { FAILSAFE_NOT_SET, "NOT_SET" }, - { FAILSAFE_HOLD, "HOLD" }, - { FAILSAFE_CUSTOM, "CUSTOM" }, - { FAILSAFE_NOPULSES, "NOPULSES" }, - { FAILSAFE_RECEIVER, "RECEIVER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorFormula[] = { - { TELEM_FORMULA_ADD, "FORMULA_ADD" }, - { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, - { TELEM_FORMULA_MIN, "FORMULA_MIN" }, - { TELEM_FORMULA_MAX, "FORMULA_MAX" }, - { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, - { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, - { TELEM_FORMULA_CELL, "FORMULA_CELL" }, - { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, - { TELEM_FORMULA_DIST, "FORMULA_DIST" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorType[] = { - { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, - { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickIfMode[] = { - { USBJOYS_JOYSTICK, "JOYSTICK" }, - { USBJOYS_GAMEPAD, "GAMEPAD" }, - { USBJOYS_MULTIAXIS, "MULTIAXIS" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickCh[] = { - { USBJOYS_CH_NONE, "CH_NONE" }, - { USBJOYS_CH_BUTTON, "CH_BUTTON" }, - { USBJOYS_CH_AXIS, "CH_AXIS" }, - { USBJOYS_CH_SIM, "CH_SIM" }, - { 0, NULL } -}; - -// -// Structs last -// - -static const struct YamlNode struct_CalibData[] = { - YAML_IDX_CUST("calib",r_calib,w_calib), - YAML_SIGNED( "mid", 16 ), - YAML_SIGNED( "spanNeg", 16 ), - YAML_SIGNED( "spanPos", 16 ), - YAML_END -}; -static const struct YamlNode struct_signed_16[] = { - YAML_IDX, - YAML_SIGNED( "val", 16 ), - YAML_END -}; -static const struct YamlNode struct_TrainerMix[] = { - YAML_IDX, - YAML_UNSIGNED( "srcChn", 6 ), - YAML_ENUM("mode", 2, enum_TrainerMultiplex), - YAML_SIGNED( "studWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_TrainerData[] = { - YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), - YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_1[] = { - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_anonymous_2[] = { - YAML_SIGNED( "val", 16 ), - YAML_UNSIGNED( "mode", 8 ), - YAML_UNSIGNED( "param", 8 ), - YAML_SIGNED( "spare", 32 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_3[] = { - YAML_SIGNED( "val1", 32 ), - YAML_SIGNED( "val2", 32 ), - YAML_END -}; -static const struct YamlNode union_anonymous_0_elmts[] = { - YAML_STRUCT("play", 48, struct_anonymous_1, NULL), - YAML_STRUCT("all", 64, struct_anonymous_2, NULL), - YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), - YAML_END -}; -static const struct YamlNode struct_CustomFunctionData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), - YAML_CUSTOM("def",r_customFn,w_customFn), - YAML_PADDING( 64 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; -static const struct YamlNode struct_RadioData[] = { - YAML_UNSIGNED( "manuallyEdited", 1 ), - YAML_PADDING( 7 ), - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_PADDING( 16 ), - YAML_SIGNED( "currModel", 8 ), - YAML_UNSIGNED( "contrast", 8 ), - YAML_UNSIGNED( "vBatWarn", 8 ), - YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_ENUM("backlightMode", 3, enum_BacklightMode), - YAML_ENUM("antennaMode", 2, enum_AntennaModes), - YAML_UNSIGNED( "disableRtcWarning", 1 ), - YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), - YAML_ENUM("internalModule", 8, enum_ModuleType), - YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), - YAML_UNSIGNED( "alarmsFlash", 1 ), - YAML_UNSIGNED( "disableMemoryWarning", 1 ), - YAML_UNSIGNED( "disableAlarmWarning", 1 ), - YAML_UNSIGNED( "stickMode", 2 ), - YAML_SIGNED( "timezone", 5 ), - YAML_UNSIGNED( "adjustRTC", 1 ), - YAML_UNSIGNED( "inactivityTimer", 8 ), - YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr), - YAML_UNSIGNED( "internalModuleBaudrate", 3 ), - YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), - YAML_SIGNED( "switchesDelay", 8 ), - YAML_UNSIGNED( "lightAutoOff", 8 ), - YAML_UNSIGNED( "templateSetup", 8 ), - YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), - YAML_UNSIGNED( "gpsFormat", 1 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), - YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), - YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), - YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), - YAML_UNSIGNED( "backlightBright", 8 ), - YAML_UNSIGNED( "globalTimer", 32 ), - YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), - YAML_UNSIGNED( "countryCode", 2 ), - YAML_SIGNED( "pwrOnSpeed", 3 ), - YAML_SIGNED( "pwrOffSpeed", 3 ), - YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr), - YAML_UNSIGNED( "noJitterFilter", 1 ), - YAML_UNSIGNED( "imperial", 1 ), - YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), - YAML_UNSIGNED( "USBMode", 2 ), - YAML_UNSIGNED( "jackMode", 2 ), - YAML_PADDING( 1 ), - YAML_STRING("ttsLanguage", 2), - YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), - YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), - YAML_SIGNED( "varioRepeat", 8 ), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), - YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), - YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), - YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 192 ), - YAML_PADDING( 144 ), - YAML_PADDING( 8 ), - YAML_STRING("bluetoothName", 10), - YAML_STRING("ownerRegistrationID", 8), - YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), - YAML_UNSIGNED( "rotEncMode", 2 ), - YAML_SIGNED( "uartSampleMode", 2 ), - YAML_PADDING( 3 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "radioGFDisabled", 1 ), - YAML_UNSIGNED( "radioTrainerDisabled", 1 ), - YAML_UNSIGNED( "modelHeliDisabled", 1 ), - YAML_UNSIGNED( "modelFMDisabled", 1 ), - YAML_UNSIGNED( "modelCurvesDisabled", 1 ), - YAML_UNSIGNED( "modelGVDisabled", 1 ), - YAML_UNSIGNED( "modelLSDisabled", 1 ), - YAML_UNSIGNED( "modelSFDisabled", 1 ), - YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ), - YAML_UNSIGNED( "modelTelemetryDisabled", 1 ), - YAML_END -}; -static const struct YamlNode struct_unsigned_8[] = { - YAML_IDX, - YAML_UNSIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_ModelHeader[] = { - YAML_STRING("name", 10), - YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_TimerData[] = { - YAML_IDX, - YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), - YAML_SIGNED( "value", 22 ), - YAML_ENUM("mode", 3, enum_TimerModes), - YAML_UNSIGNED( "countdownBeep", 2 ), - YAML_UNSIGNED( "minuteBeep", 1 ), - YAML_UNSIGNED( "persistent", 2 ), - YAML_SIGNED( "countdownStart", 2 ), - YAML_UNSIGNED( "showElapsed", 1 ), - YAML_UNSIGNED( "extraHaptic", 1 ), - YAML_PADDING( 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_CurveRef[] = { - YAML_UNSIGNED( "type", 8 ), - YAML_SIGNED_CUST( "value", 8, in_read_weight, in_write_weight ), - YAML_END -}; -static const struct YamlNode struct_MixData[] = { - YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "destCh", 5 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "carryTrim", 1 ), - YAML_UNSIGNED( "mixWarn", 2 ), - YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_UNSIGNED( "delayUp", 8 ), - YAML_UNSIGNED( "delayDown", 8 ), - YAML_UNSIGNED( "speedUp", 8 ), - YAML_UNSIGNED( "speedDown", 8 ), - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_LimitData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ), - YAML_SIGNED( "ppmCenter", 10 ), - YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "symetrical", 1 ), - YAML_UNSIGNED( "revert", 1 ), - YAML_PADDING( 3 ), - YAML_SIGNED( "curve", 8 ), - YAML_STRING("name", 4), - YAML_END -}; -static const struct YamlNode struct_ExpoData[] = { - YAML_UNSIGNED( "mode", 2 ), - YAML_UNSIGNED( "scale", 14 ), - YAML_CUSTOM("carryTrim",r_carryTrim,nullptr), - YAML_SIGNED( "trimSource", 6 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_END -}; -static const struct YamlNode struct_CurveHeader[] = { - YAML_IDX, - YAML_UNSIGNED( "type", 1 ), - YAML_UNSIGNED( "smooth", 1 ), - YAML_SIGNED( "points", 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_signed_8[] = { - YAML_IDX, - YAML_SIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_LogicalSwitchData[] = { - YAML_IDX, - YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_CUSTOM("def",r_logicSw,w_logicSw), - YAML_PADDING( 10 ), - YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 1 ), - YAML_PADDING( 2 ), - YAML_PADDING( 16 ), - YAML_UNSIGNED( "delay", 8 ), - YAML_UNSIGNED( "duration", 8 ), - YAML_END -}; -static const struct YamlNode struct_SwashRingData[] = { - YAML_ENUM("type", 8, enum_SwashType), - YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "collectiveWeight", 8 ), - YAML_SIGNED( "aileronWeight", 8 ), - YAML_SIGNED( "elevatorWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_trim_t[] = { - YAML_IDX, - YAML_SIGNED( "value", 11 ), - YAML_UNSIGNED( "mode", 5 ), - YAML_END -}; -static const struct YamlNode struct_FlightModeData[] = { - YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), - YAML_UNSIGNED( "fadeIn", 8 ), - YAML_UNSIGNED( "fadeOut", 8 ), - YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), - YAML_END -}; -static const struct YamlNode struct_GVarData[] = { - YAML_IDX, - YAML_STRING("name", 3), - YAML_UNSIGNED( "min", 12 ), - YAML_UNSIGNED( "max", 12 ), - YAML_UNSIGNED( "popup", 1 ), - YAML_UNSIGNED( "prec", 1 ), - YAML_UNSIGNED( "unit", 2 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), - YAML_UNSIGNED( "centerSilent", 1 ), - YAML_SIGNED( "centerMax", 8 ), - YAML_SIGNED( "centerMin", 8 ), - YAML_SIGNED( "min", 8 ), - YAML_SIGNED( "max", 8 ), - YAML_END -}; -static const struct YamlNode struct_RssiAlarmData[] = { - YAML_CUSTOM("disabled",r_rssiDisabled,nullptr), - YAML_CUSTOM("warning",r_rssiWarning,nullptr), - YAML_CUSTOM("critical",r_rssiCritical,nullptr), - YAML_END -}; -static const struct YamlNode struct_RFAlarmData[] = { - YAML_SIGNED( "warning", 8 ), - YAML_SIGNED( "critical", 8 ), - YAML_END -}; -static const struct YamlNode struct_PpmModule[] = { - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_UNSIGNED( "outputType", 1 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_5[] = { - YAML_PADDING( 8 ), - YAML_UNSIGNED( "disableTelemetry", 1 ), - YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "autoBindMode", 1 ), - YAML_UNSIGNED( "lowPowerMode", 1 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_PADDING( 2 ), - YAML_SIGNED( "optionValue", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "power", 2 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_SIGNED( "antennaMode", 2 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_7[] = { - YAML_PADDING( 6 ), - YAML_UNSIGNED( "noninverted", 1 ), - YAML_PADDING( 1 ), - YAML_SIGNED( "refreshRate", 8 ), - YAML_END -}; -static const struct YamlNode struct_string_64[] = { - YAML_IDX, - YAML_STRING("val", 8), - YAML_END -}; -static const struct YamlNode struct_anonymous_8[] = { - YAML_UNSIGNED( "receivers", 7 ), - YAML_UNSIGNED( "racingMode", 1 ), - YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_9[] = { - YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), - YAML_UNSIGNED( "mode", 3 ), - YAML_UNSIGNED( "rfPower", 1 ), - YAML_UNSIGNED( "reserved", 4 ), - YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_10[] = { - YAML_UNSIGNED( "emi", 2 ), - YAML_UNSIGNED( "telemetry", 1 ), - YAML_UNSIGNED( "phyMode", 3 ), - YAML_UNSIGNED( "reserved", 2 ), - YAML_UNSIGNED( "rfPower", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_11[] = { - YAML_UNSIGNED( "raw12bits", 1 ), - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_12[] = { - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_13[] = { - YAML_UNSIGNED( "flags", 8 ), - YAML_END -}; -static const struct YamlNode union_anonymous_4_elmts[] = { - YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), - YAML_STRUCT("ppm", 16, struct_PpmModule, NULL), - YAML_STRUCT("multi", 24, struct_anonymous_5, NULL), - YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL), - YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL), - YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL), - YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), - YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), - YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), - YAML_END -}; -static const struct YamlNode struct_ModuleData[] = { - YAML_IDX, - YAML_ENUM("type", 8, enum_ModuleType), - YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), - YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), - YAML_PADDING( 4 ), - YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), - YAML_END -}; -static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_PADDING( 1 ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput_elmts[] = { - YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput[] = { - YAML_IDX, - YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), - YAML_END -}; -static const struct YamlNode struct_ScriptData[] = { - YAML_IDX, - YAML_STRING("file", 6), - YAML_STRING("name", 6), - YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), - YAML_END -}; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_UNSIGNED( "id", 16 ), - YAML_UNSIGNED( "persistentValue", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_16[] = { - YAML_UNSIGNED( "physID", 5 ), - YAML_UNSIGNED( "rxIndex", 3 ), - YAML_END -}; -static const struct YamlNode union_anonymous_15_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL), - YAML_UNSIGNED( "instance", 8 ), - YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), - YAML_END -}; -static const struct YamlNode struct_anonymous_18[] = { - YAML_UNSIGNED( "ratio", 16 ), - YAML_SIGNED( "offset", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_19[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_UNSIGNED( "index", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_20[] = { - YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_21[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_PADDING( 24 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_22[] = { - YAML_UNSIGNED( "gps", 8 ), - YAML_UNSIGNED( "alt", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode union_anonymous_17_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_18, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_19, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_20, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_22, NULL), - YAML_UNSIGNED( "param", 32 ), - YAML_END -}; -static const struct YamlNode struct_TelemetrySensor[] = { - YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2), - YAML_STRING("label", 4), - YAML_UNSIGNED( "subId", 8 ), - YAML_ENUM("type", 1, enum_TelemetrySensorType), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "unit", 6 ), - YAML_UNSIGNED( "prec", 2 ), - YAML_UNSIGNED( "autoOffset", 1 ), - YAML_UNSIGNED( "filter", 1 ), - YAML_UNSIGNED( "logs", 1 ), - YAML_UNSIGNED( "persistent", 1 ), - YAML_UNSIGNED( "onlyPositive", 1 ), - YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg), - YAML_END -}; -static const struct YamlNode struct_FrSkyBarData[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "barMin", 16 ), - YAML_SIGNED( "barMax", 16 ), - YAML_END -}; -static const struct YamlNode struct_LineDataSource[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode struct_FrSkyLineData[] = { - YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScriptData[] = { - YAML_STRING("file", 6), - YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), - YAML_END -}; -static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { - YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), - YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), - YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScreenData[] = { - YAML_IDX, - YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), - YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), - YAML_END -}; -static const struct YamlNode struct_USBJoystickChData[] = { - YAML_IDX, - YAML_ENUM("mode", 3, enum_USBJoystickCh), - YAML_UNSIGNED( "inversion", 1 ), - YAML_UNSIGNED( "param", 4 ), - YAML_UNSIGNED( "btn_num", 5 ), - YAML_UNSIGNED( "switch_npos", 3 ), - YAML_END -}; -static const struct YamlNode struct_ModelData[] = { - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_UNSIGNED( "telemetryProtocol", 3 ), - YAML_UNSIGNED( "thrTrim", 1 ), - YAML_UNSIGNED( "noGlobalFunctions", 1 ), - YAML_UNSIGNED( "displayTrims", 2 ), - YAML_UNSIGNED( "ignoreSensorIds", 1 ), - YAML_SIGNED( "trimInc", 3 ), - YAML_UNSIGNED( "disableThrottleWarning", 1 ), - YAML_UNSIGNED( "displayChecklist", 1 ), - YAML_UNSIGNED( "extendedLimits", 1 ), - YAML_UNSIGNED( "extendedTrims", 1 ), - YAML_UNSIGNED( "throttleReversed", 1 ), - YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ), - YAML_UNSIGNED( "disableTelemetryWarning", 1 ), - YAML_UNSIGNED( "showInstanceIds", 1 ), - YAML_PADDING( 5 ), - YAML_SIGNED( "customThrottleWarningPosition", 8 ), - YAML_UNSIGNED( "beepANACenter", 16 ), - YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), - YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), - YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), - YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), - YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), - YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), - YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), - YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), - YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), - YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL), - YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL), - YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), - YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable), - YAML_PADDING( 1 ), - YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), - YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), - YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), - YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), - YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), - YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_PADDING( 8 ), - YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_STRING("modelRegistrationID", 8), - YAML_UNSIGNED( "usbJoystickExtMode", 1 ), - YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode), - YAML_UNSIGNED( "usbJoystickCircularCut", 4 ), - YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL), - YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable), - YAML_END -}; -static const struct YamlNode struct_PartialModel[] = { - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_END -}; - -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29 - -static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); - -const YamlNode* get_radiodata_nodes() -{ - return &__RadioData_root_node; -} -static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); - -const YamlNode* get_modeldata_nodes() -{ - return &__ModelData_root_node; -} -static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); - -const YamlNode* get_partialmodel_nodes() -{ - return &__PartialModel_root_node; -} - diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 779669bff..850cfc68d 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -72,9 +72,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_PLAY_SOUND, "PLAY_SOUND" }, { FUNC_PLAY_TRACK, "PLAY_TRACK" }, { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, { FUNC_VARIO, "VARIO" }, @@ -113,52 +111,16 @@ const struct YamlIdStr enum_MixerMultiplex[] = { }; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, { MIXSRC_TrimRud, "TrimRud" }, { MIXSRC_TrimEle, "TrimEle" }, { MIXSRC_TrimThr, "TrimThr" }, { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SG, "SG" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TrimT5, "TrimT5" }, + { MIXSRC_TrimT6, "TrimT6" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, { 0, NULL } }; const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { @@ -193,40 +155,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, { SWSRC_ON, "ON" }, { SWSRC_ONE, "ONE" }, { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, @@ -337,18 +265,13 @@ static const struct YamlNode union_anonymous_0_elmts[] = { }; static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 6, enum_Functions), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 48 ), YAML_PADDING( 8 ), YAML_END }; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_UNSIGNED( "unsignedValue", 32 ), YAML_SIGNED( "signedValue", 32 ), @@ -373,7 +296,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_PADDING( 7 ), YAML_CUSTOM("semver",nullptr,w_semver), YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 9, struct_CalibData, NULL), + YAML_ARRAY("calib", 48, 22, struct_CalibData, NULL), YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), @@ -440,12 +363,10 @@ static const struct YamlNode struct_RadioData[] = { YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), - YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), - YAML_PADDING( 192 ), - YAML_PADDING( 216 ), + YAML_ARRAY("sticksConfig", 0, MAX_STICKS, struct_stickConfig, stick_name_valid), + YAML_ARRAY("slidersConfig", 0, MAX_POTS, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 4, 16, struct_potConfig, nullptr), + YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), YAML_STRING("currModelFilename", 17), YAML_UNSIGNED( "modelQuickSelect", 1 ), YAML_UNSIGNED( "blOffBright", 7 ), @@ -513,8 +434,8 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), @@ -544,10 +465,9 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "trimSource", 6 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), YAML_STRING("name", 6), YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), @@ -572,9 +492,9 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_CUSTOM("def",r_logicSw,w_logicSw), YAML_PADDING( 10 ), YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "andsw", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 1 ), - YAML_PADDING( 2 ), YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), @@ -599,10 +519,10 @@ static const struct YamlNode struct_trim_t[] = { }; static const struct YamlNode struct_FlightModeData[] = { YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_ARRAY("trim", 16, 6, struct_trim_t, NULL), YAML_STRING("name", 10), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "fadeIn", 8 ), YAML_UNSIGNED( "fadeOut", 8 ), YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), @@ -906,10 +826,10 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 72, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), + YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), + YAML_PADDING( 64 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), @@ -925,7 +845,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("scriptsData", 192, 9, struct_ScriptData, NULL), YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 5, struct_signed_8, NULL), + YAML_ARRAY("potsWarnPosition", 8, 16, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), YAML_ARRAY("screenData", 6816, 10, struct_CustomScreenData, NULL), YAML_STRUCT("topbarData", 1248, struct_TopBarPersistentData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp deleted file mode 100644 index afdfd8a95..000000000 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ /dev/null @@ -1,943 +0,0 @@ -// generated by generate_yaml.py - -// -// Enums first -// - -const struct YamlIdStr enum_BacklightMode[] = { - { e_backlight_mode_off, "backlight_mode_off" }, - { e_backlight_mode_keys, "backlight_mode_keys" }, - { e_backlight_mode_sticks, "backlight_mode_sticks" }, - { e_backlight_mode_all, "backlight_mode_all" }, - { e_backlight_mode_on, "backlight_mode_on" }, - { 0, NULL } -}; -const struct YamlIdStr enum_AntennaModes[] = { - { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, - { ANTENNA_MODE_ASK, "MODE_ASK" }, - { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, - { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModuleType[] = { - { MODULE_TYPE_NONE, "TYPE_NONE" }, - { MODULE_TYPE_PPM, "TYPE_PPM" }, - { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, - { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, - { MODULE_TYPE_DSM2, "TYPE_DSM2" }, - { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, - { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, - { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, - { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, - { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, - { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, - { MODULE_TYPE_GHOST, "TYPE_GHOST" }, - { MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" }, - { MODULE_TYPE_SBUS, "TYPE_SBUS" }, - { MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" }, - { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, - { MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TrainerMultiplex[] = { - { TRAINER_OFF, "OFF" }, - { TRAINER_ADD, "ADD" }, - { TRAINER_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BeeperMode[] = { - { e_mode_quiet, "mode_quiet" }, - { e_mode_alarms, "mode_alarms" }, - { e_mode_nokeys, "mode_nokeys" }, - { e_mode_all, "mode_all" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BluetoothModes[] = { - { BLUETOOTH_OFF, "OFF" }, - { BLUETOOTH_TELEMETRY, "TELEMETRY" }, - { BLUETOOTH_TRAINER, "TRAINER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_Functions[] = { - { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, - { FUNC_TRAINER, "TRAINER" }, - { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, - { FUNC_RESET, "RESET" }, - { FUNC_SET_TIMER, "SET_TIMER" }, - { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, - { FUNC_VOLUME, "VOLUME" }, - { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, - { FUNC_RANGECHECK, "RANGECHECK" }, - { FUNC_BIND, "BIND" }, - { FUNC_PLAY_SOUND, "PLAY_SOUND" }, - { FUNC_PLAY_TRACK, "PLAY_TRACK" }, - { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, - { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, - { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, - { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, - { FUNC_VARIO, "VARIO" }, - { FUNC_HAPTIC, "HAPTIC" }, - { FUNC_LOGS, "LOGS" }, - { FUNC_BACKLIGHT, "BACKLIGHT" }, - { FUNC_SCREENSHOT, "SCREENSHOT" }, - { FUNC_RACING_MODE, "RACING_MODE" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TimerModes[] = { - { TMRMODE_OFF, "OFF" }, - { TMRMODE_ON, "ON" }, - { TMRMODE_START, "START" }, - { TMRMODE_THR, "THR" }, - { TMRMODE_THR_REL, "THR_REL" }, - { TMRMODE_THR_START, "THR_START" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixerMultiplex[] = { - { MLTPX_ADD, "ADD" }, - { MLTPX_MUL, "MUL" }, - { MLTPX_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixSources[] = { - { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, - { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, - { MIXSRC_TrimRud, "TrimRud" }, - { MIXSRC_TrimEle, "TrimEle" }, - { MIXSRC_TrimThr, "TrimThr" }, - { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SG, "SG" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SI, "SI" }, - { MIXSRC_SJ, "SJ" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, - { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, - { MIXSRC_TX_TIME, "TX_TIME" }, - { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, - { 0, NULL } -}; -const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { - { LS_FUNC_NONE, "FUNC_NONE" }, - { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, - { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, - { LS_FUNC_VPOS, "FUNC_VPOS" }, - { LS_FUNC_VNEG, "FUNC_VNEG" }, - { LS_FUNC_RANGE, "FUNC_RANGE" }, - { LS_FUNC_APOS, "FUNC_APOS" }, - { LS_FUNC_ANEG, "FUNC_ANEG" }, - { LS_FUNC_AND, "FUNC_AND" }, - { LS_FUNC_OR, "FUNC_OR" }, - { LS_FUNC_XOR, "FUNC_XOR" }, - { LS_FUNC_EDGE, "FUNC_EDGE" }, - { LS_FUNC_EQUAL, "FUNC_EQUAL" }, - { LS_FUNC_GREATER, "FUNC_GREATER" }, - { LS_FUNC_LESS, "FUNC_LESS" }, - { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, - { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, - { LS_FUNC_TIMER, "FUNC_TIMER" }, - { LS_FUNC_STICKY, "FUNC_STICKY" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwashType[] = { - { SWASH_TYPE_NONE, "TYPE_NONE" }, - { SWASH_TYPE_120, "TYPE_120" }, - { SWASH_TYPE_120X, "TYPE_120X" }, - { SWASH_TYPE_140, "TYPE_140" }, - { SWASH_TYPE_90, "TYPE_90" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwitchSources[] = { - { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, - { SWSRC_ON, "ON" }, - { SWSRC_ONE, "ONE" }, - { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, - { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, - { SWSRC_OFF, "OFF" }, - { 0, NULL } -}; -const struct YamlIdStr enum_PotsWarnMode[] = { - { POTS_WARN_OFF, "WARN_OFF" }, - { POTS_WARN_MANUAL, "WARN_MANUAL" }, - { POTS_WARN_AUTO, "WARN_AUTO" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModelOverridableEnable[] = { - { OVERRIDE_GLOBAL, "GLOBAL" }, - { OVERRIDE_OFF, "OFF" }, - { OVERRIDE_ON, "ON" }, - { 0, NULL } -}; -const struct YamlIdStr enum_FailsafeModes[] = { - { FAILSAFE_NOT_SET, "NOT_SET" }, - { FAILSAFE_HOLD, "HOLD" }, - { FAILSAFE_CUSTOM, "CUSTOM" }, - { FAILSAFE_NOPULSES, "NOPULSES" }, - { FAILSAFE_RECEIVER, "RECEIVER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorFormula[] = { - { TELEM_FORMULA_ADD, "FORMULA_ADD" }, - { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, - { TELEM_FORMULA_MIN, "FORMULA_MIN" }, - { TELEM_FORMULA_MAX, "FORMULA_MAX" }, - { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, - { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, - { TELEM_FORMULA_CELL, "FORMULA_CELL" }, - { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, - { TELEM_FORMULA_DIST, "FORMULA_DIST" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorType[] = { - { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, - { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickIfMode[] = { - { USBJOYS_JOYSTICK, "JOYSTICK" }, - { USBJOYS_GAMEPAD, "GAMEPAD" }, - { USBJOYS_MULTIAXIS, "MULTIAXIS" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickCh[] = { - { USBJOYS_CH_NONE, "CH_NONE" }, - { USBJOYS_CH_BUTTON, "CH_BUTTON" }, - { USBJOYS_CH_AXIS, "CH_AXIS" }, - { USBJOYS_CH_SIM, "CH_SIM" }, - { 0, NULL } -}; - -// -// Structs last -// - -static const struct YamlNode struct_CalibData[] = { - YAML_IDX_CUST("calib",r_calib,w_calib), - YAML_SIGNED( "mid", 16 ), - YAML_SIGNED( "spanNeg", 16 ), - YAML_SIGNED( "spanPos", 16 ), - YAML_END -}; -static const struct YamlNode struct_signed_16[] = { - YAML_IDX, - YAML_SIGNED( "val", 16 ), - YAML_END -}; -static const struct YamlNode struct_TrainerMix[] = { - YAML_IDX, - YAML_UNSIGNED( "srcChn", 6 ), - YAML_ENUM("mode", 2, enum_TrainerMultiplex), - YAML_SIGNED( "studWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_TrainerData[] = { - YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), - YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_1[] = { - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_anonymous_2[] = { - YAML_SIGNED( "val", 16 ), - YAML_UNSIGNED( "mode", 8 ), - YAML_UNSIGNED( "param", 8 ), - YAML_SIGNED( "spare", 32 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_3[] = { - YAML_SIGNED( "val1", 32 ), - YAML_SIGNED( "val2", 32 ), - YAML_END -}; -static const struct YamlNode union_anonymous_0_elmts[] = { - YAML_STRUCT("play", 48, struct_anonymous_1, NULL), - YAML_STRUCT("all", 64, struct_anonymous_2, NULL), - YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), - YAML_END -}; -static const struct YamlNode struct_CustomFunctionData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), - YAML_CUSTOM("def",r_customFn,w_customFn), - YAML_PADDING( 64 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; -static const struct YamlNode struct_RadioData[] = { - YAML_UNSIGNED( "manuallyEdited", 1 ), - YAML_PADDING( 7 ), - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_PADDING( 16 ), - YAML_SIGNED( "currModel", 8 ), - YAML_UNSIGNED( "contrast", 8 ), - YAML_UNSIGNED( "vBatWarn", 8 ), - YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_ENUM("backlightMode", 3, enum_BacklightMode), - YAML_ENUM("antennaMode", 2, enum_AntennaModes), - YAML_UNSIGNED( "disableRtcWarning", 1 ), - YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), - YAML_ENUM("internalModule", 8, enum_ModuleType), - YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), - YAML_UNSIGNED( "alarmsFlash", 1 ), - YAML_UNSIGNED( "disableMemoryWarning", 1 ), - YAML_UNSIGNED( "disableAlarmWarning", 1 ), - YAML_UNSIGNED( "stickMode", 2 ), - YAML_SIGNED( "timezone", 5 ), - YAML_UNSIGNED( "adjustRTC", 1 ), - YAML_UNSIGNED( "inactivityTimer", 8 ), - YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr), - YAML_UNSIGNED( "internalModuleBaudrate", 3 ), - YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), - YAML_SIGNED( "switchesDelay", 8 ), - YAML_UNSIGNED( "lightAutoOff", 8 ), - YAML_UNSIGNED( "templateSetup", 8 ), - YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), - YAML_UNSIGNED( "gpsFormat", 1 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), - YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), - YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), - YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), - YAML_UNSIGNED( "backlightBright", 8 ), - YAML_UNSIGNED( "globalTimer", 32 ), - YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), - YAML_UNSIGNED( "countryCode", 2 ), - YAML_SIGNED( "pwrOnSpeed", 3 ), - YAML_SIGNED( "pwrOffSpeed", 3 ), - YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr), - YAML_UNSIGNED( "noJitterFilter", 1 ), - YAML_UNSIGNED( "imperial", 1 ), - YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), - YAML_UNSIGNED( "USBMode", 2 ), - YAML_UNSIGNED( "jackMode", 2 ), - YAML_PADDING( 1 ), - YAML_STRING("ttsLanguage", 2), - YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), - YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), - YAML_SIGNED( "varioRepeat", 8 ), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), - YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), - YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), - YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 192 ), - YAML_PADDING( 144 ), - YAML_PADDING( 8 ), - YAML_STRING("bluetoothName", 10), - YAML_STRING("ownerRegistrationID", 8), - YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), - YAML_UNSIGNED( "rotEncMode", 2 ), - YAML_SIGNED( "uartSampleMode", 2 ), - YAML_PADDING( 3 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "radioGFDisabled", 1 ), - YAML_UNSIGNED( "radioTrainerDisabled", 1 ), - YAML_UNSIGNED( "modelHeliDisabled", 1 ), - YAML_UNSIGNED( "modelFMDisabled", 1 ), - YAML_UNSIGNED( "modelCurvesDisabled", 1 ), - YAML_UNSIGNED( "modelGVDisabled", 1 ), - YAML_UNSIGNED( "modelLSDisabled", 1 ), - YAML_UNSIGNED( "modelSFDisabled", 1 ), - YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ), - YAML_UNSIGNED( "modelTelemetryDisabled", 1 ), - YAML_END -}; -static const struct YamlNode struct_unsigned_8[] = { - YAML_IDX, - YAML_UNSIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_ModelHeader[] = { - YAML_STRING("name", 10), - YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_TimerData[] = { - YAML_IDX, - YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), - YAML_SIGNED( "value", 22 ), - YAML_ENUM("mode", 3, enum_TimerModes), - YAML_UNSIGNED( "countdownBeep", 2 ), - YAML_UNSIGNED( "minuteBeep", 1 ), - YAML_UNSIGNED( "persistent", 2 ), - YAML_SIGNED( "countdownStart", 2 ), - YAML_UNSIGNED( "showElapsed", 1 ), - YAML_UNSIGNED( "extraHaptic", 1 ), - YAML_PADDING( 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_CurveRef[] = { - YAML_UNSIGNED( "type", 8 ), - YAML_SIGNED_CUST( "value", 8, in_read_weight, in_write_weight ), - YAML_END -}; -static const struct YamlNode struct_MixData[] = { - YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "destCh", 5 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "carryTrim", 1 ), - YAML_UNSIGNED( "mixWarn", 2 ), - YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_UNSIGNED( "delayUp", 8 ), - YAML_UNSIGNED( "delayDown", 8 ), - YAML_UNSIGNED( "speedUp", 8 ), - YAML_UNSIGNED( "speedDown", 8 ), - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_LimitData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ), - YAML_SIGNED( "ppmCenter", 10 ), - YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "symetrical", 1 ), - YAML_UNSIGNED( "revert", 1 ), - YAML_PADDING( 3 ), - YAML_SIGNED( "curve", 8 ), - YAML_STRING("name", 4), - YAML_END -}; -static const struct YamlNode struct_ExpoData[] = { - YAML_UNSIGNED( "mode", 2 ), - YAML_UNSIGNED( "scale", 14 ), - YAML_CUSTOM("carryTrim",r_carryTrim,nullptr), - YAML_SIGNED( "trimSource", 6 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_END -}; -static const struct YamlNode struct_CurveHeader[] = { - YAML_IDX, - YAML_UNSIGNED( "type", 1 ), - YAML_UNSIGNED( "smooth", 1 ), - YAML_SIGNED( "points", 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_signed_8[] = { - YAML_IDX, - YAML_SIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_LogicalSwitchData[] = { - YAML_IDX, - YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_CUSTOM("def",r_logicSw,w_logicSw), - YAML_PADDING( 10 ), - YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 1 ), - YAML_PADDING( 2 ), - YAML_PADDING( 16 ), - YAML_UNSIGNED( "delay", 8 ), - YAML_UNSIGNED( "duration", 8 ), - YAML_END -}; -static const struct YamlNode struct_SwashRingData[] = { - YAML_ENUM("type", 8, enum_SwashType), - YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "collectiveWeight", 8 ), - YAML_SIGNED( "aileronWeight", 8 ), - YAML_SIGNED( "elevatorWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_trim_t[] = { - YAML_IDX, - YAML_SIGNED( "value", 11 ), - YAML_UNSIGNED( "mode", 5 ), - YAML_END -}; -static const struct YamlNode struct_FlightModeData[] = { - YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), - YAML_UNSIGNED( "fadeIn", 8 ), - YAML_UNSIGNED( "fadeOut", 8 ), - YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), - YAML_END -}; -static const struct YamlNode struct_GVarData[] = { - YAML_IDX, - YAML_STRING("name", 3), - YAML_UNSIGNED( "min", 12 ), - YAML_UNSIGNED( "max", 12 ), - YAML_UNSIGNED( "popup", 1 ), - YAML_UNSIGNED( "prec", 1 ), - YAML_UNSIGNED( "unit", 2 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), - YAML_UNSIGNED( "centerSilent", 1 ), - YAML_SIGNED( "centerMax", 8 ), - YAML_SIGNED( "centerMin", 8 ), - YAML_SIGNED( "min", 8 ), - YAML_SIGNED( "max", 8 ), - YAML_END -}; -static const struct YamlNode struct_RssiAlarmData[] = { - YAML_CUSTOM("disabled",r_rssiDisabled,nullptr), - YAML_CUSTOM("warning",r_rssiWarning,nullptr), - YAML_CUSTOM("critical",r_rssiCritical,nullptr), - YAML_END -}; -static const struct YamlNode struct_RFAlarmData[] = { - YAML_SIGNED( "warning", 8 ), - YAML_SIGNED( "critical", 8 ), - YAML_END -}; -static const struct YamlNode struct_PpmModule[] = { - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_UNSIGNED( "outputType", 1 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_5[] = { - YAML_PADDING( 8 ), - YAML_UNSIGNED( "disableTelemetry", 1 ), - YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "autoBindMode", 1 ), - YAML_UNSIGNED( "lowPowerMode", 1 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_PADDING( 2 ), - YAML_SIGNED( "optionValue", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "power", 2 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_SIGNED( "antennaMode", 2 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_7[] = { - YAML_PADDING( 6 ), - YAML_UNSIGNED( "noninverted", 1 ), - YAML_PADDING( 1 ), - YAML_SIGNED( "refreshRate", 8 ), - YAML_END -}; -static const struct YamlNode struct_string_64[] = { - YAML_IDX, - YAML_STRING("val", 8), - YAML_END -}; -static const struct YamlNode struct_anonymous_8[] = { - YAML_UNSIGNED( "receivers", 7 ), - YAML_UNSIGNED( "racingMode", 1 ), - YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_9[] = { - YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), - YAML_UNSIGNED( "mode", 3 ), - YAML_UNSIGNED( "rfPower", 1 ), - YAML_UNSIGNED( "reserved", 4 ), - YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_10[] = { - YAML_UNSIGNED( "emi", 2 ), - YAML_UNSIGNED( "telemetry", 1 ), - YAML_UNSIGNED( "phyMode", 3 ), - YAML_UNSIGNED( "reserved", 2 ), - YAML_UNSIGNED( "rfPower", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_11[] = { - YAML_UNSIGNED( "raw12bits", 1 ), - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_12[] = { - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_13[] = { - YAML_UNSIGNED( "flags", 8 ), - YAML_END -}; -static const struct YamlNode union_anonymous_4_elmts[] = { - YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), - YAML_STRUCT("ppm", 16, struct_PpmModule, NULL), - YAML_STRUCT("multi", 24, struct_anonymous_5, NULL), - YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL), - YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL), - YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL), - YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), - YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), - YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), - YAML_END -}; -static const struct YamlNode struct_ModuleData[] = { - YAML_IDX, - YAML_ENUM("type", 8, enum_ModuleType), - YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), - YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), - YAML_PADDING( 4 ), - YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), - YAML_END -}; -static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_PADDING( 1 ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput_elmts[] = { - YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput[] = { - YAML_IDX, - YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), - YAML_END -}; -static const struct YamlNode struct_ScriptData[] = { - YAML_IDX, - YAML_STRING("file", 6), - YAML_STRING("name", 6), - YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), - YAML_END -}; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_UNSIGNED( "id", 16 ), - YAML_UNSIGNED( "persistentValue", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_16[] = { - YAML_UNSIGNED( "physID", 5 ), - YAML_UNSIGNED( "rxIndex", 3 ), - YAML_END -}; -static const struct YamlNode union_anonymous_15_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL), - YAML_UNSIGNED( "instance", 8 ), - YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), - YAML_END -}; -static const struct YamlNode struct_anonymous_18[] = { - YAML_UNSIGNED( "ratio", 16 ), - YAML_SIGNED( "offset", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_19[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_UNSIGNED( "index", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_20[] = { - YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_21[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_PADDING( 24 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_22[] = { - YAML_UNSIGNED( "gps", 8 ), - YAML_UNSIGNED( "alt", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode union_anonymous_17_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_18, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_19, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_20, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_22, NULL), - YAML_UNSIGNED( "param", 32 ), - YAML_END -}; -static const struct YamlNode struct_TelemetrySensor[] = { - YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2), - YAML_STRING("label", 4), - YAML_UNSIGNED( "subId", 8 ), - YAML_ENUM("type", 1, enum_TelemetrySensorType), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "unit", 6 ), - YAML_UNSIGNED( "prec", 2 ), - YAML_UNSIGNED( "autoOffset", 1 ), - YAML_UNSIGNED( "filter", 1 ), - YAML_UNSIGNED( "logs", 1 ), - YAML_UNSIGNED( "persistent", 1 ), - YAML_UNSIGNED( "onlyPositive", 1 ), - YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg), - YAML_END -}; -static const struct YamlNode struct_FrSkyBarData[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "barMin", 16 ), - YAML_SIGNED( "barMax", 16 ), - YAML_END -}; -static const struct YamlNode struct_LineDataSource[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode struct_FrSkyLineData[] = { - YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScriptData[] = { - YAML_STRING("file", 6), - YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), - YAML_END -}; -static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { - YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), - YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), - YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScreenData[] = { - YAML_IDX, - YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), - YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), - YAML_END -}; -static const struct YamlNode struct_USBJoystickChData[] = { - YAML_IDX, - YAML_ENUM("mode", 3, enum_USBJoystickCh), - YAML_UNSIGNED( "inversion", 1 ), - YAML_UNSIGNED( "param", 4 ), - YAML_UNSIGNED( "btn_num", 5 ), - YAML_UNSIGNED( "switch_npos", 3 ), - YAML_END -}; -static const struct YamlNode struct_ModelData[] = { - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_UNSIGNED( "telemetryProtocol", 3 ), - YAML_UNSIGNED( "thrTrim", 1 ), - YAML_UNSIGNED( "noGlobalFunctions", 1 ), - YAML_UNSIGNED( "displayTrims", 2 ), - YAML_UNSIGNED( "ignoreSensorIds", 1 ), - YAML_SIGNED( "trimInc", 3 ), - YAML_UNSIGNED( "disableThrottleWarning", 1 ), - YAML_UNSIGNED( "displayChecklist", 1 ), - YAML_UNSIGNED( "extendedLimits", 1 ), - YAML_UNSIGNED( "extendedTrims", 1 ), - YAML_UNSIGNED( "throttleReversed", 1 ), - YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ), - YAML_UNSIGNED( "disableTelemetryWarning", 1 ), - YAML_UNSIGNED( "showInstanceIds", 1 ), - YAML_PADDING( 5 ), - YAML_SIGNED( "customThrottleWarningPosition", 8 ), - YAML_UNSIGNED( "beepANACenter", 16 ), - YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), - YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), - YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), - YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), - YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), - YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), - YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), - YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), - YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), - YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL), - YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL), - YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), - YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable), - YAML_PADDING( 1 ), - YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), - YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), - YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), - YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), - YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), - YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_PADDING( 8 ), - YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_STRING("modelRegistrationID", 8), - YAML_UNSIGNED( "usbJoystickExtMode", 1 ), - YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode), - YAML_UNSIGNED( "usbJoystickCircularCut", 4 ), - YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL), - YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable), - YAML_END -}; -static const struct YamlNode struct_PartialModel[] = { - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_END -}; - -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29 - -static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); - -const YamlNode* get_radiodata_nodes() -{ - return &__RadioData_root_node; -} -static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); - -const YamlNode* get_modeldata_nodes() -{ - return &__ModelData_root_node; -} -static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); - -const YamlNode* get_partialmodel_nodes() -{ - return &__PartialModel_root_node; -} - diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp deleted file mode 100644 index 64acd6958..000000000 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ /dev/null @@ -1,943 +0,0 @@ -// generated by generate_yaml.py - -// -// Enums first -// - -const struct YamlIdStr enum_BacklightMode[] = { - { e_backlight_mode_off, "backlight_mode_off" }, - { e_backlight_mode_keys, "backlight_mode_keys" }, - { e_backlight_mode_sticks, "backlight_mode_sticks" }, - { e_backlight_mode_all, "backlight_mode_all" }, - { e_backlight_mode_on, "backlight_mode_on" }, - { 0, NULL } -}; -const struct YamlIdStr enum_AntennaModes[] = { - { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, - { ANTENNA_MODE_ASK, "MODE_ASK" }, - { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, - { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModuleType[] = { - { MODULE_TYPE_NONE, "TYPE_NONE" }, - { MODULE_TYPE_PPM, "TYPE_PPM" }, - { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, - { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, - { MODULE_TYPE_DSM2, "TYPE_DSM2" }, - { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, - { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, - { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, - { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, - { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, - { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, - { MODULE_TYPE_GHOST, "TYPE_GHOST" }, - { MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" }, - { MODULE_TYPE_SBUS, "TYPE_SBUS" }, - { MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" }, - { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, - { MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TrainerMultiplex[] = { - { TRAINER_OFF, "OFF" }, - { TRAINER_ADD, "ADD" }, - { TRAINER_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BeeperMode[] = { - { e_mode_quiet, "mode_quiet" }, - { e_mode_alarms, "mode_alarms" }, - { e_mode_nokeys, "mode_nokeys" }, - { e_mode_all, "mode_all" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BluetoothModes[] = { - { BLUETOOTH_OFF, "OFF" }, - { BLUETOOTH_TELEMETRY, "TELEMETRY" }, - { BLUETOOTH_TRAINER, "TRAINER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_Functions[] = { - { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, - { FUNC_TRAINER, "TRAINER" }, - { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, - { FUNC_RESET, "RESET" }, - { FUNC_SET_TIMER, "SET_TIMER" }, - { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, - { FUNC_VOLUME, "VOLUME" }, - { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, - { FUNC_RANGECHECK, "RANGECHECK" }, - { FUNC_BIND, "BIND" }, - { FUNC_PLAY_SOUND, "PLAY_SOUND" }, - { FUNC_PLAY_TRACK, "PLAY_TRACK" }, - { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, - { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, - { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, - { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, - { FUNC_VARIO, "VARIO" }, - { FUNC_HAPTIC, "HAPTIC" }, - { FUNC_LOGS, "LOGS" }, - { FUNC_BACKLIGHT, "BACKLIGHT" }, - { FUNC_SCREENSHOT, "SCREENSHOT" }, - { FUNC_RACING_MODE, "RACING_MODE" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TimerModes[] = { - { TMRMODE_OFF, "OFF" }, - { TMRMODE_ON, "ON" }, - { TMRMODE_START, "START" }, - { TMRMODE_THR, "THR" }, - { TMRMODE_THR_REL, "THR_REL" }, - { TMRMODE_THR_START, "THR_START" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixerMultiplex[] = { - { MLTPX_ADD, "ADD" }, - { MLTPX_MUL, "MUL" }, - { MLTPX_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixSources[] = { - { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, - { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, - { MIXSRC_TrimRud, "TrimRud" }, - { MIXSRC_TrimEle, "TrimEle" }, - { MIXSRC_TrimThr, "TrimThr" }, - { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SI, "SI" }, - { MIXSRC_SJ, "SJ" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, - { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, - { MIXSRC_TX_TIME, "TX_TIME" }, - { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, - { 0, NULL } -}; -const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { - { LS_FUNC_NONE, "FUNC_NONE" }, - { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, - { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, - { LS_FUNC_VPOS, "FUNC_VPOS" }, - { LS_FUNC_VNEG, "FUNC_VNEG" }, - { LS_FUNC_RANGE, "FUNC_RANGE" }, - { LS_FUNC_APOS, "FUNC_APOS" }, - { LS_FUNC_ANEG, "FUNC_ANEG" }, - { LS_FUNC_AND, "FUNC_AND" }, - { LS_FUNC_OR, "FUNC_OR" }, - { LS_FUNC_XOR, "FUNC_XOR" }, - { LS_FUNC_EDGE, "FUNC_EDGE" }, - { LS_FUNC_EQUAL, "FUNC_EQUAL" }, - { LS_FUNC_GREATER, "FUNC_GREATER" }, - { LS_FUNC_LESS, "FUNC_LESS" }, - { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, - { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, - { LS_FUNC_TIMER, "FUNC_TIMER" }, - { LS_FUNC_STICKY, "FUNC_STICKY" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwashType[] = { - { SWASH_TYPE_NONE, "TYPE_NONE" }, - { SWASH_TYPE_120, "TYPE_120" }, - { SWASH_TYPE_120X, "TYPE_120X" }, - { SWASH_TYPE_140, "TYPE_140" }, - { SWASH_TYPE_90, "TYPE_90" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwitchSources[] = { - { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, - { SWSRC_ON, "ON" }, - { SWSRC_ONE, "ONE" }, - { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, - { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, - { SWSRC_OFF, "OFF" }, - { 0, NULL } -}; -const struct YamlIdStr enum_PotsWarnMode[] = { - { POTS_WARN_OFF, "WARN_OFF" }, - { POTS_WARN_MANUAL, "WARN_MANUAL" }, - { POTS_WARN_AUTO, "WARN_AUTO" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModelOverridableEnable[] = { - { OVERRIDE_GLOBAL, "GLOBAL" }, - { OVERRIDE_OFF, "OFF" }, - { OVERRIDE_ON, "ON" }, - { 0, NULL } -}; -const struct YamlIdStr enum_FailsafeModes[] = { - { FAILSAFE_NOT_SET, "NOT_SET" }, - { FAILSAFE_HOLD, "HOLD" }, - { FAILSAFE_CUSTOM, "CUSTOM" }, - { FAILSAFE_NOPULSES, "NOPULSES" }, - { FAILSAFE_RECEIVER, "RECEIVER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorFormula[] = { - { TELEM_FORMULA_ADD, "FORMULA_ADD" }, - { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, - { TELEM_FORMULA_MIN, "FORMULA_MIN" }, - { TELEM_FORMULA_MAX, "FORMULA_MAX" }, - { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, - { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, - { TELEM_FORMULA_CELL, "FORMULA_CELL" }, - { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, - { TELEM_FORMULA_DIST, "FORMULA_DIST" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorType[] = { - { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, - { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickIfMode[] = { - { USBJOYS_JOYSTICK, "JOYSTICK" }, - { USBJOYS_GAMEPAD, "GAMEPAD" }, - { USBJOYS_MULTIAXIS, "MULTIAXIS" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickCh[] = { - { USBJOYS_CH_NONE, "CH_NONE" }, - { USBJOYS_CH_BUTTON, "CH_BUTTON" }, - { USBJOYS_CH_AXIS, "CH_AXIS" }, - { USBJOYS_CH_SIM, "CH_SIM" }, - { 0, NULL } -}; - -// -// Structs last -// - -static const struct YamlNode struct_CalibData[] = { - YAML_IDX_CUST("calib",r_calib,w_calib), - YAML_SIGNED( "mid", 16 ), - YAML_SIGNED( "spanNeg", 16 ), - YAML_SIGNED( "spanPos", 16 ), - YAML_END -}; -static const struct YamlNode struct_signed_16[] = { - YAML_IDX, - YAML_SIGNED( "val", 16 ), - YAML_END -}; -static const struct YamlNode struct_TrainerMix[] = { - YAML_IDX, - YAML_UNSIGNED( "srcChn", 6 ), - YAML_ENUM("mode", 2, enum_TrainerMultiplex), - YAML_SIGNED( "studWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_TrainerData[] = { - YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), - YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_1[] = { - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_anonymous_2[] = { - YAML_SIGNED( "val", 16 ), - YAML_UNSIGNED( "mode", 8 ), - YAML_UNSIGNED( "param", 8 ), - YAML_SIGNED( "spare", 32 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_3[] = { - YAML_SIGNED( "val1", 32 ), - YAML_SIGNED( "val2", 32 ), - YAML_END -}; -static const struct YamlNode union_anonymous_0_elmts[] = { - YAML_STRUCT("play", 48, struct_anonymous_1, NULL), - YAML_STRUCT("all", 64, struct_anonymous_2, NULL), - YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), - YAML_END -}; -static const struct YamlNode struct_CustomFunctionData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), - YAML_CUSTOM("def",r_customFn,w_customFn), - YAML_PADDING( 64 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; -static const struct YamlNode struct_RadioData[] = { - YAML_UNSIGNED( "manuallyEdited", 1 ), - YAML_PADDING( 7 ), - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_PADDING( 16 ), - YAML_SIGNED( "currModel", 8 ), - YAML_UNSIGNED( "contrast", 8 ), - YAML_UNSIGNED( "vBatWarn", 8 ), - YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_ENUM("backlightMode", 3, enum_BacklightMode), - YAML_ENUM("antennaMode", 2, enum_AntennaModes), - YAML_UNSIGNED( "disableRtcWarning", 1 ), - YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), - YAML_ENUM("internalModule", 8, enum_ModuleType), - YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), - YAML_UNSIGNED( "alarmsFlash", 1 ), - YAML_UNSIGNED( "disableMemoryWarning", 1 ), - YAML_UNSIGNED( "disableAlarmWarning", 1 ), - YAML_UNSIGNED( "stickMode", 2 ), - YAML_SIGNED( "timezone", 5 ), - YAML_UNSIGNED( "adjustRTC", 1 ), - YAML_UNSIGNED( "inactivityTimer", 8 ), - YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr), - YAML_UNSIGNED( "internalModuleBaudrate", 3 ), - YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), - YAML_SIGNED( "switchesDelay", 8 ), - YAML_UNSIGNED( "lightAutoOff", 8 ), - YAML_UNSIGNED( "templateSetup", 8 ), - YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), - YAML_UNSIGNED( "gpsFormat", 1 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), - YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), - YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), - YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), - YAML_UNSIGNED( "backlightBright", 8 ), - YAML_UNSIGNED( "globalTimer", 32 ), - YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), - YAML_UNSIGNED( "countryCode", 2 ), - YAML_SIGNED( "pwrOnSpeed", 3 ), - YAML_SIGNED( "pwrOffSpeed", 3 ), - YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr), - YAML_UNSIGNED( "noJitterFilter", 1 ), - YAML_UNSIGNED( "imperial", 1 ), - YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), - YAML_UNSIGNED( "USBMode", 2 ), - YAML_UNSIGNED( "jackMode", 2 ), - YAML_PADDING( 1 ), - YAML_STRING("ttsLanguage", 2), - YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), - YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), - YAML_SIGNED( "varioRepeat", 8 ), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), - YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), - YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), - YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 192 ), - YAML_PADDING( 144 ), - YAML_PADDING( 8 ), - YAML_STRING("bluetoothName", 10), - YAML_STRING("ownerRegistrationID", 8), - YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), - YAML_UNSIGNED( "rotEncMode", 2 ), - YAML_SIGNED( "uartSampleMode", 2 ), - YAML_PADDING( 3 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "radioGFDisabled", 1 ), - YAML_UNSIGNED( "radioTrainerDisabled", 1 ), - YAML_UNSIGNED( "modelHeliDisabled", 1 ), - YAML_UNSIGNED( "modelFMDisabled", 1 ), - YAML_UNSIGNED( "modelCurvesDisabled", 1 ), - YAML_UNSIGNED( "modelGVDisabled", 1 ), - YAML_UNSIGNED( "modelLSDisabled", 1 ), - YAML_UNSIGNED( "modelSFDisabled", 1 ), - YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ), - YAML_UNSIGNED( "modelTelemetryDisabled", 1 ), - YAML_END -}; -static const struct YamlNode struct_unsigned_8[] = { - YAML_IDX, - YAML_UNSIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_ModelHeader[] = { - YAML_STRING("name", 10), - YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_TimerData[] = { - YAML_IDX, - YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), - YAML_SIGNED( "value", 22 ), - YAML_ENUM("mode", 3, enum_TimerModes), - YAML_UNSIGNED( "countdownBeep", 2 ), - YAML_UNSIGNED( "minuteBeep", 1 ), - YAML_UNSIGNED( "persistent", 2 ), - YAML_SIGNED( "countdownStart", 2 ), - YAML_UNSIGNED( "showElapsed", 1 ), - YAML_UNSIGNED( "extraHaptic", 1 ), - YAML_PADDING( 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_CurveRef[] = { - YAML_UNSIGNED( "type", 8 ), - YAML_SIGNED_CUST( "value", 8, in_read_weight, in_write_weight ), - YAML_END -}; -static const struct YamlNode struct_MixData[] = { - YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "destCh", 5 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "carryTrim", 1 ), - YAML_UNSIGNED( "mixWarn", 2 ), - YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_UNSIGNED( "delayUp", 8 ), - YAML_UNSIGNED( "delayDown", 8 ), - YAML_UNSIGNED( "speedUp", 8 ), - YAML_UNSIGNED( "speedDown", 8 ), - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_LimitData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ), - YAML_SIGNED( "ppmCenter", 10 ), - YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "symetrical", 1 ), - YAML_UNSIGNED( "revert", 1 ), - YAML_PADDING( 3 ), - YAML_SIGNED( "curve", 8 ), - YAML_STRING("name", 4), - YAML_END -}; -static const struct YamlNode struct_ExpoData[] = { - YAML_UNSIGNED( "mode", 2 ), - YAML_UNSIGNED( "scale", 14 ), - YAML_CUSTOM("carryTrim",r_carryTrim,nullptr), - YAML_SIGNED( "trimSource", 6 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_END -}; -static const struct YamlNode struct_CurveHeader[] = { - YAML_IDX, - YAML_UNSIGNED( "type", 1 ), - YAML_UNSIGNED( "smooth", 1 ), - YAML_SIGNED( "points", 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_signed_8[] = { - YAML_IDX, - YAML_SIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_LogicalSwitchData[] = { - YAML_IDX, - YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_CUSTOM("def",r_logicSw,w_logicSw), - YAML_PADDING( 10 ), - YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 1 ), - YAML_PADDING( 2 ), - YAML_PADDING( 16 ), - YAML_UNSIGNED( "delay", 8 ), - YAML_UNSIGNED( "duration", 8 ), - YAML_END -}; -static const struct YamlNode struct_SwashRingData[] = { - YAML_ENUM("type", 8, enum_SwashType), - YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "collectiveWeight", 8 ), - YAML_SIGNED( "aileronWeight", 8 ), - YAML_SIGNED( "elevatorWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_trim_t[] = { - YAML_IDX, - YAML_SIGNED( "value", 11 ), - YAML_UNSIGNED( "mode", 5 ), - YAML_END -}; -static const struct YamlNode struct_FlightModeData[] = { - YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), - YAML_UNSIGNED( "fadeIn", 8 ), - YAML_UNSIGNED( "fadeOut", 8 ), - YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), - YAML_END -}; -static const struct YamlNode struct_GVarData[] = { - YAML_IDX, - YAML_STRING("name", 3), - YAML_UNSIGNED( "min", 12 ), - YAML_UNSIGNED( "max", 12 ), - YAML_UNSIGNED( "popup", 1 ), - YAML_UNSIGNED( "prec", 1 ), - YAML_UNSIGNED( "unit", 2 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), - YAML_UNSIGNED( "centerSilent", 1 ), - YAML_SIGNED( "centerMax", 8 ), - YAML_SIGNED( "centerMin", 8 ), - YAML_SIGNED( "min", 8 ), - YAML_SIGNED( "max", 8 ), - YAML_END -}; -static const struct YamlNode struct_RssiAlarmData[] = { - YAML_CUSTOM("disabled",r_rssiDisabled,nullptr), - YAML_CUSTOM("warning",r_rssiWarning,nullptr), - YAML_CUSTOM("critical",r_rssiCritical,nullptr), - YAML_END -}; -static const struct YamlNode struct_RFAlarmData[] = { - YAML_SIGNED( "warning", 8 ), - YAML_SIGNED( "critical", 8 ), - YAML_END -}; -static const struct YamlNode struct_PpmModule[] = { - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_UNSIGNED( "outputType", 1 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_5[] = { - YAML_PADDING( 8 ), - YAML_UNSIGNED( "disableTelemetry", 1 ), - YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "autoBindMode", 1 ), - YAML_UNSIGNED( "lowPowerMode", 1 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_PADDING( 2 ), - YAML_SIGNED( "optionValue", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "power", 2 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_SIGNED( "antennaMode", 2 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_7[] = { - YAML_PADDING( 6 ), - YAML_UNSIGNED( "noninverted", 1 ), - YAML_PADDING( 1 ), - YAML_SIGNED( "refreshRate", 8 ), - YAML_END -}; -static const struct YamlNode struct_string_64[] = { - YAML_IDX, - YAML_STRING("val", 8), - YAML_END -}; -static const struct YamlNode struct_anonymous_8[] = { - YAML_UNSIGNED( "receivers", 7 ), - YAML_UNSIGNED( "racingMode", 1 ), - YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_9[] = { - YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), - YAML_UNSIGNED( "mode", 3 ), - YAML_UNSIGNED( "rfPower", 1 ), - YAML_UNSIGNED( "reserved", 4 ), - YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_10[] = { - YAML_UNSIGNED( "emi", 2 ), - YAML_UNSIGNED( "telemetry", 1 ), - YAML_UNSIGNED( "phyMode", 3 ), - YAML_UNSIGNED( "reserved", 2 ), - YAML_UNSIGNED( "rfPower", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_11[] = { - YAML_UNSIGNED( "raw12bits", 1 ), - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_12[] = { - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_13[] = { - YAML_UNSIGNED( "flags", 8 ), - YAML_END -}; -static const struct YamlNode union_anonymous_4_elmts[] = { - YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), - YAML_STRUCT("ppm", 16, struct_PpmModule, NULL), - YAML_STRUCT("multi", 24, struct_anonymous_5, NULL), - YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL), - YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL), - YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL), - YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), - YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), - YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), - YAML_END -}; -static const struct YamlNode struct_ModuleData[] = { - YAML_IDX, - YAML_ENUM("type", 8, enum_ModuleType), - YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), - YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), - YAML_PADDING( 4 ), - YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), - YAML_END -}; -static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_PADDING( 1 ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput_elmts[] = { - YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput[] = { - YAML_IDX, - YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), - YAML_END -}; -static const struct YamlNode struct_ScriptData[] = { - YAML_IDX, - YAML_STRING("file", 6), - YAML_STRING("name", 6), - YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), - YAML_END -}; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_UNSIGNED( "id", 16 ), - YAML_UNSIGNED( "persistentValue", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_16[] = { - YAML_UNSIGNED( "physID", 5 ), - YAML_UNSIGNED( "rxIndex", 3 ), - YAML_END -}; -static const struct YamlNode union_anonymous_15_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL), - YAML_UNSIGNED( "instance", 8 ), - YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), - YAML_END -}; -static const struct YamlNode struct_anonymous_18[] = { - YAML_UNSIGNED( "ratio", 16 ), - YAML_SIGNED( "offset", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_19[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_UNSIGNED( "index", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_20[] = { - YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_21[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_PADDING( 24 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_22[] = { - YAML_UNSIGNED( "gps", 8 ), - YAML_UNSIGNED( "alt", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode union_anonymous_17_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_18, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_19, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_20, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_22, NULL), - YAML_UNSIGNED( "param", 32 ), - YAML_END -}; -static const struct YamlNode struct_TelemetrySensor[] = { - YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2), - YAML_STRING("label", 4), - YAML_UNSIGNED( "subId", 8 ), - YAML_ENUM("type", 1, enum_TelemetrySensorType), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "unit", 6 ), - YAML_UNSIGNED( "prec", 2 ), - YAML_UNSIGNED( "autoOffset", 1 ), - YAML_UNSIGNED( "filter", 1 ), - YAML_UNSIGNED( "logs", 1 ), - YAML_UNSIGNED( "persistent", 1 ), - YAML_UNSIGNED( "onlyPositive", 1 ), - YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg), - YAML_END -}; -static const struct YamlNode struct_FrSkyBarData[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "barMin", 16 ), - YAML_SIGNED( "barMax", 16 ), - YAML_END -}; -static const struct YamlNode struct_LineDataSource[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode struct_FrSkyLineData[] = { - YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScriptData[] = { - YAML_STRING("file", 6), - YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), - YAML_END -}; -static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { - YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), - YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), - YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScreenData[] = { - YAML_IDX, - YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), - YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), - YAML_END -}; -static const struct YamlNode struct_USBJoystickChData[] = { - YAML_IDX, - YAML_ENUM("mode", 3, enum_USBJoystickCh), - YAML_UNSIGNED( "inversion", 1 ), - YAML_UNSIGNED( "param", 4 ), - YAML_UNSIGNED( "btn_num", 5 ), - YAML_UNSIGNED( "switch_npos", 3 ), - YAML_END -}; -static const struct YamlNode struct_ModelData[] = { - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_UNSIGNED( "telemetryProtocol", 3 ), - YAML_UNSIGNED( "thrTrim", 1 ), - YAML_UNSIGNED( "noGlobalFunctions", 1 ), - YAML_UNSIGNED( "displayTrims", 2 ), - YAML_UNSIGNED( "ignoreSensorIds", 1 ), - YAML_SIGNED( "trimInc", 3 ), - YAML_UNSIGNED( "disableThrottleWarning", 1 ), - YAML_UNSIGNED( "displayChecklist", 1 ), - YAML_UNSIGNED( "extendedLimits", 1 ), - YAML_UNSIGNED( "extendedTrims", 1 ), - YAML_UNSIGNED( "throttleReversed", 1 ), - YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ), - YAML_UNSIGNED( "disableTelemetryWarning", 1 ), - YAML_UNSIGNED( "showInstanceIds", 1 ), - YAML_PADDING( 5 ), - YAML_SIGNED( "customThrottleWarningPosition", 8 ), - YAML_UNSIGNED( "beepANACenter", 16 ), - YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), - YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), - YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), - YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), - YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), - YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), - YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), - YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), - YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), - YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL), - YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL), - YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), - YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable), - YAML_PADDING( 1 ), - YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), - YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), - YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), - YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), - YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), - YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_PADDING( 8 ), - YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_STRING("modelRegistrationID", 8), - YAML_UNSIGNED( "usbJoystickExtMode", 1 ), - YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode), - YAML_UNSIGNED( "usbJoystickCircularCut", 4 ), - YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL), - YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable), - YAML_END -}; -static const struct YamlNode struct_PartialModel[] = { - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_END -}; - -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29 - -static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); - -const YamlNode* get_radiodata_nodes() -{ - return &__RadioData_root_node; -} -static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); - -const YamlNode* get_modeldata_nodes() -{ - return &__ModelData_root_node; -} -static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); - -const YamlNode* get_partialmodel_nodes() -{ - return &__PartialModel_root_node; -} - diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp deleted file mode 100644 index 64acd6958..000000000 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ /dev/null @@ -1,943 +0,0 @@ -// generated by generate_yaml.py - -// -// Enums first -// - -const struct YamlIdStr enum_BacklightMode[] = { - { e_backlight_mode_off, "backlight_mode_off" }, - { e_backlight_mode_keys, "backlight_mode_keys" }, - { e_backlight_mode_sticks, "backlight_mode_sticks" }, - { e_backlight_mode_all, "backlight_mode_all" }, - { e_backlight_mode_on, "backlight_mode_on" }, - { 0, NULL } -}; -const struct YamlIdStr enum_AntennaModes[] = { - { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, - { ANTENNA_MODE_ASK, "MODE_ASK" }, - { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, - { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModuleType[] = { - { MODULE_TYPE_NONE, "TYPE_NONE" }, - { MODULE_TYPE_PPM, "TYPE_PPM" }, - { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, - { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, - { MODULE_TYPE_DSM2, "TYPE_DSM2" }, - { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, - { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, - { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, - { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, - { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, - { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, - { MODULE_TYPE_GHOST, "TYPE_GHOST" }, - { MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" }, - { MODULE_TYPE_SBUS, "TYPE_SBUS" }, - { MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" }, - { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, - { MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TrainerMultiplex[] = { - { TRAINER_OFF, "OFF" }, - { TRAINER_ADD, "ADD" }, - { TRAINER_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BeeperMode[] = { - { e_mode_quiet, "mode_quiet" }, - { e_mode_alarms, "mode_alarms" }, - { e_mode_nokeys, "mode_nokeys" }, - { e_mode_all, "mode_all" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BluetoothModes[] = { - { BLUETOOTH_OFF, "OFF" }, - { BLUETOOTH_TELEMETRY, "TELEMETRY" }, - { BLUETOOTH_TRAINER, "TRAINER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_Functions[] = { - { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, - { FUNC_TRAINER, "TRAINER" }, - { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, - { FUNC_RESET, "RESET" }, - { FUNC_SET_TIMER, "SET_TIMER" }, - { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, - { FUNC_VOLUME, "VOLUME" }, - { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, - { FUNC_RANGECHECK, "RANGECHECK" }, - { FUNC_BIND, "BIND" }, - { FUNC_PLAY_SOUND, "PLAY_SOUND" }, - { FUNC_PLAY_TRACK, "PLAY_TRACK" }, - { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, - { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, - { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, - { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, - { FUNC_VARIO, "VARIO" }, - { FUNC_HAPTIC, "HAPTIC" }, - { FUNC_LOGS, "LOGS" }, - { FUNC_BACKLIGHT, "BACKLIGHT" }, - { FUNC_SCREENSHOT, "SCREENSHOT" }, - { FUNC_RACING_MODE, "RACING_MODE" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TimerModes[] = { - { TMRMODE_OFF, "OFF" }, - { TMRMODE_ON, "ON" }, - { TMRMODE_START, "START" }, - { TMRMODE_THR, "THR" }, - { TMRMODE_THR_REL, "THR_REL" }, - { TMRMODE_THR_START, "THR_START" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixerMultiplex[] = { - { MLTPX_ADD, "ADD" }, - { MLTPX_MUL, "MUL" }, - { MLTPX_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixSources[] = { - { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, - { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, - { MIXSRC_TrimRud, "TrimRud" }, - { MIXSRC_TrimEle, "TrimEle" }, - { MIXSRC_TrimThr, "TrimThr" }, - { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SI, "SI" }, - { MIXSRC_SJ, "SJ" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, - { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, - { MIXSRC_TX_TIME, "TX_TIME" }, - { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, - { 0, NULL } -}; -const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { - { LS_FUNC_NONE, "FUNC_NONE" }, - { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, - { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, - { LS_FUNC_VPOS, "FUNC_VPOS" }, - { LS_FUNC_VNEG, "FUNC_VNEG" }, - { LS_FUNC_RANGE, "FUNC_RANGE" }, - { LS_FUNC_APOS, "FUNC_APOS" }, - { LS_FUNC_ANEG, "FUNC_ANEG" }, - { LS_FUNC_AND, "FUNC_AND" }, - { LS_FUNC_OR, "FUNC_OR" }, - { LS_FUNC_XOR, "FUNC_XOR" }, - { LS_FUNC_EDGE, "FUNC_EDGE" }, - { LS_FUNC_EQUAL, "FUNC_EQUAL" }, - { LS_FUNC_GREATER, "FUNC_GREATER" }, - { LS_FUNC_LESS, "FUNC_LESS" }, - { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, - { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, - { LS_FUNC_TIMER, "FUNC_TIMER" }, - { LS_FUNC_STICKY, "FUNC_STICKY" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwashType[] = { - { SWASH_TYPE_NONE, "TYPE_NONE" }, - { SWASH_TYPE_120, "TYPE_120" }, - { SWASH_TYPE_120X, "TYPE_120X" }, - { SWASH_TYPE_140, "TYPE_140" }, - { SWASH_TYPE_90, "TYPE_90" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwitchSources[] = { - { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, - { SWSRC_ON, "ON" }, - { SWSRC_ONE, "ONE" }, - { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, - { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, - { SWSRC_OFF, "OFF" }, - { 0, NULL } -}; -const struct YamlIdStr enum_PotsWarnMode[] = { - { POTS_WARN_OFF, "WARN_OFF" }, - { POTS_WARN_MANUAL, "WARN_MANUAL" }, - { POTS_WARN_AUTO, "WARN_AUTO" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModelOverridableEnable[] = { - { OVERRIDE_GLOBAL, "GLOBAL" }, - { OVERRIDE_OFF, "OFF" }, - { OVERRIDE_ON, "ON" }, - { 0, NULL } -}; -const struct YamlIdStr enum_FailsafeModes[] = { - { FAILSAFE_NOT_SET, "NOT_SET" }, - { FAILSAFE_HOLD, "HOLD" }, - { FAILSAFE_CUSTOM, "CUSTOM" }, - { FAILSAFE_NOPULSES, "NOPULSES" }, - { FAILSAFE_RECEIVER, "RECEIVER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorFormula[] = { - { TELEM_FORMULA_ADD, "FORMULA_ADD" }, - { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, - { TELEM_FORMULA_MIN, "FORMULA_MIN" }, - { TELEM_FORMULA_MAX, "FORMULA_MAX" }, - { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, - { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, - { TELEM_FORMULA_CELL, "FORMULA_CELL" }, - { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, - { TELEM_FORMULA_DIST, "FORMULA_DIST" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorType[] = { - { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, - { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickIfMode[] = { - { USBJOYS_JOYSTICK, "JOYSTICK" }, - { USBJOYS_GAMEPAD, "GAMEPAD" }, - { USBJOYS_MULTIAXIS, "MULTIAXIS" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickCh[] = { - { USBJOYS_CH_NONE, "CH_NONE" }, - { USBJOYS_CH_BUTTON, "CH_BUTTON" }, - { USBJOYS_CH_AXIS, "CH_AXIS" }, - { USBJOYS_CH_SIM, "CH_SIM" }, - { 0, NULL } -}; - -// -// Structs last -// - -static const struct YamlNode struct_CalibData[] = { - YAML_IDX_CUST("calib",r_calib,w_calib), - YAML_SIGNED( "mid", 16 ), - YAML_SIGNED( "spanNeg", 16 ), - YAML_SIGNED( "spanPos", 16 ), - YAML_END -}; -static const struct YamlNode struct_signed_16[] = { - YAML_IDX, - YAML_SIGNED( "val", 16 ), - YAML_END -}; -static const struct YamlNode struct_TrainerMix[] = { - YAML_IDX, - YAML_UNSIGNED( "srcChn", 6 ), - YAML_ENUM("mode", 2, enum_TrainerMultiplex), - YAML_SIGNED( "studWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_TrainerData[] = { - YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), - YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_1[] = { - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_anonymous_2[] = { - YAML_SIGNED( "val", 16 ), - YAML_UNSIGNED( "mode", 8 ), - YAML_UNSIGNED( "param", 8 ), - YAML_SIGNED( "spare", 32 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_3[] = { - YAML_SIGNED( "val1", 32 ), - YAML_SIGNED( "val2", 32 ), - YAML_END -}; -static const struct YamlNode union_anonymous_0_elmts[] = { - YAML_STRUCT("play", 48, struct_anonymous_1, NULL), - YAML_STRUCT("all", 64, struct_anonymous_2, NULL), - YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), - YAML_END -}; -static const struct YamlNode struct_CustomFunctionData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), - YAML_CUSTOM("def",r_customFn,w_customFn), - YAML_PADDING( 64 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; -static const struct YamlNode struct_RadioData[] = { - YAML_UNSIGNED( "manuallyEdited", 1 ), - YAML_PADDING( 7 ), - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_PADDING( 16 ), - YAML_SIGNED( "currModel", 8 ), - YAML_UNSIGNED( "contrast", 8 ), - YAML_UNSIGNED( "vBatWarn", 8 ), - YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_ENUM("backlightMode", 3, enum_BacklightMode), - YAML_ENUM("antennaMode", 2, enum_AntennaModes), - YAML_UNSIGNED( "disableRtcWarning", 1 ), - YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), - YAML_ENUM("internalModule", 8, enum_ModuleType), - YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), - YAML_UNSIGNED( "alarmsFlash", 1 ), - YAML_UNSIGNED( "disableMemoryWarning", 1 ), - YAML_UNSIGNED( "disableAlarmWarning", 1 ), - YAML_UNSIGNED( "stickMode", 2 ), - YAML_SIGNED( "timezone", 5 ), - YAML_UNSIGNED( "adjustRTC", 1 ), - YAML_UNSIGNED( "inactivityTimer", 8 ), - YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr), - YAML_UNSIGNED( "internalModuleBaudrate", 3 ), - YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), - YAML_SIGNED( "switchesDelay", 8 ), - YAML_UNSIGNED( "lightAutoOff", 8 ), - YAML_UNSIGNED( "templateSetup", 8 ), - YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), - YAML_UNSIGNED( "gpsFormat", 1 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), - YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), - YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), - YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), - YAML_UNSIGNED( "backlightBright", 8 ), - YAML_UNSIGNED( "globalTimer", 32 ), - YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), - YAML_UNSIGNED( "countryCode", 2 ), - YAML_SIGNED( "pwrOnSpeed", 3 ), - YAML_SIGNED( "pwrOffSpeed", 3 ), - YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr), - YAML_UNSIGNED( "noJitterFilter", 1 ), - YAML_UNSIGNED( "imperial", 1 ), - YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), - YAML_UNSIGNED( "USBMode", 2 ), - YAML_UNSIGNED( "jackMode", 2 ), - YAML_PADDING( 1 ), - YAML_STRING("ttsLanguage", 2), - YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), - YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), - YAML_SIGNED( "varioRepeat", 8 ), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), - YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), - YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), - YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 192 ), - YAML_PADDING( 144 ), - YAML_PADDING( 8 ), - YAML_STRING("bluetoothName", 10), - YAML_STRING("ownerRegistrationID", 8), - YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), - YAML_UNSIGNED( "rotEncMode", 2 ), - YAML_SIGNED( "uartSampleMode", 2 ), - YAML_PADDING( 3 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "radioGFDisabled", 1 ), - YAML_UNSIGNED( "radioTrainerDisabled", 1 ), - YAML_UNSIGNED( "modelHeliDisabled", 1 ), - YAML_UNSIGNED( "modelFMDisabled", 1 ), - YAML_UNSIGNED( "modelCurvesDisabled", 1 ), - YAML_UNSIGNED( "modelGVDisabled", 1 ), - YAML_UNSIGNED( "modelLSDisabled", 1 ), - YAML_UNSIGNED( "modelSFDisabled", 1 ), - YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ), - YAML_UNSIGNED( "modelTelemetryDisabled", 1 ), - YAML_END -}; -static const struct YamlNode struct_unsigned_8[] = { - YAML_IDX, - YAML_UNSIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_ModelHeader[] = { - YAML_STRING("name", 10), - YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_TimerData[] = { - YAML_IDX, - YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), - YAML_SIGNED( "value", 22 ), - YAML_ENUM("mode", 3, enum_TimerModes), - YAML_UNSIGNED( "countdownBeep", 2 ), - YAML_UNSIGNED( "minuteBeep", 1 ), - YAML_UNSIGNED( "persistent", 2 ), - YAML_SIGNED( "countdownStart", 2 ), - YAML_UNSIGNED( "showElapsed", 1 ), - YAML_UNSIGNED( "extraHaptic", 1 ), - YAML_PADDING( 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_CurveRef[] = { - YAML_UNSIGNED( "type", 8 ), - YAML_SIGNED_CUST( "value", 8, in_read_weight, in_write_weight ), - YAML_END -}; -static const struct YamlNode struct_MixData[] = { - YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "destCh", 5 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "carryTrim", 1 ), - YAML_UNSIGNED( "mixWarn", 2 ), - YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_UNSIGNED( "delayUp", 8 ), - YAML_UNSIGNED( "delayDown", 8 ), - YAML_UNSIGNED( "speedUp", 8 ), - YAML_UNSIGNED( "speedDown", 8 ), - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_LimitData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ), - YAML_SIGNED( "ppmCenter", 10 ), - YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "symetrical", 1 ), - YAML_UNSIGNED( "revert", 1 ), - YAML_PADDING( 3 ), - YAML_SIGNED( "curve", 8 ), - YAML_STRING("name", 4), - YAML_END -}; -static const struct YamlNode struct_ExpoData[] = { - YAML_UNSIGNED( "mode", 2 ), - YAML_UNSIGNED( "scale", 14 ), - YAML_CUSTOM("carryTrim",r_carryTrim,nullptr), - YAML_SIGNED( "trimSource", 6 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_END -}; -static const struct YamlNode struct_CurveHeader[] = { - YAML_IDX, - YAML_UNSIGNED( "type", 1 ), - YAML_UNSIGNED( "smooth", 1 ), - YAML_SIGNED( "points", 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_signed_8[] = { - YAML_IDX, - YAML_SIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_LogicalSwitchData[] = { - YAML_IDX, - YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_CUSTOM("def",r_logicSw,w_logicSw), - YAML_PADDING( 10 ), - YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 1 ), - YAML_PADDING( 2 ), - YAML_PADDING( 16 ), - YAML_UNSIGNED( "delay", 8 ), - YAML_UNSIGNED( "duration", 8 ), - YAML_END -}; -static const struct YamlNode struct_SwashRingData[] = { - YAML_ENUM("type", 8, enum_SwashType), - YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "collectiveWeight", 8 ), - YAML_SIGNED( "aileronWeight", 8 ), - YAML_SIGNED( "elevatorWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_trim_t[] = { - YAML_IDX, - YAML_SIGNED( "value", 11 ), - YAML_UNSIGNED( "mode", 5 ), - YAML_END -}; -static const struct YamlNode struct_FlightModeData[] = { - YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), - YAML_UNSIGNED( "fadeIn", 8 ), - YAML_UNSIGNED( "fadeOut", 8 ), - YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), - YAML_END -}; -static const struct YamlNode struct_GVarData[] = { - YAML_IDX, - YAML_STRING("name", 3), - YAML_UNSIGNED( "min", 12 ), - YAML_UNSIGNED( "max", 12 ), - YAML_UNSIGNED( "popup", 1 ), - YAML_UNSIGNED( "prec", 1 ), - YAML_UNSIGNED( "unit", 2 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), - YAML_UNSIGNED( "centerSilent", 1 ), - YAML_SIGNED( "centerMax", 8 ), - YAML_SIGNED( "centerMin", 8 ), - YAML_SIGNED( "min", 8 ), - YAML_SIGNED( "max", 8 ), - YAML_END -}; -static const struct YamlNode struct_RssiAlarmData[] = { - YAML_CUSTOM("disabled",r_rssiDisabled,nullptr), - YAML_CUSTOM("warning",r_rssiWarning,nullptr), - YAML_CUSTOM("critical",r_rssiCritical,nullptr), - YAML_END -}; -static const struct YamlNode struct_RFAlarmData[] = { - YAML_SIGNED( "warning", 8 ), - YAML_SIGNED( "critical", 8 ), - YAML_END -}; -static const struct YamlNode struct_PpmModule[] = { - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_UNSIGNED( "outputType", 1 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_5[] = { - YAML_PADDING( 8 ), - YAML_UNSIGNED( "disableTelemetry", 1 ), - YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "autoBindMode", 1 ), - YAML_UNSIGNED( "lowPowerMode", 1 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_PADDING( 2 ), - YAML_SIGNED( "optionValue", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "power", 2 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_SIGNED( "antennaMode", 2 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_7[] = { - YAML_PADDING( 6 ), - YAML_UNSIGNED( "noninverted", 1 ), - YAML_PADDING( 1 ), - YAML_SIGNED( "refreshRate", 8 ), - YAML_END -}; -static const struct YamlNode struct_string_64[] = { - YAML_IDX, - YAML_STRING("val", 8), - YAML_END -}; -static const struct YamlNode struct_anonymous_8[] = { - YAML_UNSIGNED( "receivers", 7 ), - YAML_UNSIGNED( "racingMode", 1 ), - YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_9[] = { - YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), - YAML_UNSIGNED( "mode", 3 ), - YAML_UNSIGNED( "rfPower", 1 ), - YAML_UNSIGNED( "reserved", 4 ), - YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_10[] = { - YAML_UNSIGNED( "emi", 2 ), - YAML_UNSIGNED( "telemetry", 1 ), - YAML_UNSIGNED( "phyMode", 3 ), - YAML_UNSIGNED( "reserved", 2 ), - YAML_UNSIGNED( "rfPower", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_11[] = { - YAML_UNSIGNED( "raw12bits", 1 ), - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_12[] = { - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_13[] = { - YAML_UNSIGNED( "flags", 8 ), - YAML_END -}; -static const struct YamlNode union_anonymous_4_elmts[] = { - YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), - YAML_STRUCT("ppm", 16, struct_PpmModule, NULL), - YAML_STRUCT("multi", 24, struct_anonymous_5, NULL), - YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL), - YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL), - YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL), - YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), - YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), - YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), - YAML_END -}; -static const struct YamlNode struct_ModuleData[] = { - YAML_IDX, - YAML_ENUM("type", 8, enum_ModuleType), - YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), - YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), - YAML_PADDING( 4 ), - YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), - YAML_END -}; -static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_PADDING( 1 ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput_elmts[] = { - YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput[] = { - YAML_IDX, - YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), - YAML_END -}; -static const struct YamlNode struct_ScriptData[] = { - YAML_IDX, - YAML_STRING("file", 6), - YAML_STRING("name", 6), - YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), - YAML_END -}; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_UNSIGNED( "id", 16 ), - YAML_UNSIGNED( "persistentValue", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_16[] = { - YAML_UNSIGNED( "physID", 5 ), - YAML_UNSIGNED( "rxIndex", 3 ), - YAML_END -}; -static const struct YamlNode union_anonymous_15_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL), - YAML_UNSIGNED( "instance", 8 ), - YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), - YAML_END -}; -static const struct YamlNode struct_anonymous_18[] = { - YAML_UNSIGNED( "ratio", 16 ), - YAML_SIGNED( "offset", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_19[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_UNSIGNED( "index", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_20[] = { - YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_21[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_PADDING( 24 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_22[] = { - YAML_UNSIGNED( "gps", 8 ), - YAML_UNSIGNED( "alt", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode union_anonymous_17_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_18, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_19, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_20, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_22, NULL), - YAML_UNSIGNED( "param", 32 ), - YAML_END -}; -static const struct YamlNode struct_TelemetrySensor[] = { - YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2), - YAML_STRING("label", 4), - YAML_UNSIGNED( "subId", 8 ), - YAML_ENUM("type", 1, enum_TelemetrySensorType), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "unit", 6 ), - YAML_UNSIGNED( "prec", 2 ), - YAML_UNSIGNED( "autoOffset", 1 ), - YAML_UNSIGNED( "filter", 1 ), - YAML_UNSIGNED( "logs", 1 ), - YAML_UNSIGNED( "persistent", 1 ), - YAML_UNSIGNED( "onlyPositive", 1 ), - YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg), - YAML_END -}; -static const struct YamlNode struct_FrSkyBarData[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "barMin", 16 ), - YAML_SIGNED( "barMax", 16 ), - YAML_END -}; -static const struct YamlNode struct_LineDataSource[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode struct_FrSkyLineData[] = { - YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScriptData[] = { - YAML_STRING("file", 6), - YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), - YAML_END -}; -static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { - YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), - YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), - YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScreenData[] = { - YAML_IDX, - YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), - YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), - YAML_END -}; -static const struct YamlNode struct_USBJoystickChData[] = { - YAML_IDX, - YAML_ENUM("mode", 3, enum_USBJoystickCh), - YAML_UNSIGNED( "inversion", 1 ), - YAML_UNSIGNED( "param", 4 ), - YAML_UNSIGNED( "btn_num", 5 ), - YAML_UNSIGNED( "switch_npos", 3 ), - YAML_END -}; -static const struct YamlNode struct_ModelData[] = { - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_UNSIGNED( "telemetryProtocol", 3 ), - YAML_UNSIGNED( "thrTrim", 1 ), - YAML_UNSIGNED( "noGlobalFunctions", 1 ), - YAML_UNSIGNED( "displayTrims", 2 ), - YAML_UNSIGNED( "ignoreSensorIds", 1 ), - YAML_SIGNED( "trimInc", 3 ), - YAML_UNSIGNED( "disableThrottleWarning", 1 ), - YAML_UNSIGNED( "displayChecklist", 1 ), - YAML_UNSIGNED( "extendedLimits", 1 ), - YAML_UNSIGNED( "extendedTrims", 1 ), - YAML_UNSIGNED( "throttleReversed", 1 ), - YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ), - YAML_UNSIGNED( "disableTelemetryWarning", 1 ), - YAML_UNSIGNED( "showInstanceIds", 1 ), - YAML_PADDING( 5 ), - YAML_SIGNED( "customThrottleWarningPosition", 8 ), - YAML_UNSIGNED( "beepANACenter", 16 ), - YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), - YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), - YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), - YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), - YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), - YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), - YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), - YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), - YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), - YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL), - YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL), - YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), - YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable), - YAML_PADDING( 1 ), - YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), - YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), - YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), - YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), - YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), - YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_PADDING( 8 ), - YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_STRING("modelRegistrationID", 8), - YAML_UNSIGNED( "usbJoystickExtMode", 1 ), - YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode), - YAML_UNSIGNED( "usbJoystickCircularCut", 4 ), - YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL), - YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable), - YAML_END -}; -static const struct YamlNode struct_PartialModel[] = { - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_END -}; - -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29 - -static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); - -const YamlNode* get_radiodata_nodes() -{ - return &__RadioData_root_node; -} -static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); - -const YamlNode* get_modeldata_nodes() -{ - return &__ModelData_root_node; -} -static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); - -const YamlNode* get_partialmodel_nodes() -{ - return &__PartialModel_root_node; -} - diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index 0bba48ce7..f1bbb11fe 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -72,9 +72,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_PLAY_SOUND, "PLAY_SOUND" }, { FUNC_PLAY_TRACK, "PLAY_TRACK" }, { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, { FUNC_VARIO, "VARIO" }, @@ -102,54 +100,16 @@ const struct YamlIdStr enum_MixerMultiplex[] = { }; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, { MIXSRC_TrimRud, "TrimRud" }, { MIXSRC_TrimEle, "TrimEle" }, { MIXSRC_TrimThr, "TrimThr" }, { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SG, "SG" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SI, "SI" }, - { MIXSRC_SJ, "SJ" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TrimT5, "TrimT5" }, + { MIXSRC_TrimT6, "TrimT6" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, { 0, NULL } }; const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { @@ -184,46 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, { SWSRC_ON, "ON" }, { SWSRC_ONE, "ONE" }, { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, @@ -334,24 +254,19 @@ static const struct YamlNode union_anonymous_0_elmts[] = { }; static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 6, enum_Functions), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), YAML_END }; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "manuallyEdited", 1 ), YAML_PADDING( 7 ), YAML_CUSTOM("semver",nullptr,w_semver), YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL), YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), @@ -418,14 +333,11 @@ static const struct YamlNode struct_RadioData[] = { YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_ARRAY("sticksConfig", 0, MAX_STICKS, struct_stickConfig, stick_name_valid), + YAML_ARRAY("slidersConfig", 0, MAX_POTS, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 4, 8, struct_potConfig, nullptr), + YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 96 ), - YAML_PADDING( 144 ), YAML_STRING("ownerRegistrationID", 8), YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), YAML_UNSIGNED( "rotEncMode", 2 ), @@ -483,8 +395,8 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), @@ -514,10 +426,9 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "trimSource", 6 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), YAML_STRING("name", 6), YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), @@ -542,9 +453,9 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_CUSTOM("def",r_logicSw,w_logicSw), YAML_PADDING( 10 ), YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "andsw", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 1 ), - YAML_PADDING( 2 ), YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), @@ -569,10 +480,10 @@ static const struct YamlNode struct_trim_t[] = { }; static const struct YamlNode struct_FlightModeData[] = { YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_ARRAY("trim", 16, 6, struct_trim_t, NULL), YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "fadeIn", 8 ), YAML_UNSIGNED( "fadeOut", 8 ), YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), @@ -737,6 +648,11 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; static const struct YamlNode union_anonymous_14_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), @@ -879,10 +795,10 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), + YAML_PADDING( 64 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), @@ -897,8 +813,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 8, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), YAML_PADDING( 8 ), YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp deleted file mode 100644 index 731459f2c..000000000 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ /dev/null @@ -1,943 +0,0 @@ -// generated by generate_yaml.py - -// -// Enums first -// - -const struct YamlIdStr enum_BacklightMode[] = { - { e_backlight_mode_off, "backlight_mode_off" }, - { e_backlight_mode_keys, "backlight_mode_keys" }, - { e_backlight_mode_sticks, "backlight_mode_sticks" }, - { e_backlight_mode_all, "backlight_mode_all" }, - { e_backlight_mode_on, "backlight_mode_on" }, - { 0, NULL } -}; -const struct YamlIdStr enum_AntennaModes[] = { - { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, - { ANTENNA_MODE_ASK, "MODE_ASK" }, - { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, - { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModuleType[] = { - { MODULE_TYPE_NONE, "TYPE_NONE" }, - { MODULE_TYPE_PPM, "TYPE_PPM" }, - { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, - { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, - { MODULE_TYPE_DSM2, "TYPE_DSM2" }, - { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, - { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, - { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, - { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, - { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, - { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, - { MODULE_TYPE_GHOST, "TYPE_GHOST" }, - { MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" }, - { MODULE_TYPE_SBUS, "TYPE_SBUS" }, - { MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" }, - { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, - { MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TrainerMultiplex[] = { - { TRAINER_OFF, "OFF" }, - { TRAINER_ADD, "ADD" }, - { TRAINER_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BeeperMode[] = { - { e_mode_quiet, "mode_quiet" }, - { e_mode_alarms, "mode_alarms" }, - { e_mode_nokeys, "mode_nokeys" }, - { e_mode_all, "mode_all" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BluetoothModes[] = { - { BLUETOOTH_OFF, "OFF" }, - { BLUETOOTH_TELEMETRY, "TELEMETRY" }, - { BLUETOOTH_TRAINER, "TRAINER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_Functions[] = { - { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, - { FUNC_TRAINER, "TRAINER" }, - { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, - { FUNC_RESET, "RESET" }, - { FUNC_SET_TIMER, "SET_TIMER" }, - { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, - { FUNC_VOLUME, "VOLUME" }, - { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, - { FUNC_RANGECHECK, "RANGECHECK" }, - { FUNC_BIND, "BIND" }, - { FUNC_PLAY_SOUND, "PLAY_SOUND" }, - { FUNC_PLAY_TRACK, "PLAY_TRACK" }, - { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, - { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, - { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, - { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, - { FUNC_VARIO, "VARIO" }, - { FUNC_HAPTIC, "HAPTIC" }, - { FUNC_LOGS, "LOGS" }, - { FUNC_BACKLIGHT, "BACKLIGHT" }, - { FUNC_SCREENSHOT, "SCREENSHOT" }, - { FUNC_RACING_MODE, "RACING_MODE" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TimerModes[] = { - { TMRMODE_OFF, "OFF" }, - { TMRMODE_ON, "ON" }, - { TMRMODE_START, "START" }, - { TMRMODE_THR, "THR" }, - { TMRMODE_THR_REL, "THR_REL" }, - { TMRMODE_THR_START, "THR_START" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixerMultiplex[] = { - { MLTPX_ADD, "ADD" }, - { MLTPX_MUL, "MUL" }, - { MLTPX_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixSources[] = { - { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, - { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, - { MIXSRC_TrimRud, "TrimRud" }, - { MIXSRC_TrimEle, "TrimEle" }, - { MIXSRC_TrimThr, "TrimThr" }, - { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SI, "SI" }, - { MIXSRC_SJ, "SJ" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, - { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, - { MIXSRC_TX_TIME, "TX_TIME" }, - { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, - { 0, NULL } -}; -const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { - { LS_FUNC_NONE, "FUNC_NONE" }, - { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, - { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, - { LS_FUNC_VPOS, "FUNC_VPOS" }, - { LS_FUNC_VNEG, "FUNC_VNEG" }, - { LS_FUNC_RANGE, "FUNC_RANGE" }, - { LS_FUNC_APOS, "FUNC_APOS" }, - { LS_FUNC_ANEG, "FUNC_ANEG" }, - { LS_FUNC_AND, "FUNC_AND" }, - { LS_FUNC_OR, "FUNC_OR" }, - { LS_FUNC_XOR, "FUNC_XOR" }, - { LS_FUNC_EDGE, "FUNC_EDGE" }, - { LS_FUNC_EQUAL, "FUNC_EQUAL" }, - { LS_FUNC_GREATER, "FUNC_GREATER" }, - { LS_FUNC_LESS, "FUNC_LESS" }, - { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, - { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, - { LS_FUNC_TIMER, "FUNC_TIMER" }, - { LS_FUNC_STICKY, "FUNC_STICKY" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwashType[] = { - { SWASH_TYPE_NONE, "TYPE_NONE" }, - { SWASH_TYPE_120, "TYPE_120" }, - { SWASH_TYPE_120X, "TYPE_120X" }, - { SWASH_TYPE_140, "TYPE_140" }, - { SWASH_TYPE_90, "TYPE_90" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwitchSources[] = { - { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, - { SWSRC_ON, "ON" }, - { SWSRC_ONE, "ONE" }, - { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, - { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, - { SWSRC_OFF, "OFF" }, - { 0, NULL } -}; -const struct YamlIdStr enum_PotsWarnMode[] = { - { POTS_WARN_OFF, "WARN_OFF" }, - { POTS_WARN_MANUAL, "WARN_MANUAL" }, - { POTS_WARN_AUTO, "WARN_AUTO" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModelOverridableEnable[] = { - { OVERRIDE_GLOBAL, "GLOBAL" }, - { OVERRIDE_OFF, "OFF" }, - { OVERRIDE_ON, "ON" }, - { 0, NULL } -}; -const struct YamlIdStr enum_FailsafeModes[] = { - { FAILSAFE_NOT_SET, "NOT_SET" }, - { FAILSAFE_HOLD, "HOLD" }, - { FAILSAFE_CUSTOM, "CUSTOM" }, - { FAILSAFE_NOPULSES, "NOPULSES" }, - { FAILSAFE_RECEIVER, "RECEIVER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorFormula[] = { - { TELEM_FORMULA_ADD, "FORMULA_ADD" }, - { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, - { TELEM_FORMULA_MIN, "FORMULA_MIN" }, - { TELEM_FORMULA_MAX, "FORMULA_MAX" }, - { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, - { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, - { TELEM_FORMULA_CELL, "FORMULA_CELL" }, - { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, - { TELEM_FORMULA_DIST, "FORMULA_DIST" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorType[] = { - { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, - { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickIfMode[] = { - { USBJOYS_JOYSTICK, "JOYSTICK" }, - { USBJOYS_GAMEPAD, "GAMEPAD" }, - { USBJOYS_MULTIAXIS, "MULTIAXIS" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickCh[] = { - { USBJOYS_CH_NONE, "CH_NONE" }, - { USBJOYS_CH_BUTTON, "CH_BUTTON" }, - { USBJOYS_CH_AXIS, "CH_AXIS" }, - { USBJOYS_CH_SIM, "CH_SIM" }, - { 0, NULL } -}; - -// -// Structs last -// - -static const struct YamlNode struct_CalibData[] = { - YAML_IDX_CUST("calib",r_calib,w_calib), - YAML_SIGNED( "mid", 16 ), - YAML_SIGNED( "spanNeg", 16 ), - YAML_SIGNED( "spanPos", 16 ), - YAML_END -}; -static const struct YamlNode struct_signed_16[] = { - YAML_IDX, - YAML_SIGNED( "val", 16 ), - YAML_END -}; -static const struct YamlNode struct_TrainerMix[] = { - YAML_IDX, - YAML_UNSIGNED( "srcChn", 6 ), - YAML_ENUM("mode", 2, enum_TrainerMultiplex), - YAML_SIGNED( "studWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_TrainerData[] = { - YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), - YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_1[] = { - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_anonymous_2[] = { - YAML_SIGNED( "val", 16 ), - YAML_UNSIGNED( "mode", 8 ), - YAML_UNSIGNED( "param", 8 ), - YAML_SIGNED( "spare", 32 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_3[] = { - YAML_SIGNED( "val1", 32 ), - YAML_SIGNED( "val2", 32 ), - YAML_END -}; -static const struct YamlNode union_anonymous_0_elmts[] = { - YAML_STRUCT("play", 48, struct_anonymous_1, NULL), - YAML_STRUCT("all", 64, struct_anonymous_2, NULL), - YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), - YAML_END -}; -static const struct YamlNode struct_CustomFunctionData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), - YAML_CUSTOM("def",r_customFn,w_customFn), - YAML_PADDING( 64 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; -static const struct YamlNode struct_RadioData[] = { - YAML_UNSIGNED( "manuallyEdited", 1 ), - YAML_PADDING( 7 ), - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_PADDING( 16 ), - YAML_SIGNED( "currModel", 8 ), - YAML_UNSIGNED( "contrast", 8 ), - YAML_UNSIGNED( "vBatWarn", 8 ), - YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_ENUM("backlightMode", 3, enum_BacklightMode), - YAML_ENUM("antennaMode", 2, enum_AntennaModes), - YAML_UNSIGNED( "disableRtcWarning", 1 ), - YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), - YAML_ENUM("internalModule", 8, enum_ModuleType), - YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), - YAML_UNSIGNED( "alarmsFlash", 1 ), - YAML_UNSIGNED( "disableMemoryWarning", 1 ), - YAML_UNSIGNED( "disableAlarmWarning", 1 ), - YAML_UNSIGNED( "stickMode", 2 ), - YAML_SIGNED( "timezone", 5 ), - YAML_UNSIGNED( "adjustRTC", 1 ), - YAML_UNSIGNED( "inactivityTimer", 8 ), - YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr), - YAML_UNSIGNED( "internalModuleBaudrate", 3 ), - YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), - YAML_SIGNED( "switchesDelay", 8 ), - YAML_UNSIGNED( "lightAutoOff", 8 ), - YAML_UNSIGNED( "templateSetup", 8 ), - YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), - YAML_UNSIGNED( "gpsFormat", 1 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), - YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), - YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), - YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), - YAML_UNSIGNED( "backlightBright", 8 ), - YAML_UNSIGNED( "globalTimer", 32 ), - YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), - YAML_UNSIGNED( "countryCode", 2 ), - YAML_SIGNED( "pwrOnSpeed", 3 ), - YAML_SIGNED( "pwrOffSpeed", 3 ), - YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr), - YAML_UNSIGNED( "noJitterFilter", 1 ), - YAML_UNSIGNED( "imperial", 1 ), - YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), - YAML_UNSIGNED( "USBMode", 2 ), - YAML_UNSIGNED( "jackMode", 2 ), - YAML_PADDING( 1 ), - YAML_STRING("ttsLanguage", 2), - YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), - YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), - YAML_SIGNED( "varioRepeat", 8 ), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), - YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), - YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), - YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 192 ), - YAML_PADDING( 144 ), - YAML_PADDING( 8 ), - YAML_STRING("bluetoothName", 10), - YAML_STRING("ownerRegistrationID", 8), - YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), - YAML_UNSIGNED( "rotEncMode", 2 ), - YAML_SIGNED( "uartSampleMode", 2 ), - YAML_PADDING( 3 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "radioGFDisabled", 1 ), - YAML_UNSIGNED( "radioTrainerDisabled", 1 ), - YAML_UNSIGNED( "modelHeliDisabled", 1 ), - YAML_UNSIGNED( "modelFMDisabled", 1 ), - YAML_UNSIGNED( "modelCurvesDisabled", 1 ), - YAML_UNSIGNED( "modelGVDisabled", 1 ), - YAML_UNSIGNED( "modelLSDisabled", 1 ), - YAML_UNSIGNED( "modelSFDisabled", 1 ), - YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ), - YAML_UNSIGNED( "modelTelemetryDisabled", 1 ), - YAML_END -}; -static const struct YamlNode struct_unsigned_8[] = { - YAML_IDX, - YAML_UNSIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_ModelHeader[] = { - YAML_STRING("name", 10), - YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_TimerData[] = { - YAML_IDX, - YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), - YAML_SIGNED( "value", 22 ), - YAML_ENUM("mode", 3, enum_TimerModes), - YAML_UNSIGNED( "countdownBeep", 2 ), - YAML_UNSIGNED( "minuteBeep", 1 ), - YAML_UNSIGNED( "persistent", 2 ), - YAML_SIGNED( "countdownStart", 2 ), - YAML_UNSIGNED( "showElapsed", 1 ), - YAML_UNSIGNED( "extraHaptic", 1 ), - YAML_PADDING( 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_CurveRef[] = { - YAML_UNSIGNED( "type", 8 ), - YAML_SIGNED_CUST( "value", 8, in_read_weight, in_write_weight ), - YAML_END -}; -static const struct YamlNode struct_MixData[] = { - YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "destCh", 5 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "carryTrim", 1 ), - YAML_UNSIGNED( "mixWarn", 2 ), - YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_UNSIGNED( "delayUp", 8 ), - YAML_UNSIGNED( "delayDown", 8 ), - YAML_UNSIGNED( "speedUp", 8 ), - YAML_UNSIGNED( "speedDown", 8 ), - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_LimitData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ), - YAML_SIGNED( "ppmCenter", 10 ), - YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "symetrical", 1 ), - YAML_UNSIGNED( "revert", 1 ), - YAML_PADDING( 3 ), - YAML_SIGNED( "curve", 8 ), - YAML_STRING("name", 4), - YAML_END -}; -static const struct YamlNode struct_ExpoData[] = { - YAML_UNSIGNED( "mode", 2 ), - YAML_UNSIGNED( "scale", 14 ), - YAML_CUSTOM("carryTrim",r_carryTrim,nullptr), - YAML_SIGNED( "trimSource", 6 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_END -}; -static const struct YamlNode struct_CurveHeader[] = { - YAML_IDX, - YAML_UNSIGNED( "type", 1 ), - YAML_UNSIGNED( "smooth", 1 ), - YAML_SIGNED( "points", 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_signed_8[] = { - YAML_IDX, - YAML_SIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_LogicalSwitchData[] = { - YAML_IDX, - YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_CUSTOM("def",r_logicSw,w_logicSw), - YAML_PADDING( 10 ), - YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 1 ), - YAML_PADDING( 2 ), - YAML_PADDING( 16 ), - YAML_UNSIGNED( "delay", 8 ), - YAML_UNSIGNED( "duration", 8 ), - YAML_END -}; -static const struct YamlNode struct_SwashRingData[] = { - YAML_ENUM("type", 8, enum_SwashType), - YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "collectiveWeight", 8 ), - YAML_SIGNED( "aileronWeight", 8 ), - YAML_SIGNED( "elevatorWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_trim_t[] = { - YAML_IDX, - YAML_SIGNED( "value", 11 ), - YAML_UNSIGNED( "mode", 5 ), - YAML_END -}; -static const struct YamlNode struct_FlightModeData[] = { - YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), - YAML_UNSIGNED( "fadeIn", 8 ), - YAML_UNSIGNED( "fadeOut", 8 ), - YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), - YAML_END -}; -static const struct YamlNode struct_GVarData[] = { - YAML_IDX, - YAML_STRING("name", 3), - YAML_UNSIGNED( "min", 12 ), - YAML_UNSIGNED( "max", 12 ), - YAML_UNSIGNED( "popup", 1 ), - YAML_UNSIGNED( "prec", 1 ), - YAML_UNSIGNED( "unit", 2 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), - YAML_UNSIGNED( "centerSilent", 1 ), - YAML_SIGNED( "centerMax", 8 ), - YAML_SIGNED( "centerMin", 8 ), - YAML_SIGNED( "min", 8 ), - YAML_SIGNED( "max", 8 ), - YAML_END -}; -static const struct YamlNode struct_RssiAlarmData[] = { - YAML_CUSTOM("disabled",r_rssiDisabled,nullptr), - YAML_CUSTOM("warning",r_rssiWarning,nullptr), - YAML_CUSTOM("critical",r_rssiCritical,nullptr), - YAML_END -}; -static const struct YamlNode struct_RFAlarmData[] = { - YAML_SIGNED( "warning", 8 ), - YAML_SIGNED( "critical", 8 ), - YAML_END -}; -static const struct YamlNode struct_PpmModule[] = { - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_UNSIGNED( "outputType", 1 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_5[] = { - YAML_PADDING( 8 ), - YAML_UNSIGNED( "disableTelemetry", 1 ), - YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "autoBindMode", 1 ), - YAML_UNSIGNED( "lowPowerMode", 1 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_PADDING( 2 ), - YAML_SIGNED( "optionValue", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "power", 2 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_SIGNED( "antennaMode", 2 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_7[] = { - YAML_PADDING( 6 ), - YAML_UNSIGNED( "noninverted", 1 ), - YAML_PADDING( 1 ), - YAML_SIGNED( "refreshRate", 8 ), - YAML_END -}; -static const struct YamlNode struct_string_64[] = { - YAML_IDX, - YAML_STRING("val", 8), - YAML_END -}; -static const struct YamlNode struct_anonymous_8[] = { - YAML_UNSIGNED( "receivers", 7 ), - YAML_UNSIGNED( "racingMode", 1 ), - YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_9[] = { - YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), - YAML_UNSIGNED( "mode", 3 ), - YAML_UNSIGNED( "rfPower", 1 ), - YAML_UNSIGNED( "reserved", 4 ), - YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_10[] = { - YAML_UNSIGNED( "emi", 2 ), - YAML_UNSIGNED( "telemetry", 1 ), - YAML_UNSIGNED( "phyMode", 3 ), - YAML_UNSIGNED( "reserved", 2 ), - YAML_UNSIGNED( "rfPower", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_11[] = { - YAML_UNSIGNED( "raw12bits", 1 ), - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_12[] = { - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_13[] = { - YAML_UNSIGNED( "flags", 8 ), - YAML_END -}; -static const struct YamlNode union_anonymous_4_elmts[] = { - YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), - YAML_STRUCT("ppm", 16, struct_PpmModule, NULL), - YAML_STRUCT("multi", 24, struct_anonymous_5, NULL), - YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL), - YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL), - YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL), - YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), - YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), - YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), - YAML_END -}; -static const struct YamlNode struct_ModuleData[] = { - YAML_IDX, - YAML_ENUM("type", 8, enum_ModuleType), - YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), - YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), - YAML_PADDING( 4 ), - YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), - YAML_END -}; -static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_PADDING( 1 ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput_elmts[] = { - YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput[] = { - YAML_IDX, - YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), - YAML_END -}; -static const struct YamlNode struct_ScriptData[] = { - YAML_IDX, - YAML_STRING("file", 6), - YAML_STRING("name", 6), - YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), - YAML_END -}; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_UNSIGNED( "id", 16 ), - YAML_UNSIGNED( "persistentValue", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_16[] = { - YAML_UNSIGNED( "physID", 5 ), - YAML_UNSIGNED( "rxIndex", 3 ), - YAML_END -}; -static const struct YamlNode union_anonymous_15_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL), - YAML_UNSIGNED( "instance", 8 ), - YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), - YAML_END -}; -static const struct YamlNode struct_anonymous_18[] = { - YAML_UNSIGNED( "ratio", 16 ), - YAML_SIGNED( "offset", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_19[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_UNSIGNED( "index", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_20[] = { - YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_21[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_PADDING( 24 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_22[] = { - YAML_UNSIGNED( "gps", 8 ), - YAML_UNSIGNED( "alt", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode union_anonymous_17_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_18, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_19, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_20, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_22, NULL), - YAML_UNSIGNED( "param", 32 ), - YAML_END -}; -static const struct YamlNode struct_TelemetrySensor[] = { - YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2), - YAML_STRING("label", 4), - YAML_UNSIGNED( "subId", 8 ), - YAML_ENUM("type", 1, enum_TelemetrySensorType), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "unit", 6 ), - YAML_UNSIGNED( "prec", 2 ), - YAML_UNSIGNED( "autoOffset", 1 ), - YAML_UNSIGNED( "filter", 1 ), - YAML_UNSIGNED( "logs", 1 ), - YAML_UNSIGNED( "persistent", 1 ), - YAML_UNSIGNED( "onlyPositive", 1 ), - YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg), - YAML_END -}; -static const struct YamlNode struct_FrSkyBarData[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "barMin", 16 ), - YAML_SIGNED( "barMax", 16 ), - YAML_END -}; -static const struct YamlNode struct_LineDataSource[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode struct_FrSkyLineData[] = { - YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScriptData[] = { - YAML_STRING("file", 6), - YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), - YAML_END -}; -static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { - YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), - YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), - YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScreenData[] = { - YAML_IDX, - YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), - YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), - YAML_END -}; -static const struct YamlNode struct_USBJoystickChData[] = { - YAML_IDX, - YAML_ENUM("mode", 3, enum_USBJoystickCh), - YAML_UNSIGNED( "inversion", 1 ), - YAML_UNSIGNED( "param", 4 ), - YAML_UNSIGNED( "btn_num", 5 ), - YAML_UNSIGNED( "switch_npos", 3 ), - YAML_END -}; -static const struct YamlNode struct_ModelData[] = { - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_UNSIGNED( "telemetryProtocol", 3 ), - YAML_UNSIGNED( "thrTrim", 1 ), - YAML_UNSIGNED( "noGlobalFunctions", 1 ), - YAML_UNSIGNED( "displayTrims", 2 ), - YAML_UNSIGNED( "ignoreSensorIds", 1 ), - YAML_SIGNED( "trimInc", 3 ), - YAML_UNSIGNED( "disableThrottleWarning", 1 ), - YAML_UNSIGNED( "displayChecklist", 1 ), - YAML_UNSIGNED( "extendedLimits", 1 ), - YAML_UNSIGNED( "extendedTrims", 1 ), - YAML_UNSIGNED( "throttleReversed", 1 ), - YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ), - YAML_UNSIGNED( "disableTelemetryWarning", 1 ), - YAML_UNSIGNED( "showInstanceIds", 1 ), - YAML_PADDING( 5 ), - YAML_SIGNED( "customThrottleWarningPosition", 8 ), - YAML_UNSIGNED( "beepANACenter", 16 ), - YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), - YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), - YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), - YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), - YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), - YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), - YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), - YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), - YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), - YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL), - YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL), - YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), - YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable), - YAML_PADDING( 1 ), - YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), - YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), - YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), - YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), - YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), - YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_PADDING( 8 ), - YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_STRING("modelRegistrationID", 8), - YAML_UNSIGNED( "usbJoystickExtMode", 1 ), - YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode), - YAML_UNSIGNED( "usbJoystickCircularCut", 4 ), - YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL), - YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable), - YAML_END -}; -static const struct YamlNode struct_PartialModel[] = { - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_END -}; - -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29 - -static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); - -const YamlNode* get_radiodata_nodes() -{ - return &__RadioData_root_node; -} -static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); - -const YamlNode* get_modeldata_nodes() -{ - return &__ModelData_root_node; -} -static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); - -const YamlNode* get_partialmodel_nodes() -{ - return &__PartialModel_root_node; -} - diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp deleted file mode 100755 index 0918d6f2e..000000000 --- a/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp +++ /dev/null @@ -1,943 +0,0 @@ -// generated by generate_yaml.py - -// -// Enums first -// - -const struct YamlIdStr enum_BacklightMode[] = { - { e_backlight_mode_off, "backlight_mode_off" }, - { e_backlight_mode_keys, "backlight_mode_keys" }, - { e_backlight_mode_sticks, "backlight_mode_sticks" }, - { e_backlight_mode_all, "backlight_mode_all" }, - { e_backlight_mode_on, "backlight_mode_on" }, - { 0, NULL } -}; -const struct YamlIdStr enum_AntennaModes[] = { - { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, - { ANTENNA_MODE_ASK, "MODE_ASK" }, - { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, - { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModuleType[] = { - { MODULE_TYPE_NONE, "TYPE_NONE" }, - { MODULE_TYPE_PPM, "TYPE_PPM" }, - { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, - { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, - { MODULE_TYPE_DSM2, "TYPE_DSM2" }, - { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, - { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, - { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, - { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, - { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, - { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, - { MODULE_TYPE_GHOST, "TYPE_GHOST" }, - { MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" }, - { MODULE_TYPE_SBUS, "TYPE_SBUS" }, - { MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" }, - { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, - { MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TrainerMultiplex[] = { - { TRAINER_OFF, "OFF" }, - { TRAINER_ADD, "ADD" }, - { TRAINER_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BeeperMode[] = { - { e_mode_quiet, "mode_quiet" }, - { e_mode_alarms, "mode_alarms" }, - { e_mode_nokeys, "mode_nokeys" }, - { e_mode_all, "mode_all" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BluetoothModes[] = { - { BLUETOOTH_OFF, "OFF" }, - { BLUETOOTH_TELEMETRY, "TELEMETRY" }, - { BLUETOOTH_TRAINER, "TRAINER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_Functions[] = { - { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, - { FUNC_TRAINER, "TRAINER" }, - { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, - { FUNC_RESET, "RESET" }, - { FUNC_SET_TIMER, "SET_TIMER" }, - { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, - { FUNC_VOLUME, "VOLUME" }, - { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, - { FUNC_RANGECHECK, "RANGECHECK" }, - { FUNC_BIND, "BIND" }, - { FUNC_PLAY_SOUND, "PLAY_SOUND" }, - { FUNC_PLAY_TRACK, "PLAY_TRACK" }, - { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, - { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, - { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, - { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, - { FUNC_VARIO, "VARIO" }, - { FUNC_HAPTIC, "HAPTIC" }, - { FUNC_LOGS, "LOGS" }, - { FUNC_BACKLIGHT, "BACKLIGHT" }, - { FUNC_SCREENSHOT, "SCREENSHOT" }, - { FUNC_RACING_MODE, "RACING_MODE" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TimerModes[] = { - { TMRMODE_OFF, "OFF" }, - { TMRMODE_ON, "ON" }, - { TMRMODE_START, "START" }, - { TMRMODE_THR, "THR" }, - { TMRMODE_THR_REL, "THR_REL" }, - { TMRMODE_THR_START, "THR_START" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixerMultiplex[] = { - { MLTPX_ADD, "ADD" }, - { MLTPX_MUL, "MUL" }, - { MLTPX_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixSources[] = { - { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, - { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, - { MIXSRC_TrimRud, "TrimRud" }, - { MIXSRC_TrimEle, "TrimEle" }, - { MIXSRC_TrimThr, "TrimThr" }, - { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SG, "SG" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, - { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, - { MIXSRC_TX_TIME, "TX_TIME" }, - { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, - { 0, NULL } -}; -const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { - { LS_FUNC_NONE, "FUNC_NONE" }, - { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, - { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, - { LS_FUNC_VPOS, "FUNC_VPOS" }, - { LS_FUNC_VNEG, "FUNC_VNEG" }, - { LS_FUNC_RANGE, "FUNC_RANGE" }, - { LS_FUNC_APOS, "FUNC_APOS" }, - { LS_FUNC_ANEG, "FUNC_ANEG" }, - { LS_FUNC_AND, "FUNC_AND" }, - { LS_FUNC_OR, "FUNC_OR" }, - { LS_FUNC_XOR, "FUNC_XOR" }, - { LS_FUNC_EDGE, "FUNC_EDGE" }, - { LS_FUNC_EQUAL, "FUNC_EQUAL" }, - { LS_FUNC_GREATER, "FUNC_GREATER" }, - { LS_FUNC_LESS, "FUNC_LESS" }, - { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, - { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, - { LS_FUNC_TIMER, "FUNC_TIMER" }, - { LS_FUNC_STICKY, "FUNC_STICKY" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwashType[] = { - { SWASH_TYPE_NONE, "TYPE_NONE" }, - { SWASH_TYPE_120, "TYPE_120" }, - { SWASH_TYPE_120X, "TYPE_120X" }, - { SWASH_TYPE_140, "TYPE_140" }, - { SWASH_TYPE_90, "TYPE_90" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwitchSources[] = { - { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, - { SWSRC_ON, "ON" }, - { SWSRC_ONE, "ONE" }, - { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, - { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, - { SWSRC_OFF, "OFF" }, - { 0, NULL } -}; -const struct YamlIdStr enum_PotsWarnMode[] = { - { POTS_WARN_OFF, "WARN_OFF" }, - { POTS_WARN_MANUAL, "WARN_MANUAL" }, - { POTS_WARN_AUTO, "WARN_AUTO" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModelOverridableEnable[] = { - { OVERRIDE_GLOBAL, "GLOBAL" }, - { OVERRIDE_OFF, "OFF" }, - { OVERRIDE_ON, "ON" }, - { 0, NULL } -}; -const struct YamlIdStr enum_FailsafeModes[] = { - { FAILSAFE_NOT_SET, "NOT_SET" }, - { FAILSAFE_HOLD, "HOLD" }, - { FAILSAFE_CUSTOM, "CUSTOM" }, - { FAILSAFE_NOPULSES, "NOPULSES" }, - { FAILSAFE_RECEIVER, "RECEIVER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorFormula[] = { - { TELEM_FORMULA_ADD, "FORMULA_ADD" }, - { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, - { TELEM_FORMULA_MIN, "FORMULA_MIN" }, - { TELEM_FORMULA_MAX, "FORMULA_MAX" }, - { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, - { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, - { TELEM_FORMULA_CELL, "FORMULA_CELL" }, - { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, - { TELEM_FORMULA_DIST, "FORMULA_DIST" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorType[] = { - { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, - { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickIfMode[] = { - { USBJOYS_JOYSTICK, "JOYSTICK" }, - { USBJOYS_GAMEPAD, "GAMEPAD" }, - { USBJOYS_MULTIAXIS, "MULTIAXIS" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickCh[] = { - { USBJOYS_CH_NONE, "CH_NONE" }, - { USBJOYS_CH_BUTTON, "CH_BUTTON" }, - { USBJOYS_CH_AXIS, "CH_AXIS" }, - { USBJOYS_CH_SIM, "CH_SIM" }, - { 0, NULL } -}; - -// -// Structs last -// - -static const struct YamlNode struct_CalibData[] = { - YAML_IDX_CUST("calib",r_calib,w_calib), - YAML_SIGNED( "mid", 16 ), - YAML_SIGNED( "spanNeg", 16 ), - YAML_SIGNED( "spanPos", 16 ), - YAML_END -}; -static const struct YamlNode struct_signed_16[] = { - YAML_IDX, - YAML_SIGNED( "val", 16 ), - YAML_END -}; -static const struct YamlNode struct_TrainerMix[] = { - YAML_IDX, - YAML_UNSIGNED( "srcChn", 6 ), - YAML_ENUM("mode", 2, enum_TrainerMultiplex), - YAML_SIGNED( "studWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_TrainerData[] = { - YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), - YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_1[] = { - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_anonymous_2[] = { - YAML_SIGNED( "val", 16 ), - YAML_UNSIGNED( "mode", 8 ), - YAML_UNSIGNED( "param", 8 ), - YAML_SIGNED( "spare", 32 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_3[] = { - YAML_SIGNED( "val1", 32 ), - YAML_SIGNED( "val2", 32 ), - YAML_END -}; -static const struct YamlNode union_anonymous_0_elmts[] = { - YAML_STRUCT("play", 48, struct_anonymous_1, NULL), - YAML_STRUCT("all", 64, struct_anonymous_2, NULL), - YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), - YAML_END -}; -static const struct YamlNode struct_CustomFunctionData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), - YAML_CUSTOM("def",r_customFn,w_customFn), - YAML_PADDING( 64 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; -static const struct YamlNode struct_RadioData[] = { - YAML_UNSIGNED( "manuallyEdited", 1 ), - YAML_PADDING( 7 ), - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_PADDING( 16 ), - YAML_SIGNED( "currModel", 8 ), - YAML_UNSIGNED( "contrast", 8 ), - YAML_UNSIGNED( "vBatWarn", 8 ), - YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_ENUM("backlightMode", 3, enum_BacklightMode), - YAML_ENUM("antennaMode", 2, enum_AntennaModes), - YAML_UNSIGNED( "disableRtcWarning", 1 ), - YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), - YAML_ENUM("internalModule", 8, enum_ModuleType), - YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), - YAML_UNSIGNED( "alarmsFlash", 1 ), - YAML_UNSIGNED( "disableMemoryWarning", 1 ), - YAML_UNSIGNED( "disableAlarmWarning", 1 ), - YAML_UNSIGNED( "stickMode", 2 ), - YAML_SIGNED( "timezone", 5 ), - YAML_UNSIGNED( "adjustRTC", 1 ), - YAML_UNSIGNED( "inactivityTimer", 8 ), - YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr), - YAML_UNSIGNED( "internalModuleBaudrate", 3 ), - YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), - YAML_SIGNED( "switchesDelay", 8 ), - YAML_UNSIGNED( "lightAutoOff", 8 ), - YAML_UNSIGNED( "templateSetup", 8 ), - YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), - YAML_UNSIGNED( "gpsFormat", 1 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), - YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), - YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), - YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), - YAML_UNSIGNED( "backlightBright", 8 ), - YAML_UNSIGNED( "globalTimer", 32 ), - YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), - YAML_UNSIGNED( "countryCode", 2 ), - YAML_SIGNED( "pwrOnSpeed", 3 ), - YAML_SIGNED( "pwrOffSpeed", 3 ), - YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr), - YAML_UNSIGNED( "noJitterFilter", 1 ), - YAML_UNSIGNED( "imperial", 1 ), - YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), - YAML_UNSIGNED( "USBMode", 2 ), - YAML_UNSIGNED( "jackMode", 2 ), - YAML_PADDING( 1 ), - YAML_STRING("ttsLanguage", 2), - YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), - YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), - YAML_SIGNED( "varioRepeat", 8 ), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), - YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), - YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), - YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 192 ), - YAML_PADDING( 144 ), - YAML_PADDING( 8 ), - YAML_STRING("bluetoothName", 10), - YAML_STRING("ownerRegistrationID", 8), - YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), - YAML_UNSIGNED( "rotEncMode", 2 ), - YAML_SIGNED( "uartSampleMode", 2 ), - YAML_PADDING( 3 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "radioGFDisabled", 1 ), - YAML_UNSIGNED( "radioTrainerDisabled", 1 ), - YAML_UNSIGNED( "modelHeliDisabled", 1 ), - YAML_UNSIGNED( "modelFMDisabled", 1 ), - YAML_UNSIGNED( "modelCurvesDisabled", 1 ), - YAML_UNSIGNED( "modelGVDisabled", 1 ), - YAML_UNSIGNED( "modelLSDisabled", 1 ), - YAML_UNSIGNED( "modelSFDisabled", 1 ), - YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ), - YAML_UNSIGNED( "modelTelemetryDisabled", 1 ), - YAML_END -}; -static const struct YamlNode struct_unsigned_8[] = { - YAML_IDX, - YAML_UNSIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_ModelHeader[] = { - YAML_STRING("name", 10), - YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_TimerData[] = { - YAML_IDX, - YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), - YAML_SIGNED( "value", 22 ), - YAML_ENUM("mode", 3, enum_TimerModes), - YAML_UNSIGNED( "countdownBeep", 2 ), - YAML_UNSIGNED( "minuteBeep", 1 ), - YAML_UNSIGNED( "persistent", 2 ), - YAML_SIGNED( "countdownStart", 2 ), - YAML_UNSIGNED( "showElapsed", 1 ), - YAML_UNSIGNED( "extraHaptic", 1 ), - YAML_PADDING( 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_CurveRef[] = { - YAML_UNSIGNED( "type", 8 ), - YAML_SIGNED_CUST( "value", 8, in_read_weight, in_write_weight ), - YAML_END -}; -static const struct YamlNode struct_MixData[] = { - YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "destCh", 5 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "carryTrim", 1 ), - YAML_UNSIGNED( "mixWarn", 2 ), - YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_UNSIGNED( "delayUp", 8 ), - YAML_UNSIGNED( "delayDown", 8 ), - YAML_UNSIGNED( "speedUp", 8 ), - YAML_UNSIGNED( "speedDown", 8 ), - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_LimitData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ), - YAML_SIGNED( "ppmCenter", 10 ), - YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "symetrical", 1 ), - YAML_UNSIGNED( "revert", 1 ), - YAML_PADDING( 3 ), - YAML_SIGNED( "curve", 8 ), - YAML_STRING("name", 4), - YAML_END -}; -static const struct YamlNode struct_ExpoData[] = { - YAML_UNSIGNED( "mode", 2 ), - YAML_UNSIGNED( "scale", 14 ), - YAML_CUSTOM("carryTrim",r_carryTrim,nullptr), - YAML_SIGNED( "trimSource", 6 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_END -}; -static const struct YamlNode struct_CurveHeader[] = { - YAML_IDX, - YAML_UNSIGNED( "type", 1 ), - YAML_UNSIGNED( "smooth", 1 ), - YAML_SIGNED( "points", 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_signed_8[] = { - YAML_IDX, - YAML_SIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_LogicalSwitchData[] = { - YAML_IDX, - YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_CUSTOM("def",r_logicSw,w_logicSw), - YAML_PADDING( 10 ), - YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 1 ), - YAML_PADDING( 2 ), - YAML_PADDING( 16 ), - YAML_UNSIGNED( "delay", 8 ), - YAML_UNSIGNED( "duration", 8 ), - YAML_END -}; -static const struct YamlNode struct_SwashRingData[] = { - YAML_ENUM("type", 8, enum_SwashType), - YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "collectiveWeight", 8 ), - YAML_SIGNED( "aileronWeight", 8 ), - YAML_SIGNED( "elevatorWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_trim_t[] = { - YAML_IDX, - YAML_SIGNED( "value", 11 ), - YAML_UNSIGNED( "mode", 5 ), - YAML_END -}; -static const struct YamlNode struct_FlightModeData[] = { - YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), - YAML_UNSIGNED( "fadeIn", 8 ), - YAML_UNSIGNED( "fadeOut", 8 ), - YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), - YAML_END -}; -static const struct YamlNode struct_GVarData[] = { - YAML_IDX, - YAML_STRING("name", 3), - YAML_UNSIGNED( "min", 12 ), - YAML_UNSIGNED( "max", 12 ), - YAML_UNSIGNED( "popup", 1 ), - YAML_UNSIGNED( "prec", 1 ), - YAML_UNSIGNED( "unit", 2 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), - YAML_UNSIGNED( "centerSilent", 1 ), - YAML_SIGNED( "centerMax", 8 ), - YAML_SIGNED( "centerMin", 8 ), - YAML_SIGNED( "min", 8 ), - YAML_SIGNED( "max", 8 ), - YAML_END -}; -static const struct YamlNode struct_RssiAlarmData[] = { - YAML_CUSTOM("disabled",r_rssiDisabled,nullptr), - YAML_CUSTOM("warning",r_rssiWarning,nullptr), - YAML_CUSTOM("critical",r_rssiCritical,nullptr), - YAML_END -}; -static const struct YamlNode struct_RFAlarmData[] = { - YAML_SIGNED( "warning", 8 ), - YAML_SIGNED( "critical", 8 ), - YAML_END -}; -static const struct YamlNode struct_PpmModule[] = { - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_UNSIGNED( "outputType", 1 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_5[] = { - YAML_PADDING( 8 ), - YAML_UNSIGNED( "disableTelemetry", 1 ), - YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "autoBindMode", 1 ), - YAML_UNSIGNED( "lowPowerMode", 1 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_PADDING( 2 ), - YAML_SIGNED( "optionValue", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "power", 2 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_SIGNED( "antennaMode", 2 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_7[] = { - YAML_PADDING( 6 ), - YAML_UNSIGNED( "noninverted", 1 ), - YAML_PADDING( 1 ), - YAML_SIGNED( "refreshRate", 8 ), - YAML_END -}; -static const struct YamlNode struct_string_64[] = { - YAML_IDX, - YAML_STRING("val", 8), - YAML_END -}; -static const struct YamlNode struct_anonymous_8[] = { - YAML_UNSIGNED( "receivers", 7 ), - YAML_UNSIGNED( "racingMode", 1 ), - YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_9[] = { - YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), - YAML_UNSIGNED( "mode", 3 ), - YAML_UNSIGNED( "rfPower", 1 ), - YAML_UNSIGNED( "reserved", 4 ), - YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_10[] = { - YAML_UNSIGNED( "emi", 2 ), - YAML_UNSIGNED( "telemetry", 1 ), - YAML_UNSIGNED( "phyMode", 3 ), - YAML_UNSIGNED( "reserved", 2 ), - YAML_UNSIGNED( "rfPower", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_11[] = { - YAML_UNSIGNED( "raw12bits", 1 ), - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_12[] = { - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_13[] = { - YAML_UNSIGNED( "flags", 8 ), - YAML_END -}; -static const struct YamlNode union_anonymous_4_elmts[] = { - YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), - YAML_STRUCT("ppm", 16, struct_PpmModule, NULL), - YAML_STRUCT("multi", 24, struct_anonymous_5, NULL), - YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL), - YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL), - YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL), - YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), - YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), - YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), - YAML_END -}; -static const struct YamlNode struct_ModuleData[] = { - YAML_IDX, - YAML_ENUM("type", 8, enum_ModuleType), - YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), - YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), - YAML_PADDING( 4 ), - YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), - YAML_END -}; -static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_PADDING( 1 ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput_elmts[] = { - YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput[] = { - YAML_IDX, - YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), - YAML_END -}; -static const struct YamlNode struct_ScriptData[] = { - YAML_IDX, - YAML_STRING("file", 6), - YAML_STRING("name", 6), - YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), - YAML_END -}; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_UNSIGNED( "id", 16 ), - YAML_UNSIGNED( "persistentValue", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_16[] = { - YAML_UNSIGNED( "physID", 5 ), - YAML_UNSIGNED( "rxIndex", 3 ), - YAML_END -}; -static const struct YamlNode union_anonymous_15_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL), - YAML_UNSIGNED( "instance", 8 ), - YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), - YAML_END -}; -static const struct YamlNode struct_anonymous_18[] = { - YAML_UNSIGNED( "ratio", 16 ), - YAML_SIGNED( "offset", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_19[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_UNSIGNED( "index", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_20[] = { - YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_21[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_PADDING( 24 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_22[] = { - YAML_UNSIGNED( "gps", 8 ), - YAML_UNSIGNED( "alt", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode union_anonymous_17_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_18, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_19, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_20, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_22, NULL), - YAML_UNSIGNED( "param", 32 ), - YAML_END -}; -static const struct YamlNode struct_TelemetrySensor[] = { - YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2), - YAML_STRING("label", 4), - YAML_UNSIGNED( "subId", 8 ), - YAML_ENUM("type", 1, enum_TelemetrySensorType), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "unit", 6 ), - YAML_UNSIGNED( "prec", 2 ), - YAML_UNSIGNED( "autoOffset", 1 ), - YAML_UNSIGNED( "filter", 1 ), - YAML_UNSIGNED( "logs", 1 ), - YAML_UNSIGNED( "persistent", 1 ), - YAML_UNSIGNED( "onlyPositive", 1 ), - YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg), - YAML_END -}; -static const struct YamlNode struct_FrSkyBarData[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "barMin", 16 ), - YAML_SIGNED( "barMax", 16 ), - YAML_END -}; -static const struct YamlNode struct_LineDataSource[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode struct_FrSkyLineData[] = { - YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScriptData[] = { - YAML_STRING("file", 6), - YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), - YAML_END -}; -static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { - YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), - YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), - YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScreenData[] = { - YAML_IDX, - YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), - YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), - YAML_END -}; -static const struct YamlNode struct_USBJoystickChData[] = { - YAML_IDX, - YAML_ENUM("mode", 3, enum_USBJoystickCh), - YAML_UNSIGNED( "inversion", 1 ), - YAML_UNSIGNED( "param", 4 ), - YAML_UNSIGNED( "btn_num", 5 ), - YAML_UNSIGNED( "switch_npos", 3 ), - YAML_END -}; -static const struct YamlNode struct_ModelData[] = { - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_UNSIGNED( "telemetryProtocol", 3 ), - YAML_UNSIGNED( "thrTrim", 1 ), - YAML_UNSIGNED( "noGlobalFunctions", 1 ), - YAML_UNSIGNED( "displayTrims", 2 ), - YAML_UNSIGNED( "ignoreSensorIds", 1 ), - YAML_SIGNED( "trimInc", 3 ), - YAML_UNSIGNED( "disableThrottleWarning", 1 ), - YAML_UNSIGNED( "displayChecklist", 1 ), - YAML_UNSIGNED( "extendedLimits", 1 ), - YAML_UNSIGNED( "extendedTrims", 1 ), - YAML_UNSIGNED( "throttleReversed", 1 ), - YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ), - YAML_UNSIGNED( "disableTelemetryWarning", 1 ), - YAML_UNSIGNED( "showInstanceIds", 1 ), - YAML_PADDING( 5 ), - YAML_SIGNED( "customThrottleWarningPosition", 8 ), - YAML_UNSIGNED( "beepANACenter", 16 ), - YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), - YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), - YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), - YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), - YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), - YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), - YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), - YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), - YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), - YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL), - YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL), - YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), - YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable), - YAML_PADDING( 1 ), - YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), - YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), - YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), - YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), - YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), - YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_PADDING( 8 ), - YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_STRING("modelRegistrationID", 8), - YAML_UNSIGNED( "usbJoystickExtMode", 1 ), - YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode), - YAML_UNSIGNED( "usbJoystickCircularCut", 4 ), - YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL), - YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable), - YAML_END -}; -static const struct YamlNode struct_PartialModel[] = { - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_END -}; - -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29 - -static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); - -const YamlNode* get_radiodata_nodes() -{ - return &__RadioData_root_node; -} -static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); - -const YamlNode* get_modeldata_nodes() -{ - return &__ModelData_root_node; -} -static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); - -const YamlNode* get_partialmodel_nodes() -{ - return &__PartialModel_root_node; -} - diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index d776b82d8..e716ba6a0 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -72,9 +72,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_PLAY_SOUND, "PLAY_SOUND" }, { FUNC_PLAY_TRACK, "PLAY_TRACK" }, { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, { FUNC_VARIO, "VARIO" }, @@ -113,21 +111,6 @@ const struct YamlIdStr enum_MixerMultiplex[] = { }; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_S1, "S1" }, - { MIXSRC_6POS, "6POS" }, - { MIXSRC_S2, "S2" }, - { MIXSRC_EXT1, "EXT1" }, - { MIXSRC_EXT2, "EXT2" }, - { MIXSRC_EXT3, "EXT3" }, - { MIXSRC_EXT4, "EXT4" }, - { MIXSRC_LS, "LS" }, - { MIXSRC_RS, "RS" }, - { MIXSRC_MOUSE1, "MOUSE1" }, - { MIXSRC_MOUSE2, "MOUSE2" }, { MIXSRC_TILT_X, "TILT_X" }, { MIXSRC_TILT_Y, "TILT_Y" }, { MIXSRC_SPACEMOUSE_A, "SPACEMOUSE_A" }, @@ -137,49 +120,15 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_SPACEMOUSE_E, "SPACEMOUSE_E" }, { MIXSRC_SPACEMOUSE_F, "SPACEMOUSE_F" }, { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, { MIXSRC_TrimRud, "TrimRud" }, { MIXSRC_TrimEle, "TrimEle" }, { MIXSRC_TrimThr, "TrimThr" }, { MIXSRC_TrimAil, "TrimAil" }, { MIXSRC_TrimT5, "TrimT5" }, { MIXSRC_TrimT6, "TrimT6" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SG, "SG" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SI, "SI" }, - { MIXSRC_SJ, "SJ" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, { 0, NULL } }; const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { @@ -214,50 +163,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_TrimT5Down, "TrimT5Down" }, - { SWSRC_TrimT5Up, "TrimT5Up" }, - { SWSRC_TrimT6Down, "TrimT6Down" }, - { SWSRC_TrimT6Up, "TrimT6Up" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, { SWSRC_ON, "ON" }, { SWSRC_ONE, "ONE" }, { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, @@ -368,18 +273,13 @@ static const struct YamlNode union_anonymous_0_elmts[] = { }; static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 6, enum_Functions), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 48 ), YAML_PADDING( 8 ), YAML_END }; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_UNSIGNED( "unsignedValue", 32 ), YAML_SIGNED( "signedValue", 32 ), @@ -404,7 +304,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_PADDING( 7 ), YAML_CUSTOM("semver",nullptr,w_semver), YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 17, struct_CalibData, NULL), + YAML_ARRAY("calib", 48, 22, struct_CalibData, NULL), YAML_PADDING( 16 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), @@ -469,12 +369,10 @@ static const struct YamlNode struct_RadioData[] = { YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), - YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), - YAML_PADDING( 240 ), - YAML_PADDING( 360 ), + YAML_ARRAY("sticksConfig", 0, MAX_STICKS, struct_stickConfig, stick_name_valid), + YAML_ARRAY("slidersConfig", 0, MAX_POTS, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 4, 16, struct_potConfig, nullptr), + YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), YAML_STRING("currModelFilename", 17), YAML_UNSIGNED( "modelQuickSelect", 1 ), YAML_UNSIGNED( "blOffBright", 7 ), @@ -544,8 +442,8 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), @@ -575,10 +473,9 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "trimSource", 6 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), YAML_STRING("name", 6), YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), @@ -603,9 +500,9 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_CUSTOM("def",r_logicSw,w_logicSw), YAML_PADDING( 10 ), YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "andsw", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 1 ), - YAML_PADDING( 2 ), YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), @@ -632,8 +529,8 @@ static const struct YamlNode struct_FlightModeData[] = { YAML_IDX, YAML_ARRAY("trim", 16, 6, struct_trim_t, NULL), YAML_STRING("name", 10), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "fadeIn", 8 ), YAML_UNSIGNED( "fadeOut", 8 ), YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), @@ -940,7 +837,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), + YAML_PADDING( 64 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), @@ -956,7 +853,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("scriptsData", 192, 9, struct_ScriptData, NULL), YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 11, struct_signed_8, NULL), + YAML_ARRAY("potsWarnPosition", 8, 16, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), YAML_ARRAY("screenData", 6816, 10, struct_CustomScreenData, NULL), YAML_STRUCT("topbarData", 2400, struct_TopBarPersistentData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 4dd1085a8..e716ba6a0 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -72,9 +72,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_PLAY_SOUND, "PLAY_SOUND" }, { FUNC_PLAY_TRACK, "PLAY_TRACK" }, { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, { FUNC_VARIO, "VARIO" }, @@ -113,19 +111,6 @@ const struct YamlIdStr enum_MixerMultiplex[] = { }; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_S1, "S1" }, - { MIXSRC_6POS, "6POS" }, - { MIXSRC_S2, "S2" }, - { MIXSRC_S3, "S3" }, - { MIXSRC_S4, "S4" }, - { MIXSRC_LS, "LS" }, - { MIXSRC_RS, "RS" }, - { MIXSRC_MOUSE1, "MOUSE1" }, - { MIXSRC_MOUSE2, "MOUSE2" }, { MIXSRC_TILT_X, "TILT_X" }, { MIXSRC_TILT_Y, "TILT_Y" }, { MIXSRC_SPACEMOUSE_A, "SPACEMOUSE_A" }, @@ -135,49 +120,15 @@ const struct YamlIdStr enum_MixSources[] = { { MIXSRC_SPACEMOUSE_E, "SPACEMOUSE_E" }, { MIXSRC_SPACEMOUSE_F, "SPACEMOUSE_F" }, { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, { MIXSRC_TrimRud, "TrimRud" }, { MIXSRC_TrimEle, "TrimEle" }, { MIXSRC_TrimThr, "TrimThr" }, { MIXSRC_TrimAil, "TrimAil" }, { MIXSRC_TrimT5, "TrimT5" }, { MIXSRC_TrimT6, "TrimT6" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SG, "SG" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SI, "SI" }, - { MIXSRC_SJ, "SJ" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, { 0, NULL } }; const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { @@ -212,50 +163,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_TrimT5Down, "TrimT5Down" }, - { SWSRC_TrimT5Up, "TrimT5Up" }, - { SWSRC_TrimT6Down, "TrimT6Down" }, - { SWSRC_TrimT6Up, "TrimT6Up" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, { SWSRC_ON, "ON" }, { SWSRC_ONE, "ONE" }, { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, @@ -366,18 +273,13 @@ static const struct YamlNode union_anonymous_0_elmts[] = { }; static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 6, enum_Functions), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 48 ), YAML_PADDING( 8 ), YAML_END }; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; static const struct YamlNode union_ZoneOptionValue_elmts[] = { YAML_UNSIGNED( "unsignedValue", 32 ), YAML_SIGNED( "signedValue", 32 ), @@ -402,7 +304,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_PADDING( 7 ), YAML_CUSTOM("semver",nullptr,w_semver), YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 15, struct_CalibData, NULL), + YAML_ARRAY("calib", 48, 22, struct_CalibData, NULL), YAML_PADDING( 16 ), YAML_UNSIGNED( "vBatWarn", 8 ), YAML_SIGNED( "txVoltageCalibration", 8 ), @@ -467,12 +369,10 @@ static const struct YamlNode struct_RadioData[] = { YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), - YAML_ARRAY("potsConfig", 2, 8, struct_potConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 8, struct_sliderConfig, nullptr), - YAML_PADDING( 240 ), - YAML_PADDING( 312 ), + YAML_ARRAY("sticksConfig", 0, MAX_STICKS, struct_stickConfig, stick_name_valid), + YAML_ARRAY("slidersConfig", 0, MAX_POTS, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 4, 16, struct_potConfig, nullptr), + YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), YAML_STRING("currModelFilename", 17), YAML_UNSIGNED( "modelQuickSelect", 1 ), YAML_UNSIGNED( "blOffBright", 7 ), @@ -542,8 +442,8 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), @@ -573,10 +473,9 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "trimSource", 6 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), YAML_STRING("name", 6), YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), @@ -601,9 +500,9 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_CUSTOM("def",r_logicSw,w_logicSw), YAML_PADDING( 10 ), YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "andsw", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 1 ), - YAML_PADDING( 2 ), YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), @@ -630,8 +529,8 @@ static const struct YamlNode struct_FlightModeData[] = { YAML_IDX, YAML_ARRAY("trim", 16, 6, struct_trim_t, NULL), YAML_STRING("name", 10), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "fadeIn", 8 ), YAML_UNSIGNED( "fadeOut", 8 ), YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), @@ -938,7 +837,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), + YAML_PADDING( 64 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), @@ -954,7 +853,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("scriptsData", 192, 9, struct_ScriptData, NULL), YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 9, struct_signed_8, NULL), + YAML_ARRAY("potsWarnPosition", 8, 16, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), YAML_ARRAY("screenData", 6816, 10, struct_CustomScreenData, NULL), YAML_STRUCT("topbarData", 2400, struct_TopBarPersistentData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp deleted file mode 100644 index 64acd6958..000000000 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ /dev/null @@ -1,943 +0,0 @@ -// generated by generate_yaml.py - -// -// Enums first -// - -const struct YamlIdStr enum_BacklightMode[] = { - { e_backlight_mode_off, "backlight_mode_off" }, - { e_backlight_mode_keys, "backlight_mode_keys" }, - { e_backlight_mode_sticks, "backlight_mode_sticks" }, - { e_backlight_mode_all, "backlight_mode_all" }, - { e_backlight_mode_on, "backlight_mode_on" }, - { 0, NULL } -}; -const struct YamlIdStr enum_AntennaModes[] = { - { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, - { ANTENNA_MODE_ASK, "MODE_ASK" }, - { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, - { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModuleType[] = { - { MODULE_TYPE_NONE, "TYPE_NONE" }, - { MODULE_TYPE_PPM, "TYPE_PPM" }, - { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, - { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, - { MODULE_TYPE_DSM2, "TYPE_DSM2" }, - { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, - { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, - { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, - { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, - { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, - { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, - { MODULE_TYPE_GHOST, "TYPE_GHOST" }, - { MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" }, - { MODULE_TYPE_SBUS, "TYPE_SBUS" }, - { MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" }, - { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, - { MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TrainerMultiplex[] = { - { TRAINER_OFF, "OFF" }, - { TRAINER_ADD, "ADD" }, - { TRAINER_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BeeperMode[] = { - { e_mode_quiet, "mode_quiet" }, - { e_mode_alarms, "mode_alarms" }, - { e_mode_nokeys, "mode_nokeys" }, - { e_mode_all, "mode_all" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BluetoothModes[] = { - { BLUETOOTH_OFF, "OFF" }, - { BLUETOOTH_TELEMETRY, "TELEMETRY" }, - { BLUETOOTH_TRAINER, "TRAINER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_Functions[] = { - { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, - { FUNC_TRAINER, "TRAINER" }, - { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, - { FUNC_RESET, "RESET" }, - { FUNC_SET_TIMER, "SET_TIMER" }, - { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, - { FUNC_VOLUME, "VOLUME" }, - { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, - { FUNC_RANGECHECK, "RANGECHECK" }, - { FUNC_BIND, "BIND" }, - { FUNC_PLAY_SOUND, "PLAY_SOUND" }, - { FUNC_PLAY_TRACK, "PLAY_TRACK" }, - { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, - { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, - { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, - { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, - { FUNC_VARIO, "VARIO" }, - { FUNC_HAPTIC, "HAPTIC" }, - { FUNC_LOGS, "LOGS" }, - { FUNC_BACKLIGHT, "BACKLIGHT" }, - { FUNC_SCREENSHOT, "SCREENSHOT" }, - { FUNC_RACING_MODE, "RACING_MODE" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TimerModes[] = { - { TMRMODE_OFF, "OFF" }, - { TMRMODE_ON, "ON" }, - { TMRMODE_START, "START" }, - { TMRMODE_THR, "THR" }, - { TMRMODE_THR_REL, "THR_REL" }, - { TMRMODE_THR_START, "THR_START" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixerMultiplex[] = { - { MLTPX_ADD, "ADD" }, - { MLTPX_MUL, "MUL" }, - { MLTPX_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixSources[] = { - { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, - { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, - { MIXSRC_TrimRud, "TrimRud" }, - { MIXSRC_TrimEle, "TrimEle" }, - { MIXSRC_TrimThr, "TrimThr" }, - { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SI, "SI" }, - { MIXSRC_SJ, "SJ" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, - { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, - { MIXSRC_TX_TIME, "TX_TIME" }, - { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, - { 0, NULL } -}; -const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { - { LS_FUNC_NONE, "FUNC_NONE" }, - { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, - { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, - { LS_FUNC_VPOS, "FUNC_VPOS" }, - { LS_FUNC_VNEG, "FUNC_VNEG" }, - { LS_FUNC_RANGE, "FUNC_RANGE" }, - { LS_FUNC_APOS, "FUNC_APOS" }, - { LS_FUNC_ANEG, "FUNC_ANEG" }, - { LS_FUNC_AND, "FUNC_AND" }, - { LS_FUNC_OR, "FUNC_OR" }, - { LS_FUNC_XOR, "FUNC_XOR" }, - { LS_FUNC_EDGE, "FUNC_EDGE" }, - { LS_FUNC_EQUAL, "FUNC_EQUAL" }, - { LS_FUNC_GREATER, "FUNC_GREATER" }, - { LS_FUNC_LESS, "FUNC_LESS" }, - { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, - { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, - { LS_FUNC_TIMER, "FUNC_TIMER" }, - { LS_FUNC_STICKY, "FUNC_STICKY" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwashType[] = { - { SWASH_TYPE_NONE, "TYPE_NONE" }, - { SWASH_TYPE_120, "TYPE_120" }, - { SWASH_TYPE_120X, "TYPE_120X" }, - { SWASH_TYPE_140, "TYPE_140" }, - { SWASH_TYPE_90, "TYPE_90" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwitchSources[] = { - { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, - { SWSRC_ON, "ON" }, - { SWSRC_ONE, "ONE" }, - { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, - { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, - { SWSRC_OFF, "OFF" }, - { 0, NULL } -}; -const struct YamlIdStr enum_PotsWarnMode[] = { - { POTS_WARN_OFF, "WARN_OFF" }, - { POTS_WARN_MANUAL, "WARN_MANUAL" }, - { POTS_WARN_AUTO, "WARN_AUTO" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModelOverridableEnable[] = { - { OVERRIDE_GLOBAL, "GLOBAL" }, - { OVERRIDE_OFF, "OFF" }, - { OVERRIDE_ON, "ON" }, - { 0, NULL } -}; -const struct YamlIdStr enum_FailsafeModes[] = { - { FAILSAFE_NOT_SET, "NOT_SET" }, - { FAILSAFE_HOLD, "HOLD" }, - { FAILSAFE_CUSTOM, "CUSTOM" }, - { FAILSAFE_NOPULSES, "NOPULSES" }, - { FAILSAFE_RECEIVER, "RECEIVER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorFormula[] = { - { TELEM_FORMULA_ADD, "FORMULA_ADD" }, - { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, - { TELEM_FORMULA_MIN, "FORMULA_MIN" }, - { TELEM_FORMULA_MAX, "FORMULA_MAX" }, - { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, - { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, - { TELEM_FORMULA_CELL, "FORMULA_CELL" }, - { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, - { TELEM_FORMULA_DIST, "FORMULA_DIST" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorType[] = { - { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, - { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickIfMode[] = { - { USBJOYS_JOYSTICK, "JOYSTICK" }, - { USBJOYS_GAMEPAD, "GAMEPAD" }, - { USBJOYS_MULTIAXIS, "MULTIAXIS" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickCh[] = { - { USBJOYS_CH_NONE, "CH_NONE" }, - { USBJOYS_CH_BUTTON, "CH_BUTTON" }, - { USBJOYS_CH_AXIS, "CH_AXIS" }, - { USBJOYS_CH_SIM, "CH_SIM" }, - { 0, NULL } -}; - -// -// Structs last -// - -static const struct YamlNode struct_CalibData[] = { - YAML_IDX_CUST("calib",r_calib,w_calib), - YAML_SIGNED( "mid", 16 ), - YAML_SIGNED( "spanNeg", 16 ), - YAML_SIGNED( "spanPos", 16 ), - YAML_END -}; -static const struct YamlNode struct_signed_16[] = { - YAML_IDX, - YAML_SIGNED( "val", 16 ), - YAML_END -}; -static const struct YamlNode struct_TrainerMix[] = { - YAML_IDX, - YAML_UNSIGNED( "srcChn", 6 ), - YAML_ENUM("mode", 2, enum_TrainerMultiplex), - YAML_SIGNED( "studWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_TrainerData[] = { - YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), - YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_1[] = { - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_anonymous_2[] = { - YAML_SIGNED( "val", 16 ), - YAML_UNSIGNED( "mode", 8 ), - YAML_UNSIGNED( "param", 8 ), - YAML_SIGNED( "spare", 32 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_3[] = { - YAML_SIGNED( "val1", 32 ), - YAML_SIGNED( "val2", 32 ), - YAML_END -}; -static const struct YamlNode union_anonymous_0_elmts[] = { - YAML_STRUCT("play", 48, struct_anonymous_1, NULL), - YAML_STRUCT("all", 64, struct_anonymous_2, NULL), - YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), - YAML_END -}; -static const struct YamlNode struct_CustomFunctionData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), - YAML_CUSTOM("def",r_customFn,w_customFn), - YAML_PADDING( 64 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; -static const struct YamlNode struct_RadioData[] = { - YAML_UNSIGNED( "manuallyEdited", 1 ), - YAML_PADDING( 7 ), - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_PADDING( 16 ), - YAML_SIGNED( "currModel", 8 ), - YAML_UNSIGNED( "contrast", 8 ), - YAML_UNSIGNED( "vBatWarn", 8 ), - YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_ENUM("backlightMode", 3, enum_BacklightMode), - YAML_ENUM("antennaMode", 2, enum_AntennaModes), - YAML_UNSIGNED( "disableRtcWarning", 1 ), - YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), - YAML_ENUM("internalModule", 8, enum_ModuleType), - YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), - YAML_UNSIGNED( "alarmsFlash", 1 ), - YAML_UNSIGNED( "disableMemoryWarning", 1 ), - YAML_UNSIGNED( "disableAlarmWarning", 1 ), - YAML_UNSIGNED( "stickMode", 2 ), - YAML_SIGNED( "timezone", 5 ), - YAML_UNSIGNED( "adjustRTC", 1 ), - YAML_UNSIGNED( "inactivityTimer", 8 ), - YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr), - YAML_UNSIGNED( "internalModuleBaudrate", 3 ), - YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), - YAML_SIGNED( "switchesDelay", 8 ), - YAML_UNSIGNED( "lightAutoOff", 8 ), - YAML_UNSIGNED( "templateSetup", 8 ), - YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), - YAML_UNSIGNED( "gpsFormat", 1 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), - YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), - YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), - YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), - YAML_UNSIGNED( "backlightBright", 8 ), - YAML_UNSIGNED( "globalTimer", 32 ), - YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), - YAML_UNSIGNED( "countryCode", 2 ), - YAML_SIGNED( "pwrOnSpeed", 3 ), - YAML_SIGNED( "pwrOffSpeed", 3 ), - YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr), - YAML_UNSIGNED( "noJitterFilter", 1 ), - YAML_UNSIGNED( "imperial", 1 ), - YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), - YAML_UNSIGNED( "USBMode", 2 ), - YAML_UNSIGNED( "jackMode", 2 ), - YAML_PADDING( 1 ), - YAML_STRING("ttsLanguage", 2), - YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), - YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), - YAML_SIGNED( "varioRepeat", 8 ), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), - YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), - YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), - YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 192 ), - YAML_PADDING( 144 ), - YAML_PADDING( 8 ), - YAML_STRING("bluetoothName", 10), - YAML_STRING("ownerRegistrationID", 8), - YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), - YAML_UNSIGNED( "rotEncMode", 2 ), - YAML_SIGNED( "uartSampleMode", 2 ), - YAML_PADDING( 3 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "radioGFDisabled", 1 ), - YAML_UNSIGNED( "radioTrainerDisabled", 1 ), - YAML_UNSIGNED( "modelHeliDisabled", 1 ), - YAML_UNSIGNED( "modelFMDisabled", 1 ), - YAML_UNSIGNED( "modelCurvesDisabled", 1 ), - YAML_UNSIGNED( "modelGVDisabled", 1 ), - YAML_UNSIGNED( "modelLSDisabled", 1 ), - YAML_UNSIGNED( "modelSFDisabled", 1 ), - YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ), - YAML_UNSIGNED( "modelTelemetryDisabled", 1 ), - YAML_END -}; -static const struct YamlNode struct_unsigned_8[] = { - YAML_IDX, - YAML_UNSIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_ModelHeader[] = { - YAML_STRING("name", 10), - YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_TimerData[] = { - YAML_IDX, - YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), - YAML_SIGNED( "value", 22 ), - YAML_ENUM("mode", 3, enum_TimerModes), - YAML_UNSIGNED( "countdownBeep", 2 ), - YAML_UNSIGNED( "minuteBeep", 1 ), - YAML_UNSIGNED( "persistent", 2 ), - YAML_SIGNED( "countdownStart", 2 ), - YAML_UNSIGNED( "showElapsed", 1 ), - YAML_UNSIGNED( "extraHaptic", 1 ), - YAML_PADDING( 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_CurveRef[] = { - YAML_UNSIGNED( "type", 8 ), - YAML_SIGNED_CUST( "value", 8, in_read_weight, in_write_weight ), - YAML_END -}; -static const struct YamlNode struct_MixData[] = { - YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "destCh", 5 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "carryTrim", 1 ), - YAML_UNSIGNED( "mixWarn", 2 ), - YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_UNSIGNED( "delayUp", 8 ), - YAML_UNSIGNED( "delayDown", 8 ), - YAML_UNSIGNED( "speedUp", 8 ), - YAML_UNSIGNED( "speedDown", 8 ), - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_LimitData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ), - YAML_SIGNED( "ppmCenter", 10 ), - YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "symetrical", 1 ), - YAML_UNSIGNED( "revert", 1 ), - YAML_PADDING( 3 ), - YAML_SIGNED( "curve", 8 ), - YAML_STRING("name", 4), - YAML_END -}; -static const struct YamlNode struct_ExpoData[] = { - YAML_UNSIGNED( "mode", 2 ), - YAML_UNSIGNED( "scale", 14 ), - YAML_CUSTOM("carryTrim",r_carryTrim,nullptr), - YAML_SIGNED( "trimSource", 6 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_END -}; -static const struct YamlNode struct_CurveHeader[] = { - YAML_IDX, - YAML_UNSIGNED( "type", 1 ), - YAML_UNSIGNED( "smooth", 1 ), - YAML_SIGNED( "points", 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_signed_8[] = { - YAML_IDX, - YAML_SIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_LogicalSwitchData[] = { - YAML_IDX, - YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_CUSTOM("def",r_logicSw,w_logicSw), - YAML_PADDING( 10 ), - YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 1 ), - YAML_PADDING( 2 ), - YAML_PADDING( 16 ), - YAML_UNSIGNED( "delay", 8 ), - YAML_UNSIGNED( "duration", 8 ), - YAML_END -}; -static const struct YamlNode struct_SwashRingData[] = { - YAML_ENUM("type", 8, enum_SwashType), - YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "collectiveWeight", 8 ), - YAML_SIGNED( "aileronWeight", 8 ), - YAML_SIGNED( "elevatorWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_trim_t[] = { - YAML_IDX, - YAML_SIGNED( "value", 11 ), - YAML_UNSIGNED( "mode", 5 ), - YAML_END -}; -static const struct YamlNode struct_FlightModeData[] = { - YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), - YAML_UNSIGNED( "fadeIn", 8 ), - YAML_UNSIGNED( "fadeOut", 8 ), - YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), - YAML_END -}; -static const struct YamlNode struct_GVarData[] = { - YAML_IDX, - YAML_STRING("name", 3), - YAML_UNSIGNED( "min", 12 ), - YAML_UNSIGNED( "max", 12 ), - YAML_UNSIGNED( "popup", 1 ), - YAML_UNSIGNED( "prec", 1 ), - YAML_UNSIGNED( "unit", 2 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), - YAML_UNSIGNED( "centerSilent", 1 ), - YAML_SIGNED( "centerMax", 8 ), - YAML_SIGNED( "centerMin", 8 ), - YAML_SIGNED( "min", 8 ), - YAML_SIGNED( "max", 8 ), - YAML_END -}; -static const struct YamlNode struct_RssiAlarmData[] = { - YAML_CUSTOM("disabled",r_rssiDisabled,nullptr), - YAML_CUSTOM("warning",r_rssiWarning,nullptr), - YAML_CUSTOM("critical",r_rssiCritical,nullptr), - YAML_END -}; -static const struct YamlNode struct_RFAlarmData[] = { - YAML_SIGNED( "warning", 8 ), - YAML_SIGNED( "critical", 8 ), - YAML_END -}; -static const struct YamlNode struct_PpmModule[] = { - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_UNSIGNED( "outputType", 1 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_5[] = { - YAML_PADDING( 8 ), - YAML_UNSIGNED( "disableTelemetry", 1 ), - YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "autoBindMode", 1 ), - YAML_UNSIGNED( "lowPowerMode", 1 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_PADDING( 2 ), - YAML_SIGNED( "optionValue", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "power", 2 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_SIGNED( "antennaMode", 2 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_7[] = { - YAML_PADDING( 6 ), - YAML_UNSIGNED( "noninverted", 1 ), - YAML_PADDING( 1 ), - YAML_SIGNED( "refreshRate", 8 ), - YAML_END -}; -static const struct YamlNode struct_string_64[] = { - YAML_IDX, - YAML_STRING("val", 8), - YAML_END -}; -static const struct YamlNode struct_anonymous_8[] = { - YAML_UNSIGNED( "receivers", 7 ), - YAML_UNSIGNED( "racingMode", 1 ), - YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_9[] = { - YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), - YAML_UNSIGNED( "mode", 3 ), - YAML_UNSIGNED( "rfPower", 1 ), - YAML_UNSIGNED( "reserved", 4 ), - YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_10[] = { - YAML_UNSIGNED( "emi", 2 ), - YAML_UNSIGNED( "telemetry", 1 ), - YAML_UNSIGNED( "phyMode", 3 ), - YAML_UNSIGNED( "reserved", 2 ), - YAML_UNSIGNED( "rfPower", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_11[] = { - YAML_UNSIGNED( "raw12bits", 1 ), - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_12[] = { - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_13[] = { - YAML_UNSIGNED( "flags", 8 ), - YAML_END -}; -static const struct YamlNode union_anonymous_4_elmts[] = { - YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), - YAML_STRUCT("ppm", 16, struct_PpmModule, NULL), - YAML_STRUCT("multi", 24, struct_anonymous_5, NULL), - YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL), - YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL), - YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL), - YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), - YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), - YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), - YAML_END -}; -static const struct YamlNode struct_ModuleData[] = { - YAML_IDX, - YAML_ENUM("type", 8, enum_ModuleType), - YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), - YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), - YAML_PADDING( 4 ), - YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), - YAML_END -}; -static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_PADDING( 1 ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput_elmts[] = { - YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput[] = { - YAML_IDX, - YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), - YAML_END -}; -static const struct YamlNode struct_ScriptData[] = { - YAML_IDX, - YAML_STRING("file", 6), - YAML_STRING("name", 6), - YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), - YAML_END -}; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_UNSIGNED( "id", 16 ), - YAML_UNSIGNED( "persistentValue", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_16[] = { - YAML_UNSIGNED( "physID", 5 ), - YAML_UNSIGNED( "rxIndex", 3 ), - YAML_END -}; -static const struct YamlNode union_anonymous_15_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL), - YAML_UNSIGNED( "instance", 8 ), - YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), - YAML_END -}; -static const struct YamlNode struct_anonymous_18[] = { - YAML_UNSIGNED( "ratio", 16 ), - YAML_SIGNED( "offset", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_19[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_UNSIGNED( "index", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_20[] = { - YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_21[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_PADDING( 24 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_22[] = { - YAML_UNSIGNED( "gps", 8 ), - YAML_UNSIGNED( "alt", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode union_anonymous_17_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_18, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_19, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_20, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_22, NULL), - YAML_UNSIGNED( "param", 32 ), - YAML_END -}; -static const struct YamlNode struct_TelemetrySensor[] = { - YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2), - YAML_STRING("label", 4), - YAML_UNSIGNED( "subId", 8 ), - YAML_ENUM("type", 1, enum_TelemetrySensorType), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "unit", 6 ), - YAML_UNSIGNED( "prec", 2 ), - YAML_UNSIGNED( "autoOffset", 1 ), - YAML_UNSIGNED( "filter", 1 ), - YAML_UNSIGNED( "logs", 1 ), - YAML_UNSIGNED( "persistent", 1 ), - YAML_UNSIGNED( "onlyPositive", 1 ), - YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg), - YAML_END -}; -static const struct YamlNode struct_FrSkyBarData[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "barMin", 16 ), - YAML_SIGNED( "barMax", 16 ), - YAML_END -}; -static const struct YamlNode struct_LineDataSource[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode struct_FrSkyLineData[] = { - YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScriptData[] = { - YAML_STRING("file", 6), - YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), - YAML_END -}; -static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { - YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), - YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), - YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScreenData[] = { - YAML_IDX, - YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), - YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), - YAML_END -}; -static const struct YamlNode struct_USBJoystickChData[] = { - YAML_IDX, - YAML_ENUM("mode", 3, enum_USBJoystickCh), - YAML_UNSIGNED( "inversion", 1 ), - YAML_UNSIGNED( "param", 4 ), - YAML_UNSIGNED( "btn_num", 5 ), - YAML_UNSIGNED( "switch_npos", 3 ), - YAML_END -}; -static const struct YamlNode struct_ModelData[] = { - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_UNSIGNED( "telemetryProtocol", 3 ), - YAML_UNSIGNED( "thrTrim", 1 ), - YAML_UNSIGNED( "noGlobalFunctions", 1 ), - YAML_UNSIGNED( "displayTrims", 2 ), - YAML_UNSIGNED( "ignoreSensorIds", 1 ), - YAML_SIGNED( "trimInc", 3 ), - YAML_UNSIGNED( "disableThrottleWarning", 1 ), - YAML_UNSIGNED( "displayChecklist", 1 ), - YAML_UNSIGNED( "extendedLimits", 1 ), - YAML_UNSIGNED( "extendedTrims", 1 ), - YAML_UNSIGNED( "throttleReversed", 1 ), - YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ), - YAML_UNSIGNED( "disableTelemetryWarning", 1 ), - YAML_UNSIGNED( "showInstanceIds", 1 ), - YAML_PADDING( 5 ), - YAML_SIGNED( "customThrottleWarningPosition", 8 ), - YAML_UNSIGNED( "beepANACenter", 16 ), - YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), - YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), - YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), - YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), - YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), - YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), - YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), - YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), - YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), - YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL), - YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL), - YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), - YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable), - YAML_PADDING( 1 ), - YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), - YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), - YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), - YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), - YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), - YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_PADDING( 8 ), - YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_STRING("modelRegistrationID", 8), - YAML_UNSIGNED( "usbJoystickExtMode", 1 ), - YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode), - YAML_UNSIGNED( "usbJoystickCircularCut", 4 ), - YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL), - YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable), - YAML_END -}; -static const struct YamlNode struct_PartialModel[] = { - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_END -}; - -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29 - -static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); - -const YamlNode* get_radiodata_nodes() -{ - return &__RadioData_root_node; -} -static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); - -const YamlNode* get_modeldata_nodes() -{ - return &__ModelData_root_node; -} -static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); - -const YamlNode* get_partialmodel_nodes() -{ - return &__PartialModel_root_node; -} - diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 4bef7243c..513590255 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -72,9 +72,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_PLAY_SOUND, "PLAY_SOUND" }, { FUNC_PLAY_TRACK, "PLAY_TRACK" }, { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, { FUNC_VARIO, "VARIO" }, @@ -102,56 +100,16 @@ const struct YamlIdStr enum_MixerMultiplex[] = { }; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, - { MIXSRC_POT3, "POT3" }, - { MIXSRC_SLIDER1, "SLIDER1" }, - { MIXSRC_SLIDER2, "SLIDER2" }, { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, { MIXSRC_TrimRud, "TrimRud" }, { MIXSRC_TrimEle, "TrimEle" }, { MIXSRC_TrimThr, "TrimThr" }, { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SG, "SG" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SI, "SI" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TrimT5, "TrimT5" }, + { MIXSRC_TrimT6, "TrimT6" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, { 0, NULL } }; const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { @@ -186,43 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, { SWSRC_ON, "ON" }, { SWSRC_ONE, "ONE" }, { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, @@ -333,24 +254,19 @@ static const struct YamlNode union_anonymous_0_elmts[] = { }; static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 6, enum_Functions), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), YAML_END }; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "manuallyEdited", 1 ), YAML_PADDING( 7 ), YAML_CUSTOM("semver",nullptr,w_semver), YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 9, struct_CalibData, NULL), + YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL), YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), @@ -417,14 +333,11 @@ static const struct YamlNode struct_RadioData[] = { YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_ARRAY("sticksConfig", 0, MAX_STICKS, struct_stickConfig, stick_name_valid), + YAML_ARRAY("slidersConfig", 0, MAX_POTS, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 4, 8, struct_potConfig, nullptr), + YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 16, struct_switchConfig, nullptr), - YAML_PADDING( 216 ), - YAML_PADDING( 216 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), @@ -485,8 +398,8 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), @@ -516,10 +429,9 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "trimSource", 6 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), YAML_STRING("name", 6), YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), @@ -544,9 +456,9 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_CUSTOM("def",r_logicSw,w_logicSw), YAML_PADDING( 10 ), YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "andsw", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 1 ), - YAML_PADDING( 2 ), YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), @@ -571,10 +483,10 @@ static const struct YamlNode struct_trim_t[] = { }; static const struct YamlNode struct_FlightModeData[] = { YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_ARRAY("trim", 16, 6, struct_trim_t, NULL), YAML_STRING("name", 10), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "fadeIn", 8 ), YAML_UNSIGNED( "fadeOut", 8 ), YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), @@ -886,10 +798,10 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), + YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), + YAML_PADDING( 64 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), @@ -906,8 +818,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 5, struct_signed_8, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 8, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), YAML_PADDING( 8 ), YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 6b4941346..b384212c1 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -72,9 +72,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_PLAY_SOUND, "PLAY_SOUND" }, { FUNC_PLAY_TRACK, "PLAY_TRACK" }, { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, { FUNC_VARIO, "VARIO" }, @@ -102,68 +100,16 @@ const struct YamlIdStr enum_MixerMultiplex[] = { }; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, - { MIXSRC_POT3, "POT3" }, - { MIXSRC_POT4, "POT4" }, - { MIXSRC_SLIDER1, "SLIDER1" }, - { MIXSRC_SLIDER2, "SLIDER2" }, - { MIXSRC_SLIDER3, "SLIDER3" }, - { MIXSRC_SLIDER4, "SLIDER4" }, { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, { MIXSRC_TrimRud, "TrimRud" }, { MIXSRC_TrimEle, "TrimEle" }, { MIXSRC_TrimThr, "TrimThr" }, { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SG, "SG" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SI, "SI" }, - { MIXSRC_SJ, "SJ" }, - { MIXSRC_SK, "SK" }, - { MIXSRC_SL, "SL" }, - { MIXSRC_SM, "SM" }, - { MIXSRC_SN, "SN" }, - { MIXSRC_SO, "SO" }, - { MIXSRC_SP, "SP" }, - { MIXSRC_SQ, "SQ" }, - { MIXSRC_SR, "SR" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TrimT5, "TrimT5" }, + { MIXSRC_TrimT6, "TrimT6" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, { 0, NULL } }; const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { @@ -198,70 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, - { SWSRC_SK0, "SK0" }, - { SWSRC_SK1, "SK1" }, - { SWSRC_SK2, "SK2" }, - { SWSRC_SL0, "SL0" }, - { SWSRC_SL1, "SL1" }, - { SWSRC_SL2, "SL2" }, - { SWSRC_SM0, "SM0" }, - { SWSRC_SM1, "SM1" }, - { SWSRC_SM2, "SM2" }, - { SWSRC_SN0, "SN0" }, - { SWSRC_SN1, "SN1" }, - { SWSRC_SN2, "SN2" }, - { SWSRC_SO0, "SO0" }, - { SWSRC_SO1, "SO1" }, - { SWSRC_SO2, "SO2" }, - { SWSRC_SP0, "SP0" }, - { SWSRC_SP1, "SP1" }, - { SWSRC_SP2, "SP2" }, - { SWSRC_SQ0, "SQ0" }, - { SWSRC_SQ1, "SQ1" }, - { SWSRC_SQ2, "SQ2" }, - { SWSRC_SR0, "SR0" }, - { SWSRC_SR1, "SR1" }, - { SWSRC_SR2, "SR2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, { SWSRC_ON, "ON" }, { SWSRC_ONE, "ONE" }, { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, @@ -372,18 +254,13 @@ static const struct YamlNode union_anonymous_0_elmts[] = { }; static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 6, enum_Functions), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), YAML_END }; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "manuallyEdited", 1 ), YAML_PADDING( 7 ), @@ -456,14 +333,11 @@ static const struct YamlNode struct_RadioData[] = { YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), - YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), + YAML_ARRAY("sticksConfig", 0, MAX_STICKS, struct_stickConfig, stick_name_valid), + YAML_ARRAY("slidersConfig", 0, MAX_POTS, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 4, 8, struct_potConfig, nullptr), YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), - YAML_PADDING( 432 ), - YAML_PADDING( 288 ), + YAML_UNSIGNED( "backlightColor", 8 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), @@ -524,8 +398,8 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), @@ -555,10 +429,9 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "trimSource", 6 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), YAML_STRING("name", 6), YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), @@ -583,9 +456,9 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_CUSTOM("def",r_logicSw,w_logicSw), YAML_PADDING( 10 ), YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "andsw", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 1 ), - YAML_PADDING( 2 ), YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), @@ -610,10 +483,10 @@ static const struct YamlNode struct_trim_t[] = { }; static const struct YamlNode struct_FlightModeData[] = { YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_ARRAY("trim", 16, 6, struct_trim_t, NULL), YAML_STRING("name", 10), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "fadeIn", 8 ), YAML_UNSIGNED( "fadeOut", 8 ), YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), @@ -925,7 +798,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), + YAML_ARRAY("flightModeData", 352, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), YAML_PADDING( 64 ), @@ -945,7 +818,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), YAML_ARRAY("potsWarnPosition", 8, 8, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 60, struct_TelemetrySensor, NULL), YAML_UNSIGNED( "toplcdTimer", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 7bb91b9f3..84b0bc31a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -72,9 +72,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_PLAY_SOUND, "PLAY_SOUND" }, { FUNC_PLAY_TRACK, "PLAY_TRACK" }, { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, { FUNC_VARIO, "VARIO" }, @@ -102,48 +100,16 @@ const struct YamlIdStr enum_MixerMultiplex[] = { }; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, { MIXSRC_TrimRud, "TrimRud" }, { MIXSRC_TrimEle, "TrimEle" }, { MIXSRC_TrimThr, "TrimThr" }, { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TrimT5, "TrimT5" }, + { MIXSRC_TrimT6, "TrimT6" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, { 0, NULL } }; const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { @@ -178,31 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, { SWSRC_ON, "ON" }, { SWSRC_ONE, "ONE" }, { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, @@ -313,24 +254,19 @@ static const struct YamlNode union_anonymous_0_elmts[] = { }; static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 6, enum_Functions), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), YAML_END }; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "manuallyEdited", 1 ), YAML_PADDING( 7 ), YAML_CUSTOM("semver",nullptr,w_semver), YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 5, struct_CalibData, NULL), + YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL), YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), @@ -397,14 +333,11 @@ static const struct YamlNode struct_RadioData[] = { YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_ARRAY("sticksConfig", 0, MAX_STICKS, struct_stickConfig, stick_name_valid), + YAML_ARRAY("slidersConfig", 0, MAX_POTS, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 4, 8, struct_potConfig, nullptr), + YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 120 ), - YAML_PADDING( 120 ), YAML_STRING("ownerRegistrationID", 8), YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), YAML_UNSIGNED( "rotEncMode", 2 ), @@ -462,8 +395,8 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), @@ -493,10 +426,9 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "trimSource", 6 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), YAML_STRING("name", 6), YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), @@ -521,9 +453,9 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_CUSTOM("def",r_logicSw,w_logicSw), YAML_PADDING( 10 ), YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "andsw", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 1 ), - YAML_PADDING( 2 ), YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), @@ -548,10 +480,10 @@ static const struct YamlNode struct_trim_t[] = { }; static const struct YamlNode struct_FlightModeData[] = { YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_ARRAY("trim", 16, 6, struct_trim_t, NULL), YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "fadeIn", 8 ), YAML_UNSIGNED( "fadeOut", 8 ), YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), @@ -716,6 +648,11 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; static const struct YamlNode union_anonymous_14_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), @@ -858,10 +795,10 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), + YAML_PADDING( 64 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), @@ -876,8 +813,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 1, struct_signed_8, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 8, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), YAML_PADDING( 8 ), YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp deleted file mode 100644 index b33ff4bb1..000000000 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ /dev/null @@ -1,938 +0,0 @@ -// generated by generate_yaml.py - -// -// Enums first -// - -const struct YamlIdStr enum_BacklightMode[] = { - { e_backlight_mode_off, "backlight_mode_off" }, - { e_backlight_mode_keys, "backlight_mode_keys" }, - { e_backlight_mode_sticks, "backlight_mode_sticks" }, - { e_backlight_mode_all, "backlight_mode_all" }, - { e_backlight_mode_on, "backlight_mode_on" }, - { 0, NULL } -}; -const struct YamlIdStr enum_AntennaModes[] = { - { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, - { ANTENNA_MODE_ASK, "MODE_ASK" }, - { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, - { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModuleType[] = { - { MODULE_TYPE_NONE, "TYPE_NONE" }, - { MODULE_TYPE_PPM, "TYPE_PPM" }, - { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, - { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, - { MODULE_TYPE_DSM2, "TYPE_DSM2" }, - { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, - { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, - { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, - { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, - { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, - { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, - { MODULE_TYPE_GHOST, "TYPE_GHOST" }, - { MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" }, - { MODULE_TYPE_SBUS, "TYPE_SBUS" }, - { MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" }, - { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, - { MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TrainerMultiplex[] = { - { TRAINER_OFF, "OFF" }, - { TRAINER_ADD, "ADD" }, - { TRAINER_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BeeperMode[] = { - { e_mode_quiet, "mode_quiet" }, - { e_mode_alarms, "mode_alarms" }, - { e_mode_nokeys, "mode_nokeys" }, - { e_mode_all, "mode_all" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BluetoothModes[] = { - { BLUETOOTH_OFF, "OFF" }, - { BLUETOOTH_TELEMETRY, "TELEMETRY" }, - { BLUETOOTH_TRAINER, "TRAINER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_Functions[] = { - { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, - { FUNC_TRAINER, "TRAINER" }, - { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, - { FUNC_RESET, "RESET" }, - { FUNC_SET_TIMER, "SET_TIMER" }, - { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, - { FUNC_VOLUME, "VOLUME" }, - { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, - { FUNC_RANGECHECK, "RANGECHECK" }, - { FUNC_BIND, "BIND" }, - { FUNC_PLAY_SOUND, "PLAY_SOUND" }, - { FUNC_PLAY_TRACK, "PLAY_TRACK" }, - { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, - { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, - { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, - { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, - { FUNC_VARIO, "VARIO" }, - { FUNC_HAPTIC, "HAPTIC" }, - { FUNC_LOGS, "LOGS" }, - { FUNC_BACKLIGHT, "BACKLIGHT" }, - { FUNC_SCREENSHOT, "SCREENSHOT" }, - { FUNC_RACING_MODE, "RACING_MODE" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TimerModes[] = { - { TMRMODE_OFF, "OFF" }, - { TMRMODE_ON, "ON" }, - { TMRMODE_START, "START" }, - { TMRMODE_THR, "THR" }, - { TMRMODE_THR_REL, "THR_REL" }, - { TMRMODE_THR_START, "THR_START" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixerMultiplex[] = { - { MLTPX_ADD, "ADD" }, - { MLTPX_MUL, "MUL" }, - { MLTPX_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixSources[] = { - { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, - { MIXSRC_TrimRud, "TrimRud" }, - { MIXSRC_TrimEle, "TrimEle" }, - { MIXSRC_TrimThr, "TrimThr" }, - { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SG, "SG" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, - { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, - { MIXSRC_TX_TIME, "TX_TIME" }, - { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, - { 0, NULL } -}; -const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { - { LS_FUNC_NONE, "FUNC_NONE" }, - { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, - { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, - { LS_FUNC_VPOS, "FUNC_VPOS" }, - { LS_FUNC_VNEG, "FUNC_VNEG" }, - { LS_FUNC_RANGE, "FUNC_RANGE" }, - { LS_FUNC_APOS, "FUNC_APOS" }, - { LS_FUNC_ANEG, "FUNC_ANEG" }, - { LS_FUNC_AND, "FUNC_AND" }, - { LS_FUNC_OR, "FUNC_OR" }, - { LS_FUNC_XOR, "FUNC_XOR" }, - { LS_FUNC_EDGE, "FUNC_EDGE" }, - { LS_FUNC_EQUAL, "FUNC_EQUAL" }, - { LS_FUNC_GREATER, "FUNC_GREATER" }, - { LS_FUNC_LESS, "FUNC_LESS" }, - { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, - { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, - { LS_FUNC_TIMER, "FUNC_TIMER" }, - { LS_FUNC_STICKY, "FUNC_STICKY" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwashType[] = { - { SWASH_TYPE_NONE, "TYPE_NONE" }, - { SWASH_TYPE_120, "TYPE_120" }, - { SWASH_TYPE_120X, "TYPE_120X" }, - { SWASH_TYPE_140, "TYPE_140" }, - { SWASH_TYPE_90, "TYPE_90" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwitchSources[] = { - { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, - { SWSRC_ON, "ON" }, - { SWSRC_ONE, "ONE" }, - { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, - { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, - { SWSRC_OFF, "OFF" }, - { 0, NULL } -}; -const struct YamlIdStr enum_PotsWarnMode[] = { - { POTS_WARN_OFF, "WARN_OFF" }, - { POTS_WARN_MANUAL, "WARN_MANUAL" }, - { POTS_WARN_AUTO, "WARN_AUTO" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModelOverridableEnable[] = { - { OVERRIDE_GLOBAL, "GLOBAL" }, - { OVERRIDE_OFF, "OFF" }, - { OVERRIDE_ON, "ON" }, - { 0, NULL } -}; -const struct YamlIdStr enum_FailsafeModes[] = { - { FAILSAFE_NOT_SET, "NOT_SET" }, - { FAILSAFE_HOLD, "HOLD" }, - { FAILSAFE_CUSTOM, "CUSTOM" }, - { FAILSAFE_NOPULSES, "NOPULSES" }, - { FAILSAFE_RECEIVER, "RECEIVER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorFormula[] = { - { TELEM_FORMULA_ADD, "FORMULA_ADD" }, - { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, - { TELEM_FORMULA_MIN, "FORMULA_MIN" }, - { TELEM_FORMULA_MAX, "FORMULA_MAX" }, - { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, - { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, - { TELEM_FORMULA_CELL, "FORMULA_CELL" }, - { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, - { TELEM_FORMULA_DIST, "FORMULA_DIST" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorType[] = { - { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, - { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickIfMode[] = { - { USBJOYS_JOYSTICK, "JOYSTICK" }, - { USBJOYS_GAMEPAD, "GAMEPAD" }, - { USBJOYS_MULTIAXIS, "MULTIAXIS" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickCh[] = { - { USBJOYS_CH_NONE, "CH_NONE" }, - { USBJOYS_CH_BUTTON, "CH_BUTTON" }, - { USBJOYS_CH_AXIS, "CH_AXIS" }, - { USBJOYS_CH_SIM, "CH_SIM" }, - { 0, NULL } -}; - -// -// Structs last -// - -static const struct YamlNode struct_CalibData[] = { - YAML_IDX_CUST("calib",r_calib,w_calib), - YAML_SIGNED( "mid", 16 ), - YAML_SIGNED( "spanNeg", 16 ), - YAML_SIGNED( "spanPos", 16 ), - YAML_END -}; -static const struct YamlNode struct_signed_16[] = { - YAML_IDX, - YAML_SIGNED( "val", 16 ), - YAML_END -}; -static const struct YamlNode struct_TrainerMix[] = { - YAML_IDX, - YAML_UNSIGNED( "srcChn", 6 ), - YAML_ENUM("mode", 2, enum_TrainerMultiplex), - YAML_SIGNED( "studWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_TrainerData[] = { - YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), - YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_1[] = { - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_anonymous_2[] = { - YAML_SIGNED( "val", 16 ), - YAML_UNSIGNED( "mode", 8 ), - YAML_UNSIGNED( "param", 8 ), - YAML_SIGNED( "spare", 32 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_3[] = { - YAML_SIGNED( "val1", 32 ), - YAML_SIGNED( "val2", 32 ), - YAML_END -}; -static const struct YamlNode union_anonymous_0_elmts[] = { - YAML_STRUCT("play", 48, struct_anonymous_1, NULL), - YAML_STRUCT("all", 64, struct_anonymous_2, NULL), - YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), - YAML_END -}; -static const struct YamlNode struct_CustomFunctionData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), - YAML_CUSTOM("def",r_customFn,w_customFn), - YAML_PADDING( 64 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; -static const struct YamlNode struct_RadioData[] = { - YAML_UNSIGNED( "manuallyEdited", 1 ), - YAML_PADDING( 7 ), - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 5, struct_CalibData, NULL), - YAML_PADDING( 16 ), - YAML_SIGNED( "currModel", 8 ), - YAML_UNSIGNED( "contrast", 8 ), - YAML_UNSIGNED( "vBatWarn", 8 ), - YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_ENUM("backlightMode", 3, enum_BacklightMode), - YAML_ENUM("antennaMode", 2, enum_AntennaModes), - YAML_UNSIGNED( "disableRtcWarning", 1 ), - YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), - YAML_ENUM("internalModule", 8, enum_ModuleType), - YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), - YAML_UNSIGNED( "alarmsFlash", 1 ), - YAML_UNSIGNED( "disableMemoryWarning", 1 ), - YAML_UNSIGNED( "disableAlarmWarning", 1 ), - YAML_UNSIGNED( "stickMode", 2 ), - YAML_SIGNED( "timezone", 5 ), - YAML_UNSIGNED( "adjustRTC", 1 ), - YAML_UNSIGNED( "inactivityTimer", 8 ), - YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr), - YAML_UNSIGNED( "internalModuleBaudrate", 3 ), - YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), - YAML_SIGNED( "switchesDelay", 8 ), - YAML_UNSIGNED( "lightAutoOff", 8 ), - YAML_UNSIGNED( "templateSetup", 8 ), - YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), - YAML_UNSIGNED( "gpsFormat", 1 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), - YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), - YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), - YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), - YAML_UNSIGNED( "backlightBright", 8 ), - YAML_UNSIGNED( "globalTimer", 32 ), - YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), - YAML_UNSIGNED( "countryCode", 2 ), - YAML_SIGNED( "pwrOnSpeed", 3 ), - YAML_SIGNED( "pwrOffSpeed", 3 ), - YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr), - YAML_UNSIGNED( "noJitterFilter", 1 ), - YAML_UNSIGNED( "imperial", 1 ), - YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), - YAML_UNSIGNED( "USBMode", 2 ), - YAML_UNSIGNED( "jackMode", 2 ), - YAML_PADDING( 1 ), - YAML_STRING("ttsLanguage", 2), - YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), - YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), - YAML_SIGNED( "varioRepeat", 8 ), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), - YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), - YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), - YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 168 ), - YAML_PADDING( 120 ), - YAML_PADDING( 8 ), - YAML_STRING("bluetoothName", 10), - YAML_STRING("ownerRegistrationID", 8), - YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), - YAML_UNSIGNED( "rotEncMode", 2 ), - YAML_SIGNED( "uartSampleMode", 2 ), - YAML_PADDING( 3 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "radioGFDisabled", 1 ), - YAML_UNSIGNED( "radioTrainerDisabled", 1 ), - YAML_UNSIGNED( "modelHeliDisabled", 1 ), - YAML_UNSIGNED( "modelFMDisabled", 1 ), - YAML_UNSIGNED( "modelCurvesDisabled", 1 ), - YAML_UNSIGNED( "modelGVDisabled", 1 ), - YAML_UNSIGNED( "modelLSDisabled", 1 ), - YAML_UNSIGNED( "modelSFDisabled", 1 ), - YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ), - YAML_UNSIGNED( "modelTelemetryDisabled", 1 ), - YAML_END -}; -static const struct YamlNode struct_unsigned_8[] = { - YAML_IDX, - YAML_UNSIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_ModelHeader[] = { - YAML_STRING("name", 10), - YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_TimerData[] = { - YAML_IDX, - YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), - YAML_SIGNED( "value", 22 ), - YAML_ENUM("mode", 3, enum_TimerModes), - YAML_UNSIGNED( "countdownBeep", 2 ), - YAML_UNSIGNED( "minuteBeep", 1 ), - YAML_UNSIGNED( "persistent", 2 ), - YAML_SIGNED( "countdownStart", 2 ), - YAML_UNSIGNED( "showElapsed", 1 ), - YAML_UNSIGNED( "extraHaptic", 1 ), - YAML_PADDING( 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_CurveRef[] = { - YAML_UNSIGNED( "type", 8 ), - YAML_SIGNED_CUST( "value", 8, in_read_weight, in_write_weight ), - YAML_END -}; -static const struct YamlNode struct_MixData[] = { - YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "destCh", 5 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "carryTrim", 1 ), - YAML_UNSIGNED( "mixWarn", 2 ), - YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_UNSIGNED( "delayUp", 8 ), - YAML_UNSIGNED( "delayDown", 8 ), - YAML_UNSIGNED( "speedUp", 8 ), - YAML_UNSIGNED( "speedDown", 8 ), - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_LimitData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ), - YAML_SIGNED( "ppmCenter", 10 ), - YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "symetrical", 1 ), - YAML_UNSIGNED( "revert", 1 ), - YAML_PADDING( 3 ), - YAML_SIGNED( "curve", 8 ), - YAML_STRING("name", 4), - YAML_END -}; -static const struct YamlNode struct_ExpoData[] = { - YAML_UNSIGNED( "mode", 2 ), - YAML_UNSIGNED( "scale", 14 ), - YAML_CUSTOM("carryTrim",r_carryTrim,nullptr), - YAML_SIGNED( "trimSource", 6 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_END -}; -static const struct YamlNode struct_CurveHeader[] = { - YAML_IDX, - YAML_UNSIGNED( "type", 1 ), - YAML_UNSIGNED( "smooth", 1 ), - YAML_SIGNED( "points", 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_signed_8[] = { - YAML_IDX, - YAML_SIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_LogicalSwitchData[] = { - YAML_IDX, - YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_CUSTOM("def",r_logicSw,w_logicSw), - YAML_PADDING( 10 ), - YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 1 ), - YAML_PADDING( 2 ), - YAML_PADDING( 16 ), - YAML_UNSIGNED( "delay", 8 ), - YAML_UNSIGNED( "duration", 8 ), - YAML_END -}; -static const struct YamlNode struct_SwashRingData[] = { - YAML_ENUM("type", 8, enum_SwashType), - YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "collectiveWeight", 8 ), - YAML_SIGNED( "aileronWeight", 8 ), - YAML_SIGNED( "elevatorWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_trim_t[] = { - YAML_IDX, - YAML_SIGNED( "value", 11 ), - YAML_UNSIGNED( "mode", 5 ), - YAML_END -}; -static const struct YamlNode struct_FlightModeData[] = { - YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), - YAML_UNSIGNED( "fadeIn", 8 ), - YAML_UNSIGNED( "fadeOut", 8 ), - YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), - YAML_END -}; -static const struct YamlNode struct_GVarData[] = { - YAML_IDX, - YAML_STRING("name", 3), - YAML_UNSIGNED( "min", 12 ), - YAML_UNSIGNED( "max", 12 ), - YAML_UNSIGNED( "popup", 1 ), - YAML_UNSIGNED( "prec", 1 ), - YAML_UNSIGNED( "unit", 2 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), - YAML_UNSIGNED( "centerSilent", 1 ), - YAML_SIGNED( "centerMax", 8 ), - YAML_SIGNED( "centerMin", 8 ), - YAML_SIGNED( "min", 8 ), - YAML_SIGNED( "max", 8 ), - YAML_END -}; -static const struct YamlNode struct_RssiAlarmData[] = { - YAML_CUSTOM("disabled",r_rssiDisabled,nullptr), - YAML_CUSTOM("warning",r_rssiWarning,nullptr), - YAML_CUSTOM("critical",r_rssiCritical,nullptr), - YAML_END -}; -static const struct YamlNode struct_RFAlarmData[] = { - YAML_SIGNED( "warning", 8 ), - YAML_SIGNED( "critical", 8 ), - YAML_END -}; -static const struct YamlNode struct_PpmModule[] = { - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_UNSIGNED( "outputType", 1 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_5[] = { - YAML_PADDING( 8 ), - YAML_UNSIGNED( "disableTelemetry", 1 ), - YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "autoBindMode", 1 ), - YAML_UNSIGNED( "lowPowerMode", 1 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_PADDING( 2 ), - YAML_SIGNED( "optionValue", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "power", 2 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_SIGNED( "antennaMode", 2 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_7[] = { - YAML_PADDING( 6 ), - YAML_UNSIGNED( "noninverted", 1 ), - YAML_PADDING( 1 ), - YAML_SIGNED( "refreshRate", 8 ), - YAML_END -}; -static const struct YamlNode struct_string_64[] = { - YAML_IDX, - YAML_STRING("val", 8), - YAML_END -}; -static const struct YamlNode struct_anonymous_8[] = { - YAML_UNSIGNED( "receivers", 7 ), - YAML_UNSIGNED( "racingMode", 1 ), - YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_9[] = { - YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), - YAML_UNSIGNED( "mode", 3 ), - YAML_UNSIGNED( "rfPower", 1 ), - YAML_UNSIGNED( "reserved", 4 ), - YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_10[] = { - YAML_UNSIGNED( "emi", 2 ), - YAML_UNSIGNED( "telemetry", 1 ), - YAML_UNSIGNED( "phyMode", 3 ), - YAML_UNSIGNED( "reserved", 2 ), - YAML_UNSIGNED( "rfPower", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_11[] = { - YAML_UNSIGNED( "raw12bits", 1 ), - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_12[] = { - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_13[] = { - YAML_UNSIGNED( "flags", 8 ), - YAML_END -}; -static const struct YamlNode union_anonymous_4_elmts[] = { - YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), - YAML_STRUCT("ppm", 16, struct_PpmModule, NULL), - YAML_STRUCT("multi", 24, struct_anonymous_5, NULL), - YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL), - YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL), - YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL), - YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), - YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), - YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), - YAML_END -}; -static const struct YamlNode struct_ModuleData[] = { - YAML_IDX, - YAML_ENUM("type", 8, enum_ModuleType), - YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), - YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), - YAML_PADDING( 4 ), - YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), - YAML_END -}; -static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_PADDING( 1 ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput_elmts[] = { - YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput[] = { - YAML_IDX, - YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), - YAML_END -}; -static const struct YamlNode struct_ScriptData[] = { - YAML_IDX, - YAML_STRING("file", 6), - YAML_STRING("name", 6), - YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), - YAML_END -}; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_UNSIGNED( "id", 16 ), - YAML_UNSIGNED( "persistentValue", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_16[] = { - YAML_UNSIGNED( "physID", 5 ), - YAML_UNSIGNED( "rxIndex", 3 ), - YAML_END -}; -static const struct YamlNode union_anonymous_15_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL), - YAML_UNSIGNED( "instance", 8 ), - YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), - YAML_END -}; -static const struct YamlNode struct_anonymous_18[] = { - YAML_UNSIGNED( "ratio", 16 ), - YAML_SIGNED( "offset", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_19[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_UNSIGNED( "index", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_20[] = { - YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_21[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_PADDING( 24 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_22[] = { - YAML_UNSIGNED( "gps", 8 ), - YAML_UNSIGNED( "alt", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode union_anonymous_17_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_18, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_19, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_20, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_22, NULL), - YAML_UNSIGNED( "param", 32 ), - YAML_END -}; -static const struct YamlNode struct_TelemetrySensor[] = { - YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2), - YAML_STRING("label", 4), - YAML_UNSIGNED( "subId", 8 ), - YAML_ENUM("type", 1, enum_TelemetrySensorType), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "unit", 6 ), - YAML_UNSIGNED( "prec", 2 ), - YAML_UNSIGNED( "autoOffset", 1 ), - YAML_UNSIGNED( "filter", 1 ), - YAML_UNSIGNED( "logs", 1 ), - YAML_UNSIGNED( "persistent", 1 ), - YAML_UNSIGNED( "onlyPositive", 1 ), - YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg), - YAML_END -}; -static const struct YamlNode struct_FrSkyBarData[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "barMin", 16 ), - YAML_SIGNED( "barMax", 16 ), - YAML_END -}; -static const struct YamlNode struct_LineDataSource[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode struct_FrSkyLineData[] = { - YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScriptData[] = { - YAML_STRING("file", 6), - YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), - YAML_END -}; -static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { - YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), - YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), - YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScreenData[] = { - YAML_IDX, - YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), - YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), - YAML_END -}; -static const struct YamlNode struct_USBJoystickChData[] = { - YAML_IDX, - YAML_ENUM("mode", 3, enum_USBJoystickCh), - YAML_UNSIGNED( "inversion", 1 ), - YAML_UNSIGNED( "param", 4 ), - YAML_UNSIGNED( "btn_num", 5 ), - YAML_UNSIGNED( "switch_npos", 3 ), - YAML_END -}; -static const struct YamlNode struct_ModelData[] = { - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_UNSIGNED( "telemetryProtocol", 3 ), - YAML_UNSIGNED( "thrTrim", 1 ), - YAML_UNSIGNED( "noGlobalFunctions", 1 ), - YAML_UNSIGNED( "displayTrims", 2 ), - YAML_UNSIGNED( "ignoreSensorIds", 1 ), - YAML_SIGNED( "trimInc", 3 ), - YAML_UNSIGNED( "disableThrottleWarning", 1 ), - YAML_UNSIGNED( "displayChecklist", 1 ), - YAML_UNSIGNED( "extendedLimits", 1 ), - YAML_UNSIGNED( "extendedTrims", 1 ), - YAML_UNSIGNED( "throttleReversed", 1 ), - YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ), - YAML_UNSIGNED( "disableTelemetryWarning", 1 ), - YAML_UNSIGNED( "showInstanceIds", 1 ), - YAML_PADDING( 5 ), - YAML_SIGNED( "customThrottleWarningPosition", 8 ), - YAML_UNSIGNED( "beepANACenter", 16 ), - YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), - YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), - YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), - YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), - YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), - YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), - YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), - YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), - YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), - YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL), - YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL), - YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), - YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable), - YAML_PADDING( 1 ), - YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), - YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), - YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), - YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), - YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 1, struct_signed_8, NULL), - YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_PADDING( 8 ), - YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_STRING("modelRegistrationID", 8), - YAML_UNSIGNED( "usbJoystickExtMode", 1 ), - YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode), - YAML_UNSIGNED( "usbJoystickCircularCut", 4 ), - YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL), - YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable), - YAML_END -}; -static const struct YamlNode struct_PartialModel[] = { - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_END -}; - -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29 - -static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); - -const YamlNode* get_radiodata_nodes() -{ - return &__RadioData_root_node; -} -static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); - -const YamlNode* get_modeldata_nodes() -{ - return &__ModelData_root_node; -} -static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); - -const YamlNode* get_partialmodel_nodes() -{ - return &__PartialModel_root_node; -} - diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 204c0e353..14fdb9d22 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -72,9 +72,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_PLAY_SOUND, "PLAY_SOUND" }, { FUNC_PLAY_TRACK, "PLAY_TRACK" }, { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, { FUNC_VARIO, "VARIO" }, @@ -102,52 +100,18 @@ const struct YamlIdStr enum_MixerMultiplex[] = { }; const struct YamlIdStr enum_MixSources[] = { { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, { MIXSRC_TILT_X, "TILT_X" }, { MIXSRC_TILT_Y, "TILT_Y" }, { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, { MIXSRC_TrimRud, "TrimRud" }, { MIXSRC_TrimEle, "TrimEle" }, { MIXSRC_TrimThr, "TrimThr" }, { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, + { MIXSRC_TrimT5, "TrimT5" }, + { MIXSRC_TrimT6, "TrimT6" }, { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, { MIXSRC_TX_TIME, "TX_TIME" }, { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, { 0, NULL } }; const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { @@ -182,34 +146,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, { SWSRC_ON, "ON" }, { SWSRC_ONE, "ONE" }, { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, @@ -320,24 +256,19 @@ static const struct YamlNode union_anonymous_0_elmts[] = { }; static const struct YamlNode struct_CustomFunctionData[] = { YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 6, enum_Functions), YAML_CUSTOM("def",r_customFn,w_customFn), YAML_PADDING( 64 ), YAML_PADDING( 8 ), YAML_END }; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; static const struct YamlNode struct_RadioData[] = { YAML_UNSIGNED( "manuallyEdited", 1 ), YAML_PADDING( 7 ), YAML_CUSTOM("semver",nullptr,w_semver), YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), + YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL), YAML_PADDING( 16 ), YAML_SIGNED( "currModel", 8 ), YAML_UNSIGNED( "contrast", 8 ), @@ -404,14 +335,11 @@ static const struct YamlNode struct_RadioData[] = { YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), + YAML_ARRAY("sticksConfig", 0, MAX_STICKS, struct_stickConfig, stick_name_valid), + YAML_ARRAY("slidersConfig", 0, MAX_POTS, struct_sliderConfig, nullptr), + YAML_ARRAY("potsConfig", 4, 8, struct_potConfig, nullptr), + YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr), YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 144 ), - YAML_PADDING( 144 ), YAML_PADDING( 8 ), YAML_STRING("bluetoothName", 10), YAML_STRING("ownerRegistrationID", 8), @@ -473,8 +401,8 @@ static const struct YamlNode struct_MixData[] = { YAML_UNSIGNED( "mixWarn", 2 ), YAML_ENUM("mltpx", 2, enum_MixerMultiplex), YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "offset", 13, in_read_weight, in_write_weight ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), YAML_UNSIGNED( "delayUp", 8 ), @@ -504,10 +432,9 @@ static const struct YamlNode struct_ExpoData[] = { YAML_SIGNED( "trimSource", 6 ), YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), YAML_STRING("name", 6), YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), YAML_STRUCT("curve", 16, struct_CurveRef, NULL), @@ -532,9 +459,9 @@ static const struct YamlNode struct_LogicalSwitchData[] = { YAML_CUSTOM("def",r_logicSw,w_logicSw), YAML_PADDING( 10 ), YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED_CUST( "andsw", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 1 ), YAML_PADDING( 1 ), - YAML_PADDING( 2 ), YAML_PADDING( 16 ), YAML_UNSIGNED( "delay", 8 ), YAML_UNSIGNED( "duration", 8 ), @@ -559,10 +486,10 @@ static const struct YamlNode struct_trim_t[] = { }; static const struct YamlNode struct_FlightModeData[] = { YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), + YAML_ARRAY("trim", 16, 6, struct_trim_t, NULL), YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), YAML_UNSIGNED( "fadeIn", 8 ), YAML_UNSIGNED( "fadeOut", 8 ), YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), @@ -727,6 +654,11 @@ static const struct YamlNode struct_ScriptData[] = { YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), YAML_END }; +static const struct YamlNode struct_string_24[] = { + YAML_IDX, + YAML_STRING("val", 3), + YAML_END +}; static const struct YamlNode union_anonymous_14_elmts[] = { YAML_UNSIGNED( "id", 16 ), YAML_UNSIGNED( "persistentValue", 16 ), @@ -869,10 +801,10 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), + YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active), YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), + YAML_PADDING( 64 ), YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), YAML_STRUCT("varioData", 40, struct_VarioData, NULL), YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), @@ -887,8 +819,8 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 8 ), + YAML_ARRAY("potsWarnPosition", 8, 8, struct_signed_8, NULL), YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), YAML_PADDING( 8 ), YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), diff --git a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp deleted file mode 100644 index 0918d6f2e..000000000 --- a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp +++ /dev/null @@ -1,943 +0,0 @@ -// generated by generate_yaml.py - -// -// Enums first -// - -const struct YamlIdStr enum_BacklightMode[] = { - { e_backlight_mode_off, "backlight_mode_off" }, - { e_backlight_mode_keys, "backlight_mode_keys" }, - { e_backlight_mode_sticks, "backlight_mode_sticks" }, - { e_backlight_mode_all, "backlight_mode_all" }, - { e_backlight_mode_on, "backlight_mode_on" }, - { 0, NULL } -}; -const struct YamlIdStr enum_AntennaModes[] = { - { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, - { ANTENNA_MODE_ASK, "MODE_ASK" }, - { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, - { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModuleType[] = { - { MODULE_TYPE_NONE, "TYPE_NONE" }, - { MODULE_TYPE_PPM, "TYPE_PPM" }, - { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, - { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, - { MODULE_TYPE_DSM2, "TYPE_DSM2" }, - { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, - { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, - { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, - { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, - { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, - { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, - { MODULE_TYPE_GHOST, "TYPE_GHOST" }, - { MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" }, - { MODULE_TYPE_SBUS, "TYPE_SBUS" }, - { MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" }, - { MODULE_TYPE_FLYSKY, "TYPE_FLYSKY" }, - { MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TrainerMultiplex[] = { - { TRAINER_OFF, "OFF" }, - { TRAINER_ADD, "ADD" }, - { TRAINER_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BeeperMode[] = { - { e_mode_quiet, "mode_quiet" }, - { e_mode_alarms, "mode_alarms" }, - { e_mode_nokeys, "mode_nokeys" }, - { e_mode_all, "mode_all" }, - { 0, NULL } -}; -const struct YamlIdStr enum_BluetoothModes[] = { - { BLUETOOTH_OFF, "OFF" }, - { BLUETOOTH_TELEMETRY, "TELEMETRY" }, - { BLUETOOTH_TRAINER, "TRAINER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_Functions[] = { - { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, - { FUNC_TRAINER, "TRAINER" }, - { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, - { FUNC_RESET, "RESET" }, - { FUNC_SET_TIMER, "SET_TIMER" }, - { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, - { FUNC_VOLUME, "VOLUME" }, - { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, - { FUNC_RANGECHECK, "RANGECHECK" }, - { FUNC_BIND, "BIND" }, - { FUNC_PLAY_SOUND, "PLAY_SOUND" }, - { FUNC_PLAY_TRACK, "PLAY_TRACK" }, - { FUNC_PLAY_VALUE, "PLAY_VALUE" }, - { FUNC_RESERVE4, "RESERVE4" }, - { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, - { FUNC_RESERVE5, "RESERVE5" }, - { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, - { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, - { FUNC_VARIO, "VARIO" }, - { FUNC_HAPTIC, "HAPTIC" }, - { FUNC_LOGS, "LOGS" }, - { FUNC_BACKLIGHT, "BACKLIGHT" }, - { FUNC_SCREENSHOT, "SCREENSHOT" }, - { FUNC_RACING_MODE, "RACING_MODE" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TimerModes[] = { - { TMRMODE_OFF, "OFF" }, - { TMRMODE_ON, "ON" }, - { TMRMODE_START, "START" }, - { TMRMODE_THR, "THR" }, - { TMRMODE_THR_REL, "THR_REL" }, - { TMRMODE_THR_START, "THR_START" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixerMultiplex[] = { - { MLTPX_ADD, "ADD" }, - { MLTPX_MUL, "MUL" }, - { MLTPX_REPL, "REPL" }, - { 0, NULL } -}; -const struct YamlIdStr enum_MixSources[] = { - { MIXSRC_NONE, "NONE" }, - { MIXSRC_Rud, "Rud" }, - { MIXSRC_Ele, "Ele" }, - { MIXSRC_Thr, "Thr" }, - { MIXSRC_Ail, "Ail" }, - { MIXSRC_POT1, "POT1" }, - { MIXSRC_POT2, "POT2" }, - { MIXSRC_MAX, "MAX" }, - { MIXSRC_CYC1, "CYC1" }, - { MIXSRC_CYC2, "CYC2" }, - { MIXSRC_CYC3, "CYC3" }, - { MIXSRC_TrimRud, "TrimRud" }, - { MIXSRC_TrimEle, "TrimEle" }, - { MIXSRC_TrimThr, "TrimThr" }, - { MIXSRC_TrimAil, "TrimAil" }, - { MIXSRC_SA, "SA" }, - { MIXSRC_SB, "SB" }, - { MIXSRC_SC, "SC" }, - { MIXSRC_SD, "SD" }, - { MIXSRC_SE, "SE" }, - { MIXSRC_SF, "SF" }, - { MIXSRC_SG, "SG" }, - { MIXSRC_SH, "SH" }, - { MIXSRC_SW1, "SW1" }, - { MIXSRC_CH1, "CH1" }, - { MIXSRC_CH2, "CH2" }, - { MIXSRC_CH3, "CH3" }, - { MIXSRC_CH4, "CH4" }, - { MIXSRC_CH5, "CH5" }, - { MIXSRC_CH6, "CH6" }, - { MIXSRC_CH7, "CH7" }, - { MIXSRC_CH8, "CH8" }, - { MIXSRC_CH9, "CH9" }, - { MIXSRC_CH10, "CH10" }, - { MIXSRC_CH11, "CH11" }, - { MIXSRC_CH12, "CH12" }, - { MIXSRC_CH13, "CH13" }, - { MIXSRC_CH14, "CH14" }, - { MIXSRC_CH15, "CH15" }, - { MIXSRC_CH16, "CH16" }, - { MIXSRC_GVAR1, "GVAR1" }, - { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, - { MIXSRC_TX_TIME, "TX_TIME" }, - { MIXSRC_TX_GPS, "TX_GPS" }, - { MIXSRC_TIMER1, "TIMER1" }, - { MIXSRC_TIMER2, "TIMER2" }, - { MIXSRC_TIMER3, "TIMER3" }, - { 0, NULL } -}; -const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { - { LS_FUNC_NONE, "FUNC_NONE" }, - { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, - { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, - { LS_FUNC_VPOS, "FUNC_VPOS" }, - { LS_FUNC_VNEG, "FUNC_VNEG" }, - { LS_FUNC_RANGE, "FUNC_RANGE" }, - { LS_FUNC_APOS, "FUNC_APOS" }, - { LS_FUNC_ANEG, "FUNC_ANEG" }, - { LS_FUNC_AND, "FUNC_AND" }, - { LS_FUNC_OR, "FUNC_OR" }, - { LS_FUNC_XOR, "FUNC_XOR" }, - { LS_FUNC_EDGE, "FUNC_EDGE" }, - { LS_FUNC_EQUAL, "FUNC_EQUAL" }, - { LS_FUNC_GREATER, "FUNC_GREATER" }, - { LS_FUNC_LESS, "FUNC_LESS" }, - { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, - { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, - { LS_FUNC_TIMER, "FUNC_TIMER" }, - { LS_FUNC_STICKY, "FUNC_STICKY" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwashType[] = { - { SWASH_TYPE_NONE, "TYPE_NONE" }, - { SWASH_TYPE_120, "TYPE_120" }, - { SWASH_TYPE_120X, "TYPE_120X" }, - { SWASH_TYPE_140, "TYPE_140" }, - { SWASH_TYPE_90, "TYPE_90" }, - { 0, NULL } -}; -const struct YamlIdStr enum_SwitchSources[] = { - { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_TrimRudLeft, "TrimRudLeft" }, - { SWSRC_TrimRudRight, "TrimRudRight" }, - { SWSRC_TrimEleDown, "TrimEleDown" }, - { SWSRC_TrimEleUp, "TrimEleUp" }, - { SWSRC_TrimThrDown, "TrimThrDown" }, - { SWSRC_TrimThrUp, "TrimThrUp" }, - { SWSRC_TrimAilLeft, "TrimAilLeft" }, - { SWSRC_TrimAilRight, "TrimAilRight" }, - { SWSRC_SW1, "SW1" }, - { SWSRC_SW2, "SW2" }, - { SWSRC_ON, "ON" }, - { SWSRC_ONE, "ONE" }, - { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, - { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, - { SWSRC_OFF, "OFF" }, - { 0, NULL } -}; -const struct YamlIdStr enum_PotsWarnMode[] = { - { POTS_WARN_OFF, "WARN_OFF" }, - { POTS_WARN_MANUAL, "WARN_MANUAL" }, - { POTS_WARN_AUTO, "WARN_AUTO" }, - { 0, NULL } -}; -const struct YamlIdStr enum_ModelOverridableEnable[] = { - { OVERRIDE_GLOBAL, "GLOBAL" }, - { OVERRIDE_OFF, "OFF" }, - { OVERRIDE_ON, "ON" }, - { 0, NULL } -}; -const struct YamlIdStr enum_FailsafeModes[] = { - { FAILSAFE_NOT_SET, "NOT_SET" }, - { FAILSAFE_HOLD, "HOLD" }, - { FAILSAFE_CUSTOM, "CUSTOM" }, - { FAILSAFE_NOPULSES, "NOPULSES" }, - { FAILSAFE_RECEIVER, "RECEIVER" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorFormula[] = { - { TELEM_FORMULA_ADD, "FORMULA_ADD" }, - { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, - { TELEM_FORMULA_MIN, "FORMULA_MIN" }, - { TELEM_FORMULA_MAX, "FORMULA_MAX" }, - { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, - { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, - { TELEM_FORMULA_CELL, "FORMULA_CELL" }, - { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, - { TELEM_FORMULA_DIST, "FORMULA_DIST" }, - { 0, NULL } -}; -const struct YamlIdStr enum_TelemetrySensorType[] = { - { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, - { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickIfMode[] = { - { USBJOYS_JOYSTICK, "JOYSTICK" }, - { USBJOYS_GAMEPAD, "GAMEPAD" }, - { USBJOYS_MULTIAXIS, "MULTIAXIS" }, - { 0, NULL } -}; -const struct YamlIdStr enum_USBJoystickCh[] = { - { USBJOYS_CH_NONE, "CH_NONE" }, - { USBJOYS_CH_BUTTON, "CH_BUTTON" }, - { USBJOYS_CH_AXIS, "CH_AXIS" }, - { USBJOYS_CH_SIM, "CH_SIM" }, - { 0, NULL } -}; - -// -// Structs last -// - -static const struct YamlNode struct_CalibData[] = { - YAML_IDX_CUST("calib",r_calib,w_calib), - YAML_SIGNED( "mid", 16 ), - YAML_SIGNED( "spanNeg", 16 ), - YAML_SIGNED( "spanPos", 16 ), - YAML_END -}; -static const struct YamlNode struct_signed_16[] = { - YAML_IDX, - YAML_SIGNED( "val", 16 ), - YAML_END -}; -static const struct YamlNode struct_TrainerMix[] = { - YAML_IDX, - YAML_UNSIGNED( "srcChn", 6 ), - YAML_ENUM("mode", 2, enum_TrainerMultiplex), - YAML_SIGNED( "studWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_TrainerData[] = { - YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), - YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_1[] = { - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_anonymous_2[] = { - YAML_SIGNED( "val", 16 ), - YAML_UNSIGNED( "mode", 8 ), - YAML_UNSIGNED( "param", 8 ), - YAML_SIGNED( "spare", 32 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_3[] = { - YAML_SIGNED( "val1", 32 ), - YAML_SIGNED( "val2", 32 ), - YAML_END -}; -static const struct YamlNode union_anonymous_0_elmts[] = { - YAML_STRUCT("play", 48, struct_anonymous_1, NULL), - YAML_STRUCT("all", 64, struct_anonymous_2, NULL), - YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), - YAML_END -}; -static const struct YamlNode struct_CustomFunctionData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_ENUM("func", 7, enum_Functions), - YAML_CUSTOM("def",r_customFn,w_customFn), - YAML_PADDING( 64 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_string_24[] = { - YAML_IDX, - YAML_STRING("val", 3), - YAML_END -}; -static const struct YamlNode struct_RadioData[] = { - YAML_UNSIGNED( "manuallyEdited", 1 ), - YAML_PADDING( 7 ), - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_CUSTOM("board",nullptr,w_board), - YAML_ARRAY("calib", 48, 6, struct_CalibData, NULL), - YAML_PADDING( 16 ), - YAML_SIGNED( "currModel", 8 ), - YAML_UNSIGNED( "contrast", 8 ), - YAML_UNSIGNED( "vBatWarn", 8 ), - YAML_SIGNED( "txVoltageCalibration", 8 ), - YAML_ENUM("backlightMode", 3, enum_BacklightMode), - YAML_ENUM("antennaMode", 2, enum_AntennaModes), - YAML_UNSIGNED( "disableRtcWarning", 1 ), - YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), - YAML_ENUM("internalModule", 8, enum_ModuleType), - YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "fai", 1 ), - YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), - YAML_UNSIGNED( "alarmsFlash", 1 ), - YAML_UNSIGNED( "disableMemoryWarning", 1 ), - YAML_UNSIGNED( "disableAlarmWarning", 1 ), - YAML_UNSIGNED( "stickMode", 2 ), - YAML_SIGNED( "timezone", 5 ), - YAML_UNSIGNED( "adjustRTC", 1 ), - YAML_UNSIGNED( "inactivityTimer", 8 ), - YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr), - YAML_UNSIGNED( "internalModuleBaudrate", 3 ), - YAML_SIGNED( "splashMode", 3 ), - YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), - YAML_SIGNED( "switchesDelay", 8 ), - YAML_UNSIGNED( "lightAutoOff", 8 ), - YAML_UNSIGNED( "templateSetup", 8 ), - YAML_SIGNED( "PPM_Multiplier", 8 ), - YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), - YAML_UNSIGNED( "gpsFormat", 1 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), - YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), - YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), - YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), - YAML_UNSIGNED( "backlightBright", 8 ), - YAML_UNSIGNED( "globalTimer", 32 ), - YAML_UNSIGNED( "bluetoothBaudrate", 4 ), - YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes), - YAML_UNSIGNED( "countryCode", 2 ), - YAML_SIGNED( "pwrOnSpeed", 3 ), - YAML_SIGNED( "pwrOffSpeed", 3 ), - YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr), - YAML_UNSIGNED( "noJitterFilter", 1 ), - YAML_UNSIGNED( "imperial", 1 ), - YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), - YAML_UNSIGNED( "USBMode", 2 ), - YAML_UNSIGNED( "jackMode", 2 ), - YAML_PADDING( 1 ), - YAML_STRING("ttsLanguage", 2), - YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), - YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), - YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), - YAML_SIGNED( "varioRepeat", 8 ), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), - YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), - YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), - YAML_ARRAY("slidersConfig", 1, 4, struct_sliderConfig, nullptr), - YAML_PADDING( 4 ), - YAML_ARRAY("potsConfig", 2, 4, struct_potConfig, nullptr), - YAML_UNSIGNED( "backlightColor", 8 ), - YAML_ARRAY("sticksConfig", 0, 4, struct_sticksConfig, stick_name_valid), - YAML_ARRAY("switchConfig", 2, 8, struct_switchConfig, nullptr), - YAML_PADDING( 192 ), - YAML_PADDING( 144 ), - YAML_PADDING( 8 ), - YAML_STRING("bluetoothName", 10), - YAML_STRING("ownerRegistrationID", 8), - YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), - YAML_UNSIGNED( "rotEncMode", 2 ), - YAML_SIGNED( "uartSampleMode", 2 ), - YAML_PADDING( 3 ), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "radioGFDisabled", 1 ), - YAML_UNSIGNED( "radioTrainerDisabled", 1 ), - YAML_UNSIGNED( "modelHeliDisabled", 1 ), - YAML_UNSIGNED( "modelFMDisabled", 1 ), - YAML_UNSIGNED( "modelCurvesDisabled", 1 ), - YAML_UNSIGNED( "modelGVDisabled", 1 ), - YAML_UNSIGNED( "modelLSDisabled", 1 ), - YAML_UNSIGNED( "modelSFDisabled", 1 ), - YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ), - YAML_UNSIGNED( "modelTelemetryDisabled", 1 ), - YAML_END -}; -static const struct YamlNode struct_unsigned_8[] = { - YAML_IDX, - YAML_UNSIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_ModelHeader[] = { - YAML_STRING("name", 10), - YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_TimerData[] = { - YAML_IDX, - YAML_UNSIGNED( "start", 22 ), - YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), - YAML_SIGNED( "value", 22 ), - YAML_ENUM("mode", 3, enum_TimerModes), - YAML_UNSIGNED( "countdownBeep", 2 ), - YAML_UNSIGNED( "minuteBeep", 1 ), - YAML_UNSIGNED( "persistent", 2 ), - YAML_SIGNED( "countdownStart", 2 ), - YAML_UNSIGNED( "showElapsed", 1 ), - YAML_UNSIGNED( "extraHaptic", 1 ), - YAML_PADDING( 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_CurveRef[] = { - YAML_UNSIGNED( "type", 8 ), - YAML_SIGNED_CUST( "value", 8, in_read_weight, in_write_weight ), - YAML_END -}; -static const struct YamlNode struct_MixData[] = { - YAML_SIGNED_CUST( "weight", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "destCh", 5 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "carryTrim", 1 ), - YAML_UNSIGNED( "mixWarn", 2 ), - YAML_ENUM("mltpx", 2, enum_MixerMultiplex), - YAML_PADDING( 1 ), - YAML_SIGNED_CUST( "offset", 14, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_UNSIGNED( "delayUp", 8 ), - YAML_UNSIGNED( "delayDown", 8 ), - YAML_UNSIGNED( "speedUp", 8 ), - YAML_UNSIGNED( "speedDown", 8 ), - YAML_STRING("name", 6), - YAML_END -}; -static const struct YamlNode struct_LimitData[] = { - YAML_IDX, - YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ), - YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ), - YAML_SIGNED( "ppmCenter", 10 ), - YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ), - YAML_UNSIGNED( "symetrical", 1 ), - YAML_UNSIGNED( "revert", 1 ), - YAML_PADDING( 3 ), - YAML_SIGNED( "curve", 8 ), - YAML_STRING("name", 4), - YAML_END -}; -static const struct YamlNode struct_ExpoData[] = { - YAML_UNSIGNED( "mode", 2 ), - YAML_UNSIGNED( "scale", 14 ), - YAML_CUSTOM("carryTrim",r_carryTrim,nullptr), - YAML_SIGNED( "trimSource", 6 ), - YAML_UNSIGNED_CUST( "srcRaw", 10, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED( "chn", 5 ), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), - YAML_SIGNED_CUST( "weight", 8, in_read_weight, in_write_weight ), - YAML_PADDING( 1 ), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "offset", 8, in_read_weight, in_write_weight ), - YAML_STRUCT("curve", 16, struct_CurveRef, NULL), - YAML_END -}; -static const struct YamlNode struct_CurveHeader[] = { - YAML_IDX, - YAML_UNSIGNED( "type", 1 ), - YAML_UNSIGNED( "smooth", 1 ), - YAML_SIGNED( "points", 6 ), - YAML_STRING("name", 3), - YAML_END -}; -static const struct YamlNode struct_signed_8[] = { - YAML_IDX, - YAML_SIGNED( "val", 8 ), - YAML_END -}; -static const struct YamlNode struct_LogicalSwitchData[] = { - YAML_IDX, - YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions), - YAML_CUSTOM("def",r_logicSw,w_logicSw), - YAML_PADDING( 10 ), - YAML_PADDING( 10 ), - YAML_SIGNED_CUST( "andsw", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 1 ), - YAML_PADDING( 2 ), - YAML_PADDING( 16 ), - YAML_UNSIGNED( "delay", 8 ), - YAML_UNSIGNED( "duration", 8 ), - YAML_END -}; -static const struct YamlNode struct_SwashRingData[] = { - YAML_ENUM("type", 8, enum_SwashType), - YAML_UNSIGNED( "value", 8 ), - YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "collectiveWeight", 8 ), - YAML_SIGNED( "aileronWeight", 8 ), - YAML_SIGNED( "elevatorWeight", 8 ), - YAML_END -}; -static const struct YamlNode struct_trim_t[] = { - YAML_IDX, - YAML_SIGNED( "value", 11 ), - YAML_UNSIGNED( "mode", 5 ), - YAML_END -}; -static const struct YamlNode struct_FlightModeData[] = { - YAML_IDX, - YAML_ARRAY("trim", 16, 4, struct_trim_t, NULL), - YAML_STRING("name", 6), - YAML_SIGNED_CUST( "swtch", 9, r_swtchSrc, w_swtchSrc ), - YAML_PADDING( 7 ), - YAML_UNSIGNED( "fadeIn", 8 ), - YAML_UNSIGNED( "fadeOut", 8 ), - YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active), - YAML_END -}; -static const struct YamlNode struct_GVarData[] = { - YAML_IDX, - YAML_STRING("name", 3), - YAML_UNSIGNED( "min", 12 ), - YAML_UNSIGNED( "max", 12 ), - YAML_UNSIGNED( "popup", 1 ), - YAML_UNSIGNED( "prec", 1 ), - YAML_UNSIGNED( "unit", 2 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_VarioData[] = { - YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), - YAML_UNSIGNED( "centerSilent", 1 ), - YAML_SIGNED( "centerMax", 8 ), - YAML_SIGNED( "centerMin", 8 ), - YAML_SIGNED( "min", 8 ), - YAML_SIGNED( "max", 8 ), - YAML_END -}; -static const struct YamlNode struct_RssiAlarmData[] = { - YAML_CUSTOM("disabled",r_rssiDisabled,nullptr), - YAML_CUSTOM("warning",r_rssiWarning,nullptr), - YAML_CUSTOM("critical",r_rssiCritical,nullptr), - YAML_END -}; -static const struct YamlNode struct_RFAlarmData[] = { - YAML_SIGNED( "warning", 8 ), - YAML_SIGNED( "critical", 8 ), - YAML_END -}; -static const struct YamlNode struct_PpmModule[] = { - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_UNSIGNED( "outputType", 1 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_5[] = { - YAML_PADDING( 8 ), - YAML_UNSIGNED( "disableTelemetry", 1 ), - YAML_UNSIGNED( "disableMapping", 1 ), - YAML_UNSIGNED( "autoBindMode", 1 ), - YAML_UNSIGNED( "lowPowerMode", 1 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_PADDING( 2 ), - YAML_SIGNED( "optionValue", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_6[] = { - YAML_UNSIGNED( "power", 2 ), - YAML_PADDING( 2 ), - YAML_UNSIGNED( "receiverTelemetryOff", 1 ), - YAML_UNSIGNED( "receiverHigherChannels", 1 ), - YAML_SIGNED( "antennaMode", 2 ), - YAML_PADDING( 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_7[] = { - YAML_PADDING( 6 ), - YAML_UNSIGNED( "noninverted", 1 ), - YAML_PADDING( 1 ), - YAML_SIGNED( "refreshRate", 8 ), - YAML_END -}; -static const struct YamlNode struct_string_64[] = { - YAML_IDX, - YAML_STRING("val", 8), - YAML_END -}; -static const struct YamlNode struct_anonymous_8[] = { - YAML_UNSIGNED( "receivers", 7 ), - YAML_UNSIGNED( "racingMode", 1 ), - YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_9[] = { - YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), - YAML_UNSIGNED( "mode", 3 ), - YAML_UNSIGNED( "rfPower", 1 ), - YAML_UNSIGNED( "reserved", 4 ), - YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_10[] = { - YAML_UNSIGNED( "emi", 2 ), - YAML_UNSIGNED( "telemetry", 1 ), - YAML_UNSIGNED( "phyMode", 3 ), - YAML_UNSIGNED( "reserved", 2 ), - YAML_UNSIGNED( "rfPower", 8 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_11[] = { - YAML_UNSIGNED( "raw12bits", 1 ), - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_PADDING( 4 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_12[] = { - YAML_UNSIGNED( "telemetryBaudrate", 3 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_13[] = { - YAML_UNSIGNED( "flags", 8 ), - YAML_END -}; -static const struct YamlNode union_anonymous_4_elmts[] = { - YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), - YAML_STRUCT("ppm", 16, struct_PpmModule, NULL), - YAML_STRUCT("multi", 24, struct_anonymous_5, NULL), - YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL), - YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL), - YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL), - YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), - YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), - YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), - YAML_STRUCT("crsf", 8, struct_anonymous_12, NULL), - YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL), - YAML_END -}; -static const struct YamlNode struct_ModuleData[] = { - YAML_IDX, - YAML_ENUM("type", 8, enum_ModuleType), - YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), - YAML_ENUM("failsafeMode", 4, enum_FailsafeModes), - YAML_PADDING( 4 ), - YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), - YAML_END -}; -static const struct YamlNode struct_TrainerModuleData[] = { - YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), - YAML_UNSIGNED( "channelsStart", 8 ), - YAML_SIGNED( "channelsCount", 8 ), - YAML_SIGNED( "frameLength", 8 ), - YAML_SIGNED( "delay", 6 ), - YAML_UNSIGNED( "pulsePol", 1 ), - YAML_PADDING( 1 ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput_elmts[] = { - YAML_SIGNED( "value", 16 ), - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode union_ScriptDataInput[] = { - YAML_IDX, - YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), - YAML_END -}; -static const struct YamlNode struct_ScriptData[] = { - YAML_IDX, - YAML_STRING("file", 6), - YAML_STRING("name", 6), - YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), - YAML_END -}; -static const struct YamlNode union_anonymous_14_elmts[] = { - YAML_UNSIGNED( "id", 16 ), - YAML_UNSIGNED( "persistentValue", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_16[] = { - YAML_UNSIGNED( "physID", 5 ), - YAML_UNSIGNED( "rxIndex", 3 ), - YAML_END -}; -static const struct YamlNode union_anonymous_15_elmts[] = { - YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL), - YAML_UNSIGNED( "instance", 8 ), - YAML_ENUM("formula", 8, enum_TelemetrySensorFormula), - YAML_END -}; -static const struct YamlNode struct_anonymous_18[] = { - YAML_UNSIGNED( "ratio", 16 ), - YAML_SIGNED( "offset", 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_19[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_UNSIGNED( "index", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_20[] = { - YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), - YAML_END -}; -static const struct YamlNode struct_anonymous_21[] = { - YAML_UNSIGNED( "source", 8 ), - YAML_PADDING( 24 ), - YAML_END -}; -static const struct YamlNode struct_anonymous_22[] = { - YAML_UNSIGNED( "gps", 8 ), - YAML_UNSIGNED( "alt", 8 ), - YAML_PADDING( 16 ), - YAML_END -}; -static const struct YamlNode union_anonymous_17_elmts[] = { - YAML_STRUCT("custom", 32, struct_anonymous_18, NULL), - YAML_STRUCT("cell", 32, struct_anonymous_19, NULL), - YAML_STRUCT("calc", 32, struct_anonymous_20, NULL), - YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL), - YAML_STRUCT("dist", 32, struct_anonymous_22, NULL), - YAML_UNSIGNED( "param", 32 ), - YAML_END -}; -static const struct YamlNode struct_TelemetrySensor[] = { - YAML_IDX, - YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1), - YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2), - YAML_STRING("label", 4), - YAML_UNSIGNED( "subId", 8 ), - YAML_ENUM("type", 1, enum_TelemetrySensorType), - YAML_PADDING( 1 ), - YAML_UNSIGNED( "unit", 6 ), - YAML_UNSIGNED( "prec", 2 ), - YAML_UNSIGNED( "autoOffset", 1 ), - YAML_UNSIGNED( "filter", 1 ), - YAML_UNSIGNED( "logs", 1 ), - YAML_UNSIGNED( "persistent", 1 ), - YAML_UNSIGNED( "onlyPositive", 1 ), - YAML_PADDING( 1 ), - YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg), - YAML_END -}; -static const struct YamlNode struct_FrSkyBarData[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_SIGNED( "barMin", 16 ), - YAML_SIGNED( "barMax", 16 ), - YAML_END -}; -static const struct YamlNode struct_LineDataSource[] = { - YAML_IDX, - YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ), - YAML_END -}; -static const struct YamlNode struct_FrSkyLineData[] = { - YAML_IDX, - YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScriptData[] = { - YAML_STRING("file", 6), - YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL), - YAML_END -}; -static const struct YamlNode union_TelemetryScreenData_u_elmts[] = { - YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL), - YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL), - YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL), - YAML_END -}; -static const struct YamlNode struct_TelemetryScreenData[] = { - YAML_IDX, - YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type), - YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data), - YAML_END -}; -static const struct YamlNode struct_USBJoystickChData[] = { - YAML_IDX, - YAML_ENUM("mode", 3, enum_USBJoystickCh), - YAML_UNSIGNED( "inversion", 1 ), - YAML_UNSIGNED( "param", 4 ), - YAML_UNSIGNED( "btn_num", 5 ), - YAML_UNSIGNED( "switch_npos", 3 ), - YAML_END -}; -static const struct YamlNode struct_ModelData[] = { - YAML_CUSTOM("semver",nullptr,w_semver), - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_UNSIGNED( "telemetryProtocol", 3 ), - YAML_UNSIGNED( "thrTrim", 1 ), - YAML_UNSIGNED( "noGlobalFunctions", 1 ), - YAML_UNSIGNED( "displayTrims", 2 ), - YAML_UNSIGNED( "ignoreSensorIds", 1 ), - YAML_SIGNED( "trimInc", 3 ), - YAML_UNSIGNED( "disableThrottleWarning", 1 ), - YAML_UNSIGNED( "displayChecklist", 1 ), - YAML_UNSIGNED( "extendedLimits", 1 ), - YAML_UNSIGNED( "extendedTrims", 1 ), - YAML_UNSIGNED( "throttleReversed", 1 ), - YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ), - YAML_UNSIGNED( "disableTelemetryWarning", 1 ), - YAML_UNSIGNED( "showInstanceIds", 1 ), - YAML_PADDING( 5 ), - YAML_SIGNED( "customThrottleWarningPosition", 8 ), - YAML_UNSIGNED( "beepANACenter", 16 ), - YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), - YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL), - YAML_ARRAY("expoData", 136, 64, struct_ExpoData, NULL), - YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), - YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), - YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), - YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), - YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), - YAML_ARRAY("flightModeData", 288, 9, struct_FlightModeData, fmd_is_active), - YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), - YAML_CUSTOM("switchWarningState",r_swtchWarn,w_swtchWarn), - YAML_PADDING( 32 ), - YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL), - YAML_STRUCT("varioData", 40, struct_VarioData, NULL), - YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), - YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL), - YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL), - YAML_UNSIGNED( "thrTrimSw", 3 ), - YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode), - YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable), - YAML_PADDING( 1 ), - YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), - YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), - YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), - YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL), - YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL), - YAML_UNSIGNED( "potsWarnEnabled", 16 ), - YAML_ARRAY("potsWarnPosition", 8, 2, struct_signed_8, NULL), - YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL), - YAML_PADDING( 8 ), - YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), - YAML_UNSIGNED( "view", 8 ), - YAML_STRING("modelRegistrationID", 8), - YAML_UNSIGNED( "usbJoystickExtMode", 1 ), - YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode), - YAML_UNSIGNED( "usbJoystickCircularCut", 4 ), - YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL), - YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable), - YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable), - YAML_END -}; -static const struct YamlNode struct_PartialModel[] = { - YAML_STRUCT("header", 96, struct_ModelHeader, NULL), - YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL), - YAML_END -}; - -#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29 - -static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); - -const YamlNode* get_radiodata_nodes() -{ - return &__RadioData_root_node; -} -static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); - -const YamlNode* get_modeldata_nodes() -{ - return &__ModelData_root_node; -} -static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); - -const YamlNode* get_partialmodel_nodes() -{ - return &__PartialModel_root_node; -} - diff --git a/radio/src/storage/yaml/yaml_defs.h b/radio/src/storage/yaml/yaml_defs.h index 54c275745..0e0f6d04f 100644 --- a/radio/src/storage/yaml/yaml_defs.h +++ b/radio/src/storage/yaml/yaml_defs.h @@ -48,9 +48,9 @@ int _dummy_##tag[0] _yaml_attribute("raw:YAML_CUSTOM(" _yaml_note( \ #tag) "," _yaml_note(read) "," _yaml_note(write) ")") -#define CUST_ARRAY(tag, elmt_type, fcn) \ - int _dummy_##tag[0] _yaml_attribute("raw:YAML_ARRAY(" _yaml_note( \ - #tag) ", 0, 4, " _yaml_note(elmt_type) ", " _yaml_note(fcn) ")") +#define CUST_ARRAY(tag, elmt_type, max, fcn) \ + int _dummy_##tag[0] _yaml_attribute("raw:YAML_ARRAY(" _yaml_note( \ + #tag) ", 0, " #max ", " _yaml_note(elmt_type) ", " _yaml_note(fcn) ")") #define CUST_IDX(tag, read, write) \ int _dummy_##tag[0] _yaml_attribute("raw:YAML_IDX_CUST(" _yaml_note( \ @@ -67,7 +67,7 @@ #define CUST(read, write) #define ARRAY(elmt_size, elmt_type, fcn) #define CUST_ATTR(tag, read, write) -#define CUST_ARRAY(tag, elmt_type, fcn) +#define CUST_ARRAY(tag, elmt_type, max, fcn) #define CUST_IDX(tag, read, write) #endif diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp index 4da0305e1..f909eab11 100644 --- a/radio/src/strhelpers.cpp +++ b/radio/src/strhelpers.cpp @@ -25,7 +25,13 @@ #if !defined(BOOT) #include "opentx.h" -const char s_charTab[] = "_-.,"; +#include "hal/switch_driver.h" +#include "hal/adc_driver.h" +#include "switches.h" +#include "analogs.h" + +static char _static_str_buffer[32]; +static const char s_charTab[] = "_-.,"; char hex2zchar(uint8_t hex) { return (hex >= 10 ? hex - 9 : 27 + hex); } @@ -425,75 +431,14 @@ char *getFlightModeString(char *dest, int8_t idx) return dest; } -int getRawSwitchIdx(char sw) +char* getSwitchName(char *dest, uint8_t idx) { - if (sw < 'A' || sw > 'Z') - return -1; - -#if defined(PCBX7) && !defined(RADIO_TX12) && !defined(RADIO_ZORRO) && !defined(RADIO_TX12MK2) && !defined(RADIO_BOXER) - if (sw >= 'H') - return sw - 'H' + 5; -#if defined(RADIO_T12) - else if (sw == 'G') -#else - else if (sw == 'F') -#endif - return 4; - else - return sw - 'A'; -#else - return sw - 'A'; -#endif -} - -char getRawSwitchFromIdx(int idx) -{ -#if defined(PCBX7) && !defined(RADIO_TX12) && !defined(RADIO_TX12MK2) && !defined(RADIO_BOXER) && !defined(RADIO_ZORRO) && !defined(RADIO_TPRO) - if (idx >= 5) - return 'H' + idx - 5; - else if (idx == 4) - #if defined(RADIO_T12) - return 'G'; - #else - return 'F'; - #endif - else - return 'A' + idx; -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_T8) || defined(RADIO_COMMANDO8) - if (idx < 6) - return 'A' + idx; - else - return 'A' + idx + 2; -#else - return 'A' + idx; -#endif -} - -char *getSwitchName(char *dest, swsrc_t idx) -{ - div_t swinfo = switchInfo(idx); - if (g_eeGeneral.switchNames[swinfo.quot][0] != '\0') { - dest = - strAppend(dest, g_eeGeneral.switchNames[swinfo.quot], LEN_SWITCH_NAME); - } - else { -#if defined(FUNCTION_SWITCHES) - if (swinfo.quot >= NUM_REGULAR_SWITCHES) { - int fsIdx = swinfo.quot - NUM_REGULAR_SWITCHES; - if(ZEXIST(g_model.switchNames[fsIdx])){ - dest = strAppend(dest, g_model.switchNames[fsIdx], LEN_SWITCH_NAME); - } - else { - *dest++ = 'S'; - *dest++ = 'W'; - *dest++ = '1' + swinfo.quot - 4; - } - return dest; - } -#endif - *dest++ = 'S'; - *dest++ = getRawSwitchFromIdx(swinfo.quot); + if (switchHasCustomName(idx)) { + dest = strAppend(dest, switchGetCustomName(idx), LEN_SWITCH_NAME); + } else { + dest = strAppend(dest, switchGetName(idx), LEN_SWITCH_NAME); } + return dest; } @@ -526,7 +471,7 @@ const char* getSwitchPositionSymbol(uint8_t pos) char *getSwitchPositionName(char *dest, swsrc_t idx) { if (idx == SWSRC_NONE) { - return getStringAtIndex(dest, STR_VSWITCHES, 0); + return strcpy(dest, STR_EMPTY); } else if (idx == SWSRC_OFF) { return getStringAtIndex(dest, STR_OFFON, 0); } @@ -537,36 +482,29 @@ char *getSwitchPositionName(char *dest, swsrc_t idx) idx = -idx; } -#define IDX_TRIMS_IN_STR_VSWITCHES (1) -#define IDX_ON_IN_STR_VSWITCHES \ - (IDX_TRIMS_IN_STR_VSWITCHES + SWSRC_LAST_TRIM - SWSRC_FIRST_TRIM + 1) - if (idx <= SWSRC_LAST_SWITCH) { div_t swinfo = switchInfo(idx); - s = getSwitchName(s, idx); + s = getSwitchName(s, swinfo.quot); s = strAppend(s, getSwitchPositionSymbol(swinfo.rem), 2); *s = '\0'; } - -#if NUM_XPOTS > 0 else if (idx <= SWSRC_LAST_MULTIPOS_SWITCH) { div_t swinfo = div(int(idx - SWSRC_FIRST_MULTIPOS_SWITCH), XPOTS_MULTIPOS_COUNT); - char temp[LEN_ANA_NAME + 2]; - getSourceString(temp, MIXSRC_FIRST_POT + swinfo.quot); - strAppendStringWithIndex(s, temp, swinfo.rem + 1); + s = strAppendStringWithIndex(s, getPotLabel(swinfo.quot), swinfo.rem + 1); } -#endif - else if (idx <= SWSRC_LAST_TRIM) { - getStringAtIndex(s, STR_VSWITCHES, - IDX_TRIMS_IN_STR_VSWITCHES + idx - SWSRC_FIRST_TRIM); + idx -= SWSRC_FIRST_TRIM; + // TODO: 't' or STR_CHAR_TRIM + s = strAppend(s, getTrimLabel(idx / 2)); + *s++ = idx & 1 ? '+' : '-'; + *s = '\0'; } else if (idx <= SWSRC_LAST_LOGICAL_SWITCH) { *s++ = 'L'; strAppendUnsigned(s, idx - SWSRC_FIRST_LOGICAL_SWITCH + 1, 2); } else if (idx <= SWSRC_ONE) { - getStringAtIndex(s, STR_VSWITCHES, - IDX_ON_IN_STR_VSWITCHES + idx - SWSRC_ON); + idx -= SWSRC_ON; + getStringAtIndex(s, STR_ON_ONE_SWITCHES, idx); } else if (idx <= SWSRC_LAST_FLIGHT_MODE) { strAppendStringWithIndex(s, STR_FM, idx - SWSRC_FIRST_FLIGHT_MODE); } else if (idx == SWSRC_TELEMETRY_STREAMING) { @@ -588,6 +526,85 @@ char *getSwitchPositionName(char *dest, swsrc_t idx) return dest; } +const char* getAnalogLabel(uint8_t type, uint8_t idx) +{ + if (analogHasCustomLabel(type, idx)) + return analogGetCustomLabel(type, idx); + + if (type == ADC_INPUT_MAIN) { + // main controls: translated label is stored in "short label" + return adcGetInputShortLabel(type, idx); + } + + if (type == ADC_INPUT_POT) { + return adcGetInputLabel(type, idx); + } + + return analogGetCanonicalName(type, idx); +} + +const char* getAnalogShortLabel(uint8_t idx) +{ + auto max = adcGetMaxInputs(ADC_INPUT_MAIN); + if (idx < max) { + // main controls: translated label is stored in "short label" + auto label = adcGetInputShortLabel(ADC_INPUT_MAIN, idx); + if (label) { + static char _str_buffer[2]; + _str_buffer[0] = label[0]; + _str_buffer[1] = '\0'; + return _str_buffer; + } else { + return ""; + } + } + + idx -= max; + max = adcGetMaxInputs(ADC_INPUT_POT); + + if (idx < max) { + return adcGetInputShortLabel(ADC_INPUT_POT, idx); + } + + // we only support short labels + // on main controls and pots + return ""; +} + +const char* getMainControlLabel(uint8_t idx) +{ + return getAnalogLabel(ADC_INPUT_MAIN, idx); +} + +const char* getTrimLabel(uint8_t idx) +{ + if (idx < adcGetMaxInputs(ADC_INPUT_MAIN)) { + return getMainControlLabel(idx); + } + + // TODO: replace with string from HW def + static char _trim_buffer[4]; + strAppendStringWithIndex(_trim_buffer, "T", idx + 1); + return _trim_buffer; +} + +const char* getTrimSourceLabel(uint16_t src_raw, int8_t trim_src) +{ + if (trim_src < TRIM_ON) { + return getTrimLabel(-trim_src - 1); + } else if (trim_src == TRIM_ON && src_raw >= MIXSRC_FIRST_STICK && + src_raw <= MIXSRC_LAST_STICK) { + return STR_OFFON[1]; + } else { + return STR_OFFON[0]; + } +} + +const char* getPotLabel(uint8_t idx) +{ + return getAnalogLabel(ADC_INPUT_POT, idx); +} + // this should be declared in header, but it used so much foreign symbols that // we declare it in cpp-file and pre-instantiate it for the uses template @@ -596,7 +613,7 @@ char *getSourceString(char (&dest)[L], mixsrc_t idx) size_t dest_len = L; if (idx == MIXSRC_NONE) { - return getStringAtIndex(dest, STR_VSRCRAW, 0); + strncpy(dest, STR_EMPTY, dest_len - 1); } else if (idx <= MIXSRC_LAST_INPUT) { idx -= MIXSRC_FIRST_INPUT; static_assert(L > sizeof(STR_CHAR_INPUT) - 1, "dest string too small"); @@ -640,70 +657,102 @@ char *getSourceString(char (&dest)[L], mixsrc_t idx) } #endif else if (idx <= MIXSRC_LAST_POT) { - if (g_eeGeneral.anaNames[idx - MIXSRC_Rud][0]) { - char* pos = dest; - if (idx <= MIXSRC_LAST_STICK) { - pos = strAppend(pos, STR_CHAR_STICK, sizeof(STR_CHAR_STICK) - 1); - dest_len -= sizeof(STR_CHAR_STICK) - 1; -#if NUM_SLIDERS > 0 - } else if (idx < MIXSRC_FIRST_SLIDER) { - pos = strAppend(pos, STR_CHAR_POT, sizeof(STR_CHAR_POT) - 1); - dest_len -= sizeof(STR_CHAR_POT) - 1; - } else { + char* pos = dest; + idx -= MIXSRC_FIRST_STICK; + + const char* name; + if (idx < MAX_STICKS) { + pos = strAppend(pos, STR_CHAR_STICK, sizeof(STR_CHAR_STICK) - 1); + dest_len -= sizeof(STR_CHAR_STICK) - 1; + name = getMainControlLabel(idx); + } else { + idx -= MAX_STICKS; + if (IS_SLIDER(idx)) { pos = strAppend(pos, STR_CHAR_SLIDER, sizeof(STR_CHAR_SLIDER) - 1); dest_len -= sizeof(STR_CHAR_SLIDER) - 1; -#else } else { pos = strAppend(pos, STR_CHAR_POT, sizeof(STR_CHAR_POT) - 1); dest_len -= sizeof(STR_CHAR_POT) - 1; -#endif } - idx -= MIXSRC_Rud; - size_t ana_len = std::min(sizeof(g_eeGeneral.anaNames[idx]), dest_len - 1); - strncpy(pos, g_eeGeneral.anaNames[idx], ana_len); - pos[ana_len] = '\0'; - } else { - idx -= MIXSRC_Rud; - getStringAtIndex(dest, STR_VSRCRAW, idx + 1); + name = getPotLabel(idx); } + strncpy(pos, name, dest_len - 1); + pos[dest_len - 1] = '\0'; + } +#if MAX_AXIS > 0 + else if (idx <= MIXSRC_LAST_AXIS) { + idx -= MIXSRC_FIRST_AXIS; + auto name = adcGetInputName(ADC_INPUT_AXIS, idx); + strncpy(dest, name, dest_len - 1); + dest[dest_len - 1] = '\0'; + } +#endif +#if defined(IMU) + else if (idx <= MIXSRC_TILT_Y) { + idx -= MIXSRC_TILT_X; + getStringAtIndex(dest, STR_IMU_VSRCRAW, idx); + } +#endif +#if defined(PCBHORUS) + else if (idx <= MIXSRC_LAST_SPACEMOUSE) { + idx -= MIXSRC_FIRST_SPACEMOUSE; + getStringAtIndex(dest, STR_SM_VSRCRAW, idx); + } +#endif + else if (idx == MIXSRC_MAX) { + copyToTerminated(dest, "MAX"); + } else if (idx <= MIXSRC_LAST_HELI) { + idx -= MIXSRC_FIRST_HELI; + getStringAtIndex(dest, STR_CYC_VSRCRAW, idx); } else if (idx <= MIXSRC_LAST_TRIM) { - idx -= MIXSRC_Rud; - getStringAtIndex(dest, STR_VSRCRAW, idx + 1); + idx -= MIXSRC_FIRST_TRIM; + char* pos = strAppend(dest, STR_CHAR_TRIM, sizeof(STR_CHAR_TRIM) - 1); + strAppend(pos, getTrimLabel(idx)); } else if (idx <= MIXSRC_LAST_SWITCH) { idx -= MIXSRC_FIRST_SWITCH; - if (g_eeGeneral.switchNames[idx][0] != '\0') { - copyToTerminated(dest, g_eeGeneral.switchNames[idx]); - } else { - getStringAtIndex(dest, STR_VSRCRAW, - idx + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1); - } + char* pos = strAppend(dest, STR_CHAR_SWITCH, sizeof(STR_CHAR_SWITCH) - 1); + getSwitchName(pos, idx); } else if (idx <= MIXSRC_LAST_LOGICAL_SWITCH) { - getSwitchPositionName(dest, SWSRC_SW1 + idx - MIXSRC_SW1); + // TODO: unnecessary, use the direct way instead + idx -= MIXSRC_FIRST_LOGICAL_SWITCH; + getSwitchPositionName(dest, idx + SWSRC_FIRST_LOGICAL_SWITCH); } else if (idx <= MIXSRC_LAST_TRAINER) { - strAppendStringWithIndex(dest, STR_PPM_TRAINER, - idx - MIXSRC_FIRST_TRAINER + 1); + idx -= MIXSRC_FIRST_TRAINER; + strAppendStringWithIndex(dest, STR_PPM_TRAINER, idx + 1); } else if (idx <= MIXSRC_LAST_CH) { - auto ch = idx - MIXSRC_CH1; + auto ch = idx - MIXSRC_FIRST_CH; if (g_model.limitData[ch].name[0] != '\0') { copyToTerminated(dest, g_model.limitData[ch].name); } else { strAppendStringWithIndex(dest, STR_CH, ch + 1); } } else if (idx <= MIXSRC_LAST_GVAR) { - strAppendStringWithIndex(dest, STR_GV, idx - MIXSRC_GVAR1 + 1); + idx -= MIXSRC_FIRST_GVAR; + strAppendStringWithIndex(dest, STR_GV, idx + 1); } else if (idx < MIXSRC_FIRST_TIMER) { - getStringAtIndex(dest, STR_VSRCRAW, - idx - MIXSRC_Rud + 1 - MAX_LOGICAL_SWITCHES - - MAX_TRAINER_CHANNELS - MAX_OUTPUT_CHANNELS - - MAX_GVARS); + // Built-in sources: TX Voltage, Time, GPS (+ reserved) + const char* src_str; + switch(idx) { + case MIXSRC_TX_VOLTAGE: + src_str = STR_SRC_BATT; + break; + case MIXSRC_TX_TIME: + src_str = STR_SRC_TIME; + break; + case MIXSRC_TX_GPS: + src_str = STR_SRC_GPS; + break; + default: + src_str = ""; + break; + } + strncpy(dest, src_str, dest_len - 1); } else if (idx <= MIXSRC_LAST_TIMER) { - if (g_model.timers[idx - MIXSRC_FIRST_TIMER].name[0] != '\0') { - copyToTerminated(dest, g_model.timers[idx - MIXSRC_FIRST_TIMER].name); + idx -= MIXSRC_FIRST_TIMER; + if (g_model.timers[idx].name[0] != '\0') { + copyToTerminated(dest, g_model.timers[idx].name); } else { - getStringAtIndex(dest, STR_VSRCRAW, - idx - MIXSRC_Rud + 1 - MAX_LOGICAL_SWITCHES - - MAX_TRAINER_CHANNELS - MAX_OUTPUT_CHANNELS - - MAX_GVARS); + strAppendStringWithIndex(dest, STR_SRC_TIMER, idx + 1); } } else { idx -= MIXSRC_FIRST_TELEM; @@ -722,18 +771,16 @@ char *getSourceString(char (&dest)[L], mixsrc_t idx) // all other instantiations are done from this file template char *getSourceString<16>(char (&dest)[16], mixsrc_t idx); -static char tmpHelpersString[32]; - char *getSourceString(mixsrc_t idx) { - return getSourceString(tmpHelpersString, idx); + return getSourceString(_static_str_buffer, idx); } -char *getCurveString(int idx) { return getCurveString(tmpHelpersString, idx); } +char *getCurveString(int idx) { return getCurveString(_static_str_buffer, idx); } char *getTimerString(int32_t tme, TimerOptions timerOptions) { - return getFormattedTimerString(tmpHelpersString, tme, timerOptions); + return getFormattedTimerString(_static_str_buffer, tme, timerOptions); } char *getTimerString(char *dest, int32_t tme, TimerOptions timerOptions) @@ -743,10 +790,10 @@ char *getTimerString(char *dest, int32_t tme, TimerOptions timerOptions) char *getSwitchPositionName(swsrc_t idx) { - return getSwitchPositionName(tmpHelpersString, idx); + return getSwitchPositionName(_static_str_buffer, idx); } -char *getGVarString(int idx) { return getGVarString(tmpHelpersString, idx); } +char *getGVarString(int idx) { return getGVarString(_static_str_buffer, idx); } #if defined(LIBOPENUI) char *getValueWithUnit(char *dest, size_t len, int32_t val, uint8_t unit, @@ -864,7 +911,7 @@ std::string formatNumberAsString(int32_t val, LcdFlags flags, uint8_t len, char *getSourceCustomValueString(source_t source, int32_t val, LcdFlags flags) { - return getSourceCustomValueString(tmpHelpersString, source, val, flags); + return getSourceCustomValueString(_static_str_buffer, source, val, flags); } std::string getValueWithUnit(int val, uint8_t unit, LcdFlags flags) diff --git a/radio/src/strhelpers.h b/radio/src/strhelpers.h index 3c90ec8b3..ca073e2f0 100644 --- a/radio/src/strhelpers.h +++ b/radio/src/strhelpers.h @@ -24,11 +24,25 @@ #include "definitions.h" #include "opentx_types.h" + #include #include #include +#define IS_UFT8_2BYTES(c) \ + ( (((uint8_t)c) & 0xE0) == 0xC0 ) + +#define IS_UTF8_3BYTES(c) \ + ( (((uint8_t)c) & 0xF0) == 0xE0 ) + +#define IS_UTF8(c) \ + ( IS_UFT8_2BYTES(c) || IS_UTF8_3BYTES(c) ) + +#define UTF8_WIDTH(c) \ + ( IS_UFT8_2BYTES(c) ? 2 : IS_UTF8_3BYTES(c) ? 3 : 1 ) + + #define SHOW_TIME 0x1 #define SHOW_TIMER 0x0 #define SHOW_TIMER_UPPER_CASE 0x2 @@ -82,7 +96,14 @@ char *getValueOrGVarString(char *dest, size_t len, gvar_t value, gvar_t vmin, const char *getSwitchWarnSymbol(uint8_t pos); const char *getSwitchPositionSymbol(uint8_t pos); char *getSwitchPositionName(char *dest, swsrc_t idx); -char *getSwitchName(char *dest, swsrc_t idx); +char *getSwitchName(char *dest, uint8_t idx); + +const char* getAnalogLabel(uint8_t type, uint8_t idx); +const char* getAnalogShortLabel(uint8_t idx); +const char* getMainControlLabel(uint8_t idx); +const char* getTrimLabel(uint8_t idx); +const char* getTrimSourceLabel(uint16_t src_raw, int8_t trim_src); +const char* getPotLabel(uint8_t idx); template char* getSourceString(char (&dest)[L], mixsrc_t idx); @@ -91,8 +112,6 @@ template char *getSourceCustomValueString(char (&dest)[L], source_t source, int32_t val, LcdFlags flags); -int getRawSwitchIdx(char sw); -char getRawSwitchFromIdx(int sw); #endif char *getFlightModeString(char *dest, int8_t idx); diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 037d0afd0..3ddf85ccc 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -19,8 +19,12 @@ * GNU General Public License for more details. */ +#include "hal/switch_driver.h" +#include "hal/adc_driver.h" + #include "opentx.h" #include "switches.h" +#include "input_mapping.h" #include "tasks/mixer_task.h" @@ -59,20 +63,23 @@ CircularBuffer luaSetStickySwitchBuffer; #define LS_LAST_VALUE(fm, idx) lswFm[fm].lsw[idx].lastValue -#if defined(PCBFRSKY) || defined(PCBFLYSKY) -#if defined(PCBX9E) -tmr10ms_t switchesMidposStart[16]; -#else -tmr10ms_t switchesMidposStart[6]; // TODO constant -#endif +tmr10ms_t switchesMidposStart[MAX_SWITCHES]; uint64_t switchesPos = 0; -tmr10ms_t potsLastposStart[NUM_XPOTS]; -uint8_t potsPos[NUM_XPOTS]; -#define SWITCH_POSITION(sw) (switchesPos & ((MASK_CFN_TYPE)1<<(sw))) -#define POT_POSITION(sw) ((potsPos[(sw)/XPOTS_MULTIPOS_COUNT] & 0x0f) == ((sw) % XPOTS_MULTIPOS_COUNT)) +static_assert(sizeof(uint64_t) * 8 >= ((MAX_SWITCHES - 1) / 2) + 1, + "MAX_SWITCHES too big for uint64_t position state"); + +tmr10ms_t potsLastposStart[MAX_POTS]; +uint8_t potsPos[MAX_POTS]; + +#define SWITCH_POSITION(sw) (switchesPos & ((MASK_CFN_TYPE)1 << (sw))) +#define POT_POSITION(sw) \ + ((potsPos[(sw) / XPOTS_MULTIPOS_COUNT] & 0x0f) == \ + ((sw) % XPOTS_MULTIPOS_COUNT)) #if defined(FUNCTION_SWITCHES) +// Function switches +// // Non pushed : SWSRC_Sx0 = -1024 = Sx(up) = state 0 // Pushed : SWSRC_Sx2 = +1024 = Sx(down) = state 1 @@ -99,14 +106,20 @@ void setFSStartupPosition() } } +uint8_t getFSLogicalState() +{ + return g_model.functionSwitchLogicalState; +} + uint8_t getFSLogicalState(uint8_t index) { - return (uint8_t )(bfSingleBitGet(g_model.functionSwitchLogicalState, index) >> (index)); + return (uint8_t )(bfSingleBitGet(getFSLogicalState(), index) >> (index)); } uint8_t getFSPhysicalState(uint8_t index) { - return switchState(((index + NUM_REGULAR_SWITCHES) * 3) + 2) ? 1 : 0; + index += switchGetMaxSwitches(); + return switchGetPosition(index) != SWITCH_HW_UP; } uint8_t getFSPreviousPhysicalState(uint8_t index) @@ -116,34 +129,37 @@ uint8_t getFSPreviousPhysicalState(uint8_t index) void evalFunctionSwitches() { - for (uint8_t i = 0; i < NUM_FUNCTIONS_SWITCHES; i++) { + uint8_t fct_switches = switchGetMaxFctSwitches(); + for (uint8_t i = 0; i < fct_switches; i++) { if (FSWITCH_CONFIG(i) == SWITCH_NONE) { fsLedOff(i); continue; } uint8_t physicalState = getFSPhysicalState(i); - if (physicalState != getFSPreviousPhysicalState(i)) { // FS was moved - if ((FSWITCH_CONFIG(i) == SWITCH_2POS && physicalState == 1) || (FSWITCH_CONFIG(i) == SWITCH_TOGGLE)) { - if (IS_FSWITCH_GROUP_ON(FSWITCH_GROUP(i)) != 0) { // In an always on group - g_model.functionSwitchLogicalState |= 1 << i; // Set bit - } - else { - g_model.functionSwitchLogicalState ^= 1 << i; // Toggle bit + if (physicalState != getFSPreviousPhysicalState(i)) { + // FS was moved + if ((FSWITCH_CONFIG(i) == SWITCH_2POS && physicalState == 1) || + (FSWITCH_CONFIG(i) == SWITCH_TOGGLE)) { + if (IS_FSWITCH_GROUP_ON(FSWITCH_GROUP(i)) != 0) { + // In an always on group + g_model.functionSwitchLogicalState |= 1 << i; // Set bit + } else { + g_model.functionSwitchLogicalState ^= 1 << i; // Toggle bit } } - if (FSWITCH_GROUP(i) && physicalState == 1) { // switch is in a group, other in group need to be turned off + if (FSWITCH_GROUP(i) && physicalState == 1) { + // switch is in a group, other in group need to be turned off for (uint8_t j = 0; j < NUM_FUNCTIONS_SWITCHES; j++) { - if (i == j) - continue; + if (i == j) continue; if (FSWITCH_GROUP(j) == FSWITCH_GROUP(i)) { - g_model.functionSwitchLogicalState &= ~(1 << j); // clear state + g_model.functionSwitchLogicalState &= ~(1 << j); // clear state } } } - fsPreviousState ^= 1 << i; // Toggle state + fsPreviousState ^= 1 << i; // Toggle state storageDirty(EE_MODEL); } @@ -155,52 +171,130 @@ void evalFunctionSwitches() } } } -#endif +#endif // FUNCTION_SWITCHES div_t switchInfo(int switchPosition) { - return div(switchPosition-SWSRC_FIRST_SWITCH, 3); + return div(switchPosition - SWSRC_FIRST_SWITCH, 3); } -uint64_t check2PosSwitchPosition(uint8_t sw) +int switchLookupIdx(char c) { - uint32_t index = (switchState(sw) ? sw : sw + 2); - uint64_t result = ((uint64_t)1 << index); - - if (!(switchesPos & result)) { - PLAY_SWITCH_MOVED(index); + uint8_t idx = 1; // Sx + if (c >= '1' && c <= '9') { + idx = 2; // SWx } - return result; + auto max_switches = switchGetMaxSwitches() + switchGetMaxFctSwitches(); + for (int i = 0; i < max_switches; i++) { + const char *name = switchGetName(i); + if (name[idx] == c) return i; + } + + return -1; } -uint64_t check3PosSwitchPosition(uint8_t idx, uint8_t sw, bool startup) +int switchLookupIdx(const char* name, size_t len) { - uint64_t result; - uint32_t index; + if (len < 2 || name[0] != 'S') return -1; - if (switchState(sw)) { - index = sw; + uint8_t idx = 1; // Sx + if (len > 2) idx = 2; // SWx + + auto max_switches = switchGetMaxSwitches() + switchGetMaxFctSwitches(); + for (int i = 0; i < max_switches; i++) { + const char *sw_name = switchGetName(i); + if (sw_name[idx] == name[idx]) return i; + } + + return -1; +} + +char switchGetLetter(uint8_t idx) +{ + if (idx >= switchGetMaxSwitches() + switchGetMaxFctSwitches()) + return -1; + + uint8_t c = 1; + if (idx >= switchGetMaxSwitches()) c = 2; + + const char* name = switchGetName(idx); + if (!name) return -1; + + return name[c]; +} + +static char _switchNames[MAX_SWITCHES][LEN_SWITCH_NAME + 1] = { 0 }; + +void switchSetCustomName(uint8_t idx, const char* str, size_t len) +{ + strncpy(_switchNames[idx], str, min(LEN_SWITCH_NAME, len)); + _switchNames[idx][LEN_SWITCH_NAME] = '\0'; +} + +const char* switchGetCustomName(uint8_t idx) +{ + return _switchNames[idx]; +} + +bool switchHasCustomName(uint8_t idx) +{ + return *switchGetCustomName(idx) != 0; +} + +const char* switchGetCanonicalName(uint8_t idx) +{ + if (idx >= switchGetMaxSwitches() + switchGetMaxFctSwitches()) + return nullptr; + + return switchGetName(idx); +} + +SwitchConfig switchGetMaxType(uint8_t idx) +{ + auto hw_type = switchGetHwType(idx); + if (hw_type == SWITCH_HW_2POS) { + return SWITCH_2POS; + } else { + return SWITCH_3POS; + } +} + +static uint64_t checkSwitchPosition(uint8_t idx, bool startup) +{ + uint64_t result = 0; + uint32_t index = idx * 3; + + auto pos = switchGetPosition(idx); + switch(pos) { + + case SWITCH_HW_UP: result = ((MASK_CFN_TYPE)1 << index); switchesMidposStart[idx] = 0; - } - else if (switchState(sw+2)) { - index = sw + 2; + break; + + case SWITCH_HW_DOWN: + index += 2; result = ((MASK_CFN_TYPE)1 << index); switchesMidposStart[idx] = 0; - } - else { - index = sw + 1; - if (startup || SWITCH_POSITION(index) || g_eeGeneral.switchesDelay==SWITCHES_DELAY_NONE || (switchesMidposStart[idx] && (tmr10ms_t)(get_tmr10ms() - switchesMidposStart[idx]) > SWITCHES_DELAY())) { + break; + + case SWITCH_HW_MID: + if (startup || SWITCH_POSITION(index) || + g_eeGeneral.switchesDelay == SWITCHES_DELAY_NONE || + (switchesMidposStart[idx] && + (tmr10ms_t)(get_tmr10ms() - switchesMidposStart[idx]) > + SWITCHES_DELAY())) { + index += 1; result = ((MASK_CFN_TYPE)1 << index); switchesMidposStart[idx] = 0; - } - else { - result = (switchesPos & ((MASK_CFN_TYPE)0x7 << sw)); + } else { + result = (switchesPos & ((MASK_CFN_TYPE)0x7 << index)); if (!switchesMidposStart[idx]) { switchesMidposStart[idx] = get_tmr10ms(); } } + break; } if (!(switchesPos & result)) { @@ -210,124 +304,24 @@ uint64_t check3PosSwitchPosition(uint8_t idx, uint8_t sw, bool startup) return result; } -#define CHECK_2POS(sw) newPos |= check2PosSwitchPosition(sw ## 0) -#define CHECK_3POS(idx, sw) newPos |= check3PosSwitchPosition(idx, sw ## 0, startup) - void getSwitchesPosition(bool startup) { uint64_t newPos = 0; -#if defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_ZORRO) || defined(RADIO_BOXER) - CHECK_2POS(SW_SA); - CHECK_3POS(0, SW_SB); - CHECK_3POS(1, SW_SC); -#elif defined(RADIO_TPRO) - CHECK_3POS(0, SW_SA); - CHECK_3POS(1, SW_SB); - CHECK_2POS(SW_SC); - CHECK_2POS(SW_SD); -#elif defined(PCBNV14) - CHECK_2POS(SW_SA); - CHECK_3POS(0, SW_SB); - CHECK_2POS(SW_SC); - CHECK_2POS(SW_SD); -#else - CHECK_3POS(0, SW_SA); - CHECK_3POS(1, SW_SB); - CHECK_3POS(2, SW_SC); -#endif - -#if defined(PCBX9LITES) - CHECK_2POS(SW_SD); - CHECK_2POS(SW_SE); - CHECK_2POS(SW_SF); - CHECK_2POS(SW_SG); -#elif defined(PCBX9LITE) - CHECK_2POS(SW_SD); - CHECK_2POS(SW_SE); -#elif defined(PCBXLITES) - CHECK_3POS(3, SW_SD); - CHECK_2POS(SW_SE); - CHECK_2POS(SW_SF); - // no SWG and SWH on XLITES -#elif defined(PCBXLITE) - CHECK_3POS(3, SW_SD); - // no SWE, SWF, SWG and SWH on XLITE -#elif defined(RADIO_ZORRO) - CHECK_2POS(SW_SD); - CHECK_2POS(SW_SE); - CHECK_2POS(SW_SF); - CHECK_2POS(SW_SG); - CHECK_2POS(SW_SH); -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - CHECK_2POS(SW_SD); - CHECK_3POS(2, SW_SE); - CHECK_3POS(3, SW_SF); -#elif defined(RADIO_BOXER) - CHECK_2POS(SW_SD); - CHECK_2POS(SW_SE); - CHECK_2POS(SW_SF); -#elif defined(RADIO_TPRO) - CHECK_2POS(SW_SE); - CHECK_2POS(SW_SF); - CHECK_2POS(SW_SG); - CHECK_2POS(SW_SH); - CHECK_2POS(SW_SI); - CHECK_2POS(SW_SJ); -#elif defined(PCBX7) - CHECK_3POS(3, SW_SD); - #if defined(HARDWARE_SWITCH_F) - CHECK_2POS(SW_SF); - #endif - #if defined(HARDWARE_SWITCH_G) - CHECK_2POS(SW_SG); - #endif - #if defined(HARDWARE_SWITCH_H) - CHECK_2POS(SW_SH); - #endif -#elif defined(PCBNV14) - CHECK_2POS(SW_SE); - CHECK_3POS(1, SW_SF); - CHECK_3POS(2, SW_SG); - CHECK_2POS(SW_SH); -#else - CHECK_3POS(3, SW_SD); - CHECK_3POS(4, SW_SE); - CHECK_2POS(SW_SF); - CHECK_3POS(5, SW_SG); - CHECK_2POS(SW_SH); -#endif - -#if defined(RADIO_X9DP2019) - CHECK_2POS(SW_SI); -#endif - -#if defined(PCBX7ACCESS) - CHECK_2POS(SW_SI); -#elif defined(PCBHORUS) || (defined(PCBX7) && !defined(RADIO_ZORRO)) - CHECK_2POS(SW_SI); - CHECK_2POS(SW_SJ); -#endif - -#if defined(PCBX9E) - CHECK_3POS(6, SW_SI); - CHECK_3POS(7, SW_SJ); - CHECK_3POS(8, SW_SK); - CHECK_3POS(9, SW_SL); - CHECK_3POS(10, SW_SM); - CHECK_3POS(11, SW_SN); - CHECK_3POS(12, SW_SO); - CHECK_3POS(13, SW_SP); - CHECK_3POS(14, SW_SQ); - CHECK_3POS(15, SW_SR); -#endif - + for (unsigned i = 0; i < switchGetMaxSwitches(); i++) { + newPos |= checkSwitchPosition(i, startup); + } + switchesPos = newPos; - for (int i=0; icount); + uint8_t pos = anaIn(analog_idx) / (2 * RESX / calib->count); uint8_t previousPos = potsPos[i] >> 4; uint8_t previousStoredPos = potsPos[i] & 0x0F; if (startup) { @@ -336,12 +330,13 @@ void getSwitchesPosition(bool startup) else if (pos != previousPos) { potsLastposStart[i] = get_tmr10ms(); potsPos[i] = (pos << 4) | previousStoredPos; - } - else if (g_eeGeneral.switchesDelay==SWITCHES_DELAY_NONE || (tmr10ms_t)(get_tmr10ms() - potsLastposStart[i]) > SWITCHES_DELAY()) { + } else if (g_eeGeneral.switchesDelay == SWITCHES_DELAY_NONE || + (tmr10ms_t)(get_tmr10ms() - potsLastposStart[i]) > + SWITCHES_DELAY()) { potsLastposStart[i] = 0; potsPos[i] = (pos << 4) | pos; if (previousStoredPos != pos) { - PLAY_SWITCH_MOVED(SWSRC_LAST_SWITCH+i*XPOTS_MULTIPOS_COUNT+pos); + PLAY_SWITCH_MOVED(SWSRC_LAST_SWITCH + i * XPOTS_MULTIPOS_COUNT + pos); } } } @@ -364,9 +359,6 @@ getvalue_t getValueForLogicalSwitch(mixsrc_t i) } return result; } -#else - #define getValueForLogicalSwitch(i) getValue(i) -#endif PACK(typedef struct { uint8_t state; @@ -448,7 +440,7 @@ bool getLogicalSwitch(uint8_t idx) } - else if (v1 >= MIXSRC_GVAR1) { + else if (v1 >= MIXSRC_FIRST_GVAR) { y = ls->v2; } else { @@ -461,7 +453,7 @@ bool getLogicalSwitch(uint8_t idx) break; case LS_FUNC_VALMOSTEQUAL: #if defined(GVARS) - if (v1 >= MIXSRC_GVAR1 && v1 <= MIXSRC_LAST_GVAR) + if (v1 >= MIXSRC_FIRST_GVAR && v1 <= MIXSRC_LAST_GVAR) result = (x==y); else #endif @@ -559,7 +551,7 @@ bool getSwitch(swsrc_t swtch, uint8_t flags) if (swtch == SWSRC_NONE) return true; - uint8_t cs_idx = abs(swtch); + uint16_t cs_idx = abs(swtch); if (cs_idx == SWSRC_ONE) { result = !s_mixer_first_run_done; @@ -572,31 +564,33 @@ bool getSwitch(swsrc_t swtch, uint8_t flags) result = latencyToggleSwitch; } #endif - else if (cs_idx <= (SWSRC_LAST_SWITCH - 3 * NUM_FUNCTIONS_SWITCHES)) { -#if defined(PCBFRSKY) || defined(PCBFLYSKY) - if (flags & GETSWITCH_MIDPOS_DELAY) - result = SWITCH_POSITION(cs_idx-SWSRC_FIRST_SWITCH); - else - result = switchState(cs_idx-SWSRC_FIRST_SWITCH); -#else - result = switchState(cs_idx-SWSRC_FIRST_SWITCH); -#endif - } -#if defined(FUNCTION_SWITCHES) else if (cs_idx <= SWSRC_LAST_SWITCH) { - div_t qr = div(cs_idx - SWSRC_FIRST_FUNCTION_SWITCH, 3); - auto value = getFSLogicalState(qr.quot); - result = qr.rem == 0 ? !value : (qr.rem == 2 ? value : false); - } + cs_idx -= SWSRC_FIRST_SWITCH; + auto max_reg_pos = switchGetMaxSwitches() * 3; + if (cs_idx < max_reg_pos) { + if (flags & GETSWITCH_MIDPOS_DELAY) + result = SWITCH_POSITION(cs_idx); + else + result = switchState(cs_idx); + } +#if defined(FUNCTION_SWITCHES) + else if (cs_idx - max_reg_pos < switchGetMaxFctSwitches() * 3) { + cs_idx -= max_reg_pos; + div_t qr = div(cs_idx, 3); + auto value = getFSLogicalState(qr.quot); + result = qr.rem == 0 ? !value : (qr.rem == 2 ? value : false); + } #endif -#if NUM_XPOTS > 0 + else { + result = false; + } + } else if (cs_idx <= SWSRC_LAST_MULTIPOS_SWITCH) { - result = POT_POSITION(cs_idx-SWSRC_FIRST_MULTIPOS_SWITCH); + result = POT_POSITION(cs_idx - SWSRC_FIRST_MULTIPOS_SWITCH); } -#endif else if (cs_idx <= SWSRC_LAST_TRIM) { uint8_t idx = cs_idx - SWSRC_FIRST_TRIM; - idx = (CONVERT_MODE_TRIMS(idx/2) << 1) + (idx & 1); + idx = (inputMappingConvertMode(idx/2) << 1) + (idx & 1); result = trimDown(idx); } else if (cs_idx == SWSRC_RADIO_ACTIVITY) { @@ -618,7 +612,7 @@ bool getSwitch(swsrc_t swtch, uint8_t flags) #else result = false; #endif - } + } else { cs_idx -= SWSRC_FIRST_LOGICAL_SWITCH; result = lswFm[mixerCurrentFlightMode].lsw[cs_idx].state; @@ -627,6 +621,13 @@ bool getSwitch(swsrc_t swtch, uint8_t flags) return swtch > 0 ? result : !result; } +uint8_t getXPotPosition(uint8_t idx) +{ + if (idx >= MAX_POTS || !IS_POT_MULTIPOS(idx)) return 0; + return potsPos[idx] & 0x0F; +} + + /** @brief Calculates new state of logical switches for mixerCurrentFlightMode */ @@ -647,19 +648,32 @@ void evalLogicalSwitches(bool isCurrentFlightmode) } } +static inline uint8_t _bits_set(uint8_t val, uint8_t bits) +{ + uint8_t bits_set = 0; + do { + if (val & 1) ++bits_set; + val >>= 1; + } while (--bits); + + return bits_set; +} + swarnstate_t switches_states = 0; uint8_t fsswitches_states = 0; + swsrc_t getMovedSwitch() { static tmr10ms_t s_move_last_time = 0; swsrc_t result = 0; // Switches - for (int i = 0; i < NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES; i++) { + auto max_reg_switches = switchGetMaxSwitches(); + for (uint8_t i = 0; i < max_reg_switches; i++) { if (SWITCH_EXISTS(i)) { swarnstate_t mask = ((swarnstate_t) 0x07 << (i * 3)); uint8_t prev = (switches_states & mask) >> (i * 3); - uint8_t next = (1024 + getValue(MIXSRC_SA + i)) / 1024 + 1; + uint8_t next = (1024 + getValue(MIXSRC_FIRST_SWITCH + i)) / 1024 + 1; if (prev != next) { switches_states = (switches_states & (~mask)) | ((swarnstate_t)(next) << (i * 3)); @@ -669,27 +683,34 @@ swsrc_t getMovedSwitch() } #if defined(FUNCTION_SWITCHES) - for (int i = 0; i < NUM_FUNCTIONS_SWITCHES; i++) { - if (FSWITCH_CONFIG(i) != SWITCH_NONE) { - auto prev = (uint8_t )(bfSingleBitGet(fsswitches_states, i) >> (i)); - uint8_t next = getFSLogicalState(i); - if (prev != next) { - fsswitches_states = (fsswitches_states & ~(1 << i)) | (next << i); - result = SWSRC_FIRST_FUNCTION_SWITCH + i*3 + (next ? 2 : 0); - } + auto fsswitches_cur_state = getFSLogicalState(); + auto fsswitches_xor = fsswitches_cur_state ^ fsswitches_states; + fsswitches_states = fsswitches_cur_state; + + if (fsswitches_xor) { + // we have some change... + if (_bits_set(fsswitches_xor, switchGetMaxFctSwitches()) > 1) { + // multiple bits change: use the one that turned ON + fsswitches_xor &= fsswitches_cur_state; + } else { + // only one bit changed: use the one that changed } + + auto sw = __builtin_ctz(fsswitches_xor); + auto pos = (fsswitches_cur_state & fsswitches_xor) ? 2 : 0; + result = (max_reg_switches + sw) * 3 + pos + SWSRC_FIRST_SWITCH; } #endif // Multipos - for (int i = 0; i < NUM_XPOTS; i++) { - if (IS_POT_MULTIPOS(POT1 + i)) { - StepsCalibData * calib = (StepsCalibData *) &g_eeGeneral.calib[POT1 + i]; + for (int i = 0; i < MAX_POTS; i++) { + if (IS_POT_MULTIPOS(i)) { + StepsCalibData * calib = (StepsCalibData *) &g_eeGeneral.calib[MAX_STICKS + i]; if (IS_MULTIPOS_CALIBRATED(calib)) { uint8_t prev = potsPos[i] & 0x0F; - uint8_t next = anaIn(POT1 + i) / (2 * RESX / calib->count); + uint8_t next = anaIn(MAX_STICKS + i) / (2 * RESX / calib->count); if (prev != next) { - result = SWSRC_LAST_SWITCH + i * XPOTS_MULTIPOS_COUNT + next + 1; + result = SWSRC_FIRST_MULTIPOS_SWITCH + i * XPOTS_MULTIPOS_COUNT + next; } } } @@ -710,7 +731,7 @@ bool isSwitchWarningRequired(uint16_t &bad_pots) getMovedSwitch(); bool warn = false; - for (int i = 0; i < NUM_SWITCHES; i++) { + for (int i = 0; i < switchGetMaxSwitches(); i++) { if (SWITCH_WARNING_ALLOWED(i)) { swarnstate_t mask = ((swarnstate_t)0x07 << (i * 3)); if ((states & mask) && !((states & mask) == (switches_states & mask))) { @@ -722,10 +743,8 @@ bool isSwitchWarningRequired(uint16_t &bad_pots) if (g_model.potsWarnMode) { evalFlightModeMixes(e_perout_mode_normal, 0); bad_pots = 0; - for (int i = 0; i < NUM_POTS + NUM_SLIDERS; i++) { - if (!IS_POT_SLIDER_AVAILABLE(POT1 + i)) { - continue; - } + for (int i = 0; i < adcGetMaxInputs(ADC_INPUT_POT); i++) { + if (!IS_POT_SLIDER_AVAILABLE(i)) continue; if ((g_model.potsWarnEnabled & (1 << i)) && (abs(g_model.potsWarnPosition[i] - GET_LOWRES_POT_POSITION(i)) > 1)) { warn = true; @@ -779,7 +798,7 @@ void checkSwitches() int x = SWITCH_WARNING_LIST_X; int y = SWITCH_WARNING_LIST_Y; int numWarnings = 0; - for (int i=0; i 1) { if (++numWarnings < 6) { - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, NUM_STICKS + 1 + i, INVERS); - if (IS_POT(POT1 + i)) - lcdDrawChar( - lcdNextPos, y, - g_model.potsWarnPosition[i] > GET_LOWRES_POT_POSITION(i) - ? 126 - : 127, - INVERS); // TODO: use constants for chars - else - lcdDrawText( - lcdNextPos, y, - g_model.potsWarnPosition[i] > GET_LOWRES_POT_POSITION(i) - ? STR_CHAR_UP - : STR_CHAR_DOWN, - INVERS); + drawSource(x, y, MIXSRC_FIRST_POT + i, INVERS); + const char* symbol; + auto warn_pos = g_model.potsWarnPosition[i]; + if (IS_SLIDER(i)) { + symbol = warn_pos > GET_LOWRES_POT_POSITION(i) + ? STR_CHAR_UP + : STR_CHAR_DOWN; + } else { + symbol = warn_pos > GET_LOWRES_POT_POSITION(i) + ? STR_CHAR_RIGHT + : STR_CHAR_LEFT; + } + lcdDrawText(lcdNextPos, y, symbol, INVERS); x = lcdNextPos + 3; } } diff --git a/radio/src/switches.h b/radio/src/switches.h index 9bda7bdaa..f9f0576c0 100644 --- a/radio/src/switches.h +++ b/radio/src/switches.h @@ -23,6 +23,8 @@ #include +#include "opentx_constants.h" + enum LogicalSwitchFamilies { LS_FAMILY_OFS, LS_FAMILY_BOOL, @@ -39,4 +41,42 @@ typedef int16_t delayval_t; uint8_t lswFamily(uint8_t func); int16_t lswTimerValue(delayval_t val); +void evalLogicalSwitches(bool isCurrentFlightmode=true); +void logicalSwitchesCopyState(uint8_t src, uint8_t dst); +void logicalSwitchesReset(); +void logicalSwitchesTimerTick(); + bool isSwitchWarningRequired(uint16_t &bad_pots); + +void getSwitchesPosition(bool startup); + +extern swarnstate_t switches_states; +swsrc_t getMovedSwitch(); + +#define GETSWITCH_MIDPOS_DELAY 1 +bool getSwitch(swsrc_t swtch, uint8_t flags=0); +uint8_t getXPotPosition(uint8_t idx); + +div_t switchInfo(int switchPosition); + +// Lookup switch index by letter ('A' to 'Z') +// note: no function switches +int switchLookupIdx(char c); + +// Lookup switch index by name ('SA' to 'SZ') +// note: no function switches +int switchLookupIdx(const char* name, size_t len); + +// Get switch letter ('A' to 'Z') +// note: no function switches +char switchGetLetter(uint8_t idx); + +// note: no function switches +const char* switchGetCanonicalName(uint8_t idx); + +// function switches supported +void switchSetCustomName(uint8_t idx, const char* str, size_t len); +const char* switchGetCustomName(uint8_t idx); +bool switchHasCustomName(uint8_t idx); + +SwitchConfig switchGetMaxType(uint8_t idx); diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 9b4140e87..d254fd872 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -301,7 +301,7 @@ set(SRC set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} - keys_driver.cpp + # keys_driver.cpp diskio.cpp # telemetry_driver.cpp ) diff --git a/radio/src/targets/common/arm/stm32/CMakeLists.txt b/radio/src/targets/common/arm/stm32/CMakeLists.txt index 5052fc71b..68d505457 100644 --- a/radio/src/targets/common/arm/stm32/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/CMakeLists.txt @@ -41,6 +41,10 @@ set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} ../common/arm/stm32/stm32_serial_driver.cpp ../common/arm/stm32/stm32_softserial_driver.cpp ../common/arm/stm32/module_timer_driver.cpp + ../common/arm/stm32/stm32_switch_driver.cpp + ../common/arm/stm32/stm32_adc.cpp + ../common/arm/stm32/stm32_gpio_driver.cpp + ../common/arm/stm32/mixer_scheduler_driver.cpp ) if(IMU) diff --git a/radio/src/targets/common/arm/stm32/ads79xx.cpp b/radio/src/targets/common/arm/stm32/ads79xx.cpp new file mode 100644 index 000000000..3040f880a --- /dev/null +++ b/radio/src/targets/common/arm/stm32/ads79xx.cpp @@ -0,0 +1,173 @@ +/* + * 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 "ads79xx.h" +#include "delays_driver.h" + +#include "stm32_hal_ll.h" + +#define RESETCMD 0x4000 +#define MANUAL_MODE 0x1000 // manual mode channel 0 +#define MANUAL_MODE_CHANNEL(x) (MANUAL_MODE | ((x) << 7)) + +static uint16_t ads79xx_rw(SPI_TypeDef* SPIx, uint16_t value) +{ + while (!LL_SPI_IsActiveFlag_TXE(SPIx)); + LL_SPI_TransmitData16(SPIx, value); + + while (!LL_SPI_IsActiveFlag_RXNE(SPIx)); + return LL_SPI_ReceiveData16(SPIx); +} + +void ads79xx_init(const stm32_spi_adc_t* adc) +{ + LL_GPIO_InitTypeDef pinInit; + LL_GPIO_StructInit(&pinInit); + + pinInit.Pin = adc->GPIO_Pins; + pinInit.Mode = LL_GPIO_MODE_ALTERNATE; + pinInit.Alternate = adc->GPIO_AF; + LL_GPIO_Init(adc->GPIOx, &pinInit); + + pinInit.Pin = adc->GPIO_CS; + pinInit.Mode = LL_GPIO_MODE_OUTPUT; + pinInit.Alternate = LL_GPIO_AF_0; + LL_GPIO_Init(adc->GPIOx, &pinInit); + + auto SPIx = adc->SPIx; + LL_SPI_DeInit(SPIx); + + LL_SPI_InitTypeDef spiInit; + LL_SPI_StructInit(&spiInit); + + spiInit.TransferDirection = LL_SPI_FULL_DUPLEX; + spiInit.Mode = LL_SPI_MODE_MASTER; + spiInit.DataWidth = LL_SPI_DATAWIDTH_16BIT; + spiInit.NSS = LL_SPI_NSS_SOFT; + spiInit.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8; + LL_SPI_Init(SPIx, &spiInit); + + LL_SPI_Enable(SPIx); + + LL_SPI_DisableIT_TXE(SPIx); + LL_SPI_DisableIT_RXNE(SPIx); + + _SPI_ADC_CS_HIGH(adc); + delay_01us(1); + _SPI_ADC_CS_LOW(adc); + ads79xx_rw(SPIx, RESETCMD); + _SPI_ADC_CS_HIGH(adc); + delay_01us(1); + _SPI_ADC_CS_LOW(adc); + ads79xx_rw(SPIx, MANUAL_MODE); + _SPI_ADC_CS_HIGH(adc); +} + +static void ads79xx_dummy_read(const stm32_spi_adc_t* adc, uint16_t start_channel) +{ + // A dummy command to get things started + // (because the sampled data is lagging behind for two command cycles) + _SPI_ADC_CS_LOW(adc); + delay_01us(1); + ads79xx_rw(adc->SPIx, MANUAL_MODE_CHANNEL(start_channel)); + _SPI_ADC_CS_HIGH(adc); + delay_01us(1); +} + +static uint32_t ads79xx_read_next_channel(const stm32_spi_adc_t* adc, + uint8_t index, + const stm32_adc_input_t* inputs, + const uint8_t* chan, uint8_t nconv) +{ + uint32_t result = 0; + + // This delay is to allow charging of ADC input capacitor + // after the MUX changes from one channel to the other. + // It was determined experimentally. Biggest problem seems to be + // the cross-talk between A4:S1 and A5:MULTIPOS. Changing S1 for one extreme + // to the other resulted in A5 change of: + // + // delay value A5 change Time needed for adcRead() + // 1 16 0.154ms - 0.156ms + // 38 5 0.197ms - 0.199ms + // 62 0 0.225ms - 0.243ms + delay_01us(40); + + for (uint8_t i = 0; i < 4; i++) { + _SPI_ADC_CS_LOW(adc); + delay_01us(1); + + // command is changed to the next index for the last two readings + // (because the sampled data is lagging behind for two command cycles) + uint8_t chan_idx = (i > 1 ? index + 1 : index) % nconv; + + auto input_idx = chan[chan_idx]; + auto spi_chan = inputs[input_idx].ADC_Channel; + + uint16_t val = (0x0fff & ads79xx_rw(adc->SPIx, MANUAL_MODE_CHANNEL(spi_chan))); + +#if defined(JITTER_MEASURE) + if (JITTER_MEASURE_ACTIVE()) { + rawJitter[index].measure(val); + } +#endif + + _SPI_ADC_CS_HIGH(adc); + delay_01us(1); + result += val; + } + + return result >> 2; +} + +bool ads79xx_adc_start_read(const stm32_spi_adc_t* adc, const stm32_adc_input_t* inputs) +{ + auto start_channel = inputs[adc->channels[0]].ADC_Channel; + ads79xx_dummy_read(adc, start_channel); + ads79xx_dummy_read(adc, start_channel); + + return true; +} + +void ads79xx_adc_wait_completion(const stm32_spi_adc_t* adc, const stm32_adc_input_t* inputs) +{ + auto spi_channels = adc->n_channels; + auto chans = adc->channels; + + // Fetch buffer from generic ADC driver + auto adcValues = getAnalogValues(); + + // At this point, the first conversion has been started + // in ads79xx_adc_start_read() + + // for each SPI channel + for (uint32_t i = 0; i < spi_channels; i++) { + + // read SPI channel + auto input_channel = chans[i]; + auto adc_value = ads79xx_read_next_channel(adc, i, inputs, chans, spi_channels); + + if (inputs[input_channel].inverted) + adcValues[input_channel] = ADC_INVERT_VALUE(adc_value); + else + adcValues[input_channel] = adc_value; + } +} diff --git a/radio/src/targets/common/arm/stm32/ads79xx.h b/radio/src/targets/common/arm/stm32/ads79xx.h new file mode 100644 index 000000000..7992cdcfd --- /dev/null +++ b/radio/src/targets/common/arm/stm32/ads79xx.h @@ -0,0 +1,28 @@ +/* + * 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 "stm32_spi_adc.h" +#include "stm32_adc.h" + +void ads79xx_init(const stm32_spi_adc_t* adc); +bool ads79xx_adc_start_read(const stm32_spi_adc_t* adc, const stm32_adc_input_t* inputs); +void ads79xx_adc_wait_completion(const stm32_spi_adc_t* adc, const stm32_adc_input_t* inputs); + diff --git a/radio/src/targets/common/arm/stm32/board_common.h b/radio/src/targets/common/arm/stm32/board_common.h index 9c93fc101..c0f4aeace 100644 --- a/radio/src/targets/common/arm/stm32/board_common.h +++ b/radio/src/targets/common/arm/stm32/board_common.h @@ -25,16 +25,7 @@ #include #include "cpu_id.h" -#if defined(LUA_EXPORT_GENERATION) -// no includes -#else - -#if __clang__ - // clang is very picky about the use of "register" - // Tell clang to ignore the warnings for the following files - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdeprecated-register" -#endif +#if !defined(SIMU) && !defined(BACKUP) #if defined(STM32F4) #include "stm32f4xx.h" @@ -43,7 +34,6 @@ #include "stm32f4xx_gpio.h" #include "stm32f4xx_exti.h" #include "stm32f4xx_tim.h" - #include "stm32f4xx_adc.h" #include "stm32f4xx_spi.h" #include "stm32f4xx_pwr.h" #include "stm32f4xx_dma.h" @@ -57,7 +47,6 @@ #include "stm32f2xx_gpio.h" #include "stm32f2xx_exti.h" #include "stm32f2xx_tim.h" - #include "stm32f2xx_adc.h" #include "stm32f2xx_spi.h" #include "stm32f2xx_pwr.h" #include "stm32f2xx_dma.h" @@ -67,11 +56,6 @@ #include "dwt.h" // the old ST library that we use does not define DWT register for STM32F2xx #endif -#if __clang__ -// Restore warnings about registers -#pragma clang diagnostic pop -#endif - #endif #include "usb_driver.h" @@ -80,25 +64,6 @@ #include "../simu/simpgmspace.h" #endif -uint16_t getBatteryVoltage(); - -// STM32 uses a 25K+25K voltage divider bridge to measure the battery voltage -// Measuring VBAT puts considerable drain (22 µA) on the battery instead of normal drain (~10 nA) -static inline void enableVBatBridge() -{ - ADC->CCR |= ADC_CCR_VBATE; -} - -static inline void disableVBatBridge() -{ - ADC->CCR &= ~ADC_CCR_VBATE; -} - -static inline bool isVBatBridgeEnabled() -{ - return ADC->CCR & ADC_CCR_VBATE; -} - // Delays driver #define SYSTEM_TICKS_1MS ((CPU_FREQ + 500) / 1000) #define SYSTEM_TICKS_1US ((CPU_FREQ + 500000) / 1000000) @@ -110,10 +75,10 @@ extern "C" { static inline uint32_t ticksNow() { -#if defined(SIMU) - return 0; -#else +#if !defined(SIMU) && !defined(BACKUP) return DWT->CYCCNT; +#else + return 0; #endif } @@ -123,35 +88,4 @@ static inline uint32_t ticksNow() #include "delays_driver.h" -#define INIT_KEYS_PINS(GPIO) \ - GPIO_InitStructure.GPIO_Pin = KEYS_ ## GPIO ## _PINS; \ - GPIO_Init(GPIO, &GPIO_InitStructure) - -#define SET_KEYS_PINS_HIGH(GPIO) \ - GPIO_InitStructure.GPIO_Pin = KEYS_ ## GPIO ## _PINS; \ - GPIO_Init(GPIO, &GPIO_InitStructure); \ - GPIO_SetBits(GPIO, KEYS_ ## GPIO ## _PINS) - -#if defined(ROTARY_ENCODER_NAVIGATION) - typedef int32_t rotenc_t; - extern volatile rotenc_t rotencValue; - #define IS_ROTARY_ENCODER_NAVIGATION_ENABLE() true - #define ROTARY_ENCODER_NAVIGATION_VALUE rotencValue - #define ROTENC_LOWSPEED 1 - #define ROTENC_MIDSPEED 5 - #define ROTENC_HIGHSPEED 50 - #define ROTENC_DELAY_MIDSPEED 32 - #define ROTENC_DELAY_HIGHSPEED 16 -#elif (defined(RADIO_T8) || defined(RADIO_COMMANDO8)) && defined(__cplusplus) - constexpr uint8_t rotencSpeed = 1; -#endif - -#define ROTARY_ENCODER_GRANULARITY (2) - -#if defined(PWR_BUTTON_PRESS) - #define pwrOffPressed() pwrPressed() -#else - #define pwrOffPressed() (!pwrPressed()) -#endif - #endif diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt index 2046ac809..92df71e8e 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt @@ -22,7 +22,7 @@ set(BOOTLOADER_SRC ../../../../../${FATFS_DIR}/ffunicode.c ../../../../../targets/${TARGET_DIR}/${LCD_DRIVER} ../../../../../targets/${TARGET_DIR}/backlight_driver.cpp - ../../../../../targets/${TARGET_DIR}/keys_driver.cpp + #../../../../../targets/${TARGET_DIR}/keys_driver.cpp ../../../../../targets/${TARGET_DIR}/diskio.cpp ../../../../../targets/${TARGET_DIR}/board.cpp ../pwr_driver.cpp @@ -37,6 +37,7 @@ set(BOOTLOADER_SRC ../stm32_exti_driver.cpp ../stm32_serial_driver.cpp ../stm32_usart_driver.cpp + ../stm32_gpio_driver.cpp init.c boot.cpp bin_files.cpp @@ -72,9 +73,9 @@ if(PCB STREQUAL X10 OR PCB STREQUAL X12S OR PCB STREQUAL NV14) ../../../../../fonts/lvgl/lv_font_roboto_bl_16.c ../../../../../thirdparty/libopenui/src/bitmapbuffer.cpp ../../../../../thirdparty/libopenui/thirdparty/lz4/lz4.c - ../../../../../targets/${TARGET_DIR}/sdram_driver.c ../../../../../targets/common/arm/stm32/sdio_sd.c ../../../../../targets/common/arm/stm32/rtc_driver.cpp + ../../../../../targets/${TARGET_DIR}/sdram_driver.c ../../../../../targets/${TARGET_DIR}/haptic_driver.cpp ) @@ -83,11 +84,18 @@ if(PCB STREQUAL X10 OR PCB STREQUAL X12S OR PCB STREQUAL NV14) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} ../../../../../${LVGL_FILE}) endforeach() + if(NOT PCB STREQUAL NV14) + set(BOOTLOADER_SRC + ${BOOTLOADER_SRC} + ../../../../../targets/${TARGET_DIR}/led_driver.cpp + ) + endif() + + if(USB_CHARGER) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} ../../../../../targets/${TARGET_DIR}/usb_charger_driver.cpp - ../../../../../targets/${TARGET_DIR}/led_driver.cpp ) endif() diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp index c5c16525e..afd3f1fcc 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp @@ -19,6 +19,8 @@ * GNU General Public License for more details. */ +#include "stm32_hal_ll.h" + #if defined(BLUETOOTH) #include "bluetooth_driver.h" #include "stm32_serial_driver.h" @@ -29,9 +31,13 @@ #include "bin_files.h" #include "dataconstants.h" #include "lcd.h" -#include "keys.h" +// #include "keys.h" #include "debug.h" +#include "watchdog_driver.h" + +#include "hal/rotary_encoder.h" + #if defined(DEBUG_SEGGER_RTT) #include "thirdparty/Segger_RTT/RTT/SEGGER_RTT.h" #endif @@ -67,9 +73,10 @@ const uint8_t bootloaderVersion[] __attribute__ ((section(".version"), used)) = {'B', 'O', 'O', 'T', '1', '0'}; #endif -#if defined(DEBUG) && !defined(SIMU) +#define SOFTRESET_REQUEST 0xCAFEDEAD + volatile tmr10ms_t g_tmr10ms; -#endif +volatile uint8_t tenms = 1; uint32_t firmwareSize; uint32_t firmwareAddress = FIRMWARE_ADDRESS; @@ -80,7 +87,6 @@ uint32_t eepromAddress = 0; uint32_t eepromWritten = 0; #endif -volatile uint8_t tenms = 1; FlashCheckRes valid; MemoryType memoryType; uint32_t unlocked = 0; @@ -88,26 +94,18 @@ uint32_t unlocked = 0; void interrupt10ms() { tenms |= 1u; // 10 mS has passed - -#if defined(DEBUG) g_tmr10ms++; -#endif - uint8_t index = 0; - uint32_t in = readKeys(); - - for (int i = 0; i < TRM_BASE; i++) { - keys[index++].input(in & (1 << i)); - } + keysPollingCycle(); #if defined(ROTARY_ENCODER_NAVIGATION) static rotenc_t rePreviousValue; - rotenc_t reNewValue = (rotencValue / ROTARY_ENCODER_GRANULARITY); + rotenc_t reNewValue = rotaryEncoderGetValue(); int8_t scrollRE = reNewValue - rePreviousValue; if (scrollRE) { rePreviousValue = reNewValue; - pushEvent(scrollRE < 0 ? EVT_KEY_FIRST(KEY_UP) : EVT_KEY_FIRST(KEY_DOWN)); + pushEvent(scrollRE < 0 ? EVT_ROTARY_LEFT : EVT_ROTARY_RIGHT); } #endif } @@ -265,7 +263,7 @@ void bootloaderInitApp() #if (defined(RADIO_T8) || defined(RADIO_COMMANDO8)) && !defined(RADIOMASTER_RELEASE) // Bind button not pressed - if ((~KEYS_GPIO_REG_BIND & KEYS_GPIO_PIN_BIND) == false) { + if ((~(KEYS_GPIO_REG_BIND->IDR) & KEYS_GPIO_PIN_BIND) == false) { #else // LHR & RHL trims not pressed simultanously if (readTrims() != BOOTLOADER_KEYS) { @@ -374,11 +372,11 @@ int bootloaderMain() bootloaderDrawScreen(state, vpos); - if (event == EVT_KEY_FIRST(KEY_DOWN)) { + if (IS_NEXT_EVENT(event)) { if (vpos < bootloaderGetMenuItemCount(MAIN_MENU_LEN) - 1) { vpos++; } continue; } - else if (event == EVT_KEY_FIRST(KEY_UP)) { + else if (IS_PREVIOUS_EVENT(event)) { if (vpos > 0) { vpos--; } continue; } @@ -435,7 +433,7 @@ int bootloaderMain() limit = nameCount; } - if (event == EVT_KEY_REPT(KEY_DOWN) || event == EVT_KEY_FIRST(KEY_DOWN)) { + if (IS_NEXT_EVENT(event)) { if (vpos < limit - 1) { vpos += 1; } @@ -446,7 +444,7 @@ int bootloaderMain() } } } - else if (event == EVT_KEY_REPT(KEY_UP) || event == EVT_KEY_FIRST(KEY_UP)) { + else if (IS_PREVIOUS_EVENT(event)) { if (vpos > 0) { vpos -= 1; } diff --git a/radio/src/targets/common/arm/stm32/extmodule_driver.cpp b/radio/src/targets/common/arm/stm32/extmodule_driver.cpp deleted file mode 100644 index c70c336fb..000000000 --- a/radio/src/targets/common/arm/stm32/extmodule_driver.cpp +++ /dev/null @@ -1,69 +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 "extmodule_driver.h" - -#include "hal.h" -#include "board.h" -#include "timers_driver.h" - -static stm32_pulse_dma_tc_cb_t _ext_timer_DMA_TC_Callback; - -const stm32_pulse_timer_t extmoduleTimer = { - .GPIOx = EXTMODULE_TX_GPIO, - .GPIO_Pin = EXTMODULE_TX_GPIO_PIN, - .GPIO_Alternate = EXTMODULE_TIMER_TX_GPIO_AF, - .TIMx = EXTMODULE_TIMER, - .TIM_Freq = EXTMODULE_TIMER_FREQ, - .TIM_Channel = EXTMODULE_TIMER_Channel, - .TIM_IRQn = EXTMODULE_TIMER_IRQn, - .DMAx = EXTMODULE_TIMER_DMA, - .DMA_Stream = EXTMODULE_TIMER_DMA_STREAM_LL, - .DMA_Channel = EXTMODULE_TIMER_DMA_CHANNEL, - .DMA_IRQn = EXTMODULE_TIMER_DMA_STREAM_IRQn, - .DMA_TC_CallbackPtr = &_ext_timer_DMA_TC_Callback, -}; - -// Make sure the timer channel is supported -static_assert(__STM32_PULSE_IS_TIMER_CHANNEL_SUPPORTED(EXTMODULE_TIMER_Channel), - "Unsupported timer channel"); - -// Make sure the DMA channel is supported -static_assert(__STM32_PULSE_IS_DMA_STREAM_SUPPORTED(EXTMODULE_TIMER_DMA_STREAM_LL), - "Unsupported DMA stream"); - -#if !defined(EXTMODULE_TIMER_DMA_IRQHandler) -#error "Missing EXTMODULE_TIMER_DMA_IRQHandler definition" -#endif - -extern "C" void EXTMODULE_TIMER_DMA_IRQHandler() -{ - stm32_pulse_dma_tc_isr(&extmoduleTimer); -} - -#if !defined(EXTMODULE_TIMER_IRQHandler) -#error "Missing EXTMODULE_TIMER_IRQHandler definition" -#endif - -extern "C" void EXTMODULE_TIMER_IRQHandler() -{ - stm32_pulse_tim_update_isr(&extmoduleTimer); -} diff --git a/radio/src/targets/common/arm/stm32/f2/CMakeLists.txt b/radio/src/targets/common/arm/stm32/f2/CMakeLists.txt index 232ab41e1..43e14eabb 100644 --- a/radio/src/targets/common/arm/stm32/f2/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/f2/CMakeLists.txt @@ -15,6 +15,7 @@ if(NOT NATIVE_BUILD) ${STM32CUBE_DIR}/Src/stm32f2xx_ll_usart.c ${STM32CUBE_DIR}/Src/stm32f2xx_ll_rcc.c ${STM32CUBE_DIR}/Src/stm32f2xx_ll_exti.c + ${STM32CUBE_DIR}/Src/stm32f2xx_ll_adc.c # HAL drivers ${STM32CUBE_DIR}/Src/stm32f2xx_hal.c ${STM32CUBE_DIR}/Src/stm32f2xx_hal_pwr.c @@ -50,11 +51,8 @@ add_library(stm32_stdperiph OBJECT EXCLUDE_FROM_ALL ${STM32_STDPERIPH_DIR}/src/stm32f2xx_gpio.c ${STM32_STDPERIPH_DIR}/src/stm32f2xx_dbgmcu.c ${STM32_STDPERIPH_DIR}/src/stm32f2xx_rcc.c - ${STM32_STDPERIPH_DIR}/src/stm32f2xx_syscfg.c ${STM32_STDPERIPH_DIR}/src/stm32f2xx_spi.c ${STM32_STDPERIPH_DIR}/src/stm32f2xx_dma.c - ${STM32_STDPERIPH_DIR}/src/stm32f2xx_pwr.c - ${STM32_STDPERIPH_DIR}/src/stm32f2xx_adc.c ) set(FIRMWARE_SRC ${FIRMWARE_SRC} $) diff --git a/radio/src/targets/common/arm/stm32/f4/CMakeLists.txt b/radio/src/targets/common/arm/stm32/f4/CMakeLists.txt index c92006d71..af79251ce 100644 --- a/radio/src/targets/common/arm/stm32/f4/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/f4/CMakeLists.txt @@ -8,12 +8,15 @@ if(NOT NATIVE_BUILD) include_directories(${STM32CUBE_DIR}/Inc) add_library(stm32cube_ll OBJECT EXCLUDE_FROM_ALL + # LL drivers ${STM32CUBE_DIR}/Src/stm32f4xx_ll_gpio.c ${STM32CUBE_DIR}/Src/stm32f4xx_ll_tim.c ${STM32CUBE_DIR}/Src/stm32f4xx_ll_dma.c ${STM32CUBE_DIR}/Src/stm32f4xx_ll_usart.c ${STM32CUBE_DIR}/Src/stm32f4xx_ll_rcc.c ${STM32CUBE_DIR}/Src/stm32f4xx_ll_exti.c + ${STM32CUBE_DIR}/Src/stm32f4xx_ll_adc.c + ${STM32CUBE_DIR}/Src/stm32f4xx_ll_spi.c # HAL drivers ${STM32CUBE_DIR}/Src/stm32f4xx_hal.c ${STM32CUBE_DIR}/Src/stm32f4xx_hal_pwr.c @@ -49,11 +52,8 @@ set(STM32_STDPERIPH_SRC ${STM32_STDPERIPH_DIR}/src/stm32f4xx_gpio.c ${STM32_STDPERIPH_DIR}/src/stm32f4xx_dbgmcu.c ${STM32_STDPERIPH_DIR}/src/stm32f4xx_rcc.c - ${STM32_STDPERIPH_DIR}/src/stm32f4xx_syscfg.c ${STM32_STDPERIPH_DIR}/src/stm32f4xx_spi.c ${STM32_STDPERIPH_DIR}/src/stm32f4xx_dma.c - ${STM32_STDPERIPH_DIR}/src/stm32f4xx_pwr.c - ${STM32_STDPERIPH_DIR}/src/stm32f4xx_adc.c ${STM32_STDPERIPH_DIR}/src/stm32f4xx_flash.c ) @@ -66,6 +66,10 @@ if(CPU_TYPE_FULL STREQUAL STM32F429xI) ${STM32_STDPERIPH_DIR}/src/stm32f4xx_dma2d.c ${STM32_STDPERIPH_DIR}/src/stm32f4xx_sdio.c ) +elseif (CPU_TYPE_FULL STREQUAL STM32F413xG) + set(STM32_STDPERIPH_SRC ${STM32_STDPERIPH_SRC} + targets/${TARGET_DIR}/startup_stm32f413vgtx.s + ) else() set(STM32_STDPERIPH_SRC ${STM32_STDPERIPH_SRC} targets/${TARGET_DIR}/startup_stm32f40_41xxx.s diff --git a/radio/src/targets/common/arm/stm32/f4/system_stm32f4xx.c b/radio/src/targets/common/arm/stm32/f4/system_stm32f4xx.c index 890a57e2e..ec73f6d83 100644 --- a/radio/src/targets/common/arm/stm32/f4/system_stm32f4xx.c +++ b/radio/src/targets/common/arm/stm32/f4/system_stm32f4xx.c @@ -151,16 +151,27 @@ /******************************************************************************/ /************************* PLL Parameters *************************************/ -/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ -#define PLL_M 12 -#define PLL_N 336 +#if defined(STM32F413xx) + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ + #define PLL_M 12 + #define PLL_N 200 -/* SYSCLK = PLL_VCO / PLL_P */ -#define PLL_P 2 + /* SYSCLK = PLL_VCO / PLL_P */ + #define PLL_P 2 -/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ -#define PLL_Q 7 + /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ + #define PLL_Q 2 +#else + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ + #define PLL_M 12 + #define PLL_N 336 + /* SYSCLK = PLL_VCO / PLL_P */ + #define PLL_P 2 + + /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ + #define PLL_Q 7 +#endif /******************************************************************************/ /** @@ -178,8 +189,11 @@ /** @addtogroup STM32F4xx_System_Private_Variables * @{ */ - +#if defined(STM32F413xx) + uint32_t SystemCoreClock = 100000000; +#else uint32_t SystemCoreClock = 168000000; +#endif __I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; __I uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; diff --git a/radio/src/targets/common/arm/stm32/flash_driver.cpp b/radio/src/targets/common/arm/stm32/flash_driver.cpp index b3b697779..84e0b1e45 100644 --- a/radio/src/targets/common/arm/stm32/flash_driver.cpp +++ b/radio/src/targets/common/arm/stm32/flash_driver.cpp @@ -20,6 +20,7 @@ */ #include "board.h" +#include "watchdog_driver.h" void waitFlashIdle() { diff --git a/radio/src/targets/common/arm/stm32/flysky_gimbal_driver.cpp b/radio/src/targets/common/arm/stm32/flysky_gimbal_driver.cpp index 31b5d19e8..ceda29fbc 100644 --- a/radio/src/targets/common/arm/stm32/flysky_gimbal_driver.cpp +++ b/radio/src/targets/common/arm/stm32/flysky_gimbal_driver.cpp @@ -22,6 +22,7 @@ #include "flysky_gimbal_driver.h" #include "stm32_serial_driver.h" #include "delays_driver.h" +#include "hal/adc_driver.h" #include "hal.h" #include "crc.h" @@ -46,20 +47,8 @@ DEFINE_STM32_SERIAL_PORT(FSGimbal, fsUSART, HALLSTICK_BUFF_SIZE, 0); static STRUCT_HALL HallProtocol = { 0 }; -signed short hall_raw_values[FLYSKY_HALL_CHANNEL_COUNT]; -unsigned short hall_adc_values[FLYSKY_HALL_CHANNEL_COUNT]; - static void* _fs_usart_ctx = nullptr; -uint16_t get_flysky_hall_adc_value(uint8_t ch) -{ - if (ch >= FLYSKY_HALL_CHANNEL_COUNT) { - return 0; - } - - return 2 * FLYSKY_OFFSET_VALUE - hall_adc_values[ch]; -} - static int _fs_get_byte(uint8_t* data) { return STM32SerialDriver.getByte(_fs_usart_ctx, data); @@ -130,33 +119,31 @@ static volatile bool _fs_gimbal_detected; static void flysky_gimbal_loop() { - uint8_t byte; + uint8_t byte; - while(_fs_get_byte(&byte)) - { - HallProtocol.index++; + while (_fs_get_byte(&byte)) { + HallProtocol.index++; - _fs_parse(&HallProtocol, byte); - if ( HallProtocol.msg_OK ) - { - HallProtocol.msg_OK = 0; - HallProtocol.stickState = HallProtocol.data[HallProtocol.length - 1]; + _fs_parse(&HallProtocol, byte); + if (HallProtocol.msg_OK) { + HallProtocol.msg_OK = 0; + HallProtocol.stickState = HallProtocol.data[HallProtocol.length - 1]; - switch ( HallProtocol.hallID.hall_Id.receiverID ) - { - case TRANSFER_DIR_TXMCU: - if(HallProtocol.hallID.hall_Id.packetID == FLYSKY_HALL_RESP_TYPE_VALUES) { - memcpy(hall_raw_values, HallProtocol.data, sizeof(hall_raw_values)); - for ( uint8_t channel = 0; channel < 4; channel++ ) - { - hall_adc_values[channel] = FLYSKY_OFFSET_VALUE + hall_raw_values[channel]; - } - } - break; + switch (HallProtocol.hallID.hall_Id.receiverID) { + case TRANSFER_DIR_TXMCU: + if (HallProtocol.hallID.hall_Id.packetID == + FLYSKY_HALL_RESP_TYPE_VALUES) { + int16_t* p_values = (int16_t*)HallProtocol.data; + uint16_t* adcValues = getAnalogValues(); + for (uint8_t i = 0; i < 4; i++) { + adcValues[i] = FLYSKY_OFFSET_VALUE - p_values[i]; } - _fs_gimbal_detected = true; - } + } + break; + } + _fs_gimbal_detected = true; } + } } static void flysky_gimbal_deinit() diff --git a/radio/src/targets/common/arm/stm32/mixer_scheduler_driver.cpp b/radio/src/targets/common/arm/stm32/mixer_scheduler_driver.cpp index 258314032..0e4bc53b5 100644 --- a/radio/src/targets/common/arm/stm32/mixer_scheduler_driver.cpp +++ b/radio/src/targets/common/arm/stm32/mixer_scheduler_driver.cpp @@ -19,12 +19,11 @@ * GNU General Public License for more details. */ -#include "opentx.h" #include "mixer_scheduler.h" - -#if !defined(SIMU) +#include "stm32_hal_ll.h" #include "FreeRTOSConfig.h" +#include "hal.h" // Start scheduler with default period void mixerSchedulerStart() @@ -81,5 +80,3 @@ extern "C" void MIXER_SCHEDULER_TIMER_IRQHandler(void) // trigger mixer start mixerSchedulerISRTrigger(); } - -#endif diff --git a/radio/src/targets/common/arm/stm32/pwr_driver.cpp b/radio/src/targets/common/arm/stm32/pwr_driver.cpp index 2f758c94c..59c34778a 100644 --- a/radio/src/targets/common/arm/stm32/pwr_driver.cpp +++ b/radio/src/targets/common/arm/stm32/pwr_driver.cpp @@ -20,6 +20,7 @@ */ #include "board.h" +#include "watchdog_driver.h" void pwrInit() { @@ -107,9 +108,22 @@ bool pwrForcePressed() bool pwrPressed() { #if defined(PWR_EXTRA_SWITCH_GPIO) - return (GPIO_ReadInputDataBit(PWR_SWITCH_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET || GPIO_ReadInputDataBit(PWR_EXTRA_SWITCH_GPIO, PWR_EXTRA_SWITCH_GPIO_PIN) == Bit_RESET); + return (GPIO_ReadInputDataBit(PWR_SWITCH_GPIO, PWR_SWITCH_GPIO_PIN) == + Bit_RESET || + GPIO_ReadInputDataBit(PWR_EXTRA_SWITCH_GPIO, + PWR_EXTRA_SWITCH_GPIO_PIN) == Bit_RESET); #else - return GPIO_ReadInputDataBit(PWR_SWITCH_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET; + return GPIO_ReadInputDataBit(PWR_SWITCH_GPIO, PWR_SWITCH_GPIO_PIN) == + Bit_RESET; +#endif +} + +bool pwrOffPressed() +{ +#if defined(PWR_BUTTON_PRESS) + return pwrPressed(); +#else + return !pwrPressed(); #endif } diff --git a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp index 79bff4821..1f25e4c5e 100644 --- a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp +++ b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp @@ -21,9 +21,13 @@ #include "stm32_hal_ll.h" #include "stm32_exti_driver.h" +#include "stm32_gpio_driver.h" #include "board.h" #include "hal.h" +#include "hal/key_driver.h" +#include "hal/rotary_encoder.h" + #include "board_common.h" #if !defined(BOOT) @@ -43,6 +47,16 @@ volatile uint32_t rotencDt = 0; (g_eeGeneral.rotEncMode == ROTARY_ENCODER_MODE_INVERT_BOTH ? -2 : 2); #endif +rotenc_t rotaryEncoderGetValue() +{ + return rotencValue / ROTARY_ENCODER_GRANULARITY; +} + +rotenc_t rotaryEncoderGetRawValue() +{ + return rotencValue; +} + void rotaryEncoderCheck() { static uint8_t state = 0; @@ -131,6 +145,15 @@ void rotaryEncoderStartDelay() void rotaryEncoderInit() { + LL_GPIO_InitTypeDef pinInit; + LL_GPIO_StructInit(&pinInit); + pinInit.Mode = LL_GPIO_MODE_INPUT; + pinInit.Pull = LL_GPIO_PULL_UP; + pinInit.Pin = ROTARY_ENCODER_GPIO_PIN_A | ROTARY_ENCODER_GPIO_PIN_B; + + stm32_gpio_enable_clock(ROTARY_ENCODER_GPIO); + LL_GPIO_Init(ROTARY_ENCODER_GPIO, &pinInit); + ROTARY_ENCODER_TIMER->ARR = 99; // 100uS ROTARY_ENCODER_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 1000000 - 1; // 1uS ROTARY_ENCODER_TIMER->CCER = 0; diff --git a/radio/src/targets/common/arm/stm32/rtc_driver.cpp b/radio/src/targets/common/arm/stm32/rtc_driver.cpp index bcf2ff150..51494b6b9 100644 --- a/radio/src/targets/common/arm/stm32/rtc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/rtc_driver.cpp @@ -91,8 +91,17 @@ void rtcInit() rtcGetTime(&utm); g_rtcTime = gmktime(&utm); #endif + #if defined(RTC_BACKUP_RAM) && !defined(BOOT) __HAL_RCC_BKPSRAM_CLK_ENABLE(); HAL_PWREx_EnableBkUpReg(); #endif } + +void rtcDisableBackupReg() +{ +#if defined(RTC_BACKUP_RAM) + __HAL_RCC_BKPSRAM_CLK_DISABLE(); + HAL_PWREx_DisableBkUpReg(); +#endif +} diff --git a/radio/src/targets/common/arm/stm32/sdio_sd.c b/radio/src/targets/common/arm/stm32/sdio_sd.c index c91192f92..c7925f9fd 100644 --- a/radio/src/targets/common/arm/stm32/sdio_sd.c +++ b/radio/src/targets/common/arm/stm32/sdio_sd.c @@ -21,6 +21,12 @@ #include "sdio_sd.h" #include "debug.h" +#if defined(STM32F4) + #include "stm32f4xx_sdio.h" +#elif defined(STM32F2) + #include "stm32f2xx_sdio.h" +#endif + #define SDIO_STATIC_FLAGS ((uint32_t)0x000005FF) #define SDIO_CMD0TIMEOUT ((uint32_t)0x00010000) diff --git a/radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp b/radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp index 6b2fd3c6a..eb7be03fa 100644 --- a/radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp +++ b/radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp @@ -19,25 +19,24 @@ * GNU General Public License for more details. */ -#include "opentx.h" +#include "hal/adc_driver.h" +#include "stm32_hal_ll.h" +#include "delays_driver.h" -volatile uint32_t pwm_interrupt_count = 0; -volatile uint16_t timer_capture_values[NUM_PWMSTICKS]; +#include "hal.h" +#include "dataconstants.h" -void sticksPwmInit() +static volatile uint32_t pwm_interrupt_count; + +static void sticksPwmInit() { - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = PWM_GPIOA_PINS; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(PWM_GPIO, &GPIO_InitStructure); - - GPIO_PinAFConfig(PWM_GPIO, GPIO_PinSource0, PWM_GPIO_AF); - GPIO_PinAFConfig(PWM_GPIO, GPIO_PinSource1, PWM_GPIO_AF); - GPIO_PinAFConfig(PWM_GPIO, GPIO_PinSource2, PWM_GPIO_AF); - GPIO_PinAFConfig(PWM_GPIO, GPIO_PinSource3, PWM_GPIO_AF); + LL_GPIO_InitTypeDef pinInit; + pinInit.Pin = PWM_GPIOA_PINS; + pinInit.Mode = LL_GPIO_MODE_ALTERNATE; + pinInit.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH; + pinInit.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + pinInit.Pull = LL_GPIO_PULL_UP; + LL_GPIO_Init(PWM_GPIO, &pinInit); PWM_TIMER->CR1 &= ~TIM_CR1_CEN; // Stop timer PWM_TIMER->PSC = 80; @@ -45,14 +44,39 @@ void sticksPwmInit() PWM_TIMER->CCMR1 = TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; PWM_TIMER->CCMR2 = TIM_CCMR2_CC3S_0 | TIM_CCMR2_CC4S_0; PWM_TIMER->CCER = TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E; - PWM_TIMER->DIER |= TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4; + PWM_TIMER->DIER |= TIM_DIER_CC1IE | TIM_DIER_CC2IE | TIM_DIER_CC3IE | TIM_DIER_CC4IE; PWM_TIMER->CR1 = TIM_CR1_CEN; // Start timer NVIC_EnableIRQ(PWM_IRQn); NVIC_SetPriority(PWM_IRQn, 10); } -inline uint32_t TIM_GetCapture_Stick(uint8_t n) +static void sticksPwmDeInit() +{ + NVIC_DisableIRQ(PWM_IRQn); + PWM_TIMER->CR1 &= ~TIM_CR1_CEN; // Stop timer + + LL_GPIO_InitTypeDef pinInit; + LL_GPIO_StructInit(&pinInit); + + pinInit.Pin = PWM_GPIOA_PINS; + pinInit.Mode = LL_GPIO_MODE_INPUT; + LL_GPIO_Init(PWM_GPIO, &pinInit); +} + +bool sticksPwmDetect() +{ + pwm_interrupt_count = 0; + sticksPwmInit(); + delay_ms(20); + if (pwm_interrupt_count < 32) { + sticksPwmDeInit(); + return false; + } + return true; +} + +static inline uint32_t TIM_GetCapture_Stick(uint8_t n) { switch (n) { case 0: @@ -68,22 +92,22 @@ inline uint32_t TIM_GetCapture_Stick(uint8_t n) } } -inline void TIM_SetPolarityRising(uint8_t n) +static inline void TIM_SetPolarityRising(uint8_t n) { PWM_TIMER->CCER &= ~(TIM_CCER_CC1P << (n * 4)); } -inline void TIM_SetPolarityFalling(uint8_t n) +static inline void TIM_SetPolarityFalling(uint8_t n) { PWM_TIMER->CCER |= (TIM_CCER_CC1P << (n * 4)); } -inline void TIM_ClearITPendingBit(uint8_t n) +static inline void TIM_ClearITPendingBit(uint8_t n) { - PWM_TIMER->SR = ~(TIM_IT_CC1 << n); + PWM_TIMER->SR = ~(TIM_SR_CC1IF << n); } -inline uint32_t diff_with_16bits_overflow(uint32_t a, uint32_t b) +static inline uint32_t diff_with_16bits_overflow(uint32_t a, uint32_t b) { if (b > a) return b - a; @@ -91,19 +115,45 @@ inline uint32_t diff_with_16bits_overflow(uint32_t a, uint32_t b) return b + 0xffff - a; } +#if !defined(STICK_PWM_CHANNEL_0) + #define STICK_PWM_CHANNEL_0 0 +#endif + +#if !defined(STICK_PWM_CHANNEL_1) + #define STICK_PWM_CHANNEL_1 1 +#endif + +#if !defined(STICK_PWM_CHANNEL_2) + #define STICK_PWM_CHANNEL_2 2 +#endif + +#if !defined(STICK_PWM_CHANNEL_3) + #define STICK_PWM_CHANNEL_3 3 +#endif + +static const uint8_t _channel_map[] = { + STICK_PWM_CHANNEL_0, + STICK_PWM_CHANNEL_1, + STICK_PWM_CHANNEL_2, + STICK_PWM_CHANNEL_3, +}; + extern "C" void PWM_IRQHandler(void) { - static uint8_t timer_capture_states[NUM_PWMSTICKS]; - static uint32_t timer_capture_rising_time[NUM_PWMSTICKS]; + static uint8_t timer_capture_states[MAX_STICKS]; + static uint32_t timer_capture_rising_time[MAX_STICKS]; - for (uint8_t i=0; iSR & (TIM_DIER_CC1IE << i)) { + auto adcValues = getAnalogValues(); + + for (uint8_t i=0; iSR & (TIM_SR_CC1IF << i)) { uint32_t capture = TIM_GetCapture_Stick(i); - pwm_interrupt_count++; // overflow may happen but we only use this to detect PWM / ADC on radio startup + // overflow may happen but we only use this to detect PWM / ADC on radio startup + pwm_interrupt_count++; if (timer_capture_states[i] != 0) { uint32_t value = diff_with_16bits_overflow(timer_capture_rising_time[i], capture); if (value < 10000) { - timer_capture_values[i] = (uint16_t) value; + adcValues[_channel_map[i]] = (uint16_t) value; } TIM_SetPolarityRising(i); timer_capture_states[i] = 0; @@ -117,21 +167,3 @@ extern "C" void PWM_IRQHandler(void) } } } - -#if defined(STICK_CHANNEL_CHANGE) -void sticksPwmRead(uint16_t * values) -{ - values[0] = timer_capture_values[STICK_PWM_CHANNEL_0]; - values[1] = timer_capture_values[STICK_PWM_CHANNEL_1]; - values[2] = timer_capture_values[STICK_PWM_CHANNEL_2]; - values[3] = timer_capture_values[STICK_PWM_CHANNEL_3]; -} -#else -void sticksPwmRead(uint16_t * values) -{ - values[0] = timer_capture_values[0]; - values[1] = timer_capture_values[1]; - values[2] = timer_capture_values[3]; - values[3] = timer_capture_values[2]; -} -#endif diff --git a/radio/src/targets/common/arm/stm32/sticks_pwm_driver.h b/radio/src/targets/common/arm/stm32/sticks_pwm_driver.h new file mode 100644 index 000000000..151992595 --- /dev/null +++ b/radio/src/targets/common/arm/stm32/sticks_pwm_driver.h @@ -0,0 +1,25 @@ +/* + * 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 + +// returns 'true' if PWM sticks have been detected +bool sticksPwmDetect(); diff --git a/radio/src/targets/common/arm/stm32/stm32_adc.cpp b/radio/src/targets/common/arm/stm32/stm32_adc.cpp new file mode 100644 index 000000000..2b9dd1794 --- /dev/null +++ b/radio/src/targets/common/arm/stm32/stm32_adc.cpp @@ -0,0 +1,582 @@ +/* + * 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 "stm32_adc.h" +#include "stm32_gpio_driver.h" +#include "opentx.h" + +#define ADC_COMMON ((ADC_Common_TypeDef *) ADC_BASE) +#define MAX_ADC_INPUTS 32 +#define OVERSAMPLING 4 + +// Please note that we use the same prio for DMA TC and ADC IRQs +// to avoid issues with preemption between these 2 +#define ADC_IRQ_PRIO configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + +// Max 32 inputs supported +static uint32_t _adc_input_mask; +static volatile uint32_t _adc_inhibit_mask; + +// DMA buffers +static uint16_t _adc_dma_buffer[MAX_ADC_INPUTS] __DMA; + +// ADCs started +static uint8_t _adc_started_mask; +static volatile uint8_t _adc_completed; + +static const stm32_adc_t* _adc_ADCs; +static uint8_t _adc_n_ADC; +static const stm32_adc_input_t* _adc_inputs; +static uint8_t _adc_n_inputs; + +// Need for oversampling and decimation +static uint8_t _adc_run; +static uint8_t _adc_oversampling_disabled; +static uint16_t _adc_oversampling[MAX_ADC_INPUTS]; + +// STM32 uses a 25K+25K voltage divider bridge to measure the battery voltage +// Measuring VBAT puts considerable drain (22 µA) on the battery instead of +// normal drain (~10 nA) +void enableVBatBridge() +{ + if (adcGetMaxInputs(ADC_INPUT_RTC_BAT) < 1) return; + + // Set internal measurement path for vbat sensor + LL_ADC_SetCommonPathInternalCh(ADC_COMMON, LL_ADC_PATH_INTERNAL_VBAT); + + auto channel = adcGetInputOffset(ADC_INPUT_RTC_BAT); + _adc_inhibit_mask &= ~(1 << channel); +} + +void disableVBatBridge() +{ + if (adcGetMaxInputs(ADC_INPUT_RTC_BAT) < 1) return; + + auto channel = adcGetInputOffset(ADC_INPUT_RTC_BAT); + _adc_inhibit_mask |= (1 << channel); + + // Set internal measurement path to none + LL_ADC_SetCommonPathInternalCh(ADC_COMMON, LL_ADC_PATH_INTERNAL_NONE); +} + +bool isVBatBridgeEnabled() +{ + // && !(_adc_inhibit_mask & (1 << channel)); + return LL_ADC_GetCommonPathInternalCh(ADC_COMMON) == LL_ADC_PATH_INTERNAL_VBAT; +} + +static void adc_enable_clock(ADC_TypeDef* ADCx) +{ + uint32_t adc_idx = (((uint32_t) ADCx) - ADC1_BASE) / 0x100UL; + uint32_t adc_msk = RCC_APB2ENR_ADC1EN << adc_idx; + LL_APB2_GRP1_EnableClock(adc_msk); +} + +static bool adc_disable_dma(DMA_TypeDef* DMAx, uint32_t stream); +static void adc_dma_clear_flags(DMA_TypeDef* DMAx, uint32_t stream); + +static void adc_init_pins(const stm32_adc_gpio_t* GPIOs, uint8_t n_GPIO) +{ + LL_GPIO_InitTypeDef pinInit; + LL_GPIO_StructInit(&pinInit); + + pinInit.Mode = LL_GPIO_MODE_ANALOG; + pinInit.Pull = LL_GPIO_PULL_NO; + + const stm32_adc_gpio_t* gpio = GPIOs; + while (n_GPIO > 0) { + + pinInit.Pin = 0; + + for (uint8_t pin_idx = 0; pin_idx < gpio->n_pins; pin_idx++) { + + uint32_t pin = gpio->pins[pin_idx]; + uint32_t mode = LL_GPIO_GetPinMode(gpio->GPIOx, pin); + + // Output or AF: pin is probably used somewhere else + if (mode != LL_GPIO_MODE_INPUT && mode != LL_GPIO_MODE_ANALOG) continue; + + pinInit.Pin |= pin; + } + + stm32_gpio_enable_clock(gpio->GPIOx); + LL_GPIO_Init(gpio->GPIOx, &pinInit); + gpio++; n_GPIO--; + } +} + +static const uint32_t _seq_length_lookup[] = { + LL_ADC_REG_SEQ_SCAN_DISABLE, + LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS, + LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS, +}; + +static void adc_setup_scan_mode(ADC_TypeDef* ADCx, uint8_t nconv) +{ + // ADC must be disabled for the functions used here + LL_ADC_Disable(ADCx); + + LL_ADC_InitTypeDef adcInit; + LL_ADC_StructInit(&adcInit); + + if (nconv > 1) { + adcInit.SequencersScanMode = LL_ADC_SEQ_SCAN_ENABLE; + } else { + adcInit.SequencersScanMode = LL_ADC_SEQ_SCAN_DISABLE; + } + + adcInit.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT; + LL_ADC_Init(ADCx, &adcInit); + + LL_ADC_REG_InitTypeDef adcRegInit; + LL_ADC_REG_StructInit(&adcRegInit); + + adcRegInit.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE; + adcRegInit.ContinuousMode = LL_ADC_REG_CONV_SINGLE; + + if (nconv > 1) { + adcRegInit.SequencerLength = _seq_length_lookup[nconv - 1]; + adcRegInit.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED; + } + + LL_ADC_REG_Init(ADCx, &adcRegInit); + + // Enable ADC + // TODO: check ADC_CR2_DDS (normally only for circular DMA + // but the old was using it (no clue why) + LL_ADC_Enable(ADCx); +} + +static const uint32_t _rank_lookup[] = { + LL_ADC_REG_RANK_1, + LL_ADC_REG_RANK_2, + LL_ADC_REG_RANK_3, + LL_ADC_REG_RANK_4, + LL_ADC_REG_RANK_5, + LL_ADC_REG_RANK_6, + LL_ADC_REG_RANK_7, + LL_ADC_REG_RANK_8, + LL_ADC_REG_RANK_9, + LL_ADC_REG_RANK_10, + LL_ADC_REG_RANK_11, + LL_ADC_REG_RANK_12, + LL_ADC_REG_RANK_13, + LL_ADC_REG_RANK_14, + LL_ADC_REG_RANK_15, + LL_ADC_REG_RANK_16, +}; + +static uint8_t adc_init_channels(const stm32_adc_t* adc, + const stm32_adc_input_t* inputs, + const uint8_t* chan, + uint8_t nconv) +{ + if (!chan || !nconv) return 0; + + uint8_t rank = 0; + uint32_t channel_mask = 0; + + while (nconv > 0) { + + uint8_t input_idx = *chan; + const stm32_adc_input_t* input = &inputs[input_idx]; + + // internal channel don't have a GPIO + pin defined + uint32_t mask = (1 << (ADC_CHANNEL_ID_MASK & input->ADC_Channel)); + if (!__LL_ADC_IS_CHANNEL_INTERNAL(input->ADC_Channel)) { + uint32_t mode = LL_GPIO_GetPinMode(input->GPIOx, input->GPIO_Pin); + if (mode != LL_GPIO_MODE_ANALOG) { + // skip channel + nconv--; chan++; + continue; + } + } else { + // Internal channels are inhibited until explicitely enabled + _adc_inhibit_mask |= mask; + } + + // channel is already used, probably a secondary input + // using the same ADC channel + if (channel_mask & mask) { + nconv--; chan++; + continue; + } + + // update mask for used channels + channel_mask |= mask; + + // update mask for valid inputs + _adc_input_mask |= (1 << input_idx); + + LL_ADC_REG_SetSequencerRanks(adc->ADCx, _rank_lookup[rank], + input->ADC_Channel); + + LL_ADC_SetChannelSamplingTime(adc->ADCx, input->ADC_Channel, + adc->sample_time); + + + nconv--; + rank++; + chan++; + } + + return rank; +} + +static bool adc_init_dma_stream(ADC_TypeDef* adc, DMA_TypeDef* DMAx, + uint32_t stream, uint32_t channel, + uint16_t* dest, uint8_t nconv) +{ + // Disable DMA before continuing (see ref. manual "Stream configuration procedure") + if (!adc_disable_dma(DMAx, stream)) + return false; + + // Clear Interrupt flags + adc_dma_clear_flags(DMAx, stream); + + // setup DMA request + LL_DMA_ConfigAddresses(DMAx, stream, CONVERT_PTR_UINT(&adc->DR), + CONVERT_PTR_UINT(dest), + LL_DMA_DIRECTION_PERIPH_TO_MEMORY); + LL_DMA_SetDataLength(DMAx, stream, nconv); + LL_DMA_SetChannelSelection(DMAx, stream, channel); + + // Very high priority, 1 byte transfers, increment memory + LL_DMA_ConfigTransfer(DMAx, stream, + LL_DMA_PRIORITY_VERYHIGH | LL_DMA_MDATAALIGN_HALFWORD | + LL_DMA_PDATAALIGN_HALFWORD | LL_DMA_MEMORY_INCREMENT | + LL_DMA_DIRECTION_PERIPH_TO_MEMORY); + + // disable direct mode, half full FIFO + LL_DMA_EnableFifoMode(DMAx, stream); + LL_DMA_SetFIFOThreshold(DMAx, stream, LL_DMA_FIFOTHRESHOLD_1_2); + + return true; +} + +bool stm32_hal_adc_init(const stm32_adc_t* ADCs, uint8_t n_ADC, + const stm32_adc_input_t* inputs, + const stm32_adc_gpio_t* ADC_GPIOs, uint8_t n_GPIO) +{ + _adc_input_mask = 0; + _adc_inhibit_mask = 0; + _adc_oversampling_disabled = 0; + + adc_init_pins(ADC_GPIOs, n_GPIO); + + // Init common to all ADCs + LL_ADC_CommonInitTypeDef commonInit; + LL_ADC_CommonStructInit(&commonInit); + + commonInit.CommonClock = LL_ADC_CLOCK_SYNC_PCLK_DIV2; + LL_ADC_CommonInit(ADC_COMMON, &commonInit); + + _adc_input_mask = 0; + // uint16_t* dma_buffer = _adc_dma_buffer; + const stm32_adc_t* adc = ADCs; + while (n_ADC > 0) { + + uint8_t nconv = adc->n_channels; + if (nconv > 0) { + + // enable periph clock + adc_enable_clock(adc->ADCx); + + // configure each channel + const uint8_t* chan = adc->channels; + nconv = adc_init_channels(adc, inputs, chan, nconv); + adc_setup_scan_mode(adc->ADCx, nconv); + + if (nconv > 1) { + if (adc->DMAx) { + uint16_t* dma_buffer = _adc_dma_buffer + adc->offset; + if (!adc_init_dma_stream(adc->ADCx, adc->DMAx, adc->DMA_Stream, + adc->DMA_Channel, dma_buffer, nconv)) + return false; + + NVIC_SetPriority(adc->DMA_Stream_IRQn, ADC_IRQ_PRIO); + NVIC_EnableIRQ(adc->DMA_Stream_IRQn); + } else { + // multiple channels on the same ADC + // without a DMA is NOT supported + return false; + } + } else { + // single conversion + NVIC_SetPriority(ADC_IRQn, ADC_IRQ_PRIO); + NVIC_EnableIRQ(ADC_IRQn); + } + } + + // move to next ADC definition + adc++; n_ADC--; + } + + return true; +} + +#define DMA_Stream0_IT_MASK (uint32_t)(DMA_LISR_FEIF0 | DMA_LISR_DMEIF0 | \ + DMA_LISR_TEIF0 | DMA_LISR_HTIF0 | \ + DMA_LISR_TCIF0) + +#define DMA_Stream4_IT_MASK (uint32_t)(DMA_HISR_FEIF4 | DMA_HISR_DMEIF4 | \ + DMA_HISR_TEIF4 | DMA_HISR_HTIF4 | \ + DMA_HISR_TCIF4) + +static void adc_dma_clear_flags(DMA_TypeDef* DMAx, uint32_t stream) +{ + // no other choice, sorry for that... + if (stream == LL_DMA_STREAM_4) { + /* Reset interrupt pending bits for DMA2 Stream4 */ + WRITE_REG(DMAx->HIFCR, DMA_Stream4_IT_MASK); + + } else if (stream == LL_DMA_STREAM_0) { + /* Reset interrupt pending bits for DMA2 Stream0 */ + WRITE_REG(DMAx->LIFCR, DMA_Stream0_IT_MASK); + } +} + +static inline DMA_Stream_TypeDef* _dma_get_stream(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return ((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream]))); +} + +static void adc_start_dma_conversion(ADC_TypeDef* ADCx, DMA_TypeDef* DMAx, uint32_t stream) +{ + // Clear Interrupt flags + adc_dma_clear_flags(DMAx, stream); + + // Clear ADC status register & disable ADC IRQ + CLEAR_BIT(ADCx->SR, ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); + CLEAR_BIT(ADCx->CR1, ADC_CR1_EOCIE); + + // Enable DMA + auto dma_stream = _dma_get_stream(DMAx, stream); + SET_BIT(dma_stream->CR, DMA_SxCR_TCIE | DMA_SxCR_TEIE | DMA_SxCR_DMEIE); + SET_BIT(dma_stream->CR, DMA_SxCR_EN); + + // Trigger ADC start + SET_BIT(ADCx->CR2, ADC_CR2_SWSTART); +} + +static bool adc_disable_dma(DMA_TypeDef* DMAx, uint32_t stream) +{ + LL_DMA_DisableStream(DMAx, stream); + + // wait until DMA EN bit gets cleared by hardware + uint16_t timeout = 1000; + while (LL_DMA_IsEnabledStream(DMAx, stream)) { + if (--timeout == 0) { + // Timeout. Failed to disable DMA + return false; + } + } + return true; +} + +static void adc_start_normal_conversion(ADC_TypeDef* ADCx) +{ + // clear status flags + CLEAR_BIT(ADCx->SR, ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); + + // enble ADC IRQ + SET_BIT(ADCx->CR1, ADC_CR1_EOCIE); + + // and start! + SET_BIT(ADCx->CR2, ADC_CR2_SWSTART); +} + +static void adc_start_read(const stm32_adc_t* ADCs, uint8_t n_ADC) +{ + // Start all ADCs in parallel + + uint8_t adc_mask = 1; + _adc_started_mask = 0; + + const stm32_adc_t* adc = ADCs; + while (n_ADC > 0) { + + // if the ADC has no active channels, + // it has not been enabled at all + auto ADCx = adc->ADCx; + if (!LL_ADC_IsEnabled(ADCx)) { + adc++; n_ADC--; adc_mask <<= 1; + continue; + } + + // more than one channel enabled on this ADC + if (LL_ADC_GetSequencersScanMode(ADCx) == LL_ADC_SEQ_SCAN_ENABLE) { + + // Disable DMA before continuing (see ref. manual "Stream configuration procedure") + auto DMAx = adc->DMAx; + auto stream = adc->DMA_Stream; + if (DMAx && adc_disable_dma(DMAx, stream)) { + _adc_started_mask |= adc_mask; + adc_start_dma_conversion(ADCx, DMAx, stream); + } + + } else { + // only one channel + _adc_started_mask |= adc_mask; + adc_start_normal_conversion(ADCx); + } + + // move to next ADC + adc++; n_ADC--; adc_mask <<= 1; + } +} + +bool stm32_hal_adc_start_read(const stm32_adc_t* ADCs, uint8_t n_ADC, + const stm32_adc_input_t* inputs, uint8_t n_inputs) +{ + _adc_completed = 0; + _adc_run = 0; + + _adc_ADCs = ADCs; + _adc_n_ADC = n_ADC; + _adc_inputs = inputs; + _adc_n_inputs = n_inputs; + + memclear(_adc_oversampling, sizeof(_adc_oversampling)); + adc_start_read(_adc_ADCs, _adc_n_ADC); + + return true; +} + +static void copy_adc_values(uint16_t* src, const stm32_adc_t* adc, + const stm32_adc_input_t* inputs) +{ + for (uint8_t i=0; i < adc->n_channels; i++) { + uint8_t channel = adc->channels[i]; + + // if input disabled, skip + if (~_adc_input_mask & (1 << channel)) { + continue; + } + + // skip sampled but inhibited channels + if (_adc_inhibit_mask & (1 << channel)) { + src++; + continue; + } + + // TODO: move inversion to the generic ADC driver? + if (inputs[channel].inverted) + _adc_oversampling[channel] += ADC_INVERT_VALUE(*src); + else + _adc_oversampling[channel] += *src; + +#if defined(JITTER_MEASURE) + if (JITTER_MEASURE_ACTIVE()) { + rawJitter[channel].measure(dst[channel]); + } +#endif + + src++; + } +} + +void stm32_hal_adc_wait_completion(const stm32_adc_t* ADCs, uint8_t n_ADC, + const stm32_adc_input_t* inputs, uint8_t n_inputs) +{ + (void)ADCs; + (void)n_ADC; + (void)inputs; + (void)n_inputs; + + while(!_adc_completed) { + // busy wait + } +} + +void stm32_hal_adc_disable_oversampling() +{ + _adc_oversampling_disabled = 1; +} + +static void _adc_mark_completed(const stm32_adc_t* adc) +{ + uint8_t adc_idx = (adc - _adc_ADCs); + _adc_started_mask &= ~(1 << adc_idx); +} + +static void _adc_chain_conversions(const stm32_adc_t* adc) +{ + _adc_mark_completed(adc); + if (_adc_started_mask != 0) return; + + if (!_adc_oversampling_disabled && (++_adc_run < OVERSAMPLING)) { + adc_start_read(_adc_ADCs, _adc_n_ADC); + return; + } + + auto adcValues = getAnalogValues(); + for (uint8_t i = 0; i < _adc_n_inputs; i++) { + if (~_adc_input_mask & (1 << i)) continue; + if (_adc_inhibit_mask & (1 << i)) continue; + adcValues[i] = _adc_oversampling[i] / OVERSAMPLING; + } + + // we're done! + _adc_completed = 1; +} + +void stm32_hal_adc_dma_isr(const stm32_adc_t* adc) +{ + // Disable IRQ + auto dma_stream = _dma_get_stream(adc->DMAx, adc->DMA_Stream); + CLEAR_BIT(dma_stream->CR, DMA_SxCR_TCIE | DMA_SxCR_TEIE | DMA_SxCR_DMEIE); + + uint16_t* dma_buffer = _adc_dma_buffer + adc->offset; + copy_adc_values(dma_buffer, adc, _adc_inputs); + + _adc_chain_conversions(adc); +} + +void stm32_hal_adc_isr(const stm32_adc_t* adc) +{ + // check if this ADC triggered the IRQ + auto ADCx = adc->ADCx; + if (!LL_ADC_IsActiveFlag_EOCS(ADCx) || !LL_ADC_IsEnabledIT_EOCS(ADCx)) + return; + + // Disable end-of-conversion IRQ + CLEAR_BIT(ADCx->CR1, ADC_CR1_EOCIE); + + uint16_t* dma_buffer = _adc_dma_buffer + adc->offset; + *dma_buffer = adc->ADCx->DR; + copy_adc_values(dma_buffer, adc, _adc_inputs); + + _adc_chain_conversions(adc); +} diff --git a/radio/src/targets/common/arm/stm32/stm32_adc.h b/radio/src/targets/common/arm/stm32/stm32_adc.h new file mode 100644 index 000000000..1e53f708b --- /dev/null +++ b/radio/src/targets/common/arm/stm32/stm32_adc.h @@ -0,0 +1,68 @@ +/* + * 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 "stm32_hal_ll.h" +#include "hal/adc_driver.h" + + +struct stm32_adc_input_t { + const char* name; + GPIO_TypeDef* GPIOx; + uint32_t GPIO_Pin; + uint32_t ADC_Channel; + uint8_t inverted; +}; + +struct stm32_adc_t { + ADC_TypeDef* ADCx; + DMA_TypeDef* DMAx; + uint32_t DMA_Channel; + uint32_t DMA_Stream; + IRQn_Type DMA_Stream_IRQn; + const uint8_t* channels; + uint8_t offset; + uint8_t n_channels; + uint8_t sample_time; +}; + +struct stm32_adc_gpio_t { + GPIO_TypeDef* GPIOx; + const uint32_t* pins; + uint8_t n_pins; +}; + + +bool stm32_hal_adc_init(const stm32_adc_t* ADCs, uint8_t n_ADC, + const stm32_adc_input_t* inputs, + const stm32_adc_gpio_t* ADC_GPIOs, uint8_t n_GPIO); + +bool stm32_hal_adc_start_read(const stm32_adc_t* ADCs, uint8_t n_ADC, + const stm32_adc_input_t* inputs, uint8_t n_inputs); + +void stm32_hal_adc_wait_completion(const stm32_adc_t* ADCs, uint8_t n_ADC, + const stm32_adc_input_t* inputs, uint8_t n_inputs); + +void stm32_hal_adc_disable_oversampling(); + +void stm32_hal_adc_dma_isr(const stm32_adc_t* adc); +void stm32_hal_adc_isr(const stm32_adc_t* adc); diff --git a/radio/src/targets/common/arm/stm32/stm32_cmsis.h b/radio/src/targets/common/arm/stm32/stm32_cmsis.h new file mode 100644 index 000000000..59a491ae4 --- /dev/null +++ b/radio/src/targets/common/arm/stm32/stm32_cmsis.h @@ -0,0 +1,42 @@ +/* + * 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 + +#if defined(__cplusplus) +extern "C" { +#endif + +#if defined(STM32F4) + #include "CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h" +#elif defined(STM32F2) + + // Workaround to prevent the other CMSIS header to be included + // and fix some missing items in the old one + #include "thirdparty/CMSIS/Include/cmsis_compiler.h" + #define __CORE_CM3_H_GENERIC + + #include "CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h" +#endif + +#if defined(__cplusplus) +} +#endif diff --git a/radio/src/targets/common/arm/stm32/stm32_gpio_driver.cpp b/radio/src/targets/common/arm/stm32/stm32_gpio_driver.cpp new file mode 100644 index 000000000..913c2a215 --- /dev/null +++ b/radio/src/targets/common/arm/stm32/stm32_gpio_driver.cpp @@ -0,0 +1,30 @@ +/* + * 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 "stm32_gpio_driver.h" + +void stm32_gpio_enable_clock(GPIO_TypeDef *GPIOx) +{ + uint32_t reg_idx = (((uint32_t) GPIOx) - GPIOA_BASE) / 0x0400UL; + uint32_t reg_msk = RCC_AHB1ENR_GPIOAEN << reg_idx; + LL_AHB1_GRP1_EnableClock(reg_msk); +} + diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.h b/radio/src/targets/common/arm/stm32/stm32_gpio_driver.h similarity index 87% rename from radio/src/targets/taranis/intmodule_pulses_driver.h rename to radio/src/targets/common/arm/stm32/stm32_gpio_driver.h index 284733cda..d672d6f9c 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.h +++ b/radio/src/targets/common/arm/stm32/stm32_gpio_driver.h @@ -21,7 +21,6 @@ #pragma once -#include "stm32_pulse_driver.h" +#include "stm32_hal_ll.h" -// used in module_ports.cpp -extern const stm32_pulse_timer_t intmoduleTimer; +void stm32_gpio_enable_clock(GPIO_TypeDef *GPIOx); diff --git a/radio/src/targets/common/arm/stm32/stm32_hal_adc.cpp b/radio/src/targets/common/arm/stm32/stm32_hal_adc.cpp deleted file mode 100644 index 44e0f8177..000000000 --- a/radio/src/targets/common/arm/stm32/stm32_hal_adc.cpp +++ /dev/null @@ -1,474 +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 "opentx.h" -#include "hal/adc_driver.h" -#include "stm32_hal_adc.h" - -static bool adc_disable_dma(DMA_Stream_TypeDef * dma_stream); -static void adc_dma_clear_flags(DMA_Stream_TypeDef * dma_stream); - -static void adc_init_pins() -{ - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - -#if defined(ADC_GPIOA_PINS) - #if defined(FLYSKY_GIMBAL) - if (globalData.flyskygimbals) - { - GPIO_InitStructure.GPIO_Pin = ADC_GPIOA_PINS_FS; - } - else - #endif - { - GPIO_InitStructure.GPIO_Pin = ADC_GPIOA_PINS; - } - GPIO_Init(GPIOA, &GPIO_InitStructure); -#endif - -#if defined(ADC_GPIOB_PINS) - GPIO_InitStructure.GPIO_Pin = ADC_GPIOB_PINS; - GPIO_Init(GPIOB, &GPIO_InitStructure); -#endif - -#if defined(ADC_GPIOC_PINS) - GPIO_InitStructure.GPIO_Pin = ADC_GPIOC_PINS; - GPIO_Init(GPIOC, &GPIO_InitStructure); -#endif - -#if defined(ADC_GPIOF_PINS) - GPIO_InitStructure.GPIO_Pin = ADC_GPIOF_PINS; - GPIO_Init(GPIOF, &GPIO_InitStructure); -#endif -} - -static void adc_setup_scan_mode(ADC_TypeDef* ADCx, uint8_t nconv) -{ - ADC_InitTypeDef ADC_InitStructure; - ADC_StructInit(&ADC_InitStructure); - - ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; - ADC_InitStructure.ADC_ScanConvMode = ENABLE; // Sets ADC_CR1_SCAN - ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // Clears ADC_CR2_CONT - ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; // Software trigger - ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; - ADC_InitStructure.ADC_NbrOfConversion = nconv; // Channel count - - ADC_Init(ADCx, &ADC_InitStructure); - - // enable ADC_MAIN - ADC_Cmd(ADCx, ENABLE); // ADC_CR2_ADON - // enable DMA for ADC - ADC_DMACmd(ADCx, ENABLE); // ADC_CR2_DMA - ADC_DMARequestAfterLastTransferCmd(ADCx, ENABLE); // ADC_CR2_DDS -} - -static const stm32_hal_adc_channel ADC_MAIN_channels[] = { - {ADC_CHANNEL_STICK_LH, ADC_SAMPTIME}, - {ADC_CHANNEL_STICK_LV, ADC_SAMPTIME}, - {ADC_CHANNEL_STICK_RV, ADC_SAMPTIME}, - {ADC_CHANNEL_STICK_RH, ADC_SAMPTIME}, -#if defined(PCBX10) - { ADC_CHANNEL_POT1, ADC_SAMPTIME }, - { ADC_CHANNEL_POT2, ADC_SAMPTIME }, - { ADC_CHANNEL_POT3, ADC_SAMPTIME }, - { ADC_CHANNEL_EXT1, ADC_SAMPTIME }, - { ADC_CHANNEL_EXT2, ADC_SAMPTIME }, - { ADC_CHANNEL_EXT3, ADC_SAMPTIME }, - { ADC_CHANNEL_EXT4, ADC_SAMPTIME }, - { ADC_CHANNEL_SLIDER1, ADC_SAMPTIME }, - { ADC_CHANNEL_SLIDER2, ADC_SAMPTIME }, - { ADC_CHANNEL_BATT, ADC_SAMPTIME } -#else -#if defined(RADIO_T8) || defined(RADIO_TLITE) || defined(RADIO_COMMANDO8) || defined(RADIO_LR3PRO) - // fake channels to fill unused POT1/POT2 - {0, 0}, - {0, 0}, -#elif defined(PCBX7) || defined(PCBXLITE) - {ADC_CHANNEL_POT1, ADC_SAMPTIME}, - {ADC_CHANNEL_POT2, ADC_SAMPTIME}, -#if defined(RADIO_BOXER) - {ADC_CHANNEL_POT3, ADC_SAMPTIME}, -#endif -#elif defined(PCBX9LITE) - {ADC_CHANNEL_POT1, ADC_SAMPTIME}, -#elif defined(PCBX9E) - {ADC_CHANNEL_POT2, ADC_SAMPTIME}, - {ADC_CHANNEL_POT3, ADC_SAMPTIME}, - {ADC_CHANNEL_POT4, ADC_SAMPTIME}, - {ADC_CHANNEL_SLIDER3, ADC_SAMPTIME}, - {ADC_CHANNEL_SLIDER4, ADC_SAMPTIME}, -#elif defined(PCBX9D) || defined(PCBX9DP) - {ADC_CHANNEL_POT1, ADC_SAMPTIME}, - {ADC_CHANNEL_POT2, ADC_SAMPTIME}, - {ADC_CHANNEL_POT3, ADC_SAMPTIME}, - {ADC_CHANNEL_SLIDER1, ADC_SAMPTIME}, - {ADC_CHANNEL_SLIDER2, ADC_SAMPTIME}, -#elif defined(PCBNV14) - {ADC_CHANNEL_POT1, ADC_SAMPTIME}, - {ADC_CHANNEL_POT2, ADC_SAMPTIME}, - {ADC_CHANNEL_SWA, ADC_SAMPTIME}, - {ADC_CHANNEL_SWC, ADC_SAMPTIME}, - {ADC_CHANNEL_SWE, ADC_SAMPTIME}, - {ADC_CHANNEL_SWF, ADC_SAMPTIME}, - {ADC_CHANNEL_SWG, ADC_SAMPTIME}, - {ADC_CHANNEL_SWH, ADC_SAMPTIME}, -#endif - {ADC_CHANNEL_BATT, ADC_SAMPTIME}, - {ADC_Channel_Vbat, ADC_SAMPTIME} -#endif -}; - -static const stm32_hal_adc_channel* ADC_MAIN_get_channels() -{ -#if (NUM_PWMSTICKS > 0) - if (STICKS_PWM_ENABLED()) - return ADC_MAIN_channels + 4; -#endif -#if defined(FLYSKY_GIMBAL) - if (globalData.flyskygimbals) - { - return ADC_MAIN_channels + FIRST_ANALOG_ADC_FS; - } - else -#endif - { - return ADC_MAIN_channels + FIRST_ANALOG_ADC; - } -} - -static uint8_t ADC_MAIN_get_nconv() -{ -#if defined(FLYSKY_GIMBAL) - if (globalData.flyskygimbals) - { - return NUM_ANALOGS_ADC_FS; - } - else -#endif - { - return NUM_ANALOGS_ADC; // based on STICKS_PWM_ENABLED() - } -} - -#if defined(ADC_EXT) -#if defined(PCBX9E) - -static const stm32_hal_adc_channel ADC_EXT_channels[] = { - {ADC_CHANNEL_POT1, ADC_SAMPTIME}, - {ADC_CHANNEL_SLIDER1, ADC_SAMPTIME}, - {ADC_CHANNEL_SLIDER2, ADC_SAMPTIME} -}; - -static uint8_t ADC_EXT_get_nconv() { return NUM_ANALOGS_ADC_EXT; } - -#elif defined(PCBX10) - -static const stm32_hal_adc_channel ADC_EXT_channels[] = { - { ADC_Channel_Vbat, ADC_SAMPTIME } -}; - -static uint8_t ADC_EXT_get_nconv() { return 1; } - -#elif defined(PCBNV14) - -static const stm32_hal_adc_channel ADC_EXT_channels[] = { - {ADC_CHANNEL_SWB, ADC_SAMPTIME}, - {ADC_CHANNEL_SWD, ADC_SAMPTIME}, -}; - -static uint8_t ADC_EXT_get_nconv() { return NUM_ANALOGS_ADC_EXT; } - -#endif - -static const stm32_hal_adc_channel* ADC_EXT_get_channels() -{ - return ADC_EXT_channels; -} - -#endif - -static uint16_t* ADC_MAIN_get_dma_buffer() -{ -#if defined(FLYSKY_GIMBAL) - if (globalData.flyskygimbals) - { - return &adcValues[FIRST_ANALOG_ADC_FS]; - } - else -#endif - { - return &adcValues[FIRST_ANALOG_ADC]; - } -} - -#if defined(ADC_EXT) && defined(ADC_EXT_DMA_Stream) -static uint16_t* ADC_EXT_get_dma_buffer() -{ -#if defined(FLYSKY_GIMBAL) - if (globalData.flyskygimbals) - { - return adcValues + NUM_ANALOGS_ADC_FS + FIRST_ANALOG_ADC_FS; - } - else -#endif - { - return adcValues + NUM_ANALOGS_ADC + FIRST_ANALOG_ADC; - } -} -#endif - -static const stm32_hal_adc ADC_hal_def[] = { - { - ADC_MAIN, - ADC_DMA_Stream, ADC_DMA_Channel, ADC_MAIN_get_dma_buffer, - ADC_MAIN_get_nconv, ADC_MAIN_get_channels - }, -#if defined(ADC_EXT) - { - ADC_EXT, -#if defined(ADC_EXT_DMA_Stream) - ADC_EXT_DMA_Stream, ADC_EXT_DMA_Channel, ADC_EXT_get_dma_buffer, -#else - nullptr, 0, nullptr, -#endif - ADC_EXT_get_nconv, ADC_EXT_get_channels - }, -#endif - // required to detect end of ADC definitions - { nullptr, nullptr, 0, nullptr, nullptr, nullptr }, -}; - -static void adc_init_channels(ADC_TypeDef* adc, const stm32_hal_adc_channel* chan, - uint8_t nconv) -{ - if (!chan || !nconv) return; - - uint8_t rank = 1; - while (nconv > 0) { - ADC_RegularChannelConfig(adc, chan->adc_channel, rank, chan->sample_time); - nconv--; rank++; chan++; - } -} - -static bool adc_init_dma_stream(ADC_TypeDef* adc, DMA_Stream_TypeDef * dma_stream, - uint32_t dma_channel, uint16_t* dest, uint8_t nconv) -{ - // Disable DMA before continuing (see ref. manual "Stream configuration procedure") - if (!adc_disable_dma(dma_stream)) - return false; - - // Clear Interrupt flags - adc_dma_clear_flags(dma_stream); - - // setup DMA request - dma_stream->PAR = CONVERT_PTR_UINT(&adc->DR); - dma_stream->M0AR = CONVERT_PTR_UINT(dest); - dma_stream->NDTR = nconv; - // Very high priority, 1 byte transfers, increment memory - dma_stream->CR = DMA_SxCR_PL | dma_channel | DMA_SxCR_MSIZE_0 | - DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC; - // disable direct mode, half full FIFO - dma_stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0; - return true; -} - -static bool stm32_hal_adc_init() -{ - adc_init_pins(); - - // Init common to all ADCs - ADC_CommonInitTypeDef ADC_CommonInitStruct; - ADC_CommonStructInit(&ADC_CommonInitStruct); - ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent; - ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div2; - ADC_CommonInit(&ADC_CommonInitStruct); - - const stm32_hal_adc* adc_def = ADC_hal_def; - while (adc_def->adc) { - uint8_t nconv = 0; - if (adc_def->get_nconv) { - nconv = adc_def->get_nconv(); - if (nconv > 0) { - adc_setup_scan_mode(adc_def->adc, nconv); - - // configure each channel - if (adc_def->get_channels) { - const stm32_hal_adc_channel* chan = adc_def->get_channels(); - adc_init_channels(adc_def->adc, chan, nconv); - } - - if (adc_def->dma_stream && adc_def->get_dma_buffer) { - uint16_t* dma_buffer = adc_def->get_dma_buffer(); - if (!adc_init_dma_stream(adc_def->adc, adc_def->dma_stream, - adc_def->dma_channel, dma_buffer, nconv)) - return false; - } - } - } - // move to next ADC definition - adc_def++; - } - - //TODO: move VBat & PWM sticks somewhere else. - - // Enable vbat sensor - ADC_VBATCmd(ENABLE); - -#if NUM_PWMSTICKS > 0 - if (STICKS_PWM_ENABLED()) { - sticksPwmInit(); - } -#endif - return true; -} - -#define DMA_Stream0_IT_MASK (uint32_t)(DMA_LISR_FEIF0 | DMA_LISR_DMEIF0 | \ - DMA_LISR_TEIF0 | DMA_LISR_HTIF0 | \ - DMA_LISR_TCIF0) - -#define DMA_Stream4_IT_MASK (uint32_t)(DMA_HISR_FEIF4 | DMA_HISR_DMEIF4 | \ - DMA_HISR_TEIF4 | DMA_HISR_HTIF4 | \ - DMA_HISR_TCIF4) - -static void adc_dma_clear_flags(DMA_Stream_TypeDef * dma_stream) -{ - // no other choice, sorry for that... - if (dma_stream == DMA2_Stream4) { - /* Reset interrupt pending bits for DMA2 Stream4 */ - DMA2->HIFCR = DMA_Stream4_IT_MASK; - - } else if (dma_stream == DMA2_Stream0) { - /* Reset interrupt pending bits for DMA2 Stream0 */ - DMA2->LIFCR = DMA_Stream0_IT_MASK; - } -} - -static bool adc_start_dma_conversion(ADC_TypeDef* ADCx, - DMA_Stream_TypeDef * dma_stream) -{ - // Disable DMA before continuing (see ref. manual "Stream configuration procedure") - if (!adc_disable_dma(dma_stream)) - return false; - - // Clear Interrupt flags - adc_dma_clear_flags(dma_stream); - - // Clear ADC status register - ADCx->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); - - // Enable DMA - dma_stream->CR |= DMA_SxCR_EN; - - // Trigger ADC start - ADCx->CR2 |= (uint32_t)ADC_CR2_SWSTART; - return true; -} - -static bool adc_disable_dma(DMA_Stream_TypeDef* dma_stream) -{ - dma_stream->CR &= ~(uint32_t)DMA_SxCR_EN; - - // wait until DMA EN bit gets cleared by hardware - uint16_t uiTimeout = 1000; - while (dma_stream->CR & (uint32_t)DMA_SxCR_EN) { - if (--uiTimeout == 0) { - // Timeout. Failed to disable DMA - return false; - } - } - return true; -} - -static void adc_start_single_conversion(ADC_TypeDef* ADCx) -{ - ADCx->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); - ADCx->CR2 |= (uint32_t)ADC_CR2_SWSTART; -} - -static bool stm32_hal_adc_start_read() -{ - const stm32_hal_adc* adc_def = ADC_hal_def; - while (adc_def->adc) { - uint8_t nconv = 0; - if (adc_def->get_nconv) { - nconv = adc_def->get_nconv(); - if (nconv > 0) { - if (adc_def->dma_stream && adc_def->get_dma_buffer) { - if (!adc_start_dma_conversion(adc_def->adc, adc_def->dma_stream)) - return false; - } else if (nconv == 1) { - adc_start_single_conversion(adc_def->adc); - } - } - } - // move to next ADC definition - adc_def++; - } - return true; -} - -static void stm32_hal_adc_wait_completion() -{ - //TODO: - // - iterate through ADCs - // - replace with IRQ trigger (both) - // - move RTC batt reading somewhere else - -#if defined(ADC_EXT) && defined(ADC_EXT_DMA_Stream) - // Wait for all ADCs to complete - for (unsigned int i=0; i<10000; i++) { - if (DMA_GetFlagStatus(ADC_DMA_Stream, ADC_DMA_TC_Flag) != RESET && - DMA_GetFlagStatus(ADC_EXT_DMA_Stream, ADC_EXT_TC_Flag) != RESET) { - break; - } - } - //TODO: move into completion IRQ trigger - adc_disable_dma(ADC_DMA_Stream); - adc_disable_dma(ADC_EXT_DMA_Stream); -#else - // Wait only for the main ADC, and hope others are done as well - for (unsigned int i = 0; i < 10000; i++) { - if (DMA_GetFlagStatus(ADC_DMA_Stream, ADC_DMA_TC_Flag) != RESET) { - break; - } - } - //TODO: move into completion IRQ trigger - adc_disable_dma(ADC_DMA_Stream); - -#if defined(ADC_EXT) && !defined(ADC_EXT_DMA_Stream) - if (isVBatBridgeEnabled()) { - rtcBatteryVoltage = ADC_EXT->DR; - disableVBatBridge(); - } -#endif -#endif -} - -const etx_hal_adc_driver_t stm32_hal_adc_driver = { - stm32_hal_adc_init, - stm32_hal_adc_start_read, - stm32_hal_adc_wait_completion -}; diff --git a/radio/src/targets/common/arm/stm32/stm32_hal_ll.h b/radio/src/targets/common/arm/stm32/stm32_hal_ll.h index b97802b54..15ca88669 100644 --- a/radio/src/targets/common/arm/stm32/stm32_hal_ll.h +++ b/radio/src/targets/common/arm/stm32/stm32_hal_ll.h @@ -21,33 +21,36 @@ #pragma once +#include "stm32_cmsis.h" + +#if defined(__cplusplus) extern "C" { - #define USE_FULL_LL_DRIVER - #if defined(STM32F4) - #include "CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h" - #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h" - #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h" - #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h" - #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h" - #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h" - #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h" - #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h" - #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h" - #elif defined(STM32F2) +#endif - // Workaround to prevent the other CMSIS header to be included - // and fix some missing items in the old one - #include "thirdparty/CMSIS/Include/cmsis_compiler.h" - #define __CORE_CM3_H_GENERIC +#define USE_FULL_LL_DRIVER +#if defined(STM32F4) + #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h" + #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h" + #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_tim.h" + #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h" + #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h" + #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h" + #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h" + #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h" + #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_adc.h" + #include "STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_spi.h" +#elif defined(STM32F2) + #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_bus.h" + #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_gpio.h" + #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_tim.h" + #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_dma.h" + #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_usart.h" + #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_exti.h" + #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_system.h" + #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_rcc.h" + #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_adc.h" +#endif - #include "CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h" - #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_bus.h" - #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_gpio.h" - #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_tim.h" - #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_dma.h" - #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_usart.h" - #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_exti.h" - #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_system.h" - #include "STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_rcc.h" - #endif +#if defined(__cplusplus) } +#endif diff --git a/radio/src/targets/common/arm/stm32/stm32_hal_adc.h b/radio/src/targets/common/arm/stm32/stm32_spi_adc.h similarity index 54% rename from radio/src/targets/common/arm/stm32/stm32_hal_adc.h rename to radio/src/targets/common/arm/stm32/stm32_spi_adc.h index 3a98f6113..eeadbcc5e 100644 --- a/radio/src/targets/common/arm/stm32/stm32_hal_adc.h +++ b/radio/src/targets/common/arm/stm32/stm32_spi_adc.h @@ -21,25 +21,18 @@ #pragma once -struct stm32_hal_adc_channel { - const uint8_t adc_channel; - const uint8_t sample_time; +#include "stm32_hal_ll.h" + +struct stm32_spi_adc_t { + SPI_TypeDef* SPIx; + GPIO_TypeDef* GPIOx; + uint32_t GPIO_Pins; + uint32_t GPIO_AF; + uint32_t GPIO_CS; + const uint8_t* channels; + uint8_t n_channels; }; -typedef const stm32_hal_adc_channel* (*stm32_hal_adc_get_channels)(); -typedef uint8_t (*stm32_hal_adc_get_nconv)(); -typedef uint16_t* (*stm32_hal_adc_get_dma_buffer)(); +#define _SPI_ADC_CS_HIGH(adc) LL_GPIO_SetOutputPin(adc->GPIOx, adc->GPIO_CS) +#define _SPI_ADC_CS_LOW(adc) LL_GPIO_ResetOutputPin(adc->GPIOx, adc->GPIO_CS) -struct stm32_hal_adc { - ADC_TypeDef* adc; - - DMA_Stream_TypeDef* dma_stream; - uint32_t dma_channel; - const stm32_hal_adc_get_dma_buffer get_dma_buffer; - - const stm32_hal_adc_get_nconv get_nconv; - const stm32_hal_adc_get_channels get_channels; -}; - -// Driver to be passed to adcInit() -extern const etx_hal_adc_driver_t stm32_hal_adc_driver; diff --git a/radio/src/targets/common/arm/stm32/stm32_switch_driver.cpp b/radio/src/targets/common/arm/stm32/stm32_switch_driver.cpp new file mode 100644 index 000000000..91bede6d4 --- /dev/null +++ b/radio/src/targets/common/arm/stm32/stm32_switch_driver.cpp @@ -0,0 +1,128 @@ +/* + * 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 "stm32_switch_driver.h" +#include "hal/adc_driver.h" + +bool stm32_switch_get_state(const stm32_switch_t* sw, SwitchHwPos pos) +{ + switch (sw->type) { + case SWITCH_HW_2POS: + switch (pos) { + case SWITCH_HW_UP: + if (sw->flags & SWITCH_HW_INVERTED) + return !LL_GPIO_IsInputPinSet(sw->GPIOx_high, sw->Pin_high); + else + return LL_GPIO_IsInputPinSet(sw->GPIOx_high, sw->Pin_high); + + case SWITCH_HW_DOWN: + if (sw->flags & SWITCH_HW_INVERTED) + return LL_GPIO_IsInputPinSet(sw->GPIOx_high, sw->Pin_high); + else + return !LL_GPIO_IsInputPinSet(sw->GPIOx_high, sw->Pin_high); + + default: + return false; + } + break; + + case SWITCH_HW_3POS: { + auto hi = LL_GPIO_IsInputPinSet(sw->GPIOx_high, sw->Pin_high); + auto lo = LL_GPIO_IsInputPinSet(sw->GPIOx_low, sw->Pin_low); + + switch (pos) { + case SWITCH_HW_UP: + if (sw->flags & SWITCH_HW_INVERTED) + return !hi && lo; + else + return hi && !lo; + + case SWITCH_HW_DOWN: + if (sw->flags & SWITCH_HW_INVERTED) + return hi && !lo; + else + return !hi && lo; + + case SWITCH_HW_MID: + return hi && lo; + + default: + return false; + } + } break; + + case SWITCH_HW_ADC: { + uint16_t value = getAnalogValue(sw->Pin_high); + switch (pos) { + case SWITCH_HW_UP: + return value < 1024; + case SWITCH_HW_DOWN: + return value > 3 * 1024; + case SWITCH_HW_MID: + return (value >= 1024) && (value <= 3 * 1024); + } + } break; + + default: + break; + } + + return false; +} + +SwitchHwPos stm32_switch_get_position(const stm32_switch_t* sw) +{ + bool inv = sw->flags & SWITCH_HW_INVERTED; + SwitchHwPos ret = SWITCH_HW_UP; + + switch (sw->type) { + case SWITCH_HW_2POS: + if (!LL_GPIO_IsInputPinSet(sw->GPIOx_high, sw->Pin_high)) + ret = SWITCH_HW_DOWN; + break; + + case SWITCH_HW_3POS: { + auto hi = LL_GPIO_IsInputPinSet(sw->GPIOx_high, sw->Pin_high); + auto lo = LL_GPIO_IsInputPinSet(sw->GPIOx_low, sw->Pin_low); + + if (hi && lo) + ret = SWITCH_HW_MID; + else if (!hi && lo) + ret = SWITCH_HW_DOWN; + } break; + + case SWITCH_HW_ADC: { + uint16_t value = getAnalogValue(sw->Pin_high); + if (value > 3 * 1024) + ret = SWITCH_HW_DOWN; + else if (value >= 1024) + ret = SWITCH_HW_MID; + } break; + } + + if (inv) { + return ret == SWITCH_HW_UP ? SWITCH_HW_DOWN + : ret == SWITCH_HW_DOWN ? SWITCH_HW_UP + : ret; + } + + return ret; +} diff --git a/radio/src/targets/common/arm/stm32/stm32_switch_driver.h b/radio/src/targets/common/arm/stm32/stm32_switch_driver.h new file mode 100644 index 000000000..4d4e43921 --- /dev/null +++ b/radio/src/targets/common/arm/stm32/stm32_switch_driver.h @@ -0,0 +1,54 @@ +/* + * 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 "stm32_hal_ll.h" +#include "hal/switch_driver.h" + +struct stm32_switch_t +{ + const char* name; + GPIO_TypeDef* GPIOx_high; + uint32_t Pin_high; + + GPIO_TypeDef* GPIOx_low; + uint32_t Pin_low; + + SwitchHwType type; + uint8_t flags; +}; + +#define SWITCH_HW_DEF_3POS(x, flags) \ + { \ + SWITCHES_GPIO_REG_##x##_H, SWITCHES_GPIO_PIN_##x##_H, \ + SWITCHES_GPIO_REG_##x##_L, SWITCHES_GPIO_PIN_##x##_L, \ + SWITCH_HW_3POS, (flags) \ + } + +#define SWITCH_HW_DEF_2POS(x, flags) \ + { \ + SWITCHES_GPIO_REG_##x, SWITCHES_GPIO_PIN_##x, \ + nullptr, 0, SWITCH_HW_2POS, (flags) \ + } + +SwitchHwPos stm32_switch_get_position(const stm32_switch_t* sw); +bool stm32_switch_get_state(const stm32_switch_t* sw, SwitchHwPos pos); diff --git a/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp b/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp index 63858ace0..3eaaa2770 100644 --- a/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp +++ b/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp @@ -318,9 +318,7 @@ void stm32_usart_deinit(const stm32_usart_t* usart) LL_GPIO_InitTypeDef pinInit; LL_GPIO_StructInit(&pinInit); pinInit.Pin = usart->GPIO_Pin; - pinInit.Mode = LL_GPIO_MODE_OUTPUT; - pinInit.Pull = LL_GPIO_PULL_NO; - pinInit.Alternate = LL_GPIO_AF_0; + pinInit.Mode = LL_GPIO_MODE_INPUT; LL_GPIO_Init(usart->GPIOx, &pinInit); LL_GPIO_ResetOutputPin(usart->GPIOx, pinInit.Pin); } diff --git a/radio/src/targets/common/arm/stm32/timers_driver.cpp b/radio/src/targets/common/arm/stm32/timers_driver.cpp index 36ae45170..ffa904b99 100644 --- a/radio/src/targets/common/arm/stm32/timers_driver.cpp +++ b/radio/src/targets/common/arm/stm32/timers_driver.cpp @@ -20,6 +20,7 @@ */ #include "opentx.h" +#include "watchdog_driver.h" static volatile uint32_t msTickCount; // Used to get 1 kHz counter diff --git a/radio/src/targets/common/arm/stm32/timers_driver.h b/radio/src/targets/common/arm/stm32/timers_driver.h index a8a6e7081..f6381ab7b 100644 --- a/radio/src/targets/common/arm/stm32/timers_driver.h +++ b/radio/src/targets/common/arm/stm32/timers_driver.h @@ -24,9 +24,9 @@ #if defined(SIMU) uint16_t getTmr2MHz(); - #define watchdogSuspend(timeout) -#else + +#else // SIMU #include "hal.h" @@ -34,7 +34,7 @@ void init2MhzTimer(); void init1msTimer(); void stop1msTimer(); -static inline uint16_t getTmr2MHz() { return TIMER_2MHz_TIMER->CNT; } +#define getTmr2MHz() TIMER_2MHz_TIMER->CNT void watchdogSuspend(uint32_t timeout); diff --git a/radio/src/targets/common/arm/stm32/usb_driver.cpp b/radio/src/targets/common/arm/stm32/usb_driver.cpp index 4786a41c6..57545f2e9 100644 --- a/radio/src/targets/common/arm/stm32/usb_driver.cpp +++ b/radio/src/targets/common/arm/stm32/usb_driver.cpp @@ -39,7 +39,6 @@ extern "C" { #include "board.h" #include "debug.h" -#include "debounce.h" static bool usbDriverStarted = false; #if defined(BOOT) @@ -60,8 +59,17 @@ void setSelectedUsbMode(int mode) int usbPlugged() { - static PinDebounce debounce; - return debounce.debounce(USB_GPIO, USB_GPIO_PIN_VBUS); + static uint8_t debouncedState = 0; + static uint8_t lastState = 0; + + uint8_t state = GPIO_ReadInputDataBit(USB_GPIO, USB_GPIO_PIN_VBUS); + + if (state == lastState) + debouncedState = state; + else + lastState = state; + + return debouncedState; } USB_OTG_CORE_HANDLE USB_OTG_dev; diff --git a/radio/src/targets/common/arm/stm32/watchdog_driver.h b/radio/src/targets/common/arm/stm32/watchdog_driver.h index b47a60de9..60d82ae52 100644 --- a/radio/src/targets/common/arm/stm32/watchdog_driver.h +++ b/radio/src/targets/common/arm/stm32/watchdog_driver.h @@ -22,22 +22,33 @@ #pragma once #define WDG_DURATION 500 /*ms*/ + void watchdogInit(unsigned int duration); + #if defined(SIMU) - #define WAS_RESET_BY_WATCHDOG() (false) - #define WAS_RESET_BY_SOFTWARE() (false) - #define WAS_RESET_BY_WATCHDOG_OR_SOFTWARE() (false) + +#define WAS_RESET_BY_WATCHDOG() (false) +#define WAS_RESET_BY_SOFTWARE() (false) +#define WAS_RESET_BY_WATCHDOG_OR_SOFTWARE() (false) +#define WDG_ENABLE(x) +#define WDG_RESET() + +#else // SIMU + +#if defined(WATCHDOG) + #define WDG_ENABLE(x) watchdogInit(x) + #define WDG_RESET() IWDG->KR = 0xAAAA +#else #define WDG_ENABLE(x) #define WDG_RESET() -#else - #if defined(WATCHDOG) - #define WDG_ENABLE(x) watchdogInit(x) - #define WDG_RESET() IWDG->KR = 0xAAAA - #else - #define WDG_ENABLE(x) - #define WDG_RESET() - #endif - #define WAS_RESET_BY_WATCHDOG() (RCC->CSR & (RCC_CSR_WDGRSTF | RCC_CSR_WWDGRSTF)) - #define WAS_RESET_BY_SOFTWARE() (RCC->CSR & RCC_CSR_SFTRSTF) - #define WAS_RESET_BY_WATCHDOG_OR_SOFTWARE() (RCC->CSR & (RCC_CSR_WDGRSTF | RCC_CSR_WWDGRSTF | RCC_CSR_SFTRSTF)) +#endif + +#define WAS_RESET_BY_WATCHDOG() \ + (RCC->CSR & (RCC_CSR_WDGRSTF | RCC_CSR_WWDGRSTF)) + +#define WAS_RESET_BY_SOFTWARE() (RCC->CSR & RCC_CSR_SFTRSTF) + +#define WAS_RESET_BY_WATCHDOG_OR_SOFTWARE() \ + (RCC->CSR & (RCC_CSR_WDGRSTF | RCC_CSR_WWDGRSTF | RCC_CSR_SFTRSTF)) + #endif diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 52ffddd90..15be3cc23 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -57,7 +57,7 @@ if (PCB STREQUAL X10) add_definitions(-DSOFTWARE_VOLUME) set(FIRMWARE_SRC ${FIRMWARE_SRC} - targets/common/arm/stm32/stm32_hal_adc.cpp + targets/common/arm/stm32/stm32_adc.cpp targets/common/arm/stm32/audio_dac_driver.cpp ) if (NOT PCBREV STREQUAL TX16S) @@ -69,7 +69,6 @@ if (PCB STREQUAL X10) set(BITMAPS_TARGET x10_bitmaps) set(FONTS_TARGET x10_fonts) set(LCD_DRIVER lcd_driver.cpp) - set(LUA_EXPORT lua_export_x10) if (PCBREV STREQUAL EXPRESS) set(FLAVOUR x10express) set(DEFAULT_INTERNAL_MODULE ISRM_PXX2 CACHE STRING "Default internal module") @@ -80,7 +79,6 @@ if (PCB STREQUAL X10) add_definitions(-DMANUFACTURER_FRSKY) elseif (PCBREV STREQUAL T16) set(FLAVOUR t16) - set(LUA_EXPORT lua_export_t16) add_definitions(-DRADIO_T16) add_definitions(-DRADIO_FAMILY_T16) set(DEFAULT_INTERNAL_MODULE MULTIMODULE CACHE STRING "Default internal module") @@ -95,7 +93,6 @@ if (PCB STREQUAL X10) set(FLYSKY_GIMBAL ON) elseif (PCBREV STREQUAL TX16S) set(FLAVOUR tx16s) - set(LUA_EXPORT lua_export_t16) add_definitions(-DRADIO_TX16S) add_definitions(-DRADIO_FAMILY_T16) set(DEFAULT_INTERNAL_MODULE MULTIMODULE CACHE STRING "Default internal module") @@ -113,7 +110,6 @@ if (PCB STREQUAL X10) set(FLYSKY_GIMBAL ON) elseif (PCBREV STREQUAL T18) set(FLAVOUR t18) - set(LUA_EXPORT lua_export_t16) add_definitions(-DRADIO_T18) add_definitions(-DRADIO_FAMILY_T16) set(DEFAULT_INTERNAL_MODULE MULTIMODULE CACHE STRING "Default internal module") @@ -151,12 +147,10 @@ elseif (PCB STREQUAL X12S) set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} audio_spi_driver.cpp - x12s_adc_driver.cpp ) set(BITMAPS_TARGET x12s_bitmaps) set(FONTS_TARGET x12s_fonts) set(LCD_DRIVER lcd_driver.cpp) - set(LUA_EXPORT lua_export_x12s) add_definitions(-DMANUFACTURER_FRSKY) endif() @@ -269,20 +263,15 @@ set(FIRMWARE_TARGET_SRC set(FIRMWARE_SRC ${FIRMWARE_SRC} hal/adc_driver.cpp - boards/generic_stm32/module_ports.cpp - boards/generic_stm32/aux_ports.cpp - boards/generic_stm32/sport_update.cpp - boards/generic_stm32/intmodule_heartbeat.cpp targets/common/arm/stm32/stm32_exti_driver.cpp - targets/common/arm/stm32/mixer_scheduler_driver.cpp targets/common/arm/stm32/timers_driver.cpp - targets/common/arm/stm32/extmodule_driver.cpp targets/common/arm/stm32/stm32_pulse_driver.cpp targets/common/arm/stm32/stm32_usart_driver.cpp targets/common/arm/stm32/rotary_encoder_driver.cpp targets/common/arm/stm32/pwr_driver.cpp targets/common/arm/stm32/heartbeat_driver.cpp targets/common/arm/stm32/trainer_driver.cpp + targets/common/arm/stm32/ads79xx.cpp targets/common/arm/stm32/sdio_sd.c ) diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index fe4fbe7d8..8a8302af8 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -19,12 +19,15 @@ * GNU General Public License for more details. */ +#include "hal/adc_driver.h" +#include "hal/trainer_driver.h" +#include "hal/switch_driver.h" +#include "hal/rotary_encoder.h" + #include "board.h" #include "boards/generic_stm32/module_ports.h" #include "boards/generic_stm32/intmodule_heartbeat.h" - -#include "hal/adc_driver.h" -#include "hal/trainer_driver.h" +#include "boards/generic_stm32/analog_inputs.h" #include "timers_driver.h" #include "dataconstants.h" @@ -35,18 +38,41 @@ #include -#if !defined(PCBX12S) - #include "stm32_hal_adc.h" - #define ADC_DRIVER stm32_hal_adc_driver -#else - #include "x12s_adc_driver.h" - #define ADC_DRIVER x12s_adc_driver +#if defined(PWM_STICKS) + #include "sticks_pwm_driver.h" #endif -#if defined(FLYSKY_GIMBAL) +#if defined(RADIO_FAMILY_T16) || defined(PCBNV14) #include "flysky_gimbal_driver.h" #endif +enum PowerReason { + SHUTDOWN_REQUEST = 0xDEADBEEF, + SOFTRESET_REQUEST = 0xCAFEDEAD, +}; + +constexpr uint32_t POWER_REASON_SIGNATURE = 0x0178746F; + +bool UNEXPECTED_SHUTDOWN() +{ +#if defined(SIMU) || defined(NO_UNEXPECTED_SHUTDOWN) + return false; +#else + if (WAS_RESET_BY_WATCHDOG()) + return true; + else if (WAS_RESET_BY_SOFTWARE()) + return RTC->BKP0R != SOFTRESET_REQUEST; + else + return RTC->BKP1R == POWER_REASON_SIGNATURE && RTC->BKP0R != SHUTDOWN_REQUEST; +#endif +} + +void SET_POWER_REASON(uint32_t value) +{ + RTC->BKP0R = value; + RTC->BKP1R = POWER_REASON_SIGNATURE; +} + HardwareOptions hardwareOptions; bool boardBacklightOn = false; @@ -75,7 +101,7 @@ void boardInit() AUDIO_RCC_AHB1Periph | KEYS_RCC_AHB1Periph | ADC_RCC_AHB1Periph | -#if defined(FLYSKY_GIMBAL) +#if defined(RADIO_FAMILY_T16) FLYSKY_HALL_RCC_AHB1Periph | #endif AUX_SERIAL_RCC_AHB1Periph | @@ -95,7 +121,7 @@ void boardInit() ADC_RCC_APB1Periph | TIMER_2MHz_RCC_APB1Periph | AUDIO_RCC_APB1Periph | -#if defined(FLYSKY_GIMBAL) +#if defined(RADIO_FAMILY_T16) FLYSKY_HALL_RCC_APB1Periph | #endif TELEMETRY_RCC_APB1Periph | @@ -148,23 +174,18 @@ void boardInit() audioInit(); keysInit(); + switchInit(); rotaryEncoderInit(); -#if NUM_PWMSTICKS > 0 - sticksPwmInit(); - delay_ms(20); - if (pwm_interrupt_count < 32) { - hardwareOptions.sticksPwmDisabled = true; - } +#if defined(PWM_STICKS) + sticksPwmDetect(); +#endif + +#if defined(RADIO_FAMILY_T16) + flysky_gimbal_init(); #endif -#if defined(FLYSKY_GIMBAL) - globalData.flyskygimbals = flysky_gimbal_init(); -#else - globalData.flyskygimbals = false; -#endif - - if (!adcInit(&ADC_DRIVER)) + if (!adcInit(&_adc_driver)) TRACE("adcInit failed"); init2MhzTimer(); @@ -197,8 +218,11 @@ void boardInit() } #endif +extern void rtcDisableBackupReg(); + void boardOff() { + ledOff(); backlightEnable(0); while (pwrPressed()) { @@ -222,11 +246,7 @@ void boardOff() // Shutdown the Haptic hapticDone(); -#if defined(RTC_BACKUP_RAM) - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, DISABLE); - PWR_BackupRegulatorCmd(DISABLE); -#endif - + rtcDisableBackupReg(); RTC->BKP0R = SHUTDOWN_REQUEST; pwrOff(); diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 77bacdb3b..e14e48bb0 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -41,19 +41,11 @@ PACK(typedef struct { uint8_t pcbrev:2; - uint8_t sticksPwmDisabled:1; uint8_t pxx2Enabled:1; }) HardwareOptions; extern HardwareOptions hardwareOptions; -#if !defined(LUA_EXPORT_GENERATION) - #include "stm32f4xx_sdio.h" - #include "stm32f4xx_dma2d.h" - #include "stm32f4xx_ltdc.h" - #include "stm32f4xx_fmc.h" -#endif - #define FLASHSIZE 0x200000 #define BOOTLOADER_SIZE 0x20000 #define FIRMWARE_ADDRESS 0x08000000 @@ -178,255 +170,13 @@ void SDRAM_Init(); #define IS_PXX1_INTERNAL_ENABLED() (true) #endif -// Keys driver -enum EnumKeys -{ - KEY_PGUP, - KEY_PGDN, - KEY_ENTER, - KEY_MODEL, - KEY_UP = KEY_MODEL, - KEY_EXIT, - KEY_DOWN = KEY_EXIT, - KEY_TELEM, - KEY_RIGHT = KEY_TELEM, - KEY_RADIO, - KEY_LEFT = KEY_RADIO, - - TRM_BASE, - TRM_LH_DWN = TRM_BASE, - TRM_LH_UP, - TRM_LV_DWN, - TRM_LV_UP, - TRM_RV_DWN, - TRM_RV_UP, - TRM_RH_DWN, - TRM_RH_UP, - TRM_LS_DWN, - TRM_LS_UP, - TRM_RS_DWN, - TRM_RS_UP, - TRM_LAST = TRM_RS_UP, - - NUM_KEYS -}; - -#define IS_SHIFT_KEY(index) (false) -#define IS_SHIFT_PRESSED() (false) - -enum EnumSwitches -{ - SW_SA, - SW_SB, - SW_SC, - SW_SD, - SW_SE, - SW_SF, - SW_SG, - SW_SH, - SW_SI, - SW_SJ, - NUM_SWITCHES -}; - -#define STORAGE_NUM_SWITCHES NUM_SWITCHES -#define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH) - -enum EnumSwitchesPositions -{ - SW_SA0, - SW_SA1, - SW_SA2, - SW_SB0, - SW_SB1, - SW_SB2, - SW_SC0, - SW_SC1, - SW_SC2, - SW_SD0, - SW_SD1, - SW_SD2, - SW_SE0, - SW_SE1, - SW_SE2, - SW_SF0, - SW_SF1, - SW_SF2, - SW_SG0, - SW_SG1, - SW_SG2, - SW_SH0, - SW_SH1, - SW_SH2, - SW_SI0, - SW_SI1, - SW_SI2, - SW_SJ0, - SW_SJ1, - SW_SJ2, - NUM_SWITCHES_POSITIONS -}; - -#define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3) - #if !defined(NUM_FUNCTIONS_SWITCHES) #define NUM_FUNCTIONS_SWITCHES 0 #endif -void keysInit(); -uint32_t switchState(uint8_t index); -uint32_t readKeys(); -#define KEYS_PRESSED() (readKeys()) -#define DBLKEYS_PRESSED_RGT_LFT(in) ((in & ((1<=POT_FIRST && (x)<=POT_LAST) -#define IS_SLIDER(x) ((x)>=SLIDER_FIRST && (x)<=SLIDER_LAST) -extern uint16_t adcValues[NUM_ANALOGS]; - -#if defined(PCBX12S) - #define NUM_MOUSE_ANALOGS 2 -#else - #define NUM_MOUSE_ANALOGS 0 -#endif -#define STORAGE_NUM_MOUSE_ANALOGS 2 - -#if NUM_PWMSTICKS > 0 -#define STICKS_PWM_ENABLED() (!hardwareOptions.sticksPwmDisabled) -void sticksPwmInit(); -void sticksPwmRead(uint16_t * values); -extern volatile uint32_t pwm_interrupt_count; -#else -#define STICKS_PWM_ENABLED() (false) -#endif // Battery driver #if defined(PCBX10) @@ -441,34 +191,8 @@ extern volatile uint32_t pwm_interrupt_count; #define BATTERY_MAX 115 // 11.5V #endif -#if defined(__cplusplus) -enum PowerReason { - SHUTDOWN_REQUEST = 0xDEADBEEF, - SOFTRESET_REQUEST = 0xCAFEDEAD, -}; - -constexpr uint32_t POWER_REASON_SIGNATURE = 0x0178746F; - -inline bool UNEXPECTED_SHUTDOWN() -{ -#if defined(SIMU) || defined(NO_UNEXPECTED_SHUTDOWN) - return false; -#else - if (WAS_RESET_BY_WATCHDOG()) - return true; - else if (WAS_RESET_BY_SOFTWARE()) - return RTC->BKP0R != SOFTRESET_REQUEST; - else - return RTC->BKP1R == POWER_REASON_SIGNATURE && RTC->BKP0R != SHUTDOWN_REQUEST; -#endif -} - -inline void SET_POWER_REASON(uint32_t value) -{ - RTC->BKP0R = value; - RTC->BKP1R = POWER_REASON_SIGNATURE; -} -#endif +bool UNEXPECTED_SHUTDOWN(); +void SET_POWER_REASON(uint32_t value); #if defined(__cplusplus) && !defined(SIMU) extern "C" { @@ -482,6 +206,7 @@ void pwrOn(); void pwrOff(); void pwrResetHandler(); bool pwrPressed(); +bool pwrOffPressed(); #if defined(PWR_EXTRA_SWITCH_GPIO) bool pwrForcePressed(); #else @@ -630,8 +355,6 @@ void hapticDone(); void hapticOff(); void hapticOn(uint32_t pwmPercent); -#define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) - // BT driver #define BT_TX_FIFO_SIZE 64 #define BT_RX_FIFO_SIZE 256 diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index bd7637f69..a2ea12ab1 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -33,48 +33,48 @@ // Keys #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH | RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOJ) #if defined(PCBX12S) - #define KEYS_GPIO_REG_PGUP GPIOC->IDR - #define KEYS_GPIO_PIN_PGUP GPIO_Pin_13 // PC.13 - #define KEYS_GPIO_REG_PGDN GPIOI->IDR - #define KEYS_GPIO_PIN_PGDN GPIO_Pin_8 // PI.08 - #define KEYS_GPIO_REG_LEFT GPIOI->IDR - #define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PI.07 - #define KEYS_GPIO_REG_ENTER GPIOC->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_1 // PC.01 - #define KEYS_GPIO_REG_UP GPIOG->IDR - #define KEYS_GPIO_PIN_UP GPIO_Pin_13 // PG.13 - #define KEYS_GPIO_REG_DOWN GPIOI->IDR - #define KEYS_GPIO_PIN_DOWN GPIO_Pin_6 // PI.06 - #define KEYS_GPIO_REG_RIGHT GPIOC->IDR - #define KEYS_GPIO_PIN_RIGHT GPIO_Pin_4 // PC.04 + #define KEYS_GPIO_REG_PGUP GPIOC + #define KEYS_GPIO_PIN_PGUP LL_GPIO_PIN_13 // PC.13 + #define KEYS_GPIO_REG_PGDN GPIOI + #define KEYS_GPIO_PIN_PGDN LL_GPIO_PIN_8 // PI.08 + #define KEYS_GPIO_REG_SYS GPIOI + #define KEYS_GPIO_PIN_SYS LL_GPIO_PIN_7 // PI.07 + #define KEYS_GPIO_REG_ENTER GPIOC + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_1 // PC.01 + #define KEYS_GPIO_REG_MDL GPIOG + #define KEYS_GPIO_PIN_MDL LL_GPIO_PIN_13 // PG.13 + #define KEYS_GPIO_REG_EXIT GPIOI + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_6 // PI.06 + #define KEYS_GPIO_REG_TELE GPIOC + #define KEYS_GPIO_PIN_TELE LL_GPIO_PIN_4 // PC.04 #elif defined(RADIO_TX16S) - #define KEYS_GPIO_REG_ENTER GPIOI->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_8 // PI.08 - #define KEYS_GPIO_REG_PGUP GPIOC->IDR - #define KEYS_GPIO_PIN_PGUP GPIO_Pin_13 // PC.13 - #define KEYS_GPIO_REG_PGDN GPIOI->IDR - #define KEYS_GPIO_PIN_PGDN GPIO_Pin_11 // PI.11 - #define KEYS_GPIO_REG_UP GPIOI->IDR - #define KEYS_GPIO_PIN_UP GPIO_Pin_6 // PI.06 - #define KEYS_GPIO_REG_DOWN GPIOI->IDR - #define KEYS_GPIO_PIN_DOWN GPIO_Pin_4 // PI.04 - #define KEYS_GPIO_REG_LEFT GPIOI->IDR - #define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PI.07 - #define KEYS_GPIO_REG_RIGHT GPIOI->IDR - #define KEYS_GPIO_PIN_RIGHT GPIO_Pin_5 // PI.05 + #define KEYS_GPIO_REG_ENTER GPIOI + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_8 // PI.08 + #define KEYS_GPIO_REG_PGUP GPIOC + #define KEYS_GPIO_PIN_PGUP LL_GPIO_PIN_13 // PC.13 + #define KEYS_GPIO_REG_PGDN GPIOI + #define KEYS_GPIO_PIN_PGDN LL_GPIO_PIN_11 // PI.11 + #define KEYS_GPIO_REG_MDL GPIOI + #define KEYS_GPIO_PIN_MDL LL_GPIO_PIN_6 // PI.06 + #define KEYS_GPIO_REG_EXIT GPIOI + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_4 // PI.04 + #define KEYS_GPIO_REG_SYS GPIOI + #define KEYS_GPIO_PIN_SYS LL_GPIO_PIN_7 // PI.07 + #define KEYS_GPIO_REG_TELE GPIOI + #define KEYS_GPIO_PIN_TELE LL_GPIO_PIN_5 // PI.05 #elif defined(PCBX10) - #define KEYS_GPIO_REG_ENTER GPIOI->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_8 // PI.08 - #define KEYS_GPIO_REG_PGDN GPIOI->IDR - #define KEYS_GPIO_PIN_PGDN GPIO_Pin_11 // PI.11 - #define KEYS_GPIO_REG_UP GPIOI->IDR - #define KEYS_GPIO_PIN_UP GPIO_Pin_4 // PI.04 - #define KEYS_GPIO_REG_DOWN GPIOI->IDR - #define KEYS_GPIO_PIN_DOWN GPIO_Pin_6 // PI.06 - #define KEYS_GPIO_REG_LEFT GPIOI->IDR - #define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PI.07 - #define KEYS_GPIO_REG_RIGHT GPIOI->IDR - #define KEYS_GPIO_PIN_RIGHT GPIO_Pin_5 // PI.05 + #define KEYS_GPIO_REG_ENTER GPIOI + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_8 // PI.08 + #define KEYS_GPIO_REG_PGDN GPIOI + #define KEYS_GPIO_PIN_PGDN LL_GPIO_PIN_11 // PI.11 + #define KEYS_GPIO_REG_MDL GPIOI + #define KEYS_GPIO_PIN_MDL LL_GPIO_PIN_4 // PI.04 + #define KEYS_GPIO_REG_EXIT GPIOI + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_6 // PI.06 + #define KEYS_GPIO_REG_SYS GPIOI + #define KEYS_GPIO_PIN_SYS LL_GPIO_PIN_7 // PI.07 + #define KEYS_GPIO_REG_TELE GPIOI + #define KEYS_GPIO_PIN_TELE LL_GPIO_PIN_5 // PI.05 #endif // Rotary Encoder @@ -103,138 +103,146 @@ // Switches #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A -#define SWITCHES_GPIO_REG_A_H GPIOH->IDR -#define SWITCHES_GPIO_PIN_A_H GPIO_Pin_9 // PH.09 -#define SWITCHES_GPIO_REG_A_L GPIOI->IDR -#define SWITCHES_GPIO_PIN_A_L GPIO_Pin_15 // PI.15 +#define SWITCHES_GPIO_REG_A_H GPIOH +#define SWITCHES_GPIO_PIN_A_H LL_GPIO_PIN_9 // PH.09 +#define SWITCHES_GPIO_REG_A_L GPIOI +#define SWITCHES_GPIO_PIN_A_L LL_GPIO_PIN_15 // PI.15 #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B -#define SWITCHES_GPIO_REG_B_H GPIOH->IDR -#define SWITCHES_GPIO_PIN_B_H GPIO_Pin_12 // PH.12 -#define SWITCHES_GPIO_REG_B_L GPIOB->IDR -#define SWITCHES_GPIO_PIN_B_L GPIO_Pin_12 // PB.12 +#define SWITCHES_GPIO_REG_B_H GPIOH +#define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_12 // PH.12 +#define SWITCHES_GPIO_REG_B_L GPIOB +#define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_12 // PB.12 #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C -#define SWITCHES_GPIO_REG_C_H GPIOD->IDR -#define SWITCHES_GPIO_PIN_C_H GPIO_Pin_11 // PD.11 -#define SWITCHES_GPIO_REG_C_L GPIOB->IDR -#define SWITCHES_GPIO_PIN_C_L GPIO_Pin_15 // PB.15 +#define SWITCHES_GPIO_REG_C_H GPIOD +#define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_11 // PD.11 +#define SWITCHES_GPIO_REG_C_L GPIOB +#define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_15 // PB.15 #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D -#define SWITCHES_GPIO_REG_D_H GPIOJ->IDR -#define SWITCHES_GPIO_PIN_D_H GPIO_Pin_7 // PJ.07 -#define SWITCHES_GPIO_REG_D_L GPIOG->IDR -#define SWITCHES_GPIO_PIN_D_L GPIO_Pin_2 // PG.02 +#define SWITCHES_GPIO_REG_D_H GPIOJ +#define SWITCHES_GPIO_PIN_D_H LL_GPIO_PIN_7 // PJ.07 +#define SWITCHES_GPIO_REG_D_L GPIOG +#define SWITCHES_GPIO_PIN_D_L LL_GPIO_PIN_2 // PG.02 #define STORAGE_SWITCH_E #define HARDWARE_SWITCH_E -#define SWITCHES_GPIO_REG_E_H GPIOH->IDR -#define SWITCHES_GPIO_PIN_E_H GPIO_Pin_4 // PH.04 -#define SWITCHES_GPIO_REG_E_L GPIOE->IDR -#define SWITCHES_GPIO_PIN_E_L GPIO_Pin_3 // PE.03 +#define SWITCHES_GPIO_REG_E_H GPIOH +#define SWITCHES_GPIO_PIN_E_H LL_GPIO_PIN_4 // PH.04 +#define SWITCHES_GPIO_REG_E_L GPIOE +#define SWITCHES_GPIO_PIN_E_L LL_GPIO_PIN_3 // PE.03 #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F -#define SWITCHES_GPIO_REG_F GPIOH->IDR -#define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PH.03 +#define SWITCHES_GPIO_REG_F GPIOH +#define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_3 // PH.03 #define STORAGE_SWITCH_G #define HARDWARE_SWITCH_G -#define SWITCHES_GPIO_REG_G_H GPIOG->IDR -#define SWITCHES_GPIO_PIN_G_H GPIO_Pin_6 // PG.06 -#define SWITCHES_GPIO_REG_G_L GPIOG->IDR -#define SWITCHES_GPIO_PIN_G_L GPIO_Pin_3 // PG.03 +#define SWITCHES_GPIO_REG_G_H GPIOG +#define SWITCHES_GPIO_PIN_G_H LL_GPIO_PIN_6 // PG.06 +#define SWITCHES_GPIO_REG_G_L GPIOG +#define SWITCHES_GPIO_PIN_G_L LL_GPIO_PIN_3 // PG.03 #define STORAGE_SWITCH_H #define HARDWARE_SWITCH_H -#define SWITCHES_GPIO_REG_H GPIOG->IDR -#define SWITCHES_GPIO_PIN_H GPIO_Pin_7 // PG.07 +#define SWITCHES_GPIO_REG_H GPIOG +#define SWITCHES_GPIO_PIN_H LL_GPIO_PIN_7 // PG.07 + +#if defined(PCBX12S) + #define SWITCHES_F_INVERTED +#elif defined(PCBX10) + #define SWITCHES_B_INVERTED + #define SWITCHES_D_INVERTED + #define SWITCHES_E_INVERTED +#endif #if defined(PCBX10) // Gimbal switch left #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I - #define SWITCHES_GPIO_REG_I GPIOH->IDR - #define SWITCHES_GPIO_PIN_I GPIO_Pin_14 // PH.14 + #define SWITCHES_GPIO_REG_I GPIOH + #define SWITCHES_GPIO_PIN_I LL_GPIO_PIN_14 // PH.14 // Gimbal switch right #define STORAGE_SWITCH_J #define HARDWARE_SWITCH_J - #define SWITCHES_GPIO_REG_J GPIOH->IDR - #define SWITCHES_GPIO_PIN_J GPIO_Pin_15 // PH.15 + #define SWITCHES_GPIO_REG_J GPIOH + #define SWITCHES_GPIO_PIN_J LL_GPIO_PIN_15 // PH.15 #elif defined(PCBX12S) // Gimbal switch left #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I - #define SWITCHES_GPIO_REG_I GPIOB->IDR - #define SWITCHES_GPIO_PIN_I GPIO_Pin_1 // PB.01 + #define SWITCHES_GPIO_REG_I GPIOB + #define SWITCHES_GPIO_PIN_I LL_GPIO_PIN_1 // PB.01 // Gimbal switch right #define STORAGE_SWITCH_J #define HARDWARE_SWITCH_J - #define SWITCHES_GPIO_REG_J GPIOB->IDR - #define SWITCHES_GPIO_PIN_J GPIO_Pin_0 // PB.00 + #define SWITCHES_GPIO_REG_J GPIOB + #define SWITCHES_GPIO_PIN_J LL_GPIO_PIN_0 // PB.00 #endif // Trims #if defined(PCBX12S) - #define TRIMS_GPIO_REG_RHL GPIOC->IDR - #define TRIMS_GPIO_PIN_RHL GPIO_Pin_0 // PC.00 - #define TRIMS_GPIO_REG_RHR GPIOI->IDR - #define TRIMS_GPIO_PIN_RHR GPIO_Pin_4 // PI.04 - #define TRIMS_GPIO_REG_RVD GPIOG->IDR - #define TRIMS_GPIO_PIN_RVD GPIO_Pin_12 // PG.12 - #define TRIMS_GPIO_REG_RVU GPIOJ->IDR - #define TRIMS_GPIO_PIN_RVU GPIO_Pin_14 // PJ.14 - #define TRIMS_GPIO_REG_LVD GPIOJ->IDR - #define TRIMS_GPIO_PIN_LVD GPIO_Pin_13 // PJ.13 - #define TRIMS_GPIO_REG_LHL GPIOD->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_3 // PD.03 - #define TRIMS_GPIO_REG_LVU GPIOJ->IDR - #define TRIMS_GPIO_PIN_LVU GPIO_Pin_12 // PJ.12 - #define TRIMS_GPIO_REG_LHR GPIOD->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_7 // PD.07 - #define TRIMS_GPIO_REG_RSD GPIOJ->IDR - #define TRIMS_GPIO_PIN_RSD GPIO_Pin_8 // PJ.08 - #define TRIMS_GPIO_REG_RSU GPIOD->IDR - #define TRIMS_GPIO_PIN_RSU GPIO_Pin_13 // PD.13 - #define TRIMS_GPIO_REG_LSD GPIOB->IDR - #define TRIMS_GPIO_PIN_LSD GPIO_Pin_14 // PB.14 - #define TRIMS_GPIO_REG_LSU GPIOB->IDR - #define TRIMS_GPIO_PIN_LSU GPIO_Pin_13 // PB.13 + #define TRIMS_GPIO_REG_RHL GPIOC + #define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_0 // PC.00 + #define TRIMS_GPIO_REG_RHR GPIOI + #define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_4 // PI.04 + #define TRIMS_GPIO_REG_RVD GPIOG + #define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_12 // PG.12 + #define TRIMS_GPIO_REG_RVU GPIOJ + #define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_14 // PJ.14 + #define TRIMS_GPIO_REG_LVD GPIOJ + #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_13 // PJ.13 + #define TRIMS_GPIO_REG_LHL GPIOD + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_3 // PD.03 + #define TRIMS_GPIO_REG_LVU GPIOJ + #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_12 // PJ.12 + #define TRIMS_GPIO_REG_LHR GPIOD + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_7 // PD.07 + #define TRIMS_GPIO_REG_RSD GPIOJ + #define TRIMS_GPIO_PIN_RSD LL_GPIO_PIN_8 // PJ.08 + #define TRIMS_GPIO_REG_RSU GPIOD + #define TRIMS_GPIO_PIN_RSU LL_GPIO_PIN_13 // PD.13 + #define TRIMS_GPIO_REG_LSD GPIOB + #define TRIMS_GPIO_PIN_LSD LL_GPIO_PIN_14 // PB.14 + #define TRIMS_GPIO_REG_LSU GPIOB + #define TRIMS_GPIO_PIN_LSU LL_GPIO_PIN_13 // PB.13 #elif defined(PCBX10) #if defined(RADIO_TX16S) - #define TRIMS_GPIO_REG_LHL GPIOA->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_6 // PA.06 - #define TRIMS_GPIO_REG_LHR GPIOC->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_4 // PC.04 + #define TRIMS_GPIO_REG_LHL GPIOA + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_6 // PA.06 + #define TRIMS_GPIO_REG_LHR GPIOC + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_4 // PC.04 #else - #define TRIMS_GPIO_REG_LHL GPIOB->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_8 // PB.08 - #define TRIMS_GPIO_REG_LHR GPIOB->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_9 // PB.09 + #define TRIMS_GPIO_REG_LHL GPIOB + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_8 // PB.08 + #define TRIMS_GPIO_REG_LHR GPIOB + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_9 // PB.09 #endif - #define TRIMS_GPIO_REG_LVD GPIOG->IDR - #define TRIMS_GPIO_PIN_LVD GPIO_Pin_12 // PG.12 - #define TRIMS_GPIO_REG_LVU GPIOJ->IDR - #define TRIMS_GPIO_PIN_LVU GPIO_Pin_14 // PJ.14 - #define TRIMS_GPIO_REG_RVD GPIOJ->IDR - #define TRIMS_GPIO_PIN_RVD GPIO_Pin_13 // PJ.13 - #define TRIMS_GPIO_REG_RHL GPIOD->IDR - #define TRIMS_GPIO_PIN_RHL GPIO_Pin_3 // PD.03 - #define TRIMS_GPIO_REG_RVU GPIOJ->IDR - #define TRIMS_GPIO_PIN_RVU GPIO_Pin_12 // PJ.12 - #define TRIMS_GPIO_REG_RHR GPIOD->IDR - #define TRIMS_GPIO_PIN_RHR GPIO_Pin_7 // PD.07 + #define TRIMS_GPIO_REG_LVD GPIOG + #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_12 // PG.12 + #define TRIMS_GPIO_REG_LVU GPIOJ + #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_14 // PJ.14 + #define TRIMS_GPIO_REG_RVD GPIOJ + #define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_13 // PJ.13 + #define TRIMS_GPIO_REG_RHL GPIOD + #define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_3 // PD.03 + #define TRIMS_GPIO_REG_RVU GPIOJ + #define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_12 // PJ.12 + #define TRIMS_GPIO_REG_RHR GPIOD + #define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_7 // PD.07 #if defined(RADIO_FAMILY_T16) - #define TRIMS_GPIO_REG_LSU GPIOD->IDR - #define TRIMS_GPIO_PIN_LSU GPIO_Pin_13 // PD.13 - #define TRIMS_GPIO_REG_LSD GPIOJ->IDR - #define TRIMS_GPIO_PIN_LSD GPIO_Pin_8 // PJ.08 + #define TRIMS_GPIO_REG_LSU GPIOD + #define TRIMS_GPIO_PIN_LSU LL_GPIO_PIN_13 // PD.13 + #define TRIMS_GPIO_REG_LSD GPIOJ + #define TRIMS_GPIO_PIN_LSD LL_GPIO_PIN_8 // PJ.08 #else - #define TRIMS_GPIO_REG_LSU GPIOJ->IDR - #define TRIMS_GPIO_PIN_LSU GPIO_Pin_8 // PJ.08 - #define TRIMS_GPIO_REG_LSD GPIOD->IDR - #define TRIMS_GPIO_PIN_LSD GPIO_Pin_13 // PD.13 + #define TRIMS_GPIO_REG_LSU GPIOJ + #define TRIMS_GPIO_PIN_LSU LL_GPIO_PIN_8 // PJ.08 + #define TRIMS_GPIO_REG_LSD GPIOD + #define TRIMS_GPIO_PIN_LSD LL_GPIO_PIN_13 // PD.13 #endif - #define TRIMS_GPIO_REG_RSU GPIOB->IDR - #define TRIMS_GPIO_PIN_RSU GPIO_Pin_14 // PB.14 - #define TRIMS_GPIO_REG_RSD GPIOB->IDR - #define TRIMS_GPIO_PIN_RSD GPIO_Pin_13 // PB.13 + #define TRIMS_GPIO_REG_RSU GPIOB + #define TRIMS_GPIO_PIN_RSU LL_GPIO_PIN_14 // PB.14 + #define TRIMS_GPIO_REG_RSD GPIOB + #define TRIMS_GPIO_PIN_RSD LL_GPIO_PIN_13 // PB.13 #endif // Index of all keys @@ -269,88 +277,130 @@ // ADC #if defined(PCBX12S) - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 - #define ADC_RCC_APB2Periph (RCC_APB2Periph_SPI4 | RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC3) + #define ADC_RCC_APB2Periph (RCC_APB2Periph_SPI4) #define ADC_SPI SPI4 - #define ADC_GPIO_AF GPIO_AF_SPI4 #define ADC_SPI_GPIO GPIOE - #define ADC_SPI_PIN_SCK GPIO_Pin_2 // PE.02 - #define ADC_SPI_PIN_CS GPIO_Pin_4 // PE.04 - #define ADC_SPI_PIN_MOSI GPIO_Pin_6 // PE.06 - #define ADC_SPI_PIN_MISO GPIO_Pin_5 // PE.05 - #define ADC_SPI_PinSource_SCK GPIO_PinSource2 - #define ADC_SPI_PinSource_MISO GPIO_PinSource5 - #define ADC_SPI_PinSource_MOSI GPIO_PinSource6 - #define ADC_GPIO_PIN_MOUSE1 GPIO_Pin_8 // PF.08 ADC3_IN6 J5 MOUSE_X - #define ADC_GPIO_PIN_MOUSE2 GPIO_Pin_9 // PF.09 ADC3_IN7 J6 MOUSE_Y + #define ADC_SPI_GPIO_AF LL_GPIO_AF_5 + #define ADC_SPI_GPIO_PIN_SCK LL_GPIO_PIN_2 // PE.02 + #define ADC_SPI_GPIO_PIN_CS LL_GPIO_PIN_4 // PE.04 + #define ADC_SPI_GPIO_PIN_MOSI LL_GPIO_PIN_6 // PE.06 + #define ADC_SPI_GPIO_PIN_MISO LL_GPIO_PIN_5 // PE.05 + + #define ADC_SPI_STICK_LH 0 + #define ADC_SPI_STICK_LV 1 + #define ADC_SPI_STICK_RV 2 + #define ADC_SPI_STICK_RH 3 + #define ADC_SPI_POT1 4 + #define ADC_SPI_POT2 5 + #define ADC_SPI_POT3 6 + #define ADC_SPI_SLIDER1 7 + #define ADC_SPI_SLIDER2 8 + #define ADC_SPI_BATT 9 + #define ADC_SPI_SLIDER3 11 + #define ADC_SPI_SLIDER4 10 + + #define ADC_MAIN ADC3 + #define ADC_GPIO_PIN_MOUSE1 LL_GPIO_PIN_8 // PF.08 ADC3_IN6 J5 MOUSE_X + #define ADC_GPIO_PIN_MOUSE2 LL_GPIO_PIN_9 // PF.09 ADC3_IN7 J6 MOUSE_Y #define ADC_GPIO_MOUSE GPIOF #define ADC_CHANNEL_MOUSE1 6 #define ADC_CHANNEL_MOUSE2 7 + #define ADC_GPIOF_PINS (ADC_GPIO_PIN_MOUSE1 | ADC_GPIO_PIN_MOUSE2) + #define ADC_EXT ADC1 + #define ADC_EXT_SAMPTIME LL_ADC_SAMPLINGTIME_56CYCLES + #define ADC_CHANNEL_RTC_BAT LL_ADC_CHANNEL_VBAT // ADC1_IN16 + #define ADC_EXT_CHANNELS { ADC_CHANNEL_RTC_BATT } #define ADC_DMA DMA2 - #define ADC_DMA_Stream DMA2_Stream0 - #define ADC_SAMPTIME 3 - #define ADC_VREF_PREC2 300 + #define ADC_DMA_CHANNEL LL_DMA_CHANNEL_2 + #define ADC_DMA_STREAM LL_DMA_STREAM_0 + #define ADC_DMA_STREAM_IRQ DMA2_Stream0_IRQn + #define ADC_DMA_STREAM_IRQHandler DMA2_Stream0_IRQHandler + #define ADC_SAMPTIME LL_ADC_SAMPLINGTIME_56CYCLES + #define ADC_VREF_PREC2 600 #elif defined(PCBX10) - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph (RCC_APB1Periph_TIM5) - #define ADC_RCC_APB2Periph (RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC3) - #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_0 // PA.00 - #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_1 // PA.01 - #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_3 // PA.03 - #define ADC_GPIO_PIN_POT1 GPIO_Pin_0 // PC.00 - #define ADC_GPIO_PIN_POT2 GPIO_Pin_1 // PC.01 - #define ADC_GPIO_PIN_POT3 GPIO_Pin_2 // PC.02 - #define ADC_GPIO_PIN_SLIDER1 GPIO_Pin_6 // PF.06 - #define ADC_GPIO_PIN_SLIDER2 GPIO_Pin_3 // PC.03 - #define ADC_GPIO_PIN_BATT GPIO_Pin_7 // PF.07 - #define ADC_GPIO_PIN_EXT1 GPIO_Pin_8 // PF.08 - #define ADC_GPIO_PIN_EXT2 GPIO_Pin_9 // PF.09 + #define ADC_RCC_APB2Periph 0 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_1 // PA.01 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_3 // PA.03 + #define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_0 // PC.00 + #define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_1 // PC.01 + #define ADC_GPIO_PIN_POT3 LL_GPIO_PIN_2 // PC.02 // + #define ADC_GPIO_PIN_SLIDER1 LL_GPIO_PIN_6 // PF.06 + #define ADC_GPIO_PIN_SLIDER2 LL_GPIO_PIN_3 // PC.03 // + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_7 // PF.07 + #define ADC_GPIO_PIN_EXT1 LL_GPIO_PIN_8 // PF.08 + #define ADC_GPIO_PIN_EXT2 LL_GPIO_PIN_9 // PF.09 + #define ADC_GPIO_PIN_EXT3 ADC_GPIO_PIN_STICK_RH + #define ADC_GPIO_PIN_EXT4 ADC_GPIO_PIN_STICK_RV #if !defined(RADIO_TX16S) + #define PWM_STICKS #define PWM_TIMER TIM5 #define PWM_GPIO GPIOA #define PWM_GPIO_AF GPIO_AF_TIM5 #define PWM_IRQHandler TIM5_IRQHandler #define PWM_IRQn TIM5_IRQn - #define PWM_GPIOA_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) + #define PWM_GPIOA_PINS (ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_RV) #endif - #define ADC_GPIOA_PINS_FS (GPIO_Pin_2 | GPIO_Pin_3) - #define ADC_GPIOA_PINS (STICKS_PWM_ENABLED() ? 0 : (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3)) - #define ADC_GPIOC_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) - #define ADC_GPIOF_PINS (GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9) - #define ADC_CHANNEL_STICK_LH ADC_Channel_0 // ADC3_IN0 - #define ADC_CHANNEL_STICK_LV ADC_Channel_1 // ADC3_IN1 - #define ADC_CHANNEL_STICK_RH ADC_Channel_2 // ADC3_IN2 - #define ADC_CHANNEL_STICK_RV ADC_Channel_3 // ADC3_IN3 - #define ADC_CHANNEL_POT1 ADC_Channel_10 // ADC3_IN10 - #define ADC_CHANNEL_POT2 ADC_Channel_11 // ADC3_IN11 - #define ADC_CHANNEL_POT3 ADC_Channel_12 // ADC3_IN12 - #define ADC_CHANNEL_SLIDER1 ADC_Channel_4 // ADC3_IN4 - #define ADC_CHANNEL_SLIDER2 ADC_Channel_13 // ADC3_IN13 - #define ADC_CHANNEL_BATT ADC_Channel_5 // ADC3_IN5 - #define ADC_CHANNEL_EXT1 ADC_Channel_6 // ADC3_IN6 - #define ADC_CHANNEL_EXT2 ADC_Channel_7 // ADC3_IN7 - #define ADC_CHANNEL_EXT3 ADC_Channel_2 // ADC3_IN2: same as RH - #define ADC_CHANNEL_EXT4 ADC_Channel_3 // ADC3_IN3: same as RV + #define ADC_GPIOA_PINS_FS (LL_GPIO_PIN_2 | LL_GPIO_PIN_3) + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_RV) + #define ADC_GPIOC_PINS (ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_POT3 | ADC_GPIO_PIN_SLIDER2) + #define ADC_GPIOF_PINS (ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_BATT | ADC_GPIO_PIN_EXT1 | ADC_GPIO_PIN_EXT2) + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_0 // ADC3_IN0 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_1 // ADC3_IN1 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_2 // ADC3_IN2 + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_3 // ADC3_IN3 + #define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_10 // ADC3_IN10 + #define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_11 // ADC3_IN11 + #define ADC_CHANNEL_POT3 LL_ADC_CHANNEL_12 // ADC3_IN12 + #define ADC_CHANNEL_SLIDER1 LL_ADC_CHANNEL_4 // ADC3_IN4 + #define ADC_CHANNEL_SLIDER2 LL_ADC_CHANNEL_13 // ADC3_IN13 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_5 // ADC3_IN5 + #define ADC_CHANNEL_EXT1 LL_ADC_CHANNEL_6 // ADC3_IN6 + #define ADC_CHANNEL_EXT2 LL_ADC_CHANNEL_7 // ADC3_IN7 + #define ADC_CHANNEL_EXT3 LL_ADC_CHANNEL_2 // ADC3_IN2: same as RH + #define ADC_CHANNEL_EXT4 LL_ADC_CHANNEL_3 // ADC3_IN3: same as RV + #define ADC_CHANNEL_RTC_BAT LL_ADC_CHANNEL_VBAT // ADC1_IN18 #define ADC_MAIN ADC3 #define ADC_EXT ADC1 - #define ADC_SAMPTIME 3 + #define ADC_EXT_CHANNELS { ADC_CHANNEL_RTC_BAT } + #define ADC_EXT_SAMPTIME LL_ADC_SAMPLINGTIME_56CYCLES + #define ADC_SAMPTIME LL_ADC_SAMPLINGTIME_56CYCLES #define ADC_DMA DMA2 - #define ADC_DMA_Channel DMA_Channel_2 - #define ADC_DMA_Stream DMA2_Stream0 - #define ADC_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0) - #define ADC_DMA_TC_Flag DMA_FLAG_TCIF0 + #define ADC_DMA_CHANNEL LL_DMA_CHANNEL_2 + #define ADC_DMA_STREAM LL_DMA_STREAM_0 + #define ADC_DMA_STREAM_IRQ DMA2_Stream0_IRQn + #define ADC_DMA_STREAM_IRQHandler DMA2_Stream0_IRQHandler + // VBat divider is /4 on F42x and F43x devices #if defined(RADIO_TX16S) - #define ADC_VREF_PREC2 330 + #define ADC_VREF_PREC2 660 #elif defined(RADIO_T16) || defined(RADIO_T18) - #define ADC_VREF_PREC2 300 + #define ADC_VREF_PREC2 600 #else - #define ADC_VREF_PREC2 250 + #define ADC_VREF_PREC2 500 #endif #endif +#if defined(RADIO_T16) + #define ADC_DIRECTION {1,-1,1,-1, 1,1,1, -1,1,1,1, -1,1 } +#elif defined(RADIO_T18) + #define ADC_DIRECTION {1,-1,1,-1, -1,1,-1, -1,1,1,1, -1,1 } +#elif defined(RADIO_TX16S) + #define ADC_DIRECTION {1,-1,1,-1, 1,1,1, -1,1,1,1, -1,1 } +#elif defined(PCBX10) + #define ADC_DIRECTION {1,-1,1,-1, -1,1,-1, 1,1,1,1, 1,-1 } +#elif defined(PCBX12S) + #define ADC_DIRECTION {1,-1,1,-1, -1,1,-1, 1,-1, -1,-1, 0,0,0} +#else + #error "Missing ADC_DIRECTION array" +#endif + + // Power #if defined(RADIO_T18) #define PWR_RCC_AHB1Periph RCC_AHB1Periph_GPIOJ | RCC_AHB1Periph_GPIOB diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp deleted file mode 100755 index e93efdf46..000000000 --- a/radio/src/targets/horus/keys_driver.cpp +++ /dev/null @@ -1,223 +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 "opentx_types.h" -#include "board.h" -#include "keys.h" - -uint32_t readKeys() -{ - uint32_t result = 0; - -#if defined(KEYS_GPIO_REG_PGUP) - if (~KEYS_GPIO_REG_PGUP & KEYS_GPIO_PIN_PGUP) - result |= 1 << KEY_PGUP; -#endif - if (~KEYS_GPIO_REG_PGDN & KEYS_GPIO_PIN_PGDN) - result |= 1 << KEY_PGDN; - if (~KEYS_GPIO_REG_ENTER & KEYS_GPIO_PIN_ENTER) - result |= 1 << KEY_ENTER; - if (~KEYS_GPIO_REG_UP & KEYS_GPIO_PIN_UP) - result |= 1 << KEY_MODEL; - if (~KEYS_GPIO_REG_DOWN & KEYS_GPIO_PIN_DOWN) - result |= 1 << KEY_EXIT; - if (~KEYS_GPIO_REG_RIGHT & KEYS_GPIO_PIN_RIGHT) - result |= 1 << KEY_TELEM; - if (~KEYS_GPIO_REG_LEFT & KEYS_GPIO_PIN_LEFT) - result |= 1 << KEY_RADIO; - - // TRACE("readKeys(): %x", result); - - return result; -} - -uint32_t readTrims() -{ - uint32_t result = 0; - - if (~TRIMS_GPIO_REG_LHL & TRIMS_GPIO_PIN_LHL) - result |= 0x01; - if (~TRIMS_GPIO_REG_LHR & TRIMS_GPIO_PIN_LHR) - result |= 0x02; - if (~TRIMS_GPIO_REG_LVD & TRIMS_GPIO_PIN_LVD) - result |= 0x04; - if (~TRIMS_GPIO_REG_LVU & TRIMS_GPIO_PIN_LVU) - result |= 0x08; - if (~TRIMS_GPIO_REG_RVD & TRIMS_GPIO_PIN_RVD) - result |= 0x10; - if (~TRIMS_GPIO_REG_RVU & TRIMS_GPIO_PIN_RVU) - result |= 0x20; - if (~TRIMS_GPIO_REG_RHL & TRIMS_GPIO_PIN_RHL) - result |= 0x40; - if (~TRIMS_GPIO_REG_RHR & TRIMS_GPIO_PIN_RHR) - result |= 0x80; - if (~TRIMS_GPIO_REG_LSD & TRIMS_GPIO_PIN_LSD) - result |= 0x100; - if (~TRIMS_GPIO_REG_LSU & TRIMS_GPIO_PIN_LSU) - result |= 0x200; - if (~TRIMS_GPIO_REG_RSD & TRIMS_GPIO_PIN_RSD) - result |= 0x400; - if (~TRIMS_GPIO_REG_RSU & TRIMS_GPIO_PIN_RSU) - result |= 0x800; - // TRACE("readTrims(): result=0x%04x", result); - - return result; -} - -bool trimDown(uint8_t idx) -{ - return readTrims() & ((uint32_t)1 << idx); -} - -bool keyDown() -{ - return readKeys() || readTrims(); -} - -#define ADD_2POS_CASE(x) \ - case SW_S ## x ## 0: \ - xxx = SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \ - break; \ - case SW_S ## x ## 2: \ - xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \ - break -#define ADD_INV_2POS_CASE(x) \ - case SW_S ## x ## 2: \ - xxx = SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \ - break; \ - case SW_S ## x ## 0: \ - xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \ - break -#define ADD_3POS_CASE(x, i) \ - case SW_S ## x ## 0: \ - xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ - if (IS_3POS(i)) { \ - xxx = xxx && (~SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ - } \ - break; \ - case SW_S ## x ## 1: \ - xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H) && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ - break; \ - case SW_S ## x ## 2: \ - xxx = (~SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ - if (IS_3POS(i)) { \ - xxx = xxx && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ - } \ - break -#define ADD_INV_3POS_CASE(x, i) \ - case SW_S ## x ## 2: \ - xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ - if (IS_3POS(i)) { \ - xxx = xxx && (~SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ - } \ - break; \ - case SW_S ## x ## 1: \ - xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H) && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ - break; \ - case SW_S ## x ## 0: \ - xxx = (~SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ - if (IS_3POS(i)) { \ - xxx = xxx && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ - } \ - break - -#if !defined(BOOT) -uint32_t switchState(uint8_t index) -{ - uint32_t xxx = 0; - - switch (index) { -#if defined(PCBX12S) - ADD_3POS_CASE(A, 0); - ADD_3POS_CASE(B, 1); - ADD_3POS_CASE(C, 2); - ADD_3POS_CASE(D, 3); - ADD_3POS_CASE(E, 4); - ADD_INV_2POS_CASE(F); - ADD_3POS_CASE(G, 6); - ADD_2POS_CASE(H); - ADD_2POS_CASE(I); - ADD_2POS_CASE(J); -#else - ADD_3POS_CASE(A, 0); - ADD_INV_3POS_CASE(B, 1); - ADD_3POS_CASE(C, 2); - ADD_INV_3POS_CASE(D, 3); - ADD_INV_3POS_CASE(E, 4); - ADD_2POS_CASE(F); - ADD_3POS_CASE(G, 6); - ADD_2POS_CASE(H); - ADD_2POS_CASE(I); - ADD_2POS_CASE(J); -#endif - default: - break; - } - - // TRACE("switch %d => %d", index, xxx); - return xxx; -} -#endif - -void keysInit() -{ - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - -#if defined(KEYS_GPIOA_PINS) - INIT_KEYS_PINS(GPIOA); -#endif - -#if defined(KEYS_GPIOB_PINS) - INIT_KEYS_PINS(GPIOB); -#endif - -#if defined(KEYS_GPIOC_PINS) - INIT_KEYS_PINS(GPIOC); -#endif - -#if defined(KEYS_GPIOD_PINS) - INIT_KEYS_PINS(GPIOD); -#endif - -#if defined(KEYS_GPIOE_PINS) - INIT_KEYS_PINS(GPIOE); -#endif - -#if defined(KEYS_GPIOG_PINS) - INIT_KEYS_PINS(GPIOG); -#endif - -#if defined(KEYS_GPIOH_PINS) - INIT_KEYS_PINS(GPIOH); -#endif - -#if defined(KEYS_GPIOI_PINS) - INIT_KEYS_PINS(GPIOI); -#endif - -#if defined(KEYS_GPIOJ_PINS) - INIT_KEYS_PINS(GPIOJ); -#endif -} diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp index 1176a872b..435aa5fff 100644 --- a/radio/src/targets/horus/lcd_driver.cpp +++ b/radio/src/targets/horus/lcd_driver.cpp @@ -24,6 +24,9 @@ #include "lcd.h" #include +#include "stm32f4xx_dma2d.h" +#include "stm32f4xx_ltdc.h" + #if defined(RADIO_T18) #define HBP 43 #define VBP 12 diff --git a/radio/src/targets/horus/libopenui_config.h b/radio/src/targets/horus/libopenui_config.h index 901ce206c..719778f14 100644 --- a/radio/src/targets/horus/libopenui_config.h +++ b/radio/src/targets/horus/libopenui_config.h @@ -139,5 +139,3 @@ constexpr LcdFlags TABLE_BODY_FONT = FONT(STD); constexpr int CJK_FIRST_LETTER_INDEX = 128 - 32 + 21; constexpr coord_t CHAR_SPACING = 0; - -#define ROTARY_ENCODER_SPEED() rotencSpeed diff --git a/radio/src/targets/horus/sdram_driver.c b/radio/src/targets/horus/sdram_driver.c index dab91988f..cbca9b501 100755 --- a/radio/src/targets/horus/sdram_driver.c +++ b/radio/src/targets/horus/sdram_driver.c @@ -19,6 +19,7 @@ */ #include "board.h" +#include "stm32f4xx_fmc.h" #define SDRAM_MEMORY_WIDTH FMC_SDMemory_Width_16b @@ -463,4 +464,4 @@ void SDRAM_ReadBuffer(uint32_t* pBuffer, uint32_t uwReadAddress, uint32_t uwBuff write_pointer += 4; } } -#endif \ No newline at end of file +#endif diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp index abe0d84d4..0d5a0d03e 100644 --- a/radio/src/targets/horus/tp_gt911.cpp +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -22,6 +22,7 @@ #include "stm32_hal_ll.h" #include "stm32_hal.h" #include "stm32_i2c_driver.h" +#include "stm32_gpio_driver.h" #include "hal.h" #include "tp_gt911.h" @@ -471,25 +472,13 @@ static void TOUCH_AF_ExtiConfig(void) NVIC_EnableIRQ(TOUCH_INT_EXTI_IRQn); } -static int gt911_enable_gpio_clock(GPIO_TypeDef *GPIOx) -{ - if (GPIOx == GPIOF) - __HAL_RCC_GPIOF_CLK_ENABLE(); - else if (GPIOx == GPIOH) - __HAL_RCC_GPIOH_CLK_ENABLE(); - else - return -1; - - return 0; -} - static void TOUCH_AF_GPIOConfig(void) { LL_GPIO_InitTypeDef gpioInit; LL_GPIO_StructInit(&gpioInit); - gt911_enable_gpio_clock(TOUCH_RST_GPIO); - gt911_enable_gpio_clock(TOUCH_INT_GPIO); + stm32_gpio_enable_clock(TOUCH_RST_GPIO); + stm32_gpio_enable_clock(TOUCH_INT_GPIO); gpioInit.Mode = LL_GPIO_MODE_OUTPUT; gpioInit.Speed = LL_GPIO_SPEED_FREQ_HIGH; diff --git a/radio/src/targets/horus/x12s_adc_driver.cpp b/radio/src/targets/horus/x12s_adc_driver.cpp deleted file mode 100644 index cece995ac..000000000 --- a/radio/src/targets/horus/x12s_adc_driver.cpp +++ /dev/null @@ -1,281 +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 "opentx.h" -#include "x12s_adc_driver.h" - - -#define ADC_CS_HIGH() (ADC_SPI_GPIO->BSRRL = ADC_SPI_PIN_CS) -#define ADC_CS_LOW() (ADC_SPI_GPIO->BSRRH = ADC_SPI_PIN_CS) - -#define SPI_STICK1 0 -#define SPI_STICK2 1 -#define SPI_STICK3 2 -#define SPI_STICK4 3 -#define SPI_S1 4 -#define SPI_6POS 5 -#define SPI_S2 6 -#define SPI_LS 7 -#define SPI_RS 8 -#define SPI_TX_VOLTAGE 9 -#define SPI_L2 10 -#define SPI_L1 11 -#define RESETCMD 0x4000 -#define MANUAL_MODE 0x1000 // manual mode channel 0 - -uint16_t SPIx_ReadWriteByte(uint16_t value) -{ - while (SPI_I2S_GetFlagStatus(ADC_SPI, SPI_I2S_FLAG_TXE) == RESET); - SPI_I2S_SendData(ADC_SPI, value); - - while (SPI_I2S_GetFlagStatus(ADC_SPI, SPI_I2S_FLAG_RXNE) == RESET); - return SPI_I2S_ReceiveData(ADC_SPI); -} - -static void ADS7952_Init() -{ - GPIO_InitTypeDef GPIO_InitStructure; - SPI_InitTypeDef SPI_InitStructure; - - GPIO_InitStructure.GPIO_Pin = ADC_SPI_PIN_MISO | ADC_SPI_PIN_SCK | ADC_SPI_PIN_MOSI; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(ADC_SPI_GPIO, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = ADC_SPI_PIN_CS; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(ADC_SPI_GPIO, &GPIO_InitStructure); - - GPIO_PinAFConfig(ADC_SPI_GPIO, ADC_SPI_PinSource_SCK, ADC_GPIO_AF); - GPIO_PinAFConfig(ADC_SPI_GPIO, ADC_SPI_PinSource_MISO, ADC_GPIO_AF); - GPIO_PinAFConfig(ADC_SPI_GPIO, ADC_SPI_PinSource_MOSI, ADC_GPIO_AF); - - SPI_I2S_DeInit(ADC_SPI); - - SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; - SPI_InitStructure.SPI_Mode = SPI_Mode_Master; - SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; - SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; - SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; - SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; - SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; - SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; - SPI_InitStructure.SPI_CRCPolynomial = 7; - SPI_Init(ADC_SPI, &SPI_InitStructure); - SPI_Cmd(ADC_SPI, ENABLE); - SPI_I2S_ITConfig(ADC_SPI, SPI_I2S_IT_TXE, DISABLE); - SPI_I2S_ITConfig(ADC_SPI, SPI_I2S_IT_RXNE, DISABLE); - - ADC_CS_HIGH(); - delay_01us(1); - ADC_CS_LOW(); - SPIx_ReadWriteByte(RESETCMD); - ADC_CS_HIGH(); - delay_01us(1); - ADC_CS_LOW(); - SPIx_ReadWriteByte(MANUAL_MODE); - ADC_CS_HIGH(); -} - -static bool x12s_adc_init() -{ - ADS7952_Init(); - - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = ADC_GPIO_PIN_MOUSE1 | ADC_GPIO_PIN_MOUSE2; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(ADC_GPIO_MOUSE, &GPIO_InitStructure); - - ADC3->CR1 = ADC_CR1_SCAN; - ADC3->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; - ADC3->SQR1 = (2 - 1) << 20; - ADC3->SQR2 = 0; - ADC3->SQR3 = (ADC_CHANNEL_MOUSE1 << 0) + (ADC_CHANNEL_MOUSE2 << 5); - ADC3->SMPR1 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24); - ADC3->SMPR2 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24) + (ADC_SAMPTIME << 27); - ADC->CCR = 0; - - // Enable the DMA channel here, DMA2 stream 1, channel 2 - ADC_DMA_Stream->CR = DMA_SxCR_PL | DMA_SxCR_CHSEL_1 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC; - ADC_DMA_Stream->PAR = CONVERT_PTR_UINT(&ADC3->DR); - ADC_DMA_Stream->M0AR = CONVERT_PTR_UINT(&adcValues[MOUSE1]); - ADC_DMA_Stream->NDTR = 2; - ADC_DMA_Stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0; - - ADC->CCR = ADC_CCR_VBATE; // Enable RTC coin cell sampling bridge - - ADC1->CR1 = ADC_CR1_SCAN; - ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; - ADC1->SQR1 = (1 - 1) << 20; - ADC1->SQR2 = 0; - ADC1->SQR3 = (ADC_Channel_Vbat << 0); - ADC1->SMPR1 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24); - ADC1->SMPR2 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24) + (ADC_SAMPTIME << 27); - - return true; -} - -const uint16_t adcCommands[MOUSE1+2] = -{ - MANUAL_MODE | (SPI_STICK1 << 7), - MANUAL_MODE | (SPI_STICK2 << 7), - MANUAL_MODE | (SPI_STICK3 << 7), - MANUAL_MODE | (SPI_STICK4 << 7), - MANUAL_MODE | (SPI_S1 << 7), - MANUAL_MODE | (SPI_6POS << 7), - MANUAL_MODE | (SPI_S2 << 7), - MANUAL_MODE | (SPI_L1 << 7), - MANUAL_MODE | (SPI_L2 << 7), - MANUAL_MODE | (SPI_LS << 7), - MANUAL_MODE | (SPI_RS << 7), - MANUAL_MODE | (SPI_TX_VOLTAGE << 7), - MANUAL_MODE | (0 << 7), // small joystick left/right - MANUAL_MODE | (0 << 7) // small joystick up/down -}; - -void adcReadSPIDummy() -{ - // A dummy command to get things started - // (because the sampled data is lagging behind for two command cycles) - ADC_CS_LOW(); - delay_01us(1); - SPIx_ReadWriteByte(adcCommands[0]); - ADC_CS_HIGH(); - delay_01us(1); -} - -uint32_t adcReadNextSPIChannel(uint8_t index) -{ - uint32_t result = 0; - - // This delay is to allow charging of ADC input capacitor - // after the MUX changes from one channel to the other. - // It was determined experimentally. Biggest problem seems to be - // the cross-talk between A4:S1 and A5:MULTIPOS. Changing S1 for one extreme - // to the other resulted in A5 change of: - // - // delay value A5 change Time needed for adcRead() - // 1 16 0.154ms - 0.156ms - // 38 5 0.197ms - 0.199ms - // 62 0 0.225ms - 0.243ms - delay_01us(40); - - for (uint8_t i = 0; i < 4; i++) { - ADC_CS_LOW(); - delay_01us(1); - // command is changed to the next index for the last two readings - // (because the sampled data is lagging behind for two command cycles) - uint16_t val = (0x0fff & SPIx_ReadWriteByte(adcCommands[(i>1) ? index+1 : index])); -#if defined(JITTER_MEASURE) - if (JITTER_MEASURE_ACTIVE()) { - rawJitter[index].measure(val); - } -#endif - ADC_CS_HIGH(); - delay_01us(1); - result += val; - } - - return result >> 2; -} - -void adcOnChipReadStart() -{ - ADC_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA - ADC3->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); - ADC_DMA->LIFCR = DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0; // Write ones to clear bits - ADC_DMA_Stream->M0AR = CONVERT_PTR_UINT(&adcValues[MOUSE1]); - ADC_DMA_Stream->NDTR = 2; - ADC_DMA_Stream->CR |= DMA_SxCR_EN; // Enable DMA - ADC3->CR2 |= (uint32_t)ADC_CR2_SWSTART; - - ADC1->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); - ADC1->CR2 |= (uint32_t)ADC_CR2_SWSTART; -} - -bool adcOnChipReadFinished() -{ - return (ADC_DMA->LISR & DMA_LISR_TCIF0); -} - -// Re-declare adcRead() -// (takes precedence over hal/adc_driver.cpp) -bool adcRead() -{ - uint16_t temp[NUM_ANALOGS-MOUSE1] = { 0 }; - uint8_t noInternalReads = 0; - - adcOnChipReadStart(); - adcReadSPIDummy(); - adcReadSPIDummy(); - for (uint32_t index=0; index> 2; - } - - if (isVBatBridgeEnabled()) { - rtcBatteryVoltage = ADC1->DR; - } - - return true; -} - -//TODO: implement these based on stm32_hal_adc.cpp -//static bool x12s_adc_init(); -//static bool x12s_adc_start_read(); -//static void x12s_adc_wait_completion(); - -const etx_hal_adc_driver_t x12s_adc_driver = { - x12s_adc_init, - nullptr,//x12s_adc_start_read, - nullptr,//x12s_adc_wait_completion -}; diff --git a/radio/src/targets/nv14/CMakeLists.txt b/radio/src/targets/nv14/CMakeLists.txt index bdc34592e..ab8bd29af 100644 --- a/radio/src/targets/nv14/CMakeLists.txt +++ b/radio/src/targets/nv14/CMakeLists.txt @@ -26,11 +26,6 @@ else() set(LINKER_SCRIPT targets/nv14/stm32f4_flash.ld) endif() -if(YAML_STORAGE) - set(STORAGE_CONVERT RAW) - set(STORAGE_FORMAT YAML) -endif() - set(RTC_BACKUP_RAM YES) set(PPM_LIMITS_SYMETRICAL YES) # for size report script @@ -44,7 +39,7 @@ set_property(CACHE PCB_RF_BAUD PROPERTY STRINGS ${RF_BAUD_RATE}) set(FLAVOUR nv14) add_definitions(-DPCBNV14 -DPCBFLYSKY -DAFHDS2_BAUDRATE=${PCB_RF_BAUD}) -add_definitions(-DBATTERY_CHARGE) +add_definitions(-DBATTERY_CHARGE -DUSE_TRIMS_AS_BUTTONS) # defines existing internal modules set(INTERNAL_MODULES AFHDS2A;AFHDS3 CACHE STRING "Internal modules") @@ -53,7 +48,6 @@ set(DEFAULT_INTERNAL_MODULE FLYSKY CACHE STRING "Default internal module") set(BITMAPS_TARGET nv14_bitmaps) set(FONTS_TARGET x12_fonts) set(LCD_DRIVER lcd_driver.cpp) -set(LUA_EXPORT lua_export_nv14) set(TOUCH_DRIVER touch_driver.cpp) set(HARDWARE_TOUCH YES) @@ -146,12 +140,8 @@ set(FIRMWARE_TARGET_SRC set(FIRMWARE_SRC ${FIRMWARE_SRC} hal/adc_driver.cpp - boards/generic_stm32/module_ports.cpp - boards/generic_stm32/aux_ports.cpp - targets/common/arm/stm32/stm32_hal_adc.cpp + targets/common/arm/stm32/stm32_adc.cpp targets/common/arm/stm32/timers_driver.cpp - targets/common/arm/stm32/mixer_scheduler_driver.cpp - targets/common/arm/stm32/extmodule_driver.cpp targets/common/arm/stm32/stm32_pulse_driver.cpp targets/common/arm/stm32/stm32_usart_driver.cpp targets/common/arm/stm32/trainer_driver.cpp diff --git a/radio/src/targets/nv14/backlight_driver.cpp b/radio/src/targets/nv14/backlight_driver.cpp index 9a154f549..b68c0d259 100644 --- a/radio/src/targets/nv14/backlight_driver.cpp +++ b/radio/src/targets/nv14/backlight_driver.cpp @@ -23,6 +23,7 @@ #include "board.h" #include "globals.h" +#include "lcd_driver.h" void backlightLowInit( void ) { diff --git a/radio/src/targets/nv14/battery_driver.cpp b/radio/src/targets/nv14/battery_driver.cpp index edf67a0e2..acf4e0ba7 100644 --- a/radio/src/targets/nv14/battery_driver.cpp +++ b/radio/src/targets/nv14/battery_driver.cpp @@ -19,6 +19,7 @@ * GNU General Public License for more details. */ #include "opentx.h" +#include "battery_driver.h" #define __BATTERY_DRIVER_C__ diff --git a/radio/src/targets/nv14/board.cpp b/radio/src/targets/nv14/board.cpp index f2b96c622..74d43c61b 100644 --- a/radio/src/targets/nv14/board.cpp +++ b/radio/src/targets/nv14/board.cpp @@ -18,22 +18,30 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ + +#include "stm32_adc.h" #include "board.h" #include "boards/generic_stm32/module_ports.h" #include "hal/adc_driver.h" #include "hal/trainer_driver.h" +#include "hal/switch_driver.h" #include "globals.h" #include "sdcard.h" #include "touch.h" #include "debug.h" -#include "stm32_hal_adc.h" #include "flysky_gimbal_driver.h" #include "timers_driver.h" +#include "lcd_driver.h" +#include "lcd_driver.h" +#include "battery_driver.h" +#include "touch_driver.h" +#include "watchdog_driver.h" + #include "bitmapbuffer.h" #include "colors.h" @@ -48,6 +56,36 @@ extern "C" { } #endif +// common ADC driver +extern const etx_hal_adc_driver_t _adc_driver; + +enum PowerReason { + SHUTDOWN_REQUEST = 0xDEADBEEF, + SOFTRESET_REQUEST = 0xCAFEDEAD, +}; + +constexpr uint32_t POWER_REASON_SIGNATURE = 0x0178746F; + +bool UNEXPECTED_SHUTDOWN() +{ +#if defined(SIMU) || defined(NO_UNEXPECTED_SHUTDOWN) + return false; +#else + if (WAS_RESET_BY_WATCHDOG()) + return true; + else if (WAS_RESET_BY_SOFTWARE()) + return RTC->BKP0R != SOFTRESET_REQUEST; + else + return RTC->BKP1R == POWER_REASON_SIGNATURE && RTC->BKP0R != SHUTDOWN_REQUEST; +#endif +} + +void SET_POWER_REASON(uint32_t value) +{ + RTC->BKP0R = value; + RTC->BKP1R = POWER_REASON_SIGNATURE; +} + HardwareOptions hardwareOptions; void watchdogInit(unsigned int duration) @@ -148,6 +186,18 @@ void boardBootloaderInit() hardwareOptions.pcbrev = boardGetPcbRev(); } +static void monitorInit() +{ + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + + GPIO_InitStructure.GPIO_Pin = VBUS_MONITOR_PIN; + GPIO_Init(GPIOJ, &GPIO_InitStructure); +} + void boardInit() { #if defined(SEMIHOSTING) @@ -183,7 +233,7 @@ void boardInit() init_trainer(); battery_charge_init(); - globalData.flyskygimbals = flysky_gimbal_init(); + flysky_gimbal_init(); init2MhzTimer(); init1msTimer(); TouchInit(); @@ -227,12 +277,13 @@ void boardInit() } keysInit(); + switchInit(); audioInit(); // we need to initialize g_FATFS_Obj here, because it is in .ram section (because of DMA access) // and this section is un-initialized memset(&g_FATFS_Obj, 0, sizeof(g_FATFS_Obj)); monitorInit(); - adcInit(&stm32_hal_adc_driver); + adcInit(&_adc_driver); hapticInit(); @@ -252,6 +303,8 @@ void boardInit() #endif } +extern void rtcDisableBackupReg(); + void boardOff() { lcdOff(); @@ -265,10 +318,7 @@ void boardOff() // Shutdown the Haptic hapticDone(); -#if defined(RTC_BACKUP_RAM) - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, DISABLE); - PWR_BackupRegulatorCmd(DISABLE); -#endif + rtcDisableBackupReg(); if (usbPlugged()) { diff --git a/radio/src/targets/nv14/board.h b/radio/src/targets/nv14/board.h index 3f1e5b6e0..053565990 100644 --- a/radio/src/targets/nv14/board.h +++ b/radio/src/targets/nv14/board.h @@ -24,22 +24,11 @@ #include "definitions.h" #include "opentx_constants.h" + #include "board_common.h" #include "hal.h" #include "hal/serial_port.h" -#if !defined(LUA_EXPORT_GENERATION) -#include "stm32f4xx_sdio.h" -#include "stm32f4xx_dma2d.h" -#include "stm32f4xx_ltdc.h" -#include "stm32f4xx_fmc.h" -#endif - -#include "touch_driver.h" -#include "lcd_driver.h" -#include "battery_driver.h" -#include "watchdog_driver.h" - #define FLASHSIZE 0x200000 #define BOOTLOADER_SIZE 0x20000 #define FIRMWARE_ADDRESS 0x08000000 @@ -150,191 +139,18 @@ extern HardwareOptions hardwareOptions; #define IS_UART_MODULE(port) (port == INTERNAL_MODULE) #define IS_PXX2_INTERNAL_ENABLED() (false) -// Keys driver -enum EnumKeys -{ - KEY_ENTER, - KEY_EXIT, - KEY_PGUP, - KEY_PGDN, - KEY_UP, - KEY_DOWN, - KEY_LEFT, - KEY_RIGHT, - KEY_MODEL, - KEY_RADIO, - KEY_TELEM, - TRM_BASE, - TRM_LH_DWN = TRM_BASE, - TRM_LH_UP, - TRM_LV_DWN, - TRM_LV_UP, - TRM_RV_DWN, - TRM_RV_UP, - TRM_RH_DWN, - TRM_RH_UP, - TRM_LS_DWN, - TRM_LS_UP, - TRM_LAST = TRM_LS_UP, - - NUM_KEYS -}; - -#define IS_SHIFT_KEY(index) (false) -#define IS_SHIFT_PRESSED() (false) -enum VirtualKeys { - VKEY_MIN, - VKEY_MAX, - VKEY_INC, - VKEY_DEC, - VKEY_INC_LARGE, - VKEY_DEC_LARGE, - VKEY_DEFAULT, -}; - -enum LUATouchEvent { - TOUCH_DOWN = 1, - TOUCH_UP, - TOUCH_SLIDE_UP, - TOUCH_SLIDE_DOWN, - TOUCH_SLIDE_LEFT, - TOUCH_SLIDE_RIGHT, -}; - -enum EnumSwitches -{ - SW_SA, - SW_SB, - SW_SC, - SW_SD, - SW_SE, - SW_SF, - SW_SG, - SW_SH, - NUM_SWITCHES -}; - -#define STORAGE_NUM_SWITCHES NUM_SWITCHES -#define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_3POS << 10) + (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_TOGGLE << 4) + (SWITCH_3POS << 2) + (SWITCH_2POS << 0); - -enum EnumSwitchesPositions -{ - SW_SA0, - SW_SA1, - SW_SA2, - SW_SB0, - SW_SB1, - SW_SB2, - SW_SC0, - SW_SC1, - SW_SC2, - SW_SD0, - SW_SD1, - SW_SD2, - SW_SE0, - SW_SE1, - SW_SE2, - SW_SF0, - SW_SF1, - SW_SF2, - SW_SG0, - SW_SG1, - SW_SG2, - SW_SH0, - SW_SH1, - SW_SH2, - NUM_SWITCHES_POSITIONS -}; - -#define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3) - #if !defined(NUM_FUNCTIONS_SWITCHES) #define NUM_FUNCTIONS_SWITCHES 0 #endif -void monitorInit(); -void keysInit(); -uint8_t keyState(uint8_t index); -uint32_t switchState(uint8_t index); -uint32_t readKeys(); -uint32_t readTrims(); -void setTrimsAsButtons(bool); -bool getTrimsAsButtons(); -#define TRIMS_EMULATE_BUTTONS -#define NUM_TRIMS NUM_STICKS #define NUM_TRIMS_KEYS (NUM_TRIMS * 2) -#define TRIMS_PRESSED() (readTrims()) -#define KEYS_PRESSED() (readKeys()) -#define DBLKEYS_PRESSED_RGT_LFT(in) (false) -#define DBLKEYS_PRESSED_UP_DWN(in) (false) -#define DBLKEYS_PRESSED_RGT_UP(in) (false) -#define DBLKEYS_PRESSED_LFT_DWN(in) (false) - -// ADC driver -#define NUM_POTS 2 -#define NUM_XPOTS 0 // NUM_POTS -#define NUM_SLIDERS 0 -#define NUM_PWMSTICKS 0 -#define NUM_MOUSE_ANALOGS 0 -#define STORAGE_NUM_POTS 5 -#define STORAGE_NUM_SLIDERS 0 -#define STORAGE_NUM_MOUSE_ANALOGS 0 - -enum Analogs { - STICK1, - STICK2, - STICK3, - STICK4, - POT_FIRST, - POT1 = POT_FIRST, - POT2, - POT_LAST = POT2, - SWITCH_FIRST, - SWA = SWITCH_FIRST, - SWB, - SWC, - SWD, - SWE, - SWF, - SWG, - SWH, - SUB_ANALOG_POS = SWH, - SWITCH_END = SWH, - TX_VOLTAGE, - TX_VBAT, - NUM_ANALOGS -}; - -#define SLIDER_FIRST 0 -#define SLIDER_LAST -1 #define DEFAULT_STICK_DEADZONE 2 -#define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITHOUT_DETENT << 2) // 2 pots without detent - -enum CalibratedAnalogs { - CALIBRATED_STICK1, - CALIBRATED_STICK2, - CALIBRATED_STICK3, - CALIBRATED_STICK4, - CALIBRATED_POT1, - CALIBRATED_POT2, - CALIBRATED_SWA, - CALIBRATED_SWB, - CALIBRATED_SWC, - CALIBRATED_SWD, - CALIBRATED_SWE, - CALIBRATED_SWF, - CALIBRATED_SWG, - CALIBRATED_SWH, - NUM_CALIBRATED_ANALOGS -}; - -#define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST) -#define IS_SLIDER(x) (false) - -extern uint16_t adcValues[NUM_ANALOGS]; - +// 2 pots without detent +#define DEFAULT_POTS_CONFIG \ + (POT_WITHOUT_DETENT << 0) + \ + (POT_WITHOUT_DETENT << 2) #define BATTERY_WARN 36 // 3.6V #define BATTERY_MIN 35 // 3.5V @@ -348,35 +164,8 @@ enum EnumPowerupState BOARD_REBOOT = 0xC00010FF, }; - -#if defined(__cplusplus) -enum PowerReason { - SHUTDOWN_REQUEST = 0xDEADBEEF, - SOFTRESET_REQUEST = 0xCAFEDEAD, -}; - -constexpr uint32_t POWER_REASON_SIGNATURE = 0x0178746F; - -inline bool UNEXPECTED_SHUTDOWN() -{ -#if defined(SIMU) || defined(NO_UNEXPECTED_SHUTDOWN) - return false; -#else - if (WAS_RESET_BY_WATCHDOG()) - return true; - else if (WAS_RESET_BY_SOFTWARE()) - return RTC->BKP0R != SOFTRESET_REQUEST; - else - return RTC->BKP1R == POWER_REASON_SIGNATURE && RTC->BKP0R != SHUTDOWN_REQUEST; -#endif -} - -inline void SET_POWER_REASON(uint32_t value) -{ - RTC->BKP0R = value; - RTC->BKP1R = POWER_REASON_SIGNATURE; -} -#endif +bool UNEXPECTED_SHUTDOWN(); +void SET_POWER_REASON(uint32_t value); #if defined(__cplusplus) && !defined(SIMU) extern "C" { @@ -395,6 +184,7 @@ void pwrSoftReboot(); void pwrOff(); void pwrResetHandler(); bool pwrPressed(); +bool pwrOffPressed(); #if defined(PWR_EXTRA_SWITCH_GPIO) bool pwrForcePressed(); #else diff --git a/radio/src/targets/nv14/hal.h b/radio/src/targets/nv14/hal.h index 68263be79..926ca5aa8 100644 --- a/radio/src/targets/nv14/hal.h +++ b/radio/src/targets/nv14/hal.h @@ -49,27 +49,29 @@ // Trims -#define TRIMS_GPIO_REG_RHL GPIOD->IDR -#define TRIMS_GPIO_PIN_RHL GPIO_Pin_7 // PD.07 -#define TRIMS_GPIO_REG_RHR GPIOG->IDR -#define TRIMS_GPIO_PIN_RHR GPIO_Pin_10 // PG.10 -#define TRIMS_GPIO_REG_RVD GPIOJ->IDR -#define TRIMS_GPIO_PIN_RVD GPIO_Pin_0 // PJ.00 -#define TRIMS_GPIO_REG_RVU GPIOB->IDR -#define TRIMS_GPIO_PIN_RVU GPIO_Pin_15 // PB.15 -#define TRIMS_GPIO_REG_RPRESS GPIOC->IDR -#define TRIMS_GPIO_PIN_RPRESS GPIO_Pin_13 // PC.13 +#define TRIMS_GPIO_REG_RHL GPIOD +#define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_7 // PD.07 +#define TRIMS_GPIO_REG_RHR GPIOG +#define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_10 // PG.10 +#define TRIMS_GPIO_REG_RVD GPIOJ +#define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_0 // PJ.00 +#define TRIMS_GPIO_REG_RVU GPIOB +#define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_15 // PB.15 -#define TRIMS_GPIO_REG_LHL GPIOH->IDR -#define TRIMS_GPIO_PIN_LHL GPIO_Pin_2 // PH.02 -#define TRIMS_GPIO_REG_LHR GPIOG->IDR -#define TRIMS_GPIO_PIN_LHR GPIO_Pin_2 // PG.02 -#define TRIMS_GPIO_REG_LVU GPIOH->IDR -#define TRIMS_GPIO_PIN_LVU GPIO_Pin_7 // PH.07 -#define TRIMS_GPIO_REG_LVD GPIOJ->IDR -#define TRIMS_GPIO_PIN_LVD GPIO_Pin_12 // PJ.12 -#define TRIMS_GPIO_REG_LPRESS GPIOG->IDR -#define TRIMS_GPIO_PIN_LPRESS GPIO_Pin_11 // PG.11 +#define KEYS_GPIO_REG_ENTER GPIOC +#define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_13 // PC.13 + +#define TRIMS_GPIO_REG_LHL GPIOH +#define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_2 // PH.02 +#define TRIMS_GPIO_REG_LHR GPIOG +#define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_2 // PG.02 +#define TRIMS_GPIO_REG_LVU GPIOH +#define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_7 // PH.07 +#define TRIMS_GPIO_REG_LVD GPIOJ +#define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_12 // PJ.12 + +#define KEYS_GPIO_REG_EXIT GPIOG +#define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_11 // PG.11 // Monitor pin #define MONITOR_RCC_AHB1Periph (RCC_AHB1Periph_GPIOJ) @@ -104,62 +106,78 @@ #define KEYS_GPIOJ_PINS (GPIO_Pin_0 | GPIO_Pin_12) // ADC -#define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) -#define ADC_RCC_APB2Periph (RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC3) -// FLYSKY_HALL_STICKS -#define ADC_GPIO_PIN_STICK_LH 0 -#define ADC_GPIO_PIN_STICK_LV 0 -#define ADC_GPIO_PIN_STICK_RH 0 -#define ADC_GPIO_PIN_STICK_RV 0 +#define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) +#define ADC_RCC_APB2Periph 0 -#define ADC_GPIO_PIN_POT1 GPIO_Pin_6 // PA.06 VRA -#define ADC_GPIO_PIN_POT2 GPIO_Pin_4 // PC.04 VRB -#define ADC_GPIO_PIN_SWA GPIO_Pin_1 // PB.01 -#define ADC_GPIO_PIN_SWB GPIO_Pin_8 // PF.08 -#define ADC_GPIO_PIN_SWC GPIO_Pin_0 // PB.00 -#define ADC_GPIO_PIN_SWD GPIO_Pin_10 // PF.10 -#define ADC_GPIO_PIN_SWE GPIO_Pin_2 // PC.02 -#define ADC_GPIO_PIN_SWF GPIO_Pin_7 // PA.07 -#define ADC_GPIO_PIN_SWG GPIO_Pin_0 // PC.00 -#define ADC_GPIO_PIN_SWH GPIO_Pin_1 // PC.01 -#define ADC_GPIO_PIN_BATT GPIO_Pin_5 // PC.05 +#define ADC_GPIO_PIN_STICK_LH +#define ADC_GPIO_PIN_STICK_LV +#define ADC_GPIO_PIN_STICK_RV +#define ADC_GPIO_PIN_STICK_RH + +#define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_6 // PA.06 VRA +#define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_4 // PC.04 VRB +#define ADC_GPIO_PIN_SWA LL_GPIO_PIN_1 // PB.01 +#define ADC_GPIO_PIN_SWB LL_GPIO_PIN_8 // PF.08 +#define ADC_GPIO_PIN_SWC LL_GPIO_PIN_0 // PB.00 +#define ADC_GPIO_PIN_SWD LL_GPIO_PIN_10 // PF.10 +#define ADC_GPIO_PIN_SWE LL_GPIO_PIN_0 // PC.00 +#define ADC_GPIO_PIN_SWF LL_GPIO_PIN_1 // PC.01 +#define ADC_GPIO_PIN_SWG LL_GPIO_PIN_2 // PC.02 +#define ADC_GPIO_PIN_SWH LL_GPIO_PIN_7 // PA.07 + +#define ADC_GPIO_PIN_BATT LL_GPIO_PIN_5 // PC.05 // FLYSKY_HALL_STICKS -#define ADC_GPIOA_PINS_FS (GPIO_Pin_6 | GPIO_Pin_7) -#define ADC_GPIOA_PINS ADC_GPIOA_PINS_FS -#define ADC_GPIOB_PINS (GPIO_Pin_0 | GPIO_Pin_1) +// #define ADC_GPIOA_PINS_FS (GPIO_Pin_6 | GPIO_Pin_7) +#define ADC_GPIOA_PINS (ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_SWH) +#define ADC_GPIOB_PINS (ADC_GPIO_PIN_SWA | ADC_GPIO_PIN_SWC) #define ADC_GPIOC_PINS \ - (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5) -#define ADC_GPIOF_PINS (GPIO_Pin_8 | GPIO_Pin_10) + (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_SWE | ADC_GPIO_PIN_SWF | ADC_GPIO_PIN_SWG | ADC_GPIO_PIN_BATT) +#define ADC_GPIOF_PINS (ADC_GPIO_PIN_SWB | ADC_GPIO_PIN_SWD) -#define ADC_CHANNEL_STICK_LH 0 -#define ADC_CHANNEL_STICK_LV 0 -#define ADC_CHANNEL_STICK_RH 0 -#define ADC_CHANNEL_STICK_RV 0 +#define ADC_CHANNEL_STICK_LH +#define ADC_CHANNEL_STICK_LV +#define ADC_CHANNEL_STICK_RV +#define ADC_CHANNEL_STICK_RH -#define ADC_CHANNEL_POT1 ADC_Channel_6 // ADC12_IN6 -> ADC1_IN6 -#define ADC_CHANNEL_POT2 ADC_Channel_14 // ADC12_IN14 -> ADC1_IN14 -#define ADC_CHANNEL_SWA ADC_Channel_9 // ADC12_IN9 -> ADC1_IN9 -#define ADC_CHANNEL_SWB ADC_Channel_6 // ADC3_IN6 -> ADC3_IN6 -#define ADC_CHANNEL_SWC ADC_Channel_8 // ADC12_IN8 -> ADC1_IN8 -#define ADC_CHANNEL_SWD ADC_Channel_8 // ADC3_IN8 -> ADC3_IN8 -#define ADC_CHANNEL_SWE ADC_Channel_10 // ADC123_IN10-> ADC1_IN10 -#define ADC_CHANNEL_SWF ADC_Channel_11 // ADC123_IN11-> ADC1_IN11 -#define ADC_CHANNEL_SWG ADC_Channel_7 // ADC12_IN7 -> ADC1_IN7 -#define ADC_CHANNEL_SWH ADC_Channel_12 // ADC123_IN12-> ADC1_IN12 +#define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_6 // ADC12_IN6 -> ADC1_IN6 +#define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_14 // ADC12_IN14 -> ADC1_IN14 +#define ADC_CHANNEL_SWA LL_ADC_CHANNEL_9 // ADC12_IN9 -> ADC1_IN9 +#define ADC_CHANNEL_SWB LL_ADC_CHANNEL_6 // ADC3_IN6 -> ADC3_IN6 +#define ADC_CHANNEL_SWC LL_ADC_CHANNEL_8 // ADC12_IN8 -> ADC1_IN8 +#define ADC_CHANNEL_SWD LL_ADC_CHANNEL_8 // ADC3_IN8 -> ADC3_IN8 +#define ADC_CHANNEL_SWE LL_ADC_CHANNEL_10 // ADC123_IN10-> ADC1_IN10 +#define ADC_CHANNEL_SWF LL_ADC_CHANNEL_11 // ADC123_IN11-> ADC1_IN11 +#define ADC_CHANNEL_SWG LL_ADC_CHANNEL_12 // ADC123_IN12-> ADC1_IN12 +#define ADC_CHANNEL_SWH LL_ADC_CHANNEL_7 // ADC12_IN7 -> ADC1_IN7 + +#define ADC_CHANNEL_BATT LL_ADC_CHANNEL_15 // ADC12_IN15 -> ADC1_IN15 +#define ADC_CHANNEL_RTC_BAT LL_ADC_CHANNEL_VBAT // ADC1_IN18 -#define ADC_CHANNEL_BATT ADC_Channel_15 // ADC12_IN15 -> ADC1_IN15 #define ADC_MAIN ADC1 #define ADC_EXT ADC3 -#define ADC_SAMPTIME 2 +#define ADC_EXT_CHANNELS { ADC_CHANNEL_SWB, ADC_CHANNEL_SWD } +#define ADC_SAMPTIME LL_ADC_SAMPLINGTIME_28CYCLES #define ADC_DMA DMA2 -#define ADC_DMA_Channel DMA_Channel_0 -#define ADC_DMA_Stream DMA2_Stream4 -#define ADC_DMA_TC_Flag DMA_FLAG_TCIF4 +#define ADC_DMA_CHANNEL LL_DMA_CHANNEL_0 +#define ADC_DMA_STREAM LL_DMA_STREAM_4 +#define ADC_DMA_STREAM_IRQ DMA2_Stream4_IRQn +#define ADC_DMA_STREAM_IRQHandler DMA2_Stream4_IRQHandler -#define ADC_EXT_DMA_Channel DMA_Channel_2 -#define ADC_EXT_DMA_Stream DMA2_Stream0 -#define ADC_EXT_TC_Flag DMA_FLAG_TCIF0 +#define ADC_EXT_DMA DMA2 +#define ADC_EXT_DMA_CHANNEL LL_DMA_CHANNEL_2 +#define ADC_EXT_DMA_STREAM LL_DMA_STREAM_0 +#define ADC_EXT_DMA_STREAM_IRQ DMA2_Stream0_IRQn +#define ADC_EXT_DMA_STREAM_IRQHandler DMA2_Stream0_IRQHandler +#define ADC_EXT_SAMPTIME LL_ADC_SAMPLINGTIME_28CYCLES +#define ADC_VREF_PREC2 660 + +#define ADC_DIRECTION \ + { 0 /*STICK1*/, 0 /*STICK2*/, 0 /*STICK3*/, 0 /*STICK4*/, \ + -1 /*POT1*/, 0 /*POT2*/, 0 /*SWA*/, 0 /*SWB*/, 0 /*SWC*/, \ + 0 /*SWD*/, 0 /*SWE*/, -1 /*SWF*/, -1 /*SWG*/, 0 /*SWH*/, \ + 0 /*TX_VOLTAGE*/, 0 /*TX_VBAT*/ \ + } // Power #define PWR_RCC_AHB1Periph RCC_AHB1Periph_GPIOI diff --git a/radio/src/targets/nv14/keys_driver.cpp b/radio/src/targets/nv14/keys_driver.cpp deleted file mode 100644 index a6196a068..000000000 --- a/radio/src/targets/nv14/keys_driver.cpp +++ /dev/null @@ -1,171 +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 "opentx_types.h" -#include "board.h" -#include "keys.h" - -#include "hal/adc_driver.h" - -#if defined(LUA) -#include "lua/lua_api.h" -#endif - -bool trimsAsButtons = false; - -void setTrimsAsButtons(bool val) { trimsAsButtons = val; } - -bool getTrimsAsButtons() -{ - bool lua = false; -#if defined(LUA) - lua = isLuaStandaloneRunning(); -#endif - return (trimsAsButtons || lua); -} - -uint32_t readKeys() -{ - uint32_t result = 0; - -#ifndef BOOT - if (getTrimsAsButtons()) { -#endif - if (TRIMS_GPIO_REG_LHL & TRIMS_GPIO_PIN_LHL) - result |= 1 << KEY_RADIO; - if (TRIMS_GPIO_REG_LHR & TRIMS_GPIO_PIN_LHR) - result |= 1 << KEY_MODEL; - if (TRIMS_GPIO_REG_LVD & TRIMS_GPIO_PIN_LVD) - result |= 1 << KEY_TELEM; - if (TRIMS_GPIO_REG_LVU & TRIMS_GPIO_PIN_LVU) - result |= 1 << KEY_PGUP; - if (TRIMS_GPIO_REG_RVD & TRIMS_GPIO_PIN_RVD) - result |= 1 << KEY_DOWN; - if (TRIMS_GPIO_REG_RVU & TRIMS_GPIO_PIN_RVU) - result |= 1 << KEY_UP; - if (TRIMS_GPIO_REG_RHL & TRIMS_GPIO_PIN_RHL) - result |= 1 << KEY_LEFT; - if (TRIMS_GPIO_REG_RHR & TRIMS_GPIO_PIN_RHR) - result |= 1 << KEY_RIGHT; -#ifndef BOOT - } -#endif - - // Enter and Exit are always supported - if (TRIMS_GPIO_REG_RPRESS & TRIMS_GPIO_PIN_RPRESS) - result |= 1 << KEY_ENTER; - if (TRIMS_GPIO_REG_LPRESS & TRIMS_GPIO_PIN_LPRESS) - result |= 1 << KEY_EXIT; - - return result; -} - -uint32_t readTrims() -{ - uint32_t result = 0; - - if(getTrimsAsButtons()) return result; - if (TRIMS_GPIO_REG_LHL & TRIMS_GPIO_PIN_LHL) - result |= 1 << (TRM_LH_DWN - TRM_BASE); - if (TRIMS_GPIO_REG_LHR & TRIMS_GPIO_PIN_LHR) - result |= 1 << (TRM_LH_UP - TRM_BASE); - if (TRIMS_GPIO_REG_LVD & TRIMS_GPIO_PIN_LVD) - result |= 1 << (TRM_LV_DWN - TRM_BASE); - if (TRIMS_GPIO_REG_LVU & TRIMS_GPIO_PIN_LVU) - result |= 1 << (TRM_LV_UP - TRM_BASE); - if (TRIMS_GPIO_REG_RVD & TRIMS_GPIO_PIN_RVD) - result |= 1 << (TRM_RV_DWN - TRM_BASE); - if (TRIMS_GPIO_REG_RVU & TRIMS_GPIO_PIN_RVU) - result |= 1 << (TRM_RV_UP - TRM_BASE); - if (TRIMS_GPIO_REG_RHL & TRIMS_GPIO_PIN_RHL) - result |= 1 << (TRM_RH_DWN - TRM_BASE); - if (TRIMS_GPIO_REG_RHR & TRIMS_GPIO_PIN_RHR) - result |= 1 << (TRM_RH_UP - TRM_BASE); - - return result; -} - -bool trimDown(uint8_t idx) -{ - return readTrims() & (1 << idx); -} - -bool keyDown() -{ - return readKeys() || readTrims(); -} - -#if !defined(BOOT) -uint32_t switchState(uint8_t index) -{ - uint16_t value = getAnalogValue(SWITCH_FIRST + index / 3); - uint8_t position; - - if (value < 1024) - position = 0; - else if (value > 3 * 1024) - position = 2; - else - position = 1; - - return position == (index % 3); -} -#endif - -void monitorInit() -{ - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; - - GPIO_InitStructure.GPIO_Pin = VBUS_MONITOR_PIN; - GPIO_Init(GPIOJ, &GPIO_InitStructure); -} - -void keysInit() -{ - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; - - GPIO_InitStructure.GPIO_Pin = KEYS_GPIOB_PINS; - GPIO_Init(GPIOB, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = KEYS_GPIOC_PINS; - GPIO_Init(GPIOC, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = KEYS_GPIOD_PINS; - GPIO_Init(GPIOD, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = KEYS_GPIOG_PINS; - GPIO_Init(GPIOG, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = KEYS_GPIOH_PINS; - GPIO_Init(GPIOH, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = KEYS_GPIOJ_PINS; - GPIO_Init(GPIOJ, &GPIO_InitStructure); - setTrimsAsButtons(false); -} diff --git a/radio/src/targets/nv14/lcd_driver.cpp b/radio/src/targets/nv14/lcd_driver.cpp index b116b09b0..ab0ff76a2 100644 --- a/radio/src/targets/nv14/lcd_driver.cpp +++ b/radio/src/targets/nv14/lcd_driver.cpp @@ -21,7 +21,13 @@ #include "opentx_types.h" #include "libopenui_config.h" + #include "lcd.h" +#include "lcd_driver.h" + +// StdPeriph +#include "stm32f4xx_ltdc.h" +#include "stm32f4xx_dma2d.h" static volatile uint8_t _frame_addr_reloaded = 0; diff --git a/radio/src/targets/nv14/libopenui_config.h b/radio/src/targets/nv14/libopenui_config.h index b17001f81..87d05d283 100644 --- a/radio/src/targets/nv14/libopenui_config.h +++ b/radio/src/targets/nv14/libopenui_config.h @@ -138,6 +138,3 @@ constexpr LcdFlags TABLE_BODY_FONT = FONT(STD); constexpr int CJK_FIRST_LETTER_INDEX = 128 - 32 + 21; constexpr coord_t CHAR_SPACING = 0; - -// Disable rotary encoder, as the NV14 does not have one -#define ROTARY_ENCODER_SPEED() 0 diff --git a/radio/src/targets/nv14/sdram_driver.c b/radio/src/targets/nv14/sdram_driver.c index 3d933c6b3..2cc88ae84 100644 --- a/radio/src/targets/nv14/sdram_driver.c +++ b/radio/src/targets/nv14/sdram_driver.c @@ -19,6 +19,7 @@ */ #include "board.h" +#include "stm32f4xx_fmc.h" #define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000) #define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001) diff --git a/radio/src/targets/nv14/touch_driver.cpp b/radio/src/targets/nv14/touch_driver.cpp index 079ddc6fb..64333b99c 100644 --- a/radio/src/targets/nv14/touch_driver.cpp +++ b/radio/src/targets/nv14/touch_driver.cpp @@ -24,6 +24,8 @@ #include "hal.h" #include "stm32_i2c_driver.h" +#include "stm32_gpio_driver.h" + #include "timers_driver.h" #include "delays_driver.h" #include "touch_driver.h" @@ -128,21 +130,11 @@ void I2C_FreeBus() // __HAL_RCC_I2C1_RELEASE_RESET(); // } -static int _enable_gpio_clock(GPIO_TypeDef *GPIOx) -{ - if (GPIOx == GPIOB) - __HAL_RCC_GPIOB_CLK_ENABLE(); - else - return -1; - - return 0; -} - void I2C_Init() { stm32_i2c_deinit(TOUCH_I2C_BUS); - __HAL_RCC_GPIOB_CLK_ENABLE(); + stm32_gpio_enable_clock(TOUCH_GPIO); __HAL_RCC_SYSCFG_CLK_ENABLE(); __HAL_RCC_I2C1_CLK_ENABLE(); @@ -155,8 +147,8 @@ void I2C_Init() LL_GPIO_InitTypeDef gpioInit; LL_GPIO_StructInit(&gpioInit); - _enable_gpio_clock(TOUCH_RST_GPIO); - _enable_gpio_clock(TOUCH_INT_GPIO); + stm32_gpio_enable_clock(TOUCH_RST_GPIO); + stm32_gpio_enable_clock(TOUCH_INT_GPIO); gpioInit.Pin = TOUCH_RST_GPIO_PIN; gpioInit.Mode = LL_GPIO_MODE_OUTPUT; diff --git a/radio/src/targets/simu/CMakeLists.txt b/radio/src/targets/simu/CMakeLists.txt index afda4cf09..0753e4efa 100644 --- a/radio/src/targets/simu/CMakeLists.txt +++ b/radio/src/targets/simu/CMakeLists.txt @@ -11,6 +11,8 @@ set(SIMU_DRIVERS simufatfs.cpp simudisk.cpp simulcd.cpp + switch_driver.cpp + adc_driver.cpp module_drivers.cpp led_driver.cpp backlight_driver.cpp @@ -18,6 +20,19 @@ set(SIMU_DRIVERS bt_driver.cpp ) +set(HW_DESC_JSON ${FLAVOUR}.json) +AddHardwareDefTarget(${HW_DESC_JSON}) +AddHWGenTarget(${HW_DESC_JSON} simu_keys simu_keys.inc) +AddHWGenTarget(${HW_DESC_JSON} simu_switches simu_switches.inc) +AddHWGenTarget(${HW_DESC_JSON} hal_adc_inputs hal_adc_inputs.inc) + +set(SIMU_DRIVERS ${SIMU_DRIVERS} + ${CMAKE_CURRENT_BINARY_DIR}/simu_keys.inc + ${CMAKE_CURRENT_BINARY_DIR}/simu_switches.inc + ${CMAKE_CURRENT_BINARY_DIR}/hal_adc_inputs.inc + ${CMAKE_CURRENT_BINARY_DIR}/${HW_DESC_JSON} + ) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) if(SDL2_FOUND) include_directories(${SDL2_INCLUDE_DIRS}) @@ -156,7 +171,6 @@ endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS}") -use_cxx11() # ensure gnu++11 in CXX_FLAGS with CMake < 3.1 if(FOX_FOUND) add_executable(simu WIN32 diff --git a/radio/src/targets/simu/adc_driver.cpp b/radio/src/targets/simu/adc_driver.cpp new file mode 100644 index 000000000..4f046c1c1 --- /dev/null +++ b/radio/src/targets/simu/adc_driver.cpp @@ -0,0 +1,67 @@ +/* + * 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 "hal/adc_driver.h" +#include "definitions.h" + +#include "myeeprom.h" +#include "translations.h" + +#include "hal_adc_inputs.inc" +#include "board.h" + +void enableVBatBridge(){} +void disableVBatBridge(){} +bool isVBatBridgeEnabled(){ return false; } + +extern uint16_t simu_get_analog(uint8_t idx); + +static bool simu_start_conversion() +{ + int max_input = adcGetInputOffset(ADC_INPUT_VBAT); + for (int i = 0; i < max_input; i++) { + setAnalogValue(i, simu_get_analog(i)); + } + + // set VBAT / RTC_BAT + if (adcGetMaxInputs(ADC_INPUT_VBAT) > 0) { + uint32_t vbat = (BATTERY_MAX + BATTERY_MIN) / 2; + vbat = (vbat * BATTERY_DIVIDER) / 100; + setAnalogValue(adcGetInputOffset(ADC_INPUT_VBAT), vbat * 2); + } + + if (adcGetMaxInputs(ADC_INPUT_RTC_BAT) > 0) { + uint32_t rtc_bat = (300 * (2048 >> ANALOG_SCALE)) / ADC_VREF_PREC2; + setAnalogValue(adcGetInputOffset(ADC_INPUT_RTC_BAT), rtc_bat * 2); + } + + return true; +} + +extern const etx_hal_adc_driver_t simu_adc_driver; + +const etx_hal_adc_driver_t simu_adc_driver = { + .inputs = _hal_inputs, + .default_pots_cfg = _pot_default_config, + .init = nullptr, + .start_conversion = simu_start_conversion, + .wait_completion = nullptr, +}; diff --git a/radio/src/targets/simu/led_driver.cpp b/radio/src/targets/simu/led_driver.cpp index d740ea47a..ede5cc2c6 100644 --- a/radio/src/targets/simu/led_driver.cpp +++ b/radio/src/targets/simu/led_driver.cpp @@ -28,3 +28,4 @@ void ledBlue() {} void ledOff() {} void fsLedOn(uint8_t) {} void fsLedOff(uint8_t) {} +bool getFSLedState(uint8_t) { return false;} diff --git a/radio/src/targets/simu/opentxsimulator.cpp b/radio/src/targets/simu/opentxsimulator.cpp index 1e7c923c9..1001203da 100644 --- a/radio/src/targets/simu/opentxsimulator.cpp +++ b/radio/src/targets/simu/opentxsimulator.cpp @@ -22,6 +22,10 @@ #include "opentxsimulator.h" #include "opentx.h" #include "simulcd.h" +#include "switches.h" + +#include "hal/adc_driver.h" +#include "hal/rotary_encoder.h" #include #include @@ -34,7 +38,7 @@ #define ETXS_DBG qDebug() << "(" << simuTimerMicros() << "us)" -int16_t g_anas[Analogs::NUM_ANALOGS]; +int16_t g_anas[MAX_ANALOG_INPUTS]; QVector OpenTxSimulator::tracebackDevices; #if defined(HARDWARE_TOUCH) @@ -44,14 +48,9 @@ QVector OpenTxSimulator::tracebackDevices; #define TAP_TIME 25 #endif -uint16_t anaIn(uint8_t chan) +uint16_t simu_get_analog(uint8_t idx) { - return g_anas[chan]; -} - -uint16_t getAnalogValue(uint8_t index) -{ - return anaIn(index); + return g_anas[idx]; } void firmwareTraceCb(const char * text) @@ -123,9 +122,10 @@ void OpenTxSimulator::init() QMutexLocker lckr(&m_mtxSimuMain); memset(g_anas, 0, sizeof(g_anas)); -#if defined(PCBTARANIS) - g_anas[TX_RTC_VOLTAGE] = 800; // 2,34V -#endif + if (adcGetMaxInputs(ADC_INPUT_RTC_BAT) > 0) { + auto idx = adcGetInputOffset(ADC_INPUT_RTC_BAT); + setAnalogValue(idx, 800); + } simuInit(); } @@ -221,9 +221,7 @@ void OpenTxSimulator::setTrimSwitch(uint8_t trim, bool state) void OpenTxSimulator::setTrim(unsigned int idx, int value) { - unsigned i = idx; - if (i < 4) // swap axes - i = modn12x3[4 * getStickMode() + idx]; + unsigned i = inputMappingConvertMode(idx); uint8_t phase = getTrimFlightMode(getFlightMode(), i); setTrimValue(phase, i, value); } @@ -245,13 +243,14 @@ void OpenTxSimulator::setInputValue(int type, uint8_t index, int16_t value) setAnalogValue(index, value); break; case INPUT_SRC_KNOB : - setAnalogValue(index + NUM_STICKS, value); - break; case INPUT_SRC_SLIDER : - setAnalogValue(index + NUM_STICKS + NUM_POTS, value); + setAnalogValue(index + adcGetInputOffset(ADC_INPUT_POT), value); break; case INPUT_SRC_TXVIN : - setAnalogValue(Analogs::TX_VOLTAGE, voltageToAdc(value)); + if (adcGetMaxInputs(ADC_INPUT_VBAT) > 0) { + auto idx = adcGetInputOffset(ADC_INPUT_VBAT); + setAnalogValue(idx, voltageToAdc(value)); + } break; case INPUT_SRC_SWITCH : setSwitch(index, (int8_t)value); @@ -274,6 +273,7 @@ void OpenTxSimulator::setInputValue(int type, uint8_t index, int16_t value) } } +extern volatile rotenc_t rotencValue; extern volatile uint32_t rotencDt; void OpenTxSimulator::rotaryEncoderEvent(int steps) @@ -282,7 +282,7 @@ void OpenTxSimulator::rotaryEncoderEvent(int steps) static uint32_t last_tick = 0; if (steps != 0) { if (g_eeGeneral.rotEncMode >= ROTARY_ENCODER_MODE_INVERT_BOTH) steps *= -1; - ROTARY_ENCODER_NAVIGATION_VALUE += steps * ROTARY_ENCODER_GRANULARITY; + rotencValue += steps * ROTARY_ENCODER_GRANULARITY; // TODO: set rotencDt uint32_t now = RTOS_GET_MS(); uint32_t dt = now - last_tick; @@ -548,7 +548,6 @@ void OpenTxSimulator::checkOutputsChanged() qint32 tmpVal; uint8_t i, idx; const uint8_t phase = getFlightMode(); // opentx.cpp - const uint8_t mode = getStickMode(); for (i=0; i < chansDim; i++) { if (lastOutputs.chans[i] != channelOutputs[i] || m_resetOutputsData) { @@ -564,7 +563,7 @@ void OpenTxSimulator::checkOutputsChanged() } for (i=0; i < MAX_LOGICAL_SWITCHES; i++) { - tmpVal = (qint32)GET_SWITCH_BOOL(SWSRC_SW1+i); + tmpVal = (qint32)GET_SWITCH_BOOL(SWSRC_FIRST_LOGICAL_SWITCH+i); if (lastOutputs.vsw[i] != (bool)tmpVal || m_resetOutputsData) { emit virtualSwValueChange(i, tmpVal); emit outputValueChange(OUTPUT_SRC_VIRTUAL_SW, i, tmpVal); @@ -573,11 +572,7 @@ void OpenTxSimulator::checkOutputsChanged() } for (i=0; i < Board::TRIM_AXIS_COUNT; i++) { - if (i < 4) // swap axes - idx = modn12x3[4 * mode + i]; - else - idx = i; - + idx = inputMappingConvertMode(i); tmpVal = getTrimValue(getTrimFlightMode(phase, idx), idx); if (lastOutputs.trims[i] != tmpVal || m_resetOutputsData) { emit trimValueChange(i, tmpVal); diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 90b9444ac..40181e9a5 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -28,6 +28,9 @@ #include "opentx.h" #include "simulcd.h" +#include "hal/adc_driver.h" +#include "hal/rotary_encoder.h" + #include #include #include @@ -45,16 +48,20 @@ char * main_thread_error = nullptr; bool simu_shutdown = false; bool simu_running = false; -uint32_t telemetryErrors = 0; -typedef int32_t rotenc_t; volatile rotenc_t rotencValue = 0; volatile uint32_t rotencDt = 0; +rotenc_t rotaryEncoderGetValue() +{ + return rotencValue / ROTARY_ENCODER_GRANULARITY; +} + +rotenc_t rotaryEncoderGetRawValue() { return rotencValue; } + // TODO: remove all STM32 defs -GPIO_TypeDef gpioa, gpiob, gpioc, gpiod, gpioe, gpiof, gpiog, gpioh, gpioi, gpioj; -ADC_Common_TypeDef adc; -RTC_TypeDef rtc; + +extern const etx_hal_adc_driver_t simu_adc_driver; void lcdCopy(void * dest, void * src); @@ -114,9 +121,12 @@ void simuInit() #if defined(ROTARY_ENCODER_NAVIGATION) rotencValue = 0; #endif + + // Init ADC driver callback + adcInit(&simu_adc_driver); } -bool keysStates[NUM_KEYS] = { false }; +bool keysStates[MAX_KEYS] = { false }; void simuSetKey(uint8_t key, bool state) { // TRACE("simuSetKey(%d, %d)", key, state); @@ -124,7 +134,7 @@ void simuSetKey(uint8_t key, bool state) keysStates[key] = state; } -bool trimsStates[NUM_TRIMS_KEYS] = { false }; +bool trimsStates[MAX_TRIMS * 2] = { false }; void simuSetTrim(uint8_t trim, bool state) { // TRACE("simuSetTrim(%d, %d)", trim, state); @@ -132,14 +142,6 @@ void simuSetTrim(uint8_t trim, bool state) trimsStates[trim] = state; } -int8_t switchesStates[NUM_SWITCHES] = { -1 }; -void simuSetSwitch(uint8_t swtch, int8_t state) -{ - // TRACE("simuSetSwitch(%d, %d)", swtch, state); - assert(swtch < DIM(switchesStates)); - switchesStates[swtch] = state; -} - #if defined(SIMU_BOOTLOADER) int bootloaderMain(); static void* bootloaderThread(void*) @@ -206,9 +208,9 @@ void simuStart(bool tests, const char * sdPath, const char * settingsPath) try { #endif - // Init LCD call backs + // Init LCD callbacks lcdInit(); - + #if !defined(SIMU_BOOTLOADER) simuMain(); #else @@ -421,86 +423,28 @@ void lcdSetRefVolt(uint8_t val) } #endif -void telemetryPortInit(uint8_t baudrate) -{ -} - -void telemetryPortInit() -{ -} - -void sportUpdatePowerOn() -{ -} - -void sportUpdatePowerOff() -{ -} - -void sportUpdatePowerInit() -{ -} - -void telemetryPortSetDirectionInput() -{ -} - -void telemetryPortSetDirectionOutput() -{ -} - -void rxPdcUsart( void (*pChProcess)(uint8_t x) ) -{ -} - -void telemetryPortInit(uint32_t baudrate, uint8_t mode) -{ -} - -bool sportGetByte(uint8_t * byte) -{ - return false; -} - -void telemetryClearFifo() -{ -} - -void telemetryPortInvertedInit(uint32_t baudrate) -{ -} - -void sportSendByte(uint8_t byte) -{ -} - -void sportSendBuffer(const uint8_t * buffer, uint32_t count) -{ -} - -void check_telemetry_exti() -{ -} - void boardInit() { } uint32_t pwrCheck() { return simu_shutdown ? e_power_off : e_power_on; } + bool pwrPressed() { return false; } +bool pwrOffPressed() +{ +#if defined(PWR_BUTTON_PRESS) + return pwrPressed(); +#else + return !pwrPressed(); +#endif +} + void pwrInit() {} void pwrOn() {} void pwrOff() {} -bool keyDown() -{ - return readKeys(); -} - -bool trimDown(uint8_t idx) -{ - return readTrims() & (1 << idx); -} +bool UNEXPECTED_SHUTDOWN() { return false; } +void SET_POWER_REASON(uint32_t value) {} #if defined(TRIMS_EMULATE_BUTTONS) bool trimsAsButtons = false; @@ -521,7 +465,7 @@ uint32_t readKeys() { uint32_t result = 0; - for (int i = 0; i < NUM_KEYS; i++) { + for (int i = 0; i < MAX_KEYS; i++) { if (keysStates[i]) { // TRACE("key pressed %d", i); result |= 1 << i; @@ -535,7 +479,7 @@ uint32_t readTrims() { uint32_t result = 0; - for (int i=0; i 0; - default: - return state == 0; - } -} - int usbPlugged() { return false; } int getSelectedUsbMode() { return USB_JOYSTICK_MODE; } void setSelectedUsbMode(int mode) {} @@ -599,16 +529,6 @@ void serialPrintf(const char * format, ...) { } void serialCrlf() { } void serialPutc(char c) { } -uint16_t getBatteryVoltage() -{ - return (g_eeGeneral.vBatWarn * 10) + 50; // 0.5 volt above alerm (value is PREC1) -} - -uint16_t getRTCBatteryVoltage() -{ - return 300; -} - void boardOff() { } diff --git a/radio/src/targets/simu/simpgmspace.h b/radio/src/targets/simu/simpgmspace.h index d4ccd6b22..4ab1aeb55 100644 --- a/radio/src/targets/simu/simpgmspace.h +++ b/radio/src/targets/simu/simpgmspace.h @@ -22,176 +22,20 @@ #ifndef _SIMPGMSPACE_H_ #define _SIMPGMSPACE_H_ -#ifndef __GNUC__ -#include -#include -#define sleep(x) Sleep(x) -#define strcasecmp _stricmp -#define strncasecmp _tcsnicmp -#define chdir _chdir -#define getcwd _getcwd -inline int __builtin_clz(unsigned x) -{ - return (int)__lzcnt(x); -} -#else #include #define sleep(x) usleep(1000*x) -#endif -#ifdef SIMU_EXCEPTIONS -extern char * main_thread_error; -#include -#include -#include -#if defined(_MSC_VER) || !defined(__GNUC__) -#define write_backtrace(output) -#else -#include -inline void write_backtrace(char *output) -{ - void *buf[16]; - char **s; - int n = backtrace(buf, 16); - s = backtrace_symbols(buf, n); - if (s) { - for (int i=0; i -#endif - #include #include #include #include -#undef min -#undef max - -#define __REV - -extern GPIO_TypeDef gpioa, gpiob, gpioc, gpiod, gpioe, gpiof, gpiog, gpioh, gpioi, gpioj; -extern TIM_TypeDef tim1, tim2, tim3, tim4, tim5, tim6, tim7, tim8, tim9, tim10; -extern USART_TypeDef Usart0, Usart1, Usart2, Usart3, Usart4; -extern RCC_TypeDef rcc; -extern DMA_Stream_TypeDef dma1_stream0, dma1_stream1, dma1_stream2, dma1_stream3, dma1_stream4, dma1_stream5, dma1_stream6, dma1_stream7, dma2_stream1, dma2_stream2, dma2_stream5, dma2_stream6, dma2_stream7; -extern DMA_TypeDef dma2; -extern SysTick_Type systick; -extern ADC_Common_TypeDef adc; -extern RTC_TypeDef rtc; -#undef SysTick -#define SysTick (&systick) -#undef GPIOA -#undef GPIOB -#undef GPIOC -#undef GPIOD -#undef GPIOE -#undef GPIOF -#undef GPIOG -#undef GPIOH -#undef GPIOI -#undef GPIOJ -#define GPIOA (&gpioa) -#define GPIOB (&gpiob) -#define GPIOC (&gpioc) -#define GPIOD (&gpiod) -#define GPIOE (&gpioe) -#define GPIOF (&gpiof) -#define GPIOG (&gpiog) -#define GPIOH (&gpioh) -#define GPIOI (&gpioi) -#define GPIOJ (&gpioj) -#undef TIM1 -#undef TIM2 -#undef TIM3 -#undef TIM4 -#undef TIM5 -#undef TIM6 -#undef TIM7 -#undef TIM8 -#undef TIM9 -#undef TIM10 -#define TIM1 (&tim1) -#define TIM2 (&tim2) -#define TIM3 (&tim3) -#define TIM4 (&tim4) -#define TIM5 (&tim4) -#define TIM6 (&tim4) -#define TIM7 (&tim4) -#define TIM8 (&tim8) -#define TIM9 (&tim9) -#define TIM10 (&tim10) -#undef USART0 -#undef USART1 -#undef USART2 -#undef USART3 -#define USART0 (&Usart0) -#define USART1 (&Usart1) -#define USART2 (&Usart2) -#define USART3 (&Usart3) -#undef RCC -#define RCC (&rcc) -#undef DMA1_Stream0 -#undef DMA1_Stream1 -#undef DMA1_Stream2 -#undef DMA1_Stream3 -#undef DMA1_Stream4 -#undef DMA1_Stream5 -#undef DMA1_Stream7 -#undef DMA2_Stream1 -#undef DMA2_Stream2 -#undef DMA2_Stream5 -#undef DMA2_Stream6 -#undef DMA2_Stream7 -#define DMA1_Stream0 (&dma1_stream0) -#define DMA1_Stream1 (&dma1_stream1) -#define DMA1_Stream2 (&dma1_stream2) -#define DMA1_Stream3 (&dma1_stream3) -#define DMA1_Stream4 (&dma1_stream4) -#define DMA1_Stream5 (&dma1_stream5) -#define DMA1_Stream7 (&dma1_stream7) -#define DMA2_Stream1 (&dma2_stream1) -#define DMA2_Stream2 (&dma2_stream2) -#define DMA2_Stream5 (&dma2_stream5) -#define DMA2_Stream6 (&dma2_stream6) -#define DMA2_Stream7 (&dma2_stream7) -#undef DMA2 -#define DMA2 (&dma2) -#undef ADC -#define ADC (&adc) -#undef RTC -#define RTC (&rtc) +// #undef min +// #undef max extern uint8_t * eeprom; -extern void startPdcUsartReceive() ; -extern uint32_t txPdcUsart( uint8_t *buffer, uint32_t size ); -extern uint32_t txPdcPending(); -extern void rxPdcUsart( void (*pChProcess)(uint8_t x) ); -#define ISR(x, ...) void x() - -#if !defined(_MSC_VER) && defined(__GNUC__) -#define asm(...) -#endif - -extern uint32_t Master_frequency; -#define NVIC_EnableIRQ(x) -#define NVIC_DisableIRQ(x) -#define NVIC_SetPriority(...) -#define NVIC_SystemReset() exit(0) #define __disable_irq() #define __enable_irq() @@ -200,7 +44,6 @@ extern char * main_thread_error; #define OPENTX_START_DEFAULT_ARGS simu_start_mode -inline void getADC() { } uint64_t simuTimerMicros(void); uint8_t simuSleep(uint32_t ms); // returns true if thread shutdown requested @@ -228,21 +71,6 @@ void stopEepromThread(); void simuMain(); -#define UART_Stop(...) -#define UART3_Stop(...) -#define USART_GetITStatus(...) 0 -#define USART_ClearFlag(...) - -#define TIM_DeInit(...) -#define TIM_SetCompare2(...) -#define TIM_ClearFlag(...) -#define TIM_Cmd(...) -#define TIM_ITConfig(...) -#define GPIO_SetBits(GPIOx, pin) GPIOx->BSRRL |= pin -#define GPIO_ResetBits(GPIOx, pin) GPIOx->BSRRL &= ~pin -#define GPIO_ReadInputDataBit(GPIOx, pin) (GPIOx->BSRRL & pin) -#define RCC_AHB1PeriphClockCmd(...) -#define RCC_APB2PeriphClockCmd(...) // inline void delay_01us(uint32_t dummy) { } diff --git a/radio/src/targets/simu/simulcd.cpp b/radio/src/targets/simu/simulcd.cpp index acee01d2e..0fc69390c 100644 --- a/radio/src/targets/simu/simulcd.cpp +++ b/radio/src/targets/simu/simulcd.cpp @@ -289,9 +289,12 @@ void DMACopyAlphaMask(uint16_t *dest, uint16_t destw, uint16_t desth, } } +#define DMA2D_ARGB4444 ((uint32_t)0x00000004) + void DMABitmapConvert(uint16_t *dest, const uint8_t *src, uint16_t w, uint16_t h, uint32_t format) { + if (format == DMA2D_ARGB4444) { for (int row = 0; row < h; ++row) { for (int col = 0; col < w; ++col) { diff --git a/radio/src/targets/simu/switch_driver.cpp b/radio/src/targets/simu/switch_driver.cpp new file mode 100644 index 000000000..92251a05a --- /dev/null +++ b/radio/src/targets/simu/switch_driver.cpp @@ -0,0 +1,129 @@ +/* + * 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 "hal/switch_driver.h" +#include "definitions.h" +#include "myeeprom.h" + +#include +#include + +struct hw_switch_def { + const char* name; + SwitchHwType type; +}; + +#include "simu_switches.inc" + +int8_t switchesStates[n_total_switches] = { -1 }; + +void simuSetSwitch(uint8_t swtch, int8_t state) +{ + assert(swtch < n_total_switches); + switchesStates[swtch] = state; +} + +swconfig_t switchGetDefaultConfig() +{ + return _switch_default_config; +} + +switch_display_pos_t switchGetDisplayPosition(uint8_t idx) +{ + if (idx >= DIM(_switch_display)) + return {0, 0}; + + return _switch_display[idx]; +} + +uint8_t switchGetMaxSwitches() +{ + return n_switches; +} + +uint8_t getSwitchCount() +{ + int count = 0; + for (int i = 0; i < switchGetMaxSwitches(); ++i) { + if (SWITCH_EXISTS(i)) { + ++count; + } + } + return count; +} + +uint8_t switchGetMaxRow(uint8_t col) +{ + uint8_t lastrow = 0; + for (int i = 0; i < switchGetMaxSwitches(); ++i) { + if (SWITCH_EXISTS(i)) { + auto switch_display = switchGetDisplayPosition(i); + if (switch_display.col == col) + lastrow = switch_display.row > lastrow ? switch_display.row : lastrow; + } + } + return lastrow; +} + +uint8_t switchGetMaxFctSwitches() +{ + return n_fct_switches; +} + +const char* switchGetName(uint8_t idx) +{ + assert(idx < n_total_switches); + return _hw_switch_defs[idx].name; +} + +SwitchHwType switchGetHwType(uint8_t idx) +{ + assert(idx < n_total_switches); + return _hw_switch_defs[idx].type; +} + +uint32_t switchState(uint8_t pos) +{ + assert(pos < n_total_switches * 3); + + div_t qr = div(pos, 3); + int state = switchesStates[qr.quot]; + switch (qr.rem) { + case SWITCH_HW_UP: + return state < 0; + case SWITCH_HW_DOWN: + return state > 0; + default: + return state == 0; + } +} + +SwitchHwPos switchGetPosition(uint8_t idx) +{ + assert(idx < n_total_switches); + + if (switchesStates[idx] < 0) + return SWITCH_HW_UP; + else if (switchesStates[idx] == 0) + return SWITCH_HW_MID; + else + return SWITCH_HW_DOWN; +} diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 52bab732a..fdf466a94 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -18,12 +18,8 @@ if(PCB STREQUAL X9E) set(DEFAULT_INTERNAL_MODULE XJT_PXX1 CACHE STRING "Default internal module") set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(STICKS "STANDARD" CACHE STRING "Sticks type (STANDARD/HORUS)") - set(CPU_TYPE STM32F4) - set(CPU_TYPE_FULL STM32F407xE) # for size report - set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) - add_definitions(-DSTM32F40_41xxx -DSTM32F407xx) + set(CPU_TYPE_FULL STM32F407xE) set(HAPTIC YES) - set(LUA_EXPORT lua_export_x9e) set(FLAVOUR x9e) add_definitions(-DPCBX9E -DPCBX9) add_definitions(-DEEPROM_VARIANT=0x8000) @@ -49,7 +45,6 @@ if(PCB STREQUAL X9E) add_definitions(-DMANUFACTURER_FRSKY) elseif(PCB STREQUAL X9D+) set(HAPTIC YES) - set(LUA_EXPORT lua_export_x9d) add_definitions(-DPCBX9DP -DPCBX9) add_definitions(-DEEPROM_VARIANT=0) set(GUI_DIR 212x64) @@ -66,13 +61,9 @@ elseif(PCB STREQUAL X9D+) if (${PCBREV} STREQUAL 2019) set(DEFAULT_INTERNAL_MODULE ISRM_PXX2 CACHE STRING "Default internal module") set(FLAVOUR x9d+2019) - set(LUA_EXPORT lua_export_x9d+2019) - set(CPU_TYPE STM32F4) - set(CPU_TYPE_FULL STM32F407xE) # for size report - set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) + set(CPU_TYPE_FULL STM32F407xE) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") add_definitions(-DRADIO_X9DP2019) - add_definitions(-DSTM32F40_41xxx -DSTM32F407xx) add_definitions(-DSOFTWARE_VOLUME -DPWR_BUTTON_${PWR_BUTTON} -DHARDWARE_POWER_MANAGEMENT_UNIT) set(STATUS_LEDS YES) set(PXX2 ON) @@ -83,22 +74,15 @@ elseif(PCB STREQUAL X9D+) else() set(DEFAULT_INTERNAL_MODULE XJT_PXX1 CACHE STRING "Default internal module") set(FLAVOUR x9d+) - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(CPU_TYPE_FULL STM32F205xE) set(AUX_SERIAL ON) set(STATUS_LEDS NO) endif() elseif(PCB STREQUAL X9D) set(DEFAULT_INTERNAL_MODULE XJT_PXX1 CACHE STRING "Default internal module") set(FLAVOUR x9d) - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(CPU_TYPE_FULL STM32F205xE) option(HAPTIC "Haptic support" ON) # While the X9D doesn't have haptic OOTB, it can be added - set(LUA_EXPORT lua_export_x9d) add_definitions(-DPCBX9D -DPCBX9) add_definitions(-DEEPROM_VARIANT=0) set(GUI_DIR 212x64) @@ -129,11 +113,7 @@ elseif(PCB STREQUAL X7) set(INTERNAL_MODULE_SERIAL YES) set(FLAVOUR t12) set(NAVIGATION_TYPE 9x) - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) - set(LUA_EXPORT lua_export_t12) + set(CPU_TYPE_FULL STM32F205xE) add_definitions(-DRADIO_T12) add_definitions(-DRADIO_FAMILY_JUMPER_T12) add_definitions(-DEEPROM_VARIANT=0x4001) @@ -143,12 +123,8 @@ elseif(PCB STREQUAL X7) set(INTERNAL_MODULE_SERIAL YES) set(FLAVOUR tpro) set(NAVIGATION_TYPE x7) - set(CPU_TYPE STM32F2) set(ROTARY_ENCODER YES) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) - set(LUA_EXPORT lua_export_tpro) + set(CPU_TYPE_FULL STM32F205xE) add_definitions(-DFUNCTION_SWITCHES) add_definitions(-DRADIO_TPRO) add_definitions(-DEEPROM_VARIANT=0x4005) @@ -159,11 +135,7 @@ elseif(PCB STREQUAL X7) set(INTERNAL_MODULE_SERIAL YES) set(FLAVOUR tlite) set(NAVIGATION_TYPE 9x) - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) - set(LUA_EXPORT lua_export_tlite) + set(CPU_TYPE_FULL STM32F205xE) add_definitions(-DRADIO_TLITE) add_definitions(-DRADIO_FAMILY_JUMPER_T12) add_definitions(-DEEPROM_VARIANT=0x4003) @@ -174,12 +146,7 @@ elseif(PCB STREQUAL X7) set(INTERNAL_MODULE_SERIAL YES) set(FLAVOUR tlitef4) set(NAVIGATION_TYPE 9x) - set(CPU_TYPE STM32F4) set(CPU_TYPE_FULL STM32F407xE) # for size report - add_definitions(-DSTM32F407xx) - set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) - add_definitions(-DSTM32F40_41xxx -DSTM32F407xx) - set(LUA_EXPORT lua_export_tlite) add_definitions(-DRADIO_TLITE) add_definitions(-DRADIO_FAMILY_JUMPER_T12) add_definitions(-DEEPROM_VARIANT=0x4003) @@ -190,11 +157,7 @@ elseif(PCB STREQUAL X7) set(INTERNAL_MODULE_SERIAL YES) set(FLAVOUR lr3pro) set(NAVIGATION_TYPE 9x) - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) - set(LUA_EXPORT lua_export_lr3pro) + set(CPU_TYPE_FULL STM32F205xE) add_definitions(-DRADIO_LR3PRO) add_definitions(-DRADIO_FAMILY_JUMPER_T12) add_definitions(-DMANUFACTURER_BETAFPV) @@ -204,12 +167,8 @@ elseif(PCB STREQUAL X7) set(INTERNAL_MODULE_SERIAL YES) set(FLAVOUR tx12) set(NAVIGATION_TYPE x7) - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(CPU_TYPE_FULL STM32F205xE) set(ROTARY_ENCODER YES) - set(LUA_EXPORT lua_export_tx12) set(BLUETOOTH NO) set(USB_CHARGER YES) add_definitions(-DRADIO_TX12) @@ -220,13 +179,8 @@ elseif(PCB STREQUAL X7) set(INTERNAL_MODULE_SERIAL YES) set(FLAVOUR tx12mk2) set(NAVIGATION_TYPE x7) - set(CPU_TYPE STM32F4) - set(CPU_TYPE_FULL STM32F407xE) # for size report - add_definitions(-DSTM32F407xx) - set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) - add_definitions(-DSTM32F40_41xxx -DSTM32F407xx) + set(CPU_TYPE_FULL STM32F407xE) set(ROTARY_ENCODER YES) - set(LUA_EXPORT lua_export_tx12mk2) set(USB_CHARGER YES) if (NOT BLUETOOTH) set(AUX_SERIAL ON) @@ -241,13 +195,8 @@ elseif(PCB STREQUAL X7) set(INTERNAL_MODULE_SERIAL YES) set(FLAVOUR boxer) set(NAVIGATION_TYPE x7) - set(CPU_TYPE STM32F4) - set(CPU_TYPE_FULL STM32F407xE) # for size report - add_definitions(-DSTM32F407xx) - set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) - add_definitions(-DSTM32F40_41xxx -DSTM32F407xx) + set(CPU_TYPE_FULL STM32F407xE) set(ROTARY_ENCODER YES) - set(LUA_EXPORT lua_export_boxer) set(USB_CHARGER YES) add_definitions(-DRADIO_BOXER) add_definitions(-DMANUFACTURER_RADIOMASTER) @@ -262,13 +211,8 @@ elseif(PCB STREQUAL X7) set(INTERNAL_MODULE_SERIAL YES) set(FLAVOUR zorro) set(NAVIGATION_TYPE x7) - set(CPU_TYPE STM32F4) - set(CPU_TYPE_FULL STM32F407xE) # for size report - add_definitions(-DSTM32F407xx) - set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) - add_definitions(-DSTM32F40_41xxx -DSTM32F407xx) + set(CPU_TYPE_FULL STM32F407xE) set(ROTARY_ENCODER YES) - set(LUA_EXPORT lua_export_zorro) set(BLUETOOTH NO) set(USB_CHARGER YES) set(AUX_SERIAL ON) @@ -283,12 +227,8 @@ elseif(PCB STREQUAL X7) set(HARDWARE_EXTERNAL_MODULE NO) set(FLAVOUR t8) set(NAVIGATION_TYPE x7) - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(CPU_TYPE_FULL STM32F205xE) set(ROTARY_ENCODER NO) - set(LUA_EXPORT lua_export_t8) set(BLUETOOTH NO) if(RADIOMASTER_RELEASE) set(BIND_KEY YES) @@ -302,17 +242,11 @@ elseif(PCB STREQUAL X7) set(HARDWARE_EXTERNAL_MODULE YES) set(FLAVOUR commando8) set(NAVIGATION_TYPE x7) - set(CPU_TYPE STM32F4) - set(CPU_TYPE_FULL STM32F407xE) # for size report - add_definitions(-DSTM32F407xx) - set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) - add_definitions(-DSTM32F407xx -DSTM32F40_41xxx) + set(CPU_TYPE_FULL STM32F407xE) set(ROTARY_ENCODER NO) - set(LUA_EXPORT lua_export_commando8) set(BLUETOOTH NO) set(USE_RTC_CLOCK NO) add_definitions(-DRADIO_COMMANDO8) - add_definitions(-DSTICKS_PWM) add_definitions(-DMUTUALLY_EXCLUSIVE_MODULES) add_definitions(-DMANUFACTURER_IFLIGHT) elseif(PCBREV STREQUAL ACCESS) @@ -320,15 +254,11 @@ elseif(PCB STREQUAL X7) set(INTERNAL_MODULE_SERIAL YES) set(FLAVOUR x7access) set(NAVIGATION_TYPE x7) - set(CPU_TYPE STM32F4) - set(CPU_TYPE_FULL STM32F407xE) # for size report - set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) - set(LUA_EXPORT lua_export_x7access) + set(CPU_TYPE_FULL STM32F407xE) add_definitions(-DRADIO_X7ACCESS) add_definitions(-DEEPROM_VARIANT=0x4000) add_definitions(-DPCBREV=${PCBREV}) add_definitions(-DPCBX7ACCESS) - add_definitions(-DSTM32F40_41xxx -DSTM32F407xx) add_definitions(-DHARDWARE_POWER_MANAGEMENT_UNIT) set(PXX2 ON) set(PXX_FREQUENCY "HIGH") @@ -339,11 +269,7 @@ elseif(PCB STREQUAL X7) set(DEFAULT_INTERNAL_MODULE XJT_PXX1 CACHE STRING "Default internal module") set(FLAVOUR x7) set(NAVIGATION_TYPE x7) - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) - set(LUA_EXPORT lua_export_x7) + set(CPU_TYPE_FULL STM32F205xE) add_definitions(-DRADIO_X7) add_definitions(-DEEPROM_VARIANT=0x4000) set(BLUETOOTH YES) @@ -364,12 +290,8 @@ elseif(PCB STREQUAL X9LITE) set(INTERNAL_MODULE_SERIAL YES) set(PXX_FREQUENCY "HIGH") set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(CPU_TYPE_FULL STM32F205xE) set(HAPTIC YES) - set(LUA_EXPORT lua_export_x9lite) set(FLAVOUR x9lite) add_definitions(-DBOARD_NAME="x9lite") add_definitions(-DPCBX9LITE -DPCBX9 -DSOFTWARE_VOLUME -DHARDWARE_POWER_MANAGEMENT_UNIT) @@ -391,12 +313,8 @@ elseif(PCB STREQUAL X9LITES) set(INTERNAL_MODULE_SERIAL YES) set(PXX_FREQUENCY "HIGH") set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(CPU_TYPE_FULL STM32F205xE) set(HAPTIC YES) - set(LUA_EXPORT lua_export_x9lites) set(FLAVOUR x9lites) add_definitions(-DBOARD_NAME="x9lites") add_definitions(-DPCBX9LITES -DPCBX9LITE -DPCBX9 -DSOFTWARE_VOLUME -DHARDWARE_POWER_MANAGEMENT_UNIT) @@ -420,13 +338,10 @@ elseif(PCB STREQUAL XLITE) set(PXX_FREQUENCY "HIGH" CACHE STRING "PXX frequency (LOW / HIGH)") # always use HIGH except on some prototype boards set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(CPU_TYPE_FULL STM32F205xE) set(HAPTIC YES) - set(LUA_EXPORT lua_export_xlite) set(FLAVOUR xlite) - add_definitions(-DPCBXLITE -DSOFTWARE_VOLUME -DSTICKS_PWM) + add_definitions(-DPCBXLITE -DSOFTWARE_VOLUME) add_definitions(-DEEPROM_VARIANT=0x2000) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(PXX2 ON) @@ -445,14 +360,10 @@ elseif(PCB STREQUAL XLITES) set(INTERNAL_MODULE_SERIAL YES) set(PXX_FREQUENCY "HIGH") set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - add_definitions(-DSTM32F205xx) - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(CPU_TYPE_FULL STM32F205xE) set(HAPTIC YES) - set(LUA_EXPORT lua_export_xlites) set(FLAVOUR xlites) - add_definitions(-DPCBXLITES -DPCBXLITE -DSOFTWARE_VOLUME -DSTICKS_PWM -DHARDWARE_POWER_MANAGEMENT_UNIT) + add_definitions(-DPCBXLITES -DPCBXLITE -DSOFTWARE_VOLUME -DHARDWARE_POWER_MANAGEMENT_UNIT) add_definitions(-DEEPROM_VARIANT=0x1000) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(GUI_DIR 128x64) @@ -469,6 +380,24 @@ elseif(PCB STREQUAL XLITES) add_definitions(-DMANUFACTURER_FRSKY) endif() +if(CPU_TYPE_FULL STREQUAL STM32F205xE) + set(CPU_TYPE STM32F2) + add_definitions(-DSTM32F205xx) + set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) +elseif (CPU_TYPE_FULL STREQUAL STM32F407xE) + set(CPU_TYPE STM32F4) + add_definitions(-DSTM32F407xx) + add_definitions(-DSTM32F40_41xxx -DSTM32F407xx) + set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) +elseif (CPU_TYPE_FULL STREQUAL STM32F413xG) + set(CPU_TYPE STM32F4) + add_definitions(-DSTM32F413xx) + add_definitions(-DSTM32F40_41xxx -DSTM32F413xx) + set(LINKER_SCRIPT targets/taranis/stm32f413_flash.ld) +else() + message( FATAL_ERROR "Unknown CPU_TYPE_FULL" ) +endif() + if(NOT PCB STREQUAL PCBXLITE) add_definitions(-DHARDWARE_TRAINER_JACK) endif() @@ -497,17 +426,6 @@ else() # defines existing internal modules set(INTERNAL_MODULES PXX1) - set(FIRMWARE_TARGET_SRC - ${FIRMWARE_TARGET_SRC} - intmodule_pulses_driver.cpp - ) -endif() - -if(HARDWARE_EXTERNAL_MODULE) - set(FIRMWARE_SRC - ${FIRMWARE_SRC} - targets/common/arm/stm32/extmodule_driver.cpp - ) endif() if(ROTARY_ENCODER) @@ -609,13 +527,7 @@ set(FIRMWARE_SRC ${FIRMWARE_SRC} hal/adc_driver.cpp targets/common/arm/loadboot.cpp - boards/generic_stm32/module_ports.cpp - boards/generic_stm32/aux_ports.cpp - boards/generic_stm32/sport_update.cpp - boards/generic_stm32/intmodule_heartbeat.cpp - targets/common/arm/stm32/stm32_hal_adc.cpp targets/common/arm/stm32/heartbeat_driver.cpp - targets/common/arm/stm32/mixer_scheduler_driver.cpp targets/common/arm/stm32/timers_driver.cpp targets/common/arm/stm32/audio_dac_driver.cpp targets/common/arm/stm32/pwr_driver.cpp diff --git a/radio/src/targets/taranis/bind_button_driver.cpp b/radio/src/targets/taranis/bind_button_driver.cpp index a9feeb5d2..01c088d5c 100644 --- a/radio/src/targets/taranis/bind_button_driver.cpp +++ b/radio/src/targets/taranis/bind_button_driver.cpp @@ -24,8 +24,8 @@ bool setBindProtocolSelection() { - int16_t xPos = calibratedAnalogs[CONVERT_MODE(0)]; - int16_t yPos = calibratedAnalogs[CONVERT_MODE(1)]; + int16_t xPos = calibratedAnalogs[ADC_MAIN_LH]; + int16_t yPos = calibratedAnalogs[ADC_MAIN_LV]; // Center: D8 if (abs(xPos < 50 && abs(yPos) < 50)) { diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 0a63f2e45..1930458f5 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -19,6 +19,9 @@ * GNU General Public License for more details. */ +#include "hal/adc_driver.h" +#include "hal/switch_driver.h" + #include "board.h" #include "boards/generic_stm32/module_ports.h" #include "boards/generic_stm32/intmodule_heartbeat.h" @@ -28,7 +31,6 @@ #include "hal/adc_driver.h" #include "hal/module_port.h" -#include "stm32_hal_adc.h" #include "../common/arm/stm32/timers_driver.h" @@ -45,6 +47,10 @@ #include "bluetooth_driver.h" #endif +#if defined(PWM_STICKS) + #include "sticks_pwm_driver.h" +#endif + #if defined(__cplusplus) extern "C" { #endif @@ -54,12 +60,19 @@ extern "C" { } #endif -#if defined(FLYSKY_GIMBAL) - #include "flysky_gimbal_driver.h" +#if !defined(BOOT) +bool UNEXPECTED_SHUTDOWN() +{ + return WAS_RESET_BY_WATCHDOG() + || g_eeGeneral.unexpectedShutdown; +} #endif HardwareOptions hardwareOptions; +// adc_driver.cpp +extern const etx_hal_adc_driver_t _adc_driver; + void watchdogInit(unsigned int duration) { IWDG->KR = 0x5555; // Unlock registers @@ -72,7 +85,7 @@ void watchdogInit(unsigned int duration) #if !defined(BOOT) -#if defined(RADIO_TPRO) +#if defined(FUNCTION_SWITCHES) #include "storage/storage.h" #endif @@ -85,9 +98,6 @@ void boardInit() AUDIO_RCC_AHB1Periph | BACKLIGHT_RCC_AHB1Periph | ADC_RCC_AHB1Periph | -#if defined(FLYSKY_GIMBAL) - FLYSKY_HALL_RCC_AHB1Periph | -#endif SD_RCC_AHB1Periph | HAPTIC_RCC_AHB1Periph | INTMODULE_RCC_AHB1Periph | @@ -104,9 +114,6 @@ void boardInit() LCD_RCC_APB1Periph | AUDIO_RCC_APB1Periph | ADC_RCC_APB1Periph | -#if defined(FLYSKY_GIMBAL) - FLYSKY_HALL_RCC_APB1Periph | -#endif BACKLIGHT_RCC_APB1Periph | HAPTIC_RCC_APB1Periph | INTERRUPT_xMS_RCC_APB1Periph | @@ -161,9 +168,7 @@ void boardInit() #if defined(STATUS_LEDS) ledInit(); -#if defined(RADIO_T8) || defined(RADIO_COMMANDO8) || defined(RADIO_TLITE) || \ - defined(RADIO_TPRO) || defined(RADIO_TX12) || defined(RADIO_TX12MK2) || \ - defined(RADIO_ZORRO) || defined(RADIO_BOXER) +#if defined(MANUFACTURER_RADIOMASTER) || defined(MANUFACTURER_JUMPER) || defined(RADIO_COMMANDO8) ledBlue(); #else ledGreen(); @@ -171,7 +176,7 @@ void boardInit() #endif // Support for FS Led to indicate battery charge level -#if defined(RADIO_TPRO) +#if defined(FUNCTION_SWITCHES) // This is needed to prevent radio from starting when usb is plugged to charge usbInit(); // prime debounce state... @@ -179,7 +184,7 @@ void boardInit() if (usbPlugged()) { delaysInit(); - adcInit(&stm32_hal_adc_driver); + adcInit(&_adc_driver); getADC(); pwrOn(); // required to get bat adc reads storageReadRadioSettings(false); // Needed for bat calibration @@ -208,6 +213,7 @@ void boardInit() #endif keysInit(); + switchInit(); #if defined(ROTARY_ENCODER_NAVIGATION) rotaryEncoderInit(); @@ -215,22 +221,13 @@ void boardInit() delaysInit(); -#if NUM_PWMSTICKS > 0 - sticksPwmInit(); - delay_ms(20); - if (pwm_interrupt_count < 32) { - hardwareOptions.sticksPwmDisabled = true; - } +#if defined(PWM_STICKS) + sticksPwmDetect(); #endif -#if defined(FLYSKY_GIMBAL) - globalData.flyskygimbals = flysky_gimbal_init(); -#else - globalData.flyskygimbals = false; -#endif + if (!adcInit(&_adc_driver)) + TRACE("adcInit failed"); - if (!adcInit(&stm32_hal_adc_driver)) - TRACE("adcInit failed"); lcdInit(); // delaysInit() must be called before audioInit(); init2MhzTimer(); diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 6c2925eeb..2b4530fbc 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -41,7 +41,11 @@ void rotaryEncoderInit(); void rotaryEncoderCheck(); #endif -#define FLASHSIZE 0x80000 +#if defined(STM32F413xx) +#define FLASHSIZE 0x100000 // 1M +#else +#define FLASHSIZE 0x80000 // 512k +#endif #define BOOTLOADER_SIZE 0x8000 #define FIRMWARE_ADDRESS 0x08000000 @@ -133,491 +137,47 @@ uint32_t isBootloaderStart(const uint8_t * buffer); #define TRAINER_CONNECTED() true #endif -void check_telemetry_exti(); +#if defined(FUNCTION_SWITCHES) -// Keys driver -enum EnumKeys -{ -#if defined(KEYS_GPIO_REG_SHIFT) - KEY_SHIFT, -#endif +#define NUM_FUNCTIONS_SWITCHES 6 -#if defined(KEYS_GPIO_REG_MENU) - KEY_MENU, -#endif +#define DEFAULT_FS_CONFIG \ + (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_2POS << 6) + \ + (SWITCH_2POS << 4) + (SWITCH_2POS << 2) + (SWITCH_2POS << 0) - KEY_EXIT, - KEY_ENTER, +#define DEFAULT_FS_GROUPS \ + (1 << 10) + (1 << 8) + (1 << 6) + (1 << 4) + (1 << 2) + \ + (1 << 0) // Set all FS to group 1 to act like a 6pos -#if defined(KEYS_GPIO_REG_DOWN) - KEY_DOWN, - KEY_UP, -#endif +#define DEFAULT_FS_STARTUP_CONFIG \ + ((FS_START_PREVIOUS << 10) + (FS_START_PREVIOUS << 8) + \ + (FS_START_PREVIOUS << 6) + (FS_START_PREVIOUS << 4) + \ + (FS_START_PREVIOUS << 2) + \ + (FS_START_PREVIOUS << 0)) // keep last state by default -#if defined(KEYS_GPIO_REG_RIGHT) - KEY_RIGHT, - KEY_LEFT, -#endif - -#if defined(KEYS_GPIO_REG_PAGE) - KEY_PAGE, -#endif - -#if defined(KEYS_GPIO_REG_PAGEUP) - KEY_PAGEUP, -#endif - -#if defined(KEYS_GPIO_REG_PAGEDN) - KEY_PAGEDN, -#endif - -#if defined(KEYS_GPIO_REG_SYS) - KEY_SYS, -#endif - -#if defined(KEYS_GPIO_REG_MDL) - KEY_MODEL, -#endif - -#if defined(KEYS_GPIO_REG_TELE) - KEY_TELE, -#endif - -#if defined(KEYS_GPIO_REG_PLUS) - KEY_PLUS, - KEY_MINUS, -#endif - - KEY_COUNT, - KEY_MAX = KEY_COUNT - 1, - -#if defined(KEYS_GPIO_REG_BIND) - KEY_BIND, -#endif - -#if defined(ROTARY_ENCODER_NAVIGATION) - KEY_PLUS, - KEY_MINUS, -#endif - - TRM_BASE, - TRM_LH_DWN = TRM_BASE, - TRM_LH_UP, - TRM_LV_DWN, - TRM_LV_UP, - TRM_RV_DWN, - TRM_RV_UP, - TRM_RH_DWN, - TRM_RH_UP, - TRM_LAST = TRM_RH_UP, - - NUM_KEYS -}; - -#if defined(PCBX9E) && !defined(SIMU) - #define KEY_UP KEY_MINUS - #define KEY_DOWN KEY_PLUS - #define KEY_RIGHT KEY_PLUS - #define KEY_LEFT KEY_MINUS -#elif defined(NAVIGATION_XLITE) - #define KEY_PLUS KEY_RIGHT - #define KEY_MINUS KEY_LEFT -#elif defined(NAVIGATION_9X) - #define KEY_MENU KEY_ENTER - #define KEY_MINUS KEY_DOWN - #define KEY_PLUS KEY_UP #else - #define KEY_UP KEY_PLUS - #define KEY_DOWN KEY_MINUS - #define KEY_RIGHT KEY_MINUS - #define KEY_LEFT KEY_PLUS + +#define NUM_FUNCTIONS_SWITCHES 0 + #endif -#if defined(KEYS_GPIO_PIN_SHIFT) -#define IS_SHIFT_KEY(index) (index == KEY_SHIFT) -#if defined(SIMU) -#define IS_SHIFT_PRESSED() (readKeys() & (1 << KEY_SHIFT)) -#else -#define IS_SHIFT_PRESSED() (~KEYS_GPIO_REG_SHIFT & KEYS_GPIO_PIN_SHIFT) -#endif -#else -#define IS_SHIFT_KEY(index) (false) -#define IS_SHIFT_PRESSED() (false) -#endif - -enum EnumSwitches -{ - SW_SA, - SW_SB, - SW_SC, - SW_SD, - SW_SE, - SW_SF, - SW_SG, - SW_SH, - SW_SI, - SW_SJ, - SW_SK, - SW_SL, - SW_SM, - SW_SO, - SW_SP, - SW_SQ, - SW_SR, -}; -#if defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define IS_3POS(x) ((x) != SW_SA && (x) != SW_SD) -#elif defined(RADIO_BOXER) || defined(RADIO_ZORRO) - #define IS_3POS(x) ((x) == SW_SB || (x) == SW_SC) -#else - #define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH) -#endif -enum EnumSwitchesPositions -{ - SW_SA0, - SW_SA1, - SW_SA2, - SW_SB0, - SW_SB1, - SW_SB2, - SW_SC0, - SW_SC1, - SW_SC2, - SW_SD0, - SW_SD1, - SW_SD2, -#if defined(HARDWARE_SWITCH_E) - SW_SE0, - SW_SE1, - SW_SE2, -#endif -#if defined(HARDWARE_SWITCH_F) - SW_SF0, - SW_SF1, - SW_SF2, -#endif -#if defined(HARDWARE_SWITCH_G) - SW_SG0, - SW_SG1, - SW_SG2, -#endif -#if defined(HARDWARE_SWITCH_H) - SW_SH0, - SW_SH1, - SW_SH2, -#endif -#if defined(RADIO_X9DP2019) - SW_SI0, - SW_SI1, - SW_SI2, -#endif -#if defined(PCBX7ACCESS) - SW_SI0, - SW_SI1, - SW_SI2, -#elif defined(PCBX7) && !defined(RADIO_ZORRO) - SW_SI0, - SW_SI1, - SW_SI2, - SW_SJ0, - SW_SJ1, - SW_SJ2, -#endif -#if defined(PCBX9E) - SW_SI0, - SW_SI1, - SW_SI2, - SW_SJ0, - SW_SJ1, - SW_SJ2, - SW_SK0, - SW_SK1, - SW_SK2, - SW_SL0, - SW_SL1, - SW_SL2, - SW_SM0, - SW_SM1, - SW_SM2, - SW_SN0, - SW_SN1, - SW_SN2, - SW_SO0, - SW_SO1, - SW_SO2, - SW_SP0, - SW_SP1, - SW_SP2, - SW_SQ0, - SW_SQ1, - SW_SQ2, - SW_SR0, - SW_SR1, - SW_SR2, -#endif - NUM_SWITCHES_POSITIONS -}; - -#if defined(PCBXLITES) - #define NUM_SWITCHES 6 - #define STORAGE_NUM_SWITCHES NUM_SWITCHES - #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 10) + (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) - #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 2) + (POT_WITHOUT_DETENT << 0) -#elif defined(PCBXLITE) - #define NUM_SWITCHES 4 - #define STORAGE_NUM_SWITCHES 6 - #define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); - #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 2) + (POT_WITHOUT_DETENT << 0) -#elif defined(RADIO_TLITE) || defined(RADIO_LR3PRO) - #define NUM_SWITCHES 4 - #define STORAGE_NUM_SWITCHES 8 - #define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); - #define DEFAULT_POTS_CONFIG (0) -#elif defined(RADIO_TPRO) - #define NUM_SWITCHES 10 - #define NUM_FUNCTIONS_SWITCHES 6 - #define NUM_REGULAR_SWITCHES (NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES) - #define STORAGE_NUM_SWITCHES 10 - #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 6) + (SWITCH_TOGGLE << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); - #define DEFAULT_FS_CONFIG (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_2POS << 2) + (SWITCH_2POS << 0) - #define DEFAULT_FS_GROUPS (1 << 10) + (1 << 8) + (1 << 6) + (1 << 4) + (1 << 2) + (1 << 0) // Set all FS to group 1 to act like a 6pos - #define DEFAULT_FS_STARTUP_CONFIG ((FS_START_PREVIOUS << 10) + (FS_START_PREVIOUS << 8) + (FS_START_PREVIOUS << 6) + (FS_START_PREVIOUS << 4) + (FS_START_PREVIOUS << 2) + (FS_START_PREVIOUS << 0)) // keep last state by default - #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define NUM_SWITCHES 8 - #define STORAGE_NUM_SWITCHES NUM_SWITCHES - #define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) - #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITHOUT_DETENT << 2); // S1 = pot without detent, S2 = pot with detent -#elif defined(RADIO_TX12) - #define NUM_SWITCHES 8 - #define STORAGE_NUM_SWITCHES NUM_SWITCHES - #define DEFAULT_SWITCH_CONFIG (SWITCH_3POS << 10) + (SWITCH_3POS << 8) + (SWITCH_TOGGLE << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_TOGGLE << 0) - #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); -#elif defined(RADIO_TX12MK2) - #define NUM_SWITCHES 6 - #define STORAGE_NUM_SWITCHES 8 - #define DEFAULT_SWITCH_CONFIG (SWITCH_3POS << 10) + (SWITCH_3POS << 8) + (SWITCH_TOGGLE << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_TOGGLE << 0) - #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); -#elif defined(RADIO_BOXER) - #define NUM_SWITCHES 6 - #define STORAGE_NUM_SWITCHES 8 - #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 10) + (SWITCH_2POS << 8) + (SWITCH_2POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_2POS << 0) - #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2) + (POT_MULTIPOS_SWITCH << 4); -#elif defined(RADIO_ZORRO) - #define NUM_SWITCHES 8 - #define STORAGE_NUM_SWITCHES NUM_SWITCHES - #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_TOGGLE << 12) + (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_TOGGLE << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_TOGGLE << 0) - #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITHOUT_DETENT << 2); -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define NUM_SWITCHES 4 - #define STORAGE_NUM_SWITCHES 8 - #define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_2POS << 0); - #define DEFAULT_POTS_CONFIG (0) -#elif defined(PCBX7ACCESS) - #define NUM_SWITCHES 7 - #define STORAGE_NUM_SWITCHES 8 - #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) - #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent -#elif defined(PCBX7) - #define NUM_SWITCHES 8 - #define STORAGE_NUM_SWITCHES NUM_SWITCHES - #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) - #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent -#elif defined(PCBX9LITES) - #define NUM_SWITCHES 7 - #define STORAGE_NUM_SWITCHES NUM_SWITCHES - #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 12) + (SWITCH_TOGGLE << 10) + (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); - #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0); // S1 = pot with detent -#elif defined(PCBX9LITE) - #define NUM_SWITCHES 5 - #define STORAGE_NUM_SWITCHES NUM_SWITCHES - #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); - #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0); // S1 = pot with detent -#elif defined(PCBX9E) - #define NUM_SWITCHES 18 // yes, it's perfect like that ! - #define STORAGE_NUM_SWITCHES NUM_SWITCHES - #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) - #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent - #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) -#elif defined(RADIO_X9DP2019) - #define NUM_SWITCHES 9 - #define STORAGE_NUM_SWITCHES NUM_SWITCHES - #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 16) + (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); - #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent - #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) -#elif defined(PCBX9D) || defined(PCBX9DP) - #define NUM_SWITCHES 8 - #define STORAGE_NUM_SWITCHES 9 - #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) - #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent - #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) -#endif - -#if !defined(NUM_FUNCTIONS_SWITCHES) - #define NUM_FUNCTIONS_SWITCHES 0 -#endif - -#define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3) - -void keysInit(); -uint32_t switchState(uint8_t index); -uint32_t readKeys(); -uint32_t readTrims(); #if defined(FUNCTION_SWITCHES) extern uint8_t fsPreviousState; void evalFunctionSwitches(); void setFSStartupPosition(); +void fsLedOff(uint8_t); +void fsLedOn(uint8_t); uint8_t getFSLogicalState(uint8_t index); uint8_t getFSPhysicalState(uint8_t index); -#endif - -#define TRIMS_PRESSED() (readTrims()) -#define KEYS_PRESSED() (readKeys()) - -// ADC driver -enum Analogs { - STICK1, - STICK2, - STICK3, - STICK4, - POT_FIRST, - POT1 = POT_FIRST, -#if defined(PCBX9LITE) - POT_LAST = POT1, -#elif defined(RADIO_BOXER) - POT2, - POT3, - POT_LAST = POT3, -#elif defined(PCBXLITE) || defined(PCBX7) - POT2, - POT_LAST = POT2, -#elif defined(PCBX9E) - POT2, - POT3, - POT4, - POT_LAST = POT4, - SLIDER1, - SLIDER2, - SLIDER3, - SLIDER4, -#else - POT2, - POT3, - POT_LAST = POT3, - SLIDER1, - SLIDER2, -#endif - TX_VOLTAGE, - TX_RTC_VOLTAGE, - NUM_ANALOGS -}; - -#define HAS_TX_RTC_VOLTAGE - -#if defined(PCBX9LITE) - #define NUM_POTS 1 - #define NUM_SLIDERS 0 - #define STORAGE_NUM_POTS 1 - #define STORAGE_NUM_SLIDERS 0 -#elif defined(RADIO_T8) || defined(RADIO_TLITE) || defined(RADIO_COMMANDO8) || defined(RADIO_LR3PRO) - #define NUM_POTS 0 - #define NUM_SLIDERS 0 - #define STORAGE_NUM_POTS 2 - #define STORAGE_NUM_SLIDERS 0 -#elif defined(RADIO_BOXER) - #define NUM_POTS 3 // S1 + S2 + 6POS - #define NUM_SLIDERS 0 - #define STORAGE_NUM_POTS 3 - #define STORAGE_NUM_SLIDERS 0 -#elif defined(PCBXLITE) || defined(PCBX7) - #define NUM_POTS 2 - #define NUM_SLIDERS 0 - #define STORAGE_NUM_POTS 2 - #define STORAGE_NUM_SLIDERS 0 -#elif defined(PCBX9E) - #define NUM_POTS 4 - #define NUM_SLIDERS 4 - #define STORAGE_NUM_POTS 4 - #define STORAGE_NUM_SLIDERS 4 -#elif defined(PCBX9DP) - #define NUM_POTS 3 - #define NUM_SLIDERS 2 - #define STORAGE_NUM_POTS 3 - #define STORAGE_NUM_SLIDERS 2 -#else - #define NUM_POTS 3 // TODO X9D has only 2 pots - #define NUM_SLIDERS 2 - #define STORAGE_NUM_POTS 3 - #define STORAGE_NUM_SLIDERS 2 -#endif - -#define NUM_XPOTS STORAGE_NUM_POTS -#define NUM_TRIMS 4 -#define NUM_MOUSE_ANALOGS 0 -#define STORAGE_NUM_MOUSE_ANALOGS 0 - -#if defined(PCBXLITE) - #define NUM_TRIMS_KEYS 4 -#else - #define NUM_TRIMS_KEYS (NUM_TRIMS * 2) -#endif - -#if defined(STICKS_PWM) - #define NUM_PWMSTICKS 4 - #define STICKS_PWM_ENABLED() (!hardwareOptions.sticksPwmDisabled) - void sticksPwmInit(); - void sticksPwmRead(uint16_t * values); - extern volatile uint32_t pwm_interrupt_count; // TODO => reusable buffer (boot section) -#else - #define STICKS_PWM_ENABLED() false +bool getFSLedState(uint8_t index); #endif PACK(typedef struct { uint8_t pcbrev:2; - uint8_t sticksPwmDisabled:1; - uint8_t pxx2Enabled:1; }) HardwareOptions; extern HardwareOptions hardwareOptions; -#if !defined(PXX2) - #define IS_PXX2_INTERNAL_ENABLED() (false) - #define IS_PXX1_INTERNAL_ENABLED() (true) -#elif !defined(PXX1) || defined(PCBXLITES) || defined(PCBX9LITE) - #define IS_PXX2_INTERNAL_ENABLED() (true) - #define IS_PXX1_INTERNAL_ENABLED() (false) -#elif defined(INTERNAL_MODULE_PXX1) - #define IS_PXX2_INTERNAL_ENABLED() (false) - #define IS_PXX1_INTERNAL_ENABLED() (true) -#else - // TODO #define PXX2_PROBE - // TODO #define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) - #define IS_PXX2_INTERNAL_ENABLED() (true) - #define IS_PXX1_INTERNAL_ENABLED() (true) -#endif - -enum CalibratedAnalogs { - CALIBRATED_STICK1, - CALIBRATED_STICK2, - CALIBRATED_STICK3, - CALIBRATED_STICK4, - CALIBRATED_POT_FIRST, - CALIBRATED_POT_LAST = CALIBRATED_POT_FIRST + NUM_POTS - 1, - CALIBRATED_SLIDER_FIRST, - CALIBRATED_SLIDER_LAST = CALIBRATED_SLIDER_FIRST + NUM_SLIDERS - 1, - NUM_CALIBRATED_ANALOGS -}; - -#if defined(PCBX9D) - #define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT2) // POT3 is only defined in software -#else - #define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST) -#endif - -#define IS_SLIDER(x) ((x)>POT_LAST && (x)IDR - #define KEYS_GPIO_PIN_MENU GPIO_Pin_7 // PD.07 - #define KEYS_GPIO_REG_EXIT GPIOD->IDR - #define KEYS_GPIO_PIN_EXIT GPIO_Pin_2 // PD.02 - #define KEYS_GPIO_REG_PAGE GPIOD->IDR - #define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03 - #define KEYS_GPIO_REG_ENTER GPIOF->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_0 // PF.00 + #define KEYS_GPIO_REG_MENU GPIOD + #define KEYS_GPIO_PIN_MENU LL_GPIO_PIN_7 // PD.07 + #define KEYS_GPIO_REG_EXIT GPIOD + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_2 // PD.02 + #define KEYS_GPIO_REG_PAGE GPIOD + #define KEYS_GPIO_PIN_PAGE LL_GPIO_PIN_3 // PD.03 + #define KEYS_GPIO_REG_ENTER GPIOF + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_0 // PF.00 #elif defined(PCBXLITE) - #define KEYS_GPIO_REG_SHIFT GPIOE->IDR - #define KEYS_GPIO_PIN_SHIFT GPIO_Pin_8 // PE.08 - #define KEYS_GPIO_REG_EXIT GPIOE->IDR - #define KEYS_GPIO_PIN_EXIT GPIO_Pin_7 // PE.07 - #define KEYS_GPIO_REG_ENTER GPIOE->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_11 // PE.11 - #define KEYS_GPIO_REG_UP GPIOE->IDR - #define KEYS_GPIO_PIN_UP GPIO_Pin_10 // PE.10 - #define KEYS_GPIO_REG_DOWN GPIOE->IDR - #define KEYS_GPIO_PIN_DOWN GPIO_Pin_14 // PE.14 - #define KEYS_GPIO_REG_LEFT GPIOE->IDR - #define KEYS_GPIO_PIN_LEFT GPIO_Pin_12 // PE.12 - #define KEYS_GPIO_REG_RIGHT GPIOE->IDR - #define KEYS_GPIO_PIN_RIGHT GPIO_Pin_13 // PE.13 + #define KEYS_GPIO_REG_SHIFT GPIOE + #define KEYS_GPIO_PIN_SHIFT LL_GPIO_PIN_8 // PE.08 + #define KEYS_GPIO_REG_EXIT GPIOE + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_7 // PE.07 + #define KEYS_GPIO_REG_ENTER GPIOE + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_11 // PE.11 + #define KEYS_GPIO_REG_UP GPIOE + #define KEYS_GPIO_PIN_UP LL_GPIO_PIN_10 // PE.10 + #define KEYS_GPIO_REG_DOWN GPIOE + #define KEYS_GPIO_PIN_DOWN LL_GPIO_PIN_14 // PE.14 + #define KEYS_GPIO_REG_LEFT GPIOE + #define KEYS_GPIO_PIN_LEFT LL_GPIO_PIN_12 // PE.12 + #define KEYS_GPIO_REG_RIGHT GPIOE + #define KEYS_GPIO_PIN_RIGHT LL_GPIO_PIN_13 // PE.13 #elif defined(RADIO_FAMILY_JUMPER_T12) && !defined(RADIO_TPRO) - #define KEYS_GPIO_REG_EXIT GPIOD->IDR - #define KEYS_GPIO_PIN_EXIT GPIO_Pin_2 // PD.02 - #define KEYS_GPIO_REG_ENTER GPIOE->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_10 // PE.10 - #define KEYS_GPIO_REG_UP GPIOE->IDR - #define KEYS_GPIO_PIN_UP GPIO_Pin_9 // PE.09 - #define KEYS_GPIO_REG_DOWN GPIOE->IDR - #define KEYS_GPIO_PIN_DOWN GPIO_Pin_11 // PE.11 - #define KEYS_GPIO_REG_LEFT GPIOD->IDR - #define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PD.07 - #define KEYS_GPIO_REG_RIGHT GPIOD->IDR - #define KEYS_GPIO_PIN_RIGHT GPIO_Pin_3 // PD.03 + #define KEYS_GPIO_REG_EXIT GPIOD + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_2 // PD.02 + #define KEYS_GPIO_REG_ENTER GPIOE + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_10 // PE.10 + #define KEYS_GPIO_REG_UP GPIOE + #define KEYS_GPIO_PIN_UP LL_GPIO_PIN_9 // PE.09 + #define KEYS_GPIO_REG_DOWN GPIOE + #define KEYS_GPIO_PIN_DOWN LL_GPIO_PIN_11 // PE.11 + #define KEYS_GPIO_REG_LEFT GPIOD + #define KEYS_GPIO_PIN_LEFT LL_GPIO_PIN_7 // PD.07 + #define KEYS_GPIO_REG_RIGHT GPIOD + #define KEYS_GPIO_PIN_RIGHT LL_GPIO_PIN_3 // PD.03 #elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) - #define KEYS_GPIO_REG_PAGEUP GPIOD->IDR - #define KEYS_GPIO_PIN_PAGEUP GPIO_Pin_3 // PD.03 - #define KEYS_GPIO_REG_PAGEDN GPIOD->IDR - #define KEYS_GPIO_PIN_PAGEDN GPIO_Pin_7 // PD.07 + #define KEYS_GPIO_REG_PAGEUP GPIOD + #define KEYS_GPIO_PIN_PAGEUP LL_GPIO_PIN_3 // PD.03 + #define KEYS_GPIO_REG_PAGEDN GPIOD + #define KEYS_GPIO_PIN_PAGEDN LL_GPIO_PIN_7 // PD.07 #if defined(RADIO_TX12) - #define KEYS_GPIO_REG_EXIT GPIOB->IDR - #define KEYS_GPIO_PIN_EXIT GPIO_Pin_3 // PB.03 + #define KEYS_GPIO_REG_EXIT GPIOB + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_3 // PB.03 #else - #define KEYS_GPIO_REG_EXIT GPIOC->IDR - #define KEYS_GPIO_PIN_EXIT GPIO_Pin_5 // PC.05 + #define KEYS_GPIO_REG_EXIT GPIOC + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_5 // PC.05 #endif #if defined(RADIO_TX12MK2) || defined(RADIO_BOXER) - #define KEYS_GPIO_REG_ENTER GPIOA->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_10 // PA.10 + #define KEYS_GPIO_REG_ENTER GPIOA + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_10 // PA.10 #else - #define KEYS_GPIO_REG_ENTER GPIOA->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_13 // PA.13 + #define KEYS_GPIO_REG_ENTER GPIOA + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_13 // PA.13 #endif - #define KEYS_GPIO_REG_SYS GPIOB->IDR - #define KEYS_GPIO_PIN_SYS GPIO_Pin_4 // PB.04 - #define KEYS_GPIO_REG_MDL GPIOE->IDR - #define KEYS_GPIO_PIN_MDL GPIO_Pin_11 // PE.11 - #define KEYS_GPIO_REG_TELE GPIOD->IDR - #define KEYS_GPIO_PIN_TELE GPIO_Pin_2 // PD.02 + #define KEYS_GPIO_REG_SYS GPIOB + #define KEYS_GPIO_PIN_SYS LL_GPIO_PIN_4 // PB.04 + #define KEYS_GPIO_REG_MDL GPIOE + #define KEYS_GPIO_PIN_MDL LL_GPIO_PIN_11 // PE.11 + #define KEYS_GPIO_REG_TELE GPIOD + #define KEYS_GPIO_PIN_TELE LL_GPIO_PIN_2 // PD.02 #elif defined(RADIO_T8) - #define KEYS_GPIO_REG_PAGEUP GPIOD->IDR - #define KEYS_GPIO_PIN_PAGEUP GPIO_Pin_3 // PD.03 - #define KEYS_GPIO_REG_PAGEDN GPIOD->IDR - #define KEYS_GPIO_PIN_PAGEDN GPIO_Pin_7 // PD.07 - #define KEYS_GPIO_REG_EXIT GPIOB->IDR - #define KEYS_GPIO_PIN_EXIT GPIO_Pin_3 // PB.03 - #define KEYS_GPIO_REG_ENTER GPIOA->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_13 // PA.13 - #define KEYS_GPIO_REG_SYS GPIOB->IDR - #define KEYS_GPIO_PIN_SYS GPIO_Pin_4 // PB.04 - #define KEYS_GPIO_REG_MDL GPIOE->IDR - #define KEYS_GPIO_PIN_MDL GPIO_Pin_11 // PE.11 - #define KEYS_GPIO_REG_PLUS GPIOE->IDR - #define KEYS_GPIO_PIN_PLUS GPIO_Pin_9 // PE.09 - #define KEYS_GPIO_REG_MINUS GPIOE->IDR - #define KEYS_GPIO_PIN_MINUS GPIO_Pin_10 // PE.10 - #define KEYS_GPIO_REG_BIND GPIOA->IDR - #define KEYS_GPIO_PIN_BIND GPIO_Pin_10 // PA.10 + #define KEYS_GPIO_REG_PAGEUP GPIOD + #define KEYS_GPIO_PIN_PAGEUP LL_GPIO_PIN_3 // PD.03 + #define KEYS_GPIO_REG_PAGEDN GPIOD + #define KEYS_GPIO_PIN_PAGEDN LL_GPIO_PIN_7 // PD.07 + #define KEYS_GPIO_REG_EXIT GPIOB + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_3 // PB.03 + #define KEYS_GPIO_REG_ENTER GPIOA + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_13 // PA.13 + #define KEYS_GPIO_REG_SYS GPIOB + #define KEYS_GPIO_PIN_SYS LL_GPIO_PIN_4 // PB.04 + #define KEYS_GPIO_REG_MDL GPIOE + #define KEYS_GPIO_PIN_MDL LL_GPIO_PIN_11 // PE.11 + #define KEYS_GPIO_REG_PLUS GPIOE + #define KEYS_GPIO_PIN_PLUS LL_GPIO_PIN_9 // PE.09 + #define KEYS_GPIO_REG_MINUS GPIOE + #define KEYS_GPIO_PIN_MINUS LL_GPIO_PIN_10 // PE.10 + #define KEYS_GPIO_REG_BIND GPIOA + #define KEYS_GPIO_PIN_BIND LL_GPIO_PIN_10 // PA.10 #elif defined(RADIO_COMMANDO8) - #define KEYS_GPIO_REG_PAGEUP GPIOE->IDR - #define KEYS_GPIO_PIN_PAGEUP GPIO_Pin_11 // PE.11 - #define KEYS_GPIO_REG_PAGEDN GPIOE->IDR - #define KEYS_GPIO_PIN_PAGEDN GPIO_Pin_13 // PE.13 - #define KEYS_GPIO_REG_EXIT GPIOD->IDR - #define KEYS_GPIO_PIN_EXIT GPIO_Pin_2 // PD.02 - #define KEYS_GPIO_REG_ENTER GPIOE->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_10 // PE.10 - #define KEYS_GPIO_REG_SYS GPIOD->IDR - #define KEYS_GPIO_PIN_SYS GPIO_Pin_1 // PD.01 - #define KEYS_GPIO_REG_MDL GPIOD->IDR - #define KEYS_GPIO_PIN_MDL GPIO_Pin_0 // PD.00 - #define KEYS_GPIO_REG_PLUS GPIOE->IDR - #define KEYS_GPIO_PIN_PLUS GPIO_Pin_12 // PE.12 - #define KEYS_GPIO_REG_MINUS GPIOE->IDR - #define KEYS_GPIO_PIN_MINUS GPIO_Pin_14 // PE.14 - #define KEYS_GPIO_REG_BIND GPIOD->IDR - #define KEYS_GPIO_PIN_BIND GPIO_Pin_9 // PD.09 + #define KEYS_GPIO_REG_PAGEUP GPIOE + #define KEYS_GPIO_PIN_PAGEUP LL_GPIO_PIN_11 // PE.11 + #define KEYS_GPIO_REG_PAGEDN GPIOE + #define KEYS_GPIO_PIN_PAGEDN LL_GPIO_PIN_13 // PE.13 + #define KEYS_GPIO_REG_EXIT GPIOD + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_2 // PD.02 + #define KEYS_GPIO_REG_ENTER GPIOE + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_10 // PE.10 + #define KEYS_GPIO_REG_SYS GPIOD + #define KEYS_GPIO_PIN_SYS LL_GPIO_PIN_1 // PD.01 + #define KEYS_GPIO_REG_MDL GPIOD + #define KEYS_GPIO_PIN_MDL LL_GPIO_PIN_0 // PD.00 + #define KEYS_GPIO_REG_PLUS GPIOE + #define KEYS_GPIO_PIN_PLUS LL_GPIO_PIN_12 // PE.12 + #define KEYS_GPIO_REG_MINUS GPIOE + #define KEYS_GPIO_PIN_MINUS LL_GPIO_PIN_14 // PE.14 + #define KEYS_GPIO_REG_BIND GPIOD + #define KEYS_GPIO_PIN_BIND LL_GPIO_PIN_9 // PD.09 #elif defined(PCBX7) - #define KEYS_GPIO_REG_PAGE GPIOD->IDR - #define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03 - #define KEYS_GPIO_REG_MENU GPIOD->IDR - #define KEYS_GPIO_PIN_MENU GPIO_Pin_7 // PD.07 - #define KEYS_GPIO_REG_EXIT GPIOD->IDR - #define KEYS_GPIO_PIN_EXIT GPIO_Pin_2 // PD.02 - #define KEYS_GPIO_REG_ENTER GPIOE->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_10 // PE.10 + #define KEYS_GPIO_REG_PAGE GPIOD + #define KEYS_GPIO_PIN_PAGE LL_GPIO_PIN_3 // PD.03 + #define KEYS_GPIO_REG_MENU GPIOD + #define KEYS_GPIO_PIN_MENU LL_GPIO_PIN_7 // PD.07 + #define KEYS_GPIO_REG_EXIT GPIOD + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_2 // PD.02 + #define KEYS_GPIO_REG_ENTER GPIOE + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_10 // PE.10 #elif defined(PCBX9LITE) - #define KEYS_GPIO_REG_PAGE GPIOE->IDR - #define KEYS_GPIO_PIN_PAGE GPIO_Pin_8 // PE.08 - #define KEYS_GPIO_REG_MENU GPIOE->IDR - #define KEYS_GPIO_PIN_MENU GPIO_Pin_7 // PE.07 - #define KEYS_GPIO_REG_EXIT GPIOE->IDR - #define KEYS_GPIO_PIN_EXIT GPIO_Pin_9 // PE.09 - #define KEYS_GPIO_REG_ENTER GPIOE->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_11 // PE.11 + #define KEYS_GPIO_REG_PAGE GPIOE + #define KEYS_GPIO_PIN_PAGE LL_GPIO_PIN_8 // PE.08 + #define KEYS_GPIO_REG_MENU GPIOE + #define KEYS_GPIO_PIN_MENU LL_GPIO_PIN_7 // PE.07 + #define KEYS_GPIO_REG_EXIT GPIOE + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_9 // PE.09 + #define KEYS_GPIO_REG_ENTER GPIOE + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_11 // PE.11 #elif defined(RADIO_X9DP2019) - #define KEYS_GPIO_REG_MENU GPIOD->IDR - #define KEYS_GPIO_PIN_MENU GPIO_Pin_2 // PD.02 - #define KEYS_GPIO_REG_EXIT GPIOD->IDR - #define KEYS_GPIO_PIN_EXIT GPIO_Pin_7 // PD.07 - #define KEYS_GPIO_REG_PAGE GPIOD->IDR - #define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03 - #define KEYS_GPIO_REG_ENTER GPIOE->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_12 // PE.12 + #define KEYS_GPIO_REG_MENU GPIOD + #define KEYS_GPIO_PIN_MENU LL_GPIO_PIN_2 // PD.02 + #define KEYS_GPIO_REG_EXIT GPIOD + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_7 // PD.07 + #define KEYS_GPIO_REG_PAGE GPIOD + #define KEYS_GPIO_PIN_PAGE LL_GPIO_PIN_3 // PD.03 + #define KEYS_GPIO_REG_ENTER GPIOE + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_12 // PE.12 #else - #define KEYS_GPIO_REG_MENU GPIOD->IDR - #define KEYS_GPIO_PIN_MENU GPIO_Pin_7 // PD.07 - #define KEYS_GPIO_REG_EXIT GPIOD->IDR - #define KEYS_GPIO_PIN_EXIT GPIO_Pin_2 // PD.02 - #define KEYS_GPIO_REG_PAGE GPIOD->IDR - #define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03 - #define KEYS_GPIO_REG_PLUS GPIOE->IDR - #define KEYS_GPIO_PIN_PLUS GPIO_Pin_10 // PE.10 - #define KEYS_GPIO_REG_MINUS GPIOE->IDR - #define KEYS_GPIO_PIN_MINUS GPIO_Pin_11 // PE.11 - #define KEYS_GPIO_REG_ENTER GPIOE->IDR - #define KEYS_GPIO_PIN_ENTER GPIO_Pin_12 // PE.12 + #define KEYS_GPIO_REG_MENU GPIOD + #define KEYS_GPIO_PIN_MENU LL_GPIO_PIN_7 // PD.07 + #define KEYS_GPIO_REG_EXIT GPIOD + #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_2 // PD.02 + #define KEYS_GPIO_REG_PAGE GPIOD + #define KEYS_GPIO_PIN_PAGE LL_GPIO_PIN_3 // PD.03 + #define KEYS_GPIO_REG_PLUS GPIOE + #define KEYS_GPIO_PIN_PLUS LL_GPIO_PIN_10 // PE.10 + #define KEYS_GPIO_REG_MINUS GPIOE + #define KEYS_GPIO_PIN_MINUS LL_GPIO_PIN_11 // PE.11 + #define KEYS_GPIO_REG_ENTER GPIOE + #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_12 // PE.12 #endif // Rotary Encoder @@ -291,133 +301,133 @@ // Trims #if defined(PCBX9E) - #define TRIMS_GPIO_REG_LHL GPIOG->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_1 // PG.01 - #define TRIMS_GPIO_REG_LHR GPIOG->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_0 // PG.00 - #define TRIMS_GPIO_REG_LVD GPIOE->IDR - #define TRIMS_GPIO_PIN_LVD GPIO_Pin_4 // PE.04 - #define TRIMS_GPIO_REG_LVU GPIOE->IDR - #define TRIMS_GPIO_PIN_LVU GPIO_Pin_3 // PE.03 - #define TRIMS_GPIO_REG_RVD GPIOC->IDR - #define TRIMS_GPIO_PIN_RVD GPIO_Pin_3 // PC.03 - #define TRIMS_GPIO_REG_RHL GPIOC->IDR - #define TRIMS_GPIO_PIN_RHL GPIO_Pin_1 // PC.01 - #define TRIMS_GPIO_REG_RVU GPIOC->IDR - #define TRIMS_GPIO_PIN_RVU GPIO_Pin_2 // PC.02 - #define TRIMS_GPIO_REG_RHR GPIOC->IDR - #define TRIMS_GPIO_PIN_RHR GPIO_Pin_13 // PC.13 + #define TRIMS_GPIO_REG_LHL GPIOG + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_1 // PG.01 + #define TRIMS_GPIO_REG_LHR GPIOG + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_0 // PG.00 + #define TRIMS_GPIO_REG_LVD GPIOE + #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_4 // PE.04 + #define TRIMS_GPIO_REG_LVU GPIOE + #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_3 // PE.03 + #define TRIMS_GPIO_REG_RVD GPIOC + #define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_3 // PC.03 + #define TRIMS_GPIO_REG_RHL GPIOC + #define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_1 // PC.01 + #define TRIMS_GPIO_REG_RVU GPIOC + #define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_2 // PC.02 + #define TRIMS_GPIO_REG_RHR GPIOC + #define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_13 // PC.13 #elif defined(PCBXLITE) - #define TRIMS_GPIO_REG_LHL GPIOC->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_4 // PC.04 - #define TRIMS_GPIO_REG_LHR GPIOC->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_5 // PC.05 - #define TRIMS_GPIO_REG_LVU GPIOB->IDR - #define TRIMS_GPIO_PIN_LVU GPIO_Pin_0 // PB.00 - #define TRIMS_GPIO_REG_LVD GPIOB->IDR - #define TRIMS_GPIO_PIN_LVD GPIO_Pin_1 // PB.01 + #define TRIMS_GPIO_REG_LHL GPIOC + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_4 // PC.04 + #define TRIMS_GPIO_REG_LHR GPIOC + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_5 // PC.05 + #define TRIMS_GPIO_REG_LVU GPIOB + #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_0 // PB.00 + #define TRIMS_GPIO_REG_LVD GPIOB + #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_1 // PB.01 #elif defined(RADIO_X7ACCESS) - #define TRIMS_GPIO_REG_LHR GPIOD->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_15 // PD.15 - #define TRIMS_GPIO_REG_LHL GPIOC->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_1 // PC.01 - #define TRIMS_GPIO_REG_LVD GPIOE->IDR - #define TRIMS_GPIO_PIN_LVD GPIO_Pin_6 // PE.06 - #define TRIMS_GPIO_REG_LVU GPIOE->IDR - #define TRIMS_GPIO_PIN_LVU GPIO_Pin_5 // PE.05 - #define TRIMS_GPIO_REG_RVD GPIOC->IDR - #define TRIMS_GPIO_PIN_RVD GPIO_Pin_3 // PC.03 - #define TRIMS_GPIO_REG_RHR GPIOE->IDR - #define TRIMS_GPIO_PIN_RHR GPIO_Pin_3 // PE.03 - #define TRIMS_GPIO_REG_RVU GPIOC->IDR - #define TRIMS_GPIO_PIN_RVU GPIO_Pin_2 // PC.02 - #define TRIMS_GPIO_REG_RHL GPIOE->IDR - #define TRIMS_GPIO_PIN_RHL GPIO_Pin_4 // PE.04 + #define TRIMS_GPIO_REG_LHR GPIOD + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_15 // PD.15 + #define TRIMS_GPIO_REG_LHL GPIOC + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_1 // PC.01 + #define TRIMS_GPIO_REG_LVD GPIOE + #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_6 // PE.06 + #define TRIMS_GPIO_REG_LVU GPIOE + #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_5 // PE.05 + #define TRIMS_GPIO_REG_RVD GPIOC + #define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_3 // PC.03 + #define TRIMS_GPIO_REG_RHR GPIOE + #define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_3 // PE.03 + #define TRIMS_GPIO_REG_RVU GPIOC + #define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_2 // PC.02 + #define TRIMS_GPIO_REG_RHL GPIOE + #define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_4 // PE.04 #elif defined(PCBX7) && !defined(RADIO_COMMANDO8) - #define TRIMS_GPIO_REG_LHL GPIOD->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_15 // PD.15 - #define TRIMS_GPIO_REG_LHR GPIOC->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_1 // PC.01 - #define TRIMS_GPIO_REG_LVD GPIOE->IDR - #define TRIMS_GPIO_PIN_LVD GPIO_Pin_6 // PE.06 - #define TRIMS_GPIO_REG_LVU GPIOE->IDR - #define TRIMS_GPIO_PIN_LVU GPIO_Pin_5 // PE.05 - #define TRIMS_GPIO_REG_RVD GPIOC->IDR - #define TRIMS_GPIO_PIN_RVD GPIO_Pin_3 // PC.03 - #define TRIMS_GPIO_REG_RHL GPIOE->IDR - #define TRIMS_GPIO_PIN_RHL GPIO_Pin_3 // PE.03 - #define TRIMS_GPIO_REG_RVU GPIOC->IDR - #define TRIMS_GPIO_PIN_RVU GPIO_Pin_2 // PC.02 - #define TRIMS_GPIO_REG_RHR GPIOE->IDR - #define TRIMS_GPIO_PIN_RHR GPIO_Pin_4 // PE.04 + #define TRIMS_GPIO_REG_LHL GPIOD + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_15 // PD.15 + #define TRIMS_GPIO_REG_LHR GPIOC + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_1 // PC.01 + #define TRIMS_GPIO_REG_LVD GPIOE + #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_6 // PE.06 + #define TRIMS_GPIO_REG_LVU GPIOE + #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_5 // PE.05 + #define TRIMS_GPIO_REG_RVD GPIOC + #define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_3 // PC.03 + #define TRIMS_GPIO_REG_RHL GPIOE + #define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_3 // PE.03 + #define TRIMS_GPIO_REG_RVU GPIOC + #define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_2 // PC.02 + #define TRIMS_GPIO_REG_RHR GPIOE + #define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_4 // PE.04 #elif defined(PCBX7) && defined(RADIO_COMMANDO8) - #define TRIMS_GPIO_REG_LHL GPIOD->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_15 // PD.15 - #define TRIMS_GPIO_REG_LHR GPIOC->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_6 // PC.06 - #define TRIMS_GPIO_REG_LVD GPIOE->IDR - #define TRIMS_GPIO_PIN_LVD GPIO_Pin_6 // PE.06 - #define TRIMS_GPIO_REG_LVU GPIOE->IDR - #define TRIMS_GPIO_PIN_LVU GPIO_Pin_1 // PE.01 - #define TRIMS_GPIO_REG_RVD GPIOC->IDR - #define TRIMS_GPIO_PIN_RVD GPIO_Pin_3 // PC.03 - #define TRIMS_GPIO_REG_RHL GPIOE->IDR - #define TRIMS_GPIO_PIN_RHL GPIO_Pin_0 // PE.00 - #define TRIMS_GPIO_REG_RVU GPIOC->IDR - #define TRIMS_GPIO_PIN_RVU GPIO_Pin_7 // PC.07 - #define TRIMS_GPIO_REG_RHR GPIOE->IDR - #define TRIMS_GPIO_PIN_RHR GPIO_Pin_15 // PE.15 + #define TRIMS_GPIO_REG_LHL GPIOD + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_15 // PD.15 + #define TRIMS_GPIO_REG_LHR GPIOC + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_6 // PC.06 + #define TRIMS_GPIO_REG_LVD GPIOE + #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_6 // PE.06 + #define TRIMS_GPIO_REG_LVU GPIOE + #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_1 // PE.01 + #define TRIMS_GPIO_REG_RVD GPIOC + #define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_3 // PC.03 + #define TRIMS_GPIO_REG_RHL GPIOE + #define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_0 // PE.00 + #define TRIMS_GPIO_REG_RVU GPIOC + #define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_7 // PC.07 + #define TRIMS_GPIO_REG_RHR GPIOE + #define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_15 // PE.15 #elif defined(PCBX9LITE) - #define TRIMS_GPIO_REG_LHR GPIOC->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_4 // PC.04 - #define TRIMS_GPIO_REG_LHL GPIOC->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_5 // PC.05 - #define TRIMS_GPIO_REG_LVU GPIOB->IDR - #define TRIMS_GPIO_PIN_LVU GPIO_Pin_0 // PB.00 - #define TRIMS_GPIO_REG_LVD GPIOB->IDR - #define TRIMS_GPIO_PIN_LVD GPIO_Pin_1 // PB.01 - #define TRIMS_GPIO_REG_RVU GPIOE->IDR - #define TRIMS_GPIO_PIN_RVU GPIO_Pin_13 // PE.13 - #define TRIMS_GPIO_REG_RHR GPIOD->IDR - #define TRIMS_GPIO_PIN_RHR GPIO_Pin_8 // PD.08 - #define TRIMS_GPIO_REG_RVD GPIOE->IDR - #define TRIMS_GPIO_PIN_RVD GPIO_Pin_14 // PE.14 - #define TRIMS_GPIO_REG_RHL GPIOD->IDR - #define TRIMS_GPIO_PIN_RHL GPIO_Pin_9 // PD.09 + #define TRIMS_GPIO_REG_LHR GPIOC + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_4 // PC.04 + #define TRIMS_GPIO_REG_LHL GPIOC + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_5 // PC.05 + #define TRIMS_GPIO_REG_LVU GPIOB + #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_0 // PB.00 + #define TRIMS_GPIO_REG_LVD GPIOB + #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_1 // PB.01 + #define TRIMS_GPIO_REG_RVU GPIOE + #define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_13 // PE.13 + #define TRIMS_GPIO_REG_RHR GPIOD + #define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_8 // PD.08 + #define TRIMS_GPIO_REG_RVD GPIOE + #define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_14 // PE.14 + #define TRIMS_GPIO_REG_RHL GPIOD + #define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_9 // PD.09 #elif defined(RADIO_X9DP2019) - #define TRIMS_GPIO_REG_LHL GPIOE->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_3 // PE.03 - #define TRIMS_GPIO_REG_LHR GPIOE->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_4 // PE.04 - #define TRIMS_GPIO_REG_LVD GPIOE->IDR - #define TRIMS_GPIO_PIN_LVD GPIO_Pin_6 // PE.06 - #define TRIMS_GPIO_REG_LVU GPIOE->IDR - #define TRIMS_GPIO_PIN_LVU GPIO_Pin_5 // PE.05 - #define TRIMS_GPIO_REG_RVD GPIOC->IDR - #define TRIMS_GPIO_PIN_RVD GPIO_Pin_3 // PC.03 - #define TRIMS_GPIO_REG_RVU GPIOC->IDR - #define TRIMS_GPIO_PIN_RVU GPIO_Pin_2 // PC.02 - #define TRIMS_GPIO_REG_RHL GPIOC->IDR - #define TRIMS_GPIO_PIN_RHL GPIO_Pin_13 // PC.13 - #define TRIMS_GPIO_REG_RHR GPIOC->IDR - #define TRIMS_GPIO_PIN_RHR GPIO_Pin_1 // PC.01 + #define TRIMS_GPIO_REG_LHL GPIOE + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_3 // PE.03 + #define TRIMS_GPIO_REG_LHR GPIOE + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_4 // PE.04 + #define TRIMS_GPIO_REG_LVD GPIOE + #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_6 // PE.06 + #define TRIMS_GPIO_REG_LVU GPIOE + #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_5 // PE.05 + #define TRIMS_GPIO_REG_RVD GPIOC + #define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_3 // PC.03 + #define TRIMS_GPIO_REG_RVU GPIOC + #define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_2 // PC.02 + #define TRIMS_GPIO_REG_RHL GPIOC + #define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_13 // PC.13 + #define TRIMS_GPIO_REG_RHR GPIOC + #define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_1 // PC.01 #else - #define TRIMS_GPIO_REG_LHL GPIOE->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_4 // PE.04 - #define TRIMS_GPIO_REG_LHR GPIOE->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_3 // PE.03 - #define TRIMS_GPIO_REG_LVD GPIOE->IDR - #define TRIMS_GPIO_PIN_LVD GPIO_Pin_6 // PE.06 - #define TRIMS_GPIO_REG_LVU GPIOE->IDR - #define TRIMS_GPIO_PIN_LVU GPIO_Pin_5 // PE.05 - #define TRIMS_GPIO_REG_RVD GPIOC->IDR - #define TRIMS_GPIO_PIN_RVD GPIO_Pin_3 // PC.03 - #define TRIMS_GPIO_REG_RHL GPIOC->IDR - #define TRIMS_GPIO_PIN_RHL GPIO_Pin_1 // PC.01 - #define TRIMS_GPIO_REG_RVU GPIOC->IDR - #define TRIMS_GPIO_PIN_RVU GPIO_Pin_2 // PC.02 - #define TRIMS_GPIO_REG_RHR GPIOC->IDR - #define TRIMS_GPIO_PIN_RHR GPIO_Pin_13 // PC.13 + #define TRIMS_GPIO_REG_LHL GPIOE + #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_4 // PE.04 + #define TRIMS_GPIO_REG_LHR GPIOE + #define TRIMS_GPIO_PIN_LHR LL_GPIO_PIN_3 // PE.03 + #define TRIMS_GPIO_REG_LVD GPIOE + #define TRIMS_GPIO_PIN_LVD LL_GPIO_PIN_6 // PE.06 + #define TRIMS_GPIO_REG_LVU GPIOE + #define TRIMS_GPIO_PIN_LVU LL_GPIO_PIN_5 // PE.05 + #define TRIMS_GPIO_REG_RVD GPIOC + #define TRIMS_GPIO_PIN_RVD LL_GPIO_PIN_3 // PC.03 + #define TRIMS_GPIO_REG_RHL GPIOC + #define TRIMS_GPIO_PIN_RHL LL_GPIO_PIN_1 // PC.01 + #define TRIMS_GPIO_REG_RVU GPIOC + #define TRIMS_GPIO_PIN_RVU LL_GPIO_PIN_2 // PC.02 + #define TRIMS_GPIO_REG_RHR GPIOC + #define TRIMS_GPIO_PIN_RHR LL_GPIO_PIN_13 // PC.13 #endif // Switches @@ -425,377 +435,379 @@ #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A #define HARDWARE_SWITCH_A - #define SWITCHES_GPIO_REG_A_H GPIOD->IDR - #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_10 // PD.10 - #define SWITCHES_GPIO_REG_A_L GPIOD->IDR - #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_14 // PD.14 + #define SWITCHES_GPIO_REG_A_H GPIOD + #define SWITCHES_GPIO_PIN_A_H LL_GPIO_PIN_10 // PD.10 + #define SWITCHES_GPIO_REG_A_L GPIOD + #define SWITCHES_GPIO_PIN_A_L LL_GPIO_PIN_14 // PD.14 #elif defined(PCBXLITE) || defined(PCBX9LITE) #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A - #define SWITCHES_GPIO_REG_A_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_1 // PE.01 - #define SWITCHES_GPIO_REG_A_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_0 // PE.00 + #define SWITCHES_GPIO_REG_A_H GPIOE + #define SWITCHES_GPIO_PIN_A_H LL_GPIO_PIN_1 // PE.01 + #define SWITCHES_GPIO_REG_A_L GPIOE + #define SWITCHES_GPIO_PIN_A_L LL_GPIO_PIN_0 // PE.00 #elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A - #define SWITCHES_GPIO_REG_A GPIOC->IDR - #define SWITCHES_GPIO_PIN_A GPIO_Pin_13 // PC.13 + #define SWITCHES_GPIO_REG_A GPIOC + #define SWITCHES_GPIO_PIN_A LL_GPIO_PIN_13 // PC.13 #elif defined(RADIO_T8) #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A - #define SWITCHES_GPIO_REG_A GPIOE->IDR - #define SWITCHES_GPIO_PIN_A GPIO_Pin_14 // PE.14 + #define SWITCHES_GPIO_REG_A GPIOE + #define SWITCHES_GPIO_PIN_A LL_GPIO_PIN_14 // PE.14 #elif defined(RADIO_COMMANDO8) #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A - #define SWITCHES_GPIO_REG_A GPIOE->IDR - #define SWITCHES_GPIO_PIN_A GPIO_Pin_3 // PE.03 + #define SWITCHES_GPIO_REG_A GPIOE + #define SWITCHES_GPIO_PIN_A LL_GPIO_PIN_3 // PE.03 #elif defined(RADIO_TPRO) #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A - #define SWITCHES_GPIO_REG_A_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_13 // PE.13 - #define SWITCHES_GPIO_REG_A_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_7 // PE.07 + #define SWITCHES_GPIO_REG_A_L GPIOE + #define SWITCHES_GPIO_PIN_A_L LL_GPIO_PIN_13 // PE.13 + #define SWITCHES_GPIO_REG_A_H GPIOE + #define SWITCHES_GPIO_PIN_A_H LL_GPIO_PIN_7 // PE.07 #elif defined(PCBX7) #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A - #define SWITCHES_GPIO_REG_A_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_7 // PE.07 - #define SWITCHES_GPIO_REG_A_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_13 // PE.13 + #define SWITCHES_GPIO_REG_A_L GPIOE + #define SWITCHES_GPIO_PIN_A_L LL_GPIO_PIN_7 // PE.07 + #define SWITCHES_GPIO_REG_A_H GPIOE + #define SWITCHES_GPIO_PIN_A_H LL_GPIO_PIN_13 // PE.13 #else #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A - #define SWITCHES_GPIO_REG_A_H GPIOB->IDR - #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_5 // PB.05 - #define SWITCHES_GPIO_REG_A_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_0 // PE.00 + #define SWITCHES_GPIO_REG_A_H GPIOB + #define SWITCHES_GPIO_PIN_A_H LL_GPIO_PIN_5 // PB.05 + #define SWITCHES_GPIO_REG_A_L GPIOE + #define SWITCHES_GPIO_PIN_A_L LL_GPIO_PIN_0 // PE.00 #endif #if defined(PCBX9E) #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B - #define SWITCHES_GPIO_REG_B_H GPIOG->IDR - #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_11 // PG.11 - #define SWITCHES_GPIO_REG_B_L GPIOG->IDR - #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_10 // PG.10 + #define SWITCHES_GPIO_REG_B_H GPIOG + #define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_11 // PG.11 + #define SWITCHES_GPIO_REG_B_L GPIOG + #define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_10 // PG.10 #elif defined(PCBXLITE) #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B - #define SWITCHES_GPIO_REG_B_L GPIOA->IDR - #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_6 // PA.06 - #define SWITCHES_GPIO_REG_B_H GPIOA->IDR - #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_5 // PA.05 + #define SWITCHES_GPIO_REG_B_L GPIOA + #define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_6 // PA.06 + #define SWITCHES_GPIO_REG_B_H GPIOA + #define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_5 // PA.05 #elif defined(RADIO_T8) #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B - #define SWITCHES_GPIO_REG_B_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_7 // PE.07 - #define SWITCHES_GPIO_REG_B_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_13 // PE.13 + #define SWITCHES_GPIO_REG_B_L GPIOE + #define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_7 // PE.07 + #define SWITCHES_GPIO_REG_B_H GPIOE + #define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_13 // PE.13 #elif defined(RADIO_COMMANDO8) #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B - #define SWITCHES_GPIO_REG_B_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_5 // PE.05 - #define SWITCHES_GPIO_REG_B_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_4 // PE.04 + #define SWITCHES_GPIO_REG_B_L GPIOE + #define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_5 // PE.05 + #define SWITCHES_GPIO_REG_B_H GPIOE + #define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_4 // PE.04 #elif defined(RADIO_TLITE) || defined(RADIO_TPRO) #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B - #define SWITCHES_GPIO_REG_B_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_1 // PE.01 - #define SWITCHES_GPIO_REG_B_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_2 // PE.02 + #define SWITCHES_GPIO_REG_B_L GPIOE + #define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_1 // PE.01 + #define SWITCHES_GPIO_REG_B_H GPIOE + #define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_2 // PE.02 #elif (RADIO_LR3PRO) #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B - #define SWITCHES_GPIO_REG_B_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_15 // PE.15 - #define SWITCHES_GPIO_REG_B_H GPIOA->IDR - #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_5 // PA.05 + #define SWITCHES_GPIO_REG_B_L GPIOE + #define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_15 // PE.15 + #define SWITCHES_GPIO_REG_B_H GPIOA + #define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_5 // PA.05 #elif defined(RADIO_BOXER) #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B - #define SWITCHES_GPIO_REG_B_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_15 // PE.15 - #define SWITCHES_GPIO_REG_B_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_7 // PE.07 + #define SWITCHES_GPIO_REG_B_L GPIOE + #define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_15 // PE.15 + #define SWITCHES_GPIO_REG_B_H GPIOE + #define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_7 // PE.07 #elif defined(PCBX7) #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B - #define SWITCHES_GPIO_REG_B_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_15 // PE.15 - #define SWITCHES_GPIO_REG_B_H GPIOA->IDR - #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_5 // PA.05 + #define SWITCHES_GPIO_REG_B_L GPIOE + #define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_15 // PE.15 + #define SWITCHES_GPIO_REG_B_H GPIOA + #define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_5 // PA.05 #elif defined(PCBX9LITE) #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B - #define SWITCHES_GPIO_REG_B_L GPIOB->IDR - #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_4 // PB.04 - #define SWITCHES_GPIO_REG_B_H GPIOB->IDR - #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_5 // PB.05 + #define SWITCHES_GPIO_REG_B_L GPIOB + #define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_4 // PB.04 + #define SWITCHES_GPIO_REG_B_H GPIOB + #define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_5 // PB.05 #else #define STORAGE_SWITCH_B #define HARDWARE_SWITCH_B - #define SWITCHES_GPIO_REG_B_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_1 // PE.01 - #define SWITCHES_GPIO_REG_B_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_2 // PE.02 + #define SWITCHES_GPIO_REG_B_H GPIOE + #define SWITCHES_GPIO_PIN_B_H LL_GPIO_PIN_1 // PE.01 + #define SWITCHES_GPIO_REG_B_L GPIOE + #define SWITCHES_GPIO_PIN_B_L LL_GPIO_PIN_2 // PE.02 #endif #if defined(PCBX9E) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C - #define SWITCHES_GPIO_REG_C_H GPIOF->IDR - #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_13 // PF.13 - #define SWITCHES_GPIO_REG_C_L GPIOF->IDR - #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_14 // PF.14 + #define SWITCHES_GPIO_REG_C_H GPIOF + #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_13 // PF.13 + #define SWITCHES_GPIO_REG_C_L GPIOF + #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_14 // PF.14 #elif defined(PCBXLITE) || defined(PCBX9LITE) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C - #define SWITCHES_GPIO_REG_C_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_2 // PE.02 - #define SWITCHES_GPIO_REG_C_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_3 // PE.03 + #define SWITCHES_GPIO_REG_C_L GPIOE + #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_2 // PE.02 + #define SWITCHES_GPIO_REG_C_H GPIOE + #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_3 // PE.03 #elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C - #define SWITCHES_GPIO_REG_C_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_0 // PE.00 - #define SWITCHES_GPIO_REG_C_H GPIOD->IDR - #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_11 // PD.11 + #define SWITCHES_GPIO_REG_C_L GPIOE + #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_0 // PE.00 + #define SWITCHES_GPIO_REG_C_H GPIOD + #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_11 // PD.11 #elif defined(RADIO_TX12) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C - #define SWITCHES_GPIO_REG_C_L GPIOD->IDR - #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_11 // PD.11 - #define SWITCHES_GPIO_REG_C_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_0 // PE.00 + #define SWITCHES_GPIO_REG_C_L GPIOD + #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_11 // PD.11 + #define SWITCHES_GPIO_REG_C_H GPIOE + #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_0 // PE.00 #elif defined(RADIO_ZORRO) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C - #define SWITCHES_GPIO_REG_C_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_0 // PE.00 - #define SWITCHES_GPIO_REG_C_H GPIOD->IDR - #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_11 // PD.11 + #define SWITCHES_GPIO_REG_C_L GPIOE + #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_0 // PE.00 + #define SWITCHES_GPIO_REG_C_H GPIOD + #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_11 // PD.11 #elif defined(RADIO_T8) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C - #define SWITCHES_GPIO_REG_C_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_2 // PE.02 - #define SWITCHES_GPIO_REG_C_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_1 // PE.01 + #define SWITCHES_GPIO_REG_C_L GPIOE + #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_2 // PE.02 + #define SWITCHES_GPIO_REG_C_H GPIOE + #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_1 // PE.01 #elif defined(RADIO_COMMANDO8) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C - #define SWITCHES_GPIO_REG_C_L GPIOC->IDR - #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_4 // PC.04 - #define SWITCHES_GPIO_REG_C_H GPIOA->IDR - #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_6 // PA.06 + #define SWITCHES_GPIO_REG_C_L GPIOC + #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_4 // PC.04 + #define SWITCHES_GPIO_REG_C_H GPIOA + #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_6 // PA.06 #elif defined(RADIO_TLITE) || defined(RADIO_TPRO) || defined(RADIO_LR3PRO) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C - #define SWITCHES_GPIO_REG_C GPIOE->IDR - #define SWITCHES_GPIO_PIN_C GPIO_Pin_14 // PE.14 + #define SWITCHES_GPIO_REG_C GPIOE + #define SWITCHES_GPIO_PIN_C LL_GPIO_PIN_14 // PE.14 #elif defined(PCBX7) #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C - #define SWITCHES_GPIO_REG_C_L GPIOD->IDR - #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_11 // PD.11 + #define SWITCHES_GPIO_REG_C_L GPIOD + #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_11 // PD.11 #if defined(PCBX7ACCESS) - #define SWITCHES_GPIO_REG_C_H GPIOD->IDR - #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_10 // PD.10 + #define SWITCHES_GPIO_REG_C_H GPIOD + #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_10 // PD.10 #else - #define SWITCHES_GPIO_REG_C_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_0 // PE.00 + #define SWITCHES_GPIO_REG_C_H GPIOE + #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_0 // PE.00 #endif #else #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C - #define SWITCHES_GPIO_REG_C_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_15 // PE.15 - #define SWITCHES_GPIO_REG_C_L GPIOA->IDR - #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_5 // PA.05 + #define SWITCHES_GPIO_REG_C_H GPIOE + #define SWITCHES_GPIO_PIN_C_H LL_GPIO_PIN_15 // PE.15 + #define SWITCHES_GPIO_REG_C_L GPIOA + #define SWITCHES_GPIO_PIN_C_L LL_GPIO_PIN_5 // PA.05 #endif #if defined(PCBX9E) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D - #define SWITCHES_GPIO_REG_D_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_1 // PE.01 - #define SWITCHES_GPIO_REG_D_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_D_L GPIO_Pin_2 // PE.02 + #define SWITCHES_GPIO_REG_D_H GPIOE + #define SWITCHES_GPIO_PIN_D_H LL_GPIO_PIN_1 // PE.01 + #define SWITCHES_GPIO_REG_D_L GPIOE + #define SWITCHES_GPIO_PIN_D_L LL_GPIO_PIN_2 // PE.02 #elif defined(PCBX9DP) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D - #define SWITCHES_GPIO_REG_D_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_7 // PE.07 - #define SWITCHES_GPIO_REG_D_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_D_L GPIO_Pin_13 // PE.13 + #define SWITCHES_GPIO_REG_D_H GPIOE + #define SWITCHES_GPIO_PIN_D_H LL_GPIO_PIN_7 // PE.07 + #define SWITCHES_GPIO_REG_D_L GPIOE + #define SWITCHES_GPIO_PIN_D_L LL_GPIO_PIN_13 // PE.13 #elif defined(PCBXLITE) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D - #define SWITCHES_GPIO_REG_D_L GPIOB->IDR - #define SWITCHES_GPIO_PIN_D_L GPIO_Pin_4 // PB.04 - #define SWITCHES_GPIO_REG_D_H GPIOB->IDR - #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_5 // PB.05 + #define SWITCHES_GPIO_REG_D_L GPIOB + #define SWITCHES_GPIO_PIN_D_L LL_GPIO_PIN_4 // PB.04 + #define SWITCHES_GPIO_REG_D_H GPIOB + #define SWITCHES_GPIO_PIN_D_H LL_GPIO_PIN_5 // PB.05 #elif defined(RADIO_T8) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D - #define SWITCHES_GPIO_REG_D GPIOD->IDR - #define SWITCHES_GPIO_PIN_D GPIO_Pin_14 // PD.14 + #define SWITCHES_GPIO_REG_D GPIOD + #define SWITCHES_GPIO_PIN_D LL_GPIO_PIN_14 // PD.14 #elif defined(RADIO_COMMANDO8) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D - #define SWITCHES_GPIO_REG_D GPIOA->IDR - #define SWITCHES_GPIO_PIN_D GPIO_Pin_5 // PA.05 + #define SWITCHES_GPIO_REG_D GPIOA + #define SWITCHES_GPIO_PIN_D LL_GPIO_PIN_5 // PA.05 #elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D - #define SWITCHES_GPIO_REG_D GPIOE->IDR - #define SWITCHES_GPIO_PIN_D GPIO_Pin_8 // PE.08 + #define SWITCHES_GPIO_REG_D GPIOE + #define SWITCHES_GPIO_PIN_D LL_GPIO_PIN_8 // PE.08 #elif defined(RADIO_TLITE) || defined(RADIO_TPRO) || defined(RADIO_LR3PRO) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D - #define SWITCHES_GPIO_REG_D GPIOD->IDR - #define SWITCHES_GPIO_PIN_D GPIO_Pin_14 // PD.14 + #define SWITCHES_GPIO_REG_D GPIOD + #define SWITCHES_GPIO_PIN_D LL_GPIO_PIN_14 // PD.14 #elif defined(PCBX7) && !defined(RADIO_COMMANDO8) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D - #define SWITCHES_GPIO_REG_D_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_D_L GPIO_Pin_1 // PE.01 - #define SWITCHES_GPIO_REG_D_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_2 // PE.02 + #define SWITCHES_GPIO_REG_D_L GPIOE + #define SWITCHES_GPIO_PIN_D_L LL_GPIO_PIN_1 // PE.01 + #define SWITCHES_GPIO_REG_D_H GPIOE + #define SWITCHES_GPIO_PIN_D_H LL_GPIO_PIN_2 // PE.02 #elif defined(PCBX7) && defined(RADIO_COMMANDO8) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D - #define SWITCHES_GPIO_REG_D_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_D_L GPIO_Pin_1 // PE.01 - #define SWITCHES_GPIO_REG_D_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_2 // PE.02 + #define SWITCHES_GPIO_REG_D_L GPIOE + #define SWITCHES_GPIO_PIN_D_L LL_GPIO_PIN_1 // PE.01 + #define SWITCHES_GPIO_REG_D_H GPIOE + #define SWITCHES_GPIO_PIN_D_H LL_GPIO_PIN_2 // PE.02 #elif defined(PCBX9LITE) #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D - #define SWITCHES_GPIO_REG_D GPIOC->IDR - #define SWITCHES_GPIO_PIN_D GPIO_Pin_13 // PC.13 + #define SWITCHES_GPIO_REG_D GPIOC + #define SWITCHES_GPIO_PIN_D LL_GPIO_PIN_13 // PC.13 #else #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D - #define SWITCHES_GPIO_REG_D_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_7 // PE.07 - #define SWITCHES_GPIO_REG_D_L GPIOB->IDR - #define SWITCHES_GPIO_PIN_D_L GPIO_Pin_1 // PB.01 + #define SWITCHES_GPIO_REG_D_H GPIOE + #define SWITCHES_GPIO_PIN_D_H LL_GPIO_PIN_7 // PE.07 + #define SWITCHES_GPIO_REG_D_L GPIOB + #define SWITCHES_GPIO_PIN_D_L LL_GPIO_PIN_1 // PB.01 #endif #if defined(PCBX9E) #define STORAGE_SWITCH_E #define HARDWARE_SWITCH_E - #define SWITCHES_GPIO_REG_E_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_E_H GPIO_Pin_7 // PE.07 - #define SWITCHES_GPIO_REG_E_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_E_L GPIO_Pin_13 // PE.13 + #define SWITCHES_GPIO_REG_E_H GPIOE + #define SWITCHES_GPIO_PIN_E_H LL_GPIO_PIN_7 // PE.07 + #define SWITCHES_GPIO_REG_E_L GPIOE + #define SWITCHES_GPIO_PIN_E_L LL_GPIO_PIN_13 // PE.13 #elif defined(PCBXLITES) #define STORAGE_SWITCH_E #define HARDWARE_SWITCH_E - #define SWITCHES_GPIO_REG_E GPIOE->IDR - #define SWITCHES_GPIO_PIN_E GPIO_Pin_5 // PE.05 + #define SWITCHES_GPIO_REG_E GPIOE + #define SWITCHES_GPIO_PIN_E LL_GPIO_PIN_5 // PE.05 #elif defined(PCBXLITE) // no SWE but we want to remain compatible with XLiteS #define STORAGE_SWITCH_E #elif defined(PCBX9LITE) #define STORAGE_SWITCH_E #define HARDWARE_SWITCH_E - #define SWITCHES_GPIO_REG_E GPIOA->IDR - #define SWITCHES_GPIO_PIN_E GPIO_Pin_5 // PA.05 + #define SWITCHES_GPIO_REG_E GPIOA + #define SWITCHES_GPIO_PIN_E LL_GPIO_PIN_5 // PA.05 #elif defined(RADIO_ZORRO) #define STORAGE_SWITCH_E #define HARDWARE_SWITCH_E - #define SWITCHES_GPIO_REG_E GPIOE->IDR - #define SWITCHES_GPIO_PIN_E GPIO_Pin_7 // PE.07 + #define SWITCHES_GPIO_REG_E GPIOE + #define SWITCHES_GPIO_PIN_E LL_GPIO_PIN_7 // PE.07 #elif defined(RADIO_BOXER) #define STORAGE_SWITCH_E #define HARDWARE_SWITCH_E - #define SWITCHES_GPIO_REG_E GPIOE->IDR - #define SWITCHES_GPIO_PIN_E GPIO_Pin_14 // PE.14 + #define SWITCHES_GPIO_REG_E GPIOE + #define SWITCHES_GPIO_PIN_E LL_GPIO_PIN_14 // PE.14 #elif defined(RADIO_TX12) #define STORAGE_SWITCH_E #define HARDWARE_SWITCH_E - #define SWITCHES_GPIO_REG_E_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_E_H GPIO_Pin_13 // PE.13 - #define SWITCHES_GPIO_REG_E_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_E_L GPIO_Pin_7 // PE.07 + #define SWITCHES_GPIO_REG_E_H GPIOE + #define SWITCHES_GPIO_PIN_E_H LL_GPIO_PIN_13 // PE.13 + #define SWITCHES_GPIO_REG_E_L GPIOE + #define SWITCHES_GPIO_PIN_E_L LL_GPIO_PIN_7 // PE.07 #elif defined(RADIO_TX12MK2) #define STORAGE_SWITCH_E #define HARDWARE_SWITCH_E - #define SWITCHES_GPIO_REG_E_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_E_H GPIO_Pin_14 // PE.14 - #define SWITCHES_GPIO_REG_E_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_E_L GPIO_Pin_7 // PE.07 + #define SWITCHES_GPIO_REG_E_H GPIOE + #define SWITCHES_GPIO_PIN_E_H LL_GPIO_PIN_14 // PE.14 + #define SWITCHES_GPIO_REG_E_L GPIOE + #define SWITCHES_GPIO_PIN_E_L LL_GPIO_PIN_7 // PE.07 #elif defined(RADIO_TPRO) // SW1 + #define FUNCTION_SWITCH_1 SE #define STORAGE_SWITCH_E #define HARDWARE_SWITCH_E - #define SWITCHES_GPIO_REG_E GPIOG->IDR - #define SWITCHES_GPIO_PIN_E GPIO_Pin_7 // PG.07 + #define SWITCHES_GPIO_REG_E GPIOG + #define SWITCHES_GPIO_PIN_E LL_GPIO_PIN_7 // PG.07 #elif defined(PCBX7) // no SWE #else #define STORAGE_SWITCH_E #define HARDWARE_SWITCH_E - #define SWITCHES_GPIO_REG_E_H GPIOB->IDR - #define SWITCHES_GPIO_PIN_E_H GPIO_Pin_3 // PB.03 - #define SWITCHES_GPIO_REG_E_L GPIOB->IDR - #define SWITCHES_GPIO_PIN_E_L GPIO_Pin_4 // PB.04 + #define SWITCHES_GPIO_REG_E_H GPIOB + #define SWITCHES_GPIO_PIN_E_H LL_GPIO_PIN_3 // PB.03 + #define SWITCHES_GPIO_REG_E_L GPIOB + #define SWITCHES_GPIO_PIN_E_L LL_GPIO_PIN_4 // PB.04 #endif #if defined(PCBX9E) #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F - #define SWITCHES_GPIO_REG_F GPIOE->IDR - #define SWITCHES_GPIO_PIN_F GPIO_Pin_11 // PE.11 + #define SWITCHES_GPIO_REG_F GPIOE + #define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_11 // PE.11 #elif defined(PCBXLITES) #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F - #define SWITCHES_GPIO_REG_F GPIOC->IDR - #define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PC.03 + #define SWITCHES_GPIO_REG_F GPIOC + #define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_3 // PC.03 #elif defined(PCBXLITE) // no SWF but we want to remain compatible with XLiteS #define STORAGE_SWITCH_F #elif defined(PCBX9LITES) #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F - #define SWITCHES_GPIO_REG_F GPIOC->IDR - #define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PC.03 + #define SWITCHES_GPIO_REG_F GPIOC + #define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_3 // PC.03 #elif defined(PCBX9LITE) // no SWF #elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F - #define SWITCHES_GPIO_REG_F GPIOE->IDR - #define SWITCHES_GPIO_PIN_F GPIO_Pin_1 // PE.01 + #define SWITCHES_GPIO_REG_F GPIOE + #define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_1 // PE.01 #elif defined(RADIO_TX12) #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F - #define SWITCHES_GPIO_REG_F_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_F_L GPIO_Pin_1 // PE.01 - #define SWITCHES_GPIO_REG_F_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_F_H GPIO_Pin_2 // PE.02 + #define SWITCHES_GPIO_REG_F_L GPIOE + #define SWITCHES_GPIO_PIN_F_L LL_GPIO_PIN_1 // PE.01 + #define SWITCHES_GPIO_REG_F_H GPIOE + #define SWITCHES_GPIO_PIN_F_H LL_GPIO_PIN_2 // PE.02 #elif defined(RADIO_TX12MK2) #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F - #define SWITCHES_GPIO_REG_F_L GPIOD->IDR - #define SWITCHES_GPIO_PIN_F_L GPIO_Pin_14 // PD.14 - #define SWITCHES_GPIO_REG_F_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_F_H GPIO_Pin_1 // PE.01 + #define SWITCHES_GPIO_REG_F_L GPIOD + #define SWITCHES_GPIO_PIN_F_L LL_GPIO_PIN_14 // PD.14 + #define SWITCHES_GPIO_REG_F_H GPIOE + #define SWITCHES_GPIO_PIN_F_H LL_GPIO_PIN_1 // PE.01 #elif defined(RADIO_TPRO) // SW2 + #define FUNCTION_SWITCH_2 SF #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F - #define SWITCHES_GPIO_REG_F GPIOG->IDR - #define SWITCHES_GPIO_PIN_F GPIO_Pin_6 // PG.06 + #define SWITCHES_GPIO_REG_F GPIOG + #define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_6 // PG.06 #elif defined(RADIO_T8) || defined(RADIO_TLITE) || defined(RADIO_TPRO) || defined(RADIO_COMMANDO8) || defined(RADIO_LR3PRO) // no SWF #define STORAGE_SWITCH_F @@ -804,61 +816,62 @@ #elif defined(PCBX7) #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F - #define SWITCHES_GPIO_REG_F GPIOE->IDR - #define SWITCHES_GPIO_PIN_F GPIO_Pin_14 // PE.14 + #define SWITCHES_GPIO_REG_F GPIOE + #define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_14 // PE.14 #else #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F - #define SWITCHES_GPIO_REG_F GPIOE->IDR - #define SWITCHES_GPIO_PIN_F GPIO_Pin_14 // PE.14 + #define SWITCHES_GPIO_REG_F GPIOE + #define SWITCHES_GPIO_PIN_F LL_GPIO_PIN_14 // PE.14 #endif #if defined(PCBX9E) #define STORAGE_SWITCH_G #define HARDWARE_SWITCH_G - #define SWITCHES_GPIO_REG_G_H GPIOF->IDR - #define SWITCHES_GPIO_PIN_G_H GPIO_Pin_3 // PF.03 - #define SWITCHES_GPIO_REG_G_L GPIOF->IDR - #define SWITCHES_GPIO_PIN_G_L GPIO_Pin_4 // PF.04 + #define SWITCHES_GPIO_REG_G_H GPIOF + #define SWITCHES_GPIO_PIN_G_H LL_GPIO_PIN_3 // PF.03 + #define SWITCHES_GPIO_REG_G_L GPIOF + #define SWITCHES_GPIO_PIN_G_L LL_GPIO_PIN_4 // PF.04 #elif defined(PCBX9LITES) #define STORAGE_SWITCH_G #define HARDWARE_SWITCH_G - #define SWITCHES_GPIO_REG_G GPIOC->IDR - #define SWITCHES_GPIO_PIN_G GPIO_Pin_2 // PC.02 + #define SWITCHES_GPIO_REG_G GPIOC + #define SWITCHES_GPIO_PIN_G LL_GPIO_PIN_2 // PC.02 #elif defined(RADIO_T12) || defined(RADIO_ZORRO) #define STORAGE_SWITCH_G #define HARDWARE_SWITCH_G - #define SWITCHES_GPIO_REG_G GPIOE->IDR - #define SWITCHES_GPIO_PIN_G GPIO_Pin_14 // PE.14 + #define SWITCHES_GPIO_REG_G GPIOE + #define SWITCHES_GPIO_PIN_G LL_GPIO_PIN_14 // PE.14 #elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) #define STORAGE_SWITCH_G #elif defined(RADIO_TPRO) // SW3 + #define FUNCTION_SWITCH_3 SG #define STORAGE_SWITCH_G #define HARDWARE_SWITCH_G - #define SWITCHES_GPIO_REG_G GPIOG->IDR - #define SWITCHES_GPIO_PIN_G GPIO_Pin_5 // PG.05 + #define SWITCHES_GPIO_REG_G GPIOG + #define SWITCHES_GPIO_PIN_G LL_GPIO_PIN_5 // PG.05 #elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_T8) || defined(RADIO_COMMANDO8) // no SWG #else #define STORAGE_SWITCH_G #define HARDWARE_SWITCH_G - #define SWITCHES_GPIO_REG_G_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_G_H GPIO_Pin_9 // PE.09 - #define SWITCHES_GPIO_REG_G_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_G_L GPIO_Pin_8 // PE.08 + #define SWITCHES_GPIO_REG_G_H GPIOE + #define SWITCHES_GPIO_PIN_G_H LL_GPIO_PIN_9 // PE.09 + #define SWITCHES_GPIO_REG_G_L GPIOE + #define SWITCHES_GPIO_PIN_G_L LL_GPIO_PIN_8 // PE.08 #endif #if defined(PCBX9E) #define STORAGE_SWITCH_H #define HARDWARE_SWITCH_H - #define SWITCHES_GPIO_REG_H GPIOF->IDR - #define SWITCHES_GPIO_PIN_H GPIO_Pin_1 // PF.01 + #define SWITCHES_GPIO_REG_H GPIOF + #define SWITCHES_GPIO_PIN_H LL_GPIO_PIN_1 // PF.01 #elif defined(PCBX9DP) #define STORAGE_SWITCH_H #define HARDWARE_SWITCH_H - #define SWITCHES_GPIO_REG_H GPIOD->IDR - #define SWITCHES_GPIO_PIN_H GPIO_Pin_14 // PD.14 + #define SWITCHES_GPIO_REG_H GPIOD + #define SWITCHES_GPIO_PIN_H LL_GPIO_PIN_14 // PD.14 #elif defined(PCBXLITE) || defined(PCBX9LITE) // no SWH #elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) @@ -869,30 +882,31 @@ #define STORAGE_SWITCH_H #elif defined(RADIO_TPRO) // SW4 + #define FUNCTION_SWITCH_4 SH #define STORAGE_SWITCH_H #define HARDWARE_SWITCH_H - #define SWITCHES_GPIO_REG_H GPIOG->IDR - #define SWITCHES_GPIO_PIN_H GPIO_Pin_4 // PG.04 + #define SWITCHES_GPIO_REG_H GPIOG + #define SWITCHES_GPIO_PIN_H LL_GPIO_PIN_4 // PG.04 #elif defined(RADIO_TLITE) || defined(RADIO_TPRO) || defined(RADIO_LR3PRO) // no SWH #define STORAGE_SWITCH_H #elif defined(PCBX7) #define STORAGE_SWITCH_H #define HARDWARE_SWITCH_H - #define SWITCHES_GPIO_REG_H GPIOD->IDR - #define SWITCHES_GPIO_PIN_H GPIO_Pin_14 // PD.14 + #define SWITCHES_GPIO_REG_H GPIOD + #define SWITCHES_GPIO_PIN_H LL_GPIO_PIN_14 // PD.14 #else #define STORAGE_SWITCH_H #define HARDWARE_SWITCH_H - #define SWITCHES_GPIO_REG_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_H GPIO_Pin_13 // PE.13 + #define SWITCHES_GPIO_REG_H GPIOE + #define SWITCHES_GPIO_PIN_H LL_GPIO_PIN_13 // PE.13 #endif #if defined(RADIO_X9DP2019) #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I - #define SWITCHES_GPIO_REG_I GPIOD->IDR - #define SWITCHES_GPIO_PIN_I GPIO_Pin_10 // PD.10 + #define SWITCHES_GPIO_REG_I GPIOD + #define SWITCHES_GPIO_PIN_I LL_GPIO_PIN_10 // PD.10 #elif defined(PCBX9D) || defined(PCBX9DP) #define STORAGE_SWITCH_I #endif @@ -901,8 +915,8 @@ #if defined(PCBX7ACCESS) #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I - #define SWITCHES_GPIO_REG_I GPIOC->IDR - #define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13 + #define SWITCHES_GPIO_REG_I GPIOC + #define SWITCHES_GPIO_PIN_I LL_GPIO_PIN_13 // PC.13 #define STORAGE_SWITCH_J #elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) #define STORAGE_SWITCH_I @@ -911,12 +925,12 @@ #elif defined(RADIO_TX12) #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I - #define SWITCHES_GPIO_REG_I GPIOE->IDR - #define SWITCHES_GPIO_PIN_I GPIO_Pin_14 // PE.14 + #define SWITCHES_GPIO_REG_I GPIOE + #define SWITCHES_GPIO_PIN_I LL_GPIO_PIN_14 // PE.14 #define STORAGE_SWITCH_J #define HARDWARE_SWITCH_J - #define SWITCHES_GPIO_REG_J GPIOD->IDR - #define SWITCHES_GPIO_PIN_J GPIO_Pin_14 // PD.14 + #define SWITCHES_GPIO_REG_J GPIOD + #define SWITCHES_GPIO_PIN_J LL_GPIO_PIN_14 // PD.14 #elif defined(RADIO_TX12MK2) || defined(RADIO_BOXER) // no headers #elif defined(RADIO_TLITE) || defined(RADIO_LR3PRO) @@ -928,87 +942,89 @@ // No I/J #elif defined(RADIO_TPRO) // SW5 + #define FUNCTION_SWITCH_5 SI #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I - #define SWITCHES_GPIO_REG_I GPIOG->IDR - #define SWITCHES_GPIO_PIN_I GPIO_Pin_3 // PG.03 + #define SWITCHES_GPIO_REG_I GPIOG + #define SWITCHES_GPIO_PIN_I LL_GPIO_PIN_3 // PG.03 // SW6 + #define FUNCTION_SWITCH_6 SJ #define STORAGE_SWITCH_J #define HARDWARE_SWITCH_J - #define SWITCHES_GPIO_REG_J GPIOG->IDR - #define SWITCHES_GPIO_PIN_J GPIO_Pin_2 // PG.02 + #define SWITCHES_GPIO_REG_J GPIOG + #define SWITCHES_GPIO_PIN_J LL_GPIO_PIN_2 // PG.02 #elif defined(PCBX7) #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I - #define SWITCHES_GPIO_REG_I GPIOC->IDR - #define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13 + #define SWITCHES_GPIO_REG_I GPIOC + #define SWITCHES_GPIO_PIN_I LL_GPIO_PIN_13 // PC.13 #define STORAGE_SWITCH_J #define HARDWARE_SWITCH_J - #define SWITCHES_GPIO_REG_J GPIOD->IDR - #define SWITCHES_GPIO_PIN_J GPIO_Pin_10 // PD.10 + #define SWITCHES_GPIO_REG_J GPIOD + #define SWITCHES_GPIO_PIN_J LL_GPIO_PIN_10 // PD.10 #endif #if defined(PCBX9E) #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I - #define SWITCHES_GPIO_REG_I_H GPIOF->IDR - #define SWITCHES_GPIO_PIN_I_H GPIO_Pin_15 // PF.15 - #define SWITCHES_GPIO_REG_I_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_I_L GPIO_Pin_14 // PE.14 + #define SWITCHES_GPIO_REG_I_H GPIOF + #define SWITCHES_GPIO_PIN_I_H LL_GPIO_PIN_15 // PF.15 + #define SWITCHES_GPIO_REG_I_L GPIOE + #define SWITCHES_GPIO_PIN_I_L LL_GPIO_PIN_14 // PE.14 #define STORAGE_SWITCH_J #define HARDWARE_SWITCH_J - #define SWITCHES_GPIO_REG_J_H GPIOG->IDR - #define SWITCHES_GPIO_PIN_J_H GPIO_Pin_7 // PG.07 - #define SWITCHES_GPIO_REG_J_L GPIOG->IDR - #define SWITCHES_GPIO_PIN_J_L GPIO_Pin_8 // PG.08 + #define SWITCHES_GPIO_REG_J_H GPIOG + #define SWITCHES_GPIO_PIN_J_H LL_GPIO_PIN_7 // PG.07 + #define SWITCHES_GPIO_REG_J_L GPIOG + #define SWITCHES_GPIO_PIN_J_L LL_GPIO_PIN_8 // PG.08 #define STORAGE_SWITCH_K #define HARDWARE_SWITCH_K - #define SWITCHES_GPIO_REG_K_H GPIOG->IDR - #define SWITCHES_GPIO_PIN_K_H GPIO_Pin_13 // PG.13 - #define SWITCHES_GPIO_REG_K_L GPIOG->IDR - #define SWITCHES_GPIO_PIN_K_L GPIO_Pin_12 // PG.12 + #define SWITCHES_GPIO_REG_K_H GPIOG + #define SWITCHES_GPIO_PIN_K_H LL_GPIO_PIN_13 // PG.13 + #define SWITCHES_GPIO_REG_K_L GPIOG + #define SWITCHES_GPIO_PIN_K_L LL_GPIO_PIN_12 // PG.12 #define STORAGE_SWITCH_L #define HARDWARE_SWITCH_L - #define SWITCHES_GPIO_REG_L_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_L_H GPIO_Pin_9 // PE.09 - #define SWITCHES_GPIO_REG_L_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_L_L GPIO_Pin_8 // PE.08 + #define SWITCHES_GPIO_REG_L_H GPIOE + #define SWITCHES_GPIO_PIN_L_H LL_GPIO_PIN_9 // PE.09 + #define SWITCHES_GPIO_REG_L_L GPIOE + #define SWITCHES_GPIO_PIN_L_L LL_GPIO_PIN_8 // PE.08 #define STORAGE_SWITCH_M #define HARDWARE_SWITCH_M - #define SWITCHES_GPIO_REG_M_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_M_H GPIO_Pin_15 // PE.15 - #define SWITCHES_GPIO_REG_M_L GPIOA->IDR - #define SWITCHES_GPIO_PIN_M_L GPIO_Pin_5 // PA.05 + #define SWITCHES_GPIO_REG_M_H GPIOE + #define SWITCHES_GPIO_PIN_M_H LL_GPIO_PIN_15 // PE.15 + #define SWITCHES_GPIO_REG_M_L GPIOA + #define SWITCHES_GPIO_PIN_M_L LL_GPIO_PIN_5 // PA.05 #define STORAGE_SWITCH_N #define HARDWARE_SWITCH_N - #define SWITCHES_GPIO_REG_N_H GPIOB->IDR - #define SWITCHES_GPIO_PIN_N_H GPIO_Pin_3 // PB.03 - #define SWITCHES_GPIO_REG_N_L GPIOB->IDR - #define SWITCHES_GPIO_PIN_N_L GPIO_Pin_4 // PB.04 + #define SWITCHES_GPIO_REG_N_H GPIOB + #define SWITCHES_GPIO_PIN_N_H LL_GPIO_PIN_3 // PB.03 + #define SWITCHES_GPIO_REG_N_L GPIOB + #define SWITCHES_GPIO_PIN_N_L LL_GPIO_PIN_4 // PB.04 #define STORAGE_SWITCH_O #define HARDWARE_SWITCH_O - #define SWITCHES_GPIO_REG_O_H GPIOF->IDR - #define SWITCHES_GPIO_PIN_O_H GPIO_Pin_7 // PF.07 - #define SWITCHES_GPIO_REG_O_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_O_L GPIO_Pin_10 // PE.10 + #define SWITCHES_GPIO_REG_O_H GPIOF + #define SWITCHES_GPIO_PIN_O_H LL_GPIO_PIN_7 // PF.07 + #define SWITCHES_GPIO_REG_O_L GPIOE + #define SWITCHES_GPIO_PIN_O_L LL_GPIO_PIN_10 // PE.10 #define STORAGE_SWITCH_P #define HARDWARE_SWITCH_P - #define SWITCHES_GPIO_REG_P_H GPIOF->IDR - #define SWITCHES_GPIO_PIN_P_H GPIO_Pin_11 // PF.11 - #define SWITCHES_GPIO_REG_P_L GPIOF->IDR - #define SWITCHES_GPIO_PIN_P_L GPIO_Pin_12 // PF.12 + #define SWITCHES_GPIO_REG_P_H GPIOF + #define SWITCHES_GPIO_PIN_P_H LL_GPIO_PIN_11 // PF.11 + #define SWITCHES_GPIO_REG_P_L GPIOF + #define SWITCHES_GPIO_PIN_P_L LL_GPIO_PIN_12 // PF.12 #define STORAGE_SWITCH_Q #define HARDWARE_SWITCH_Q - #define SWITCHES_GPIO_REG_Q_H GPIOF->IDR - #define SWITCHES_GPIO_PIN_Q_H GPIO_Pin_5 // PF.05 - #define SWITCHES_GPIO_REG_Q_L GPIOF->IDR - #define SWITCHES_GPIO_PIN_Q_L GPIO_Pin_6 // PF.06 + #define SWITCHES_GPIO_REG_Q_H GPIOF + #define SWITCHES_GPIO_PIN_Q_H LL_GPIO_PIN_5 // PF.05 + #define SWITCHES_GPIO_REG_Q_L GPIOF + #define SWITCHES_GPIO_PIN_Q_L LL_GPIO_PIN_6 // PF.06 #define STORAGE_SWITCH_R #define HARDWARE_SWITCH_R - #define SWITCHES_GPIO_REG_R_H GPIOB->IDR - #define SWITCHES_GPIO_PIN_R_H GPIO_Pin_5 // PB.05 - #define SWITCHES_GPIO_REG_R_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_R_L GPIO_Pin_0 // PE.00 + #define SWITCHES_GPIO_REG_R_H GPIOB + #define SWITCHES_GPIO_PIN_R_H LL_GPIO_PIN_5 // PB.05 + #define SWITCHES_GPIO_REG_R_L GPIOE + #define SWITCHES_GPIO_PIN_R_L LL_GPIO_PIN_0 // PE.00 #endif #if defined(PCBX9E) @@ -1141,296 +1157,330 @@ // ADC #define ADC_MAIN ADC1 #define ADC_DMA DMA2 -#define ADC_DMA_Channel DMA_Channel_0 -#define ADC_DMA_Stream DMA2_Stream4 -#define ADC_DMA_TC_Flag DMA_FLAG_TCIF4 -#define ADC_SAMPTIME 2 // sample time = 28 cycles +#define ADC_DMA_CHANNEL LL_DMA_CHANNEL_0 +#define ADC_DMA_STREAM LL_DMA_STREAM_4 +#define ADC_DMA_STREAM_IRQ DMA2_Stream4_IRQn +#define ADC_DMA_STREAM_IRQHandler DMA2_Stream4_IRQHandler + +#define ADC_SAMPTIME LL_ADC_SAMPLINGTIME_28CYCLES +#define ADC_CHANNEL_RTC_BAT LL_ADC_CHANNEL_VBAT #if defined(PCBX9E) #define HARDWARE_POT1 #define HARDWARE_POT2 #define HARDWARE_POT3 #define HARDWARE_POT4 - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 - #define ADC_RCC_APB2Periph (RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC3) - #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 - #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 - #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_3 // PA.03 - #define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0 - #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 - #define ADC_CHANNEL_STICK_LH ADC_Channel_2 // ADC1_IN2 - #define ADC_CHANNEL_STICK_LV ADC_Channel_3 // ADC1_IN3 - #define ADC_GPIO_PIN_POT1 GPIO_Pin_8 // PF.08 - #define ADC_GPIO_PIN_POT2 GPIO_Pin_0 // PB.00 - #define ADC_GPIO_PIN_POT3 GPIO_Pin_5 // PC.05 - #define ADC_GPIO_PIN_POT4 GPIO_Pin_4 // PC.04 - #define ADC_GPIO_PIN_SLIDER1 GPIO_Pin_10 // PF.10 - #define ADC_GPIO_PIN_SLIDER2 GPIO_Pin_9 // PF.09 - #define ADC_GPIO_PIN_SLIDER3 GPIO_Pin_6 // PA.06 - #define ADC_GPIO_PIN_SLIDER4 GPIO_Pin_1 // PB.01 - #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 + #define ADC_RCC_APB2Periph 0 + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_1 // PA.01 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_3 // PA.03 + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_3 // ADC1_IN3 + #define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_8 // PF.08 + #define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_0 // PB.00 + #define ADC_GPIO_PIN_POT3 LL_GPIO_PIN_5 // PC.05 + #define ADC_GPIO_PIN_POT4 LL_GPIO_PIN_4 // PC.04 + #define ADC_GPIO_PIN_SLIDER1 LL_GPIO_PIN_10 // PF.10 + #define ADC_GPIO_PIN_SLIDER2 LL_GPIO_PIN_9 // PF.09 + #define ADC_GPIO_PIN_SLIDER3 LL_GPIO_PIN_6 // PA.06 + #define ADC_GPIO_PIN_SLIDER4 LL_GPIO_PIN_1 // PB.01 + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_0 // PC.00 #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_SLIDER3) #define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_SLIDER4) #define ADC_GPIOC_PINS (ADC_GPIO_PIN_POT3 | ADC_GPIO_PIN_POT4 | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2 | ADC_GPIO_PIN_BATT) #define ADC_GPIOF_PINS (ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2) - #define ADC_CHANNEL_POT1 ADC_Channel_6 // ADC3_IN6 - #define ADC_CHANNEL_POT2 ADC_Channel_8 // ADC1_IN8 - #define ADC_CHANNEL_POT3 ADC_Channel_15 // ADC1_IN15 - #define ADC_CHANNEL_POT4 ADC_Channel_14 // ADC1_IN14 - #define ADC_CHANNEL_SLIDER1 ADC_Channel_8 // ADC3_IN8 - #define ADC_CHANNEL_SLIDER2 ADC_Channel_7 // ADC3_IN7 - #define ADC_CHANNEL_SLIDER3 ADC_Channel_6 // ADC1_IN6 - #define ADC_CHANNEL_SLIDER4 ADC_Channel_9 // ADC1_IN9 - #define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10 + #define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_6 // ADC3_IN6 + #define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_8 // ADC1_IN8 + #define ADC_CHANNEL_POT3 LL_ADC_CHANNEL_15 // ADC1_IN15 + #define ADC_CHANNEL_POT4 LL_ADC_CHANNEL_14 // ADC1_IN14 + #define ADC_CHANNEL_SLIDER1 LL_ADC_CHANNEL_8 // ADC3_IN8 + #define ADC_CHANNEL_SLIDER2 LL_ADC_CHANNEL_7 // ADC3_IN7 + #define ADC_CHANNEL_SLIDER3 LL_ADC_CHANNEL_6 // ADC1_IN6 + #define ADC_CHANNEL_SLIDER4 LL_ADC_CHANNEL_9 // ADC1_IN9 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_10 // ADC1_IN10 #define ADC_EXT ADC3 + #define ADC_EXT_CHANNELS { ADC_CHANNEL_POT1, ADC_CHANNEL_SLIDER1, ADC_CHANNEL_SLIDER2 } #define ADC_EXT_DMA DMA2 - #define ADC_EXT_DMA_Stream DMA2_Stream0 - #define ADC_EXT_DMA_Channel DMA_Channel_2 - #define ADC_EXT_TC_Flag DMA_FLAG_TCIF0 - #define ADC_EXT_SAMPTIME 3 // sample time = 56 cycles + #define ADC_EXT_DMA_CHANNEL LL_DMA_CHANNEL_2 + #define ADC_EXT_DMA_STREAM LL_DMA_STREAM_0 + #define ADC_EXT_DMA_STREAM_IRQ DMA2_Stream0_IRQn + #define ADC_EXT_DMA_STREAM_IRQHandler DMA2_Stream0_IRQHandler + #define ADC_EXT_SAMPTIME LL_ADC_SAMPLINGTIME_56CYCLES #define ADC_VREF_PREC2 300 #elif defined(PCBX9DP) #define HARDWARE_POT1 #define HARDWARE_POT2 #define HARDWARE_POT3 - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 - #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 - #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 - #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 - #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_3 // PA.03 - #define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0 - #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 - #define ADC_CHANNEL_STICK_LH ADC_Channel_2 // ADC1_IN2 - #define ADC_CHANNEL_STICK_LV ADC_Channel_3 // ADC1_IN3 - #define ADC_GPIO_PIN_POT1 GPIO_Pin_6 // PA.06 - #define ADC_GPIO_PIN_POT2 GPIO_Pin_0 // PB.00 + #define ADC_RCC_APB2Periph 0 + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_1 // PA.01 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_3 // PA.03 + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_3 // ADC1_IN3 + #define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_6 // PA.06 + #define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_0 // PB.00 #if PCBREV < 2019 - #define ADC_GPIO_PIN_POT3 GPIO_Pin_1 // PB.01 + #define ADC_GPIO_PIN_POT3 LL_GPIO_PIN_1 // PB.01 #define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_POT3) - #define ADC_CHANNEL_POT3 ADC_Channel_9 + #define ADC_CHANNEL_POT3 LL_ADC_CHANNEL_9 #define ADC_VREF_PREC2 330 #else #define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2) #define ADC_CHANNEL_POT3 0 #define ADC_VREF_PREC2 300 #endif - #define ADC_GPIO_PIN_SLIDER1 GPIO_Pin_4 // PC.04 - #define ADC_GPIO_PIN_SLIDER2 GPIO_Pin_5 // PC.05 - #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 - #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT1) + #define ADC_GPIO_PIN_SLIDER1 LL_GPIO_PIN_4 // PC.04 + #define ADC_GPIO_PIN_SLIDER2 LL_GPIO_PIN_5 // PC.05 + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_0 // PC.00 + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_POT1) #define ADC_GPIOC_PINS (ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2 | ADC_GPIO_PIN_BATT) - #define ADC_CHANNEL_POT1 ADC_Channel_6 - #define ADC_CHANNEL_POT2 ADC_Channel_8 - #define ADC_CHANNEL_SLIDER1 ADC_Channel_14 - #define ADC_CHANNEL_SLIDER2 ADC_Channel_15 - #define ADC_CHANNEL_BATT ADC_Channel_10 + #define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_6 + #define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_8 + #define ADC_CHANNEL_SLIDER1 LL_ADC_CHANNEL_14 + #define ADC_CHANNEL_SLIDER2 LL_ADC_CHANNEL_15 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_10 #elif defined(PCBXLITE) #define HARDWARE_POT1 #define HARDWARE_POT2 - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph RCC_APB1Periph_TIM5 - #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 - #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 - #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 - #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_3 // PA.03 - #define ADC_GPIO_PIN_POT1 GPIO_Pin_1 // PC.01 - #define ADC_GPIO_PIN_POT2 GPIO_Pin_2 // PC.02 - #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 + #define ADC_RCC_APB2Periph 0 + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_1 // PA.01 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_3 // PA.03 + #define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_1 // PC.01 + #define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_2 // PC.02 + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_0 // PC.00 + #define PWM_STICKS #define PWM_TIMER TIM5 #define PWM_GPIO GPIOA - #define PWM_GPIO_AF GPIO_AF_TIM5 + #define PWM_GPIO_AF LL_GPIO_AF_2 #define PWM_IRQHandler TIM5_IRQHandler #define PWM_IRQn TIM5_IRQn - #define PWM_GPIOA_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) - #define ADC_GPIOA_PINS (STICKS_PWM_ENABLED() ? 0 : (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3)) - #define ADC_GPIOC_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2) - #define ADC_CHANNEL_STICK_RV ADC_Channel_3 // ADC1_IN3 - #define ADC_CHANNEL_STICK_RH ADC_Channel_2 // ADC1_IN2 - #define ADC_CHANNEL_STICK_LV ADC_Channel_1 // ADC1_IN1 - #define ADC_CHANNEL_STICK_LH ADC_Channel_0 // ADC1_IN0 - #define ADC_CHANNEL_POT1 ADC_Channel_11 // ADC1_IN11 - #define ADC_CHANNEL_POT2 ADC_Channel_12 // ADC1_IN12 - #define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10 + #define PWM_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_STICK_LH) + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_STICK_LH) + #define ADC_GPIOC_PINS (ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_BATT) + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_3 // ADC1_IN3 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_0 // ADC1_IN0 + #define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_11 // ADC1_IN11 + #define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_12 // ADC1_IN12 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_10 // ADC1_IN10 #define ADC_VREF_PREC2 330 #elif defined(RADIO_T8) // No pots - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 - #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 - #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 - #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 - #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_3 // PA.03 - #define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0 - #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 - #define ADC_CHANNEL_STICK_LV ADC_Channel_2 // ADC1_IN2 - #define ADC_CHANNEL_STICK_LH ADC_Channel_3 // ADC1_IN3 - #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 + #define ADC_RCC_APB2Periph 0 + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_1 // PA.01 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_3 // PA.03 + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_3 // ADC1_IN3 + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_0 // PC.00 #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV) #define ADC_GPIOB_PINS 0 #define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT - #define ADC_CHANNEL_BATT ADC_Channel_10 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_10 #define ADC_VREF_PREC2 300 #elif defined(RADIO_COMMANDO8) - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph RCC_APB1Periph_TIM5 - #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 - #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_3 // PA.03 - #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_0 // PA.00 - #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_1 // PA.01 - #define ADC_CHANNEL_STICK_RV ADC_Channel_2 // ADC1_IN2 - #define ADC_CHANNEL_STICK_RH ADC_Channel_3 // ADC1_IN3 - #define ADC_CHANNEL_STICK_LV ADC_Channel_0 // ADC1_IN0 - #define ADC_CHANNEL_STICK_LH ADC_Channel_1 // ADC1_IN1 - #define ADC_GPIO_PIN_BATT GPIO_Pin_5 // PC.05 + #define ADC_RCC_APB2Periph 0 + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_3 // PA.03 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_1 // PA.01 + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_3 // ADC1_IN3 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_1 // ADC1_IN1 + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_5 // PC.05 #define ADC_GPIOB_PINS 0 #define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT - #define ADC_CHANNEL_BATT ADC_Channel_15 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_15 #define ADC_VREF_PREC2 320 - #define ADC_GPIOA_PINS (STICKS_PWM_ENABLED() ? 0 : (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV)) + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV) #define PWM_IRQHandler TIM5_IRQHandler + #define PWM_STICKS #define PWM_TIMER TIM5 #define PWM_GPIO GPIOA #define PWM_GPIO_AF GPIO_AF_TIM5 #define PWM_IRQn TIM5_IRQn - #define PWM_GPIOA_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) + #define PWM_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV) #define STICK_CHANNEL_CHANGE #define STICK_PWM_CHANNEL_0 1 #define STICK_PWM_CHANNEL_1 0 #define STICK_PWM_CHANNEL_2 2 #define STICK_PWM_CHANNEL_3 3 #elif defined(RADIO_TLITE) || defined(RADIO_LR3PRO) - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 - #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 - #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 - #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 - #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_3 // PA.03 - #define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0 - #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 - #define ADC_CHANNEL_STICK_LV ADC_Channel_2 // ADC1_IN2 - #define ADC_CHANNEL_STICK_LH ADC_Channel_3 // ADC1_IN3 - #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 + #define ADC_RCC_APB2Periph 0 + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_1 // PA.01 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_3 // PA.03 + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_3 // ADC1_IN3 + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_0 // PC.00 #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV) #define ADC_GPIOB_PINS 0 #define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT - #define ADC_CHANNEL_BATT ADC_Channel_10 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_10 #define ADC_VREF_PREC2 330 #elif defined(RADIO_TPRO) #define HARDWARE_POT1 #define HARDWARE_POT2 - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 - #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 - #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 - #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 - #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_3 // PA.03 - #define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0 - #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 - #define ADC_CHANNEL_STICK_LV ADC_Channel_2 // ADC1_IN2 - #define ADC_CHANNEL_STICK_LH ADC_Channel_3 // ADC1_IN3 - #define ADC_GPIO_PIN_POT1 GPIO_Pin_0 // PB.00 - #define ADC_GPIO_PIN_POT2 GPIO_Pin_6 // PA.06 - #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 + #define ADC_RCC_APB2Periph 0 + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_1 // PA.01 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_3 // PA.03 + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_3 // ADC1_IN3 + #define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_0 // PB.00 + #define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_6 // PA.06 + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_0 // PC.00 #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT2) #define ADC_GPIOB_PINS ADC_GPIO_PIN_POT1 #define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT - #define ADC_CHANNEL_POT1 ADC_Channel_6 - #define ADC_CHANNEL_POT2 ADC_Channel_8 - #define ADC_CHANNEL_BATT ADC_Channel_10 + #define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_6 + #define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_8 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_10 #define ADC_VREF_PREC2 330 #elif defined(PCBX7) #define HARDWARE_POT1 #define HARDWARE_POT2 - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 - #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 - #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 - #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 - #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_3 // PA.03 - #define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0 - #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 - #define ADC_CHANNEL_STICK_LV ADC_Channel_2 // ADC1_IN2 - #define ADC_CHANNEL_STICK_LH ADC_Channel_3 // ADC1_IN3 - #define ADC_GPIO_PIN_POT1 GPIO_Pin_0 // PB.00 - #define ADC_GPIO_PIN_POT2 GPIO_Pin_6 // PA.06 - #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 + #define ADC_RCC_APB2Periph 0 + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_1 // PA.01 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_3 // PA.03 + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_3 // ADC1_IN3 + #define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_0 // PB.00 + #define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_6 // PA.06 + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_0 // PC.00 #if defined(RADIO_BOXER) #define HARDWARE_POT3 // 6 POS - #define ADC_GPIO_PIN_POT3 GPIO_Pin_5 // PA.05 - #define ADC_CHANNEL_POT3 ADC_Channel_5 + #define ADC_GPIO_PIN_POT3 LL_GPIO_PIN_5 // PA.05 + #define ADC_CHANNEL_POT3 LL_ADC_CHANNEL_5 #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_POT3) #define ADC_GPIOA_PINS_FS (ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_POT3) #else - #define ADC_CHANNEL_POT3 0 #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT2) #endif #define ADC_GPIOB_PINS ADC_GPIO_PIN_POT1 #define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT - #define ADC_CHANNEL_POT1 ADC_Channel_8 - #define ADC_CHANNEL_POT2 ADC_Channel_6 - #define ADC_CHANNEL_BATT ADC_Channel_10 + #define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_8 + #define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_6 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_10 #define ADC_VREF_PREC2 330 #elif defined(PCBX9LITE) #define HARDWARE_POT1 - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 - #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 - #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_0 // PA.00 - #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_1 // PA.01 - #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_3 // PA.03 - #define ADC_CHANNEL_STICK_LH ADC_Channel_0 // ADC1_IN0 - #define ADC_CHANNEL_STICK_LV ADC_Channel_1 // ADC1_IN1 - #define ADC_CHANNEL_STICK_RV ADC_Channel_2 // ADC1_IN2 - #define ADC_CHANNEL_STICK_RH ADC_Channel_3 // ADC1_IN3 - #define ADC_GPIO_PIN_POT1 GPIO_Pin_1 // PC.01 - #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 - #define ADC_GPIOA_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) - #define ADC_GPIOC_PINS (GPIO_Pin_0 | GPIO_Pin_1) - #define ADC_CHANNEL_POT1 ADC_Channel_11 // ADC1_IN11 - #define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10 + #define ADC_RCC_APB2Periph 0 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_1 // PA.01 + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_3 // PA.03 + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_3 // ADC1_IN3 + #define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_1 // PC.01 + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_0 // PC.00 + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH) + #define ADC_GPIOC_PINS (ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_BATT) + #define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_11 // ADC1_IN11 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_10 // ADC1_IN10 #define ADC_VREF_PREC2 300 #else #define HARDWARE_POT1 #define HARDWARE_POT2 - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 - #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 - #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 - #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 - #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_3 // PA.03 - #define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0 - #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 - #define ADC_CHANNEL_STICK_LH ADC_Channel_2 // ADC1_IN2 - #define ADC_CHANNEL_STICK_LV ADC_Channel_3 // ADC1_IN3 - #define ADC_GPIO_PIN_POT1 GPIO_Pin_6 // PA.06 - #define ADC_GPIO_PIN_POT2 GPIO_Pin_0 // PB.00 - #define ADC_GPIO_PIN_SLIDER1 GPIO_Pin_4 // PC.04 - #define ADC_GPIO_PIN_SLIDER2 GPIO_Pin_5 // PC.05 - #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 + #define ADC_RCC_APB2Periph 0 + #define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_0 // PA.00 + #define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_1 // PA.01 + #define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_2 // PA.02 + #define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_3 // PA.03 + #define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_3 // ADC1_IN3 + #define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_6 // PA.06 + #define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_0 // PB.00 + #define ADC_GPIO_PIN_SLIDER1 LL_GPIO_PIN_4 // PC.04 + #define ADC_GPIO_PIN_SLIDER2 LL_GPIO_PIN_5 // PC.05 + #define ADC_GPIO_PIN_BATT LL_GPIO_PIN_0 // PC.00 #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT1) #define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2) #define ADC_GPIOC_PINS (ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2 | ADC_GPIO_PIN_BATT) - #define ADC_CHANNEL_POT1 ADC_Channel_6 - #define ADC_CHANNEL_POT2 ADC_Channel_8 - #define ADC_CHANNEL_POT3 ADC_Channel_9 - #define ADC_CHANNEL_SLIDER1 ADC_Channel_14 - #define ADC_CHANNEL_SLIDER2 ADC_Channel_15 - #define ADC_CHANNEL_BATT ADC_Channel_10 + #define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_6 + #define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_8 + #define ADC_CHANNEL_POT3 LL_ADC_CHANNEL_9 + #define ADC_CHANNEL_SLIDER1 LL_ADC_CHANNEL_14 + #define ADC_CHANNEL_SLIDER2 LL_ADC_CHANNEL_15 + #define ADC_CHANNEL_BATT LL_ADC_CHANNEL_10 #define ADC_VREF_PREC2 330 #endif +#if defined(PCBX9E) + #if defined(HORUS_STICKS) + #define ADC_DIRECTION { 1,-1,1,-1,-1,-1,-1,1, -1,1,1,-1, -1,-1 } + #else + #define ADC_DIRECTION { 1,1,-1,-1,-1,-1,-1,1, -1,1,1,-1, -1,-1 } + #endif // HORUS_STICKS +#elif defined(PCBX9DP) + #define ADC_DIRECTION {1,-1,1,-1, 1,1,-1, 1,1, 1, 1} +#elif defined(PCBX9D) + #define ADC_DIRECTION {1,-1,1,-1, 1,1,0, 1,1, 1, 1} +#elif defined(RADIO_TX12) + #define ADC_DIRECTION {-1,1,-1,1, -1,-1, 1, 1} +#elif defined(RADIO_TX12MK2) + #define ADC_DIRECTION {-1,1,-1,1, 1,-1} +#elif defined(RADIO_BOXER) + #define ADC_DIRECTION {1,-1,1,-1, -1,-1, 1} +#elif defined(RADIO_ZORRO) + #define ADC_DIRECTION {-1, 1, 1, -1, -1, 1, 1, 1} +#elif defined(RADIO_TPRO) + #define ADC_DIRECTION {1,-1,1,-1, 1,1, 1, 1} +#elif defined(PCBX7) + #define ADC_DIRECTION {-1,1,-1,1, 1,1, 1, 1} +#elif defined(PCBX9LITE) + #define ADC_DIRECTION {-1,1,-1,1, 1,1, 1} +#elif defined(PCBXLITE) + #define ADC_DIRECTION {1,-1,-1,1, -1,1, 1, 1} +#endif + // PWR and LED driver #define PWR_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) @@ -1975,15 +2025,15 @@ #define TELEMETRY_TIMER_IRQHandler TIM1_TRG_COM_TIM11_IRQHandler // PCBREV -#if defined(RADIO_X7) - #define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOA - #define PCBREV_GPIO GPIOA - #define PCBREV_GPIO_PIN GPIO_Pin_14 // PA.14 - #define PCBREV_GPIO_PULL_DOWN - #define PCBREV_VALUE() GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) -#else +// #if defined(RADIO_X7) + // #define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOA + // #define PCBREV_GPIO GPIOA + // #define PCBREV_GPIO_PIN GPIO_Pin_14 // PA.14 + // #define PCBREV_GPIO_PULL_DOWN + // #define PCBREV_VALUE() GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) +// #else #define PCBREV_RCC_AHB1Periph 0 -#endif +// #endif // USB Charger diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp deleted file mode 100644 index a999df0bf..000000000 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ /dev/null @@ -1,73 +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 "intmodule_pulses_driver.h" - -#include "hal.h" -#include "board.h" -#include "timers_driver.h" - -#if defined(INTMODULE_TIMER) - -static stm32_pulse_dma_tc_cb_t _int_timer_DMA_TC_Callback; - -const stm32_pulse_timer_t intmoduleTimer = { - .GPIOx = INTMODULE_TX_GPIO, - .GPIO_Pin = INTMODULE_TX_GPIO_PIN, - .GPIO_Alternate = INTMODULE_TX_GPIO_AF, - .TIMx = INTMODULE_TIMER, - .TIM_Freq = INTMODULE_TIMER_FREQ, - .TIM_Channel = INTMODULE_TIMER_Channel, - .TIM_IRQn = INTMODULE_TIMER_IRQn, - .DMAx = INTMODULE_TIMER_DMA, - .DMA_Stream = INTMODULE_TIMER_DMA_STREAM, - .DMA_Channel = INTMODULE_TIMER_DMA_CHANNEL, - .DMA_IRQn = INTMODULE_TIMER_DMA_STREAM_IRQn, - .DMA_TC_CallbackPtr = &_int_timer_DMA_TC_Callback, -}; - -// Make sure the timer channel is supported -static_assert(__STM32_PULSE_IS_TIMER_CHANNEL_SUPPORTED(INTMODULE_TIMER_Channel), - "Unsupported timer channel"); - -// Make sure the DMA channel is supported -static_assert(__STM32_PULSE_IS_DMA_STREAM_SUPPORTED(INTMODULE_TIMER_DMA_STREAM), - "Unsupported DMA stream"); - -#if !defined(INTMODULE_TIMER_DMA_IRQHandler) -#error "Missing INTMODULE_TIMER_DMA_IRQHandler definition" -#endif - -extern "C" void INTMODULE_TIMER_DMA_IRQHandler() -{ - stm32_pulse_dma_tc_isr(&intmoduleTimer); -} - -#if !defined(INTMODULE_TIMER_IRQHandler) -#error "Missing INTMODULE_TIMER_IRQHandler definition" -#endif - -extern "C" void INTMODULE_TIMER_IRQHandler() -{ - stm32_pulse_tim_update_isr(&intmoduleTimer); -} - -#endif // INTMODULE_TIMER diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp deleted file mode 100644 index a39784c6d..000000000 --- a/radio/src/targets/taranis/keys_driver.cpp +++ /dev/null @@ -1,333 +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 "board.h" - -uint32_t readKeys() -{ - uint32_t result = 0; - - if (~KEYS_GPIO_REG_ENTER & KEYS_GPIO_PIN_ENTER) - result |= 1 << KEY_ENTER; - -#if defined(KEYS_GPIO_PIN_MENU) - if (~KEYS_GPIO_REG_MENU & KEYS_GPIO_PIN_MENU) - result |= 1 << KEY_MENU; -#endif - -#if defined(KEYS_GPIO_PIN_PAGE) - if (~KEYS_GPIO_REG_PAGE & KEYS_GPIO_PIN_PAGE) - result |= 1 << KEY_PAGE; -#endif - -#if defined(KEYS_GPIO_PIN_PAGEUP) - if (~KEYS_GPIO_REG_PAGEUP & KEYS_GPIO_PIN_PAGEUP) - result |= 1 << KEY_PAGEUP; -#endif - -#if defined(KEYS_GPIO_PIN_PAGEDN) - if (~KEYS_GPIO_REG_PAGEDN & KEYS_GPIO_PIN_PAGEDN) - result |= 1 << KEY_PAGEDN; -#endif - -#if defined(KEYS_GPIO_PIN_SYS) - if (~KEYS_GPIO_REG_SYS & KEYS_GPIO_PIN_SYS) - result |= 1 << KEY_SYS; -#endif - -#if defined(KEYS_GPIO_PIN_MDL) - if (~KEYS_GPIO_REG_MDL & KEYS_GPIO_PIN_MDL) - result |= 1 << KEY_MODEL; -#endif - -#if defined(KEYS_GPIO_PIN_TELE) - if (~KEYS_GPIO_REG_TELE & KEYS_GPIO_PIN_TELE) - result |= 1 << KEY_TELE; -#endif - - if (~KEYS_GPIO_REG_EXIT & KEYS_GPIO_PIN_EXIT) - result |= 1 << KEY_EXIT; - -#if defined(KEYS_GPIO_PIN_PLUS) - if (~KEYS_GPIO_REG_PLUS & KEYS_GPIO_PIN_PLUS) - result |= 1 << KEY_PLUS; - if (~KEYS_GPIO_REG_MINUS & KEYS_GPIO_PIN_MINUS) - result |= 1 << KEY_MINUS; -#endif - -#if defined(KEYS_GPIO_PIN_LEFT) - if (~KEYS_GPIO_REG_LEFT & KEYS_GPIO_PIN_LEFT) - result |= 1 << KEY_LEFT; - if (~KEYS_GPIO_REG_RIGHT & KEYS_GPIO_PIN_RIGHT) - result |= 1 << KEY_RIGHT; - if (~KEYS_GPIO_REG_UP & KEYS_GPIO_PIN_UP) - result |= 1 << KEY_UP; - if (~KEYS_GPIO_REG_DOWN & KEYS_GPIO_PIN_DOWN) - result |= 1 << KEY_DOWN; -#endif - -#if defined(KEYS_GPIO_PIN_SHIFT) - if (~KEYS_GPIO_REG_SHIFT & KEYS_GPIO_PIN_SHIFT) - result |= 1 << KEY_SHIFT; -#endif - -#if defined(KEYS_GPIO_PIN_BIND) - if (~KEYS_GPIO_REG_BIND & KEYS_GPIO_PIN_BIND) - result |= 1 << KEY_BIND; -#endif - // if (result != 0) TRACE("readKeys(): result=0x%02x", result); - - return result; -} - -uint32_t readTrims() -{ - uint32_t result = 0; - - if (~TRIMS_GPIO_REG_LHL & TRIMS_GPIO_PIN_LHL) - result |= 0x01; - if (~TRIMS_GPIO_REG_LHR & TRIMS_GPIO_PIN_LHR) - result |= 0x02; - if (~TRIMS_GPIO_REG_LVD & TRIMS_GPIO_PIN_LVD) - result |= 0x04; - if (~TRIMS_GPIO_REG_LVU & TRIMS_GPIO_PIN_LVU) - result |= 0x08; - -#if defined(PCBXLITE) - if (IS_SHIFT_PRESSED()) - result = ((result & 0x03) << 6) | ((result & 0x0c) << 2); -#else - if (~TRIMS_GPIO_REG_RVD & TRIMS_GPIO_PIN_RVD) - result |= 0x10; - if (~TRIMS_GPIO_REG_RVU & TRIMS_GPIO_PIN_RVU) - result |= 0x20; - if (~TRIMS_GPIO_REG_RHL & TRIMS_GPIO_PIN_RHL) - result |= 0x40; - if (~TRIMS_GPIO_REG_RHR & TRIMS_GPIO_PIN_RHR) - result |= 0x80; -#endif - - // TRACE("readTrims(): result=0x%02x", result); - - return result; -} - -bool trimDown(uint8_t idx) -{ - return readTrims() & (1 << idx); -} - -bool keyDown() -{ - return readKeys() || readTrims(); -} - -#if defined(PCBX9E) - #define ADD_2POS_CASE(x) \ - case SW_S ## x ## 2: \ - xxx = SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \ - break; \ - case SW_S ## x ## 0: \ - xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \ - break -#else - #define ADD_2POS_CASE(x) \ - case SW_S ## x ## 0: \ - xxx = SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \ - break; \ - case SW_S ## x ## 2: \ - xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \ - break -#endif - -#define ADD_3POS_CASE(x, i) \ - case SW_S ## x ## 0: \ - xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ - if (IS_CONFIG_3POS(i)) { \ - xxx = xxx && (~SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ - } \ - break; \ - case SW_S ## x ## 1: \ - xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H) && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ - break; \ - case SW_S ## x ## 2: \ - xxx = (~SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ - if (IS_CONFIG_3POS(i)) { \ - xxx = xxx && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ - } \ - break - -#if !defined(BOOT) -#include "opentx.h" - -uint32_t switchState(uint8_t index) -{ - uint32_t xxx = 0; - - switch (index) { - -#if defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_T8) || defined(RADIO_COMMANDO8) - ADD_2POS_CASE(A); - ADD_3POS_CASE(B, 1); - ADD_3POS_CASE(C, 2); -#elif defined(RADIO_TLITE) || defined(RADIO_TPRO) || defined(RADIO_LR3PRO) - ADD_3POS_CASE(A, 0); - ADD_3POS_CASE(B, 1); - ADD_2POS_CASE(C); - ADD_2POS_CASE(D); -#else - ADD_3POS_CASE(A, 0); - ADD_3POS_CASE(B, 1); - ADD_3POS_CASE(C, 2); -#endif -#if defined(PCBX9LITES) - ADD_2POS_CASE(D); - ADD_2POS_CASE(E); - ADD_2POS_CASE(F); - ADD_2POS_CASE(G); -#elif defined(PCBX9LITE) - ADD_2POS_CASE(D); - ADD_2POS_CASE(E); -#elif defined(PCBXLITES) - ADD_3POS_CASE(D, 3); - ADD_2POS_CASE(E); - ADD_2POS_CASE(F); - // no SWG and SWH on XLITES -#elif defined(PCBXLITE) - ADD_3POS_CASE(D, 3); - // no SWE, SWF, SWG and SWH on XLITE -#elif defined(PCBX7ACCESS) - ADD_3POS_CASE(D, 3); - ADD_2POS_CASE(F); - ADD_2POS_CASE(H); - ADD_2POS_CASE(I); - // no SWJ on XLITE -#elif defined(RADIO_ZORRO) - ADD_2POS_CASE(D); - ADD_2POS_CASE(E); - ADD_2POS_CASE(F); - ADD_2POS_CASE(G); - ADD_2POS_CASE(H); -#elif defined(RADIO_TX12MK2) - ADD_2POS_CASE(D); - ADD_3POS_CASE(E, 4); - ADD_3POS_CASE(F, 5); -#elif defined(RADIO_BOXER) - ADD_2POS_CASE(D); - ADD_2POS_CASE(E); - ADD_2POS_CASE(F); -#elif defined(RADIO_TX12) || defined(RADIO_ZORRO) - ADD_2POS_CASE(D); - ADD_3POS_CASE(E, 4); - ADD_3POS_CASE(F, 5); - ADD_2POS_CASE(I); - ADD_2POS_CASE(J); -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - ADD_2POS_CASE(D); -#elif defined(RADIO_TLITE) || defined(RADIO_LR3PRO) - // Only 4 switches -#elif defined(RADIO_TPRO) - ADD_2POS_CASE(E); - ADD_2POS_CASE(F); - ADD_2POS_CASE(G); - ADD_2POS_CASE(H); - ADD_2POS_CASE(I); - ADD_2POS_CASE(J); -#elif defined(PCBX7) - ADD_3POS_CASE(D, 3); -#if defined(RADIO_T12) - ADD_2POS_CASE(G); -#else - ADD_2POS_CASE(F); -#endif - ADD_2POS_CASE(H); - ADD_2POS_CASE(I); - ADD_2POS_CASE(J); -#else - ADD_3POS_CASE(D, 3); - ADD_3POS_CASE(E, 4); - ADD_2POS_CASE(F); - ADD_3POS_CASE(G, 6); - ADD_2POS_CASE(H); -#endif - -#if defined(RADIO_X9DP2019) - ADD_2POS_CASE(I); -#endif - -#if defined(PCBX9E) - ADD_3POS_CASE(I, 8); - ADD_3POS_CASE(J, 9); - ADD_3POS_CASE(K, 10); - ADD_3POS_CASE(L, 11); - ADD_3POS_CASE(M, 12); - ADD_3POS_CASE(N, 13); - ADD_3POS_CASE(O, 14); - ADD_3POS_CASE(P, 15); - ADD_3POS_CASE(Q, 16); - ADD_3POS_CASE(R, 17); -#endif - - default: - break; - } - - // TRACE("switch %d => %d", index, xxx); - return xxx; -} -#endif - -void keysInit() -{ - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - -#if defined(KEYS_GPIOA_PINS) - INIT_KEYS_PINS(GPIOA); -#endif - -#if defined(KEYS_GPIOB_PINS) - INIT_KEYS_PINS(GPIOB); -#endif - -#if defined(KEYS_GPIOC_PINS) - INIT_KEYS_PINS(GPIOC); -#endif - -#if defined(KEYS_GPIOD_PINS) - INIT_KEYS_PINS(GPIOD); -#endif - -#if defined(KEYS_GPIOE_PINS) - INIT_KEYS_PINS(GPIOE); -#endif - -#if defined(KEYS_GPIOF_PINS) - INIT_KEYS_PINS(GPIOF); -#endif - -#if defined(KEYS_GPIOG_PINS) - INIT_KEYS_PINS(GPIOG); -#endif -} diff --git a/radio/src/targets/taranis/led_driver.cpp b/radio/src/targets/taranis/led_driver.cpp index 224c36953..4090c7d7a 100644 --- a/radio/src/targets/taranis/led_driver.cpp +++ b/radio/src/targets/taranis/led_driver.cpp @@ -56,7 +56,9 @@ void ledInit() } #if defined(FUNCTION_SWITCHES) -constexpr uint32_t fsLeds[] = {FSLED_GPIO_PIN_1, FSLED_GPIO_PIN_2, FSLED_GPIO_PIN_3, FSLED_GPIO_PIN_4, FSLED_GPIO_PIN_5, FSLED_GPIO_PIN_6}; +constexpr uint32_t fsLeds[] = {FSLED_GPIO_PIN_1, FSLED_GPIO_PIN_2, + FSLED_GPIO_PIN_3, FSLED_GPIO_PIN_4, + FSLED_GPIO_PIN_5, FSLED_GPIO_PIN_6}; void fsLedOff(uint8_t index) { @@ -67,6 +69,11 @@ void fsLedOn(uint8_t index) { GPIO_FSLED_GPIO_ON(FSLED_GPIO, fsLeds[index]); } + +bool getFSLedState(uint8_t index) +{ + return (FSLED_GPIO->ODR & fsLeds[index]); +} #endif void ledOff() diff --git a/radio/src/targets/taranis/startup_stm32f413vgtx.s b/radio/src/targets/taranis/startup_stm32f413vgtx.s new file mode 100644 index 000000000..155b477ef --- /dev/null +++ b/radio/src/targets/taranis/startup_stm32f413vgtx.s @@ -0,0 +1,575 @@ +/** + ****************************************************************************** + * @file startup_stm32f413xx.s + * @author MCD Application Team + * @brief STM32F413xx Devices vector table for GCC based toolchains. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + bl pwrResetHandler /*jump to WDT reset handler where soft power control pin is turned on as soon as possible */ + +/* Copy the data segment initializers from flash to SRAM */ + ldr r0, =_sdata + ldr r1, =_edata + ldr r2, =_sidata + movs r3, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r4, [r2, r3] + str r4, [r0, r3] + adds r3, r3, #4 + +LoopCopyDataInit: + adds r4, r0, r3 + cmp r4, r1 + bcc CopyDataInit + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + ldr r4, =_ebss + movs r3, #0 + b LoopFillZerobss + +FillZerobss: + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + cmp r2, r4 + bcc FillZerobss + +/*Paint Main Stack */ + ldr r2, = _main_stack_start +PaintMainStack: + movs r3, #0x55555555 + str r3, [r2], #4 +LoopPaintMainStack: + ldr r3, = _estack + cmp r2, r3 + bcc PaintMainStack + +/* Call the clock system initialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + bx lr +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * @param None + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex M3. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +*******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + + /* External Interrupts */ + .word WWDG_IRQHandler /* Window WatchDog */ + .word PVD_IRQHandler /* PVD through EXTI Line detection */ + .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ + .word FLASH_IRQHandler /* FLASH */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line0 */ + .word EXTI1_IRQHandler /* EXTI Line1 */ + .word EXTI2_IRQHandler /* EXTI Line2 */ + .word EXTI3_IRQHandler /* EXTI Line3 */ + .word EXTI4_IRQHandler /* EXTI Line4 */ + .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ + .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ + .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ + .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ + .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ + .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ + .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ + .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ + .word CAN1_TX_IRQHandler /* CAN1 TX */ + .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* External Line[9:5]s */ + .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ + .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ + .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* External Line[15:10]s */ + .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ + .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ + .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ + .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ + .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ + .word FSMC_IRQHandler /* FSMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6, DAC1 and DAC2 */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word DFSDM1_FLT0_IRQHandler /* DFSDM1 Filter0 */ + .word DFSDM1_FLT1_IRQHandler /* DFSDM1 Filter1 */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word CAN3_TX_IRQHandler /* CAN3 TX */ + .word CAN3_RX0_IRQHandler /* CAN3 RX0 */ + .word CAN3_RX1_IRQHandler /* CAN3 RX1 */ + .word CAN3_SCE_IRQHandler /* CAN3 SCE */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word RNG_IRQHandler /* RNG */ + .word FPU_IRQHandler /* FPU */ + .word UART7_IRQHandler /* UART7 */ + .word UART8_IRQHandler /* UART8 */ + .word SPI4_IRQHandler /* SPI4 */ + .word SPI5_IRQHandler /* SPI5 */ + .word 0 /* Reserved */ + .word SAI1_IRQHandler /* SAI1 */ + .word UART9_IRQHandler /* UART9 */ + .word UART10_IRQHandler /* UART10 */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word QUADSPI_IRQHandler /* QuadSPI */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word FMPI2C1_EV_IRQHandler /* FMPI2C1 Event */ + .word FMPI2C1_ER_IRQHandler /* FMPI2C1 Error */ + .word LPTIM1_IRQHandler /* LPTIM1 */ + .word DFSDM2_FLT0_IRQHandler /* DFSDM2 Filter0 */ + .word DFSDM2_FLT1_IRQHandler /* DFSDM2 Filter1 */ + .word DFSDM2_FLT2_IRQHandler /* DFSDM2 Filter2 */ + .word DFSDM2_FLT3_IRQHandler /* DFSDM2 Filter3 */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak FSMC_IRQHandler + .thumb_set FSMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak DFSDM1_FLT0_IRQHandler + .thumb_set DFSDM1_FLT0_IRQHandler,Default_Handler + + .weak DFSDM1_FLT1_IRQHandler + .thumb_set DFSDM1_FLT1_IRQHandler,Default_Handler + + .weak CAN2_TX_IRQHandler + .thumb_set CAN2_TX_IRQHandler,Default_Handler + + .weak CAN2_RX0_IRQHandler + .thumb_set CAN2_RX0_IRQHandler,Default_Handler + + .weak CAN2_RX1_IRQHandler + .thumb_set CAN2_RX1_IRQHandler,Default_Handler + + .weak CAN2_SCE_IRQHandler + .thumb_set CAN2_SCE_IRQHandler,Default_Handler + + .weak OTG_FS_IRQHandler + .thumb_set OTG_FS_IRQHandler,Default_Handler + + .weak DMA2_Stream5_IRQHandler + .thumb_set DMA2_Stream5_IRQHandler,Default_Handler + + .weak DMA2_Stream6_IRQHandler + .thumb_set DMA2_Stream6_IRQHandler,Default_Handler + + .weak DMA2_Stream7_IRQHandler + .thumb_set DMA2_Stream7_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak CAN3_TX_IRQHandler + .thumb_set CAN3_TX_IRQHandler,Default_Handler + + .weak CAN3_RX0_IRQHandler + .thumb_set CAN3_RX0_IRQHandler,Default_Handler + + .weak CAN3_RX1_IRQHandler + .thumb_set CAN3_RX1_IRQHandler,Default_Handler + + .weak CAN3_SCE_IRQHandler + .thumb_set CAN3_SCE_IRQHandler,Default_Handler + + .weak RNG_IRQHandler + .thumb_set RNG_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + + .weak UART7_IRQHandler + .thumb_set UART7_IRQHandler,Default_Handler + + .weak UART8_IRQHandler + .thumb_set UART8_IRQHandler,Default_Handler + + .weak SPI4_IRQHandler + .thumb_set SPI4_IRQHandler,Default_Handler + + .weak SPI5_IRQHandler + .thumb_set SPI5_IRQHandler,Default_Handler + + .weak SAI1_IRQHandler + .thumb_set SAI1_IRQHandler,Default_Handler + + .weak UART9_IRQHandler + .thumb_set UART9_IRQHandler,Default_Handler + + .weak UART10_IRQHandler + .thumb_set UART10_IRQHandler,Default_Handler + + .weak QUADSPI_IRQHandler + .thumb_set QUADSPI_IRQHandler,Default_Handler + + .weak FMPI2C1_EV_IRQHandler + .thumb_set FMPI2C1_EV_IRQHandler,Default_Handler + + .weak FMPI2C1_ER_IRQHandler + .thumb_set FMPI2C1_ER_IRQHandler,Default_Handler + + .weak LPTIM1_IRQHandler + .thumb_set LPTIM1_IRQHandler,Default_Handler + + .weak DFSDM2_FLT0_IRQHandler + .thumb_set DFSDM2_FLT0_IRQHandler,Default_Handler + + .weak DFSDM2_FLT1_IRQHandler + .thumb_set DFSDM2_FLT1_IRQHandler,Default_Handler + + .weak DFSDM2_FLT2_IRQHandler + .thumb_set DFSDM2_FLT2_IRQHandler,Default_Handler + + .weak DFSDM2_FLT3_IRQHandler + .thumb_set DFSDM2_FLT3_IRQHandler,Default_Handler diff --git a/radio/src/targets/taranis/stm32f413_flash.ld b/radio/src/targets/taranis/stm32f413_flash.ld new file mode 100644 index 000000000..8c98ab1ea --- /dev/null +++ b/radio/src/targets/taranis/stm32f413_flash.ld @@ -0,0 +1,172 @@ +/* +****************************************************************************** +** +** @file : LinkerScript.ld +** +** @brief : Linker script for STM32F413VGTx Device from STM32F4 series +** 1024Kbytes FLASH +** 320Kbytes RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used +** +** Target : STMicroelectronics STM32 +** +****************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */ +_heap_end = 0x20050000; /* end of 320K SRAM */ + +_Min_Heap_Size = 0 ; /* required amount of heap */ +_Min_Stack_Size = 0x400 ; /* required amount of stack */ + +_Main_Stack_Size = 1024; /* required amount of stack for interrupt stack (Main stack) */ + +/* Main stack end */ +_main_stack_start = _estack - _Main_Stack_Size; + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 320K + FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K +} + +/* Sections */ +SECTIONS +{ + /* The program code and other data into "FLASH" Rom type memory */ + .text : + { + FILL(0xFFFF) + + CREATE_OBJECT_SYMBOLS + + KEEP(*(.bootloader)) /* Bootloader code */ + + . = 0x8000; /* Set the start of the main program */ + _stext = .; /* Provide the name for the start of this section */ + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + KEEP(*(.fwversiondata)) + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + *(.data.__global_locale) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >FLASH + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >FLASH + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >FLASH + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >FLASH + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >FLASH + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into "RAM" Ram type memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + *(.RamFunc) /* .RamFunc sections */ + *(.RamFunc*) /* .RamFunc* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + + } >RAM AT> FLASH + + /* Uninitialized data section into "RAM" Ram type memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + /* Remove information from the compiler libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 8086c6385..1cf1db139 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -96,13 +96,9 @@ TASK_FUNCTION(menusTask) toplcdOff(); #endif -#if defined(PCBHORUS) - ledOff(); -#endif - drawSleepBitmap(); opentxClose(); - boardOff(); // Only turn power off if necessary + boardOff(); TASK_RETURN(); } diff --git a/radio/src/tasks/mixer_task.cpp b/radio/src/tasks/mixer_task.cpp index 330e44977..962beea10 100644 --- a/radio/src/tasks/mixer_task.cpp +++ b/radio/src/tasks/mixer_task.cpp @@ -24,6 +24,9 @@ #include "mixer_scheduler.h" #include "opentx.h" +#include "switches.h" + +#include "watchdog_driver.h" RTOS_TASK_HANDLE mixerTaskId; RTOS_DEFINE_STACK(mixerTaskId, mixerStack, MIXER_STACK_SIZE); diff --git a/radio/src/tests/CMakeLists.txt b/radio/src/tests/CMakeLists.txt index 12e5d4891..2db6f8f08 100644 --- a/radio/src/tests/CMakeLists.txt +++ b/radio/src/tests/CMakeLists.txt @@ -9,7 +9,6 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) include_directories(${CMAKE_CURRENT_BINARY_DIR}) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS_DEBUG} -O0 -fsanitize=address") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${WARNING_FLAGS} -fsanitize=address") - use_cxx11() # ensure gnu++11 in CXX_FLAGS with CMake < 3.1 if(PCB STREQUAL X12S OR PCB STREQUAL X10) @@ -40,7 +39,9 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) endif() - file(GLOB TEST_SRC_FILES ${RADIO_SRC_DIR}/tests/*.cpp) + file(GLOB TEST_SRC_FILES ${RADIO_SRC_DIR}/tests/*.cpp + CONFIGURE_DEPENDS "${RADIO_SRC_DIR}/tests/*.cpp") + set(TEST_SRC_FILES ${TEST_SRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/location.h ${SIMU_SRC} @@ -62,6 +63,4 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) endif() target_link_libraries(gtests-radio gtests-radio-lib pthread Qt5::Core Qt5::Widgets) message(STATUS "Added optional gtests target") -else() - message(WARNING "WARNING: gtests target will not be available (check that GTEST_INCDIR, GTEST_SRCDIR, and Qt5Widgets are configured).") endif() diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index b63637655..7e76d818a 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -209,7 +209,19 @@ TEST(Conversions, ConversionXLiteFrom23) } #endif -#if defined(PCBX7) && (STORAGE_CONVERSIONS <= 219) +#if defined(RADIO_X7) && (STORAGE_CONVERSIONS <= 219) + +static swarnstate_t get_configured_switch_warn_mask() +{ + swarnstate_t mask = 0; + for (uint8_t i=0; i #include #include "gtests.h" +#include "hal/adc_driver.h" using ::testing::TestEventListener; using ::testing::EmptyTestEventListener; @@ -121,18 +122,10 @@ class TersePrinter : public EmptyTestEventListener { } // anonymous namespace int32_t lastAct = 0; -uint16_t anaInValues[NUM_STICKS+NUM_POTS+NUM_SLIDERS] = { 0 }; -uint16_t anaIn(uint8_t chan) -{ - if (chan < NUM_STICKS+NUM_POTS+NUM_SLIDERS) - return anaInValues[chan]; - else - return 0; -} -uint16_t getAnalogValue(uint8_t index) +uint16_t simu_get_analog(uint8_t idx) { - return anaIn(index); + return 0; } static char _stringResult[200]; @@ -155,18 +148,14 @@ const char * nchar2string(const char * string, int size) return _stringResult; } -extern bool _eeprom_write_simu_delay; +extern const etx_hal_adc_driver_t simu_adc_driver; int main(int argc, char **argv) { QCoreApplication app(argc, argv); simuInit(); + adcInit(&simu_adc_driver); - _eeprom_write_simu_delay = false; - startEepromThread(nullptr); -#if defined(EEPROM_SIZE) - eeprom = (uint8_t *)malloc(EEPROM_SIZE); -#endif #if !defined(COLORLCD) menuLevel = 0; #endif diff --git a/radio/src/tests/gtests.h b/radio/src/tests/gtests.h index 794f0b3a5..9f5957d87 100644 --- a/radio/src/tests/gtests.h +++ b/radio/src/tests/gtests.h @@ -29,11 +29,16 @@ #define SWAP_DEFINED #include "opentx.h" #include "model_init.h" +#include "switches.h" +#include "hal/switch_driver.h" #define CHANNEL_MAX (1024*256) extern int32_t lastAct; -extern uint16_t anaInValues[NUM_STICKS+NUM_POTS+NUM_SLIDERS]; + +// from hal/adc_driver.cpp +extern void anaResetFiltered(); +extern void anaSetFiltered(uint8_t chan, uint16_t val); void doMixerCalculations(); @@ -51,12 +56,12 @@ extern const char * nchar2string(const char * string, int size); inline void SYSTEM_RESET() { -#if defined(EEPROM) +#if !defined(STORAGE_MODELSLIST) memset(modelHeaders, 0, sizeof(modelHeaders)); #endif generalDefault(); g_eeGeneral.templateSetup = 0; - for (int i=0; iweight = 0; // stick max + trim max - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, THR_STICK, TRIM_MAX); evalMixes(1); EXPECT_EQ(channelOutputs[2], 256); // stick max + trim mid - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, THR_STICK, 0); evalMixes(1); EXPECT_LE(abs(channelOutputs[2] - 128), 1); //can't use precise comparison here because of lower precision math on 9X // stick max + trim min - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, THR_STICK, TRIM_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], 0); // stick min + trim max - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, THR_STICK, TRIM_MAX); evalMixes(1); EXPECT_EQ(channelOutputs[2], 256); // stick min + trim mid - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, THR_STICK, 0); evalMixes(1); EXPECT_LE(abs(channelOutputs[2] - 128), 1); // stick min + trim min - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, THR_STICK, TRIM_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], 0); @@ -223,31 +224,31 @@ TEST_F(TrimsTest, throttleTrimWithZeroWeightOnThrottle) g_model.extendedTrims = 1; // trim min + various stick positions = should always be same value setTrimValue(0, THR_STICK, TRIM_EXTENDED_MIN); - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); evalMixes(1); EXPECT_EQ(channelOutputs[2], 0); - anaInValues[THR_STICK] = -300; + anaSetFiltered(THR_STICK, -300); evalMixes(1); EXPECT_EQ(channelOutputs[2], 0); - anaInValues[THR_STICK] = +300; + anaSetFiltered(THR_STICK, +300); evalMixes(1); EXPECT_EQ(channelOutputs[2], 0); - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); evalMixes(1); EXPECT_EQ(channelOutputs[2], 0); // trim max + various stick positions = should always be same value setTrimValue(0, THR_STICK, TRIM_EXTENDED_MAX); - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024); - anaInValues[THR_STICK] = -300; + anaSetFiltered(THR_STICK, -300); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024); - anaInValues[THR_STICK] = +300; + anaSetFiltered(THR_STICK, +300); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024); - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024); } @@ -260,32 +261,32 @@ TEST_F(TrimsTest, invertedThrottlePlusthrottleTrimWithZeroWeightOnThrottle) ExpoData *expo = expoAddress(THR_STICK); expo->weight = 0; // stick max + trim max - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, THR_STICK, TRIM_MAX); evalMixes(1); EXPECT_EQ(channelOutputs[2], 0); // stick max + trim mid - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, THR_STICK, 0); evalMixes(1); EXPECT_LE(abs(channelOutputs[2] - 128), 1); // stick max + trim min - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, THR_STICK, TRIM_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], 256); // stick min + trim max - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, THR_STICK, TRIM_MAX); evalMixes(1); EXPECT_EQ(channelOutputs[2], 0); // stick min + trim mid - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, THR_STICK, 0); evalMixes(1); EXPECT_LE(abs(channelOutputs[2] - 128), 1); // stick min + trim min - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, THR_STICK, TRIM_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], 256); @@ -294,31 +295,31 @@ TEST_F(TrimsTest, invertedThrottlePlusthrottleTrimWithZeroWeightOnThrottle) g_model.extendedTrims = 1; // trim min + various stick positions = should always be same value setTrimValue(0, THR_STICK, TRIM_EXTENDED_MIN); - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024); - anaInValues[THR_STICK] = -300; + anaSetFiltered(THR_STICK, -300); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024); - anaInValues[THR_STICK] = +300; + anaSetFiltered(THR_STICK, +300); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024); - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024); // trim max + various stick positions = should always be same value setTrimValue(0, THR_STICK, TRIM_EXTENDED_MAX); - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); evalMixes(1); EXPECT_EQ(channelOutputs[2], 0); - anaInValues[THR_STICK] = -300; + anaSetFiltered(THR_STICK, -300); evalMixes(1); EXPECT_EQ(channelOutputs[2], 0); - anaInValues[THR_STICK] = +300; + anaSetFiltered(THR_STICK, +300); evalMixes(1); EXPECT_EQ(channelOutputs[2], 0); - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); evalMixes(1); EXPECT_EQ(channelOutputs[2], 0); } @@ -334,7 +335,7 @@ TEST_F(TrimsTest, CopyTrimsToOffset) TEST_F(TrimsTest, CopySticksToOffset) { - anaInValues[ELE_STICK] = -100; + anaSetFiltered(ELE_STICK, -100); evalMixes(1); copySticksToOffset(1); #if defined(STICK_DEAD_ZONE) @@ -348,7 +349,7 @@ TEST_F(TrimsTest, MoveTrimsToOffsets) { // No trim idle only g_model.thrTrim = 0; - anaInValues[THR_STICK] = 0; + anaSetFiltered(THR_STICK, 0); setTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM, 100); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, -100); evalMixes(1); @@ -366,7 +367,7 @@ TEST_F(TrimsTest, MoveTrimsToOffsetsWithTrimIdle) { // Trim idle only g_model.thrTrim = 1; - anaInValues[THR_STICK] = -1024; // Min stick + anaSetFiltered(THR_STICK, -1024); // Min stick g_model.limitData[2].offset = 0; g_model.limitData[1].offset = 0; setTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM, 100); @@ -399,7 +400,7 @@ TEST_F(TrimsTest, MoveTrimsToOffsetsWithCrossTrims) expo = expoAddress(ELE_STICK); expo->trimSource = TRIM_THR; - anaInValues[THR_STICK] = 0; + anaSetFiltered(THR_STICK, 0); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 100); setTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM, -100); evalMixes(1); @@ -426,7 +427,7 @@ TEST_F(TrimsTest, MoveTrimsToOffsetsWithCrosstrimsAndTrimIdle) expo = expoAddress(ELE_STICK); expo->trimSource = TRIM_THR; - anaInValues[THR_STICK] = -1024; // Min stick + anaSetFiltered(THR_STICK, -1024); // Min stick setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 100); setTrimValue(0, MIXSRC_TrimThr - MIXSRC_FIRST_TRIM, -100); evalMixes(1); @@ -446,7 +447,7 @@ TEST_F(TrimsTest, MoveTrimsToOffsetsWithCrosstrimsAndTrimIdle) TEST_F(TrimsTest, InstantTrim) { - anaInValues[AIL_STICK] = 50; + anaSetFiltered(AIL_STICK, 50); instantTrim(); #if defined(STICK_DEAD_ZONE) EXPECT_EQ(23, getTrimValue(0, AIL_STICK)); @@ -465,7 +466,7 @@ TEST_F(TrimsTest, InstantTrimNegativeCurve) g_model.points[2] = -50; g_model.points[3] = -25; g_model.points[4] = 0; - anaInValues[AIL_STICK] = 512; + anaSetFiltered(AIL_STICK, 512); instantTrim(); #if defined(STICK_DEAD_ZONE) EXPECT_EQ(127, getTrimValue(0, AIL_STICK)); @@ -494,13 +495,13 @@ TEST(Curves, LinearIntpol) TEST_F(MixerTest, InfiniteRecursiveChannels) { g_model.mixData[0].destCh = 0; - g_model.mixData[0].srcRaw = MIXSRC_CH2; + g_model.mixData[0].srcRaw = MIXSRC_FIRST_CH + 1; g_model.mixData[0].weight = 100; g_model.mixData[1].destCh = 1; - g_model.mixData[1].srcRaw = MIXSRC_CH3; + g_model.mixData[1].srcRaw = MIXSRC_FIRST_CH + 2; g_model.mixData[1].weight = 100; g_model.mixData[2].destCh = 2; - g_model.mixData[2].srcRaw = MIXSRC_CH1; + g_model.mixData[2].srcRaw = MIXSRC_FIRST_CH; g_model.mixData[2].weight = 100; evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[2], 0); @@ -511,7 +512,7 @@ TEST_F(MixerTest, InfiniteRecursiveChannels) TEST_F(MixerTest, BlockingChannel) { g_model.mixData[0].destCh = 0; - g_model.mixData[0].srcRaw = MIXSRC_CH1; + g_model.mixData[0].srcRaw = MIXSRC_FIRST_CH; g_model.mixData[0].weight = 100; evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], 0); @@ -525,11 +526,13 @@ TEST_F(MixerTest, RecursiveAddChannel) g_model.mixData[0].weight = 50; g_model.mixData[1].destCh = 0; g_model.mixData[1].mltpx = MLTPX_ADD; - g_model.mixData[1].srcRaw = MIXSRC_CH2; + g_model.mixData[1].srcRaw = MIXSRC_FIRST_CH + 1; g_model.mixData[1].weight = 100; g_model.mixData[2].destCh = 1; - g_model.mixData[2].srcRaw = MIXSRC_Rud; + g_model.mixData[2].srcRaw = MIXSRC_FIRST_STICK; g_model.mixData[2].weight = 100; + + anaSetFiltered(0, 0); evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], CHANNEL_MAX/2); EXPECT_EQ(chans[1], 0); @@ -537,10 +540,10 @@ TEST_F(MixerTest, RecursiveAddChannel) TEST_F(MixerTest, RecursiveAddChannelAfterInactivePhase) { - g_model.flightModeData[1].swtch = SWSRC_ID1; + g_model.flightModeData[1].swtch = SWSRC_FIRST_SWITCH + 1; g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; - g_model.mixData[0].srcRaw = MIXSRC_CH2; + g_model.mixData[0].srcRaw = MIXSRC_FIRST_CH + 1; g_model.mixData[0].flightModes = 0b11110; g_model.mixData[0].weight = 50; g_model.mixData[1].destCh = 0; @@ -564,7 +567,7 @@ TEST_F(MixerTest, RecursiveAddChannelAfterInactivePhase) TEST_F(MixerTest, SlowOnPhase) { - g_model.flightModeData[1].swtch = TR(SWSRC_THR, SWSRC_SA0); + g_model.flightModeData[1].swtch = SWSRC_FIRST_SWITCH; g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_MAX; @@ -589,7 +592,7 @@ TEST_F(MixerTest, SlowOnSwitchSource) g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; g_eeGeneral.switchConfig = 0x03; - g_model.mixData[0].srcRaw = MIXSRC_SA; + g_model.mixData[0].srcRaw = MIXSRC_FIRST_SWITCH; int switchIndex = 0; g_model.mixData[0].weight = 100; g_model.mixData[0].speedUp = 50; @@ -624,13 +627,8 @@ TEST_F(MixerTest, DelayOnSwitch) g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_MAX; g_model.mixData[0].weight = 100; -#if defined(PCBFRSKY) - g_model.mixData[0].swtch = SWSRC_SA2; + g_model.mixData[0].swtch = SWSRC_FIRST_SWITCH + 2; int switch_index = 0; -#else - g_model.mixData[0].swtch = SWSRC_THR; - int switch_index = 1; -#endif g_model.mixData[0].delayUp = 50; g_model.mixData[0].delayDown = 50; @@ -660,7 +658,7 @@ TEST_F(MixerTest, SlowOnMultiply) g_model.mixData[1].mltpx = MLTPX_MUL; g_model.mixData[1].srcRaw = MIXSRC_MAX; g_model.mixData[1].weight = 100; - g_model.mixData[1].swtch = TR(SWSRC_THR, SWSRC_SA0); + g_model.mixData[1].swtch = SWSRC_FIRST_SWITCH; g_model.mixData[1].speedUp = 50; g_model.mixData[1].speedDown = 50; @@ -686,7 +684,7 @@ TEST_F(TrimsTest, throttleTrimEle) { g_model.thrTrim = 1; // checks ELE sticks are not affected by throttleTrim // stick max + trim min - anaInValues[ELE_STICK] = +1024; + anaSetFiltered(ELE_STICK, +1024); setTrimValue(0, ELE_STICK, TRIM_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024 - 256); @@ -724,7 +722,7 @@ TEST(Heli, BasicTest) g_model.mixData[2].mltpx = MLTPX_ADD; g_model.mixData[2].srcRaw = MIXSRC_CYC3; g_model.mixData[2].weight = 100; - anaInValues[ELE_STICK] = 1024; + anaSetFiltered(ELE_STICK, 1024); evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], -CHANNEL_MAX); EXPECT_EQ(chans[1], CHANNEL_MAX/2); @@ -758,7 +756,7 @@ TEST(Heli, Mode2Test) g_model.mixData[2].mltpx = MLTPX_ADD; g_model.mixData[2].srcRaw = MIXSRC_CYC3; g_model.mixData[2].weight = 100; - anaInValues[ELE_STICK] = 1024; + anaSetFiltered(ELE_STICK, 1024); evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], -CHANNEL_MAX); EXPECT_EQ(chans[1], CHANNEL_MAX/2); @@ -790,7 +788,7 @@ TEST_F(MixerTest, flightModeTransition) MODEL_RESET(); MIXER_RESET(); setModelDefaults(); - g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2); + g_model.flightModeData[1].swtch = SWSRC_FIRST_SWITCH + 2; g_model.flightModeData[0].fadeIn = 100; g_model.flightModeData[0].fadeOut = 100; g_model.flightModeData[1].fadeIn = 100; @@ -816,7 +814,7 @@ TEST_F(MixerTest, flightModeOverflow) MODEL_RESET(); MIXER_RESET(); setModelDefaults(); - g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2); + g_model.flightModeData[1].swtch = SWSRC_FIRST_SWITCH + 2; g_model.flightModeData[0].fadeIn = 100; g_model.flightModeData[0].fadeOut = 100; g_model.mixData[0].destCh = 0; @@ -833,37 +831,40 @@ TEST_F(TrimsTest, throttleTrimWithCrossTrims) { g_model.thrTrim = 1; g_model.thrTrimSw = MIXSRC_TrimEle - MIXSRC_FIRST_TRIM; + ExpoData *expo = expoAddress(THR_STICK); expo->trimSource = TRIM_ELE; + expo = expoAddress(ELE_STICK); expo->trimSource = TRIM_THR; // stick max + trim max - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); + anaSetFiltered(ELE_STICK, 0); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MAX); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024); EXPECT_EQ(channelOutputs[1], 0); // stick max + trim min - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024); EXPECT_EQ(channelOutputs[1], 0); // stick min + trim max - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MAX); evalMixes(1); EXPECT_EQ(channelOutputs[2], -1024 + 512); EXPECT_EQ(channelOutputs[1], 0); // stick min + trim mid - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 0); evalMixes(1); EXPECT_EQ(channelOutputs[2], -1024 + 256); EXPECT_EQ(channelOutputs[1], 0); // stick min + trim min - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], -1024); @@ -872,31 +873,31 @@ TEST_F(TrimsTest, throttleTrimWithCrossTrims) // now the same tests with extended Trims g_model.extendedTrims = 1; // stick max + trim max - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MAX); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024); EXPECT_EQ(channelOutputs[1], 0); // stick max + trim min - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], 1024); EXPECT_EQ(channelOutputs[1], 0); // stick min + trim max - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MAX); evalMixes(1); EXPECT_EQ(channelOutputs[2], -1024+2048); EXPECT_EQ(channelOutputs[1], 0); // stick min + trim mid - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 0); evalMixes(1); EXPECT_EQ(channelOutputs[2], -1024+1024); EXPECT_EQ(channelOutputs[1], 0); // stick min + trim min - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], -1024); @@ -914,31 +915,32 @@ TEST_F(TrimsTest, invertedThrottlePlusThrottleTrimWithCrossTrims) expo->trimSource = TRIM_THR; // stick max + trim max - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); + anaSetFiltered(ELE_STICK, 0); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MAX); evalMixes(1); EXPECT_EQ(channelOutputs[2], -1024); EXPECT_EQ(channelOutputs[1], 0); // stick max + trim mid - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 0); evalMixes(1); EXPECT_EQ(channelOutputs[2], -1024+256); EXPECT_EQ(channelOutputs[1], 0); // stick max + trim min - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], -1024+512); EXPECT_EQ(channelOutputs[1], 0); // stick min + trim max - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MAX); evalMixes(1); EXPECT_EQ(channelOutputs[2], +1024); EXPECT_EQ(channelOutputs[1], 0); // stick min + trim min - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], +1024); @@ -947,31 +949,31 @@ TEST_F(TrimsTest, invertedThrottlePlusThrottleTrimWithCrossTrims) // now the same tests with extended Trims g_model.extendedTrims = 1; // stick max + trim max - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MAX); evalMixes(1); EXPECT_EQ(channelOutputs[2], -1024); EXPECT_EQ(channelOutputs[1], 0); // stick max + trim mid - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, 0); evalMixes(1); EXPECT_EQ(channelOutputs[2], -1024+1024); EXPECT_EQ(channelOutputs[1], 0); // stick max + trim min - anaInValues[THR_STICK] = +1024; + anaSetFiltered(THR_STICK, +1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], -1024+2048); EXPECT_EQ(channelOutputs[1], 0); // stick min + trim max - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MAX); evalMixes(1); EXPECT_EQ(channelOutputs[2], +1024); EXPECT_EQ(channelOutputs[1], 0); // stick min + trim min - anaInValues[THR_STICK] = -1024; + anaSetFiltered(THR_STICK, -1024); setTrimValue(0, MIXSRC_TrimEle - MIXSRC_FIRST_TRIM, TRIM_EXTENDED_MIN); evalMixes(1); EXPECT_EQ(channelOutputs[2], +1024); diff --git a/radio/src/tests/sources.cpp b/radio/src/tests/sources.cpp new file mode 100644 index 000000000..6a655bb58 --- /dev/null +++ b/radio/src/tests/sources.cpp @@ -0,0 +1,117 @@ +/* + * 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 "gtests.h" + +#include "storage/yaml/yaml_tree_walker.h" +#include "storage/yaml/yaml_parser.h" +#include "storage/yaml/yaml_datastructs.h" +#include "storage/yaml/yaml_bits.h" + +static const char _radio_config[] = + "potsConfig: \n" + " P1:\n" + " type: without_detent\n" + " name: \"\"\n" + " P2:\n" + " type: multipos_switch\n" + " name: \"\"\n" + " P3:\n" + " type: with_detent\n" + " name: \"\"\n" + " SL1:\n" + " type: slider\n" + " name: \"\"\n" + " SL2:\n" + " type: slider\n" + " name: \"\"\n" + "switchConfig: \n" + " SA:\n" + " type: 3pos\n" + " name: \"\"\n" + " SB:\n" + " type: 3pos\n" + " name: \"\"\n" + " SC:\n" + " type: 3pos\n" + " name: \"\"\n" + " SD:\n" + " type: 3pos\n" + " name: \"\"\n" + " SE:\n" + " type: 3pos\n" + " name: \"\"\n" + " SF:\n" + " type: 2pos\n" + " name: \"\"\n" + " SG:\n" + " type: 3pos\n" + " name: \"\"\n" + " SH:\n" + " type: toggle\n" + " name: \"\"\n"; + +static void loadRadioYamlStr(const char* str) +{ + YamlTreeWalker tree; + tree.reset(get_radiodata_nodes(), (uint8_t*)&g_eeGeneral); + + YamlParser yp; + yp.init(YamlTreeWalker::get_parser_calls(), &tree); + + size_t len = strlen(str); + yp.parse(str, len); +} + +TEST(Sources, getSourceString) +{ + loadRadioYamlStr(_radio_config); + +#if defined(IMU) + EXPECT_STREQ(getSourceString(MIXSRC_TILT_X), "TltX"); + EXPECT_STREQ(getSourceString(MIXSRC_TILT_Y), "TltY"); +#endif + +#if defined(PCBHORUS) + EXPECT_STREQ(getSourceString(MIXSRC_SPACEMOUSE_A), "smA"); + EXPECT_STREQ(getSourceString(MIXSRC_SPACEMOUSE_B), "smB"); + EXPECT_STREQ(getSourceString(MIXSRC_SPACEMOUSE_C), "smC"); + EXPECT_STREQ(getSourceString(MIXSRC_SPACEMOUSE_D), "smD"); + EXPECT_STREQ(getSourceString(MIXSRC_SPACEMOUSE_E), "smE"); + EXPECT_STREQ(getSourceString(MIXSRC_SPACEMOUSE_F), "smF"); +#endif + + EXPECT_STREQ(getSourceString(MIXSRC_MAX), "MAX"); + +#if defined(HELI) + EXPECT_STREQ(getSourceString(MIXSRC_FIRST_HELI), "CYC1"); + EXPECT_STREQ(getSourceString(MIXSRC_FIRST_HELI + 1), "CYC2"); + EXPECT_STREQ(getSourceString(MIXSRC_FIRST_HELI + 2), "CYC3"); +#else + EXPECT_STREQ(getSourceString(MIXSRC_FIRST_HELI), "[C1]"); + EXPECT_STREQ(getSourceString(MIXSRC_FIRST_HELI + 1), "[C2]"); + EXPECT_STREQ(getSourceString(MIXSRC_FIRST_HELI + 2), "[C3]"); +#endif + + EXPECT_STREQ(getSourceString(MIXSRC_TrimRud), STR_CHAR_TRIM "Rud"); + EXPECT_STREQ(getSourceString(MIXSRC_TrimEle), STR_CHAR_TRIM "Ele"); + EXPECT_STREQ(getSourceString(MIXSRC_TrimThr), STR_CHAR_TRIM "Thr"); +} diff --git a/radio/src/tests/switches.cpp b/radio/src/tests/switches.cpp index c8cf0388f..8e864db34 100644 --- a/radio/src/tests/switches.cpp +++ b/radio/src/tests/switches.cpp @@ -32,6 +32,9 @@ void setLogicalSwitch(int index, uint16_t _func, int16_t _v1, int16_t _v2, int16 g_model.logicalSw[index].andsw = _andsw; } +#define SWSRC_SW1 (SWSRC_FIRST_LOGICAL_SWITCH) +#define SWSRC_SW2 (SWSRC_FIRST_LOGICAL_SWITCH + 1) + #if defined(PCBTARANIS) TEST(getSwitch, OldTypeStickyCSW) { @@ -39,7 +42,7 @@ TEST(getSwitch, OldTypeStickyCSW) MODEL_RESET(); MIXER_RESET(); - setLogicalSwitch(0, LS_FUNC_AND, SWSRC_SA0, SWSRC_NONE); + setLogicalSwitch(0, LS_FUNC_AND, SWSRC_FIRST_SWITCH, SWSRC_NONE); setLogicalSwitch(1, LS_FUNC_OR, SWSRC_SW1, SWSRC_SW2); simuSetSwitch(0, 0); @@ -81,8 +84,8 @@ TEST(getSwitch, inputWithTrim) setModelDefaults(); MIXER_RESET(); - // g_model.logicalSw[0] = { LS_FUNC_VPOS, MIXSRC_FIRST_INPUT, 0, 0 }; setLogicalSwitch(0, LS_FUNC_VPOS, MIXSRC_FIRST_INPUT, 0, 0); + anaSetFiltered(0, 0); evalMixes(1); evalLogicalSwitches(); @@ -133,9 +136,13 @@ TEST(evalLogicalSwitches, playFile) } #endif -#if defined(PCBTARANIS) && NUM_SWITCHES >= 8 && !defined(PCBX7) +#define SWSRC_SA2 (SWSRC_FIRST_SWITCH + 2) +#define SWSRC_SF2 (SWSRC_FIRST_SWITCH + 5 * 3 + 2) + TEST(getSwitch, edgeInstant) { + if (switchGetMaxSwitches() < 6) return; + MODEL_RESET(); MIXER_RESET(); // LS1 setup: EDGE SFup (0:instant) @@ -253,6 +260,8 @@ TEST(getSwitch, edgeInstant) TEST(getSwitch, edgeRelease) { + if (switchGetMaxSwitches() < 6) return; + MODEL_RESET(); MIXER_RESET(); // test for issue #2728 @@ -309,4 +318,3 @@ TEST(getSwitch, edgeRelease) EXPECT_EQ(getSwitch(SWSRC_SW2), false); } -#endif // defined(PCBTARANIS) diff --git a/radio/src/thirdparty/STM32_USB-Host-Device_Lib_V2.2.0/Libraries/STM32_USB_OTG_Driver/src/usb_dcd_int.c b/radio/src/thirdparty/STM32_USB-Host-Device_Lib_V2.2.0/Libraries/STM32_USB_OTG_Driver/src/usb_dcd_int.c index dbfd76d01..0839e5c78 100644 --- a/radio/src/thirdparty/STM32_USB-Host-Device_Lib_V2.2.0/Libraries/STM32_USB_OTG_Driver/src/usb_dcd_int.c +++ b/radio/src/thirdparty/STM32_USB-Host-Device_Lib_V2.2.0/Libraries/STM32_USB_OTG_Driver/src/usb_dcd_int.c @@ -27,8 +27,12 @@ /* Includes ------------------------------------------------------------------*/ #include "usb_dcd_int.h" -#include "board.h" // modified by OpenTX -#include "debug.h" // modified by OpenTX + +#if defined(STM32F4) + #include "stm32f4xx_rcc.h" +#elif defined(STM32F2) + #include "stm32f2xx_rcc.h" +#endif /** @addtogroup USB_OTG_DRIVER * @{ @@ -217,25 +221,21 @@ uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) gintr_status.d32 = USB_OTG_ReadCoreItr(pdev); if (!gintr_status.d32) /* avoid spurious interrupt */ { - DEBUG_USB_INTERRUPT(INT_OTG_FS_SPURIOUS); // modified by OpenTX return 0; } if (gintr_status.b.outepintr) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_OUT_EP); // modified by OpenTX retval |= DCD_HandleOutEP_ISR(pdev); } if (gintr_status.b.inepint) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_IN_EP); // modified by OpenTX retval |= DCD_HandleInEP_ISR(pdev); } if (gintr_status.b.modemismatch) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_MODEMISMATCH); // modified by OpenTX USB_OTG_GINTSTS_TypeDef gintsts; /* Clear interrupt */ @@ -246,69 +246,55 @@ uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) if (gintr_status.b.wkupintr) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_WAKEUP); // modified by OpenTX retval |= DCD_HandleResume_ISR(pdev); } if (gintr_status.b.usbsuspend) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_SUSPEND); // modified by OpenTX retval |= DCD_HandleUSBSuspend_ISR(pdev); } if (gintr_status.b.sofintr) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_SOF); // modified by OpenTX retval |= DCD_HandleSof_ISR(pdev); - } if (gintr_status.b.rxstsqlvl) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_RX_STAT); // modified by OpenTX retval |= DCD_HandleRxStatusQueueLevel_ISR(pdev); - } if (gintr_status.b.usbreset) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_RESET); // modified by OpenTX retval |= DCD_HandleUsbReset_ISR(pdev); - } + if (gintr_status.b.enumdone) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_ENUM); // modified by OpenTX retval |= DCD_HandleEnumDone_ISR(pdev); } if (gintr_status.b.incomplisoin) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_INCOMPLETE_IN); // modified by OpenTX retval |= DCD_IsoINIncomplete_ISR(pdev); } if (gintr_status.b.incomplisoout) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_INCOMPLETE_OUT); // modified by OpenTX retval |= DCD_IsoOUTIncomplete_ISR(pdev); } #ifdef VBUS_SENSING_ENABLED if (gintr_status.b.sessreqintr) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_SESSION); // modified by OpenTX retval |= DCD_SessionRequest_ISR(pdev); } if (gintr_status.b.otgintr) { - DEBUG_USB_INTERRUPT(INT_OTG_FS_OTG); // modified by OpenTX retval |= DCD_OTG_ISR(pdev); } #endif } - else { - DEBUG_USB_INTERRUPT(INT_OTG_FS_RX_NOT_DEVICE); // modified by OpenTX - } + return retval; } diff --git a/radio/src/timers.cpp b/radio/src/timers.cpp index 8ce337209..eb2956831 100644 --- a/radio/src/timers.cpp +++ b/radio/src/timers.cpp @@ -21,6 +21,7 @@ #include "opentx.h" #include "timers.h" +#include "switches.h" volatile tmr10ms_t g_tmr10ms; @@ -181,19 +182,22 @@ void evalTimers(int16_t throttle, uint8_t tick10ms) int16_t throttleSource2Source(int16_t thrSrc) { - if (thrSrc == 0) return (int16_t)MIXSRC_Thr; - if (--thrSrc < NUM_POTS + NUM_SLIDERS) + if (thrSrc == 0) { + return int16_t(MIXSRC_FIRST_STICK + inputMappingGetThrottle()); + } + if (--thrSrc < MAX_POTS) return (int16_t)(thrSrc + MIXSRC_FIRST_POT); - return (int16_t)(thrSrc - (NUM_POTS + NUM_SLIDERS) + MIXSRC_FIRST_CH); + return (int16_t)(thrSrc - MAX_POTS + MIXSRC_FIRST_CH); } int16_t source2ThrottleSource(int16_t src) { - if (src == MIXSRC_Thr) + if (src == MIXSRC_FIRST_STICK + inputMappingGetThrottle()) { return 0; - else if (src <= MIXSRC_LAST_POT) + } else if (src <= MIXSRC_LAST_POT) { return src - MIXSRC_FIRST_POT + 1; - else if (src <= MIXSRC_LAST_CH) - return src - MIXSRC_FIRST_CH + NUM_POTS + NUM_SLIDERS + 1; + } else if (src <= MIXSRC_LAST_CH) { + return src - MIXSRC_FIRST_CH + MAX_POTS + 1; + } return -1; } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index ea060e722..7ab816ce1 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -37,23 +37,27 @@ ISTR(TRNMODE); ISTR(TRNCHN); ISTR(VTRIMINC); ISTR(VDISPLAYTRIMS); -ISTR(RETA123); ISTR(VBLMODE); ISTR(VCURVETYPE); ISTR(VCURVEFUNC); ISTR(VMLTPX); ISTR(VMLTPX2); -ISTR(VMIXTRIMS); ISTR(VCSWFUNC); -ISTR(VFSWFUNC); ISTR(VFSWRESET); ISTR(FUNCSOUNDS); ISTR(VTELEMUNIT); ISTR(GPSFORMAT); ISTR(VTELEMSCREENTYPE); -ISTR(VKEYS); -ISTR(VSWITCHES); -ISTR(VSRCRAW); +ISTR(STICK_NAMES); +ISTR(SURFACE_NAMES); +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); @@ -131,6 +135,7 @@ 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; @@ -159,7 +164,31 @@ const char STR_PPMFRAME[] = TR_PPMFRAME; const char STR_REFRESHRATE[] = TR_REFRESHRATE; const char STR_MS[] = TR_MS; const char STR_SWITCH[] = TR_SWITCH; +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_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_VOLUME[] = TR_SF_VOLUME; +const char STR_SF_RACING_MODE[] = TR_SF_RACING_MODE; +const char STR_SF_SAFETY[] = TR_SF_SAFETY; +const char STR_SF_SET_SCREEN[] = TR_SF_SET_SCREEN; +const char STR_SF_SCREENSHOT[] = TR_SF_SCREENSHOT; const char STR_TRIMS[] = TR_TRIMS; const char STR_MIRROR[] = TR_MIRROR; const char STR_FADEIN[] = TR_FADEIN; @@ -281,6 +310,7 @@ 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; @@ -398,6 +428,7 @@ 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; @@ -705,6 +736,11 @@ 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; diff --git a/radio/src/translations.h b/radio/src/translations.h index 19ea11a31..ff1e52fd7 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -146,7 +146,6 @@ extern const char* const STR_POTTYPES[]; extern const char* const STR_SLIDERTYPES[]; extern const char* const STR_VTRIMINC[]; extern const char* const STR_VDISPLAYTRIMS[]; -extern const char* const STR_RETA123[]; extern const char* const STR_TIMER_DIR[]; @@ -155,9 +154,7 @@ 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_VMIXTRIMS[]; extern const char* const STR_VCSWFUNC[]; -extern const char* const STR_VFSWFUNC[]; extern const char* const STR_VFSWRESET[]; extern const char* const STR_FUNCSOUNDS[]; extern const char* const STR_VTELEMUNIT[]; @@ -165,9 +162,16 @@ extern const char* const STR_GPSFORMAT[]; extern const char* const STR_VTELEMSCREENTYPE[]; extern const char* const STR_VSWASHTYPE[]; -extern const char* const STR_VKEYS[]; -extern const char* const STR_VSWITCHES[]; -extern const char* const STR_VSRCRAW[]; +extern const char* const STR_STICK_NAMES[]; +extern const char* const STR_ON_ONE_SWITCHES[]; +extern const char* const STR_SURFACE_NAMES[]; +#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[]; @@ -246,6 +250,7 @@ extern const char* const STR_BLUETOOTH_MODES[]; #define NO_INDENT(x) (x) + LEN_INDENT +extern const char STR_EMPTY[]; extern const char STR_POPUPS_ENTER_EXIT[]; extern const char STR_OK[]; extern const char STR_EXIT[]; @@ -283,7 +288,31 @@ extern const char STR_PPMFRAME[]; extern const char STR_REFRESHRATE[]; extern const char STR_MS[]; extern const char STR_SWITCH[]; +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_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_VOLUME[]; +extern const char STR_SF_RACING_MODE[]; +extern const char STR_SF_SCREENSHOT[]; extern const char STR_TRIMS[]; extern const char STR_MIRROR[]; extern const char STR_FADEIN[]; @@ -467,6 +496,7 @@ 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[]; @@ -615,6 +645,7 @@ 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[]; @@ -1101,6 +1132,12 @@ 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[]; diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 33ce3b6fe..a9c01ef3b 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -70,102 +70,42 @@ #define TR_ADCFILTERVALUES "全局","禁用","开启" -#if defined(PCBX10) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","6","7","L","R" -#elif defined(PCBHORUS) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","L","R" -#elif defined(PCBX9E) - #define TR_RETA123 "R","E","T","A","1","2","3","4","L","R","L","R" -#elif defined(PCBTARANIS) - #define TR_RETA123 "R","E","T","A","1","2","3","L","R" -#else - #define TR_RETA123 "R","E","T","A","1","2","3" -#endif #define TR_VCURVETYPE "单边","指数","函数","自定义" - #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "相加","相乘","替换" #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "禁用","启用","Rud","Ele","Thr","Ail","T5","T6" -#else - #define TR_VMIXTRIMS "禁用","启用","Rud","Ele","Thr","Ail" -#endif -#if LCD_W >= 212 - #define TR_CSWTIMER "定时" - #define TR_CSWSTICKY "粘滞" - #define TR_CSWRANGE "范围" - #define TR_CSWSTAY "边沿" -#else - #define TR_CSWTIMER "定时" - #define TR_CSWSTICKY "粘滞" - #define TR_CSWRANGE "范围" - #define TR_CSWSTAY "边沿" -#endif +#define TR_CSWTIMER "定时" +#define TR_CSWSTICKY "粘滞" +#define TR_CSWRANGE "范围" +#define TR_CSWSTAY "边沿" #define TR_CSWEQUAL "a=x" #define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","a= 212 @@ -204,38 +142,8 @@ #define TR_VSWASHTYPE "---","120","120X","140","90" -#define TR_STICKS_VSRCRAW STR_CHAR_STICK "Rud", STR_CHAR_STICK "Ele", STR_CHAR_STICK "Thr", STR_CHAR_STICK "Ail" - -#if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Rud", STR_CHAR_TRIM "Ele", STR_CHAR_TRIM "Thr", STR_CHAR_TRIM "Ail", STR_CHAR_TRIM "T5", STR_CHAR_TRIM "T6" -#else - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Rud", STR_CHAR_TRIM "Ele", STR_CHAR_TRIM "Thr", STR_CHAR_TRIM "Ail" -#endif - -#if defined(PCBHORUS) - #define TR_TRIMS_SWITCHES STR_CHAR_TRIM "Rl", STR_CHAR_TRIM "Rr", STR_CHAR_TRIM "Ed", STR_CHAR_TRIM "Eu", STR_CHAR_TRIM "Td", STR_CHAR_TRIM "Tu", STR_CHAR_TRIM "Al", STR_CHAR_TRIM "Ar", STR_CHAR_TRIM "5d", STR_CHAR_TRIM "5u", STR_CHAR_TRIM "6d", STR_CHAR_TRIM "6u" -#else - #define TRIM_SWITCH_CHAR TR("t",STR_CHAR_TRIM) - #define TR_TRIMS_SWITCHES TRIM_SWITCH_CHAR "Rl", TRIM_SWITCH_CHAR "Rr", TRIM_SWITCH_CHAR "Ed", TRIM_SWITCH_CHAR "Eu", TRIM_SWITCH_CHAR "Td", TRIM_SWITCH_CHAR "Tu", TRIM_SWITCH_CHAR "Al", TRIM_SWITCH_CHAR "Ar" -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define TR_VKEYS "PGUP","PGDN","ENTER","MDL","RTN","TELE","SYS" -#elif defined(PCBXLITE) - #define TR_VKEYS "Shift","Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define TR_VKEYS "Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define TR_VKEYS "Exit","Enter","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","UP","DOWN" -#elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(PCBTARANIS) - #define TR_VKEYS "Menu","Exit","Enter","Page","Plus","Minus" -#else - #define TR_VKEYS "Menu","Exit","Down","Up","Right","Left" -#endif +#define TR_STICK_NAMES "Rud", "Ele", "Thr", "Ail" +#define TR_SURFACE_NAMES "ST", "TH" #if defined(PCBNV14) #define TR_RFPOWER_AFHDS2 "Default","High" @@ -264,8 +172,11 @@ #define TR_CYC_VSRCRAW "[C1]","[C2]","[C3]" #endif -#define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Batt","Time","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Tmr1","Tmr2","Tmr3" + +#define TR_SRC_BATT "Batt" +#define TR_SRC_TIME "Time" +#define TR_SRC_GPS "GPS" +#define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES "OFF","ON","Strt","THs","TH%","THt" #define TR_VTRAINER_MASTER_OFF "禁用" @@ -534,6 +445,7 @@ #define TR_MENU_RADIO_ANALOGS_CALIB "已校准的模拟值" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "原始模拟值 (5 Hz)" #define TR_MENUCALIBRATION "校准" +#define TR_MENU_FSWITCH "FUNCTION SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "将当前微调量保存至中点" #else @@ -918,6 +830,7 @@ #define TR_DEBUG "调试" #define TR_KEYS_BTN BUTTON("按键") #define TR_ANALOGS_BTN BUTTON(TR("模拟", "模拟量")) +#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "未找到触摸硬件" #define TR_TOUCH_EXIT "点击屏幕退出" #define TR_SET BUTTON("设置") diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 6b28e39f5..a2d855458 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -72,27 +72,13 @@ #define TR_ADCFILTERVALUES "Globální","Vyp","Zap", -#if defined(PCBX10) - #define TR_RETA123 "S","V","P","K","1","3","2","4","5","6","7","L","R" -#elif defined(PCBHORUS) - #define TR_RETA123 "S","V","P","K","1","3","2","4","5","L","R" -#elif defined(PCBX9E) - #define TR_RETA123 "S","V","P","K","1","2","3","4","L","R","L","R" -#elif defined(PCBTARANIS) - #define TR_RETA123 "S","V","P","K","1","2","3","L","R" -#else - #define TR_RETA123 "S","V","P","K","1","2","3" -#endif #define TR_VCURVETYPE "Diff","Expo","Funk","Vlas" - #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Sečíst","Násobit","Zaměnit" #define TR_VMLTPX2 "+=","*=",":=" #if defined(PCBHORUS) - #define TR_VMIXTRIMS "VYP","ZAP","Směr","Výšk","Plyn","Křid","T5","T6" #else - #define TR_VMIXTRIMS "VYP","ZAP","Směr","Výšk","Plyn","Křid" #endif #if LCD_W >= 212 @@ -112,71 +98,33 @@ #define TR_TEXT_SIZE "Standard","Nejmenší","Malé","Střední","Dvojité" -#if defined(VARIO) - #define TR_VVARIO "Vario" -#else - #define TR_VVARIO "[Vario]" -#endif +#define TR_SF_TRAINER "Trenér" +#define TR_SF_INST_TRIM "Insta-Trim" +#define TR_SF_RESET "Reset" +#define TR_SF_SET_TIMER "Změna" +#define TR_SF_VOLUME "Hlasitost" +#define TR_SF_FAILSAFE "Nastavit Failsafe" +#define TR_SF_RANGE_CHECK "Kontrola dosahu" +#define TR_SF_MOD_BIND "ModuleBind" -#if defined(AUDIO) - #define TR_SOUND TR3("\221\222Zvuk", "\221\222Zvuk", "Hrát zvuk") -#else - #define TR_SOUND "Pípnout" -#endif - -#if defined(HAPTIC) - #define TR_HAPTIC "Vibrovat" -#else - #define TR_HAPTIC "[Vibrovat]" -#endif - -#if defined(VOICE) - #define TR_PLAY_TRACK TR3("\221\222Stopa", "\221\222Stopa", "Přehrát wav") - #define TR_PLAY_VALUE TR3("\221\222Hlásit ", "\221\222Hlásit ", "Hlásit stav") -#else - #define TR_PLAY_TRACK "[\221\222Stopa]" - #define TR_PLAY_VALUE "[\221\222Hlásit]" -#endif - -#define TR_SF_BG_MUSIC TR3("\221\222Hudba","\221\222Hudba","Hudba"),TR3("\221\222Hudba ||","\221\222Hudba ||","Hudba pauza") - -#if defined(SDCARD) - #define TR_SDCLOGS "Loguj na SD" -#else - #define TR_SDCLOGS "[Logování]" -#endif - -#ifdef GVARS - #define TR_ADJUST_GVAR "Nastav" -#else - #define TR_ADJUST_GVAR "[Nastav GP]" -#endif - -#if defined(LUA) - #define TR_SF_PLAY_SCRIPT "Lua Skript" -#else - #define TR_SF_PLAY_SCRIPT "[Lua]" -#endif - -#if defined(DEBUG) - #define TR_SF_TEST "Test" -#else - #define TR_SF_TEST -#endif - -#if defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Zámek" -#else - #define TR_SF_SAFETY "---" -#endif +#define TR_SOUND TR3("\221\222Zvuk", "\221\222Zvuk", "Hrát zvuk") +#define TR_PLAY_TRACK TR3("\221\222Stopa", "\221\222Stopa", "Přehrát wav") +#define TR_PLAY_VALUE TR3("\221\222Hlásit ", "\221\222Hlásit ", "Hlásit stav") +#define TR_SF_HAPTIC "Vibrovat" +#define TR_SF_PLAY_SCRIPT "Lua Skript" +#define TR_SF_BG_MUSIC TR3("\221\222Hudba","\221\222Hudba","Hudba") +#define TR_SF_BG_MUSIC_PAUSE TR3("\221\222Hudba ||","\221\222Hudba ||","Hudba pauza") +#define TR_SF_LOGS "Loguj na SD" +#define TR_ADJUST_GVAR "Nastav" +#define TR_SF_BACKLIGHT "Podsvětlení" +#define TR_SF_VARIO "Vario" +#define TR_SF_SAFETY "Zámek" +#define TR_SF_TEST "Test" #define TR_SF_SCREENSHOT "Snímek LCD" #define TR_SF_RACING_MODE "Závodní režim" #define TR_SF_DISABLE_TOUCH "Deaktivace dotyku" #define TR_SF_SET_SCREEN "Vybrat hlavní obrazovku" -#define TR_SF_RESERVE "[rezerva]" - -#define TR_VFSWFUNC TR_SF_SAFETY,"Trenér","Insta-Trim","Reset","Změna",TR_ADJUST_GVAR,"Hlasitost","Nastavit Failsafe","Kontrola dosahu","ModuleBind",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE,TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"Podsvětlení",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH,TR_SF_SET_SCREEN TR_SF_TEST #define TR_FSW_RESET_TELEM TR("Telm","Telemetrie") @@ -206,37 +154,8 @@ #define TR_VSWASHTYPE "---","120","120X","140","90" -#define TR_STICKS_VSRCRAW STR_CHAR_STICK "Smě", STR_CHAR_STICK "Výš", STR_CHAR_STICK "Pln", STR_CHAR_STICK "Kři" - -#if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Smě", STR_CHAR_TRIM "Výš", STR_CHAR_TRIM "Pln", STR_CHAR_TRIM "Kři", STR_CHAR_TRIM "T5", STR_CHAR_TRIM "T6" -#else - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Smě", STR_CHAR_TRIM "Výš", STR_CHAR_TRIM "Pln", STR_CHAR_TRIM "Kři" -#endif - -#if defined(PCBHORUS) - #define TR_TRIMS_SWITCHES STR_CHAR_TRIM "Sl", STR_CHAR_TRIM "Sp", STR_CHAR_TRIM "Vd", STR_CHAR_TRIM "Vn", STR_CHAR_TRIM "Pd", STR_CHAR_TRIM "Pn", STR_CHAR_TRIM "Kl", STR_CHAR_TRIM "Kp", STR_CHAR_TRIM "5d", STR_CHAR_TRIM "5n", STR_CHAR_TRIM "6d", STR_CHAR_TRIM "6n" -#else - #define TR_TRIMS_SWITCHES TR("tSl",STR_CHAR_TRIM "Sl"),TR("tSp",STR_CHAR_TRIM "Sp"),TR("tVd",STR_CHAR_TRIM "Vd"),TR("tVn",STR_CHAR_TRIM "Vn"),TR("tPd",STR_CHAR_TRIM "Pd"),TR("tPn",STR_CHAR_TRIM "Pn"),TR("tKl",STR_CHAR_TRIM "Kl"),TR("tKp",STR_CHAR_TRIM "Kp") -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define TR_VKEYS "PGUP","PGDN","ENTER","MDL","RTN","TELE","SYS" -#elif defined(PCBXLITE) - #define TR_VKEYS "Shift","Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define TR_VKEYS "Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define TR_VKEYS "Exit","Enter","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","UP","DOWN" -#elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(PCBTARANIS) - #define TR_VKEYS "Menu","Exit","Enter","Page","Plus","Minus" -#else - #define TR_VKEYS "Menu","Exit","Down","Up","Right","Left" -#endif +#define TR_STICK_NAMES "Smě", "Výš", "Pln", "Kři" +#define TR_SURFACE_NAMES "Smě", "Pln" #if defined(PCBNV14) #define TR_RFPOWER_AFHDS2 "Defaultní","Vysoký" @@ -265,8 +184,11 @@ #define TR_CYC_VSRCRAW "[C1]","[C2]","[C3]" #endif -#define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Bat.","Čas","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Čas1","Čas2","Čas3" + +#define TR_SRC_BATT "Bat." +#define TR_SRC_TIME "Čas" +#define TR_SRC_GPS "GPS" +#define TR_SRC_TIMER "Čas" #define TR_VTMRMODES "VYP","ZAP","Strt","Pln>","Pln%","Pln*" #define TR_VTRAINER_MASTER_OFF "OFF" @@ -539,6 +461,7 @@ #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 "FUNCTION SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trimy => Subtrimy" #else @@ -917,6 +840,7 @@ #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("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "Dotyková obrazovka nenalezena" #define TR_TOUCH_EXIT "Dotkněte se obrazovky pro ukončení" #define TR_SET BUTTON("Nast") diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index 396dbe5a8..d58213ee0 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -76,26 +76,10 @@ #define TR_ADCFILTERVALUES "Global","Fra","Til" -#if defined(PCBX10) - #define TR_RETA123 "S","H","G","K","1","3","2","4","5","6","7","V","H" -#elif defined(PCBHORUS) - #define TR_RETA123 "S","H","G","K","1","3","2","4","5","V","H" -#elif defined(PCBX9E) - #define TR_RETA123 "S","H","G","K","1","2","3","4","V","H","V","H" -#elif defined(PCBTARANIS) - #define TR_RETA123 "S","H","G","K","1","2","3","V","H" -#else - #define TR_RETA123 "S","H","G","K","1","2","3" -#endif #define TR_VCURVETYPE "Diff","Expo","Funk","Egen" #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Læg til","Gange","Erstat" #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "FRA","TIL","Sid","Høj","Gas","Kræ","T5","T6" -#else - #define TR_VMIXTRIMS "FRA","TIL","Sid","Høj","Gas","Kræ" -#endif #if LCD_W >= 212 #define TR_CSWTIMER "Tid" @@ -112,63 +96,28 @@ #define TR_CSWEQUAL "a=x" #define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","a= 212 @@ -207,38 +154,8 @@ #define TR_VSWASHTYPE "---","120","120X","140","90" -#define TR_STICKS_VSRCRAW STR_CHAR_STICK "Sid", STR_CHAR_STICK "Høj", STR_CHAR_STICK "Gas", STR_CHAR_STICK "Kræ" - -#if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Sid", STR_CHAR_TRIM "Høj", STR_CHAR_TRIM "Gas", STR_CHAR_TRIM "Kræ", STR_CHAR_TRIM "T5", STR_CHAR_TRIM "T6" -#else - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Sid", STR_CHAR_TRIM "Høj", STR_CHAR_TRIM "Gas", STR_CHAR_TRIM "Kræ" -#endif - -#if defined(PCBHORUS) - #define TR_TRIMS_SWITCHES STR_CHAR_TRIM "Rl", STR_CHAR_TRIM "Rr", STR_CHAR_TRIM "Ed", STR_CHAR_TRIM "Eu", STR_CHAR_TRIM "Td", STR_CHAR_TRIM "Tu", STR_CHAR_TRIM "Al", STR_CHAR_TRIM "Ar", STR_CHAR_TRIM "5d", STR_CHAR_TRIM "5u", STR_CHAR_TRIM "6d", STR_CHAR_TRIM "6u" -#else - #define TRIM_SWITCH_CHAR TR("t",STR_CHAR_TRIM) - #define TR_TRIMS_SWITCHES TRIM_SWITCH_CHAR "Rl", TRIM_SWITCH_CHAR "Rr", TRIM_SWITCH_CHAR "Ed", TRIM_SWITCH_CHAR "Eu", TRIM_SWITCH_CHAR "Td", TRIM_SWITCH_CHAR "Tu", TRIM_SWITCH_CHAR "Al", TRIM_SWITCH_CHAR "Ar" -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define TR_VKEYS "PGUP","PGDN","ENTER","MDL","RTN","TELE","SYS" -#elif defined(PCBXLITE) - #define TR_VKEYS "Shift","Exit","Enter","Ned","Op","Højre","Venstre" -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define TR_VKEYS "Exit","Enter","Ned","Op","Højre","Venstre" -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define TR_VKEYS "Exit","Enter","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","OP","NED" -#elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(PCBTARANIS) - #define TR_VKEYS "Menu","Exit","Enter","Page","Plus","Minus" -#else - #define TR_VKEYS "Menu","Exit","Ned","Op","Højre","Venstre" -#endif +#define TR_STICK_NAMES "Sid", "Høj", "Gas", "Kræ" +#define TR_SURFACE_NAMES "Sid", "Gas" #if defined(PCBNV14) #define TR_RFPOWER_AFHDS2 "Standard","Høj" @@ -267,8 +184,11 @@ #define TR_CYC_VSRCRAW "[C1]","[C2]","[C3]" #endif -#define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Bat","Time","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Tmr1","Tmr2","Tmr3" + +#define TR_SRC_BATT "Batt" +#define TR_SRC_TIME "Time" +#define TR_SRC_GPS "GPS" +#define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES "FRA","TIL","Strt","THs","TH%","THt" #define TR_VTRAINER_MASTER_OFF "FRA" @@ -539,6 +459,7 @@ #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 "FUNCTION SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trim => Subtrim" #else @@ -923,6 +844,7 @@ #define TR_DEBUG "Fejlfind" #define TR_KEYS_BTN BUTTON("Taster") #define TR_ANALOGS_BTN BUTTON(TR("Analo", "Analoge")) +#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "Tryk skærm ikke fundet" #define TR_TOUCH_EXIT "Tryk på skærm for at forlade" #define TR_SET BUTTON("Set") diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 89226e229..cb8631c1c 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -73,28 +73,11 @@ #define TR_ADCFILTERVALUES "Global","Aus","Ein" -#if defined(PCBX10) - #define TR_RETA123 "S","H","G","Q","1","3","2","4","5","6","7","L","R" -#elif defined(PCBHORUS) - #define TR_RETA123 "S","H","G","Q","1","3","2","4","5","L","R" -#elif defined(PCBX9E) - #define TR_RETA123 "S","H","G","Q","1","2","3","4","L","R","L","R" -#elif defined(PCBTARANIS) - #define TR_RETA123 "S","H","G","Q","1","2","3","L","R" -#else - #define TR_RETA123 "S","H","G","Q","1","2","3" -#endif #define TR_VCURVETYPE "Diff","Expo","Funk","Ind." #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Addiere","Multipl.","Ersetze" #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "AUS","EIN","Sei","Höh","Gas","Que","T5","T6" -#else - #define TR_VMIXTRIMS "AUS","EIN","Sei","Höh","Gas","Que" -#endif - #if LCD_W >= 212 #define TR_CSWTIMER "Takt" // TIM = Takt = Taktgenerator #define TR_CSWSTICKY "SRFF" // Sticky = RS-Flip-Flop @@ -110,73 +93,33 @@ #define TR_CSWEQUAL "a=x" #define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","a= 212 - #define TR_SF_SAFETY "Überschreibe" -#elif defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Übersch." -#else - #define TR_SF_SAFETY "---" -#endif +#define TR_SF_TRAINER "Lehrer" +#define TR_SF_INST_TRIM "Inst. Trim" +#define TR_SF_RESET "Rücksetz." +#define TR_SF_SET_TIMER "Setze" +#define TR_SF_VOLUME "Lautstr." +#define TR_SF_FAILSAFE "SetFailsafe" +#define TR_SF_RANGE_CHECK "RangeCheck" +#define TR_SF_MOD_BIND "ModuleBind" + +#define TR_SOUND "Spiel Töne" +#define TR_PLAY_TRACK "Sag Text" +#define TR_PLAY_VALUE "Sag Wert" +#define TR_SF_HAPTIC "Haptik" +#define TR_SF_PLAY_SCRIPT "Lua Skript" +#define TR_SF_BG_MUSIC "StartMusik" +#define TR_SF_BG_MUSIC_PAUSE "Stop Musik" +#define TR_SF_LOGS "SD-Aufz." +#define TR_ADJUST_GVAR "Ändere" +#define TR_SF_BACKLIGHT "LCD Licht" +#define TR_SF_VARIO "Vario" +#define TR_SF_TEST "Test" +#define TR_SF_SAFETY TR("Übersch.", "Überschreibe") #define TR_SF_SCREENSHOT "Screenshot" #define TR_SF_RACING_MODE "RacingMode" #define TR_SF_DISABLE_TOUCH "Kein Touch" #define TR_SF_SET_SCREEN "Set Main Screen" -#define TR_SF_RESERVE "[Reserve]" - -#define TR_VFSWFUNC TR_SF_SAFETY,"Lehrer","Inst. Trim","Rücksetz.","Setze",TR_ADJUST_GVAR,"Lautstr.","SetFailsafe","RangeCheck","ModuleBind",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE,TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"LCD Licht",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH,TR_SF_SET_SCREEN TR_SF_TEST #define TR_FSW_RESET_TELEM TR("Telm","Telemetrie") @@ -205,37 +148,8 @@ #define TR_VSWASHTYPE "---","120","120X","140","90" -#define TR_STICKS_VSRCRAW STR_CHAR_STICK "Sei",STR_CHAR_STICK "Höh",STR_CHAR_STICK "Gas",STR_CHAR_STICK "Que" - -#if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Sei",STR_CHAR_TRIM "Höh",STR_CHAR_TRIM "Gas",STR_CHAR_TRIM "Que",STR_CHAR_TRIM "T5",STR_CHAR_TRIM "T6" -#else - #define TR_TRIMS_VSRCRAW TR("TrmS",STR_CHAR_TRIM "Sei"),TR("TrmH",STR_CHAR_TRIM "Höh"),TR("TrmG",STR_CHAR_TRIM "Gas"),TR("TrmQ",STR_CHAR_TRIM "que") -#endif - -#if defined(PCBHORUS) - #define TR_TRIMS_SWITCHES STR_CHAR_TRIM "Rl",STR_CHAR_TRIM "Rr",STR_CHAR_TRIM "Ed",STR_CHAR_TRIM "Eu",STR_CHAR_TRIM "Td",STR_CHAR_TRIM "Tu",STR_CHAR_TRIM "Al",STR_CHAR_TRIM "Ar",STR_CHAR_TRIM "5d",STR_CHAR_TRIM "5u",STR_CHAR_TRIM "6d",STR_CHAR_TRIM "6u" -#else - #define TR_TRIMS_SWITCHES TR("tRl",STR_CHAR_TRIM "Rl"),TR("tRr",STR_CHAR_TRIM "Rr"),TR("tEd",STR_CHAR_TRIM "Ed"),TR("tEu",STR_CHAR_TRIM "Eu"),TR("tTd",STR_CHAR_TRIM "Td"),TR("tTu",STR_CHAR_TRIM "Tu"),TR("tAl",STR_CHAR_TRIM "Al"),TR("tAr",STR_CHAR_TRIM "Ar") -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define TR_VKEYS "PGUP","PGDN","ENTER","MDL","RTN","TELE","SYS" -#elif defined(PCBXLITE) - #define TR_VKEYS "Shift","Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define TR_VKEYS "Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define TR_VKEYS "Exit","Enter","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","UP","DOWN" -#elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(PCBTARANIS) - #define TR_VKEYS "Menu","Exit","Enter","Page","Plus","Minus" -#else - #define TR_VKEYS "Menu","Exit","Down","Up","Right","Left" -#endif +#define TR_STICK_NAMES "Sei", "Höh", "Gas", "Que" +#define TR_SURFACE_NAMES "Str", "Gas" #if defined(PCBNV14) #define TR_RFPOWER_AFHDS2 "Default","High" @@ -264,8 +178,11 @@ #define TR_CYC_VSRCRAW "[C1]","[C2]","[C3]" #endif -#define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Batt","Time","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Tmr1","Tmr2","Tmr3" + +#define TR_SRC_BATT "Batt" +#define TR_SRC_TIME "Time" +#define TR_SRC_GPS "GPS" +#define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES "AUS","EIN","Strt","GSs","GS%","GSt" #define TR_VTRAINER_MASTER_OFF "AUS" @@ -538,6 +455,7 @@ #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 "FUNCTION SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" #else @@ -914,6 +832,7 @@ #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("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Kalibrieren" diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index ef6c70256..870b1f46a 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -50,7 +50,7 @@ #define TR_AUX_SERIAL_MODES "OFF","Telem Mirror","Telemetry In","SBUS Trainer","LUA","CLI","GPS","Debug","SpaceMouse","External module" #define TR_SWTYPES "None","Toggle","2POS","3POS" -#define TR_POTTYPES "None",TR("Pot w. det","Pot with detent"),TR("Multipos","Multipos Switch"),"Pot" +#define TR_POTTYPES "None",TR("Pot w. det","Pot with detent"),TR("Multipos","Multipos Switch"),"Pot", "Slider" #define TR_SLIDERTYPES "None","Slider" #define TR_VPERSISTENT "OFF","Flight","Manual Reset" #define TR_COUNTRY_CODES TR("US","America"),TR("JP","Japan"),TR("EU","Europe") @@ -69,26 +69,10 @@ #define TR_ADCFILTERVALUES "Global","Off","On" -#if defined(PCBX10) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","6","7","L","R" -#elif defined(PCBHORUS) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","L","R" -#elif defined(PCBX9E) - #define TR_RETA123 "R","E","T","A","1","2","3","4","L","R","L","R" -#elif defined(PCBTARANIS) - #define TR_RETA123 "R","E","T","A","1","2","3","L","R" -#else - #define TR_RETA123 "R","E","T","A","1","2","3" -#endif #define TR_VCURVETYPE "Diff","Expo","Func","Cstm" #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Add","Multiply","Replace" #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "OFF","ON","Rud","Ele","Thr","Ail","T5","T6" -#else - #define TR_VMIXTRIMS "OFF","ON","Rud","Ele","Thr","Ail" -#endif #if LCD_W >= 212 #define TR_CSWTIMER "Timer" @@ -105,64 +89,32 @@ #define TR_CSWEQUAL "a=x" #define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","a= 212 +#if LCD_W >= 212 #define TR_SF_SAFETY "Override" -#elif defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Overr." #else - #define TR_SF_SAFETY "---" + #define TR_SF_SAFETY "Overr." #endif #define TR_SF_SCREENSHOT "Screenshot" @@ -171,8 +123,6 @@ #define TR_SF_SET_SCREEN "Set Main Screen" #define TR_SF_RESERVE "[reserve]" -#define TR_VFSWFUNC TR_SF_SAFETY,"Trainer","Inst. Trim","Reset","Set",TR_ADJUST_GVAR,"Volume","SetFailsafe","RangeCheck","ModuleBind",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE,TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"Backlight",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH, TR_SF_SET_SCREEN TR_SF_TEST - #define TR_FSW_RESET_TELEM TR("Telm", "Telemetry") #if LCD_W >= 212 @@ -202,38 +152,8 @@ #define TR_VSWASHTYPE "---","120","120X","140","90" -#define TR_STICKS_VSRCRAW STR_CHAR_STICK "Rud", STR_CHAR_STICK "Ele", STR_CHAR_STICK "Thr", STR_CHAR_STICK "Ail" - -#if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Rud", STR_CHAR_TRIM "Ele", STR_CHAR_TRIM "Thr", STR_CHAR_TRIM "Ail", STR_CHAR_TRIM "T5", STR_CHAR_TRIM "T6" -#else - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Rud", STR_CHAR_TRIM "Ele", STR_CHAR_TRIM "Thr", STR_CHAR_TRIM "Ail" -#endif - -#if defined(PCBHORUS) - #define TR_TRIMS_SWITCHES STR_CHAR_TRIM "Rl", STR_CHAR_TRIM "Rr", STR_CHAR_TRIM "Ed", STR_CHAR_TRIM "Eu", STR_CHAR_TRIM "Td", STR_CHAR_TRIM "Tu", STR_CHAR_TRIM "Al", STR_CHAR_TRIM "Ar", STR_CHAR_TRIM "5d", STR_CHAR_TRIM "5u", STR_CHAR_TRIM "6d", STR_CHAR_TRIM "6u" -#else - #define TRIM_SWITCH_CHAR TR("t",STR_CHAR_TRIM) - #define TR_TRIMS_SWITCHES TRIM_SWITCH_CHAR "Rl", TRIM_SWITCH_CHAR "Rr", TRIM_SWITCH_CHAR "Ed", TRIM_SWITCH_CHAR "Eu", TRIM_SWITCH_CHAR "Td", TRIM_SWITCH_CHAR "Tu", TRIM_SWITCH_CHAR "Al", TRIM_SWITCH_CHAR "Ar" -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define TR_VKEYS "PGUP","PGDN","ENTER","MDL","RTN","TELE","SYS" -#elif defined(PCBXLITE) - #define TR_VKEYS "Shift","Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define TR_VKEYS "Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define TR_VKEYS "Exit","Enter","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","UP","DOWN" -#elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(PCBTARANIS) - #define TR_VKEYS "Menu","Exit","Enter","Page","Plus","Minus" -#else - #define TR_VKEYS "Menu","Exit","Down","Up","Right","Left" -#endif +#define TR_STICK_NAMES "Rud", "Ele", "Thr", "Ail" +#define TR_SURFACE_NAMES "ST", "TH" #if defined(PCBNV14) #define TR_RFPOWER_AFHDS2 "Default","High" @@ -262,8 +182,11 @@ #define TR_CYC_VSRCRAW "[C1]","[C2]","[C3]" #endif -#define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Batt","Time","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Tmr1","Tmr2","Tmr3" + +#define TR_SRC_BATT "Batt" +#define TR_SRC_TIME "Time" +#define TR_SRC_GPS "GPS" +#define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES "OFF","ON","Strt","THs","TH%","THt" #define TR_VTRAINER_MASTER_OFF "OFF" @@ -532,6 +455,7 @@ #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 "FUNCTION SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" #else @@ -749,7 +673,7 @@ #define TR_TIME "Time" #define TR_MAXBAUDRATE "Max bauds" #define TR_BAUDRATE "Baudrate" -#define TR_SAMPLE_MODE "Sample Mode" +#define TR_SAMPLE_MODE TR("Sampling","Sample Mode") #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Loading..." #define TR_DELETE_THEME "Delete Theme?" @@ -916,6 +840,7 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON("Keys") #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) +#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" #define TR_SET BUTTON("Set") diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index 67c9d4ca2..0ed08aab6 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -70,28 +70,11 @@ #define TR_CURVE_TYPES "Normal","Custom" #define TR_ADCFILTERVALUES "Global","Off","On" -#if defined(PCBX10) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","6","7","L","R" -#elif defined(PCBHORUS) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","L","R" -#elif defined(PCBX9E) - #define TR_RETA123 "R","E","T","A","1","2","3","4","L","R","L","R" -#elif defined(PCBTARANIS) - #define TR_RETA123 "R","E","T","A","1","2","3","L","R" -#else - #define TR_RETA123 "R","E","T","A","1","2","3" -#endif #define TR_VCURVETYPE "Diff","Expo","Func","Cstm" #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Añadir","Multipl.","Cambiar" #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "OFF","ON","Rud","Ele","Thr","Ail","T5","T6" -#else - #define TR_VMIXTRIMS "OFF","ON","Rud","Ele","Thr","Ail" -#endif - #if LCD_W >= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Pega" @@ -108,71 +91,33 @@ #define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","a Offsets" #else @@ -916,6 +835,7 @@ #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("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "Hardware táctil no encontrado" #define TR_TOUCH_EXIT "Tocar pantalla para salir" #define TR_CALIBRATION "Calibración" diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index 236625ca8..ee9f93c85 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -73,28 +73,11 @@ #define TR_ADCFILTERVALUES "Global","Off","On" -#if defined(PCBX10) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","6","7","L","R" -#elif defined(PCBHORUS) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","L","R" -#elif defined(PCBX9E) - #define TR_RETA123 "R","E","T","A","1","2","3","4","L","R","L","R" -#elif defined(PCBTARANIS) - #define TR_RETA123 "R","E","T","A","1","2","3","L","R" -#else - #define TR_RETA123 "R","E","T","A","1","2","3" -#endif #define TR_VCURVETYPE "Diff","Expo","Func","Cstm" #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Lisää","Kerro","Korvaa" #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "OFF","ON","Rud","Ele","Thr","Ail","T5","T6" -#else - #define TR_VMIXTRIMS "OFF","ON","Rud","Ele","Thr","Ail" -#endif - #if defined(PCBTARANIS) #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Stcky" @@ -113,71 +96,33 @@ #define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double" -#if defined(VARIO) - #define TR_VVARIO "Vario" -#else - #define TR_VVARIO "[Vario]" -#endif - -#if defined(AUDIO) - #define TR_SOUND "Play Sound" -#else - #define TR_SOUND "Beep" -#endif - -#if defined(HAPTIC) - #define TR_HAPTIC "Haptic" -#else - #define TR_HAPTIC "[Haptic]" -#endif - -#if defined(VOICE) - #define TR_PLAY_TRACK "Play Track" - #define TR_PLAY_VALUE TR("Play Val","Play Value") -#else - #define TR_PLAY_TRACK "[Play Trk]" - #define TR_PLAY_VALUE "[Play Val]" -#endif - -#define TR_SF_BG_MUSIC "BgMusic","BgMusic ||" - -#if defined(SDCARD) - #define TR_SDCLOGS "SD Logs" -#else - #define TR_SDCLOGS "[SD Logs]" -#endif - -#if defined(GVARS) - #define TR_ADJUST_GVAR "Adjust" -#else - #define TR_ADJUST_GVAR "[AdjustGV]" -#endif - -#if defined(LUA) - #define TR_SF_PLAY_SCRIPT "Lua Script" -#else - #define TR_SF_PLAY_SCRIPT "[Lua]" -#endif - -#if defined(DEBUG) - #define TR_SF_TEST "Test" -#else - #define TR_SF_TEST -#endif - -#if defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Safety" -#else - #define TR_SF_SAFETY "---" -#endif +#define TR_SF_TRAINER "Trainer" +#define TR_SF_INST_TRIM "Inst. Trim" +#define TR_SF_RESET "Reset" +#define TR_SF_SET_TIMER "Set" +#define TR_SF_VOLUME "Volume" +#define TR_SF_FAILSAFE "SetFailsafe" +#define TR_SF_RANGE_CHECK "RangeCheck" +#define TR_SF_MOD_BIND "ModuleBind" + +#define TR_SOUND "Play Sound" +#define TR_PLAY_TRACK "Play Track" +#define TR_PLAY_VALUE TR("Play Val","Play Value") +#define TR_SF_HAPTIC "Haptic" +#define TR_SF_PLAY_SCRIPT "Lua Script" +#define TR_SF_BG_MUSIC "BgMusic" +#define TR_SF_BG_MUSIC_PAUSE "BgMusic ||" +#define TR_SF_LOGS "SD Logs" +#define TR_ADJUST_GVAR "Adjust" +#define TR_SF_BACKLIGHT "Backlight" +#define TR_SF_VARIO "Vario" +#define TR_SF_TEST "Test" +#define TR_SF_SAFETY "Safety" #define TR_SF_SCREENSHOT "Screenshot" #define TR_SF_RACING_MODE "RacingMode" #define TR_SF_DISABLE_TOUCH "No Touch" #define TR_SF_SET_SCREEN "Set Main Screen" -#define TR_SF_RESERVE "[reserve]" - -#define TR_VFSWFUNC TR_SF_SAFETY,"Trainer","Inst. Trim","Reset","Set",TR_ADJUST_GVAR,"Volume","SetFailsafe","RangeCheck","ModuleBind",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE,TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"Backlight",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH,TR_SF_SET_SCREEN TR_SF_TEST #define TR_FSW_RESET_TELEM TR("Telm","Telemetry") @@ -212,37 +157,9 @@ #define TR_GPSFORMAT "HMS","NMEA" #define TR_VSWASHTYPE "---","120","120X","140","90" -#define TR_STICKS_VSRCRAW STR_CHAR_STICK "Rud",STR_CHAR_STICK "Ele",STR_CHAR_STICK "Thr",STR_CHAR_STICK "Ail" -#if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Rud",STR_CHAR_TRIM "Ele",STR_CHAR_TRIM "Thr",STR_CHAR_TRIM "Ail",STR_CHAR_TRIM "T5" STR_CHAR_TRIM "T6" -#else - #define TR_TRIMS_VSRCRAW TR("TrmR",STR_CHAR_TRIM "Rud"),TR("TrmE",STR_CHAR_TRIM "Ele"),TR("TrmT",STR_CHAR_TRIM "Thr"),TR("TrmA",STR_CHAR_TRIM "Ail") -#endif - -#if defined(PCBHORUS) - #define TR_TRIMS_SWITCHES STR_CHAR_TRIM "Rl",STR_CHAR_TRIM "Rr",STR_CHAR_TRIM "Ed",STR_CHAR_TRIM "Eu",STR_CHAR_TRIM "Td",STR_CHAR_TRIM "Tu",STR_CHAR_TRIM "Al",STR_CHAR_TRIM "Ar",STR_CHAR_TRIM "5d",STR_CHAR_TRIM "5u",STR_CHAR_TRIM "6d",STR_CHAR_TRIM "6u" -#else - #define TR_TRIMS_SWITCHES TR("tRl",STR_CHAR_TRIM "Rl"),TR("tRr",STR_CHAR_TRIM "Rr"),TR("tEd",STR_CHAR_TRIM "Ed"),TR("tEu",STR_CHAR_TRIM "Eu"),TR("tTd",STR_CHAR_TRIM "Td"),TR("tTu",STR_CHAR_TRIM "Tu"),TR("tAl",STR_CHAR_TRIM "Al"),TR("tAr",STR_CHAR_TRIM "Ar") -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define TR_VKEYS "PGUP","PGDN","ENTER","MDL","RTN","TELE","SYS" -#elif defined(PCBXLITE) - #define TR_VKEYS "Shift","Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define TR_VKEYS "Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define TR_VKEYS "Exit","Enter","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","UP","DOWN" -#elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(PCBTARANIS) - #define TR_VKEYS "Menu","Exit","Enter","Page","Plus","Minus" -#else - #define TR_VKEYS "Menu","Exit","Down","Up","Right","Left" -#endif +#define TR_STICK_NAMES "Rud", "Ele", "Thr", "Ail" +#define TR_SURFACE_NAMES "ST", "TH" #if defined(PCBNV14) #define TR_RFPOWER_AFHDS2 "Default","High" @@ -271,8 +188,11 @@ #define TR_CYC_VSRCRAW "[C1]","[C2]","[C3]" #endif -#define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Batt","Time","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Tmr1","Tmr2","Tmr3" + +#define TR_SRC_BATT "Batt" +#define TR_SRC_TIME "Time" +#define TR_SRC_GPS "GPS" +#define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES "OFF","ABS","Strt","THs","TH%","THt" #define TR_VTRAINER_MASTER_OFF "OFF" @@ -541,6 +461,7 @@ #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 "FUNCTION SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" #else @@ -762,7 +683,7 @@ #define TR_TIME "Aika" #define TR_MAXBAUDRATE "Max bauds" #define TR_BAUDRATE "Baudrate" -#define TR_SAMPLE_MODE "Sample Mode" +#define TR_SAMPLE_MODE TR("Sampling","Sample Mode") #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Loading..." #define TR_DELETE_THEME "Delete Theme?" @@ -928,6 +849,7 @@ #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("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" #define TR_SET "[Set]" diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index 38e38b69d..7ad2e5c1c 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -71,28 +71,11 @@ #define TR_ADCFILTERVALUES "Global","Off","On" -#if defined(PCBX10) - #define TR_RETA123 "D","F","G","A","1","3","2","4","5","6","7","L","R" -#elif defined(PCBHORUS) - #define TR_RETA123 "D","P","G","A","1","3","2","4","5","L","R" -#elif defined(PCBX9E) - #define TR_RETA123 "D","P","G","A","1","2","3","4","L","R","L","R" -#elif defined(PCBTARANIS) - #define TR_RETA123 "D","P","G","A","1","2","3","L","R" -#else - #define TR_RETA123 "D","P","G","A","1","2","3" -#endif -#define TR_VCURVETYPE "Diff","Expo","Fonct.","Perso." +#define TR_VCURVETYPE "Diff","Expo","Fonct","Perso." #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX TR("Ajoute","Additionner"),TR("Multipl.","Multiplier"),TR("Remplace","Remplacer") #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "OFF","ON","Dir","Prf","Gaz","Ail","T5","T6" -#else - #define TR_VMIXTRIMS "OFF","ON","Dir","Prf","Gaz","Ail" -#endif - #if LCD_W >= 212 #define TR_CSWTIMER "Tempo" #define TR_CSWSTICKY "Bistb" @@ -110,73 +93,33 @@ #define TR_TEXT_SIZE "Standard","Mini","Petit","Moyen","Double" -#if defined(VARIO) - #define TR_VVARIO "Vario" -#else - #define TR_VVARIO "[Vario]" -#endif - -#if defined(AUDIO) - #define TR_SOUND "Jouer son" -#else - #define TR_SOUND "Bip" -#endif - -#if defined(HAPTIC) - #define TR_HAPTIC "Vibreur" -#else - #define TR_HAPTIC "[Vibreur]" -#endif - -#if defined(VOICE) - #define TR_PLAY_TRACK "Jouer fichier" - #define TR_PLAY_VALUE "Lire valeur" -#else - #define TR_PLAY_TRACK "[Jouer fichier]" - #define TR_PLAY_VALUE "[Lire valeur]" -#endif - -#define TR_SF_BG_MUSIC "Musique","Pause Musique" - -#if defined(SDCARD) - #define TR_SDCLOGS "Logs SD" -#else - #define TR_SDCLOGS "[Logs SD]" -#endif - -#if defined(GVARS) - #define TR_ADJUST_GVAR "Ajuster" -#else - #define TR_ADJUST_GVAR "[AjusteGV]" -#endif - -#if defined(LUA) - #define TR_SF_PLAY_SCRIPT "Script Lua" -#else - #define TR_SF_PLAY_SCRIPT "[Lua]" -#endif - -#if defined(DEBUG) - #define TR_SF_TEST "Test" -#else - #define TR_SF_TEST -#endif - -#if defined(OVERRIDE_CHANNEL_FUNCTION) && LCD_W >= 212 - #define TR_SF_SAFETY "Remplace" -#elif defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Rempl." -#else - #define TR_SF_SAFETY "---" -#endif +#define TR_SF_TRAINER "Ecolage" +#define TR_SF_INST_TRIM "Inst. Trim" +#define TR_SF_RESET "Remise à 0" +#define TR_SF_SET_TIMER "Déf." +#define TR_SF_VOLUME "Volume" +#define TR_SF_FAILSAFE "DéfFailsafe" +#define TR_SF_RANGE_CHECK "Test Port." +#define TR_SF_MOD_BIND "Bind" + +#define TR_SOUND "Jouer son" +#define TR_PLAY_TRACK "Jouer fichier" +#define TR_PLAY_VALUE "Lire valeur" +#define TR_SF_HAPTIC "Vibreur" +#define TR_SF_PLAY_SCRIPT "Script Lua" +#define TR_SF_BG_MUSIC "Musique" +#define TR_SF_BG_MUSIC_PAUSE "Pause Musique" +#define TR_SF_LOGS "Logs SD" +#define TR_ADJUST_GVAR "Ajuster" +#define TR_SF_BACKLIGHT "Rétroécl." +#define TR_SF_VARIO "Vario" +#define TR_SF_TEST "Test" +#define TR_SF_SAFETY TR("Rempl.", "Remplace") #define TR_SF_SCREENSHOT "Photo Écran" #define TR_SF_RACING_MODE "Racing Mode" #define TR_SF_DISABLE_TOUCH "Non Tactile" #define TR_SF_SET_SCREEN "Définir Écran Princ." -#define TR_SF_RESERVE "[réservé]" - -#define TR_VFSWFUNC TR_SF_SAFETY,"Écolage","Trim instant.","Remise à 0","Déf.",TR_ADJUST_GVAR,"Volume","Déf. Failsafe","Test Port.","Bind",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE,TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"Rétroécl.",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH,TR_SF_SET_SCREEN TR_SF_TEST #define TR_FSW_RESET_TELEM TR("Télem.", "Télémétrie") @@ -213,37 +156,8 @@ #define TR_VSWASHTYPE "--- ","120","120X","140","90" -#define TR_STICKS_VSRCRAW STR_CHAR_STICK "Dir", STR_CHAR_STICK "Prf", STR_CHAR_STICK "Gaz", STR_CHAR_STICK "Ail" - -#if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Dir", STR_CHAR_TRIM "Prf", STR_CHAR_TRIM "Gaz", STR_CHAR_TRIM "Ail", STR_CHAR_TRIM "T5", STR_CHAR_TRIM "T6" -#else - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Dir", STR_CHAR_TRIM "Prf", STR_CHAR_TRIM "Gaz", STR_CHAR_TRIM "Ail" -#endif - -#if defined(PCBHORUS) - #define TR_TRIMS_SWITCHES STR_CHAR_TRIM "Dg", STR_CHAR_TRIM "Dd", STR_CHAR_TRIM "Pb", STR_CHAR_TRIM "Ph", STR_CHAR_TRIM "Gb", STR_CHAR_TRIM "Gh", STR_CHAR_TRIM "Ag", STR_CHAR_TRIM "Ad", STR_CHAR_TRIM "5d", STR_CHAR_TRIM "5u", STR_CHAR_TRIM "6d", STR_CHAR_TRIM "6u" -#else -#define TR_TRIMS_SWITCHES TR("tDg",STR_CHAR_TRIM "Dg"),TR("tDd",STR_CHAR_TRIM "Dd"),TR("tPb",STR_CHAR_TRIM "Pb"),TR("tPh",STR_CHAR_TRIM "Ph"),TR("tGb",STR_CHAR_TRIM "Gb"),TR("tGh",STR_CHAR_TRIM "Gh"),TR("tAg",STR_CHAR_TRIM "Ag") TR("tAd",STR_CHAR_TRIM "Ad") -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define TR_VKEYS "PGUP","PGDN","ENTER","MDL","RTN","TELE","SYS" -#elif defined(PCBXLITE) - #define TR_VKEYS "Màj.","Quitter","Entrer","Bas","Haut","Droite","Gauche" -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define TR_VKEYS "Quitter","Entrer","Bas","Haut","Droite","Gauche" -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define TR_VKEYS "Quitter","Entrer","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","UP","DOWN" -#elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(PCBTARANIS) - #define TR_VKEYS "Menu","Quitter","Entrer","Page","Plus","Moins" -#else - #define TR_VKEYS "Menu","Quitter","Bas","Haut","Droite","Gauche" -#endif +#define TR_STICK_NAMES "Dir", "Prf", "Gaz", "Ail" +#define TR_SURFACE_NAMES "Dir", "Gaz" #if defined(PCBNV14) #define TR_RFPOWER_AFHDS2 "Défaut","Haut" @@ -272,8 +186,11 @@ #define TR_CYC_VSRCRAW "[C1]","[C2]","[C3]" #endif -#define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Batt","H:M","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Chr1","Chr2","Chr3" + +#define TR_SRC_BATT "Batt" +#define TR_SRC_TIME "H_M" +#define TR_SRC_GPS "GPS" +#define TR_SRC_TIMER "Chr" #define TR_VTMRMODES "OFF","ON","GZs","GZ%","GZt" #define TR_VTRAINER_MASTER_OFF "OFF" @@ -546,6 +463,7 @@ #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 "FUNCTION SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" #else @@ -924,6 +842,7 @@ #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("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "Écran tactile non trouvé" #define TR_TOUCH_EXIT "Toucher écran pour quitter" #define TR_SET BUTTON("Déf") diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index 7a94c9214..fd4aa0343 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -74,26 +74,10 @@ #define TR_ADCFILTERVALUES "Globali","Off","On" -#if defined(PCBX10) - #define TR_RETA123 "D","E","M","A","1","3","2","4","5","6","7","S","D" -#elif defined(PCBHORUS) - #define TR_RETA123 "D","E","M","A","1","3","2","4","5","S","D" -#elif defined(PCBX9E) - #define TR_RETA123 "D","E","M","A","1","2","3","4","S","D","S","D" -#elif defined(PCBTARANIS) - #define TR_RETA123 "D","E","M","A","1","2","3","S","D" -#else - #define TR_RETA123 "D","E","M","A","1","2","3" -#endif #define TR_VCURVETYPE "Diff","Espo","Funz","Pers" #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Add.","Molt.","Sost." #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "OFF","ON","Dir","Ele","Mot","Ale","T5","T6" -#else - #define TR_VMIXTRIMS "OFF","ON","Dir","Ele","Mot","Ale" -#endif #if LCD_W >= 212 #define TR_CSWTIMER "Timer" @@ -110,73 +94,33 @@ #define TR_CSWEQUAL "a=x" #define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","a= 212 - #define TR_SF_SAFETY "Blocco" -#elif defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Blocco" -#else - #define TR_SF_SAFETY "---" -#endif - -#define TR_SF_SCREENSHOT "Screenshot" -#define TR_SF_RACING_MODE "Modo Racing" -#define TR_SF_DISABLE_TOUCH "No Touch" -#define TR_SF_SET_SCREEN "Setta Schermo" -#define TR_SF_RESERVE "[riserva]" - -#define TR_VFSWFUNC TR_SF_SAFETY,"Maestro","Trim Instant.","Azzera","Set",TR_ADJUST_GVAR,"Volume","SettaFailsafe","RangeCheck","BindModulo",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE,TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"Retroillum.",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH,TR_SF_SET_SCREEN TR_SF_TEST +#define TR_SF_SCREENSHOT "Screenshot" +#define TR_SF_RACING_MODE "Modo Racing" +#define TR_SF_DISABLE_TOUCH "No Touch" +#define TR_SF_SET_SCREEN "Setta Schermo Princ." #define TR_FSW_RESET_TELEM TR("Telm", "Telemetria") @@ -207,38 +151,8 @@ #define TR_VSWASHTYPE "---","120","120X","140","90" -#define TR_STICKS_VSRCRAW STR_CHAR_STICK "Dir", STR_CHAR_STICK "Ele", STR_CHAR_STICK "Mot", STR_CHAR_STICK "Ale" - -#if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Dir", STR_CHAR_TRIM "Ele", STR_CHAR_TRIM "Mot", STR_CHAR_TRIM "Ale", STR_CHAR_TRIM "T5", STR_CHAR_TRIM "T6" -#else - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Dir", STR_CHAR_TRIM "Ele", STR_CHAR_TRIM "Mot", STR_CHAR_TRIM "Ale" -#endif - -#if defined(PCBHORUS) - #define TR_TRIMS_SWITCHES STR_CHAR_TRIM "Rl", STR_CHAR_TRIM "Rr", STR_CHAR_TRIM "Ed", STR_CHAR_TRIM "Eu", STR_CHAR_TRIM "Td", STR_CHAR_TRIM "Tu", STR_CHAR_TRIM "Al", STR_CHAR_TRIM "Ar", STR_CHAR_TRIM "5d", STR_CHAR_TRIM "5u", STR_CHAR_TRIM "6d", STR_CHAR_TRIM "6u" -#else - #define TRIM_SWITCH_CHAR TR("t",STR_CHAR_TRIM) - #define TR_TRIMS_SWITCHES TRIM_SWITCH_CHAR "Rl", TRIM_SWITCH_CHAR "Rr", TRIM_SWITCH_CHAR "Ed", TRIM_SWITCH_CHAR "Eu", TRIM_SWITCH_CHAR "Td", TRIM_SWITCH_CHAR "Tu", TRIM_SWITCH_CHAR "Al", TRIM_SWITCH_CHAR "Ar" -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define TR_VKEYS "PGUP","PGDN","ENTER","MDL","RTN","TELE","SYS" -#elif defined(PCBXLITE) - #define TR_VKEYS "Shift","Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define TR_VKEYS "Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define TR_VKEYS "Exit","Enter","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","UP","DOWN" -#elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(PCBTARANIS) - #define TR_VKEYS "Menu","Exit","Enter","Page","Plus","Minus" -#else - #define TR_VKEYS "Menu","Exit","Down","Up","Right","Left" -#endif +#define TR_STICK_NAMES "Dir", "Ele", "Mot", "Ale" +#define TR_SURFACE_NAMES "Dir", "Mot" #if defined(PCBNV14) #define TR_RFPOWER_AFHDS2 "Default","Alto" @@ -267,8 +181,10 @@ #define TR_CYC_VSRCRAW "[C1]","[C2]","[C3]" #endif -#define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Batt","Time","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Tmr1","Tmr2","Tmr3" +#define TR_SRC_BATT "Batt" +#define TR_SRC_TIME "Time" +#define TR_SRC_GPS "GPS" +#define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES "OFF","ABS","Strt","MOs","MO%","MOt" #define TR_VTRAINER_MASTER_OFF "OFF" @@ -537,6 +453,7 @@ #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 "FUNCTION SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" #else diff --git a/radio/src/translations/jp.h b/radio/src/translations/jp.h index a196819e3..fa241924e 100644 --- a/radio/src/translations/jp.h +++ b/radio/src/translations/jp.h @@ -69,26 +69,10 @@ #define TR_ADCFILTERVALUES "グローバル","OFF","ON" -#if defined(PCBX10) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","6","7","L","R" -#elif defined(PCBHORUS) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","L","R" -#elif defined(PCBX9E) - #define TR_RETA123 "R","E","T","A","1","2","3","4","L","R","L","R" -#elif defined(PCBTARANIS) - #define TR_RETA123 "R","E","T","A","1","2","3","L","R" -#else - #define TR_RETA123 "R","E","T","A","1","2","3" -#endif #define TR_VCURVETYPE "Diff","Expo","Func","Cstm" #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "加算","乗算","置換" #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "OFF","ON","Rud","Ele","Thr","Ail","T5","T6" -#else - #define TR_VMIXTRIMS "OFF","ON","Rud","Ele","Thr","Ail" -#endif #if LCD_W >= 212 #define TR_CSWTIMER "Timer" @@ -105,65 +89,28 @@ #define TR_CSWEQUAL "a=x" #define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","a= 212 - #define TR_SF_SAFETY "上書き" -#elif defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Overr." -#else - #define TR_SF_SAFETY "---" -#endif +#define TR_SF_TRAINER "トレーナー" +#define TR_SF_INST_TRIM "Inst.トリム" +#define TR_SF_RESET "リセット" +#define TR_SF_SET_TIMER "設定" +#define TR_SF_VOLUME "ダイヤル" +#define TR_SF_FAILSAFE "フェイルセーフ" +#define TR_SF_RANGE_CHECK "レンジチェック" +#define TR_SF_MOD_BIND "モジュールバインド" + +#define TR_SOUND "サウンド再生" +#define TR_PLAY_TRACK "音源再生" +#define TR_PLAY_VALUE TR("Play Val","再生値") +#define TR_SF_HAPTIC "バイブレート" +#define TR_SF_PLAY_SCRIPT "LUAスクリプト" +#define TR_SF_BG_MUSIC "BGM再生" +#define TR_SF_BG_MUSIC_PAUSE "BGM一時停止" +#define TR_SF_LOGS "SDログ出力" +#define TR_ADJUST_GVAR "G変数修正" +#define TR_SF_BACKLIGHT "バックライト" +#define TR_SF_VARIO "バリオ" +#define TR_SF_TEST "テスト" +#define TR_SF_SAFETY TR("Overr.","上書き") #define TR_SF_SCREENSHOT "画面キャプチャ" #define TR_SF_RACING_MODE "レースモード" @@ -171,8 +118,6 @@ #define TR_SF_SET_SCREEN "メインスクリーン設定" #define TR_SF_RESERVE "[予備]" -#define TR_VFSWFUNC TR_SF_SAFETY,"トレーナー","Inst.トリム","リセット","設定",TR_ADJUST_GVAR,"ダイヤル","フェイルセーフ","レンジチェック","モジュールバインド",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE,TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"バックライト",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH TR_SF_TEST - #define TR_FSW_RESET_TELEM TR("Telm", "テレメトリー") #if LCD_W >= 212 @@ -202,38 +147,8 @@ #define TR_VSWASHTYPE "---","120","120X","140","90" -#define TR_STICKS_VSRCRAW STR_CHAR_STICK "Rud", STR_CHAR_STICK "Ele", STR_CHAR_STICK "Thr", STR_CHAR_STICK "Ail" - -#if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Rud", STR_CHAR_TRIM "Ele", STR_CHAR_TRIM "Thr", STR_CHAR_TRIM "Ail", STR_CHAR_TRIM "T5", STR_CHAR_TRIM "T6" -#else - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Rud", STR_CHAR_TRIM "Ele", STR_CHAR_TRIM "Thr", STR_CHAR_TRIM "Ail" -#endif - -#if defined(PCBHORUS) - #define TR_TRIMS_SWITCHES STR_CHAR_TRIM "Rl", STR_CHAR_TRIM "Rr", STR_CHAR_TRIM "Ed", STR_CHAR_TRIM "Eu", STR_CHAR_TRIM "Td", STR_CHAR_TRIM "Tu", STR_CHAR_TRIM "Al", STR_CHAR_TRIM "Ar", STR_CHAR_TRIM "5d", STR_CHAR_TRIM "5u", STR_CHAR_TRIM "6d", STR_CHAR_TRIM "6u" -#else - #define TRIM_SWITCH_CHAR TR("t",STR_CHAR_TRIM) - #define TR_TRIMS_SWITCHES TRIM_SWITCH_CHAR "Rl", TRIM_SWITCH_CHAR "Rr", TRIM_SWITCH_CHAR "Ed", TRIM_SWITCH_CHAR "Eu", TRIM_SWITCH_CHAR "Td", TRIM_SWITCH_CHAR "Tu", TRIM_SWITCH_CHAR "Al", TRIM_SWITCH_CHAR "Ar" -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define TR_VKEYS "PGUP","PGDN","ENTER","MDL","RTN","TELE","SYS" -#elif defined(PCBXLITE) - #define TR_VKEYS "Shift","Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define TR_VKEYS "Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define TR_VKEYS "Exit","Enter","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","UP","DOWN" -#elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(PCBTARANIS) - #define TR_VKEYS "Menu","Exit","Enter","Page","Plus","Minus" -#else - #define TR_VKEYS "Menu","Exit","Down","Up","Right","Left" -#endif +#define TR_STICK_NAMES "Rud", "Ele", "Thr", "Ail" +#define TR_SURFACE_NAMES "ST", "TH" #if defined(PCBNV14) #define TR_RFPOWER_AFHDS2 "Default","High" @@ -262,8 +177,11 @@ #define TR_CYC_VSRCRAW "[C1]","[C2]","[C3]" #endif -#define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Batt","Time","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Tmr1","Tmr2","Tmr3" + +#define TR_SRC_BATT "Batt" +#define TR_SRC_TIME "Time" +#define TR_SRC_GPS "GPS" +#define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES "OFF","ON","Strt","THs","TH%","THt" #define TR_VTRAINER_MASTER_OFF "OFF" @@ -532,6 +450,7 @@ #define TR_MENU_RADIO_ANALOGS_CALIB "アナログ キャリブレーション" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW アナログ (5 Hz)" #define TR_MENUCALIBRATION "キャリブレーション" +#define TR_MENU_FSWITCH "FUNCTION SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "トリム => サブトリム" #else @@ -916,6 +835,7 @@ #define TR_DEBUG "デバッグ" #define TR_KEYS_BTN BUTTON("キー") #define TR_ANALOGS_BTN BUTTON(TR("Anas", "アナログ")) +#define TR_FS_BTN BUTTON(TR("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "タッチパネルは見つかりませんでした" #define TR_TOUCH_EXIT "画面をタップして終了します" #define TR_SET BUTTON("設定") diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 3d3d0da58..2fff2b773 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -71,28 +71,11 @@ #define TR_CURVE_TYPES "Standaard","Custom" #define TR_ADCFILTERVALUES "Globale","Off","On" -#if defined(PCBX10) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","6","7","L","R" -#elif defined(PCBHORUS) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","L","R" -#elif defined(PCBX9E) - #define TR_RETA123 "R","E","T","A","1","2","3","4","L","R","L","R" -#elif defined(PCBTARANIS) - #define TR_RETA123 "R","E","T","A","1","2","3","L","R" -#else - #define TR_RETA123 "R","E","T","A","1","2","3" -#endif #define TR_VCURVETYPE "Diff","Expo","Func","Cstm" #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Add","Multiply","Replace" #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "OFF","ON","Rud","Ele","Thr","Ail","T5","T6" -#else - #define TR_VMIXTRIMS "OFF","ON","Rud","Ele","Thr","Ail" -#endif - #if LCD_W >= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Stcky" @@ -108,65 +91,28 @@ #define TR_CSWEQUAL "a=x" #define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","a= 212 - #define TR_SF_SAFETY "Override" -#elif defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Overr." -#else - #define TR_SF_SAFETY "---" -#endif +#define TR_SF_TRAINER "Trainer" +#define TR_SF_INST_TRIM "Inst. Trim" +#define TR_SF_RESET "Reset" +#define TR_SF_SET_TIMER "Set" +#define TR_SF_VOLUME "Volume" +#define TR_SF_FAILSAFE "SetFailsafe" +#define TR_SF_RANGE_CHECK "RangeCheck" +#define TR_SF_MOD_BIND "ModuleBind" + +#define TR_SOUND "Geluid" +#define TR_PLAY_TRACK "Play Track" +#define TR_PLAY_VALUE TR("Play Val","Play Value") +#define TR_SF_HAPTIC "Haptic" +#define TR_SF_PLAY_SCRIPT "Lua Script" +#define TR_SF_BG_MUSIC "BgMusic" +#define TR_SF_BG_MUSIC_PAUSE "BgMusic ||" +#define TR_SF_LOGS "SD Logs" +#define TR_ADJUST_GVAR "Wijzig" +#define TR_SF_BACKLIGHT "Backlight" +#define TR_SF_VARIO "Vario" +#define TR_SF_TEST "Test" +#define TR_SF_SAFETY TR("Overr.","Override") #define TR_SF_SCREENSHOT "Schermafdr" #define TR_SF_RACING_MODE "RacingMode" @@ -174,8 +120,6 @@ #define TR_SF_SET_SCREEN "Set Main Screen" #define TR_SF_RESERVE "[reserve]" -#define TR_VFSWFUNC TR_SF_SAFETY,"Trainer","Inst. Trim","Reset","Set",TR_ADJUST_GVAR,"Volume","SetFailsafe","RangeCheck","ModuleBind",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE,TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"Backlight",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH,TR_SF_SET_SCREEN TR_SF_TEST - #define TR_FSW_RESET_TELEM TR("Telm", "Telemetrie") #if LCD_W >= 212 @@ -205,38 +149,8 @@ #define TR_VSWASHTYPE "---","120","120X","140","90" -#define TR_STICKS_VSRCRAW STR_CHAR_STICK "Rud", STR_CHAR_STICK "Ele", STR_CHAR_STICK "Thr", STR_CHAR_STICK "Ail" - -#if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Rud", STR_CHAR_TRIM "Ele", STR_CHAR_TRIM "Thr", STR_CHAR_TRIM "Ail", STR_CHAR_TRIM "T5", STR_CHAR_TRIM "T6" -#else - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Rud", STR_CHAR_TRIM "Ele", STR_CHAR_TRIM "Thr", STR_CHAR_TRIM "Ail" -#endif - -#if defined(PCBHORUS) - #define TR_TRIMS_SWITCHES STR_CHAR_TRIM "Rl", STR_CHAR_TRIM "Rr", STR_CHAR_TRIM "Ed", STR_CHAR_TRIM "Eu", STR_CHAR_TRIM "Td", STR_CHAR_TRIM "Tu", STR_CHAR_TRIM "Al", STR_CHAR_TRIM "Ar", STR_CHAR_TRIM "5d", STR_CHAR_TRIM "5u", STR_CHAR_TRIM "6d", STR_CHAR_TRIM "6u" -#else - #define TRIM_SWITCH_CHAR TR("t",STR_CHAR_TRIM) - #define TR_TRIMS_SWITCHES TRIM_SWITCH_CHAR "Rl", TRIM_SWITCH_CHAR "Rr", TRIM_SWITCH_CHAR "Ed", TRIM_SWITCH_CHAR "Eu", TRIM_SWITCH_CHAR "Td", TRIM_SWITCH_CHAR "Tu", TRIM_SWITCH_CHAR "Al", TRIM_SWITCH_CHAR "Ar" -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define TR_VKEYS "PGUP","PGDN","ENTER","MDL","RTN","TELE","SYS" -#elif defined(PCBXLITE) - #define TR_VKEYS "Shift","Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define TR_VKEYS "Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define TR_VKEYS "Exit","Enter","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","UP","DOWN" -#elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(PCBTARANIS) - #define TR_VKEYS "Menu","Exit","Enter","Page","Plus","Minus" -#else - #define TR_VKEYS "Menu","Exit","Down","Up","Right","Left" -#endif +#define TR_STICK_NAMES "Rud", "Ele", "Thr", "Ail" +#define TR_SURFACE_NAMES "ST", "TH" #if defined(PCBNV14) #define TR_RFPOWER_AFHDS2 "Default","High" @@ -265,11 +179,13 @@ #define TR_CYC_VSRCRAW "[C1]","[C2]","[C3]" #endif -#define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Batt","Time","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Tmr1","Tmr2","Tmr3" -#define TR_VTMRMODES "UIT","AAN","Strt","THs","TH%","THt" +#define TR_SRC_BATT "Batt" +#define TR_SRC_TIME "Time" +#define TR_SRC_GPS "GPS" +#define TR_SRC_TIMER "Tmr" +#define TR_VTMRMODES "UIT","AAN","Strt","THs","TH%","THt" #define TR_VTRAINER_MASTER_OFF "OFF" #define TR_VTRAINER_MASTER_JACK "Master/Jack" #define TR_VTRAINER_SLAVE_JACK "Slave/Jack" @@ -539,8 +455,8 @@ #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_MENUCALIBRATION TR("CALIB. ANALOOG", "CALIBRERING Sticks+Pots") +#define TR_MENU_FSWITCH "FUNCTION SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" #else @@ -754,7 +670,7 @@ #define TR_TIME "Tijd:" #define TR_MAXBAUDRATE "Max bauds" #define TR_BAUDRATE "Baudrate" -#define TR_SAMPLE_MODE "Sample Mode" +#define TR_SAMPLE_MODE TR("Sampling","Sample Mode") #define TR_SAMPLE_MODES "Normal""OneBit" #define TR_LOADING "Loading..." #define TR_DELETE_THEME "Delete Theme?" @@ -920,6 +836,7 @@ #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("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" #define TR_SET "[Set]" diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index 074c2728d..932b7b5ff 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -70,28 +70,11 @@ #define TR_CURVE_TYPES "Standard","Własny" #define TR_ADCFILTERVALUES "Globalne","WYŁ","ZAŁ" -#if defined(PCBX10) - #define TR_RETA123 "K","W","G","L","1","3","2","4","5","6","7","L","R" -#elif defined(PCBHORUS) - #define TR_RETA123 "K","W","G","L","1","3","2","4","5","L","R" -#elif defined(PCBX9E) - #define TR_RETA123 "K","W","G","L","1","2","3","4","L","R","L","R" -#elif defined(PCBTARANIS) - #define TR_RETA123 "K","W","G","L","1","2","3","L","R" -#else - #define TR_RETA123 "K","W","G","L","1","2","3" -#endif #define TR_VCURVETYPE "Diff","Expo","Func","Cstm" #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Dodaj","Mnóż","Zastąp" #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "WYŁ","ZAŁ","SK","SW","GAZ","Lot","Ail","T5","T6" -#else - #define TR_VMIXTRIMS "WYŁ","ZAŁ","SK","SW","GAZ","Lot" -#endif - #if LCD_W >= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Stały" @@ -107,73 +90,33 @@ #define TR_CSWEQUAL "a=x" #define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","aSD" -#else - #define TR_SDCLOGS "[Logować]" -#endif - -#if defined(GVARS) - #define TR_ADJUST_GVAR "Ustaw" -#else - #define TR_ADJUST_GVAR "[UstawZG]" -#endif - -#if defined(LUA) - #define TR_SF_PLAY_SCRIPT "SkryptyLua" -#else - #define TR_SF_PLAY_SCRIPT "[Lua]" -#endif - -#if defined(DEBUG) - #define TR_SF_TEST ,"Test" -#else - #define TR_SF_TEST -#endif - -#if defined(OVERRIDE_CHANNEL_FUNCTION) && LCD_W >= 212 - #define TR_SF_SAFETY "Bezpiecz" -#elif defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Bezp." -#else - #define TR_SF_SAFETY "---" -#endif +#define TR_SF_TRAINER "Trener" +#define TR_SF_INST_TRIM "Inst-Trim" +#define TR_SF_RESET "Resetuj" +#define TR_SF_SET_TIMER "Ustaw" +#define TR_SF_VOLUME "Głośność" +#define TR_SF_FAILSAFE "SetFailsafe" +#define TR_SF_RANGE_CHECK "RangeCheck" +#define TR_SF_MOD_BIND "ModuleBind" + +#define TR_SOUND "GrajDźwięk" +#define TR_PLAY_TRACK "GrajŚcieżk" +#define TR_PLAY_VALUE TR("Graj Wart","GrajWartoś") +#define TR_SF_HAPTIC "Wibracje" +#define TR_SF_PLAY_SCRIPT "SkryptyLua" +#define TR_SF_BG_MUSIC "Muz. tła" +#define TR_SF_BG_MUSIC_PAUSE "Muz. tła ||" +#define TR_SF_LOGS "Logi->SD" +#define TR_ADJUST_GVAR "Ustaw" +#define TR_SF_BACKLIGHT "Podświetl" +#define TR_SF_VARIO "Wario" +#define TR_SF_TEST "Test" +#define TR_SF_SAFETY TR("Bezp.","Bezpiecz") #define TR_SF_SCREENSHOT "Zrzut Ekra" #define TR_SF_RACING_MODE "RacingMode" #define TR_SF_DISABLE_TOUCH "No Touch" #define TR_SF_SET_SCREEN "Set Main Screen" -#define TR_SF_RESERVE "[rezerwa]" - -#define TR_VFSWFUNC TR_SF_SAFETY,"Trener","Inst-Trim","Resetuj","Ustaw",TR_ADJUST_GVAR,"Głośność","SetFailsafe","RangeCheck","ModuleBind",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE,TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"Podświetl",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH,TR_SF_SET_SCREEN TR_SF_TEST #define TR_FSW_RESET_TELEM TR("Telm", "Telemetra") @@ -203,38 +146,8 @@ #define TR_VSWASHTYPE "---","120","120X","140","90" -#define TR_STICKS_VSRCRAW STR_CHAR_STICK "SK", STR_CHAR_STICK "SW", STR_CHAR_STICK "Gaz", STR_CHAR_STICK "Lot" - -#if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "SK", STR_CHAR_TRIM "SW", STR_CHAR_TRIM "Gaz", STR_CHAR_TRIM "Lot", STR_CHAR_TRIM "T5", STR_CHAR_TRIM "T6" -#else - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "SK", STR_CHAR_TRIM "SW", STR_CHAR_TRIM "Gaz", STR_CHAR_TRIM "Lot" -#endif - -#if defined(PCBHORUS) -#define TR_TRIMS_SWITCHES STR_CHAR_TRIM "Rl", STR_CHAR_TRIM "Rr", STR_CHAR_TRIM "Ed", STR_CHAR_TRIM "Eu", STR_CHAR_TRIM "Td", STR_CHAR_TRIM "Tu", STR_CHAR_TRIM "Al", STR_CHAR_TRIM "Ar", STR_CHAR_TRIM "5d", STR_CHAR_TRIM "5u", STR_CHAR_TRIM "6d", STR_CHAR_TRIM "6u" -#else - #define TRIM_SWITCH_CHAR TR("t",STR_CHAR_TRIM) - #define TR_TRIMS_SWITCHES TRIM_SWITCH_CHAR "Rl", TRIM_SWITCH_CHAR "Rr", TRIM_SWITCH_CHAR "Ed", TRIM_SWITCH_CHAR "Eu", TRIM_SWITCH_CHAR "Td", TRIM_SWITCH_CHAR "Tu", TRIM_SWITCH_CHAR "Al", TRIM_SWITCH_CHAR "Ar" -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define TR_VKEYS "PGUP","PGDN","ENTER","MDL","RTN","TELE","SYS" -#elif defined(PCBXLITE) - #define TR_VKEYS "Shift","Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define TR_VKEYS "Exit","Enter","Down","Up","Right","Left" -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define TR_VKEYS "Exit","Enter","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","UP","DOWN" -#elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(PCBTARANIS) - #define TR_VKEYS "Menu","Exit","Enter","Page","Plus","Minus" -#else - #define TR_VKEYS "Menu","Exit","Down","Up","Right","Left" -#endif +#define TR_STICK_NAMES "SK", "SW", "Gaz", "Lot" +#define TR_SURFACE_NAMES "SK", "Gaz" #if defined(PCBNV14) #define TR_RFPOWER_AFHDS2 "Default","High" @@ -263,8 +176,11 @@ #define TR_CYC_VSRCRAW "[C1]","[C2]","[C3]" #endif -#define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Batt","Time","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Tmr1","Tmr2","Tmr3" + +#define TR_SRC_BATT "Batt" +#define TR_SRC_TIME "Time" +#define TR_SRC_GPS "GPS" +#define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES "WYŁ","ABS","Strt","THs","TH%","THt" #define TR_VTRAINER_MASTER_OFF "OFF" @@ -534,6 +450,7 @@ #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 "FUNCTION SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trymery => Subtrimy" #else @@ -747,7 +664,7 @@ #define TR_TIME "Czas" #define TR_MAXBAUDRATE "Max bauds" #define TR_BAUDRATE "Baudrate" -#define TR_SAMPLE_MODE "Sample Mode" +#define TR_SAMPLE_MODE TR("Sampling","Sample Mode") #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Ładowanie..." #define TR_DELETE_THEME "Usunąć motyw?" @@ -913,6 +830,7 @@ #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("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" #define TR_SET "[Set]" diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index c5cc3a8b3..1250d79e7 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -70,29 +70,11 @@ #define TR_CURVE_TYPES "Standard","Custom" #define TR_ADCFILTERVALUES "Global","Off","On" -#if defined(PCBX10) - #define TR_RETA123 "L","P","M","A","1","3","2","4","5","6","7","L","R" -#elif defined(PCBHORUS) - #define TR_RETA123 "L","P","M","A","3","2","4","5","L","R" -#elif defined(PCBX9E) - #define TR_RETA123 "L","P","M","A","1","2","3","4","L","R","L","R" -#elif defined(PCBTARANIS) - #define TR_RETA123 "L","P","M","A","1","2","3","L","R" -#else - #define TR_RETA123 "L","P","M","A","1","2","3" -#endif - #define TR_VCURVETYPE "Diff","Expo","Func","Cstm" #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Adicionar","Multipl.","Trocar" #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "OFF","ON","Lem","Pfd","Mot","Ail","T5","T6" -#else - #define TR_VMIXTRIMS "OFF","ON","Lem","Pfd","Mot","Ail" -#endif - #if defined(PCBTARANIS) #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Stcky" @@ -108,71 +90,33 @@ #define TR_CSWEQUAL "a=x" #define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","a Subtrims" #else @@ -754,7 +672,7 @@ #define TR_TIME "Time" #define TR_MAXBAUDRATE "Max bauds" #define TR_BAUDRATE "Baudrate" -#define TR_SAMPLE_MODE "Sample Mode" +#define TR_SAMPLE_MODE TR("Sampling","Sample Mode") #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Loading..." #define TR_DELETE_THEME "Delete Theme?" @@ -920,6 +838,7 @@ #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("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" #define TR_SET "[Set]" diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index 45ea90298..90391b201 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -78,29 +78,11 @@ #define TR_ADCFILTERVALUES "Global","Av","På" -#if defined(PCBX10) - #define TR_RETA123 "R","H","G","S","1","3","2","4","5","6","7","V","H" -#elif defined(PCBHORUS) - #define TR_RETA123 "R","H","G","S","1","3","2","4","5","V","H" -#elif defined(PCBX9E) - #define TR_RETA123 "R","H","G","S","1","2","3","4","V","H","V","H" -#elif defined(PCBTARANIS) - #define TR_RETA123 "R","H","G","S","1","2","3","V","H" -#else - #define TR_RETA123 "R","H","G","S","1","2","3" -#endif - -#define TR_VCURVETYPE "Diff","Expo","Funk","Egen" +#define TR_VCURVETYPE "Diff","Expo","Funk","Egen" #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "Addera","Multiplicera","Ersätt" #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "Av","På","Rod","Hjd","Gas","Ske","T5","T6" -#else - #define TR_VMIXTRIMS "Av","På","Rod","Hjd","Gas","Ske" -#endif - #if LCD_W >= 212 #define TR_CSWTIMER "Timer" #define TR_CSWSTICKY "Seg" @@ -118,65 +100,28 @@ #define TR_TEXT_SIZE "Std","XS","S","M","L" -#if defined(VARIO) - #define TR_VVARIO "Vario" -#else - #define TR_VVARIO "[Vario]" -#endif - -#if defined(AUDIO) - #define TR_SOUND "Spela ljud" -#else - #define TR_SOUND "Pip" -#endif - -#if defined(HAPTIC) - #define TR_HAPTIC "Haptisk" -#else - #define TR_HAPTIC "[Haptisk]" -#endif - -#if defined(VOICE) - #define TR_PLAY_TRACK "Spela upp" - #define TR_PLAY_VALUE "Säg värdet" -#else - #define TR_PLAY_TRACK "[Sp. upp]" - #define TR_PLAY_VALUE "[Sp. värde]" -#endif - -#define TR_SF_BG_MUSIC "Musik","Pausa musik" - -#if defined(SDCARD) - #define TR_SDCLOGS "Logga data" -#else - #define TR_SDCLOGS "[Logga data]" -#endif - -#ifdef GVARS - #define TR_ADJUST_GVAR "Justera" -#else - #define TR_ADJUST_GVAR "[Just. GV]" -#endif - -#if defined(LUA) - #define TR_SF_PLAY_SCRIPT "Lua-skript" -#else - #define TR_SF_PLAY_SCRIPT "[Lua]" -#endif - -#if defined(DEBUG) - #define TR_SF_TEST "Test" -#else - #define TR_SF_TEST -#endif - -#if defined(OVERRIDE_CHANNEL_FUNCTION) && LCD_W >= 212 - #define TR_SF_SAFETY "Lås " -#elif defined(OVERRIDE_CHANNEL_FUNCTION) - #define TR_SF_SAFETY "Lås " -#else - #define TR_SF_SAFETY "---" -#endif +#define TR_SF_TRAINER "Lärare" +#define TR_SF_INST_TRIM "Spara trimmar" +#define TR_SF_RESET "Återställ" +#define TR_SF_SET_TIMER "Sätt" +#define TR_SF_VOLUME "Volym" +#define TR_SF_FAILSAFE "Sätt failsafe" +#define TR_SF_RANGE_CHECK "Range check" +#define TR_SF_MOD_BIND "Bind modul" + +#define TR_SOUND "Spela ljud" +#define TR_PLAY_TRACK "Spela upp" +#define TR_PLAY_VALUE "Säg värdet" +#define TR_SF_HAPTIC "Haptisk" +#define TR_SF_PLAY_SCRIPT "Lua-skript" +#define TR_SF_BG_MUSIC "Musik" +#define TR_SF_BG_MUSIC_PAUSE "Pausa Musik" +#define TR_SF_LOGS "Logga data" +#define TR_ADJUST_GVAR "Justera" +#define TR_SF_BACKLIGHT "Belysning" +#define TR_SF_VARIO "Vario" +#define TR_SF_TEST "Test" +#define TR_SF_SAFETY "Lås" #define TR_SF_SCREENSHOT "Skärmbild" #define TR_SF_RACING_MODE "Tävlingsläge" @@ -184,8 +129,6 @@ #define TR_SF_SET_SCREEN "Sätt huvudskärm" #define TR_SF_RESERVE "[reserv]" -#define TR_VFSWFUNC TR_SF_SAFETY,"Lärare","Spara trimmar","Återställ","Sätt ",TR_ADJUST_GVAR,"Volym","Sätt failsafe","Räckviddstest","Bind modul",TR_SOUND,TR_PLAY_TRACK,TR_PLAY_VALUE, TR_SF_RESERVE,TR_SF_PLAY_SCRIPT,TR_SF_RESERVE,TR_SF_BG_MUSIC,TR_VVARIO,TR_HAPTIC,TR_SDCLOGS,"Belysning",TR_SF_SCREENSHOT,TR_SF_RACING_MODE,TR_SF_DISABLE_TOUCH,TR_SF_SET_SCREEN TR_SF_TEST - #define TR_FSW_RESET_TELEM TR("Telm","Telemetri") #if LCD_W >= 212 @@ -220,38 +163,8 @@ #define TR_VSWASHTYPE "---","120","120X","140","90" -#define TR_STICKS_VSRCRAW STR_CHAR_STICK "Rod", STR_CHAR_STICK "Hjd", STR_CHAR_STICK "Gas", STR_CHAR_STICK "Ske" - -#if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW STR_CHAR_TRIM "Rod",STR_CHAR_TRIM "Hjd",STR_CHAR_TRIM "Gas",STR_CHAR_TRIM "Ske",STR_CHAR_TRIM "T5",STR_CHAR_TRIM "T6" -#else - #define TR_TRIMS_VSRCRAW TR("TrmR",STR_CHAR_TRIM "Rod"),TR("TrmH",STR_CHAR_TRIM "Hjd"),TR("TrmG",STR_CHAR_TRIM "Gas"),TR("TrmS",STR_CHAR_TRIM "Ske") -#endif - -#if defined(PCBHORUS) - #define TR_TRIMS_SWITCHES STR_CHAR_TRIM "Rv",STR_CHAR_TRIM "Rh",STR_CHAR_TRIM "Hn",STR_CHAR_TRIM "Hu",STR_CHAR_TRIM "Gn",STR_CHAR_TRIM "Gu", STR_CHAR_TRIM "Sv",STR_CHAR_TRIM "Sh",STR_CHAR_TRIM "5d",STR_CHAR_TRIM "5u",STR_CHAR_TRIM "6d",STR_CHAR_TRIM "6u" -#else - #define TRIM_SWITCH_CHAR TR("t",STR_CHAR_TRIM) - #define TR_TRIMS_SWITCHES TR("tRv",STR_CHAR_TRIM "Rv"),TR("tRh",STR_CHAR_TRIM "Rh"),TR("tHn",STR_CHAR_TRIM "Hn"),TR("tHu",STR_CHAR_TRIM "Hu"),TR("tGn", STR_CHAR_TRIM "Gn"),TR("tGu",STR_CHAR_TRIM "Gu"),TR("tSv",STR_CHAR_TRIM "Sv"),TR("tSh",STR_CHAR_TRIM "Sh") -#endif - -#if defined(PCBHORUS) || defined(PCBNV14) - #define TR_VKEYS "PGUP","PGDN","ENTER","MDL","RTN","TELE","SYS" -#elif defined(PCBXLITE) - #define TR_VKEYS "Skift","Avbr.","Enter","Ner","Upp","Höger","Vnstr" -#elif defined(RADIO_FAMILY_JUMPER_T12) - #define TR_VKEYS "Avbryt","Enter","Ner","Upp","Höger","Vänster" -#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) - #define TR_VKEYS "Avbryt","Enter","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","UPP","NER" -#elif defined(RADIO_ZORRO) || defined(RADIO_BOXER) - #define TR_VKEYS "RTN","ENTER","PGUP","PGDN","SYS","MDL","TELE" -#elif defined(PCBTARANIS) - #define TR_VKEYS "Meny","Avbryt","Enter","Sida","Plus","Minus" -#else - #define TR_VKEYS "Meny","Avbryt","Ner","Upp","Höger","Vänster" -#endif +#define TR_STICK_NAMES "Rod", "Hjd", "Gas", "Ske" +#define TR_SURFACE_NAMES "Rod", "Gas" #if defined(PCBNV14) #define TR_RFPOWER_AFHDS2 "Default","Hög" @@ -281,8 +194,11 @@ #define TR_CYC_VSRCRAW "[C1]","[C2]","[C3]" #endif -#define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Batt","Tid","GPS",TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,TR_RESERVE_VSRCRAW,"Tmr1","Tmr2","Tmr3" + +#define TR_SRC_BATT "Batt" +#define TR_SRC_TIME "Time" +#define TR_SRC_GPS "GPS" +#define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES "Av","På","Strt","GAs","GA%","GAt" #define TR_VTRAINER_MASTER_OFF "AV" @@ -561,6 +477,7 @@ #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 "FUNCTION SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "[Spara trimvärden]" #else @@ -773,7 +690,7 @@ #define TR_TIME "Tid" #define TR_BAUDRATE "Baudrate" #define TR_MAXBAUDRATE "Max bauds" -#define TR_SAMPLE_MODE TR("Sample mod.", "Sample Mode") +#define TR_SAMPLE_MODE TR("Sampling","Sample Mode") #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Laddar..." #define TR_DELETE_THEME "Radera tema?" @@ -941,6 +858,7 @@ #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("F. Switches", "Function switches")) #define TR_TOUCH_NOTFOUND "Pekskärm hittas ej" #define TR_TOUCH_EXIT "Peka på skärmen för att avsluta" #define TR_SET BUTTON(TR("Def", "Ställ in")) diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index 87be216d9..e72b678ff 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -70,26 +70,10 @@ #define TR_ADCFILTERVALUES "全局","禁用","开启" -#if defined(PCBX10) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","6","7","L","R" -#elif defined(PCBHORUS) - #define TR_RETA123 "R","E","T","A","1","3","2","4","5","L","R" -#elif defined(PCBX9E) - #define TR_RETA123 "R","E","T","A","1","2","3","4","L","R","L","R" -#elif defined(PCBTARANIS) - #define TR_RETA123 "R","E","T","A","1","2","3","L","R" -#else - #define TR_RETA123 "R","E","T","A","1","2","3" -#endif #define TR_VCURVETYPE "單邊","指數","函數","自定義" #define TR_VCURVEFUNC "---","x>0","x<0","|x|","f>0","f<0","|f|" #define TR_VMLTPX "相加","相乘","替換" #define TR_VMLTPX2 "+=","*=",":=" -#if defined(PCBHORUS) - #define TR_VMIXTRIMS "禁用","啟用","Rud","Ele","Thr","Ail","T5","T6" -#else - #define TR_VMIXTRIMS "禁用","啟用","Rud","Ele","Thr","Ail","T5","T6" -#endif #if LCD_W >= 212 #define TR_CSWTIMER "定時" @@ -106,73 +90,33 @@ #define TR_CSWEQUAL "a=x" #define TR_VCSWFUNC "---",TR_CSWEQUAL,"a" STR_CHAR_TILDE "x","a>x","ax","|a|b","a []") - -version = sys.argv[1] -inputFile = sys.argv[2] -outputFile = sys.argv[3] -docFile = None -if len(sys.argv) >= 4: - docFile = sys.argv[4] -print("Version %s" % version) -print("Input file %s" % inputFile) -print("Output file %s" % outputFile) -if docFile: - print("Documentation file %s" % docFile) - -with open(inputFile, "r") as inp: - while True: - line = inp.readline() - if len(line) == 0: - break - line = line.strip('\r\n') - line = line.strip() - # print "line: %s" % line - - if line.find('LEXP') < 0: - continue - - parts = line.split('LEXP') - # print parts - if len(parts) != 2: - print("Wrong line: %s" % line) - continue - cmd = 'LEXP' + parts[1] - cnst = parts[0].rstrip(', ') - if cnst.find('=') != -1: - # constant contains = - cnst = cnst.split('=')[0].strip() - # print "Found constant %s with command: %s" % (cnst, cmd) - try: - CONSTANT_VALUE = cnst - # if CONSTANT_VALUE in dups_cnst: - # print "WARNING: Duplicate CONSTANT_VALUE found: %s" % CONSTANT_VALUE - # warning = True - # continue - # dups_cnst.append(CONSTANT_VALUE) - # print cmd - eval(cmd) - except: - print("ERROR: problem with the definition: %s" % line) - traceback.print_exc() - error = True - -with open(outputFile, "w") as out: - out.write("//This file was generated by luaexport.py script on %s for EdgeTX version %s\n\n\n" - % (time.asctime(), version)) - - header = """ - struct LuaSingleField { - uint16_t id; - const char * name; - const char * desc; - }; - - struct LuaMultipleField { - uint16_t id; - const char * name; - const char * desc; - uint8_t count; - }; - - """ - out.write(header) - - out.write(""" - // The list of Lua fields - // this aray is alphabetically sorted by the second field (name) - const LuaSingleField luaSingleFields[] = { - """) - exports.sort(key=lambda x: x[1]) # sort by name - data = [" {%s, \"%s\", \"%s\"}" % export for export in exports] - out.write(",\n".join(data)) - out.write("\n};\n\n") - print("Generated %d items in luaFields[]" % len(exports)) - - out.write(""" - // The list of Lua fields that have a range of values - const LuaMultipleField luaMultipleFields[] = { - """) - data = [" {%s, \"%s\", \"%s\", %d}" % export for export in exports_multiple] - out.write(",\n".join(data)) - out.write("\n};\n\n") - print("Generated %d items in luaMultipleFields[]" % len(exports_multiple)) - -if docFile: - # prepare fields - all_exports = [(name, desc) for (id, name, desc) in exports] - for (id, nameFormat, descriptionFormat, valuesCount) in exports_multiple: - for v in range(1, valuesCount + 1): - name = nameFormat + str(v) - desc = descriptionFormat % v - all_exports.append((name, desc)) - # natural sort by field name - convert = lambda text: int(text) if text.isdigit() else text - alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key[0])] - all_exports.sort(key=alphanum_key) - - with open(docFile, "w") as out: - out.write("Alphabetical list of Lua fields for EdgeTX version %s\n\n\n" % version) - FIELD_NAME_WIDTH = 25 - out.write("Field name%sField description\n" % (' ' * (FIELD_NAME_WIDTH - len('Field name')))) - out.write("----------------------------------------------\n") - data = ["%s%s%s" % (name_, ' ' * (FIELD_NAME_WIDTH - len(name_)), desc_) for (name_, desc_) in all_exports] - out.write("\n".join(data)) - out.write("\n") - -if warning: - sys.exit(1) -elif error: - os.remove(outputFile) - sys.exit(2) -sys.exit(0) diff --git a/tools/generate-hw-defs.sh b/tools/generate-hw-defs.sh new file mode 100755 index 000000000..770e62952 --- /dev/null +++ b/tools/generate-hw-defs.sh @@ -0,0 +1,118 @@ +#!/bin/bash + +# Stops on first error, echo on +set -e +# set -x + +: "${SRCDIR:=$(dirname "$(pwd)/$0")/..}" + +: ${FLAVOR:="nv14;t12;t16;t18;t8;zorro;commando8;tlite;tpro;lr3pro;tx12;tx12mk2;boxer;tx16s;x10;x10-access;x12s;x7;x7-access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites"} +: ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"} + +# wipe build directory clean +rm -rf build && mkdir -p build && cd build + +target_names=$(echo "$FLAVOR" | tr '[:upper:]' '[:lower:]' | tr ';' '\n') + +TARGET_DIR="${SRCDIR}/radio/src/targets/hw_defs" + +for target_name in $target_names +do + BUILD_OPTIONS=${COMMON_OPTIONS} + BUILD_OPTIONS+=" $EXTRA_OPTIONS " + + echo "Processing ${target_name}" + case $target_name in + + x9lite) + BUILD_OPTIONS+="-DPCB=X9LITE" + ;; + x9lites) + BUILD_OPTIONS+="-DPCB=X9LITES" + ;; + x7) + BUILD_OPTIONS+="-DPCB=X7" + ;; + x7-access) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=ACCESS -DPXX1=YES" + ;; + t12) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T12 -DINTERNAL_MODULE_MULTI=ON" + ;; + tx12) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=TX12" + ;; + tx12mk2) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=TX12MK2" + ;; + boxer) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=BOXER" + ;; + t8) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=T8" + ;; + zorro) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=ZORRO" + ;; + tlite) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=TLITE" + ;; + tpro) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=TPRO" + ;; + lr3pro) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=LR3PRO" + ;; + xlite) + BUILD_OPTIONS+="-DPCB=XLITE" + ;; + xlites) + BUILD_OPTIONS+="-DPCB=XLITES" + ;; + x9d) + BUILD_OPTIONS+="-DPCB=X9D" + ;; + x9dp) + BUILD_OPTIONS+="-DPCB=X9D+" + ;; + x9dp2019) + BUILD_OPTIONS+="-DPCB=X9D+ -DPCBREV=2019" + ;; + x9e) + BUILD_OPTIONS+="-DPCB=X9E" + ;; + x10) + BUILD_OPTIONS+="-DPCB=X10" + ;; + x10-access) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=EXPRESS -DPXX1=YES" + ;; + x12s) + BUILD_OPTIONS+="-DPCB=X12S" + ;; + t16) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=T16 -DINTERNAL_MODULE_MULTI=ON" + ;; + t18) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=T18" + ;; + tx16s) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=TX16S" + ;; + nv14) + BUILD_OPTIONS+="-DPCB=NV14" + ;; + commando8) + BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=COMMANDO8" + ;; + esac + + cmake ${BUILD_OPTIONS} "${SRCDIR}" + cmake --build . --target arm-none-eabi-configure + cmake --build arm-none-eabi --target hardware_defs + + mkdir -p ${TARGET_DIR} + mv arm-none-eabi/radio/src/*.json* ${TARGET_DIR} + + rm -f CMakeCache.txt arm-none-eabi/CMakeCache.txt +done diff --git a/tools/generate-yaml.sh b/tools/generate-yaml.sh index 85af95bc6..63e784025 100755 --- a/tools/generate-yaml.sh +++ b/tools/generate-yaml.sh @@ -8,7 +8,7 @@ if [[ -n ${GCC_ARM} ]] ; then export PATH=${GCC_ARM}:$PATH fi -: ${FLAVOR:="t12;t8;tlite;tpro;lr3pro;tx12;tx12mk2;boxer;zorro;tx16s;x12s;nv14;x7;x9d;x9dp;x9e;x9lite;x9lites;xlite;xlites"} +: ${FLAVOR:="tx16s;x12s;nv14;x9d;x9dp;x9e;x9lite;xlites;x7;tpro"} : ${SRCDIR:=$(dirname "$(pwd)/$0")/..} : ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DDISABLE_COMPANION=YES -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"} diff --git a/tools/setup_buildenv_msys2_stage2.sh b/tools/setup_buildenv_msys2_stage2.sh index 3187b48a0..b693c247e 100644 --- a/tools/setup_buildenv_msys2_stage2.sh +++ b/tools/setup_buildenv_msys2_stage2.sh @@ -26,6 +26,13 @@ if [[ $PAUSEAFTEREACHLINE == "true" ]]; then echo "Step finished. Please check the output above and press Enter to continue or Ctrl+C to stop." read fi +echo "=== Step $((STEP++)): Installing Python jinja2 ===" + +python -m pip install jinja2 +if [[ $PAUSEAFTEREACHLINE == "true" ]]; then + echo "Step finished. Please check the output above and press Enter to continue or Ctrl+C to stop." + read +fi echo "=== Step $((STEP++)): Installing Python setuptools and wheel ===" python -m pip install setuptools wheel