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