diff --git a/.travis.yml b/.travis.yml index c8d72a914..8ebbbddd8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,12 +9,16 @@ before_install: - sudo add-apt-repository 'deb http://llvm.org/apt/precise/ llvm-toolchain-precise main' --yes - wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key | sudo apt-key add - - sudo apt-get update -qq - - rsync -av firmware.diydrones.com::Tools/Travis/*.deb ExtraPackages install: - - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.8 libclang-3.8-dev python-qt4 - - sudo dpkg -i ExtraPackages/*.deb || echo "FAILED INSTALL OF EXTRA DEBS" + - sudo apt-get install -y xvfb lcov cmake cmake-data bc curl gcc-arm-none-eabi qt-latest g++-5 libxerces-c-dev xsdcxx libsdl1.2-dev libusb-1.0-0 libfox-1.6-dev libgtest-dev python-clang-3.9 libclang-3.9-dev python-qt4 - export CXX="g++-5" CC="gcc-5" + - wget --quiet http://firmware.ardupilot.org/Tools/Travis/gcc-avr_1%253a4.8-2.1_amd64.deb + - wget --quiet http://firmware.ardupilot.org/Tools/Travis/libmpfr4_3.1.2-1_amd64.deb + - wget --quiet http://firmware.ardupilot.org/Tools/Travis/avr-libc_1%253a1.8.0-4.1_all.deb + - wget --quiet http://firmware.ardupilot.org/Tools/Travis/binutils-avr_2.23.1-2.1_amd64.deb + - wget --quiet http://firmware.ardupilot.org/Tools/Travis/libmpc3_1.0.1-1ubuntu1_amd64.deb + - sudo dpkg --install gcc-avr_1%3a4.8-2.1_amd64.deb avr-libc_1%3a1.8.0-4.1_all.deb libmpfr4_3.1.2-1_amd64.deb binutils-avr_2.23.1-2.1_amd64.deb libmpc3_1.0.1-1ubuntu1_amd64.deb script: - ./radio/util/commit-tests.sh . diff --git a/CMakeLists.txt b/CMakeLists.txt index 769cadd08..2180c7516 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,9 @@ message(STATUS "OpenTX ${VERSION}") cmake_minimum_required(VERSION 2.8) cmake_policy(SET CMP0020 NEW) cmake_policy(SET CMP0023 OLD) +if(POLICY CMP0043) + cmake_policy(SET CMP0043 NEW) +endif() set(CMAKE_CXX_STANDARD 11) @@ -28,6 +31,14 @@ find_package(Qt5LinguistTools) find_package(Qt5PrintSupport) find_package(Qt5Multimedia) +message(STATUS "Looking for SDL ") +find_package(Sdl) +if(SDL_FOUND) + message("SDL Include Path: " ${SDL_INCLUDE_DIR}) +else() + message("SDL not found! Joysticks support will be disabled. Simulator audio will not work.") +endif() + include(Macros) today(DATE) now(TIME) diff --git a/cmake/Bitmaps.cmake b/cmake/Bitmaps.cmake index f91402e81..145aeff0f 100644 --- a/cmake/Bitmaps.cmake +++ b/cmake/Bitmaps.cmake @@ -1,4 +1,5 @@ macro(add_bitmaps_target targetname filter width format) + set(bitmaps_files) file(GLOB bitmaps ${filter}) foreach(bitmap ${bitmaps}) get_filename_component(target ${bitmap} NAME_WE) @@ -19,4 +20,5 @@ macro(add_truetype_font_target radio name font size bold) COMMAND ${RADIO_DIRECTORY}/util/font2png.py ${font} ${size} ${bold} ${target} WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY} ) + set(ttf_horus_fonts_targets ${ttf_horus_fonts_targets} ttf_${radio}_${name}) endmacro(add_truetype_font_target) \ No newline at end of file diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 4c34b7f2c..ebb139596 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -25,15 +25,10 @@ if(TABLE_LAYOUT) message(STATUS "Using QTableWidget") endif(TABLE_LAYOUT) -message(STATUS "Looking for SDL ") -find_package(Sdl) if(SDL_FOUND) include_directories(${SDL_INCLUDE_DIR}) - message("SDL Include Path: " ${SDL_INCLUDE_DIR}) - add_definitions(-DJOYSTICKS) add_definitions(-DSIMU_AUDIO) -else() - message("SDL not found! Joysticks support will be disabled. Simulator audio will not work.") + add_definitions(-DJOYSTICKS) endif() message(STATUS "Looking for QT lupdate ") @@ -283,7 +278,7 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") install(FILES ../targets/linux/45-companion-taranis.rules DESTINATION /lib/udev/rules.d RENAME 45-companion${C9X_NAME_SUFFIX}-taranis.rules) # Linux specific code set(OperatingSystem "Linux") -else() +elseif(WIN32) get_target_property(QtCore_LOCATION Qt5::Core LOCATION) get_filename_component(QT_DLL_DIR ${QtCore_LOCATION} PATH) get_filename_component(SDL_DIR ${SDL_LIBRARY} PATH) diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index 7d56bbc51..da8862c87 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -1626,7 +1626,9 @@ class Firmware { } virtual int getCapability(const Capability) = 0; - + + virtual QTime getMaxTimerStart() = 0; + virtual bool isTelemetrySourceAvailable(int source) = 0; virtual int isAvailable(PulsesProtocol proto, int port=0) = 0; diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index f583dab63..d58715375 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -813,6 +813,16 @@ int OpenTxFirmware::getCapability(const Capability capability) } } +QTime OpenTxFirmware::getMaxTimerStart() +{ + if (IS_TARANIS(board) || IS_HORUS(board)) + return QTime(23, 59, 59); + else if (IS_ARM(board)) + return QTime(8, 59, 59); + else + return QTime(0, 59, 59); +} + bool OpenTxFirmware::isTelemetrySourceAvailable(int source) { if (IS_TARANIS(board) && (source == TELEMETRY_SOURCE_RSSI_TX)) @@ -1161,8 +1171,117 @@ void registerOpenTxFirmwares() Option nav_options[] = { { "rotenc", QObject::tr("Rotary Encoder use in menus navigation") }, { "potscroll", QObject::tr("Pots use in menus navigation") }, { NULL } }; Option dsm2_options[] = { { "DSM2", QObject::tr("Support for DSM2 modules"), 0 }, { "DSM2PPM", QObject::tr("Support for DSM2 modules using ppm instead of true serial"), 0 }, { NULL } }; + /* Taranis Plus board */ + firmware = new OpenTxFirmware("opentx-taranisplus", QObject::tr("FrSky Taranis Plus"), BOARD_TARANIS_PLUS); + addOpenTxTaranisOptions(firmware); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + + /* Taranis board */ + firmware = new OpenTxFirmware("opentx-taranis", QObject::tr("FrSky Taranis"), BOARD_TARANIS); + firmware->addOption("haptic", QObject::tr("Haptic module installed")); + addOpenTxTaranisOptions(firmware); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + + /* Taranis X9E board */ + firmware = new OpenTxFirmware("opentx-taranisx9e", QObject::tr("FrSky Taranis X9E"), BOARD_TARANIS_X9E); + firmware->addOption("shutdownconfirm", QObject::tr("Confirmation before radio shutdown")); + addOpenTxTaranisOptions(firmware); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + + /* Horus board */ + firmware = new OpenTxFirmware("opentx-horus", QObject::tr("FrSky Horus"), BOARD_HORUS); + firmware->addOption("noheli", QObject::tr("Disable HELI menu and cyclic mix support")); + firmware->addOption("nogvars", QObject::tr("Disable Global variables")); + firmware->addOption("lua", QObject::tr("Support for Lua model scripts")); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + + /* 9XR-Pro */ + firmware = new OpenTxFirmware("opentx-9xrpro", QObject::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO); + firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); + firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); + firmware->addOption("nofp", QObject::tr("No flight modes")); + firmware->addOption("nocurves", QObject::tr("Disable curves menus")); + firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); + firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); + firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); + firmware->addOption("timer3", QObject::tr("Support for a third timer")); + firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); + firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); + firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); + firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); + firmware->addOption("battgraph", QObject::tr("Battery graph")); + firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); + firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + + /* 9XR board with M128 chip */ + firmware = new OpenTxFirmware("opentx-9xr128", QObject::tr("Turnigy 9XR with m128 chip"), BOARD_M128); + firmware->addOptions(extr_options); + firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); + firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); + firmware->addOption("nosplash", QObject::tr("No splash screen")); + firmware->addOption("nofp", QObject::tr("No flight modes")); + firmware->addOption("nocurves", QObject::tr("Disable curves menus")); + firmware->addOption("audio", QObject::tr("Support for radio modified with regular speaker")); + firmware->addOption("voice", QObject::tr("Used if you have modified your radio with voice mode")); + firmware->addOption("haptic", QObject::tr("Used if you have modified your radio with haptic mode")); + // NOT TESTED firmware->addOption("PXX", QObject::tr("Support of FrSky PXX protocol")); + firmware->addOption("DSM2", QObject::tr("Support for DSM2 modules")); + firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); + firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); + firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); + firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); + firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); + firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); + firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); + firmware->addOption("battgraph", QObject::tr("Battery graph")); + firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); + firmware->addOption("thrtrace", QObject::tr("Enable the throttle trace in Statistics")); + firmware->addOption("pgbar", QObject::tr("EEprom write Progress bar")); + firmware->addOption("imperial", QObject::tr("Imperial units")); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + + /* 9XR board */ + firmware = new OpenTxFirmware("opentx-9xr", QObject::tr("Turnigy 9XR"), BOARD_STOCK); + firmware->addOptions(extr_options); + firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); + firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); + firmware->addOption("nosplash", QObject::tr("No splash screen")); + firmware->addOption("nofp", QObject::tr("No flight modes")); + firmware->addOption("nocurves", QObject::tr("Disable curves menus")); + firmware->addOption("audio", QObject::tr("Support for radio modified with regular speaker")); + firmware->addOption("voice", QObject::tr("Used if you have modified your radio with voice mode")); + firmware->addOption("haptic", QObject::tr("Used if you have modified your radio with haptic mode")); + // NOT TESTED firmware->addOption("PXX", QObject::tr("Support of FrSky PXX protocol")); + firmware->addOption("DSM2", QObject::tr("Support for DSM2 modules")); + firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); + firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); + firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); + firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); + firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); + firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); + firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); + firmware->addOption("battgraph", QObject::tr("Battery graph")); + firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); + firmware->addOption("thrtrace", QObject::tr("Enable the throttle trace in Statistics")); + firmware->addOption("pgbar", QObject::tr("EEprom write Progress bar")); + firmware->addOption("imperial", QObject::tr("Imperial units")); + firmware->addOption("nowshh", QObject::tr("No Winged Shadow How High support")); + firmware->addOption("novario", QObject::tr("No vario support")); + firmware->addOption("nogps", QObject::tr("No GPS support")); + firmware->addOption("nogauges", QObject::tr("No gauges in the custom telemetry screen")); + firmware->addOption("stickrev", QObject::tr("Add support for reversing stick inputs (e.g. needed for FrSky gimbals)")); + addOpenTxCommonOptions(firmware); + firmwares.push_back(firmware); + /* 9x board */ - firmware = new OpenTxFirmware("opentx-9x", QObject::tr("9X board"), BOARD_STOCK); + firmware = new OpenTxFirmware("opentx-9x", QObject::tr("9X with stock board"), BOARD_STOCK); firmware->addOptions(ext_options); firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); @@ -1198,7 +1317,7 @@ void registerOpenTxFirmwares() firmwares.push_back(firmware); /* 9x board with M128 chip */ - firmware = new OpenTxFirmware("opentx-9x128", QObject::tr("M128 / 9X board"), BOARD_M128); + firmware = new OpenTxFirmware("opentx-9x128", QObject::tr("9X with stock board and m128 chip"), BOARD_M128); firmware->addOptions(ext_options); firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); @@ -1227,69 +1346,52 @@ void registerOpenTxFirmwares() addOpenTxCommonOptions(firmware); firmwares.push_back(firmware); - /* 9XR board */ - firmware = new OpenTxFirmware("opentx-9xr", QObject::tr("9XR"), BOARD_STOCK); - firmware->addOptions(extr_options); - firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); + /* ar9x board */ + firmware = new OpenTxFirmware("opentx-ar9x", QObject::tr("9X with AR9X board"), BOARD_AR9X); + firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); - firmware->addOption("nosplash", QObject::tr("No splash screen")); firmware->addOption("nofp", QObject::tr("No flight modes")); firmware->addOption("nocurves", QObject::tr("Disable curves menus")); - firmware->addOption("audio", QObject::tr("Support for radio modified with regular speaker")); - firmware->addOption("voice", QObject::tr("Used if you have modified your radio with voice mode")); - firmware->addOption("haptic", QObject::tr("Used if you have modified your radio with haptic mode")); - // NOT TESTED firmware->addOption("PXX", QObject::tr("Support of FrSky PXX protocol")); - firmware->addOption("DSM2", QObject::tr("Support for DSM2 modules")); firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); + firmware->addOption("timer3", QObject::tr("Support for a third timer")); firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); + firmware->addOption("dblkeys", QObject::tr("Enable resetting values by pressing up and down at the same time")); firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); firmware->addOption("battgraph", QObject::tr("Battery graph")); firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); - firmware->addOption("thrtrace", QObject::tr("Enable the throttle trace in Statistics")); - firmware->addOption("pgbar", QObject::tr("EEprom write Progress bar")); - firmware->addOption("imperial", QObject::tr("Imperial units")); - firmware->addOption("nowshh", QObject::tr("No Winged Shadow How High support")); - firmware->addOption("novario", QObject::tr("No vario support")); - firmware->addOption("nogps", QObject::tr("No GPS support")); - firmware->addOption("nogauges", QObject::tr("No gauges in the custom telemetry screen")); - firmware->addOption("stickrev", QObject::tr("Add support for reversing stick inputs (e.g. needed for FrSky gimbals)")); + firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); +// firmware->addOption("rtc", QObject::tr("Optional RTC added")); +// firmware->addOption("volume", QObject::tr("i2c volume control added")); addOpenTxCommonOptions(firmware); firmwares.push_back(firmware); - /* 9XR board with M128 chip */ - firmware = new OpenTxFirmware("opentx-9xr128", QObject::tr("9XR with M128 chip"), BOARD_M128); - firmware->addOptions(extr_options); - firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); + /* Sky9x board */ + firmware = new OpenTxFirmware("opentx-sky9x", QObject::tr("9X with Sky9x board"), BOARD_SKY9X); + firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); - firmware->addOption("nosplash", QObject::tr("No splash screen")); firmware->addOption("nofp", QObject::tr("No flight modes")); firmware->addOption("nocurves", QObject::tr("Disable curves menus")); - firmware->addOption("audio", QObject::tr("Support for radio modified with regular speaker")); - firmware->addOption("voice", QObject::tr("Used if you have modified your radio with voice mode")); - firmware->addOption("haptic", QObject::tr("Used if you have modified your radio with haptic mode")); - // NOT TESTED firmware->addOption("PXX", QObject::tr("Support of FrSky PXX protocol")); - firmware->addOption("DSM2", QObject::tr("Support for DSM2 modules")); firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); + firmware->addOption("timer3", QObject::tr("Support for a third timer")); firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); + firmware->addOption("dblkeys", QObject::tr("Enable resetting values by pressing up and down at the same time")); firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); firmware->addOption("battgraph", QObject::tr("Battery graph")); firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); - firmware->addOption("thrtrace", QObject::tr("Enable the throttle trace in Statistics")); - firmware->addOption("pgbar", QObject::tr("EEprom write Progress bar")); - firmware->addOption("imperial", QObject::tr("Imperial units")); + firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); addOpenTxCommonOptions(firmware); firmwares.push_back(firmware); /* Gruvin9x board */ - firmware = new OpenTxFirmware("opentx-gruvin9x", QObject::tr("Gruvin9x board / 9X"), BOARD_GRUVIN9X); + firmware = new OpenTxFirmware("opentx-gruvin9x", QObject::tr("9X with Gruvin9x board"), BOARD_GRUVIN9X); firmware->addOption("heli", QObject::tr("Enable heli menu and cyclic mix support")); firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); firmware->addOption("nofp", QObject::tr("No flight modes")); @@ -1314,7 +1416,7 @@ void registerOpenTxFirmwares() firmwares.push_back(firmware); /* MEGA2560 board */ - firmware = new OpenTxFirmware("opentx-mega2560", QObject::tr("MEGA2560 board"), BOARD_MEGA2560); + firmware = new OpenTxFirmware("opentx-mega2560", QObject::tr("DIY MEGA2560 radio"), BOARD_MEGA2560); addOpenTxLcdOptions(firmware); firmware->addOption("PWR", QObject::tr("Power management by soft-off circuitry")); firmware->addOptions(ext_options); @@ -1343,99 +1445,6 @@ void registerOpenTxFirmwares() addOpenTxCommonOptions(firmware); firmwares.push_back(firmware); - /* Sky9x board */ - firmware = new OpenTxFirmware("opentx-sky9x", QObject::tr("Sky9x board / 9X"), BOARD_SKY9X); - firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); - firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); - firmware->addOption("nofp", QObject::tr("No flight modes")); - firmware->addOption("nocurves", QObject::tr("Disable curves menus")); - firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); - firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); - firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); - firmware->addOption("timer3", QObject::tr("Support for a third timer")); - firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); - firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); - firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); - firmware->addOption("dblkeys", QObject::tr("Enable resetting values by pressing up and down at the same time")); - firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); - firmware->addOption("battgraph", QObject::tr("Battery graph")); - firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); - firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - - /* ar9x board */ - firmware = new OpenTxFirmware("opentx-ar9x", QObject::tr("ar9x board / 9X"), BOARD_AR9X); - firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); - firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); - firmware->addOption("nofp", QObject::tr("No flight modes")); - firmware->addOption("nocurves", QObject::tr("Disable curves menus")); - firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); - firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); - firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); - firmware->addOption("timer3", QObject::tr("Support for a third timer")); - firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); - firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); - firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); - firmware->addOption("dblkeys", QObject::tr("Enable resetting values by pressing up and down at the same time")); - firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); - firmware->addOption("battgraph", QObject::tr("Battery graph")); - firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); - firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); -// firmware->addOption("rtc", QObject::tr("Optional RTC added")); -// firmware->addOption("volume", QObject::tr("i2c volume control added")); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - - /* 9XR-Pro */ - firmware = new OpenTxFirmware("opentx-9xrpro", QObject::tr("9XR-PRO"), BOARD_9XRPRO); - firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support")); - firmware->addOption("templates", QObject::tr("Enable TEMPLATES menu")); - firmware->addOption("nofp", QObject::tr("No flight modes")); - firmware->addOption("nocurves", QObject::tr("Disable curves menus")); - firmware->addOption("ppmca", QObject::tr("PPM center adjustment in limits")); - firmware->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT); - firmware->addOption("symlimits", QObject::tr("Symetrical Limits")); - firmware->addOption("timer3", QObject::tr("Support for a third timer")); - firmware->addOption("potscroll", QObject::tr("Pots use in menus navigation")); - firmware->addOption("autosource", QObject::tr("In model setup menus automatically set source by moving the control")); - firmware->addOption("autoswitch", QObject::tr("In model setup menus automatically set switch by moving the control")); - firmware->addOption("nographics", QObject::tr("No graphical check boxes and sliders")); - firmware->addOption("battgraph", QObject::tr("Battery graph")); - firmware->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items")); - firmware->addOption("bluetooth", QObject::tr("Bluetooth interface")); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - - /* Taranis board */ - firmware = new OpenTxFirmware("opentx-taranis", QObject::tr("FrSky Taranis"), BOARD_TARANIS); - firmware->addOption("haptic", QObject::tr("Haptic module installed")); - addOpenTxTaranisOptions(firmware); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - - /* Taranis Plus board */ - firmware = new OpenTxFirmware("opentx-taranisplus", QObject::tr("FrSky Taranis Plus"), BOARD_TARANIS_PLUS); - addOpenTxTaranisOptions(firmware); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - - /* Taranis X9E board */ - firmware = new OpenTxFirmware("opentx-taranisx9e", QObject::tr("FrSky Taranis X9E"), BOARD_TARANIS_X9E); - firmware->addOption("shutdownconfirm", QObject::tr("Confirmation before radio shutdown")); - firmware->addOption("horussticks", QObject::tr("Horus magnetic sticks")); - addOpenTxTaranisOptions(firmware); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - - /* Horus board */ - firmware = new OpenTxFirmware("opentx-horus", QObject::tr("FrSky Horus"), BOARD_HORUS); - firmware->addOption("noheli", QObject::tr("Disable HELI menu and cyclic mix support")); - firmware->addOption("nogvars", QObject::tr("Disable Global variables")); - firmware->addOption("lua", QObject::tr("Support for Lua model scripts")); - addOpenTxCommonOptions(firmware); - firmwares.push_back(firmware); - default_firmware_variant = GetFirmware("opentx-taranisplus-en"); current_firmware_variant = default_firmware_variant; } diff --git a/companion/src/firmwares/opentx/opentxinterface.h b/companion/src/firmwares/opentx/opentxinterface.h index 41c1bf6a2..32a28e722 100644 --- a/companion/src/firmwares/opentx/opentxinterface.h +++ b/companion/src/firmwares/opentx/opentxinterface.h @@ -118,6 +118,8 @@ class OpenTxFirmware: public Firmware { virtual QString getFirmwareUrl(); virtual int getCapability(const Capability); + + virtual QTime getMaxTimerStart(); virtual bool isTelemetrySourceAvailable(int source); diff --git a/companion/src/flashfirmwaredialog.cpp b/companion/src/flashfirmwaredialog.cpp index a6ee513ca..9ce7efe70 100644 --- a/companion/src/flashfirmwaredialog.cpp +++ b/companion/src/flashfirmwaredialog.cpp @@ -124,7 +124,7 @@ void FlashFirmwareDialog::on_firmwareLoad_clicked() QString fileName = QFileDialog::getOpenFileName(this, tr("Open Firmware File"), g.flashDir(), FLASH_FILES_FILTER); if (!fileName.isEmpty()) { fwName = fileName; - if (!fwName.isEmpty() && !FirmwareInterface(fwName).isValid()) { + if (!fwName.isEmpty() && !fwName.endsWith(".dfu") && !FirmwareInterface(fwName).isValid()) { QMessageBox::warning(this, tr("Warning"), tr("%1 may not be a valid firmware file").arg(fwName)); } updateUI(); diff --git a/companion/src/flashfirmwaredialog.h b/companion/src/flashfirmwaredialog.h index 78a70f397..883ec429d 100644 --- a/companion/src/flashfirmwaredialog.h +++ b/companion/src/flashfirmwaredialog.h @@ -8,9 +8,10 @@ #define HEX_FILES_FILTER "HEX files (*.hex);;" #define BIN_FILES_FILTER "BIN files (*.bin);;" +#define DFU_FILES_FILTER "DFU files (*.dfu);;" #define EEPE_FILES_FILTER "EEPE EEPROM files (*.eepe);;" #define EEPROM_FILES_FILTER "EEPE files (*.eepe *.bin *.hex);;" EEPE_FILES_FILTER BIN_FILES_FILTER HEX_FILES_FILTER -#define FLASH_FILES_FILTER "FLASH files (*.bin *.hex);;" BIN_FILES_FILTER HEX_FILES_FILTER +#define FLASH_FILES_FILTER "FLASH files (*.bin *.hex *.dfu);;" BIN_FILES_FILTER HEX_FILES_FILTER DFU_FILES_FILTER #define EXTERNAL_EEPROM_FILES_FILTER "EEPROM files (*.bin *.hex);;" BIN_FILES_FILTER HEX_FILES_FILTER #define ER9X_EEPROM_FILE_TYPE "ER9X_EEPROM_FILE" #define EEPE_EEPROM_FILE_HEADER "EEPE EEPROM FILE" diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp index d93c05a5a..be359f1d3 100644 --- a/companion/src/mainwindow.cpp +++ b/companion/src/mainwindow.cpp @@ -360,16 +360,25 @@ void MainWindow::firmwareDownloadAccepted() int errnum = hline.mid(6).toInt(); switch(errnum) { case 1: - errormsg = tr("Not enough memory for all the selected firmware options"); + errormsg = tr("Not enough flash available on this board for all the selected options"); break; case 2: - errormsg = tr("Compilation server termporary failure, try later"); + errormsg = tr("Compilation server temporary failure, try later"); break; case 3: errormsg = tr("Compilation server too busy, try later"); break; case 4: - errormsg = tr("Compilation server requires registration, please check OpenTX web site"); + errormsg = tr("Compilation error"); + break; + case 5: + errormsg = tr("Invalid firmware"); + break; + case 6: + errormsg = tr("Invalid board"); + break; + case 7: + errormsg = tr("Invalid language"); break; default: errormsg = tr("Unknown server failure, try later"); diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index aa9c8073f..cdcadfe3f 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -397,7 +397,7 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) else if (func>=FuncSetTimer1 && func<=FuncSetTimer3) { if (modified) cfn.param = QTimeS(fswtchParamTime[i]->time()).seconds(); fswtchParamTime[i]->setMinimumTime(QTime(0, 0, 0)); - fswtchParamTime[i]->setMaximumTime(QTime(0, 59, 59)); + fswtchParamTime[i]->setMaximumTime(firmware->getMaxTimerStart()); fswtchParamTime[i]->setTime(QTimeS(cfn.param)); widgetsMask |= CUSTOM_FUNCTION_TIME_PARAM + CUSTOM_FUNCTION_ENABLE; } diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index bf3ffff4e..fd141b128 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -42,6 +42,8 @@ TimerPanel::TimerPanel(QWidget *parent, ModelData & model, TimerData & timer, Ge ui->countdownBeep->addItem(tr("Voice"), TimerData::COUNTDOWN_VOICE); ui->countdownBeep->addItem(tr("Haptic"), TimerData::COUNTDOWN_HAPTIC); } + + ui->value->setMaximumTime(firmware->getMaxTimerStart()); ui->persistent->setField(timer.persistent, this); ui->persistent->addItem(tr("Not persistent"), 0); @@ -66,9 +68,11 @@ TimerPanel::~TimerPanel() void TimerPanel::update() { - int min = timer.val / 60; - int sec = timer.val % 60; - ui->value->setTime(QTime(0, min, sec)); + int hour = timer.val / 3600; + int min = (timer.val - (hour * 3600)) / 60; + int sec = (timer.val - (hour * 3600)) % 60; + + ui->value->setTime(QTime(hour, min, sec)); if (firmware->getCapability(PermTimers)) { int sign = 1; @@ -94,7 +98,7 @@ QWidget * TimerPanel::getLastFocus() void TimerPanel::on_value_editingFinished() { - timer.val = ui->value->time().minute()*60 + ui->value->time().second(); + timer.val = ui->value->time().hour()*3600 + ui->value->time().minute()*60 + ui->value->time().second(); emit modified(); } @@ -327,8 +331,8 @@ void ModulePanel::update() ui->failsafesFrame->setVisible(mask & MASK_FAILSAFES); if (mask & MASK_CHANNELS_RANGE) { - ui->channelsStart->setMaximum(32 - ui->channelsCount->value()); - ui->channelsCount->setMaximum(qMin(16, 32-ui->channelsStart->value())); + ui->channelsStart->setMaximum(33 - ui->channelsCount->value()); + ui->channelsCount->setMaximum(qMin(16, 33-ui->channelsStart->value())); } } diff --git a/companion/src/modeledit/setup_timer.ui b/companion/src/modeledit/setup_timer.ui index b7066d0d9..137428c4a 100644 --- a/companion/src/modeledit/setup_timer.ui +++ b/companion/src/modeledit/setup_timer.ui @@ -18,7 +18,7 @@ - -1 + 6 0 @@ -39,10 +39,10 @@ true - QDateTimeEdit::MinuteSection + QDateTimeEdit::HourSection - mm:ss + hh:mm:ss diff --git a/companion/src/radiointerface.cpp b/companion/src/radiointerface.cpp index c609444d2..dc8d1359a 100644 --- a/companion/src/radiointerface.cpp +++ b/companion/src/radiointerface.cpp @@ -62,18 +62,20 @@ QStringList getAvrdudeArgs(const QString &cmd, const QString &filename) QStringList getDfuArgs(const QString & cmd, const QString & filename) { - QStringList arguments; + QStringList args; burnConfigDialog bcd; QString memory = "0x08000000"; if (cmd == "-U") { memory.append(QString(":%1").arg(MAX_FSIZE)); } - arguments << bcd.getDFUArgs() << "--dfuse-address" << memory; // removed for Horus, is it really needed? << "-d" << "0483:df11"; + args << bcd.getDFUArgs(); + if (!filename.endsWith(".dfu")) { + args << "--dfuse-address" << memory; + } + args << "-d" << "0483:df11"; QString fullcmd = cmd + filename; - - arguments << "" << fullcmd; - - return arguments; + args << "" << fullcmd; + return args; } QStringList getSambaArgs(const QString &tcl) @@ -191,7 +193,7 @@ void resetAvrdudeFuses(bool eepromProtect, ProgressWidget *progress) QStringList str; if (bcd.getMCU() == "m2560") { args << "-B8"; - QString erStr = eepromProtect ? "hfuse:w:0x11:m" : "hfuse:w:0x19:m"; + QString erStr = eepromProtect ? "hfuse:w:0x51:m" : "hfuse:w:0x59:m"; str << "-U" << "lfuse:w:0xD7:m" << "-U" << erStr << "-U" << "efuse:w:0xFC:m"; //use hfuse = 0x81 to prevent eeprom being erased with every flashing } @@ -220,7 +222,7 @@ void resetAvrdudeFuses(bool eepromProtect, ProgressWidget *progress) lfuses = "lfuse:w:0x3F:m"; } - QString erStr = eepromProtect ? "hfuse:w:0x81:m" : "hfuse:w:0x89:m"; + QString erStr = eepromProtect ? "hfuse:w:0xC1:m" : "hfuse:w:0xC9:m"; str << "-U" << lfuses << "-U" << erStr << "-U" << "efuse:w:0xFF:m"; //use hfuse = 0x81 to prevent eeprom being erased with every flashing } diff --git a/companion/src/simulation/simulatorimport.h b/companion/src/simulation/simulatorimport.h index 0a8d7b08f..5bf52b265 100644 --- a/companion/src/simulation/simulatorimport.h +++ b/companion/src/simulation/simulatorimport.h @@ -23,7 +23,7 @@ #ifdef INIT_IMPORT #undef INIT_IMPORT #ifdef FRSKY -frskyStreaming = 20; +telemetryStreaming = 20; #endif #endif diff --git a/companion/src/simulation/simulatorinterface.cpp b/companion/src/simulation/simulatorinterface.cpp index 6793dbbfa..146c153d9 100644 --- a/companion/src/simulation/simulatorinterface.cpp +++ b/companion/src/simulation/simulatorinterface.cpp @@ -69,7 +69,7 @@ void registerSimulators() } } -SimulatorFactory *getSimulatorFactory(const QString &name) +SimulatorFactory * getSimulatorFactory(const QString & name) { QString simuName = name; while(1) { @@ -85,6 +85,8 @@ SimulatorFactory *getSimulatorFactory(const QString &name) if (pos <= 0) break; simuName = simuName.mid(0, pos); + if (simuName.count('-') == 0) + break; } return NULL; } diff --git a/compile.bat b/compile.bat index 9121027aa..94d22efe3 100644 --- a/compile.bat +++ b/compile.bat @@ -13,29 +13,29 @@ cd build SET COMMON_OPTIONS=-DCMAKE_PREFIX_PATH=C:\Qt\5.6\msvc2015 -DALLOW_NIGHTLY_BUILDS=YES -DVERSION_SUFFIX=%1 cmake %COMMON_OPTIONS% -DPCB=9X %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=GRUVIN9X %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=MEGA2560 %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=SKY9X %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=9XRPRO %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=TARANIS %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=TARANIS -DPCBREV=REVPLUS %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=TARANIS -DPCBREV=REV9E %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release cmake %COMMON_OPTIONS% -DPCB=HORUS %CODE_DIR% -"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\opentx-simulator.vcxproj /t:Rebuild /p:Configuration=Release +"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release "C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" companion\src\installer.vcxproj /t:Rebuild /p:Configuration=Release diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index d7a9efc27..c834933ed 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -9,10 +9,10 @@ option(CURVES "Curves" ON) option(GVARS "Global variables") option(GUI "GUI enabled" ON) option(SPLASH "Splash enabled" ON) -option(PPM_UNIT "PPM display unit (US/PERCENT_PREC1/PERCENT_PREC0)" PERCENT_PREC0) +set(PPM_UNIT "PERCENT_PREC1" CACHE STRING "PPM display unit (US/PERCENT_PREC1/PERCENT_PREC0)") option(PPM_CENTER_ADJUSTABLE "PPM center adjustable" OFF) option(PPM_LIMITS_SYMETRICAL "PPM limits symetrical" OFF) -option(OVERRIDE_CHANNEL_FUNCTION "OverrideChannel function available" OFF) +option(OVERRIDE_CHANNEL_FUNCTION "OverrideChannel function available" ON) option(DANGEROUS_MODULE_FUNCTIONS "Dangerous module functions (RangeCheck / Bind / Module OFF, etc.) available" OFF) option(FAI "Competition mode (no telemetry)" OFF) option(AUTOSOURCE "Automatic source detection in menus" ON) @@ -407,11 +407,22 @@ if(CPU_FAMILY STREQUAL STM32) STM32_USB_Device_Library/Core/src/usbd_ioreq.c STM32_USB_Device_Library/Core/src/usbd_req.c ) - set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} usb_bsp.c usbd_desc.c usbd_usr.cpp) + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + usb_bsp.c + usbd_desc.c + usbd_usr.cpp + ) if(USB STREQUAL SERIAL) add_definitions(-DUSB_SERIAL) - set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} usbd_cdc.cpp) - set(STM32USB_SRC ${STM32USB_SRC} STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c) + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + usbd_cdc.cpp + ) + set(STM32USB_SRC + ${STM32USB_SRC} + STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c + ) elseif(USB STREQUAL MASSSTORAGE) add_definitions(-DUSB_MASS_STORAGE) set(STM32USB_SRC @@ -421,13 +432,22 @@ if(CPU_FAMILY STREQUAL STM32) STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c ) - set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} usbd_storage_msd.cpp) + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + usbd_storage_msd.cpp + ) else() add_definitions(-DUSB_JOYSTICK) - set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} usbd_hid_joystick.c) + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + usbd_hid_joystick.c + ) endif() if(GVARS) - set(GUI_SRC ${GUI_SRC} menu_model_gvars.cpp) + set(GUI_SRC + ${GUI_SRC} + menu_model_gvars.cpp + ) endif() set(FIRMWARE_SRC ${FIRMWARE_SRC} @@ -436,12 +456,22 @@ if(CPU_FAMILY STREQUAL STM32) targets/taranis/configure_pins.cpp ) foreach(FILE ${STM32LIB_SRC}) - set(FIRMWARE_SRC ${FIRMWARE_SRC} ${STM32LIB_DIR}/${FILE}) + set(FIRMWARE_SRC + ${FIRMWARE_SRC} + ${STM32LIB_DIR}/${FILE} + ) endforeach() foreach(FILE ${STM32USB_SRC}) - set(FIRMWARE_SRC ${FIRMWARE_SRC} ${STM32USB_DIR}/${FILE}) + set(FIRMWARE_SRC + ${FIRMWARE_SRC} + ${STM32USB_DIR}/${FILE} + ) endforeach() - set(SRC ${SRC} sbus.cpp) + set(SRC + ${SRC} + sbus.cpp + telemetry/crossfire.cpp + ) endif() if(ARCH STREQUAL ARM) @@ -512,6 +542,8 @@ if(ARCH STREQUAL ARM) tasks_arm.cpp audio_arm.cpp telemetry/telemetry.cpp + telemetry/telemetry_holders.cpp + telemetry/telemetry_sensors.cpp telemetry/frsky.cpp telemetry/frsky_d_arm.cpp telemetry/frsky_sport.cpp @@ -561,6 +593,7 @@ else() option(BOLD "Bold font" ON) option(BATTGRAPH "Battery graph" OFF) option(HAPTIC "Haptic support" OFF) + set(TTS "EN" CACHE STRING "TTS language") set(LCD "DEFAULT" CACHE STRING "LCD type (DEFAULT/ST7565P/ST7565R/ERC12864FSF/ST7920)") set(LUA NO) set(PULSES_SRC pulses_avr.cpp) @@ -584,6 +617,13 @@ else() if(VOICE) add_definitions(-DVOICE) set(TARGET_SRC ${TARGET_SRC} voice.cpp) + foreach(LANGUAGE ${TTS_LANGUAGES}) + string(TOUPPER ${LANGUAGE} LANGUAGE_CAPITALIZED) + if(TTS STREQUAL ${LANGUAGE_CAPITALIZED}) + add_definitions(-DTTS_${LANGUAGE_CAPITALIZED}) + set(SRC ${SRC} translations/tts_${LANGUAGE}.cpp) + endif() + endforeach() endif() if(GRAPHICS) add_definitions(-DGRAPHICS) @@ -629,7 +669,7 @@ else() option(GPS "GPS support" ON) option(VARIO "Vario support" ON) add_definitions(-DFRSKY) - set(SRC ${SRC} telemetry/frsky.cpp telemetry/frsky_d.cpp) + set(SRC ${SRC} telemetry/telemetry.cpp telemetry/telemetry_holders.cpp telemetry/frsky.cpp telemetry/frsky_d.cpp) set(FIRMWARE_SRC ${FIRMWARE_SRC} targets/common_avr/telemetry_driver.cpp) set(GUI_SRC ${GUI_SRC} view_telemetry.cpp) if(FRSKY_HUB) diff --git a/radio/src/Makefile b/radio/src/Makefile deleted file mode 100644 index 13d356d8d..000000000 --- a/radio/src/Makefile +++ /dev/null @@ -1,2087 +0,0 @@ -# !!!! BETA Makefile !!!! -# !!!! Use at own risk !!!! -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make install = Install the most recently compiled hex file. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -#----------- INSTALL OPTIONS --------------------------- - -# Data directory we write hex files to. -DATA_DIR = /tmp - -# Backup the old flash (YES, NO) -BACKUP_FLASH = YES - -# Backup the old EEPROM (YES, NO) -BACKUP_EEPROM = YES - -# Restore EEPROM to 9x (YES, NO) (will set BACKUP_EEPROM to YES). -RESTORE_EEPROM = NO - -# Double write OK (YES, NO) -# Set this *if only if* your programmer can correctly write the EEPROM -# and FLASH in one command. If it doesn't, try setting the 9x fuse to -# not erase the eeprom when you erase the flash. -DOUBLE_WRITE_OK = NO - -# Command to read/write FLASH/EEPROM images. Currently -# Must have avrdude interface -AVRDUDE = /usr/local/bin/avrdude - -# Device options for AVRDUDE Command. -AVRDEVICE = -c usbasp -p m64 - -# Delay to start second AVRDUDE command (required by some). -DELAY = 5 - -#----------- BUILD OPTIONS --------------------------- - -# PCB version -# Values: 9X, 9X128, 9X2561, 9XR, 9XR128, 9XR2561, GRUVIN9X, MEGA2560, SKY9X, 9XRPRO, AR9X, TARANIS -# Old values STD and STD128 are mapped to 9X and 9X128 for compatibility -PCB = 9X - -# PCB revision -PCBREV = - -# LCD -# Values: DEFAULT, ST7565P, ST7565R, ERC12864FSF, ST7920 -LCD = DEFAULT - -# Enable JETI-Telemetry or FrSky Telemetry reception on UART0 -# For this option you need to modify your hardware! -# More information at [insertURLhere] -# Values = STD, FRSKY, FRSKY_SPORT, JETI, NMEA, ARDUPILOT, MAVLINK, TELEMETREZ -EXT = STD - -# GUI enabled -# Values = YES, NO -GUI = YES - -# FAI mode -# Values = YES, NO, CHOICE -FAI = NO - -# the latests deliveries for Turnigy 9x transmitters (since 2 years now, 2014) do not stop sending if no pulses are generated. -# This fact totally breaks the nice throttle and switch warning concept, because even we prevent sending pulses the -# transmitter module ignores this, and continues to send the last value or 0 at beginning. And 0 means in the middle of throttle -> 50%. -# To cope with this situation, we need a new concept how to handle throttle and switch warnings. -# if you have a 0 value (50% ) for throttle, while throttle warning is active, you should activate this switch -# Values = YES, NO -TURNIGY_TRANSMITTER_FIX = NO - -# Enable heli menu -# Values = YES, NO -HELI = NO - -# Enable templates menu -# Values = YES, NO -TEMPLATES = $(GUI) - -# Enable navigation with Pots / Sticks / Rotary encoders -# Values = NO -# POT1 (only POT1 available for fields modification), -# POT2 (menus scroll), -# POT3 (cursor down/up), -# POTS (POT1, POT2, POT3), -# STICKS -# ROTENC (Rotary encoder) -NAVIGATION = NO - -# Switches automatic selection -# Values = YES, NO -AUTOSWITCH = NO - -# Stock sticks replaced by FrSky ones -# Values = YES, NO -FRSKY_STICKS = NO - -# Sources automatic selection -# Values = YES, NO -AUTOSOURCE = NO - -# Double keys support (+/- means invert, +/up means max, -/dwn means min, up/down means reset to default) -# Values = YES, NO -DBLKEYS = NO - -# AUDIO Mods -# Values = YES, NO -AUDIO = NO - -# VOICE Mods -# Values = YES, NO -VOICE = NO - -# corrects different rounding for negative values. So instead of -99.9 you will see again -100.0 -# Values = YES, NO -CORRECT_NEGATIVE_VALUES = YES - -# adds additional code to prevent arithmetic overflows. MAX or MIN values stays. Not yet guaranteed!! Just improved -# Values = YES, NO -ARITHMETIC_OVERFLOW_CHECK = NO - -# increases resolution for throttle statistics and throttle counting, in very rare cases. -# this will be only true if an output channel is used for throttle calculation, and this channel has changed limits, e.g. -90% to +80% -# if you use standard limits for throttle or directly the throttle stick you do not need to bother about this option -# not valid for ARM based transmitters like Taranis, They do not have this rounding issue at all -# Values = YES, NO -ACCURAT_THROTTLE_STATS = NO - -# HAPTIC Mods -# Values = YES, NO -HAPTIC = NO - -# SmartieParts 2.2 Backlight support (inverted) -# Values = YES, NO -SP22 = NO - -# Fade Backlight using PWM -# Values = YES, NO -PWM_BACKLIGHT = NO - -# SPLASH on START -# Values = YES, NO, FIXED -SPLASH = $(GUI) - -# GRAPHICS (sliders / checkboxes / bold / batt graph) -GRAPHICS = YES -BOLD = YES -BATTGRAPH = NO - -# FONT TYPE -# Values = STD, SQT5 -FONT = STD - -# PPM center adjustable -# Values = YES, NO -PPM_CENTER_ADJUSTABLE = NO - -# PPM symmetrical limits -# Values = YES, NO -PPM_LIMITS_SYMETRICAL = NO - -# PPM display unit -# Values = PERCENT_PREC1, PERCENT_PREC0, US -PPM_UNIT = PERCENT_PREC1 - -# OverrideCHxx functions enable -# Values = YES, NO -OVERRIDE_CHANNEL_FUNCTION = YES - -# Dangerous functions available in Custom Functions (range test, bind, module off) -# Values = YES, NO -DANGEROUS_MODULE_FUNCTIONS = NO - -# FrSky Hub -# Values = YES, NO -FRSKY_HUB = YES - -# FrSky FAS current sensor offset compensation -# Values = YES, NO -FAS_OFFSET = NO - -# WS HowHigh -# Values = YES, NO -WS_HOW_HIGH = YES - -# Gauges in Telemetry screen -# Values = YES, NO -GAUGES = YES - -# GPS -# Values = YES, NO -GPS = YES - -# Vario -# Values = YES, NO -VARIO = YES - -# RTCLOCK -# Values = YES, NO -# default = YES (means enabled when available) -RTCLOCK = YES - -# Hardware volume -# Values = YES, NO -# default = YES (AR9X board doesn't have a hardware volume control as delivered but it can be fitted optionally) -HARDWARE_VOLUME = YES - -# BLUETOOTH -# Values = YES, NO -BLUETOOTH = NO - -# PXX (FrSky PCM) protocol -PXX = NO - -# DSM2 (Spektrum) protocol -# Values = NO, SERIAL, PPM -DSM2 = NO - -# HUBSAN protocol -# Values = NO, YES -HUBSAN = NO - -# DSM/PPM TX caddy PCB (Gruvin) -# For auto-switching switching between DSM2/X and Fr-Sky transmitter modules -# Values = YES, NO -TX_CADDY = NO - -#IR protocols (SILV / TRAC09 / PICZ / SWIFT) -IRPROTOS = NO - -# TRANSLATIONS -# Values = cz, de, en, fi, fr, it, se, es, pl, pt, nl -TRANSLATIONS = EN - -# TTS -# Values = en, fr, hu -TTS = $(TRANSLATIONS) - -# UNITS -# Values = imperial, metric -UNITS = METRIC - -# Default Tx Mode -# Values = NO / 1 / 2 / 3 / 4 -DEFAULT_MODE = NO - -# EEPROM_PROGRESS_BAR -# Values = YES, NO -EEPROM_PROGRESS_BAR = NO - -# Shutdown confirmation (for boards which have soft power) -# Values = NO, YES -SHUTDOWN_CONFIRMATION = NO - -# Activates the DEBUG Mode (all boards) -# On G9X V4 board, when VOICE=NO: -# PORTH:7 --> Transition LOW to HIGH = start of setupPulses(). Transition HIGH to LOW = end of setupPulses(). -# PORTH:6 --> LOW->HIGH = start of mixer calcs. HIGH->LOW, end of mixer calcs. -# Values = YES, NO -DEBUG = NO - -# Activate Command Line Interpreter -# Values = NO, YES -CLI = NO - -# Activate writing of telemetry received data to telemetry.log file -# Values = YES, NO -LOG_TELEMETRY = NO - -# Timers Count -# Values = 1, 2, 3 (on ARM boards) -TIMERS = 2 - -# Flight Modes -# Values = YES, NO -FLIGHT_MODES = YES - -# Curves -# Values = YES, NO -CURVES = YES - -# Global Vars -# Values = YES, NO -GVARS = NO - -# Enable another 3 positions switch to replace a pot -# Values = NO, POT1, POT2, POT3, -3POS = NO - -# Lua interpreter embedded -# Values = NO, NO_MODEL_SCRIPTS, YES -LUA = NO - -# Menu Lock modes -# Values = NO, READONLY, NOMENUS -MENUS_LOCK = NO - -# USB options in the main image -# Values = JOYSTICK, MASSSTORAGE, SERIAL -# JOYSTICK: The TX will appear as a joystick -# MASSSTORAGE: The TX will appear as a drive -# SERIAL: The TX will appear as a serial port -USB = JOYSTICK - -# Mixers monitor view added to Channels monitor one -# Values = NO, YES -# YES - Adds mixers output view to Channels monitor screen, -# pressing [ENT] switches between views. -# NO - classic Channels monitor -MIXERS_MONITOR = NO - -# Use newlib-nano -# Values = NO, YES -NANO = NO - -# Use custom bin based allocator for Lua -# Values = NO, YES -# YES - use our bin based allocator -# NO - use default Lua allocator -USE_BIN_ALLOCATOR = NO - -# Enable trace of events into Trace Buffer for debugging purposes -# Activating any of these options also activates DEBUG and DEBUG_TRACE_BUFFER -# Values = NO, YES -# TRACE_SD_CARD SD card operations (read, write, etc) -# TRACE_FATFS FatFs file operations -# TRACE_AUDIO Audio processing (not yet implemented) -TRACE_SD_CARD = NO -TRACE_FATFS = NO -TRACE_AUDIO = NO - -# Enable double buffering for LCD. Only for TARANIS PLUS and 9XE targets. -# Activating requires about 6kB of RAM, but it enables menus task to -# immediately start to compose a new LCD image while the current one is -# being written to LCD by DMA. -# If this option is NO, then first function that affects LCD buffer is -# delayed until DMA transfer is finished. -# Values = NO, YES -LCD_DUAL_BUFFER = NO - -# Enable internal module PPM mode for Taranis -# Values = NO, YES -TARANIS_INTERNAL_PPM = NO - -# Support for D16-EU only (no D8, no LR12 which are not EU compatible) -# Value = NO, YES -SUPPORT_D16_EU_ONLY = NO - -# Enable disk IO simulation in simulator -# Simulator will use FatFs module and simulated IO layer that -# uses "./sdcard.image" file as image of SD card. -# This file must contain whole SD card from first to last sector -# Values = NO, YES -SIMU_DISKIO = NO - -# Enable audio in simulator -# Values = NO, YES -SIMU_AUDIO = NO - -# Enable Watchdog test (DANGEROUS) -# Values = NO, YES -WATCHDOG_TEST = NO - -# Treat compiler warnings as errors -# Values = NO, YES -WARNINGS_AS_ERRORS = NO - -# Enable saving of Lua byte-code of all loaded scripts -# Values = NO, YES -LUA_COMPILER = NO - -# Enable ADC jitter measurement -# Values = NO, YES -JITTER_MEASURE = NO - -# Enable ADC jitter filtering -# Values = NO, YES -JITTER_FILTER = YES - -#------- END BUILD OPTIONS --------------------------- - -# Define programs and commands. -SHELL = sh - -IMG2LBM = -python ../util/img2lbm.py -BIN2LBM = -python ../util/bin2lbm.py -ifeq ($(OS), Windows_NT) - FONT2PNG = -python ../util/font2png.py -else - FONT2PNG = -xvfb-run --server-args="-screen 0 1024x768x24" python ../util/font2png.py -endif -TRANSLATE = -python ../util/translate.py - -VERSION_MAJOR = 2 -VERSION_MINOR = 2 -VERSION_REVISION = 0 - -VERSION = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_REVISION)$(OPENTX_VERSION_SUFFIX) - -THIRDPARTY = thirdparty -COOSDIR = $(THIRDPARTY)/CoOS -FATFSDIR = $(THIRDPARTY)/FatFs -LUADIR = $(THIRDPARTY)/Lua/src - -SRC = -CPPSRC = -INCDIRS = . translations -LUADEP = -DEBUG_TRACE_BUFFER = NO - -# MCU name -ifeq ($(PCB), $(filter $(PCB), HORUS)) - $(error You have to use CMake to compile OpenTX for this PCB $(PCB)) -else ifneq ($(PCB), $(filter $(PCB), STD 9X 9XR STD128 9X128 9XR128 9X2561 9XR2561 GRUVIN9X MEGA2560 SKY9X 9XRPRO AR9X TARANIS FLAMENCO)) - $(error Sorry, the PCB $(PCB) is not supported yet in OpenTX) -endif - -GVARS_VARIANT = +1 -FRSKY_VARIANT = +2 -3POS_VARIANT = +4 -MAVLINK_VARIANT = +8 -M128_VARIANT = +32768 -M2561_VARIANT = +16384 -EEPROM_VARIANT = 0 - -GUIMODELSRC = gui/$(GUIDIRECTORY)/menu_model.cpp gui/$(GUIDIRECTORY)/menu_model_select.cpp gui/$(GUIDIRECTORY)/menu_model_setup.cpp gui/$(GUIDIRECTORY)/menu_model_limits.cpp gui/$(GUIDIRECTORY)/menu_model_logical_switches.cpp gui/$(GUIDIRECTORY)/menu_model_custom_functions.cpp gui/$(GUIDIRECTORY)/menu_model_telemetry.cpp -GUIGENERALSRC = gui/$(GUIDIRECTORY)/menu_general.cpp gui/$(GUIDIRECTORY)/menu_general_setup.cpp gui/$(GUIDIRECTORY)/menu_general_trainer.cpp gui/$(GUIDIRECTORY)/menu_general_version.cpp gui/$(GUIDIRECTORY)/menu_general_calib.cpp - -BITMAPS = bitmaps/sticks.lbm - -FONTS = $(patsubst %.png,%.lbm,$(wildcard fonts/std/*.png)) - -ifeq ($(PCB), $(filter $(PCB), STD 9X 9XR)) - # 9x/9xr radio - GUIDIRECTORY = 9x - ARCH = AVR - LCDSIZE = 128 - TRGT = avr- - MCU = atmega64 - OPT = s - SDCARD = NO - THR_TRACE = NO - INCDIRS += targets/9x bitmaps bitmaps/9x - CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBSTD -DCPUM64 -DEEPROM -DEEPROM_RLC -DEEPROM_VARIANT=$(shell echo ${EEPROM_VARIANT} | bc) - BOARDSRC = main_avr.cpp targets/9x/board_stock.cpp - EXTRABOARDSRC = targets/common_avr/adc_driver.cpp targets/common_avr/telemetry_driver.cpp - ifeq ($(GUI), YES) - EXTRABOARDSRC += targets/9x/lcd_driver.cpp - endif - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp - PULSESSRC = pulses/pulses_avr.cpp - CPPSRC += debug.cpp - BITMAPS += bitmaps/9x/splash.lbm bitmaps/9x/asterisk.lbm bitmaps/9x/about.lbm - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - - ifeq ($(PCB), 9XR) - FLAVOUR = 9xr - CPPDEFS += -DPCB9XR - else - FLAVOUR = 9x - CPPDEFS += -DPCB9X - endif - - ifeq ($(TELEMETRY_MOD), 14051) - CPPDEFS += -DTELEMETRY_MOD_14051 - endif - - ifeq ($(TELEMETRY_MOD), 14051_SWAPPED) - CPPDEFS += -DTELEMETRY_MOD_14051_SWAPPED - endif - - ifeq ($(AUDIO), YES) - CPPDEFS += -DAUDIO - CPPSRC += audio_avr.cpp - BUZZER = NO - else - BUZZER = YES - endif - - ifeq ($(BUZZER), YES) - CPPDEFS += -DBUZZER - CPPSRC += buzzer.cpp - endif - - ifeq ($(VOICE), YES) - CPPDEFS += -DVOICE - CPPSRC += targets/9x/voice.cpp - endif - - ifeq ($(PWM_BACKLIGHT), YES) - ifeq ($(VOICE), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with VOICE mod) - endif - ifeq ($(AUDIO), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with AUDIO mod) - endif - CPPDEFS += -DPWM_BACKLIGHT - endif - - ifeq ($(HAPTIC), YES) - CPPDEFS += -DHAPTIC - CPPSRC += haptic.cpp - endif - - ifeq ($(SP22), YES) - CPPDEFS += -DSP22 - endif - - ifeq ($(FAS_OFFSET), YES) - CPPDEFS += -DFAS_OFFSET - endif -endif - -ifeq ($(PCB), $(filter $(PCB), STD128 9X128 9XR128)) - # 9X/9XR radio with ATmega64 replaced by ATmega128 - GUIDIRECTORY = 9x - ARCH = AVR - LCDSIZE = 128 - TRGT = avr- - MCU = atmega128 - OPT = s - SDCARD = NO - THR_TRACE = NO - EEPROM_VARIANT += ${M128_VARIANT} - CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBSTD -DCPUM128 -DEEPROM -DEEPROM_RLC -DEEPROM_VARIANT=$(shell echo ${EEPROM_VARIANT} | bc) - INCDIRS += targets/9x bitmaps bitmaps/9x - BOARDSRC = main_avr.cpp targets/9x/board_stock.cpp - EXTRABOARDSRC = targets/common_avr/adc_driver.cpp targets/9x/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp - PULSESSRC = pulses/pulses_avr.cpp - CPPSRC += debug.cpp - BITMAPS += bitmaps/9x/splash.lbm bitmaps/9x/asterisk.lbm bitmaps/9x/about.lbm - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - - ifeq ($(PCB), 9XR128) - FLAVOUR = 9xr128 - CPPDEFS += -DPCB9XR128 - else - FLAVOUR = 9x128 - CPPDEFS += -DPCB9X128 - endif - - ifeq ($(TELEMETRY_MOD), 14051) - CPPDEFS += -DTELEMETRY_MOD_14051 - endif - - ifeq ($(TELEMETRY_MOD), 14051_SWAPPED) - CPPDEFS += -DTELEMETRY_MOD_14051_SWAPPED - endif - - ifeq ($(AUDIO), YES) - CPPDEFS += -DAUDIO - CPPSRC += audio_avr.cpp - BUZZER = NO - else - BUZZER = YES - endif - - ifeq ($(BUZZER), YES) - CPPDEFS += -DBUZZER - CPPSRC += buzzer.cpp - endif - - ifeq ($(VOICE), YES) - CPPDEFS += -DVOICE - CPPSRC += targets/9x/voice.cpp - endif - - ifeq ($(PWM_BACKLIGHT), YES) - ifeq ($(VOICE), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with VOICE mod) - endif - ifeq ($(AUDIO), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with AUDIO mod) - endif - CPPDEFS += -DPWM_BACKLIGHT - endif - - ifeq ($(HAPTIC), YES) - CPPDEFS += -DHAPTIC - CPPSRC += haptic.cpp - endif - - ifeq ($(SP22), YES) - CPPDEFS += -DSP22 - endif -endif - -ifeq ($(PCB), $(filter $(PCB), 9X2561)) - # 9X/9XR radio with ATmega64 replaced by ATmega2561 - GUIDIRECTORY = 9x - ARCH = AVR - LCDSIZE = 128 - TRGT = avr- - MCU = atmega2561 - OPT = s - SDCARD = NO - THR_TRACE = YES - EEPROM_VARIANT += ${M2561_VARIANT} - CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBSTD -DCPUM2561 -DEEPROM -DEEPROM_RLC -DEEPROM_VARIANT=$(shell echo ${EEPROM_VARIANT} | bc) - INCDIRS += targets/9x bitmaps bitmaps/9x - BOARDSRC = main_avr.cpp targets/9x/board_stock.cpp - EXTRABOARDSRC = targets/common_avr/adc_driver.cpp targets/9x/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp - PULSESSRC = pulses/pulses_avr.cpp - CPPSRC += debug.cpp - BITMAPS += bitmaps/9x/splash.lbm bitmaps/9x/asterisk.lbm bitmaps/9x/about.lbm - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - - ifeq ($(PCB), 9XR2561) - FLAVOUR = 9xr2561 - CPPDEFS += -DPCB9XR2561 - else - FLAVOUR = 9x2561 - CPPDEFS += -DPCB9X2561 - endif - - ifeq ($(AUDIO), YES) - CPPDEFS += -DAUDIO - CPPSRC += audio_avr.cpp - BUZZER = NO - else - BUZZER = YES - endif - - ifeq ($(BUZZER), YES) - CPPDEFS += -DBUZZER - CPPSRC += buzzer.cpp - endif - - ifeq ($(VOICE), YES) - CPPDEFS += -DVOICE - CPPSRC += targets/9x/voice.cpp - endif - - ifeq ($(PWM_BACKLIGHT), YES) - ifeq ($(VOICE), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with VOICE mod) - endif - ifeq ($(AUDIO), YES) - $(error Sorry, PWM_BACKLIGHT doesnt work on stock board with AUDIO mod) - endif - CPPDEFS += -DPWM_BACKLIGHT - endif - - ifeq ($(HAPTIC), YES) - CPPDEFS += -DHAPTIC - CPPSRC += haptic.cpp - endif - - ifeq ($(SP22), YES) - CPPDEFS += -DSP22 - endif -endif - -ifeq ($(PCB), GRUVIN9X) - # 9x radio with a gruvin9x replacement board - GUIDIRECTORY = 9x - FLAVOUR = gruvin9x - ARCH = AVR - LCDSIZE = 128 - ifeq ($(PCBREV), REV0) - CPPDEFS = -DREV0 - else - CPPDEFS = -DREV1 - endif - TRGT = avr- - MCU = atmega2560 - OPT = s - CPPDEFS += -DF_CPU=$(F_CPU)UL -DPCBGRUVIN9X -DCPUM2560 -DEEPROM -DEEPROM_RLC -DEEPROM_VARIANT=0 -DAUDIO -DHAPTIC - SDCARD = NO - BUZZER = NO - THR_TRACE = YES - INCDIRS += targets/gruvin9x targets/9x bitmaps bitmaps/9x $(FATFSDIR) $(FATFSDIR)/option - BOARDSRC = main_avr.cpp targets/gruvin9x/board_gruvin9x.cpp - EXTRABOARDSRC = targets/common_avr/adc_driver.cpp targets/9x/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp - PULSESSRC = pulses/pulses_avr.cpp - CPPSRC += audio_avr.cpp haptic.cpp debug.cpp - BITMAPS += bitmaps/9x/splash.lbm bitmaps/9x/asterisk.lbm bitmaps/9x/about.lbm - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - - ifeq ($(SDCARD), YES) - CPPDEFS += -DRTCLOCK -DSDCARD - CPPSRC += rtc.cpp sdcard.cpp logs.cpp targets/gruvin9x/rtc_driver.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_sdmanager.cpp - EXTRABOARDSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/fattime.c $(FATFSDIR)/option/ccsbcs.c targets/gruvin9x/diskio.cpp - endif - - ifeq ($(BUZZER), YES) - CPPDEFS += -DBUZZER - CPPSRC += buzzer.cpp - endif - - ifeq ($(VOICE), YES) - CPPDEFS += -DVOICE - CPPSRC += targets/gruvin9x/somo14d.cpp - endif - - # Enable extra rotary encoders (Gruvin9x board only) - # Values = YES, NO - ROTARY_ENCODERS = 2 - CPPDEFS += -DROTARY_ENCODERS=${ROTARY_ENCODERS} -endif - -ifeq ($(PCB), MEGA2560) - # ARDUINO2560 DIY RADIO - GUIDIRECTORY = 9x - FLAVOUR = mega2560 - ARCH = AVR - LCDSIZE = 128 - TRGT = avr- - MCU = atmega2560 - OPT = s - CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBMEGA2560 -DCPUM2560 -DEEPROM -DEEPROM_RLC -DEEPROM_VARIANT=0 - SDCARD = NO - THR_TRACE = YES - PWRMANAGE = NO - INCDIRS += targets/mega2560 targets/9x bitmaps bitmaps/9x $(FATFSDIR) $(FATFSDIR)/option - BOARDSRC = main_avr.cpp targets/mega2560/board_mega2560.cpp - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp - PULSESSRC = pulses/pulses_avr.cpp - CPPSRC += debug.cpp - BITMAPS += bitmaps/9x/splash.lbm bitmaps/9x/asterisk.lbm bitmaps/9x/about.lbm - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - - EXTRABOARDSRC = targets/common_avr/adc_driver.cpp targets/9x/lcd_driver.cpp targets/common_avr/telemetry_driver.cpp - - ifeq ($(PWRMANAGE), YES) - CPPDEFS += -DPWRMANAGE - endif - - ifeq ($(SDCARD), YES) - EXTRABOARDSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/fattime.c $(FATFSDIR)/option/ccsbcs.c targets/gruvin9x/diskio.cpp - CPPDEFS += -DSDCARD -DRTCLOCK - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_sdmanager.cpp - CPPSRC += rtc.cpp sdcard.cpp logs.cpp targets/gruvin9x/rtc_driver.cpp - endif - - ifeq ($(AUDIO), YES) - CPPDEFS += -DAUDIO - CPPSRC += audio_avr.cpp - BUZZER = NO - else - BUZZER = YES - endif - - ifeq ($(BUZZER), YES) - CPPDEFS += -DBUZZER - CPPSRC += buzzer.cpp - endif - - ifeq ($(VOICE), YES) - CPPDEFS += -DVOICE - CPPSRC += targets/gruvin9x/somo14d.cpp - endif - - ifeq ($(HAPTIC), YES) - CPPDEFS += -DHAPTIC - CPPSRC += haptic.cpp - endif - - # Enable extra rotary encoders - ROTARY_ENCODERS = 2 - CPPDEFS += -DROTARY_ENCODERS=${ROTARY_ENCODERS} -endif - -ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO AR9X)) - # 9x/9XR radio with a sky9x replacement board - GUIDIRECTORY = 9x - ARCH = ARM - LCDSIZE = 128 - CPPDEFS = -Dat91sam3s4 -DPPM_PIN_HW_SERIAL - ifeq ($(PCB), 9XRPRO) - CPPDEFS = -Dat91sam3s8 - FLAVOUR = 9xrpro - CPPDEFS += -DREVX - LDSCRIPT = targets/sky9x/sam3s8c_flash.ld - else ifeq ($(PCB), AR9X) - CPPDEFS = -Dat91sam3s8 - FLAVOUR = ar9x - CPPDEFS += -DAR9X - LDSCRIPT = targets/sky9x/sam3s8c_flash.ld - else ifeq ($(PCBREV), REVA) - FLAVOUR = sky9x - CPPDEFS += -DREVA - LDSCRIPT = targets/sky9x/sam3s2c_flash.ld - CPPSRC += targets/sky9x/coproc_driver.cpp - else ifeq ($(PCBREV), REVB) - FLAVOUR = sky9x - CPPDEFS += -DREVB -DCOPROCESSOR - LDSCRIPT = targets/sky9x/sam3s4c_flash.ld - CPPSRC += targets/sky9x/coproc_driver.cpp - else - FLAVOUR = sky9x - CPPDEFS += -DREVC -DCOPROCESSOR - LDSCRIPT = targets/sky9x/sam3s4c_flash.ld - CPPSRC += targets/sky9x/coproc_driver.cpp - endif - TRGT = arm-none-eabi- - MCU = cortex-m3 - OPT = s - SDCARD = YES - BUZZER = NO - THR_TRACE = YES - EXT = FRSKY_SPORT - CPPDEFS += -DPCBSKY9X -DCPUARM -DEEPROM -DEEPROM_VARIANT=0 -DAUDIO -DHAPTIC -DDSM2 -DDSM2_PPM -DPXX - ifeq ($(PCB), SKY9X) - CPPDEFS += -DROTARY_ENCODERS=1 - CPPSRC += targets/sky9x/rotenc_driver.cpp - endif - ifeq ($(LOG_TELEMETRY), YES) - CPPDEFS += -DLOG_TELEMETRY - endif - INCDIRS += targets/sky9x bitmaps bitmaps/9x $(COOSDIR) $(COOSDIR)/kernel $(COOSDIR)/portable - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_hardware.cpp gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - BOARDSRC = main_arm.cpp targets/sky9x/board_sky9x.cpp targets/sky9x/trainer_driver.cpp - EXTRABOARDSRC = targets/sky9x/lcd_driver.cpp - SRC += targets/sky9x/core_cm3.c targets/sky9x/board_lowlevel.c targets/sky9x/crt.c targets/sky9x/vectors_sam3s.c - SRC += $(COOSDIR)/kernel/core.c $(COOSDIR)/kernel/hook.c $(COOSDIR)/kernel/task.c $(COOSDIR)/kernel/event.c $(COOSDIR)/kernel/time.c $(COOSDIR)/kernel/timer.c $(COOSDIR)/kernel/flag.c $(COOSDIR)/kernel/mutex.c $(COOSDIR)/kernel/serviceReq.c $(COOSDIR)/portable/GCC/port.c $(COOSDIR)/portable/arch.c - SRC += targets/sky9x/usb/device/core/USBD_UDP.c targets/sky9x/usb/device/core/USBDDriver.c - SRC += targets/sky9x/usb/device/massstorage/MSDDriver.c targets/sky9x/usb/device/massstorage/MSDDStateMachine.c targets/sky9x/usb/device/massstorage/MSDLun.c targets/sky9x/usb/device/massstorage/MSDDriverDescriptors.c targets/sky9x/usb/device/massstorage/SBCMethods.c - SRC += targets/sky9x/usb/common/core/USBEndpointDescriptor.c targets/sky9x/usb/common/core/USBGenericRequest.c targets/sky9x/usb/common/core/USBFeatureRequest.c targets/sky9x/usb/common/core/USBInterfaceRequest.c targets/sky9x/usb/common/core/USBGetDescriptorRequest.c targets/sky9x/usb/common/core/USBSetAddressRequest.c targets/sky9x/usb/common/core/USBSetConfigurationRequest.c targets/sky9x/usb/common/core/USBConfigurationDescriptor.c targets/sky9x/usb/common/core/USBGenericDescriptor.c - SRC += targets/sky9x/MEDSdcard.c - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_raw.cpp storage/eeprom_conversions.cpp - PULSESSRC = pulses/pulses_arm.cpp pulses/ppm_arm.cpp pulses/pxx_arm.cpp pulses/dsm2_arm.cpp - CPPSRC += tasks_arm.cpp audio_arm.cpp haptic.cpp gui/$(GUIDIRECTORY)/view_about.cpp gui/$(GUIDIRECTORY)/view_text.cpp telemetry/telemetry.cpp - CPPSRC += targets/sky9x/telemetry_driver.cpp targets/sky9x/serial2_driver.cpp targets/sky9x/pwr_driver.cpp targets/sky9x/adc_driver.cpp targets/sky9x/eeprom_driver.cpp targets/sky9x/pulses_driver.cpp targets/sky9x/keys_driver.cpp targets/sky9x/audio_driver.cpp targets/sky9x/buzzer_driver.cpp targets/sky9x/haptic_driver.cpp targets/sky9x/sdcard_driver.cpp targets/sky9x/massstorage.cpp - CPPSRC += debug.cpp - EXTRABOARDSRC += loadboot.cpp - BITMAPS += bitmaps/9x/splash.lbm bitmaps/9x/asterisk.lbm bitmaps/9x/about.lbm - ifeq ($(SDCARD), YES) - CPPDEFS += -DSDCARD -DVOICE - INCDIRS += $(FATFSDIR) $(FATFSDIR)/option - CPPSRC += sdcard.cpp logs.cpp - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_sdmanager.cpp - EXTRABOARDSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/fattime.c $(FATFSDIR)/option/ccsbcs.c targets/sky9x/diskio.cpp - endif - ifeq ($(BUZZER), YES) - CPPDEFS += -DBUZZER - CPPSRC += buzzer.cpp - endif - ifeq ($(RTCLOCK), YES) - CPPDEFS += -DRTCLOCK - CPPSRC += rtc.cpp targets/sky9x/rtc_driver.cpp - else ifeq ($(PCB), SKY9X) - CPPSRC += targets/sky9x/rtc_driver.cpp - endif - ifeq ($(BLUETOOTH), YES) - CPPDEFS += -DBLUETOOTH - CPPSRC += targets/sky9x/bluetooth.cpp - endif - ifeq ($(DEBUG), YES) - SRC += syscalls.c - endif - ifeq ($(HARDWARE_VOLUME), NO) - CPPDEFS += -DNO_HARDWARE_VOLUME - endif -endif - -ifeq ($(PCB), TARANIS) - # TARANIS radio - ARCH = ARM - LCDSIZE = 212 - GUIDIRECTORY = taranis - ifeq ($(PCBREV), REV9E) - MCU = cortex-m4 - FLAVOUR = taranis-x9e - CPPDEFS = -DREVPLUS -DREV9E - ifeq ($(LCD_DUAL_BUFFER), YES) - CPPDEFS += -DLCD_DUAL_BUFFER - endif - HAPTIC = YES - EXTRABOARDSRC += targets/taranis/bluetooth_driver.cpp - else ifeq ($(PCBREV), REVPLUS) - MCU = cortex-m3 - FLAVOUR = taranis-plus - CPPDEFS = -DREVPLUS - ifeq ($(LCD_DUAL_BUFFER), YES) - CPPDEFS += -DLCD_DUAL_BUFFER - endif - HAPTIC = YES - else ifeq ($(PCBREV), REV4a) - MCU = cortex-m3 - FLAVOUR = taranis - CPPDEFS = -DREV4a - else - MCU = cortex-m3 - FLAVOUR = taranis - CPPDEFS = -DREV4 - endif - ifeq ($(LOG_TELEMETRY), YES) - CPPDEFS += -DLOG_TELEMETRY - endif - ifeq ($(TRACE_SD_CARD), YES) - DEBUG = YES - DEBUG_TRACE_BUFFER = YES - CPPDEFS += -DTRACE_SD_CARD - endif - ifeq ($(TRACE_FATFS), YES) - DEBUG = YES - DEBUG_TRACE_BUFFER = YES - CPPDEFS += -DTRACE_FATFS - endif - ifeq ($(TRACE_AUDIO), YES) - DEBUG = YES - DEBUG_TRACE_BUFFER = YES - CPPDEFS += -DTRACE_AUDIO - endif - ifeq ($(DEBUG_TRACE_BUFFER), YES) - CPPDEFS += -DDEBUG_TRACE_BUFFER - endif - ifeq ($(TARANIS_INTERNAL_PPM), YES) - CPPDEFS += -DTARANIS_INTERNAL_PPM - endif - ifeq ($(SUPPORT_D16_EU_ONLY), YES) - CPPDEFS += -DMODULE_D16_EU_ONLY_SUPPORT - endif - TRGT = arm-none-eabi- - OPT = s - BITMAPS += $(patsubst %.png,%.lbm,$(wildcard bitmaps/taranis/*.png)) - SDCARD = YES - THR_TRACE = YES - EXT = FRSKY_SPORT - AUTOSWITCH = YES - AUTOSOURCE = YES - DBLKEYS = YES - TIMERS = 2 - CPPDEFS += -DTIMERS=$(TIMERS) - PPM_LIMITS_SYMETRICAL = YES - PPM_CENTER_ADJUSTABLE = YES - DSM2 = PPM - CPPDEFS += -DPCBTARANIS -DCPUARM -DCPUSTM32 -DVIRTUALINPUTS -DLUAINPUTS -DXCURVES -DEEPROM -DEEPROM_RLC -DAUDIO -DPXX -DSBUS -DCROSSFIRE - INCDIRS += targets/taranis bitmaps bitmaps/taranis $(THIRDPARTY) $(COOSDIR) $(COOSDIR)/kernel $(COOSDIR)/portable - CPPDEFS += -DHSE_VALUE=12000000 - ifeq ($(PCBREV), REV9E) - STM32LIBPATH = $(THIRDPARTY)/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries - CPPDEFS += -DSTM32F4 -DSTM32F40_41xxx -DEEPROM_VARIANT=32768 - INCDIRS += $(STM32LIBPATH)/CMSIS/Device/ST/STM32F4xx/Include $(STM32LIBPATH)/CMSIS/Include $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/inc - LDSCRIPT = targets/taranis/stm32f4_flash.ld - else - STM32LIBPATH= $(THIRDPARTY)/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries - CPPDEFS += -DEEPROM_VARIANT=0 - INCDIRS += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/inc $(STM32LIBPATH)/CMSIS/Device/ST/STM32F2xx/Include $(STM32LIBPATH)/CMSIS/include - LDSCRIPT = targets/taranis/stm32f2_flash.ld - endif - STM32USBPATH = $(THIRDPARTY)/STM32_USB-Host-Device_Lib_V2.1.0/Libraries - INCDIRS += $(STM32USBPATH)/STM32_USB_OTG_Driver/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Core/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/hid/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/inc - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_hardware.cpp - BOARDSRC = main_arm.cpp targets/taranis/board_taranis.cpp - EXTRABOARDSRC += targets/taranis/configure_pins.cpp targets/taranis/lcd_driver.cpp targets/taranis/flash_driver.cpp targets/taranis/i2c_driver.cpp targets/taranis/aspi.c targets/taranis/delays.c serial.cpp - SRC += $(COOSDIR)/kernel/core.c $(COOSDIR)/kernel/hook.c $(COOSDIR)/kernel/task.c $(COOSDIR)/kernel/event.c $(COOSDIR)/kernel/time.c $(COOSDIR)/kernel/timer.c $(COOSDIR)/kernel/flag.c $(COOSDIR)/kernel/mutex.c $(COOSDIR)/kernel/serviceReq.c $(COOSDIR)/portable/GCC/port.c $(COOSDIR)/portable/arch.c - SRC += targets/taranis/pwr_driver.c targets/taranis/usb_driver.c - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp storage/eeprom_conversions.cpp - PULSESSRC = pulses/pulses_arm.cpp pulses/ppm_arm.cpp pulses/pxx_arm.cpp pulses/crossfire.cpp - CPPSRC += tasks_arm.cpp audio_arm.cpp sbus.cpp telemetry/telemetry.cpp - CPPSRC += targets/taranis/pulses_driver.cpp targets/taranis/keys_driver.cpp targets/taranis/adc_driver.cpp targets/taranis/trainer_driver.cpp targets/taranis/audio_driver.cpp targets/taranis/serial2_driver.cpp targets/taranis/telemetry_driver.cpp - CPPSRC += gui/$(GUIDIRECTORY)/bmp.cpp gui/$(GUIDIRECTORY)/view_channels.cpp gui/$(GUIDIRECTORY)/view_about.cpp gui/$(GUIDIRECTORY)/view_text.cpp debug.cpp - EXTRABOARDSRC += loadboot.cpp - ifeq ($(PCBREV), REV9E) - CPPSRC += targets/taranis/top_lcd_driver.cpp - SRC += targets/taranis/system_stm32f4xx.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/misc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dbgmcu.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_spi.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_i2c.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rtc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_pwr.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_usart.c - SRC += $(STM32LIBPATH)/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f40_41xxx.s - else - SRC += targets/taranis/system_stm32f2xx.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/misc.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_gpio.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_dbgmcu.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rcc.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_spi.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_i2c.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_dma.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rtc.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_pwr.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_usart.c - SRC += $(STM32LIBPATH)/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc_ride7/startup_stm32f2xx.s - endif - SRC += targets/taranis/usb_bsp.c targets/taranis/usbd_desc.c - SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_core.c - SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_dcd.c - SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_dcd_int.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_core.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_ioreq.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_req.c - EXTRABOARDSRC += targets/taranis/usbd_usr.cpp - SRC += syscalls.c - ifeq ($(USB), JOYSTICK) - CPPDEFS += -DUSB_JOYSTICK - SRC += targets/taranis/usbd_hid_joystick.c - else ifeq ($(USB), SERIAL) - CPPDEFS += -DUSB_SERIAL - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c - EXTRABOARDSRC += targets/taranis/usbd_cdc.cpp - else - CPPDEFS += -DUSB_MASS_STORAGE - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_scsi.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c - EXTRABOARDSRC += targets/taranis/usbd_storage_msd.cpp - endif - ifeq ($(NANO), YES) - # use newlib-nano for linking - NEWLIB_NANO_FLAGS = --specs=nano.specs -u _printf_float - CPPDEFS += -DNANO - endif - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs.cpp gui/$(GUIDIRECTORY)/menu_model_mixes.cpp - ifeq ($(GVARS), YES) - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_gvars.cpp - endif - ifneq ($(LUA), NO) - ifeq ($(LUA), YES) - CPPDEFS += -DLUA_MODEL_SCRIPTS - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_custom_scripts.cpp - endif - CPPDEFS += -DLUA - INCDIRS += $(LUADIR) - CPPSRC += lua/interface.cpp lua/api_general.cpp lua/api_lcd.cpp lua/api_model.cpp - LUASRC = $(LUADIR)/lapi.c $(LUADIR)/lcode.c $(LUADIR)/lctype.c $(LUADIR)/ldebug.c $(LUADIR)/ldo.c $(LUADIR)/ldump.c $(LUADIR)/lfunc.c $(LUADIR)/lgc.c $(LUADIR)/llex.c $(LUADIR)/lmem.c \ - $(LUADIR)/lobject.c $(LUADIR)/lopcodes.c $(LUADIR)/lparser.c $(LUADIR)/lstate.c $(LUADIR)/lstring.c $(LUADIR)/ltable.c $(LUADIR)/lrotable.c $(LUADIR)/ltm.c $(LUADIR)/lundump.c $(LUADIR)/lvm.c $(LUADIR)/lzio.c \ - $(LUADIR)/lbaselib.c $(LUADIR)/linit.c $(LUADIR)/lmathlib.c $(LUADIR)/lbitlib.c $(LUADIR)/loadlib.c $(LUADIR)/lauxlib.c $(LUADIR)/ltablib.c $(LUADIR)/lcorolib.c $(LUADIR)/liolib.c $(LUADIR)/lstrlib.c - SRC += $(LUASRC) - ifeq ($(PCBREV), REV9E) - LUADEP = lua/lua_exports_taranis_x9e.inc - else - LUADEP = lua/lua_exports_taranis.inc - endif - ifeq ($(USE_BIN_ALLOCATOR), YES) - CPPDEFS += -DUSE_BIN_ALLOCATOR - CPPSRC += bin_allocator.cpp - endif - endif - EXTRABOARDSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/fattime.c $(FATFSDIR)/option/ccsbcs.c targets/taranis/diskio.cpp - CPPSRC += sdcard.cpp logs.cpp rtc.cpp targets/taranis/rtc_driver.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_sdmanager.cpp gui/$(GUIDIRECTORY)/menu_general_diagkeys.cpp gui/$(GUIDIRECTORY)/menu_general_diaganas.cpp - CPPDEFS += -DSDCARD -DVOICE -DRTCLOCK - INCDIRS += $(FATFSDIR) $(FATFSDIR)/option - ifeq ($(DSM2), PPM) - CPPSRC += pulses/dsm2_arm.cpp - endif - ifeq ($(HUBSAN), YES) - CPPDEFS += -DHUBSAN - CPPSRC += pulses/hubsan.cpp - CPPSRC += targets/taranis/a7105_driver.cpp - endif - ifeq ($(HAPTIC), YES) - CPPDEFS += -DHAPTIC - CPPSRC += haptic.cpp - CPPSRC += targets/taranis/haptic_driver.cpp - endif - ifeq ($(MIXERS_MONITOR), YES) - CPPDEFS += -DMIXERS_MONITOR - endif - ifeq ($(WATCHDOG_TEST), YES) - CPPDEFS += -DWATCHDOG_TEST - endif - ifeq ($(JITTER_MEASURE), YES) - CPPDEFS += -DJITTER_MEASURE - endif - ifeq ($(JITTER_FILTER), YES) - CPPDEFS += -DJITTER_FILTER - endif -endif - -ifeq ($(PCB), FLAMENCO) - # FLAMENCO radio - ARCH = ARM - LCDSIZE = 320 - GUIDIRECTORY = flamenco - FLAVOUR = FLAMENCO - LDSCRIPT = targets/flamenco/stm32f4_flash.ld - STM32LIBPATH = $(THIRDPARTY)/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries - STM32USBPATH = $(THIRDPARTY)/STM32_USB-Host-Device_Lib_V2.1.0/Libraries - TRGT = arm-none-eabi- - MCU = cortex-m4 - OPT = 2 - CPPDEFS += -DHSE_VALUE=12000000 -DCOLORLCD -DSTM32F40_41xxx -DPPM_PIN_HW_SERIAL - BITMAPS += $(patsubst %.png,%.lbm,$(wildcard bitmaps/flamenco/*.png)) - FONTS = fonts/flamenco/font_stdsize.lbm fonts/flamenco/font_tinsize.lbm fonts/flamenco/font_smlsize.lbm fonts/flamenco/font_midsize.lbm fonts/flamenco/font_dblsize.lbm fonts/flamenco/font_xxlsize.lbm - SDCARD = YES - THR_TRACE = YES - EXT = FRSKY_SPORT - AUTOSWITCH = YES - AUTOSOURCE = YES - DBLKEYS = YES - PPM_LIMITS_SYMETRICAL = YES - PPM_CENTER_ADJUSTABLE = YES - DSM2 = PPM - TIMERS = 2 - CPPDEFS += -DTIMERS=$(TIMERS) - CPPDEFS += -DPCBFLAMENCO -DCPUARM -DCPUSTM32 -DEEPROM -DVIRTUALINPUTS -DLUAINPUTS -DXCURVES -DEEPROM_VARIANT=0 -DAUDIO -DPXX - INCDIRS += targets/flamenco bitmaps/flamenco $(THIRDPARTY) $(COOSDIR) $(COOSDIR)/kernel $(COOSDIR)/portable - INCDIRS += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/inc $(STM32LIBPATH)/CMSIS/Device/ST/STM32F4xx/Include $(STM32LIBPATH)/CMSIS/include - STM32USBPATH = $(THIRDPARTY)/STM32_USB-Host-Device_Lib_V2.1.0/Libraries - INCDIRS += $(STM32USBPATH)/STM32_USB_OTG_Driver/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Core/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/hid/inc - INCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/inc - BOARDSRC = main_arm.cpp targets/flamenco/board_flamenco.cpp - EXTRABOARDSRC += targets/flamenco/lcd_driver.cpp targets/flamenco/delays.c targets/flamenco/i2c_driver.cpp targets/taranis/configure_pins.cpp serial.cpp # targets/taranis/flash_driver.cpp - SRC += $(COOSDIR)/kernel/core.c $(COOSDIR)/kernel/hook.c $(COOSDIR)/kernel/task.c $(COOSDIR)/kernel/event.c $(COOSDIR)/kernel/time.c $(COOSDIR)/kernel/timer.c $(COOSDIR)/kernel/flag.c $(COOSDIR)/kernel/mutex.c $(COOSDIR)/kernel/serviceReq.c $(COOSDIR)/portable/GCC/port.c $(COOSDIR)/portable/arch.c - SRC += targets/flamenco/pwr_driver.c targets/flamenco/usb_driver.c - EEPROMSRC = storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_raw.cpp - PULSESSRC = pulses/pulses_arm.cpp pulses/ppm_arm.cpp pulses/pxx_arm.cpp - CPPSRC += tasks_arm.cpp audio_arm.cpp sbus.cpp telemetry/telemetry.cpp - CPPSRC += targets/flamenco/tw8823_driver.cpp targets/flamenco/pulses_driver.cpp targets/flamenco/keys_driver.cpp targets/flamenco/adc_driver.cpp targets/flamenco/eeprom_driver.cpp targets/flamenco/trainer_driver.cpp targets/flamenco/audio_driver.cpp targets/flamenco/serial2_driver.cpp targets/flamenco/telemetry_driver.cpp - CPPSRC += gui/$(GUIDIRECTORY)/view_channels.cpp gui/$(GUIDIRECTORY)/view_about.cpp gui/$(GUIDIRECTORY)/view_text.cpp debug.cpp - SRC += targets/flamenco/system_stm32f4xx.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/misc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dbgmcu.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_spi.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_i2c.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rtc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_pwr.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_usart.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_sdio.c - SRC += $(STM32LIBPATH)/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f40_41xxx.s - SRC += targets/flamenco/sdio_sd.c targets/flamenco/usb_bsp.c targets/flamenco/usbd_desc.c - SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_core.c - SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_dcd.c - SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_dcd_int.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_core.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_ioreq.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_req.c - EXTRABOARDSRC += targets/flamenco/usbd_usr.cpp - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_inputs_mixes.cpp - SRC += syscalls.c - ifeq ($(USB), JOYSTICK) - CPPDEFS += -DUSB_JOYSTICK - SRC += targets/flamenco/usbd_hid_joystick.c - else - CPPDEFS += -DUSB_MASS_STORAGE - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_scsi.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c - SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c - EXTRABOARDSRC += targets/flamenco/usbd_storage_msd.cpp - endif - ifeq ($(GVARS), YES) - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_gvars.cpp - endif - ifneq ($(LUA), NO) - ifeq ($(LUA), YES) - CPPDEFS += -DLUA_MODEL_SCRIPTS - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_custom_scripts.cpp - endif - CPPDEFS += -DLUA - INCDIRS += $(LUADIR) - CPPSRC += lua/interface.cpp lua/api_general.cpp lua/api_lcd.cpp lua/api_model.cpp - LUASRC = $(LUADIR)/lapi.c $(LUADIR)/lcode.c $(LUADIR)/lctype.c $(LUADIR)/ldebug.c $(LUADIR)/ldo.c $(LUADIR)/ldump.c $(LUADIR)/lfunc.c $(LUADIR)/lgc.c $(LUADIR)/llex.c $(LUADIR)/lmem.c \ - $(LUADIR)/lobject.c $(LUADIR)/lopcodes.c $(LUADIR)/lparser.c $(LUADIR)/lstate.c $(LUADIR)/lstring.c $(LUADIR)/ltable.c $(LUADIR)/lrotable.c $(LUADIR)/ltm.c $(LUADIR)/lundump.c $(LUADIR)/lvm.c $(LUADIR)/lzio.c \ - $(LUADIR)/lbaselib.c $(LUADIR)/linit.c $(LUADIR)/lmathlib.c $(LUADIR)/lbitlib.c $(LUADIR)/loadlib.c $(LUADIR)/lauxlib.c $(LUADIR)/ltablib.c $(LUADIR)/lcorolib.c $(LUADIR)/liolib.c $(LUADIR)/lstrlib.c - SRC += $(LUASRC) - LUADEP = lua/lua_exports_flamenco.inc - endif - - EXTRABOARDSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/fattime.c $(FATFSDIR)/option/ccsbcs.c targets/flamenco/diskio.cpp - CPPDEFS += -DSDCARD -DVOICE -DRTCLOCK - CPPSRC += sdcard.cpp rtc.cpp logs.cpp targets/taranis/rtc_driver.cpp - GUIGENERALSRC += gui/$(GUIDIRECTORY)/menu_general_sdmanager.cpp - INCDIRS += $(FATFSDIR) $(FATFSDIR)/option - - ifeq ($(DSM2), PPM) - CPPSRC += pulses/dsm2_arm.cpp - endif - - CPPDEFS += -DHAPTIC - CPPSRC += haptic.cpp - CPPSRC += targets/flamenco/haptic_driver.cpp - EXTRABOARDSRC += - - ifeq ($(TW8823_TRACES), YES) - CPPDEFS += -DTW8823_TRACES - endif - - ifeq ($(TW8823_BITMAPS), YES) - CPPDEFS += -DTW8823_BITMAPS - endif - - ifeq ($(TW8823_SERIAL), YES) - CPPDEFS += -DTW8823_SERIAL - endif -endif - -CC = $(TRGT)gcc -CPP = $(TRGT)cpp -AS = $(TRGT)as -OBJCOPY = $(TRGT)objcopy -OBJDUMP = $(TRGT)objdump -SIZE = $(TRGT)size -NM = $(TRGT)nm - -REMOVE = rm -f -REMOVEDIR = rm -rf - -SLEEP = sleep - -# Processor frequency. -F_CPU = 16000000 - -# Output format. (can be srec, ihex, binary) -FORMAT = ihex - -# Target file name (without extension). -TARGET = opentx - -# List C++ source files here. (C dependencies are automatically generated.) -ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO AR9X TARANIS FLAMENCO)) - TTS_SRC = translations/tts_cz.cpp translations/tts_de.cpp translations/tts_en.cpp translations/tts_es.cpp translations/tts_fr.cpp translations/tts_it.cpp translations/tts_nl.cpp translations/tts_pt.cpp translations/tts_sk.cpp translations/tts_se.cpp translations/tts_pl.cpp translations/tts_hu.cpp -else - STD_TTS_SRC = translations/tts_$(shell sh -c "echo $(TTS) | tr '[:upper:]' '[:lower:]'").cpp - TTS_SRC = $(shell sh -c "if test -f $(STD_TTS_SRC); then echo $(STD_TTS_SRC); else echo translations/tts_en.cpp; fi") -endif - -ifeq ($(GUI), YES) - GUISRC = gui/$(GUIDIRECTORY)/helpers.cpp gui/$(GUIDIRECTORY)/navigation.cpp gui/$(GUIDIRECTORY)/popups.cpp gui/$(GUIDIRECTORY)/widgets.cpp gui/$(GUIDIRECTORY)/menus.cpp $(GUIMODELSRC) $(GUIGENERALSRC) gui/$(GUIDIRECTORY)/view_main.cpp gui/$(GUIDIRECTORY)/view_statistics.cpp - ifeq ($(ARCH), ARM) - GUISRC += gui/gui_helpers.cpp - endif - CPPDEFS += -DGUI -endif - -CPPSRC += opentx.cpp functions.cpp strhelpers.cpp $(PULSESSRC) switches.cpp curves.cpp mixer.cpp stamp.cpp $(GUISRC) $(EEPROMSRC) timers.cpp trainer_input.cpp - -ifeq ($(GUI), YES) - GUISRC += gui/$(GUIDIRECTORY)/lcd.cpp gui/$(GUIDIRECTORY)/splash.cpp gui/$(GUIDIRECTORY)/fonts.cpp -endif - -GUISRC += keys.cpp maths.cpp translations.cpp $(TTS_SRC) - -# Debugging format. -# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. -# AVR Studio 4.10 requires dwarf-2. -# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. -DBGFMT = dwarf-2 - -CPPDEFS += -DTRANSLATIONS_$(TRANSLATIONS) - -# TTS language -CPPDEFS += -DTTS_$(TTS) - -ifeq ($(UNITS), IMPERIAL) - CPPDEFS += -DIMPERIAL_UNITS -endif - -ifneq ($(DEFAULT_MODE), NO) - CPPDEFS += -DDEFAULT_MODE=$(DEFAULT_MODE) -endif - -# If POTS are used for fields modification -ifeq ($(NAVIGATION), POT1) - CPPDEFS += -DNAVIGATION_POT1 -endif -ifeq ($(NAVIGATION), POT2) - CPPDEFS += -DNAVIGATION_POT2 -endif -ifeq ($(NAVIGATION), POT3) - CPPDEFS += -DNAVIGATION_POT3 -endif -ifeq ($(NAVIGATION), POTS) - CPPDEFS += -DNAVIGATION_POT1 -DNAVIGATION_POT2 -DNAVIGATION_POT3 -endif -ifeq ($(NAVIGATION), STICKS) - CPPDEFS += -DNAVIGATION_STICKS -endif -ifeq ($(NAVIGATION), ROTENC) - CPPDEFS += -DROTARY_ENCODER_NAVIGATION -endif - -ifeq ($(TURNIGY_TRANSMITTER_FIX), YES) - ifeq ($(PCB), $(filter $(PCB), TARANIS FLAMENCO)) - $(warning TURNIGY_TRANSMITTER_FIX is not available on this radio) - else - CPPDEFS += -DMODULE_ALWAYS_SEND_PULSES - endif -endif - -ifeq ($(LCD), ST7565R) - CPPDEFS += -DLCD_ST7565R -else ifeq ($(LCD), ERC12864FSF) - CPPDEFS += -DLCD_ERC12864FSF -else ifeq ($(LCD), ST7920) - CPPDEFS += -DLCD_ST7920 -endif - -ifeq ($(AUTOSWITCH), YES) - CPPDEFS += -DAUTOSWITCH -endif - -ifeq ($(AUTOSOURCE), YES) - CPPDEFS += -DAUTOSOURCE -endif - -ifeq ($(FRSKY_STICKS), YES) - CPPDEFS += -DFRSKY_STICKS -endif - -ifeq ($(DBLKEYS), YES) - ifeq ($(PCB), $(filter $(PCB), 9XR 9XR128 9XR2561)) - $(warning Sorry, DBLKEYS doesnt work on 9XR) - else - CPPDEFS += -DDBLKEYS - endif -endif - -ifeq ($(SPLASH), YES) - CPPDEFS += -DSPLASH -endif - -ifeq ($(SPLASH), FIXED) - CPPDEFS += -DSPLASH -DFSPLASH -endif - -ifeq ($(GRAPHICS), YES) - CPPDEFS += -DGRAPHICS -endif - -ifeq ($(BOLD), YES) - CPPDEFS += -DBOLD_FONT -endif - -ifneq ($(PCB), $(filter $(PCB), TARANIS FLAMENCO)) - ifeq ($(BATTGRAPH), YES) - CPPDEFS += -DBATTGRAPH - endif -endif - -ifneq ($(FONT), STD) - FONTDIR = $(shell sh -c "echo $(FONT) | tr '[:upper:]' '[:lower:]'") - FONTS += $(patsubst %.png,%.lbm,$(wildcard fonts/$(FONTDIR)/*.png)) - INCDIRS += fonts/$(FONTDIR) -endif - -INCDIRS += gui -INCDIRS += fonts/std - -ifeq ($(THR_TRACE), YES) - CPPDEFS += -DTHRTRACE -endif - -CPPDEFS += -DTIMERS=$(TIMERS) - -ifeq ($(FLIGHT_MODES), YES) - CPPDEFS += -DFLIGHT_MODES - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_flightmodes.cpp -endif - -ifeq ($(CURVES), YES) - CPPDEFS += -DCURVES - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_curves.cpp -endif - -ifeq ($(GVARS), YES) - CPPDEFS += -DGVARS - EEPROM_VARIANT += ${GVARS_VARIANT} -endif - -ifeq ($(MENUS_LOCK), READONLY) - CPPDEFS += -DMENUS_LOCK=1 -endif - -ifeq ($(MENUS_LOCK), NOMENUS) - CPPDEFS += -DMENUS_LOCK=2 -endif - -ifeq ($(CORRECT_NEGATIVE_VALUES), YES) - CPPDEFS += -DCORRECT_NEGATIVE_SHIFTS -endif - -ifeq ($(ARITHMETIC_OVERFLOW_CHECK), YES) - CPPDEFS += -DPREVENT_ARITHMETIC_OVERFLOW -endif - -ifeq ($(ACCURAT_THROTTLE_STATS), YES) - CPPDEFS += -DACCURAT_THROTTLE_TIMER -endif - -# EXTENSIONS (for Telemetry protocols) -ifneq ($(EXT), $(filter $(EXT), STD FRSKY FRSKY_SPORT ARDUPILOT NMEA JETI MAVLINK TELEMETREZ)) - $(error Sorry, the EXT $(EXT) is not supported yet in openTx) -endif - -ifeq ($(EXT), STD) - CPPDEFS += -DEXTSTD -endif - -ifeq ($(EXT), ARDUPILOT) - CPPDEFS += -DARDUPILOT - CPPSRC += telemetry/ardupilot.cpp -endif - -ifeq ($(EXT), NMEA) - CPPDEFS += -DNMEA - CPPSRC += telemetry/nmea.cpp -endif - -ifeq ($(EXT), JETI) - CPPDEFS += -DJETI - CPPSRC += telemetry/jeti.cpp -endif - -ifeq ($(EXT), MAVLINK) - CPPDEFS += -DMAVLINK - INCDIRS += thirdparty targets/common_avr/ - CPPSRC += telemetry/mavlink.cpp gui/$(GUIDIRECTORY)/view_mavlink.cpp targets/common_avr/serial_driver.cpp - EEPROM_VARIANT += ${MAVLINK_VARIANT} -endif - -ifeq ($(EXT), TELEMETREZ) - CPPDEFS += -DTELEMETREZ -endif - -ifeq ($(EXT), $(filter $(EXT), FRSKY FRSKY_SPORT TELEMETREZ)) - CPPDEFS += -DFRSKY - - ifeq ($(ARCH), ARM) - CPPSRC += telemetry/frsky.cpp telemetry/frsky_d_arm.cpp - else - CPPSRC += telemetry/frsky.cpp telemetry/frsky_d.cpp - endif - - ifeq ($(EXT), FRSKY_SPORT) - CPPSRC += telemetry/frsky_sport.cpp - CPPSRC += crc16.cpp - CPPDEFS += -DFRSKY_SPORT - endif - - CPPSRC += gui/$(GUIDIRECTORY)/view_telemetry.cpp - - ifeq ($(FRSKY_HUB), YES) - CPPDEFS += -DFRSKY_HUB - endif - - ifeq ($(WS_HOW_HIGH), YES) - CPPDEFS += -DWS_HOW_HIGH - endif - - ifeq ($(GAUGES), YES) - CPPDEFS += -DGAUGES - endif - - ifeq ($(GPS), YES) - CPPDEFS += -DGPS - endif - - ifeq ($(VARIO), YES) - CPPSRC += vario.cpp - CPPDEFS += -DVARIO - endif - EEPROM_VARIANT += ${FRSKY_VARIANT} -endif - -ifeq ($(SIMU), YES) - CPPDEFS += -DDEBUG - CPPSRC += dump.cpp -else ifeq ($(CLI), YES) - CPPDEFS += -DCLI - CPPSRC += cli.cpp dump.cpp -else ifeq ($(DEBUG), YES) - CPPSRC += dump.cpp -endif - -ifeq ($(DEBUG), YES) - CPPDEFS += -DDEBUG -endif - -ifeq ($(EEPROM_PROGRESS_BAR), YES) - CPPDEFS += -DEEPROM_PROGRESS_BAR -endif - -ifeq ($(SHUTDOWN_CONFIRMATION), YES) - CPPDEFS += -DSHUTDOWN_CONFIRMATION -endif - -RUN_FROM_FLASH = 1 - -### Global Build-Option Directives ### - -ifeq ($(PPM_CENTER_ADJUSTABLE), YES) - CPPDEFS += -DPPM_CENTER_ADJUSTABLE -endif - -ifeq ($(PPM_LIMITS_SYMETRICAL), YES) - CPPDEFS += -DPPM_LIMITS_SYMETRICAL -endif - -ifeq ($(OVERRIDE_CHANNEL_FUNCTION), YES) - CPPDEFS += -DOVERRIDE_CHANNEL_FUNCTION -endif - -ifeq ($(DANGEROUS_MODULE_FUNCTIONS), YES) - CPPDEFS += -DDANGEROUS_MODULE_FUNCTIONS -endif - -ifeq ($(PPM_UNIT), US) - CPPDEFS += -DPPM_UNIT_US -endif - -ifeq ($(PPM_UNIT), PERCENT_PREC1) - CPPDEFS += -DPPM_UNIT_PERCENT_PREC1 -endif - -ifeq ($(PPM_UNIT), PERCENT_PREC0) - CPPDEFS += -DPPM_UNIT_PERCENT_PREC0 -endif - -ifeq ($(FAI), YES) - CPPDEFS += -DFAI -endif -ifeq ($(FAI), CHOICE) - CPPDEFS += -DFAI_CHOICE -endif - -ifeq ($(HELI), YES) - CPPDEFS += -DHELI - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_heli.cpp -endif - -ifeq ($(TEMPLATES), YES) - ifneq ($(PCB), $(filter $(PCB), TARANIS FLAMENCO)) - CPPDEFS += -DTEMPLATES - CPPSRC += templates.cpp - GUIMODELSRC += gui/$(GUIDIRECTORY)/menu_model_templates.cpp - endif -endif - -ifeq ($(PXX), YES) - CPPDEFS += -DPXX -endif - -ifeq ($(DSM2), SERIAL) - CPPDEFS += -DDSM2 -DDSM2_SERIAL -endif - -ifeq ($(DSM2), PPM) - CPPDEFS += -DDSM2 -DDSM2_PPM -endif - -ifeq ($(TX_CADDY), YES) - CPPDEFS += -DTX_CADDY -endif - -ifeq ($(IRPROTOS), YES) - CPPDEFS += -DIRPROTOS -endif - -ifeq ($(LUA_COMPILER), YES) - CPPDEFS += -DLUA_COMPILER -endif - -#---------------- Compiler Options C++ ---------------- -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -CPPFLAGS = -g$(DBGFMT) -CPPFLAGS += $(CPPDEFS) -CPPFLAGS += -Wall -CPPFLAGS += -fno-exceptions -CPPFLAGS += -Wno-strict-aliasing -CPPFLAGS += -Wformat -Wreturn-type -Wunused -Wuninitialized -Wunknown-pragmas -Wno-switch -Wtype-limits -INCFLAGS = $(patsubst %,-I%,$(INCDIRS)) - -ifeq ($(WARNINGS_AS_ERRORS), YES) - CPPFLAGS += -Werror -endif - -MATH_LIB = -lm - -#---------------- Linker Options ---------------- -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += $(MATH_LIB) - -# Define Messages -# English -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_COMPILING = Compiling C++: -MSG_CLEANING = Cleaning project: - -# Combine all necessary flags and optional flags. -# Add target processor to flags. - -CPPFLAGS += -DFLAVOUR=\"$(FLAVOUR)\" -ARMCPPFLAGS = -c -mcpu=$(MCU) -mthumb -fomit-frame-pointer -fverbose-asm -Wa,-ahlms=opentx.lst -DRUN_FROM_FLASH=1 -O$(OPT) $(CPPFLAGS) -fdata-sections -ffunction-sections $(INCFLAGS) $(GENDEPFLAGS) -AVRCPPFLAGS = -mmcu=$(MCU) -I. -x c++ -O$(OPT) $(CPPFLAGS) $(INCFLAGS) $(GENDEPFLAGS) -fwhole-program - -ifeq ($(ARCH), AVR) - GCCVERSIONGTE462 := $(shell expr 4.6.2 \<= `$(CC) -dumpversion`) - ifeq ($(GCCVERSIONGTE462),1) - CPPFLAGS += -flto - endif - - AVRCPPFLAGS += -fno-inline-small-functions - - GCCVERSIONGTE470 := $(shell expr 4.7.0 \<= `$(CC) -dumpversion`) - ifeq ($(GCCVERSIONGTE470),1) - AVRCPPFLAGS += -mstrict-X - endif -endif - -MAJ_VER = ${shell sh -c "grep \"MAJ_VERS\" opentx.h | cut -d\ -f3 | egrep -o \"[[:digit:]]\""} -MIN_VER = ${shell sh -c "grep \"MIN_VERS\" opentx.h | cut -d\ -f3"} - -.SECONDARY: - -# Default target. -all: begin gccversion sizebefore build sizeafter end - -# Change the build target to build a HEX file or a library. -ifeq ($(ARCH), AVR) - build: stamp.h tra lbm allsrc.cpp elf remallsrc hex -else ifeq ($(PCB), $(filter $(PCB), SKY9X 9XRPRO AR9X TARANIS)) - build: stamp.h tra lbm bootloader.lbm $(LUADEP) allsrc.cpp elf remallsrc bin -else - build: stamp.h tra lbm $(LUADEP) allsrc.cpp elf remallsrc bin -endif - -# build bootloader -ifeq ($(PCB), $(filter $(PCB), TARANIS)) -bootloader.lbm: targets/taranis/bootloader/bootloader_ramBoot.bin - $(BIN2LBM) $^ $@ -.PHONY targets/taranis/bootloader/bootloader_ramBoot.bin: - @echo "Building bootloader..." - $(MAKE) -C targets/taranis/bootloader PCB=$(PCB) PCBREV=$(PCBREV) NANO=$(NANO) WARNINGS_AS_ERRORS=$(WARNINGS_AS_ERRORS) -else ifeq ($(PCB), $(filter $(PCB), 9XRPRO AR9X)) -bootloader.lbm: - @echo "Fetching Mike's bootloader..." - wget https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/bootflash8.lbm - mv bootflash8.lbm $@ -else ifeq ($(PCB), SKY9X) -bootloader.lbm: - @echo "Fetching Mike's bootloader..." - wget https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/bootflash4.lbm - mv bootflash4.lbm $@ -endif - -tra: translations/en.h translations/cz.h translations/de.h translations/es.h translations/fi.h translations/fr.h translations/it.h translations/nl.h translations/pl.h translations/pt.h translations/se.h -lbm: fonts bitmaps - -elf: $(TARGET).elf -bin: $(TARGET).bin -hex: $(TARGET).hex -eep: $(TARGET).eep -lss: $(TARGET).lss -sym: $(TARGET).sym - -# Build stamp-file -.PHONY : stamp.h -.PHONY : opentx-stamp - -stamp.h: - @echo "// Automatically generated file (Makefile) - do not edit" > stamp.h - @echo "#define DATE \"`date +%Y-%m-%d | tr -d '\r\n'`\"" > stamp.h - @echo "#define TIME \"`date +%H:%M:%S | tr -d '\r\n'`\"" >> stamp.h - @echo "#define VERSION \"$(VERSION)\"" >> stamp.h - @echo "" >> stamp.h - @echo "#define VERSION_MAJOR $(VERSION_MAJOR)" >> stamp.h - @echo "#define VERSION_MINOR $(VERSION_MINOR)" >> stamp.h - @echo "#define VERSION_REVISION $(VERSION_REVISION)" >> stamp.h - @echo "#define GIT_STR \"$(shell git rev-parse HEAD)\"" >> stamp.h - -opentx-stamp: - @echo "#define DATE_STR \"`date +%Y-%m-%d`\"" > stamp-opentx.txt - @echo "#define TIME_STR \"`date +%H:%M:%S`\"" >> stamp-opentx.txt - @echo "#define VERS_STR \"$(VERSION)\"" >> stamp-opentx.txt - @echo "#define GIT_STR \"$(shell git rev-parse HEAD)\"" >> stamp-opentx.txt - @cat stamp-opentx.txt - - -translations/en.h: translations/en.h.txt - @echo - @echo "Create English language specific header files" - $(TRANSLATE) translations/en.h.txt translations/en.h en - -translations/cz.h: translations/cz.h.txt - @echo - @echo "Create Czech language specific header files" - $(TRANSLATE) translations/cz.h.txt translations/cz.h cz - -translations/de.h: translations/de.h.txt - @echo - @echo "Create German language specific header files" - $(TRANSLATE) translations/de.h.txt translations/de.h de - -translations/es.h: translations/es.h.txt - @echo - @echo "Create Spanish language specific header files" - $(TRANSLATE) translations/es.h.txt translations/es.h es - -translations/fi.h: translations/fi.h.txt - @echo - @echo "Create Finnish language specific header files" - $(TRANSLATE) translations/fi.h.txt translations/fi.h fi - -translations/fr.h: translations/fr.h.txt - @echo - @echo "Create French language specific header files" - $(TRANSLATE) translations/fr.h.txt translations/fr.h fr - -translations/it.h: translations/it.h.txt - @echo - @echo "Create Italian language specific header files" - $(TRANSLATE) translations/it.h.txt translations/it.h it - -translations/nl.h: translations/nl.h.txt - @echo - @echo "Create Nederlands language specific header files" - $(TRANSLATE) translations/nl.h.txt translations/nl.h nl - -translations/pl.h: translations/pl.h.txt - @echo - @echo "Create Polish language specific header files" - $(TRANSLATE) translations/pl.h.txt translations/pl.h pl - -translations/pt.h: translations/pt.h.txt - @echo - @echo "Create Portugese language specific header files" - $(TRANSLATE) translations/pt.h.txt translations/pt.h pt - -translations/se.h: translations/se.h.txt - @echo - @echo "Create Swedish language specific header files" - $(TRANSLATE) translations/se.h.txt translations/se.h se - -ifeq ($(PCB), $(filter $(PCB), FLAMENCO)) - FONTDIR = flamenco - FONTNAME = Roboto - TINSIZE = 5 - SMLSIZE = 7 - STDSIZE = 11 - MIDSIZE = 11 - DBLSIZE = 14 - DBLBOLD = False - XXLSIZE = 38 - MASKFORMAT = 4bits -endif - -.PHONY: fonts -fonts: $(FONTS) - -fonts/$(FONTDIR)/font_%size.lbm: fonts/$(FONTDIR)/font_%size.png - $(IMG2LBM) $^ $@ $(LCDSIZE) $(MASKFORMAT) - -fonts/$(FONTDIR)/font_tinsize.png: - $(FONT2PNG) $(FONTNAME) $(TINSIZE) False fonts/$(FONTDIR)/font_tinsize - -fonts/$(FONTDIR)/font_smlsize.png: - $(FONT2PNG) $(FONTNAME) $(SMLSIZE) False fonts/$(FONTDIR)/font_smlsize - -fonts/$(FONTDIR)/font_stdsize.png: - $(FONT2PNG) $(FONTNAME) $(STDSIZE) False fonts/$(FONTDIR)/font_stdsize - -fonts/$(FONTDIR)/font_midsize.png: - $(FONT2PNG) $(FONTNAME) $(MIDSIZE) False fonts/$(FONTDIR)/font_midsize - -fonts/$(FONTDIR)/font_dblsize.png: - $(FONT2PNG) $(FONTNAME) $(DBLSIZE) $(DBLBOLD) fonts/$(FONTDIR)/font_dblsize - -fonts/$(FONTDIR)/font_xxlsize.png: - $(FONT2PNG) $(FONTNAME) $(XXLSIZE) False fonts/$(FONTDIR)/font_xxlsize - -fonts/%.lbm: fonts/%.png - $(IMG2LBM) $^ $@ $(LCDSIZE) - -.PHONY: bitmaps -bitmaps: $(BITMAPS) - -bitmaps/sticks.lbm: bitmaps/sticks.xbm - $(IMG2LBM) $^ $@ $(LCDSIZE) 1bit 4 - -bitmaps/9x/%.lbm: bitmaps/9x/%.png - $(IMG2LBM) $^ $@ $(LCDSIZE) 1bit - -bitmaps/taranis/%.lbm: bitmaps/taranis/%.png - $(IMG2LBM) $^ $@ $(LCDSIZE) 4bits - -bitmaps/flamenco/%.lbm: bitmaps/flamenco/%.png - $(IMG2LBM) $^ $@ $(LCDSIZE) 4/4/4/4 - -ifeq ($(OS),Windows_NT) - PARSER = avr-cpp -else - PARSER = gcc -E -x c++ -endif - -lua/lua_exports_taranis.inc: myeeprom.h ../util/luaexport.py - @echo "Generating a list of Lua exported constants in lua/lua_exports_taranis.txt" - @$(PARSER) -DEXPORT -DPCBTARANIS -DLUA -DVIRTUALINPUTS myeeprom.h | grep LEXP > lua/lua_exports_taranis.txt - @echo "Parsing and generating C Lua exports in lua/lua_exports_taranis.inc" - @python ../util/luaexport.py $(VERSION) lua/lua_exports_taranis.txt lua/lua_exports_taranis.inc lua/lua_fields_taranis.txt - @rm lua/lua_exports_taranis.txt - -lua/lua_exports_taranis_x9e.inc: myeeprom.h ../util/luaexport.py - @echo "Generating a list of Lua exported constants in lua/lua_exports_taranis_x9e.txt" - @$(PARSER) -DEXPORT -DPCBTARANIS -DREVPLUS -DREV9E -DLUA -DVIRTUALINPUTS myeeprom.h | grep LEXP > lua/lua_exports_taranis_x9e.txt - @echo "Parsing and generating C Lua exports in lua/lua_exports_taranis_x9e.inc" - @python ../util/luaexport.py $(VERSION) lua/lua_exports_taranis_x9e.txt lua/lua_exports_taranis_x9e.inc lua/lua_fields_taranis_x9e.txt - @rm lua/lua_exports_taranis_x9e.txt - -lua/lua_exports_flamenco.inc: myeeprom.h ../util/luaexport.py - @echo "Generating a list of Lua exported constants in lua/lua_exports_flamenco.txt" - @$(PARSER) -DEXPORT -DPCBFLAMENCO -DLUA -DVIRTUALINPUTS myeeprom.h | grep LEXP > lua/lua_exports_flamenco.txt - @echo "Parsing and generating C Lua exports in lua/lua_exports_flamenco.inc" - @python ../util/luaexport.py $(VERSION) lua/lua_exports_flamenco.txt lua/lua_exports_flamenco.inc lua/lua_fields_flamenco.txt - @rm lua/lua_exports_flamenco.txt - -# Eye candy. -# AVR Studio 3.x does not check make's exit code but relies on -# the following magic strings to be generated by the compile job. - -begin: - @echo - @echo $(MSG_BEGIN) - -end: - @echo $(MSG_END) - @echo - -# Display size of file. -ifeq ($(ARCH), AVR) - MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) - FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) - ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf -else - ELFSIZE = $(SIZE) $(TARGET).elf -endif - -sizebefore: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); fi - -sizeafter: - @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); fi - -# Display compiler version information. -gccversion: - @$(CC) --version - -FOXINC=-I/usr/local/include/fox-1.6 -I/usr/include/fox-1.6 \ - -I$(FOXPATH)/include \ - -I/opt/local/include/fox-1.6 -FOXLIB=-L/usr/local/lib \ - -L$(FOXPATH)/src/.libs \ - -L/opt/local/lib \ - -lFOX-1.6 \ - -Wl,-rpath,$(FOXPATH)/src/.libs - -SIMUDEFS = -DSIMU -DLUA_USE_APICHECK -ifeq ($(SIMU_AUDIO), YES) - AUDIOLIB = -L/usr/lib/x86_64-linux-gnu/ -lSDLmain -lSDL - AUDIOINC = -I/usr/include/SDL - SIMUDEFS += -DSIMU_AUDIO -endif - -ifeq ($(SIMU_DISKIO), YES) - CPPSRC += $(FATFSDIR)/ff.c $(FATFSDIR)/option/ccsbcs.c - SIMUDEFS += -DSIMU_DISKIO -endif - -simu: $(LUADEP) stamp.h allsimusrc.cpp Makefile simu.cpp targets/simu/simpgmspace.cpp *.h tra lbm eeprom.bin - gcc $(CPPFLAGS) $(SIMUCPPFLAGS) $(INCFLAGS) simu.cpp allsimusrc.cpp $(LUASRC) targets/simu/simpgmspace.cpp -MD $(SIMUDEFS) -O0 -o simu $(FOXINC) $(FOXLIB) $(AUDIOINC) $(AUDIOLIB) -pthread -fexceptions -lstdc++ -lm - -eeprom.bin: - dd if=/dev/zero of=$@ bs=1 count=2048 - - -# Create final output files (.hex, .eep) from ELF output file. -ifeq ($(ARCH), AVR) -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ -else -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O ihex opentx.elf opentx.hex -endif - -%.bin: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O binary $< $@ - -%.eep: %.elf - @echo - @echo $(MSG_EEPROM) $@ - -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - -# Create extended listing file from ELF output file. -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S $< > $@ - -# Concatenate all sources files in one big file to optimize size -allsrc.cpp: Makefile $(BOARDSRC) $(CPPSRC) $(EXTRABOARDSRC) - @rm -f allsrc.cpp - for f in $(BOARDSRC) $(CPPSRC) $(EXTRABOARDSRC) ; do echo "# 1 \"$$f\"" >> allsrc.cpp; cat "$$f" >> allsrc.cpp; done - -allsimusrc.cpp: Makefile $(BOARDSRC) $(CPPSRC) - @rm -f allsimusrc.cpp - for f in $(BOARDSRC) $(CPPSRC) ; do echo "# 1 \"$$f\"" >> allsimusrc.cpp; cat "$$f" >> allsimusrc.cpp; done - -remallsrc: - $(REMOVE) allsrc.cpp - $(REMOVE) allsimusrc.cpp - -# Link: create ELF output file from object files. -ifeq ($(ARCH), AVR) -opentx.elf: allsrc.cpp - @echo - @echo $(MSG_COMPILING) $@ - $(CC) $(AVRCPPFLAGS) $< --output $@ $(LDFLAGS) -else -%.o: %.c - $(CC) $(ARMCPPFLAGS) -Wimplicit $< -o $@ -%.o: %.s - $(AS) $< -o $@ -TMP = $(SRC:.c=.o) -OBJS = $(TMP:.s=.o) -opentx.elf: allsrc.cpp $(OBJS) - @echo - @echo $(MSG_COMPILING) $@ - $(CC) $(ARMCPPFLAGS) $< -o allsrc.o - $(CC) $(OBJS) allsrc.o -mcpu=$(MCU) -mthumb -nostartfiles -lm -T$(LDSCRIPT) -Wl,-Map=$(TARGET).map,--cref,--no-warn-mismatch,--gc-sections $(NEWLIB_NANO_FLAGS) -o $@ -endif - -# Target: clean project. -clean: begin clean_list end - -CLEAN_SRC=$(filter %.c,$(SRC)) -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) simu - $(REMOVE) gtests - $(REMOVE) gtest.a - $(REMOVE) gtest_main.a - $(REMOVE) $(TARGET).bin - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).eep - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lss - $(REMOVE) $(TARGET).lst - $(REMOVE) $(CLEAN_SRC:.c=.s) - $(REMOVE) `find . -name "*.o"` - $(REMOVE) *.d - $(REMOVE) *.lst - $(REMOVE) allsrc.cpp - $(REMOVE) allsimusrc.cpp - $(REMOVE) stamp.h - $(REMOVE) *.lbm - $(REMOVE) bitmaps/*.lbm - $(REMOVE) bitmaps/*/*.lbm - $(REMOVE) fonts/*/*.lbm - $(REMOVE) translations/*.h - $(REMOVE) lua/lua_exports*.txt lua/lua_fields*.txt lua/lua_exports*.inc - $(MAKE) -C targets/taranis/bootloader clean - -#### Install - -DATE = ${shell sh -c "date +%F:%T" } -AVRCOMMAND = $(AVRDUDE) $(AVRDEVICE) - -WRITE_COMMAND = $(AVRCOMMAND) -U flash:w:opentx.hex:i -ifeq ($(RESTORE_EEPROM), YES) - BACKUP_EEPROM = YES - ifeq ($(DOUBLE_WRITE_OK), YES) - WRITE_COMMAND += -U eeprom:w:$(DATA_DIR)/eeprom-$(DATE).hex:i - else - SECOND_WRITE_COMMAND = -U eeprom:w:$(DATA_DIR)/eeprom-$(DATE).hex:i - endif -endif - -ifeq ($(BACKUP_FLASH), YES) - BACKUP_ARGS += -U eeprom:r:$(DATA_DIR)/eeprom-$(DATE).hex:i $(BACKUPFLASH) -endif -ifeq ($(BACKUP_EEPROM), YES) - BACKUP_ARGS += -U flash:r:$(DATA_DIR)/opentx-$(DATE).hex:i -endif - -install: all -ifdef BACKUP_ARGS - $(AVRCOMMAND) $(BACKUP_ARGS) - $(SLEEP) $(DELAY) -endif - $(WRITE_COMMAND) -ifdef SECOND_WRITE_COMMAND - $(SLEEP) $(DELAY) - $(SECOND_WRITE_COMMAND) -endif - -#### GOOGLE TESTS - -GTEST_INCDIR = /usr/include/gtest -GTEST_SRCDIR = /usr/src/gtest/ - -# Where to find user code. -USER_DIR = ./ - -# All Google Test headers. Usually you shouldn't change this -# definition. -GTEST_HEADERS = $(GTEST_INCDIR)/*.h \ - $(GTEST_INCDIR)/internal/*.h - -# House-keeping build targets. - -# Builds gtest.a and gtest_main.a. - -# Usually you shouldn't tweak such internal variables, indicated by a -# trailing _. -GTEST_SRCS = $(GTEST_SRCDIR)/src/*.cc $(GTEST_HEADERS) - -# For simplicity and to avoid depending on Google Test's -# implementation details, the dependencies specified below are -# conservative and not optimized. This is fine as Google Test -# compiles fast and for ordinary users its source rarely changes. -gtest-all.o : $(GTEST_SRCS) - $(CXX) $(CPPFLAGS) -I$(GTEST_SRCDIR) -I$(GTEST_INCDIR) -c $(GTEST_SRCDIR)/src/gtest-all.cc - -# Builds a sample test. A test should link with either gtest.a or -# gtest_main.a, depending on whether it defines its own main() -# function. - -#use all .cpp files from tests/ dir -GTEST_TESTS_SRCS = $(shell find tests/ -type f -name '*.cpp') - -gtests: allsimusrc.cpp $(GTEST_TESTS_SRCS) targets/simu/simpgmspace.cpp *.h tests/gtests.h gtest-all.o - gcc -std=gnu++0x $(CPPFLAGS) $(SIMUCPPFLAGS) allsimusrc.cpp $(LUASRC) $(GTEST_TESTS_SRCS) targets/simu/simpgmspace.cpp ${INCFLAGS} -I$(GTEST_INCDIR) -I/usr/include/qt4 -o gtests -lpthread -MD -DSIMU -lQtCore -lQtGui gtest-all.o -fexceptions -lstdc++ -lm diff --git a/radio/src/audio_arm.cpp b/radio/src/audio_arm.cpp index a9b409425..985a18b36 100644 --- a/radio/src/audio_arm.cpp +++ b/radio/src/audio_arm.cpp @@ -319,7 +319,7 @@ void getLogicalSwitchAudioFile(char * filename, int index, unsigned int event) { char * str = getModelAudioPath(filename); -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) || defined(PCBHORUS) *str++ = 'L'; if (index >= 9) { div_t qr = div(index+1, 10); diff --git a/radio/src/bitmaps/horus/CMakeLists.txt b/radio/src/bitmaps/horus/CMakeLists.txt index 4b32dcc23..9289b19ec 100644 --- a/radio/src/bitmaps/horus/CMakeLists.txt +++ b/radio/src/bitmaps/horus/CMakeLists.txt @@ -1,10 +1,11 @@ add_truetype_font_target(horus tinsize "DejaVu Sans" 9 False) add_truetype_font_target(horus smlsize "DejaVu Sans" 13 False) add_truetype_font_target(horus stdsize "DejaVu Sans" 16 False) +add_truetype_font_target(horus stdsizebold "DejaVu Sans" 16 True) add_truetype_font_target(horus midsize "DejaVu Sans" 24 False) add_truetype_font_target(horus dblsize "DejaVu Sans" 32 True) add_truetype_font_target(horus xxlsize "DejaVu Sans" 48 False) -add_custom_target(ttf_horus_fonts DEPENDS ttf_horus_tinsize ttf_horus_smlsize ttf_horus_stdsize ttf_horus_midsize ttf_horus_dblsize ttf_horus_xxlsize) +add_custom_target(ttf_horus_fonts DEPENDS ${ttf_horus_fonts_targets}) add_bitmaps_target(horus_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/horus/bmp_*.png" 480 5/6/5) add_bitmaps_target(horus_calibration_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/horus/calibration/bmp_*.png" 480 5/6/5) @@ -16,4 +17,5 @@ add_bitmaps_target(horus_slider_masks "${RADIO_SRC_DIRECTORY}/bitmaps/horus/slid add_bitmaps_target(horus_layouts_masks "${RADIO_SRC_DIRECTORY}/gui/horus/layouts/*.png" 480 8bits) add_bitmaps_target(horus_themes_bitmaps "${RADIO_SRC_DIRECTORY}/gui/horus/themes/*.png" 480 5/6/5) add_bitmaps_target(horus_fonts ${RADIO_SRC_DIRECTORY}/fonts/horus/*.png 480 8bits) -add_dependencies(horus_bitmaps horus_calibration_bitmaps horus_alpha_bitmaps horus_alpha_calibration_bitmaps horus_masks horus_slider_masks horus_themes_bitmaps horus_layouts_masks horus_fonts) +add_bitmaps_target(horus_volume_masks ${RADIO_SRC_DIRECTORY}/bitmaps/horus/volume/*.png 480 8bits) +add_dependencies(horus_bitmaps horus_calibration_bitmaps horus_button_bitmaps horus_alpha_bitmaps horus_alpha_calibration_bitmaps horus_masks horus_slider_masks horus_layouts_masks horus_themes_bitmaps horus_fonts horus_volume_masks) diff --git a/radio/src/bitmaps/horus/mask_txbat.png b/radio/src/bitmaps/horus/mask_txbat.png new file mode 100644 index 000000000..fd5939190 Binary files /dev/null and b/radio/src/bitmaps/horus/mask_txbat.png differ diff --git a/radio/src/bitmaps/horus/volume/mask_volume_0.png b/radio/src/bitmaps/horus/volume/mask_volume_0.png new file mode 100644 index 000000000..a6ae5b6ae Binary files /dev/null and b/radio/src/bitmaps/horus/volume/mask_volume_0.png differ diff --git a/radio/src/bitmaps/horus/volume/mask_volume_1.png b/radio/src/bitmaps/horus/volume/mask_volume_1.png new file mode 100644 index 000000000..6fe0636ba Binary files /dev/null and b/radio/src/bitmaps/horus/volume/mask_volume_1.png differ diff --git a/radio/src/bitmaps/horus/volume/mask_volume_2.png b/radio/src/bitmaps/horus/volume/mask_volume_2.png new file mode 100644 index 000000000..7e65a48d1 Binary files /dev/null and b/radio/src/bitmaps/horus/volume/mask_volume_2.png differ diff --git a/radio/src/bitmaps/horus/volume/mask_volume_3.png b/radio/src/bitmaps/horus/volume/mask_volume_3.png new file mode 100644 index 000000000..5cb9421f2 Binary files /dev/null and b/radio/src/bitmaps/horus/volume/mask_volume_3.png differ diff --git a/radio/src/bitmaps/horus/volume/mask_volume_4.png b/radio/src/bitmaps/horus/volume/mask_volume_4.png new file mode 100644 index 000000000..e43a6c807 Binary files /dev/null and b/radio/src/bitmaps/horus/volume/mask_volume_4.png differ diff --git a/radio/src/bitmaps/horus/volume/mask_volume_scale.png b/radio/src/bitmaps/horus/volume/mask_volume_scale.png new file mode 100644 index 000000000..301f847dd Binary files /dev/null and b/radio/src/bitmaps/horus/volume/mask_volume_scale.png differ diff --git a/radio/src/crc16.cpp b/radio/src/crc16.cpp index d9cfbcaf8..56319e271 100644 --- a/radio/src/crc16.cpp +++ b/radio/src/crc16.cpp @@ -20,8 +20,8 @@ #include -/* CRC16 implementation according to CCITT standards */ -static const unsigned short crc16tab[256]= { +// CRC16 implementation according to CCITT standards +static const unsigned short crc16tab[256] = { 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7, 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef, 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6, @@ -56,11 +56,56 @@ static const unsigned short crc16tab[256]= { 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0 }; -uint16_t crc16(uint8_t * buf, uint32_t len) +uint16_t crc16(const uint8_t * buf, uint32_t len) { uint16_t crc = 0; - for (uint32_t counter=0; counter>8) ^ *buf++ ) & 0x00FF]; + for (uint32_t i=0; i>8) ^ *buf++) & 0x00FF]; } return crc; } + +// CRC8 implementation with polynom = x^8+x^7+x^6+x^4+x^2+1 (0xD5) +unsigned char crc8tab[256] = { + 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54, + 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D, + 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06, + 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F, + 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0, + 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9, + 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2, + 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B, + 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9, + 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0, + 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B, + 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2, + 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D, + 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44, + 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F, + 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16, + 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB, + 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92, + 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9, + 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0, + 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F, + 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36, + 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D, + 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64, + 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26, + 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F, + 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74, + 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D, + 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82, + 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB, + 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0, + 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9 +}; + +uint8_t crc8(const uint8_t * ptr, uint32_t len) +{ + uint8_t crc = 0; + for (uint32_t i=0; i= 3600 && (~att & DBLSIZE)) { + if (tme >= 3600) { qr = div(qr.quot, 60); separator = CHR_HOUR; } @@ -617,6 +617,10 @@ void putsTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2 #define separator ':' #endif lcdDrawNumber(x, y, qr.quot, att|LEADING0|LEFT, 2); +#if defined(CPUARM) + if (separator == CHR_HOUR) + att &= ~DBLSIZE; +#endif #if defined(CPUARM) && defined(RTCLOCK) if (att&TIMEBLINK) lcdDrawChar(lcdLastPos, y, separator, BLINK); diff --git a/radio/src/gui/9x/menu_model_custom_functions.cpp b/radio/src/gui/9x/menu_model_custom_functions.cpp index efe7194eb..a298cc2be 100644 --- a/radio/src/gui/9x/menu_model_custom_functions.cpp +++ b/radio/src/gui/9x/menu_model_custom_functions.cpp @@ -196,7 +196,7 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu #endif #if defined(CPUARM) else if (func == FUNC_SET_TIMER) { - val_max = 59*60+59; + val_max = 539*60+59; putsTimer(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT, attr); } #endif diff --git a/radio/src/gui/9x/menu_model_setup.cpp b/radio/src/gui/9x/menu_model_setup.cpp index da2c2852c..cd6c2fc82 100644 --- a/radio/src/gui/9x/menu_model_setup.cpp +++ b/radio/src/gui/9x/menu_model_setup.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" +#include "opentx.h" #if defined(CPUARM) uint8_t g_moduleIdx; @@ -205,13 +205,14 @@ void menuModelSetup(uint8_t event) break; } case 1: - CHECK_INCDEC_MODELVAR_ZERO(event, qr.quot, 59); + CHECK_INCDEC_MODELVAR_ZERO(event, qr.quot, 539); // 8:59 timer->start = qr.rem + qr.quot*60; break; case 2: qr.rem -= checkIncDecModel(event, qr.rem+2, 1, 62)-2; timer->start -= qr.rem ; if ((int16_t)timer->start < 0) timer->start=0; + if ((int16_t)timer->start > 5999) timer->start=32399; // 8:59:59 break; } } @@ -284,7 +285,10 @@ void menuModelSetup(uint8_t event) break; case 2: qr.rem -= checkIncDecModel(event, qr.rem+2, 1, 62)-2; - timer->start -= qr.rem ; + if (timer->start >= qr.rem) { + timer->start -= qr.rem ; + } + if ((int32_t)timer->start > 3599) timer->start=3599; // 59:59 break; } } diff --git a/radio/src/gui/9x/menu_model_telemetry.cpp b/radio/src/gui/9x/menu_model_telemetry.cpp index 53aa9d29d..8d26418ed 100644 --- a/radio/src/gui/9x/menu_model_telemetry.cpp +++ b/radio/src/gui/9x/menu_model_telemetry.cpp @@ -609,7 +609,7 @@ void menuModelTelemetry(uint8_t event) case ITEM_TELEMETRY_A2_LABEL: lcd_putsLeft(y, STR_ACHANNEL); lcdDrawNumber(2*FW, y, ch+1, 0); - putsTelemetryChannelValue(TELEM_COL2+6*FW, y, dest, frskyData.analog[ch].value, LEFT); + putsTelemetryChannelValue(TELEM_COL2+6*FW, y, dest, telemetryData.analog[ch].value, LEFT); break; case ITEM_TELEMETRY_A1_RANGE: @@ -739,7 +739,7 @@ void menuModelTelemetry(uint8_t event) case ITEM_TELEMETRY_FAS_OFFSET: lcd_putsLeft(y, STR_FAS_OFFSET); lcdDrawNumber(TELEM_COL2, y, g_model.frsky.fasOffset, attr|LEFT|PREC1); - lcdDrawNumber(TELEM_COL2+6*FW, y, frskyData.hub.current, LEFT|PREC1); + lcdDrawNumber(TELEM_COL2+6*FW, y, telemetryData.hub.current, LEFT|PREC1); lcdDrawChar(TELEM_COL2+8*FW, y, 'A'); if (attr) g_model.frsky.fasOffset = checkIncDec(event, g_model.frsky.fasOffset, -120, 120, EE_MODEL); break; diff --git a/radio/src/gui/9x/view_telemetry.cpp b/radio/src/gui/9x/view_telemetry.cpp index 805813d72..816bc6d90 100644 --- a/radio/src/gui/9x/view_telemetry.cpp +++ b/radio/src/gui/9x/view_telemetry.cpp @@ -38,7 +38,7 @@ void displayRssiLine() lcdDrawSolidHorizontalLine(0, 55, 128, 0); // separator uint8_t rssi; #if !defined(CPUARM) - rssi = min((uint8_t)99, frskyData.rssi[1].value); + rssi = min((uint8_t)99, telemetryData.rssi[1].value); lcd_putsLeft(STATUS_BAR_Y, STR_TX); lcdDrawNumber(4*FW+1, STATUS_BAR_Y, rssi, LEADING0, 2); lcdDrawRect(BAR_LEFT+1, 57, 38, 7); lcdDrawFilledRect(BAR_LEFT+1, 58, 4*rssi/11, 5, (rssi < getRssiAlarmValue(0)) ? DOTTED : SOLID); @@ -59,17 +59,17 @@ void displayRssiLine() void displayGpsTime() { uint8_t att = (TELEMETRY_STREAMING() ? LEFT|LEADING0 : LEFT|LEADING0|BLINK); - lcdDrawNumber(CENTER_OFS+6*FW+7, STATUS_BAR_Y, frskyData.hub.hour, att, 2); + lcdDrawNumber(CENTER_OFS+6*FW+7, STATUS_BAR_Y, telemetryData.hub.hour, att, 2); lcdDrawChar(CENTER_OFS+8*FW+4, STATUS_BAR_Y, ':', att); - lcdDrawNumber(CENTER_OFS+9*FW+2, STATUS_BAR_Y, frskyData.hub.min, att, 2); + lcdDrawNumber(CENTER_OFS+9*FW+2, STATUS_BAR_Y, telemetryData.hub.min, att, 2); lcdDrawChar(CENTER_OFS+11*FW-1, STATUS_BAR_Y, ':', att); - lcdDrawNumber(CENTER_OFS+12*FW-3, STATUS_BAR_Y, frskyData.hub.sec, att, 2); + lcdDrawNumber(CENTER_OFS+12*FW-3, STATUS_BAR_Y, telemetryData.hub.sec, att, 2); lcdInvertLastLine(); } void displayGpsCoord(uint8_t y, char direction, int16_t bp, int16_t ap) { - if (frskyData.hub.gpsFix >= 0) { + if (telemetryData.hub.gpsFix >= 0) { if (!direction) direction = '-'; lcdDrawNumber(TELEM_2ND_COLUMN, y, bp / 100, LEFT); // ddd before '.' lcdDrawChar(lcdLastPos, y, '@'); @@ -107,9 +107,9 @@ void displayVoltageScreenLine(uint8_t y, uint8_t index) { drawStringWithIndex(0, y, STR_A, index+1, 0); if (TELEMETRY_STREAMING()) { - putsTelemetryChannelValue(3*FW+6*FW+4, y-FH, index+TELEM_A1-1, frskyData.analog[index].value, DBLSIZE); - lcdDrawChar(12*FW-1, y-FH, '<'); putsTelemetryChannelValue(17*FW, y-FH, index+TELEM_A1-1, frskyData.analog[index].min, NO_UNIT); - lcdDrawChar(12*FW, y, '>'); putsTelemetryChannelValue(17*FW, y, index+TELEM_A1-1, frskyData.analog[index].max, NO_UNIT); + putsTelemetryChannelValue(3*FW+6*FW+4, y-FH, index+TELEM_A1-1, telemetryData.analog[index].value, DBLSIZE); + lcdDrawChar(12*FW-1, y-FH, '<'); putsTelemetryChannelValue(17*FW, y-FH, index+TELEM_A1-1, telemetryData.analog[index].min, NO_UNIT); + lcdDrawChar(12*FW, y, '>'); putsTelemetryChannelValue(17*FW, y, index+TELEM_A1-1, telemetryData.analog[index].max, NO_UNIT); } } #endif @@ -142,10 +142,10 @@ void displayVoltagesScreen() break; #if defined(FRSKY_HUB) case FRSKY_VOLTS_SOURCE_FAS: - putsTelemetryChannelValue(3*FW+6*FW+4, FH, TELEM_VFAS-1, frskyData.hub.vfas, DBLSIZE); + putsTelemetryChannelValue(3*FW+6*FW+4, FH, TELEM_VFAS-1, telemetryData.hub.vfas, DBLSIZE); break; case FRSKY_VOLTS_SOURCE_CELLS: - putsTelemetryChannelValue(3*FW+6*FW+4, FH, TELEM_CELLS_SUM-1, frskyData.hub.cellsSum, DBLSIZE); + putsTelemetryChannelValue(3*FW+6*FW+4, FH, TELEM_CELLS_SUM-1, telemetryData.hub.cellsSum, DBLSIZE); break; #endif } @@ -159,13 +159,13 @@ void displayVoltagesScreen() break; #if defined(FRSKY_HUB) case FRSKY_CURRENT_SOURCE_FAS: - putsTelemetryChannelValue(3*FW+6*FW+4, 3*FH, TELEM_CURRENT-1, frskyData.hub.current, DBLSIZE); + putsTelemetryChannelValue(3*FW+6*FW+4, 3*FH, TELEM_CURRENT-1, telemetryData.hub.current, DBLSIZE); break; #endif } - putsTelemetryChannelValue(4, 5*FH, TELEM_POWER-1, frskyData.hub.power, LEFT|DBLSIZE); - putsTelemetryChannelValue(3*FW+4+4*FW+6*FW+FW, 5*FH, TELEM_CONSUMPTION-1, frskyData.hub.currentConsumption, DBLSIZE); + putsTelemetryChannelValue(4, 5*FH, TELEM_POWER-1, telemetryData.hub.power, LEFT|DBLSIZE); + putsTelemetryChannelValue(3*FW+4+4*FW+6*FW+FW, 5*FH, TELEM_CONSUMPTION-1, telemetryData.hub.currentConsumption, DBLSIZE); } else { displayVoltageScreenLine(analog > 0 ? 5*FH : 4*FH, analog ? 2-analog : 0); @@ -174,11 +174,11 @@ void displayVoltagesScreen() #if defined(FRSKY_HUB) // Cells voltage - if (frskyData.hub.cellsCount > 0) { + if (telemetryData.hub.cellsCount > 0) { uint8_t y = 1*FH; - for (uint8_t k=0; k 50) { g_eeGeneral.calib[i].mid = reusableBuffer.calib.midVals[i]; diff --git a/radio/src/gui/horus/menu_general_hardware.cpp b/radio/src/gui/horus/menu_general_hardware.cpp index 291da19f1..56a594c68 100644 --- a/radio/src/gui/horus/menu_general_hardware.cpp +++ b/radio/src/gui/horus/menu_general_hardware.cpp @@ -178,7 +178,7 @@ bool menuGeneralHardware(evt_t event) #endif case ITEM_SETUP_HW_BAT_CAL: - lcdDrawText(MENUS_MARGIN_LEFT, y, "Battery cal."); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BATT_CALIB); lcdDrawNumber(HW_SETTINGS_COLUMN, y, getBatteryVoltage(), attr|LEFT|PREC2, 0, NULL, "V"); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127); break; diff --git a/radio/src/gui/horus/menu_general_version.cpp b/radio/src/gui/horus/menu_general_version.cpp index 3acd45539..546bdd8b8 100644 --- a/radio/src/gui/horus/menu_general_version.cpp +++ b/radio/src/gui/horus/menu_general_version.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" +#include "opentx.h" bool menuGeneralVersion(evt_t event) { diff --git a/radio/src/gui/horus/menu_model_curves.cpp b/radio/src/gui/horus/menu_model_curves.cpp index 938edebcc..e5d3feabc 100644 --- a/radio/src/gui/horus/menu_model_curves.cpp +++ b/radio/src/gui/horus/menu_model_curves.cpp @@ -250,7 +250,7 @@ bool menuModelCurveOne(evt_t event) lcdDrawSolidFilledRect(point.x, CURVE_CENTER_Y-CURVE_SIDE_WIDTH, 2, 2*CURVE_SIDE_WIDTH+2, CURVE_CURSOR_COLOR); char text[5]; - strAppendUnsigned(text, points[i]); + strAppendSigned(text, points[i]); if (point.x >= CURVE_CENTER_X) { drawCurveVerticalScale(point.x-15); @@ -273,7 +273,7 @@ bool menuModelCurveOne(evt_t event) drawCurvePoint(point.x-3, point.y-4, CURVE_CURSOR_COLOR); - strAppendUnsigned(text, x); + strAppendSigned(text, x); drawCurveCoord(limit(CURVE_CENTER_X-CURVE_SIDE_WIDTH-1, point.x-CURVE_COORD_WIDTH/2, CURVE_CENTER_X+CURVE_SIDE_WIDTH-CURVE_COORD_WIDTH+1), CURVE_CENTER_Y+CURVE_SIDE_WIDTH+2, text, selectionMode==1); if (s_editMode > 0) { diff --git a/radio/src/gui/horus/menu_model_flightmodes.cpp b/radio/src/gui/horus/menu_model_flightmodes.cpp index 27912e0c2..1e58efca7 100644 --- a/radio/src/gui/horus/menu_model_flightmodes.cpp +++ b/radio/src/gui/horus/menu_model_flightmodes.cpp @@ -127,7 +127,7 @@ bool menuModelFlightModesAll(evt_t event) FlightModeData *p = flightModeAddress(k); - putsFlightMode(MENUS_MARGIN_LEFT, y, k+1, (getFlightMode()==k ? 0/*BOLD*/ : 0) | ((sub==k && menuHorizontalPosition<0) ? INVERS : 0)); + putsFlightMode(MENUS_MARGIN_LEFT, y, k+1, (getFlightMode()==k ? BOLD : 0) | ((sub==k && menuHorizontalPosition<0) ? INVERS : 0)); for (int j=0; j0) ? BLINK|INVERS : INVERS) : 0); diff --git a/radio/src/gui/horus/menu_model_logical_switches.cpp b/radio/src/gui/horus/menu_model_logical_switches.cpp index 7c98e1854..9b3f8e2b5 100644 --- a/radio/src/gui/horus/menu_model_logical_switches.cpp +++ b/radio/src/gui/horus/menu_model_logical_switches.cpp @@ -109,7 +109,7 @@ bool menuModelLogicalSwitches(evt_t event) // CSW name unsigned int sw = SWSRC_SW1+k; - putsSwitches(MENUS_MARGIN_LEFT, y, sw, (getSwitch(sw) ? 0/*BOLD*/ : 0) | ((sub==k && CURSOR_ON_LINE()) ? INVERS : 0)); + putsSwitches(MENUS_MARGIN_LEFT, y, sw, (getSwitch(sw) ? BOLD : 0) | ((sub==k && CURSOR_ON_LINE()) ? INVERS : 0)); // CSW func lcdDrawTextAtIndex(CSW_1ST_COLUMN, y, STR_VCSWFUNC, cs->func, horz==0 ? attr : 0); diff --git a/radio/src/gui/horus/menu_model_mixes.cpp b/radio/src/gui/horus/menu_model_mixes.cpp index 203c45ff2..fb2cfe776 100644 --- a/radio/src/gui/horus/menu_model_mixes.cpp +++ b/radio/src/gui/horus/menu_model_mixes.cpp @@ -162,7 +162,7 @@ enum MixFields { MIX_FIELD_COUNT }; -void gvarWeightItem(coord_t x, coord_t y, MixData *md, uint8_t attr, evt_t event) +void gvarWeightItem(coord_t x, coord_t y, MixData *md, LcdFlags attr, evt_t event) { u_int8int16_t weight; MD_WEIGHT_TO_UNION(md, weight); diff --git a/radio/src/gui/horus/menu_model_setup.cpp b/radio/src/gui/horus/menu_model_setup.cpp index ad58a0d36..cbca7041f 100644 --- a/radio/src/gui/horus/menu_model_setup.cpp +++ b/radio/src/gui/horus/menu_model_setup.cpp @@ -101,11 +101,11 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, evt_t event) { TimerData * timer = &g_model.timers[timerIdx]; if (attr && menuHorizontalPosition < 0) { - lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN-INVERT_HORZ_MARGIN, y-INVERT_VERT_MARGIN+1, 90+2*INVERT_HORZ_MARGIN, INVERT_LINE_HEIGHT, TEXT_INVERTED_BGCOLOR); + lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN-INVERT_HORZ_MARGIN, y-INVERT_VERT_MARGIN+1, 115+2*INVERT_HORZ_MARGIN, INVERT_LINE_HEIGHT, TEXT_INVERTED_BGCOLOR); } drawStringWithIndex(MENUS_MARGIN_LEFT, y, STR_TIMER, timerIdx+1); putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, (menuHorizontalPosition<=0 ? attr : 0)); - putsTimer(MODEL_SETUP_2ND_COLUMN+50, y, timer->start, (menuHorizontalPosition!=0 ? attr : 0)); + putsTimer(MODEL_SETUP_2ND_COLUMN+50, y, timer->start, (menuHorizontalPosition==1 ? attr|TIMEHOUR : TIMEHOUR)); if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: diff --git a/radio/src/gui/horus/screens_setup.cpp b/radio/src/gui/horus/screens_setup.cpp index b2971561e..f6ca654bb 100644 --- a/radio/src/gui/horus/screens_setup.cpp +++ b/radio/src/gui/horus/screens_setup.cpp @@ -487,18 +487,21 @@ bool menuScreenSetup(int index, evt_t event) currentContainer = currentScreen; bool needsOffsetCheck = (menuVerticalPosition != 0 || menuHorizontalPosition < 0); - const ZoneOption * options = currentScreen->getFactory()->getOptions(); - int optionsCount = getOptionsCount(options); - linesCount = ITEM_SCREEN_SETUP_LAYOUT_OPTION1 + optionsCount; - char title[] = "Main view X"; title[sizeof(title)-2] = '1' + index; menuPageCount = updateMainviewsMenu(); - uint8_t mstate_tab[2 + MAX_LAYOUT_OPTIONS] = { uint8_t(NAVIGATION_LINE_BY_LINE|uint8_t(countRegisteredLayouts-1)), ORPHAN_ROW }; + const ZoneOption * options = currentScreen->getFactory()->getOptions(); + int optionsCount = getOptionsCount(options); + linesCount = ITEM_SCREEN_SETUP_LAYOUT_OPTION1 + optionsCount; + if (menuPageCount > 3) + ++linesCount; + + uint8_t mstate_tab[2 + MAX_LAYOUT_OPTIONS + 1] = { uint8_t(NAVIGATION_LINE_BY_LINE|uint8_t(countRegisteredLayouts-1)), ORPHAN_ROW }; for (int i=0; igetOptionValue(index); + uint8_t o = k - ITEM_SCREEN_SETUP_LAYOUT_OPTION1; + if (o < optionsCount) { + const ZoneOption * option = &options[o]; + ZoneOptionValue * value = currentScreen->getOptionValue(o); if (editZoneOption(y, option, value, attr, EE_MODEL, event)) { currentScreen->update(); } } + else if (menuPageCount > 3 && o == optionsCount) { + drawButton(SCREENS_SETUP_2ND_COLUMN, y, STR_REMOVE_SCREEN, attr); + if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { + delete currentScreen; + if (index != MAX_CUSTOM_SCREENS-1) { + memmove(&g_model.screenData[index], &g_model.screenData[index + 1], sizeof(CustomScreenData) * (MAX_CUSTOM_SCREENS - index - 1)); + memmove(&customScreens[index], &customScreens[index + 1], sizeof(Layout *) * (MAX_CUSTOM_SCREENS - index - 1)); + } + memset(&g_model.screenData[MAX_CUSTOM_SCREENS-1], 0, sizeof(CustomScreenData)); + customScreens[MAX_CUSTOM_SCREENS-1] = NULL; + chainMenu(menuTabScreensSetup[index > 0 ? index : 1]); + return false; + } + } break; } } } - if (menuVerticalPosition == -1 && index > 0 && event == EVT_KEY_LONG(KEY_ENTER)) { - killEvents(KEY_ENTER); - menuHorizontalPosition = index; - POPUP_MENU_ADD_ITEM(STR_REMOVE_SCREEN); - popupMenuHandler = onScreenSetupMenu; - } - return true; } @@ -592,23 +602,10 @@ bool menuScreenAdd(evt_t event) if (event == EVT_KEY_BREAK(KEY_ENTER)) { customScreens[menuPageCount-2] = registeredLayouts[0]->create(&g_model.screenData[menuPageCount-2].layoutData); s_editMode = 0; + menuHorizontalPosition = -1; return false; } SIMPLE_MENU_WITH_OPTIONS("Add main view", LBM_SCREENS_SETUP_ICONS, menuTabScreensSetup, menuPageCount, menuPageCount-1, 0); return true; } - -void onScreenSetupMenu(const char * result) -{ - if (result == STR_REMOVE_SCREEN) { - delete customScreens[menuHorizontalPosition]; - if (menuHorizontalPosition != MAX_CUSTOM_SCREENS-1) { - memmove(&g_model.screenData[menuHorizontalPosition], &g_model.screenData[menuHorizontalPosition + 1], sizeof(CustomScreenData) * (MAX_CUSTOM_SCREENS - menuHorizontalPosition - 1)); - memmove(&customScreens[menuHorizontalPosition], &customScreens[menuHorizontalPosition + 1], sizeof(Layout *) * (MAX_CUSTOM_SCREENS - menuHorizontalPosition - 1)); - } - memset(&g_model.screenData[MAX_CUSTOM_SCREENS-1], 0, sizeof(CustomScreenData)); - customScreens[MAX_CUSTOM_SCREENS-1] = NULL; - // chainMenu(menuMainviews[menuHorizontalPosition > 0 ? menuHorizontalPosition-1 : 0]); - } -} diff --git a/radio/src/gui/horus/topbar.cpp b/radio/src/gui/horus/topbar.cpp index 073c8479e..3d9139817 100644 --- a/radio/src/gui/horus/topbar.cpp +++ b/radio/src/gui/horus/topbar.cpp @@ -28,7 +28,7 @@ unsigned int Topbar::getZonesCount() const Zone Topbar::getZone(unsigned int index) const { Zone zone; - zone.x = 50 + (TOPBAR_ZONE_WIDTH + 2*TOPBAR_ZONE_MARGIN) * index; + zone.x = 49 + (TOPBAR_ZONE_WIDTH + 2*TOPBAR_ZONE_MARGIN) * index; zone.y = TOPBAR_ZONE_MARGIN; zone.w = TOPBAR_ZONE_WIDTH; zone.h = MENU_HEADER_HEIGHT - 2*TOPBAR_ZONE_MARGIN; @@ -57,7 +57,7 @@ void drawTopBar() // USB icon if (usbPlugged()) { - lcdDrawBitmapPattern(LCD_W-102, 8, LBM_TOPMENU_USB, MENU_TITLE_COLOR); + lcdDrawBitmapPattern(LCD_W-98, 8, LBM_TOPMENU_USB, MENU_TITLE_COLOR); } // RSSI @@ -68,6 +68,26 @@ void drawTopBar() lcdDrawSolidFilledRect(LCD_W-90 + i * 6, 38 - height, 4, height, TELEMETRY_RSSI() >= rssiBarsValue[i] ? MENU_TITLE_COLOR : MENU_TITLE_DISABLE_COLOR); } + /* Audio volume */ + lcdDrawBitmapPattern(LCD_W-130, 4, LBM_TOPMENU_VOLUME_SCALE, MENU_TITLE_DISABLE_COLOR); + if (requiredSpeakerVolume == 0 || g_eeGeneral.beepMode == e_mode_quiet) + lcdDrawBitmapPattern(LCD_W-130, 4, LBM_TOPMENU_VOLUME_0, MENU_TITLE_COLOR); + else if (requiredSpeakerVolume < 7) + lcdDrawBitmapPattern(LCD_W-130, 4, LBM_TOPMENU_VOLUME_1, MENU_TITLE_COLOR); + else if (requiredSpeakerVolume < 13) + lcdDrawBitmapPattern(LCD_W-130, 4, LBM_TOPMENU_VOLUME_2, MENU_TITLE_COLOR); + else if (requiredSpeakerVolume < 19) + lcdDrawBitmapPattern(LCD_W-130, 4, LBM_TOPMENU_VOLUME_3, MENU_TITLE_COLOR); + else + lcdDrawBitmapPattern(LCD_W-130, 4, LBM_TOPMENU_VOLUME_4, MENU_TITLE_COLOR); + + /* Tx battery */ + uint8_t bars = limit(0, 6 * (g_vbat100mV - g_eeGeneral.vBatMin - 90) / (30 + g_eeGeneral.vBatMax - g_eeGeneral.vBatMin), 5); + lcdDrawBitmapPattern(LCD_W-130, 24, LBM_TOPMENU_TXBATT, MENU_TITLE_COLOR); + for (unsigned int i = 0; i < 5; i++) { + lcdDrawSolidFilledRect(LCD_W-122+4*i, 30, 2, 8, i >= bars ? MENU_TITLE_DISABLE_COLOR : MENU_TITLE_COLOR); + } + topbar->refresh(); #if 0 diff --git a/radio/src/gui/horus/topbar.h b/radio/src/gui/horus/topbar.h index 93d8aaadf..649074f60 100644 --- a/radio/src/gui/horus/topbar.h +++ b/radio/src/gui/horus/topbar.h @@ -25,7 +25,7 @@ #define MAX_TOPBAR_ZONES 5 #define MAX_TOPBAR_OPTIONS 0 -#define TOPBAR_ZONE_WIDTH 60 +#define TOPBAR_ZONE_WIDTH 70 #define TOPBAR_ZONE_MARGIN 3 class Topbar: public WidgetsContainer diff --git a/radio/src/gui/horus/view_main.cpp b/radio/src/gui/horus/view_main.cpp index a85cdebe7..a04ca2859 100644 --- a/radio/src/gui/horus/view_main.cpp +++ b/radio/src/gui/horus/view_main.cpp @@ -137,10 +137,6 @@ bool menuMainView(evt_t event) killEvents(KEY_DOWN); break; - case EVT_ENTRY_UP: - LOAD_MODEL_BITMAP(); - break; - case EVT_KEY_LONG(KEY_ENTER): killEvents(event); POPUP_MENU_ADD_ITEM(STR_MODEL_SELECT); @@ -157,17 +153,17 @@ bool menuMainView(evt_t event) case EVT_KEY_LONG(KEY_MODEL): killEvents(event); pushMenu(menuTabModel[0]); - break; + return false; case EVT_KEY_LONG(KEY_RADIO): killEvents(event); pushMenu(menuTabGeneral[0]); - break; + return false; case EVT_KEY_LONG(KEY_TELEM): killEvents(event); pushMenu(menuTabScreensSetup[1]); - break; + return false; case EVT_KEY_BREAK(KEY_PGDN): storageDirty(EE_GENERAL); diff --git a/radio/src/gui/horus/widgets/timer.cpp b/radio/src/gui/horus/widgets/timer.cpp index f7e433912..41137f721 100644 --- a/radio/src/gui/horus/widgets/timer.cpp +++ b/radio/src/gui/horus/widgets/timer.cpp @@ -45,8 +45,13 @@ void TimerWidget::refresh() TimerState & timerState = timersStates[index]; if (zone.w >= 180 && zone.h >= 70) { - lcdDrawBitmapPattern(zone.x, zone.y, LBM_TIMER_BACKGROUND, MAINVIEW_PANES_COLOR); - if (timerData.start) { + if (timerState.val >= 0 || !(timerState.val % 2)) { + lcdDrawBitmapPattern(zone.x, zone.y, LBM_TIMER_BACKGROUND, MAINVIEW_PANES_COLOR); + } + else { + lcdDrawBitmapPattern(zone.x, zone.y, LBM_TIMER_BACKGROUND, HEADER_BGCOLOR); + } + if (timerData.start && timerState.val >= 0) { lcdDrawBitmapPatternPie( zone.x + 2, zone.y + 3, LBM_RSCALE, MAINVIEW_GRAPHICS_COLOR, 0, @@ -67,21 +72,24 @@ void TimerWidget::refresh() drawStringWithIndex(zone.x + 137, zone.y + 17, "TMR", index + 1, SMLSIZE | TEXT_COLOR); } else { - drawStringWithIndex(zone.x, zone.y, "TMR", index + 1, SMLSIZE | TEXT_INVERTED_COLOR); + if (timerState.val < 0 && timerState.val % 2) { + lcdDrawSolidFilledRect(zone.x, zone.y, zone.w, zone.h, HEADER_ICON_BGCOLOR); + } + drawStringWithIndex(zone.x + 2, zone.y, "TMR", index + 1, SMLSIZE | TEXT_INVERTED_COLOR); if (zone.w > 100 && zone.h > 40) { if (abs(timerState.val) >= 3600) { - putsTimer(zone.x, zone.y + 16, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT | TIMEHOUR); + putsTimer(zone.x + 3, zone.y + 16, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT | TIMEHOUR); } else { - putsTimer(zone.x, zone.y + 16, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT | MIDSIZE); + putsTimer(zone.x + 3, zone.y + 16, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT | MIDSIZE); } } else { if (abs(timerState.val) >= 3600) { - putsTimer(zone.x, zone.y + 14, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT | SMLSIZE | TIMEHOUR); + putsTimer(zone.x + 3, zone.y + 14, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT | SMLSIZE | TIMEHOUR); } else { - putsTimer(zone.x, zone.y + 14, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT); + putsTimer(zone.x + 3, zone.y + 14, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT); } } } diff --git a/radio/src/gui/taranis/menu_model_custom_functions.cpp b/radio/src/gui/taranis/menu_model_custom_functions.cpp index f2d41fb4b..d0fdd2ae5 100644 --- a/radio/src/gui/taranis/menu_model_custom_functions.cpp +++ b/radio/src/gui/taranis/menu_model_custom_functions.cpp @@ -267,8 +267,8 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu lcdDrawTextAtIndex(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, "\004Int.Ext.", CFN_PARAM(cfn), attr); } else if (func == FUNC_SET_TIMER) { - val_max = 59*60+59; - putsTimer(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT, attr); + val_max = 539*60+59; //8:59:59 + putsTimer(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT|TIMEHOUR, attr); } else if (func == FUNC_PLAY_SOUND) { val_max = AU_SPECIAL_SOUND_LAST-AU_SPECIAL_SOUND_FIRST-1; diff --git a/radio/src/gui/taranis/menu_model_setup.cpp b/radio/src/gui/taranis/menu_model_setup.cpp index b62e980f3..08eafc445 100644 --- a/radio/src/gui/taranis/menu_model_setup.cpp +++ b/radio/src/gui/taranis/menu_model_setup.cpp @@ -122,9 +122,8 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, uint8_t event) TimerData * timer = &g_model.timers[timerIdx]; drawStringWithIndex(0*FW, y, STR_TIMER, timerIdx+1); putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, menuHorizontalPosition==0 ? attr : 0); - - putsTimer(MODEL_SETUP_2ND_COLUMN+5*FW-2+5*FWNUM+1, y, timer->start, menuHorizontalPosition==1 ? attr : 0, menuHorizontalPosition==2 ? attr : 0); - if (attr && menuHorizontalPosition < 0) lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN-1, y-1, LCD_W-MODEL_SETUP_2ND_COLUMN-MENUS_SCROLLBAR_WIDTH+1, FH+1); + putsTimer(MODEL_SETUP_2ND_COLUMN+5*FW-2+5*FWNUM+1, y, timer->start, menuHorizontalPosition==1 ? attr|TIMEHOUR : TIMEHOUR, menuHorizontalPosition==2 ? attr|TIMEHOUR : TIMEHOUR); + if (attr && menuHorizontalPosition < 0) lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN-1, y-1, 11*FW, FH+1); if (attr && s_editMode>0) { div_t qr = div(timer->start, 60); switch (menuHorizontalPosition) { @@ -148,13 +147,14 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, uint8_t event) break; } case 1: - CHECK_INCDEC_MODELVAR_ZERO(event, qr.quot, 59); + qr.quot = checkIncDec(event, qr.quot, 0, 1439, EE_MODEL | NO_INCDEC_MARKS); // 23h59 timer->start = qr.rem + qr.quot*60; break; case 2: qr.rem -= checkIncDecModel(event, qr.rem+2, 1, 62)-2; timer->start -= qr.rem ; if ((int16_t)timer->start < 0) timer->start=0; + if ((int32_t)timer->start > 86399) timer->start=86399; // 23h59:59 break; } } diff --git a/radio/src/gui/taranis/menu_model_telemetry.cpp b/radio/src/gui/taranis/menu_model_telemetry.cpp index 601cecbb4..e2950ad3e 100644 --- a/radio/src/gui/taranis/menu_model_telemetry.cpp +++ b/radio/src/gui/taranis/menu_model_telemetry.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" +#include "opentx.h" enum menuModelTelemetryItems { ITEM_TELEMETRY_PROTOCOL_TYPE, diff --git a/radio/src/gui/taranis/view_main.cpp b/radio/src/gui/taranis/view_main.cpp index 9d2cf4197..20ae019df 100644 --- a/radio/src/gui/taranis/view_main.cpp +++ b/radio/src/gui/taranis/view_main.cpp @@ -275,9 +275,11 @@ void displayTopBar() /* Audio volume */ if (requiredSpeakerVolume == 0 || g_eeGeneral.beepMode == e_mode_quiet) LCD_ICON(BAR_VOLUME_X, BAR_Y, ICON_SPEAKER0); - else if (requiredSpeakerVolume < 10) + else if (requiredSpeakerVolume <= 6) LCD_ICON(BAR_VOLUME_X, BAR_Y, ICON_SPEAKER1); - else if (requiredSpeakerVolume < 20) + else if (requiredSpeakerVolume <= 12) + LCD_ICON(BAR_VOLUME_X, BAR_Y, ICON_SPEAKER2); + else if (requiredSpeakerVolume <= 18) LCD_ICON(BAR_VOLUME_X, BAR_Y, ICON_SPEAKER2); else LCD_ICON(BAR_VOLUME_X, BAR_Y, ICON_SPEAKER3); diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index e9890c0f6..9efce60f1 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -234,9 +234,9 @@ void writeLogs() #if defined(FRSKY) #if !defined(CPUARM) - f_printf(&g_oLogFile, "%d,%d,%d,", frskyStreaming, RAW_FRSKY_MINMAX(frskyData.rssi[0]), RAW_FRSKY_MINMAX(frskyData.rssi[1])); + f_printf(&g_oLogFile, "%d,%d,%d,", telemetryStreaming, RAW_FRSKY_MINMAX(telemetryData.rssi[0]), RAW_FRSKY_MINMAX(telemetryData.rssi[1])); for (uint8_t i=0; i - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -31,7 +16,6 @@ * 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 diff --git a/radio/src/lua/api_lcd.cpp b/radio/src/lua/api_lcd.cpp index 862798c6c..62a07c169 100644 --- a/radio/src/lua/api_lcd.cpp +++ b/radio/src/lua/api_lcd.cpp @@ -1,27 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -31,7 +16,6 @@ * 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 diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp index d2e4dd691..f350630f9 100644 --- a/radio/src/lua/api_model.cpp +++ b/radio/src/lua/api_model.cpp @@ -1,27 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -31,7 +16,6 @@ * 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 diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index 42e446446..a75cc28b0 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -1,27 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -31,7 +16,6 @@ * 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 diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h index 5e93a3188..9aa231e22 100644 --- a/radio/src/lua/lua_api.h +++ b/radio/src/lua/lua_api.h @@ -1,27 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -31,7 +16,6 @@ * 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. - * */ #ifndef _LUA_API_H_ diff --git a/radio/src/maths.cpp b/radio/src/maths.cpp index a148d4764..118db0454 100644 --- a/radio/src/maths.cpp +++ b/radio/src/maths.cpp @@ -143,21 +143,21 @@ double gpsToDouble(bool neg, int16_t bp, int16_t ap) #if defined(FRSKY_HUB) && !defined(CPUARM) void extractLatitudeLongitude(uint32_t * latitude, uint32_t * longitude) { - div_t qr = div(frskyData.hub.gpsLatitude_bp, 100); - *latitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + frskyData.hub.gpsLatitude_ap) * 5) / 3; + div_t qr = div(telemetryData.hub.gpsLatitude_bp, 100); + *latitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + telemetryData.hub.gpsLatitude_ap) * 5) / 3; - qr = div(frskyData.hub.gpsLongitude_bp, 100); - *longitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + frskyData.hub.gpsLongitude_ap) * 5) / 3; + qr = div(telemetryData.hub.gpsLongitude_bp, 100); + *longitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + telemetryData.hub.gpsLongitude_ap) * 5) / 3; } void getGpsPilotPosition() { - extractLatitudeLongitude(&frskyData.hub.pilotLatitude, &frskyData.hub.pilotLongitude); - uint32_t lat = frskyData.hub.pilotLatitude / 10000; + extractLatitudeLongitude(&telemetryData.hub.pilotLatitude, &telemetryData.hub.pilotLongitude); + uint32_t lat = telemetryData.hub.pilotLatitude / 10000; uint32_t angle2 = (lat*lat) / 10000; uint32_t angle4 = angle2 * angle2; - frskyData.hub.distFromEarthAxis = 139*(((uint32_t)10000000-((angle2*(uint32_t)123370)/81)+(angle4/25))/12500); - // TRACE("frskyData.hub.distFromEarthAxis=%d", frskyData.hub.distFromEarthAxis); + telemetryData.hub.distFromEarthAxis = 139*(((uint32_t)10000000-((angle2*(uint32_t)123370)/81)+(angle4/25))/12500); + // TRACE("telemetryData.hub.distFromEarthAxis=%d", telemetryData.hub.distFromEarthAxis); } void getGpsDistance() @@ -166,21 +166,21 @@ void getGpsDistance() extractLatitudeLongitude(&lat, &lng); - // printf("lat=%d (%d), long=%d (%d)\n", lat, abs(lat - frskyData.hub.pilotLatitude), lng, abs(lng - frskyData.hub.pilotLongitude)); + // printf("lat=%d (%d), long=%d (%d)\n", lat, abs(lat - telemetryData.hub.pilotLatitude), lng, abs(lng - telemetryData.hub.pilotLongitude)); - uint32_t angle = (lat > frskyData.hub.pilotLatitude) ? lat - frskyData.hub.pilotLatitude : frskyData.hub.pilotLatitude - lat; + uint32_t angle = (lat > telemetryData.hub.pilotLatitude) ? lat - telemetryData.hub.pilotLatitude : telemetryData.hub.pilotLatitude - lat; uint32_t dist = EARTH_RADIUS * angle / 1000000; uint32_t result = dist*dist; - angle = (lng > frskyData.hub.pilotLongitude) ? lng - frskyData.hub.pilotLongitude : frskyData.hub.pilotLongitude - lng; - dist = frskyData.hub.distFromEarthAxis * angle / 1000000; + angle = (lng > telemetryData.hub.pilotLongitude) ? lng - telemetryData.hub.pilotLongitude : telemetryData.hub.pilotLongitude - lng; + dist = telemetryData.hub.distFromEarthAxis * angle / 1000000; result += dist*dist; dist = abs(TELEMETRY_BARO_ALT_AVAILABLE() ? TELEMETRY_RELATIVE_BARO_ALT_BP : TELEMETRY_RELATIVE_GPS_ALT_BP); result += dist*dist; - frskyData.hub.gpsDistance = isqrt32(result); - if (frskyData.hub.gpsDistance > frskyData.hub.maxGpsDistance) - frskyData.hub.maxGpsDistance = frskyData.hub.gpsDistance; + telemetryData.hub.gpsDistance = isqrt32(result); + if (telemetryData.hub.gpsDistance > telemetryData.hub.maxGpsDistance) + telemetryData.hub.maxGpsDistance = telemetryData.hub.gpsDistance; } #endif diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 0aa5b9f17..2fdb56b87 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -370,39 +370,39 @@ getvalue_t getValue(mixsrc_t i) } } #elif defined(FRSKY) - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RSSI_TX) return frskyData.rssi[1].value; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RSSI_RX) return frskyData.rssi[0].value; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_A1) return frskyData.analog[TELEM_ANA_A1].value; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_A2) return frskyData.analog[TELEM_ANA_A2].value; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RSSI_TX) return telemetryData.rssi[1].value; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RSSI_RX) return telemetryData.rssi[0].value; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_A1) return telemetryData.analog[TELEM_ANA_A1].value; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_A2) return telemetryData.analog[TELEM_ANA_A2].value; #if defined(FRSKY_SPORT) - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ALT) return frskyData.hub.baroAltitude; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ALT) return telemetryData.hub.baroAltitude; #elif defined(FRSKY_HUB) || defined(WS_HOW_HIGH) else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ALT) return TELEMETRY_RELATIVE_BARO_ALT_BP; #endif #if defined(FRSKY_HUB) - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RPM) return frskyData.hub.rpm; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_FUEL) return frskyData.hub.fuelLevel; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_T1) return frskyData.hub.temperature1; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_T2) return frskyData.hub.temperature2; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_RPM) return telemetryData.hub.rpm; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_FUEL) return telemetryData.hub.fuelLevel; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_T1) return telemetryData.hub.temperature1; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_T2) return telemetryData.hub.temperature2; else if (i==MIXSRC_FIRST_TELEM-1+TELEM_SPEED) return TELEMETRY_GPS_SPEED_BP; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_DIST) return frskyData.hub.gpsDistance; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_DIST) return telemetryData.hub.gpsDistance; else if (i==MIXSRC_FIRST_TELEM-1+TELEM_GPSALT) return TELEMETRY_RELATIVE_GPS_ALT_BP; else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CELL) return (int16_t)TELEMETRY_MIN_CELL_VOLTAGE; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CELLS_SUM) return (int16_t)frskyData.hub.cellsSum; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_VFAS) return (int16_t)frskyData.hub.vfas; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CURRENT) return (int16_t)frskyData.hub.current; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CONSUMPTION) return frskyData.hub.currentConsumption; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_POWER) return frskyData.hub.power; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ACCx) return frskyData.hub.accelX; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ACCy) return frskyData.hub.accelY; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ACCz) return frskyData.hub.accelZ; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_HDG) return frskyData.hub.gpsCourse_bp; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_VSPEED) return frskyData.hub.varioSpeed; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ASPEED) return frskyData.hub.airSpeed; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_DTE) return frskyData.hub.dTE; - else if (i<=MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1) return frskyData.analog[TELEM_ANA_A1].min; - else if (i==MIXSRC_FIRST_TELEM-1+TELEM_MIN_A2) return frskyData.analog[TELEM_ANA_A2].min; - else if (i<=MIXSRC_FIRST_TELEM-1+TELEM_CSW_MAX) return *(((int16_t*)(&frskyData.hub.minAltitude))+i-(MIXSRC_FIRST_TELEM-1+TELEM_MIN_ALT)); + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CELLS_SUM) return (int16_t)telemetryData.hub.cellsSum; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_VFAS) return (int16_t)telemetryData.hub.vfas; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CURRENT) return (int16_t)telemetryData.hub.current; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_CONSUMPTION) return telemetryData.hub.currentConsumption; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_POWER) return telemetryData.hub.power; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ACCx) return telemetryData.hub.accelX; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ACCy) return telemetryData.hub.accelY; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ACCz) return telemetryData.hub.accelZ; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_HDG) return telemetryData.hub.gpsCourse_bp; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_VSPEED) return telemetryData.hub.varioSpeed; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_ASPEED) return telemetryData.hub.airSpeed; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_DTE) return telemetryData.hub.dTE; + else if (i<=MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1) return telemetryData.analog[TELEM_ANA_A1].min; + else if (i==MIXSRC_FIRST_TELEM-1+TELEM_MIN_A2) return telemetryData.analog[TELEM_ANA_A2].min; + else if (i<=MIXSRC_FIRST_TELEM-1+TELEM_CSW_MAX) return *(((int16_t*)(&telemetryData.hub.minAltitude))+i-(MIXSRC_FIRST_TELEM-1+TELEM_MIN_ALT)); #endif #endif else return 0; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index dac1c4f38..dabb7ea2c 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -300,6 +300,8 @@ void generalDefault() #endif #if defined(CPUARM) + g_eeGeneral.ttsLanguage[0] = 'e'; + g_eeGeneral.ttsLanguage[1] = 'n'; g_eeGeneral.wavVolume = 2; g_eeGeneral.backgroundVolume = 1; #endif @@ -919,7 +921,7 @@ getvalue_t convert8bitsTelemValue(uint8_t channel, ls_telemetry_value_t value) #endif #if defined(FRSKY)&& !defined(CPUARM) -FORCEINLINE void convertUnit(getvalue_t & val, uint8_t & unit) +void convertUnit(getvalue_t & val, uint8_t & unit) { if (IS_IMPERIAL_ENABLE()) { if (unit == UNIT_TEMPERATURE) { @@ -2667,7 +2669,6 @@ int main() MCUCR = 0x80 ; // Must be done twice #elif defined(PCBSTD) uint8_t mcusr = MCUCSR; - MCUCSR = 0; MCUCSR = 0x80 ; // Disable JTAG port that can interfere with POT3 MCUCSR = 0x80 ; // Must be done twice #endif diff --git a/radio/src/opentx.h b/radio/src/opentx.h index b9da6c379..ee0f82bfc 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -222,8 +222,8 @@ #endif #if defined(SIMU) - #ifndef FORCEINLINE - #define FORCEINLINE + #if !defined(FORCEINLINE) + #define FORCEINLINE inline #endif #if !defined(NOINLINE) #define NOINLINE @@ -1301,29 +1301,11 @@ void evalFunctions(); extern volatile rotenc_t g_rotenc[1]; #endif -#if defined(CPUARM) - #include "telemetry/telemetry.h" -#endif - -#if defined (FRSKY) - // FrSky Telemetry - #include "telemetry/frsky.h" -#elif defined(JETI) - // Jeti-DUPLEX Telemetry - #include "telemetry/jeti.h" -#elif defined(ARDUPILOT) - // ArduPilot Telemetry - #include "telemetry/ardupilot.h" -#elif defined(NMEA) - // NMEA Telemetry - #include "telemetry/nmea.h" -#elif defined(MAVLINK) - // Mavlink Telemetry - #include "telemetry/mavlink.h" -#endif +#include "telemetry/telemetry.h" #if defined(CPUARM) -uint16_t crc16(uint8_t * buf, uint32_t len); +uint8_t crc8(const uint8_t * ptr, uint32_t len); +uint16_t crc16(const uint8_t * ptr, uint32_t len); #endif #define PLAY_REPEAT(x) (x) /* Range 0 to 15 */ diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 7dc7277b7..9a8fb4091 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -68,7 +68,7 @@ PACK(struct Dsm2PulsesData { }); #endif -#define CROSSFIRE_BAUDRATE 921600 +#define CROSSFIRE_BAUDRATE 400000 #define CROSSFIRE_FRAME_LEN 25 #define CROSSFIRE_CHANNELS_COUNT 16 PACK(struct CrossfirePulsesData { diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index 57f7c4201..c9adee146 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -524,7 +524,7 @@ int main(int argc,char **argv) #endif #if defined(FRSKY) && !defined(FRSKY_SPORT) - frskyStreaming = 1; + telemetryStreaming = 1; #endif printf("Model size = %d\n", (int)sizeof(g_model)); diff --git a/radio/src/storage/datacopy.cpp b/radio/src/storage/datacopy.cpp index 239db541d..6afc7fb06 100644 --- a/radio/src/storage/datacopy.cpp +++ b/radio/src/storage/datacopy.cpp @@ -1,4 +1,4 @@ -//This file was auto-generated by generate_datacopy.py script on Wed Mar 16 20:12:19 2016. Do not edit this file! +//This file was auto-generated by generate_datacopy.py script on Fri Mar 25 14:17:31 2016. Do not edit this file! @@ -77,6 +77,7 @@ void copyCustomFunctionData(A * dest, B * src) { dest->swtch = src->swtch; dest->func = src->func; + copyCustomFunctionData_all(&dest->all, &src->all); dest->active = src->active; } @@ -165,6 +166,24 @@ void copyFrSkyTelemetryData(A * dest, B * src) } } +template +void copyTelemetrySensor(A * dest, B * src) +{ + dest->id = src->id; + dest->instance = src->instance; + memcpy(dest->label, src->label, sizeof(dest->label)); + dest->type = src->type; + dest->unit = src->unit; + dest->prec = src->prec; + dest->autoOffset = src->autoOffset; + dest->filter = src->filter; + dest->logs = src->logs; + dest->persistent = src->persistent; + dest->onlyPositive = src->onlyPositive; + dest->subId = src->subId; + copyTelemetrySensor_custom(&dest->custom, &src->custom); +} + template void copyModuleData(A * dest, B * src) { @@ -305,3 +324,17 @@ void copyRadioData(A * dest, B * src) dest->potsConfig = src->potsConfig; } +template +void copyCustomFunctionData_all(A * dest, B * src) +{ + dest->val = src->val; + dest->mode = src->mode; + dest->param = src->param; +} + +template +void copyTelemetrySensor_custom(A * dest, B * src) +{ + dest->ratio = src->ratio; + dest->offset = src->offset; +} diff --git a/radio/src/storage/rambackup.cpp b/radio/src/storage/rambackup.cpp index d61c8e4ea..b5a57c832 100644 --- a/radio/src/storage/rambackup.cpp +++ b/radio/src/storage/rambackup.cpp @@ -34,11 +34,6 @@ PACK(struct RamBackupUncompressed { Backup::RamBackupUncompressed ramBackupUncompressed __DMA; -PACK(struct RamBackup { - uint16_t size; - uint8_t data[4094]; -}); - #if defined(SIMU) RamBackup _ramBackup; RamBackup * ramBackup = &_ramBackup; @@ -52,15 +47,6 @@ void rambackupWrite() copyModelData(&ramBackupUncompressed.model, &g_model); ramBackup->size = compress(ramBackup->data, 4094, (const uint8_t *)&ramBackupUncompressed, sizeof(ramBackupUncompressed)); TRACE("RamBackupWrite sdsize=%d backupsize=%d rlcsize=%d", sizeof(ModelData)+sizeof(RadioData), sizeof(Backup::RamBackupUncompressed), ramBackup->size); - -#if 0 - // TODO move this code to non regression tests - Backup::RamBackupUncompressed ramBackupRestored; - if (uncompress((uint8_t *)&ramBackupRestored, sizeof(ramBackupRestored), ramBackup->data, ramBackup->size) != sizeof(ramBackupUncompressed)) - TRACE("ERROR uncompress"); - if (memcmp(&ramBackupUncompressed, &ramBackupRestored, sizeof(ramBackupUncompressed)) != 0) - TRACE("ERROR restore"); -#endif } bool rambackupRestore() diff --git a/radio/src/storage/sdcard_raw.h b/radio/src/storage/sdcard_raw.h index d5a21b461..0043a2970 100644 --- a/radio/src/storage/sdcard_raw.h +++ b/radio/src/storage/sdcard_raw.h @@ -30,4 +30,11 @@ const char * readModel(const char * filename, uint8_t * buffer, uint32_t size); const char * loadModel(const char * filename); const char * createModel(); +PACK(struct RamBackup { + uint16_t size; + uint8_t data[4094]; +}); + +extern RamBackup * ramBackup; + #endif // _SDCARD_RAW_H_ diff --git a/radio/src/targets/9x/board_stock.cpp b/radio/src/targets/9x/board_stock.cpp index 05d39fca2..64824144f 100644 --- a/radio/src/targets/9x/board_stock.cpp +++ b/radio/src/targets/9x/board_stock.cpp @@ -1,23 +1,23 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * 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. - */ - +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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" #if defined(ROTARY_ENCODER_NAVIGATION) @@ -279,7 +279,7 @@ uint8_t trimDown(uint8_t idx) return trimHelper(~PIND, idx); } -FORCEINLINE void readKeysAndTrims() +void readKeysAndTrims() { uint8_t enuk = KEY_MENU; diff --git a/radio/src/targets/9x/voice.cpp b/radio/src/targets/9x/voice.cpp index ca5b1aac4..d122a65ca 100644 --- a/radio/src/targets/9x/voice.cpp +++ b/radio/src/targets/9x/voice.cpp @@ -1,24 +1,24 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * 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" +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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" struct t_voice Voice ; diff --git a/radio/src/targets/common_avr/telemetry_driver.cpp b/radio/src/targets/common_avr/telemetry_driver.cpp index 2388f3794..3fa60635c 100644 --- a/radio/src/targets/common_avr/telemetry_driver.cpp +++ b/radio/src/targets/common_avr/telemetry_driver.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" +#include "opentx.h" #if defined(FRSKY) @@ -33,9 +33,6 @@ void telemetryEnableRx(void) UCSRB_N(TLM_USART) |= (1 << RXCIE_N(TLM_USART)); // enable Interrupt } -void processSerialData(uint8_t data); -extern uint8_t frskyRxBufferCount; // TODO not driver, change name - ISR(USART_RX_vect_N(TLM_USART)) { uint8_t stat; @@ -79,10 +76,10 @@ ISR(USART_RX_vect_N(TLM_USART)) if (stat & ((1 << FE_N(TLM_USART)) | (1 << DOR_N(TLM_USART)) | (1 << UPE_N(TLM_USART)))) { // discard buffer and start fresh on any comms error - frskyRxBufferCount = 0; + telemetryRxBufferCount = 0; } else { - processSerialData(data); + processFrskyTelemetryData(data); } cli() ; diff --git a/radio/src/targets/gruvin9x/board_gruvin9x.cpp b/radio/src/targets/gruvin9x/board_gruvin9x.cpp index 75dc10ff4..772039990 100644 --- a/radio/src/targets/gruvin9x/board_gruvin9x.cpp +++ b/radio/src/targets/gruvin9x/board_gruvin9x.cpp @@ -164,7 +164,7 @@ void pwrOff() #endif } -FORCEINLINE uint8_t keyDown() +uint8_t keyDown() { return ((~PINL) & 0x3F) || ROTENC_DOWN(); } @@ -240,7 +240,7 @@ uint8_t trimDown(uint8_t idx) return (in & pgm_read_byte(crossTrim+idx)); } -FORCEINLINE void readKeysAndTrims() +void readKeysAndTrims() { uint8_t enuk = KEY_MENU; diff --git a/radio/src/targets/horus/adc_driver.cpp b/radio/src/targets/horus/adc_driver.cpp index 1d8c8f158..b8f0f9bcb 100644 --- a/radio/src/targets/horus/adc_driver.cpp +++ b/radio/src/targets/horus/adc_driver.cpp @@ -45,7 +45,7 @@ static void ADS7952_Init() 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_50MHz; + 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; @@ -54,7 +54,7 @@ static void ADS7952_Init() 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_50MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(ADC_SPI_GPIO, &GPIO_InitStructure); diff --git a/radio/src/targets/horus/audio_driver.cpp b/radio/src/targets/horus/audio_driver.cpp index 28147dd9a..a0cb14262 100644 --- a/radio/src/targets/horus/audio_driver.cpp +++ b/radio/src/targets/horus/audio_driver.cpp @@ -84,7 +84,7 @@ void audioSpiInit(void) SPI_InitTypeDef SPI_InitStructure; GPIO_InitStructure.GPIO_Pin = AUDIO_SPI_MISO_GPIO_PIN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + 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; diff --git a/radio/src/targets/horus/board_horus.cpp b/radio/src/targets/horus/board_horus.cpp index f930c45bf..5cbaf2d12 100644 --- a/radio/src/targets/horus/board_horus.cpp +++ b/radio/src/targets/horus/board_horus.cpp @@ -270,5 +270,5 @@ void checkTrainerSettings() uint16_t getBatteryVoltage() { int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose - return (uint16_t)((instant_vbat * (1000 + g_eeGeneral.txVoltageCalibration) ) / 1637); + return (uint16_t)((instant_vbat * (1000 + g_eeGeneral.txVoltageCalibration) ) / 1629); } diff --git a/radio/src/targets/horus/haptic_driver.cpp b/radio/src/targets/horus/haptic_driver.cpp index a097575c8..f989834ae 100644 --- a/radio/src/targets/horus/haptic_driver.cpp +++ b/radio/src/targets/horus/haptic_driver.cpp @@ -38,7 +38,7 @@ void hapticInit(void) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = HAPTIC_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(HAPTIC_GPIO, &GPIO_InitStructure); diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp index 4bb75a3f3..ac2dc2aa6 100644 --- a/radio/src/targets/horus/keys_driver.cpp +++ b/radio/src/targets/horus/keys_driver.cpp @@ -195,7 +195,7 @@ void keysInit() { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp index afea6185e..e48882b21 100644 --- a/radio/src/targets/horus/lcd_driver.cpp +++ b/radio/src/targets/horus/lcd_driver.cpp @@ -75,7 +75,7 @@ static void LCD_AF_GPIOConfig(void) GPIO_PinAFConfig(GPIOI,GPIO_PinSource14,GPIO_AF_LTDC); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14; - GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; + 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; @@ -113,7 +113,7 @@ static void LCD_AF_GPIOConfig(void) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 ; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + 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; @@ -125,7 +125,7 @@ static void LCD_Backlight_Config(void) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = LCD_GPIO_PIN_BL; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(LCD_GPIO_BL, &GPIO_InitStructure); @@ -137,7 +137,7 @@ static void LCD_NRSTConfig(void) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = LCD_GPIO_PIN_NRST; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(LCD_GPIO_NRST, &GPIO_InitStructure); diff --git a/radio/src/targets/horus/led_driver.cpp b/radio/src/targets/horus/led_driver.cpp index 037827c47..e9e5ddeb0 100644 --- a/radio/src/targets/horus/led_driver.cpp +++ b/radio/src/targets/horus/led_driver.cpp @@ -25,7 +25,7 @@ void ledOn() GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(LED_GPIO, &GPIO_InitStructure); @@ -36,7 +36,7 @@ void ledOff() GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(LED_GPIO, &GPIO_InitStructure); diff --git a/radio/src/targets/horus/pulses_driver.cpp b/radio/src/targets/horus/pulses_driver.cpp index f65565bc5..3db61e347 100644 --- a/radio/src/targets/horus/pulses_driver.cpp +++ b/radio/src/targets/horus/pulses_driver.cpp @@ -131,7 +131,7 @@ static void intmoduleNoneStart() GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = INTMODULE_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(INTMODULE_TX_GPIO, &GPIO_InitStructure); @@ -217,7 +217,7 @@ static void extmoduleNoneStart() GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = EXTMODULE_PPM_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(EXTMODULE_PPM_GPIO, &GPIO_InitStructure); @@ -261,7 +261,7 @@ static void extmoduleCrossfireStart() GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = EXTMODULE_PPM_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(EXTMODULE_PPM_GPIO, &GPIO_InitStructure); @@ -314,7 +314,7 @@ void intmodulePxxStart() GPIO_InitStructure.GPIO_Pin = INTMODULE_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(INTMODULE_TX_GPIO, &GPIO_InitStructure); @@ -372,7 +372,7 @@ void extmodulePxxStart() GPIO_PinAFConfig(EXTMODULE_PPM_GPIO, EXTMODULE_PPM_GPIO_PinSource, EXTMODULE_PPM_GPIO_AF); GPIO_InitStructure.GPIO_Pin = EXTMODULE_PPM_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(EXTMODULE_PPM_GPIO, &GPIO_InitStructure); @@ -432,7 +432,7 @@ static void extmoduleDsm2Start() GPIO_PinAFConfig(EXTMODULE_PPM_GPIO, EXTMODULE_PPM_GPIO_PinSource, EXTMODULE_PPM_GPIO_AF); GPIO_InitStructure.GPIO_Pin = EXTMODULE_PPM_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(EXTMODULE_PPM_GPIO, &GPIO_InitStructure); @@ -490,7 +490,7 @@ static void extmodulePpmStart() GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = EXTMODULE_PPM_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(EXTMODULE_PPM_GPIO, &GPIO_InitStructure); diff --git a/radio/src/targets/horus/pwr_driver.cpp b/radio/src/targets/horus/pwr_driver.cpp index 8cf940775..c711acdda 100644 --- a/radio/src/targets/horus/pwr_driver.cpp +++ b/radio/src/targets/horus/pwr_driver.cpp @@ -26,7 +26,7 @@ void pwrInit() GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = PWR_ON_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(PWR_GPIO, &GPIO_InitStructure); @@ -64,7 +64,7 @@ void pwrOff() GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = AUDIO_SHUTDOWN_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(AUDIO_SHUTDOWN_GPIO, &GPIO_InitStructure); @@ -100,7 +100,7 @@ void pwrResetHandler() GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = PWR_ON_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(PWR_GPIO, &GPIO_InitStructure); diff --git a/radio/src/targets/horus/serial2_driver.cpp b/radio/src/targets/horus/serial2_driver.cpp index 7cb617592..d849d62c0 100644 --- a/radio/src/targets/horus/serial2_driver.cpp +++ b/radio/src/targets/horus/serial2_driver.cpp @@ -36,7 +36,7 @@ void uart3Setup(unsigned int baudrate, bool dma) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(SERIAL_GPIO, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = baudrate; diff --git a/radio/src/targets/horus/system_stm32f4xx.c b/radio/src/targets/horus/system_stm32f4xx.c index 3ec7176f5..5c609ffac 100644 --- a/radio/src/targets/horus/system_stm32f4xx.c +++ b/radio/src/targets/horus/system_stm32f4xx.c @@ -17,6 +17,116 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ + +/** + ****************************************************************************** + * @file system_stm32f4xx.c + * @author MCD Application Team + * @version V1.1.0 + * @date 25-March-2016 + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * This file contains the system clock configuration for STM32F4xx devices, + * and is generated by the clock configuration tool + * stm32f4xx_Clock_Configuration_V1.1.0.xls + * + * 1. This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier + * and Divider factors, AHB/APBx prescalers and Flash settings), + * depending on the configuration made in the clock xls tool. + * This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * 2. After each device reset the HSI (16 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32f4xx.s" file, to + * configure the system clock before to branch to main program. + * + * 3. If the system clock source selected by user fails to startup, the SystemInit() + * function will do nothing and HSI still used as system clock source. User can + * add some code to deal with this issue inside the SetSysClock() function. + * + * 4. The default value of HSE crystal is set to 25MHz, refer to "HSE_VALUE" define + * in "stm32f4xx.h" file. When HSE is used as system clock source, directly or + * through PLL, and you are using different crystal you have to adapt the HSE + * value to your own configuration. + * + * 5. This file configures the system clock as follows: + *============================================================================= + *============================================================================= + * Supported STM32F40xx/41xx/427x/437x devices + *----------------------------------------------------------------------------- + * System Clock source | PLL (HSE) + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 168000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 168000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 4 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 2 + *----------------------------------------------------------------------------- + * HSE Frequency(Hz) | 12000000 + *----------------------------------------------------------------------------- + * PLL_M | 12 + *----------------------------------------------------------------------------- + * PLL_N | 336 + *----------------------------------------------------------------------------- + * PLL_P | 2 + *----------------------------------------------------------------------------- + * PLL_Q | 7 + *----------------------------------------------------------------------------- + * PLLI2S_N | NA + *----------------------------------------------------------------------------- + * PLLI2S_R | NA + *----------------------------------------------------------------------------- + * I2S input clock | NA + *----------------------------------------------------------------------------- + * VDD(V) | 3.3 + *----------------------------------------------------------------------------- + * Main regulator output voltage | Scale1 mode + *----------------------------------------------------------------------------- + * Flash Latency(WS) | 5 + *----------------------------------------------------------------------------- + * Prefetch Buffer | ON + *----------------------------------------------------------------------------- + * Instruction cache | ON + *----------------------------------------------------------------------------- + * Data cache | ON + *----------------------------------------------------------------------------- + * Require 48MHz for USB OTG FS, | Enabled + * SDIO and RNG clock | + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ /** @addtogroup CMSIS * @{ @@ -89,7 +199,7 @@ * @{ */ - uint32_t SystemCoreClock = 180000000; + uint32_t SystemCoreClock = 168000000; __I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; @@ -316,7 +426,7 @@ static void SetSysClock(void) } /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ - FLASH->ACR = FLASH_ACR_PRFTEN |FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; + FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; /* Select the main PLL as system clock source */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index 5edd40fca..20d33883c 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -46,7 +46,7 @@ void telemetryPortInit(uint32_t baudrate) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(TELEMETRY_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = TELEMETRY_DIR_GPIO_PIN; diff --git a/radio/src/targets/horus/trainer_driver.cpp b/radio/src/targets/horus/trainer_driver.cpp index 0df472d99..f78c50d54 100644 --- a/radio/src/targets/horus/trainer_driver.cpp +++ b/radio/src/targets/horus/trainer_driver.cpp @@ -196,7 +196,7 @@ void init_sbus_on_heartbeat_capture() GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 100000; diff --git a/radio/src/targets/horus/usb_bsp.c b/radio/src/targets/horus/usb_bsp.c index 27e31e9f7..a1a2fe25e 100644 --- a/radio/src/targets/horus/usb_bsp.c +++ b/radio/src/targets/horus/usb_bsp.c @@ -1,29 +1,29 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * 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. - */ - +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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. + */ + /* Includes ------------------------------------------------------------------*/ #include "usb_bsp.h" -#include "../horus/board_horus.h" -#include "../horus/usbd_conf.h" +#include "board_horus.h" +#include "usbd_conf.h" extern uint32_t SystemCoreClock; @@ -42,7 +42,7 @@ void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) /* Configure DM and DP Pins */ GPIO_InitStructure.GPIO_Pin = USB_GPIO_PIN_DM | USB_GPIO_PIN_DP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; @@ -53,7 +53,7 @@ void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) /* Configure VBUS Pin */ GPIO_InitStructure.GPIO_Pin = USB_GPIO_PIN_VBUS; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; diff --git a/radio/src/targets/horus/usb_driver.c b/radio/src/targets/horus/usb_driver.c index c0ccf50d0..92905ecf9 100644 --- a/radio/src/targets/horus/usb_driver.c +++ b/radio/src/targets/horus/usb_driver.c @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../horus/board_horus.h" +#include "board_horus.h" #include "STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc/usb_dcd_int.h" int usbPlugged(void) diff --git a/radio/src/targets/horus/usbd_cdc.cpp b/radio/src/targets/horus/usbd_cdc.cpp index 149868c00..daaa70cfb 100644 --- a/radio/src/targets/horus/usbd_cdc.cpp +++ b/radio/src/targets/horus/usbd_cdc.cpp @@ -1,28 +1,28 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * 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. - */ - +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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. + */ + #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED #pragma data_alignment = 4 #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -#include "../../opentx.h" +#include "opentx.h" extern "C" { diff --git a/radio/src/targets/horus/usbd_conf.h b/radio/src/targets/horus/usbd_conf.h index d17d4742e..5dcfeeb45 100644 --- a/radio/src/targets/horus/usbd_conf.h +++ b/radio/src/targets/horus/usbd_conf.h @@ -1,29 +1,29 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * 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. - */ - +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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. + */ + /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef _USBD_CONF_H_ -#define _USBD_CONF_H_ +#ifndef _USBD_CONF_H_ +#define _USBD_CONF_H_ /* Includes ------------------------------------------------------------------*/ -#include "../horus/usb_conf.h" +#include "usb_conf.h" #define USBD_CFG_MAX_NUM 1 #define USBD_ITF_MAX_NUM 1 @@ -57,7 +57,7 @@ #define APP_RX_DATA_SIZE 512 // USB serial port output buffer. TODO: tune this buffer size /* Total size of IN buffer: APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL */ #define APP_FOPS VCP_fops -#endif // _USBD_CONF_H_ +#endif // _USBD_CONF_H_ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/radio/src/targets/mega2560/board_mega2560.cpp b/radio/src/targets/mega2560/board_mega2560.cpp index 1496e3f60..8b2e63437 100644 --- a/radio/src/targets/mega2560/board_mega2560.cpp +++ b/radio/src/targets/mega2560/board_mega2560.cpp @@ -87,7 +87,7 @@ void pwrOff() PORTH &= ~0x10; // PortH-4 set to 0 } -FORCEINLINE uint8_t keyDown() +uint8_t keyDown() { return ((~PINL) & 0x3F) || ROTENC_DOWN(); } @@ -165,7 +165,7 @@ uint8_t trimDown(uint8_t idx) return (in & pgm_read_byte(crossTrim+idx)); } -FORCEINLINE void readKeysAndTrims() +void readKeysAndTrims() { uint8_t enuk = KEY_MENU; diff --git a/radio/src/targets/simu/CMakeLists.txt b/radio/src/targets/simu/CMakeLists.txt index ad2c7034d..b917969f8 100644 --- a/radio/src/targets/simu/CMakeLists.txt +++ b/radio/src/targets/simu/CMakeLists.txt @@ -7,21 +7,26 @@ set(SIMU_SRC ${SIMU_SRC} simpgmspace.cpp) add_definitions(-DSIMU) remove_definitions(-DCLI) +if(SDL_FOUND) + include_directories(${SDL_INCLUDE_DIR}) + add_definitions(-DSIMU_AUDIO) + add_definitions(-DJOYSTICKS) +endif() + if(Qt5Widgets_FOUND) - string(TOLOWER ${TRANSLATIONS} TRANSLATION_LOWERCASE) - set(SIMULATOR_FLAVOUR opentx-${FLAVOUR}-${TRANSLATION_LOWERCASE}) + set(SIMULATOR_FLAVOUR opentx-${FLAVOUR}) set(SIMULATOR_TARGET ${SIMULATOR_FLAVOUR}-simulator) add_definitions(-DSIMULATOR_FLAVOUR="${SIMULATOR_FLAVOUR}") include_directories(${COMPANION_SRC_DIRECTORY} ${COMPANION_SRC_DIRECTORY}/simulation) add_library(${SIMULATOR_TARGET} SHARED ${SIMU_SRC} opentxsimulator.cpp) add_dependencies(${SIMULATOR_TARGET} ${FIRMWARE_DEPENDENCIES}) + target_link_libraries(${SIMULATOR_TARGET} ${SDL_LIBRARY}) qt5_use_modules(${SIMULATOR_TARGET} Core) - add_custom_target(opentx-simulator DEPENDS ${SIMULATOR_TARGET}) + add_custom_target(libsimulator DEPENDS ${SIMULATOR_TARGET}) endif() if(MSVC) set(CMAKE_CXX_FLAGS "/EHsc /LD") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /FORCE:MULTIPLE") include_directories(${PROJECT_SOURCE_DIR}/winbuild C:/Programs/pthreads/Pre-built.2/include C:/Programs/msinttypes C:/Programs/dirent/include) target_link_libraries(${SIMULATOR_TARGET} PRIVATE C:/Programs/pthreads/Pre-built.2/lib/pthreadVC2.lib) else() @@ -32,7 +37,7 @@ if(NOT WIN32) add_executable(simu WIN32 ${SIMU_SRC} ../../simu.cpp) add_dependencies(simu ${FIRMWARE_DEPENDENCIES}) target_include_directories(simu PUBLIC /usr/local/include/fox-1.6 PUBLIC /usr/include/fox-1.6 /opt/local/include/fox-1.6) - target_link_libraries(simu FOX-1.6 pthread) + target_link_libraries(simu FOX-1.6 pthread ${SDL_LIBRARY}) endif() if(APPLE) diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index d79130eae..a8fee3ef4 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -38,7 +38,7 @@ #include #endif -uint8_t MCUCSR, MCUSR; +uint8_t MCUCSR, MCUSR, MCUCR; volatile uint8_t pina=0xff, pinb=0xff, pinc=0xff, pind, pine=0xff, pinf=0xff, ping=0xff, pinh=0xff, pinj=0, pinl=0; uint8_t portb, portc, porth=0, dummyport; uint16_t dummyport16; @@ -880,7 +880,7 @@ FRESULT f_opendir (DIR * rep, const TCHAR * name) FRESULT f_closedir (DIR * rep) { TRACE("f_closedir(%p)", rep); - simu::closedir((simu::DIR *)rep->fs); + if (rep->fs) simu::closedir((simu::DIR *)rep->fs); return FR_OK; } diff --git a/radio/src/targets/simu/simpgmspace.h b/radio/src/targets/simu/simpgmspace.h index 647c73115..b72e5681f 100644 --- a/radio/src/targets/simu/simpgmspace.h +++ b/radio/src/targets/simu/simpgmspace.h @@ -328,6 +328,10 @@ extern void rxPdcUsart( void (*pChProcess)(uint8_t x) ); #define ISR(x, ...) void x() +#if !defined(WIN32) && defined(__GNUC__) +#define asm(...) +#endif + #if defined(CPUARM) extern uint32_t Master_frequency; #define NVIC_EnableIRQ(x) @@ -396,7 +400,7 @@ extern OS_MutexID audioMutex; #define WDRF 0 void * simuMain(void * args = NULL); -extern uint8_t MCUCSR, MCUSR; +extern uint8_t MCUCSR, MCUSR, MCUCR; typedef unsigned int U32; typedef unsigned long long U64; diff --git a/radio/src/targets/taranis/bootloader/Makefile b/radio/src/targets/taranis/bootloader/Makefile deleted file mode 100644 index 80b9a7479..000000000 --- a/radio/src/targets/taranis/bootloader/Makefile +++ /dev/null @@ -1,342 +0,0 @@ -# -# !!!! Do NOT edit this makefile with an editor which replace tabs by spaces !!!! -# -############################################################################################## -# -# On command line: -# -# make all = Create project -# -# make clean = Clean project files. -# -# To rebuild project do "make clean" and "make all". -# - -############################################################################################## -# Start of default section -# - -TRGT = arm-none-eabi- -CC = $(TRGT)gcc -CP = $(TRGT)objcopy -CLSS = $(TRGT)objdump -AS = $(TRGT)as -#gcc -x assembler-with-cpp -BIN = $(CP) -O ihex -BINX = $(CP) -O binary - -OBJDIR = . - -THIRDPARTY = ../../../thirdparty -FATFSDIR = $(THIRDPARTY)/FatFs - -ifeq ($(PCBREV), REV9E) - MCU = cortex-m4 - STM32LIBPATH = $(THIRDPARTY)/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries -else - MCU = cortex-m3 - STM32LIBPATH = $(THIRDPARTY)/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries -endif - -# List all default C defines here, like -D_DEBUG=1 -DDEFS = - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -MEMORIES = sram - -EXT = STD - -# -# End of default section -############################################################################################## - -############################################################################################## -# Start of user section -# - -# -# Define project name and Ram/Flash mode here -PROJECT = bootloader - -ifeq ($(PCB), TARANIS) -RUN_FROM_FLASH = 0 - else - ifeq ($(PCB), X9D) - RUN_FROM_FLASH = 0 - else - RUN_FROM_FLASH = 1 - endif -endif - -# PCB revision -PCBREV = - -EXTRAINCDIRS = $(THIRDPARTY) $(FATFSDIR) $(FATFSDIR)/option - -STM32USBPATH = ../../../thirdparty/STM32_USB-Host-Device_Lib_V2.1.0/Libraries - -# -# Define linker script file here -# -ifeq ($(PCB), TARANIS) - ARCH = ARM - LDSCRIPT = ../stm32_ramboot.ld - TRGT = arm-none-eabi- - CPPDEFS += -DHSE_VALUE=12000000 - CPPDEFS += -DPCBTARANIS -DEEPROM_RLC -DUSB_MASS_STORAGE - FULL_PRJ = $(PROJECT)_ramBoot - ifeq ($(PCBREV), REV9E) - CPPDEFS += -DSTM32F40_41xxx - EXTRAINCDIRS += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/inc - EXTRAINCDIRS += $(STM32LIBPATH)/CMSIS/Device/ST/STM32F4xx/Include - EXTRAINCDIRS += $(STM32LIBPATH)/CMSIS/Include - else - EXTRAINCDIRS += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/inc - EXTRAINCDIRS += $(STM32LIBPATH)/CMSIS/Device/ST/STM32F2xx/Include - EXTRAINCDIRS += $(STM32LIBPATH)/CMSIS/include - endif - EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_OTG_Driver/inc - EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Core/inc - EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/inc - EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/hid/inc - EXTRAINCDIRS += $(STM32USBPATH)/STM32_USB_Device_Library/Class/cdc/inc - EXTRAINCDIRS += .. ../../.. ../../../fonts/std - ifeq ($(PCBREV), REV4a) - CPPDEFS += -DREV4a - else ifeq ($(PCBREV), REVPLUS) - CPPDEFS += -DREVPLUS - HAPTIC = YES - else ifeq ($(PCBREV), REV9E) - CPPDEFS += -DREVPLUS -DREV9E - HAPTIC = YES - else - CPPDEFS += -DREV4 - endif -endif - -# List all user C define here, like -D_DEBUG=1 - -# Define ASM defines here -UADEFS = - -SRC = - -ifeq ($(PCBREV), REV9E) - SRC += ../system_stm32f4xx.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_spi.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_i2c.c - SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/misc.c -else - SRC += ../system_stm32f2xx.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_rcc.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_gpio.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_spi.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_i2c.c - SRC += $(STM32LIBPATH)/STM32F2xx_StdPeriph_Driver/src/misc.c -endif - -SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_core.c -SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_dcd.c -SRC += $(STM32USBPATH)/STM32_USB_OTG_Driver/src/usb_dcd_int.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_core.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_ioreq.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Core/src/usbd_req.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_scsi.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c -SRC += $(STM32USBPATH)/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c -SRC += ../delays.c -SRC += $(THIRDPARTY)/FatFs/ff.c $(THIRDPARTY)/FatFs/option/ccsbcs.c -SRC += ../usbd_desc.c -SRC += ../aspi.c -SRC += ../usb_bsp.c -SRC += ../usb_driver.c -SRC += ../pwr_driver.c -SRC += init.c - -CPPSRC = ../lcd_driver.cpp \ - ../configure_pins.cpp \ - ../keys_driver.cpp \ - ../i2c_driver.cpp \ - ../flash_driver.cpp \ - ../diskio.cpp \ - ../usbd_usr.cpp \ - ../usbd_storage_msd.cpp \ - ../../../gui/taranis/lcd.cpp \ - ../../../keys.cpp \ - ../../../fonts.cpp \ - ../../../strhelpers.cpp \ - boot.cpp - -# List ASM source files here - -ifeq ($(PCBREV), REV9E) - ASRC = $(STM32LIBPATH)/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f40_41xxx.s -else - ASRC = $(STM32LIBPATH)/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc_ride7/startup_stm32f2xx.s -endif - -# List all user directories here -UINCDIR = ./inc -# \ -# ./cmsis/core \ -# ./cmsis/device - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# Define optimisation level here -OPT = -Os - -# -# End of user defines -############################################################################################## - - -VPATH = $(DIRS) - -INCDIR = $(patsubst %,-I%,$(DINCDIR) $(UINCDIR)) -LIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR)) - -ifeq ($(RUN_FROM_FLASH), 0) -DEFS = $(DDEFS) $(UDEFS) -DRUN_FROM_FLASH=0 -else -DEFS = $(DDEFS) $(UDEFS) -DRUN_FROM_FLASH=1 -endif - -ADEFS = $(DADEFS) $(UADEFS) - -AXOBJS = $(ASRC:%.s=%.o) -CXOBJS = $(SRC:%.c=%.o) -CPPXOBJS = $(CPPSRC:%.cpp=%.o) - -LIBS = $(DLIBS) $(ULIBS) -MCFLAGS = -mcpu=$(MCU) - -ifeq ($(NANO), YES) - # use newlib-nano for linking - # NEWLIB_NANO_FLAGS = --specs=nano.specs -u _printf_float #use this version if printf for floats is needed! - NEWLIB_NANO_FLAGS = --specs=nano.specs -endif - -#ASFLAGS = $(MCFLAGS) -g -gdwarf-2 -Wa,-amhls=$(OBJDIR)/$(notdir $(<:.s=.lst)) $(ADEFS) -CPFLAGS = $(MCFLAGS) $(OPT) -gdwarf-2 -mthumb -fomit-frame-pointer -Wall -Wstrict-prototypes -fverbose-asm $(DEFS) -LDFLAGS = $(MCFLAGS) -mthumb -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(FULL_PRJ).map,--cref,--no-warn-mismatch,--gc-sections $(LIBDIR) $(NEWLIB_NANO_FLAGS) -CPPFLAGS = $(MCFLAGS) $(OPT) -gdwarf-2 -mthumb -fomit-frame-pointer -fdata-sections -ffunction-sections -Wall -fverbose-asm $(DEFS) - -ifeq ($(WARNINGS_AS_ERRORS), YES) - CPFLAGS += -Werror - CPPFLAGS += -Werror -endif - -CPPFLAGS += $(CPPDEFS) -CPFLAGS += $(CPPDEFS) -CPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) - -AOBJS = $(patsubst %,$(OBJDIR)/%,$(notdir $(AXOBJS) )) -COBJS = $(patsubst %,$(OBJDIR)/%,$(notdir $(CXOBJS) )) -CPPOBJS = $(patsubst %,$(OBJDIR)/%,$(notdir $(CPPXOBJS) )) -DIRS = $(sort $(dir $(AXOBJS) $(CXOBJS) $(CPPXOBJS) ) ) - - -CPPDEFS += -DCPUARM - -ifeq ($(PCB), TARANIS) - CPPDEFS += -DCPUSTM32 -endif - -CPPDEFS += -DTIMERS=0 - -# If serial Debug required -ifeq ($(DEBUG), 1) - CPPDEFS += -DDEBUG -endif - -CPPDEFS += -DBOOT - -# Generate dependency information -CPFLAGS += -MD -MP -MF .dep/$(@F).d -CPPFLAGS += -MD -MP -MF .dep/$(@F).d -CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) - -# -# makefile rules -# - -all: size_before $(OBJS) $(COBJS) $(CPPOBJS) $(FULL_PRJ).elf $(FULL_PRJ).hex $(FULL_PRJ).lss $(FULL_PRJ).bin size - -#begin: -# @echo $(AXOBJS) $(CXOBJS) $(CPPXOBJS) -# @echo -# @echo $(OBJS) $(COBJS) $(CPPOBJS) -# @echo -# @echo $(DIRS) - -size_before: -# arm-none-eabi-size $(FULL_PRJ).elf - @if test -f $(FULL_PRJ).elf; then arm-none-eabi-size $(FULL_PRJ).elf; fi - -size: -# arm-none-eabi-size $(FULL_PRJ).elf - @if test -f $(FULL_PRJ).elf; then arm-none-eabi-size $(FULL_PRJ).elf; fi - -$(CPPOBJS) : $(OBJDIR)/%.o : %.cpp - $(CC) -c $(CPPFLAGS) -fno-exceptions -I . $(INCDIR) $< -o $@ - -$(COBJS) : $(OBJDIR)/%.o : %.c - $(CC) -c $(CPFLAGS) -I . $(INCDIR) $< -o $@ - - -$(AOBJS) : $(OBJDIR)/%.o : %.s - $(AS) -c $(ASFLAGS) $< -o $@ - -%elf: $(AOBJS) $(COBJS) $(CPPOBJS) - $(CC) $(AOBJS) $(COBJS) $(CPPOBJS) $(LDFLAGS) $(LIBS) -o $@ - -# Create extended listing file from ELF output file. -%.lss: %.elf - $(CLSS) -h -S $< > $@ - -%hex: %elf - $(BIN) $< $@ - -%bin: %elf - $(BINX) $< $@ - -# $(PROJECT)_flash8 -# $(PROJECT)_flash4 -# $(PROJECT)_ramBootS -# $(PROJECT)_ramBootT - -clean: - -rm -f *.o - -rm -f *.elf - -rm -f *.map - -rm -f *.hex - -rm -f *.bin - -rm -f *.lss - -rm -fR .dep - - -# -# Include the dependency files, should be the last of the makefile -# --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - -# *** EOF *** diff --git a/radio/src/telemetry/crossfire.cpp b/radio/src/telemetry/crossfire.cpp new file mode 100644 index 000000000..041cace1d --- /dev/null +++ b/radio/src/telemetry/crossfire.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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" + +struct CrossfireSensor { + const uint8_t id; + const uint8_t subId; + const char * name; + const TelemetryUnit unit; + const uint8_t prec; +}; + +const CrossfireSensor crossfireSensors[] = { + {LINK_STATS_ID, 0, ZSTR_RX_RSSI1, UNIT_DB, 0}, + {LINK_STATS_ID, 1, ZSTR_RX_RSSI2, UNIT_DB, 0}, + {LINK_STATS_ID, 2, ZSTR_RX_QUALITY, UNIT_PERCENT, 0}, + {LINK_STATS_ID, 3, ZSTR_RX_SNR, UNIT_DB, 0}, + {LINK_STATS_ID, 4, ZSTR_ANTENNA, UNIT_RAW, 0}, + {LINK_STATS_ID, 5, ZSTR_RF_MODE, UNIT_RAW, 0}, + {LINK_STATS_ID, 6, ZSTR_TX_POWER, UNIT_MILLIWATTS, 0}, + {LINK_STATS_ID, 7, ZSTR_TX_RSSI, UNIT_DB, 0}, + {LINK_STATS_ID, 8, ZSTR_TX_QUALITY, UNIT_PERCENT, 0}, + {LINK_STATS_ID, 9, ZSTR_TX_SNR, UNIT_DB, 0}, + { 0, 0, NULL, UNIT_RAW, 0} // sentinel +}; + +const CrossfireSensor * getCrossfireSensor(uint8_t id, uint8_t subId=0) +{ + const CrossfireSensor * result = NULL; + for (const CrossfireSensor * sensor = crossfireSensors; sensor->id; sensor++) { + if (id == sensor->id && subId == sensor->subId) { + result = sensor; + break; + } + } + return result; +} + +void processCrossfireTelemetryFrame(uint8_t id, uint8_t subId, uint32_t value) +{ + const CrossfireSensor * sensor = getCrossfireSensor(id, subId); + TelemetryUnit unit = UNIT_RAW; + uint8_t precision = 0; + if (sensor) { + unit = sensor->unit; + precision = sensor->prec; + } + setTelemetryValue(TELEM_PROTO_CROSSFIRE, id, 0, subId, value, unit, precision); +} + +bool checkCrossfireTelemetryFrameCRC() +{ + uint8_t len = telemetryRxBuffer[1]; + uint8_t crc = crc8(&telemetryRxBuffer[2], len-1); + return (crc == telemetryRxBuffer[len+1]); +} + +void processCrossfireTelemetryFrame() +{ + if (!checkCrossfireTelemetryFrameCRC()) { + TRACE("processCrossfirePacket(): CRC error "); + DUMP(telemetryRxBuffer, TELEMETRY_RX_PACKET_SIZE); + return; + } + + uint8_t id = telemetryRxBuffer[2]; + switch(id) { + case LINK_STATS_ID: + for (int i=0; i<10; i++) { + processCrossfireTelemetryFrame(id, i, telemetryRxBuffer[3+i]); + } + break; + } +} + +void processCrossfireTelemetryData(uint8_t data) +{ + if (telemetryRxBufferCount == 0 && data != 0x00) { + return; + } + + if (telemetryRxBufferCount == 1 && (data < 2 || data > TELEMETRY_RX_PACKET_SIZE-2)) { + telemetryRxBufferCount = 0; + return; + } + + if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { + telemetryRxBuffer[telemetryRxBufferCount++] = data; + } + else { + TRACE("processCrossfirePacket(): length error "); + DUMP(telemetryRxBuffer, TELEMETRY_RX_PACKET_SIZE); + telemetryRxBufferCount = 0; + } + + if (telemetryRxBufferCount > 4) { + uint8_t length = telemetryRxBuffer[1]; + if (length + 2 == telemetryRxBufferCount) { + processCrossfireTelemetryFrame(); + telemetryRxBufferCount = 0; + } + } +} + +void crossfireSetDefault(int index, uint8_t id, uint8_t subId) +{ + TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index]; + + telemetrySensor.id = id; + telemetrySensor.instance = subId; + + const CrossfireSensor * sensor = getCrossfireSensor(id, subId); + if (sensor) { + TelemetryUnit unit = sensor->unit; + uint8_t prec = min(2, sensor->prec); + telemetrySensor.init(sensor->name, unit, prec); + if (id == LINK_STATS_ID) { + telemetrySensor.logs = true; + } + } + else { + telemetrySensor.init(id); + } + + storageDirty(EE_MODEL); +} \ No newline at end of file diff --git a/radio/src/telemetry/crossfire.h b/radio/src/telemetry/crossfire.h new file mode 100644 index 000000000..5fa88a513 --- /dev/null +++ b/radio/src/telemetry/crossfire.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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. + */ + +#ifndef _CROSSFIRE_H_ +#define _CROSSFIRE_H_ + +#define LINK_STATS_ID 0x14 + +void processCrossfireTelemetryData(uint8_t data); +void crossfireSetDefault(int index, uint8_t id, uint8_t subId); + +#endif // _CROSSFIRE_H_ diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 934dc5437..b6f8faf9d 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -18,115 +18,13 @@ * GNU General Public License for more details. */ -#include "../opentx.h" +#include "opentx.h" -uint8_t frskyStreaming = 0; - -#if defined(WS_HOW_HIGH) -uint8_t frskyUsrStreaming = 0; -#endif - -uint8_t link_counter = 0; - -#define FRSKY_RX_PACKET_SIZE 19 -uint8_t frskyRxBuffer[FRSKY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) - -#if !defined(CPUARM) && !defined(PCBFLAMENCO) +#if !defined(CPUARM) uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE]; -#endif - -#if !defined(CPUARM) uint8_t frskyTxBufferCount = 0; #endif -#if defined(CPUARM) -uint8_t telemetryState = TELEMETRY_INIT; -#endif - -uint8_t frskyRxBufferCount = 0; - -FrskyData frskyData; - -#if defined(CPUARM) -uint8_t telemetryProtocol = 255; -#if defined(REVX) -uint8_t serialInversion = 0; -#endif -#define IS_FRSKY_D_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_D) -#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_SPORT) -#else -#define IS_FRSKY_D_PROTOCOL() (true) -#define IS_FRSKY_SPORT_PROTOCOL() (false) -#endif - -#if defined(CPUARM) -void FrskyValueWithMin::reset() -{ - memclear(this, sizeof(*this)); -} -#endif - -void FrskyValueWithMin::set(uint8_t value) -{ -#if defined(CPUARM) - if (this->value == 0) { - memset(values, value, TELEMETRY_AVERAGE_COUNT); - this->value = value; - } - else { - //calculate the average from values[] and value - //also shift readings in values [] array - unsigned int sum = values[0]; - for (int i=0; ivalue = sum/(TELEMETRY_AVERAGE_COUNT+1); - } -#else - if (this->value == 0) { - this->value = value; - } - else { - sum += value; - if (link_counter == 0) { - this->value = sum / (IS_FRSKY_D_PROTOCOL() ? FRSKY_D_AVERAGING : FRSKY_SPORT_AVERAGING); - sum = 0; - } - } -#endif - - if (!min || value < min) { - min = value; - } -} - -void FrskyValueWithMinMax::set(uint8_t value, uint8_t unit) -{ - FrskyValueWithMin::set(value); - if (unit != UNIT_VOLTS) { - this->value = value; - } - if (!max || value > max) { - max = value; - } -} - -#if !defined(CPUARM) -uint16_t getChannelRatio(source_t channel) -{ - return (uint16_t)g_model.frsky.channels[channel].ratio << g_model.frsky.channels[channel].multiplier; -} - -lcdint_t applyChannelRatio(source_t channel, lcdint_t val) -{ - return ((int32_t)val+g_model.frsky.channels[channel].offset) * getChannelRatio(channel) * 2 / 51; -} -#endif - #if defined(TELEMETREZ) #define PRIVATE 0x1B uint8_t privateDataLen; @@ -138,7 +36,19 @@ extern uint8_t TrotCount; extern uint8_t TezRotary; #endif -NOINLINE void processSerialData(uint8_t data) +// Receive buffer state machine state enum +enum FrSkyDataState { + STATE_DATA_IDLE, + STATE_DATA_START, + STATE_DATA_IN_FRAME, + STATE_DATA_XOR, +#if defined(TELEMETREZ) + STATE_DATA_PRIVATE_LEN, + STATE_DATA_PRIVATE_VALUE +#endif +}; + +NOINLINE void processFrskyTelemetryData(uint8_t data) { static uint8_t dataState = STATE_DATA_IDLE; @@ -166,18 +76,17 @@ NOINLINE void processSerialData(uint8_t data) } #endif - switch (dataState) - { + switch (dataState) { case STATE_DATA_START: if (data == START_STOP) { if (IS_FRSKY_SPORT_PROTOCOL()) { dataState = STATE_DATA_IN_FRAME ; - frskyRxBufferCount = 0; + telemetryRxBufferCount = 0; } } else { - if (frskyRxBufferCount < FRSKY_RX_PACKET_SIZE) { - frskyRxBuffer[frskyRxBufferCount++] = data; + if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { + telemetryRxBuffer[telemetryRxBufferCount++] = data; } dataState = STATE_DATA_IN_FRAME; } @@ -190,30 +99,30 @@ NOINLINE void processSerialData(uint8_t data) else if (data == START_STOP) { if (IS_FRSKY_SPORT_PROTOCOL()) { dataState = STATE_DATA_IN_FRAME ; - frskyRxBufferCount = 0; + telemetryRxBufferCount = 0; } else { // end of frame detected - frskyDProcessPacket(frskyRxBuffer); + frskyDProcessPacket(telemetryRxBuffer); dataState = STATE_DATA_IDLE; } break; } - else if (frskyRxBufferCount < FRSKY_RX_PACKET_SIZE) { - frskyRxBuffer[frskyRxBufferCount++] = data; + else if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { + telemetryRxBuffer[telemetryRxBufferCount++] = data; } break; case STATE_DATA_XOR: - if (frskyRxBufferCount < FRSKY_RX_PACKET_SIZE) { - frskyRxBuffer[frskyRxBufferCount++] = data ^ STUFF_MASK; + if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { + telemetryRxBuffer[telemetryRxBufferCount++] = data ^ STUFF_MASK; } dataState = STATE_DATA_IN_FRAME; break; case STATE_DATA_IDLE: if (data == START_STOP) { - frskyRxBufferCount = 0; + telemetryRxBufferCount = 0; dataState = STATE_DATA_START; } #if defined(TELEMETREZ) @@ -255,419 +164,30 @@ NOINLINE void processSerialData(uint8_t data) } // switch #if defined(FRSKY_SPORT) - if (IS_FRSKY_SPORT_PROTOCOL() && frskyRxBufferCount >= FRSKY_SPORT_PACKET_SIZE) { - processSportPacket(frskyRxBuffer); + if (IS_FRSKY_SPORT_PROTOCOL() && telemetryRxBufferCount >= FRSKY_SPORT_PACKET_SIZE) { + processSportPacket(telemetryRxBuffer); dataState = STATE_DATA_IDLE; } #endif } -void telemetryWakeup() -{ -#if defined(CPUARM) - uint8_t requiredTelemetryProtocol = MODEL_TELEMETRY_PROTOCOL(); -#if defined(REVX) - uint8_t requiredSerialInversion = g_model.moduleData[EXTERNAL_MODULE].invertedSerial; - if (telemetryProtocol != requiredTelemetryProtocol || serialInversion != requiredSerialInversion) { - serialInversion = requiredSerialInversion; -#else - if (telemetryProtocol != requiredTelemetryProtocol) { -#endif - telemetryInit(requiredTelemetryProtocol); - telemetryProtocol = requiredTelemetryProtocol; - } -#endif - -#if defined(CPUSTM32) - uint8_t data; -#if defined(LOG_TELEMETRY) && !defined(SIMU) - static tmr10ms_t lastTime = 0; - tmr10ms_t newTime = get_tmr10ms(); - struct gtm utm; - gettime(&utm); -#endif - while (telemetryFifo.pop(data)) { - processSerialData(data); -#if defined(LOG_TELEMETRY) && !defined(SIMU) - extern FIL g_telemetryFile; - if (lastTime != newTime) { - f_printf(&g_telemetryFile, "\r\n%4d-%02d-%02d,%02d:%02d:%02d.%02d0: %02X", utm.tm_year+1900, utm.tm_mon+1, utm.tm_mday, utm.tm_hour, utm.tm_min, utm.tm_sec, g_ms100, data); - lastTime = newTime; - } - else { - f_printf(&g_telemetryFile, " %02X", data); - } -#endif - } -#elif defined(PCBSKY9X) - if (telemetryProtocol == PROTOCOL_FRSKY_D_SECONDARY) { - uint8_t data; - while (telemetrySecondPortReceive(data)) { - processSerialData(data); - } - } - else { - // Receive serial data here - rxPdcUsart(processSerialData); - } -#endif - -#if !defined(CPUARM) - if (IS_FRSKY_D_PROTOCOL()) { - // Attempt to transmit any waiting Fr-Sky alarm set packets every 50ms (subject to packet buffer availability) - static uint8_t frskyTxDelay = 5; - if (frskyAlarmsSendState && (--frskyTxDelay == 0)) { - frskyTxDelay = 5; // 50ms -#if !defined(SIMU) - frskyDSendNextAlarm(); -#endif - } - } -#endif - -#if defined(CPUARM) - for (int i=0; i 0x33) -#else - #define FRSKY_BAD_ANTENNA() (frskyData.swr.value > 0x33) -#endif - -#if defined(CPUARM) - static tmr10ms_t alarmsCheckTime = 0; - #define SCHEDULE_NEXT_ALARMS_CHECK(seconds) alarmsCheckTime = get_tmr10ms() + (100*(seconds)) - if (int32_t(get_tmr10ms() - alarmsCheckTime) > 0) { - - SCHEDULE_NEXT_ALARMS_CHECK(1/*second*/); - - uint8_t now = TelemetryItem::now(); - bool sensor_lost = false; - for (int i=0; i TELEMETRY_VALUE_OLD_THRESHOLD) { - sensor_lost = true; - telemetryItems[i].lastReceived = TELEMETRY_VALUE_OLD; - TelemetrySensor * sensor = & g_model.telemetrySensors[i]; - if (sensor->unit == UNIT_DATETIME) { - telemetryItems[i].datetime.datestate = 0; - telemetryItems[i].datetime.timestate = 0; - } - } - } - } - if (sensor_lost && TELEMETRY_STREAMING()) { - audioEvent(AU_SENSOR_LOST); - } - -#if defined(PCBTARANIS) - if ((g_model.moduleData[INTERNAL_MODULE].rfProtocol != RF_PROTO_OFF || g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_XJT) && FRSKY_BAD_ANTENNA()) { - AUDIO_SWR_RED(); - POPUP_WARNING(STR_ANTENNAPROBLEM); - SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); - } -#endif - - if (TELEMETRY_STREAMING()) { - if (getRssiAlarmValue(1) && TELEMETRY_RSSI() < getRssiAlarmValue(1)) { - AUDIO_RSSI_RED(); - SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); - } - else if (getRssiAlarmValue(0) && TELEMETRY_RSSI() < getRssiAlarmValue(0)) { - AUDIO_RSSI_ORANGE(); - SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); - } - } - } - - if (TELEMETRY_STREAMING()) { - if (telemetryState == TELEMETRY_KO) { - AUDIO_TELEMETRY_BACK(); - } - telemetryState = TELEMETRY_OK; - } - else if (telemetryState == TELEMETRY_OK) { - telemetryState = TELEMETRY_KO; - AUDIO_TELEMETRY_LOST(); - } -#endif -} - -void telemetryInterrupt10ms() -{ -#if defined(CPUARM) -#elif defined(FRSKY_HUB) - uint16_t voltage = 0; /* unit: 1/10 volts */ - for (uint8_t i=0; i>1) * (voltage>>1)) / 25; - - frskyData.hub.currentPrescale += current; - if (frskyData.hub.currentPrescale >= 3600) { - frskyData.hub.currentConsumption += 1; - frskyData.hub.currentPrescale -= 3600; - } -#endif - } - -#if !defined(CPUARM) - if (frskyData.hub.power > frskyData.hub.maxPower) { - frskyData.hub.maxPower = frskyData.hub.power; - } -#endif - } - -#if defined(WS_HOW_HIGH) - if (frskyUsrStreaming > 0) { - frskyUsrStreaming--; - } -#endif - - if (frskyStreaming > 0) { - frskyStreaming--; - } - else { -#if !defined(SIMU) -#if defined(CPUARM) - frskyData.rssi.reset(); -#else - frskyData.rssi[0].set(0); - frskyData.rssi[1].set(0); -#endif -#endif - } -} - -void telemetryReset() -{ - memclear(&frskyData, sizeof(frskyData)); - -#if defined(CPUARM) - for (int index=0; index Cell number + Cell voltage - uint8_t battnumber = ((frskyData.hub.volts & 0x00F0) >> 4); + uint8_t battnumber = ((telemetryData.hub.volts & 0x00F0) >> 4); if (battnumber < 12) { - if (frskyData.hub.cellsCount < battnumber+1) { - frskyData.hub.cellsCount = battnumber+1; + if (telemetryData.hub.cellsCount < battnumber+1) { + telemetryData.hub.cellsCount = battnumber+1; } - uint8_t cellVolts = (uint8_t)(((((frskyData.hub.volts & 0xFF00) >> 8) + ((frskyData.hub.volts & 0x000F) << 8))) / 10); - frskyData.hub.cellVolts[battnumber] = cellVolts; - if (!frskyData.hub.minCellVolts || cellVolts> 8) + ((telemetryData.hub.volts & 0x000F) << 8))) / 10); + telemetryData.hub.cellVolts[battnumber] = cellVolts; + if (!telemetryData.hub.minCellVolts || cellVolts * luaInputTelemetryFifo = NULL; -Fifo * luaOutputTelemetryFifo = NULL; -#endif diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index a5187bbfe..3c98da665 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -21,7 +21,7 @@ #ifndef _FRSKY_H_ #define _FRSKY_H_ -#include +#include "telemetry_holders.h" #define FRSKY_SPORT_BAUDRATE 57600 #define FRSKY_D_BAUDRATE 9600 @@ -161,59 +161,9 @@ #define DATA_ID_SP2UH 0x45 // 5 #define DATA_ID_SP2UR 0xC6 // 6 - -// Global Fr-Sky telemetry data variables -extern uint8_t frskyStreaming; // >0 (true) == data is streaming in. 0 = nodata detected for some time - -#if defined(WS_HOW_HIGH) -extern uint8_t frskyUsrStreaming; -#endif - -extern uint8_t link_counter; - -#if defined(CPUARM) -enum TelemetryStates { - TELEMETRY_INIT, - TELEMETRY_OK, - TELEMETRY_KO -}; - -extern uint8_t telemetryState; -#endif - -#if defined(CPUARM) -#define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading! -#define RAW_FRSKY_MINMAX(v) v.values[TELEMETRY_AVERAGE_COUNT-1] -class FrskyValueWithMin { - public: - uint8_t value; // fitered value (average of last TELEMETRY_AVERAGE_COUNT+1 values) - uint8_t min; - uint8_t values[TELEMETRY_AVERAGE_COUNT]; - void set(uint8_t value); - void reset(); -}; -#else -#define RAW_FRSKY_MINMAX(v) v.value -class FrskyValueWithMin { - public: - uint8_t value; - uint8_t min; - uint16_t sum; - void set(uint8_t value); -}; -#endif - -class FrskyValueWithMinMax: public FrskyValueWithMin { - public: - uint8_t max; - void set(uint8_t value, uint8_t unit); -}; - -#if defined(CPUARM) - - -#elif defined(FRSKY_HUB) -PACK(struct FrskySerialData { +#if !defined(CPUARM) +#if defined(FRSKY_HUB) +PACK(struct FrskyTelemetryData { int16_t baroAltitudeOffset; // spare reused int16_t gpsAltitude_bp; // 0x01 before punct int16_t temperature1; // 0x02 -20 .. 250 deg. celcius @@ -291,7 +241,7 @@ PACK(struct FrskySerialData { int16_t dTE; }); #elif defined(WS_HOW_HIGH) -PACK(struct FrskySerialData { +PACK(struct FrskyTelemetryData { int16_t baroAltitude_bp; // 0..9,999 meters int16_t baroAltitudeOffset; int16_t minAltitude; @@ -305,7 +255,7 @@ PACK(struct FrskySerialData { #endif }); #elif defined(VARIO) -PACK(struct FrskySerialData { +PACK(struct FrskyTelemetryData { int16_t varioSpeed; // Vertical speed in cm/s uint16_t currentConsumption; uint16_t currentPrescale; @@ -313,41 +263,17 @@ PACK(struct FrskySerialData { uint16_t maxPower; }); #else -PACK(struct FrskySerialData { +PACK(struct FrskyTelemetryData { uint16_t currentConsumption; uint16_t currentPrescale; uint16_t power; uint16_t maxPower; }); #endif - -enum TelemAnas { - TELEM_ANA_A1, - TELEM_ANA_A2, -#if defined(CPUARM) - TELEM_ANA_A3, - TELEM_ANA_A4, -#endif - TELEM_ANA_COUNT -}; - -#if defined(CPUARM) -struct FrskyData { - FrskyValueWithMin swr; // TODO Min not needed - FrskyValueWithMin rssi; // TODO Min not needed - uint16_t xjtVersion; - bool varioHighPrecision; -}; -#else -struct FrskyData { - FrskyValueWithMinMax analog[TELEM_ANA_COUNT]; - FrskyValueWithMin rssi[2]; - FrskySerialData hub; -}; #endif #if defined(PCBTARANIS) && defined(REVPLUS) - #define IS_VALID_XJT_VERSION() (frskyData.xjtVersion != 0 && frskyData.xjtVersion != 0xff) + #define IS_VALID_XJT_VERSION() (telemetryData.xjtVersion != 0 && telemetryData.xjtVersion != 0xff) #else #define IS_VALID_XJT_VERSION() (1) #endif @@ -364,118 +290,104 @@ enum AlarmLevel { #define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3) #if defined(CPUARM) - #define TELEMETRY_STREAMING() (frskyData.rssi.value > 0) - #define TELEMETRY_RSSI() (frskyData.rssi.value) - #define TELEMETRY_RSSI_MIN() (frskyData.rssi.min) + #define TELEMETRY_STREAMING() (telemetryData.rssi.value > 0) + #define TELEMETRY_RSSI() (telemetryData.rssi.value) + #define TELEMETRY_RSSI_MIN() (telemetryData.rssi.min) #define TELEMETRY_CELL_VOLTAGE_MUTLIPLIER 1 - #define TELEMETRY_GPS_SPEED_BP frskyData.hub.gpsSpeed_bp - #define TELEMETRY_GPS_SPEED_AP frskyData.hub.gpsSpeed_ap + #define TELEMETRY_GPS_SPEED_BP telemetryData.hub.gpsSpeed_bp + #define TELEMETRY_GPS_SPEED_AP telemetryData.hub.gpsSpeed_ap - #define TELEMETRY_ABSOLUTE_GPS_ALT (frskyData.hub.gpsAltitude) - #define TELEMETRY_RELATIVE_GPS_ALT (frskyData.hub.gpsAltitude + frskyData.hub.gpsAltitudeOffset) + #define TELEMETRY_ABSOLUTE_GPS_ALT (telemetryData.hub.gpsAltitude) + #define TELEMETRY_RELATIVE_GPS_ALT (telemetryData.hub.gpsAltitude + telemetryData.hub.gpsAltitudeOffset) #define TELEMETRY_RELATIVE_GPS_ALT_BP (TELEMETRY_RELATIVE_GPS_ALT / 100) - #define TELEMETRY_RELATIVE_BARO_ALT_BP (frskyData.hub.baroAltitude / 100) - #define TELEMETRY_RELATIVE_BARO_ALT_AP (frskyData.hub.baroAltitude % 100) + #define TELEMETRY_RELATIVE_BARO_ALT_BP (telemetryData.hub.baroAltitude / 100) + #define TELEMETRY_RELATIVE_BARO_ALT_AP (telemetryData.hub.baroAltitude % 100) - #define TELEMETRY_BARO_ALT_PREPARE() div_t baroAltitudeDivision = div(getConvertedTelemetryValue(frskyData.hub.baroAltitude, UNIT_DIST), 100) + #define TELEMETRY_BARO_ALT_PREPARE() div_t baroAltitudeDivision = div(getConvertedTelemetryValue(telemetryData.hub.baroAltitude, UNIT_DIST), 100) #define TELEMETRY_BARO_ALT_FORMAT "%c%d.%02d," - #define TELEMETRY_BARO_ALT_ARGS frskyData.hub.baroAltitude < 0 ? '-' : ' ', abs(baroAltitudeDivision.quot), abs(baroAltitudeDivision.rem), + #define TELEMETRY_BARO_ALT_ARGS telemetryData.hub.baroAltitude < 0 ? '-' : ' ', abs(baroAltitudeDivision.quot), abs(baroAltitudeDivision.rem), #define TELEMETRY_GPS_ALT_FORMAT "%c%d.%02d," - #define TELEMETRY_GPS_ALT_ARGS frskyData.hub.gpsAltitude < 0 ? '-' : ' ', abs(frskyData.hub.gpsAltitude / 100), abs(frskyData.hub.gpsAltitude % 100), + #define TELEMETRY_GPS_ALT_ARGS telemetryData.hub.gpsAltitude < 0 ? '-' : ' ', abs(telemetryData.hub.gpsAltitude / 100), abs(telemetryData.hub.gpsAltitude % 100), #define TELEMETRY_SPEED_UNIT (IS_IMPERIAL_ENABLE() ? SPEED_UNIT_IMP : SPEED_UNIT_METR) #define TELEMETRY_GPS_SPEED_FORMAT "%d," - #define TELEMETRY_GPS_SPEED_ARGS frskyData.hub.gpsSpeed_bp, + #define TELEMETRY_GPS_SPEED_ARGS telemetryData.hub.gpsSpeed_bp, #if defined(CPUARM) - #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, TELEMETRY_CELL_VOLTAGE(6)/100, TELEMETRY_CELL_VOLTAGE(6)%100, TELEMETRY_CELL_VOLTAGE(7)/100, TELEMETRY_CELL_VOLTAGE(7)%100, TELEMETRY_CELL_VOLTAGE(8)/100, TELEMETRY_CELL_VOLTAGE(8)%100, TELEMETRY_CELL_VOLTAGE(9)/100, TELEMETRY_CELL_VOLTAGE(9)%100, TELEMETRY_CELL_VOLTAGE(10)/100, TELEMETRY_CELL_VOLTAGE(10)%100, TELEMETRY_CELL_VOLTAGE(11)/100, TELEMETRY_CELL_VOLTAGE(11)%100, + #define TELEMETRY_CELLS_ARGS telemetryData.hub.cellsSum / 10, telemetryData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, TELEMETRY_CELL_VOLTAGE(6)/100, TELEMETRY_CELL_VOLTAGE(6)%100, TELEMETRY_CELL_VOLTAGE(7)/100, TELEMETRY_CELL_VOLTAGE(7)%100, TELEMETRY_CELL_VOLTAGE(8)/100, TELEMETRY_CELL_VOLTAGE(8)%100, TELEMETRY_CELL_VOLTAGE(9)/100, TELEMETRY_CELL_VOLTAGE(9)%100, TELEMETRY_CELL_VOLTAGE(10)/100, TELEMETRY_CELL_VOLTAGE(10)%100, TELEMETRY_CELL_VOLTAGE(11)/100, TELEMETRY_CELL_VOLTAGE(11)%100, #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6,Cell 7,Cell 8,Cell 9,Cell 10,Cell 11,Cell 12," #else - #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, + #define TELEMETRY_CELLS_ARGS telemetryData.hub.cellsSum / 10, telemetryData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6," #endif #define TELEMETRY_CURRENT_FORMAT "%d.%d," - #define TELEMETRY_CURRENT_ARGS frskyData.hub.current / 10, frskyData.hub.current % 10, + #define TELEMETRY_CURRENT_ARGS telemetryData.hub.current / 10, telemetryData.hub.current % 10, #define TELEMETRY_VFAS_FORMAT "%d.%d," - #define TELEMETRY_VFAS_ARGS frskyData.hub.vfas / 10, frskyData.hub.vfas % 10, + #define TELEMETRY_VFAS_ARGS telemetryData.hub.vfas / 10, telemetryData.hub.vfas % 10, #define TELEMETRY_VSPEED_FORMAT "%c%d.%02d," - #define TELEMETRY_VSPEED_ARGS frskyData.hub.varioSpeed < 0 ? '-' : ' ', abs(frskyData.hub.varioSpeed / 100), abs(frskyData.hub.varioSpeed % 100), + #define TELEMETRY_VSPEED_ARGS telemetryData.hub.varioSpeed < 0 ? '-' : ' ', abs(telemetryData.hub.varioSpeed / 100), abs(telemetryData.hub.varioSpeed % 100), #define TELEMETRY_ASPEED_FORMAT "%d.%d," - #define TELEMETRY_ASPEED_ARGS frskyData.hub.airSpeed / 10, frskyData.hub.airSpeed % 10, + #define TELEMETRY_ASPEED_ARGS telemetryData.hub.airSpeed / 10, telemetryData.hub.airSpeed % 10, #define TELEMETRY_OPENXSENSOR() (0) #else - #define TELEMETRY_STREAMING() (frskyStreaming > 0) - #define TELEMETRY_RSSI() (frskyData.rssi[0].value) - #define TELEMETRY_RSSI_MIN() (frskyData.rssi[0].min) + #define TELEMETRY_STREAMING() (telemetryStreaming > 0) + #define TELEMETRY_RSSI() (telemetryData.rssi[0].value) + #define TELEMETRY_RSSI_MIN() (telemetryData.rssi[0].min) #define TELEMETRY_CELL_VOLTAGE_MUTLIPLIER 2 - #define TELEMETRY_BARO_ALT_AVAILABLE() (frskyData.hub.baroAltitudeOffset) + #define TELEMETRY_BARO_ALT_AVAILABLE() (telemetryData.hub.baroAltitudeOffset) #define TELEMETRY_BARO_ALT_UNIT (IS_IMPERIAL_ENABLE() ? LENGTH_UNIT_IMP : LENGTH_UNIT_METR) - #define TELEMETRY_RELATIVE_BARO_ALT_BP frskyData.hub.baroAltitude_bp - #define TELEMETRY_RELATIVE_BARO_ALT_AP frskyData.hub.baroAltitude_ap - #define TELEMETRY_RELATIVE_GPS_ALT_BP frskyData.hub.gpsAltitude_bp - #define TELEMETRY_GPS_SPEED_BP frskyData.hub.gpsSpeed_bp - #define TELEMETRY_GPS_SPEED_AP frskyData.hub.gpsSpeed_ap + #define TELEMETRY_RELATIVE_BARO_ALT_BP telemetryData.hub.baroAltitude_bp + #define TELEMETRY_RELATIVE_BARO_ALT_AP telemetryData.hub.baroAltitude_ap + #define TELEMETRY_RELATIVE_GPS_ALT_BP telemetryData.hub.gpsAltitude_bp + #define TELEMETRY_GPS_SPEED_BP telemetryData.hub.gpsSpeed_bp + #define TELEMETRY_GPS_SPEED_AP telemetryData.hub.gpsSpeed_ap #define TELEMETRY_BARO_ALT_PREPARE() #define TELEMETRY_BARO_ALT_FORMAT "%d," - #define TELEMETRY_BARO_ALT_ARGS frskyData.hub.baroAltitude_bp, + #define TELEMETRY_BARO_ALT_ARGS telemetryData.hub.baroAltitude_bp, #define TELEMETRY_GPS_ALT_FORMAT "%d," - #define TELEMETRY_GPS_ALT_ARGS frskyData.hub.gpsAltitude_bp, + #define TELEMETRY_GPS_ALT_ARGS telemetryData.hub.gpsAltitude_bp, #define TELEMETRY_SPEED_UNIT (IS_IMPERIAL_ENABLE() ? SPEED_UNIT_IMP : SPEED_UNIT_METR) #define TELEMETRY_GPS_SPEED_FORMAT "%d," - #define TELEMETRY_GPS_SPEED_ARGS frskyData.hub.gpsSpeed_bp, + #define TELEMETRY_GPS_SPEED_ARGS telemetryData.hub.gpsSpeed_bp, #if defined(CPUARM) - #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, frskyData.hub.cellVolts[0]*2/100, frskyData.hub.cellVolts[0]*2%100, frskyData.hub.cellVolts[1]*2/100, frskyData.hub.cellVolts[1]*2%100, frskyData.hub.cellVolts[2]*2/100, frskyData.hub.cellVolts[2]*2%100, frskyData.hub.cellVolts[3]*2/100, frskyData.hub.cellVolts[3]*2%100, frskyData.hub.cellVolts[4]*2/100, frskyData.hub.cellVolts[4]*2%100, frskyData.hub.cellVolts[5]*2/100, frskyData.hub.cellVolts[5]*2%100, frskyData.hub.cellVolts[6]*2/100, frskyData.hub.cellVolts[6]*2%100, frskyData.hub.cellVolts[7]*2/100, frskyData.hub.cellVolts[7]*2%100, frskyData.hub.cellVolts[8]*2/100, frskyData.hub.cellVolts[8]*2%100, frskyData.hub.cellVolts[9]*2/100, frskyData.hub.cellVolts[9]*2%100, frskyData.hub.cellVolts[10]*2/100, frskyData.hub.cellVolts[10]*2%100, frskyData.hub.cellVolts[11]*2/100, frskyData.hub.cellVolts[11]*2%100, + #define TELEMETRY_CELLS_ARGS telemetryData.hub.cellsSum / 10, telemetryData.hub.cellsSum % 10, telemetryData.hub.cellVolts[0]*2/100, telemetryData.hub.cellVolts[0]*2%100, telemetryData.hub.cellVolts[1]*2/100, telemetryData.hub.cellVolts[1]*2%100, telemetryData.hub.cellVolts[2]*2/100, telemetryData.hub.cellVolts[2]*2%100, telemetryData.hub.cellVolts[3]*2/100, telemetryData.hub.cellVolts[3]*2%100, telemetryData.hub.cellVolts[4]*2/100, telemetryData.hub.cellVolts[4]*2%100, telemetryData.hub.cellVolts[5]*2/100, telemetryData.hub.cellVolts[5]*2%100, telemetryData.hub.cellVolts[6]*2/100, telemetryData.hub.cellVolts[6]*2%100, telemetryData.hub.cellVolts[7]*2/100, telemetryData.hub.cellVolts[7]*2%100, telemetryData.hub.cellVolts[8]*2/100, telemetryData.hub.cellVolts[8]*2%100, telemetryData.hub.cellVolts[9]*2/100, telemetryData.hub.cellVolts[9]*2%100, telemetryData.hub.cellVolts[10]*2/100, telemetryData.hub.cellVolts[10]*2%100, telemetryData.hub.cellVolts[11]*2/100, telemetryData.hub.cellVolts[11]*2%100, #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6,Cell 7,Cell 8,Cell 9,Cell 10,Cell 11,Cell 12," #else - #define TELEMETRY_CELLS_ARGS frskyData.hub.cellsSum / 10, frskyData.hub.cellsSum % 10, frskyData.hub.cellVolts[0]*2/100, frskyData.hub.cellVolts[0]*2%100, frskyData.hub.cellVolts[1]*2/100, frskyData.hub.cellVolts[1]*2%100, frskyData.hub.cellVolts[2]*2/100, frskyData.hub.cellVolts[2]*2%100, frskyData.hub.cellVolts[3]*2/100, frskyData.hub.cellVolts[3]*2%100, frskyData.hub.cellVolts[4]*2/100, frskyData.hub.cellVolts[4]*2%100, frskyData.hub.cellVolts[5]*2/100, frskyData.hub.cellVolts[5]*2%100, + #define TELEMETRY_CELLS_ARGS telemetryData.hub.cellsSum / 10, telemetryData.hub.cellsSum % 10, telemetryData.hub.cellVolts[0]*2/100, telemetryData.hub.cellVolts[0]*2%100, telemetryData.hub.cellVolts[1]*2/100, telemetryData.hub.cellVolts[1]*2%100, telemetryData.hub.cellVolts[2]*2/100, telemetryData.hub.cellVolts[2]*2%100, telemetryData.hub.cellVolts[3]*2/100, telemetryData.hub.cellVolts[3]*2%100, telemetryData.hub.cellVolts[4]*2/100, telemetryData.hub.cellVolts[4]*2%100, telemetryData.hub.cellVolts[5]*2/100, telemetryData.hub.cellVolts[5]*2%100, #define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," #define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6," #endif #define TELEMETRY_CURRENT_FORMAT "%d.%02d," - #define TELEMETRY_CURRENT_ARGS frskyData.hub.current / 100, frskyData.hub.current % 100, + #define TELEMETRY_CURRENT_ARGS telemetryData.hub.current / 100, telemetryData.hub.current % 100, #define TELEMETRY_VFAS_FORMAT "%d.%d," - #define TELEMETRY_VFAS_ARGS frskyData.hub.vfas / 10, frskyData.hub.vfas % 10, + #define TELEMETRY_VFAS_ARGS telemetryData.hub.vfas / 10, telemetryData.hub.vfas % 10, #define TELEMETRY_VSPEED_FORMAT "%c%d.%02d," - #define TELEMETRY_VSPEED_ARGS frskyData.hub.varioSpeed < 0 ? '-' : ' ', frskyData.hub.varioSpeed / 100, frskyData.hub.varioSpeed % 100, + #define TELEMETRY_VSPEED_ARGS telemetryData.hub.varioSpeed < 0 ? '-' : ' ', telemetryData.hub.varioSpeed / 100, telemetryData.hub.varioSpeed % 100, #define TELEMETRY_ASPEED_FORMAT "%d.%d," - #define TELEMETRY_ASPEED_ARGS frskyData.hub.airSpeed / 10, frskyData.hub.airSpeed % 10, + #define TELEMETRY_ASPEED_ARGS telemetryData.hub.airSpeed / 10, telemetryData.hub.airSpeed % 10, #if defined(FRSKY_HUB) - #define TELEMETRY_OPENXSENSOR() (frskyData.hub.openXsensor) + #define TELEMETRY_OPENXSENSOR() (telemetryData.hub.openXsensor) #else #define TELEMETRY_OPENXSENSOR() (0) #endif #endif -#define TELEMETRY_CELL_VOLTAGE(k) (frskyData.hub.cellVolts[k] * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) -#define TELEMETRY_MIN_CELL_VOLTAGE (frskyData.hub.minCellVolts * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) - -extern FrskyData frskyData; +#define TELEMETRY_CELL_VOLTAGE(k) (telemetryData.hub.cellVolts[k] * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) +#define TELEMETRY_MIN_CELL_VOLTAGE (telemetryData.hub.minCellVolts * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) #define START_STOP 0x7e #define BYTESTUFF 0x7d #define STUFF_MASK 0x20 -// Receive buffer state machine state enum -enum FrSkyDataState { - STATE_DATA_IDLE, - STATE_DATA_START, - STATE_DATA_IN_FRAME, - STATE_DATA_XOR, -#if defined(TELEMETREZ) - STATE_DATA_PRIVATE_LEN, - STATE_DATA_PRIVATE_VALUE -#endif -}; - #if defined(CPUARM) #define frskySendAlarms() #else @@ -523,6 +435,40 @@ void telemetryInit(void); void telemetryInterrupt10ms(); +enum TelemetryProtocol +{ + TELEM_PROTO_FRSKY_D, + TELEM_PROTO_FRSKY_SPORT, + TELEM_PROTO_CROSSFIRE, +}; + +enum TelemAnas { + TELEM_ANA_A1, + TELEM_ANA_A2, +#if defined(CPUARM) + TELEM_ANA_A3, + TELEM_ANA_A4, +#endif + TELEM_ANA_COUNT +}; + +#if defined(CPUARM) +struct TelemetryData { + TelemetryValueWithMin swr; // TODO Min not needed + TelemetryValueWithMin rssi; // TODO Min not needed + uint16_t xjtVersion; + bool varioHighPrecision; +}; +#else +struct TelemetryData { + TelemetryValueWithMinMax analog[TELEM_ANA_COUNT]; + TelemetryValueWithMin rssi[2]; + FrskyTelemetryData hub; +}; +#endif + +extern TelemetryData telemetryData; + #if defined(CPUARM) typedef uint16_t frskyCellVoltage_t; #elif defined(FRSKY_HUB) @@ -535,24 +481,7 @@ void frskySetCellVoltage(uint8_t battnumber, frskyCellVoltage_t cellVolts); void frskyUpdateCells(); #endif -void processSerialData(uint8_t data); - -#if defined(PCBTARANIS) - inline uint8_t modelTelemetryProtocol() - { -#if defined(CROSSFIRE) - if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_CROSSFIRE) - return PROTOCOL_PULSES_CROSSFIRE; -#endif - if (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) - return g_model.telemetryProtocol; - else - return PROTOCOL_FRSKY_SPORT; - } - #define MODEL_TELEMETRY_PROTOCOL() modelTelemetryProtocol() -#elif defined(CPUARM) - #define MODEL_TELEMETRY_PROTOCOL() g_model.telemetryProtocol -#endif +void processFrskyTelemetryData(uint8_t data); #if defined(LUA) struct LuaTelemetryValue diff --git a/radio/src/telemetry/frsky_d.cpp b/radio/src/telemetry/frsky_d.cpp index a16b6ff7d..98adf0a3d 100644 --- a/radio/src/telemetry/frsky_d.cpp +++ b/radio/src/telemetry/frsky_d.cpp @@ -23,10 +23,10 @@ #if (defined(FRSKY_HUB) || defined(WS_HOW_HIGH)) void checkMinMaxAltitude() { - if (TELEMETRY_RELATIVE_BARO_ALT_BP > frskyData.hub.maxAltitude) - frskyData.hub.maxAltitude = TELEMETRY_RELATIVE_BARO_ALT_BP; - if (TELEMETRY_RELATIVE_BARO_ALT_BP < frskyData.hub.minAltitude) - frskyData.hub.minAltitude = TELEMETRY_RELATIVE_BARO_ALT_BP; + if (TELEMETRY_RELATIVE_BARO_ALT_BP > telemetryData.hub.maxAltitude) + telemetryData.hub.maxAltitude = TELEMETRY_RELATIVE_BARO_ALT_BP; + if (TELEMETRY_RELATIVE_BARO_ALT_BP < telemetryData.hub.minAltitude) + telemetryData.hub.minAltitude = TELEMETRY_RELATIVE_BARO_ALT_BP; } #endif @@ -71,148 +71,148 @@ void parseTelemHubByte(uint8_t byte) state = TS_IDLE; #if defined(GPS) - if ((uint8_t)structPos == offsetof(FrskySerialData, gpsLatitude_bp)) { + if ((uint8_t)structPos == offsetof(FrskyTelemetryData, gpsLatitude_bp)) { if (lowByte || byte) - frskyData.hub.gpsFix = 1; - else if (frskyData.hub.gpsFix > 0 && frskyData.hub.gpsLatitude_bp > 1) - frskyData.hub.gpsFix = 0; + telemetryData.hub.gpsFix = 1; + else if (telemetryData.hub.gpsFix > 0 && telemetryData.hub.gpsLatitude_bp > 1) + telemetryData.hub.gpsFix = 0; } - else if ((uint8_t)structPos == offsetof(FrskySerialData, gpsLongitude_bp)) { + else if ((uint8_t)structPos == offsetof(FrskyTelemetryData, gpsLongitude_bp)) { if (lowByte || byte) - frskyData.hub.gpsFix = 1; - else if (frskyData.hub.gpsFix > 0 && frskyData.hub.gpsLongitude_bp > 1) - frskyData.hub.gpsFix = 0; + telemetryData.hub.gpsFix = 1; + else if (telemetryData.hub.gpsFix > 0 && telemetryData.hub.gpsLongitude_bp > 1) + telemetryData.hub.gpsFix = 0; } - if ((uint8_t)structPos == offsetof(FrskySerialData, gpsAltitude_bp) || - ((uint8_t)structPos >= offsetof(FrskySerialData, gpsAltitude_ap) && (uint8_t)structPos <= offsetof(FrskySerialData, gpsLatitudeNS) && (uint8_t)structPos != offsetof(FrskySerialData, baroAltitude_bp) && (uint8_t)structPos != offsetof(FrskySerialData, baroAltitude_ap))) { + if ((uint8_t)structPos == offsetof(FrskyTelemetryData, gpsAltitude_bp) || + ((uint8_t)structPos >= offsetof(FrskyTelemetryData, gpsAltitude_ap) && (uint8_t)structPos <= offsetof(FrskyTelemetryData, gpsLatitudeNS) && (uint8_t)structPos != offsetof(FrskyTelemetryData, baroAltitude_bp) && (uint8_t)structPos != offsetof(FrskyTelemetryData, baroAltitude_ap))) { // If we don't have a fix, we may discard the value - if (frskyData.hub.gpsFix <= 0) + if (telemetryData.hub.gpsFix <= 0) return; } #endif // #if defined(GPS) - ((uint8_t*)&frskyData.hub)[structPos] = lowByte; - ((uint8_t*)&frskyData.hub)[structPos+1] = byte; + ((uint8_t*)&telemetryData.hub)[structPos] = lowByte; + ((uint8_t*)&telemetryData.hub)[structPos+1] = byte; switch ((uint8_t)structPos) { - case offsetof(FrskySerialData, rpm): - frskyData.hub.rpm *= (uint8_t)60/(g_model.frsky.blades+2); - if (frskyData.hub.rpm > frskyData.hub.maxRpm) - frskyData.hub.maxRpm = frskyData.hub.rpm; + case offsetof(FrskyTelemetryData, rpm): + telemetryData.hub.rpm *= (uint8_t)60/(g_model.frsky.blades+2); + if (telemetryData.hub.rpm > telemetryData.hub.maxRpm) + telemetryData.hub.maxRpm = telemetryData.hub.rpm; break; - case offsetof(FrskySerialData, temperature1): - if (frskyData.hub.temperature1 > frskyData.hub.maxTemperature1) - frskyData.hub.maxTemperature1 = frskyData.hub.temperature1; + case offsetof(FrskyTelemetryData, temperature1): + if (telemetryData.hub.temperature1 > telemetryData.hub.maxTemperature1) + telemetryData.hub.maxTemperature1 = telemetryData.hub.temperature1; break; - case offsetof(FrskySerialData, temperature2): - if (frskyData.hub.temperature2 > frskyData.hub.maxTemperature2) - frskyData.hub.maxTemperature2 = frskyData.hub.temperature2; + case offsetof(FrskyTelemetryData, temperature2): + if (telemetryData.hub.temperature2 > telemetryData.hub.maxTemperature2) + telemetryData.hub.maxTemperature2 = telemetryData.hub.temperature2; break; - case offsetof(FrskySerialData, current): + case offsetof(FrskyTelemetryData, current): #if defined(FAS_OFFSET) || !defined(CPUM64) - if ((int16_t)frskyData.hub.current > 0 && ((int16_t)frskyData.hub.current + g_model.frsky.fasOffset) > 0) - frskyData.hub.current += g_model.frsky.fasOffset; + if ((int16_t)telemetryData.hub.current > 0 && ((int16_t)telemetryData.hub.current + g_model.frsky.fasOffset) > 0) + telemetryData.hub.current += g_model.frsky.fasOffset; else - frskyData.hub.current = 0; + telemetryData.hub.current = 0; #endif - if (frskyData.hub.current > frskyData.hub.maxCurrent) - frskyData.hub.maxCurrent = frskyData.hub.current; + if (telemetryData.hub.current > telemetryData.hub.maxCurrent) + telemetryData.hub.maxCurrent = telemetryData.hub.current; break; - case offsetof(FrskySerialData, currentConsumption): + case offsetof(FrskyTelemetryData, currentConsumption): // we receive data from openXsensor. stops the calculation of consumption and power - frskyData.hub.openXsensor = 1; + telemetryData.hub.openXsensor = 1; break; - case offsetof(FrskySerialData, volts_ap): + case offsetof(FrskyTelemetryData, volts_ap): #if defined(FAS_BSS) - frskyData.hub.vfas = (frskyData.hub.volts_bp * 10 + frskyData.hub.volts_ap); + telemetryData.hub.vfas = (telemetryData.hub.volts_bp * 10 + telemetryData.hub.volts_ap); #else - frskyData.hub.vfas = ((frskyData.hub.volts_bp * 100 + frskyData.hub.volts_ap * 10) * 21) / 110; + telemetryData.hub.vfas = ((telemetryData.hub.volts_bp * 100 + telemetryData.hub.volts_ap * 10) * 21) / 110; #endif - /* TODO later if (!frskyData.hub.minVfas || frskyData.hub.minVfas > frskyData.hub.vfas) - frskyData.hub.minVfas = frskyData.hub.vfas; */ + /* TODO later if (!telemetryData.hub.minVfas || telemetryData.hub.minVfas > telemetryData.hub.vfas) + telemetryData.hub.minVfas = telemetryData.hub.vfas; */ break; - case offsetof(FrskySerialData, baroAltitude_bp): + case offsetof(FrskyTelemetryData, baroAltitude_bp): // First received barometer altitude => Altitude offset - if (!frskyData.hub.baroAltitudeOffset) - frskyData.hub.baroAltitudeOffset = -frskyData.hub.baroAltitude_bp; - frskyData.hub.baroAltitude_bp += frskyData.hub.baroAltitudeOffset; + if (!telemetryData.hub.baroAltitudeOffset) + telemetryData.hub.baroAltitudeOffset = -telemetryData.hub.baroAltitude_bp; + telemetryData.hub.baroAltitude_bp += telemetryData.hub.baroAltitudeOffset; checkMinMaxAltitude(); break; #if defined(GPS) - case offsetof(FrskySerialData, gpsAltitude_ap): - if (!frskyData.hub.gpsAltitudeOffset) - frskyData.hub.gpsAltitudeOffset = -frskyData.hub.gpsAltitude_bp; - frskyData.hub.gpsAltitude_bp += frskyData.hub.gpsAltitudeOffset; - if (!frskyData.hub.baroAltitudeOffset) { - if (frskyData.hub.gpsAltitude_bp > frskyData.hub.maxAltitude) - frskyData.hub.maxAltitude = frskyData.hub.gpsAltitude_bp; - if (frskyData.hub.gpsAltitude_bp < frskyData.hub.minAltitude) - frskyData.hub.minAltitude = frskyData.hub.gpsAltitude_bp; + case offsetof(FrskyTelemetryData, gpsAltitude_ap): + if (!telemetryData.hub.gpsAltitudeOffset) + telemetryData.hub.gpsAltitudeOffset = -telemetryData.hub.gpsAltitude_bp; + telemetryData.hub.gpsAltitude_bp += telemetryData.hub.gpsAltitudeOffset; + if (!telemetryData.hub.baroAltitudeOffset) { + if (telemetryData.hub.gpsAltitude_bp > telemetryData.hub.maxAltitude) + telemetryData.hub.maxAltitude = telemetryData.hub.gpsAltitude_bp; + if (telemetryData.hub.gpsAltitude_bp < telemetryData.hub.minAltitude) + telemetryData.hub.minAltitude = telemetryData.hub.gpsAltitude_bp; } - if (!frskyData.hub.pilotLatitude && !frskyData.hub.pilotLongitude) { + if (!telemetryData.hub.pilotLatitude && !telemetryData.hub.pilotLongitude) { // First received GPS position => Pilot GPS position getGpsPilotPosition(); } - else if (frskyData.hub.gpsDistNeeded || menuHandlers[menuLevel] == menuTelemetryFrsky) { + else if (telemetryData.hub.gpsDistNeeded || menuHandlers[menuLevel] == menuTelemetryFrsky) { getGpsDistance(); } break; - case offsetof(FrskySerialData, gpsSpeed_bp): + case offsetof(FrskyTelemetryData, gpsSpeed_bp): // Speed => Max speed - if (frskyData.hub.gpsSpeed_bp > frskyData.hub.maxGpsSpeed) - frskyData.hub.maxGpsSpeed = frskyData.hub.gpsSpeed_bp; + if (telemetryData.hub.gpsSpeed_bp > telemetryData.hub.maxGpsSpeed) + telemetryData.hub.maxGpsSpeed = telemetryData.hub.gpsSpeed_bp; break; #endif - case offsetof(FrskySerialData, volts): + case offsetof(FrskyTelemetryData, volts): frskyUpdateCells(); break; #if defined(GPS) - case offsetof(FrskySerialData, hour): - frskyData.hub.hour = ((uint8_t)(frskyData.hub.hour + g_eeGeneral.timezone + 24)) % 24; + case offsetof(FrskyTelemetryData, hour): + telemetryData.hub.hour = ((uint8_t)(telemetryData.hub.hour + g_eeGeneral.timezone + 24)) % 24; break; #endif - case offsetof(FrskySerialData, accelX): - case offsetof(FrskySerialData, accelY): - case offsetof(FrskySerialData, accelZ): - *(int16_t*)(&((uint8_t*)&frskyData.hub)[structPos]) /= 10; + case offsetof(FrskyTelemetryData, accelX): + case offsetof(FrskyTelemetryData, accelY): + case offsetof(FrskyTelemetryData, accelZ): + *(int16_t*)(&((uint8_t*)&telemetryData.hub)[structPos]) /= 10; break; #if 0 - case offsetof(FrskySerialData, gpsAltitude_bp): - case offsetof(FrskySerialData, fuelLevel): - case offsetof(FrskySerialData, gpsLongitude_bp): - case offsetof(FrskySerialData, gpsLatitude_bp): - case offsetof(FrskySerialData, gpsCourse_bp): - case offsetof(FrskySerialData, day): - case offsetof(FrskySerialData, year): - case offsetof(FrskySerialData, sec): - case offsetof(FrskySerialData, gpsSpeed_ap): - case offsetof(FrskySerialData, gpsLongitude_ap): - case offsetof(FrskySerialData, gpsLatitude_ap): - case offsetof(FrskySerialData, gpsCourse_ap): - case offsetof(FrskySerialData, gpsLongitudeEW): - case offsetof(FrskySerialData, gpsLatitudeNS): - case offsetof(FrskySerialData, varioSpeed): - case offsetof(FrskySerialData, power): /* because sent by openXsensor */ - case offsetof(FrskySerialData, vfas): - case offsetof(FrskySerialData, volts_bp): + case offsetof(FrskyTelemetryData, gpsAltitude_bp): + case offsetof(FrskyTelemetryData, fuelLevel): + case offsetof(FrskyTelemetryData, gpsLongitude_bp): + case offsetof(FrskyTelemetryData, gpsLatitude_bp): + case offsetof(FrskyTelemetryData, gpsCourse_bp): + case offsetof(FrskyTelemetryData, day): + case offsetof(FrskyTelemetryData, year): + case offsetof(FrskyTelemetryData, sec): + case offsetof(FrskyTelemetryData, gpsSpeed_ap): + case offsetof(FrskyTelemetryData, gpsLongitude_ap): + case offsetof(FrskyTelemetryData, gpsLatitude_ap): + case offsetof(FrskyTelemetryData, gpsCourse_ap): + case offsetof(FrskyTelemetryData, gpsLongitudeEW): + case offsetof(FrskyTelemetryData, gpsLatitudeNS): + case offsetof(FrskyTelemetryData, varioSpeed): + case offsetof(FrskyTelemetryData, power): /* because sent by openXsensor */ + case offsetof(FrskyTelemetryData, vfas): + case offsetof(FrskyTelemetryData, volts_bp): break; default: - *((uint16_t *)(((uint8_t*)&frskyData.hub) + structPos)) = previousValue; + *((uint16_t *)(((uint8_t*)&telemetryData.hub) + structPos)) = previousValue; break; #endif } @@ -222,16 +222,16 @@ void parseTelemHubByte(uint8_t byte) #if defined(WS_HOW_HIGH) void parseTelemWSHowHighByte(uint8_t byte) { - if (frskyUsrStreaming < (WSHH_TIMEOUT10ms - 10)) { - ((uint8_t*)&frskyData.hub)[offsetof(FrskySerialData, baroAltitude_bp)] = byte; + if (wshhStreaming < (WSHH_TIMEOUT10ms - 10)) { + ((uint8_t*)&telemetryData.hub)[offsetof(FrskyTelemetryData, baroAltitude_bp)] = byte; checkMinMaxAltitude(); } else { // At least 100mS passed since last data received - ((uint8_t*)&frskyData.hub)[offsetof(FrskySerialData, baroAltitude_bp)+1] = byte; + ((uint8_t*)&telemetryData.hub)[offsetof(FrskyTelemetryData, baroAltitude_bp)+1] = byte; } // baroAltitude_bp unit here is feet! - frskyUsrStreaming = WSHH_TIMEOUT10ms; // reset counter + wshhStreaming = WSHH_TIMEOUT10ms; // reset counter } #endif @@ -242,16 +242,16 @@ void frskyDProcessPacket(uint8_t *packet) { case LINKPKT: // A1/A2/RSSI values { - frskyData.analog[TELEM_ANA_A1].set(packet[1], g_model.frsky.channels[TELEM_ANA_A1].type); - frskyData.analog[TELEM_ANA_A2].set(packet[2], g_model.frsky.channels[TELEM_ANA_A2].type); - frskyData.rssi[0].set(packet[3]); - frskyData.rssi[1].set(packet[4] / 2); - frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected + telemetryData.analog[TELEM_ANA_A1].set(packet[1], g_model.frsky.channels[TELEM_ANA_A1].type); + telemetryData.analog[TELEM_ANA_A2].set(packet[2], g_model.frsky.channels[TELEM_ANA_A2].type); + telemetryData.rssi[0].set(packet[3]); + telemetryData.rssi[1].set(packet[4] / 2); + telemetryStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected link_counter += 256 / FRSKY_D_AVERAGING; #if defined(VARIO) uint8_t varioSource = g_model.frsky.varioSource - VARIO_SOURCE_A1; if (varioSource < 2) { - frskyData.hub.varioSpeed = applyChannelRatio(varioSource, frskyData.analog[varioSource].value); + telemetryData.hub.varioSpeed = applyChannelRatio(varioSource, telemetryData.analog[varioSource].value); } #endif break; diff --git a/radio/src/telemetry/frsky_d_arm.cpp b/radio/src/telemetry/frsky_d_arm.cpp index d2172da01..1e476b7b0 100644 --- a/radio/src/telemetry/frsky_d_arm.cpp +++ b/radio/src/telemetry/frsky_d_arm.cpp @@ -73,8 +73,8 @@ void frskyDProcessPacket(uint8_t *packet) setTelemetryValue(TELEM_PROTO_FRSKY_D, D_A1_ID, 0, 0, packet[1], UNIT_VOLTS, 0); setTelemetryValue(TELEM_PROTO_FRSKY_D, D_A2_ID, 0, 0, packet[2], UNIT_VOLTS, 0); setTelemetryValue(TELEM_PROTO_FRSKY_D, D_RSSI_ID, 0, 0, packet[3], UNIT_RAW, 0); - frskyData.rssi.set(packet[3]); - frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected + telemetryData.rssi.set(packet[3]); + telemetryStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected break; } @@ -178,8 +178,8 @@ void processHubPacket(uint8_t id, int16_t value) } else if (id == BARO_ALT_AP_ID) { if (lastId == BARO_ALT_BP_ID) { - if (data > 9 || frskyData.varioHighPrecision) { - frskyData.varioHighPrecision = true; + if (data > 9 || telemetryData.varioHighPrecision) { + telemetryData.varioHighPrecision = true; data /= 10; // map hi precision vario into low precision. Altitude is stored in 0.1m anyways } data = (int16_t)lastValue * 10 + (((int16_t)lastValue < 0) ? -data : data); diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index ba77828bf..a9cd0d17c 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -212,32 +212,32 @@ void processSportPacket(uint8_t * packet) uint32_t data = SPORT_DATA_S32(packet); if (id == RSSI_ID) { - frskyStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected + telemetryStreaming = FRSKY_TIMEOUT10ms; // reset counter only if valid frsky packets are being detected data = SPORT_DATA_U8(packet); if (data == 0) - frskyData.rssi.reset(); + telemetryData.rssi.reset(); else - frskyData.rssi.set(data); + telemetryData.rssi.set(data); } #if defined(PCBTARANIS) && defined(REVPLUS) else if (id == XJT_VERSION_ID) { - frskyData.xjtVersion = HUB_DATA_U16(packet); + telemetryData.xjtVersion = HUB_DATA_U16(packet); if (!IS_VALID_XJT_VERSION()) { - frskyData.swr.set(0x00); + telemetryData.swr.set(0x00); } } else if (id == SWR_ID) { if (IS_VALID_XJT_VERSION()) - frskyData.swr.set(SPORT_DATA_U8(packet)); + telemetryData.swr.set(SPORT_DATA_U8(packet)); else - frskyData.swr.set(0x00); + telemetryData.swr.set(0x00); } #else else if (id == XJT_VERSION_ID) { - frskyData.xjtVersion = HUB_DATA_U16(packet); + telemetryData.xjtVersion = HUB_DATA_U16(packet); } else if (id == SWR_ID) { - frskyData.swr.set(SPORT_DATA_U8(packet)); + telemetryData.swr.set(SPORT_DATA_U8(packet)); } #endif @@ -339,7 +339,7 @@ bool sportWaitState(SportUpdateState state, int timeout) for (int i=timeout/2; i>=0; i--) { uint8_t byte ; while (telemetryGetByte(&byte)) { - processSerialData(byte); + processFrskyTelemetryData(byte); } if (sportUpdateState == state) { return true; diff --git a/radio/src/telemetry/mavlink.h b/radio/src/telemetry/mavlink.h index 8c80b3bf7..fb2281259 100644 --- a/radio/src/telemetry/mavlink.h +++ b/radio/src/telemetry/mavlink.h @@ -1,29 +1,29 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * 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. - */ - +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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. + */ + /*! \file mavlink.h * Mavlink include file */ -#ifndef _MAVLINK_H_ -#define _MAVLINK_H_ +#ifndef _MAVLINK_H_ +#define _MAVLINK_H_ #define MAVLINK_USE_CONVENIENCE_FUNCTIONS #define MAVLINK_COMM_NUM_BUFFERS 1 @@ -32,11 +32,11 @@ #include "targets/common_avr/serial_driver.h" #include "opentx.h" -extern int8_t mav_heartbeat; +extern int8_t mav_heartbeat; extern mavlink_system_t mavlink_system; -#define LEN_STATUSTEXT 20 -extern char mav_statustext[LEN_STATUSTEXT]; - +#define LEN_STATUSTEXT 20 +extern char mav_statustext[LEN_STATUSTEXT]; + extern void SERIAL_start_uart_send(); extern void SERIAL_end_uart_send(); extern void SERIAL_send_uart_bytes(const uint8_t * buf, uint16_t len); @@ -321,5 +321,5 @@ inline uint8_t getPrecisMavlinParamsValue(uint8_t idx) { void lcd_outdezFloat(uint8_t x, uint8_t y, float val, uint8_t precis, uint8_t mode); #endif -#endif // _MAVLINK_H_ +#endif // _MAVLINK_H_ diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 5b723fcfd..da756c6ef 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -18,676 +18,441 @@ * GNU General Public License for more details. */ -#include "../opentx.h" +#include "opentx.h" -TelemetryItem telemetryItems[MAX_SENSORS]; -uint8_t allowNewSensors; +uint8_t telemetryStreaming = 0; +uint8_t telemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) +uint8_t telemetryRxBufferCount = 0; -void TelemetryItem::gpsReceived() +#if defined(WS_HOW_HIGH) +uint8_t wshhStreaming = 0; +#endif + +uint8_t link_counter = 0; + +#if defined(CPUARM) +uint8_t telemetryState = TELEMETRY_INIT; +#endif + +TelemetryData telemetryData; + +#if defined(CPUARM) +uint8_t telemetryProtocol = 255; +#if defined(REVX) +uint8_t serialInversion = 0; +#endif +#endif + +#if defined(PCBSKY9X) && defined(REVX) +uint8_t serialInversion = 0; +#endif + +#if !defined(CPUARM) +uint16_t getChannelRatio(source_t channel) { - if (!distFromEarthAxis) { - gps.extractLatitudeLongitude(&pilotLatitude, &pilotLongitude); - uint32_t lat = pilotLatitude / 10000; - uint32_t angle2 = (lat*lat) / 10000; - uint32_t angle4 = angle2 * angle2; - distFromEarthAxis = 139*(((uint32_t)10000000-((angle2*(uint32_t)123370)/81)+(angle4/25))/12500); - } - lastReceived = now(); + return (uint16_t)g_model.frsky.channels[channel].ratio << g_model.frsky.channels[channel].multiplier; } -void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32_t unit, uint32_t prec) +lcdint_t applyChannelRatio(source_t channel, lcdint_t val) { - int32_t newVal = val; + return ((int32_t)val+g_model.frsky.channels[channel].offset) * getChannelRatio(channel) * 2 / 51; +} +#endif - if (unit == UNIT_CELLS) { - uint32_t data = uint32_t(newVal); - uint8_t cellsCount = (data >> 24); - uint8_t cellIndex = ((data >> 16) & 0x0F); - uint16_t cellValue = (data & 0xFFFF); - if (cellsCount == 0) { - cellsCount = (cellIndex >= cells.count ? cellIndex + 1 : cells.count); - if (cellsCount != cells.count) { - clear(); - cells.count = cellsCount; - // we skip this round as we are not sure we received all cells values - return; - } - } - else if (cellsCount != cells.count) { - clear(); - cells.count = cellsCount; - } - cells.values[cellIndex].set(cellValue); - if (cellIndex+1 == cells.count) { - newVal = 0; - for (int i=0; i> 24); - datetime.month = (uint8_t) ((data & 0x00ff0000) >> 16); - datetime.day = (uint8_t) ((data & 0x0000ff00) >> 8); - if (datetime.year != 0) { - datetime.datestate = 1; - } -#if defined(RTCLOCK) - if (g_eeGeneral.adjustRTC && (datetime.datestate == 1)) { - struct gtm t; - gettime(&t); - t.tm_year = datetime.year+4; - t.tm_mon = datetime.month-1; - t.tm_mday = datetime.day; - rtcSetTime(&t); - } #endif - } - else { - datetime.hour = ((uint8_t) ((data & 0xff000000) >> 24) + g_eeGeneral.timezone + 24) % 24; - datetime.min = (uint8_t) ((data & 0x00ff0000) >> 16); - datetime.sec = (uint16_t) ((data & 0x0000ff00) >> 8); - if (datetime.datestate == 1) { - datetime.timestate = 1; - } -#if defined(RTCLOCK) - if (g_eeGeneral.adjustRTC && datetime.datestate == 1) { - struct gtm t; - gettime(&t); - if (abs((t.tm_hour-datetime.hour)*3600 + (t.tm_min-datetime.min)*60 + (t.tm_sec-datetime.sec)) > 20) { - // we adjust RTC only if difference is > 20 seconds - t.tm_hour = datetime.hour; - t.tm_min = datetime.min; - t.tm_sec = datetime.sec; - g_rtcTime = gmktime(&t); // update local timestamp and get wday calculated - rtcSetTime(&t); - } - } -#endif - } - if (datetime.year == 0) { - return; - } - newVal = 0; } - else if (unit == UNIT_GPS) { - uint32_t gps_long_lati_data = uint32_t(newVal); - uint32_t gps_long_lati_b1w, gps_long_lati_a1w; - gps_long_lati_b1w = (gps_long_lati_data & 0x3fffffff) / 10000; - gps_long_lati_a1w = (gps_long_lati_data & 0x3fffffff) % 10000; - switch ((gps_long_lati_data & 0xc0000000) >> 30) { - case 0: - gps.latitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); - gps.latitude_ap = gps_long_lati_a1w; - gps.latitudeNS = 'N'; - break; - case 1: - gps.latitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); - gps.latitude_ap = gps_long_lati_a1w; - gps.latitudeNS = 'S'; - break; - case 2: - gps.longitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); - gps.longitude_ap = gps_long_lati_a1w; - gps.longitudeEW = 'E'; - break; - case 3: - gps.longitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); - gps.longitude_ap = gps_long_lati_a1w; - gps.longitudeEW = 'W'; - break; - } - if (gps.longitudeEW && gps.latitudeNS) { - gpsReceived(); - } - return; - } - else if (unit >= UNIT_GPS_LONGITUDE && unit <= UNIT_GPS_LATITUDE_NS) { - uint32_t data = uint32_t(newVal); - switch (unit) { - case UNIT_GPS_LONGITUDE: - gps.longitude_bp = data >> 16; - gps.longitude_ap = data & 0xFFFF; - break; - case UNIT_GPS_LATITUDE: - gps.latitude_bp = data >> 16; - gps.latitude_ap = data & 0xFFFF; - break; - case UNIT_GPS_LONGITUDE_EW: - gps.longitudeEW = data; - break; - case UNIT_GPS_LATITUDE_NS: - gps.latitudeNS = data; - break; - } - if (gps.longitudeEW && gps.latitudeNS && gps.longitude_ap && gps.latitude_ap) { - gpsReceived(); - } - return; - } - else if (unit == UNIT_DATETIME_YEAR) { - datetime.year = newVal; - return; - } - else if (unit == UNIT_DATETIME_DAY_MONTH) { - uint32_t data = uint32_t(newVal); - datetime.month = data >> 8; - datetime.day = data & 0xFF; - datetime.datestate = 1; - return; - } - else if (unit == UNIT_DATETIME_HOUR_MIN) { - uint32_t data = uint32_t(newVal); - datetime.hour = ((data & 0xFF) + g_eeGeneral.timezone + 24) % 24; - datetime.min = data >> 8; - } - else if (unit == UNIT_DATETIME_SEC) { - datetime.sec = newVal & 0xFF; - datetime.timestate = 1; - newVal = 0; - } - else if (unit == UNIT_RPMS) { - if (sensor.custom.ratio != 0) { - newVal = (newVal * sensor.custom.offset) / sensor.custom.ratio; +#elif defined(PCBSKY9X) + if (telemetryProtocol == PROTOCOL_FRSKY_D_SECONDARY) { + uint8_t data; + while (telemetrySecondPortReceive(data)) { + processFrskyTelemetryData(data); } } else { - newVal = sensor.getValue(newVal, unit, prec); - if (sensor.autoOffset) { - if (!isAvailable()) { - std.offsetAuto = -newVal; - } - newVal += std.offsetAuto; - } - else if (sensor.filter) { - if (!isAvailable()) { - for (int i=0; i valueMax) { - valueMax = newVal; - if (sensor.unit == UNIT_VOLTS) { - valueMin = newVal; // the batt was changed +#if !defined(CPUARM) + if (IS_FRSKY_D_PROTOCOL()) { + // Attempt to transmit any waiting Fr-Sky alarm set packets every 50ms (subject to packet buffer availability) + static uint8_t frskyTxDelay = 5; + if (frskyAlarmsSendState && (--frskyTxDelay == 0)) { + frskyTxDelay = 5; // 50ms +#if !defined(SIMU) + frskyDSendNextAlarm(); +#endif } } +#endif +#if defined(CPUARM) for (int i=0; i 0x33) +#else + #define FRSKY_BAD_ANTENNA() (telemetryData.swr.value > 0x33) +#endif + +#if defined(CPUARM) + static tmr10ms_t alarmsCheckTime = 0; + #define SCHEDULE_NEXT_ALARMS_CHECK(seconds) alarmsCheckTime = get_tmr10ms() + (100*(seconds)) + if (int32_t(get_tmr10ms() - alarmsCheckTime) > 0) { + + SCHEDULE_NEXT_ALARMS_CHECK(1/*second*/); + + uint8_t now = TelemetryItem::now(); + bool sensor_lost = false; + for (int i=0; i TELEMETRY_VALUE_OLD_THRESHOLD) { + sensor_lost = true; + telemetryItems[i].lastReceived = TELEMETRY_VALUE_OLD; + TelemetrySensor * sensor = & g_model.telemetrySensors[i]; + if (sensor->unit == UNIT_DATETIME) { + telemetryItems[i].datetime.datestate = 0; + telemetryItems[i].datetime.timestate = 0; + } + } + } + } + if (sensor_lost && TELEMETRY_STREAMING()) { + audioEvent(AU_SENSOR_LOST); + } + +#if defined(PCBTARANIS) + if ((g_model.moduleData[INTERNAL_MODULE].rfProtocol != RF_PROTO_OFF || g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_XJT) && FRSKY_BAD_ANTENNA()) { + AUDIO_SWR_RED(); + POPUP_WARNING(STR_ANTENNAPROBLEM); + SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); + } +#endif + + if (TELEMETRY_STREAMING()) { + if (getRssiAlarmValue(1) && TELEMETRY_RSSI() < getRssiAlarmValue(1)) { + AUDIO_RSSI_RED(); + SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); + } + else if (getRssiAlarmValue(0) && TELEMETRY_RSSI() < getRssiAlarmValue(0)) { + AUDIO_RSSI_ORANGE(); + SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); + } } } - value = newVal; - lastReceived = now(); + if (TELEMETRY_STREAMING()) { + if (telemetryState == TELEMETRY_KO) { + AUDIO_TELEMETRY_BACK(); + } + telemetryState = TELEMETRY_OK; + } + else if (telemetryState == TELEMETRY_OK) { + telemetryState = TELEMETRY_KO; + AUDIO_TELEMETRY_LOST(); + } +#endif } -bool TelemetryItem::isAvailable() +void telemetryInterrupt10ms() { - return (lastReceived != TELEMETRY_VALUE_UNAVAILABLE); -} +#if defined(FRSKY_HUB) && !defined(CPUARM) + uint16_t voltage = 0; /* unit: 1/10 volts */ + for (uint8_t i=0; i= 3600) { - currentItem.consumption.prescale -= 3600; - setValue(sensor, value+1, sensor.unit, sensor.prec); - } - lastReceived = now(); } - break; +#else + // power calculation + uint8_t channel = g_model.frsky.voltsSource; + if (channel <= FRSKY_VOLTS_SOURCE_A2) { + voltage = applyChannelRatio(channel, telemetryData.analog[channel].value) / 10; + } - default: - break; +#if defined(FRSKY_HUB) + else if (channel == FRSKY_VOLTS_SOURCE_FAS) { + voltage = telemetryData.hub.vfas; + } +#endif + +#if defined(FRSKY_HUB) + uint16_t current = telemetryData.hub.current; /* unit: 1/10 amps */ +#else + uint16_t current = 0; +#endif + + channel = g_model.frsky.currentSource - FRSKY_CURRENT_SOURCE_A1; + if (channel < MAX_FRSKY_A_CHANNELS) { + current = applyChannelRatio(channel, telemetryData.analog[channel].value) / 10; + } + + telemetryData.hub.power = ((current>>1) * (voltage>>1)) / 25; + + telemetryData.hub.currentPrescale += current; + if (telemetryData.hub.currentPrescale >= 3600) { + telemetryData.hub.currentConsumption += 1; + telemetryData.hub.currentPrescale -= 3600; + } +#endif + } + +#if !defined(CPUARM) + if (telemetryData.hub.power > telemetryData.hub.maxPower) { + telemetryData.hub.maxPower = telemetryData.hub.power; + } +#endif + } + +#if defined(WS_HOW_HIGH) + if (wshhStreaming > 0) { + wshhStreaming--; + } +#endif + + if (telemetryStreaming > 0) { + telemetryStreaming--; + } + else { +#if !defined(SIMU) +#if defined(CPUARM) + telemetryData.rssi.reset(); +#else + telemetryData.rssi[0].set(0); + telemetryData.rssi[1].set(0); +#endif +#endif } } -void TelemetryItem::eval(const TelemetrySensor & sensor) +void telemetryReset() { - switch (sensor.formula) { - case TELEM_FORMULA_CELL: - if (sensor.cell.source) { - TelemetryItem & cellsItem = telemetryItems[sensor.cell.source-1]; - if (cellsItem.isOld()) { - lastReceived = TELEMETRY_VALUE_OLD; - } - else { - unsigned int index = sensor.cell.index; - if (index == TELEM_CELL_INDEX_LOWEST || index == TELEM_CELL_INDEX_HIGHEST || index == TELEM_CELL_INDEX_DELTA) { - unsigned int lowest=0, highest=0; - for (int i=0; i cellsItem.cells.values[highest-1].value) - highest = i+1; - } - else { - lowest = highest = 0; - } - } - if (lowest) { - switch (index) { - case TELEM_CELL_INDEX_LOWEST: - setValue(sensor, cellsItem.cells.values[lowest-1].value, UNIT_VOLTS, 2); - break; - case TELEM_CELL_INDEX_HIGHEST: - setValue(sensor, cellsItem.cells.values[highest-1].value, UNIT_VOLTS, 2); - break; - case TELEM_CELL_INDEX_DELTA: - setValue(sensor, cellsItem.cells.values[highest-1].value - cellsItem.cells.values[lowest-1].value, UNIT_VOLTS, 2); - break; - } - } - } - else { - index -= 1; - if (index < cellsItem.cells.count && cellsItem.cells.values[index].state) { - setValue(sensor, cellsItem.cells.values[index].value, UNIT_VOLTS, 2); - } - } - } - } - break; + memclear(&telemetryData, sizeof(telemetryData)); - case TELEM_FORMULA_DIST: - if (sensor.dist.gps) { - TelemetryItem gpsItem = telemetryItems[sensor.dist.gps-1]; - TelemetryItem * altItem = NULL; - if (!gpsItem.isAvailable()) { - return; - } - else if (gpsItem.isOld()) { - lastReceived = TELEMETRY_VALUE_OLD; - return; - } - if (sensor.dist.alt) { - altItem = &telemetryItems[sensor.dist.alt-1]; - if (!altItem->isAvailable()) { - return; - } - else if (altItem->isOld()) { - lastReceived = TELEMETRY_VALUE_OLD; - return; - } - } - uint32_t latitude, longitude; - gpsItem.gps.extractLatitudeLongitude(&latitude, &longitude); +#if defined(CPUARM) + for (int index=0; index gpsItem.pilotLatitude) ? latitude - gpsItem.pilotLatitude : gpsItem.pilotLatitude - latitude; - uint32_t dist = EARTH_RADIUS * angle / 1000000; - uint32_t result = dist*dist; + telemetryStreaming = 0; // reset counter only if valid frsky packets are being detected + link_counter = 0; - angle = (longitude > gpsItem.pilotLongitude) ? longitude - gpsItem.pilotLongitude : gpsItem.pilotLongitude - longitude; - dist = gpsItem.distFromEarthAxis * angle / 1000000; - result += dist*dist; +#if defined(CPUARM) + telemetryState = TELEMETRY_INIT; +#endif - if (altItem) { - dist = abs(altItem->value) / g_model.telemetrySensors[sensor.dist.alt-1].getPrecDivisor(); - result += dist*dist; - } +#if defined(FRSKY_HUB) && !defined(CPUARM) + telemetryData.hub.gpsLatitude_bp = 2; + telemetryData.hub.gpsLongitude_bp = 2; + telemetryData.hub.gpsFix = -1; +#endif - setValue(sensor, isqrt32(result), UNIT_METERS); - } - break; +#if defined(SIMU) - case TELEM_FORMULA_ADD: - case TELEM_FORMULA_AVERAGE: - case TELEM_FORMULA_MIN: - case TELEM_FORMULA_MAX: - case TELEM_FORMULA_MULTIPLY: +#if defined(CPUARM) + telemetryData.swr.value = 30; + telemetryData.rssi.value = 75; +#else + telemetryData.rssi[0].value = 75; + telemetryData.rssi[1].value = 75; + telemetryData.analog[TELEM_ANA_A1].set(120, UNIT_VOLTS); + telemetryData.analog[TELEM_ANA_A2].set(240, UNIT_VOLTS); +#endif + +#if !defined(CPUARM) + telemetryData.hub.fuelLevel = 75; + telemetryData.hub.rpm = 12000; + telemetryData.hub.vfas = 100; + telemetryData.hub.minVfas = 90; + +#if defined(GPS) + telemetryData.hub.gpsFix = 1; + telemetryData.hub.gpsLatitude_bp = 4401; + telemetryData.hub.gpsLatitude_ap = 7710; + telemetryData.hub.gpsLongitude_bp = 1006; + telemetryData.hub.gpsLongitude_ap = 8872; + telemetryData.hub.gpsSpeed_bp = 200; //in knots + telemetryData.hub.gpsSpeed_ap = 0; + getGpsPilotPosition(); + + telemetryData.hub.gpsLatitude_bp = 4401; + telemetryData.hub.gpsLatitude_ap = 7455; + telemetryData.hub.gpsLongitude_bp = 1006; + telemetryData.hub.gpsLongitude_ap = 9533; + getGpsDistance(); +#endif + + telemetryData.hub.airSpeed = 1000; // 185.1 km/h + + telemetryData.hub.cellsCount = 6; + telemetryData.hub.cellVolts[0] = 410/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.cellVolts[1] = 420/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.cellVolts[2] = 430/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.cellVolts[3] = 440/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.cellVolts[4] = 450/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.cellVolts[5] = 460/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.minCellVolts = 250/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER; + telemetryData.hub.minCell = 300; //unit 10mV + telemetryData.hub.minCells = 220; //unit 100mV + //telemetryData.hub.cellsSum = 261; //calculated from cellVolts[] + + telemetryData.hub.gpsAltitude_bp = 50; + telemetryData.hub.baroAltitude_bp = 50; + telemetryData.hub.minAltitude = 10; + telemetryData.hub.maxAltitude = 500; + + telemetryData.hub.accelY = 100; + telemetryData.hub.temperature1 = -30; + telemetryData.hub.maxTemperature1 = 100; + + telemetryData.hub.current = 55; + telemetryData.hub.maxCurrent = 65; +#endif +#endif + +/*Add some default sensor values to the simulator*/ +#if defined(CPUARM) && defined(SIMU) + for (int i=0; i(value, sensorValue)); - else if (sensor.formula == TELEM_FORMULA_MAX) - value = (count==1 ? sensorValue : max(value, sensorValue)); - else - value += sensorValue; - } - } - } - if (sensor.formula == TELEM_FORMULA_AVERAGE) { - if (count == 0) { - if (available) - lastReceived = TELEMETRY_VALUE_OLD; - return; - } - else { - value = (value + count/2) / count; - } - } - else if (sensor.formula == TELEM_FORMULA_MULTIPLY) { - if (count == 0) - return; - value = convertTelemetryValue(value, sensor.unit, mulprec, sensor.unit, sensor.prec); - } - setValue(sensor, value, sensor.unit, sensor.prec); - break; - } - - default: - break; - } -} - -void delTelemetryIndex(uint8_t index) -{ - memclear(&g_model.telemetrySensors[index], sizeof(TelemetrySensor)); - telemetryItems[index].clear(); - storageDirty(EE_MODEL); -} - -int availableTelemetryIndex() -{ - for (int index=0; index=0; index--) { - TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index]; - if (telemetrySensor.isAvailable()) { - return index; - } - } - return -1; -} - -void setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, uint8_t instance, int32_t value, uint32_t unit, uint32_t prec) -{ - bool available = false; - - for (int index=0; index= 0) { - switch (protocol) { -#if defined(FRSKY_SPORT) - case TELEM_PROTO_FRSKY_SPORT: - frskySportSetDefault(index, id, subId, instance); + case RSSI_ID: + setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, RSSI_ID, 0, sensor.instance , 75, UNIT_RAW, 0); break; + case ADC1_ID: + setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, ADC1_ID, 0, sensor.instance, 100, UNIT_RAW, 0); + break; + case ADC2_ID: + setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, ADC2_ID, 0, sensor.instance, 245, UNIT_RAW, 0); + break; + case SWR_ID: + setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, SWR_ID, 0, sensor.instance, 30, UNIT_RAW, 0); + break; + case BATT_ID: + setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, BATT_ID, 0, sensor.instance, 100, UNIT_RAW, 0); + break; + } + } #endif -#if defined(FRSKY) - case TELEM_PROTO_FRSKY_D: - frskyDSetDefault(index, id); - break; +} + +#if defined(CPUARM) +// we don't reset the telemetry here as we would also reset the consumption after model load +void telemetryInit(uint8_t protocol) +{ + if (protocol == PROTOCOL_FRSKY_D) { + telemetryPortInit(FRSKY_D_BAUDRATE); + } +#if defined(CROSSFIRE) + else if (protocol == PROTOCOL_PULSES_CROSSFIRE) { + telemetryPortInit(CROSSFIRE_BAUDRATE); + telemetryPortSetDirectionOutput(); + } #endif - default: - return; - } - telemetryItems[index].setValue(g_model.telemetrySensors[index], value, unit, prec); + else if (protocol == PROTOCOL_FRSKY_D_SECONDARY) { + telemetryPortInit(0); + serial2TelemetryInit(PROTOCOL_FRSKY_D_SECONDARY); } else { - POPUP_WARNING(STR_TELEMETRYFULL); + telemetryPortInit(FRSKY_SPORT_BAUDRATE); } -} -void TelemetrySensor::init(const char * label, uint8_t unit, uint8_t prec) -{ - memclear(this->label, TELEM_LABEL_LEN); - strncpy(this->label, label, TELEM_LABEL_LEN); - this->unit = unit; - if (prec > 1 && (IS_DISTANCE_UNIT(unit) || IS_SPEED_UNIT(unit))) { - // 2 digits precision is not needed here - prec = 1; - } - this->prec = prec; -} - -void TelemetrySensor::init(uint16_t id) -{ - char label[4]; - label[0] = hex2zchar((id & 0xf000) >> 12); - label[1] = hex2zchar((id & 0x0f00) >> 8); - label[2] = hex2zchar((id & 0x00f0) >> 4); - label[3] = hex2zchar((id & 0x000f) >> 0); - init(label); -} - -bool TelemetrySensor::isAvailable() const -{ - return ZLEN(label) > 0; -} - -PACK(typedef struct { - uint8_t unitFrom; - uint8_t unitTo; - int16_t multiplier; - int16_t divisor; -}) UnitConversionRule; - -const UnitConversionRule unitConversionTable[] = { - /* unitFrom unitTo multiplier divisor */ - { UNIT_METERS, UNIT_FEET, 105, 32}, - { UNIT_METERS_PER_SECOND, UNIT_FEET_PER_SECOND, 105, 32}, - - { UNIT_KTS, UNIT_KMH, 1852, 1000}, // 1 knot = 1.85200 kilometers per hour - { UNIT_KTS, UNIT_MPH, 1151, 1000}, // 1 knot = 1.15077945 miles per hour - { UNIT_KTS, UNIT_METERS_PER_SECOND, 1000, 1944}, // 1 knot = 0.514444444 meters / second (divide with 1.94384449) - { UNIT_KTS, UNIT_FEET_PER_SECOND, 1688, 1000}, // 1 knot = 1.68780986 feet per second - - { UNIT_KMH, UNIT_KTS, 1000, 1852}, // 1 km/h = 0.539956803 knots (divide with 1.85200) - { UNIT_KMH, UNIT_MPH, 1000, 1609}, // 1 km/h = 0.621371192 miles per hour (divide with 1.60934400) - { UNIT_KMH, UNIT_METERS_PER_SECOND, 10, 36}, // 1 km/h = 0.277777778 meters / second (divide with 3.6) - { UNIT_KMH, UNIT_FEET_PER_SECOND, 911, 1000}, // 1 km/h = 0.911344415 feet per second - - { UNIT_MILLILITERS, UNIT_FLOZ, 100, 2957}, - { 0, 0, 0, 0} // termination -}; - -int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t destUnit, uint8_t destPrec) -{ - for (int i=prec; idivisor) { - if (p->unitFrom == unit && p->unitTo == destUnit) { - value = (value * (int32_t)p->multiplier) / (int32_t)p->divisor; - break; - } - ++p; - } + clearMFP(); } - - for (int i=destPrec; iprec == 2) { - value *= 10; - prec = 2; - } - else { - prec = 1; - } - value = (custom.ratio * value + 122) / 255; - } - - value = convertTelemetryValue(value, unit, prec, this->unit, this->prec); - - if (type == TELEM_TYPE_CUSTOM) { - value += custom.offset; - if (value < 0 && onlyPositive) { - value = 0; - } - } - - return value; + telemetryPortInit(); } +#endif -bool TelemetrySensor::isConfigurable() const +NOINLINE uint8_t getRssiAlarmValue(uint8_t alarm) { - if (type == TELEM_TYPE_CALCULATED) { - if (formula >= TELEM_FORMULA_CELL) { - return false; - } - } - else { - if (unit >= UNIT_FIRST_VIRTUAL) { - return false; - } - } - return true; + return (45 - 3*alarm + g_model.frsky.rssiAlarms[alarm].value); } -bool TelemetrySensor::isPrecConfigurable() const -{ - if (isConfigurable()) { - return true; - } - else if (unit == UNIT_CELLS) { - return true; - } - else { - return false; - } -} - -int32_t TelemetrySensor::getPrecMultiplier() const -{ - /* - Important: the return type must be signed, otherwise - mathematic operations with a negative telemetry value won't work - */ - if (prec == 2) return 1; - if (prec == 1) return 10; - return 100; -} - -int32_t TelemetrySensor::getPrecDivisor() const -{ - if (prec == 2) return 100; - if (prec == 1) return 10; - return 1; -} +#if defined(LUA) +Fifo * luaInputTelemetryFifo = NULL; +Fifo * luaOutputTelemetryFifo = NULL; +#endif diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 36b3f695d..d14f4f0e7 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -21,12 +21,49 @@ #ifndef _TELEMETRY_H_ #define _TELEMETRY_H_ -enum TelemetryProtocol -{ - TELEM_PROTO_FRSKY_D, - TELEM_PROTO_FRSKY_SPORT, -}; +#if defined(FRSKY) + // FrSky Telemetry + #include "frsky.h" +#elif defined(JETI) + // Jeti-DUPLEX Telemetry + #include "jeti.h" +#elif defined(ARDUPILOT) + // ArduPilot Telemetry + #include "ardupilot.h" +#elif defined(NMEA) + // NMEA Telemetry + #include "nmea.h" +#elif defined(MAVLINK) + // Mavlink Telemetry + #include "mavlink.h" +#endif +#if defined(CROSSFIRE) + #include "crossfire.h" +#endif + +extern uint8_t telemetryStreaming; // >0 (true) == data is streaming in. 0 = no data detected for some time + +#if defined(WS_HOW_HIGH) +extern uint8_t wshhStreaming; +#endif + +extern uint8_t link_counter; + +#if defined(CPUARM) +enum TelemetryStates { + TELEMETRY_INIT, + TELEMETRY_OK, + TELEMETRY_KO +}; +extern uint8_t telemetryState; +#endif + +#define TELEMETRY_RX_PACKET_SIZE 19 // 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) +extern uint8_t telemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE]; +extern uint8_t telemetryRxBufferCount; + +#if defined(CPUARM) #define TELEMETRY_VALUE_TIMER_CYCLE 200 /*20 seconds*/ #define TELEMETRY_VALUE_OLD_THRESHOLD 150 /*15 seconds*/ #define TELEMETRY_VALUE_UNAVAILABLE 255 @@ -60,108 +97,49 @@ PACK(struct CellValue } }); -class TelemetryItem -{ - public: - union { - int32_t value; // value, stored as uint32_t but interpreted accordingly to type - uint32_t distFromEarthAxis; - }; - - union { - int32_t valueMin; // min store - uint32_t pilotLongitude; - }; - - union { - int32_t valueMax; // max store - uint32_t pilotLatitude; - }; - - uint8_t lastReceived; // for detection of sensor loss - - union { - struct { - int32_t offsetAuto; - int32_t filterValues[TELEMETRY_AVERAGE_COUNT]; - } std; - struct { - uint16_t prescale; - } consumption; - struct { - uint8_t count; - CellValue values[6]; - } cells; - struct { - uint8_t datestate; - uint16_t year; - uint8_t month; - uint8_t day; - uint8_t timestate; - uint8_t hour; - uint8_t min; - uint8_t sec; - } datetime; - struct { - uint16_t longitude_bp; - uint16_t longitude_ap; - char longitudeEW; - uint16_t latitude_bp; - uint16_t latitude_ap; - char latitudeNS; - // pilot longitude is stored in min - // pilot latitude is stored in max - // distFromEarthAxis is stored in value - void extractLatitudeLongitude(uint32_t * latitude, uint32_t * longitude) - { - div_t qr = div(latitude_bp, 100); - *latitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + latitude_ap) * 5) / 3; - qr = div(longitude_bp, 100); - *longitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + longitude_ap) * 5) / 3; - } - } gps; - }; - - static uint8_t now() - { - return (get_tmr10ms() / 10) % TELEMETRY_VALUE_TIMER_CYCLE; - } - - TelemetryItem() - { - clear(); - } - - void clear() - { - memset(this, 0, sizeof(*this)); - lastReceived = TELEMETRY_VALUE_UNAVAILABLE; - } - - void eval(const TelemetrySensor & sensor); - void per10ms(const TelemetrySensor & sensor); - - void setValue(const TelemetrySensor & sensor, int32_t newVal, uint32_t unit, uint32_t prec=0); - bool isAvailable(); - bool isFresh(); - bool isOld(); - void gpsReceived(); -}; - -extern TelemetryItem telemetryItems[MAX_SENSORS]; -extern uint8_t allowNewSensors; - void setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, uint8_t instance, int32_t value, uint32_t unit, uint32_t prec); void delTelemetryIndex(uint8_t index); int availableTelemetryIndex(); int lastUsedTelemetryIndex(); + int32_t getTelemetryValue(uint8_t index, uint8_t & prec); int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t destUnit, uint8_t destPrec); void frskySportSetDefault(int index, uint16_t id, uint8_t subId, uint8_t instance); void frskyDSetDefault(int index, uint16_t id); +#endif #define IS_DISTANCE_UNIT(unit) ((unit) == UNIT_METERS || (unit) == UNIT_FEET) #define IS_SPEED_UNIT(unit) ((unit) >= UNIT_KTS && (unit) <= UNIT_MPH) +#if defined(CPUARM) +extern uint8_t telemetryProtocol; +#define IS_FRSKY_D_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_D) +#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_SPORT) +#else +#define IS_FRSKY_D_PROTOCOL() (true) +#define IS_FRSKY_SPORT_PROTOCOL() (false) +#endif + +#if defined(CPUSTM32) +inline uint8_t modelTelemetryProtocol() +{ +#if defined(CROSSFIRE) + if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_CROSSFIRE) + return PROTOCOL_PULSES_CROSSFIRE; +#endif + if (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) + return g_model.telemetryProtocol; + else + return PROTOCOL_FRSKY_SPORT; +} +#define MODEL_TELEMETRY_PROTOCOL() modelTelemetryProtocol() +#elif defined(CPUARM) +#define MODEL_TELEMETRY_PROTOCOL() g_model.telemetryProtocol +#endif + +#if defined(CPUARM) + #include "telemetry_sensors.h" +#endif + #endif // _TELEMETRY_H_ diff --git a/radio/src/telemetry/telemetry_holders.cpp b/radio/src/telemetry/telemetry_holders.cpp new file mode 100644 index 000000000..edcbc14d2 --- /dev/null +++ b/radio/src/telemetry/telemetry_holders.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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" + +#if defined(CPUARM) +void TelemetryValueWithMin::reset() +{ + memclear(this, sizeof(*this)); +} +#endif + +void TelemetryValueWithMin::set(uint8_t value) +{ +#if defined(CPUARM) + if (this->value == 0) { + memset(values, value, TELEMETRY_AVERAGE_COUNT); + this->value = value; + } + else { + //calculate the average from values[] and value + //also shift readings in values [] array + unsigned int sum = values[0]; + for (int i=0; ivalue = sum/(TELEMETRY_AVERAGE_COUNT+1); + } +#else + if (this->value == 0) { + this->value = value; + } + else { + sum += value; + if (link_counter == 0) { + this->value = sum / (IS_FRSKY_D_PROTOCOL() ? FRSKY_D_AVERAGING : FRSKY_SPORT_AVERAGING); + sum = 0; + } + } +#endif + + if (!min || value < min) { + min = value; + } +} + +void TelemetryValueWithMinMax::set(uint8_t value, uint8_t unit) +{ + TelemetryValueWithMin::set(value); + if (unit != UNIT_VOLTS) { + this->value = value; + } + if (!max || value > max) { + max = value; + } +} diff --git a/radio/src/telemetry/telemetry_holders.h b/radio/src/telemetry/telemetry_holders.h new file mode 100644 index 000000000..1068686d9 --- /dev/null +++ b/radio/src/telemetry/telemetry_holders.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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. + */ + +#ifndef _TELEMETRY_HOLDERS_H_ +#define _TELEMETRY_HOLDERS_H_ + +#include + +#if defined(CPUARM) +#define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading! +#define RAW_FRSKY_MINMAX(v) v.values[TELEMETRY_AVERAGE_COUNT-1] +class TelemetryValueWithMin { + public: + uint8_t value; // fitered value (average of last TELEMETRY_AVERAGE_COUNT+1 values) + uint8_t min; + uint8_t values[TELEMETRY_AVERAGE_COUNT]; + void set(uint8_t value); + void reset(); +}; +#else +#define RAW_FRSKY_MINMAX(v) v.value +class TelemetryValueWithMin { + public: + uint8_t value; + uint8_t min; + uint16_t sum; + void set(uint8_t value); +}; +#endif + +class TelemetryValueWithMinMax: public TelemetryValueWithMin { + public: + uint8_t max; + void set(uint8_t value, uint8_t unit); +}; + +#endif // _TELEMETRY_HOLDERS_H_ \ No newline at end of file diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp new file mode 100644 index 000000000..292bba9f3 --- /dev/null +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -0,0 +1,698 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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" + +TelemetryItem telemetryItems[MAX_SENSORS]; +uint8_t allowNewSensors; + +void TelemetryItem::gpsReceived() +{ + if (!distFromEarthAxis) { + gps.extractLatitudeLongitude(&pilotLatitude, &pilotLongitude); + uint32_t lat = pilotLatitude / 10000; + uint32_t angle2 = (lat*lat) / 10000; + uint32_t angle4 = angle2 * angle2; + distFromEarthAxis = 139*(((uint32_t)10000000-((angle2*(uint32_t)123370)/81)+(angle4/25))/12500); + } + lastReceived = now(); +} + +void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32_t unit, uint32_t prec) +{ + int32_t newVal = val; + + if (unit == UNIT_CELLS) { + uint32_t data = uint32_t(newVal); + uint8_t cellsCount = (data >> 24); + uint8_t cellIndex = ((data >> 16) & 0x0F); + uint16_t cellValue = (data & 0xFFFF); + if (cellsCount == 0) { + cellsCount = (cellIndex >= cells.count ? cellIndex + 1 : cells.count); + if (cellsCount != cells.count) { + clear(); + cells.count = cellsCount; + // we skip this round as we are not sure we received all cells values + return; + } + } + else if (cellsCount != cells.count) { + clear(); + cells.count = cellsCount; + } + cells.values[cellIndex].set(cellValue); + if (cellIndex+1 == cells.count) { + newVal = 0; + for (int i=0; i> 24); + datetime.month = (uint8_t) ((data & 0x00ff0000) >> 16); + datetime.day = (uint8_t) ((data & 0x0000ff00) >> 8); + if (datetime.year != 0) { + datetime.datestate = 1; + } +#if defined(RTCLOCK) + if (g_eeGeneral.adjustRTC && (datetime.datestate == 1)) { + struct gtm t; + gettime(&t); + t.tm_year = datetime.year+4; + t.tm_mon = datetime.month-1; + t.tm_mday = datetime.day; + rtcSetTime(&t); + } +#endif + } + else { + datetime.hour = ((uint8_t) ((data & 0xff000000) >> 24) + g_eeGeneral.timezone + 24) % 24; + datetime.min = (uint8_t) ((data & 0x00ff0000) >> 16); + datetime.sec = (uint16_t) ((data & 0x0000ff00) >> 8); + if (datetime.datestate == 1) { + datetime.timestate = 1; + } +#if defined(RTCLOCK) + if (g_eeGeneral.adjustRTC && datetime.datestate == 1) { + struct gtm t; + gettime(&t); + if (abs((t.tm_hour-datetime.hour)*3600 + (t.tm_min-datetime.min)*60 + (t.tm_sec-datetime.sec)) > 20) { + // we adjust RTC only if difference is > 20 seconds + t.tm_hour = datetime.hour; + t.tm_min = datetime.min; + t.tm_sec = datetime.sec; + g_rtcTime = gmktime(&t); // update local timestamp and get wday calculated + rtcSetTime(&t); + } + } +#endif + } + if (datetime.year == 0) { + return; + } + newVal = 0; + } + else if (unit == UNIT_GPS) { + uint32_t gps_long_lati_data = uint32_t(newVal); + uint32_t gps_long_lati_b1w, gps_long_lati_a1w; + gps_long_lati_b1w = (gps_long_lati_data & 0x3fffffff) / 10000; + gps_long_lati_a1w = (gps_long_lati_data & 0x3fffffff) % 10000; + switch ((gps_long_lati_data & 0xc0000000) >> 30) { + case 0: + gps.latitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); + gps.latitude_ap = gps_long_lati_a1w; + gps.latitudeNS = 'N'; + break; + case 1: + gps.latitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); + gps.latitude_ap = gps_long_lati_a1w; + gps.latitudeNS = 'S'; + break; + case 2: + gps.longitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); + gps.longitude_ap = gps_long_lati_a1w; + gps.longitudeEW = 'E'; + break; + case 3: + gps.longitude_bp = (gps_long_lati_b1w / 60 * 100) + (gps_long_lati_b1w % 60); + gps.longitude_ap = gps_long_lati_a1w; + gps.longitudeEW = 'W'; + break; + } + if (gps.longitudeEW && gps.latitudeNS) { + gpsReceived(); + } + return; + } + else if (unit >= UNIT_GPS_LONGITUDE && unit <= UNIT_GPS_LATITUDE_NS) { + uint32_t data = uint32_t(newVal); + switch (unit) { + case UNIT_GPS_LONGITUDE: + gps.longitude_bp = data >> 16; + gps.longitude_ap = data & 0xFFFF; + break; + case UNIT_GPS_LATITUDE: + gps.latitude_bp = data >> 16; + gps.latitude_ap = data & 0xFFFF; + break; + case UNIT_GPS_LONGITUDE_EW: + gps.longitudeEW = data; + break; + case UNIT_GPS_LATITUDE_NS: + gps.latitudeNS = data; + break; + } + if (gps.longitudeEW && gps.latitudeNS && gps.longitude_ap && gps.latitude_ap) { + gpsReceived(); + } + return; + } + else if (unit == UNIT_DATETIME_YEAR) { + datetime.year = newVal; + return; + } + else if (unit == UNIT_DATETIME_DAY_MONTH) { + uint32_t data = uint32_t(newVal); + datetime.month = data >> 8; + datetime.day = data & 0xFF; + datetime.datestate = 1; + return; + } + else if (unit == UNIT_DATETIME_HOUR_MIN) { + uint32_t data = uint32_t(newVal); + datetime.hour = ((data & 0xFF) + g_eeGeneral.timezone + 24) % 24; + datetime.min = data >> 8; + } + else if (unit == UNIT_DATETIME_SEC) { + datetime.sec = newVal & 0xFF; + datetime.timestate = 1; + newVal = 0; + } + else if (unit == UNIT_RPMS) { + if (sensor.custom.ratio != 0) { + newVal = (newVal * sensor.custom.offset) / sensor.custom.ratio; + } + } + else { + newVal = sensor.getValue(newVal, unit, prec); + if (sensor.autoOffset) { + if (!isAvailable()) { + std.offsetAuto = -newVal; + } + newVal += std.offsetAuto; + } + else if (sensor.filter) { + if (!isAvailable()) { + for (int i=0; i valueMax) { + valueMax = newVal; + if (sensor.unit == UNIT_VOLTS) { + valueMin = newVal; // the batt was changed + } + } + + for (int i=0; i= 3600) { + currentItem.consumption.prescale -= 3600; + setValue(sensor, value+1, sensor.unit, sensor.prec); + } + lastReceived = now(); + } + break; + + default: + break; + } +} + +void TelemetryItem::eval(const TelemetrySensor & sensor) +{ + switch (sensor.formula) { + case TELEM_FORMULA_CELL: + if (sensor.cell.source) { + TelemetryItem & cellsItem = telemetryItems[sensor.cell.source-1]; + if (cellsItem.isOld()) { + lastReceived = TELEMETRY_VALUE_OLD; + } + else { + unsigned int index = sensor.cell.index; + if (index == TELEM_CELL_INDEX_LOWEST || index == TELEM_CELL_INDEX_HIGHEST || index == TELEM_CELL_INDEX_DELTA) { + unsigned int lowest=0, highest=0; + for (int i=0; i cellsItem.cells.values[highest-1].value) + highest = i+1; + } + else { + lowest = highest = 0; + } + } + if (lowest) { + switch (index) { + case TELEM_CELL_INDEX_LOWEST: + setValue(sensor, cellsItem.cells.values[lowest-1].value, UNIT_VOLTS, 2); + break; + case TELEM_CELL_INDEX_HIGHEST: + setValue(sensor, cellsItem.cells.values[highest-1].value, UNIT_VOLTS, 2); + break; + case TELEM_CELL_INDEX_DELTA: + setValue(sensor, cellsItem.cells.values[highest-1].value - cellsItem.cells.values[lowest-1].value, UNIT_VOLTS, 2); + break; + } + } + } + else { + index -= 1; + if (index < cellsItem.cells.count && cellsItem.cells.values[index].state) { + setValue(sensor, cellsItem.cells.values[index].value, UNIT_VOLTS, 2); + } + } + } + } + break; + + case TELEM_FORMULA_DIST: + if (sensor.dist.gps) { + TelemetryItem gpsItem = telemetryItems[sensor.dist.gps-1]; + TelemetryItem * altItem = NULL; + if (!gpsItem.isAvailable()) { + return; + } + else if (gpsItem.isOld()) { + lastReceived = TELEMETRY_VALUE_OLD; + return; + } + if (sensor.dist.alt) { + altItem = &telemetryItems[sensor.dist.alt-1]; + if (!altItem->isAvailable()) { + return; + } + else if (altItem->isOld()) { + lastReceived = TELEMETRY_VALUE_OLD; + return; + } + } + uint32_t latitude, longitude; + gpsItem.gps.extractLatitudeLongitude(&latitude, &longitude); + + uint32_t angle = (latitude > gpsItem.pilotLatitude) ? latitude - gpsItem.pilotLatitude : gpsItem.pilotLatitude - latitude; + uint32_t dist = EARTH_RADIUS * angle / 1000000; + uint32_t result = dist*dist; + + angle = (longitude > gpsItem.pilotLongitude) ? longitude - gpsItem.pilotLongitude : gpsItem.pilotLongitude - longitude; + dist = gpsItem.distFromEarthAxis * angle / 1000000; + result += dist*dist; + + if (altItem) { + dist = abs(altItem->value) / g_model.telemetrySensors[sensor.dist.alt-1].getPrecDivisor(); + result += dist*dist; + } + + setValue(sensor, isqrt32(result), UNIT_METERS); + } + break; + + case TELEM_FORMULA_ADD: + case TELEM_FORMULA_AVERAGE: + case TELEM_FORMULA_MIN: + case TELEM_FORMULA_MAX: + case TELEM_FORMULA_MULTIPLY: + { + int32_t value=0, count=0, available=0, maxitems=4, mulprec=0; + if (sensor.formula == TELEM_FORMULA_MULTIPLY) { + maxitems = 2; + value = 1; + } + for (int i=0; i(value, sensorValue)); + else if (sensor.formula == TELEM_FORMULA_MAX) + value = (count==1 ? sensorValue : max(value, sensorValue)); + else + value += sensorValue; + } + } + } + if (sensor.formula == TELEM_FORMULA_AVERAGE) { + if (count == 0) { + if (available) + lastReceived = TELEMETRY_VALUE_OLD; + return; + } + else { + value = (value + count/2) / count; + } + } + else if (sensor.formula == TELEM_FORMULA_MULTIPLY) { + if (count == 0) + return; + value = convertTelemetryValue(value, sensor.unit, mulprec, sensor.unit, sensor.prec); + } + setValue(sensor, value, sensor.unit, sensor.prec); + break; + } + + default: + break; + } +} + +void delTelemetryIndex(uint8_t index) +{ + memclear(&g_model.telemetrySensors[index], sizeof(TelemetrySensor)); + telemetryItems[index].clear(); + storageDirty(EE_MODEL); +} + +int availableTelemetryIndex() +{ + for (int index=0; index=0; index--) { + TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index]; + if (telemetrySensor.isAvailable()) { + return index; + } + } + return -1; +} + +void setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, uint8_t instance, int32_t value, uint32_t unit, uint32_t prec) +{ + bool available = false; + + for (int index=0; index= 0) { + switch (protocol) { +#if defined(FRSKY_SPORT) + case TELEM_PROTO_FRSKY_SPORT: + frskySportSetDefault(index, id, subId, instance); + break; +#endif +#if defined(FRSKY) + case TELEM_PROTO_FRSKY_D: + frskyDSetDefault(index, id); + break; +#endif +#if defined(CROSSFIRE) + case TELEM_PROTO_CROSSFIRE: + crossfireSetDefault(index, id, instance); + break; +#endif + default: + return; + } + telemetryItems[index].setValue(g_model.telemetrySensors[index], value, unit, prec); + } + else { + POPUP_WARNING(STR_TELEMETRYFULL); + } +} + +void TelemetrySensor::init(const char * label, uint8_t unit, uint8_t prec) +{ + memclear(this->label, TELEM_LABEL_LEN); + strncpy(this->label, label, TELEM_LABEL_LEN); + this->unit = unit; + if (prec > 1 && (IS_DISTANCE_UNIT(unit) || IS_SPEED_UNIT(unit))) { + // 2 digits precision is not needed here + prec = 1; + } + this->prec = prec; +} + +void TelemetrySensor::init(uint16_t id) +{ + char label[4]; + label[0] = hex2zchar((id & 0xf000) >> 12); + label[1] = hex2zchar((id & 0x0f00) >> 8); + label[2] = hex2zchar((id & 0x00f0) >> 4); + label[3] = hex2zchar((id & 0x000f) >> 0); + init(label); +} + +bool TelemetrySensor::isAvailable() const +{ + return ZLEN(label) > 0; +} + +PACK(typedef struct { + uint8_t unitFrom; + uint8_t unitTo; + int16_t multiplier; + int16_t divisor; +}) UnitConversionRule; + +const UnitConversionRule unitConversionTable[] = { + /* unitFrom unitTo multiplier divisor */ + { UNIT_METERS, UNIT_FEET, 105, 32}, + { UNIT_METERS_PER_SECOND, UNIT_FEET_PER_SECOND, 105, 32}, + + { UNIT_KTS, UNIT_KMH, 1852, 1000}, // 1 knot = 1.85200 kilometers per hour + { UNIT_KTS, UNIT_MPH, 1151, 1000}, // 1 knot = 1.15077945 miles per hour + { UNIT_KTS, UNIT_METERS_PER_SECOND, 1000, 1944}, // 1 knot = 0.514444444 meters / second (divide with 1.94384449) + { UNIT_KTS, UNIT_FEET_PER_SECOND, 1688, 1000}, // 1 knot = 1.68780986 feet per second + + { UNIT_KMH, UNIT_KTS, 1000, 1852}, // 1 km/h = 0.539956803 knots (divide with 1.85200) + { UNIT_KMH, UNIT_MPH, 1000, 1609}, // 1 km/h = 0.621371192 miles per hour (divide with 1.60934400) + { UNIT_KMH, UNIT_METERS_PER_SECOND, 10, 36}, // 1 km/h = 0.277777778 meters / second (divide with 3.6) + { UNIT_KMH, UNIT_FEET_PER_SECOND, 911, 1000}, // 1 km/h = 0.911344415 feet per second + + { UNIT_MILLILITERS, UNIT_FLOZ, 100, 2957}, + { 0, 0, 0, 0} // termination +}; + +int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t destUnit, uint8_t destPrec) +{ + for (int i=prec; idivisor) { + if (p->unitFrom == unit && p->unitTo == destUnit) { + value = (value * (int32_t)p->multiplier) / (int32_t)p->divisor; + break; + } + ++p; + } + } + + for (int i=destPrec; iprec == 2) { + value *= 10; + prec = 2; + } + else { + prec = 1; + } + value = (custom.ratio * value + 122) / 255; + } + + value = convertTelemetryValue(value, unit, prec, this->unit, this->prec); + + if (type == TELEM_TYPE_CUSTOM) { + value += custom.offset; + if (value < 0 && onlyPositive) { + value = 0; + } + } + + return value; +} + +bool TelemetrySensor::isConfigurable() const +{ + if (type == TELEM_TYPE_CALCULATED) { + if (formula >= TELEM_FORMULA_CELL) { + return false; + } + } + else { + if (unit >= UNIT_FIRST_VIRTUAL) { + return false; + } + } + return true; +} + +bool TelemetrySensor::isPrecConfigurable() const +{ + if (isConfigurable()) { + return true; + } + else if (unit == UNIT_CELLS) { + return true; + } + else { + return false; + } +} + +int32_t TelemetrySensor::getPrecMultiplier() const +{ + /* + Important: the return type must be signed, otherwise + mathematic operations with a negative telemetry value won't work + */ + if (prec == 2) return 1; + if (prec == 1) return 10; + return 100; +} + +int32_t TelemetrySensor::getPrecDivisor() const +{ + if (prec == 2) return 100; + if (prec == 1) return 10; + return 1; +} diff --git a/radio/src/telemetry/telemetry_sensors.h b/radio/src/telemetry/telemetry_sensors.h new file mode 100644 index 000000000..26747076b --- /dev/null +++ b/radio/src/telemetry/telemetry_sensors.h @@ -0,0 +1,115 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * 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. + */ + +#ifndef _TELEMETRY_SENSORS_H_ +#define _TELEMETRY_SENSORS_H_ + +class TelemetryItem +{ + public: + union { + int32_t value; // value, stored as uint32_t but interpreted accordingly to type + uint32_t distFromEarthAxis; + }; + + union { + int32_t valueMin; // min store + uint32_t pilotLongitude; + }; + + union { + int32_t valueMax; // max store + uint32_t pilotLatitude; + }; + + uint8_t lastReceived; // for detection of sensor loss + + union { + struct { + int32_t offsetAuto; + int32_t filterValues[TELEMETRY_AVERAGE_COUNT]; + } std; + struct { + uint16_t prescale; + } consumption; + struct { + uint8_t count; + CellValue values[6]; + } cells; + struct { + uint8_t datestate; + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t timestate; + uint8_t hour; + uint8_t min; + uint8_t sec; + } datetime; + struct { + uint16_t longitude_bp; + uint16_t longitude_ap; + char longitudeEW; + uint16_t latitude_bp; + uint16_t latitude_ap; + char latitudeNS; + // pilot longitude is stored in min + // pilot latitude is stored in max + // distFromEarthAxis is stored in value + void extractLatitudeLongitude(uint32_t * latitude, uint32_t * longitude) + { + div_t qr = div(latitude_bp, 100); + *latitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + latitude_ap) * 5) / 3; + qr = div(longitude_bp, 100); + *longitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + longitude_ap) * 5) / 3; + } + } gps; + }; + + static uint8_t now() + { + return (get_tmr10ms() / 10) % TELEMETRY_VALUE_TIMER_CYCLE; + } + + TelemetryItem() + { + clear(); + } + + void clear() + { + memset(this, 0, sizeof(*this)); + lastReceived = TELEMETRY_VALUE_UNAVAILABLE; + } + + void eval(const TelemetrySensor & sensor); + void per10ms(const TelemetrySensor & sensor); + + void setValue(const TelemetrySensor & sensor, int32_t newVal, uint32_t unit, uint32_t prec=0); + bool isAvailable(); + bool isFresh(); + bool isOld(); + void gpsReceived(); +}; + +extern TelemetryItem telemetryItems[MAX_SENSORS]; +extern uint8_t allowNewSensors; + +#endif // _TELEMETRY_SENSORS_H_ diff --git a/radio/src/tests/CMakeLists.txt b/radio/src/tests/CMakeLists.txt index 16cde69a2..860442512 100644 --- a/radio/src/tests/CMakeLists.txt +++ b/radio/src/tests/CMakeLists.txt @@ -4,9 +4,6 @@ set(GTEST_SRCDIR /usr/src/gtest) if(EXISTS "${GTEST_SRCDIR}/src/gtest-all.cc") add_library(gtests-lib STATIC EXCLUDE_FROM_ALL ${GTEST_SRCDIR}/src/gtest-all.cc ) target_include_directories(gtests-lib PUBLIC ${GTEST_INCDIR} PUBLIC ${GTEST_SRCDIR}) - - find_package(Qt4 4.8.1 REQUIRED) - include(${QT_USE_FILE}) add_definitions(-DSIMU) set(TESTS_PATH ${RADIO_SRC_DIRECTORY}) configure_file(${RADIO_SRC_DIRECTORY}/tests/location.h.in ${CMAKE_CURRENT_BINARY_DIR}/location.h @ONLY) @@ -19,8 +16,9 @@ if(EXISTS "${GTEST_SRCDIR}/src/gtest-all.cc") file(GLOB TEST_SRC_FILES ${RADIO_SRC_DIRECTORY}/tests/*.cpp) add_executable(gtests EXCLUDE_FROM_ALL ${TEST_SRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/location.h ${RADIO_SRC} ../targets/simu/simpgmspace.cpp) + qt5_use_modules(gtests Core Widgets) add_dependencies(gtests ${FIRMWARE_DEPENDENCIES} gtests-lib) - target_link_libraries(gtests gtests-lib ${QT_LIBRARIES} pthread) + target_link_libraries(gtests gtests-lib pthread) message("Added optional gtests target") else() message("WARNING: can't find gtests source, gtest target will not be available!") diff --git a/radio/src/tests/crossfire.cpp b/radio/src/tests/crossfire.cpp index cc7f69e14..317a35676 100644 --- a/radio/src/tests/crossfire.cpp +++ b/radio/src/tests/crossfire.cpp @@ -35,5 +35,12 @@ TEST(Crossfire, createCrossfireFrame) // TODO check } + +TEST(Crossfire, crc8) +{ + uint8_t frame[] = { 0x00, 0x0C, 0x14, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x03, 0x00, 0x00, 0x00, 0xF4 }; + uint8_t crc = crc8(&frame[2], frame[1]-1); + ASSERT_EQ(frame[frame[1]+1], crc); +} #endif diff --git a/radio/src/tests/eeprom.cpp b/radio/src/tests/eeprom.cpp index 6e7f806bf..35fca53a0 100644 --- a/radio/src/tests/eeprom.cpp +++ b/radio/src/tests/eeprom.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -20,7 +20,30 @@ #include "gtests.h" -#if !defined(PCBSKY9X) +#if !defined(EEPROM) && defined(SDCARD) +namespace Backup { +#define BACKUP +#include "datastructs.h" +PACK(struct RamBackupUncompressed { + ModelData model; + RadioData radio; +}); +#undef BACKUP +}; +extern Backup::RamBackupUncompressed ramBackupUncompressed; +TEST(Storage, BackupAndRestore) +{ + + rambackupWrite(); + Backup::RamBackupUncompressed ramBackupRestored; + if (uncompress((uint8_t *)&ramBackupRestored, sizeof(ramBackupRestored), ramBackup->data, ramBackup->size) != sizeof(ramBackupUncompressed)) + TRACE("ERROR uncompress"); + if (memcmp(&ramBackupUncompressed, &ramBackupRestored, sizeof(ramBackupUncompressed)) != 0) + TRACE("ERROR restore"); +} +#endif + +#if defined(EEPROM_RLC) TEST(Eeprom, 100_random_writes) { eepromFile = NULL; // in memory diff --git a/radio/src/tests/frsky.cpp b/radio/src/tests/frsky.cpp index 18dbab3e1..3872e0ad6 100644 --- a/radio/src/tests/frsky.cpp +++ b/radio/src/tests/frsky.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -34,7 +34,7 @@ void displayVoltagesScreen(); TEST(FrSky, gpsNfuel) { g_model.frsky.usrProto = 1; - frskyData.hub.gpsFix = 1; + telemetryData.hub.gpsFix = 1; uint8_t pkt1[] = { 0xfd, 0x07, 0x00, 0x5e, 0x14, 0x2c, 0x00, 0x5e, 0x1c, 0x03 }; uint8_t pkt2[] = { 0xfd, 0x07, 0x00, 0x00, 0x5e, 0x13, 0x38, 0x0c, 0x5e, 0x1b }; @@ -50,14 +50,14 @@ TEST(FrSky, gpsNfuel) frskyDProcessPacket(pkt5); frskyDProcessPacket(pkt6); frskyDProcessPacket(pkt7); - EXPECT_EQ(frskyData.hub.gpsCourse_bp, 44); - EXPECT_EQ(frskyData.hub.gpsCourse_ap, 03); - EXPECT_EQ(frskyData.hub.gpsLongitude_bp / 100, 120); - EXPECT_EQ(frskyData.hub.gpsLongitude_bp % 100, 15); - EXPECT_EQ(frskyData.hub.gpsLongitude_ap, 0x2698); - EXPECT_EQ(frskyData.hub.gpsLatitudeNS, 'N'); - EXPECT_EQ(frskyData.hub.gpsLongitudeEW, 'E'); - EXPECT_EQ(frskyData.hub.fuelLevel, 100); + EXPECT_EQ(telemetryData.hub.gpsCourse_bp, 44); + EXPECT_EQ(telemetryData.hub.gpsCourse_ap, 03); + EXPECT_EQ(telemetryData.hub.gpsLongitude_bp / 100, 120); + EXPECT_EQ(telemetryData.hub.gpsLongitude_bp % 100, 15); + EXPECT_EQ(telemetryData.hub.gpsLongitude_ap, 0x2698); + EXPECT_EQ(telemetryData.hub.gpsLatitudeNS, 'N'); + EXPECT_EQ(telemetryData.hub.gpsLongitudeEW, 'E'); + EXPECT_EQ(telemetryData.hub.fuelLevel, 100); } TEST(FrSky, dateNtime) @@ -68,21 +68,21 @@ TEST(FrSky, dateNtime) frskyDProcessPacket(pkt1); frskyDProcessPacket(pkt2); frskyDProcessPacket(pkt3); - EXPECT_EQ(frskyData.hub.day, 15); - EXPECT_EQ(frskyData.hub.month, 07); - EXPECT_EQ(frskyData.hub.year, 11); - EXPECT_EQ(frskyData.hub.hour, 06); - EXPECT_EQ(frskyData.hub.min, 18); - EXPECT_EQ(frskyData.hub.sec, 50); + EXPECT_EQ(telemetryData.hub.day, 15); + EXPECT_EQ(telemetryData.hub.month, 07); + EXPECT_EQ(telemetryData.hub.year, 11); + EXPECT_EQ(telemetryData.hub.hour, 06); + EXPECT_EQ(telemetryData.hub.min, 18); + EXPECT_EQ(telemetryData.hub.sec, 50); } #endif #if defined(FRSKY) && defined(CPUARM) -TEST(FrSky, FrskyValueWithMinAveraging) +TEST(FrSky, TelemetryValueWithMinAveraging) { /* The following expected[] array is filled - with values that correspond to 4 elements + with values that correspond to 4 elements long averaging buffer. If length of averaging buffer is changed, this values must be adjusted @@ -90,8 +90,8 @@ TEST(FrSky, FrskyValueWithMinAveraging) uint8_t expected[] = { 10, 12, 17, 25, 35, 45, 55, 65, 75, 85, 92, 97, 100, 100, 100, 100, 100}; int testPos = 0; //test of averaging - FrskyValueWithMin testVal; - testVal.value = 0; + TelemetryValueWithMin testVal; + testVal.value = 0; testVal.set(10); EXPECT_EQ(RAW_FRSKY_MINMAX(testVal), 10); EXPECT_EQ(testVal.value, expected[testPos++]); @@ -162,16 +162,16 @@ TEST(FrSky, HubAltNegative) // first trigger hi precision, by setting AP above 9 processHubPacket(BARO_ALT_BP_ID, -1); // set value of -1.35m processHubPacket(BARO_ALT_AP_ID, 35); - EXPECT_EQ(telemetryItems[0].value, -13); + EXPECT_EQ(telemetryItems[0].value, -13); processHubPacket(BARO_ALT_BP_ID, 12); // set value of 12.35m processHubPacket(BARO_ALT_AP_ID, 35); - EXPECT_EQ(telemetryItems[0].value, 123); + EXPECT_EQ(telemetryItems[0].value, 123); // now test with the AP less than 10 to check if hiprecision is still active processHubPacket(BARO_ALT_BP_ID, 12); // set value of 12.05m processHubPacket(BARO_ALT_AP_ID, 05); - EXPECT_EQ(telemetryItems[0].value, 120); + EXPECT_EQ(telemetryItems[0].value, 120); } #endif // #if defined(FRSKY) && defined(CPUARM) @@ -250,7 +250,7 @@ TEST(FrSkySPORT, frskySetCellVoltage) generateSportCellPacket(packet, 3, 0, _V(405), _V(300)); processSportPacket(packet); generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); processSportPacket(packet); - + EXPECT_EQ(telemetryItems[0].cells.count, 3); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 405); EXPECT_EQ(telemetryItems[0].cells.values[1].value, 300); @@ -262,10 +262,10 @@ TEST(FrSkySPORT, frskySetCellVoltage) generateSportCellPacket(packet, 3, 0, _V(405), _V(250)); processSportPacket(packet); generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); processSportPacket(packet); - + generateSportCellPacket(packet, 3, 0, _V(410), _V(420)); processSportPacket(packet); generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); processSportPacket(packet); - + EXPECT_EQ(telemetryItems[0].cells.count, 3); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 410); EXPECT_EQ(telemetryItems[0].cells.values[1].value, 420); @@ -326,7 +326,10 @@ TEST(FrSkySPORT, frskySetCellVoltage) //display test lcdClear(); + +#if !defined(COLORLCD) g_model.frsky.voltsSource = FRSKY_VOLTS_SOURCE_A1; +#endif } TEST(FrSkySPORT, StrangeCellsBug) @@ -401,7 +404,10 @@ TEST(FrSkySPORT, frskySetCellVoltageTwoSensors) //display test lcdClear(); + +#if !defined(COLORLCD) g_model.frsky.voltsSource = FRSKY_VOLTS_SOURCE_A1; +#endif } void generateSportFasVoltagePacket(uint8_t * packet, uint32_t voltage) diff --git a/radio/src/tests/gtests.cpp b/radio/src/tests/gtests.cpp index c8be129a3..dbec8f7a6 100644 --- a/radio/src/tests/gtests.cpp +++ b/radio/src/tests/gtests.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include +#include #include "gtests.h" int32_t lastAct = 0; diff --git a/radio/src/tests/gtests.h b/radio/src/tests/gtests.h index dfc5dd8d5..07e7a14e8 100644 --- a/radio/src/tests/gtests.h +++ b/radio/src/tests/gtests.h @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -35,7 +35,7 @@ extern uint16_t anaInValues[NUM_STICKS+NUM_POTS]; void doMixerCalculations(); -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) || defined(PCBHORUS) #define RADIO_RESET() \ g_eeGeneral.switchConfig = 0x00007bff #else @@ -44,7 +44,7 @@ void doMixerCalculations(); inline void SYSTEM_RESET() { -#if defined(CPUARM) +#if defined(CPUARM) && defined(EEPROM) memset(modelHeaders, 0, sizeof(modelHeaders)); #endif generalDefault(); @@ -79,7 +79,7 @@ inline void MIXER_RESET() inline void TELEMETRY_RESET() { #if defined(FRSKY) - memclear(&frskyData, sizeof(frskyData)); + memclear(&telemetryData, sizeof(telemetryData)); TELEMETRY_RSSI() = 100; #endif #if defined(CPUARM) && defined(FRSKY) diff --git a/radio/src/tests/lcd.cpp b/radio/src/tests/lcd.cpp index 1f27bad18..60e31a5d4 100644 --- a/radio/src/tests/lcd.cpp +++ b/radio/src/tests/lcd.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -20,8 +20,8 @@ #include #include -#include -#include +#include +#include #include #include @@ -82,20 +82,16 @@ bool checkScreenshot(const QString & test) QImage buffer(LCD_W, LCD_H, QImage::Format_RGB32); QPainter p(&buffer); doPaint(p); + QString filename(QString("%1_%2x%3.png").arg(test).arg(LCD_W).arg(LCD_H)); - buffer.save("/tmp/" + filename); - QFile screenshot("/tmp/" + filename); - if (!screenshot.open(QIODevice::ReadOnly)) - return false; - QFile reference( TESTS_PATH "/tests/" + filename); - if (!reference.open(QIODevice::ReadOnly)) - return false; - if (reference.readAll() != screenshot.readAll()) - return false; - screenshot.remove(); - return true; + QImage reference(TESTS_PATH "/tests/" + filename); + + return buffer == reference; } +#if defined(COLORLCD) +// TODO +#else TEST(outdezNAtt, test_unsigned) { lcdClear(); @@ -113,7 +109,6 @@ TEST(outdezNAtt, testBigNumbers) } #endif // #if defined(CPUARM) - TEST(Lcd, Invers_0_0) { lcdClear(); @@ -204,7 +199,7 @@ TEST(Lcd, Smlsize) bool invert = false; for(int i=0; i<3; i++) { - lcdDrawText(40+(4*i), 0+(4*i), "ABC", SMLSIZE|(invert?INVERS:0)); + lcdDrawText(40+(4*i), 0+(4*i), "ABC", SMLSIZE|(invert?INVERS:0)); invert = !invert; } @@ -221,7 +216,7 @@ TEST(Lcd, Stdsize) bool invert = false; for(int i=0; i<3; i++) { - lcdDrawText(40+(4*i), 0+(4*i), "ABC", (invert?INVERS:0)); + lcdDrawText(40+(4*i), 0+(4*i), "ABC", (invert?INVERS:0)); invert = !invert; } @@ -238,7 +233,7 @@ TEST(Lcd, Midsize) bool invert = false; for(int i=0; i<3; i++) { - lcdDrawText(40+(4*i), 0+(4*i), "ABC", MIDSIZE|(invert?INVERS:0)); + lcdDrawText(40+(4*i), 0+(4*i), "ABC", MIDSIZE|(invert?INVERS:0)); invert = !invert; } @@ -255,7 +250,7 @@ TEST(Lcd, Dblsize) bool invert = false; for(int i=0; i<3; i++) { - lcdDrawText(10+(4*i), 30+(4*i), "ABC", DBLSIZE|(invert?INVERS:0)); + lcdDrawText(10+(4*i), 30+(4*i), "ABC", DBLSIZE|(invert?INVERS:0)); invert = !invert; } @@ -329,11 +324,11 @@ public: }; ~TestBuffer() { if (buf) delete[] buf; }; uint8_t * buffer() { return buf + padding; }; - void leakCheck() const { + void leakCheck() const { uint8_t paddingCompareBuf[padding]; memset(paddingCompareBuf, 0xA5, padding); if (memcmp(buf, paddingCompareBuf, padding) != 0) { - ADD_FAILURE() << "buffer leaked low"; + ADD_FAILURE() << "buffer leaked low"; }; memset(paddingCompareBuf, 0x5A, padding); if (memcmp(buf+padding+size, paddingCompareBuf, padding) != 0) { @@ -397,33 +392,33 @@ TEST(Lcd, lcdDrawBitmapLoadAndDisplay) TEST(Lcd, lcdDrawLine) { int start, length, xOffset; - uint8_t pattern; + uint8_t pattern; lcdClear(); start = 5; - pattern = SOLID; + pattern = SOLID; length = 40; xOffset = 0; lcdDrawLine(start+(length>0?1:-1)+xOffset, start, start+(length>0?1:-1)+xOffset+length, start, pattern, 0); lcdDrawLine(start+xOffset, start+(length>0?1:-1), start+xOffset, start+(length>0?1:-1)+length, pattern, 0); start = 10; - pattern = DOTTED; + pattern = DOTTED; length = 40; xOffset = 0; lcdDrawLine(start+(length>0?1:-1)+xOffset, start, start+(length>0?1:-1)+xOffset+length, start, pattern, 0); lcdDrawLine(start+xOffset, start+(length>0?1:-1), start+xOffset, start+(length>0?1:-1)+length, pattern, 0); start = 55; - pattern = SOLID; + pattern = SOLID; length = -40; xOffset = 80; lcdDrawLine(start+(length>0?1:-1)+xOffset, start, start+(length>0?1:-1)+xOffset+length, start, pattern, 0); lcdDrawLine(start+xOffset, start+(length>0?1:-1), start+xOffset, start+(length>0?1:-1)+length, pattern, 0); start = 50; - pattern = DOTTED; + pattern = DOTTED; length = -40; xOffset = 80; lcdDrawLine(start+(length>0?1:-1)+xOffset, start, start+(length>0?1:-1)+xOffset+length, start, pattern, 0); @@ -459,3 +454,4 @@ TEST(Lcd, lcdDrawLine) EXPECT_TRUE(checkScreenshot("lcdDrawLine")); } #endif +#endif diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index 1ffa3ff95..be2c50173 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -19,7 +19,7 @@ */ #include "gtests.h" -#include "../templates.h" +#include "templates.h" #define CHECK_NO_MOVEMENT(channel, value, duration) \ for (int i=1; i<=(duration); i++) { \ @@ -173,7 +173,7 @@ TEST(Trims, throttleTrimWithZeroWeightOnThrottle) MODEL_RESET(); modelDefault(0); g_model.thrTrim = 1; -#if defined(PCBTARANIS) +#if defined(VIRTUALINPUTS) // the input already exists ExpoData *expo = expoAddress(THR_STICK); #else @@ -252,7 +252,7 @@ TEST(Trims, invertedThrottlePlusthrottleTrimWithZeroWeightOnThrottle) modelDefault(0); g_model.throttleReversed = 1; g_model.thrTrim = 1; -#if defined(PCBTARANIS) +#if defined(VIRTUALINPUTS) // the input already exists ExpoData *expo = expoAddress(THR_STICK); #else @@ -325,7 +325,7 @@ TEST(Trims, invertedThrottlePlusthrottleTrimWithZeroWeightOnThrottle) EXPECT_EQ(channelOutputs[2], 0); } -#if !defined(PCBTARANIS) +#if !defined(VIRTUALINPUTS) TEST(Trims, greaterTrimLink) { MODEL_RESET(); @@ -395,7 +395,7 @@ TEST(Trims, InstantTrim) EXPECT_EQ(25, getTrimValue(0, AIL_STICK)); } -#if defined(PCBTARANIS) +#if defined(VIRTUALINPUTS) TEST(Trims, InstantTrimNegativeCurve) { MODEL_RESET(); @@ -639,7 +639,7 @@ TEST(Mixer, SlowOnSwitch) g_model.mixData[0].speedDown = SLOW_STEP*5; s_mixer_first_run_done = true; - + evalFlightModeMixes(e_perout_mode_normal, 0); EXPECT_EQ(chans[0], 0); @@ -747,7 +747,7 @@ TEST(Mixer, SlowOnSwitchSource) g_model.mixData[0].weight = 100; g_model.mixData[0].speedUp = SLOW_STEP*5; g_model.mixData[0].speedDown = SLOW_STEP*5; -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) || defined(PCBHORUS) g_eeGeneral.switchConfig = 0x03; #endif @@ -818,7 +818,7 @@ TEST(Mixer, SlowAndDelayOnReplace3POSSource) g_model.mixData[0].speedDown = SLOW_STEP*5; s_mixer_first_run_done = true; - + simuSetSwitch(3, -1); CHECK_SLOW_MOVEMENT(0, -1, 250); EXPECT_EQ(chans[0], -CHANNEL_MAX); @@ -866,7 +866,7 @@ TEST(Mixer, SlowOnSwitchReplace) } #endif -#if !defined(PCBTARANIS) +#if !defined(VIRTUALINPUTS) TEST(Mixer, NoTrimOnInactiveMix) { MODEL_RESET(); @@ -982,7 +982,7 @@ TEST(Heli, Mode2Test) } #endif -#if defined(HELI) && !defined(PCBTARANIS) +#if defined(HELI) && !defined(VIRTUALINPUTS) TEST(Heli, SimpleTest) { MODEL_RESET(); diff --git a/radio/src/tests/switches.cpp b/radio/src/tests/switches.cpp index 19499ed55..ae629965f 100644 --- a/radio/src/tests/switches.cpp +++ b/radio/src/tests/switches.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -20,7 +20,7 @@ #include "gtests.h" -#if !defined(PCBTARANIS) +#if !defined(VIRTUALINPUTS) TEST(getSwitch, undefCSW) { MODEL_RESET(); @@ -45,9 +45,9 @@ TEST(getSwitch, circularCSW) } #endif -#if defined(PCBTARANIS) +#if defined(VIRTUALINPUTS) -void setLogicalSwitch(int index, uint16_t _func, int16_t _v1, int16_t _v2, int16_t _v3 = 0, uint8_t _delay = 0, uint8_t _duration = 0, int8_t _andsw = 0) +void setLogicalSwitch(int index, uint16_t _func, int16_t _v1, int16_t _v2, int16_t _v3 = 0, uint8_t _delay = 0, uint8_t _duration = 0, int8_t _andsw = 0) { g_model.logicalSw[index].func = _func; g_model.logicalSw[index].v1 = _v1; @@ -89,7 +89,7 @@ TEST(getSwitch, OldTypeStickyCSW) EXPECT_EQ(getSwitch(SWSRC_SW1), false); EXPECT_EQ(getSwitch(SWSRC_SW2), false); } -#endif // #if defined(PCBTARANIS) +#endif // #if defined(VIRTUALINPUTS) TEST(getSwitch, nullSW) { @@ -97,207 +97,6 @@ TEST(getSwitch, nullSW) EXPECT_EQ(getSwitch(0), true); } -#if 0 -TEST(getSwitch, DISABLED_VfasWithDelay) -{ - MODEL_RESET(); - MIXER_RESET(); - memclear(&frskyData, sizeof(frskyData)); - /* - Test for logical switch: - L1 Vfas < 9.6 Delay (0.5s) - - (gdb) print Open9xX9D::g_model.logicalSw[0] - $3 = {v1 = -39 '\331', v2 = 96, v3 = 0, func = 4 '\004', delay = 5 '\005', duration = 0 '\000', andsw = 0 '\000'} - */ - g_model.logicalSw[0] = {int8_t(MIXSRC_FIRST_TELEM+TELEM_VFAS-1), 96, 0, 4, 5, 0, 0}; - frskyData.hub.vfas = 150; //unit is 100mV - - //telemetry streaming is FALSE, so L1 should be FALSE no matter what value Vfas has - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - //every logicalSwitchesTimerTick() represents 100ms - //so now after 5 ticks we should still have a FALSE value - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - //now turn on telemetry - EXPECT_EQ(TELEMETRY_STREAMING(), false); - TELEMETRY_RSSI() = 50; - EXPECT_EQ(TELEMETRY_STREAMING(), true); - - //vfas is 15.0V so L1 should still be FALSE - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - //now reduce vfas to 9.5V and L1 should become TRUE after 0.5s - frskyData.hub.vfas = 95; - evalLogicalSwitches(); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), true); - - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), true); - - - //now stop telemetry, L1 should become FALSE immediatelly - TELEMETRY_RSSI() = 0; - EXPECT_EQ(TELEMETRY_STREAMING(), false); - evalLogicalSwitches(); - - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); -} - -TEST(getSwitch, DISABLED_RssiWithDuration) -{ - MODEL_RESET(); - MIXER_RESET(); - memclear(&frskyData, sizeof(frskyData)); - /* - Test for logical switch: - L1 RSSI > 10 Duration (0.5s) - - (gdb) print Open9xX9D::g_model.logicalSw[0] - $1 = {v1 = -55 '\311', v2 = 10, v3 = 0, func = 3 '\003', delay = 0 '\000', duration = 5 '\005', andsw = 0 '\000'} - */ - - g_model.logicalSw[0] = {int8_t(MIXSRC_FIRST_TELEM+TELEM_RSSI_RX-1), 10, 0, 3, 0, 5, 0}; - - EXPECT_EQ(TELEMETRY_STREAMING(), false); - - evalLogicalSwitches(); - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - //now set RSSI to 5, L1 should still be FALSE - TELEMETRY_RSSI() = 5; - evalLogicalSwitches(); - EXPECT_EQ(TELEMETRY_STREAMING(), true); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - //now set RSSI to 100, L1 should become TRUE for 0.5s - TELEMETRY_RSSI() = 100; - evalLogicalSwitches(); - EXPECT_EQ(TELEMETRY_STREAMING(), true); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), true); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), true); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), true); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), true); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - //repeat telemetry streaming OFF and ON to test for duration processing - TELEMETRY_RSSI() = 0; - evalLogicalSwitches(); - EXPECT_EQ(TELEMETRY_STREAMING(), false); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); - - //now set RSSI to 100, L1 should become TRUE for 0.5s - TELEMETRY_RSSI() = 100; - evalLogicalSwitches(); - EXPECT_EQ(TELEMETRY_STREAMING(), true); - - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), true); - - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - logicalSwitchesTimerTick(); - evalLogicalSwitches(); - EXPECT_EQ(getSwitch(SWSRC_SW1), false); -} -#endif // #if defined(PCBTARANIS) && defined(FRSKY) - - #if !defined(CPUARM) TEST(getSwitch, recursiveSW) { @@ -329,7 +128,7 @@ TEST(getSwitch, recursiveSW) } #endif // #if !defined(CPUARM) -#if defined(PCBTARANIS) +#if defined(VIRTUALINPUTS) TEST(getSwitch, inputWithTrim) { MODEL_RESET(); @@ -350,7 +149,7 @@ TEST(getSwitch, inputWithTrim) } #endif -#if defined(PCBTARANIS) +#if defined(VIRTUALINPUTS) TEST(evalLogicalSwitches, playFile) { SYSTEM_RESET(); @@ -361,14 +160,23 @@ TEST(evalLogicalSwitches, playFile) extern uint64_t sdAvailableLogicalSwitchAudioFiles; sdAvailableLogicalSwitchAudioFiles = 0xffffffffffffffff; char filename[AUDIO_FILENAME_MAXLEN+1]; + +#if defined(EEPROM) +#define MODELNAME "MODEL01" +#else +#define MODELNAME "Model00" +#endif + isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (0 << 16) + AUDIO_EVENT_OFF, filename); - EXPECT_EQ(strcmp(filename, "/SOUNDS/en/MODEL01/L1-off.wav"), 0); + EXPECT_EQ(strcmp(filename, "/SOUNDS/en/" MODELNAME "/L1-off.wav"), 0); isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (0 << 16) + AUDIO_EVENT_ON, filename); - EXPECT_EQ(strcmp(filename, "/SOUNDS/en/MODEL01/L1-on.wav"), 0); + EXPECT_EQ(strcmp(filename, "/SOUNDS/en/" MODELNAME "/L1-on.wav"), 0); isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (31 << 16) + AUDIO_EVENT_OFF, filename); - EXPECT_EQ(strcmp(filename, "/SOUNDS/en/MODEL01/L32-off.wav"), 0); + EXPECT_EQ(strcmp(filename, "/SOUNDS/en/" MODELNAME "/L32-off.wav"), 0); isAudioFileReferenced((LOGICAL_SWITCH_AUDIO_CATEGORY << 24) + (31 << 16) + AUDIO_EVENT_ON, filename); - EXPECT_EQ(strcmp(filename, "/SOUNDS/en/MODEL01/L32-on.wav"), 0); + EXPECT_EQ(strcmp(filename, "/SOUNDS/en/" MODELNAME "/L32-on.wav"), 0); + +#undef MODELNAME } TEST(getSwitch, edgeInstant) @@ -443,7 +251,7 @@ TEST(getSwitch, edgeInstant) EXPECT_EQ(getSwitch(SWSRC_SW1), false); EXPECT_EQ(getSwitch(SWSRC_SW2), false); - // now bug #2939 + // now bug #2939 // SF is kept up and SA is toggled simuSetSwitch(0, -1); //SA down simuSetSwitch(5, 1); //SF up diff --git a/radio/src/thirdparty/CoOS/OsConfig.h b/radio/src/thirdparty/CoOS/OsConfig.h index ffc41ca1a..2c2fb2db5 100644 --- a/radio/src/thirdparty/CoOS/OsConfig.h +++ b/radio/src/thirdparty/CoOS/OsConfig.h @@ -1,39 +1,39 @@ /** ******************************************************************************* * @file OsConfig.h - * @version V1.1.6 - * @date 2014.05.23 + * @version V1.1.6 + * @date 2014.05.23 * @brief This file use by user to configuration CooCox CoOS. * @note Ensure you have knew every item before modify this file. ******************************************************************************* * @copy * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. * - *

© COPYRIGHT 2014 CooCox

+ *

© COPYRIGHT 2014 CooCox

******************************************************************************* */ @@ -60,18 +60,18 @@ Max number of tasks that can be running. /*!< Idle task stack size(word). */ -#if CFG_CHIP_TYPE == 3 -#define CFG_IDLE_STACK_SIZE (58) -#else +#if CFG_CHIP_TYPE == 3 +#define CFG_IDLE_STACK_SIZE (58) +#else #define CFG_IDLE_STACK_SIZE (25) -#endif +#endif /*!< System frequency (Hz). */ -#if defined(PCBFLAMENCO) || (defined(PCBTARANIS) && defined(REV9E)) +#if defined(PCBFLAMENCO) || (defined(PCBTARANIS) && defined(REV9E)) || defined(PCBHORUS) #define CFG_CPU_FREQ (168000000) -#elif defined(PCBTARANIS) || defined(PCBHORUS) +#elif defined(PCBTARANIS) #define CFG_CPU_FREQ (120000000) #else #define CFG_CPU_FREQ (36000000) // TODO check if really correct for sky9x? diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 25c2846f2..15d1e5ed2 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -127,7 +127,9 @@ const pm_char STR_POPUPS[] PROGMEM = TR_POPUPS; #if !defined(OFS_EXIT) const pm_char STR_EXIT[] PROGMEM = TR_EXIT; #endif -const pm_char STR_MENUWHENDONE[] PROGMEM = TR_MENUWHENDONE; +#if !defined(PCBHORUS) + const pm_char STR_MENUWHENDONE[] PROGMEM = TR_MENUWHENDONE; +#endif const pm_char STR_FREE[] PROGMEM = TR_FREE; const pm_char STR_DELETEMODEL[] PROGMEM = TR_DELETEMODEL; const pm_char STR_COPYINGMODEL[] PROGMEM = TR_COPYINGMODEL; diff --git a/radio/src/translations.h b/radio/src/translations.h index f82a648af..c1ee683fd 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -330,7 +330,10 @@ extern const pm_char STR_POPUPS[]; extern const pm_char STR_EXIT[]; #endif -extern const pm_char STR_MENUWHENDONE[]; +#if !defined(PCBHORUS) + extern const pm_char STR_MENUWHENDONE[]; +#endif + extern const pm_char STR_FREE[]; #define LEN_FREE PSIZE(TR_FREE) extern const pm_char STR_DELETEMODEL[]; diff --git a/radio/src/translations/.gitignore b/radio/src/translations/.gitignore deleted file mode 100644 index e270edda0..000000000 --- a/radio/src/translations/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -/en.h -/cz.h -/de.h -/es.h -/fi.h -/fr.h -/it.h -/nl.h -/pl.h -/pt.h -/se.h diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index cbf5a2916..6fb9a851d 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -1,16 +1,12 @@ /* - * Authors (alphabetical order) - * - Bertrand Songis - * - Bernet Andre - * - Kjell Kernen - * - Martin Hotar - * - Romolo Manfredini + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -21,10 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * - * - * + */ + +// CZ translations author: Martin Hotar + +/* * !!!!! DO NOT EDIT cz.h - EDIT cz.h.txt INSTEAD !!!!!!! * * In order to make translations easier cz.h.txt is parsed and national @@ -33,7 +30,9 @@ * * !!!!! DO NOT EDIT cz.h - EDIT cz.h.txt INSTEAD !!!!!!! */ -/* Formatting octal codes available in TR_ strings: + +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -43,14 +42,6 @@ - - - - - - - - // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "VYP""ZAP" @@ -385,7 +376,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metr.\0""Imper.", "Metrické""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -460,7 +451,13 @@ #define TR_STICKS_VSRCRAW TR("Směr""Výšk""Plyn""Křid", "\307Směr""\307Výšk""\307Plyn""\307Křid") #define TR_TRIMS_VSRCRAW TR("TrmS""TrmV""TrmP""TrmK", "\313Směr""\313Výšk""\313Plyn""\313Křid") -#if defined(PCBTARANIS) && defined(REV9E) +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) #define TR_POTS_VSRCRAW "\310S1\0 ""\310S2\0 ""\310S3\0 ""\310S4\0 ""\311LS\0 ""\311RS\0 ""\311LS2 ""\311RS2 " #define TR_SW_VSRCRAW "\312SA\0 ""\312SB\0 ""\312SC\0 ""\312SD\0 ""\312SE\0 ""\312SF\0 ""\312SG\0 ""\312SH\0 ""\312SI\0 ""\312SJ\0 ""\312SK\0 ""\312SL\0 ""\312SM\0 ""\312SN\0 ""\312SO\0 ""\312SP\0 ""\312SQ\0 ""\312SR\0 " #elif defined(PCBTARANIS) @@ -497,7 +494,9 @@ #define TR_ON_ONE_SWITCHES "ZAP""One" -#if defined(PCBTARANIS) +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" +#elif defined(PCBTARANIS) || defined(PCBHORUS) // only special switches here #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES #else @@ -706,14 +705,18 @@ #define TR_CAL "Kal." #define TR_VTRIM "Trim- +" #define TR_BG "BG:" -#if defined(COLORLCD) +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#elif defined(COLORLCD) #define TR_MENUTOSTART TR_ENTER " = START" #define TR_SETMIDPOINT "Nastav páky na střed" #define TR_MOVESTICKSPOTS "Hýbej pákami/poty" #else - #define TR_MENUTOSTART CENTER "\011" TR_ENTER " = START" - #define TR_SETMIDPOINT CENTER "\004Nastav páky na střed" - #define TR_MOVESTICKSPOTS TR(CENTER "\006Hýbej pákami/poty", "\014Hýbej pákami i potenciometry") + #define TR_MENUTOSTART CENTER "\011" TR_ENTER " = START" + #define TR_SETMIDPOINT CENTER "\004Nastav páky na střed" + #define TR_MOVESTICKSPOTS TR(CENTER "\006Hýbej pákami/poty", "\014Hýbej pákami i potenciometry") #endif #define TR_RXBATT "Rx Bat.:" #define TR_TXnRX "Tx:\0Rx:" @@ -747,7 +750,9 @@ #define TR_ALARMSDISABLED "Alarmy jsou zakázány" #define TR_PRESSANYKEY TR("\006Stiskni klávesu", "Stiskni klávesu") #define TR_BADEEPROMDATA TR("\006Chyba dat EEPROM", "Chyba dat EEPROM") +#define TR_BAD_RADIO_DATA "Bad Radio Data" #define TR_EEPROMFORMATTING TR("\004Formatování EEPROM", "Formatování EEPROM") +#define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "Přetekla EEPROM" #define TR_MENURADIOSETUP "NASTAVENÍ RÁDIA" #define TR_MENUDATEANDTIME "DATUM A čAS" @@ -826,6 +831,7 @@ #define TR_INCOMPATIBLE "Nekompatibilní" #define TR_WARNING "KONTROLA" #define TR_EEPROMWARN "EEPROM" +#define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "Aktualizuji EEPROM" #define TR_THROTTLEWARN "PLYNU" #define TR_ALARMSWARN "ALARMU" @@ -1160,3 +1166,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 15e4032e8..e4aa5dfce 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1,14 +1,12 @@ -/* German checked 27.09.2015 r096 opentx V2.1.4 für X9D,X9D+, X9E, Th9, 9XR, 9XR-Pro - * Authors (alphabetical order) - * - Bertrand Songis - * - Bernet Andre - * - Helle +/* + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -19,8 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * + */ + +// DE translations author: who? + +/* * !!!!! DO NOT EDIT de.h - EDIT de.h.txt INSTEAD !!!!!!! * * In order to make translations easier de.h.txt is parsed and national @@ -30,7 +31,9 @@ * * !!!!! DO NOT EDIT de.h - EDIT de.h.txt INSTEAD !!!!!!! */ - /* Formatting octal codes available in TR_ strings: + +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -39,18 +42,6 @@ */ - - - - - - - - - - - - // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "AUS""EIN" @@ -392,7 +383,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\012") #define TR_VUNITSSYSTEM TR("Metrik""Imper.", "Metrisch\0 ""Imperial\0 ") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -464,7 +455,13 @@ #define TR_STICKS_VSRCRAW TR("Sei\0""Höh\0""Gas\0""Qur\0", "\307Sei""\307Höh""\307Gas""\307Qur") #define TR_TRIMS_VSRCRAW TR("TrmS""TrmH""TrmG""TrmQ", "\313Sei""\313Höh""\313Gas""\313Qur") -#if defined(PCBTARANIS) && defined(REV9E) +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" #elif defined(PCBTARANIS) @@ -501,7 +498,9 @@ #define TR_ON_ONE_SWITCHES "ON\0""One" -#if defined(PCBTARANIS) +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" +#elif defined(PCBTARANIS) || defined(PCBHORUS) // only special switches here #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES #else @@ -710,7 +709,11 @@ #define TR_CAL "Kal." #define TR_VTRIM "Trim - +" #define TR_BG "BG:" -#if defined(COLORLCD) +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#elif defined(COLORLCD) #define TR_MENUTOSTART CENTER"\007"TR_ENTER" zum Start" #define TR_SETMIDPOINT CENTER"\002Knüppel+Potis auf Mitte" #define TR_MOVESTICKSPOTS CENTER"\003Knüppel+Potis bewegen" @@ -751,7 +754,9 @@ #define TR_ALARMSDISABLED "Alarme ausgeschaltet" #define TR_PRESSANYKEY TR("Taste drücken",CENTER"Taste drücken") #define TR_BADEEPROMDATA "EEPROM ungültig" +#define TR_BAD_RADIO_DATA "Bad Radio Data" #define TR_EEPROMFORMATTING "EEPROM Initialisieren" +#define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "EEPROM Überlauf" #define TR_MENURADIOSETUP TR("SENDER-EINSTELLEN", "SENDER-GRUNDEINSTELLUNGEN") #define TR_MENUDATEANDTIME "DATUM UND ZEIT" @@ -830,6 +835,7 @@ #define TR_INCOMPATIBLE "Nicht kompatibel" #define TR_WARNING "WARNUNG" #define TR_EEPROMWARN "EEPROM" +#define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "EEPROM Converting" #define TR_THROTTLEWARN "GAS" #define TR_ALARMSWARN "ALARM" @@ -1163,3 +1169,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 54555fca0..264a52479 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1,27 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -32,6 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * + */ + + + +/* * !!!!! DO NOT EDIT en.h - EDIT en.h.txt INSTEAD !!!!!!! * * In order to make translations easier en.h.txt is parsed and national @@ -41,9 +31,8 @@ * !!!!! DO NOT EDIT en.h - EDIT en.h.txt INSTEAD !!!!!!! */ - - -/* Formatting octal codes available in TR_ strings: +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -51,6 +40,8 @@ * \0 -ends current string */ + + // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "OFF""ON\0" @@ -387,7 +378,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metric\0 ""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -727,7 +718,11 @@ #define TR_CAL "Cal" #define TR_VTRIM "Trim- +" #define TR_BG "BG:" -#if defined(COLORLCD) +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#elif defined(COLORLCD) #define TR_MENUTOSTART TR_ENTER " TO START" #define TR_SETMIDPOINT "CENTER STICKS/SLIDERS" #define TR_MOVESTICKSPOTS "MOVE STICKS/POTS" @@ -1189,3 +1184,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 02d5e40e2..b3cb86dc0 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1,17 +1,12 @@ /* - * Authors (alphabetical order) - * - Bertrand Songis - * - Bernet Andre - * - Jose Moreno - * - Kjell Kernen - * - Martin Hotar - * - Romolo Manfredini + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -22,8 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * + */ + +// ES translations author: Jose Moreno + +/* * !!!!! DO NOT EDIT es.h - EDIT es.h.txt INSTEAD !!!!!!! * * In order to make translations easier es.h.txt is parsed and national @@ -33,7 +31,8 @@ * * !!!!! DO NOT EDIT es.h - EDIT es.h.txt INSTEAD !!!!!!! */ - /* Formatting octal codes available in TR_ strings: + +/* Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -43,14 +42,6 @@ - - - - - - - - // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "OFF""ON\0" @@ -385,7 +376,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metric\0 ""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -449,9 +440,18 @@ #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#if defined(PCBTARANIS) - #define TR_POTS_VSRCRAW "S1\0 ""S2\0 ""S3\0 ""LS\0 ""RS\0 " - #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SD\0 ""SE\0 ""SF\0 ""SG\0 ""SH\0 " +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) + #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" +#elif defined(PCBTARANIS) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" #else #define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 " #define TR_SW_VSRCRAW "3POS" @@ -483,8 +483,9 @@ #define TR_ON_ONE_SWITCHES "ON\0""One" - -#if defined(PCBTARANIS) +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" +#elif defined(PCBTARANIS) || defined(PCBHORUS) // only special switches here #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES #else @@ -674,9 +675,15 @@ #define TR_CAL "Cal" #define TR_VTRIM "Trim- +" #define TR_BG "BG:" -#define TR_MENUTOSTART CENTER "\010" TR_ENTER " EMPEZAR" -#define TR_SETMIDPOINT TR(CENTER "\007STICKS AL CENTRO",CENTER "\010STICKS AL CENTRO") -#define TR_MOVESTICKSPOTS CENTER "\006MOVER STICKS/POTS" +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#else + #define TR_MENUTOSTART CENTER "\010" TR_ENTER " EMPEZAR" + #define TR_SETMIDPOINT TR(CENTER "\007STICKS AL CENTRO",CENTER "\010STICKS AL CENTRO") + #define TR_MOVESTICKSPOTS CENTER "\006MOVER STICKS/POTS" +#endif #define TR_RXBATT "Rx Batt:" #define TR_TXnRX "Tx:\0Rx:" #define OFS_RX 4 @@ -709,7 +716,9 @@ #define TR_ALARMSDISABLED "Alarmas Desact." #define TR_PRESSANYKEY TR("\010Pulsa una Tecla", "Pulsa una Tecla") #define TR_BADEEPROMDATA "Datos EEprom mal" +#define TR_BAD_RADIO_DATA "Bad Radio Data" #define TR_EEPROMFORMATTING "Formateo EEPROM" +#define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "Desborde EEPROM" #define TR_MENURADIOSETUP "CONFIGURACION" #define TR_MENUDATEANDTIME "FECHA Y HORA" @@ -783,6 +792,7 @@ #define TR_INCOMPATIBLE "Incompatible" #define TR_WARNING "AVISO" #define TR_EEPROMWARN "EEPROM" +#define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "EEPROM Converting" #define TR_THROTTLEWARN "ACELERADOR" #define TR_ALARMSWARN "ALARMAS" @@ -1116,3 +1126,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index c84291d8a..3c0536609 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1,16 +1,12 @@ -/* - * Authors (alphabetical order) - * - Bertrand Songis - * - Bernet Andre - * - Kjell Kernen - * - Martin Hotar - * - Romolo Manfredini +/* + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -21,9 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * - * + */ + +// FI translations author: who? + +/* * !!!!! DO NOT EDIT fi.h - EDIT fi.h.txt INSTEAD !!!!!!! * * In order to make translations easier fi.h.txt is parsed and national @@ -33,7 +31,9 @@ * * !!!!! DO NOT EDIT fi.h - EDIT fi.h.txt INSTEAD !!!!!!! */ - /* Formatting octal codes available in TR_ strings: + +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -42,15 +42,6 @@ */ - - - - - - - - - // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "POI""PÄÄ" @@ -385,7 +376,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metric\0 ""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -449,9 +440,18 @@ #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#if defined(PCBTARANIS) - #define TR_POTS_VSRCRAW "S1\0 ""S2\0 ""S3\0 ""LS\0 ""RS\0 " - #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SD\0 ""SE\0 ""SF\0 ""SG\0 ""SH\0 " +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) + #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" +#elif defined(PCBTARANIS) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" #else #define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 " #define TR_SW_VSRCRAW "3POS" @@ -483,7 +483,9 @@ #define TR_ON_ONE_SWITCHES "ON\0""One" -#if defined(PCBTARANIS) +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" +#elif defined(PCBTARANIS) || defined(PCBHORUS) // only special switches here #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES #else @@ -673,9 +675,15 @@ #define TR_CAL "Cal" #define TR_VTRIM "Trim- +" #define TR_BG "BG:" -#define TR_MENUTOSTART CENTER "\010" TR_ENTER " TO START" -#define TR_SETMIDPOINT TR(CENTER "\004SET STICKS MIDPOINT",CENTER "\004CENTER STICKS/SLIDERS") -#define TR_MOVESTICKSPOTS CENTER "\006MOVE STICKS/POTS" +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#else + #define TR_MENUTOSTART CENTER "\010" TR_ENTER " TO START" + #define TR_SETMIDPOINT TR(CENTER "\004SET STICKS MIDPOINT",CENTER "\004CENTER STICKS/SLIDERS") + #define TR_MOVESTICKSPOTS CENTER "\006MOVE STICKS/POTS" +#endif #define TR_RXBATT "Rx Batt:" #define TR_TXnRX "Tx:\0Rx:" #define OFS_RX 4 @@ -708,7 +716,9 @@ #define TR_ALARMSDISABLED "Alarms Disabled" #define TR_PRESSANYKEY TR("\010Press any Key", "Press any Key") #define TR_BADEEPROMDATA "Bad FINSKA Data" +#define TR_BAD_RADIO_DATA "Bad Radio Data" #define TR_EEPROMFORMATTING "Formatting FINSKA" +#define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "FINSKA overflow" #define TR_MENURADIOSETUP "RADIO SETUP" #define TR_MENUDATEANDTIME "DATE AND TIME" @@ -782,6 +792,7 @@ #define TR_INCOMPATIBLE "Incompatible" #define TR_WARNING "WARNING" #define TR_EEPROMWARN "FINSKA" +#define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "EEPROM Converting" #define TR_THROTTLEWARN "THROTTLE" #define TR_ALARMSWARN "ALARMS" @@ -1115,3 +1126,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index cb61eb8ca..f3d03d8a2 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1,13 +1,12 @@ -/* - * Authors (alphabetical order) - * - Andre Bernet - * - Bertrand Songis +/* + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -18,9 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * - * + */ + +// FR translations author: Andre Bernet + +/* * !!!!! DO NOT EDIT fr.h - EDIT fr.h.txt INSTEAD !!!!!!! * * In order to make translations easier fr.h.txt is parsed and national @@ -30,7 +31,9 @@ * * !!!!! DO NOT EDIT fr.h - EDIT fr.h.txt INSTEAD !!!!!!! */ - /* Formatting octal codes available in TR_ strings: + +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -39,18 +42,6 @@ */ - - - - - - - - - - - - // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "OFF""ON\0" @@ -387,7 +378,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\012") #define TR_VUNITSSYSTEM TR("Métr.\0""Impér.", "Métriques\0""Impériales") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -459,7 +450,13 @@ #define TR_STICKS_VSRCRAW TR("Dir\0""Prf\0""Gaz\0""Ail\0", "\307Dir""\307Prf""\307Gaz""\307Ail") #define TR_TRIMS_VSRCRAW TR("TrmD""TrmP""TrmG""TrmA", "\313Dir""\313Prf""\313Gaz""\313Ail") -#if defined(PCBTARANIS) && defined(REV9E) +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" #elif defined(PCBTARANIS) @@ -496,7 +493,9 @@ #define TR_ON_ONE_SWITCHES "ON\0""Un" -#if defined(PCBTARANIS) +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" +#elif defined(PCBTARANIS) || defined(PCBHORUS) // only special switches here #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES #else @@ -656,7 +655,7 @@ #define TR_GV "VG" #define TR_ACHANNEL "A" #define TR_RANGE INDENT "Plage" -#define TR_CENTER INDENT "Center" +#define TR_CENTER INDENT "Centre" #define TR_BAR "Barre" #define TR_ALARM INDENT "Alarme" #define TR_USRDATA "Données" @@ -696,7 +695,7 @@ #define TR_GPS "GPS" #define TR_RXCHANNELORD TR("Ordre voies RX","Ordre des voies préféré") #define TR_STICKS "Manches" -#define TR_POTS "Potentios" +#define TR_POTS TR("Potentios", "Potentiomètres") #define TR_SWITCHES "Inters" #define TR_SWITCHES_DELAY "Délai inters son" #define TR_SLAVE "Elève" @@ -705,7 +704,11 @@ #define TR_CAL "Cal" #define TR_VTRIM "Trim- +" #define TR_BG "BG:" -#if defined(COLORLCD) +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Presser [Enter] pour commencer" + #define TR_SETMIDPOINT "Centrer manches/pots/sliders et presser [Enter]" + #define TR_MOVESTICKSPOTS "Bouger manches/pots/sliders et presser [Enter]" +#elif defined(COLORLCD) #define TR_MENUTOSTART TR_ENTER " POUR DEBUT" #define TR_SETMIDPOINT "REGLER NEUTRES" #define TR_MOVESTICKSPOTS "BOUGER STICKS/POTS" @@ -746,7 +749,9 @@ #define TR_ALARMSDISABLED "Alarmes Désactivées" #define TR_PRESSANYKEY TR("Touche pour continuer", "Touche pour continuer") #define TR_BADEEPROMDATA "EEPROM corrompue" +#define TR_BAD_RADIO_DATA "Réglages radio corrompus" #define TR_EEPROMFORMATTING "Formatage EEPROM" +#define TR_STORAGE_FORMAT "Préparation stockage" #define TR_EEPROMOVERFLOW "Dépassement EEPROM" #define TR_MENURADIOSETUP "CONFIG RADIO" #define TR_MENUDATEANDTIME "DATE ET HEURE" @@ -817,6 +822,7 @@ #define TR_INCOMPATIBLE "Incompatible" #define TR_WARNING "ALERTE" #define TR_EEPROMWARN "EEPROM" +#define TR_STORAGE_WARNING "STOCKAGE" #define TR_EEPROM_CONVERTING "Conversion EEPROM" #define TR_THROTTLEWARN "GAZ" #define TR_ALARMSWARN "SON" @@ -911,7 +917,7 @@ #define TR_RESET_TELEMETRY TR("Réinit. Télém.", "Réinit. Télémesure") #define TR_STATISTICS "Statistiques" #define TR_ABOUT_US "A propos" -#define TR_SETUP_SCREENS "Setup screens" +#define TR_SETUP_SCREENS "Configuration écrans" #define TR_AND_SWITCH "ET suppl." #define TR_SF "FS" #define TR_GF "FG" @@ -1071,7 +1077,7 @@ #define TR_SCALE "Echelle" #define TR_VIEW_CHANNELS "Voir Voies" #define TR_VIEW_NOTES "Voir Notes" -#define TR_MODEL_SELECT "Model Select" +#define TR_MODEL_SELECT "Sélection modèle" #define TR_MODS_FORBIDDEN "Modifications désactivées!" #define TR_UNLOCKED "Déverrouillé" #define TR_ID "ID" @@ -1096,10 +1102,10 @@ #define TR_STOP_DISCOVER_SENSORS INDENT "Terminer découverte" #define TR_DELETE_ALL_SENSORS TR(INDENT "Suppr. tous capteurs",INDENT "Supprimer tous capteurs") #define TR_CONFIRMDELETE TR("Tout effacer?","Vraiment tout effacer?") -#define TR_SELECT_WIDGET "Select widget" -#define TR_REMOVE_WIDGET "Remove widget" -#define TR_WIDGET_SETTINGS "Widget settings" -#define TR_REMOVE_SCREEN "Remove screen" +#define TR_SELECT_WIDGET "Sélect. widget" +#define TR_REMOVE_WIDGET "Supprimer widget" +#define TR_WIDGET_SETTINGS "Réglages widget" +#define TR_REMOVE_SCREEN "Supprimer écran" #define TR_MENU_INPUTS "\314Entrées" #define TR_MENU_LUA "\322Scripts Lua" @@ -1109,13 +1115,13 @@ #define TR_MENU_HELI "\316Cyclique" #define TR_MENU_TRIMS "\313Trims" #define TR_MENU_SWITCHES "\312Inters" -#define TR_MENU_LOGICAL_SWITCHES "\312Logical Switches" +#define TR_MENU_LOGICAL_SWITCHES "\312Inters logiques" #define TR_MENU_TRAINER "\317Ecolage" #define TR_MENU_CHANNELS "\320Canaux" #define TR_MENU_GVARS "\311Vars. glob." #define TR_MENU_TELEMETRY "\321Télémesure" -#define TR_MENU_OTHER "Other" -#define TR_MENU_INVERT "Invert" +#define TR_MENU_OTHER "Autres" +#define TR_MENU_INVERT "Inverser" #define ZSTR_RSSI "RSSI" #define ZSTR_SWR "SWR" @@ -1150,3 +1156,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 5f159fae2..af85f4c6a 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1,27 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -32,8 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * + */ + +// IT translations author: Romolo Manfredini + +/* * !!!!! DO NOT EDIT it.h - EDIT it.h.txt INSTEAD !!!!!!! * * In order to make translations easier it.h.txt is parsed and national @@ -44,9 +32,8 @@ * !!!!! DO NOT EDIT it.h - EDIT it.h.txt INSTEAD !!!!!!! */ - - - /* Formatting octal codes available in TR_ strings: +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -54,6 +41,7 @@ * \0 -ends current string */ + // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "OFF""ON\0" @@ -390,7 +378,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\011") #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metriche\0""Imperiali") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -461,8 +449,14 @@ #define TR_STICKS_VSRCRAW TR("Dir\0""Ele\0""Mot\0""Ale\0", "\307Dir""\307Ele""\307Mot""\307Ale") #define TR_TRIMS_VSRCRAW TR("TrmR""TrmE""TrmT""TrmA", "\313Dir""\313Ele""\313Mot""\313Ale") - -#if defined(PCBTARANIS) && defined(REV9E) + +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" #elif defined(PCBTARANIS) @@ -499,7 +493,9 @@ #define TR_ON_ONE_SWITCHES "ON\0""One" -#if defined(PCBTARANIS) +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" +#elif defined(PCBTARANIS) || defined(PCBHORUS) // only special switches here #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES #else @@ -708,14 +704,18 @@ #define TR_CAL "Cal" #define TR_VTRIM "Trim- +" #define TR_BG "BG:" -#if defined(COLORLCD) +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#elif defined(COLORLCD) #define TR_MENUTOSTART TR_ENTER " TO START" #define TR_SETMIDPOINT "CENTRA STICKS/SLIDERS" #define TR_MOVESTICKSPOTS "MUOVI STICKS/POTS" #else - #define TR_MENUTOSTART CENTER"\011" TR_ENTER " per Cal." - #define TR_SETMIDPOINT CENTER"\012SETTA CENTRO" - #define TR_MOVESTICKSPOTS CENTER"\010MUOVI STICK/POT" + #define TR_MENUTOSTART CENTER"\011" TR_ENTER " per Cal." + #define TR_SETMIDPOINT CENTER"\012SETTA CENTRO" + #define TR_MOVESTICKSPOTS CENTER"\010MUOVI STICK/POT" #endif #define TR_RXBATT "Batt Rx:" #define TR_TXnRX "Tx:\0Rx:" @@ -749,7 +749,9 @@ #define TR_ALARMSDISABLED "Avvisi Disattivati!" #define TR_PRESSANYKEY "\010Premi un tasto" #define TR_BADEEPROMDATA "Dati corrotti!" +#define TR_BAD_RADIO_DATA "Bad Radio Data" #define TR_EEPROMFORMATTING "Formatto EEPROM..." +#define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "EEPROM Piena" #define TR_MENURADIOSETUP "CONFIGURATX" #define TR_MENUDATEANDTIME "DATA E ORA" @@ -828,6 +830,7 @@ #define TR_INCOMPATIBLE "Incompatibile" #define TR_WARNING "AVVISO" #define TR_EEPROMWARN "EEPROM" +#define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "Conversione EEPROM" #define TR_THROTTLEWARN "MOTORE" #define TR_ALARMSWARN "ALLARMI" @@ -1162,3 +1165,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index fdd681e69..4c7f7100f 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1,29 +1,12 @@ - /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Jean-Pierre van Melis - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -34,6 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * + */ + +// NL translations author: who? + +/* * !!!!! DO NOT EDIT nl.h - EDIT nl.h.txt INSTEAD !!!!!!! * * In order to make translations easier nl.h.txt is parsed and national @@ -43,9 +31,8 @@ * !!!!! DO NOT EDIT nl.h - EDIT nl.h.txt INSTEAD !!!!!!! */ - - -/* Formatting octal codes available in TR_ strings: +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -53,6 +40,8 @@ * \0 -ends current string */ + + // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "UIT""AAN" @@ -390,7 +379,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metrs.""Engels", "Metrisch\0 ""Engels\0 ") #define LEN_VTELEMUNIT "\003" -#define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" +#define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -461,8 +450,14 @@ #define TR_STICKS_VSRCRAW TR("Rud\0""Ele\0""Thr\0""Ail\0", "\307Rud""\307Ele""\307Thr""\307Ail") #define TR_TRIMS_VSRCRAW TR("TrmR""TrmE""TrmT""TrmA", "\313Rud""\313Ele""\313Thr""\313Ail") - -#if defined(PCBTARANIS) && defined(REV9E) + +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" #elif defined(PCBTARANIS) @@ -503,16 +498,12 @@ #define TR_ON_ONE_SWITCHES "ON\0""One" -#if defined(PCBTARANIS) +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" +#elif defined(PCBTARANIS) || defined(PCBHORUS) // only special switches here #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES - - #else - - - - #define TR_VSWITCHES "---" TR_9X_3POS_SWITCHES TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW TR_ON_ONE_SWITCHES #endif @@ -724,7 +715,11 @@ #define TR_CAL "Cal" #define TR_VTRIM "Trim - +" #define TR_BG "BG:" -#if defined(COLORLCD) +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#elif defined(COLORLCD) #define TR_MENUTOSTART TR_ENTER " VOOR START" #define TR_SETMIDPOINT "CENTREER STICKS/SLIDERS" #define TR_MOVESTICKSPOTS "BEWEEG STICKS/POTS" @@ -765,7 +760,9 @@ #define TR_ALARMSDISABLED "Alarm uitgeschakeld" #define TR_PRESSANYKEY TR("\010Druk een Toets", "Druk een Toets") #define TR_BADEEPROMDATA "EEPROM Ongeldig" +#define TR_BAD_RADIO_DATA "Bad Radio Data" #define TR_EEPROMFORMATTING "EEPROM Initialiseren" +#define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "EEPROM Overflow" #define TR_MENURADIOSETUP TR("ZENDER-INSTELLEN", "ZENDER-BASISINSTELLENGEN") @@ -847,6 +844,7 @@ #define TR_INCOMPATIBLE "Niet compatibel" #define TR_WARNING TR("WARNING","WAARSCHUWING") #define TR_EEPROMWARN "EEPROM" +#define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "EEPROM Converteren" #define TR_THROTTLEWARN "GAS" #define TR_ALARMSWARN "ALARM" @@ -1182,3 +1180,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index e007cf341..1bfeb9603 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1,28 +1,12 @@ /* - * Authors (alphabetical order) - * - Andre Bernet - * - Andreas Weitl - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Gabriel Birkus - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michael Blandford - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Jacek Drewniak - * - Thomas Husterer + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -33,6 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * + */ + +// PL translations author: Jacek Drewniak + +/* * !!!!! DO NOT EDIT pl.h - EDIT pl.h.txt INSTEAD !!!!!!! * * In order to make translations easier pl.h.txt is parsed and national @@ -43,9 +32,8 @@ * */ - - -/* Formatting octal codes available in TR_ strings: +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -53,6 +41,7 @@ * \0 -ends current string */ + // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "WYŁ""ZAŁ" @@ -391,7 +380,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") /*8 decimal*/ #define TR_VUNITSSYSTEM TR("Metr. ""Imper.", "Metryczn""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -462,8 +451,14 @@ #define TR_STICKS_VSRCRAW TR("SK \0""SW \0""Gaz\0""Lot\0", "\307SK ""\307SW ""\307Gaz""\307Lot") #define TR_TRIMS_VSRCRAW TR("TrSK""TrSW""TrGA""TrLO", "\313SK ""\313SW ""\313Gaz""\313Lot") - -#if defined(PCBTARANIS) && defined(REV9E) + +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\310S4\0""\311LS\0""\311RS\0""\311LS2""\311RS2" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" #elif defined(PCBTARANIS) @@ -500,7 +495,9 @@ #define TR_ON_ONE_SWITCHES "ON\0""One" -#if defined(PCBTARANIS) +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" +#elif defined(PCBTARANIS) || defined(PCBHORUS) // only special switches here #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES #else @@ -709,14 +706,18 @@ #define TR_CAL "Kal." #define TR_VTRIM "Trym- +" #define TR_BG "BG:" -#if defined(COLORLCD) +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#elif defined(COLORLCD) #define TR_MENUTOSTART TR_ENTER " KALIBRUJ" #define TR_SETMIDPOINT "Centruj drażki/potencj" - #define TR_MOVESTICKSPOTS "Poruszaj drążkami/pot" + #define TR_MOVESTICKSPOTS "Poruszaj drążkami/pot" #else #define TR_MENUTOSTART CENTER "\010" TR_ENTER " KALIBRUJ" - #define TR_SETMIDPOINT TR(CENTER "\002Cenruj drążki/potencj",CENTER "\010Ustaw drązki/potencj na środku") - #define TR_MOVESTICKSPOTS "Poruszaj drążkami/pot" + #define TR_SETMIDPOINT TR(CENTER "\002Cenruj drążki/potencj",CENTER "\010Ustaw drązki/potencj na środku") + #define TR_MOVESTICKSPOTS "Poruszaj drążkami/pot" #endif #define TR_RXBATT "Rx Batt:" #define TR_TXnRX "Tx:\0Rx:" @@ -750,7 +751,9 @@ #define TR_ALARMSDISABLED "Alarmy wyłączone" #define TR_PRESSANYKEY TR("\010Wciśnij jakiś klawisz","Wciśnij jakiś klawisz") #define TR_BADEEPROMDATA "\006Błąd danych EEPROM" +#define TR_BAD_RADIO_DATA "Bad Radio Data" #define TR_EEPROMFORMATTING "\004Formatowanie EEPROM" +#define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "Przeładowany EEPROM" #define TR_MENURADIOSETUP "USTAWIENIA RADIA" #define TR_MENUDATEANDTIME "DATA I CZAS" @@ -829,6 +832,7 @@ #define TR_INCOMPATIBLE "Niekompatybilne" #define TR_WARNING "UWAGA" #define TR_EEPROMWARN "EEPROM" +#define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "Konwersja EEPROM" #define TR_THROTTLEWARN "GAZ" #define TR_ALARMSWARN "ALARM" @@ -1163,3 +1167,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index ce29cd237..ce130a947 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1,16 +1,12 @@ /* - * Authors (alphabetical order) - * - Bertrand Songis - * - Bernet Andre - * - Kjell Kernen - * - Martin Hotar - * - Romolo Manfredini + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -21,9 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * - * + */ + +// PT translations author: who? + +/* * !!!!! DO NOT EDIT pt.h - EDIT pt.h.txt INSTEAD !!!!!!! * * In order to make translations easier pt.h.txt is parsed and national @@ -33,7 +31,9 @@ * * !!!!! DO NOT EDIT pt.h - EDIT pt.h.txt INSTEAD !!!!!!! */ - /* Formatting octal codes available in TR_ strings: + +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -42,15 +42,6 @@ */ - - - - - - - - - // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "OFF""ON\0" @@ -379,7 +370,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metric\0 ""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -443,9 +434,18 @@ #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#if defined(PCBTARANIS) - #define TR_POTS_VSRCRAW "S1\0 ""S2\0 ""S3\0 ""LS\0 ""RS\0 " - #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SD\0 ""SE\0 ""SF\0 ""SG\0 ""SH\0 " +#if defined(PCBHORUS) + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311S3\0""\311S4\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" +#elif defined(PCBFLAMENCO) + #define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 " + #define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 " +#elif defined(PCBTARANIS) && defined(REV9E) + #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" +#elif defined(PCBTARANIS) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" #else #define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 " #define TR_SW_VSRCRAW "3POS" @@ -477,7 +477,9 @@ #define TR_ON_ONE_SWITCHES "ON\0""One" -#if defined(PCBTARANIS) +#if defined(PCBFLAMENCO) + #define TR_VSWITCHES "---" TR_PHYS_SWITCHES TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_LOGICALSW "ON\0""One" +#elif defined(PCBTARANIS) || defined(PCBHORUS) // only special switches here #define TR_VSWITCHES "---" TR_TRIMS_SWITCHES TR_ON_ONE_SWITCHES #else @@ -667,9 +669,15 @@ #define TR_CAL "Cal" #define TR_VTRIM "Trim- +" #define TR_BG "BG:" -#define TR_MENUTOSTART CENTER"\011" TR_ENTER " INICIAR" -#define TR_SETMIDPOINT TR(CENTER"\005CENTRAR STICK/POT",CENTER"\006CENTRAR STICK/POT") -#define TR_MOVESTICKSPOTS TR(CENTER"\005MOVER STICKS/POTs",CENTER"\006MOVER STICKS/POTs") +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#else + #define TR_MENUTOSTART CENTER"\011" TR_ENTER " INICIAR" + #define TR_SETMIDPOINT TR(CENTER"\005CENTRAR STICK/POT",CENTER"\006CENTRAR STICK/POT") + #define TR_MOVESTICKSPOTS TR(CENTER"\005MOVER STICKS/POTs",CENTER"\006MOVER STICKS/POTs") +#endif #define TR_RXBATT "Rx Batt:" #define TR_TXnRX "Tx:\0Rx:" #define OFS_RX 4 @@ -702,7 +710,9 @@ #define TR_ALARMSDISABLED "Desabilita Alarmes" #define TR_PRESSANYKEY "\010Pressione Tecla" #define TR_BADEEPROMDATA "EEPRON INVALIDA" +#define TR_BAD_RADIO_DATA "Bad Radio Data" #define TR_EEPROMFORMATTING "Formatando EEPROM" +#define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "EEPROM CHEIA" #define TR_MENURADIOSETUP "AJUSTAR RADIO" #define TR_MENUDATEANDTIME "DATA E HORA" @@ -776,6 +786,7 @@ #define TR_INCOMPATIBLE "Incompativel" #define TR_WARNING "AVISO" #define TR_EEPROMWARN "EEPROM" +#define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "EEPROM Converting" #define TR_THROTTLEWARN "ACELERAD" #define TR_ALARMSWARN "ALARMES" @@ -1109,3 +1120,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index b800dd2e1..851cf5319 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1,16 +1,12 @@ /* - * Authors (alphabetical order) - * - Bertrand Songis - * - Bernet Andre - * - Kjell Kernen - * - Martin Hotar - * - Romolo Manfredini + * Copyright (C) OpenTX * - * opentx is based on code named - * gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/, - * er9x by Erez Raviv: http://code.google.com/p/er9x/, - * and the original (and ongoing) project by - * Thomas Husterer, th9x: http://code.google.com/p/th9x/ + * Based on code named + * 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 @@ -21,9 +17,11 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * - * + */ + +// SE translations author: Kjell Kernen + +/* * !!!!! DO NOT EDIT se.h - EDIT se.h.txt INSTEAD !!!!!!! * * In order to make translations easier se.h.txt is parsed and national @@ -33,7 +31,9 @@ * * !!!!! DO NOT EDIT se.h - EDIT se.h.txt INSTEAD !!!!!!! */ - /* Formatting octal codes available in TR_ strings: + +/* + * Formatting octal codes available in TR_ strings: * \037\x -sets LCD x-coord (x value in octal) * \036 -newline * \035 -horizontal tab (ARM only) @@ -42,15 +42,6 @@ */ - - - - - - - - - // NON ZERO TERMINATED STRINGS #define LEN_OFFON "\003" #define TR_OFFON "Av ""På\0" @@ -385,7 +376,7 @@ #define LEN_VUNITSSYSTEM TR("\006", "\010") #define TR_VUNITSSYSTEM TR("Metri.""Imper.", "Metriska""Imperial") #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" + #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""ml\0""fOz" #else #if defined(IMPERIAL_UNITS) #define LENGTH_UNIT LENGTH_UNIT_IMP @@ -726,14 +717,18 @@ #define TR_CAL "Kalib." #define TR_VTRIM "Trim- +" #define TR_BG "BG:" -#if defined(COLORLCD) +#if defined(PCBHORUS) + #define TR_MENUTOSTART "Press [Enter] to start" + #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" +#elif defined(COLORLCD) #define TR_MENUTOSTART TR_ENTER " Startar " #define TR_SETMIDPOINT "Centrera Allt" #define TR_MOVESTICKSPOTS "Rör Spakar/Rattar" #else - #define TR_MENUTOSTART CENTER "\011" TR_ENTER " Startar " - #define TR_SETMIDPOINT TR(CENTER "\012Centrera Allt",CENTER "\013Centrera Allt") - #define TR_MOVESTICKSPOTS TR(CENTER "\005Rör Spakar/Rattar",CENTER "\006Rör Spakar/Rattar") + #define TR_MENUTOSTART CENTER "\011" TR_ENTER " Startar " + #define TR_SETMIDPOINT TR(CENTER "\012Centrera Allt",CENTER "\013Centrera Allt") + #define TR_MOVESTICKSPOTS TR(CENTER "\005Rör Spakar/Rattar",CENTER "\006Rör Spakar/Rattar") #endif #define TR_RXBATT "Rx Batt:" #define TR_TXnRX "Tx:\0Rx:" @@ -1186,3 +1181,13 @@ #define ZSTR_BATT2_CONSUMPTION "RB2C" #define ZSTR_RB_STATE "RBS" #define ZSTR_CHANS_STATE "RBCS" +#define ZSTR_RX_RSSI1 "1RSS" +#define ZSTR_RX_RSSI2 "2RSS" +#define ZSTR_RX_QUALITY "RQly" +#define ZSTR_RX_SNR "RSNR" +#define ZSTR_ANTENNA "ANT" +#define ZSTR_RF_MODE "RFMD" +#define ZSTR_TX_POWER "TPWR" +#define ZSTR_TX_RSSI "TRSS" +#define ZSTR_TX_QUALITY "TQly" +#define ZSTR_TX_SNR "TSNR" \ No newline at end of file diff --git a/radio/src/vario.cpp b/radio/src/vario.cpp index 67f195e4e..2d81568e9 100644 --- a/radio/src/vario.cpp +++ b/radio/src/vario.cpp @@ -80,7 +80,7 @@ void varioWakeup() if (isFunctionActive(FUNCTION_VARIO)) { #if defined(AUDIO) cli(); - int16_t verticalSpeed = frskyData.hub.varioSpeed; + int16_t verticalSpeed = telemetryData.hub.varioSpeed; sei(); #if defined(PCBSTD) @@ -126,7 +126,7 @@ void varioWakeup() #elif defined(BUZZER) // && !defined(AUDIO) - int8_t verticalSpeed = limit((int16_t)-100, (int16_t)(frskyData.hub.varioSpeed/10), (int16_t)+100); + int8_t verticalSpeed = limit((int16_t)-100, (int16_t)(telemetryData.hub.varioSpeed/10), (int16_t)+100); uint16_t interval; if (verticalSpeed == 0) { diff --git a/radio/util/Dockerfile b/radio/util/Dockerfile new file mode 100644 index 000000000..88566c8f2 --- /dev/null +++ b/radio/util/Dockerfile @@ -0,0 +1,39 @@ +# An Debian image for compiling OpenTX 2.2 + +FROM debian:jessie + +RUN apt-get update && \ + apt-get install -y \ + avr-libc \ + build-essential \ + cmake \ + gcc \ + git \ + lib32ncurses5 \ + lib32z1 \ + libfox-1.6-dev \ + libsdl1.2-dev \ + python-qt4 \ + qt5-default \ + qtmultimedia5-dev \ + qttools5-dev \ + qttools5-dev-tools \ + software-properties-common \ + wget + +RUN wget -q https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q3-update/+download/gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ + tar xjf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 && \ + mv gcc-arm-none-eabi-4_7-2013q3 /opt/gcc-arm-none-eabi + +RUN wget -q http://ftp.de.debian.org/debian/pool/main/g/gcc-avr/gcc-avr_4.7.2-2_amd64.deb && \ + wget -q http://ftp.de.debian.org/debian/pool/main/a/avr-libc/avr-libc_1.8.0-2_all.deb && \ + wget -q http://ftp.de.debian.org/debian/pool/main/b/binutils-avr/binutils-avr_2.24+Atmel3.4.4-1_amd64.deb && \ + wget -q http://ftp.de.debian.org/debian/pool/main/m/mpclib/libmpc2_0.9-4_amd64.deb && \ + dpkg -i gcc-avr_4.7.2-2_amd64.deb libmpc2_0.9-4_amd64.deb avr-libc_1.8.0-2_all.deb binutils-avr_2.24+Atmel3.4.4-1_amd64.deb + +VOLUME ["/opentx"] + +ENV PATH $PATH:/opt/gcc-arm-none-eabi/bin:/opentx/code/radio/util +ARG OPENTX_VERSION_SUFFIX= +ENV OPENTX_VERSION_SUFFIX ${OPENTX_VERSION_SUFFIX} + diff --git a/radio/util/build.py b/radio/util/build.py new file mode 100755 index 000000000..1e7ff6bc5 --- /dev/null +++ b/radio/util/build.py @@ -0,0 +1,224 @@ +#!/usr/bin/env python + +import os +import sys +import subprocess +import shutil +from fwoptions import * + +# Error codes +FIRMWARE_SIZE_TOO_BIG = 1 +COMPILATION_ERROR = 4 +INVALID_FIRMWARE = 5 +INVALID_BOARD = 6 +INVALID_LANGUAGE = 7 + +# Board types +BOARD_9X = 0 +BOARD_GRUVIN9X = 1 +BOARD_SKY9X = 2 +BOARD_TARANIS = 3 +BOARD_HORUS = 4 + +# Board families +BOARD_FAMILY_AVR = 0 +BOARD_FAMILY_ARM = 1 + +if len(sys.argv) != 3: + exit(INVALID_FIRMWARE) + +what = sys.argv[1] +directory, filename = os.path.split(sys.argv[2]) +root, ext = os.path.splitext(filename) +options = root.split("-") + +if len(options) < 2 or options[0] != "opentx": + exit(INVALID_FIRMWARE) + +optcount = 1 +command_options = {} + +if options[optcount] == "9x": + command_options["PCB"] = "9X" + firmware_options = options_9x + maxsize = 65536 + board = BOARD_9X + board_family = BOARD_FAMILY_AVR +elif options[optcount] == "9xr": + command_options["PCB"] = "9XR" + firmware_options = options_9x + maxsize = 65536 + board = BOARD_9X + board_family = BOARD_FAMILY_AVR +elif options[optcount] == "9x128": + command_options["PCB"] = "9X128" + command_options["FRSKY_STICKS"] = "YES" + firmware_options = options_9x128 + maxsize = 65536 * 2 + board = BOARD_9X + board_family = BOARD_FAMILY_AVR +elif options[optcount] == "9xr128": + command_options["PCB"] = "9XR128" + command_options["FRSKY_STICKS"] = "YES" + firmware_options = options_9x128 + maxsize = 65536 * 2 + board = BOARD_9X + board_family = BOARD_FAMILY_AVR +elif options[optcount] == "gruvin9x": + command_options["PCB"] = "GRUVIN9X" + command_options["EXT"] = "FRSKY" + firmware_options = options_gruvin9x + maxsize = 65536 * 4 + board = BOARD_GRUVIN9X + board_family = BOARD_FAMILY_AVR +elif options[optcount] == "mega2560": + command_options["PCB"] = "MEGA2560" + command_options["EXT"] = "FRSKY" + firmware_options = options_mega2560 + maxsize = 65536 * 4 + board = BOARD_GRUVIN9X + board_family = BOARD_FAMILY_AVR +elif options[optcount] == "sky9x": + command_options["PCB"] = "SKY9X" + firmware_options = options_sky9x + maxsize = 65536 * 4 + board = BOARD_SKY9X + board_family = BOARD_FAMILY_ARM +elif options[optcount] == "9xrpro": + command_options["PCB"] = "9XRPRO" + command_options["SDCARD"] = "YES" + firmware_options = options_sky9x + maxsize = 65536 * 4 + board = BOARD_SKY9X + board_family = BOARD_FAMILY_ARM +elif options[optcount] == "ar9x": + command_options["PCB"] = "AR9X" + command_options["SDCARD"] = "YES" + command_options["HARDWARE_VOLUME"] = "NO" + firmware_options = options_ar9x + maxsize = 65536 * 4 + board = BOARD_SKY9X + board_family = BOARD_FAMILY_ARM +elif options[optcount] == "taranis": + command_options["PCB"] = "TARANIS" + firmware_options = options_taranis + maxsize = 65536 * 8 + board = BOARD_TARANIS + board_family = BOARD_FAMILY_ARM +elif options[optcount] == "taranisplus": + command_options["PCB"] = "TARANIS" + command_options["PCBREV"] = "REVPLUS" + firmware_options = options_taranisplus + maxsize = 65536 * 8 + board = BOARD_TARANIS + board_family = BOARD_FAMILY_ARM +elif options[optcount] == "taranisx9e": + command_options["PCB"] = "TARANIS" + command_options["PCBREV"] = "REV9E" + firmware_options = options_taranisx9e + maxsize = 65536 * 8 + board = BOARD_TARANIS + board_family = BOARD_FAMILY_ARM +elif options[optcount] == "horus": + command_options["PCB"] = "HORUS" + firmware_options = options_horus + maxsize = 2 * 1024 * 1024 + board = BOARD_HORUS + board_family = BOARD_FAMILY_ARM +else: + exit(INVALID_BOARD) + +if what == "firmware": + if board_family == BOARD_FAMILY_ARM: + ext = ".bin" + else: + ext = ".hex" + target = "firmware" + ext + filename = "opentx" +elif what == "libsimulator": + ext = ".so" + target = "libopentx-" + options[optcount] + "-simulator.so" + filename = "libopentx" +else: + exit(INVALID_BOARD) + +filename += "-" + options[optcount] +optcount += 1 + +# The firmware options +for opt, value in firmware_options.items(): + found = False + for i in range(optcount, len(options)): + if options[i] == opt: + found = True + break + + if found: + optvalue = value[1]; + filename += "-" + opt; + else: + optvalue = value[2] + + if optvalue is not None: + command_options[value[0]] = optvalue + +# The firmware display language +language = "" +for key in languages: + if key == options[-1]: + language = key +if not language: + exit(INVALID_LANGUAGE) +command_options["TRANSLATIONS"] = language.upper() + +filename += "-" + language + ext +srcdir = os.path.dirname(os.path.realpath(__file__)) + "/../.." +path = os.path.join(directory, filename) +outpath = path + ".out" +errpath = path + ".err" + +if os.path.isfile(errpath): + exit(COMPILATION_ERROR) + +if not os.path.isfile(path): + # Launch CMake + cmd = ["cmake"] + for opt, value in command_options.items(): + cmd.append("-D%s=%s" % (opt, value)) + if "OPENTX_VERSION_SUFFIX" in os.environ: + cmd.append('-DVERSION_SUFFIX="%s"' % os.environ["OPENTX_VERSION_SUFFIX"]) + cmd.append(srcdir) + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, error = proc.communicate() + if proc.returncode == 0: + file(outpath, "a").write(output + error) + else: + file(errpath, "w").write(output + error) + exit(COMPILATION_ERROR) + + # Launch make + cmd = ["make", what] + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, error = proc.communicate() + if proc.returncode == 0: + file(outpath, "a").write(output + error) + else: + file(errpath, "w").write(output + error) + exit(COMPILATION_ERROR) + + if what == "firmware": + # Check binary size + if board_family == BOARD_FAMILY_ARM: + size = os.stat(target).st_size + else: + size = subprocess.check_output('avr-size -A %s | grep Total | cut -f2- -d " "' % target, shell=True) + size = int(size.strip()) + if size > maxsize: + exit(FIRMWARE_SIZE_TOO_BIG) + + + # Copy binary to the binaries directory + shutil.copyfile(target, path) + +print filename +exit(0) \ No newline at end of file diff --git a/radio/util/checksize.py b/radio/util/checksize.py new file mode 100644 index 000000000..adfb07a6f --- /dev/null +++ b/radio/util/checksize.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +import os +import sys +import subprocess + +index = -1 +size = None + +options = sys.argv[1:] +srcdir = os.path.dirname(os.path.realpath(__file__)) + "/../.." +buildir = os.getcwd() + +while 1: + sys.stdout.flush() + index += 1 + + os.chdir(srcdir) + cmd = ["git", "reset", "--hard", "FETCH_HEAD~%d" % index] + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, error = proc.communicate() + if proc.returncode != 0: + print "HEAD~%d git reset failed" % index + continue + + os.chdir(buildir) + cmd = ["cmake"] + options + [srcdir] + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, error = proc.communicate() + if proc.returncode != 0: + print "HEAD~%d cmake failed" % index + continue + + cmd = ["make", "-j4", "firmware"] + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, error = proc.communicate() + if proc.returncode != 0: + print "HEAD~%d make firmware failed" % index + continue + + if os.path.isfile("firmware.bin"): + oldsize = os.stat("firmware.bin").st_size + else: + oldsize = int(subprocess.check_output('avr-size -A firmware.hex | grep Total | cut -f2- -d " "', shell=True)) + if size: + if size > oldsize: + print "HEAD~%d %d: increase by %d bytes" % (index-1, size, size-oldsize) + elif size < oldsize: + print "HEAD~%d %d: decrease by %d bytes" % (index-1, size, oldsize-size) + else: + print "HEAD~%d %d" % (index-1, size) + size = oldsize + + diff --git a/radio/util/commit-tests.sh b/radio/util/commit-tests.sh index cf3599151..2a78fa28a 100755 --- a/radio/util/commit-tests.sh +++ b/radio/util/commit-tests.sh @@ -84,4 +84,4 @@ rm -rf * cmake ${COMMON_OPTIONS} -DPCB=HORUS -DHELI=NO -DUSB=SERIAL -DCLI=YES -DDEBUG=YES ${SRCDIR} make -j2 firmware make -j2 simu -#make -j2 gtests ; ./gtests +# make -j2 gtests ; ./gtests diff --git a/radio/util/font2png.py b/radio/util/font2png.py index 43482dd62..da05af48d 100755 --- a/radio/util/font2png.py +++ b/radio/util/font2png.py @@ -89,11 +89,9 @@ def createFontBitmap(filename, fontname, fontsize, fontbold, foreground, backgro image.save(filename + ".png") if coordsfile: with open(filename + ".specs", "w") as f: - f.write("{ ") f.write(",".join(str(tmp) for tmp in coords)) for i in range(1, 14): f.write(", %d" % (int(coords[-1]) + i * (extraWidth / 12))) - f.write(" }") return coords if __name__ == "__main__": diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py new file mode 100755 index 000000000..8f6c91fe4 --- /dev/null +++ b/radio/util/fwoptions.py @@ -0,0 +1,311 @@ +#!/usr/bin/env python + +languages = ( + "en", + "fr", + "se", + "it", + "cz", + "de", + "pt", + "es", + "pl", + "nl" +) + +tts_languages = { + "en", + "fr", + "it", + "cz", + "de", + "pt" +} +tts_avr = { + "tts%s" % language: ("TTS", language.upper(), None) for language in tts_languages + } + +options_9x_ext = { + "nmea": ("EXT", "NMEA", None), + "frsky": ("EXT", "FRSKY", None), + "telemetrez": ("EXT", "TELEMETREZ", None), + "jeti": ("EXT", "JETI", None), + "ardupilot": ("EXT", "ARDUPILOT", None), + "mavlink": ("EXT", "MAVLINK", None), +} + +options_9x = { + "heli": ("HELI", "YES", "NO"), + "templates": ("TEMPLATES", "YES", "NO"), + "nosplash": ("SPLASH", "NO", "YES"), + "nofp": ("FLIGHT_MODES", "NO", "YES"), + "nocurves": ("CURVES", "NO", "YES"), + "audio": ("AUDIO", "YES", "NO"), + "voice": ("VOICE", "YES", "NO"), + "haptic": ("HAPTIC", "YES", "NO"), + "pwmbl": ("PWM_BACKLIGHT", "YES", "NO"), + "turnigyfix": ("TURNIGY_TRANSMITTER_FIX", "YES", "NO"), + "acurStats": ("ACCURAT_THROTTLE_STATS", "YES", "NO"), + "arithOvfl": ("ARITHMETIC_OVERFLOW_CHECK", "YES", "NO"), + # "PXX": ("PXX", "YES", "NO"), + "DSM2": ("DSM2", "PPM ", "NO"), + "potscroll": ("NAVIGATION", "POTS ", "NO"), + "rotenc": ("NAVIGATION", "ROTENC ", "NO"), + "sp22": ("SP22", "YES", "NO"), + "autosource": ("AUTOSOURCE", "YES", "NO"), + "autoswitch": ("AUTOSWITCH", "YES", "NO"), + "dblkeys": ("DBLKEYS", "YES", "NO"), + "ppmca": ("PPM_CENTER_ADJUSTABLE", "YES", "NO"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "gvars": ("GVARS", "YES", "NO"), + "symlimits": ("PPM_LIMITS_SYMETRICAL", "YES", "NO"), + "nographics": ("GRAPHICS", "NO", "YES"), + "battgraph": ("BATTGRAPH", "YES", "NO"), + "nobold": ("BOLD", "NO", "YES"), + "sqt5font": ("FONT", "SQT5 ", None), + "thrtrace": ("THR_TRACE", "YES", "NO"), + "pgbar": ("EEPROM_PROGRESS_BAR", "YES", "NO"), + "imperial": ("UNITS", "IMPERIAL", "METRIC"), + "nogps": ("GPS", "NO", "YES"), + "nogauges": ("GAUGES", "NO", "YES"), + "novario": ("VARIO", "NO", "YES"), + "nowshh": ("WS_HOW_HIGH", "NO", "YES"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE ", None), + "fasoffset": ("FAS_OFFSET", "YES", "NO"), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "stickrev": ("FRSKY_STICKS", "YES", "NO") +} + +options_9x.update(options_9x_ext) +options_9x.update(tts_avr) + +options_9x128 = { + "heli": ("HELI", "YES", "NO"), + "templates": ("TEMPLATES", "YES", "NO"), + "nosplash": ("SPLASH", "NO", "YES"), + "nofp": ("FLIGHT_MODES", "NO", "YES"), + "nocurves": ("CURVES", "NO", "YES"), + "audio": ("AUDIO", "YES", "NO"), + "voice": ("VOICE", "YES", "NO"), + "haptic": ("HAPTIC", "YES", "NO"), + "pwmbl": ("PWM_BACKLIGHT", "YES", "NO"), + "turnigyfix": ("TURNIGY_TRANSMITTER_FIX", "YES", "NO"), + # "PXX": ("PXX", "YES", "NO"), + "DSM2": ("DSM2", "PPM", "NO"), + "potscroll": ("NAVIGATION", "POTS", "NO"), + "rotenc": ("NAVIGATION", "ROTENC", "NO"), + "sp22": ("SP22", "YES", "NO"), + "autosource": ("AUTOSOURCE", "YES", "NO"), + "autoswitch": ("AUTOSWITCH", "YES", "NO"), + "dblkeys": ("DBLKEYS", "YES", "NO"), + "ppmca": ("PPM_CENTER_ADJUSTABLE", "YES", "NO"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "gvars": ("GVARS", "YES", "NO"), + "symlimits": ("PPM_LIMITS_SYMETRICAL", "YES", "NO"), + "nographics": ("GRAPHICS", "NO", "YES"), + "battgraph": ("BATTGRAPH", "YES", "NO"), + "nobold": ("BOLD", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "thrtrace": ("THR_TRACE", "YES", "NO"), + "pgbar": ("EEPROM_PROGRESS_BAR", "YES", "NO"), + "imperial": ("UNITS", "IMPERIAL", "METRIC"), + "nogps": ("GPS", "NO", "YES"), + "nogauges": ("GAUGES", "NO", "YES"), + "novario": ("VARIO", "NO", "YES"), + "nowshh": ("WS_HOW_HIGH", "NO", "YES"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES") +} + +options_9x128.update(options_9x_ext) +options_9x128.update(tts_avr) + +options_gruvin9x = { + "heli": ("HELI", "YES", "NO"), + "templates": ("TEMPLATES", "YES", "NO"), + "nofp": ("FLIGHT_MODES", "NO", "YES"), + "nocurves": ("CURVES", "NO", "YES"), + "sdcard": ("SDCARD", "YES", "NO"), + "voice": ("VOICE", "YES", "NO"), + "PXX": ("PXX", "YES", "NO"), + "DSM2": ("DSM2", "SERIAL", "NO"), + "DSM2PPM": ("DSM2", "PPM", "NO"), + "potscroll": ("NAVIGATION", "POTS", "NO"), + "ppmca": ("PPM_CENTER_ADJUSTABLE", "YES", "NO"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "gvars": ("GVARS", "YES", "NO"), + "symlimits": ("PPM_LIMITS_SYMETRICAL", "YES", "NO"), + "autosource": ("AUTOSOURCE", "YES", "NO"), + "autoswitch": ("AUTOSWITCH", "YES", "NO"), + "dblkeys": ("DBLKEYS", "YES", "NO"), + "nographics": ("GRAPHICS", "NO", "YES"), + "battgraph": ("BATTGRAPH", "YES", "NO"), + "nobold": ("BOLD", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "pgbar": ("EEPROM_PROGRESS_BAR", "YES", "NO"), + "imperial": ("UNITS", "IMPERIAL", "METRIC"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES") +} + +options_gruvin9x.update(tts_avr) + +options_mega2560 = { + "heli": ("HELI", "YES", "NO"), + "templates": ("TEMPLATES", "YES", "NO"), + "nofp": ("FLIGHT_MODES", "NO", "YES"), + "nocurves": ("CURVES", "NO", "YES"), + "PWR": ("PWRMANAGE", "YES", "NO"), + "sdcard": ("SDCARD", "YES", "NO"), + "voice": ("VOICE", "YES", "NO"), + "PXX": ("PXX", "YES", "NO"), + "DSM2": ("DSM2", "SERIAL", "NO"), + "DSM2PPM": ("DSM2", "PPM", "NO"), + "ST7565R": ("LCD", "ST7565R", None), + "ERC12864FSF": ("LCD", "ERC12864FSF", None), + "ST7920": ("LCD", "ST7920", None), + "potscroll": ("NAVIGATION", "POTS", "NO"), + "ppmca": ("PPM_CENTER_ADJUSTABLE", "YES", "NO"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "gvars": ("GVARS", "YES", "NO"), + "symlimits": ("PPM_LIMITS_SYMETRICAL", "YES", "NO"), + "autosource": ("AUTOSOURCE", "YES", "NO"), + "autoswitch": ("AUTOSWITCH", "YES", "NO"), + "dblkeys": ("DBLKEYS", "YES", "NO"), + "nographics": ("GRAPHICS", "NO", "YES"), + "battgraph": ("BATTGRAPH", "YES", "NO"), + "nobold": ("BOLD", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "pgbar": ("EEPROM_PROGRESS_BAR", "YES", "NO"), + "imperial": ("UNITS", "IMPERIAL", "METRIC"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES") +} + +options_mega2560.update(tts_avr) + +options_sky9x = { + "heli": ("HELI", "YES", "NO"), + "templates": ("TEMPLATES", "YES", "NO"), + "nofp": ("FLIGHT_MODES", "NO", "YES"), + "nocurves": ("CURVES", "NO", "YES"), + "ppmca": ("PPM_CENTER_ADJUSTABLE", "YES", "NO"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "gvars": ("GVARS", "YES", "NO"), + "symlimits": ("PPM_LIMITS_SYMETRICAL", "YES", "NO"), + "potscroll": ("NAVIGATION", "POTS", "NO"), + "autosource": ("AUTOSOURCE", "YES", "NO"), + "autoswitch": ("AUTOSWITCH", "YES", "NO"), + "dblkeys": ("DBLKEYS", "YES", "NO"), + "nographics": ("GRAPHICS", "NO", "YES"), + "battgraph": ("BATTGRAPH", "YES", "NO"), + "nobold": ("BOLD", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "imperial": ("UNITS", "IMPERIAL", "METRIC"), + "bluetooth": ("BLUETOOTH", "YES", "NO"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES") +} + +options_ar9x = { + "heli": ("HELI", "YES", "NO"), + "templates": ("TEMPLATES", "YES", "NO"), + "nofp": ("FLIGHT_MODES", "NO", "YES"), + "nocurves": ("CURVES", "NO", "YES"), + "ppmca": ("PPM_CENTER_ADJUSTABLE", "YES", "NO"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "gvars": ("GVARS", "YES", "NO"), + "symlimits": ("PPM_LIMITS_SYMETRICAL", "YES", "NO"), + "potscroll": ("NAVIGATION", "POTS", "NO"), + "autosource": ("AUTOSOURCE", "YES", "NO"), + "autoswitch": ("AUTOSWITCH", "YES", "NO"), + "dblkeys": ("DBLKEYS", "YES", "NO"), + "nographics": ("GRAPHICS", "NO", "YES"), + "battgraph": ("BATTGRAPH", "YES", "NO"), + "nobold": ("BOLD", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "imperial": ("UNITS", "IMPERIAL", "METRIC"), + "bluetooth": ("BLUETOOTH", "YES", "NO"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + # "rtc": ("RTCLOCK", "YES", "NO"), + # "volume": ("HARDWARE_VOLUME", "YES", "NO") # Renove HARDWARE_VOLUME=NO in the commandline below when activating! +} + +options_taranis = { + "noheli": ("HELI", "NO", "YES"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), + "haptic": ("HAPTIC", "YES", "NO"), + "nogvars": ("GVARS", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "massstorage": ("USB", "MASSSTORAGE", None), + "cli": ("USB", "SERIAL", None), + "mixersmon": ("MIXERS_MONITOR", "YES", "NO"), + "internalppm": ("TARANIS_INTERNAL_PPM", "YES", "NO"), + "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), + "timer3": ("TIMERS", "3", "2"), + "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO") +} + +options_taranisplus = { + "noheli": ("HELI", "NO", "YES"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), + "SWR": ("SWR", "YES", "NO"), + "nogvars": ("GVARS", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "massstorage": ("USB", "MASSSTORAGE", None), + "cli": ("USB", "SERIAL", None), + "mixersmon": ("MIXERS_MONITOR", "YES", "NO"), + "internalppm": ("TARANIS_INTERNAL_PPM", "YES", "NO"), + "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), + "timer3": ("TIMERS", "3", None), + "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO") +} + +options_taranisx9e = { + "noheli": ("HELI", "NO", "YES"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), + "SWR": ("SWR", "YES", "NO"), + "nogvars": ("GVARS", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "massstorage": ("USB", "MASSSTORAGE", None), + "cli": ("USB", "SERIAL", None), + "mixersmon": ("MIXERS_MONITOR", "YES", "NO"), + "internalppm": ("TARANIS_INTERNAL_PPM", "YES", "NO"), + "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), + "timer3": ("TIMERS", "3", None), + "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), + "horussticks": ("STICKS", "HORUS", "STANDARD") +} + +options_horus = { + "noheli": ("HELI", "NO", "YES"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), + "nogvars": ("GVARS", "NO", "YES"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "massstorage": ("USB", "MASSSTORAGE", None), + "cli": ("USB", "SERIAL", None), + "timer3": ("TIMERS", "3", "2"), + "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO") +} diff --git a/radio/util/generate_datacopy.py b/radio/util/generate_datacopy.py old mode 100644 new mode 100755 index f4c6e7068..493ece838 --- a/radio/util/generate_datacopy.py +++ b/radio/util/generate_datacopy.py @@ -7,34 +7,82 @@ import clang.cindex import time import os -structs = [] +if sys.platform == "darwin": + clang.cindex.Config.set_library_file('/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libclang.dylib') + + +structs = [] +extrastructs = [] + +def build_struct(cursor, anonymousUnion=False): + if not anonymousUnion: + structs.append(cursor.spelling) + print("template \nvoid copy%s(A * dest, B * src)\n{" % cursor.spelling) -def build_struct(cursor): - structs.append(cursor.spelling) - print("template \nvoid copy%s(A * dest, B * src)\n{" % cursor.spelling) for c in cursor.get_children(): - if c.kind == clang.cindex.CursorKind.FIELD_DECL: - if c.type.get_array_size() > 0: - if c.type.get_array_element_type().spelling in structs: - print(" for (int i=0; i<%d; i++) {" % c.type.get_array_size()) - print(" copy%s(&dest->%s[i], &src->%s[i]);" % (c.type.get_array_element_type().spelling, c.spelling, c.spelling)) - print(" }") + if c.kind == clang.cindex.CursorKind.UNION_DECL: + if c.spelling: + raise "Cannot handle non anonymous unions" + + copiedUnionMember = False + for uc in c.get_children(): + if not uc.spelling or uc.kind == clang.cindex.CursorKind.PACKED_ATTR: + # Ignore + pass else: - print(" memcpy(dest->%s, src->%s, sizeof(dest->%s));" % (c.spelling, c.spelling, c.spelling)) - elif c.type.get_declaration().spelling in structs: - print(" copy%s(&dest->%s, &src->%s);" % (c.type.get_declaration().spelling, c.spelling, c.spelling)) - else: - print(" dest->%s = src->%s;" % (c.spelling, c.spelling)) - print("}\n") + # per default we copy only the first member of a union and warn if there are more + # members (declare the other members NOBACKUP) + if copiedUnionMember: + print ("Warning more than one union member (%s) in anynomous union inside struct %s, consider NOBACKUP statements" % (uc.spelling, cursor.spelling), file=sys.stderr) + else: + copy_decl(uc, uc.spelling) + copiedUnionMember = True + + elif c.kind == clang.cindex.CursorKind.FIELD_DECL: + copy_decl(c, c.spelling) + + + if not anonymousUnion: + print("}\n") def build(cursor): result = [] for c in cursor.get_children(): if c.kind == clang.cindex.CursorKind.STRUCT_DECL: build_struct(c) + for c, spelling in extrastructs: + print("template \nvoid copy%s(A * dest, B * src)\n{" % spelling) + build_struct(c, True) + print ("}\n") + return result +def copy_decl(c, spelling): + childs = [ch for ch in c.get_children()] + if c.type.get_array_size() > 0: + if c.type.get_array_element_type().spelling in structs: + print(" for (int i=0; i<%d; i++) {" % c.type.get_array_size()) + print(" copy%s(&dest->%s[i], &src->%s[i]);" % (c.type.get_array_element_type().spelling, spelling, spelling)) + print(" }") + else: + print(" memcpy(dest->%s, src->%s, sizeof(dest->%s));" % (spelling, spelling, spelling)) + elif c.type.kind == clang.cindex.TypeKind.UNEXPOSED and len(childs)==1 and childs[0].kind == clang.cindex.CursorKind.STRUCT_DECL: + # inline declared structs + if c.semantic_parent.spelling: + spellingFunc = c.semantic_parent.spelling + "_" + spelling + else: + spellingFunc = c.semantic_parent.semantic_parent.spelling + "_" + spelling + + extrastructs.append((childs[0], spellingFunc)) + print(" copy%s(&dest->%s, &src->%s);" % (spellingFunc, spelling, spelling)) + + elif c.type.get_declaration().spelling in structs: + print(" copy%s(&dest->%s, &src->%s);" % (c.type.get_declaration().spelling, spelling, spelling)) + else: + print(" dest->%s = src->%s;" % (spelling, spelling)) + + def header(): print("//This file was auto-generated by %s script on %s. Do not edit this file!\n\n\n" % (os.path.basename(sys.argv[0]), time.asctime())) diff --git a/radio/util/tts_cz.py b/radio/util/tts_cz.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_de.py b/radio/util/tts_de.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_en.py b/radio/util/tts_en.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_es.py b/radio/util/tts_es.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_fr.py b/radio/util/tts_fr.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_it.py b/radio/util/tts_it.py old mode 100644 new mode 100755 diff --git a/radio/util/tts_pt.py b/radio/util/tts_pt.py old mode 100644 new mode 100755