From 2388b90a9033ed54020ed5d7cb3a34fdc37a6532 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 15 Aug 2018 15:08:49 +0200 Subject: [PATCH 001/446] XLITE-S support --- radio/src/CMakeLists.txt | 8 +-- radio/src/dataconstants.h | 49 ++++++-------- radio/src/datastructs.h | 8 ++- radio/src/gui/128x64/radio_setup.cpp | 15 ++++- radio/src/lua/interface.cpp | 8 +-- radio/src/main_arm.cpp | 78 +++++++++++++++++++++++ radio/src/opentx.cpp | 4 +- radio/src/opentx.h | 15 +++++ radio/src/strhelpers.cpp | 2 +- radio/src/targets/horus/board.h | 1 + radio/src/targets/taranis/CMakeLists.txt | 26 ++++++-- radio/src/targets/taranis/board.cpp | 57 +++++++++++++++++ radio/src/targets/taranis/board.h | 35 ++++++++-- radio/src/targets/taranis/hal.h | 67 +++++++++++++++++-- radio/src/targets/taranis/keys_driver.cpp | 6 +- radio/src/translations.cpp | 2 + radio/src/translations.h | 5 +- radio/src/translations/cz.h.txt | 4 ++ radio/src/translations/de.h.txt | 4 ++ radio/src/translations/en.h.txt | 7 ++ radio/src/translations/es.h.txt | 4 ++ radio/src/translations/fi.h.txt | 4 ++ radio/src/translations/fr.h.txt | 4 ++ radio/src/translations/it.h.txt | 4 ++ radio/src/translations/nl.h.txt | 4 ++ radio/src/translations/pl.h.txt | 4 ++ radio/src/translations/pt.h.txt | 4 ++ radio/src/translations/se.h.txt | 4 ++ 28 files changed, 376 insertions(+), 57 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 713655f44..15fac6e5f 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -1,7 +1,7 @@ include(CMakeForceCompiler) include(Bitmaps) -set(PCB_TYPES X7 XLITE X9D X9D+ X9E X10 X12S SKY9X 9XRPRO AR9X) +set(PCB_TYPES X7 XLITE XLITES X9D X9D+ X9E X10 X12S SKY9X 9XRPRO AR9X) set(GUI_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL) set(TTS_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL RU) @@ -82,7 +82,7 @@ set(FATFS_SRC if(PCB STREQUAL X12S OR PCB STREQUAL X10) include(targets/horus/CMakeLists.txt) -elseif(PCB STREQUAL X9E OR PCB STREQUAL X9D+ OR PCB STREQUAL X9D OR PCB STREQUAL X7 OR PCB STREQUAL XLITE) +elseif(PCB STREQUAL X9E OR PCB STREQUAL X9D+ OR PCB STREQUAL X9D OR PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) include(targets/taranis/CMakeLists.txt) elseif(PCB STREQUAL SKY9X OR PCB STREQUAL 9XRPRO OR PCB STREQUAL AR9X) include(targets/sky9x/CMakeLists.txt) @@ -133,7 +133,7 @@ else() add_definitions(-DEEPROM -DEEPROM_RAW) endif() -if(ARCH STREQUAL ARM AND NOT PCB STREQUAL X12S AND NOT PCB STREQUAL X10 AND NOT PCB STREQUAL XLITE) +if(ARCH STREQUAL ARM AND NOT PCB STREQUAL X12S AND NOT PCB STREQUAL X10 AND NOT PCB STREQUAL XLITE AND NOT PCB STREQUAL XLITES) add_definitions(-DEEPROM_CONVERSIONS) set(SRC ${SRC} storage/eeprom_conversions.cpp) endif() @@ -458,7 +458,7 @@ if(NOT MSVC) set(SRC ${SRC} bin_allocator.cpp) endif() - if(PCB STREQUAL XLITE OR PCB STREQUAL X9D OR PCB STREQUAL X9D+ OR PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X10 OR PCB STREQUAL X12S) + if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9D OR PCB STREQUAL X9D+ OR PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X10 OR PCB STREQUAL X12S) add_subdirectory(targets/common/arm/stm32/bootloader) include_directories(${CMAKE_CURRENT_BINARY_DIR}/targets/common/arm/stm32/bootloader) set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} bootloader) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index a82ecb289..8b168b7ff 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -358,7 +358,7 @@ enum SwitchSources { SWSRC_FIRST_SWITCH, -#if defined(PCBTARANIS) || defined(PCBHORUS) +#if defined(PCBHORUS) || defined(PCBTARANIS) SWSRC_SA0 = SWSRC_FIRST_SWITCH, SWSRC_SA1, SWSRC_SA2, @@ -371,22 +371,22 @@ enum SwitchSources { SWSRC_SD0, SWSRC_SD1, SWSRC_SD2, -#if !defined(PCBX7) && !defined(PCBXLITE) +#if defined(PCBHORUS) || defined(PCBX9) || defined(PCBXLITES) SWSRC_SE0, SWSRC_SE1, SWSRC_SE2, #endif -#if !defined(PCBXLITE) +#if defined(PCBHORUS) || defined(PCBX9) || defined(PCBX7) || defined(PCBXLITES) SWSRC_SF0, SWSRC_SF1, SWSRC_SF2, #endif -#if !defined(PCBX7) && !defined(PCBXLITE) +#if defined(PCBHORUS) || defined(PCBX9) SWSRC_SG0, SWSRC_SG1, SWSRC_SG2, #endif -#if !defined(PCBXLITE) +#if defined(PCBHORUS) || defined(PCBX9) || defined(PCBX7) SWSRC_SH0, SWSRC_SH1, SWSRC_SH2, @@ -423,15 +423,11 @@ enum SwitchSources { SWSRC_SR1, SWSRC_SR2, #endif -#if defined(PCBX9E) + SWSRC_LAST_SWITCH = SWSRC_FIRST_SWITCH + NUM_SWITCHES_POSITIONS - 1, +#if NUM_SWITCHES >= 8 SWSRC_TRAINER = SWSRC_SH2, - SWSRC_LAST_SWITCH = SWSRC_SR2, -#elif defined(PCBXLITE) - SWSRC_TRAINER = SWSRC_SD2, - SWSRC_LAST_SWITCH = SWSRC_SD2, #else - SWSRC_TRAINER = SWSRC_SH2, - SWSRC_LAST_SWITCH = SWSRC_SH2, + SWSRC_TRAINER = SWSRC_LAST_SWITCH, #endif #else // neither Taranis nor Horus SWSRC_ID0 = SWSRC_FIRST_SWITCH, @@ -607,25 +603,23 @@ enum MixSources { MIXSRC_FIRST_SWITCH, -#if defined(PCBXLITE) +#if defined(PCBHORUS) || defined(PCBTARANIS) MIXSRC_SA = MIXSRC_FIRST_SWITCH, LUA_EXPORT("sa", "Switch A") MIXSRC_SB, LUA_EXPORT("sb", "Switch B") MIXSRC_SC, LUA_EXPORT("sc", "Switch C") MIXSRC_SD, LUA_EXPORT("sd", "Switch D") - MIXSRC_LAST_SWITCH = MIXSRC_SD, -#elif defined(PCBTARANIS) || defined(PCBHORUS) - MIXSRC_SA = MIXSRC_FIRST_SWITCH, LUA_EXPORT("sa", "Switch A") - MIXSRC_SB, LUA_EXPORT("sb", "Switch B") - MIXSRC_SC, LUA_EXPORT("sc", "Switch C") - MIXSRC_SD, LUA_EXPORT("sd", "Switch D") -#if !defined(PCBX7) +#if defined(PCBHORUS) || defined(PCBX9) || defined(PCBXLITES) MIXSRC_SE, LUA_EXPORT("se", "Switch E") #endif +#if defined(PCBHORUS) || defined(PCBX9) || defined(PCBX7) || defined(PCBXLITES) MIXSRC_SF, LUA_EXPORT("sf", "Switch F") -#if !defined(PCBX7) +#endif +#if defined(PCBHORUS) || defined(PCBX9) MIXSRC_SG, LUA_EXPORT("sg", "Switch G") #endif +#if defined(PCBHORUS) || defined(PCBX9) || defined(PCBX7) MIXSRC_SH, LUA_EXPORT("sh", "Switch H") +#endif #if defined(PCBX9E) MIXSRC_SI, LUA_EXPORT("si", "Switch I") MIXSRC_SJ, LUA_EXPORT("sj", "Switch J") @@ -637,9 +631,6 @@ enum MixSources { MIXSRC_SP, LUA_EXPORT("sp", "Switch P") MIXSRC_SQ, LUA_EXPORT("sq", "Switch Q") MIXSRC_SR, LUA_EXPORT("sr", "Switch R") - MIXSRC_LAST_SWITCH = MIXSRC_SR, -#else - MIXSRC_LAST_SWITCH = MIXSRC_SH, #endif #else MIXSRC_3POS = MIXSRC_FIRST_SWITCH, @@ -649,7 +640,6 @@ enum MixSources { MIXSRC_AIL, MIXSRC_GEA, MIXSRC_TRN, - MIXSRC_LAST_SWITCH = MIXSRC_TRN, #endif MIXSRC_FIRST_LOGICAL_SWITCH, MIXSRC_SW1 = MIXSRC_FIRST_LOGICAL_SWITCH, LUA_EXPORT_MULTIPLE("ls", "Logical switch L%d", MAX_LOGICAL_SWITCHES) @@ -703,10 +693,11 @@ enum MixSources { MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+3*MAX_TELEMETRY_SENSORS-1 }; -#define MIXSRC_FIRST (MIXSRC_NONE+1) -#define MIXSRC_LAST MIXSRC_LAST_CH -#define INPUTSRC_FIRST MIXSRC_Rud -#define INPUTSRC_LAST MIXSRC_LAST_TELEM +#define MIXSRC_FIRST (MIXSRC_NONE + 1) +#define MIXSRC_LAST MIXSRC_LAST_CH +#define MIXSRC_LAST_SWITCH (MIXSRC_FIRST_SWITCH + NUM_SWITCHES - 1) +#define INPUTSRC_FIRST MIXSRC_Rud +#define INPUTSRC_LAST MIXSRC_LAST_TELEM enum BacklightMode { e_backlight_mode_off = 0, diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 44eb39f6a..dbab633c1 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -626,7 +626,8 @@ PACK(struct TrainerData { NOBACKUP(uint8_t jitterFilter:1); /* 0 - active */\ NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); \ NOBACKUP(uint8_t USBMode:2); \ - NOBACKUP(uint8_t spareExtraArm:3); \ + NOBACKUP(uint8_t jackMode:2); \ + NOBACKUP(uint8_t spareExtraArm:1); \ NOBACKUP(char ttsLanguage[2]); \ NOBACKUP(int8_t beepVolume:4); \ NOBACKUP(int8_t wavVolume:4); \ @@ -869,7 +870,10 @@ static inline void check_struct() CHKSIZE(RssiAlarmData, 2); CHKSIZE(TrainerData, 16); -#if defined(PCBXLITE) +#if defined(PCBXLITES) + CHKSIZE(RadioData, 850); + CHKSIZE(ModelData, 6025); +#elif defined(PCBXLITE) CHKSIZE(RadioData, 844); CHKSIZE(ModelData, 6025); #elif defined(PCBX7) diff --git a/radio/src/gui/128x64/radio_setup.cpp b/radio/src/gui/128x64/radio_setup.cpp index ca8199462..6b7a44987 100644 --- a/radio/src/gui/128x64/radio_setup.cpp +++ b/radio/src/gui/128x64/radio_setup.cpp @@ -97,6 +97,7 @@ enum MenuRadioSetupItems { IF_FAI_CHOICE(ITEM_SETUP_FAI) ITEM_SETUP_SWITCHES_DELAY, CASE_STM32(ITEM_SETUP_USB_MODE) + CASE_JACK_DETECT(ITEM_SETUP_JACK_MODE) ITEM_SETUP_RX_CHANNEL_ORD, ITEM_SETUP_STICK_MODE_LABELS, ITEM_SETUP_STICK_MODE, @@ -131,7 +132,11 @@ void menuRadioSetup(event_t event) } #endif - MENU(STR_MENURADIOSETUP, menuTabGeneral, MENU_RADIO_SETUP, HEADER_LINE+ITEM_SETUP_MAX, { HEADER_LINE_COLUMNS CASE_RTCLOCK(2) CASE_RTCLOCK(2) CASE_BATTGRAPH(1) LABEL(SOUND), CASE_AUDIO(0) CASE_BUZZER(0) 0, 0, 0, 0, 0, CASE_AUDIO(0) CASE_VARIO(LABEL(VARIO)) CASE_VARIO(0) CASE_VARIO(0) CASE_VARIO(0) CASE_VARIO(0) CASE_HAPTIC(LABEL(HAPTIC)) CASE_HAPTIC(0) CASE_HAPTIC(0) CASE_HAPTIC(0) 0, LABEL(ALARMS), 0, CASE_CAPACITY(0) CASE_PCBSKY9X(0) 0, 0, 0, 0, IF_ROTARY_ENCODERS(0) LABEL(BACKLIGHT), 0, 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, CASE_SPLASH_PARAM(0) CASE_GPS(0) 0, CASE_GPS(0) CASE_PXX(0) 0, 0, IF_FAI_CHOICE(0) 0, CASE_STM32(0) 0, COL_TX_MODE, 0, 1/*to force edit mode*/}); + MENU(STR_MENURADIOSETUP, menuTabGeneral, MENU_RADIO_SETUP, HEADER_LINE+ITEM_SETUP_MAX, { HEADER_LINE_COLUMNS CASE_RTCLOCK(2) CASE_RTCLOCK(2) CASE_BATTGRAPH(1) + LABEL(SOUND), CASE_AUDIO(0) CASE_BUZZER(0) 0, 0, 0, 0, 0, CASE_AUDIO(0) CASE_VARIO(LABEL(VARIO)) CASE_VARIO(0) CASE_VARIO(0) CASE_VARIO(0) CASE_VARIO(0) CASE_HAPTIC(LABEL(HAPTIC)) CASE_HAPTIC(0) CASE_HAPTIC(0) CASE_HAPTIC(0) 0, LABEL(ALARMS), 0, CASE_CAPACITY(0) CASE_PCBSKY9X(0) 0, 0, 0, 0, IF_ROTARY_ENCODERS(0) LABEL(BACKLIGHT), 0, 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, CASE_SPLASH_PARAM(0) CASE_GPS(0) 0, CASE_GPS(0) CASE_PXX(0) 0, 0, IF_FAI_CHOICE(0) 0, + CASE_STM32(0) // USB mode + CASE_JACK_DETECT(0) // Jack mode + 0, COL_TX_MODE, 0, 1/*to force edit mode*/}); if (event == EVT_ENTRY) { reusableBuffer.generalSettings.stickMode = g_eeGeneral.stickMode; @@ -524,11 +529,19 @@ void menuRadioSetup(event_t event) lcdDrawText(lcdLastRightPos, y, STR_MS, attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.switchesDelay, -15, 100-15); break; + #if defined(STM32) case ITEM_SETUP_USB_MODE: g_eeGeneral.USBMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_USBMODE, STR_USBMODES, g_eeGeneral.USBMode, USB_UNSELECTED_MODE, USB_MAX_MODE, attr, event); break; #endif + +#if defined(JACK_DETECT_GPIO) + case ITEM_SETUP_JACK_MODE: + g_eeGeneral.jackMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_JACKMODE, STR_JACKMODES, g_eeGeneral.jackMode, JACK_UNSELECTED_MODE, JACK_MAX_MODE, attr, event); + break; +#endif + case ITEM_SETUP_RX_CHANNEL_ORD: lcdDrawTextAlignedLeft(y, STR_RXCHANNELORD); // RAET->AETR for (uint8_t i=1; i<=4; i++) { diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index 235e83afa..83f5d3f3a 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -671,10 +671,10 @@ bool luaLoadTelemetryScript(uint8_t index) ScriptInternalData & sid = scriptInternalData[luaScriptsCount++]; sid.reference = SCRIPT_TELEMETRY_FIRST+index; sid.state = SCRIPT_NOFILE; - char filename[sizeof(SCRIPTS_TELEM_PATH)+sizeof(script.file)+sizeof(SCRIPT_EXT)] = SCRIPTS_TELEM_PATH "/"; - strncpy(filename+sizeof(SCRIPTS_TELEM_PATH), script.file, sizeof(script.file)); - filename[sizeof(SCRIPTS_TELEM_PATH)+sizeof(script.file)] = '\0'; - strcat(filename+sizeof(SCRIPTS_TELEM_PATH), SCRIPT_EXT); + char filename[sizeof(SCRIPTS_TELEM_PATH) + LEN_SCRIPT_FILENAME + sizeof(SCRIPT_EXT)] = SCRIPTS_TELEM_PATH "/"; + strncpy(filename + sizeof(SCRIPTS_TELEM_PATH), script.file, LEN_SCRIPT_FILENAME); + filename[sizeof(SCRIPTS_TELEM_PATH) + LEN_SCRIPT_FILENAME] = '\0'; + strcat(filename + sizeof(SCRIPTS_TELEM_PATH), SCRIPT_EXT); if (luaLoad(lsScripts, filename, sid) == SCRIPT_PANIC) { return false; } diff --git a/radio/src/main_arm.cpp b/radio/src/main_arm.cpp index 5b601ff5a..f68226fcc 100644 --- a/radio/src/main_arm.cpp +++ b/radio/src/main_arm.cpp @@ -74,6 +74,83 @@ void handleUsbConnection() #endif // defined(STM32) && !defined(SIMU) } +#if defined(JACK_DETECT_GPIO) +bool isJackPlugged() +{ + // debounce + static bool debounced_state = 0; + static bool last_state = 0; + + if (GPIO_ReadInputDataBit(JACK_DETECT_GPIO, JACK_DETECT_GPIO_PIN)) { + if (!last_state) { + debounced_state = false; + } + last_state = false; + } + else { + if (last_state) { + debounced_state = true; + } + last_state = true; + } + return debounced_state; +} +#endif + +enum JackState +{ + SPEAKER_ACTIVE, + HEADPHONE_ACTIVE, + TRAINER_ACTIVE, +}; + +uint8_t jackState = SPEAKER_ACTIVE; + +const char STR_JACK_HEADPHONE[] = "Headphone"; +const char STR_JACK_TRAINER[] = "Trainer"; + +void onJackConnectMenu(const char * result) +{ + if (result == STR_JACK_HEADPHONE) { + jackState = HEADPHONE_ACTIVE; + disableSpeaker(); + enableHeadphone(); + } + else if (result == STR_JACK_TRAINER) { + jackState = TRAINER_ACTIVE; + enableTrainer(); + } +} + +void handleJackConnection() +{ +#if defined(JACK_DETECT_GPIO) + if (jackState == SPEAKER_ACTIVE && isJackPlugged()) { + if (g_eeGeneral.jackMode == JACK_HEADPHONE_MODE) { + jackState = HEADPHONE_ACTIVE; + disableSpeaker(); + enableHeadphone(); + } + else if (g_eeGeneral.jackMode == JACK_TRAINER_MODE) { + jackState = TRAINER_ACTIVE; + enableTrainer(); + } + else if (popupMenuNoItems == 0) { + POPUP_MENU_ADD_ITEM(STR_JACK_HEADPHONE); + POPUP_MENU_ADD_ITEM(STR_JACK_TRAINER); + POPUP_MENU_START(onJackConnectMenu); + } + } + else if (jackState == SPEAKER_ACTIVE && !isJackPlugged() && popupMenuNoItems > 0 && popupMenuHandler == onJackConnectMenu) { + popupMenuNoItems = 0; + } + else if (jackState != SPEAKER_ACTIVE && !isJackPlugged()) { + jackState = SPEAKER_ACTIVE; + enableSpeaker(); + } +#endif +} + void checkSpeakerVolume() { if (currentSpeakerVolume != requiredSpeakerVolume) { @@ -409,6 +486,7 @@ void perMain() checkEeprom(); logsWrite(); handleUsbConnection(); + handleJackConnection(); checkTrainerSettings(); periodicTick(); DEBUG_TIMER_STOP(debugTimerPerMain1); diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index e45eb194c..fb3a0f269 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -248,7 +248,9 @@ void generalDefault() g_eeGeneral.slidersConfig = 0x03; // LS and RS = sliders with detent #endif -#if defined(PCBXLITE) +#if defined(PCBXLITES) + g_eeGeneral.switchConfig = (SWITCH_TOGGLE << 10) + (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); // 2x3POS, 2x2POS +#elif defined(PCBXLITE) g_eeGeneral.switchConfig = (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); // 2x3POS, 2x2POS #elif defined(PCBX7) g_eeGeneral.switchConfig = 0x000006ff; // 4x3POS, 1x2POS, 1xTOGGLE diff --git a/radio/src/opentx.h b/radio/src/opentx.h index daf616120..61d252886 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -211,6 +211,12 @@ #include "board.h" +#if defined(JACK_DETECT_GPIO) +#define CASE_JACK_DETECT(x) x, +#else +#define CASE_JACK_DETECT(x) +#endif + #if defined(DISK_CACHE) #include "disk_cache.h" #endif @@ -1290,4 +1296,13 @@ extern JitterMeter avgJitter[NUM_ANALOGS]; #include "bluetooth.h" #endif +#if defined(JACK_DETECT_GPIO) +enum JackMode { + JACK_UNSELECTED_MODE, + JACK_HEADPHONE_MODE, + JACK_TRAINER_MODE, + JACK_MAX_MODE = JACK_TRAINER_MODE +}; +#endif + #endif // _OPENTX_H_ diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp index c3cd63c3b..99a61996a 100644 --- a/radio/src/strhelpers.cpp +++ b/radio/src/strhelpers.cpp @@ -266,7 +266,7 @@ char * getSwitchString(char * dest, swsrc_t idx) else *s++ = 'A'+swinfo.quot; #else - *s++ = 'A'+swinfo.quot; + *s++ = 'A' + swinfo.quot; #endif } *s++ = "\300-\301"[swinfo.rem]; diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index d14f2f706..09639e812 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -280,6 +280,7 @@ enum EnumSwitchesPositions SW_SH0, SW_SH1, SW_SH2, + NUM_SWITCHES_POSITIONS }; void keysInit(void); uint8_t keyState(uint8_t index); diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 78b09bfb5..8d71b30c3 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -98,9 +98,27 @@ elseif(PCB STREQUAL XLITE) set(FONTS_TARGET 9x_fonts_1bit) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) +elseif(PCB STREQUAL XLITES) + set(PXX_FREQUENCY "HIGH" CACHE STRING "PXX frequency (LOW / HIGH)") + set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") + set(CPU_TYPE STM32F2) + set(CPU_TYPE_FULL STM32F205xE) # for size report + set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(HAPTIC YES) + set(LUA_EXPORT lua_export_xlite) + set(FLAVOUR xlites) + add_definitions(-DPCBXLITES -DPCBXLITE -DSOFTWARE_VOLUME) + add_definitions(-DEEPROM_VARIANT=0x2000) + add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) + set(GUI_DIR 128x64) + set(NAVIGATION_TYPE xlite) + set(BITMAPS_TARGET 9x_bitmaps) + set(FONTS_TARGET 9x_fonts_1bit) + set(LCD_DRIVER lcd_driver_spi.cpp) + set(GVAR_SCREEN model_gvars.cpp) endif() -if(PCB STREQUAL XLITE) +if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES) if(PXX_FREQUENCY STREQUAL HIGH) add_definitions(-DPXX_FREQUENCY_HIGH) endif() @@ -124,7 +142,7 @@ else() ) endif() -if(PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL XLITE) +if(PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) add_definitions(-DBLUETOOTH) set(TARGET_SRC ${TARGET_SRC} @@ -163,7 +181,7 @@ set(GUI_SRC ${GUI_SRC} ../screenshot.cpp ) -if(PCB STREQUAL X7 OR PCB STREQUAL XLITE) +if(PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) set(LED_DRIVER led_driver.cpp) endif() @@ -177,7 +195,7 @@ set(TARGET_SRC ../common/arm/stm32/adc_driver.cpp ) -if(PCB STREQUAL XLITE) +if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES) set(TARGET_SRC ${TARGET_SRC} ../common/arm/stm32/sticks_pwm_driver.cpp diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 5c092ee03..b5f57f607 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -272,6 +272,15 @@ void boardInit() if (HAS_SPORT_UPDATE_CONNECTOR()) { sportUpdateInit(); } + +#if defined(AUDIO_JACK_DETECT_GPIO) + initJackDetect(void); +#endif + + initSpeakerEnable(); + enableSpeaker(); + + initHeadphoneTrainerSwitch(); #endif // !defined(SIMU) } @@ -357,3 +366,51 @@ uint16_t getBatteryVoltage() instant_vbat += 20; // add 0.2V because of the diode TODO check if this is needed, but removal will beak existing calibrations!!! return (uint16_t)instant_vbat; } + +#if defined(AUDIO_SPEAKER_ENABLE_GPIO) +void initSpeakerEnable() +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.GPIO_Pin = AUDIO_SPEAKER_ENABLE_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(AUDIO_SPEAKER_ENABLE_GPIO, &GPIO_InitStructure); +} + +void enableSpeaker() +{ + GPIO_SetBits(AUDIO_SPEAKER_ENABLE_GPIO, AUDIO_SPEAKER_ENABLE_GPIO_PIN); +} + +void disableSpeaker() +{ + GPIO_ResetBits(AUDIO_SPEAKER_ENABLE_GPIO, AUDIO_SPEAKER_ENABLE_GPIO_PIN); +} +#endif + +#if defined(HEADPHONE_TRAINER_SWITCH_GPIO) +void initHeadphoneTrainerSwitch() +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.GPIO_Pin = HEADPHONE_TRAINER_SWITCH_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(HEADPHONE_TRAINER_SWITCH_GPIO, &GPIO_InitStructure); +} + +void enableHeadphone() +{ + GPIO_ResetBits(HEADPHONE_TRAINER_SWITCH_GPIO, HEADPHONE_TRAINER_SWITCH_GPIO_PIN); +} + +void enableTrainer() +{ + GPIO_SetBits(HEADPHONE_TRAINER_SWITCH_GPIO, HEADPHONE_TRAINER_SWITCH_GPIO_PIN); +} +#endif diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index be890a8ad..9c9e70572 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -313,22 +313,22 @@ enum EnumSwitchesPositions SW_SD0, SW_SD1, SW_SD2, -#if !defined(PCBX7) && !defined(PCBXLITE) +#if defined(PCBX9) || defined(PCBXLITES) SW_SE0, SW_SE1, SW_SE2, #endif -#if !defined(PCBXLITE) +#if defined(PCBX9) || defined(PCBX7) || defined(PCBXLITES) SW_SF0, SW_SF1, SW_SF2, #endif -#if !defined(PCBX7) && !defined(PCBXLITE) +#if defined(PCBX9) SW_SG0, SW_SG1, SW_SG2, #endif -#if !defined(PCBXLITE) +#if defined(PCBX9) || defined(PCBX7) SW_SH0, SW_SH1, SW_SH2, @@ -365,8 +365,11 @@ enum EnumSwitchesPositions SW_SR1, SW_SR2, #endif + NUM_SWITCHES_POSITIONS }; -#if defined(PCBXLITE) +#if defined(PCBXLITES) + #define NUM_SWITCHES 6 +#elif defined(PCBXLITE) #define NUM_SWITCHES 4 #elif defined(PCBX7) #define NUM_SWITCHES 6 @@ -605,6 +608,28 @@ void setScaledVolume(uint8_t volume); void setVolume(uint8_t volume); int32_t getVolume(void); #endif +#if defined(AUDIO_SPEAKER_ENABLE_GPIO) +void initSpeakerEnable(void); +void enableSpeaker(); +void disableSpeaker(); +#else +static inline void initSpeakerEnable(void) { } +static inline void enableSpeaker(void) { } +static inline void disableSpeaker(void) { } +#endif +#if defined(HEADPHONE_TRAINER_SWITCH_GPIO) +void initHeadphoneTrainerSwitch(void); +void enableHeadphone(void); +void enableTrainer(void); +#else +static inline void initHeadphoneTrainerSwitch(void) { } +static inline void enableHeadphone(void) { } +static inline void enableTrainer(void) { } +#endif +#if defined(AUDIO_JACK_DETECT_GPIO) +void initJackDetect(void); +bool isJackPlugged(); +#endif void audioConsumeCurrentBuffer(); #define audioDisableIrq() __disable_irq() #define audioEnableIrq() __enable_irq() diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 716bae368..2aabf23f1 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -253,6 +253,9 @@ #define SWITCHES_GPIO_PIN_E_H GPIO_Pin_7 // PE.07 #define SWITCHES_GPIO_REG_E_L GPIOE->IDR #define SWITCHES_GPIO_PIN_E_L GPIO_Pin_13 // PE.13 +#elif defined(PCBXLITES) + #define SWITCHES_GPIO_REG_E GPIOE->IDR + #define SWITCHES_GPIO_PIN_E GPIO_Pin_5 // PE.05 #elif defined(PCBX7) || defined(PCBXLITE) // no SWE #else @@ -265,6 +268,9 @@ #if defined(PCBX9E) #define SWITCHES_GPIO_REG_F GPIOE->IDR #define SWITCHES_GPIO_PIN_F GPIO_Pin_11 // PE.11 +#elif defined(PCBXLITES) + #define SWITCHES_GPIO_REG_F GPIOC->IDR + #define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PC.03 #elif defined(PCBXLITE) // no SWF #elif defined(PCBX7) @@ -364,6 +370,12 @@ #define KEYS_GPIOC_PINS (TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_RHR) #define KEYS_GPIOD_PINS (KEYS_GPIO_PIN_MENU | KEYS_GPIO_PIN_EXIT | KEYS_GPIO_PIN_PAGE | SWITCHES_GPIO_PIN_H) #define KEYS_GPIOE_PINS (KEYS_GPIO_PIN_PLUS | KEYS_GPIO_PIN_ENTER | KEYS_GPIO_PIN_MINUS | TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_LHL | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | SWITCHES_GPIO_PIN_F | SWITCHES_GPIO_PIN_A_L | SWITCHES_GPIO_PIN_B_H | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_D_H | SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L) +#elif defined(PCBXLITES) + #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE) + #define KEYS_GPIOA_PINS (GPIO_Pin_5 | GPIO_Pin_6) + #define KEYS_GPIOB_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5) + #define KEYS_GPIOC_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5) + #define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14) #elif defined(PCBXLITE) #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE) #define KEYS_GPIOA_PINS (GPIO_Pin_5 | GPIO_Pin_6) @@ -576,11 +588,17 @@ // Internal Module #if defined(PCBXLITE) - #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM3 #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 - #define INTMODULE_PWR_GPIO GPIOD - #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_9 // PD.09 + #if defined(PCBXLITES) + #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) + #define INTMODULE_PWR_GPIO GPIOA + #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_15 // PA.15 + #else + #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) + #define INTMODULE_PWR_GPIO GPIOD + #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_9 // PD.09 + #endif #define INTMODULE_TX_GPIO GPIOB #define INTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PB.06 #define INTMODULE_RX_GPIO GPIOB @@ -857,6 +875,19 @@ #define BACKLIGHT_GPIO_PinSource_2 GPIO_PinSource13 #define BACKLIGHT_GPIO_AF_1 GPIO_AF_TIM4 #define BACKLIGHT_GPIO_AF_2 GPIO_AF_TIM4 +#elif defined(PCBXLITES) + #define BACKLIGHT_RCC_AHB1Periph RCC_AHB1Periph_GPIOA + #define BACKLIGHT_RCC_APB1Periph 0 + #define BACKLIGHT_RCC_APB2Periph RCC_APB2Periph_TIM1 + #define BACKLIGHT_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) + #define BACKLIGHT_TIMER TIM1 + #define BACKLIGHT_GPIO GPIOA + #define BACKLIGHT_GPIO_PIN GPIO_Pin_10 // PA.10 + #define BACKLIGHT_GPIO_PinSource GPIO_PinSource10 + #define BACKLIGHT_GPIO_AF GPIO_AF_TIM1 + #define BACKLIGHT_CCMR2 TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 // Channel 3, PWM + #define BACKLIGHT_CCER TIM_CCER_CC3E + #define BACKLIGHT_COUNTER_REGISTER BACKLIGHT_TIMER->CCR3 #elif defined(PCBXLITE) #define BACKLIGHT_RCC_AHB1Periph RCC_AHB1Periph_GPIOA #define BACKLIGHT_RCC_APB1Periph 0 @@ -1005,6 +1036,23 @@ #define I2C_ADDRESS_VOLUME 0x5C #define I2C_FLASH_PAGESIZE 64 +// Second I2C Bus: IMU +#if defined(PCBXLITES) + #define I2CX_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC) + #define I2CX_RCC_APB1Periph RCC_APB1Periph_I2C3 + #define I2CX I2C3 + #define I2CX_SCL_GPIO GPIOA + #define I2CX_SCL_GPIO_PIN GPIO_Pin_8 // PA.08 + #define I2CX_SDA_GPIO GPIOC + #define I2CX_SDA_GPIO_PIN GPIO_Pin_9 // PC.09 + #define I2CX_GPIO_AF GPIO_AF_I2C3 + #define I2CX_SCL_GPIO_PinSource GPIO_PinSource8 + #define I2CX_SDA_GPIO_PinSource GPIO_PinSource9 + #define I2CX_SPEED 400000 + #define I2CX_IMU_INT_GPIO GPIOC + #define I2CX_IMU_INT_GPIO_PIN GPIO_Pin_8 // PC.08 +#endif + // SD - SPI2 #define SD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) #define SD_RCC_APB1Periph RCC_APB1Periph_SPI2 @@ -1037,7 +1085,6 @@ #endif // Audio -#define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1) #define AUDIO_RCC_APB1Periph (RCC_APB1Periph_TIM6 | RCC_APB1Periph_DAC) #define AUDIO_OUTPUT_GPIO GPIOA #define AUDIO_OUTPUT_GPIO_PIN GPIO_Pin_4 // PA.04 @@ -1049,6 +1096,18 @@ #define AUDIO_TIMER TIM6 #define AUDIO_DMA DMA1 +#if defined(PCBXLITES) + #define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) + #define JACK_DETECT_GPIO GPIOC + #define JACK_DETECT_GPIO_PIN GPIO_Pin_13 // PC.13 + #define AUDIO_SPEAKER_ENABLE_GPIO GPIOD + #define AUDIO_SPEAKER_ENABLE_GPIO_PIN GPIO_Pin_14 // PD.14 + #define HEADPHONE_TRAINER_SWITCH_GPIO GPIOD + #define HEADPHONE_TRAINER_SWITCH_GPIO_PIN GPIO_Pin_13 // PD.13 +#else + #define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1) +#endif + // Haptic #if defined(PCBXLITE) #define HAPTIC_PWM diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index 95c93c658..69a5dcd23 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -204,7 +204,11 @@ uint32_t switchState(uint8_t index) ADD_3POS_CASE(B, 1); ADD_3POS_CASE(C, 2); ADD_3POS_CASE(D, 3); -#if defined(PCBXLITE) +#if defined(PCBXLITES) + ADD_2POS_CASE(E); + ADD_2POS_CASE(F); + // no SWF, SWG and SWH on XLITE +#elif defined(PCBXLITE) // no SWF, SWG and SWH on XLITE #elif defined(PCBX7) ADD_2POS_CASE(F); diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 6684816da..0f9bce91b 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -88,6 +88,7 @@ const char STR_OPEN9X[] = ISTR(VVARIOCENTER) ISTR(COUNTRYCODES) ISTR(USBMODES) + ISTR(JACKMODES) ISTR(VFAILSAFE) ISTR(VTRAINERMODES) ISTR(TARANIS_PROTOCOLS) @@ -359,6 +360,7 @@ const char STR_MODULE_TELEMETRY[] = TR_MODULE_TELEMETRY; const char STR_MODULE_TELEM_ON[] = TR_MODULE_TELEM_ON; const char STR_COUNTRYCODE[] = TR_COUNTRYCODE; const char STR_USBMODE[] = TR_USBMODE; +const char STR_JACKMODE[] = TR_JACKMODE; const char STR_FAILSAFE[] = TR_FAILSAFE; const char STR_FAILSAFESET[] = TR_FAILSAFESET; const char STR_HOLD[] = TR_HOLD; diff --git a/radio/src/translations.h b/radio/src/translations.h index 2ec3981dd..7169b4d8f 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -185,7 +185,8 @@ extern const char STR_OPEN9X[]; #define OFS_VVARIOCENTER (OFS_VBEEPCOUNTDOWN + sizeof(TR_VBEEPCOUNTDOWN)) #define OFS_COUNTRYCODES (OFS_VVARIOCENTER + sizeof(TR_VVARIOCENTER)) #define OFS_USBMODES (OFS_COUNTRYCODES + sizeof(TR_COUNTRYCODES)) - #define OFS_VFAILSAFE (OFS_USBMODES + sizeof(TR_USBMODES)) + #define OFS_JACKMODES (OFS_USBMODES + sizeof(TR_USBMODES)) + #define OFS_VFAILSAFE (OFS_JACKMODES + sizeof(TR_JACKMODES)) #define OFS_VTRAINERMODES (OFS_VFAILSAFE + sizeof(TR_VFAILSAFE)) #define OFS_TARANIS_PROTOCOLS (OFS_VTRAINERMODES + sizeof(TR_VTRAINERMODES)) #define OFS_R9M_REGION (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) @@ -290,6 +291,7 @@ extern const char STR_OPEN9X[]; #define STR_COUNTRYCODES (STR_OPEN9X + OFS_COUNTRYCODES) #define STR_USBMODES (STR_OPEN9X + OFS_USBMODES) + #define STR_JACKMODES (STR_OPEN9X + OFS_JACKMODES) #define STR_VFAILSAFE (STR_OPEN9X + OFS_VFAILSAFE) #define STR_VTRAINERMODES (STR_OPEN9X + OFS_VTRAINERMODES) @@ -579,6 +581,7 @@ extern const char STR_MENUSENSOR[]; extern const char STR_SENSOR[]; extern const char STR_COUNTRYCODE[]; extern const char STR_USBMODE[]; +extern const char STR_JACKMODE[]; extern const char STR_DISABLE_INTERNAL[]; #if defined(TELEMETRY_FRSKY) diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 20b40cd90..66f481171 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -99,6 +99,9 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ") +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" + #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "Vyp\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" @@ -927,6 +930,7 @@ #define TR_SENSOR "SENZOR" #define TR_COUNTRYCODE "Kód regionu" #define TR_USBMODE "USB Mode" +#define TR_JACKMODE "Jack Mode" #define TR_VOICELANG "Jazyk hlasu" #define TR_UNITSSYSTEM "Jednotky" #define TR_EDIT "Upravit" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 94520161b..18dd7e0fa 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -101,6 +101,9 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Fragen""Joyst\0""SDCard""Serial", "Fragen\0 ""Joystick""Speicher""Seriell\0") +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" + #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "AUS\0""PPM\0""XJT\0""DSM?""CRSF""MULT""R9M\0""SBUS" @@ -932,6 +935,7 @@ #define TR_SENSOR "SENSOR" #define TR_COUNTRYCODE "Landescode" #define TR_USBMODE "USB Modus" +#define TR_JACKMODE "Jack Mode" #define TR_VOICELANG "Sprach-Ansagen" #define TR_UNITSSYSTEM "Einheiten" #define TR_EDIT "Zeile Editieren" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 920dce585..d70bcaf01 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -101,6 +101,9 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ") +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" + #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" @@ -420,6 +423,9 @@ #elif defined(PCBX9E) #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(PCBXLITES) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" #elif defined(PCBXLITE) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0" @@ -931,6 +937,7 @@ #define TR_SENSOR "SENSOR" #define TR_COUNTRYCODE "Country code" #define TR_USBMODE "USB Mode" +#define TR_JACKMODE "Jack Mode" #define TR_VOICELANG "Voice language" #define TR_UNITSSYSTEM "Units" #define TR_EDIT "Edit" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 9526692a3..059702cdc 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -101,6 +101,9 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ") +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" + #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" @@ -938,6 +941,7 @@ #define TR_SENSOR "SENSOR" #define TR_COUNTRYCODE "Codigo Pais" #define TR_USBMODE "USB Mode" +#define TR_JACKMODE "Jack Mode" #define TR_VOICELANG "Idioma voces" #define TR_UNITSSYSTEM "Unidades" #define TR_EDIT "Editar" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 2b29e1140..127c1574d 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -101,6 +101,9 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ") +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" + #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" @@ -930,6 +933,7 @@ #define TR_SENSOR "SENSOR" #define TR_COUNTRYCODE "Country Code" #define TR_USBMODE "USB Mode" +#define TR_JACKMODE "Jack Mode" #define TR_VOICELANG "Voice Language" #define TR_UNITSSYSTEM "Units" #define TR_EDIT "Edit" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index b6b62a7e5..ccf16dcb8 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -101,6 +101,9 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Popup\0""Joyst\0""SDCard""Série\0", "Demander""Joystick""Stockage""Série\0 ") +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" + #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" @@ -942,6 +945,7 @@ #define TR_SENSOR "SENSOR" #define TR_COUNTRYCODE TR("Zone géo.", "Zone géographique") #define TR_USBMODE "USB Mode" +#define TR_JACKMODE "Jack Mode" #define TR_VOICELANG TR("Langue voix", "Langue annonces vocales") #define TR_UNITSSYSTEM "Unités" #define TR_EDIT "Editer" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 4cc640c15..d653425ea 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -101,6 +101,9 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ") +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" + #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" @@ -932,6 +935,7 @@ #define TR_SENSOR "SENSOR" #define TR_COUNTRYCODE TR("Codice Paese","Standard 2.4Ghz") #define TR_USBMODE "USB Mode" +#define TR_JACKMODE "Jack Mode" #define TR_VOICELANG "Lingua Voce" #define TR_UNITSSYSTEM "Unità" #define TR_EDIT "Modifica" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 1091d3ae1..56f70cfd3 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -103,6 +103,9 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ") +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" + #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "UIT\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" @@ -933,6 +936,7 @@ #define TR_SENSOR "SENSOR" #define TR_COUNTRYCODE "Landcode" #define TR_USBMODE "USB Mode" +#define TR_JACKMODE "Jack Mode" #define TR_VOICELANG "Taal" #define TR_UNITSSYSTEM "Eenheden" #define TR_EDIT "Wijzigen" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index f24c2846e..b38b5bae9 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -101,6 +101,9 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ") +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" + #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" @@ -933,6 +936,7 @@ #define TR_SENSOR "SENSOR" #define TR_COUNTRYCODE "Kod regionu" #define TR_USBMODE "USB Mode" +#define TR_JACKMODE "Jack Mode" #define TR_VOICELANG "Język głosu" #define TR_UNITSSYSTEM "Jednostki" #define TR_EDIT "Edytuj" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 61de3d069..64ea4f6f3 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -101,6 +101,9 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ") +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" + #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" @@ -937,6 +940,7 @@ #define TR_SENSOR "SENSOR" #define TR_COUNTRYCODE "Country Code" #define TR_USBMODE "USB Mode" +#define TR_JACKMODE "Jack Mode" #define TR_VOICELANG "Voice Language" #define TR_UNITSSYSTEM "Units" #define TR_EDIT "Edit" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 7bc236511..0e0fdc594 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -101,6 +101,9 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ") +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" + #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "Av\0 ""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" @@ -944,6 +947,7 @@ #define TR_SENSOR "SENSOR" #define TR_COUNTRYCODE "Landskod" #define TR_USBMODE "USB Mode" +#define TR_JACKMODE "Jack Mode" #define TR_VOICELANG "Röstspråk" #define TR_UNITSSYSTEM "Enheter" #define TR_EDIT "Redigera" From 8e0c11443079b42f64f530857ea12c6093b762f1 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Wed, 15 Aug 2018 15:46:09 +0200 Subject: [PATCH 002/446] Fix Play Track on new switches --- radio/src/switches.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 7eb1f12af..9b88080b1 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -133,10 +133,12 @@ void getSwitchesPosition(bool startup) CHECK_3POS(1, SW_SB); CHECK_3POS(2, SW_SC); CHECK_3POS(3, SW_SD); -#if !defined(PCBX7) && !defined(PCBXLITE) +#if defined(PCBXLITES) + CHECK_2POS(SW_SE); +#elif !defined(PCBX7) && !defined(PCBXLITE) CHECK_3POS(4, SW_SE); #endif -#if !defined(PCBXLITE) +#if !defined(PCBXLITE) || defined(PCBXLITES) CHECK_2POS(SW_SF); #endif #if !defined(PCBX7) && !defined(PCBXLITE) From 483d955eaca9c1956a7238b185f6c8ebf891e42b Mon Sep 17 00:00:00 2001 From: Kilrah Date: Wed, 15 Aug 2018 15:51:21 +0200 Subject: [PATCH 003/446] SE-SF can't be 3POS --- radio/src/gui/128x64/radio_hardware.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 85bb01e33..96d397577 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -140,7 +140,9 @@ enum MenuRadioHardwareItems { #else #define BLUETOOTH_ROWS #endif -#if defined(PCBXLITE) +#if defined(PCBXLITES) +#define SWITCH_TYPE_MAX(sw) (sw >= MIXSRC_SE-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS) +#elif defined(PCBXLITE) #define SWITCH_TYPE_MAX(sw) (SWITCH_3POS) #else #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH-MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) From 7987042a1baa187eac653f29207c2468c6af55d8 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Wed, 15 Aug 2018 16:58:11 +0200 Subject: [PATCH 004/446] Cosmetics --- radio/src/switches.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 9b88080b1..9709aa148 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -135,16 +135,24 @@ void getSwitchesPosition(bool startup) CHECK_3POS(3, SW_SD); #if defined(PCBXLITES) CHECK_2POS(SW_SE); -#elif !defined(PCBX7) && !defined(PCBXLITE) +#elif defined(PCBX7) || defined(PCBXLITE) + // No SE +#else CHECK_3POS(4, SW_SE); #endif -#if !defined(PCBXLITE) || defined(PCBXLITES) +#if defined(PCBXLITE) + // No SF +#else CHECK_2POS(SW_SF); #endif -#if !defined(PCBX7) && !defined(PCBXLITE) +#if defined(PCBX7) || defined(PCBXLITE) + // No SG +#else CHECK_3POS(5, SW_SG); #endif -#if !defined(PCBXLITE) +#if defined(PCBXLITE) + // No SH +#else CHECK_2POS(SW_SH); #endif #if defined(PCBX9E) From 73562b12f134df25f14d40bc82ec124db020762c Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 16 Aug 2018 10:58:33 +0200 Subject: [PATCH 005/446] Fix xlites trainer menu --- radio/src/dataconstants.h | 4 +++- radio/src/gui/128x64/model_setup.cpp | 12 +++++++++--- radio/src/gui/gui_common_arm.cpp | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 8b168b7ff..fc4423444 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -215,7 +215,9 @@ enum BeeperMode { }; #endif -#if defined(BLUETOOTH) +#if defined(PCBXLITES) + #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE +#elif defined(BLUETOOTH) #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH #elif defined(PCBX7) || defined(PCBXLITE) #define TRAINER_MODE_MAX() TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 6b2298f09..20dcc8e21 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -76,7 +76,7 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_CHANNELS, ITEM_MODEL_INTERNAL_MODULE_BIND, ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, -#if defined(PCBXLITE) +#if defined(PCBXLITE) || defined(PCBXLITES) ITEM_MODEL_INTERNAL_MODULE_ANTENNA, #endif #endif @@ -111,7 +111,7 @@ enum MenuModelSetupItems { #endif ITEM_MODEL_TRAINER_CHANNELS, ITEM_MODEL_TRAINER_PARAMS, -#elif defined(PCBXLITE) +#elif defined(PCBXLITE) || defined(PCBXLITES) ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_BLUETOOTH, @@ -185,6 +185,12 @@ enum MenuModelSetupItems { #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW +#elif defined(PCBXLITES) + #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), + #define TRAINER_BLUETOOTH_ROW + #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) + #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW #elif defined(PCBXLITE) #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) @@ -228,7 +234,7 @@ void onBindMenu(const char * result) void menuModelSetup(event_t event) { -#if defined(PCBXLITE) +#if defined(PCBXLITE) || defined(PCBXLITES) // Switch to external antenna confirmation if (warningResult) { warningResult = 0; diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 2b22783e0..4768e0aa2 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -588,7 +588,7 @@ bool isTrainerModeAvailable(int mode) else return true; } -#elif defined(PCBX7) +#elif defined(PCBX7) || defined(PCBXLITES) bool isTrainerModeAvailable(int mode) { if (IS_EXTERNAL_MODULE_ENABLED() && (mode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || mode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE)) From f6a6ddd409b30882d8d44b0c3e44811534144633 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Mon, 20 Aug 2018 22:06:01 +0200 Subject: [PATCH 006/446] Wrong define --- radio/src/targets/taranis/board.cpp | 2 +- radio/src/targets/taranis/board.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index b5f57f607..ac61e9968 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -273,7 +273,7 @@ void boardInit() sportUpdateInit(); } -#if defined(AUDIO_JACK_DETECT_GPIO) +#if defined(JACK_DETECT_GPIO) initJackDetect(void); #endif diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 9c9e70572..f7545c8fd 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -626,7 +626,7 @@ static inline void initHeadphoneTrainerSwitch(void) { } static inline void enableHeadphone(void) { } static inline void enableTrainer(void) { } #endif -#if defined(AUDIO_JACK_DETECT_GPIO) +#if defined(JACK_DETECT_GPIO) void initJackDetect(void); bool isJackPlugged(); #endif From 78650bb662096233efd896a181cd41a1648231a4 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Mon, 20 Aug 2018 22:15:10 +0200 Subject: [PATCH 007/446] Companion support --- companion/src/firmwares/boards.cpp | 24 ++++++++++++++++--- companion/src/firmwares/boards.h | 8 ++++--- companion/src/firmwares/opentx/opentxeeprom.h | 1 + .../src/firmwares/opentx/opentxinterface.cpp | 16 +++++++++++++ companion/src/simulation/simulatorwidget.cpp | 3 ++- radio/src/main_arm.cpp | 2 +- radio/src/sdcard.h | 3 +++ radio/src/targets/simu/simpgmspace.cpp | 4 ++++ radio/src/targets/taranis/CMakeLists.txt | 2 +- 9 files changed, 54 insertions(+), 9 deletions(-) diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 25b33b98d..a51151d4f 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -96,6 +96,7 @@ const int Boards::getEEpromSize(Board::Type board) case BOARD_9XRPRO: case BOARD_AR9X: return EESIZE_9XRPRO; + case BOARD_TARANIS_XLITES: case BOARD_TARANIS_XLITE: case BOARD_TARANIS_X7: case BOARD_TARANIS_X9D: @@ -124,6 +125,7 @@ const int Boards::getFlashSize(Type board) case BOARD_9XRPRO: case BOARD_AR9X: return FSIZE_9XRPRO; + case BOARD_TARANIS_XLITES: case BOARD_TARANIS_XLITE: case BOARD_TARANIS_X7: case BOARD_TARANIS_X9D: @@ -145,7 +147,19 @@ const SwitchInfo Boards::getSwitchInfo(Board::Type board, int index) if (index < 0) return {SWITCH_NOT_AVAILABLE, CPN_STR_UNKNOWN_ITEM}; - if (IS_TARANIS_XLITE(board)) { + if (IS_TARANIS_XLITES(board)) { + const Board::SwitchInfo switches[] = { + {SWITCH_3POS, "SA"}, + {SWITCH_3POS, "SB"}, + {SWITCH_2POS, "SC"}, + {SWITCH_2POS, "SD"}, + {SWITCH_TOGGLE, "SE"}, + {SWITCH_TOGGLE, "SF"} + }; + if (index < DIM(switches)) + return switches[index]; + } + else if (IS_TARANIS_XLITE(board)) { const Board::SwitchInfo switches[] = { {SWITCH_3POS, "SA"}, {SWITCH_3POS, "SB"}, @@ -155,7 +169,7 @@ const SwitchInfo Boards::getSwitchInfo(Board::Type board, int index) if (index < DIM(switches)) return switches[index]; } - if (IS_TARANIS_X7(board)) { + else if (IS_TARANIS_X7(board)) { const Board::SwitchInfo switches[] = { {SWITCH_3POS, "SA"}, {SWITCH_3POS, "SB"}, @@ -246,7 +260,7 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability) return getCapability(board, Board::Sticks) + getCapability(board, Board::Pots) + getCapability(board, Board::Sliders) + getCapability(board, Board::MouseAnalogs); case MultiposPots: - return IS_HORUS_OR_TARANIS(board) ? 3 : 0; + return IS_HORUS_OR_TARANIS(board) ? getCapability(board, Board::Pots) : 0; case MultiposPotsPositions: return IS_HORUS_OR_TARANIS(board) ? 6 : 0; @@ -256,6 +270,8 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability) return 18; else if (IS_TARANIS_X7(board)) return 6; + else if (IS_TARANIS_XLITES(board)) + return 6; else if (IS_TARANIS_XLITE(board)) return 4; else if (IS_HORUS_OR_TARANIS(board)) @@ -405,6 +421,8 @@ const QString Boards::getBoardName(Board::Type board) return "Taranis X7/X7S"; case BOARD_TARANIS_XLITE: return "Taranis X-Lite"; + case BOARD_TARANIS_XLITES: + return "Taranis X-Lite S"; case BOARD_TARANIS_X9D: return "Taranis X9D"; case BOARD_TARANIS_X9DP: diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index 885da2fc3..87f9733e0 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -46,6 +46,7 @@ namespace Board { BOARD_X12S, BOARD_X10, BOARD_TARANIS_XLITE, + BOARD_TARANIS_XLITES, BOARD_ENUM_COUNT }; @@ -186,14 +187,15 @@ class Boards #define IS_2560(board) (board==Board::BOARD_GRUVIN9X || board==Board::BOARD_MEGA2560) #define IS_SKY9X(board) (board==Board::BOARD_SKY9X || board==Board::BOARD_9XRPRO || board==Board::BOARD_AR9X) #define IS_9XRPRO(board) (board==Board::BOARD_9XRPRO) -#define IS_TARANIS_XLITE(board) (board==Board::BOARD_TARANIS_XLITE) +#define IS_TARANIS_XLITE(board) (board==Board::BOARD_TARANIS_XLITE || board==Board::BOARD_TARANIS_XLITES) +#define IS_TARANIS_XLITES(board) (board==Board::BOARD_TARANIS_XLITES) #define IS_TARANIS_X7(board) (board==Board::BOARD_TARANIS_X7) #define IS_TARANIS_X9(board) (board==Board::BOARD_TARANIS_X9D || board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9E) #define IS_TARANIS_X9D(board) (board==Board::BOARD_TARANIS_X9D || board==Board::BOARD_TARANIS_X9DP) #define IS_TARANIS_PLUS(board) (board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9E) #define IS_TARANIS_X9E(board) (board==Board::BOARD_TARANIS_X9E) -#define IS_TARANIS(board) (IS_TARANIS_X9(board) || IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)) -#define IS_TARANIS_SMALL(board) (board==Board::BOARD_TARANIS_X7 || board==Board::BOARD_TARANIS_XLITE) +#define IS_TARANIS(board) (IS_TARANIS_X9(board) || IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board) || IS_TARANIS_XLITES(board)) +#define IS_TARANIS_SMALL(board) (board==Board::BOARD_TARANIS_X7 || board==Board::BOARD_TARANIS_XLITE || board==Board::BOARD_TARANIS_XLITES) #define IS_TARANIS_NOT_X9E(board) (IS_TARANIS(board) && !IS_TARANIS_X9E(board)) #define IS_HORUS_X12S(board) (board==Board::BOARD_X12S) #define IS_HORUS_X10(board) (board==Board::BOARD_X10) diff --git a/companion/src/firmwares/opentx/opentxeeprom.h b/companion/src/firmwares/opentx/opentxeeprom.h index 35c571787..ee840cc77 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.h +++ b/companion/src/firmwares/opentx/opentxeeprom.h @@ -33,6 +33,7 @@ #define TARANIS_X9E_VARIANT 0x8000 #define TARANIS_X7_VARIANT 0x4000 #define TARANIS_XLITE_VARIANT 0x2000 +#define TARANIS_XLITES_VARIANT 0x1000 #define SIMU_STOCK_VARIANTS (GVARS_VARIANT|FRSKY_VARIANT) #define SIMU_M128_VARIANTS (M128_VARIANT|SIMU_STOCK_VARIANTS) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index c9c35e251..c1b449941 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -317,6 +317,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u else if (IS_TARANIS_X7(board)) { variant |= TARANIS_X7_VARIANT; } + else if (IS_TARANIS_XLITES(board)) { + variant |= TARANIS_XLITES_VARIANT; + } else if (IS_TARANIS_XLITE(board)) { variant |= TARANIS_XLITE_VARIANT; } @@ -691,6 +694,8 @@ int OpenTxFirmware::getCapability(::Capability capability) return TARANIS_X9E_VARIANT; else if (IS_TARANIS_X7(board)) return TARANIS_X7_VARIANT; + else if (IS_TARANIS_XLITES(board)) + return TARANIS_XLITES_VARIANT; else if (IS_TARANIS_XLITE(board)) return TARANIS_XLITE_VARIANT; else @@ -921,6 +926,11 @@ bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int vari variantError = true; } } + else if (IS_TARANIS_XLITES(board)) { + if (variant != TARANIS_XLITES_VARIANT) { + variantError = true; + } + } else if (IS_TARANIS_XLITE(board)) { if (variant != TARANIS_XLITE_VARIANT) { variantError = true; @@ -1165,6 +1175,12 @@ void registerOpenTxFirmwares() addOpenTxTaranisOptions(firmware, false); registerOpenTxFirmware(firmware); + /* FrSky X-Lite S board */ + firmware = new OpenTxFirmware("opentx-xlites", QCoreApplication::translate("Firmware", "FrSky Taranis X-Lite S"), BOARD_TARANIS_XLITES); + // firmware->addOption("stdr9m", QCoreApplication::translate("Firmware", "Use JR-sized R9M module")); + addOpenTxTaranisOptions(firmware); + registerOpenTxFirmware(firmware); + /* FrSky X-Lite board */ firmware = new OpenTxFirmware("opentx-xlite", Firmware::tr("FrSky Taranis X-Lite"), BOARD_TARANIS_XLITE); // firmware->addOption("stdr9m", Firmware::tr("Use JR-sized R9M module")); diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp index 4ad053c73..5d059f4db 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -77,6 +77,7 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato radioUiWidget = new SimulatedUIWidgetX9(simulator, this); break; case Board::BOARD_TARANIS_XLITE: + case Board::BOARD_TARANIS_XLITES: radioUiWidget = new SimulatedUIWidgetXLITE(simulator, this); break; case Board::BOARD_TARANIS_X9E: @@ -108,7 +109,7 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato vJoyLeft = new VirtualJoystickWidget(this, 'L'); ui->leftStickLayout->addWidget(vJoyLeft); - vJoyRight = new VirtualJoystickWidget(this, 'R', (m_board == Board::BOARD_TARANIS_XLITE ? false : true)); // TODO: maybe remove trims for both joysticks and add a cross in the middle? + vJoyRight = new VirtualJoystickWidget(this, 'R', (m_board == Board::BOARD_TARANIS_XLITE || m_board == Board::BOARD_TARANIS_XLITES ? false : true)); // TODO: maybe remove trims for both joysticks and add a cross in the middle? ui->rightStickLayout->addWidget(vJoyRight); connect(vJoyLeft, &VirtualJoystickWidget::valueChange, this, &SimulatorWidget::onRadioWidgetValueChange); diff --git a/radio/src/main_arm.cpp b/radio/src/main_arm.cpp index f68226fcc..c02786d46 100644 --- a/radio/src/main_arm.cpp +++ b/radio/src/main_arm.cpp @@ -74,7 +74,7 @@ void handleUsbConnection() #endif // defined(STM32) && !defined(SIMU) } -#if defined(JACK_DETECT_GPIO) +#if defined(JACK_DETECT_GPIO) && !defined(SIMU) bool isJackPlugged() { // debounce diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 4211e395f..cebd3c2eb 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -129,6 +129,9 @@ const char * getFileExtension(const char * filename, uint8_t size=0, uint8_t ext #elif defined(PCBX9E) #define OTX_FOURCC 0x3578746F // otx for Taranis X9E #define O9X_FOURCC 0x3378396F // o9x for Taranis X9E +#elif defined(PCBXLITES) + #define OTX_FOURCC 0x3B78746F // otx for Taranis X-Lite S + #define O9X_FOURCC 0x3B78396F // o9x for Taranis X-Lite S #elif defined(PCBXLITE) #define OTX_FOURCC 0x3978746F // otx for Taranis X-Lite #define O9X_FOURCC 0x3978396F // o9x for Taranis X-Lite diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index dedbaec25..cab8c5008 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -693,6 +693,10 @@ uint32_t isBootloaderStart(const uint8_t * block) { return 1; } void LCD_ControlLight(uint16_t dutyCycle) { } #endif +#if defined(PCBXLITES) +bool isJackPlugged() { return false; } +#endif + void serialPrintf(const char * format, ...) { } void serialCrlf() { } void serialPutc(char c) { } diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 8d71b30c3..262c4ee5a 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -108,7 +108,7 @@ elseif(PCB STREQUAL XLITES) set(LUA_EXPORT lua_export_xlite) set(FLAVOUR xlites) add_definitions(-DPCBXLITES -DPCBXLITE -DSOFTWARE_VOLUME) - add_definitions(-DEEPROM_VARIANT=0x2000) + add_definitions(-DEEPROM_VARIANT=0x1000) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(GUI_DIR 128x64) set(NAVIGATION_TYPE xlite) From 7def4aed302453531bbfebd869beafbdb22be4db Mon Sep 17 00:00:00 2001 From: Kilrah Date: Tue, 21 Aug 2018 10:41:20 +0200 Subject: [PATCH 008/446] Compilation fix, missing function --- radio/src/targets/taranis/board.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index ac61e9968..3f638832c 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -274,7 +274,7 @@ void boardInit() } #if defined(JACK_DETECT_GPIO) - initJackDetect(void); + initJackDetect(); #endif initSpeakerEnable(); @@ -414,3 +414,17 @@ void enableTrainer() GPIO_SetBits(HEADPHONE_TRAINER_SWITCH_GPIO, HEADPHONE_TRAINER_SWITCH_GPIO_PIN); } #endif + +#if defined(JACK_DETECT_GPIO) +void initJackDetect(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.GPIO_Pin = JACK_DETECT_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(JACK_DETECT_GPIO, &GPIO_InitStructure); +} +#endif \ No newline at end of file From 9cd552470640ae1e5d33ffcb10991d97e7b9fc6e Mon Sep 17 00:00:00 2001 From: Kilrah Date: Tue, 21 Aug 2018 10:43:48 +0200 Subject: [PATCH 009/446] Update translations --- radio/src/translations/cz.h.txt | 3 +++ radio/src/translations/de.h.txt | 3 +++ radio/src/translations/es.h.txt | 3 +++ radio/src/translations/fi.h.txt | 3 +++ radio/src/translations/fr.h.txt | 3 +++ radio/src/translations/it.h.txt | 3 +++ radio/src/translations/nl.h.txt | 3 +++ radio/src/translations/pl.h.txt | 3 +++ radio/src/translations/pt.h.txt | 3 +++ radio/src/translations/se.h.txt | 3 +++ 10 files changed, 30 insertions(+) diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 66f481171..35a8f888e 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -418,6 +418,9 @@ #elif defined(PCBX9E) #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(PCBXLITES) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" #elif defined(PCBXLITE) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 18dd7e0fa..beba5a70f 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -433,6 +433,9 @@ #elif defined(PCBX9E) #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(PCBXLITES) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" #elif defined(PCBXLITE) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 059702cdc..b920bf446 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -422,6 +422,9 @@ #elif defined(PCBX9E) #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(PCBXLITES) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" #elif defined(PCBXLITE) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 127c1574d..7ac064105 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -422,6 +422,9 @@ #elif defined(PCBX9E) #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(PCBXLITES) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" #elif defined(PCBXLITE) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index ccf16dcb8..4fa2f1a46 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -435,6 +435,9 @@ #elif defined(PCBX9E) #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(PCBXLITES) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" #elif defined(PCBXLITE) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index d653425ea..0ce36835d 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -424,6 +424,9 @@ #elif defined(PCBX9E) #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(PCBXLITES) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" #elif defined(PCBXLITE) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 56f70cfd3..54ad35d8f 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -417,6 +417,9 @@ #elif defined(PCBX9E) #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(PCBXLITES) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" #elif defined(PCBXLITE) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index b38b5bae9..19cb896aa 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -425,6 +425,9 @@ #elif defined(PCBX9E) #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(PCBXLITES) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" #elif defined(PCBXLITE) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 64ea4f6f3..a86ea0973 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -421,6 +421,9 @@ #elif defined(PCBX9E) #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(PCBXLITES) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" #elif defined(PCBXLITE) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 0e0fdc594..b254cece8 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -429,6 +429,9 @@ #elif defined(PCBX9E) #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(PCBXLITES) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" #elif defined(PCBXLITE) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0" From 8ffff766329ce07863e223effb5b322e1efb500e Mon Sep 17 00:00:00 2001 From: Kilrah Date: Tue, 21 Aug 2018 10:58:27 +0200 Subject: [PATCH 010/446] Switch fix again --- radio/src/switches.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 9709aa148..b453eccd8 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -140,7 +140,7 @@ void getSwitchesPosition(bool startup) #else CHECK_3POS(4, SW_SE); #endif -#if defined(PCBXLITE) +#if defined(PCBXLITE) && !defined(PCBXLITES) // No SF #else CHECK_2POS(SW_SF); From 8ab05f89c31f77d2c954ced2d8f89d9455bf2a71 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Tue, 21 Aug 2018 16:48:02 +0200 Subject: [PATCH 011/446] Add jack config to companion --- companion/src/firmwares/eeprominterface.h | 3 +- companion/src/firmwares/generalsettings.h | 1 + .../src/firmwares/opentx/opentxeeprom.cpp | 3 +- .../src/firmwares/opentx/opentxinterface.cpp | 2 + companion/src/generaledit/generalsetup.cpp | 19 +- companion/src/generaledit/generalsetup.h | 1 + companion/src/generaledit/generalsetup.ui | 1964 +++++++++-------- 7 files changed, 1021 insertions(+), 972 deletions(-) diff --git a/companion/src/firmwares/eeprominterface.h b/companion/src/firmwares/eeprominterface.h index b9929a1dc..d6ed9cf16 100644 --- a/companion/src/firmwares/eeprominterface.h +++ b/companion/src/firmwares/eeprominterface.h @@ -146,7 +146,8 @@ enum Capability { HasMixerExpo, HasBatMeterRange, DangerousFunctions, - HasModelCategories + HasModelCategories, + HasSwitchableJack }; class EEPROMInterface diff --git a/companion/src/firmwares/generalsettings.h b/companion/src/firmwares/generalsettings.h index aa11b6709..ad984476b 100644 --- a/companion/src/firmwares/generalsettings.h +++ b/companion/src/firmwares/generalsettings.h @@ -102,6 +102,7 @@ class GeneralSettings { bool disableAlarmWarning; bool disableRssiPoweroffAlarm; unsigned int usbMode; + unsigned int jackMode; BeeperMode hapticMode; unsigned int stickMode; // TODO enum int timezone; diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 9df2cf915..144486234 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -3702,7 +3702,8 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type internalField.Append(new BoolField<1>(this, generalData.jitterFilter)); internalField.Append(new BoolField<1>(this, generalData.disableRssiPoweroffAlarm)); internalField.Append(new UnsignedField<2>(this, generalData.usbMode)); - internalField.Append(new SpareBitsField<3>(this)); + internalField.Append(new UnsignedField<2>(this, generalData.jackMode)); + internalField.Append(new SpareBitsField<1>(this)); } else { internalField.Append(new SpareBitsField<7>(this)); diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index c1b449941..30ee2de1b 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -713,6 +713,8 @@ int OpenTxFirmware::getCapability(::Capability capability) return id.contains("danger") ? 1 : 0; case HasModelCategories: return IS_HORUS(board); + case HasSwitchableJack: + return IS_TARANIS_XLITES(board); default: return 0; } diff --git a/companion/src/generaledit/generalsetup.cpp b/companion/src/generaledit/generalsetup.cpp index d2265a009..b6bf20711 100644 --- a/companion/src/generaledit/generalsetup.cpp +++ b/companion/src/generaledit/generalsetup.cpp @@ -151,13 +151,21 @@ ui(new Ui::GeneralSetup) ui->adjustRTC->hide(); } - if (IS_STM32(firmware->getBoard())){ + if (IS_STM32(firmware->getBoard())) { ui->usbModeCB->setCurrentIndex(generalSettings.usbMode); } else { ui->usbModeLabel->hide(); ui->usbModeCB->hide(); } + + if (firmware->getCapability(HasSwitchableJack)) { + ui->jackModeCB->setCurrentIndex(generalSettings.jackMode); + } + else { + ui->jackModeLabel->hide(); + ui->jackModeCB->hide(); + } if (!firmware->getCapability(OptrexDisplay)) { ui->label_displayType->hide(); @@ -353,6 +361,15 @@ void GeneralSetupPanel::on_usbModeCB_currentIndexChanged(int index) } } +void GeneralSetupPanel::on_jackModeCB_currentIndexChanged(int index) +{ + if (!lock) { + generalSettings.jackMode = ui->jackModeCB->currentIndex(); + emit modified(); + } +} + + void GeneralSetupPanel::on_backlightColor_SL_valueChanged() { if (!lock) { diff --git a/companion/src/generaledit/generalsetup.h b/companion/src/generaledit/generalsetup.h index 80a63d027..d3f800714 100644 --- a/companion/src/generaledit/generalsetup.h +++ b/companion/src/generaledit/generalsetup.h @@ -60,6 +60,7 @@ class GeneralSetupPanel : public GeneralPanel void on_hapticLengthCB_currentIndexChanged(int index); void on_backlightswCB_currentIndexChanged(int index); void on_usbModeCB_currentIndexChanged(int index); + void on_jackModeCB_currentIndexChanged(int index); void on_backlightColor_SL_valueChanged(); void on_mavbaud_CB_currentIndexChanged(int index); void on_voiceLang_CB_currentIndexChanged(int index); diff --git a/companion/src/generaledit/generalsetup.ui b/companion/src/generaledit/generalsetup.ui index a30bf446f..5537004bc 100644 --- a/companion/src/generaledit/generalsetup.ui +++ b/companion/src/generaledit/generalsetup.ui @@ -29,10 +29,10 @@ QLayout::SetMinimumSize - + 0 - + 0 @@ -1121,906 +1121,43 @@ p, li { white-space: pre-wrap; } QLayout::SetDefaultConstraint - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" text-decoration: underline;">Warnings</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These will define startup warnings.</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Throttle warning - will alert if the throttle is not at idle during startup</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch warning - will alert if switches are not in their defaul position</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory warning - will alert if there's not a lot of memory left</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Silent mode warning - will alert you if the beeper is set to quiet (0)</p></body></html> - + + - - - - true + GPS Coordinates - - - - - 0 - 0 - - - - - 0 - 0 - - - - RSSI Poweroff Warning - - - - - - - - 0 - 0 - - - - - 0 - 22 - - + + - - Beeper volume - -0 - Quiet. No beeps at all. -1 - No Keys. Normal beeps but menu keys do not beep. -2 - Normal. -3 - Loud. -4 - Extra loud. - - - - Quiet - - - - - Alarms Only - - - - - No Keys - - - - - All - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Beeper Mode - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - - X-Short - - - - - Short - - - - - Normal - - - - - Long - - - - - X-Long - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Beeper Length - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Haptic Mode - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Measurement Units - - - - - - - - 0 - 0 - - - - Play Delay (switch mid position) - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - - X-Short - - - - - Short - - - - - Normal - - - - - Long - - - - - X-Long - - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" text-decoration: underline;">Warnings</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These will define startup warnings.</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Throttle warning - will alert if the throttle is not at idle during startup</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch warning - will alert if switches are not in their defaul position</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory warning - will alert if there's not a lot of memory left</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Silent mode warning - will alert you if the beeper is set to quiet (0)</p></body></html> - - - - - - true - - - - - - - - hh° (N/S) mm' ss''.dd - - - - - NMEA - - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - - 16777215 - 16777215 - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" text-decoration: underline;">Warnings</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These will define startup warnings.</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Throttle warning - will alert if the throttle is not at idle during startup</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch warning - will alert if switches are not in their defaul position</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory warning - will alert if there's not a lot of memory left</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Silent mode warning - will alert you if the beeper is set to quiet (0)</p></body></html> - - - - - - true - - - - - - - - 4800 Baud - - - - - 9600 Baud - - - - - 14400 Baud - - - - - 19200 Baud - - - - - 38400 Baud - - - - - 57600 Baud - - - - - 76800 Baud - - - - - 115200 Baud - - - - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Show splash screen on startup - - - Show splash screen on startup - - - - - - - - - - - 0 - 0 - - - - - --- - - - - - 2s - - - - - 3s - - - - - 4s - - - - - 6s - - - - - 8s - - - - - 10s - - - - - 15s - - - - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - - - - - - - If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LCD Screen Contrast</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Values can be 20-45</span></p></body></html> - min - - - 120 - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - - Standard - - - - - Optrex - - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - - - - - - - Battery warning voltage. -This is the threashhold where the battery warning sounds. - -Acceptable values are 5v..10v - - - - - - V - - - 1 + ms - 4.000000000000000 + 0 - 12.000000000000000 + 1000 - 0.100000000000000 - - - 9.600000000000000 - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - - - - - - - - - 10 - - 45 - - 25 - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - -2 - - - 2 - - - 1 - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - - Quiet - - - - - Only Alarms - - - - - No Keys - - - - - All - - - - - - - - - 0 - 0 - - - - MAVLink Baud Rate - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Haptic Length - - - - - - - - 0 - 0 - - - - - 20 - 0 - - - - - - - Battery Warning - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - "No Sound" Warning - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - LCD Display Type - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Haptic Strength - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Battery Meter Range - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - - - Contrast - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Show Splash Screen on Startup - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Low EEPROM Warning - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Inactivity Timer + 0 @@ -2086,8 +1223,8 @@ Acceptable values are 5v..10v - - + + @@ -2095,34 +1232,55 @@ Acceptable values are 5v..10v - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LCD Screen Contrast</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Values can be 20-45</span></p></body></html> + Mode selection: + +Mode 1: + Left stick: Elevator, Rudder + Right stick: Throttle, Aileron + +Mode 2: + Left stick: Throttle, Rudder + Right stick: Elevator, Aileron + +Mode 3: + Left stick: Elevator, Aileron + Right stick: Throttle, Rudder + +Mode 4: + Left stick: Throttle, Aileron + Right stick: Elevator, Rudder + + - - ms - - - 0 - - - 1000 - - - 10 - - - 0 + + 1 + + + Mode 1 (RUD ELE THR AIL) + + + + + Mode 2 (RUD THR ELE AIL) + + + + + Mode 3 (AIL ELE THR RUD) + + + + + Mode 4 (AIL THR ELE RUD) + + - - + + - GPS Coordinates + Stick Mode @@ -2153,13 +1311,6 @@ p, li { white-space: pre-wrap; } - - - - Stick Mode - - - @@ -2296,67 +1447,6 @@ p, li { white-space: pre-wrap; } - - - - - - - - - - Mode selection: - -Mode 1: - Left stick: Elevator, Rudder - Right stick: Throttle, Aileron - -Mode 2: - Left stick: Throttle, Rudder - Right stick: Elevator, Aileron - -Mode 3: - Left stick: Elevator, Aileron - Right stick: Throttle, Rudder - -Mode 4: - Left stick: Throttle, Aileron - Right stick: Elevator, Rudder - - - - - 1 - - - - Mode 1 (RUD ELE THR AIL) - - - - - Mode 2 (RUD THR ELE AIL) - - - - - Mode 3 (AIL ELE THR RUD) - - - - - Mode 4 (AIL THR ELE RUD) - - - - - - - - USB Mode - - - @@ -2381,6 +1471,942 @@ Mode 4: + + + + USB Mode + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" text-decoration: underline;">Warnings</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These will define startup warnings.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Throttle warning - will alert if the throttle is not at idle during startup</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch warning - will alert if switches are not in their defaul position</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory warning - will alert if there's not a lot of memory left</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Silent mode warning - will alert you if the beeper is set to quiet (0)</p></body></html> + + + + + + true + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + RSSI Poweroff Warning + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Beeper Length + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + + + + + + Beeper volume + +0 - Quiet. No beeps at all. +1 - No Keys. Normal beeps but menu keys do not beep. +2 - Normal. +3 - Loud. +4 - Extra loud. + + + + Quiet + + + + + Alarms Only + + + + + No Keys + + + + + All + + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + X-Short + + + + + Short + + + + + Normal + + + + + Long + + + + + X-Long + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Beeper Mode + + + + + + + Measurement Units + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Haptic Mode + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + Play Delay (switch mid position) + + + + + + + + 4800 Baud + + + + + 9600 Baud + + + + + 14400 Baud + + + + + 19200 Baud + + + + + 38400 Baud + + + + + 57600 Baud + + + + + 76800 Baud + + + + + 115200 Baud + + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + X-Short + + + + + Short + + + + + Normal + + + + + Long + + + + + X-Long + + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + 16777215 + 16777215 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" text-decoration: underline;">Warnings</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These will define startup warnings.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Throttle warning - will alert if the throttle is not at idle during startup</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch warning - will alert if switches are not in their defaul position</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory warning - will alert if there's not a lot of memory left</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Silent mode warning - will alert you if the beeper is set to quiet (0)</p></body></html> + + + + + + true + + + + + + + + hh° (N/S) mm' ss''.dd + + + + + NMEA + + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" text-decoration: underline;">Warnings</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These will define startup warnings.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Throttle warning - will alert if the throttle is not at idle during startup</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch warning - will alert if switches are not in their defaul position</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory warning - will alert if there's not a lot of memory left</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Silent mode warning - will alert you if the beeper is set to quiet (0)</p></body></html> + + + + + + true + + + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Show splash screen on startup + + + Show splash screen on startup + + + + + + + + + + + 0 + 0 + + + + + --- + + + + + 2s + + + + + 3s + + + + + 4s + + + + + 6s + + + + + 8s + + + + + 10s + + + + + 15s + + + + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + + + + + + If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. + + + min + + + 120 + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + Standard + + + + + Optrex + + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + + + + + + + + + 10 + + + 45 + + + 25 + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + + + + + + Battery warning voltage. +This is the threashhold where the battery warning sounds. + +Acceptable values are 5v..10v + + + + + + V + + + 1 + + + 4.000000000000000 + + + 12.000000000000000 + + + 0.100000000000000 + + + 9.600000000000000 + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + -2 + + + 2 + + + 1 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + Quiet + + + + + Only Alarms + + + + + No Keys + + + + + All + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + "No Sound" Warning + + + + + + + + 0 + 0 + + + + MAVLink Baud Rate + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + + + + Battery Warning + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Haptic Length + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + LCD Display Type + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Battery Meter Range + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Haptic Strength + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Inactivity Timer + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Low EEPROM Warning + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Show Splash Screen on Startup + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + Contrast + + + + + + + Jack Mode + + + + + + + + Ask on Connect + + + + + Audio + + + + + Trainer + + + + From 1b2cff08a59c4fa83f166febcc62ef8b81d07f34 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Wed, 29 Aug 2018 21:42:32 +0200 Subject: [PATCH 012/446] Extra switches now working in simu --- radio/src/targets/simu/simpgmspace.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index cab8c5008..944a64f6c 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -272,6 +272,9 @@ void simuSetSwitch(uint8_t swtch, int8_t state) #if defined(PCBX7) SWITCH_CASE (4, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) SWITCH_CASE (5, SWITCHES_GPIO_REG_H, SWITCHES_GPIO_PIN_H) + #elif defined(PCBXLITES) + SWITCH_CASE (4, SWITCHES_GPIO_REG_E, SWITCHES_GPIO_PIN_E) + SWITCH_CASE (5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) #elif !defined(PCBXLITE) SWITCH_3_CASE(4, SWITCHES_GPIO_REG_E_L, SWITCHES_GPIO_REG_E_H, SWITCHES_GPIO_PIN_E_L, SWITCHES_GPIO_PIN_E_H) SWITCH_CASE (5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) From 550f1130d6aec966c6e7009d39c8445f74478577 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 19 Nov 2018 02:08:10 +0100 Subject: [PATCH 013/446] Cosmetics --- radio/src/pulses/pxx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp index 19a547ac7..f63ee0580 100644 --- a/radio/src/pulses/pxx.cpp +++ b/radio/src/pulses/pxx.cpp @@ -166,7 +166,7 @@ void PxxPulses::addExtraFlags(uint8_t port) extra_flags |= (g_model.moduleData[port].pxx.receiver_channel_9_16 << 2); if (isModuleR9M(port)) { extra_flags |= (min(g_model.moduleData[port].pxx.power, isModuleR9M_FCC_VARIANT(port) ? (uint8_t)R9M_FCC_POWER_MAX : (uint8_t)R9M_LBT_POWER_MAX) << 3); - if(isModuleR9M_EUPLUS(port)) + if (isModuleR9M_EUPLUS(port)) extra_flags |= (1 << 6); } From 37d9d26008e87fffacd2b30b05a06674babe48ab Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 19 Nov 2018 02:09:06 +0100 Subject: [PATCH 014/446] Updated according to latest spec --- radio/src/pulses/pxx2.cpp | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index d7d32b588..e3791b2ed 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -38,22 +38,14 @@ void Pxx2Pulses::setupFrame(uint8_t port) // Flag1 uint8_t flag1 = addFlag1(port); - // Flag2 - addByte(0); + // Extra flags + addExtraFlags(port); // Channels addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); - // Extra flags - addExtraFlags(port); - - // Flag3, reserved - addByte(0); - #if defined(LUA) if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { - // CMD/Resp - addByte(1); // primID (1 byte) + dataID (2 bytes) + value (4 bytes) for (uint8_t i=0; i<7; i++) { addByte(outputTelemetryBuffer[i]); @@ -61,13 +53,6 @@ void Pxx2Pulses::setupFrame(uint8_t port) outputTelemetryBufferTrigger = 0x00; outputTelemetryBufferSize = 0; } - else { - // CMD/Resp - addByte(0); - } -#else - // CMD/Resp - addByte(0); #endif // CRC From ab643602323cc189f048460ae8714ffadeacbc9d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 19 Nov 2018 02:34:07 +0100 Subject: [PATCH 015/446] Cosmetics --- radio/src/pulses/pxx2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index e3791b2ed..b57f052f3 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -38,7 +38,7 @@ void Pxx2Pulses::setupFrame(uint8_t port) // Flag1 uint8_t flag1 = addFlag1(port); - // Extra flags + // Flag2 = Extra flags addExtraFlags(port); // Channels From 3605109d256ef6dfd8f495ec51e2f24486483696 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 19 Nov 2018 03:41:51 +0100 Subject: [PATCH 016/446] HEAD and TAIL missing in PXX2 frames --- radio/src/pulses/pxx2.cpp | 4 +--- radio/src/pulses/pxx2.h | 43 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index b57f052f3..2ae1adfd8 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -24,7 +24,6 @@ void Pxx2Pulses::setupFrame(uint8_t port) { initFrame(); - initCrc(); static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; uint8_t sendUpperChannels = 0; @@ -55,6 +54,5 @@ void Pxx2Pulses::setupFrame(uint8_t port) } #endif - // CRC - addByte(crc); // TODO need to check the CRC chosen algorithm + endFrame(); } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 939d0204d..1ba2bc045 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -41,11 +41,16 @@ class SportCrcMixin { }; -class Pxx2Transport: public DataBuffer, public SportCrcMixin { +class Pxx2Transport: public DataBuffer, public PxxCrcMixin { protected: void addByte(uint8_t byte) { - SportCrcMixin::addToCrc(byte); + PxxCrcMixin::addToCrc(byte); + addByteWithoutCrc(byte); + }; + + void addByteWithoutCrc(uint8_t byte) + { *ptr++ = byte; } @@ -63,9 +68,43 @@ class Pxx2Pulses: public PxxPulses { uint8_t data[64]; uint8_t * ptr; + void addHead() + { + // send 7E, do not CRC + Pxx2Transport::addByteWithoutCrc(0x7E); + + // reserve 1 byte for LEN + Pxx2Transport::addByteWithoutCrc(0x00); + + // TYPE_C + TYPE_ID + Pxx2Transport::addByte(0x26); // This one is CRC-ed on purpose + } + + void addCrc() + { + Pxx2Transport::addByteWithoutCrc(PxxCrcMixin::crc >> 8); + Pxx2Transport::addByteWithoutCrc(PxxCrcMixin::crc); + } + void initFrame() { + // init the CRC counter + initCrc(); + + // reset the frame pointer Pxx2Transport::initBuffer(); + + // add the frame head + addHead(); + } + + void endFrame() + { + // update the frame LEN = frame length minus the 2 first bytes + data[1] = getSize() - 2; + + // now add the CRC + addCrc(); } }; From 7a681bcb2cae71784e28e4ed8dcc5978a2d16938 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 19 Nov 2018 03:47:33 +0100 Subject: [PATCH 017/446] Unused code removed --- radio/src/pulses/pxx2.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 1ba2bc045..3e0852167 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -53,11 +53,6 @@ class Pxx2Transport: public DataBuffer, public PxxCrcMixin { { *ptr++ = byte; } - - void addTail() - { - // nothing - } }; class Pxx2Pulses: public PxxPulses { From e71fc23a925005bb2559d757672f9276146a9fab Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 19 Nov 2018 11:53:17 +0100 Subject: [PATCH 018/446] Stupid mistake... --- radio/src/pulses/pxx2.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 3e0852167..5893ef975 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -23,6 +23,7 @@ #include "./pxx.h" +// should not be used anymore class SportCrcMixin { protected: void initCrc() @@ -59,10 +60,6 @@ class Pxx2Pulses: public PxxPulses { public: void setupFrame(uint8_t port); - protected: - uint8_t data[64]; - uint8_t * ptr; - void addHead() { // send 7E, do not CRC From b30c9b63cde1d10c96dd1ae528a6477770395987 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 26 Nov 2018 00:08:01 +0100 Subject: [PATCH 019/446] PXX2 S.PORT started --- radio/src/telemetry/frsky.cpp | 38 ++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 02622bfeb..e1ee9fa20 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -20,6 +20,42 @@ #include "opentx.h" +#if defined(PXX2) +void processFrskyTelemetryData(uint8_t data) +{ + static uint8_t dataState = STATE_DATA_IDLE; + + switch (dataState) { + case STATE_DATA_IDLE: + if (data == START_STOP) { + telemetryRxBufferCount = 0; + dataState = STATE_DATA_START; + } + break; + + case STATE_DATA_START: + if (telemetryRxBufferCount == 0 && data > 0x0C) { + // wrong length + telemetryRxBufferCount = 0; + dataState = STATE_DATA_IDLE; + } + else if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { + telemetryRxBuffer[telemetryRxBufferCount++] = data; + if (telemetryRxBuffer[0] + 2 == telemetryRxBufferCount) { + sportProcessPacket(telemetryRxBuffer + 2); + telemetryRxBufferCount = 0; + dataState = STATE_DATA_IDLE; + } + } + else { + // overflow guard + telemetryRxBufferCount = 0; + dataState = STATE_DATA_IDLE; + } + break; + } +} +#else void processFrskyTelemetryData(uint8_t data) { static uint8_t dataState = STATE_DATA_IDLE; @@ -101,4 +137,4 @@ void processFrskyTelemetryData(uint8_t data) } #endif } - +#endif From b72ccb483617fb77c808ff3d6b68319f2b161485 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 28 Nov 2018 18:02:14 +0100 Subject: [PATCH 020/446] PXX2 always defined. PROTOCOL enums renamed. IRPROTOS removed --- radio/src/CMakeLists.txt | 5 - radio/src/dataconstants.h | 4 +- radio/src/functions.cpp | 3 +- radio/src/gui/128x64/model_telemetry.cpp | 2 +- radio/src/gui/gui_common_arm.cpp | 8 +- radio/src/io/frsky_sport.cpp | 4 +- radio/src/myeeprom.h | 125 ++++++------------ radio/src/pulses/dsm2_arm.cpp | 4 +- radio/src/pulses/pulses.h | 6 +- radio/src/pulses/pulses_arm.cpp | 98 +++++++------- radio/src/pulses/pulses_arm.h | 2 - radio/src/targets/common/arm/CMakeLists.txt | 8 +- .../arm/stm32/intmodule_serial_driver.cpp | 2 +- .../common/arm/stm32/serial2_driver.cpp | 2 +- radio/src/targets/horus/extmodule_driver.cpp | 4 +- radio/src/targets/horus/telemetry_driver.cpp | 4 +- .../src/targets/taranis/extmodule_driver.cpp | 4 +- .../taranis/intmodule_pulses_driver.cpp | 4 +- .../src/targets/taranis/telemetry_driver.cpp | 6 +- radio/src/telemetry/frsky.h | 6 +- radio/src/telemetry/telemetry.cpp | 39 +++--- radio/src/telemetry/telemetry.h | 18 ++- radio/src/telemetry/telemetry_sensors.cpp | 6 +- radio/src/translations/cz.h.txt | 14 +- radio/src/translations/de.h.txt | 14 +- radio/src/translations/en.h.txt | 15 +-- radio/src/translations/es.h.txt | 14 +- radio/src/translations/fi.h.txt | 14 +- radio/src/translations/fr.h.txt | 14 +- radio/src/translations/it.h.txt | 14 +- radio/src/translations/nl.h.txt | 14 +- radio/src/translations/pl.h.txt | 14 +- radio/src/translations/pt.h.txt | 14 +- radio/src/translations/se.h.txt | 12 +- 34 files changed, 174 insertions(+), 343 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 713655f44..e6c42e288 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -47,7 +47,6 @@ option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF) option(NANO "Use nano newlib and binalloc") option(NIGHTLY_BUILD_WARNING "Warn this is a nightly build" OFF) option(MODULE_R9M_FLEX_FW "Add R9M options for non certified firmwwares" OFF) -option(PXX2 "Enable PXX v2 support" OFF) # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags. set(FIRMWARE_C_FLAGS "" CACHE STRING "Additional flags for firmware target c compiler (note: all CMAKE_C_FLAGS[_*] are ignored for firmware/bootloader).") @@ -317,10 +316,6 @@ if(MODULE_R9M_FLEX_FW) add_definitions(-DMODULE_R9M_FLEX_FW) endif() -if(PXX2) - add_definitions(-DPXX2) -endif() - set(SRC ${SRC} opentx.cpp diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index a82ecb289..6bfed571e 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -224,12 +224,12 @@ enum BeeperMode { #endif #if defined(PCBTARANIS) || defined(PCBHORUS) -#define IS_INTERNAL_MODULE_ENABLED() (g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) + #define IS_INTERNAL_MODULE_ENABLED() (g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) #elif defined(PCBSKY9X) #define IS_INTERNAL_MODULE_ENABLED() (false) #endif -#define IS_EXTERNAL_MODULE_ENABLED() (g_model.moduleData[EXTERNAL_MODULE].type != MODULE_TYPE_NONE) +#define IS_EXTERNAL_MODULE_ENABLED() (g_model.moduleData[EXTERNAL_MODULE].type != MODULE_TYPE_NONE) enum UartModes { #if defined(CLI) || defined(DEBUG) diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp index 5142df59c..2422e0dc0 100644 --- a/radio/src/functions.cpp +++ b/radio/src/functions.cpp @@ -155,8 +155,7 @@ void evalFunctions(const CustomFunctionData * functions, CustomFunctionsContext active &= (bool)CFN_ACTIVE(cfn); } - if (active || IS_PLAY_BOTH_FUNC(CFN_FUNC(cfn))) { - + if (active) { switch (CFN_FUNC(cfn)) { #if defined(OVERRIDE_CHANNEL_FUNCTION) diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index 5e763fd5c..1e322f8d0 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -543,7 +543,7 @@ void menuModelTelemetryFrsky(event_t event) case ITEM_TELEMETRY_RSSI_LABEL: #if defined(MULTIMODULE) - if (telemetryProtocol == PROTOCOL_MULTIMODULE && + if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false) == MM_RF_PROTO_FS_AFHDS2A) lcdDrawTextAlignedLeft(y, "RSNR"); else diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 2b22783e0..0fad2f4c4 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -537,23 +537,23 @@ bool isRfProtocolAvailable(int protocol) bool isTelemetryProtocolAvailable(int protocol) { #if defined(PCBTARANIS) - if (protocol == PROTOCOL_FRSKY_D_SECONDARY && g_eeGeneral.serial2Mode != UART_MODE_TELEMETRY) { + if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY && g_eeGeneral.serial2Mode != UART_MODE_TELEMETRY) { return false; } #endif - if (protocol== PROTOCOL_PULSES_CROSSFIRE) { + if (protocol== PROTOCOL_TELEMETRY_CROSSFIRE) { return false; } #if !defined(MULTIMODULE) - if (protocol == PROTOCOL_SPEKTRUM || protocol == PROTOCOL_FLYSKY_IBUS || protocol == PROTOCOL_MULTIMODULE) { + if (protocol == PROTOCOL_TELEMETRY_SPEKTRUM || protocol == PROTOCOL_TELEMETRY_FLYSKY_IBUS || protocol == PROTOCOL_TELEMETRY_MULTIMODULE) { return false; } #endif #if defined(PCBHORUS) - if (protocol == PROTOCOL_FRSKY_D_SECONDARY) { + if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { return false; } #endif diff --git a/radio/src/io/frsky_sport.cpp b/radio/src/io/frsky_sport.cpp index a65de6159..1cd8de569 100644 --- a/radio/src/io/frsky_sport.cpp +++ b/radio/src/io/frsky_sport.cpp @@ -176,7 +176,7 @@ const char * sportUpdatePowerOn(ModuleIndex module) sportUpdateState = SPORT_POWERUP_REQ; sportWaitState(SPORT_IDLE, 500); // Clear the fifo - telemetryInit(PROTOCOL_FRSKY_SPORT); + telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); #if defined(PCBTARANIS) || defined(PCBHORUS) if (module == INTERNAL_MODULE) @@ -199,7 +199,7 @@ const char * sportUpdatePowerOn(ModuleIndex module) return NULL; } - if (telemetryProtocol != PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol != PROTOCOL_TELEMETRY_FRSKY_SPORT) { return TR("Not responding", "Not S.Port 1"); } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 3024536b5..ba58a329d 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -23,20 +23,8 @@ #include "datastructs.h" -#define WARN_THR_BIT 0x01 -#define WARN_BEP_BIT 0x80 -#define WARN_SW_BIT 0x02 -#define WARN_MEM_BIT 0x04 -#define WARN_BVAL_BIT 0x38 - -#define WARN_THR (!(g_eeGeneral.warnOpts & WARN_THR_BIT)) -#define WARN_BEP (!(g_eeGeneral.warnOpts & WARN_BEP_BIT)) -#define WARN_SW (!(g_eeGeneral.warnOpts & WARN_SW_BIT)) -#define WARN_MEM (!(g_eeGeneral.warnOpts & WARN_MEM_BIT)) -#define BEEP_VAL ( (g_eeGeneral.warnOpts & WARN_BVAL_BIT) >>3 ) - - #define EEPROM_VER 218 - #define FIRST_CONV_EEPROM_VER 216 +#define EEPROM_VER 218 +#define FIRST_CONV_EEPROM_VER 216 #define GET_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol #define GET_SBUS_POLARITY(idx) g_model.moduleData[idx].sbus.noninverted @@ -53,10 +41,7 @@ #define IS_TRAINER_EXTERNAL_MODULE() false #endif - #define IS_PLAY_FUNC(func) ((func) >= FUNC_PLAY_SOUND && func <= FUNC_PLAY_VALUE) - - #define IS_PLAY_BOTH_FUNC(func) (0) - #define IS_VOLUME_FUNC(func) ((func) == FUNC_VOLUME) +#define IS_PLAY_FUNC(func) ((func) >= FUNC_PLAY_SOUND && func <= FUNC_PLAY_VALUE) #if defined(GVARS) #define IS_ADJUST_GV_FUNC(func) ((func) == FUNC_ADJUST_GVAR) @@ -141,21 +126,20 @@ enum CurveRefType { CURVE_REF_CUSTOM }; - #define MIN_EXPO_WEIGHT -100 #define EXPO_VALID(ed) ((ed)->mode) #define EXPO_MODE_ENABLE(ed, v) (((v)<0 && ((ed)->mode&1)) || ((v)>=0 && ((ed)->mode&2))) - #define limit_min_max_t int16_t - #define LIMIT_EXT_PERCENT 150 - #define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10) - #define PPM_CENTER_MAX 500 - #define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->max+1000) - #define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->min-1000) - #define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR_PREC1(lim->offset, -1000, 1000, mixerCurrentFlightMode) : lim->offset) - #define LIMIT_MAX_RESX(lim) calc1000toRESX(LIMIT_MAX(lim)) - #define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim)) - #define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim)) +#define limit_min_max_t int16_t +#define LIMIT_EXT_PERCENT 150 +#define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10) +#define PPM_CENTER_MAX 500 +#define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->max+1000) +#define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min, -GV_RANGELARGE, GV_RANGELARGE) ? GET_GVAR_PREC1(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode) : lim->min-1000) +#define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR_PREC1(lim->offset, -1000, 1000, mixerCurrentFlightMode) : lim->offset) +#define LIMIT_MAX_RESX(lim) calc1000toRESX(LIMIT_MAX(lim)) +#define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim)) +#define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim)) #define TRIM_OFF (1) #define TRIM_ON (0) @@ -191,8 +175,6 @@ enum CurveRefType { #define MD_OFFSET(md) (md->offset) #define MD_OFFSET_TO_UNION(md, var) var.word = md->offset #define MD_UNION_TO_OFFSET(var, md) md->offset = var.word -// #define MD_SETOFFSET(md, val) md->offset = val - enum LogicalSwitchesFunctions { LS_FUNC_NONE, @@ -222,14 +204,6 @@ enum LogicalSwitchesFunctions { #define MAX_LS_DELAY 250 /*25s*/ #define MAX_LS_ANDSW SWSRC_LAST -//#define TELEM_FLAG_TIMEOUT 0x01 -#define TELEM_FLAG_LOG 0x02 -//#define TELEM_FLAG_PERSISTENT 0x04 -//#define TELEM_FLAG_SCALE 0x08 -#define TELEM_FLAG_AUTO_OFFSET 0x10 -#define TELEM_FLAG_FILTER 0x20 -#define TELEM_FLAG_LOSS_ALARM 0x40 - enum TelemetrySensorType { TELEM_TYPE_CUSTOM, @@ -251,16 +225,10 @@ enum TelemetrySensorFormula }; enum VarioSource { -#if !defined(TELEMETRY_FRSKY_SPORT) - VARIO_SOURCE_ALTI, - VARIO_SOURCE_ALTI_PLUS, -#endif VARIO_SOURCE_VSPEED, VARIO_SOURCE_A1, VARIO_SOURCE_A2, -#if defined(TELEMETRY_FRSKY_SPORT) VARIO_SOURCE_DTE, -#endif VARIO_SOURCE_COUNT, VARIO_SOURCE_LAST = VARIO_SOURCE_COUNT-1 }; @@ -292,8 +260,6 @@ enum FrskyVoltsSource { FRSKY_VOLTS_SOURCE_LAST=FRSKY_VOLTS_SOURCE_CELLS }; - - enum SwashType { SWASH_TYPE_NONE, SWASH_TYPE_120, @@ -310,8 +276,8 @@ enum SwashType { #define ROTARY_ENCODER_MAX 1024 - #define TRIMS_ARRAY_SIZE 8 - #define TRIM_MODE_NONE 0x1F // 0b11111 +#define TRIMS_ARRAY_SIZE 8 +#define TRIM_MODE_NONE 0x1F // 0b11111 #define IS_MANUAL_RESET_TIMER(idx) (g_model.timers[idx].persistent == 2) @@ -321,37 +287,23 @@ enum SwashType { #define TIMER_COUNTDOWN_START(x) 10 #endif -enum Protocols { - PROTO_PPM, -#if defined(PXX) || defined(DSM2) || defined(IRPROTOS) - PROTO_PXX, +enum ChannelsProtocols { + PROTOCOL_CHANNELS_PPM, +#if defined(PXX) || defined(DSM2) + PROTOCOL_CHANNELS_PXX, #endif -#if defined(DSM2) || defined(IRPROTOS) - PROTO_DSM2_LP45, - PROTO_DSM2_DSM2, - PROTO_DSM2_DSMX, +#if defined(DSM2) + PROTOCOL_CHANNELS_DSM2_LP45, + PROTOCOL_CHANNELS_DSM2_DSM2, + PROTOCOL_CHANNELS_DSM2_DSMX, #endif - PROTO_CROSSFIRE, -#if defined(IRPROTOS) - // only used on AVR - // we will need 4 bits for proto :( - PROTO_SILV, - PROTO_TRAC09, - PROTO_PICZ, - PROTO_SWIFT, -#endif - PROTO_MULTIMODULE, - PROTO_SBUS, - PROTO_PXX2, - PROTO_NONE + PROTOCOL_CHANNELS_CROSSFIRE, + PROTOCOL_CHANNELS_MULTIMODULE, + PROTOCOL_CHANNELS_SBUS, + PROTOCOL_CHANNELS_PXX2, + PROTOCOL_CHANNELS_NONE }; -#if defined(PXX2) -#define PROTO_PXX_EXTERNAL_MODULE PROTO_PXX2 -#else -#define PROTO_PXX_EXTERNAL_MODULE PROTO_PXX -#endif - enum XJTRFProtocols { RF_PROTO_OFF = -1, RF_PROTO_X16, @@ -492,17 +444,18 @@ enum ThrottleSources { THROTTLE_SOURCE_CH1, }; -enum TelemetryType +enum TelemetryProtocols { PROTOCOL_TELEMETRY_FIRST, - PROTOCOL_FRSKY_SPORT = PROTOCOL_TELEMETRY_FIRST, - PROTOCOL_FRSKY_D, - PROTOCOL_FRSKY_D_SECONDARY, - PROTOCOL_PULSES_CROSSFIRE, - PROTOCOL_SPEKTRUM, - PROTOCOL_FLYSKY_IBUS, - PROTOCOL_MULTIMODULE, - PROTOCOL_TELEMETRY_LAST=PROTOCOL_MULTIMODULE + PROTOCOL_TELEMETRY_FRSKY_SPORT = PROTOCOL_TELEMETRY_FIRST, + PROTOCOL_TELEMETRY_FRSKY_D, + PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY, + PROTOCOL_TELEMETRY_CROSSFIRE, + PROTOCOL_TELEMETRY_SPEKTRUM, + PROTOCOL_TELEMETRY_FLYSKY_IBUS, + PROTOCOL_TELEMETRY_MULTIMODULE, + PROTOCOL_TELEMETRY_LAST=PROTOCOL_TELEMETRY_MULTIMODULE, + PROTOCOL_TELEMETRY_PXX2, }; enum DisplayTrims @@ -512,8 +465,6 @@ enum DisplayTrims DISPLAY_TRIMS_ALWAYS }; -#define TOTAL_EEPROM_USAGE (sizeof(ModelData)*MAX_MODELS + sizeof(RadioData)) - extern RadioData g_eeGeneral; extern ModelData g_model; diff --git a/radio/src/pulses/dsm2_arm.cpp b/radio/src/pulses/dsm2_arm.cpp index 99b6506b0..97a4a4818 100644 --- a/radio/src/pulses/dsm2_arm.cpp +++ b/radio/src/pulses/dsm2_arm.cpp @@ -125,10 +125,10 @@ void setupPulsesDSM2(uint8_t port) modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; switch (s_current_protocol[port]) { - case PROTO_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_LP45: dsmDat[0] = 0x00; break; - case PROTO_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSM2: dsmDat[0] = 0x10; break; default: // DSMX diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 6a0739149..3fe9977cf 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -51,7 +51,7 @@ enum ModuleFlag #endif #if defined(DSM2) - #define IS_DSM2_PROTOCOL(protocol) (protocol>=PROTO_DSM2_LP45 && protocol<=PROTO_DSM2_DSMX) + #define IS_DSM2_PROTOCOL(protocol) (protocol>=PROTOCOL_CHANNELS_DSM2_LP45 && protocol<=PROTOCOL_CHANNELS_DSM2_DSMX) #else #define IS_DSM2_PROTOCOL(protocol) (0) #endif @@ -63,7 +63,7 @@ enum ModuleFlag #endif #if defined(MULTIMODULE) - #define IS_MULTIMODULE_PROTOCOL(protocol) (protocol==PROTO_MULTIMODULE) + #define IS_MULTIMODULE_PROTOCOL(protocol) (protocol==PROTOCOL_CHANNELS_MULTIMODULE) #if !defined(DSM2) #error You need to enable DSM2 = PPM for MULTIMODULE support #endif @@ -71,7 +71,7 @@ enum ModuleFlag #define IS_MULTIMODULE_PROTOCOL(protocol) (0) #endif - #define IS_SBUS_PROTOCOL(protocol) (protocol == PROTO_SBUS) + #define IS_SBUS_PROTOCOL(protocol) (protocol == PROTOCOL_CHANNELS_SBUS) #include "pulses_arm.h" diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index f91a36194..4cd7ab383 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -19,11 +19,8 @@ */ #include "opentx.h" - -#if defined(PXX2) #include "io/pxx2.h" #include "pulses/pxx2.h" -#endif uint8_t s_pulses_paused = 0; uint8_t s_current_protocol[NUM_MODULES] = { MODULES_INIT(255) }; @@ -47,14 +44,14 @@ uint8_t getRequiredProtocol(uint8_t port) switch (g_model.moduleData[INTERNAL_MODULE].type) { #if defined(TARANIS_INTERNAL_PPM) case MODULE_TYPE_PPM: - required_protocol = PROTO_PPM; + required_protocol = PROTOCOL_CHANNELS_PPM; break; #endif case MODULE_TYPE_XJT: - required_protocol = PROTO_PXX; + required_protocol = PROTOCOL_CHANNELS_PXX; break; default: - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; break; } break; @@ -63,30 +60,32 @@ uint8_t getRequiredProtocol(uint8_t port) default: switch (g_model.moduleData[EXTERNAL_MODULE].type) { case MODULE_TYPE_PPM: - required_protocol = PROTO_PPM; + required_protocol = PROTOCOL_CHANNELS_PPM; break; case MODULE_TYPE_XJT: + required_protocol = PROTOCOL_CHANNELS_PXX; + break; case MODULE_TYPE_R9M: - required_protocol = PROTO_PXX_EXTERNAL_MODULE; // either PXX or PXX2 depending on compilation options + required_protocol = PROTOCOL_CHANNELS_PXX2; break; case MODULE_TYPE_SBUS: - required_protocol = PROTO_SBUS; + required_protocol = PROTOCOL_CHANNELS_SBUS; break; #if defined(MULTIMODULE) case MODULE_TYPE_MULTIMODULE: - required_protocol = PROTO_MULTIMODULE; + required_protocol = PROTOCOL_CHANNELS_MULTIMODULE; break; #endif #if defined(DSM2) case MODULE_TYPE_DSM2: - required_protocol = limit(PROTO_DSM2_LP45, PROTO_DSM2_LP45+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, PROTO_DSM2_DSMX); + required_protocol = limit(PROTOCOL_CHANNELS_DSM2_LP45, PROTOCOL_CHANNELS_DSM2_LP45+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, PROTOCOL_CHANNELS_DSM2_DSMX); // The module is set to OFF during one second before BIND start { static tmr10ms_t bindStartTime = 0; if (moduleFlag[EXTERNAL_MODULE] == MODULE_BIND) { if (bindStartTime == 0) bindStartTime = get_tmr10ms(); if ((tmr10ms_t)(get_tmr10ms() - bindStartTime) < 100) { - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; break; } } @@ -98,24 +97,24 @@ uint8_t getRequiredProtocol(uint8_t port) #endif #if defined(CROSSFIRE) case MODULE_TYPE_CROSSFIRE: - required_protocol = PROTO_CROSSFIRE; + required_protocol = PROTOCOL_CHANNELS_CROSSFIRE; break; #endif default: - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; break; } break; } if (s_pulses_paused) { - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; } #if 0 // will need an EEPROM conversion if (moduleFlag[port] == MODULE_OFF) { - required_protocol = PROTO_NONE; + required_protocol = PROTOCOL_CHANNELS_NONE; } #endif @@ -146,38 +145,36 @@ void setupPulses(uint8_t port) if (s_current_protocol[port] != required_protocol) { init_needed = true; switch (s_current_protocol[port]) { // stop existing protocol hardware - case PROTO_PXX: + case PROTOCOL_CHANNELS_PXX: disable_pxx(port); break; #if defined(DSM2) - case PROTO_DSM2_LP45: - case PROTO_DSM2_DSM2: - case PROTO_DSM2_DSMX: + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: disable_serial(port); break; #endif #if defined(CROSSFIRE) - case PROTO_CROSSFIRE: + case PROTOCOL_CHANNELS_CROSSFIRE: disable_module_timer(port); break; #endif -#if defined(PXX2) - case PROTO_PXX2: + case PROTOCOL_CHANNELS_PXX2: disable_module_timer(port); break; -#endif #if defined(MULTIMODULE) - case PROTO_MULTIMODULE: + case PROTOCOL_CHANNELS_MULTIMODULE: #endif - case PROTO_SBUS: + case PROTOCOL_CHANNELS_SBUS: disable_serial(port); break; - case PROTO_PPM: + case PROTOCOL_CHANNELS_PPM: disable_ppm(port); break; @@ -190,28 +187,28 @@ void setupPulses(uint8_t port) // Set up output data here switch (required_protocol) { - case PROTO_PXX: + case PROTOCOL_CHANNELS_PXX: setupPulsesPXX(port); scheduleNextMixerCalculation(port, PXX_PERIOD); break; - case PROTO_SBUS: + case PROTOCOL_CHANNELS_SBUS: setupPulsesSbus(port); scheduleNextMixerCalculation(port, SBUS_PERIOD); break; #if defined(DSM2) - case PROTO_DSM2_LP45: - case PROTO_DSM2_DSM2: - case PROTO_DSM2_DSMX: + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: setupPulsesDSM2(port); scheduleNextMixerCalculation(port, DSM2_PERIOD); break; #endif #if defined(CROSSFIRE) - case PROTO_CROSSFIRE: - if (telemetryProtocol == PROTOCOL_PULSES_CROSSFIRE && !init_needed) { + case PROTOCOL_CHANNELS_CROSSFIRE: + if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE && !init_needed) { uint8_t * crossfire = modulePulsesData[port].crossfire.pulses; uint8_t len; #if defined(LUA) @@ -232,26 +229,25 @@ void setupPulses(uint8_t port) break; #endif -#if defined(PXX2) - case PROTO_PXX2: - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT && !init_needed) { + case PROTOCOL_CHANNELS_PXX2: + // here we have to wait that telemetryInit() is called, hence this test + if (telemetryProtocol == PROTOCOL_TELEMETRY_PXX2 && !init_needed) { modulePulsesData[port].pxx2.setupFrame(port); sportSendBuffer(modulePulsesData[port].pxx2.getData(), modulePulsesData[port].pxx2.getSize()); } scheduleNextMixerCalculation(port, PXX2_PERIOD); break; -#endif #if defined(MULTIMODULE) - case PROTO_MULTIMODULE: + case PROTOCOL_CHANNELS_MULTIMODULE: setupPulsesMultimodule(port); scheduleNextMixerCalculation(port, MULTIMODULE_PERIOD); break; #endif - case PROTO_PPM: + case PROTOCOL_CHANNELS_PPM: #if defined(PCBSKY9X) - case PROTO_NONE: + case PROTOCOL_CHANNELS_NONE: #endif setupPulsesPPMModule(port); scheduleNextMixerCalculation(port, PPM_PERIOD(port)); @@ -263,41 +259,39 @@ void setupPulses(uint8_t port) if (init_needed) { switch (required_protocol) { // Start new protocol hardware here - case PROTO_PXX: + case PROTOCOL_CHANNELS_PXX: init_pxx(port); break; #if defined(DSM2) - case PROTO_DSM2_LP45: - case PROTO_DSM2_DSM2: - case PROTO_DSM2_DSMX: + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: init_serial(port, DSM2_BAUDRATE, DSM2_PERIOD * 2000); break; #endif #if defined(CROSSFIRE) - case PROTO_CROSSFIRE: + case PROTOCOL_CHANNELS_CROSSFIRE: init_module_timer(port, CROSSFIRE_PERIOD, true); break; #endif -#if defined(PXX2) - case PROTO_PXX2: + case PROTOCOL_CHANNELS_PXX2: init_module_timer(port, PXX2_PERIOD, true); break; -#endif #if defined(MULTIMODULE) - case PROTO_MULTIMODULE: + case PROTOCOL_CHANNELS_MULTIMODULE: init_serial(port, MULTIMODULE_BAUDRATE, MULTIMODULE_PERIOD * 2000); break; #endif - case PROTO_SBUS: + case PROTOCOL_CHANNELS_SBUS: init_serial(port, SBUS_BAUDRATE, SBUS_PERIOD_HALF_US); break; - case PROTO_PPM: + case PROTOCOL_CHANNELS_PPM: init_ppm(port); break; diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 744abb07b..3c7311988 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -82,9 +82,7 @@ union ModulePulsesData { PwmPxxPulses pxx; #endif -#if defined(PXX2) Pxx2Pulses pxx2; -#endif #if defined(PPM_PIN_SERIAL) Dsm2SerialPulsesData dsm2; diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 51110e88b..3acf9aaa1 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -132,13 +132,7 @@ set(PULSES_SRC ppm_arm.cpp pxx.cpp pxx1.cpp + pxx2.cpp dsm2_arm.cpp sbus_arm.cpp ) - -if(PXX2) - set(PULSES_SRC - ${PULSES_SRC} - pxx2.cpp - ) -endif() diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index a930fd227..b372d8744 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -124,7 +124,7 @@ extern "C" void INTMODULE_DMA_STREAM_IRQHandler(void) void intmoduleSendNextFrame() { - if (s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) { + if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(INTMODULE_DMA_STREAM); DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL; diff --git a/radio/src/targets/common/arm/stm32/serial2_driver.cpp b/radio/src/targets/common/arm/stm32/serial2_driver.cpp index 049f09374..cb39d4173 100644 --- a/radio/src/targets/common/arm/stm32/serial2_driver.cpp +++ b/radio/src/targets/common/arm/stm32/serial2_driver.cpp @@ -97,7 +97,7 @@ void serial2Init(unsigned int mode, unsigned int protocol) break; #endif case UART_MODE_TELEMETRY: - if (protocol == PROTOCOL_FRSKY_D_SECONDARY) { + if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { uart3Setup(FRSKY_D_BAUDRATE, true); } break; diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 724c16837..630db99c1 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -215,7 +215,7 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) void extmoduleSendNextFrame() { - if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PPM) { + if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { #if defined(PCBX10) || PCBREV >= 13 EXTMODULE_TIMER->CCR3 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); @@ -234,7 +234,7 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses; EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PXX) { + else if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { EXTMODULE_TIMER->CCR2 = modulePulsesData[EXTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA #if defined(PCBX10) || PCBREV >= 13 diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index 8541c0742..b7df7b3ef 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -175,7 +175,7 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) if (DMA_GetITStatus(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC)) { DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); TELEMETRY_USART->CR1 |= USART_CR1_TCIE; - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { outputTelemetryBufferSize = 0; outputTelemetryBufferTrigger = 0x7E; } @@ -205,7 +205,7 @@ extern "C" void TELEMETRY_USART_IRQHandler(void) else { telemetryNoDMAFifo.push(data); #if defined(LUA) - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { static uint8_t prevdata; if (prevdata == 0x7E && outputTelemetryBufferSize > 0 && data == outputTelemetryBufferTrigger) { sportSendBuffer(outputTelemetryBuffer, outputTelemetryBufferSize); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 522ae7ba0..2e15ba244 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -238,7 +238,7 @@ void extmodulePxxStart() void extmoduleSendNextFrame() { - if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PPM) { + if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { EXTMODULE_TIMER->CCR1 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance @@ -249,7 +249,7 @@ void extmoduleSendNextFrame() EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses; EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (s_current_protocol[EXTERNAL_MODULE] == PROTO_PXX) { + else if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { #if defined(EXTMODULE_USART) DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(EXTMODULE_USART_DMA_STREAM); diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 1999dc796..4610474a6 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -60,7 +60,7 @@ void intmoduleNoneStart() void intmoduleSendNextFrame() { - if (s_current_protocol[INTERNAL_MODULE] == PROTO_PXX) { + if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { INTMODULE_TIMER->CCR2 = modulePulsesData[INTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; @@ -70,7 +70,7 @@ void intmoduleSendNextFrame() INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } #if defined(TARANIS_INTERNAL_PPM) - else if (s_current_protocol[INTERNAL_MODULE] == PROTO_PPM) { + else if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { INTMODULE_TIMER->CCR3 = GET_PPM_DELAY(INTERNAL_MODULE)*2; INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); INTMODULE_TIMER->CCR2 = *(modulePulsesData[INTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index f3b58159e..56ce4fe58 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -127,7 +127,7 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) if (DMA_GetITStatus(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC)) { DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); TELEMETRY_USART->CR1 |= USART_CR1_TCIE; - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { outputTelemetryBufferSize = 0; outputTelemetryBufferTrigger = 0x7E; } @@ -157,7 +157,7 @@ extern "C" void TELEMETRY_USART_IRQHandler(void) else { telemetryFifo.push(data); #if defined(LUA) - if (telemetryProtocol == PROTOCOL_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { static uint8_t prevdata; if (prevdata == 0x7E && outputTelemetryBufferSize > 0 && data == outputTelemetryBufferTrigger) { sportSendBuffer(outputTelemetryBuffer, outputTelemetryBufferSize); @@ -174,7 +174,7 @@ extern "C" void TELEMETRY_USART_IRQHandler(void) uint8_t telemetryGetByte(uint8_t * byte) { #if defined(SERIAL2) - if (telemetryProtocol == PROTOCOL_FRSKY_D_SECONDARY) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { if (serial2Mode == UART_MODE_TELEMETRY) return serial2RxFifo.pop(*byte); else diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index e138dcf62..4ab190259 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -23,6 +23,7 @@ #include "../definitions.h" #include "telemetry_holders.h" +#include "io/pxx2.h" // Receive buffer state machine state enum enum FrSkyDataState { @@ -32,12 +33,7 @@ enum FrSkyDataState { STATE_DATA_XOR, }; -#if defined(PXX2) -#include "io/pxx2.h" -#define FRSKY_SPORT_BAUDRATE PXX2_BAUDRATE -#else #define FRSKY_SPORT_BAUDRATE 57600 -#endif #define FRSKY_D_BAUDRATE 9600 diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 95af31711..cfa7cb7ec 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -42,21 +42,21 @@ uint8_t serialInversion = 0; void processTelemetryData(uint8_t data) { #if defined(CROSSFIRE) - if (telemetryProtocol == PROTOCOL_PULSES_CROSSFIRE) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) { processCrossfireTelemetryData(data); return; } #endif #if defined(MULTIMODULE) - if (telemetryProtocol == PROTOCOL_SPEKTRUM) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_SPEKTRUM) { processSpektrumTelemetryData(data); return; } - if (telemetryProtocol == PROTOCOL_FLYSKY_IBUS) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FLYSKY_IBUS) { processFlySkyTelemetryData(data); return; } - if (telemetryProtocol == PROTOCOL_MULTIMODULE) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE) { processMultiTelemetryData(data); return; } @@ -67,15 +67,18 @@ void processTelemetryData(uint8_t data) void telemetryWakeup() { uint8_t requiredTelemetryProtocol = modelTelemetryProtocol(); + #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); } +#else + if (telemetryProtocol != requiredTelemetryProtocol) { + telemetryInit(requiredTelemetryProtocol); + } +#endif #if defined(STM32) uint8_t data; @@ -87,7 +90,7 @@ void telemetryWakeup() } while (telemetryGetByte(&data)); } #elif defined(PCBSKY9X) - if (telemetryProtocol == PROTOCOL_FRSKY_D_SECONDARY) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { uint8_t data; while (telemetrySecondPortReceive(data)) { processTelemetryData(data); @@ -99,7 +102,6 @@ void telemetryWakeup() } #endif - for (int i=0; iid == RSSI_ID) { return false; } @@ -42,7 +42,7 @@ bool isFaiForbidden(source_t idx) } break; - case PROTOCOL_FRSKY_D: + case PROTOCOL_TELEMETRY_FRSKY_D: if (sensor->id == D_RSSI_ID) { return false; } @@ -52,7 +52,7 @@ bool isFaiForbidden(source_t idx) break; #if defined(CROSSFIRE) - case PROTOCOL_PULSES_CROSSFIRE: + case PROTOCOL_TELEMETRY_CROSSFIRE: if (sensor->id == RX_RSSI1_INDEX) { return false; } diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 20b40cd90..6afecd4cf 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -149,7 +149,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -157,21 +157,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POZ""NEG" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 94520161b..375b90271 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -152,7 +152,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -160,21 +160,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 920dce585..1a146c9c2 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -151,7 +151,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -159,22 +159,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 9526692a3..9ad62dbfe 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -151,7 +151,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -159,21 +159,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 2b29e1140..edef72c5c 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -151,7 +151,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -159,21 +159,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index b6b62a7e5..a3e02c61c 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -151,7 +151,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -159,21 +159,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SLV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 4cc640c15..ab43b7d9f 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -151,7 +151,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -159,21 +159,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 1091d3ae1..c5f7d83fb 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -153,7 +153,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -161,21 +161,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index f24c2846e..a2ae231d9 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -152,7 +152,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -160,21 +160,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POZ""NEG" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 61de3d069..bfebabbd3 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -150,7 +150,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -158,21 +158,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - - #define TR_XPPM - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "POS""NEG" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 7bc236511..df237ea5a 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -149,7 +149,7 @@ #if defined(PXX) #define TR_PXX "PXX\0 " -#elif defined(DSM2) || defined(IRPROTOS) +#elif defined(DSM2) #define TR_PXX "[PXX]\0" #else #define TR_PXX @@ -157,19 +157,11 @@ #if defined(DSM2) #define TR_DSM2 "LP45\0 ""DSM2\0 ""DSMX\0 " -#elif defined(IRPROTOS) - #define TR_DSM2 "[LP45]""[DSM2]""[DSMX]" #else #define TR_DSM2 #endif -#if defined(IRPROTOS) - #define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" -#else - #define TR_IRPROTOS -#endif - -#define TR_VPROTOS "PPM\0 " TR_XPPM TR_PXX TR_DSM2 TR_IRPROTOS +#define TR_VPROTOS "PPM\0 " TR_PXX TR_DSM2 #define LEN_POSNEG "\003" #define TR_POSNEG "Pos""Neg" From 659144e093b071c493bc7650cff1a9d325a04c86 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 28 Nov 2018 18:16:36 +0100 Subject: [PATCH 021/446] Compilation fixes --- radio/src/targets/sky9x/pulses_driver.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index 02f8d5cf5..34f24f2cf 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -261,7 +261,7 @@ extern "C" void PWM_IRQHandler(void) if (reason & PWM_ISR1_CHID3) { // Use the current protocol, don't switch until set_up_pulses switch (s_current_protocol[EXTERNAL_MODULE]) { - case PROTO_PXX: + case PROTOCOL_CHANNELS_PXX: // Alternate periods of 6.5mS and 2.5 mS period = pwmptr->PWM_CH_NUM[3].PWM_CPDR; if (period == 2500 * 2) { @@ -284,9 +284,9 @@ extern "C" void PWM_IRQHandler(void) } break; - case PROTO_DSM2_LP45: - case PROTO_DSM2_DSM2: - case PROTO_DSM2_DSMX: + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: // Alternate periods of 19.5mS and 2.5 mS period = pwmptr->PWM_CH_NUM[3].PWM_CPDR; if (period == 2500 * 2) { @@ -309,9 +309,9 @@ extern "C" void PWM_IRQHandler(void) break; #if defined(MULTIMODULE) - case PROTO_MULTIMODULE: + case PROTOCOL_CHANNELS_MULTIMODULE: #endif - case PROTO_SBUS: + case PROTOCOL_CHANNELS_SBUS: // Todo: how to do inverted polarity on this platform? // Alternate periods of 5.5mS and 3.5 mS period = pwmptr->PWM_CH_NUM[3].PWM_CPDR; From ae91903d57c9c91c3e65a42321df46cce7994fea Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 28 Nov 2018 18:17:47 +0100 Subject: [PATCH 022/446] Compilation fixes --- radio/src/telemetry/frsky.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 4ab190259..05bd3e14f 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -23,7 +23,7 @@ #include "../definitions.h" #include "telemetry_holders.h" -#include "io/pxx2.h" +#include "../io/pxx2.h" // Receive buffer state machine state enum enum FrSkyDataState { From 9c096b76b35e05136128526fee4f29f083f37e00 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 28 Nov 2018 18:53:44 +0100 Subject: [PATCH 023/446] Compilation fixes --- radio/src/targets/sky9x/board.h | 8 +++++++- radio/src/targets/sky9x/pulses_driver.cpp | 16 ++++++++++++++++ radio/src/targets/sky9x/telemetry_driver.cpp | 9 ++++----- radio/src/telemetry/telemetry.cpp | 1 - radio/src/telemetry/telemetry.h | 3 +-- 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index c49fd1119..07861eb69 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -261,6 +261,8 @@ void init_pxx(uint32_t port); void disable_pxx(uint32_t port); void init_serial(uint32_t port, uint32_t baudrate, uint32_t period_half_us); void disable_serial(uint32_t port); +void init_module_timer( uint32_t module_index, uint32_t period, uint8_t state); +void disable_module_timer( uint32_t module_index); // SD driver #if defined(SIMU) @@ -405,8 +407,12 @@ void debugPutc(const char c); // Telemetry driver void telemetryPortInit(uint32_t baudrate, uint8_t mode); uint32_t telemetryTransmitPending(); -void telemetryTransmitBuffer(uint8_t * buffer, uint32_t size); +void telemetryTransmitBuffer(const uint8_t * buffer, uint32_t size); void rxPdcUsart( void (*pChProcess)(uint8_t x) ); +inline void sportSendBuffer(const uint8_t * buffer, uint32_t size) +{ + telemetryTransmitBuffer(buffer, size); +} // Second UART driver void serial2TelemetryInit(unsigned int protocol); diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index 34f24f2cf..4764b1c43 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -129,6 +129,22 @@ void init_no_pulses(uint32_t port) } } +void init_module_timer(uint32_t port, uint32_t period, uint8_t state) +{ + if (port == EXTERNAL_MODULE) { + // TODO use period here + init_main_ppm(3000, 0); + } +} + +void disable_module_timer(uint32_t port) +{ + if (port == EXTERNAL_MODULE) { + disable_ppm(EXTERNAL_MODULE); + } +} + + void disable_no_pulses(uint32_t port) { if (port == EXTERNAL_MODULE) { diff --git a/radio/src/targets/sky9x/telemetry_driver.cpp b/radio/src/targets/sky9x/telemetry_driver.cpp index e9dc3edaa..e26a63be6 100644 --- a/radio/src/targets/sky9x/telemetry_driver.cpp +++ b/radio/src/targets/sky9x/telemetry_driver.cpp @@ -135,12 +135,11 @@ void rxPdcUsart( void (*pChProcess)(uint8_t x) ) #endif } -uint32_t txPdcUsart(uint8_t *buffer, uint32_t size) +uint32_t txPdcUsart(const uint8_t * buffer, uint32_t size) { - Usart *pUsart = SECOND_USART; + Usart * pUsart = SECOND_USART; - if ( pUsart->US_TNCR == 0 ) - { + if (pUsart->US_TNCR == 0) { #ifndef SIMU pUsart->US_TNPR = (uint32_t)buffer ; #endif @@ -174,7 +173,7 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) #endif } -void telemetryTransmitBuffer(uint8_t * buffer, uint32_t size) +void telemetryTransmitBuffer(const uint8_t * buffer, uint32_t size) { txPdcUsart(buffer, size); } diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index cfa7cb7ec..b40033783 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -38,7 +38,6 @@ uint8_t telemetryProtocol = 255; uint8_t serialInversion = 0; #endif - void processTelemetryData(uint8_t data) { #if defined(CROSSFIRE) diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 1b97a850e..3170bae7f 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -97,7 +97,6 @@ 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); @@ -107,7 +106,7 @@ void frskyDSetDefault(int index, uint16_t id); #define IS_SPEED_UNIT(unit) ((unit) >= UNIT_KTS && (unit) <= UNIT_MPH) extern uint8_t telemetryProtocol; -#define IS_FRSKY_D_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_D) + #if defined (MULTIMODULE) #define IS_D16_MULTI() ((g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false) == MM_RF_PROTO_FRSKY) && (g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH)) #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && IS_D16_MULTI())) From 6568752559c343a0875476fb18e0330ceabce9fb Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 28 Nov 2018 19:39:12 +0100 Subject: [PATCH 024/446] PXX2 Rx side should be OK now --- radio/src/telemetry/frsky.cpp | 22 ++++++++++++++++------ radio/src/telemetry/frsky.h | 25 ++----------------------- radio/src/telemetry/frsky_sport.cpp | 17 +++++++++++------ radio/src/telemetry/telemetry.cpp | 6 ++++++ 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index e1ee9fa20..e2c072e2d 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -20,8 +20,16 @@ #include "opentx.h" -#if defined(PXX2) -void processFrskyTelemetryData(uint8_t data) +bool checkPXX2PacketCRC(const uint8_t * packet) +{ + // TODO ... + + return true; + // TRACE("checkPXX2PacketCRC(): checksum error "); + // DUMP(packet, FRSKY_SPORT_PACKET_SIZE); +} + +void processFrskyPXX2Data(uint8_t data) { static uint8_t dataState = STATE_DATA_IDLE; @@ -41,8 +49,10 @@ void processFrskyTelemetryData(uint8_t data) } else if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) { telemetryRxBuffer[telemetryRxBufferCount++] = data; - if (telemetryRxBuffer[0] + 2 == telemetryRxBufferCount) { - sportProcessPacket(telemetryRxBuffer + 2); + if (telemetryRxBuffer[0] + 3 /* 1 byte for length, 2 bytes for CRC */ == telemetryRxBufferCount) { + if (checkPXX2PacketCRC(telemetryRxBuffer)) { + sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); + } telemetryRxBufferCount = 0; dataState = STATE_DATA_IDLE; } @@ -55,7 +65,7 @@ void processFrskyTelemetryData(uint8_t data) break; } } -#else + void processFrskyTelemetryData(uint8_t data) { static uint8_t dataState = STATE_DATA_IDLE; @@ -137,4 +147,4 @@ void processFrskyTelemetryData(uint8_t data) } #endif } -#endif + diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 05bd3e14f..c2a99d802 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -202,7 +202,6 @@ enum FrSkyDataState { #define DATA_ID_SP2UH 0x45 // 5 #define DATA_ID_SP2UR 0xC6 // 6 - #if defined(NO_RAS) #define IS_RAS_VALUE_VALID() (false) #elif defined(PCBX10) @@ -215,13 +214,6 @@ enum FrSkyDataState { #define IS_HIDDEN_TELEMETRY_VALUE(id) ((id == SP2UART_A_ID) || (id == SP2UART_B_ID) || (id == XJT_VERSION_ID) || (id == RAS_ID) || (id == FACT_TEST_ID)) -enum AlarmLevel { - alarm_off = 0, - alarm_yellow = 1, - alarm_orange = 2, - alarm_red = 3 -}; - #define ALARM_GREATER(channel, alarm) ((g_model.frsky.channels[channel].alarms_greater >> alarm) & 1) #define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3) @@ -283,11 +275,11 @@ typedef enum { // FrSky D Telemetry Protocol void processHubPacket(uint8_t id, int16_t value); -void frskyDSendNextAlarm(); void frskyDProcessPacket(const uint8_t *packet); // FrSky S.PORT Telemetry Protocol void sportProcessTelemetryPacket(const uint8_t * packet); +void sportProcessTelemetryPacketWithoutCrc(const uint8_t * packet); void telemetryWakeup(); void telemetryReset(); @@ -307,14 +299,6 @@ enum TelemetryProtocol TELEM_PROTO_FLYSKY_IBUS, }; -enum TelemAnas { - TELEM_ANA_A1, - TELEM_ANA_A2, - TELEM_ANA_A3, - TELEM_ANA_A4, - TELEM_ANA_COUNT -}; - struct TelemetryData { TelemetryValueWithMin swr; // TODO Min not needed TelemetryValueWithMin rssi; // TODO Min not needed @@ -324,12 +308,7 @@ struct TelemetryData { extern TelemetryData telemetryData; - typedef uint16_t frskyCellVoltage_t; - -void frskySetCellsCount(uint8_t cellscount); -void frskySetCellVoltage(uint8_t battnumber, frskyCellVoltage_t cellVolts); -void frskyUpdateCells(); - void processFrskyTelemetryData(uint8_t data); +void processFrskyPXX2Data(uint8_t data); #endif // _FRSKY_H_ diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 9369c3024..a0b8fc33f 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -92,7 +92,7 @@ const FrSkySportSensor * getFrSkySportSensor(uint16_t id, uint8_t subId=0) return result; } -bool checkSportPacket(const uint8_t *packet) +bool checkSportPacket(const uint8_t * packet) { short crc = 0; for (int i=1; i Date: Thu, 29 Nov 2018 07:42:30 +0100 Subject: [PATCH 025/446] Stupip bug, missing return! --- radio/src/telemetry/telemetry.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 667376e30..96124792c 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -64,6 +64,7 @@ void processTelemetryData(uint8_t data) if (telemetryProtocol == PROTOCOL_TELEMETRY_PXX2) { processFrskyPXX2Data(data); + return; } processFrskyTelemetryData(data); From a830a968eca8cf106f3ca30d2bb9a610c783e61d Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 29 Nov 2018 15:42:42 +0100 Subject: [PATCH 026/446] Compilation fix --- radio/src/targets/sky9x/board.h | 9 +++------ radio/src/targets/sky9x/telemetry_driver.cpp | 7 ++++++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index 07861eb69..d12b6b046 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.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 * @@ -60,7 +60,7 @@ enum EnumKeys KEY_PLUS = KEY_UP, KEY_RIGHT, KEY_LEFT, - + TRM_BASE, TRM_LH_DWN = TRM_BASE, TRM_LH_UP, @@ -409,10 +409,7 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode); uint32_t telemetryTransmitPending(); void telemetryTransmitBuffer(const uint8_t * buffer, uint32_t size); void rxPdcUsart( void (*pChProcess)(uint8_t x) ); -inline void sportSendBuffer(const uint8_t * buffer, uint32_t size) -{ - telemetryTransmitBuffer(buffer, size); -} +void sportSendBuffer(const uint8_t * buffer, uint32_t size); // Second UART driver void serial2TelemetryInit(unsigned int protocol); diff --git a/radio/src/targets/sky9x/telemetry_driver.cpp b/radio/src/targets/sky9x/telemetry_driver.cpp index e26a63be6..4875c5d35 100644 --- a/radio/src/targets/sky9x/telemetry_driver.cpp +++ b/radio/src/targets/sky9x/telemetry_driver.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 * @@ -173,6 +173,11 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) #endif } +void sportSendBuffer(const uint8_t * buffer, uint32_t size) +{ + telemetryTransmitBuffer(buffer, size); +} + void telemetryTransmitBuffer(const uint8_t * buffer, uint32_t size) { txPdcUsart(buffer, size); From 1e448b09a9c249b6b0ad363f1c7a587cf9c62b75 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 2 Dec 2018 09:10:08 +0100 Subject: [PATCH 027/446] RSSI handling --- radio/src/telemetry/frsky.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index e2c072e2d..94349eaed 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -51,6 +51,12 @@ void processFrskyPXX2Data(uint8_t data) telemetryRxBuffer[telemetryRxBufferCount++] = data; if (telemetryRxBuffer[0] + 3 /* 1 byte for length, 2 bytes for CRC */ == telemetryRxBufferCount) { if (checkPXX2PacketCRC(telemetryRxBuffer)) { + if (telemetryRxBuffer[2] & 0x80) { + telemetryData.rssi.set(telemetryRxBuffer[2] & 0x7f); + } + else { + // TODO : vbat handling + } sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); } telemetryRxBufferCount = 0; From ddcb104372309b543e9d7706548444cb8900beb5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 2 Dec 2018 10:30:43 +0100 Subject: [PATCH 028/446] Create RSSI and VBAT sensor from pxx1.5 data stream --- radio/src/telemetry/frsky.cpp | 12 ++++++++++-- radio/src/telemetry/frsky_sport.cpp | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 94349eaed..c863e2ee2 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -29,6 +29,14 @@ bool checkPXX2PacketCRC(const uint8_t * packet) // DUMP(packet, FRSKY_SPORT_PACKET_SIZE); } +void createFrSkyPXX2Sensor(uint16_t type, uint8_t value){ + uint8_t buffer[5] = {0x18, 0x10, 0, 0, 0}; + buffer[2] = type & 0xF; + buffer[3] = type >> 8; + buffer[4] = value; + sportProcessTelemetryPacketWithoutCrc(buffer); +} + void processFrskyPXX2Data(uint8_t data) { static uint8_t dataState = STATE_DATA_IDLE; @@ -52,10 +60,10 @@ void processFrskyPXX2Data(uint8_t data) if (telemetryRxBuffer[0] + 3 /* 1 byte for length, 2 bytes for CRC */ == telemetryRxBufferCount) { if (checkPXX2PacketCRC(telemetryRxBuffer)) { if (telemetryRxBuffer[2] & 0x80) { - telemetryData.rssi.set(telemetryRxBuffer[2] & 0x7f); + createFrSkyPXX2Sensor(RSSI_ID, telemetryRxBuffer[2] & 0x7f); } else { - // TODO : vbat handling + createFrSkyPXX2Sensor(BATT_ID, telemetryRxBuffer[2] & 0x7f); } sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); } diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index a0b8fc33f..0b5224de5 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -154,6 +154,8 @@ void sportProcessTelemetryPacketWithoutCrc(const uint8_t * packet) uint16_t id = *((uint16_t *)(packet+2)); uint32_t data = SPORT_DATA_S32(packet); + TRACE("%x %x %x %x\n", physicalId, primId, id,SPORT_DATA_U8(packet) ); + if (primId == DATA_FRAME) { uint8_t instance = physicalId + 1; if (id == RSSI_ID && isValidIdAndInstance(RSSI_ID, instance)) { From 6e84afe436baa003c77453f3f681445beaa5cde0 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 2 Dec 2018 11:24:13 +0100 Subject: [PATCH 029/446] Add R9M dynamic power sensor --- radio/src/telemetry/frsky.cpp | 3 +++ radio/src/telemetry/frsky.h | 2 ++ radio/src/telemetry/frsky_sport.cpp | 7 +++++-- radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 14 files changed, 21 insertions(+), 2 deletions(-) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index c863e2ee2..2dc8578f7 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -65,6 +65,9 @@ void processFrskyPXX2Data(uint8_t data) else { createFrSkyPXX2Sensor(BATT_ID, telemetryRxBuffer[2] & 0x7f); } + if((telemetryRxBuffer[3] & 0x04) == 0) { + createFrSkyPXX2Sensor(R9_PWR_ID, (telemetryRxBuffer[3] & 0x03); + } sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); } telemetryRxBufferCount = 0; diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index c2a99d802..7b789edeb 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -192,6 +192,8 @@ enum FrSkyDataState { #define XJT_VERSION_ID 0xf106 #define FUEL_QTY_FIRST_ID 0x0a10 #define FUEL_QTY_LAST_ID 0x0a1f +#define R9_PWR_ID 0xf107 // TODO: *CRITICAL* agree on ID with FrSky, this value is just a placeholder + // Default sensor data IDs (Physical IDs + CRC) #define DATA_ID_VARIO 0x00 // 0 diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 0b5224de5..7cc80ff36 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -36,6 +36,7 @@ const FrSkySportSensor sportSensors[] = { { A3_FIRST_ID, A3_LAST_ID, 0, ZSTR_A3, UNIT_VOLTS, 2 }, { A4_FIRST_ID, A4_LAST_ID, 0, ZSTR_A4, UNIT_VOLTS, 2 }, { BATT_ID, BATT_ID, 0, ZSTR_BATT, UNIT_VOLTS, 1 }, + { R9_PWR_ID, R9_PWR_ID, 0, ZSTR_R9PW, UNIT_MILLIWATTS, 0 }, { T1_FIRST_ID, T1_LAST_ID, 0, ZSTR_TEMP1, UNIT_CELSIUS, 0 }, { T2_FIRST_ID, T2_LAST_ID, 0, ZSTR_TEMP2, UNIT_CELSIUS, 0 }, { RPM_FIRST_ID, RPM_LAST_ID, 0, ZSTR_RPM, UNIT_RPMS, 0 }, @@ -154,8 +155,6 @@ void sportProcessTelemetryPacketWithoutCrc(const uint8_t * packet) uint16_t id = *((uint16_t *)(packet+2)); uint32_t data = SPORT_DATA_S32(packet); - TRACE("%x %x %x %x\n", physicalId, primId, id,SPORT_DATA_U8(packet) ); - if (primId == DATA_FRAME) { uint8_t instance = physicalId + 1; if (id == RSSI_ID && isValidIdAndInstance(RSSI_ID, instance)) { @@ -166,6 +165,10 @@ void sportProcessTelemetryPacketWithoutCrc(const uint8_t * packet) else telemetryData.rssi.set(data); } + else if (id == R9_PWR_ID) { + uint32_t r9pwr[] = {100, 200, 500, 1000}; + data = r9pwr[SPORT_DATA_U8(packet) & 0x03]; + } else if (id == XJT_VERSION_ID) { telemetryData.xjtVersion = HUB_DATA_U16(packet); if (!IS_RAS_VALUE_VALID()) { diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 6afecd4cf..232c8042f 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -1182,6 +1182,7 @@ #define TR_JITTER_FILTER "ADC Filtr" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 375b90271..99f732b24 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1180,6 +1180,7 @@ #define TR_JITTER_FILTER "ADC Filter" // ---------------------------------------------------------------- #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 1a146c9c2..d83e74e5e 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1190,6 +1190,7 @@ #define TR_JITTER_FILTER "ADC filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 9ad62dbfe..95ea1e70d 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1186,6 +1186,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index edef72c5c..713f76875 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1172,6 +1172,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index a3e02c61c..e3856eb73 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1198,6 +1198,7 @@ #define TR_JITTER_FILTER "Filtre ADC" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index ab43b7d9f..8440f38c3 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1181,6 +1181,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index c5f7d83fb..47cfbf8ea 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1188,6 +1188,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index a2ae231d9..a560a2b90 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1182,6 +1182,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index bfebabbd3..6cedfde68 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1185,6 +1185,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index df237ea5a..e8ae0b8ec 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1195,6 +1195,7 @@ #define TR_JITTER_FILTER "ADC Filter" #define ZSTR_RSSI "RSSI" +#define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" #define ZSTR_A1 "A1" #define ZSTR_A2 "A2" From e6349ab68210ec2aa71e51a8b3fff78dafa64e88 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 2 Dec 2018 11:50:57 +0100 Subject: [PATCH 030/446] Compile fix --- radio/src/telemetry/frsky.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 2dc8578f7..249776c17 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -66,7 +66,7 @@ void processFrskyPXX2Data(uint8_t data) createFrSkyPXX2Sensor(BATT_ID, telemetryRxBuffer[2] & 0x7f); } if((telemetryRxBuffer[3] & 0x04) == 0) { - createFrSkyPXX2Sensor(R9_PWR_ID, (telemetryRxBuffer[3] & 0x03); + createFrSkyPXX2Sensor(R9_PWR_ID, (telemetryRxBuffer[3] & 0x03)); } sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); } From edc3d7372e274b3b6ec7fd85871249439a27e1e5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 4 Dec 2018 09:29:36 +0100 Subject: [PATCH 031/446] POC X7 --- radio/src/CMakeLists.txt | 5 --- radio/src/bitfield.h | 51 ++++++++++++++++++++++++++++ radio/src/gui/128x64/model_setup.cpp | 12 ++----- radio/src/gui/gui_common.h | 5 +-- radio/src/gui/gui_common_arm.cpp | 22 +++++++++--- radio/src/opentx.h | 1 + radio/src/pulses/pulses_arm.h | 6 ++-- radio/src/pulses/pxx2.cpp | 1 + radio/src/telemetry/frsky.cpp | 11 +++++- radio/src/telemetry/frsky.h | 3 +- radio/src/telemetry/telemetry.cpp | 7 ++-- radio/src/telemetry/telemetry.h | 3 +- radio/src/translations.h | 8 +++-- radio/util/fwoptions.py | 6 ---- 14 files changed, 104 insertions(+), 37 deletions(-) create mode 100644 radio/src/bitfield.h diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index e6c42e288..35b9922fd 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -46,7 +46,6 @@ option(TRACE_LUA_INTERNALS "Turn on traces for Lua internals" OFF) option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF) option(NANO "Use nano newlib and binalloc") option(NIGHTLY_BUILD_WARNING "Warn this is a nightly build" OFF) -option(MODULE_R9M_FLEX_FW "Add R9M options for non certified firmwwares" OFF) # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags. set(FIRMWARE_C_FLAGS "" CACHE STRING "Additional flags for firmware target c compiler (note: all CMAKE_C_FLAGS[_*] are ignored for firmware/bootloader).") @@ -312,10 +311,6 @@ if(NIGHTLY_BUILD_WARNING) add_definitions(-DNIGHTLY_BUILD_WARNING) endif(NIGHTLY_BUILD_WARNING) -if(MODULE_R9M_FLEX_FW) - add_definitions(-DMODULE_R9M_FLEX_FW) -endif() - set(SRC ${SRC} opentx.cpp diff --git a/radio/src/bitfield.h b/radio/src/bitfield.h new file mode 100644 index 000000000..84b3632b5 --- /dev/null +++ b/radio/src/bitfield.h @@ -0,0 +1,51 @@ +/* + * 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 + * + * This file is based on work published at http://www.coranac.com/documents/working-with-bits-and-bitfields + * + * 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 BITFIELD_H +#define BITFIELD_H + +// A set of bitfield handling macros +#define BF_BIT(n) ( 1<<(n) ) +#define BF_BIT_GET(y, mask) ( y & (mask) ) +#define BF_BIT_SET(y, mask) ( y |= (mask) ) +#define BF_BIT_CLEAR(y, mask) ( y &= ~(mask) ) +#define BF_BIT_FLIP(y, mask) ( y ^= (mask) ) +#define BF_SINGLE_BIT_GET(y, i) BF_BIT_GET(y, BF_BIT(i)) +#define BF_SINGLE_BIT_SET(y, i) BF_BIT_SET(y, BF_BIT(i)) + +//! Create a bitmask of length 'len'. +#define BF_BITMASK(len) ( BF_BIT(len)-1 ) + +//! Create a bitfield mask of length 'len' starting at bit 'start'. +#define BF_MASK(start, len) ( BF_BITMASK(len)<<(start) ) + +//! Prepare a bitmask for insertion or combining. +#define BF_PREP(x, start, len) ( ((x)&BF_BITMASK(len)) << (start) ) + +//! Extract a bitfield of length 'len' starting at bit 'start' from 'y'. +#define BF_GET(y, start, len) ( ((y)>>(start)) & BF_BITMASK(len) ) + +//! Insert 'len' bits of 'x 'into 'y', starting at bit 'start' from 'y'. +#define BF_SET(y, x, start, len) \ + ( y= ((y) &~ BF_MASK(start, len)) | BF_PREP(x, start, len) ) + +#endif //BITFIELD_H \ No newline at end of file diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 6b2298f09..7db9f56ea 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -161,7 +161,7 @@ enum MenuModelSetupItems { #endif #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) - #define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 + #define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 #define CURSOR_ON_CELL (true) #define MODEL_SETUP_MAX_LINES (HEADER_LINE+ITEM_MODEL_SETUP_MAX) @@ -727,7 +727,7 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); - else if (isModuleR9M(EXTERNAL_MODULE)) + else if (isR9ModuleRunning(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { @@ -1192,13 +1192,7 @@ void menuModelSetup(event_t event) } #endif if (isModuleR9M(moduleIdx)) { - lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY); - if (IS_TELEMETRY_INTERNAL_MODULE()) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); - } - else { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); - } + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, TR_R9MFLEX_FREQ, BF_GET(g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1), attr); } else if (isModuleSBUS(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_WARN_BATTVOLTAGE); diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index c48ee4463..5959484da 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -54,6 +54,7 @@ bool isSwitchAvailableInCustomFunctions(int swtch); bool isSwitchAvailableInMixes(int swtch); bool isSwitchAvailableInTimers(int swtch); bool isR9MModeAvailable(int mode); +bool isR9ModuleRunning(int module); bool isModuleAvailable(int module); bool isRfProtocolAvailable(int protocol); bool isTelemetryProtocolAvailable(int protocol); @@ -155,12 +156,12 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); #define FAILSAFE_ROWS(x) ((isModuleXJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || isModuleR9M(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW -#define EXTERNAL_MODULE_OPTION_ROW (isModuleR9M(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) +#define EXTERNAL_MODULE_OPTION_ROW (isR9ModuleRunning(EXTERNAL_MODULE) ? HIDDEN_ROW : isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) #if defined(PCBXLITE) && !defined(MODULE_R9M_FULLSIZE) #define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (isModuleR9M_FCC_VARIANT(EXTERNAL_MODULE) ? TITLE_ROW : (uint8_t) 0) : HIDDEN_ROW #else -#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW +#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isR9ModuleRunning(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW #endif void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags); diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 0fad2f4c4..343103bd6 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -486,13 +486,18 @@ bool isSourceAvailableInResetSpecialFunction(int index) } } +bool isR9ModuleRunning(int module) +{ +#if defined(SIMU) + return g_model.moduleData[module].type == MODULE_TYPE_R9M && TELEMETRY_STREAMING(); // Simu uses telemetry simu to activate/desactivate R9 +#else + return g_model.moduleData[module].type == MODULE_TYPE_R9M && R9ModuleStreaming; +#endif +} + bool isR9MModeAvailable(int mode) { -#if defined(MODULE_R9M_FLEX_FW) - return mode >= MODULE_SUBTYPE_R9M_EUPLUS; -#else - return mode <= MODULE_SUBTYPE_R9M_EU; -#endif + return mode <= MODULE_SUBTYPE_R9M_EUPLUS; } bool isModuleAvailable(int module) @@ -516,6 +521,9 @@ bool isModuleAvailable(int module) return false; } #endif + if (module == MODULE_TYPE_R9M && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { + return false; + } return true; } @@ -531,6 +539,10 @@ bool isRfProtocolAvailable(int protocol) return false; } #endif + if (protocol != RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { + return false; + } + return true; } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index daf616120..0039e0a3f 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -27,6 +27,7 @@ #include #include "definitions.h" #include "opentx_types.h" +#include "bitfield.h" #if defined(STM32) #include "usbd_conf.h" #endif diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 3c7311988..8b7e047a2 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -184,8 +184,10 @@ enum R9MLBTPowerValues { #else -#define LEN_R9M_REGION "\006" -#define TR_R9M_REGION "FCC\0 ""EU\0 ""868MHz""915MHz" +#define LEN_R9M_REGION "\004" +#define TR_R9M_REGION "FCC\0""EU\0 ""FLEX" +#define LEN_R9MFLEX_FREQ "\006" +#define TR_R9MFLEX_FREQ "868Mhz""915Mhz" #define LEN_R9M_FCC_POWER_VALUES "\006" #define LEN_R9M_LBT_POWER_VALUES "\013" #define TR_R9M_FCC_POWER_VALUES "10 mW\0" "100 mW" "500 mW" "1 W\0" diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 2ae1adfd8..7cce0f298 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -45,6 +45,7 @@ void Pxx2Pulses::setupFrame(uint8_t port) #if defined(LUA) if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { + TRACE("SENDING TELEM"); // primID (1 byte) + dataID (2 bytes) + value (4 bytes) for (uint8_t i=0; i<7; i++) { addByte(outputTelemetryBuffer[i]); diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 249776c17..e5eb12ff9 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -59,6 +59,11 @@ void processFrskyPXX2Data(uint8_t data) telemetryRxBuffer[telemetryRxBufferCount++] = data; if (telemetryRxBuffer[0] + 3 /* 1 byte for length, 2 bytes for CRC */ == telemetryRxBufferCount) { if (checkPXX2PacketCRC(telemetryRxBuffer)) { + R9ModuleStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected + uint8_t R9Region = (telemetryRxBuffer[3] & 0x30) >> 4; + if (R9Region != 0x04) { + BF_SET(g_model.moduleData[EXTERNAL_MODULE].subType, R9Region, 1, 2); // heading bit holds flex frequency + } if (telemetryRxBuffer[2] & 0x80) { createFrSkyPXX2Sensor(RSSI_ID, telemetryRxBuffer[2] & 0x7f); } @@ -68,7 +73,11 @@ void processFrskyPXX2Data(uint8_t data) if((telemetryRxBuffer[3] & 0x04) == 0) { createFrSkyPXX2Sensor(R9_PWR_ID, (telemetryRxBuffer[3] & 0x03)); } - sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); + + if (telemetryRxBuffer[0] == 0x0c) { + sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 5 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); + TRACE("Got TELEM data"); + } } telemetryRxBufferCount = 0; dataState = STATE_DATA_IDLE; diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 7b789edeb..2e88e4843 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -190,9 +190,10 @@ enum FrSkyDataState { #define BATT_ID 0xf104 #define RAS_ID 0xf105 #define XJT_VERSION_ID 0xf106 +#define R9_PWR_ID 0xf107 #define FUEL_QTY_FIRST_ID 0x0a10 #define FUEL_QTY_LAST_ID 0x0a1f -#define R9_PWR_ID 0xf107 // TODO: *CRITICAL* agree on ID with FrSky, this value is just a placeholder + // Default sensor data IDs (Physical IDs + CRC) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 96124792c..8fabe7692 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -21,6 +21,7 @@ #include "opentx.h" uint8_t telemetryStreaming = 0; +uint8_t R9ModuleStreaming = 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; @@ -120,7 +121,7 @@ void telemetryWakeup() varioWakeup(); } #endif - + #define FRSKY_BAD_ANTENNA() (IS_RAS_VALUE_VALID() && telemetryData.swr.value > 0x33) static tmr10ms_t alarmsCheckTime = 0; @@ -202,7 +203,9 @@ void telemetryInterrupt10ms() wshhStreaming--; } #endif - + if (R9ModuleStreaming > 0) { + R9ModuleStreaming--; + } if (telemetryStreaming > 0) { telemetryStreaming--; } diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 3170bae7f..400a27ed6 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -36,6 +36,7 @@ #endif extern uint8_t telemetryStreaming; // >0 (true) == data is streaming in. 0 = no data detected for some time +extern uint8_t R9ModuleStreaming; // >0 (true) == R9 module is connected and sending data 0 = no data detected for some time #if defined(WS_HOW_HIGH) extern uint8_t wshhStreaming; @@ -130,7 +131,7 @@ inline uint8_t modelTelemetryProtocol() if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { return PROTOCOL_TELEMETRY_PXX2; } - + #if defined(MULTIMODULE) if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) { return PROTOCOL_TELEMETRY_MULTIMODULE; diff --git a/radio/src/translations.h b/radio/src/translations.h index 2ec3981dd..4e2191070 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -188,8 +188,9 @@ extern const char STR_OPEN9X[]; #define OFS_VFAILSAFE (OFS_USBMODES + sizeof(TR_USBMODES)) #define OFS_VTRAINERMODES (OFS_VFAILSAFE + sizeof(TR_VFAILSAFE)) #define OFS_TARANIS_PROTOCOLS (OFS_VTRAINERMODES + sizeof(TR_VTRAINERMODES)) - #define OFS_R9M_REGION (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) - #define OFS_R9M_FCC_POWER_VALUES (OFS_R9M_REGION + sizeof(TR_R9M_REGION)) + #define OFS_R9M_REGION (OFS_TARANIS_PROTOCOLS + sizeof(TR_TARANIS_PROTOCOLS)) + #define OFS_R9MFLEX_FREQ (OFS_R9M_REGION + sizeof(TR_R9M_REGION)) + #define OFS_R9M_FCC_POWER_VALUES (OFS_R9MFLEX_FREQ + sizeof(TR_R9MFLEX_FREQ)) #define OFS_R9M_LBT_POWER_VALUES (OFS_R9M_FCC_POWER_VALUES + sizeof(TR_R9M_FCC_POWER_VALUES)) #define OFS_TELEMETRY_PROTOCOLS (OFS_R9M_LBT_POWER_VALUES + sizeof(TR_R9M_LBT_POWER_VALUES)) #define OFS_XJT_PROTOCOLS (OFS_TELEMETRY_PROTOCOLS + sizeof(TR_TELEMETRY_PROTOCOLS)) @@ -294,7 +295,8 @@ extern const char STR_OPEN9X[]; #define STR_VTRAINERMODES (STR_OPEN9X + OFS_VTRAINERMODES) #define STR_TARANIS_PROTOCOLS (STR_OPEN9X + OFS_TARANIS_PROTOCOLS) - #define STR_R9M_REGION (STR_OPEN9X + OFS_R9M_REGION) + #define STR_R9M_REGION (STR_OPEN9X + OFS_R9M_REGION) + #define STR_R9MFLEX_FREQ (STR_OPEN9X + OFS_R9MFLEX_FREQ) #define STR_R9M_FCC_POWER_VALUES (STR_OPEN9X + OFS_R9M_FCC_POWER_VALUES) #define STR_R9M_LBT_POWER_VALUES (STR_OPEN9X + OFS_R9M_LBT_POWER_VALUES) #define STR_TELEMETRY_PROTOCOLS (STR_OPEN9X + OFS_TELEMETRY_PROTOCOLS) diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 3e16c3b4f..50b61319e 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -79,7 +79,6 @@ options_taranis = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_taranisplus = { @@ -97,7 +96,6 @@ options_taranisplus = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_xlite = { @@ -114,7 +112,6 @@ options_xlite = { "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), "stdr9m": ("MODULE_R9M_FULLSIZE", "YES", None), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_taranisx9e = { @@ -132,7 +129,6 @@ options_taranisx9e = { "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "horussticks": ("STICKS", "HORUS", "STANDARD"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_x12s = { @@ -147,7 +143,6 @@ options_x12s = { "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), "pcbdev": ("PCBREV", "10", None), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } options_x10 = { @@ -161,5 +156,4 @@ options_x10 = { "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "flexr9m": ("MODULE_R9M_FLEX_FW", "YES", None) } From baf5ec147e8effb94966cbc207592a3aedf54075 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 4 Dec 2018 09:33:19 +0100 Subject: [PATCH 032/446] Fix sensors telem --- radio/src/telemetry/frsky.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 249776c17..91930819a 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -68,7 +68,9 @@ void processFrskyPXX2Data(uint8_t data) if((telemetryRxBuffer[3] & 0x04) == 0) { createFrSkyPXX2Sensor(R9_PWR_ID, (telemetryRxBuffer[3] & 0x03)); } - sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 6 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); + if (telemetryRxBuffer[0] == 0x0C) { + sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 5 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); + } } telemetryRxBufferCount = 0; dataState = STATE_DATA_IDLE; From bd2f80b05bc242533b777f788af8aa466e621dd4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 4 Dec 2018 17:27:44 +0100 Subject: [PATCH 033/446] Fix Radio -> TX telemetry sending --- radio/src/pulses/pxx2.cpp | 1 + radio/src/targets/taranis/telemetry_driver.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 2ae1adfd8..500cfc2fd 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -46,6 +46,7 @@ void Pxx2Pulses::setupFrame(uint8_t port) #if defined(LUA) if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { // primID (1 byte) + dataID (2 bytes) + value (4 bytes) + addByte(outputTelemetryBufferTrigger); for (uint8_t i=0; i<7; i++) { addByte(outputTelemetryBuffer[i]); } diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index 56ce4fe58..c805f56e8 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -127,7 +127,7 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) if (DMA_GetITStatus(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC)) { DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); TELEMETRY_USART->CR1 |= USART_CR1_TCIE; - if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || telemetryProtocol == PROTOCOL_TELEMETRY_PXX2) { outputTelemetryBufferSize = 0; outputTelemetryBufferTrigger = 0x7E; } From b791c0ab1a061f2035b4f8772e3b376bb1796f4e Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 4 Dec 2018 17:52:57 +0100 Subject: [PATCH 034/446] FrSky confirmed usage of 0xf107 --- radio/src/telemetry/frsky.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 7b789edeb..2e88e4843 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -190,9 +190,10 @@ enum FrSkyDataState { #define BATT_ID 0xf104 #define RAS_ID 0xf105 #define XJT_VERSION_ID 0xf106 +#define R9_PWR_ID 0xf107 #define FUEL_QTY_FIRST_ID 0x0a10 #define FUEL_QTY_LAST_ID 0x0a1f -#define R9_PWR_ID 0xf107 // TODO: *CRITICAL* agree on ID with FrSky, this value is just a placeholder + // Default sensor data IDs (Physical IDs + CRC) From f48c6a9cfaecce9f2ef203e1e6f59f64073b7545 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 7 Dec 2018 09:00:26 +0100 Subject: [PATCH 035/446] Fix potential sport out corruption --- radio/src/pulses/pxx2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 500cfc2fd..0f613074b 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -44,7 +44,7 @@ void Pxx2Pulses::setupFrame(uint8_t port) addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); #if defined(LUA) - if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { + if (outputTelemetryBufferTrigger != 0x7E && outputTelemetryBufferSize > 0) { // primID (1 byte) + dataID (2 bytes) + value (4 bytes) addByte(outputTelemetryBufferTrigger); for (uint8_t i=0; i<7; i++) { From 22c1d5895abd262890e8836b4c17fab4ddf56ef9 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 12 Dec 2018 13:27:11 +0100 Subject: [PATCH 036/446] X7 POC for R9 region sensing --- radio/src/gui/128x64/model_setup.cpp | 35 ++++++++++++++-------------- radio/src/gui/gui_common.h | 1 + radio/src/gui/gui_common_arm.cpp | 13 ++++++++++- radio/src/pulses/pulses_arm.h | 2 ++ radio/src/telemetry/frsky.cpp | 2 +- radio/src/translations.cpp | 2 ++ radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 18 files changed, 48 insertions(+), 19 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 7db9f56ea..67fa85ef6 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -97,6 +97,7 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, #endif ITEM_MODEL_EXTERNAL_MODULE_POWER, + ITEM_MODEL_EXTERNAL_MODULE_FREQ, #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, @@ -170,7 +171,7 @@ enum MenuModelSetupItems { #if defined(PCBSKY9X) && !defined(REVA) #define EXTRA_MODULE_ROWS LABEL(ExtraModule), 1, 2, #else - #define EXTRA_MODULE_ROWS + #define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW #endif #if defined(PCBX7) @@ -273,7 +274,7 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, - EXTRA_MODULE_ROWS + EXTRA_MODULE_ROWS, FAILSAFE_ROWS(EXTERNAL_MODULE), TRAINER_ROWS }); #else @@ -728,7 +729,7 @@ void menuModelSetup(event_t event) else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isR9ModuleRunning(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType & 0x03, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -755,16 +756,6 @@ void menuModelSetup(event_t event) case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); - else if (isModuleR9M(EXTERNAL_MODULE)) { - uint8_t newR9MType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); - if (newR9MType != g_model.moduleData[EXTERNAL_MODULE].subType && newR9MType > MODULE_SUBTYPE_R9M_EU) { - POPUP_WARNING(STR_R9MFLEXWARN1); - const char * w = STR_R9MFLEXWARN2; - SET_WARNING_INFO(w, strlen(w), 0); - } - g_model.moduleData[EXTERNAL_MODULE].subType = newR9MType; - } - #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1191,10 +1182,7 @@ void menuModelSetup(event_t event) } } #endif - if (isModuleR9M(moduleIdx)) { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, TR_R9MFLEX_FREQ, BF_GET(g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1), attr); - } - else if (isModuleSBUS(moduleIdx)) { + if (isModuleSBUS(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_WARN_BATTVOLTAGE); putsVolts(lcdLastRightPos, y, getBatteryVoltage(), attr | PREC2 | LEFT); } @@ -1241,6 +1229,19 @@ void menuModelSetup(event_t event) } break; + case ITEM_MODEL_EXTERNAL_MODULE_FREQ: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + uint8_t frequency = BF_GET(g_model.moduleData[moduleIdx].subType, 2, 1); + lcdDrawTextAlignedLeft(y, STR_FREQUENCY); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, frequency, LEFT | attr); + if (attr) + { + CHECK_INCDEC_MODELVAR_ZERO(event, frequency, 1); + BF_SET(g_model.moduleData[moduleIdx].subType, frequency, 2, 1); + } + } + #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 5959484da..91711344e 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -55,6 +55,7 @@ bool isSwitchAvailableInMixes(int swtch); bool isSwitchAvailableInTimers(int swtch); bool isR9MModeAvailable(int mode); bool isR9ModuleRunning(int module); +bool isR9MMFlex(int module); bool isModuleAvailable(int module); bool isRfProtocolAvailable(int protocol); bool isTelemetryProtocolAvailable(int protocol); diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 343103bd6..86545034a 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -490,7 +490,7 @@ bool isR9ModuleRunning(int module) { #if defined(SIMU) return g_model.moduleData[module].type == MODULE_TYPE_R9M && TELEMETRY_STREAMING(); // Simu uses telemetry simu to activate/desactivate R9 -#else +#else return g_model.moduleData[module].type == MODULE_TYPE_R9M && R9ModuleStreaming; #endif } @@ -500,6 +500,11 @@ bool isR9MModeAvailable(int mode) return mode <= MODULE_SUBTYPE_R9M_EUPLUS; } +bool isR9MMFlex(int module) +{ + return g_model.moduleData[module].subType >= MODULE_SUBTYPE_R9M_EUPLUS; +} + bool isModuleAvailable(int module) { #if defined(CROSSFIRE) @@ -521,10 +526,14 @@ bool isModuleAvailable(int module) return false; } #endif +#if !defined(PCBSKY9X) if (module == MODULE_TYPE_R9M && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { return false; } +#endif + return true; + } bool isRfProtocolAvailable(int protocol) @@ -539,9 +548,11 @@ bool isRfProtocolAvailable(int protocol) return false; } #endif +#if defined(pxx) if (protocol != RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { return false; } +#endif return true; } diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 8b7e047a2..79a2347e1 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -166,6 +166,8 @@ void setCustomFailsafe(uint8_t moduleIndex); #define LEN_R9M_LBT_POWER_VALUES "\015" #define TR_R9M_FCC_POWER_VALUES "(100 mW)" #define TR_R9M_LBT_POWER_VALUES "25 mW 8ch\0 ""25 mW 16ch\0 ""100mW no tele" +#define LEN_R9MFLEX_FREQ "\006" +#define TR_R9MFLEX_FREQ "868Mhz""915Mhz" enum R9MFCCPowerValues { R9M_FCC_POWER_100 = 0, diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index e5eb12ff9..9ddf55d09 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -62,7 +62,7 @@ void processFrskyPXX2Data(uint8_t data) R9ModuleStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected uint8_t R9Region = (telemetryRxBuffer[3] & 0x30) >> 4; if (R9Region != 0x04) { - BF_SET(g_model.moduleData[EXTERNAL_MODULE].subType, R9Region, 1, 2); // heading bit holds flex frequency + BF_SET(g_model.moduleData[EXTERNAL_MODULE].subType, R9Region, 0, 2); // heading bit holds flex frequency } if (telemetryRxBuffer[2] & 0x80) { createFrSkyPXX2Sensor(RSSI_ID, telemetryRxBuffer[2] & 0x7f); diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 6684816da..c49b8d83f 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -92,6 +92,7 @@ const char STR_OPEN9X[] = ISTR(VTRAINERMODES) ISTR(TARANIS_PROTOCOLS) ISTR(R9M_REGION) + ISTR(R9MFLEX_FREQ) ISTR(R9M_FCC_POWER_VALUES) ISTR(R9M_LBT_POWER_VALUES) ISTR(TELEMETRY_PROTOCOLS) @@ -144,6 +145,7 @@ const char STR_PPMFRAME[] = TR_PPMFRAME; const char STR_REFRESHRATE[] = TR_REFRESHRATE; const char SSTR_WARN_BATTVOLTAGE[] = STR_WARN_BATTVOLTAGE; const char STR_MS[] = TR_MS; +const char STR_FREQUENCY[] = TR_FREQUENCY; const char STR_SWITCH[] = TR_SWITCH; const char STR_TRIMS[] = TR_TRIMS; const char STR_FADEIN[] = TR_FADEIN; diff --git a/radio/src/translations.h b/radio/src/translations.h index 4e2191070..bca41eb21 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -363,6 +363,7 @@ extern const char STR_PPMFRAME[]; extern const char STR_REFRESHRATE[]; extern const char SSTR_WARN_BATTVOLTAGE[]; extern const char STR_MS[]; +extern const char STR_FREQUENCY[]; extern const char STR_SWITCH[]; extern const char STR_TRIMS[]; extern const char STR_FADEIN[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 232c8042f..b4c6dcad8 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -563,6 +563,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Spínač" #define TR_TRIMS "Trimy" #define TR_FADEIN "Přechod Zap" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 99f732b24..61acde6a7 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -568,6 +568,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH TR("Schalt.", "Schalter") #define TR_TRIMS "Trims" #define TR_FADEIN "Langs. Ein" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index d83e74e5e..6515ccc31 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -566,6 +566,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Switch" #define TR_TRIMS "Trims" #define TR_FADEIN "Fade in" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 95ea1e70d..401a7f32a 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -571,6 +571,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Interr" #define TR_TRIMS "Trims" #define TR_FADEIN "Inicio" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 713f76875..ee3987d8c 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -563,6 +563,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Switch" #define TR_TRIMS "Trims" #define TR_FADEIN "Fade In" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index e3856eb73..28eb453ec 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -580,6 +580,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH TR("Inter", "Interrupteur") #define TR_TRIMS "Trims" #define TR_FADEIN "Fondu ON" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 8440f38c3..33330d96b 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -569,6 +569,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Inter." #define TR_TRIMS "Trims" #define TR_FADEIN "Diss.In" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 47cfbf8ea..d860725a7 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -563,6 +563,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH TR("Schak.", "Schakelaar") #define TR_TRIMS "Trims" #define TR_FADEIN "Fade in" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index a560a2b90..23a97885a 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -570,6 +570,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Przełą" #define TR_TRIMS "Trymy" #define TR_FADEIN "Pojawia" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 6cedfde68..97b505244 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -570,6 +570,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Chave" #define TR_TRIMS "Trims" #define TR_FADEIN "Aparecer" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index e8ae0b8ec..f6133f73a 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -582,6 +582,7 @@ #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") #define TR_MS "ms" +#define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Brytare" #define TR_TRIMS "Trimmar" #define TR_FADEIN "Tona In" From b850470783e039bab37bee07fa545df3c07b6c86 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 13 Dec 2018 08:15:00 +0100 Subject: [PATCH 037/446] Extra union added --- radio/src/datastructs.h | 15 ++++++++++++--- radio/src/gui/128x64/model_setup.cpp | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 44eb39f6a..1010276fe 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -406,9 +406,18 @@ PACK(struct ModuleData { int8_t rfProtocol:4; uint8_t channelsStart; int8_t channelsCount; // 0=8 channels - uint8_t failsafeMode:4; // only 3 bits used - uint8_t subType:3; - uint8_t invertedSerial:1; // telemetry serial inverted from standard + union { + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t subType:3; + uint8_t invertedSerial:1; // telemetry serial inverted from standard + }; + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t freq:2; + uint8_t region:2; + } r9m; + }; int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; union { struct { diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 67fa85ef6..20118ad8c 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1232,7 +1232,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_FREQ: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - uint8_t frequency = BF_GET(g_model.moduleData[moduleIdx].subType, 2, 1); + uint8_t frequency = BF_GET(g_model.moduleData[moduleIdx].r9m.freq, 2, 1); lcdDrawTextAlignedLeft(y, STR_FREQUENCY); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, frequency, LEFT | attr); if (attr) From 50e004df9a0f810e06305da803a7ff7a1cf3e4e2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 13 Dec 2018 08:28:28 +0100 Subject: [PATCH 038/446] A more elegant approach (thank @bsongis) --- radio/src/gui/128x64/model_setup.cpp | 8 +++----- radio/src/gui/gui_common_arm.cpp | 2 +- radio/src/telemetry/frsky.cpp | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 20118ad8c..2385ea836 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -729,7 +729,7 @@ void menuModelSetup(event_t event) else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isR9ModuleRunning(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType & 0x03, (menuHorizontalPosition==1 ? attr : 0)); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].r9m.region, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1232,13 +1232,11 @@ void menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_FREQ: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - uint8_t frequency = BF_GET(g_model.moduleData[moduleIdx].r9m.freq, 2, 1); lcdDrawTextAlignedLeft(y, STR_FREQUENCY); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, frequency, LEFT | attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, g_model.moduleData[moduleIdx].r9m.freq, LEFT | attr); if (attr) { - CHECK_INCDEC_MODELVAR_ZERO(event, frequency, 1); - BF_SET(g_model.moduleData[moduleIdx].subType, frequency, 2, 1); + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].r9m.freq, 1); } } diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 86545034a..a2c2bbb78 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -502,7 +502,7 @@ bool isR9MModeAvailable(int mode) bool isR9MMFlex(int module) { - return g_model.moduleData[module].subType >= MODULE_SUBTYPE_R9M_EUPLUS; + return g_model.moduleData[module].r9m.region == 0x02; } bool isModuleAvailable(int module) diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 9ddf55d09..22edba920 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -62,7 +62,7 @@ void processFrskyPXX2Data(uint8_t data) R9ModuleStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected uint8_t R9Region = (telemetryRxBuffer[3] & 0x30) >> 4; if (R9Region != 0x04) { - BF_SET(g_model.moduleData[EXTERNAL_MODULE].subType, R9Region, 0, 2); // heading bit holds flex frequency + g_model.moduleData[EXTERNAL_MODULE].r9m.region = R9Region; } if (telemetryRxBuffer[2] & 0x80) { createFrSkyPXX2Sensor(RSSI_ID, telemetryRxBuffer[2] & 0x7f); From cc6660291da96690e52fb480c5538b1b95d022e6 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 13 Dec 2018 08:54:41 +0100 Subject: [PATCH 039/446] Cleanups and fixes related to R9 region changes --- radio/src/myeeprom.h | 9 +++++++++ radio/src/pulses/modules.h | 10 +++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index ba58a329d..15713ab96 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -321,6 +321,15 @@ enum R9MSubTypes MODULE_SUBTYPE_R9M_LAST=MODULE_SUBTYPE_R9M_AUPLUS }; +enum R9MRegion +{ + MODULE_REGION_R9M_FCC, + MODULE_REGION_R9M_EU, + MODULE_REGION_R9M_FLEX, + MODULE_REGION_R9M_LAST=MODULE_REGION_R9M_FLEX +}; + + enum MultiModuleRFProtocols { MM_RF_PROTO_CUSTOM = -1, MM_RF_PROTO_FIRST = MM_RF_PROTO_CUSTOM, diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 2ecb78168..cbc26a5df 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -106,27 +106,27 @@ inline bool isModuleR9M(uint8_t idx) inline bool isModuleR9M_FCC(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_FCC; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_FCC; } inline bool isModuleR9M_LBT(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_EU; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_EU; } inline bool isModuleR9M_FCC_VARIANT(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_EU; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region != MODULE_REGION_R9M_EU; } inline bool isModuleR9M_EUPLUS(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_EUPLUS; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_FLEX && g_model.moduleData[idx].r9m.freq == 0x00; } inline bool isModuleR9M_AU_PLUS(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_AUPLUS; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_FLEX && g_model.moduleData[idx].r9m.freq == 0x01; } From 1c3d306c48600412b42a79abedc2a994f6089c05 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 13 Dec 2018 12:59:04 +0100 Subject: [PATCH 040/446] Tidy up --- radio/src/bitfield.h | 51 ---------------------------- radio/src/gui/128x64/model_setup.cpp | 1 + radio/src/gui/gui_common_arm.cpp | 6 ++-- radio/src/myeeprom.h | 14 +++++--- radio/src/opentx.h | 1 - radio/src/pulses/modules.h | 10 +++--- radio/src/pulses/pxx2.cpp | 1 - radio/src/telemetry/frsky.cpp | 1 - 8 files changed, 19 insertions(+), 66 deletions(-) delete mode 100644 radio/src/bitfield.h diff --git a/radio/src/bitfield.h b/radio/src/bitfield.h deleted file mode 100644 index 84b3632b5..000000000 --- a/radio/src/bitfield.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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 - * - * This file is based on work published at http://www.coranac.com/documents/working-with-bits-and-bitfields - * - * 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 BITFIELD_H -#define BITFIELD_H - -// A set of bitfield handling macros -#define BF_BIT(n) ( 1<<(n) ) -#define BF_BIT_GET(y, mask) ( y & (mask) ) -#define BF_BIT_SET(y, mask) ( y |= (mask) ) -#define BF_BIT_CLEAR(y, mask) ( y &= ~(mask) ) -#define BF_BIT_FLIP(y, mask) ( y ^= (mask) ) -#define BF_SINGLE_BIT_GET(y, i) BF_BIT_GET(y, BF_BIT(i)) -#define BF_SINGLE_BIT_SET(y, i) BF_BIT_SET(y, BF_BIT(i)) - -//! Create a bitmask of length 'len'. -#define BF_BITMASK(len) ( BF_BIT(len)-1 ) - -//! Create a bitfield mask of length 'len' starting at bit 'start'. -#define BF_MASK(start, len) ( BF_BITMASK(len)<<(start) ) - -//! Prepare a bitmask for insertion or combining. -#define BF_PREP(x, start, len) ( ((x)&BF_BITMASK(len)) << (start) ) - -//! Extract a bitfield of length 'len' starting at bit 'start' from 'y'. -#define BF_GET(y, start, len) ( ((y)>>(start)) & BF_BITMASK(len) ) - -//! Insert 'len' bits of 'x 'into 'y', starting at bit 'start' from 'y'. -#define BF_SET(y, x, start, len) \ - ( y= ((y) &~ BF_MASK(start, len)) | BF_PREP(x, start, len) ) - -#endif //BITFIELD_H \ No newline at end of file diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 2385ea836..bffa812c6 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1239,6 +1239,7 @@ void menuModelSetup(event_t event) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].r9m.freq, 1); } } + break; #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index a2c2bbb78..771f6fb0a 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -502,7 +502,7 @@ bool isR9MModeAvailable(int mode) bool isR9MMFlex(int module) { - return g_model.moduleData[module].r9m.region == 0x02; + return g_model.moduleData[module].r9m.region == MODULE_R9M_REGION_FLEX; } bool isModuleAvailable(int module) @@ -526,7 +526,7 @@ bool isModuleAvailable(int module) return false; } #endif -#if !defined(PCBSKY9X) +#if defined(PCBTARANIS) || defined(PCBHORUS) if (module == MODULE_TYPE_R9M && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { return false; } @@ -548,7 +548,7 @@ bool isRfProtocolAvailable(int protocol) return false; } #endif -#if defined(pxx) +#if defined(PCBTARANIS) || defined(PCBHORUS) if (protocol != RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { return false; } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 15713ab96..8f435befe 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -323,12 +323,18 @@ enum R9MSubTypes enum R9MRegion { - MODULE_REGION_R9M_FCC, - MODULE_REGION_R9M_EU, - MODULE_REGION_R9M_FLEX, - MODULE_REGION_R9M_LAST=MODULE_REGION_R9M_FLEX + MODULE_R9M_REGION_FCC, + MODULE_R9M_REGION_EU, + MODULE_R9M_REGION_FLEX, + MODULE_R9M_REGION_LAST=MODULE_R9M_REGION_FLEX }; +enum R9MFrenquency +{ + MODULE_R9M_FREQ_868MHZ + MODULE_R9M_FREQ_915MHZ, + MODULE_R9M_FREQ_LAST=MODULE_R9M_FREQ_915MHZ +}; enum MultiModuleRFProtocols { MM_RF_PROTO_CUSTOM = -1, diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 0039e0a3f..daf616120 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -27,7 +27,6 @@ #include #include "definitions.h" #include "opentx_types.h" -#include "bitfield.h" #if defined(STM32) #include "usbd_conf.h" #endif diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index cbc26a5df..8a8dd2bec 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -106,27 +106,27 @@ inline bool isModuleR9M(uint8_t idx) inline bool isModuleR9M_FCC(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_FCC; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FCC; } inline bool isModuleR9M_LBT(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_EU; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_EU; } inline bool isModuleR9M_FCC_VARIANT(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region != MODULE_REGION_R9M_EU; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region != MODULE_R9M_REGION_EU; } inline bool isModuleR9M_EUPLUS(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_FLEX && g_model.moduleData[idx].r9m.freq == 0x00; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FLEX && g_model.moduleData[idx].r9m.freq == MODULE_R9M_FREQ_868MHZ; } inline bool isModuleR9M_AU_PLUS(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_REGION_R9M_FLEX && g_model.moduleData[idx].r9m.freq == 0x01; + return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FLEX && g_model.moduleData[idx].r9m.freq == MODULE_R9M_FREQ_915MHZ; } diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 7cce0f298..2ae1adfd8 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -45,7 +45,6 @@ void Pxx2Pulses::setupFrame(uint8_t port) #if defined(LUA) if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { - TRACE("SENDING TELEM"); // primID (1 byte) + dataID (2 bytes) + value (4 bytes) for (uint8_t i=0; i<7; i++) { addByte(outputTelemetryBuffer[i]); diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 22edba920..6b5d61edf 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -76,7 +76,6 @@ void processFrskyPXX2Data(uint8_t data) if (telemetryRxBuffer[0] == 0x0c) { sportProcessTelemetryPacketWithoutCrc(telemetryRxBuffer + 5 /* LEN, TYPE, RSSI/BAT, TP/SS/FW_T, FW_VER, Data ID */); - TRACE("Got TELEM data"); } } telemetryRxBufferCount = 0; From 32146e767a4b864b4e1ac1efdb6691b29666162b Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 13 Dec 2018 14:16:14 +0100 Subject: [PATCH 041/446] typo, fix compilation --- radio/src/myeeprom.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 8f435befe..dacfab2d6 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -331,7 +331,7 @@ enum R9MRegion enum R9MFrenquency { - MODULE_R9M_FREQ_868MHZ + MODULE_R9M_FREQ_868MHZ, MODULE_R9M_FREQ_915MHZ, MODULE_R9M_FREQ_LAST=MODULE_R9M_FREQ_915MHZ }; From 0f8c4a7a7fa068f1e7149c308e01557598567f2e Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 13 Dec 2018 17:35:07 +0100 Subject: [PATCH 042/446] Fix Xlite R9 UI (pulse still wrong) --- radio/src/gui/128x64/model_setup.cpp | 46 +++++++++++++++++++++++++--- radio/src/gui/gui_common.h | 6 ++++ radio/src/gui/gui_common_arm.cpp | 12 +++++++- radio/src/pulses/modules.h | 33 +++++++++++++++++++- 4 files changed, 90 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index bffa812c6..600f980c1 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -97,7 +97,9 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, #endif ITEM_MODEL_EXTERNAL_MODULE_POWER, +#if !defined(PCBXLITE) ITEM_MODEL_EXTERNAL_MODULE_FREQ, +#endif #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, @@ -161,17 +163,21 @@ enum MenuModelSetupItems { #define OUTPUT_TYPE_ROWS() #endif #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) - +#if defined(PCBXLITE) + #define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +#else #define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 - +#endif #define CURSOR_ON_CELL (true) #define MODEL_SETUP_MAX_LINES (HEADER_LINE+ITEM_MODEL_SETUP_MAX) #define POT_WARN_ITEMS() ((g_model.potsWarnMode) ? (uint8_t)(NUM_POTS+NUM_SLIDERS) : (uint8_t)0) #define TIMER_ROWS 2, 0, 0, 0, 0 #if defined(PCBSKY9X) && !defined(REVA) #define EXTRA_MODULE_ROWS LABEL(ExtraModule), 1, 2, +#elif defined(PCBXLITE) + #define EXTRA_MODULE_ROWS #else - #define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW + #define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW, #endif #if defined(PCBX7) @@ -274,7 +280,7 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, - EXTRA_MODULE_ROWS, + EXTRA_MODULE_ROWS FAILSAFE_ROWS(EXTERNAL_MODULE), TRAINER_ROWS }); #else @@ -728,8 +734,13 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); +#if defined(PCBXLITE) + else if (isModuleR9M(EXTERNAL_MODULE)) + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); +#else else if (isR9ModuleRunning(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].r9m.region, (menuHorizontalPosition==1 ? attr : 0)); +#endif #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -756,6 +767,17 @@ void menuModelSetup(event_t event) case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); +#if defined(PCBXLITE) + else if (isModuleR9M(EXTERNAL_MODULE)) { + uint8_t newR9MType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); + if (newR9MType != g_model.moduleData[EXTERNAL_MODULE].subType && newR9MType > MODULE_SUBTYPE_R9M_EU) { + POPUP_WARNING(STR_R9MFLEXWARN1); + const char * w = STR_R9MFLEXWARN2; + SET_WARNING_INFO(w, strlen(w), 0); + } + g_model.moduleData[EXTERNAL_MODULE].subType = newR9MType; + } +#endif #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1182,7 +1204,20 @@ void menuModelSetup(event_t event) } } #endif +#if defined(PCBXLITE) + if (isModuleR9M(moduleIdx)) { + lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY); + if (IS_TELEMETRY_INTERNAL_MODULE()) { + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); + } + else { + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); + } + } + else if (isModuleSBUS(moduleIdx)) { +#else if (isModuleSBUS(moduleIdx)) { +#endif lcdDrawTextAlignedLeft(y, STR_WARN_BATTVOLTAGE); putsVolts(lcdLastRightPos, y, getBatteryVoltage(), attr | PREC2 | LEFT); } @@ -1228,7 +1263,7 @@ void menuModelSetup(event_t event) } break; - +#if !defined(PCBXLITE) case ITEM_MODEL_EXTERNAL_MODULE_FREQ: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); @@ -1240,6 +1275,7 @@ void menuModelSetup(event_t event) } } break; +#endif #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 91711344e..1b06616ce 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -157,10 +157,16 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); #define FAILSAFE_ROWS(x) ((isModuleXJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || isModuleR9M(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW +#if defined(PCBXLITE) +#define EXTERNAL_MODULE_OPTION_ROW (isModuleR9M(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) +#else #define EXTERNAL_MODULE_OPTION_ROW (isR9ModuleRunning(EXTERNAL_MODULE) ? HIDDEN_ROW : isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) +#endif #if defined(PCBXLITE) && !defined(MODULE_R9M_FULLSIZE) #define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (isModuleR9M_FCC_VARIANT(EXTERNAL_MODULE) ? TITLE_ROW : (uint8_t) 0) : HIDDEN_ROW +#elif defined(PCBXLITE) +#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW #else #define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isR9ModuleRunning(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW #endif diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 771f6fb0a..38ae22b4a 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -494,12 +494,22 @@ bool isR9ModuleRunning(int module) return g_model.moduleData[module].type == MODULE_TYPE_R9M && R9ModuleStreaming; #endif } +#if defined(PCBXLITE) +bool isR9MModeAvailable(int mode) +{ +#if defined(MODULE_R9M_FLEX_FW) + return mode >= MODULE_SUBTYPE_R9M_EUPLUS; +#else + return mode <= MODULE_SUBTYPE_R9M_EU; +#endif +} +#else bool isR9MModeAvailable(int mode) { return mode <= MODULE_SUBTYPE_R9M_EUPLUS; } - +#endif bool isR9MMFlex(int module) { return g_model.moduleData[module].r9m.region == MODULE_R9M_REGION_FLEX; diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 8a8dd2bec..0af8a58ef 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -99,6 +99,37 @@ inline bool isModulePPM(uint8_t idx) } #endif +#if defined(PCBXLITE) +inline bool isModuleR9M(uint8_t idx) +{ + return g_model.moduleData[idx].type == MODULE_TYPE_R9M; +} + +inline bool isModuleR9M_FCC(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_FCC; +} + +inline bool isModuleR9M_LBT(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_EU; +} + +inline bool isModuleR9M_FCC_VARIANT(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_EU; +} + +inline bool isModuleR9M_EUPLUS(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_EUPLUS; +} + +inline bool isModuleR9M_AU_PLUS(uint8_t idx) +{ + return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_AUPLUS; +} +#else inline bool isModuleR9M(uint8_t idx) { return g_model.moduleData[idx].type == MODULE_TYPE_R9M; @@ -128,7 +159,7 @@ inline bool isModuleR9M_AU_PLUS(uint8_t idx) { return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FLEX && g_model.moduleData[idx].r9m.freq == MODULE_R9M_FREQ_915MHZ; } - +#endif inline bool isModulePXX(uint8_t idx) { From 03c162b8da106ad3ae4a909c6ae138aec6887a1e Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 13 Dec 2018 17:53:57 +0100 Subject: [PATCH 043/446] Fix Xlite R9 pulse (untested) --- radio/src/pulses/pulses_arm.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index 4cd7ab383..290369e3a 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -66,7 +66,11 @@ uint8_t getRequiredProtocol(uint8_t port) required_protocol = PROTOCOL_CHANNELS_PXX; break; case MODULE_TYPE_R9M: +#if defined(PCBXLITE) + required_protocol = PROTOCOL_CHANNELS_PXX; +#else required_protocol = PROTOCOL_CHANNELS_PXX2; +#endif break; case MODULE_TYPE_SBUS: required_protocol = PROTOCOL_CHANNELS_SBUS; From d08910778b6cd7c739a3519ad0af6ac30366ee35 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 14 Dec 2018 09:38:26 +0100 Subject: [PATCH 044/446] X9 UI --- radio/src/gui/212x64/model_setup.cpp | 41 +++++++++++++--------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 4f8c5ead2..193f3b805 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -88,6 +88,7 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, #endif ITEM_MODEL_EXTERNAL_MODULE_POWER, + ITEM_MODEL_EXTERNAL_MODULE_FREQ, ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_LINE1, @@ -253,7 +254,8 @@ int getSwitchWarningsCount() #define TIMER_ROWS(x) 2|NAVIGATION_LINE_BY_LINE, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t) 1 : (uint8_t)0 -#define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : isModuleMultimodule(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 +#define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +#define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW, #if TIMERS == 1 #define TIMERS_ROWS TIMER_ROWS(0) @@ -296,6 +298,7 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, + EXTRA_MODULE_ROWS LABEL(Trainer), 0, TRAINER_LINE1_ROWS, TRAINER_LINE2_ROWS}); MENU_CHECK(STR_MENUSETUP, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX); @@ -733,8 +736,8 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); - else if (isModuleR9M(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); + else if (isR9ModuleRunning(EXTERNAL_MODULE)) + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].r9m.region, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -771,15 +774,6 @@ void menuModelSetup(event_t event) case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); - else if (isModuleR9M(EXTERNAL_MODULE)) { - uint8_t newR9MType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); - if (newR9MType != g_model.moduleData[EXTERNAL_MODULE].subType && newR9MType > MODULE_SUBTYPE_R9M_EU) { - POPUP_WARNING(STR_R9MFLEXWARN1); - const char * w = STR_R9MFLEXWARN2; - SET_WARNING_INFO(w, strlen(w), 0); - } - g_model.moduleData[EXTERNAL_MODULE].subType = newR9MType; - } #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1129,16 +1123,7 @@ void menuModelSetup(event_t event) } } #endif - if (isModuleR9M(moduleIdx)) { - lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY); - if (IS_TELEMETRY_INTERNAL_MODULE()) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); - } - else { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); - } - } - else if (isModuleSBUS(moduleIdx)) { + if (isModuleSBUS(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_WARN_BATTVOLTAGE); putsVolts(lcdLastRightPos, y, getBatteryVoltage(), attr | PREC2 | LEFT); } @@ -1174,6 +1159,18 @@ void menuModelSetup(event_t event) break; } + case ITEM_MODEL_EXTERNAL_MODULE_FREQ: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + lcdDrawTextAlignedLeft(y, STR_FREQUENCY); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, g_model.moduleData[moduleIdx].r9m.freq, LEFT | attr); + if (attr) + { + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].r9m.freq, 1); + } + } + break; + #if defined (MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) From de6574f45c68ee03c24941a140084523b2ef5f30 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 14 Dec 2018 10:26:55 +0100 Subject: [PATCH 045/446] HORUS UI --- radio/src/gui/480x272/model_setup.cpp | 41 +++++++++++++-------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 0931e475b..ef90129b2 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -82,6 +82,7 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, #endif ITEM_MODEL_EXTERNAL_MODULE_POWER, + ITEM_MODEL_EXTERNAL_MODULE_FREQ, ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_LINE1, @@ -236,7 +237,8 @@ int getSwitchWarningsCount() #define TIMER_ROWS(x) NAVIGATION_LINE_BY_LINE|1, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 : (uint8_t)0 -#define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : isModuleMultimodule(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 +#define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +#define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW, #if TIMERS == 1 #define TIMERS_ROWS TIMER_ROWS(0) @@ -285,6 +287,7 @@ bool menuModelSetup(event_t event) EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, + EXTRA_MODULE_ROWS LABEL(Trainer), 0, TRAINER_LINE1_ROWS, @@ -693,8 +696,8 @@ bool menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); - else if (isModuleR9M(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); + else if (isR9ModuleRunning(EXTERNAL_MODULE)) + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].r9m.region, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -728,15 +731,6 @@ bool menuModelSetup(event_t event) case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); - else if (isModuleR9M(EXTERNAL_MODULE)) { - uint8_t newR9MType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); - if (newR9MType != g_model.moduleData[EXTERNAL_MODULE].subType && newR9MType > MODULE_SUBTYPE_R9M_EU) { - POPUP_WARNING(STR_R9MFLEXWARN1); - const char * w = STR_R9MFLEXWARN2; - SET_WARNING_INFO(w, strlen(w), 0); - } - g_model.moduleData[EXTERNAL_MODULE].subType = newR9MType; - } #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false); @@ -1068,16 +1062,7 @@ bool menuModelSetup(event_t event) } } #endif - if (isModuleR9M(moduleIdx)) { - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_TELEMETRY); - if (IS_TELEMETRY_INTERNAL_MODULE()) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); - } - else { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); - } - } - else if (isModuleSBUS(moduleIdx)) { + if (isModuleSBUS(moduleIdx)) { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_WARN_BATTVOLTAGE); drawValueWithUnit(MODEL_SETUP_4TH_COLUMN, y, getBatteryVoltage(), UNIT_VOLTS, attr|PREC2|LEFT); } @@ -1116,6 +1101,18 @@ bool menuModelSetup(event_t event) } break; + case ITEM_MODEL_EXTERNAL_MODULE_FREQ: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_FREQUENCY); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9MFLEX_FREQ, g_model.moduleData[moduleIdx].r9m.freq, LEFT | attr); + if (attr) + { + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].r9m.freq, 1); + } + } + break; + #if defined(MULTIMODULE) case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) From 15cf9748e39bae2522b8ff1d18948c576f487bdb Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 14 Dec 2018 12:03:24 +0100 Subject: [PATCH 046/446] Fix R9M lite telemetry on Xlite --- radio/src/telemetry/telemetry.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 400a27ed6..daaf9947d 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -129,7 +129,11 @@ inline uint8_t modelTelemetryProtocol() } if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { +#if defined(PCBXLITE) + return PROTOCOL_TELEMETRY_FRSKY_SPORT; +#else return PROTOCOL_TELEMETRY_PXX2; +#endif } #if defined(MULTIMODULE) From 0e0943ba974c1140b0938baf001aba2aef39cd6b Mon Sep 17 00:00:00 2001 From: Kilrah Date: Sun, 16 Dec 2018 10:36:37 +0100 Subject: [PATCH 047/446] Compilation fix --- radio/src/pulses/modules.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 0af8a58ef..7d9a7275c 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -88,7 +88,7 @@ inline bool isModulePPM(uint8_t idx) { return idx == TRAINER_MODULE || (idx == INTERNAL_MODULE && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_PPM) || - (idx == EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM)); + (idx == EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM); } #else inline bool isModulePPM(uint8_t idx) From 460686bc9fdec1af443b1ec8200354fcae17d991 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 16 Dec 2018 14:30:59 +0100 Subject: [PATCH 048/446] Does it fix the freeze issue? --- radio/src/gui/480x272/widgets.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/widgets.cpp b/radio/src/gui/480x272/widgets.cpp index e8bb01f92..8a08cdbd4 100644 --- a/radio/src/gui/480x272/widgets.cpp +++ b/radio/src/gui/480x272/widgets.cpp @@ -33,12 +33,12 @@ void drawColumnHeader(const char * const * headers, const char * const * descrip } } -const uint8_t __alpha_button_on[] { +const uint8_t __alpha_button_on[] __DMA { #include "alpha_button_on.lbm" }; Bitmap ALPHA_BUTTON_ON(BMP_ARGB4444, (const uint16_t*)__alpha_button_on); -const uint8_t __alpha_button_off[] { +const uint8_t __alpha_button_off[] __DMA { #include "alpha_button_off.lbm" }; Bitmap ALPHA_BUTTON_OFF(BMP_ARGB4444, (const uint16_t*)__alpha_button_off); From b2d9037da88eca96dcebf74ce76a9e2f03475a5d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 16 Dec 2018 14:32:04 +0100 Subject: [PATCH 049/446] Cosmetics --- radio/src/gui/480x272/widgets.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/widgets.cpp b/radio/src/gui/480x272/widgets.cpp index 8a08cdbd4..d9eff1526 100644 --- a/radio/src/gui/480x272/widgets.cpp +++ b/radio/src/gui/480x272/widgets.cpp @@ -33,12 +33,12 @@ void drawColumnHeader(const char * const * headers, const char * const * descrip } } -const uint8_t __alpha_button_on[] __DMA { +const uint8_t __alpha_button_on[] __DMA = { #include "alpha_button_on.lbm" }; Bitmap ALPHA_BUTTON_ON(BMP_ARGB4444, (const uint16_t*)__alpha_button_on); -const uint8_t __alpha_button_off[] __DMA { +const uint8_t __alpha_button_off[] __DMA = { #include "alpha_button_off.lbm" }; Bitmap ALPHA_BUTTON_OFF(BMP_ARGB4444, (const uint16_t*)__alpha_button_off); From c6d932c98856916800ff0dcafe3cd3cca328db22 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 16 Dec 2018 14:44:21 +0100 Subject: [PATCH 050/446] Alignment --- radio/src/gui/480x272/widgets.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/widgets.cpp b/radio/src/gui/480x272/widgets.cpp index d9eff1526..065017c6f 100644 --- a/radio/src/gui/480x272/widgets.cpp +++ b/radio/src/gui/480x272/widgets.cpp @@ -33,12 +33,12 @@ void drawColumnHeader(const char * const * headers, const char * const * descrip } } -const uint8_t __alpha_button_on[] __DMA = { +static const uint8_t __alpha_button_on[] __ALIGNED(4) = { #include "alpha_button_on.lbm" }; Bitmap ALPHA_BUTTON_ON(BMP_ARGB4444, (const uint16_t*)__alpha_button_on); -const uint8_t __alpha_button_off[] __DMA = { +static const uint8_t __alpha_button_off[] __ALIGNED(4) = { #include "alpha_button_off.lbm" }; Bitmap ALPHA_BUTTON_OFF(BMP_ARGB4444, (const uint16_t*)__alpha_button_off); From b7ab0e9520449fa6ad84866ce9865b5a9e137001 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 16 Jan 2019 08:59:26 +0100 Subject: [PATCH 051/446] AT command change as per FrSky request --- radio/src/bluetooth.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/bluetooth.cpp b/radio/src/bluetooth.cpp index 50bc769bd..737510cc0 100644 --- a/radio/src/bluetooth.cpp +++ b/radio/src/bluetooth.cpp @@ -395,7 +395,7 @@ void bluetoothWakeup() bluetoothState = BLUETOOTH_STATE_NAME_SENT; } else if (bluetoothState == BLUETOOTH_STATE_NAME_SENT && (!strncmp(line, "OK+", 3) || !strncmp(line, "Central:", 8) || !strncmp(line, "Peripheral:", 11))) { - bluetoothWriteString("AT+TXPW3\r\n"); + bluetoothWriteString("AT+TXPW\r\n"); bluetoothState = BLUETOOTH_STATE_POWER_SENT; } else if (bluetoothState == BLUETOOTH_STATE_POWER_SENT && (!strncmp(line, "Central:", 8) || !strncmp(line, "Peripheral:", 11))) { From d0f87bc3e211c2e218b5944ff22c1e49cfac2675 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 25 Jan 2019 21:57:51 +0100 Subject: [PATCH 052/446] CRC bytestuffing (needs to be tested) ... --- radio/src/pulses/pxx.h | 18 +++++++++--------- radio/src/pulses/pxx1.h | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 31e7e16fc..0fcf7f89e 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -150,7 +150,7 @@ class StandardPxxTransport: public BitTransport, public PxxCrcMixin { addByteWithoutCrc(byte); }; - void addRawByteWithoutCrc(uint8_t byte) + void addRawByte(uint8_t byte) { for (uint8_t i = 0; i < 8; i++) { if (byte & 0x80) @@ -198,28 +198,28 @@ class UartPxxTransport: public DataBuffer, public PxxCrcMixin { addWithByteStuffing(byte); } - void addRawByteWithoutCrc(uint8_t byte) + void addRawByte(uint8_t byte) { - addByteWithoutCrc(byte); + *ptr++ = byte; } void addByteWithoutCrc(uint8_t byte) { - *ptr++ = byte; + addWithByteStuffing(byte); } void addWithByteStuffing(uint8_t byte) { if (0x7E == byte) { - *ptr++ = 0x7D; - *ptr++ = 0x5E; + addRawByte(0x7D); + addRawByte(0x5E); } else if (0x7D == byte) { - *ptr++ = 0x7D; - *ptr++ = 0x5D; + addRawByte(0x7D); + addRawByte(0x5D); } else { - *ptr++ = byte; + addRawByte(byte); } } diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index d7d958b45..03624e7ea 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -33,7 +33,7 @@ class Pxx1Pulses: public PxxPulses void addHead() { // send 7E, do not CRC - PxxTransport::addRawByteWithoutCrc(0x7E); + PxxTransport::addRawByte(0x7E); } void addCrc() From 6de4f22efb929c181209c5cab6003f05207ee3f0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 1 Feb 2019 16:56:42 +0100 Subject: [PATCH 053/446] Framing 1ms for STM32 boards ... --- radio/src/thirdparty/CoOS/OsConfig.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radio/src/thirdparty/CoOS/OsConfig.h b/radio/src/thirdparty/CoOS/OsConfig.h index c56e47529..341f262d0 100644 --- a/radio/src/thirdparty/CoOS/OsConfig.h +++ b/radio/src/thirdparty/CoOS/OsConfig.h @@ -85,7 +85,11 @@ System frequency (Hz). /*!< systick frequency (Hz). */ +#if defined(STM32) +#define CFG_SYSTICK_FREQ (1000) +#else #define CFG_SYSTICK_FREQ (500) +#endif /*!< max systerm api call num in ISR. From eaa77aa9a6d174dc9526a854971397c9091b61df Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 2 Feb 2019 08:06:11 +0100 Subject: [PATCH 054/446] Keep menus at 50ms --- radio/src/tasks_arm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/tasks_arm.cpp b/radio/src/tasks_arm.cpp index fecc02333..3ce276d26 100644 --- a/radio/src/tasks_arm.cpp +++ b/radio/src/tasks_arm.cpp @@ -166,7 +166,7 @@ void scheduleNextMixerCalculation(uint8_t module, uint16_t period_ms) DEBUG_TIMER_STOP(debugTimerMixerCalcToUsage); } -#define MENU_TASK_PERIOD_TICKS 25 // 50ms +#define MENU_TASK_PERIOD_TICKS 50 // 50ms #if defined(COLORLCD) && defined(CLI) bool perMainEnabled = true; From 57f8434de9543deaacf8c33beea9e8d4cc4c3d76 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 2 Feb 2019 15:04:57 +0100 Subject: [PATCH 055/446] Optimise mixer runs 1.2ms before puise start --- radio/src/tasks_arm.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/tasks_arm.cpp b/radio/src/tasks_arm.cpp index 3ce276d26..fdfa36f0c 100644 --- a/radio/src/tasks_arm.cpp +++ b/radio/src/tasks_arm.cpp @@ -122,7 +122,7 @@ TASK_FUNCTION(mixerTask) if (!s_pulses_paused) { uint16_t t0 = getTmr2MHz(); - + DEBUG_TIMER_START(debugTimerMixer); RTOS_LOCK_MUTEX(mixerMutex); doMixerCalculations(); @@ -162,7 +162,7 @@ void scheduleNextMixerCalculation(uint8_t module, uint16_t period_ms) { // Schedule next mixer calculation time, // for now assume mixer calculation takes 2 ms. - nextMixerTime[module] = (uint32_t)RTOS_GET_TIME() + period_ms / 2 - 1/*2ms*/; + nextMixerTime[module] = (uint32_t)RTOS_GET_TIME() + period_ms - 1 /*1.2ms before next pulse*/; DEBUG_TIMER_STOP(debugTimerMixerCalcToUsage); } From 0a0cc962d51e3c4dbd81e5d3bafc9afbf3ed8a5f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 4 Feb 2019 08:01:47 +0100 Subject: [PATCH 056/446] Constants used ... --- radio/src/rtos.h | 4 +--- radio/src/tasks_arm.cpp | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/radio/src/rtos.h b/radio/src/rtos.h index 1478b778a..d352b953a 100644 --- a/radio/src/rtos.h +++ b/radio/src/rtos.h @@ -27,8 +27,6 @@ extern "C++" { #endif -#define doNothing() do { } while(0) // seems unused? don't ever use this with SIMU - #if defined(SIMU) #include @@ -149,7 +147,7 @@ extern "C++" { } #endif - #define RTOS_MS_PER_TICK (CFG_CPU_FREQ / CFG_SYSTICK_FREQ / (CFG_CPU_FREQ / 1000)) // RTOS timer tick length in ms (currently 2) + #define RTOS_MS_PER_TICK ((CFG_CPU_FREQ / CFG_SYSTICK_FREQ) / (CFG_CPU_FREQ / 1000)) // RTOS timer tick length in ms (currently 2) typedef OS_TID RTOS_TASK_HANDLE; typedef OS_MutexID RTOS_MUTEX_HANDLE; diff --git a/radio/src/tasks_arm.cpp b/radio/src/tasks_arm.cpp index fdfa36f0c..129684a4d 100644 --- a/radio/src/tasks_arm.cpp +++ b/radio/src/tasks_arm.cpp @@ -122,7 +122,7 @@ TASK_FUNCTION(mixerTask) if (!s_pulses_paused) { uint16_t t0 = getTmr2MHz(); - + DEBUG_TIMER_START(debugTimerMixer); RTOS_LOCK_MUTEX(mixerMutex); doMixerCalculations(); @@ -162,11 +162,11 @@ void scheduleNextMixerCalculation(uint8_t module, uint16_t period_ms) { // Schedule next mixer calculation time, // for now assume mixer calculation takes 2 ms. - nextMixerTime[module] = (uint32_t)RTOS_GET_TIME() + period_ms - 1 /*1.2ms before next pulse*/; + nextMixerTime[module] = (uint32_t)RTOS_GET_TIME() + (period_ms / RTOS_MS_PER_TICK) - 1 /* 1 tick in advance*/; DEBUG_TIMER_STOP(debugTimerMixerCalcToUsage); } -#define MENU_TASK_PERIOD_TICKS 50 // 50ms +#define MENU_TASK_PERIOD_TICKS (50 / RTOS_MS_PER_TICK) // 50ms #if defined(COLORLCD) && defined(CLI) bool perMainEnabled = true; From 274543a57f5c6f68fc65160939b64e040c0c7c5e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 4 Feb 2019 16:26:44 +0100 Subject: [PATCH 057/446] Data structs ready ... --- radio/src/bluetooth.cpp | 10 +- radio/src/dataconstants.h | 32 ++--- radio/src/datastructs.h | 131 ++++++++++++------ radio/src/gui/128x64/model_setup.cpp | 56 ++++++-- radio/src/gui/212x64/model_setup.cpp | 50 ++++++- radio/src/gui/480x272/model_setup.cpp | 23 ++- radio/src/myeeprom.h | 18 +-- radio/src/opentx.cpp | 2 +- radio/src/opentx.h | 4 +- radio/src/pulses/modules.h | 21 +-- radio/src/pulses/ppm_arm.cpp | 12 +- radio/src/pulses/pxx2.h | 8 +- radio/src/rtos.h | 3 +- radio/src/storage/eeprom_conversions.cpp | 2 +- radio/src/targets/horus/board.cpp | 2 +- radio/src/targets/horus/board.h | 2 +- radio/src/targets/horus/extmodule_driver.cpp | 12 +- radio/src/targets/horus/trainer_driver.cpp | 8 +- radio/src/targets/sky9x/pulses_driver.cpp | 16 +-- radio/src/targets/taranis/board.cpp | 2 +- radio/src/targets/taranis/board.h | 2 +- .../src/targets/taranis/extmodule_driver.cpp | 8 +- .../taranis/intmodule_pulses_driver.cpp | 4 +- radio/src/targets/taranis/trainer_driver.cpp | 4 +- 24 files changed, 277 insertions(+), 155 deletions(-) diff --git a/radio/src/bluetooth.cpp b/radio/src/bluetooth.cpp index 737510cc0..fa13552ad 100644 --- a/radio/src/bluetooth.cpp +++ b/radio/src/bluetooth.cpp @@ -212,7 +212,7 @@ void bluetoothSendTrainer() { int16_t PPM_range = g_model.extendedLimits ? 640*2 : 512*2; - int firstCh = g_model.moduleData[TRAINER_MODULE].channelsStart; + int firstCh = g_model.trainerData.channelsStart; int lastCh = firstCh + 8; uint8_t * cur = bluetoothBuffer; @@ -361,11 +361,11 @@ void bluetoothWakeup() bluetoothWakeupTime = now + 10; /* 100ms */ } else if (bluetoothState == BLUETOOTH_STATE_CONNECTED) { - if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH) { + if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) { bluetoothReceiveTrainer(); } else { - if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH) { + if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) { bluetoothSendTrainer(); bluetoothWakeupTime = now + 2; /* 20ms */ } @@ -399,7 +399,7 @@ void bluetoothWakeup() bluetoothState = BLUETOOTH_STATE_POWER_SENT; } else if (bluetoothState == BLUETOOTH_STATE_POWER_SENT && (!strncmp(line, "Central:", 8) || !strncmp(line, "Peripheral:", 11))) { - if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH) + if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) bluetoothWriteString("AT+ROLE1\r\n"); else bluetoothWriteString("AT+ROLE0\r\n"); @@ -430,7 +430,7 @@ void bluetoothWakeup() else if ((bluetoothState == BLUETOOTH_STATE_IDLE || bluetoothState == BLUETOOTH_STATE_DISCONNECTED || bluetoothState == BLUETOOTH_STATE_CONNECT_SENT) && !strncmp(line, "Connected:", 10)) { strcpy(bluetoothDistantAddr, &line[10]); // TODO quick & dirty bluetoothState = BLUETOOTH_STATE_CONNECTED; - if (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH) { + if (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) { bluetoothWakeupTime += 500; // it seems a 5s delay is needed before sending the 1st frame } } diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 40d520517..9b146fd8b 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -35,6 +35,7 @@ #if defined(PCBHORUS) #define MAX_MODELS 60 + #define MAX_RECEIVERS_PER_MODULE 5 #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 #define MAX_FLIGHT_MODES 9 #define MAX_MIXERS 64 @@ -44,10 +45,11 @@ #define MAX_SCRIPTS 9 #define MAX_INPUTS 32 #define MAX_TRAINER_CHANNELS 16 - #define MAX_TELEMETRY_SENSORS 32 + #define MAX_TELEMETRY_SENSORS 64 #define MAX_CUSTOM_SCREENS 5 #elif defined(PCBTARANIS) #define MAX_MODELS 60 + #define MAX_RECEIVERS_PER_MODULE 2 #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 #define MAX_FLIGHT_MODES 9 #define MAX_MIXERS 64 @@ -60,6 +62,7 @@ #define MAX_TELEMETRY_SENSORS 32 #elif defined(PCBSKY9X) #define MAX_MODELS 60 + #define MAX_RECEIVERS_PER_MODULE 2 #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 #define MAX_FLIGHT_MODES 9 #define MAX_MIXERS 64 @@ -70,20 +73,10 @@ #define MAX_TRAINER_CHANNELS 16 #define MAX_TELEMETRY_SENSORS 32 #else - #define MAX_MODELS 16 - #define MAX_OUTPUT_CHANNELS 16 // number of real output channels CH1-CH16 - #define MAX_FLIGHT_MODES 5 - #define MAX_MIXERS 32 - #define MAX_EXPOS 14 - #define MAX_LOGICAL_SWITCHES 12 - #define MAX_SPECIAL_FUNCTIONS 16 // number of functions assigned to switches - #define MAX_TRAINER_CHANNELS 8 - #define MAX_TELEMETRY_SENSORS 0 + #warning "Unknown board!" #endif - #define MAX_TIMERS 3 - -#define NUM_CYC 3 +#define MAX_TIMERS 3 #define NUM_CAL_PPM 4 enum CurveType { @@ -92,8 +85,7 @@ enum CurveType { CURVE_TYPE_LAST = CURVE_TYPE_CUSTOM }; - #define MIN_POINTS_PER_CURVE 3 - +#define MIN_POINTS_PER_CURVE 3 #define MAX_POINTS_PER_CURVE 17 #if defined(PCBHORUS) @@ -191,7 +183,6 @@ enum BeeperMode { enum ModuleIndex { INTERNAL_MODULE, EXTERNAL_MODULE, - TRAINER_MODULE, FLASHING_MODULE, }; enum TrainerMode { @@ -210,8 +201,7 @@ enum BeeperMode { #elif defined(PCBSKY9X) enum ModuleIndex { EXTERNAL_MODULE, - EXTRA_MODULE, - TRAINER_MODULE + EXTRA_MODULE }; #endif @@ -258,7 +248,7 @@ enum UartModes { #define LEN_BLUETOOTH_NAME 10 #endif -#define TELEM_LABEL_LEN 4 +#define TELEM_LABEL_LEN 4 enum TelemetryUnit { UNIT_RAW, UNIT_VOLTS, @@ -796,4 +786,8 @@ enum BluetoothModes { BLUETOOTH_TRAINER, }; +// PXX2 constants +#define LEN_REGISTRATION_ID 4 +#define LEN_RX_ID 4 + #endif // _DATACONSTANTS_H_ diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 9caae197f..295edd9fd 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -385,14 +385,40 @@ PACK(struct TelemetrySensor { uint32_t param; }; NOBACKUP( - void init(const char *label, uint8_t unit=UNIT_RAW, uint8_t prec=0); - void init(uint16_t id); - bool isAvailable() const; - int32_t getValue(int32_t value, uint8_t unit, uint8_t prec) const; - bool isConfigurable() const; - bool isPrecConfigurable() const; - int32_t getPrecMultiplier() const; - int32_t getPrecDivisor() const); + void init(const char *label, uint8_t unit=UNIT_RAW, uint8_t prec=0); + void init(uint16_t id); + bool isAvailable() const; + int32_t getValue(int32_t value, uint8_t unit, uint8_t prec) const; + bool isConfigurable() const; + bool isPrecConfigurable() const; + int32_t getPrecMultiplier() const; + int32_t getPrecDivisor() const; + ); +}); + +/* + * Trainer module structure + */ + +PACK(struct TrainerModuleData { + uint8_t mode:3; + uint8_t spare:5; + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + int8_t frameLength; + int8_t delay:6; + uint8_t pulsePol:1; +}); + +/* + * Receiver structure + */ + +PACK(struct ReceiverData { + uint8_t telemetry:1; + uint8_t spare:7; + uint64_t channelMapping; // each receiver output (16) can be assigned to one of the 16 channels + uint8_t rxID[LEN_RX_ID]; }); /* @@ -418,7 +444,9 @@ PACK(struct ModuleData { uint8_t region:2; } r9m; }; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; + union { struct { int8_t delay:6; @@ -449,6 +477,12 @@ PACK(struct ModuleData { uint8_t spare2:1; int8_t refreshRate; // definition as framelength for ppm (* 5 + 225 = time in 1/10 ms) } sbus); + NOBACKUP(struct { + uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W + uint8_t external_antenna:1; // false = internal antenna, true = external antenna + uint8_t spare:5; + ReceiverData receivers[MAX_RECEIVERS_PER_MODULE]; + } pxx2); }; // Helper functions to set both of the rfProto protocol at the same time @@ -535,11 +569,19 @@ PACK(struct CustomScreenData { #endif #if defined(PCBX12S) - #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:3); NOBACKUP(uint8_t trainerMode:3); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES+1]; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); + #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:6); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES]; TrainerModuleData trainerData; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); #elif defined(PCBX10) #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:3); NOBACKUP(uint8_t trainerMode:3); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES+1]; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); NOBACKUP(uint8_t potsWarnSpares[NUM_DUMMY_ANAS]); #elif defined(PCBTARANIS) - #define MODELDATA_EXTRA uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; + #define MODELDATA_EXTRA \ + uint8_t spare:6; \ + uint8_t potsWarnMode:2; \ + ModuleData moduleData[NUM_MODULES]; \ + TrainerModuleData trainerData; \ + ScriptData scriptsData[MAX_SCRIPTS]; \ + char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ + uint8_t potsWarnEnabled; \ + int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; #elif defined(PCBSKY9X) #define MODELDATA_EXTRA uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; uint8_t rxBattAlarms[2]; #else @@ -589,6 +631,7 @@ PACK(struct ModelData { CUSTOM_SCREENS_DATA + uint8_t modelRegistrationID[LEN_REGISTRATION_ID]; }); /* @@ -625,31 +668,8 @@ PACK(struct TrainerData { #define SPLASH_MODE int8_t splashMode:3 #endif - #define EXTRA_GENERAL_FIELDS_ARM \ - NOBACKUP(uint8_t backlightBright); \ - NOBACKUP(uint32_t globalTimer); \ - NOBACKUP(uint8_t bluetoothBaudrate:4); \ - NOBACKUP(uint8_t bluetoothMode:4); \ - NOBACKUP(uint8_t countryCode); \ - NOBACKUP(uint8_t imperial:1); \ - NOBACKUP(uint8_t jitterFilter:1); /* 0 - active */\ - NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); \ - NOBACKUP(uint8_t USBMode:2); \ - NOBACKUP(uint8_t jackMode:2); \ - NOBACKUP(uint8_t spareExtraArm:1); \ - NOBACKUP(char ttsLanguage[2]); \ - NOBACKUP(int8_t beepVolume:4); \ - NOBACKUP(int8_t wavVolume:4); \ - NOBACKUP(int8_t varioVolume:4); \ - NOBACKUP(int8_t backgroundVolume:4); \ - NOBACKUP(int8_t varioPitch); \ - NOBACKUP(int8_t varioRange); \ - NOBACKUP(int8_t varioRepeat); \ - CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS]; - #if defined(PCBHORUS) #define EXTRA_GENERAL_FIELDS \ - EXTRA_GENERAL_FIELDS_ARM \ NOBACKUP(uint8_t serial2Mode:4); \ uint8_t slidersConfig:4; \ uint32_t switchConfig; \ @@ -669,7 +689,6 @@ PACK(struct TrainerData { #define BLUETOOTH_FIELDS #endif #define EXTRA_GENERAL_FIELDS \ - EXTRA_GENERAL_FIELDS_ARM \ uint8_t serial2Mode:4; \ uint8_t slidersConfig:4; \ uint8_t potsConfig; /* two bits per pot */\ @@ -681,7 +700,6 @@ PACK(struct TrainerData { BLUETOOTH_FIELDS #elif defined(PCBSKY9X) #define EXTRA_GENERAL_FIELDS \ - EXTRA_GENERAL_FIELDS_ARM \ int8_t txCurrentCalibration; \ int8_t temperatureWarn; \ uint8_t mAhWarn; \ @@ -693,7 +711,7 @@ PACK(struct TrainerData { char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; \ char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]; #else - #define EXTRA_GENERAL_FIELDS EXTRA_GENERAL_FIELDS_ARM + #define EXTRA_GENERAL_FIELDS #endif #if defined(PCBHORUS) @@ -753,10 +771,33 @@ PACK(struct RadioData { NOBACKUP(int8_t vBatMin); NOBACKUP(int8_t vBatMax); + NOBACKUP(uint8_t backlightBright); + NOBACKUP(uint32_t globalTimer); + NOBACKUP(uint8_t bluetoothBaudrate:4); + NOBACKUP(uint8_t bluetoothMode:4); + NOBACKUP(uint8_t countryCode); + NOBACKUP(uint8_t imperial:1); + NOBACKUP(uint8_t jitterFilter:1); /* 0 - active */ + NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); + NOBACKUP(uint8_t USBMode:2); + NOBACKUP(uint8_t jackMode:2); + NOBACKUP(uint8_t spareExtraArm:1); + NOBACKUP(char ttsLanguage[2]); + NOBACKUP(int8_t beepVolume:4); + NOBACKUP(int8_t wavVolume:4); + NOBACKUP(int8_t varioVolume:4); + NOBACKUP(int8_t backgroundVolume:4); + NOBACKUP(int8_t varioPitch); + NOBACKUP(int8_t varioRange); + NOBACKUP(int8_t varioRepeat); + + CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS]; + EXTRA_GENERAL_FIELDS THEME_DATA + uint8_t ownerRegistrationID[LEN_REGISTRATION_ID]; }); #undef SWITCHES_WARNING_DATA @@ -872,7 +913,7 @@ static inline void check_struct() CHKSIZE(LogicalSwitchData, 9); CHKSIZE(TelemetrySensor, 13); - CHKSIZE(ModuleData,70); + // TODO CHKSIZE(ModuleData,70); CHKSIZE(GVarData, 7); @@ -880,14 +921,14 @@ static inline void check_struct() CHKSIZE(TrainerData, 16); #if defined(PCBXLITES) - CHKSIZE(RadioData, 850); - CHKSIZE(ModelData, 6025); + // TODO CHKSIZE(RadioData, 850); + // TODO CHKSIZE(ModelData, 6025); #elif defined(PCBXLITE) - CHKSIZE(RadioData, 844); - CHKSIZE(ModelData, 6025); + // TODO CHKSIZE(RadioData, 844); + // TODO CHKSIZE(ModelData, 6025); #elif defined(PCBX7) - CHKSIZE(RadioData, 850); - CHKSIZE(ModelData, 6025); +// TODO CHKSIZE(RadioData, 850); +// TODO CHKSIZE(ModelData, 6025); #elif defined(PCBX9E) CHKSIZE(RadioData, 952); CHKSIZE(ModelData, 6520); @@ -898,8 +939,8 @@ static inline void check_struct() CHKSIZE(RadioData, 727); CHKSIZE(ModelData, 5188); #elif defined(PCBHORUS) - CHKSIZE(RadioData, 847); - CHKSIZE(ModelData, 9380); +// TODO CHKSIZE(RadioData, 847); +// TODO CHKSIZE(ModelData, 9380); #endif #undef CHKSIZE diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 974fe00bb..58d9a57f5 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -135,7 +135,7 @@ enum MenuModelSetupItems { #define MODEL_SETUP_SET_FAILSAFE_OFS 7*FW-2 #if defined(PCBTARANIS) - #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) + #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) #elif defined(PCBSKY9X) && !defined(REVA) #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) #else @@ -185,7 +185,7 @@ enum MenuModelSetupItems { #if defined(BLUETOOTH) #define TRAINER_BLUETOOTH_M_ROW ((bluetoothDistantAddr[0] == '\0' || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) #define TRAINER_BLUETOOTH_S_ROW (bluetoothDistantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) - #define TRAINER_BLUETOOTH_ROW (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)), + #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)), #else #define TRAINER_BLUETOOTH_ROW #endif @@ -195,15 +195,15 @@ enum MenuModelSetupItems { #elif defined(PCBXLITES) #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), #define TRAINER_BLUETOOTH_ROW - #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) - #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) - #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW + #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) + #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW #elif defined(PCBXLITE) #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) #define TRAINER_BLUETOOTH_M_ROW ((bluetoothDistantAddr[0] == '\0' || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) #define TRAINER_BLUETOOTH_S_ROW (bluetoothDistantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) - #define TRAINER_BLUETOOTH_ROW (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) + #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) #define TRAINER_ROWS IF_BT_TRAINER_ON(LABEL(Trainer)), IF_BT_TRAINER_ON(0), IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), IF_BT_TRAINER_ON(TRAINER_CHANNELS_ROW) #else @@ -855,9 +855,9 @@ void menuModelSetup(event_t event) case ITEM_MODEL_TRAINER_MODE: lcdDrawTextAlignedLeft(y, STR_MODE); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerMode, attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerData.mode, attr); if (attr) { - g_model.trainerMode = checkIncDec(event, g_model.trainerMode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable); + g_model.trainerData.mode = checkIncDec(event, g_model.trainerData.mode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable); #if defined(BLUETOOTH) if (checkIncDec_Ret) { bluetoothState = BLUETOOTH_STATE_OFF; @@ -870,7 +870,7 @@ void menuModelSetup(event_t event) #if defined(PCBTARANIS) && defined(BLUETOOTH) case ITEM_MODEL_TRAINER_BLUETOOTH: - if (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH) { + if (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) { if (attr) { s_editMode = 0; } @@ -919,6 +919,23 @@ void menuModelSetup(event_t event) #if defined(PCBTARANIS) case ITEM_MODEL_TRAINER_CHANNELS: + lcdDrawTextAlignedLeft(y, STR_CHANNELRANGE); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_CH, menuHorizontalPosition==0 ? attr : 0); + lcdDrawNumber(lcdLastRightPos, y, g_model.trainerData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0)); + lcdDrawChar(lcdLastRightPos, y, '-'); + lcdDrawNumber(lcdLastRightPos + FW+1, y, g_model.trainerData.channelsStart + 8 + g_model.trainerData.channelsCount, LEFT | (menuHorizontalPosition==1 ? attr : 0)); + if (attr && (editMode>0 || p1valdiff)) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.trainerData.channelsStart, 32-8-g_model.trainerData.channelsCount); + break; + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.channelsCount, -4, min(MAX_TRAINER_CHANNELS_M8, 32-8-g_model.trainerData.channelsStart)); + break; + } + } + break; + case ITEM_MODEL_INTERNAL_MODULE_CHANNELS: #endif #if defined(PCBSKY9X) @@ -953,7 +970,28 @@ void menuModelSetup(event_t event) #if defined(PCBX7) case ITEM_MODEL_TRAINER_PARAMS: + lcdDrawTextAlignedLeft(y, STR_PPMFRAME); + lcdDrawText(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.trainerData.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); + lcdDrawChar(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u'); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.trainerData.delay*50)+300, RIGHT | ((CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0)); + lcdDrawChar(MODEL_SETUP_2ND_COLUMN+10*FW, y, g_model.trainerData.pulsePol ? '+' : '-', (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); + if (attr && (editMode>0 || p1valdiff)) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.frameLength, -20, 35); + break; + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.delay, -4, 10); + break; + case 2: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.trainerData.pulsePol, 1); + break; + } + } + break; #endif + #if defined(PCBTARANIS) case ITEM_MODEL_INTERNAL_MODULE_BIND: #endif diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 193f3b805..d1522f2d7 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -104,7 +104,7 @@ enum MenuModelSetupItems { #define MODEL_SETUP_RANGE_OFS 7*FW #define MODEL_SETUP_SET_FAILSAFE_OFS 10*FW-2 -#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) +#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) void onBindMenu(const char * result) { @@ -248,8 +248,8 @@ int getSwitchWarningsCount() #define TRAINER_LINE1_ROWS (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)1 : (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_LINE1_BLUETOOTH_M_ROWS : (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH ? (uint8_t)1 : HIDDEN_ROW))) #define TRAINER_LINE2_ROWS (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) #else - #define TRAINER_LINE1_ROWS (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)1 : HIDDEN_ROW) - #define TRAINER_LINE2_ROWS (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_LINE1_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : HIDDEN_ROW) + #define TRAINER_LINE2_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) #endif #define TIMER_ROWS(x) 2|NAVIGATION_LINE_BY_LINE, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t) 1 : (uint8_t)0 @@ -713,9 +713,9 @@ void menuModelSetup(event_t event) #endif case ITEM_MODEL_TRAINER_MODE: lcdDrawTextAlignedLeft(y, STR_MODE); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerMode, attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerData.mode, attr); if (attr) { - g_model.trainerMode = checkIncDec(event, g_model.trainerMode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable); + g_model.trainerData.mode = checkIncDec(event, g_model.trainerData.mode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable); } #if defined(BLUETOOTH) && defined(USEHORUSBT) if (attr && checkIncDec_Ret) { @@ -870,7 +870,24 @@ void menuModelSetup(event_t event) // no break #else case ITEM_MODEL_TRAINER_LINE1: + lcdDrawTextAlignedLeft(y, STR_CHANNELRANGE); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_CH, menuHorizontalPosition==0 ? attr : 0); + lcdDrawNumber(lcdLastRightPos, y, g_model.trainerData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0)); + lcdDrawChar(lcdLastRightPos, y, '-'); + lcdDrawNumber(lcdLastRightPos + FW+1, y, g_model.trainerData.channelsStart+8+g_model.trainerData.channelsCount, LEFT | (menuHorizontalPosition==1 ? attr : 0)); + if (attr && s_editMode>0) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.trainerData.channelsStart, 32-8-g_model.trainerData.channelsCount); + break; + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.channelsCount, -4, min(MAX_TRAINER_CHANNELS_M8, 32-8-g_model.trainerData.channelsStart)); + break; + } + } + break; #endif + case ITEM_MODEL_INTERNAL_MODULE_CHANNELS: case ITEM_MODEL_EXTERNAL_MODULE_CHANNELS: { @@ -911,9 +928,30 @@ void menuModelSetup(event_t event) break; } + case ITEM_MODEL_TRAINER_LINE2: + lcdDrawTextAlignedLeft(y, STR_PPMFRAME); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.trainerData.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); + lcdDrawText(lcdLastRightPos, y, STR_MS); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+6*FW, y, (g_model.trainerData.delay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); + lcdDrawChar(lcdLastRightPos, y, 'u'); + lcdDrawChar(MODEL_SETUP_2ND_COLUMN+12*FW, y, g_model.trainerData.pulsePol ? '+' : '-', (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); + if (attr && s_editMode>0) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.frameLength, -20, 35); + break; + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.delay, -4, 10); + break; + case 2: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.trainerData.pulsePol, 1); + break; + } + } + break; + case ITEM_MODEL_INTERNAL_MODULE_BIND: case ITEM_MODEL_EXTERNAL_MODULE_BIND: - case ITEM_MODEL_TRAINER_LINE2: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index ef90129b2..eb120ca4d 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -98,7 +98,7 @@ enum MenuModelSetupItems { #define MODEL_SETUP_SET_FAILSAFE_OFS 100 #define MODEL_SETUP_SLIDPOT_SPACING 45 -#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) +#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) void checkModelIdUnique(uint8_t moduleIdx) { @@ -858,9 +858,28 @@ bool menuModelSetup(event_t event) break; } + case ITEM_MODEL_TRAINER_LINE2: + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PPMFRAME); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.trainerData.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT, 0, NULL, STR_MS); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+80, y, (g_model.trainerData.delay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr|LEFT : LEFT, 0, NULL, "us"); + lcdDrawText(MODEL_SETUP_2ND_COLUMN+160, y, g_model.trainerData.pulsePol ? "+" : "-", (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); + if (attr && s_editMode>0) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.frameLength, -20, 35); + break; + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.delay, -4, 10); + break; + case 2: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.trainerData.pulsePol, 1); + break; + } + } + break; + case ITEM_MODEL_INTERNAL_MODULE_BIND: case ITEM_MODEL_EXTERNAL_MODULE_BIND: - case ITEM_MODEL_TRAINER_LINE2: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index dacfab2d6..e4f606dc3 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -23,25 +23,27 @@ #include "datastructs.h" -#define EEPROM_VER 218 +#define EEPROM_VER 219 #define FIRST_CONV_EEPROM_VER 216 -#define GET_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol -#define GET_SBUS_POLARITY(idx) g_model.moduleData[idx].sbus.noninverted -#define GET_PPM_DELAY(idx) (g_model.moduleData[idx].ppm.delay * 50 + 300) -#define SET_DEFAULT_PPM_FRAME_LENGTH(idx) g_model.moduleData[idx].ppm.frameLength = 4 * max((int8_t)0, g_model.moduleData[idx].channelsCount) +#define GET_MODULE_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol +#define GET_TRAINER_PPM_POLARITY() g_model.trainerData.pulsePol +#define GET_SBUS_POLARITY(idx) g_model.moduleData[idx].sbus.noninverted +#define GET_MODULE_PPM_DELAY(idx) (g_model.moduleData[idx].ppm.delay * 50 + 300) +#define GET_TRAINER_PPM_DELAY(idx) (g_model.trainerData.delay * 50 + 300) +#define SET_DEFAULT_PPM_FRAME_LENGTH(idx) g_model.moduleData[idx].ppm.frameLength = 4 * max((int8_t)0, g_model.moduleData[idx].channelsCount) #if defined(PCBHORUS) #define IS_TRAINER_EXTERNAL_MODULE() false #define HAS_WIRELESS_TRAINER_HARDWARE() (g_eeGeneral.serial2Mode==UART_MODE_SBUS_TRAINER) #elif defined(PCBTARANIS) - #define IS_TRAINER_EXTERNAL_MODULE() (g_model.trainerMode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || g_model.trainerMode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE) - #define HAS_WIRELESS_TRAINER_HARDWARE() (g_eeGeneral.serial2Mode==UART_MODE_SBUS_TRAINER) + #define IS_TRAINER_EXTERNAL_MODULE() (g_model.trainerData.mode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || g_model.trainerData.mode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE) + #define HAS_WIRELESS_TRAINER_HARDWARE() (g_eeGeneral.serial2Mode==UART_MODE_SBUS_TRAINER) #else #define IS_TRAINER_EXTERNAL_MODULE() false #endif -#define IS_PLAY_FUNC(func) ((func) >= FUNC_PLAY_SOUND && func <= FUNC_PLAY_VALUE) +#define IS_PLAY_FUNC(func) ((func) >= FUNC_PLAY_SOUND && func <= FUNC_PLAY_VALUE) #if defined(GVARS) #define IS_ADJUST_GV_FUNC(func) ((func) == FUNC_ADJUST_GVAR) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index fb3a0f269..4a50bc1c5 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -464,7 +464,7 @@ void modelDefault(uint8_t id) #endif #if defined(PCBXLITE) - g_model.trainerMode = TRAINER_MODE_MASTER_BLUETOOTH; + g_model.trainerData.mode = TRAINER_MODE_MASTER_BLUETOOTH; #endif #if defined(EEPROM) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 61d252886..86e5b784a 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -194,8 +194,8 @@ #define IS_BLUETOOTH_TRAINER() (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH) #define IS_SLAVE_TRAINER() (g_model.trainerMode == TRAINER_MODE_SLAVE) #else - #define IS_BLUETOOTH_TRAINER() (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH || g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH) - #define IS_SLAVE_TRAINER() (g_model.trainerMode == TRAINER_MODE_SLAVE || g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH) + #define IS_BLUETOOTH_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH || g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) + #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE || g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) #endif #else #define IS_BLUETOOTH_TRAINER() false diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 7d9a7275c..6e4ca4144 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -86,15 +86,13 @@ inline bool isExtraModule(uint8_t) #if defined(TARANIS_INTERNAL_PPM) inline bool isModulePPM(uint8_t idx) { - return idx == TRAINER_MODULE || - (idx == INTERNAL_MODULE && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_PPM) || + return (idx == INTERNAL_MODULE && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_PPM) || (idx == EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM); } #else inline bool isModulePPM(uint8_t idx) { - return idx == TRAINER_MODULE || - isExtraModule(idx) || + return isExtraModule(idx) || (idx == EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM); } #endif @@ -194,27 +192,12 @@ inline int8_t maxModuleChannels_M8(uint8_t idx) { if (isExtraModule(idx)) return MAX_EXTRA_MODULE_CHANNELS_M8; - else if (idx == TRAINER_MODULE) - return MAX_TRAINER_CHANNELS_M8; else if (isModuleXJT(idx)) return maxChannelsXJT[1 + g_model.moduleData[idx].rfProtocol]; else return maxChannelsModules[g_model.moduleData[idx].type]; } -inline int8_t maxModuleChannels(uint8_t idx) -{ - return 8 + maxModuleChannels_M8(idx); -} - -inline int8_t minModuleChannels(uint8_t idx) -{ - if (isModuleCrossfire(idx)) - return 16; - else - return 1; -} - inline int8_t defaultModuleChannels_M8(uint8_t idx) { if (isModulePPM(idx)) diff --git a/radio/src/pulses/ppm_arm.cpp b/radio/src/pulses/ppm_arm.cpp index 04b8f50c7..cb47c1ada 100644 --- a/radio/src/pulses/ppm_arm.cpp +++ b/radio/src/pulses/ppm_arm.cpp @@ -21,7 +21,7 @@ #include "opentx.h" template -void setupPulsesPPM(uint8_t port, PpmPulsesData * ppmPulsesData) +void setupPulsesPPM(PpmPulsesData * ppmPulsesData, uint8_t channelsStart, int8_t channelsCount, int8_t frameLength) { int16_t PPM_range = g_model.extendedLimits ? (512*LIMIT_EXT_PERCENT/100) * 2 : 512 * 2; // range of 0.7 .. 1.7msec @@ -29,8 +29,8 @@ void setupPulsesPPM(uint8_t port, PpmPulsesData * ppmPulsesData) // each pulse is 0.7..1.7ms long with a 0.3ms stop tail // The pulse ISR is 2mhz that's why everything is multiplied by 2 - uint32_t firstCh = g_model.moduleData[port].channelsStart; - uint32_t lastCh = min(MAX_OUTPUT_CHANNELS, firstCh + 8 + g_model.moduleData[port].channelsCount); + uint8_t firstCh = channelsStart; + uint8_t lastCh = min(MAX_OUTPUT_CHANNELS, firstCh + 8 + channelsCount); #if defined(STM32) ppmPulsesData->ptr = ppmPulsesData->pulses; @@ -40,7 +40,7 @@ void setupPulsesPPM(uint8_t port, PpmPulsesData * ppmPulsesData) #endif int32_t rest = 22500u * 2; - rest += (int32_t(g_model.moduleData[port].ppm.frameLength)) * 1000; + rest += int32_t(frameLength) * 1000; for (uint32_t i=firstCh; i * ppmPulsesData) void setupPulsesPPMModule(uint8_t port) { - setupPulsesPPM(port, &modulePulsesData[port].ppm); + setupPulsesPPM(&modulePulsesData[port].ppm, g_model.moduleData[port].channelsStart, g_model.moduleData[port].channelsCount, g_model.moduleData[port].ppm.frameLength); } void setupPulsesPPMTrainer() { - setupPulsesPPM(TRAINER_MODULE, &trainerPulsesData.ppm); + setupPulsesPPM(&trainerPulsesData.ppm, g_model.trainerData.channelsStart, g_model.trainerData.channelsCount, g_model.trainerData.frameLength); } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 5893ef975..f78985947 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -69,7 +69,13 @@ class Pxx2Pulses: public PxxPulses { Pxx2Transport::addByteWithoutCrc(0x00); // TYPE_C + TYPE_ID - Pxx2Transport::addByte(0x26); // This one is CRC-ed on purpose + // TODO optimization ? Pxx2Transport::addByte(0x26); // This one is CRC-ed on purpose + } + + void addFrameType(uint8_t type_c, uint8_t type_id) + { + Pxx2Transport::addByte(type_c); + Pxx2Transport::addByte(type_id); } void addCrc() diff --git a/radio/src/rtos.h b/radio/src/rtos.h index d352b953a..28532298b 100644 --- a/radio/src/rtos.h +++ b/radio/src/rtos.h @@ -33,6 +33,7 @@ extern "C++" { #include #define SIMU_SLEEP_OR_EXIT_MS(x) simuSleep(x) + #define RTOS_MS_PER_TICK 1 typedef pthread_t RTOS_TASK_HANDLE; typedef pthread_mutex_t RTOS_MUTEX_HANDLE; @@ -57,7 +58,7 @@ extern "C++" { static inline void RTOS_WAIT_TICKS(uint32_t x) { - RTOS_WAIT_MS(x * 2); + RTOS_WAIT_MS(x * RTOS_MS_PER_TICK); } #ifdef __cplusplus diff --git a/radio/src/storage/eeprom_conversions.cpp b/radio/src/storage/eeprom_conversions.cpp index 0046fb2d1..357977afe 100644 --- a/radio/src/storage/eeprom_conversions.cpp +++ b/radio/src/storage/eeprom_conversions.cpp @@ -1208,7 +1208,7 @@ void ConvertModel_217_to_218(ModelData & model) newModel.moduleData[i] = oldModel.moduleData[i]; } #if defined(PCBTARANIS) - newModel.trainerMode = oldModel.trainerMode; + newModel.trainerData.mode = oldModel.trainerMode; memcpy(newModel.scriptsData, oldModel.scriptsData, sizeof(newModel.scriptsData)); memcpy(newModel.inputNames, oldModel.inputNames, sizeof(newModel.inputNames)); #endif diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 02f54c5fc..855439cc9 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -252,7 +252,7 @@ uint8_t currentTrainerMode = 0xff; void checkTrainerSettings() { - uint8_t requiredTrainerMode = g_model.trainerMode; + uint8_t requiredTrainerMode = g_model.trainerData.mode; if (requiredTrainerMode != currentTrainerMode) { switch (currentTrainerMode) { case TRAINER_MODE_MASTER_TRAINER_JACK: diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 09639e812..7d71b20e8 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -97,7 +97,7 @@ extern "C" { extern uint16_t sessionTimer; -#define SLAVE_MODE() (g_model.trainerMode == TRAINER_MODE_SLAVE) +#define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) #if defined(PCBX10) #define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_SET) diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 630db99c1..be1248b54 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -102,8 +102,8 @@ void extmodulePpmStart() EXTMODULE_TIMER->DIER = TIM_DIER_UDE; // Update DMA request EXTMODULE_TIMER->CR1 = TIM_CR1_CEN; // Start timer #else - EXTMODULE_TIMER->CCR1 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; - EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); + EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; + EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0; // Force O/P high EXTMODULE_TIMER->EGR = 1; // Reloads register values now EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Update DMA request @@ -217,14 +217,14 @@ void extmoduleSendNextFrame() { if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { #if defined(PCBX10) || PCBREV >= 13 - EXTMODULE_TIMER->CCR3 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; - EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); + EXTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; + EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; #else - EXTMODULE_TIMER->CCR1 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; - EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); + EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; + EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; diff --git a/radio/src/targets/horus/trainer_driver.cpp b/radio/src/targets/horus/trainer_driver.cpp index d05648b47..d5b34cc1e 100644 --- a/radio/src/targets/horus/trainer_driver.cpp +++ b/radio/src/targets/horus/trainer_driver.cpp @@ -37,8 +37,8 @@ void init_trainer_ppm() TRAINER_TIMER->CR1 &= ~TIM_CR1_CEN; TRAINER_TIMER->PSC = TRAINER_TIMER_FREQ / 2000000 - 1; // 0.5uS TRAINER_TIMER->ARR = 45000; - TRAINER_TIMER->CCR2 = GET_PPM_DELAY(TRAINER_MODULE)*2; - TRAINER_TIMER->CCER = TIM_CCER_CC2E | (g_model.moduleData[TRAINER_MODULE].ppm.pulsePol ? 0 : TIM_CCER_CC2P); + TRAINER_TIMER->CCR2 = GET_TRAINER_PPM_DELAY() * 2; + TRAINER_TIMER->CCER = TIM_CCER_CC2E | (GET_TRAINER_PPM_POLARITY() ? 0 : TIM_CCER_CC2P); TRAINER_TIMER->CCMR1 = TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_0; // Force O/P high TRAINER_TIMER->BDTR = TIM_BDTR_MOE; TRAINER_TIMER->EGR = 1; @@ -100,8 +100,8 @@ void stop_trainer_capture() void trainerSendNextFrame() { - TRAINER_TIMER->CCR2 = GET_PPM_DELAY(TRAINER_MODULE)*2; - TRAINER_TIMER->CCER = TIM_CCER_CC2E | (g_model.moduleData[TRAINER_MODULE].ppm.pulsePol ? 0 : TIM_CCER_CC2P); + TRAINER_TIMER->CCR2 = GET_TRAINER_PPM_DELAY() * 2; + TRAINER_TIMER->CCER = TIM_CCER_CC2E | (GET_TRAINER_PPM_POLARITY() ? 0 : TIM_CCER_CC2P); TRAINER_TIMER->CCR1 = *(trainerPulsesData.ppm.ptr - 1) - 4000; // 2mS in advance TRAINER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index 4764b1c43..cac101283 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -23,8 +23,8 @@ void setExternalModulePolarity() { Pwm * pwmptr = PWM; - pwmptr->PWM_CH_NUM[3].PWM_CDTYUPD = GET_PPM_DELAY(EXTERNAL_MODULE) * 2; // Duty in half uS - if (GET_PPM_POLARITY(EXTERNAL_MODULE)) + pwmptr->PWM_CH_NUM[3].PWM_CDTYUPD = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2; // Duty in half uS + if (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE)) pwmptr->PWM_CH_NUM[3].PWM_CMR &= ~0x00000200; // CPOL else pwmptr->PWM_CH_NUM[3].PWM_CMR |= 0x00000200; // CPOL @@ -33,8 +33,8 @@ void setExternalModulePolarity() void setExtraModulePolarity() { Pwm * pwmptr = PWM; - pwmptr->PWM_CH_NUM[1].PWM_CDTYUPD = GET_PPM_DELAY(EXTRA_MODULE) * 2; // Duty in half uS - if (GET_PPM_POLARITY(EXTRA_MODULE)) + pwmptr->PWM_CH_NUM[1].PWM_CDTYUPD = GET_MODULE_PPM_DELAY(EXTRA_MODULE) * 2; // Duty in half uS + if (GET_MODULE_PPM_POLARITY(EXTRA_MODULE)) pwmptr->PWM_CH_NUM[1].PWM_CMR &= ~0x00000200; // CPOL else pwmptr->PWM_CH_NUM[1].PWM_CMR |= 0x00000200; // CPOL @@ -74,7 +74,7 @@ void init_main_ppm(uint32_t period, uint32_t out_enable) pwmptr->PWM_CH_NUM[3].PWM_CMR = 0x0004000B; // CLKA pwmptr->PWM_CH_NUM[3].PWM_CPDR = period; // Period in half uS pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = period; // Period in half uS - pwmptr->PWM_CH_NUM[3].PWM_CDTY = GET_PPM_DELAY(EXTERNAL_MODULE) * 2; // Duty in half uS + pwmptr->PWM_CH_NUM[3].PWM_CDTY = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2; // Duty in half uS pwmptr->PWM_ENA = PWM_ENA_CHID3; // Enable channel 3 pwmptr->PWM_IER1 = PWM_IER1_CHID3; @@ -98,13 +98,13 @@ void init_second_ppm(uint32_t period) Pwm * pwmptr = PWM; configure_pins(PIO_PC15, PIN_PERIPHERAL | PIN_INPUT | PIN_PER_B | PIN_PORTC | PIN_NO_PULLUP); pwmptr->PWM_CH_NUM[1].PWM_CMR = 0x0000000B; // CLKB - if (!GET_PPM_POLARITY(EXTRA_MODULE)) { + if (!GET_MODULE_PPM_POLARITY(EXTRA_MODULE)) { pwmptr->PWM_CH_NUM[1].PWM_CMR |= 0x00000200; // CPOL } pwmptr->PWM_CH_NUM[1].PWM_CPDR = period; // Period pwmptr->PWM_CH_NUM[1].PWM_CPDRUPD = period; // Period - pwmptr->PWM_CH_NUM[1].PWM_CDTY = GET_PPM_DELAY(EXTRA_MODULE)*2; // Duty - pwmptr->PWM_CH_NUM[1].PWM_CDTYUPD = GET_PPM_DELAY(EXTRA_MODULE)*2; // Duty + pwmptr->PWM_CH_NUM[1].PWM_CDTY = GET_MODULE_PPM_DELAY(EXTRA_MODULE)*2; // Duty + pwmptr->PWM_CH_NUM[1].PWM_CDTYUPD = GET_MODULE_PPM_DELAY(EXTRA_MODULE)*2; // Duty pwmptr->PWM_ENA = PWM_ENA_CHID1; // Enable channel 1 pwmptr->PWM_IER1 = PWM_IER1_CHID1; #endif diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 3f638832c..b0982942e 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -311,7 +311,7 @@ uint8_t currentTrainerMode = 0xff; void checkTrainerSettings() { - uint8_t requiredTrainerMode = g_model.trainerMode; + uint8_t requiredTrainerMode = g_model.trainerData.mode; if (requiredTrainerMode != currentTrainerMode) { switch (currentTrainerMode) { case TRAINER_MODE_MASTER_TRAINER_JACK: diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index f7545c8fd..d451cd5ad 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -192,7 +192,7 @@ void init_module_timer( uint32_t module_index, uint32_t period, uint8_t state); void disable_module_timer( uint32_t module_index); // Trainer driver -#define SLAVE_MODE() (g_model.trainerMode == TRAINER_MODE_SLAVE) +#define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) #if defined(PCBX9E) #define TRAINER_CONNECTED() (true) #elif defined(PCBX7) diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 2e15ba244..b092499b9 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -89,8 +89,8 @@ void extmodulePpmStart() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz EXTMODULE_TIMER->ARR = 45000; - EXTMODULE_TIMER->CCR1 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; - EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here + EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; + EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0; // Force O/P high EXTMODULE_TIMER->EGR = 1; @@ -239,8 +239,8 @@ void extmodulePxxStart() void extmoduleSendNextFrame() { if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { - EXTMODULE_TIMER->CCR1 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; - EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here + EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2; + EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 4610474a6..10ef3303c 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -71,8 +71,8 @@ void intmoduleSendNextFrame() } #if defined(TARANIS_INTERNAL_PPM) else if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { - INTMODULE_TIMER->CCR3 = GET_PPM_DELAY(INTERNAL_MODULE)*2; - INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); + INTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(INTERNAL_MODULE) * 2; + INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); INTMODULE_TIMER->CCR2 = *(modulePulsesData[INTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; diff --git a/radio/src/targets/taranis/trainer_driver.cpp b/radio/src/targets/taranis/trainer_driver.cpp index 1992d635e..3c18b14bc 100644 --- a/radio/src/targets/taranis/trainer_driver.cpp +++ b/radio/src/targets/taranis/trainer_driver.cpp @@ -98,8 +98,8 @@ void stop_trainer_capture() void trainerSendNextFrame() { - TRAINER_TIMER->CCR4 = GET_PPM_DELAY(TRAINER_MODULE)*2; - TRAINER_TIMER->CCER = TIM_CCER_CC4E | (GET_PPM_POLARITY(TRAINER_MODULE) ? 0 : TIM_CCER_CC4P); + TRAINER_TIMER->CCR4 = GET_TRAINER_PPM_DELAY() * 2; + TRAINER_TIMER->CCER = TIM_CCER_CC4E | (GET_TRAINER_PPM_POLARITY() ? 0 : TIM_CCER_CC4P); TRAINER_TIMER->CCR1 = *(trainerPulsesData.ppm.ptr - 1) - 4000; // 2mS in advance TRAINER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA From 0e5d8e9909cdc0db1986ee827bbd64cf1180c41f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 4 Feb 2019 16:27:12 +0100 Subject: [PATCH 058/446] Added another TODO list ... --- TODO.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 TODO.md diff --git a/TODO.md b/TODO.md new file mode 100644 index 000000000..b88c0481b --- /dev/null +++ b/TODO.md @@ -0,0 +1,3 @@ + * X12S ne compile pas ? + * Revoir tous les check EEPROM size + * Sur X-Lite ModelSetup / Trainer params, scroll bizarre, ligne sans curseur ... \ No newline at end of file From cc92d77579b00b579e180fb091dcfcce056bf5a9 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 4 Feb 2019 16:53:19 +0100 Subject: [PATCH 059/446] Copy radio RegId at model creation --- radio/src/opentx.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 4a50bc1c5..ec716ea5f 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -449,6 +449,8 @@ void modelDefault(uint8_t id) applyDefaultTemplate(); + memcpy(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, LEN_REGISTRATION_ID); + #if defined(LUA) && defined(PCBTARANIS) //Horus uses menuModelWizard() for wizard if (isFileAvailable(WIZARD_PATH "/" WIZARD_NAME)) { f_chdir(WIZARD_PATH); From b3e47e6771fc071dfaef1c51abec62adf66bc217 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 4 Feb 2019 17:36:29 +0100 Subject: [PATCH 060/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 58d9a57f5..bb878fb21 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -709,13 +709,13 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_MODE: lcdDrawTextAlignedLeft(y, STR_MODE); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[0].rfProtocol, attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, attr); if (attr) { g_model.moduleData[INTERNAL_MODULE].rfProtocol = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].rfProtocol, RF_PROTO_OFF, RF_PROTO_LAST, EE_MODEL, isRfProtocolAvailable); if (checkIncDec_Ret) { - g_model.moduleData[0].type = MODULE_TYPE_XJT; - g_model.moduleData[0].channelsStart = 0; - g_model.moduleData[0].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); + g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_XJT; + g_model.moduleData[INTERNAL_MODULE].channelsStart = 0; + g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); if (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF) g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_NONE; } From aef3ff74734961bf86334556f0062dc5240d4f8b Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 4 Feb 2019 17:39:25 +0100 Subject: [PATCH 061/446] Fix various compilation issues --- radio/src/gui/212x64/model_setup.cpp | 6 ++-- radio/src/gui/480x272/model_setup.cpp | 8 +++--- radio/src/gui/480x272/model_telemetry.cpp | 35 ++++++++++++++++++++++- radio/src/main_arm.cpp | 6 ++-- radio/src/opentx.h | 6 ++-- 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index d1522f2d7..ef7056dc2 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -245,8 +245,8 @@ int getSwitchWarningsCount() #if defined(BLUETOOTH) && defined(USEHORUSBT) #define TRAINER_LINE1_BLUETOOTH_M_ROWS ((bluetoothDistantAddr[0] == 0 || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) - #define TRAINER_LINE1_ROWS (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)1 : (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_LINE1_BLUETOOTH_M_ROWS : (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH ? (uint8_t)1 : HIDDEN_ROW))) - #define TRAINER_LINE2_ROWS (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_LINE1_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_LINE1_BLUETOOTH_M_ROWS : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? (uint8_t)1 : HIDDEN_ROW))) + #define TRAINER_LINE2_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) #else #define TRAINER_LINE1_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : HIDDEN_ROW) #define TRAINER_LINE2_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) @@ -829,7 +829,7 @@ void menuModelSetup(event_t event) #if defined(BLUETOOTH) && defined(USEHORUSBT) case ITEM_MODEL_TRAINER_LINE1: - if (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH) { + if (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) { if (attr) { s_editMode = 0; } diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index eb120ca4d..8582d45fb 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -254,8 +254,8 @@ int getSwitchWarningsCount() #define SLIDER_WARN_ITEMS() ((g_model.potsWarnMode) ? uint8_t(NAVIGATION_LINE_BY_LINE|(NUM_SLIDERS-1)) : (uint8_t)0) #define TRAINER_LINE1_BLUETOOTH_M_ROWS ((bluetoothDistantAddr[0] == 0 || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) -#define TRAINER_LINE1_ROWS (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)1 : (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_LINE1_BLUETOOTH_M_ROWS : (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH ? (uint8_t)1 : HIDDEN_ROW))) -#define TRAINER_LINE2_ROWS (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) +#define TRAINER_LINE1_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_LINE1_BLUETOOTH_M_ROWS : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? (uint8_t)1 : HIDDEN_ROW))) +#define TRAINER_LINE2_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) bool menuModelSetup(event_t event) { @@ -678,7 +678,7 @@ bool menuModelSetup(event_t event) case ITEM_MODEL_TRAINER_MODE: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODE); - g_model.trainerMode = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerMode, 0, TRAINER_MODE_MAX(), attr, event); + g_model.trainerData.mode = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerData.mode, 0, TRAINER_MODE_MAX(), attr, event); if (attr && checkIncDec_Ret) { bluetoothState = BLUETOOTH_STATE_OFF; bluetoothDistantAddr[0] = 0; @@ -784,7 +784,7 @@ bool menuModelSetup(event_t event) break; case ITEM_MODEL_TRAINER_LINE1: - if (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH) { + if (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) { if (attr) { s_editMode = 0; } diff --git a/radio/src/gui/480x272/model_telemetry.cpp b/radio/src/gui/480x272/model_telemetry.cpp index 5b5b10cbf..e31e6af37 100644 --- a/radio/src/gui/480x272/model_telemetry.cpp +++ b/radio/src/gui/480x272/model_telemetry.cpp @@ -59,6 +59,38 @@ enum MenuModelTelemetryFrskyItems { ITEM_TELEMETRY_SENSOR30, ITEM_TELEMETRY_SENSOR31, ITEM_TELEMETRY_SENSOR32, + ITEM_TELEMETRY_SENSOR33, + ITEM_TELEMETRY_SENSOR34, + ITEM_TELEMETRY_SENSOR35, + ITEM_TELEMETRY_SENSOR36, + ITEM_TELEMETRY_SENSOR37, + ITEM_TELEMETRY_SENSOR38, + ITEM_TELEMETRY_SENSOR39, + ITEM_TELEMETRY_SENSOR40, + ITEM_TELEMETRY_SENSOR41, + ITEM_TELEMETRY_SENSOR42, + ITEM_TELEMETRY_SENSOR43, + ITEM_TELEMETRY_SENSOR44, + ITEM_TELEMETRY_SENSOR45, + ITEM_TELEMETRY_SENSOR46, + ITEM_TELEMETRY_SENSOR47, + ITEM_TELEMETRY_SENSOR48, + ITEM_TELEMETRY_SENSOR49, + ITEM_TELEMETRY_SENSOR50, + ITEM_TELEMETRY_SENSOR51, + ITEM_TELEMETRY_SENSOR52, + ITEM_TELEMETRY_SENSOR53, + ITEM_TELEMETRY_SENSOR54, + ITEM_TELEMETRY_SENSOR55, + ITEM_TELEMETRY_SENSOR56, + ITEM_TELEMETRY_SENSOR57, + ITEM_TELEMETRY_SENSOR58, + ITEM_TELEMETRY_SENSOR59, + ITEM_TELEMETRY_SENSOR60, + ITEM_TELEMETRY_SENSOR61, + ITEM_TELEMETRY_SENSOR62, + ITEM_TELEMETRY_SENSOR63, + ITEM_TELEMETRY_SENSOR64, ITEM_TELEMETRY_DISCOVER_SENSORS, ITEM_TELEMETRY_NEW_SENSOR, ITEM_TELEMETRY_DELETE_ALL_SENSORS, @@ -82,7 +114,8 @@ enum MenuModelTelemetryFrskyItems { #define IS_RANGE_DEFINED(k) (g_model.frsky.channels[k].ratio > 0) #define SENSOR_ROWS(x) (isTelemetryFieldAvailable(x) ? (uint8_t)0 : HIDDEN_ROW) -#define SENSORS_ROWS LABEL(Sensors), SENSOR_ROWS(0), SENSOR_ROWS(1), SENSOR_ROWS(2), SENSOR_ROWS(3), SENSOR_ROWS(4), SENSOR_ROWS(5), SENSOR_ROWS(6), SENSOR_ROWS(7), SENSOR_ROWS(8), SENSOR_ROWS(9), SENSOR_ROWS(10), SENSOR_ROWS(11), SENSOR_ROWS(12), SENSOR_ROWS(13), SENSOR_ROWS(14), SENSOR_ROWS(15), SENSOR_ROWS(16), SENSOR_ROWS(17), SENSOR_ROWS(18), SENSOR_ROWS(19), SENSOR_ROWS(20), SENSOR_ROWS(21), SENSOR_ROWS(22), SENSOR_ROWS(23), SENSOR_ROWS(24), SENSOR_ROWS(25), SENSOR_ROWS(26), SENSOR_ROWS(27), SENSOR_ROWS(28), SENSOR_ROWS(29), SENSOR_ROWS(30), SENSOR_ROWS(31), 0, 0, 0, 0, +#define SENSORS_ROWS LABEL(Sensors), SENSOR_ROWS(0), SENSOR_ROWS(1), SENSOR_ROWS(2), SENSOR_ROWS(3), SENSOR_ROWS(4), SENSOR_ROWS(5), SENSOR_ROWS(6), SENSOR_ROWS(7), SENSOR_ROWS(8), SENSOR_ROWS(9), SENSOR_ROWS(10), SENSOR_ROWS(11), SENSOR_ROWS(12), SENSOR_ROWS(13), SENSOR_ROWS(14), SENSOR_ROWS(15), SENSOR_ROWS(16), SENSOR_ROWS(17), SENSOR_ROWS(18), SENSOR_ROWS(19), SENSOR_ROWS(20), SENSOR_ROWS(21), SENSOR_ROWS(22), SENSOR_ROWS(23), SENSOR_ROWS(24), SENSOR_ROWS(25), SENSOR_ROWS(26), SENSOR_ROWS(27), SENSOR_ROWS(28), SENSOR_ROWS(29), SENSOR_ROWS(30), \ + SENSOR_ROWS(31), SENSOR_ROWS(32), SENSOR_ROWS(33), SENSOR_ROWS(34), SENSOR_ROWS(35), SENSOR_ROWS(36), SENSOR_ROWS(37), SENSOR_ROWS(38), SENSOR_ROWS(39), SENSOR_ROWS(40),SENSOR_ROWS(41), SENSOR_ROWS(42), SENSOR_ROWS(43), SENSOR_ROWS(44), SENSOR_ROWS(45), SENSOR_ROWS(46), SENSOR_ROWS(47), SENSOR_ROWS(48), SENSOR_ROWS(49), SENSOR_ROWS(50),SENSOR_ROWS(51), SENSOR_ROWS(52), SENSOR_ROWS(53), SENSOR_ROWS(54), SENSOR_ROWS(55), SENSOR_ROWS(56), SENSOR_ROWS(57), SENSOR_ROWS(58), SENSOR_ROWS(59),SENSOR_ROWS(60),SENSOR_ROWS(61), SENSOR_ROWS(62), SENSOR_ROWS(63), 0, 0, 0, 0, #if defined(VARIO) #define VARIO_ROWS LABEL(Vario), 0, 1, 2, #else diff --git a/radio/src/main_arm.cpp b/radio/src/main_arm.cpp index c02786d46..5bf957e56 100644 --- a/radio/src/main_arm.cpp +++ b/radio/src/main_arm.cpp @@ -97,6 +97,7 @@ bool isJackPlugged() } #endif +#if defined(PCBXLITES) enum JackState { SPEAKER_ACTIVE, @@ -124,7 +125,6 @@ void onJackConnectMenu(const char * result) void handleJackConnection() { -#if defined(JACK_DETECT_GPIO) if (jackState == SPEAKER_ACTIVE && isJackPlugged()) { if (g_eeGeneral.jackMode == JACK_HEADPHONE_MODE) { jackState = HEADPHONE_ACTIVE; @@ -148,8 +148,8 @@ void handleJackConnection() jackState = SPEAKER_ACTIVE; enableSpeaker(); } -#endif } +#endif void checkSpeakerVolume() { @@ -486,7 +486,9 @@ void perMain() checkEeprom(); logsWrite(); handleUsbConnection(); +#if defined(PCBXLITES) handleJackConnection(); +#endif checkTrainerSettings(); periodicTick(); DEBUG_TIMER_STOP(debugTimerPerMain1); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 86e5b784a..add26a283 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -191,15 +191,15 @@ #if defined(BLUETOOTH) #if defined(X9E) && !defined(USEHORUSBT) - #define IS_BLUETOOTH_TRAINER() (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH) - #define IS_SLAVE_TRAINER() (g_model.trainerMode == TRAINER_MODE_SLAVE) + #define IS_BLUETOOTH_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) + #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) #else #define IS_BLUETOOTH_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH || g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE || g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) #endif #else #define IS_BLUETOOTH_TRAINER() false - #define IS_SLAVE_TRAINER() (g_model.trainerMode == TRAINER_MODE_SLAVE) + #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) #endif // RESX range is used for internal calculation; The menu says -100.0 to 100.0; internally it is -1024 to 1024 to allow some optimizations From 539cc00d311d3be240428829ba469bd997edb60c Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 5 Feb 2019 08:34:11 +0100 Subject: [PATCH 062/446] Internal module part (receiver not done yet) --- radio/src/gui/128x64/model_setup.cpp | 52 +++++++++++++++++++--------- radio/src/gui/gui_common.h | 1 + radio/src/gui/gui_common_arm.cpp | 8 +++++ 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index bb878fb21..6d96a4df8 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -73,9 +73,9 @@ enum MenuModelSetupItems { #if defined(PCBTARANIS) ITEM_MODEL_INTERNAL_MODULE_LABEL, ITEM_MODEL_INTERNAL_MODULE_MODE, - ITEM_MODEL_INTERNAL_MODULE_CHANNELS, - ITEM_MODEL_INTERNAL_MODULE_BIND, + ITEM_MODEL_INTERNAL_MODULE_MODEL_NUM, ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, + ITEM_MODEL_INTERNAL_MODULE_RANGE, #if defined(PCBXLITE) || defined(PCBXLITES) ITEM_MODEL_INTERNAL_MODULE_ANTENNA, #endif @@ -154,7 +154,6 @@ enum MenuModelSetupItems { #endif #define IF_INTERNAL_MODULE_ON(x) (IS_INTERNAL_MODULE_ENABLED()? (uint8_t)(x) : HIDDEN_ROW ) #define IF_EXTERNAL_MODULE_ON(x) (IS_EXTERNAL_MODULE_ENABLED()? (uint8_t)(x) : HIDDEN_ROW) - #define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON(1) #define EXTERNAL_MODULE_BIND_ROWS() ((isModuleXJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) || isModuleSBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (isModulePPM(EXTERNAL_MODULE) || isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW #if defined(PCBSKY9X) && defined(REVX) @@ -272,9 +271,9 @@ void menuModelSetup(event_t event) 0, // Global functions LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, - INTERNAL_MODULE_CHANNELS_ROWS, - IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1), - IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), + IF_INTERNAL_MODULE_ON((uint8_t)0), // Model Number + IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe + IF_INTERNAL_MODULE_ON((uint8_t)0), // Range check ANTENNA_ROW LABEL(ExternalModule), EXTERNAL_MODULE_MODE_ROWS, @@ -709,15 +708,11 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_MODE: lcdDrawTextAlignedLeft(y, STR_MODE); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, attr); if (attr) { - g_model.moduleData[INTERNAL_MODULE].rfProtocol = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].rfProtocol, RF_PROTO_OFF, RF_PROTO_LAST, EE_MODEL, isRfProtocolAvailable); + g_model.moduleData[INTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_XJT, EE_MODEL, isInternalModuleAvailable); if (checkIncDec_Ret) { - g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_XJT; - g_model.moduleData[INTERNAL_MODULE].channelsStart = 0; - g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); - if (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF) - g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_NONE; + /* ToDo : what needs toi happen on module enable/disable */ } } break; @@ -936,7 +931,6 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_CHANNELS: #endif #if defined(PCBSKY9X) case ITEM_MODEL_EXTRA_MODULE_CHANNELS: @@ -993,7 +987,33 @@ void menuModelSetup(event_t event) #endif #if defined(PCBTARANIS) - case ITEM_MODEL_INTERNAL_MODULE_BIND: + case ITEM_MODEL_INTERNAL_MODULE_MODEL_NUM: + { + lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[INTERNAL_MODULE], attr | LEADING0|LEFT, 2); + if (attr) { + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[INTERNAL_MODULE], MAX_RX_NUM(INTERNAL_MODULE)); + if (checkIncDec_Ret) { + modelHeaders[g_eeGeneral.currModel].modelId[INTERNAL_MODULE] = g_model.header.modelId[INTERNAL_MODULE]; + } + } + } + break; + + case ITEM_MODEL_INTERNAL_MODULE_RANGE: + { + lcdDrawTextAlignedLeft(y, INDENT "Range"); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, attr); + if (attr && s_editMode>0) { + moduleFlag[INTERNAL_MODULE] = MODULE_RANGECHECK; + } + if (attr && s_editMode==0) { + moduleFlag[INTERNAL_MODULE] = MODULE_NORMAL_MODE; + } + } + break; + + #endif #if defined(PCBSKY9X) case ITEM_MODEL_EXTRA_MODULE_BIND: @@ -1408,7 +1428,7 @@ void menuModelSetup(event_t event) if (old_editMode > 0 && s_editMode == 0) { switch(menuVerticalPosition) { #if defined(PCBTARANIS) - case ITEM_MODEL_INTERNAL_MODULE_BIND: + case ITEM_MODEL_INTERNAL_MODULE_MODEL_NUM: if (menuHorizontalPosition == 0) checkModelIdUnique(g_eeGeneral.currModel, INTERNAL_MODULE); break; diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 1b06616ce..ba7b4c3db 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -57,6 +57,7 @@ bool isR9MModeAvailable(int mode); bool isR9ModuleRunning(int module); bool isR9MMFlex(int module); bool isModuleAvailable(int module); +bool isInternalModuleAvailable(int module); bool isRfProtocolAvailable(int protocol); bool isTelemetryProtocolAvailable(int protocol); bool isTrainerModeAvailable(int mode); diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 571a04efe..f7fc3db39 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -515,6 +515,14 @@ bool isR9MMFlex(int module) return g_model.moduleData[module].r9m.region == MODULE_R9M_REGION_FLEX; } +bool isInternalModuleAvailable(int module) +{ + if (module == MODULE_TYPE_NONE || module == MODULE_TYPE_XJT) { + return true; + } + return false; +} + bool isModuleAvailable(int module) { #if defined(CROSSFIRE) From cc793bbab6adafc6298852911102952dae64b7eb Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 5 Feb 2019 09:46:01 +0100 Subject: [PATCH 063/446] Add 'add receiver' and associated datastruct change --- radio/src/datastructs.h | 3 ++- radio/src/gui/128x64/model_setup.cpp | 14 +++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 295edd9fd..a81d3cf2c 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -415,8 +415,9 @@ PACK(struct TrainerModuleData { */ PACK(struct ReceiverData { + uint8_t enabled:1; uint8_t telemetry:1; - uint8_t spare:7; + uint8_t spare:6; uint64_t channelMapping; // each receiver output (16) can be assigned to one of the 16 channels uint8_t rxID[LEN_RX_ID]; }); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 6d96a4df8..2cf624ce8 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -79,6 +79,7 @@ enum MenuModelSetupItems { #if defined(PCBXLITE) || defined(PCBXLITES) ITEM_MODEL_INTERNAL_MODULE_ANTENNA, #endif + ITEM_MODEL_INTERNAL_MODULE_ADD_RECEIVER, #endif ITEM_MODEL_EXTERNAL_MODULE_LABEL, ITEM_MODEL_EXTERNAL_MODULE_MODE, @@ -136,6 +137,7 @@ enum MenuModelSetupItems { #if defined(PCBTARANIS) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) + #define INTERNAL_MODULE_ADD_RECEIVER_ROW (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[MAX_RECEIVERS_PER_MODULE-1].enabled ? HIDDEN_ROW : (uint8_t)0) #elif defined(PCBSKY9X) && !defined(REVA) #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) #else @@ -275,6 +277,7 @@ void menuModelSetup(event_t event) IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe IF_INTERNAL_MODULE_ON((uint8_t)0), // Range check ANTENNA_ROW + INTERNAL_MODULE_ADD_RECEIVER_ROW, LABEL(ExternalModule), EXTERNAL_MODULE_MODE_ROWS, MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) @@ -1002,7 +1005,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_RANGE: { - lcdDrawTextAlignedLeft(y, INDENT "Range"); + lcdDrawTextAlignedLeft(y, STR_RANGE); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, attr); if (attr && s_editMode>0) { moduleFlag[INTERNAL_MODULE] = MODULE_RANGECHECK; @@ -1011,9 +1014,14 @@ void menuModelSetup(event_t event) moduleFlag[INTERNAL_MODULE] = MODULE_NORMAL_MODE; } } - break; - + break; + case ITEM_MODEL_INTERNAL_MODULE_ADD_RECEIVER: + { + lcdDrawTextAlignedLeft(y, STR_RECEIVER); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "[Add]", attr); + } + break; #endif #if defined(PCBSKY9X) case ITEM_MODEL_EXTRA_MODULE_BIND: From 53bb46ef8169c6e9c4c926538e3b6aa42cf5e68b Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 5 Feb 2019 11:24:06 +0100 Subject: [PATCH 064/446] Basic 128x64 internal module receivers menu logic --- radio/src/gui/128x64/model_setup.cpp | 60 +++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 2cf624ce8..99d636653 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -79,6 +79,14 @@ enum MenuModelSetupItems { #if defined(PCBXLITE) || defined(PCBXLITES) ITEM_MODEL_INTERNAL_MODULE_ANTENNA, #endif + ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_NUMBER, + ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_RANGE, + ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_TELEM, + ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_BIND, + ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_NUMBER, + ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_RANGE, + ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_TELEM, + ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_BIND, ITEM_MODEL_INTERNAL_MODULE_ADD_RECEIVER, #endif ITEM_MODEL_EXTERNAL_MODULE_LABEL, @@ -137,7 +145,10 @@ enum MenuModelSetupItems { #if defined(PCBTARANIS) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) + #define CURRENT_RECEIVER_EDITED(k) (k >= ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_NUMBER ? 1 : 0) #define INTERNAL_MODULE_ADD_RECEIVER_ROW (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[MAX_RECEIVERS_PER_MODULE-1].enabled ? HIDDEN_ROW : (uint8_t)0) + #define IF_INTERNAL_MODULE_RECEIVER_1_ON(x) (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled ? (uint8_t)(x) : HIDDEN_ROW) + #define IF_INTERNAL_MODULE_RECEIVER_2_ON(x) (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1].enabled ? (uint8_t)(x) : HIDDEN_ROW) #elif defined(PCBSKY9X) && !defined(REVA) #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) #else @@ -277,6 +288,14 @@ void menuModelSetup(event_t event) IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe IF_INTERNAL_MODULE_ON((uint8_t)0), // Range check ANTENNA_ROW + IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Number + IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Range + IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Telemetry + IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Bind/Delete + IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Number + IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Range + IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Telemetry + IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Bind/Delete INTERNAL_MODULE_ADD_RECEIVER_ROW, LABEL(ExternalModule), EXTERNAL_MODULE_MODE_ROWS, @@ -1018,8 +1037,47 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_ADD_RECEIVER: { - lcdDrawTextAlignedLeft(y, STR_RECEIVER); + lcdDrawTextAlignedLeft(y, "Receiver"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "[Add]", attr); + if (attr && s_editMode>0) { + if(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled) { + g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1].enabled = 0x01; + } + else { + g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled = 0x01; + } + s_editMode = 0; + } + } + break; + + case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_NUMBER: + case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_NUMBER: + { + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); + lcdDrawTextAlignedLeft(y, "Receiver"); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, receiverIdx+1); + } + break; + + case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_RANGE: + case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_RANGE: + { + lcdDrawTextAlignedLeft(y, TR_CHANNELRANGE); + } + break; + + case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_TELEM: + case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_TELEM: + { + lcdDrawTextAlignedLeft(y, INDENT "Telem"); + } + break; + + case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_BIND: + case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_BIND: + { + lcdDrawTextAlignedLeft(y, INDENT "Receiver"); } break; #endif From 9aa75b1056622c442b0d9b0877fd0883c803eb11 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Feb 2019 11:47:04 +0100 Subject: [PATCH 065/446] More work on pulses ... --- radio/src/{audio_arm.cpp => audio.cpp} | 0 radio/src/{audio_arm.h => audio.h} | 0 radio/src/cli.h | 2 +- radio/src/{main_arm.cpp => main.cpp} | 0 radio/src/opentx.cpp | 1 - radio/src/opentx.h | 4 +- radio/src/pulses/pulses_arm.cpp | 192 ++++++++++-------- radio/src/targets/common/arm/CMakeLists.txt | 6 +- .../arm/stm32/intmodule_serial_driver.cpp | 77 ++----- radio/src/targets/horus/extmodule_driver.cpp | 6 +- radio/src/targets/horus/pulses_driver.cpp | 37 ++-- radio/src/targets/taranis/CMakeLists.txt | 1 + radio/src/targets/taranis/board.h | 23 ++- .../src/targets/taranis/extmodule_driver.cpp | 10 + .../taranis/intmodule_pulses_driver.cpp | 15 +- radio/src/targets/taranis/pulses_driver.cpp | 85 ++++---- radio/src/{tasks_arm.cpp => tasks.cpp} | 22 +- radio/src/{tasks_arm.h => tasks.h} | 0 radio/src/trainer_input.cpp | 2 +- 19 files changed, 261 insertions(+), 222 deletions(-) rename radio/src/{audio_arm.cpp => audio.cpp} (100%) rename radio/src/{audio_arm.h => audio.h} (100%) rename radio/src/{main_arm.cpp => main.cpp} (100%) rename radio/src/{tasks_arm.cpp => tasks.cpp} (91%) rename radio/src/{tasks_arm.h => tasks.h} (100%) diff --git a/radio/src/audio_arm.cpp b/radio/src/audio.cpp similarity index 100% rename from radio/src/audio_arm.cpp rename to radio/src/audio.cpp diff --git a/radio/src/audio_arm.h b/radio/src/audio.h similarity index 100% rename from radio/src/audio_arm.h rename to radio/src/audio.h diff --git a/radio/src/cli.h b/radio/src/cli.h index fdb96d6d1..a590e101c 100644 --- a/radio/src/cli.h +++ b/radio/src/cli.h @@ -28,7 +28,7 @@ extern uint8_t cliTracesEnabled; #ifdef __cplusplus #include "fifo.h" extern Fifo cliRxFifo; -#include "tasks_arm.h" +#include "tasks.h" extern RTOS_TASK_HANDLE cliTaskId; extern RTOS_DEFINE_STACK(cliStack, CLI_STACK_SIZE); #endif diff --git a/radio/src/main_arm.cpp b/radio/src/main.cpp similarity index 100% rename from radio/src/main_arm.cpp rename to radio/src/main.cpp diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index ec716ea5f..feb604939 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1907,7 +1907,6 @@ void opentxInit(OPENTX_INIT_ARGS) init_trainer_capture(); #endif - startPulses(); wdt_enable(WDTO_500MS); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index add26a283..e2d79bc14 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -657,7 +657,7 @@ uint16_t isqrt32(uint32_t n); #define pauseMixerCalculations() #define resumeMixerCalculations() #else -#include "tasks_arm.h" +#include "tasks.h" extern RTOS_MUTEX_HANDLE mixerMutex; inline void pauseMixerCalculations() { @@ -1040,7 +1040,7 @@ enum AUDIO_SOUNDS { }; #if defined(AUDIO) -#include "audio_arm.h" +#include "audio.h" #endif #include "buzzer.h" diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index 290369e3a..83963ed86 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -48,7 +48,7 @@ uint8_t getRequiredProtocol(uint8_t port) break; #endif case MODULE_TYPE_XJT: - required_protocol = PROTOCOL_CHANNELS_PXX; + required_protocol = PROTOCOL_CHANNELS_PXX2; break; default: required_protocol = PROTOCOL_CHANNELS_NONE; @@ -139,58 +139,118 @@ void setupPulsesPXX(uint8_t port) #endif } -void setupPulses(uint8_t port) +void setupPulsesPXX2(uint8_t module) { - bool init_needed = false; - uint8_t required_protocol = getRequiredProtocol(port); + if (module == INTERNAL_MODULE) { + modulePulsesData[module].pxx2.setupFrame(module); + intmoduleSendNextFrame(); + } - heartbeat |= (HEART_TIMER_PULSES << port); +#if 0 + // here we have to wait that telemetryInit() is called, hence this test + if (telemetryProtocol == PROTOCOL_TELEMETRY_PXX2) { + modulePulsesData[port].pxx2.setupFrame(port); + sportSendBuffer(modulePulsesData[port].pxx2.getData(), modulePulsesData[port].pxx2.getSize()); + } +#endif +} - if (s_current_protocol[port] != required_protocol) { - init_needed = true; - switch (s_current_protocol[port]) { // stop existing protocol hardware - case PROTOCOL_CHANNELS_PXX: - disable_pxx(port); - break; +void disablePulses(uint8_t port, uint8_t protocol) +{ + // stop existing protocol hardware + + switch (protocol) { + case PROTOCOL_CHANNELS_PXX: + disable_pxx(port); + break; #if defined(DSM2) - case PROTOCOL_CHANNELS_DSM2_LP45: - case PROTOCOL_CHANNELS_DSM2_DSM2: - case PROTOCOL_CHANNELS_DSM2_DSMX: - disable_serial(port); - break; + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: + disable_serial(port); + break; #endif #if defined(CROSSFIRE) - case PROTOCOL_CHANNELS_CROSSFIRE: - disable_module_timer(port); - break; + case PROTOCOL_CHANNELS_CROSSFIRE: + disable_module_timer(port); + break; #endif - case PROTOCOL_CHANNELS_PXX2: - disable_module_timer(port); - break; + case PROTOCOL_CHANNELS_PXX2: + disable_pxx2(port); + break; #if defined(MULTIMODULE) case PROTOCOL_CHANNELS_MULTIMODULE: #endif - case PROTOCOL_CHANNELS_SBUS: - disable_serial(port); - break; + case PROTOCOL_CHANNELS_SBUS: + disable_serial(port); + break; - case PROTOCOL_CHANNELS_PPM: - disable_ppm(port); - break; + case PROTOCOL_CHANNELS_PPM: + disable_ppm(port); + break; - default: - disable_no_pulses(port); - break; - } - s_current_protocol[port] = required_protocol; + default: + disable_no_pulses(port); + break; } +} - // Set up output data here - switch (required_protocol) { +void enablePulses(uint8_t port, uint8_t protocol) +{ + // start new protocol hardware here + + #warning "CHECK THAT ALL PROTOCOL INIT WON'T SEND A FIRST WRONG FRAME HERE" + + switch (protocol) { + case PROTOCOL_CHANNELS_PXX: + init_pxx(port); + break; + +#if defined(DSM2) + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: + init_serial(port, DSM2_BAUDRATE, DSM2_PERIOD * 2000); + break; +#endif + +#if defined(CROSSFIRE) + case PROTOCOL_CHANNELS_CROSSFIRE: + init_module_timer(port, CROSSFIRE_PERIOD, true); + break; +#endif + + case PROTOCOL_CHANNELS_PXX2: + init_pxx2(port); + break; + +#if defined(MULTIMODULE) + case PROTOCOL_CHANNELS_MULTIMODULE: + init_serial(port, MULTIMODULE_BAUDRATE, MULTIMODULE_PERIOD * 2000); + break; +#endif + + case PROTOCOL_CHANNELS_SBUS: + init_serial(port, SBUS_BAUDRATE, SBUS_PERIOD_HALF_US); + break; + + case PROTOCOL_CHANNELS_PPM: + init_ppm(port); + break; + + default: + init_no_pulses(port); + break; + } +} + +void sendPulses(uint8_t port, uint8_t protocol) +{ + switch (protocol) { case PROTOCOL_CHANNELS_PXX: setupPulsesPXX(port); scheduleNextMixerCalculation(port, PXX_PERIOD); @@ -212,7 +272,7 @@ void setupPulses(uint8_t port) #if defined(CROSSFIRE) case PROTOCOL_CHANNELS_CROSSFIRE: - if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE && !init_needed) { + if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) { uint8_t * crossfire = modulePulsesData[port].crossfire.pulses; uint8_t len; #if defined(LUA) @@ -234,11 +294,7 @@ void setupPulses(uint8_t port) #endif case PROTOCOL_CHANNELS_PXX2: - // here we have to wait that telemetryInit() is called, hence this test - if (telemetryProtocol == PROTOCOL_TELEMETRY_PXX2 && !init_needed) { - modulePulsesData[port].pxx2.setupFrame(port); - sportSendBuffer(modulePulsesData[port].pxx2.getData(), modulePulsesData[port].pxx2.getSize()); - } + setupPulsesPXX2(port); scheduleNextMixerCalculation(port, PXX2_PERIOD); break; @@ -251,7 +307,7 @@ void setupPulses(uint8_t port) case PROTOCOL_CHANNELS_PPM: #if defined(PCBSKY9X) - case PROTOCOL_CHANNELS_NONE: + case PROTOCOL_CHANNELS_NONE: #endif setupPulsesPPMModule(port); scheduleNextMixerCalculation(port, PPM_PERIOD(port)); @@ -260,49 +316,21 @@ void setupPulses(uint8_t port) default: break; } +} - if (init_needed) { - switch (required_protocol) { // Start new protocol hardware here - case PROTOCOL_CHANNELS_PXX: - init_pxx(port); - break; +void setupPulses(uint8_t module) +{ + uint8_t required_protocol = getRequiredProtocol(module); -#if defined(DSM2) - case PROTOCOL_CHANNELS_DSM2_LP45: - case PROTOCOL_CHANNELS_DSM2_DSM2: - case PROTOCOL_CHANNELS_DSM2_DSMX: - init_serial(port, DSM2_BAUDRATE, DSM2_PERIOD * 2000); - break; -#endif + heartbeat |= (HEART_TIMER_PULSES << module); -#if defined(CROSSFIRE) - case PROTOCOL_CHANNELS_CROSSFIRE: - init_module_timer(port, CROSSFIRE_PERIOD, true); - break; -#endif - - case PROTOCOL_CHANNELS_PXX2: - init_module_timer(port, PXX2_PERIOD, true); - break; - -#if defined(MULTIMODULE) - case PROTOCOL_CHANNELS_MULTIMODULE: - init_serial(port, MULTIMODULE_BAUDRATE, MULTIMODULE_PERIOD * 2000); - break; -#endif - - case PROTOCOL_CHANNELS_SBUS: - init_serial(port, SBUS_BAUDRATE, SBUS_PERIOD_HALF_US); - break; - - case PROTOCOL_CHANNELS_PPM: - init_ppm(port); - break; - - default: - init_no_pulses(port); - break; - } + if (s_current_protocol[module] != required_protocol) { + disablePulses(module, s_current_protocol[module]); + s_current_protocol[module] = required_protocol; + enablePulses(module, required_protocol); + } + else { + sendPulses(module, required_protocol); } } diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 3acf9aaa1..3e1b89fb6 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -88,9 +88,9 @@ foreach(LANGUAGE ${TTS_LANGUAGES}) endforeach() set(SRC ${SRC} - main_arm.cpp - tasks_arm.cpp - audio_arm.cpp + main.cpp + tasks.cpp + audio.cpp io/frsky_sport.cpp telemetry/telemetry.cpp telemetry/telemetry_holders.cpp diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index b372d8744..a91b944f6 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -23,40 +23,20 @@ void intmoduleStop() { INTERNAL_MODULE_OFF(); - - NVIC_DisableIRQ(INTMODULE_TIMER_IRQn); - INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA - INTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; - INTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; -} - -void intmoduleNoneStart() -{ - INTERNAL_MODULE_OFF(); - - 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_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(INTMODULE_TX_GPIO, &GPIO_InitStructure); - GPIO_SetBits(INTMODULE_TX_GPIO, INTMODULE_TX_GPIO_PIN); // Set high - - INTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; - INTMODULE_TIMER->PSC = INTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - INTMODULE_TIMER->ARR = 36000; // 18mS - INTMODULE_TIMER->CCR2 = 32000; // Update time - INTMODULE_TIMER->EGR = 1; // Restart - INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag - INTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt - INTMODULE_TIMER->CR1 |= TIM_CR1_CEN; - NVIC_EnableIRQ(INTMODULE_TIMER_IRQn); - NVIC_SetPriority(INTMODULE_TIMER_IRQn, 7); } void intmodulePxxStart() +{ + // shouldn't be used anymore +} + +void intmoduleTimerStart(uint32_t period, uint8_t state) +{ + // shouldn't be used anymore +} + +void intmodulePxx2Start() { INTERNAL_MODULE_ON(); @@ -94,23 +74,6 @@ void intmodulePxxStart() USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(INTMODULE_USART, &USART_InitStructure); USART_Cmd(INTMODULE_USART, ENABLE); - - // Timer - INTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; - INTMODULE_TIMER->PSC = INTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - INTMODULE_TIMER->ARR = PXX_PERIOD_HALF_US; - INTMODULE_TIMER->CCR2 = PXX_PERIOD_HALF_US - 2000; // Update time - INTMODULE_TIMER->CCER = TIM_CCER_CC3E; - INTMODULE_TIMER->CCMR2 = 0; - INTMODULE_TIMER->EGR = 1; // Restart - - INTMODULE_TIMER->CCMR2 = TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_0; // Toggle CC1 o/p - INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag - INTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt - INTMODULE_TIMER->CR1 |= TIM_CR1_CEN; - - NVIC_EnableIRQ(INTMODULE_TIMER_IRQn); - NVIC_SetPriority(INTMODULE_TIMER_IRQn, 7); } extern "C" void INTMODULE_DMA_STREAM_IRQHandler(void) @@ -124,14 +87,14 @@ extern "C" void INTMODULE_DMA_STREAM_IRQHandler(void) void intmoduleSendNextFrame() { - if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { + if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX2) { DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(INTMODULE_DMA_STREAM); DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL; DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&INTMODULE_USART->DR); DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx_uart.getData()); - DMA_InitStructure.DMA_BufferSize = modulePulsesData[INTERNAL_MODULE].pxx_uart.getSize(); + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx2.getData()); + DMA_InitStructure.DMA_BufferSize = modulePulsesData[INTERNAL_MODULE].pxx2.getSize(); DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; @@ -143,21 +106,7 @@ void intmoduleSendNextFrame() DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(INTMODULE_DMA_STREAM, &DMA_InitStructure); - DMA_Cmd(INTMODULE_DMA_STREAM, ENABLE); USART_DMACmd(INTMODULE_USART, USART_DMAReq_Tx, ENABLE); } } - -extern "C" void INTMODULE_TIMER_IRQHandler() -{ - DEBUG_INTERRUPT(INT_TIM1CC); - DEBUG_TIMER_SAMPLE(debugTimerIntPulses); - DEBUG_TIMER_START(debugTimerIntPulsesDuration); - - INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // clear flag - setupPulses(INTERNAL_MODULE); - intmoduleSendNextFrame(); - - DEBUG_TIMER_STOP(debugTimerIntPulsesDuration); -} diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index be1248b54..e8e71ae76 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -65,7 +65,6 @@ void extmoduleTimerStart(uint32_t period, uint8_t state) NVIC_SetPriority(EXTMODULE_TIMER_IRQn, 7); } - void extmodulePpmStart() { EXTERNAL_MODULE_ON(); @@ -165,6 +164,11 @@ void extmodulePxxStart() NVIC_SetPriority(EXTMODULE_TIMER_IRQn, 7); } +void extmodulePxx2Start() +{ + // TODO just enable the S.PORT line (or let telemetry init do it) +} + #if defined(DSM2) void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) { diff --git a/radio/src/targets/horus/pulses_driver.cpp b/radio/src/targets/horus/pulses_driver.cpp index 97305df0b..16009415c 100644 --- a/radio/src/targets/horus/pulses_driver.cpp +++ b/radio/src/targets/horus/pulses_driver.cpp @@ -20,23 +20,20 @@ #include "opentx.h" -void intmoduleStop(void); -void extmoduleStop(void); - -void intmoduleNoneStart(void); -void intmodulePxxStart(void); +void intmoduleStop(); +void intmoduleTimerStart(uint32_t period, uint8_t state); +void intmodulePxxStart(); +void extmoduleStop(); void extmoduleTimerStart(uint32_t period, uint8_t state); -void extmodulePpmStart(void); -void extmodulePxxStart(void); +void extmodulePpmStart(); +void extmodulePxxStart(); +void extmodulePxx2Start(); void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us); void init_no_pulses(uint32_t port) { - if (port == INTERNAL_MODULE) - intmoduleNoneStart(); - else - extmoduleTimerStart(18, false); + init_module_timer(port, 18, false); } void disable_no_pulses(uint32_t port) @@ -61,6 +58,14 @@ void disable_ppm(uint32_t port) } } +void init_pxx2(uint32_t port) +{ + if (port == INTERNAL_MODULE) + intmodulePxx2Start(); + else + extmodulePxx2Start(); +} + void init_pxx(uint32_t port) { if (port == INTERNAL_MODULE) @@ -95,15 +100,17 @@ void disable_serial(uint32_t port) void init_module_timer(uint32_t port, uint32_t period, uint8_t state) { - if (port == EXTERNAL_MODULE) { + if (port == INTERNAL_MODULE) + intmoduleTimerStart(period, state); + else extmoduleTimerStart(period, state); - } } void disable_module_timer(uint32_t port) { - if (port == EXTERNAL_MODULE) { + if (port == INTERNAL_MODULE) + intmoduleStop(); + else extmoduleStop(); - } } diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 262c4ee5a..10c8405c0 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -119,6 +119,7 @@ elseif(PCB STREQUAL XLITES) endif() if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES) + add_definitions(-DINTERNAL_MODULE_SERIAL) if(PXX_FREQUENCY STREQUAL HIGH) add_definitions(-DPXX_FREQUENCY_HIGH) endif() diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index d451cd5ad..89905bd43 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -180,16 +180,19 @@ uint32_t isBootloaderStart(const uint8_t * buffer); #else #define IS_UART_MODULE(port) (false) #endif -void init_no_pulses(uint32_t port); -void disable_no_pulses(uint32_t port); -void init_ppm( uint32_t module_index); -void disable_ppm( uint32_t module_index); -void init_pxx( uint32_t module_index); -void disable_pxx( uint32_t module_index); -void init_serial( uint32_t module_index, uint32_t baudrate, uint32_t period); -void disable_serial( uint32_t module_index); -void init_module_timer( uint32_t module_index, uint32_t period, uint8_t state); -void disable_module_timer( uint32_t module_index); +void init_no_pulses(uint8_t module); +void disable_no_pulses(uint8_t module); +void init_ppm(uint8_t module); +void disable_ppm(uint8_t module); +void intmoduleSendNextFrame(); +void init_pxx2(uint8_t module); +void disable_pxx2(uint8_t module); +void init_pxx(uint8_t module); +void disable_pxx(uint8_t module); +void init_serial(uint8_t module, uint32_t baudrate, uint32_t period); +void disable_serial(uint8_t module); +void init_module_timer(uint8_t module, uint32_t period, uint8_t state); +void disable_module_timer(uint8_t module); // Trainer driver #define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index b092499b9..109275c6f 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -200,6 +200,11 @@ void extmodulePxxStart() { extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE, PXX_PERIOD_HALF_US); } + +void extmodulePxx2Start() +{ + extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE, PXX_PERIOD_HALF_US); +} #else void extmodulePxxStart() { @@ -234,6 +239,11 @@ void extmodulePxxStart() NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn); NVIC_SetPriority(EXTMODULE_TIMER_CC_IRQn, 7); } + +void extmodulePxx2Start() +{ + // TODO just enable the S.PORT line (or let telemetry init do it) +} #endif void extmoduleSendNextFrame() diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 10ef3303c..5058f3b74 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -32,9 +32,14 @@ void intmoduleStop() INTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; } -void intmoduleNoneStart() +void intmoduleTimerStart(uint32_t period, uint8_t state) { - INTERNAL_MODULE_OFF(); + if (state) + INTERNAL_MODULE_ON(); + else + INTERNAL_MODULE_OFF(); + + GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, 0); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = INTMODULE_TX_GPIO_PIN; @@ -46,9 +51,9 @@ void intmoduleNoneStart() GPIO_SetBits(INTMODULE_TX_GPIO, INTMODULE_TX_GPIO_PIN); // Set high INTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; - INTMODULE_TIMER->PSC = INTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz - INTMODULE_TIMER->ARR = 36000; // 18mS - INTMODULE_TIMER->CCR2 = 32000; // Update time + INTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz + INTMODULE_TIMER->ARR = (2000 * period); + INTMODULE_TIMER->CCR2 = (2000 * period) - 1000; INTMODULE_TIMER->EGR = 1; // Restart INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag INTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index 9b7cfea4d..6e5070222 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -20,103 +20,118 @@ #include "opentx.h" -void intmoduleStop(void); -void extmoduleStop(void); - -void intmoduleNoneStart(void); -void intmodulePxxStart(void); +void intmoduleStop(); +void intmoduleTimerStart(uint32_t period, uint8_t state); +void intmodulePxxStart(); +void intmodulePxx2Start(); #if defined(TARANIS_INTERNAL_PPM) void intmodulePpmStart(void); #endif +void extmoduleStop(); void extmoduleTimerStart(uint32_t period, uint8_t state); -void extmodulePpmStart(void); -void extmodulePxxStart(void); +void extmodulePpmStart(); +void extmodulePxxStart(); +void extmodulePxx2Start(); void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us); - -void init_pxx(uint32_t port) +void init_pxx(uint8_t module) { - if (port == INTERNAL_MODULE) + if (module == INTERNAL_MODULE) intmodulePxxStart(); else extmodulePxxStart(); } -void disable_pxx(uint32_t port) +void disable_pxx(uint8_t module) { - if (port == INTERNAL_MODULE) + if (module == INTERNAL_MODULE) + intmoduleStop(); + else + extmoduleStop(); +} + +void init_pxx2(uint8_t module) +{ + if (module == INTERNAL_MODULE) + intmodulePxx2Start(); + else + extmodulePxx2Start(); +} + +void disable_pxx2(uint8_t module) +{ + if (module == INTERNAL_MODULE) intmoduleStop(); else extmoduleStop(); } #if defined(DSM2) -void init_serial(uint32_t port, uint32_t baudrate, uint32_t period_half_us) +void init_serial(uint8_t module, uint32_t baudrate, uint32_t period_half_us) { - if (port == EXTERNAL_MODULE) { + if (module == EXTERNAL_MODULE) { extmoduleSerialStart(baudrate, period_half_us); } } -void disable_serial(uint32_t port) +void disable_serial(uint8_t module) { - if (port == EXTERNAL_MODULE) { + if (module == EXTERNAL_MODULE) { extmoduleStop(); } } #endif -void init_ppm(uint32_t port) +void init_ppm(uint8_t module) { - if (port == EXTERNAL_MODULE) { + if (module == EXTERNAL_MODULE) { extmodulePpmStart(); } #if defined(TARANIS_INTERNAL_PPM) - else if (port == INTERNAL_MODULE) { + else { intmodulePpmStart(); } #endif } -void disable_ppm(uint32_t port) +void disable_ppm(uint8_t module) { - if (port == EXTERNAL_MODULE) { + if (module == EXTERNAL_MODULE) { extmoduleStop(); } #if defined(TARANIS_INTERNAL_PPM) - else if (port == INTERNAL_MODULE) { + else { intmoduleStop(); } #endif } -void init_no_pulses(uint32_t port) +void init_no_pulses(uint8_t module) { - if (port == INTERNAL_MODULE) - intmoduleNoneStart(); - else - extmoduleTimerStart(18, false); + init_module_timer(module, 18, false); } -void disable_no_pulses(uint32_t port) +void disable_no_pulses(uint8_t module) { - if (port == INTERNAL_MODULE) + if (module == INTERNAL_MODULE) intmoduleStop(); else extmoduleStop(); } -void init_module_timer(uint32_t port, uint32_t period, uint8_t state) +void init_module_timer(uint8_t module, uint32_t period, uint8_t state) { - if (port == EXTERNAL_MODULE) { + if (module == INTERNAL_MODULE) + intmoduleTimerStart(period, state); + else extmoduleTimerStart(period, state); - } } -void disable_module_timer(uint32_t port) +void disable_module_timer(uint8_t module) { - if (port == EXTERNAL_MODULE) { + if (module == INTERNAL_MODULE) + intmoduleStop(); + else extmoduleStop(); - } } diff --git a/radio/src/tasks_arm.cpp b/radio/src/tasks.cpp similarity index 91% rename from radio/src/tasks_arm.cpp rename to radio/src/tasks.cpp index 129684a4d..41901446d 100644 --- a/radio/src/tasks_arm.cpp +++ b/radio/src/tasks.cpp @@ -73,6 +73,21 @@ bool isForcePowerOffRequested() return false; } +bool isProtocolSynchronous(uint8_t protocol) +{ + return (protocol == PROTOCOL_CHANNELS_PXX2 || protocol == PROTOCOL_CHANNELS_NONE); +} + +void sendSynchronousPulses() +{ + for (uint8_t module = 0; module < NUM_MODULES; module++) { + uint8_t protocol = s_current_protocol[module]; + if (isProtocolSynchronous(protocol)) { + setupPulses(module); + } + } +} + uint32_t nextMixerTime[NUM_MODULES]; TASK_FUNCTION(mixerTask) @@ -89,8 +104,9 @@ TASK_FUNCTION(mixerTask) RTOS_WAIT_TICKS(1); #if defined(SIMU) - if (pwrCheck() == e_power_off) + if (pwrCheck() == e_power_off) { TASK_RETURN(); + } #else if (isForcePowerOffRequested()) { pwrOff(); @@ -153,7 +169,9 @@ TASK_FUNCTION(mixerTask) } t0 = getTmr2MHz() - t0; - if (t0 > maxMixerDuration) maxMixerDuration = t0 ; + if (t0 > maxMixerDuration) maxMixerDuration = t0; + + sendSynchronousPulses(); } } } diff --git a/radio/src/tasks_arm.h b/radio/src/tasks.h similarity index 100% rename from radio/src/tasks_arm.h rename to radio/src/tasks.h diff --git a/radio/src/trainer_input.cpp b/radio/src/trainer_input.cpp index 838c78297..a84ed0d6e 100644 --- a/radio/src/trainer_input.cpp +++ b/radio/src/trainer_input.cpp @@ -24,7 +24,7 @@ int16_t ppmInput[MAX_TRAINER_CHANNELS]; uint8_t ppmInputValidityTimer; -#include "audio_arm.h" +#include "audio.h" void checkTrainerSignalWarning() { From 807bc8bc2e4a4911f7bf8f87ea9093b44b9abefc Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Feb 2019 13:03:02 +0100 Subject: [PATCH 066/446] PXX2 continued + simu segfault fix --- radio/src/pulses/pxx.cpp | 50 ----------------- radio/src/pulses/pxx.h | 2 - radio/src/pulses/pxx1.cpp | 54 ++++++++++++++++++- radio/src/pulses/pxx1.h | 3 ++ radio/src/pulses/pxx2.cpp | 32 +++++++---- radio/src/pulses/pxx2.h | 21 ++++++-- .../src/targets/taranis/extmodule_driver.cpp | 8 --- radio/src/tasks.cpp | 15 +++++- 8 files changed, 107 insertions(+), 78 deletions(-) diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp index f63ee0580..af389aecb 100644 --- a/radio/src/pulses/pxx.cpp +++ b/radio/src/pulses/pxx.cpp @@ -127,56 +127,6 @@ void PxxPulses::addChannels(uint8_t port, uint8_t sendFailsafe, ui } } -template -uint8_t PxxPulses::addFlag1(uint8_t port) -{ - uint8_t flag1 = (g_model.moduleData[port].rfProtocol << 6); - if (moduleFlag[port] == MODULE_BIND) { - flag1 |= (g_eeGeneral.countryCode << 1) | PXX_SEND_BIND; - } - else if (moduleFlag[port] == MODULE_RANGECHECK) { - flag1 |= PXX_SEND_RANGECHECK; - } - else if (g_model.moduleData[port].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[port].failsafeMode != FAILSAFE_RECEIVER) { - if (failsafeCounter[port]-- == 0) { - failsafeCounter[port] = 1000; - flag1 |= PXX_SEND_FAILSAFE; - } - if (failsafeCounter[port] == 0 && g_model.moduleData[port].channelsCount > 0) { - flag1 |= PXX_SEND_FAILSAFE; - } - } - PxxTransport::addByte(flag1); - return flag1; -} - -template -void PxxPulses::addExtraFlags(uint8_t port) -{ - // Ext. flag (holds antenna selection on Horus internal module, 0x00 otherwise) - uint8_t extra_flags = 0; - -#if defined(PCBHORUS) || defined(PCBXLITE) - if (port == INTERNAL_MODULE) { - extra_flags |= (g_model.moduleData[port].pxx.external_antenna << 0); - } -#endif - - extra_flags |= (g_model.moduleData[port].pxx.receiver_telem_off << 1); - extra_flags |= (g_model.moduleData[port].pxx.receiver_channel_9_16 << 2); - if (isModuleR9M(port)) { - extra_flags |= (min(g_model.moduleData[port].pxx.power, isModuleR9M_FCC_VARIANT(port) ? (uint8_t)R9M_FCC_POWER_MAX : (uint8_t)R9M_LBT_POWER_MAX) << 3); - if (isModuleR9M_EUPLUS(port)) - extra_flags |= (1 << 6); - } - - // Disable S.PORT if internal module is active - if (IS_TELEMETRY_INTERNAL_MODULE()) { - extra_flags |= (1 << 5); - } - PxxTransport::addByte(extra_flags); -} - template class PxxPulses >; template class PxxPulses >; template class PxxPulses; diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 0fcf7f89e..3ce8ea2db 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -232,9 +232,7 @@ class UartPxxTransport: public DataBuffer, public PxxCrcMixin { template class PxxPulses: public PxxTransport { protected: - uint8_t addFlag1(uint8_t port); void addChannels(uint8_t port, uint8_t sendFailsafe, uint8_t sendUpperChannels); - void addExtraFlags(uint8_t port); }; #endif diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 3ab3963d8..4db5e7e68 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -21,6 +21,56 @@ #include "opentx.h" #include "pulses/pxx1.h" +template +uint8_t Pxx1Pulses::addFlag1(uint8_t port) +{ + uint8_t flag1 = (g_model.moduleData[port].rfProtocol << 6); + if (moduleFlag[port] == MODULE_BIND) { + flag1 |= (g_eeGeneral.countryCode << 1) | PXX_SEND_BIND; + } + else if (moduleFlag[port] == MODULE_RANGECHECK) { + flag1 |= PXX_SEND_RANGECHECK; + } + else if (g_model.moduleData[port].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[port].failsafeMode != FAILSAFE_RECEIVER) { + if (failsafeCounter[port]-- == 0) { + failsafeCounter[port] = 1000; + flag1 |= PXX_SEND_FAILSAFE; + } + if (failsafeCounter[port] == 0 && g_model.moduleData[port].channelsCount > 0) { + flag1 |= PXX_SEND_FAILSAFE; + } + } + PxxTransport::addByte(flag1); + return flag1; +} + +template +void Pxx1Pulses::addExtraFlags(uint8_t port) +{ + // Ext. flag (holds antenna selection on Horus internal module, 0x00 otherwise) + uint8_t extra_flags = 0; + +#if defined(PCBHORUS) || defined(PCBXLITE) + if (port == INTERNAL_MODULE) { + extra_flags |= (g_model.moduleData[port].pxx.external_antenna << 0); + } +#endif + + extra_flags |= (g_model.moduleData[port].pxx.receiver_telem_off << 1); + extra_flags |= (g_model.moduleData[port].pxx.receiver_channel_9_16 << 2); + if (isModuleR9M(port)) { + extra_flags |= (min(g_model.moduleData[port].pxx.power, isModuleR9M_FCC_VARIANT(port) ? (uint8_t)R9M_FCC_POWER_MAX : (uint8_t)R9M_LBT_POWER_MAX) << 3); + if (isModuleR9M_EUPLUS(port)) + extra_flags |= (1 << 6); + } + + // Disable S.PORT if internal module is active + if (IS_TELEMETRY_INTERNAL_MODULE()) { + extra_flags |= (1 << 5); + } + PxxTransport::addByte(extra_flags); +} + template void Pxx1Pulses::add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels) { @@ -33,7 +83,7 @@ void Pxx1Pulses::add8ChannelsFrame(uint8_t port, uint8_t sendUpper PxxTransport::addByte(g_model.header.modelId[port]); // Flag1 - uint8_t flag1 = PxxPulses::addFlag1(port); + uint8_t flag1 = addFlag1(port); // Flag2 PxxTransport::addByte(0); @@ -42,7 +92,7 @@ void Pxx1Pulses::add8ChannelsFrame(uint8_t port, uint8_t sendUpper PxxPulses::addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); // Extra flags - PxxPulses::addExtraFlags(port); + addExtraFlags(port); // CRC addCrc(); diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index 03624e7ea..b1ad7a623 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -42,6 +42,9 @@ class Pxx1Pulses: public PxxPulses PxxTransport::addByteWithoutCrc(PxxCrcMixin::crc); } + uint8_t addFlag1(uint8_t port); + void addExtraFlags(uint8_t port); + void add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels); }; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 0f613074b..f04166284 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -21,29 +21,39 @@ #include "opentx.h" #include "pulses/pxx2.h" -void Pxx2Pulses::setupFrame(uint8_t port) +uint8_t Pxx2Pulses::addFlag1(uint8_t module) +{ + uint8_t flag1 = g_model.header.modelId[module] & 0x3F; + if (g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER) { + if (failsafeCounter[module]-- == 0) { + failsafeCounter[module] = 1000; + flag1 |= PXX2_FLAG1_FAILSAFE; + } + } + Pxx2Transport::addByte(flag1); + return flag1; +} + +void Pxx2Pulses::setupFrame(uint8_t module) { initFrame(); - static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; - uint8_t sendUpperChannels = 0; - if (pass[port]++ & 0x01) { - sendUpperChannels = g_model.moduleData[port].channelsCount; - } + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_CHANNELS); // Model ID - addByte(g_model.header.modelId[port]); + // TODO addByte(g_model.header.modelId[port]); // Flag1 - uint8_t flag1 = addFlag1(port); + uint8_t flag1 = addFlag1(module); // Flag2 = Extra flags - addExtraFlags(port); + // TODO addExtraFlags(module); // Channels - addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); + addChannels(module, flag1 & PXX2_FLAG1_FAILSAFE, 0); + addChannels(module, flag1 & PXX2_FLAG1_FAILSAFE, 1); -#if defined(LUA) +#if 0 if (outputTelemetryBufferTrigger != 0x7E && outputTelemetryBufferSize > 0) { // primID (1 byte) + dataID (2 bytes) + value (4 bytes) addByte(outputTelemetryBufferTrigger); diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index f78985947..b2aba4d3a 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -23,6 +23,19 @@ #include "./pxx.h" +#define PXX2_TYPE_C_MODULE 0x01 + #define PXX2_TYPE_ID_REGISTER 0x01 + #define PXX2_TYPE_ID_BIND 0x02 + #define PXX2_TYPE_ID_CHANNELS 0x03 + #define PXX2_TYPE_ID_SPORT 0xFE + +#define PXX2_TYPE_C_POWER_METER 0x02 + +#define PXX2_TYPE_C_OTA 0xFE + +#define PXX2_FLAG1_FAILSAFE (1 << 6) + + // should not be used anymore class SportCrcMixin { protected: @@ -67,17 +80,19 @@ class Pxx2Pulses: public PxxPulses { // reserve 1 byte for LEN Pxx2Transport::addByteWithoutCrc(0x00); - - // TYPE_C + TYPE_ID - // TODO optimization ? Pxx2Transport::addByte(0x26); // This one is CRC-ed on purpose } void addFrameType(uint8_t type_c, uint8_t type_id) { + // TYPE_C + TYPE_ID + // TODO optimization ? Pxx2Transport::addByte(0x26); // This one is CRC-ed on purpose + Pxx2Transport::addByte(type_c); Pxx2Transport::addByte(type_id); } + uint8_t addFlag1(uint8_t module); + void addCrc() { Pxx2Transport::addByteWithoutCrc(PxxCrcMixin::crc >> 8); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 109275c6f..5153bb9fb 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -20,8 +20,6 @@ #include "opentx.h" -void extmoduleSendNextFrame(); - void extmoduleStop() { NVIC_DisableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); @@ -98,8 +96,6 @@ void extmodulePpmStart() EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2PE; // PWM mode 1 EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; - extmoduleSendNextFrame(); - NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); NVIC_SetPriority(EXTMODULE_TIMER_DMA_STREAM_IRQn, 7); NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn); @@ -132,8 +128,6 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0; EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; - extmoduleSendNextFrame(); - NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); NVIC_SetPriority(EXTMODULE_TIMER_DMA_STREAM_IRQn, 7); NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn); @@ -232,8 +226,6 @@ void extmodulePxxStart() EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; - extmoduleSendNextFrame(); - NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); NVIC_SetPriority(EXTMODULE_TIMER_DMA_STREAM_IRQn, 7); NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn); diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 41901446d..b618de3d7 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -179,8 +179,19 @@ TASK_FUNCTION(mixerTask) void scheduleNextMixerCalculation(uint8_t module, uint16_t period_ms) { // Schedule next mixer calculation time, - // for now assume mixer calculation takes 2 ms. - nextMixerTime[module] = (uint32_t)RTOS_GET_TIME() + (period_ms / RTOS_MS_PER_TICK) - 1 /* 1 tick in advance*/; + + if (isProtocolSynchronous(s_current_protocol[module])) { + nextMixerTime[module] += period_ms / RTOS_MS_PER_TICK; + if (nextMixerTime[module] < RTOS_GET_TIME()) { + // we are late ... let's add some small delay + nextMixerTime[module] = (uint32_t) RTOS_GET_TIME() + (period_ms / RTOS_MS_PER_TICK); + } + } + else { + // for now assume mixer calculation takes 2 ms. + nextMixerTime[module] = (uint32_t) RTOS_GET_TIME() + (period_ms / RTOS_MS_PER_TICK) - 1 /* 1 tick in advance*/; + } + DEBUG_TIMER_STOP(debugTimerMixerCalcToUsage); } From 9f2c7ded51f31daf87596b9513c17fe5205e62c9 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Feb 2019 13:16:38 +0100 Subject: [PATCH 067/446] PXX2 continued --- radio/src/pulses/pxx2.cpp | 30 +++++++++++++++++------------- radio/src/pulses/pxx2.h | 6 ++++-- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index f04166284..9aeedb9fd 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -21,17 +21,23 @@ #include "opentx.h" #include "pulses/pxx2.h" -uint8_t Pxx2Pulses::addFlag1(uint8_t module) +uint8_t Pxx2Pulses::addFlag0(uint8_t module) { - uint8_t flag1 = g_model.header.modelId[module] & 0x3F; + uint8_t flag0 = g_model.header.modelId[module] & 0x3F; if (g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER) { if (failsafeCounter[module]-- == 0) { failsafeCounter[module] = 1000; - flag1 |= PXX2_FLAG1_FAILSAFE; + flag0 |= PXX2_FLAG0_FAILSAFE; } } + Pxx2Transport::addByte(flag0); + return flag0; +} + +void Pxx2Pulses::addFlag1(uint8_t module) +{ + uint8_t flag1 = 0; Pxx2Transport::addByte(flag1); - return flag1; } void Pxx2Pulses::setupFrame(uint8_t module) @@ -40,20 +46,18 @@ void Pxx2Pulses::setupFrame(uint8_t module) addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_CHANNELS); - // Model ID - // TODO addByte(g_model.header.modelId[port]); + // FLAG0 + uint8_t flag0 = addFlag0(module); - // Flag1 - uint8_t flag1 = addFlag1(module); - - // Flag2 = Extra flags - // TODO addExtraFlags(module); + // FLAG1 + addFlag1(module); // Channels - addChannels(module, flag1 & PXX2_FLAG1_FAILSAFE, 0); - addChannels(module, flag1 & PXX2_FLAG1_FAILSAFE, 1); + addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, 0); + addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, 1); #if 0 + // TODO PXX15 if (outputTelemetryBufferTrigger != 0x7E && outputTelemetryBufferSize > 0) { // primID (1 byte) + dataID (2 bytes) + value (4 bytes) addByte(outputTelemetryBufferTrigger); diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index b2aba4d3a..caab554ac 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -33,7 +33,7 @@ #define PXX2_TYPE_C_OTA 0xFE -#define PXX2_FLAG1_FAILSAFE (1 << 6) +#define PXX2_FLAG0_FAILSAFE (1 << 6) // should not be used anymore @@ -91,7 +91,9 @@ class Pxx2Pulses: public PxxPulses { Pxx2Transport::addByte(type_id); } - uint8_t addFlag1(uint8_t module); + uint8_t addFlag0(uint8_t module); + + void addFlag1(uint8_t module); void addCrc() { From ab77595c6c73e1317bb45b279e1e361bf4418952 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Feb 2019 14:18:45 +0100 Subject: [PATCH 068/446] Another lot of refactoring --- radio/src/functions.cpp | 4 +- radio/src/gui/128x64/model_setup.cpp | 26 +- radio/src/gui/128x64/view_main.cpp | 2 +- radio/src/gui/212x64/model_setup.cpp | 10 +- radio/src/gui/480x272/model_setup.cpp | 22 +- radio/src/myeeprom.h | 5 +- radio/src/opentx.cpp | 4 +- radio/src/pulses/{dsm2_arm.cpp => dsm2.cpp} | 18 +- radio/src/pulses/{multi_arm.cpp => multi.cpp} | 6 +- radio/src/pulses/{ppm_arm.cpp => ppm.cpp} | 0 .../src/pulses/{pulses_arm.cpp => pulses.cpp} | 15 +- radio/src/pulses/pulses.h | 227 ++++++++++++++++-- radio/src/pulses/pulses_arm.h | 217 ----------------- radio/src/pulses/pxx1.cpp | 63 ++--- radio/src/pulses/pxx2.cpp | 33 ++- radio/src/pulses/pxx2.h | 9 +- radio/src/pulses/{sbus_arm.cpp => sbus.cpp} | 0 radio/src/targets/common/arm/CMakeLists.txt | 8 +- .../arm/stm32/intmodule_serial_driver.cpp | 2 +- radio/src/targets/horus/extmodule_driver.cpp | 10 +- radio/src/targets/simu/simpgmspace.cpp | 2 +- radio/src/targets/sky9x/pulses_driver.cpp | 2 +- .../src/targets/taranis/extmodule_driver.cpp | 8 +- .../taranis/intmodule_pulses_driver.cpp | 4 +- radio/src/tasks.cpp | 4 +- radio/src/telemetry/spektrum.cpp | 3 +- 26 files changed, 357 insertions(+), 347 deletions(-) rename radio/src/pulses/{dsm2_arm.cpp => dsm2.cpp} (89%) rename radio/src/pulses/{multi_arm.cpp => multi.cpp} (97%) rename radio/src/pulses/{ppm_arm.cpp => ppm.cpp} (100%) rename radio/src/pulses/{pulses_arm.cpp => pulses.cpp} (95%) delete mode 100644 radio/src/pulses/pulses_arm.h rename radio/src/pulses/{sbus_arm.cpp => sbus.cpp} (100%) diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp index 2422e0dc0..ef286f494 100644 --- a/radio/src/functions.cpp +++ b/radio/src/functions.cpp @@ -232,7 +232,7 @@ void evalFunctions(const CustomFunctionData * functions, CustomFunctionsContext { unsigned int moduleIndex = CFN_PARAM(cfn); if (moduleIndex < NUM_MODULES) { - moduleFlag[moduleIndex] = 1 + CFN_FUNC(cfn) - FUNC_RANGECHECK; + moduleSettings[moduleIndex].mode = 1 + CFN_FUNC(cfn) - FUNC_RANGECHECK; } break; } @@ -403,7 +403,7 @@ void evalFunctions(const CustomFunctionData * functions, CustomFunctionsContext { unsigned int moduleIndex = CFN_PARAM(cfn); if (moduleIndex < NUM_MODULES) { - moduleFlag[moduleIndex] = 0; + moduleSettings[moduleIndex].mode = 0; } break; } diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 99d636653..ee8ba0920 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -247,7 +247,7 @@ void onBindMenu(const char * result) return; } - moduleFlag[moduleIdx] = MODULE_BIND; + moduleSettings[moduleIdx].mode = MODULE_MODE_BIND; } @@ -331,9 +331,9 @@ void menuModelSetup(event_t event) #if (defined(DSM2) || defined(PXX)) if (menuEvent) { - moduleFlag[0] = 0; + moduleSettings[0].mode = 0; #if NUM_MODULES > 1 - moduleFlag[1] = 0; + moduleSettings[1].mode = 0; #endif } #endif @@ -1027,10 +1027,10 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_RANGE); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, attr); if (attr && s_editMode>0) { - moduleFlag[INTERNAL_MODULE] = MODULE_RANGECHECK; + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; } if (attr && s_editMode==0) { - moduleFlag[INTERNAL_MODULE] = MODULE_NORMAL_MODE; + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; } } break; @@ -1201,8 +1201,8 @@ void menuModelSetup(event_t event) POPUP_MENU_START(onBindMenu); continue; } - if (moduleFlag[moduleIdx] == MODULE_BIND) { - newFlag = MODULE_BIND; + if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) { + newFlag = MODULE_MODE_BIND; } else { if (!popupMenuNoItems) { @@ -1211,26 +1211,26 @@ void menuModelSetup(event_t event) } } else { - newFlag = MODULE_BIND; + newFlag = MODULE_MODE_BIND; } } else if (l_posHorz == 2) { - newFlag = MODULE_RANGECHECK; + newFlag = MODULE_MODE_RANGECHECK; } } } #else if (attr && l_posHorz>0 && s_editMode>0) { if (l_posHorz == 1) - newFlag = MODULE_BIND; + newFlag = MODULE_MODE_BIND; else if (l_posHorz == 2) - newFlag = MODULE_RANGECHECK; + newFlag = MODULE_MODE_RANGECHECK; } #endif - moduleFlag[moduleIdx] = newFlag; + moduleSettings[moduleIdx].mode = newFlag; #if defined(MULTIMODULE) - if (newFlag == MODULE_BIND) { + if (newFlag == MODULE_MODE_BIND) { multiBindStatus = MULTI_BIND_INITIATED; } #endif diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index 43401c55e..6fbfb38a3 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -573,7 +573,7 @@ void menuMainView(event_t event) #endif #if defined(DSM2) - if (moduleFlag[0] == MODULE_BIND) { + if (moduleSettings[0].mode == MODULE_MODE_BIND) { // Issue 98 lcdDrawText(15*FW, 0, "BIND", 0); } diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index ef7056dc2..03c5ce1e6 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -130,7 +130,7 @@ void onBindMenu(const char * result) return; } - moduleFlag[moduleIdx] = MODULE_BIND; + moduleSettings[moduleIdx].bind = 1;; } void copySelection(char * dst, const char * src, uint8_t size) @@ -309,8 +309,8 @@ void menuModelSetup(event_t event) #if (defined(DSM2) || defined(PXX)) if (menuEvent) { - moduleFlag[0] = 0; - moduleFlag[1] = 0; + moduleSettings[0].mode = 0; + moduleSettings[1].mode = 0; } #endif @@ -1061,7 +1061,7 @@ void menuModelSetup(event_t event) POPUP_MENU_START(onBindMenu); continue; } - if (moduleFlag[moduleIdx] == MODULE_BIND) { + if (moduleSettings[moduleIdx].mode == MODULE_BIND) { newFlag = MODULE_BIND; } else { @@ -1079,7 +1079,7 @@ void menuModelSetup(event_t event) } } } - moduleFlag[moduleIdx] = newFlag; + moduleSettings[moduleIdx].mode = newFlag; #if defined(MULTIMODULE) if (newFlag == MODULE_BIND) multiBindStatus = MULTI_BIND_INITIATED; diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 8582d45fb..6258ba9b5 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -138,7 +138,7 @@ void onBindMenu(const char * result) return; } - moduleFlag[moduleIdx] = MODULE_BIND; + moduleSettings[moduleIdx].bind = 1;; } void onModelSetupBitmapMenu(const char * result) @@ -298,8 +298,8 @@ bool menuModelSetup(event_t event) } if (menuEvent) { - moduleFlag[0] = 0; - moduleFlag[1] = 0; + moduleSettings[0].mode = 0; + moduleSettings[1].mode = 0; } int sub = menuVerticalPosition; @@ -945,8 +945,8 @@ bool menuModelSetup(event_t event) } } } - drawButton(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, (moduleFlag[moduleIdx] == MODULE_BIND ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==1 ? attr : 0)); - drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleFlag[moduleIdx] == MODULE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0)); + drawButton(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==1 ? attr : 0)); + drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleSettings[moduleIdx].mode == MODULE_MODE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0)); uint8_t newFlag = 0; #if defined(MULTIMODULE) if (multiBindStatus == MULTI_BIND_FINISHED) { @@ -982,8 +982,8 @@ bool menuModelSetup(event_t event) POPUP_MENU_START(onBindMenu); continue; } - if (moduleFlag[moduleIdx] == MODULE_BIND) { - newFlag = MODULE_BIND; + if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) { + newFlag = MODULE_MODE_BIND; } else { if (!popupMenuNoItems) { @@ -992,17 +992,17 @@ bool menuModelSetup(event_t event) } } else { - newFlag = MODULE_BIND; + newFlag = MODULE_MODE_BIND; } } else if (l_posHorz == 2) { - newFlag = MODULE_RANGECHECK; + newFlag = MODULE_MODE_RANGECHECK; } } } - moduleFlag[moduleIdx] = newFlag; + moduleSettings[moduleIdx].mode = newFlag; #if defined(MULTIMODULE) - if (newFlag == MODULE_BIND) + if (newFlag == MODULE_MODE_BIND) multiBindStatus = MULTI_BIND_INITIATED; #endif } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index e4f606dc3..5c5f9b876 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -290,6 +290,8 @@ enum SwashType { #endif enum ChannelsProtocols { + PROTOCOL_CHANNELS_UNINITIALIZED, + PROTOCOL_CHANNELS_NONE, PROTOCOL_CHANNELS_PPM, #if defined(PXX) || defined(DSM2) PROTOCOL_CHANNELS_PXX, @@ -302,8 +304,7 @@ enum ChannelsProtocols { PROTOCOL_CHANNELS_CROSSFIRE, PROTOCOL_CHANNELS_MULTIMODULE, PROTOCOL_CHANNELS_SBUS, - PROTOCOL_CHANNELS_PXX2, - PROTOCOL_CHANNELS_NONE + PROTOCOL_CHANNELS_PXX2 }; enum XJTRFProtocols { diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index feb604939..faf88d879 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1488,9 +1488,9 @@ void doMixerCalculations() static uint8_t countRangecheck = 0; for (uint8_t i=0; i= 250) { countRangecheck = 0; diff --git a/radio/src/pulses/dsm2_arm.cpp b/radio/src/pulses/dsm2.cpp similarity index 89% rename from radio/src/pulses/dsm2_arm.cpp rename to radio/src/pulses/dsm2.cpp index 97a4a4818..4fafc78c4 100644 --- a/radio/src/pulses/dsm2_arm.cpp +++ b/radio/src/pulses/dsm2.cpp @@ -110,7 +110,7 @@ void putDsm2Flush() // This is the data stream to send, prepare after 19.5 mS // Send after 22.5 mS -void setupPulsesDSM2(uint8_t port) +void setupPulsesDSM2(uint8_t module) { uint8_t dsmDat[14]; @@ -124,7 +124,7 @@ void setupPulsesDSM2(uint8_t port) modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; - switch (s_current_protocol[port]) { + switch (moduleSettings[module].protocol) { case PROTOCOL_CHANNELS_DSM2_LP45: dsmDat[0] = 0x00; break; @@ -140,29 +140,29 @@ void setupPulsesDSM2(uint8_t port) if (dsm2BindTimer > 0) { dsm2BindTimer--; if (switchState(SW_DSM2_BIND)) { - moduleFlag[port] = MODULE_BIND; + moduleSettings[port].mode = MODULE_MODE_BIND; dsmDat[0] |= DSM2_SEND_BIND; } } - else if (moduleFlag[port] == MODULE_RANGECHECK) { + else if (moduleSettings[port].mode == MODULE_MODE_RANGECHECK) { dsmDat[0] |= DSM2_SEND_RANGECHECK; } else { - moduleFlag[port] = 0; + moduleSettings[port].mode = 0; } #else - if (moduleFlag[port] == MODULE_BIND) { + if (moduleSettings[module].mode == MODULE_MODE_BIND) { dsmDat[0] |= DSM2_SEND_BIND; } - else if (moduleFlag[port] == MODULE_RANGECHECK) { + else if (moduleSettings[module].mode == MODULE_MODE_RANGECHECK) { dsmDat[0] |= DSM2_SEND_RANGECHECK; } #endif - dsmDat[1] = g_model.header.modelId[port]; // DSM2 Header second byte for model match + dsmDat[1] = g_model.header.modelId[module]; // DSM2 Header second byte for model match for (int i=0; i>5)+512, 1023); dsmDat[2+2*i] = (i<<2) | ((pulse>>8)&0x03); diff --git a/radio/src/pulses/multi_arm.cpp b/radio/src/pulses/multi.cpp similarity index 97% rename from radio/src/pulses/multi_arm.cpp rename to radio/src/pulses/multi.cpp index cb15c1e01..f148ef3cc 100644 --- a/radio/src/pulses/multi_arm.cpp +++ b/radio/src/pulses/multi.cpp @@ -152,16 +152,16 @@ void sendFrameProtocolHeader(uint8_t port, bool failsafe) int8_t optionValue = g_model.moduleData[port].multi.optionValue; uint8_t protoByte = 0; - if (moduleFlag[port] == MODULE_BIND) + if (moduleSettings[port].mode == MODULE_BIND) protoByte |= MULTI_SEND_BIND; - else if (moduleFlag[port] == MODULE_RANGECHECK) + else if (moduleSettings[port].mode == MODULE_RANGECHECK) protoByte |= MULTI_SEND_RANGECHECK; // rfProtocol if (g_model.moduleData[port].getMultiProtocol(true) == MM_RF_PROTO_DSM2) { // Autobinding should always be done in DSMX 11ms - if (g_model.moduleData[port].multi.autoBindMode && moduleFlag[port] == MODULE_BIND) + if (g_model.moduleData[port].multi.autoBindMode && moduleSettings[port].mode == MODULE_BIND) subtype = MM_RF_DSM2_SUBTYPE_AUTO; // Multi module in DSM mode wants the number of channels to be used as option value diff --git a/radio/src/pulses/ppm_arm.cpp b/radio/src/pulses/ppm.cpp similarity index 100% rename from radio/src/pulses/ppm_arm.cpp rename to radio/src/pulses/ppm.cpp diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses.cpp similarity index 95% rename from radio/src/pulses/pulses_arm.cpp rename to radio/src/pulses/pulses.cpp index 83963ed86..0c5196320 100755 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses.cpp @@ -23,10 +23,7 @@ #include "pulses/pxx2.h" uint8_t s_pulses_paused = 0; -uint8_t s_current_protocol[NUM_MODULES] = { MODULES_INIT(255) }; -uint16_t failsafeCounter[NUM_MODULES] = { MODULES_INIT(100) }; -uint8_t moduleFlag[NUM_MODULES] = { 0 }; - +ModuleSettings moduleSettings[NUM_MODULES]; ModulePulsesData modulePulsesData[NUM_MODULES] __DMA; TrainerPulsesData trainerPulsesData __DMA; @@ -86,7 +83,7 @@ uint8_t getRequiredProtocol(uint8_t port) // The module is set to OFF during one second before BIND start { static tmr10ms_t bindStartTime = 0; - if (moduleFlag[EXTERNAL_MODULE] == MODULE_BIND) { + if (moduleSettings[EXTERNAL_MODULE].mode == MODULE_MODE_BIND) { if (bindStartTime == 0) bindStartTime = get_tmr10ms(); if ((tmr10ms_t)(get_tmr10ms() - bindStartTime) < 100) { required_protocol = PROTOCOL_CHANNELS_NONE; @@ -117,7 +114,7 @@ uint8_t getRequiredProtocol(uint8_t port) #if 0 // will need an EEPROM conversion - if (moduleFlag[port] == MODULE_OFF) { + if (moduleSettings[port].mode == MODULE_OFF) { required_protocol = PROTOCOL_CHANNELS_NONE; } #endif @@ -324,9 +321,9 @@ void setupPulses(uint8_t module) heartbeat |= (HEART_TIMER_PULSES << module); - if (s_current_protocol[module] != required_protocol) { - disablePulses(module, s_current_protocol[module]); - s_current_protocol[module] = required_protocol; + if (moduleSettings[module].protocol != required_protocol) { + disablePulses(module, moduleSettings[module].protocol); + moduleSettings[module].protocol = required_protocol; enablePulses(module, required_protocol); } else { diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 3fe9977cf..cae6702b1 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -21,20 +21,15 @@ #ifndef _PULSES_H_ #define _PULSES_H_ -enum ModuleFlag -{ - MODULE_NORMAL_MODE, - MODULE_RANGECHECK, - MODULE_BIND, - // MODULE_OFF, // will need an EEPROM conversion -}; - - extern uint8_t moduleFlag[NUM_MODULES]; +#include "definitions.h" +#include "dataconstants.h" +#include "pulses/pxx2.h" +#include "pulses/pxx1.h" #if NUM_MODULES > 1 - #define IS_RANGECHECK_ENABLE() (moduleFlag[0] == MODULE_RANGECHECK || moduleFlag[1] == MODULE_RANGECHECK) + #define IS_RANGECHECK_ENABLE() (moduleSettings[0].mode == MODULE_MODE_RANGECHECK || moduleSettings[1].mode == MODULE_MODE_RANGECHECK) #else - #define IS_RANGECHECK_ENABLE() (moduleFlag[0] == MODULE_RANGECHECK) + #define IS_RANGECHECK_ENABLE() (moduleSettings[0].mode == MODULE_MODE_RANGECHECK) #endif #if defined(DSM2) && !defined(PCBTARANIS) @@ -42,8 +37,6 @@ enum ModuleFlag extern uint8_t dsm2BindTimer; #endif - #define IS_PPM_PROTOCOL(protocol) (protocol==PROTO_PPM) - #if defined(PXX) #define IS_PXX_PROTOCOL(protocol) (protocol==PROTO_PXX) #else @@ -71,9 +64,213 @@ enum ModuleFlag #define IS_MULTIMODULE_PROTOCOL(protocol) (0) #endif - #define IS_SBUS_PROTOCOL(protocol) (protocol == PROTOCOL_CHANNELS_SBUS) +#define IS_SBUS_PROTOCOL(protocol) (protocol == PROTOCOL_CHANNELS_SBUS) +#if NUM_MODULES == 2 +#define MODULES_INIT(...) __VA_ARGS__, __VA_ARGS__ +#else +#define MODULES_INIT(...) __VA_ARGS__ +#endif + +extern uint8_t s_pulses_paused; + +enum ModuleSettingsMode +{ + MODULE_MODE_NORMAL, + MODULE_MODE_RANGECHECK, + MODULE_MODE_BIND, + MODULE_MODE_REGISTER +}; + +PACK(struct ModuleSettings { + uint8_t protocol:5; + uint8_t paused:1; + uint8_t mode:2; + uint16_t failsafeCounter; + }); + +extern ModuleSettings moduleSettings[NUM_MODULES]; + +template struct PpmPulsesData { + T pulses[20]; + T * ptr; +}; + +#if defined(PPM_PIN_SERIAL) +PACK(struct Dsm2SerialPulsesData { + uint8_t pulses[64]; + uint8_t * ptr; + uint8_t serialByte ; + uint8_t serialBitCount; + uint16_t _alignment; +}); +#else +#define MAX_PULSES_TRANSITIONS 300 +PACK(struct Dsm2TimerPulsesData { + pulse_duration_t pulses[MAX_PULSES_TRANSITIONS]; + pulse_duration_t * ptr; + uint16_t rest; + uint8_t index; + }); +#endif + +#define PPM_PERIOD_HALF_US(module) ((g_model.moduleData[module].ppm.frameLength * 5 + 225) * 200) /*half us*/ +#define PPM_PERIOD(module) (PPM_PERIOD_HALF_US(module) / 2000) /*ms*/ +#define DSM2_BAUDRATE 125000 +#define DSM2_PERIOD 22 /*ms*/ +#define SBUS_BAUDRATE 100000 +#define SBUS_PERIOD_HALF_US ((g_model.moduleData[EXTERNAL_MODULE].sbus.refreshRate * 5 + 225) * 200) /*half us*/ +#define SBUS_PERIOD (SBUS_PERIOD_HALF_US / 2000) /*ms*/ +#define MULTIMODULE_BAUDRATE 100000 +#define MULTIMODULE_PERIOD 7 /*ms*/ + +#define CROSSFIRE_FRAME_MAXLEN 64 +PACK(struct CrossfirePulsesData { + uint8_t pulses[CROSSFIRE_FRAME_MAXLEN]; + }); + +union ModulePulsesData { +#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) + UartPxxPulses pxx_uart; +#endif +#if defined(PPM_PIN_SERIAL) + SerialPxxPulses pxx; +#elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) + PwmPxxPulses pxx; +#endif + + Pxx2Pulses pxx2; + +#if defined(PPM_PIN_SERIAL) + Dsm2SerialPulsesData dsm2; +#else + Dsm2TimerPulsesData dsm2; +#endif + + PpmPulsesData ppm; + CrossfirePulsesData crossfire; +} __ALIGNED(4); + +/* The __ALIGNED keyword is required to align the struct inside the modulePulsesData below, + * which is also defined to be __DMA (which includes __ALIGNED) aligned. + * Arrays in C/C++ are always defined to be *contiguously*. The first byte of the second element is therefore always + * sizeof(ModulePulsesData). __ALIGNED is required for sizeof(ModulePulsesData) to be a multiple of the alignment. + */ + +/* TODO: internal pulsedata only needs 200 bytes vs 300 bytes for external, both use 300 byte since we have a common struct */ +extern ModulePulsesData modulePulsesData[NUM_MODULES]; + +union TrainerPulsesData { + PpmPulsesData ppm; +}; + +extern TrainerPulsesData trainerPulsesData; +extern const uint16_t CRCTable[]; + +void setupPulses(uint8_t port); +void setupPulsesDSM2(uint8_t port); +void setupPulsesMultimodule(uint8_t port); +void setupPulsesSbus(uint8_t port); +void setupPulsesPXX(uint8_t port); +void setupPulsesPPMModule(uint8_t port); +void setupPulsesPPMTrainer(); +void sendByteDsm2(uint8_t b); +void putDsm2Flush(); +void putDsm2SerialBit(uint8_t bit); +void sendByteSbus(uint8_t byte); + +#if defined(HUBSAN) +void Hubsan_Init(); +#endif + +inline void startPulses() +{ + s_pulses_paused = false; + +#if defined(PCBTARANIS) || defined(PCBHORUS) + setupPulses(INTERNAL_MODULE); + setupPulses(EXTERNAL_MODULE); +#else + setupPulses(EXTERNAL_MODULE); +#endif + +#if defined(HUBSAN) + Hubsan_Init(); +#endif +} + +inline bool pulsesStarted() { return moduleSettings[0].protocol != PROTOCOL_CHANNELS_UNINITIALIZED; } +inline void pausePulses() { s_pulses_paused = true; } +inline void resumePulses() { s_pulses_paused = false; } + +#define SEND_FAILSAFE_NOW(idx) moduleSettings[idx].failsafeCounter = 1 + +inline void SEND_FAILSAFE_1S() +{ + for (int i=0; i struct PpmPulsesData { - T pulses[20]; - T * ptr; -}; - -#if defined(PPM_PIN_SERIAL) -PACK(struct Dsm2SerialPulsesData { - uint8_t pulses[64]; - uint8_t * ptr; - uint8_t serialByte ; - uint8_t serialBitCount; - uint16_t _alignment; -}); -#else -#define MAX_PULSES_TRANSITIONS 300 -PACK(struct Dsm2TimerPulsesData { - pulse_duration_t pulses[MAX_PULSES_TRANSITIONS]; - pulse_duration_t * ptr; - uint16_t rest; - uint8_t index; -}); -#endif - -#define PPM_PERIOD_HALF_US(module) ((g_model.moduleData[module].ppm.frameLength * 5 + 225) * 200) /*half us*/ -#define PPM_PERIOD(module) (PPM_PERIOD_HALF_US(module) / 2000) /*ms*/ -#define DSM2_BAUDRATE 125000 -#define DSM2_PERIOD 22 /*ms*/ -#define SBUS_BAUDRATE 100000 -#define SBUS_PERIOD_HALF_US ((g_model.moduleData[EXTERNAL_MODULE].sbus.refreshRate * 5 + 225) * 200) /*half us*/ -#define SBUS_PERIOD (SBUS_PERIOD_HALF_US / 2000) /*ms*/ -#define MULTIMODULE_BAUDRATE 100000 -#define MULTIMODULE_PERIOD 7 /*ms*/ - -#define CROSSFIRE_FRAME_MAXLEN 64 -PACK(struct CrossfirePulsesData { - uint8_t pulses[CROSSFIRE_FRAME_MAXLEN]; -}); - -union ModulePulsesData { -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) - UartPxxPulses pxx_uart; -#endif -#if defined(PPM_PIN_SERIAL) - SerialPxxPulses pxx; -#elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) - PwmPxxPulses pxx; -#endif - - Pxx2Pulses pxx2; - -#if defined(PPM_PIN_SERIAL) - Dsm2SerialPulsesData dsm2; -#else - Dsm2TimerPulsesData dsm2; -#endif - - PpmPulsesData ppm; - CrossfirePulsesData crossfire; -} __ALIGNED(4); - -/* The __ALIGNED keyword is required to align the struct inside the modulePulsesData below, - * which is also defined to be __DMA (which includes __ALIGNED) aligned. - * Arrays in C/C++ are always defined to be *contiguously*. The first byte of the second element is therefore always - * sizeof(ModulePulsesData). __ALIGNED is required for sizeof(ModulePulsesData) to be a multiple of the alignment. - */ - -/* TODO: internal pulsedata only needs 200 bytes vs 300 bytes for external, both use 300 byte since we have a common struct */ -extern ModulePulsesData modulePulsesData[NUM_MODULES]; - -union TrainerPulsesData { - PpmPulsesData ppm; -}; - -extern TrainerPulsesData trainerPulsesData; -extern const uint16_t CRCTable[]; - -void setupPulses(uint8_t port); -void setupPulsesDSM2(uint8_t port); -void setupPulsesMultimodule(uint8_t port); -void setupPulsesSbus(uint8_t port); -void setupPulsesPXX(uint8_t port); -void setupPulsesPPMModule(uint8_t port); -void setupPulsesPPMTrainer(); -void sendByteDsm2(uint8_t b); -void putDsm2Flush(); -void putDsm2SerialBit(uint8_t bit); -void sendByteSbus(uint8_t byte); - -#if defined(HUBSAN) -void Hubsan_Init(); -#endif - -inline void startPulses() -{ - s_pulses_paused = false; - -#if defined(PCBTARANIS) || defined(PCBHORUS) - setupPulses(INTERNAL_MODULE); - setupPulses(EXTERNAL_MODULE); -#else - setupPulses(EXTERNAL_MODULE); -#endif - -#if defined(HUBSAN) - Hubsan_Init(); -#endif -} - -inline bool pulsesStarted() { return s_current_protocol[0] != 255; } -inline void pausePulses() { s_pulses_paused = true; } -inline void resumePulses() { s_pulses_paused = false; } - -#define SEND_FAILSAFE_NOW(idx) failsafeCounter[idx] = 1 - -inline void SEND_FAILSAFE_1S() -{ - for (int i=0; i -uint8_t Pxx1Pulses::addFlag1(uint8_t port) +uint8_t Pxx1Pulses::addFlag1(uint8_t module) { - uint8_t flag1 = (g_model.moduleData[port].rfProtocol << 6); - if (moduleFlag[port] == MODULE_BIND) { + uint8_t flag1 = (g_model.moduleData[module].rfProtocol << 6); + if (moduleSettings[module].mode == MODULE_MODE_BIND) { flag1 |= (g_eeGeneral.countryCode << 1) | PXX_SEND_BIND; } - else if (moduleFlag[port] == MODULE_RANGECHECK) { + else if (moduleSettings[module].mode == MODULE_MODE_RANGECHECK) { flag1 |= PXX_SEND_RANGECHECK; } - else if (g_model.moduleData[port].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[port].failsafeMode != FAILSAFE_RECEIVER) { - if (failsafeCounter[port]-- == 0) { - failsafeCounter[port] = 1000; - flag1 |= PXX_SEND_FAILSAFE; + else { + bool failsafeNeeded = g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER; + if (moduleSettings[module].failsafeCounter-- == 0) { + // failsafeCounter is also used for knowing if the frame is odd / even + moduleSettings[module].failsafeCounter = 1000; + if (failsafeNeeded) { + flag1 |= PXX_SEND_FAILSAFE; + } } - if (failsafeCounter[port] == 0 && g_model.moduleData[port].channelsCount > 0) { + if (failsafeNeeded && moduleSettings[module].failsafeCounter == 0 && g_model.moduleData[module].channelsCount > 0) { flag1 |= PXX_SEND_FAILSAFE; } } @@ -45,22 +49,22 @@ uint8_t Pxx1Pulses::addFlag1(uint8_t port) } template -void Pxx1Pulses::addExtraFlags(uint8_t port) +void Pxx1Pulses::addExtraFlags(uint8_t module) { // Ext. flag (holds antenna selection on Horus internal module, 0x00 otherwise) uint8_t extra_flags = 0; #if defined(PCBHORUS) || defined(PCBXLITE) - if (port == INTERNAL_MODULE) { - extra_flags |= (g_model.moduleData[port].pxx.external_antenna << 0); + if (module == INTERNAL_MODULE) { + extra_flags |= (g_model.moduleData[module].pxx.external_antenna << 0); } #endif - extra_flags |= (g_model.moduleData[port].pxx.receiver_telem_off << 1); - extra_flags |= (g_model.moduleData[port].pxx.receiver_channel_9_16 << 2); - if (isModuleR9M(port)) { - extra_flags |= (min(g_model.moduleData[port].pxx.power, isModuleR9M_FCC_VARIANT(port) ? (uint8_t)R9M_FCC_POWER_MAX : (uint8_t)R9M_LBT_POWER_MAX) << 3); - if (isModuleR9M_EUPLUS(port)) + extra_flags |= (g_model.moduleData[module].pxx.receiver_telem_off << 1); + extra_flags |= (g_model.moduleData[module].pxx.receiver_channel_9_16 << 2); + if (isModuleR9M(module)) { + extra_flags |= (min(g_model.moduleData[module].pxx.power, isModuleR9M_FCC_VARIANT(module) ? (uint8_t)R9M_FCC_POWER_MAX : (uint8_t)R9M_LBT_POWER_MAX) << 3); + if (isModuleR9M_EUPLUS(module)) extra_flags |= (1 << 6); } @@ -72,7 +76,7 @@ void Pxx1Pulses::addExtraFlags(uint8_t port) } template -void Pxx1Pulses::add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels) +void Pxx1Pulses::add8ChannelsFrame(uint8_t module, uint8_t sendUpperChannels) { PxxTransport::initCrc(); @@ -80,19 +84,19 @@ void Pxx1Pulses::add8ChannelsFrame(uint8_t port, uint8_t sendUpper addHead(); // RX Number - PxxTransport::addByte(g_model.header.modelId[port]); + PxxTransport::addByte(g_model.header.modelId[module]); // Flag1 - uint8_t flag1 = addFlag1(port); + uint8_t flag1 = addFlag1(module); // Flag2 PxxTransport::addByte(0); // Channels - PxxPulses::addChannels(port, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); + PxxPulses::addChannels(module, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); // Extra flags - addExtraFlags(port); + addExtraFlags(module); // CRC addCrc(); @@ -105,22 +109,21 @@ void Pxx1Pulses::add8ChannelsFrame(uint8_t port, uint8_t sendUpper } template -void Pxx1Pulses::setupFrame(uint8_t port) +void Pxx1Pulses::setupFrame(uint8_t module) { PxxTransport::initFrame(); #if defined(PXX_FREQUENCY_HIGH) - add8ChannelsFrame(port, 0); - if (sentModuleChannels(port) > 8) { - add8ChannelsFrame(port, 8); + add8ChannelsFrame(module, 0); + if (sentModuleChannels(module) > 8) { + add8ChannelsFrame(module, 8); } #else - static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; uint8_t sendUpperChannels = 0; - if (pass[port]++ & 0x01) { - sendUpperChannels = g_model.moduleData[port].channelsCount; + if (moduleSettings[module].failsafeCounter & 0x01) { + sendUpperChannels = g_model.moduleData[module].channelsCount; } - add8ChannelsFrame(port, sendUpperChannels); + add8ChannelsFrame(module, sendUpperChannels); #endif } diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 9aeedb9fd..c468851e9 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -25,8 +25,8 @@ uint8_t Pxx2Pulses::addFlag0(uint8_t module) { uint8_t flag0 = g_model.header.modelId[module] & 0x3F; if (g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER) { - if (failsafeCounter[module]-- == 0) { - failsafeCounter[module] = 1000; + if (moduleSettings[module].failsafeCounter-- == 0) { + moduleSettings[module].failsafeCounter = 1000; flag0 |= PXX2_FLAG0_FAILSAFE; } } @@ -40,10 +40,8 @@ void Pxx2Pulses::addFlag1(uint8_t module) Pxx2Transport::addByte(flag1); } -void Pxx2Pulses::setupFrame(uint8_t module) +void Pxx2Pulses::setupChannelsFrame(uint8_t module) { - initFrame(); - addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_CHANNELS); // FLAG0 @@ -55,6 +53,31 @@ void Pxx2Pulses::setupFrame(uint8_t module) // Channels addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, 0); addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, 1); +} + +void Pxx2Pulses::setupRegisterFrame(uint8_t module) +{ + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); + Pxx2Transport::addByte(0); +} + +void Pxx2Pulses::setupBindFrame(uint8_t module) +{ + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_BIND); +} + +void Pxx2Pulses::setupFrame(uint8_t module) +{ + initFrame(); + + uint8_t mode = moduleSettings[module].mode; + + if (mode == MODULE_MODE_REGISTER) + setupRegisterFrame(module); + else if (mode == MODULE_MODE_BIND) + setupBindFrame(module); + else + setupChannelsFrame(module); #if 0 // TODO PXX15 diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index caab554ac..dc5b341db 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -71,7 +71,14 @@ class Pxx2Transport: public DataBuffer, public PxxCrcMixin { class Pxx2Pulses: public PxxPulses { public: - void setupFrame(uint8_t port); + void setupFrame(uint8_t module); + + protected: + void setupRegisterFrame(uint8_t module); + + void setupBindFrame(uint8_t module); + + void setupChannelsFrame(uint8_t module); void addHead() { diff --git a/radio/src/pulses/sbus_arm.cpp b/radio/src/pulses/sbus.cpp similarity index 100% rename from radio/src/pulses/sbus_arm.cpp rename to radio/src/pulses/sbus.cpp diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 3e1b89fb6..63ad85ef8 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -128,11 +128,11 @@ set(FIRMWARE_SRC set(PULSES_SRC ${PULSES_SRC} - pulses_arm.cpp - ppm_arm.cpp + pulses.cpp + ppm.cpp pxx.cpp pxx1.cpp pxx2.cpp - dsm2_arm.cpp - sbus_arm.cpp + dsm2.cpp + sbus.cpp ) diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index a91b944f6..2358f11a2 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -87,7 +87,7 @@ extern "C" void INTMODULE_DMA_STREAM_IRQHandler(void) void intmoduleSendNextFrame() { - if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX2) { + if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(INTMODULE_DMA_STREAM); DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL; diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index e8e71ae76..e14a75487 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -219,7 +219,7 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) void extmoduleSendNextFrame() { - if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { + if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) { #if defined(PCBX10) || PCBREV >= 13 EXTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); @@ -238,7 +238,7 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses; EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { + else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) { EXTMODULE_TIMER->CCR2 = modulePulsesData[EXTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA #if defined(PCBX10) || PCBREV >= 13 @@ -251,16 +251,16 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (IS_DSM2_PROTOCOL(s_current_protocol[EXTERNAL_MODULE]) || IS_MULTIMODULE_PROTOCOL(s_current_protocol[EXTERNAL_MODULE]) || IS_SBUS_PROTOCOL(s_current_protocol[EXTERNAL_MODULE])) { + else if (IS_DSM2_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) { EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - 1) - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA #if defined(PCBX10) || PCBREV >= 13 EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; - if (IS_SBUS_PROTOCOL(s_current_protocol[EXTERNAL_MODULE])) + if (IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); // reverse polarity for Sbus if needed #else EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; - if (IS_SBUS_PROTOCOL(s_current_protocol[EXTERNAL_MODULE])) + if (IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); // reverse polarity for Sbus if needed #endif EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 944a64f6c..a4a982f3b 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -330,7 +330,7 @@ void StartSimu(bool tests, const char * sdPath, const char * settingsPath) if (simu_running) return; - s_current_protocol[0] = 255; + moduleSettings[0].protocol = PROTOCOL_CHANNELS_UNINITIALIZED; menuLevel = 0; simu_start_mode = (tests ? 0 : 0x02 /* OPENTX_START_NO_CHECKS */); diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index cac101283..ef1fd28ae 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -276,7 +276,7 @@ extern "C" void PWM_IRQHandler(void) if (reason & PWM_ISR1_CHID3) { // Use the current protocol, don't switch until set_up_pulses - switch (s_current_protocol[EXTERNAL_MODULE]) { + switch (moduleSettings[EXTERNAL_MODULE].protocol) { case PROTOCOL_CHANNELS_PXX: // Alternate periods of 6.5mS and 2.5 mS period = pwmptr->PWM_CH_NUM[3].PWM_CPDR; diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 5153bb9fb..652346fba 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -240,7 +240,7 @@ void extmodulePxx2Start() void extmoduleSendNextFrame() { - if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { + if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) { EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2; EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance @@ -251,7 +251,7 @@ void extmoduleSendNextFrame() EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses; EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { + else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) { #if defined(EXTMODULE_USART) DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(EXTMODULE_USART_DMA_STREAM); @@ -284,8 +284,8 @@ void extmoduleSendNextFrame() EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA #endif } - else if (IS_DSM2_PROTOCOL(s_current_protocol[EXTERNAL_MODULE]) || IS_MULTIMODULE_PROTOCOL(s_current_protocol[EXTERNAL_MODULE]) || IS_SBUS_PROTOCOL(s_current_protocol[EXTERNAL_MODULE])) { - if (IS_SBUS_PROTOCOL(s_current_protocol[EXTERNAL_MODULE])) + else if (IS_DSM2_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) { + if (IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // reverse polarity for Sbus if needed EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - 1) - 4000; // 2mS in advance EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 5058f3b74..b2b7182dc 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -65,7 +65,7 @@ void intmoduleTimerStart(uint32_t period, uint8_t state) void intmoduleSendNextFrame() { - if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PXX) { + if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) { INTMODULE_TIMER->CCR2 = modulePulsesData[INTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; @@ -75,7 +75,7 @@ void intmoduleSendNextFrame() INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } #if defined(TARANIS_INTERNAL_PPM) - else if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { + else if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) { INTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(INTERNAL_MODULE) * 2; INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); INTMODULE_TIMER->CCR2 = *(modulePulsesData[INTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index b618de3d7..e01f7a9d6 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -81,7 +81,7 @@ bool isProtocolSynchronous(uint8_t protocol) void sendSynchronousPulses() { for (uint8_t module = 0; module < NUM_MODULES; module++) { - uint8_t protocol = s_current_protocol[module]; + uint8_t protocol = moduleSettings[module].protocol; if (isProtocolSynchronous(protocol)) { setupPulses(module); } @@ -180,7 +180,7 @@ void scheduleNextMixerCalculation(uint8_t module, uint16_t period_ms) { // Schedule next mixer calculation time, - if (isProtocolSynchronous(s_current_protocol[module])) { + if (isProtocolSynchronous(moduleSettings[module].protocol)) { nextMixerTime[module] += period_ms / RTOS_MS_PER_TICK; if (nextMixerTime[module] < RTOS_GET_TIME()) { // we are late ... let's add some small delay diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index dd3d9246f..ad6762d20 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -400,8 +400,7 @@ void processDSMBindPacket(const uint8_t *packet) setTelemetryValue(TELEM_PROTO_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 4, 0, 0, debugval, UNIT_RAW, 0); /* Finally stop binding as the rx just told us that it is bound */ - if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2 - && moduleFlag[EXTERNAL_MODULE] == MODULE_BIND) { + if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2 && moduleSettings[EXTERNAL_MODULE].mode == MODULE_BIND) { multiBindStatus=MULTI_BIND_FINISHED; } } From f494cb9126a08699bcf3c6fae97998b5e21eb5c5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Feb 2019 15:12:28 +0100 Subject: [PATCH 069/446] Cosmetics --- radio/src/pulses/pulses.h | 77 +++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 43 deletions(-) diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index cae6702b1..21b8a035e 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -32,7 +32,7 @@ #define IS_RANGECHECK_ENABLE() (moduleSettings[0].mode == MODULE_MODE_RANGECHECK) #endif -#if defined(DSM2) && !defined(PCBTARANIS) +#if defined(PCBSKY9X) && defined(DSM2) #define DSM2_BIND_TIMEOUT 255 // 255*11ms extern uint8_t dsm2BindTimer; #endif @@ -66,34 +66,28 @@ #define IS_SBUS_PROTOCOL(protocol) (protocol == PROTOCOL_CHANNELS_SBUS) -#if NUM_MODULES == 2 -#define MODULES_INIT(...) __VA_ARGS__, __VA_ARGS__ -#else -#define MODULES_INIT(...) __VA_ARGS__ -#endif - extern uint8_t s_pulses_paused; enum ModuleSettingsMode { - MODULE_MODE_NORMAL, - MODULE_MODE_RANGECHECK, - MODULE_MODE_BIND, - MODULE_MODE_REGISTER + MODULE_MODE_NORMAL, + MODULE_MODE_RANGECHECK, + MODULE_MODE_BIND, + MODULE_MODE_REGISTER }; PACK(struct ModuleSettings { - uint8_t protocol:5; - uint8_t paused:1; - uint8_t mode:2; - uint16_t failsafeCounter; - }); + uint8_t protocol:5; + uint8_t paused:1; + uint8_t mode:2; + uint16_t failsafeCounter; +}); extern ModuleSettings moduleSettings[NUM_MODULES]; template struct PpmPulsesData { - T pulses[20]; - T * ptr; + T pulses[20]; + T * ptr; }; #if defined(PPM_PIN_SERIAL) @@ -107,11 +101,11 @@ PACK(struct Dsm2SerialPulsesData { #else #define MAX_PULSES_TRANSITIONS 300 PACK(struct Dsm2TimerPulsesData { - pulse_duration_t pulses[MAX_PULSES_TRANSITIONS]; - pulse_duration_t * ptr; - uint16_t rest; - uint8_t index; - }); + pulse_duration_t pulses[MAX_PULSES_TRANSITIONS]; + pulse_duration_t * ptr; + uint16_t rest; + uint8_t index; +}); #endif #define PPM_PERIOD_HALF_US(module) ((g_model.moduleData[module].ppm.frameLength * 5 + 225) * 200) /*half us*/ @@ -126,29 +120,29 @@ PACK(struct Dsm2TimerPulsesData { #define CROSSFIRE_FRAME_MAXLEN 64 PACK(struct CrossfirePulsesData { - uint8_t pulses[CROSSFIRE_FRAME_MAXLEN]; - }); + uint8_t pulses[CROSSFIRE_FRAME_MAXLEN]; +}); union ModulePulsesData { #if defined(INTMODULE_USART) || defined(EXTMODULE_USART) - UartPxxPulses pxx_uart; + UartPxxPulses pxx_uart; #endif #if defined(PPM_PIN_SERIAL) - SerialPxxPulses pxx; + SerialPxxPulses pxx; #elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) - PwmPxxPulses pxx; + PwmPxxPulses pxx; #endif - Pxx2Pulses pxx2; + Pxx2Pulses pxx2; #if defined(PPM_PIN_SERIAL) - Dsm2SerialPulsesData dsm2; + Dsm2SerialPulsesData dsm2; #else - Dsm2TimerPulsesData dsm2; + Dsm2TimerPulsesData dsm2; #endif - PpmPulsesData ppm; - CrossfirePulsesData crossfire; + PpmPulsesData ppm; + CrossfirePulsesData crossfire; } __ALIGNED(4); /* The __ALIGNED keyword is required to align the struct inside the modulePulsesData below, @@ -161,11 +155,10 @@ union ModulePulsesData { extern ModulePulsesData modulePulsesData[NUM_MODULES]; union TrainerPulsesData { - PpmPulsesData ppm; + PpmPulsesData ppm; }; extern TrainerPulsesData trainerPulsesData; -extern const uint16_t CRCTable[]; void setupPulses(uint8_t port); void setupPulsesDSM2(uint8_t port); @@ -177,7 +170,6 @@ void setupPulsesPPMTrainer(); void sendByteDsm2(uint8_t b); void putDsm2Flush(); void putDsm2SerialBit(uint8_t bit); -void sendByteSbus(uint8_t byte); #if defined(HUBSAN) void Hubsan_Init(); @@ -227,15 +219,15 @@ void setCustomFailsafe(uint8_t moduleIndex); #define TR_R9MFLEX_FREQ "868Mhz""915Mhz" enum R9MFCCPowerValues { - R9M_FCC_POWER_100 = 0, - R9M_FCC_POWER_MAX = R9M_FCC_POWER_100 + R9M_FCC_POWER_100 = 0, + R9M_FCC_POWER_MAX = R9M_FCC_POWER_100 }; enum R9MLBTPowerValues { - R9M_LBT_POWER_25 = 0, - R9M_LBT_POWER_25_16, - R9M_LBT_POWER_100, - R9M_LBT_POWER_MAX = R9M_LBT_POWER_100 + R9M_LBT_POWER_25 = 0, + R9M_LBT_POWER_25_16, + R9M_LBT_POWER_100, + R9M_LBT_POWER_MAX = R9M_LBT_POWER_100 }; #define BIND_TELEM_ALLOWED(idx) (!(IS_TELEMETRY_INTERNAL_MODULE() && moduleIdx == EXTERNAL_MODULE) && (!isModuleR9M_LBT(idx) || g_model.moduleData[idx].pxx.power < R9M_LBT_POWER_100)) @@ -272,5 +264,4 @@ enum R9MLBTPowerValues { #define BIND_CH9TO16_ALLOWED(idx) (!isModuleR9M_LBT(idx) || g_model.moduleData[idx].pxx.power != R9M_LBT_POWER_25) #endif - #endif // _PULSES_H_ From 48c9bae5cd3882dc47da9652789786fb16e0089b Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 5 Feb 2019 15:35:38 +0100 Subject: [PATCH 070/446] More internal module receivers menu logic --- radio/src/gui/128x64/model_setup.cpp | 31 ++++++++++++++++++++++++---- radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 14 files changed, 40 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index ee8ba0920..7ed6c0c8c 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -291,12 +291,12 @@ void menuModelSetup(event_t event) IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Number IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Range IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Telemetry - IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Bind/Delete + IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)1), // Receiver Bind/Delete IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Number IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Range IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Telemetry - IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Bind/Delete - INTERNAL_MODULE_ADD_RECEIVER_ROW, + IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)1), // Receiver Bind/Delete + IF_INTERNAL_MODULE_ON(INTERNAL_MODULE_ADD_RECEIVER_ROW), LABEL(ExternalModule), EXTERNAL_MODULE_MODE_ROWS, MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) @@ -1064,20 +1064,43 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_RANGE: { lcdDrawTextAlignedLeft(y, TR_CHANNELRANGE); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "Ch 1 - 8",0); } break; case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_TELEM: case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_TELEM: { - lcdDrawTextAlignedLeft(y, INDENT "Telem"); + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); + g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].telemetry = editCheckBox(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].telemetry, MODEL_SETUP_2ND_COLUMN, y, INDENT "Telemetry", attr, event); } break; case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_BIND: case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_BIND: { + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); + lcdDrawTextAlignedLeft(y, INDENT "Receiver"); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, menuHorizontalPosition==0 ? attr : 0); + lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS, y, STR_DEL_BUTTON, menuHorizontalPosition==1 ? attr : 0); + if (attr && menuHorizontalPosition == 0) { + if (s_editMode > 0) + moduleFlag[INTERNAL_MODULE] = MODULE_BIND; + else + moduleFlag[INTERNAL_MODULE] = MODULE_NORMAL_MODE; + } + if (attr && menuHorizontalPosition == 1 && s_editMode > 0) { + if(receiverIdx == 0) { + memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0], &g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1], sizeof(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers)); + memclear(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1], sizeof(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers)); + s_editMode = 0; + } + else { + memclear(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx], sizeof(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers)); + s_editMode = 0; + } + } } break; #endif diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 8a71c26d4..9c812a8fc 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -701,6 +701,7 @@ const char STR_BLCOLOR[] = TR_BLCOLOR; #if defined(PCBTARANIS) || defined(DSM2) const char STR_MODULE_RANGE[] = TR_MODULE_RANGE; +const char STR_DEL_BUTTON[] = TR_DEL_BUTTON; #endif #if defined(BLUETOOTH) diff --git a/radio/src/translations.h b/radio/src/translations.h index b796717d9..9568ea578 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -963,6 +963,7 @@ extern const char STR_BLCOLOR[]; #if defined(PCBTARANIS) || defined(DSM2) extern const char STR_MODULE_RANGE[]; +extern const char STR_DEL_BUTTON[]; #endif diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index ef89556b2..36e175d62 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -955,6 +955,7 @@ #define TR_BYTES "[B]" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) +#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") #define TR_SET BUTTON("Volby") #define TR_TRAINER "Trenér" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index cacf86882..32b6de2da 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -960,6 +960,7 @@ #define TR_BYTES "Bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd","Bind")) //9XR-Pro #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) //9XR-Pro +#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") #define TR_SET BUTTON("Set") #define TR_TRAINER "DSC Buchse PPM In/Out" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index ebe496299..6edf4de4f 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -958,6 +958,7 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) +#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") #define TR_SET BUTTON("Set") #define TR_TRAINER "Trainer" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 598e55106..d76a696ca 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -966,6 +966,7 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Enlace]" #define TR_MODULE_RANGE "[Limites]" +#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_SET "[Ajuste]" #define TR_TRAINER "Aprendiz" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index fc6212810..5f296d2eb 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -958,6 +958,7 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Bind]" #define TR_MODULE_RANGE "[Range]" +#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_SET "[Set]" #define TR_TRAINER "Trainer" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 97da8d7a0..f33a27a41 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -970,6 +970,7 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) #define TR_MODULE_RANGE BUTTON(TR("Prt", "Port.")) +#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("RAZ") #define TR_SET BUTTON("Déf") #define TR_TRAINER "Ecolage" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index f37fcffee..a424f757b 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -960,6 +960,7 @@ #define TR_BYTES "Bytes" #define TR_MODULE_BIND "[Bind]" #define TR_MODULE_RANGE "[Range]" +#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_SET "[Set]" #define TR_TRAINER TR("Trainer","Maestro/Allievo") diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 289853bf9..7133edf11 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -961,6 +961,7 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND TR("[Bnd]", "[Bind]") #define TR_MODULE_RANGE TR("[Rng]", "[Range]") +#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_SET "[Set]" #define TR_TRAINER "Trainer Poort" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index fc023768c..08476dc1e 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -961,6 +961,7 @@ #define TR_BYTES "bajty" #define TR_MODULE_BIND TR("[BND]","[Bind]") #define TR_MODULE_RANGE TR("[Zas]","Zasięg") +#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_SET "[Set]" #define TR_TRAINER "Port Trenera" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 9479748d6..9e5516969 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -965,6 +965,7 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Bind]" #define TR_MODULE_RANGE "[Range]" +#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_SET "[Set]" #define TR_TRAINER "Trainer" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 2359af0b9..a96f79b3b 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -974,6 +974,7 @@ #define TR_BYTES "byte" #define TR_MODULE_BIND TR("[Bnd]", "[Bind]") #define TR_MODULE_RANGE TR("[Tst]", "[Testa]") +#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Nollställ]" #define TR_SET "[Spara]" #define TR_TRAINER "Trainer" From b4485ec7305fbdf86b5ab4cd09f18de6a3e048a4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 5 Feb 2019 15:40:33 +0100 Subject: [PATCH 071/446] Compile fixes --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 7ed6c0c8c..7346060c3 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1086,9 +1086,9 @@ void menuModelSetup(event_t event) lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS, y, STR_DEL_BUTTON, menuHorizontalPosition==1 ? attr : 0); if (attr && menuHorizontalPosition == 0) { if (s_editMode > 0) - moduleFlag[INTERNAL_MODULE] = MODULE_BIND; + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_BIND; else - moduleFlag[INTERNAL_MODULE] = MODULE_NORMAL_MODE; + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; } if (attr && menuHorizontalPosition == 1 && s_editMode > 0) { if(receiverIdx == 0) { From 103eba6e63a4eb7d198714ba80158caabfe775f0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Feb 2019 17:08:09 +0100 Subject: [PATCH 072/446] REGISTER should be ready for tests --- radio/src/fifo.h | 20 +++++++-- radio/src/pulses/pulses.h | 6 +-- radio/src/pulses/pxx1.cpp | 10 ++--- radio/src/pulses/pxx2.cpp | 18 ++++++-- radio/src/pulses/pxx2.h | 40 +++++++++++++++++ .../arm/stm32/intmodule_serial_driver.cpp | 44 ++++++++++++------- radio/src/targets/taranis/hal.h | 22 +++++----- .../src/targets/taranis/telemetry_driver.cpp | 10 ++--- radio/src/telemetry/telemetry.cpp | 42 ++++++++++++++++-- 9 files changed, 161 insertions(+), 51 deletions(-) diff --git a/radio/src/fifo.h b/radio/src/fifo.h index e24b9ba80..a61d31839 100644 --- a/radio/src/fifo.h +++ b/radio/src/fifo.h @@ -21,6 +21,8 @@ #ifndef _FIFO_H_ #define _FIFO_H_ +#include + template class Fifo { @@ -40,13 +42,18 @@ class Fifo void push(T element) { - uint32_t next = (widx+1) & (N-1); + uint32_t next = nextIndex(widx); if (next != ridx) { fifo[widx] = element; widx = next; } } + void skip() + { + ridx = nextIndex(ridx); + } + bool pop(T & element) { if (isEmpty()) { @@ -54,7 +61,7 @@ class Fifo } else { element = fifo[ridx]; - ridx = (ridx+1) & (N-1); + ridx = nextIndex(ridx); return true; } } @@ -66,7 +73,7 @@ class Fifo bool isFull() { - uint32_t next = (widx+1) & (N-1); + uint32_t next = nextIndex(widx); return (next == ridx); } @@ -77,7 +84,7 @@ class Fifo uint32_t size() const { - return (N + widx - ridx) & (N-1); + return (N + widx - ridx) & (N - 1); } uint32_t hasSpace(uint32_t n) const @@ -100,6 +107,11 @@ class Fifo T fifo[N]; volatile uint32_t widx; volatile uint32_t ridx; + + inline uint32_t nextIndex(uint32_t idx) + { + return (idx + 1) & (N - 1); + } }; #endif // _FIFO_H_ diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 21b8a035e..70fe6af50 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -80,7 +80,7 @@ PACK(struct ModuleSettings { uint8_t protocol:5; uint8_t paused:1; uint8_t mode:2; - uint16_t failsafeCounter; + uint16_t counter; }); extern ModuleSettings moduleSettings[NUM_MODULES]; @@ -195,12 +195,12 @@ inline bool pulsesStarted() { return moduleSettings[0].protocol != PROTOCOL_CHAN inline void pausePulses() { s_pulses_paused = true; } inline void resumePulses() { s_pulses_paused = false; } -#define SEND_FAILSAFE_NOW(idx) moduleSettings[idx].failsafeCounter = 1 +#define SEND_FAILSAFE_NOW(idx) moduleSettings[idx].counter = 1 inline void SEND_FAILSAFE_1S() { for (int i=0; i::addFlag1(uint8_t module) } else { bool failsafeNeeded = g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER; - if (moduleSettings[module].failsafeCounter-- == 0) { - // failsafeCounter is also used for knowing if the frame is odd / even - moduleSettings[module].failsafeCounter = 1000; + if (moduleSettings[module].counter-- == 0) { + // counter is also used for knowing if the frame is odd / even + moduleSettings[module].counter = 1000; if (failsafeNeeded) { flag1 |= PXX_SEND_FAILSAFE; } } - if (failsafeNeeded && moduleSettings[module].failsafeCounter == 0 && g_model.moduleData[module].channelsCount > 0) { + if (failsafeNeeded && moduleSettings[module].counter == 0 && g_model.moduleData[module].channelsCount > 0) { flag1 |= PXX_SEND_FAILSAFE; } } @@ -120,7 +120,7 @@ void Pxx1Pulses::setupFrame(uint8_t module) } #else uint8_t sendUpperChannels = 0; - if (moduleSettings[module].failsafeCounter & 0x01) { + if (moduleSettings[module].counter & 0x01) { sendUpperChannels = g_model.moduleData[module].channelsCount; } add8ChannelsFrame(module, sendUpperChannels); diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index c468851e9..0239e5503 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -25,8 +25,8 @@ uint8_t Pxx2Pulses::addFlag0(uint8_t module) { uint8_t flag0 = g_model.header.modelId[module] & 0x3F; if (g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER) { - if (moduleSettings[module].failsafeCounter-- == 0) { - moduleSettings[module].failsafeCounter = 1000; + if (moduleSettings[module].counter-- == 0) { + moduleSettings[module].counter = 1000; flag0 |= PXX2_FLAG0_FAILSAFE; } } @@ -57,8 +57,20 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module) void Pxx2Pulses::setupRegisterFrame(uint8_t module) { + unsigned counter = moduleSettings[module].counter; + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); - Pxx2Transport::addByte(0); + + if (counter == REGISTER_COUNTER_ID_RECEIVED) { + Pxx2Transport::addByte(1); + for (uint8_t i=0; i<4; i++) { + Pxx2Transport::addByte(g_model.modelRegistrationID[i]); + } + } + else { + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); + Pxx2Transport::addByte(0); + } } void Pxx2Pulses::setupBindFrame(uint8_t module) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index dc5b341db..84241c779 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -21,10 +21,13 @@ #ifndef _PULSES_PXX2_H_ #define _PULSES_PXX2_H_ +#include "fifo.h" #include "./pxx.h" #define PXX2_TYPE_C_MODULE 0x01 #define PXX2_TYPE_ID_REGISTER 0x01 + #define REGISTER_COUNTER_ID_RECEIVED 1001 + #define REGISTER_COUNTER_PASSWORD_RECEIVED 1002 #define PXX2_TYPE_ID_BIND 0x02 #define PXX2_TYPE_ID_CHANNELS 0x03 #define PXX2_TYPE_ID_SPORT 0xFE @@ -35,6 +38,43 @@ #define PXX2_FLAG0_FAILSAFE (1 << 6) +class ModuleFifo : public Fifo { + public: + bool getFrame(uint8_t * frame) + { + while (1) { + if (isEmpty()) { + return false; + } + else if (fifo[ridx] != 0xFE) { + skip(); + } + else { + break; + } + } + + uint32_t next = nextIndex(ridx); + uint8_t len = fifo[next]; + if (size() < unsigned(len + 4 /* 2 bytes header + 2 bytes CRC */)) { + return false; + } + + for (uint32_t i=0; iSR; + + while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { + uint8_t data = INTMODULE_USART->DR; + if (status & USART_FLAG_ERRORS) { + intmoduleErrors++; + } + else { + intmoduleFifo.push(data); + } + status = INTMODULE_USART->SR; } } @@ -110,3 +119,4 @@ void intmoduleSendNextFrame() USART_DMACmd(INTMODULE_USART, USART_DMAReq_Tx, ENABLE); } } + diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 2aabf23f1..d203c168f 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -599,24 +599,24 @@ #define INTMODULE_PWR_GPIO GPIOD #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_9 // PD.09 #endif - #define INTMODULE_TX_GPIO GPIOB + #define INTMODULE_GPIO GPIOB #define INTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PB.06 - #define INTMODULE_RX_GPIO GPIOB #define INTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PB.07 - #define INTMODULE_TX_GPIO_PinSource GPIO_PinSource6 - #define INTMODULE_RX_GPIO_PinSource GPIO_PinSource7 + #define INTMODULE_GPIO_PinSource_TX GPIO_PinSource6 + #define INTMODULE_GPIO_PinSource_RX GPIO_PinSource7 #define INTMODULE_USART USART1 - #define INTMODULE_TX_GPIO_AF GPIO_AF_USART1 + #define INTMODULE_GPIO_AF GPIO_AF_USART1 + #define INTMODULE_USART_IRQHandler USART1_IRQHandler #define INTMODULE_USART_IRQn USART1_IRQn #define INTMODULE_DMA_STREAM DMA2_Stream7 - #define INTMODULE_DMA_STREAM_IRQ DMA2_Stream7_IRQn - #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler + #define INTMODULE_DMA_STREAM_IRQ DMA2_Stream7_IRQn + #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 #define INTMODULE_DMA_CHANNEL DMA_Channel_4 - #define INTMODULE_TIMER TIM3 - #define INTMODULE_TIMER_IRQn TIM3_IRQn - #define INTMODULE_TIMER_IRQHandler TIM3_IRQHandler - #define INTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) + // #define INTMODULE_TIMER TIM3 + // #define INTMODULE_TIMER_IRQn TIM3_IRQn + // #define INTMODULE_TIMER_IRQHandler TIM3_IRQHandler + // #define INTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) #elif defined(PCBX9E) || defined(PCBX9DP) || defined(PCBX7) #define INTMODULE_PULSES #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index c805f56e8..fb854c482 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -37,12 +37,10 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); - USART_InitTypeDef USART_InitStructure; - GPIO_InitTypeDef GPIO_InitStructure; - - GPIO_PinAFConfig(TELEMETRY_GPIO, TELEMETRY_GPIO_PinSource_RX, TELEMETRY_GPIO_AF); GPIO_PinAFConfig(TELEMETRY_GPIO, TELEMETRY_GPIO_PinSource_TX, TELEMETRY_GPIO_AF); + GPIO_PinAFConfig(TELEMETRY_GPIO, TELEMETRY_GPIO_PinSource_RX, TELEMETRY_GPIO_AF); + GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = TELEMETRY_TX_GPIO_PIN | TELEMETRY_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; @@ -56,6 +54,8 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) GPIO_Init(TELEMETRY_DIR_GPIO, &GPIO_InitStructure); TELEMETRY_DIR_INPUT(); + USART_DeInit(TELEMETRY_USART); + USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = baudrate; if (mode & TELEMETRY_SERIAL_8E2) { USART_InitStructure.USART_WordLength = USART_WordLength_9b; @@ -70,8 +70,8 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(TELEMETRY_USART, &USART_InitStructure); - USART_Cmd(TELEMETRY_USART, ENABLE); + USART_ITConfig(TELEMETRY_USART, USART_IT_RXNE, ENABLE); NVIC_SetPriority(TELEMETRY_USART_IRQn, 6); NVIC_EnableIRQ(TELEMETRY_USART_IRQn); diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 8fabe7692..377be5f98 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -71,6 +71,35 @@ void processTelemetryData(uint8_t data) processFrskyTelemetryData(data); } +void processRegisterFrame(uint8_t module, uint8_t * frame) +{ + if (frame[3] == 0x00) { + // RX_ID follows, we discard it for now + moduleSettings[module].counter = REGISTER_COUNTER_ID_RECEIVED; + } +} + +void processRadioFrame(uint8_t module, uint8_t * frame) +{ + switch (frame[2]) { + case PXX2_TYPE_ID_REGISTER: + processRegisterFrame(module, frame); + break; + } +} + +void processModuleFrame(uint8_t module, uint8_t * frame) +{ + switch (frame[1]) { + case PXX2_TYPE_C_MODULE: + processRadioFrame(module, frame); + break; + + default: + break; + } +} + void telemetryWakeup() { uint8_t requiredTelemetryProtocol = modelTelemetryProtocol(); @@ -82,9 +111,16 @@ void telemetryWakeup() telemetryInit(requiredTelemetryProtocol); } #else - if (telemetryProtocol != requiredTelemetryProtocol) { - telemetryInit(requiredTelemetryProtocol); - } + if (telemetryProtocol != requiredTelemetryProtocol) { + telemetryInit(requiredTelemetryProtocol); + } +#endif + +#if defined(INTMODULE_USART) + uint8_t frame[32]; + if (intmoduleFifo.getFrame(frame)) { + processModuleFrame(INTERNAL_MODULE, frame); + } #endif #if defined(STM32) From 60384782a5902e487cbe5c9e016c48f48c50a4ab Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Feb 2019 17:15:22 +0100 Subject: [PATCH 073/446] REGISTER fixes --- radio/src/pulses/pxx2.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 0239e5503..21e83f92c 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -68,7 +68,6 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) } } else { - addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); Pxx2Transport::addByte(0); } } @@ -84,7 +83,7 @@ void Pxx2Pulses::setupFrame(uint8_t module) uint8_t mode = moduleSettings[module].mode; - if (mode == MODULE_MODE_REGISTER) + if (mode == MODULE_MODE_BIND) setupRegisterFrame(module); else if (mode == MODULE_MODE_BIND) setupBindFrame(module); From 480eb90001defab535f5687ff70c80ff2fe38ec0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Feb 2019 18:29:58 +0100 Subject: [PATCH 074/446] CRC fix --- radio/src/pulses/pxx.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 3ce8ea2db..c49b7e254 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -54,12 +54,15 @@ class PxxCrcMixin { protected: void initCrc() { - crc = 0; + // TODO add a Pxx2CrcMixin ... + crc = 0xFFFF; } void addToCrc(uint8_t byte) { - crc = (crc << 8) ^ (CRCTable[((crc >> 8) ^ byte) & 0xFF]); + // TODO add a Pxx2CrcMixin ... + // crc = (crc << 8) ^ (CRCTable[((crc >> 8) ^ byte) & 0xFF]); + crc -= byte; } uint16_t crc; From 64693fc92ebc2bbd3b2d07a02983e120767baf1c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Feb 2019 18:35:00 +0100 Subject: [PATCH 075/446] Next fix --- radio/src/pulses/pxx2.cpp | 2 +- radio/src/pulses/pxx2.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 21e83f92c..6b716df57 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -62,7 +62,7 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); if (counter == REGISTER_COUNTER_ID_RECEIVED) { - Pxx2Transport::addByte(1); + Pxx2Transport::addByte(0x01); for (uint8_t i=0; i<4; i++) { Pxx2Transport::addByte(g_model.modelRegistrationID[i]); } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 84241c779..ec0953014 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -46,7 +46,7 @@ class ModuleFifo : public Fifo { if (isEmpty()) { return false; } - else if (fifo[ridx] != 0xFE) { + else if (fifo[ridx] != 0x7E) { skip(); } else { From f0eacf062e440858200d5abf083ec8df182cd112 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Feb 2019 18:56:19 +0100 Subject: [PATCH 076/446] Next fix --- radio/src/pulses/pxx2.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index ec0953014..06a996554 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -60,15 +60,13 @@ class ModuleFifo : public Fifo { return false; } - for (uint32_t i=0; i Date: Tue, 5 Feb 2019 19:12:09 +0100 Subject: [PATCH 077/446] Get ready for bind test --- radio/src/pulses/pxx2.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 6b716df57..1e869e3d3 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -63,7 +63,7 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) if (counter == REGISTER_COUNTER_ID_RECEIVED) { Pxx2Transport::addByte(0x01); - for (uint8_t i=0; i<4; i++) { + for (uint8_t i=0; i Date: Wed, 6 Feb 2019 08:41:54 +0100 Subject: [PATCH 078/446] Initialize channel mappings --- radio/src/gui/128x64/model_setup.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 7346060c3..07714f02e 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1042,9 +1042,11 @@ void menuModelSetup(event_t event) if (attr && s_editMode>0) { if(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled) { g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1].enabled = 0x01; + memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1].channelMapping, "\x01\x23\x45\x67\x89\xAB\xCD\xEF", 8); //default map 1-1 16-16 } else { g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled = 0x01; + memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].channelMapping, "\x01\x23\x45\x67\x89\xAB\xCD\xEF", 8); //default map 1-1 16-16 } s_editMode = 0; } From ed1d01e33ae4938cf5959652ff0062f332bb5ba5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Feb 2019 09:13:31 +0100 Subject: [PATCH 079/446] 1 byte flash saved :) --- radio/src/gui/128x64/model_setup.cpp | 6 +++--- radio/src/pulses/pxx2.h | 2 ++ radio/src/telemetry/telemetry.cpp | 6 ++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 07714f02e..4cb5cc698 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1040,13 +1040,13 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, "Receiver"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "[Add]", attr); if (attr && s_editMode>0) { - if(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled) { + if (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled) { g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1].enabled = 0x01; - memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1].channelMapping, "\x01\x23\x45\x67\x89\xAB\xCD\xEF", 8); //default map 1-1 16-16 + memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); } else { g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled = 0x01; - memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].channelMapping, "\x01\x23\x45\x67\x89\xAB\xCD\xEF", 8); //default map 1-1 16-16 + memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); } s_editMode = 0; } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 06a996554..077bac050 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -38,6 +38,8 @@ #define PXX2_FLAG0_FAILSAFE (1 << 6) +const uint8_t DEFAULT_CHANNEL_MAPPING[] = {0x12, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; + class ModuleFifo : public Fifo { public: bool getFrame(uint8_t * frame) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 377be5f98..04bb108e8 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -77,6 +77,12 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) // RX_ID follows, we discard it for now moduleSettings[module].counter = REGISTER_COUNTER_ID_RECEIVED; } + else if (frame[3] == 0x01) { + // PASSWORD follows, we check it is good + if (memcmp(&frame[4], g_model.modelRegistrationID, LEN_REGISTRATION_ID) == 0) { + moduleSettings[module].counter = REGISTER_COUNTER_PASSWORD_RECEIVED; + } + } } void processRadioFrame(uint8_t module, uint8_t * frame) From 4a586215e754ac895534a841d77203c6ee4ed43c Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 6 Feb 2019 09:31:59 +0100 Subject: [PATCH 080/446] For register/bind POC --- radio/src/gui/128x64/model_setup.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 4cb5cc698..0b60c85b4 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1087,8 +1087,12 @@ void menuModelSetup(event_t event) lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, menuHorizontalPosition==0 ? attr : 0); lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS, y, STR_DEL_BUTTON, menuHorizontalPosition==1 ? attr : 0); if (attr && menuHorizontalPosition == 0) { - if (s_editMode > 0) - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_BIND; + if (s_editMode > 0) { + if (BLINK_ON_PHASE) + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_BIND; + else + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; + } else moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; } From 685911efab486b2551cd14a619d8fd85465614ff Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 6 Feb 2019 10:42:26 +0100 Subject: [PATCH 081/446] For channel mapping testing --- radio/src/gui/128x64/model_setup.cpp | 17 +++++++++++++++-- radio/src/pulses/pxx2.h | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 0b60c85b4..25651de8a 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1065,8 +1065,21 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_RANGE: case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_RANGE: { - lcdDrawTextAlignedLeft(y, TR_CHANNELRANGE); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "Ch 1 - 8",0); + //TODO have a proper channel assignement screen, section bellow is just for tests + uint8_t useUpperChannels; + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); + + if (memcmp(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)) == 0) + useUpperChannels = 0; + else + useUpperChannels = 1; + + useUpperChannels = editCheckBox(useUpperChannels, MODEL_SETUP_2ND_COLUMN, y, INDENT "Use CH9-16", attr, event); + + if (useUpperChannels) + memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].channelMapping, CH9TO16_CHANNEL_MAPPING, sizeof(uint64_t)); + else + memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); } break; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 077bac050..fc5ac6ddd 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -39,6 +39,7 @@ #define PXX2_FLAG0_FAILSAFE (1 << 6) const uint8_t DEFAULT_CHANNEL_MAPPING[] = {0x12, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; +const uint8_t CH9TO16_CHANNEL_MAPPING[] = {0x89, 0xAB, 0xCD, 0xEF, 0x12, 0x23, 0x45, 0x67}; class ModuleFifo : public Fifo { public: From aaa4206a1c41ec9be225c4b03f497ca6cd9be0fe Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Feb 2019 10:43:14 +0100 Subject: [PATCH 082/446] BIND placeholder added to reuseable buffer --- radio/src/gui/common/stdlcd/popups.cpp | 2 -- radio/src/opentx.h | 2 ++ radio/src/pulses/pxx2.cpp | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index abd7890da..448a7c753 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -27,7 +27,6 @@ void (*popupFunc)(event_t event) = NULL; const char * popupMenuItems[POPUP_MENU_MAX_LINES]; uint8_t s_menu_item = 0; uint16_t popupMenuNoItems = 0; -uint8_t popupMenuFlags = 0; uint16_t popupMenuOffset = 0; void (*popupMenuHandler)(const char * result); @@ -116,7 +115,6 @@ const char * runPopupMenu(event_t event) case EVT_KEY_BREAK(KEY_EXIT): popupMenuNoItems = 0; s_menu_item = 0; - popupMenuFlags = 0; popupMenuOffset = 0; break; } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index e2d79bc14..5e6b68a0b 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1116,6 +1116,8 @@ union ReusableBuffer struct { char msg[64]; uint8_t r9mPower; + char pxx2_candidate_receivers[5][8]; + uint8_t pxx2_candidate_receivers_count; } modelsetup; // 103 bytes diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 1e869e3d3..fd672d567 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -75,6 +75,12 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) void Pxx2Pulses::setupBindFrame(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_BIND); + + Pxx2Transport::addByte(0x00); + for (uint8_t i=0; i Date: Wed, 6 Feb 2019 11:40:21 +0100 Subject: [PATCH 083/446] BIND shared array filled with incoming models --- radio/src/dataconstants.h | 5 +++-- radio/src/datastructs.h | 6 +++--- radio/src/opentx.cpp | 2 +- radio/src/pulses/pxx2.cpp | 5 ++--- radio/src/telemetry/telemetry.cpp | 24 +++++++++++++++++++++++- 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 9b146fd8b..cc8b07933 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -787,7 +787,8 @@ enum BluetoothModes { }; // PXX2 constants -#define LEN_REGISTRATION_ID 4 -#define LEN_RX_ID 4 +#define PXX2_LEN_REGISTRATION_ID 4 +#define PXX2_LEN_RX_ID 4 +#define PXX2_MAX_RECEIVERS_PER_MODULE 5 #endif // _DATACONSTANTS_H_ diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index a81d3cf2c..003a9c552 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -419,7 +419,7 @@ PACK(struct ReceiverData { uint8_t telemetry:1; uint8_t spare:6; uint64_t channelMapping; // each receiver output (16) can be assigned to one of the 16 channels - uint8_t rxID[LEN_RX_ID]; + uint8_t rxID[PXX2_LEN_RX_ID]; }); /* @@ -632,7 +632,7 @@ PACK(struct ModelData { CUSTOM_SCREENS_DATA - uint8_t modelRegistrationID[LEN_REGISTRATION_ID]; + uint8_t modelRegistrationID[PXX2_LEN_REGISTRATION_ID]; }); /* @@ -798,7 +798,7 @@ PACK(struct RadioData { THEME_DATA - uint8_t ownerRegistrationID[LEN_REGISTRATION_ID]; + uint8_t ownerRegistrationID[PXX2_LEN_REGISTRATION_ID]; }); #undef SWITCHES_WARNING_DATA diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index faf88d879..9a116ab75 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -449,7 +449,7 @@ void modelDefault(uint8_t id) applyDefaultTemplate(); - memcpy(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, LEN_REGISTRATION_ID); + memcpy(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID); #if defined(LUA) && defined(PCBTARANIS) //Horus uses menuModelWizard() for wizard if (isFileAvailable(WIZARD_PATH "/" WIZARD_NAME)) { diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index fd672d567..a46c85051 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -63,7 +63,7 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) if (counter == REGISTER_COUNTER_ID_RECEIVED) { Pxx2Transport::addByte(0x01); - for (uint8_t i=0; i #include "opentx.h" uint8_t telemetryStreaming = 0; @@ -79,18 +80,39 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) } else if (frame[3] == 0x01) { // PASSWORD follows, we check it is good - if (memcmp(&frame[4], g_model.modelRegistrationID, LEN_REGISTRATION_ID) == 0) { + if (memcmp(&frame[4], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { moduleSettings[module].counter = REGISTER_COUNTER_PASSWORD_RECEIVED; } } } +void processBindFrame(uint8_t module, uint8_t * frame) +{ + if (frame[3] == 0x00) { + bool found = false; + for (uint8_t i=0; i Date: Wed, 6 Feb 2019 11:52:00 +0100 Subject: [PATCH 084/446] For registratoin ID testing --- radio/src/gui/128x64/lcd.cpp | 13 +++++++++++++ radio/src/gui/128x64/lcd.h | 3 ++- radio/src/gui/128x64/model_setup.cpp | 19 ++++++++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index fa1cd058c..a9be302f3 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -428,6 +428,19 @@ void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags flags) } } +void lcdDrawHexChar(coord_t x, coord_t y, uint8_t val, LcdFlags flags) +{ + x += FWNUM*2; + for (int i=0; i<2; i++) { + x -= FWNUM; + char c = val & 0xf; + c = c>9 ? c+'A'-10 : c+'0'; + lcdDrawChar(x, y, c, flags|(c>='A' ? CONDENSED : 0)); + val >>= 4; + } +} + + void lcdDraw8bitsNumber(coord_t x, coord_t y, int8_t val) { lcdDrawNumber(x, y, val); diff --git a/radio/src/gui/128x64/lcd.h b/radio/src/gui/128x64/lcd.h index c1a562130..3eb08e861 100644 --- a/radio/src/gui/128x64/lcd.h +++ b/radio/src/gui/128x64/lcd.h @@ -124,7 +124,8 @@ void lcdDrawTextAlignedLeft(coord_t y, const char * s); #define lcdDrawTextAlignedCenter(y, s) lcdDrawText((LCD_W-sizeof(TR_##s)*FW+FW+1)/2, y, STR_##s) - void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0); +void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0); +void lcdDrawHexChar(coord_t x, coord_t y, uint8_t val, LcdFlags flags=0); void lcdDrawNumber(coord_t x, coord_t y, lcdint_t val, LcdFlags mode, uint8_t len); void lcdDrawNumber(coord_t x, coord_t y, lcdint_t val, LcdFlags mode=0); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 25651de8a..090977c48 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -70,6 +70,7 @@ enum MenuModelSetupItems { #endif ITEM_MODEL_BEEP_CENTER, ITEM_MODEL_USE_GLOBAL_FUNCTIONS, + ITEM_MODEL_REGISTRATION_ID, #if defined(PCBTARANIS) ITEM_MODEL_INTERNAL_MODULE_LABEL, ITEM_MODEL_INTERNAL_MODULE_MODE, @@ -282,6 +283,7 @@ void menuModelSetup(event_t event) POT_WARN_ITEMS(), // Pot warning NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_ROTARY_ENCODERS - 1, // Center beeps 0, // Global functions + 4, // Registration ID LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, IF_INTERNAL_MODULE_ON((uint8_t)0), // Model Number @@ -734,7 +736,7 @@ void menuModelSetup(event_t event) if (attr) { g_model.moduleData[INTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_XJT, EE_MODEL, isInternalModuleAvailable); if (checkIncDec_Ret) { - /* ToDo : what needs toi happen on module enable/disable */ + /* ToDo : what needs to happen on module enable/disable */ } } break; @@ -1009,6 +1011,21 @@ void menuModelSetup(event_t event) #endif #if defined(PCBTARANIS) + case ITEM_MODEL_REGISTRATION_ID: + { + lcdDrawTextAlignedLeft(y, "Regis. ID"); + for(uint8_t pos=0; pos Date: Wed, 6 Feb 2019 12:08:38 +0100 Subject: [PATCH 085/446] BIND should be OK now --- radio/src/opentx.h | 7 +++++-- radio/src/pulses/pxx2.cpp | 18 ++++++++++++------ radio/src/pulses/pxx2.h | 19 +++++++++++++++---- radio/src/telemetry/telemetry.cpp | 22 +++++++++++++++------- 4 files changed, 47 insertions(+), 19 deletions(-) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 5e6b68a0b..c1b913480 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1096,6 +1096,7 @@ void opentxResume(); #else #define SD_SCREEN_FILE_LENGTH 64 #endif + union ReusableBuffer { // ARM 334 bytes @@ -1116,8 +1117,10 @@ union ReusableBuffer struct { char msg[64]; uint8_t r9mPower; - char pxx2_candidate_receivers[5][8]; - uint8_t pxx2_candidate_receivers_count; + uint8_t pxx2_register_or_bind_step; + char pxx2_bind_candidate_receivers[5][8]; + uint8_t pxx2_bind_candidate_receivers_count; + uint8_t pxx2_bind_receiver_index; } modelsetup; // 103 bytes diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index a46c85051..f313ccad8 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -57,11 +57,9 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module) void Pxx2Pulses::setupRegisterFrame(uint8_t module) { - unsigned counter = moduleSettings[module].counter; - addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); - if (counter == REGISTER_COUNTER_ID_RECEIVED) { + if (reusableBuffer.modelsetup.pxx2_register_or_bind_step == REGISTER_COUNTER_ID_RECEIVED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i { public: diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 2f60affff..acff000b1 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -76,12 +76,13 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) { if (frame[3] == 0x00) { // RX_ID follows, we discard it for now - moduleSettings[module].counter = REGISTER_COUNTER_ID_RECEIVED; + reusableBuffer.modelsetup.pxx2_register_or_bind_step = REGISTER_COUNTER_ID_RECEIVED; } else if (frame[3] == 0x01) { // PASSWORD follows, we check it is good if (memcmp(&frame[4], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { - moduleSettings[module].counter = REGISTER_COUNTER_PASSWORD_RECEIVED; + reusableBuffer.modelsetup.pxx2_register_or_bind_step = REGISTER_OK; + moduleSettings[module].mode = MODULE_MODE_NORMAL; } } } @@ -90,15 +91,22 @@ void processBindFrame(uint8_t module, uint8_t * frame) { if (frame[3] == 0x00) { bool found = false; - for (uint8_t i=0; i Date: Wed, 6 Feb 2019 12:24:12 +0100 Subject: [PATCH 086/446] Compilation fix --- radio/src/gui/128x64/model_setup.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 090977c48..a8be29e22 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1013,9 +1013,8 @@ void menuModelSetup(event_t event) #if defined(PCBTARANIS) case ITEM_MODEL_REGISTRATION_ID: { - lcdDrawTextAlignedLeft(y, "Regis. ID"); - for(uint8_t pos=0; pos0) { @@ -1049,11 +1045,9 @@ void menuModelSetup(event_t event) if (attr && s_editMode==0) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; } - } break; case ITEM_MODEL_INTERNAL_MODULE_ADD_RECEIVER: - { lcdDrawTextAlignedLeft(y, "Receiver"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "[Add]", attr); if (attr && s_editMode>0) { @@ -1067,8 +1061,7 @@ void menuModelSetup(event_t event) } s_editMode = 0; } - } - break; + break; case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_NUMBER: case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_NUMBER: @@ -1082,7 +1075,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_RANGE: case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_RANGE: { - //TODO have a proper channel assignement screen, section bellow is just for tests + // TODO have a proper channel assignement screen, section bellow is just for tests uint8_t useUpperChannels; uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); From de77fa07e5ba89ae0abf70d9007464a28140a85a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Feb 2019 12:28:52 +0100 Subject: [PATCH 087/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index a8be29e22..a9253503c 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -283,7 +283,7 @@ void menuModelSetup(event_t event) POT_WARN_ITEMS(), // Pot warning NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_ROTARY_ENCODERS - 1, // Center beeps 0, // Global functions - 4, // Registration ID + PXX2_LEN_REGISTRATION_ID - 1, // Registration ID LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, IF_INTERNAL_MODULE_ON((uint8_t)0), // Model Number @@ -1017,7 +1017,7 @@ void menuModelSetup(event_t event) for (uint8_t pos=0; pos Date: Wed, 6 Feb 2019 12:37:49 +0100 Subject: [PATCH 088/446] Add registration button --- radio/src/gui/128x64/model_setup.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 090977c48..5352cb71c 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -76,7 +76,7 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_MODE, ITEM_MODEL_INTERNAL_MODULE_MODEL_NUM, ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, - ITEM_MODEL_INTERNAL_MODULE_RANGE, + ITEM_MODEL_INTERNAL_MODULE_RANGE_REG, #if defined(PCBXLITE) || defined(PCBXLITES) ITEM_MODEL_INTERNAL_MODULE_ANTENNA, #endif @@ -288,7 +288,7 @@ void menuModelSetup(event_t event) INTERNAL_MODULE_MODE_ROWS, IF_INTERNAL_MODULE_ON((uint8_t)0), // Model Number IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe - IF_INTERNAL_MODULE_ON((uint8_t)0), // Range check + IF_INTERNAL_MODULE_ON((uint8_t)1), // Range check and receiver register ANTENNA_ROW IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Number IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Range @@ -1014,7 +1014,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_REGISTRATION_ID: { lcdDrawTextAlignedLeft(y, "Regis. ID"); - for(uint8_t pos=0; pos0) { - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; + if (menuHorizontalPosition == 0 ) + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; + else + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; } if (attr && s_editMode==0) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; From 0233358b823684c4899d2f01b6ddff2cec4c8d5b Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 6 Feb 2019 12:48:03 +0100 Subject: [PATCH 089/446] Merge fixes --- radio/src/gui/128x64/model_setup.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index bf46f7dd6..12ca1942a 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1036,11 +1036,7 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_RANGE: - lcdDrawTextAlignedLeft(y, STR_RANGE); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, attr); case ITEM_MODEL_INTERNAL_MODULE_RANGE_REG: - { lcdDrawTextAlignedLeft(y, INDENT "Module"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, (menuHorizontalPosition==0 ? attr : 0) ); lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition==1 ? attr : 0) ); From 05e89a6a4594b59fdb047063f14f6902c20e498c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Feb 2019 12:48:03 +0100 Subject: [PATCH 090/446] memcpy overflow --- radio/src/gui/128x64/model_setup.cpp | 35 +++++++++++++--------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index bf46f7dd6..fa329af5f 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1113,29 +1113,26 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_BIND: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - lcdDrawTextAlignedLeft(y, INDENT "Receiver"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, menuHorizontalPosition==0 ? attr : 0); lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS, y, STR_DEL_BUTTON, menuHorizontalPosition==1 ? attr : 0); - if (attr && menuHorizontalPosition == 0) { - if (s_editMode > 0) { - if (BLINK_ON_PHASE) - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_BIND; - else - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; + if (attr) { + if (menuHorizontalPosition == 0) { + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + moduleSettings[INTERNAL_MODULE].mode ^= MODULE_MODE_BIND; + } + s_editMode = (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_BIND); } - else - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; - } - if (attr && menuHorizontalPosition == 1 && s_editMode > 0) { - if(receiverIdx == 0) { - memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0], &g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1], sizeof(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers)); - memclear(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1], sizeof(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers)); - s_editMode = 0; - } - else { - memclear(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx], sizeof(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers)); - s_editMode = 0; + else if (menuHorizontalPosition == 1 && s_editMode > 0) { + if (receiverIdx == 0) { + memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0], + &g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1], sizeof(ReceiverData)); + memclear(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1], sizeof(ReceiverData)); + s_editMode = 0; + } else { + memclear(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx], sizeof(ReceiverData)); + s_editMode = 0; + } } } } From 833adb5787066ac05f092dbf78b11b84e063aff2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Feb 2019 13:53:07 +0100 Subject: [PATCH 091/446] BIND continued --- radio/src/gui/128x64/model_setup.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 448bcdaad..14b9ec252 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1116,8 +1116,15 @@ void menuModelSetup(event_t event) if (menuHorizontalPosition == 0) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { moduleSettings[INTERNAL_MODULE].mode ^= MODULE_MODE_BIND; + reusableBuffer.modelsetup.pxx2_bind_receiver_index = receiverIdx; + } + if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_BIND) { + s_editMode = 1; + // TODO the menu here + } + else { + s_editMode = 0; } - s_editMode = (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_BIND); } else if (menuHorizontalPosition == 1 && s_editMode > 0) { if (receiverIdx == 0) { From c7404998f9345f3311f728e32f9e9e8eecd4d71b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Feb 2019 14:12:54 +0100 Subject: [PATCH 092/446] BIND menu added (still not tested) --- radio/src/gui/128x64/model_setup.cpp | 13 ++++++++++--- radio/src/gui/128x64/popups.h | 8 +++++--- radio/src/gui/212x64/model_setup.cpp | 2 +- radio/src/gui/212x64/popups.h | 6 +++--- radio/src/gui/480x272/menus.h | 6 +++--- radio/src/gui/480x272/model_setup.cpp | 2 +- radio/src/gui/480x272/popups.cpp | 18 +++++++++--------- radio/src/gui/common/stdlcd/popups.cpp | 18 +++++++++--------- radio/src/keys.h | 3 +++ radio/src/main.cpp | 12 ++++++------ radio/src/sdcard.cpp | 15 +++++++-------- 11 files changed, 57 insertions(+), 46 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 14b9ec252..f9fa88cdd 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1115,12 +1115,19 @@ void menuModelSetup(event_t event) if (attr) { if (menuHorizontalPosition == 0) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { - moduleSettings[INTERNAL_MODULE].mode ^= MODULE_MODE_BIND; + reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_START; reusableBuffer.modelsetup.pxx2_bind_receiver_index = receiverIdx; + reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count = 0; + moduleSettings[INTERNAL_MODULE].mode ^= MODULE_MODE_BIND; } if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_BIND) { s_editMode = 1; - // TODO the menu here + if (reusableBuffer.modelsetup.pxx2_register_or_bind_step == BIND_RX_ID_RECEIVED) { + for (uint8_t i=0; i + #define MENU_X 10 #define MENU_Y 16 #define MENU_W LCD_W-(2*MENU_X) @@ -63,8 +65,8 @@ extern uint8_t warningInfoFlags; #endif #define NAVIGATION_MENUS - #define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuNoItems < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuNoItems++] = s; } while (0) - #define POPUP_MENU_SELECT_ITEM(s) s_menu_item = (s > 0 ? (s < popupMenuNoItems ? s : popupMenuNoItems) : 0) + #define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuItemsCount++] = s; } while (0) + #define POPUP_MENU_SELECT_ITEM(s) s_menu_item = (s > 0 ? (s < popupMenuItemsCount ? s : popupMenuItemsCount) : 0) #define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while (0) #define POPUP_MENU_MAX_LINES 12 #define MENU_MAX_DISPLAY_LINES 6 @@ -81,7 +83,7 @@ extern uint8_t warningInfoFlags; #if defined(NAVIGATION_MENUS) extern uint16_t popupMenuOffset; extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; - extern uint16_t popupMenuNoItems; + extern uint16_t popupMenuItemsCount; const char * runPopupMenu(event_t event); extern void (*popupMenuHandler)(const char * result); #endif diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 03c5ce1e6..de8692385 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1065,7 +1065,7 @@ void menuModelSetup(event_t event) newFlag = MODULE_BIND; } else { - if (!popupMenuNoItems) { + if (!popupMenuItemsCount) { s_editMode = 0; // this is when popup is exited before a choice is made } } diff --git a/radio/src/gui/212x64/popups.h b/radio/src/gui/212x64/popups.h index 06d1be6d7..c522b5244 100644 --- a/radio/src/gui/212x64/popups.h +++ b/radio/src/gui/212x64/popups.h @@ -47,8 +47,8 @@ extern uint8_t warningInfoFlags; #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) #define NAVIGATION_MENUS -#define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuNoItems < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuNoItems++] = s; } while (0) -#define POPUP_MENU_SELECT_ITEM(s) s_menu_item = (s > 0 ? (s < popupMenuNoItems ? s : popupMenuNoItems) : 0) +#define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuItemsCount++] = s; } while (0) +#define POPUP_MENU_SELECT_ITEM(s) s_menu_item = (s > 0 ? (s < popupMenuItemsCount ? s : popupMenuItemsCount) : 0) #define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while (0) #define POPUP_MENU_MAX_LINES 12 #define MENU_MAX_DISPLAY_LINES 6 @@ -56,7 +56,7 @@ extern uint8_t warningInfoFlags; #define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) #define POPUP_MENU_SET_BSS_FLAG() extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; -extern uint16_t popupMenuNoItems; +extern uint16_t popupMenuItemsCount; extern uint16_t popupMenuOffset; enum { MENU_OFFSET_INTERNAL, diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index 6aafa5036..e88a7e916 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -482,15 +482,15 @@ extern uint8_t warningInfoFlags; #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) #define NAVIGATION_MENUS -#define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuNoItems < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuNoItems++] = s; } while (0) -#define POPUP_MENU_SELECT_ITEM(s) s_menu_item = (s > 0 ? (s < popupMenuNoItems ? s : popupMenuNoItems) : 0) +#define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuItemsCount++] = s; } while (0) +#define POPUP_MENU_SELECT_ITEM(s) s_menu_item = (s > 0 ? (s < popupMenuItemsCount ? s : popupMenuItemsCount) : 0) #define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while(0) #define POPUP_MENU_MAX_LINES 12 #define MENU_MAX_DISPLAY_LINES 9 #define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) #define POPUP_MENU_SET_BSS_FLAG() extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; -extern uint16_t popupMenuNoItems; +extern uint16_t popupMenuItemsCount; extern uint16_t popupMenuOffset; enum { MENU_OFFSET_INTERNAL, diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 6258ba9b5..713fcb5bb 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -986,7 +986,7 @@ bool menuModelSetup(event_t event) newFlag = MODULE_MODE_BIND; } else { - if (!popupMenuNoItems) { + if (!popupMenuItemsCount) { s_editMode = 0; // this is when popup is exited before a choice is made } } diff --git a/radio/src/gui/480x272/popups.cpp b/radio/src/gui/480x272/popups.cpp index d26ccff61..56d3ad07c 100644 --- a/radio/src/gui/480x272/popups.cpp +++ b/radio/src/gui/480x272/popups.cpp @@ -32,7 +32,7 @@ int16_t warningInputValueMax; void (*popupFunc)(event_t event) = NULL; const char *popupMenuItems[POPUP_MENU_MAX_LINES]; uint8_t s_menu_item = 0; -uint16_t popupMenuNoItems = 0; +uint16_t popupMenuItemsCount = 0; uint16_t popupMenuOffset = 0; uint8_t popupMenuOffsetType = MENU_OFFSET_INTERNAL; void (*popupMenuHandler)(const char * result); @@ -105,7 +105,7 @@ const char * runPopupMenu(event_t event) { const char * result = NULL; - uint8_t display_count = min(popupMenuNoItems, MENU_MAX_DISPLAY_LINES); + uint8_t display_count = min(popupMenuItemsCount, MENU_MAX_DISPLAY_LINES); switch (event) { case EVT_ROTARY_LEFT: @@ -118,18 +118,18 @@ const char * runPopupMenu(event_t event) } else { s_menu_item = min(display_count, MENU_MAX_DISPLAY_LINES) - 1; - if (popupMenuNoItems > MENU_MAX_DISPLAY_LINES) { - popupMenuOffset = popupMenuNoItems - MENU_MAX_DISPLAY_LINES; + if (popupMenuItemsCount > MENU_MAX_DISPLAY_LINES) { + popupMenuOffset = popupMenuItemsCount - MENU_MAX_DISPLAY_LINES; result = STR_UPDATE_LIST; } } break; case EVT_ROTARY_RIGHT: - if (s_menu_item < display_count - 1 && popupMenuOffset + s_menu_item + 1 < popupMenuNoItems) { + if (s_menu_item < display_count - 1 && popupMenuOffset + s_menu_item + 1 < popupMenuItemsCount) { s_menu_item++; } - else if (popupMenuNoItems > popupMenuOffset + display_count) { + else if (popupMenuItemsCount > popupMenuOffset + display_count) { popupMenuOffset++; result = STR_UPDATE_LIST; } @@ -147,7 +147,7 @@ const char * runPopupMenu(event_t event) // no break case EVT_KEY_BREAK(KEY_EXIT): - popupMenuNoItems = 0; + popupMenuItemsCount = 0; s_menu_item = 0; popupMenuOffset = 0; break; @@ -168,8 +168,8 @@ const char * runPopupMenu(event_t event) } } - if (popupMenuNoItems > display_count) { - drawVerticalScrollbar(MENU_X+MENU_W-1, y+1, MENU_MAX_DISPLAY_LINES * (FH+1), popupMenuOffset, popupMenuNoItems, MENU_MAX_DISPLAY_LINES); + if (popupMenuItemsCount > display_count) { + drawVerticalScrollbar(MENU_X+MENU_W-1, y+1, MENU_MAX_DISPLAY_LINES * (FH+1), popupMenuOffset, popupMenuItemsCount, MENU_MAX_DISPLAY_LINES); } return result; diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index 448a7c753..89b6fd8e4 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -26,7 +26,7 @@ void (*popupFunc)(event_t event) = NULL; #if defined(NAVIGATION_MENUS) const char * popupMenuItems[POPUP_MENU_MAX_LINES]; uint8_t s_menu_item = 0; -uint16_t popupMenuNoItems = 0; +uint16_t popupMenuItemsCount = 0; uint16_t popupMenuOffset = 0; void (*popupMenuHandler)(const char * result); @@ -34,7 +34,7 @@ const char * runPopupMenu(event_t event) { const char * result = NULL; - uint8_t display_count = min(popupMenuNoItems, MENU_MAX_DISPLAY_LINES); + uint8_t display_count = min(popupMenuItemsCount, MENU_MAX_DISPLAY_LINES); uint8_t y = (display_count >= 5 ? MENU_Y - FH - 1 : MENU_Y); lcdDrawFilledRect(MENU_X, y, MENU_W, display_count * (FH+1) + 2, SOLID, ERASE); lcdDrawRect(MENU_X, y, MENU_W, display_count * (FH+1) + 2); @@ -44,8 +44,8 @@ const char * runPopupMenu(event_t event) if (i == s_menu_item) lcdDrawSolidFilledRect(MENU_X+1, i*(FH+1) + y + 1, MENU_W-2, 9); } - if (popupMenuNoItems > display_count) { - drawVerticalScrollbar(MENU_X+MENU_W-1, y+1, MENU_MAX_DISPLAY_LINES * (FH+1), popupMenuOffset, popupMenuNoItems, display_count); + if (popupMenuItemsCount > display_count) { + drawVerticalScrollbar(MENU_X+MENU_W-1, y+1, MENU_MAX_DISPLAY_LINES * (FH+1), popupMenuOffset, popupMenuItemsCount, display_count); } switch (event) { @@ -66,8 +66,8 @@ const char * runPopupMenu(event_t event) else { s_menu_item = min(display_count, MENU_MAX_DISPLAY_LINES) - 1; #if defined(SDCARD) - if (popupMenuNoItems > MENU_MAX_DISPLAY_LINES) { - popupMenuOffset = popupMenuNoItems - display_count; + if (popupMenuItemsCount > MENU_MAX_DISPLAY_LINES) { + popupMenuOffset = popupMenuItemsCount - display_count; result = STR_UPDATE_LIST; } #endif @@ -79,11 +79,11 @@ const char * runPopupMenu(event_t event) #endif case EVT_KEY_FIRST(KEY_DOWN): case EVT_KEY_REPT(KEY_DOWN): - if (s_menu_item < display_count - 1 && popupMenuOffset + s_menu_item + 1 < popupMenuNoItems) { + if (s_menu_item < display_count - 1 && popupMenuOffset + s_menu_item + 1 < popupMenuItemsCount) { s_menu_item++; } #if defined(SDCARD) - else if (popupMenuNoItems > popupMenuOffset + display_count) { + else if (popupMenuItemsCount > popupMenuOffset + display_count) { popupMenuOffset++; result = STR_UPDATE_LIST; } @@ -113,7 +113,7 @@ const char * runPopupMenu(event_t event) #endif case EVT_KEY_BREAK(KEY_EXIT): - popupMenuNoItems = 0; + popupMenuItemsCount = 0; s_menu_item = 0; popupMenuOffset = 0; break; diff --git a/radio/src/keys.h b/radio/src/keys.h index 3b78a8475..8c2983637 100644 --- a/radio/src/keys.h +++ b/radio/src/keys.h @@ -21,6 +21,9 @@ #ifndef _KEYS_H_ #define _KEYS_H_ +#include +#include "board.h" + #define EVT_KEY_MASK(e) ((e) & 0x1f) #if defined(PCBHORUS) diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 5bf957e56..470ff7bec 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -50,7 +50,7 @@ void handleUsbConnection() } } if (!usbStarted() && usbPlugged() && getSelectedUsbMode() == USB_UNSELECTED_MODE) { - if((g_eeGeneral.USBMode == USB_UNSELECTED_MODE) && (popupMenuNoItems == 0)) { + if((g_eeGeneral.USBMode == USB_UNSELECTED_MODE) && (popupMenuItemsCount == 0)) { POPUP_MENU_ADD_ITEM(STR_USB_JOYSTICK); POPUP_MENU_ADD_ITEM(STR_USB_MASS_STORAGE); #if defined(DEBUG) @@ -135,14 +135,14 @@ void handleJackConnection() jackState = TRAINER_ACTIVE; enableTrainer(); } - else if (popupMenuNoItems == 0) { + else if (popupMenuItemsCount == 0) { POPUP_MENU_ADD_ITEM(STR_JACK_HEADPHONE); POPUP_MENU_ADD_ITEM(STR_JACK_TRAINER); POPUP_MENU_START(onJackConnectMenu); } } - else if (jackState == SPEAKER_ACTIVE && !isJackPlugged() && popupMenuNoItems > 0 && popupMenuHandler == onJackConnectMenu) { - popupMenuNoItems = 0; + else if (jackState == SPEAKER_ACTIVE && !isJackPlugged() && popupMenuItemsCount > 0 && popupMenuHandler == onJackConnectMenu) { + popupMenuItemsCount = 0; } else if (jackState != SPEAKER_ACTIVE && !isJackPlugged()) { jackState = SPEAKER_ACTIVE; @@ -304,7 +304,7 @@ void guiMain(event_t evt) while (1) { // normal GUI from menus const char * warn = warningText; - uint8_t menu = popupMenuNoItems; + uint8_t menu = popupMenuItemsCount; static bool popupDisplayed = false; if (warn || menu) { @@ -450,7 +450,7 @@ void guiMain(event_t evt) handleGui(0); // suppress events, they are handled by the warning DISPLAY_WARNING(evt); } - else if (popupMenuNoItems > 0) { + else if (popupMenuItemsCount > 0) { // popup menu is active display it on top of normal menus handleGui(0); // suppress events, they are handled by the popup if (!inPopupMenu) { diff --git a/radio/src/sdcard.cpp b/radio/src/sdcard.cpp index 394e589c3..669a40c58 100644 --- a/radio/src/sdcard.cpp +++ b/radio/src/sdcard.cpp @@ -275,7 +275,7 @@ bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen lastpopupMenuOffset = 0; memset(reusableBuffer.modelsel.menu_bss, 0, sizeof(reusableBuffer.modelsel.menu_bss)); } - else if (popupMenuOffset == popupMenuNoItems - MENU_MAX_DISPLAY_LINES) { + else if (popupMenuOffset == popupMenuItemsCount - MENU_MAX_DISPLAY_LINES) { lastpopupMenuOffset = 0xffff; memset(reusableBuffer.modelsel.menu_bss, 0, sizeof(reusableBuffer.modelsel.menu_bss)); } @@ -292,14 +292,14 @@ bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen memset(reusableBuffer.modelsel.menu_bss[0], 0, MENU_LINE_LENGTH); } - popupMenuNoItems = 0; + popupMenuItemsCount = 0; POPUP_MENU_SET_BSS_FLAG(); FRESULT res = f_opendir(&dir, path); if (res == FR_OK) { if (flags & LIST_NONE_SD_FILE) { - popupMenuNoItems++; + popupMenuItemsCount++; if (selection) { lastpopupMenuOffset++; } @@ -338,7 +338,7 @@ bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen continue; } - popupMenuNoItems++; + popupMenuItemsCount++; if (!(flags & LIST_SD_FILE_EXT)) { fno.fname[fnLen] = '\0'; // strip extension @@ -359,10 +359,9 @@ bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen } } } - for (uint8_t i=0; i=0; i--) { @@ -374,7 +373,7 @@ bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen break; } } - for (uint8_t i=0; i Date: Wed, 6 Feb 2019 14:20:12 +0100 Subject: [PATCH 093/446] Auto exit on successfull registration --- radio/src/gui/128x64/model_setup.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index f9fa88cdd..7c7092728 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1040,15 +1040,23 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, INDENT "Module"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, (menuHorizontalPosition==0 ? attr : 0) ); lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition==1 ? attr : 0) ); - if (attr && s_editMode>0) { - if (menuHorizontalPosition == 0 ) - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; - else - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; + if (attr && s_editMode>0 && menuHorizontalPosition == 0 ) { + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; + } + if(attr && menuHorizontalPosition == 1) { + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + moduleSettings[INTERNAL_MODULE].mode ^= MODULE_MODE_REGISTER; + } + if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_REGISTER) { + s_editMode = 1; + } } if (attr && s_editMode==0) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; } + if (attr && moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL) { + s_editMode = 0; + } break; case ITEM_MODEL_INTERNAL_MODULE_ADD_RECEIVER: From 031abfaf18d0e5819a4de33be9a263a852d73142 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Feb 2019 14:29:44 +0100 Subject: [PATCH 094/446] BIND menu added (still not tested) --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 7c7092728..99fd617cc 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1131,10 +1131,10 @@ void menuModelSetup(event_t event) if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_BIND) { s_editMode = 1; if (reusableBuffer.modelsetup.pxx2_register_or_bind_step == BIND_RX_ID_RECEIVED) { - for (uint8_t i=0; i(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count, PXX2_MAX_RECEIVERS_PER_MODULE); + for (uint8_t i=0; i Date: Wed, 6 Feb 2019 14:49:59 +0100 Subject: [PATCH 095/446] Fixes --- radio/src/opentx.h | 2 +- radio/src/pulses/pxx2.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index c1b913480..ed12239db 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1118,7 +1118,7 @@ union ReusableBuffer char msg[64]; uint8_t r9mPower; uint8_t pxx2_register_or_bind_step; - char pxx2_bind_candidate_receivers[5][8]; + char pxx2_bind_candidate_receivers[PXX2_MAX_RECEIVERS_PER_MODULE][8]; uint8_t pxx2_bind_candidate_receivers_count; uint8_t pxx2_bind_receiver_index; } modelsetup; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index f313ccad8..67c9a11c1 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -75,7 +75,7 @@ void Pxx2Pulses::setupBindFrame(uint8_t module) addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_BIND); if (reusableBuffer.modelsetup.pxx2_register_or_bind_step == BIND_RX_ID_SELECTED) { - Pxx2Transport::addByte(0x00); + Pxx2Transport::addByte(0x01); for (uint8_t i=0; i Date: Wed, 6 Feb 2019 15:02:27 +0100 Subject: [PATCH 096/446] WIP --- radio/src/gui/128x64/model_setup.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 99fd617cc..9804ba8a4 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -224,6 +224,13 @@ enum MenuModelSetupItems { #endif +void onPXX2BindMenu(const char * result) +{ + reusableBuffer.modelsetup.pxx2_bind_receiver_index = (result - reusableBuffer.modelsetup.pxx2_bind_candidate_receivers[0]) / sizeof(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers[0]); + reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_RX_ID_SELECTED; + TRACE("RECEIVER SELECTED : %d", reusableBuffer.modelsetup.pxx2_bind_receiver_index); +} + void onBindMenu(const char * result) { uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition); @@ -1135,6 +1142,7 @@ void menuModelSetup(event_t event) for (uint8_t i=0; i Date: Wed, 6 Feb 2019 15:22:17 +0100 Subject: [PATCH 097/446] Split RX_ID display name and RX_ID binary --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- radio/src/opentx.h | 3 ++- radio/src/telemetry/telemetry.cpp | 16 +++++++++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 9804ba8a4..45876fbc4 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -226,7 +226,7 @@ enum MenuModelSetupItems { void onPXX2BindMenu(const char * result) { - reusableBuffer.modelsetup.pxx2_bind_receiver_index = (result - reusableBuffer.modelsetup.pxx2_bind_candidate_receivers[0]) / sizeof(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers[0]); + reusableBuffer.modelsetup.pxx2_bind_receiver_index = (result - reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]) / sizeof(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]); reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_RX_ID_SELECTED; TRACE("RECEIVER SELECTED : %d", reusableBuffer.modelsetup.pxx2_bind_receiver_index); } @@ -1140,7 +1140,7 @@ void menuModelSetup(event_t event) if (reusableBuffer.modelsetup.pxx2_register_or_bind_step == BIND_RX_ID_RECEIVED) { popupMenuItemsCount = min(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count, PXX2_MAX_RECEIVERS_PER_MODULE); for (uint8_t i=0; i> 4); + *c++ = (quartet >= 10 ? quartet + 'A' - 10 : quartet + '0'); + quartet = (byte & 0x0f); + *c++ = (quartet >= 10 ? quartet + 'A' - 10 : quartet + '0'); + *c++ = ' '; + } + *c = '\0'; ++reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count; reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_RX_ID_RECEIVED; } } else if (frame[3] == 0x01) { - if (memcmp(g_model.moduleData[module].pxx2.receivers[reusableBuffer.modelsetup.pxx2_bind_receiver_index].rxID, &frame[4], PXX2_LEN_RX_ID) == 0) { + if (memcmp(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_ids[reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count], &frame[4], PXX2_LEN_RX_ID) == 0) { reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; } From 8fafb0ebf6b883a6859cb1ed87791a64cc218291 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 6 Feb 2019 15:38:04 +0100 Subject: [PATCH 098/446] Store RxID after successfull bind --- radio/src/gui/128x64/model_setup.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 45876fbc4..4d50dd1f4 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "opentx.h" +#include uint8_t g_moduleIdx; void menuModelFailsafe(event_t event); @@ -1023,7 +1023,6 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, "Reg. ID"); for (uint8_t pos=0; pos 0) { if (receiverIdx == 0) { From f4e555be751f4cb66c709a34cd10888e14bc7829 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Feb 2019 16:24:45 +0100 Subject: [PATCH 099/446] Fixes --- radio/src/gui/128x64/model_setup.cpp | 7 +++---- radio/src/opentx.h | 2 +- radio/src/pulses/pxx2.cpp | 3 ++- radio/src/telemetry/telemetry.cpp | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 4d50dd1f4..1752e5f3e 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -226,7 +226,7 @@ enum MenuModelSetupItems { void onPXX2BindMenu(const char * result) { - reusableBuffer.modelsetup.pxx2_bind_receiver_index = (result - reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]) / sizeof(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]); + reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index = (result - reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]) / sizeof(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]); reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_RX_ID_SELECTED; TRACE("RECEIVER SELECTED : %d", reusableBuffer.modelsetup.pxx2_bind_receiver_index); } @@ -1134,7 +1134,6 @@ void menuModelSetup(event_t event) if (menuHorizontalPosition == 0) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_START; - reusableBuffer.modelsetup.pxx2_bind_receiver_index = receiverIdx; reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count = 0; moduleSettings[INTERNAL_MODULE].mode ^= MODULE_MODE_BIND; } @@ -1151,8 +1150,8 @@ void menuModelSetup(event_t event) else { s_editMode = 0; } - if(reusableBuffer.modelsetup.pxx2_register_or_bind_step == BIND_OK) { - memcpy(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].rxID, reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_ids[reusableBuffer.modelsetup.pxx2_bind_receiver_index], PXX2_LEN_RX_ID); + if (reusableBuffer.modelsetup.pxx2_register_or_bind_step == BIND_OK) { + memcpy(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].rxID, reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_ids[reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index], PXX2_LEN_RX_ID); } } else if (menuHorizontalPosition == 1 && s_editMode > 0) { diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 8a3d842bd..3edd95155 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1121,7 +1121,7 @@ union ReusableBuffer char pxx2_bind_candidate_receivers_ids[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_ID]; char pxx2_bind_candidate_receivers_names[PXX2_MAX_RECEIVERS_PER_MODULE][3*PXX2_LEN_RX_ID+1]; uint8_t pxx2_bind_candidate_receivers_count; - uint8_t pxx2_bind_receiver_index; + uint8_t pxx2_bind_selected_receiver_index; } modelsetup; // 103 bytes diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 67c9a11c1..f77299ecf 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -77,8 +77,9 @@ void Pxx2Pulses::setupBindFrame(uint8_t module) if (reusableBuffer.modelsetup.pxx2_register_or_bind_step == BIND_RX_ID_SELECTED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i Date: Wed, 6 Feb 2019 16:32:03 +0100 Subject: [PATCH 100/446] Fixes --- radio/src/telemetry/telemetry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index c65277bc0..fccf51fc7 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -101,7 +101,7 @@ void processBindFrame(uint8_t module, uint8_t * frame) memcpy(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_ids[reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count], &frame[4], PXX2_LEN_RX_ID); char * c = reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count]; for (uint8_t i=0; i> 4); *c++ = (quartet >= 10 ? quartet + 'A' - 10 : quartet + '0'); quartet = (byte & 0x0f); From fa184f62a4063760436d3bfe8bcf216ae9d6c0c2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Feb 2019 16:37:41 +0100 Subject: [PATCH 101/446] Fixes --- radio/src/telemetry/telemetry.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index fccf51fc7..0e7e04818 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -74,6 +74,10 @@ void processTelemetryData(uint8_t data) void processRegisterFrame(uint8_t module, uint8_t * frame) { + if (moduleSettings[module].mode != MODULE_MODE_REGISTER) { + return; + } + if (frame[3] == 0x00) { // RX_ID follows, we discard it for now reusableBuffer.modelsetup.pxx2_register_or_bind_step = REGISTER_COUNTER_ID_RECEIVED; @@ -89,6 +93,10 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) void processBindFrame(uint8_t module, uint8_t * frame) { + if (moduleSettings[module].mode != MODULE_MODE_BIND) { + return; + } + if (frame[3] == 0x00) { bool found = false; for (uint8_t i=0; i Date: Wed, 6 Feb 2019 17:57:01 +0100 Subject: [PATCH 102/446] Trace removed --- radio/src/gui/128x64/model_setup.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 1752e5f3e..81e3192f9 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -228,7 +228,6 @@ void onPXX2BindMenu(const char * result) { reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index = (result - reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]) / sizeof(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]); reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_RX_ID_SELECTED; - TRACE("RECEIVER SELECTED : %d", reusableBuffer.modelsetup.pxx2_bind_receiver_index); } void onBindMenu(const char * result) From dfd12ff978a0ecc593bfb3c6738cb8a9952861f2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Feb 2019 19:12:20 +0100 Subject: [PATCH 103/446] In progress ... --- radio/src/gui/128x64/menus.h | 3 ++ radio/src/gui/128x64/radio_spectrum.cpp | 40 ++++++++++++++++++ radio/src/opentx.h | 5 +++ radio/src/pulses/pulses.cpp | 7 ++-- radio/src/pulses/pulses.h | 7 ++-- radio/src/pulses/pxx2.cpp | 52 +++++++++++++++++++++--- radio/src/pulses/pxx2.h | 10 +++-- radio/src/targets/taranis/CMakeLists.txt | 1 + radio/src/telemetry/telemetry.cpp | 47 +++++++++++++++++++-- 9 files changed, 155 insertions(+), 17 deletions(-) create mode 100644 radio/src/gui/128x64/radio_spectrum.cpp diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index 2a0a565d6..09b3e0981 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -79,6 +79,7 @@ enum MenuRadioIndexes MENU_RADIO_SWITCHES_TEST, MENU_RADIO_ANALOGS_TEST, MENU_RADIO_HARDWARE, + MENU_RADIO_SPECTRUM, MENU_RADIO_CALIBRATION, MENU_RADIO_PAGES_COUNT }; @@ -91,6 +92,7 @@ void menuRadioVersion(event_t event); void menuRadioDiagKeys(event_t event); void menuRadioDiagAnalogs(event_t event); void menuRadioHardware(event_t event); +void menuRadioSpectrum(event_t event); void menuRadioCalibration(event_t event); static const MenuHandlerFunc menuTabGeneral[] = { @@ -102,6 +104,7 @@ static const MenuHandlerFunc menuTabGeneral[] = { menuRadioDiagKeys, menuRadioDiagAnalogs, menuRadioHardware, + menuRadioSpectrum, menuRadioCalibration }; diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp new file mode 100644 index 000000000..54999df62 --- /dev/null +++ b/radio/src/gui/128x64/radio_spectrum.cpp @@ -0,0 +1,40 @@ +/* + * 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" + +void menuRadioSpectrum(event_t event) +{ + MENU("SPECTRUM", menuTabGeneral, MENU_RADIO_SPECTRUM, HEADER_LINE, { HEADER_LINE_COLUMNS }); + + if (event == EVT_ENTRY) { + memclear(reusableBuffer.spectrum.bars, sizeof(reusableBuffer.spectrum.bars)); + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_SPECTRUM; + } + + for (uint8_t i=0; i> 2; + lcdDrawSolidVerticalLine(i, LCD_H - h, h); + } + extern uint32_t FREQUENCY; + extern uint8_t POWER; + lcdDrawNumber(64, 32, FREQUENCY); + lcdDrawNumber(64, 40, POWER); +} diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 3edd95155..10b9f92f1 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1158,6 +1158,11 @@ union ReusableBuffer uint8_t stickMode; } generalSettings; + struct + { + uint8_t bars[128]; + } spectrum; + #if defined(STM32) // Data for the USB mass storage driver. If USB mass storage runs no menu is not allowed to be displayed uint8_t MSC_BOT_Data[MSC_MEDIA_PACKET]; diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 0c5196320..d6b623882 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -139,8 +139,9 @@ void setupPulsesPXX(uint8_t port) void setupPulsesPXX2(uint8_t module) { if (module == INTERNAL_MODULE) { - modulePulsesData[module].pxx2.setupFrame(module); - intmoduleSendNextFrame(); + if (modulePulsesData[module].pxx2.setupFrame(module)) { + intmoduleSendNextFrame(); + } } #if 0 @@ -292,7 +293,7 @@ void sendPulses(uint8_t port, uint8_t protocol) case PROTOCOL_CHANNELS_PXX2: setupPulsesPXX2(port); - scheduleNextMixerCalculation(port, PXX2_PERIOD); + scheduleNextMixerCalculation(port, moduleSettings[port].mode == MODULE_MODE_SPECTRUM ? 1 : PXX2_PERIOD); break; #if defined(MULTIMODULE) diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 70fe6af50..6b0a39e87 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -73,13 +73,14 @@ enum ModuleSettingsMode MODULE_MODE_NORMAL, MODULE_MODE_RANGECHECK, MODULE_MODE_BIND, - MODULE_MODE_REGISTER + MODULE_MODE_REGISTER, + MODULE_MODE_SPECTRUM, }; PACK(struct ModuleSettings { - uint8_t protocol:5; + uint8_t protocol:4; uint8_t paused:1; - uint8_t mode:2; + uint8_t mode:3; uint16_t counter; }); diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index f77299ecf..2fb9d1efb 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -55,7 +55,7 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module) addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, 1); } -void Pxx2Pulses::setupRegisterFrame(uint8_t module) +bool Pxx2Pulses::setupRegisterFrame(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); @@ -68,9 +68,11 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) else { Pxx2Transport::addByte(0); } + + return true; // TODO not always } -void Pxx2Pulses::setupBindFrame(uint8_t module) +bool Pxx2Pulses::setupBindFrame(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_BIND); @@ -87,18 +89,56 @@ void Pxx2Pulses::setupBindFrame(uint8_t module) Pxx2Transport::addByte(g_model.modelRegistrationID[i]); } } + + return true; // TODO not always } -void Pxx2Pulses::setupFrame(uint8_t module) +bool Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) +{ + addFrameType(PXX2_TYPE_C_POWER_METER, PXX2_TYPE_ID_SPECTRUM); + Pxx2Transport::addByte(0x00); + + uint32_t fq = 2500000000; + Pxx2Transport::addByte(fq); + Pxx2Transport::addByte(fq >> 8); + Pxx2Transport::addByte(fq >> 16); + Pxx2Transport::addByte(fq >> 24); + + uint32_t span = 10000; + Pxx2Transport::addByte(span); + Pxx2Transport::addByte(span >> 8); + Pxx2Transport::addByte(span >> 16); + Pxx2Transport::addByte(span >> 24); + + uint32_t bandwidth = 10000; + Pxx2Transport::addByte(bandwidth); + Pxx2Transport::addByte(bandwidth >> 8); + Pxx2Transport::addByte(bandwidth >> 16); + Pxx2Transport::addByte(bandwidth >> 24); + + static bool done = false; + + if (done) + return false; + + done = true; + return true; +} + + +bool Pxx2Pulses::setupFrame(uint8_t module) { initFrame(); + bool result = true; uint8_t mode = moduleSettings[module].mode; if (mode == MODULE_MODE_REGISTER) - setupRegisterFrame(module); + result = setupRegisterFrame(module); else if (mode == MODULE_MODE_BIND) - setupBindFrame(module); + result = setupBindFrame(module); + else if (mode == MODULE_MODE_SPECTRUM) + result = setupSpectrumAnalyser(module); else setupChannelsFrame(module); @@ -116,4 +156,6 @@ void Pxx2Pulses::setupFrame(uint8_t module) #endif endFrame(); + + return result; } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 075a10836..87a831a3a 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -31,6 +31,8 @@ #define PXX2_TYPE_ID_SPORT 0xFE #define PXX2_TYPE_C_POWER_METER 0x02 + #define PXX2_TYPE_ID_POWER_METER 0x01 + #define PXX2_TYPE_ID_SPECTRUM 0x02 #define PXX2_TYPE_C_OTA 0xFE @@ -123,15 +125,17 @@ class Pxx2Transport: public DataBuffer, public PxxCrcMixin { class Pxx2Pulses: public PxxPulses { public: - void setupFrame(uint8_t module); + bool setupFrame(uint8_t module); protected: - void setupRegisterFrame(uint8_t module); + bool setupRegisterFrame(uint8_t module); - void setupBindFrame(uint8_t module); + bool setupBindFrame(uint8_t module); void setupChannelsFrame(uint8_t module); + bool setupSpectrumAnalyser(uint8_t module); + void addHead() { // send 7E, do not CRC diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 10c8405c0..cf19160f3 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -175,6 +175,7 @@ set(GUI_SRC ${GUI_SRC} radio_diagkeys.cpp radio_diaganas.cpp radio_hardware.cpp + radio_spectrum.cpp view_channels.cpp view_telemetry.cpp view_about.cpp diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 0e7e04818..b01a2c102 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -91,6 +91,8 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) } } +const uint8_t MY_RX_ID[] = { 0x46, 0x17, 0x32, 0x85 }; + void processBindFrame(uint8_t module, uint8_t * frame) { if (moduleSettings[module].mode != MODULE_MODE_BIND) { @@ -100,13 +102,13 @@ void processBindFrame(uint8_t module, uint8_t * frame) if (frame[3] == 0x00) { bool found = false; for (uint8_t i=0; i Date: Thu, 7 Feb 2019 07:44:05 +0100 Subject: [PATCH 104/446] Popup to inform of successful register and bind --- radio/src/telemetry/telemetry.cpp | 3 ++- radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 14 files changed, 15 insertions(+), 1 deletion(-) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index b01a2c102..4b2ec1606 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -19,7 +19,6 @@ */ #include -#include "opentx.h" uint8_t telemetryStreaming = 0; uint8_t R9ModuleStreaming = 0; @@ -87,6 +86,7 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) if (memcmp(&frame[4], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { reusableBuffer.modelsetup.pxx2_register_or_bind_step = REGISTER_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; + POPUP_WARNING("Registration ok"); } } } @@ -127,6 +127,7 @@ void processBindFrame(uint8_t module, uint8_t * frame) if (memcmp(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_ids[reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index], MY_RX_ID /*TODO &frame[4]*/, PXX2_LEN_RX_ID) == 0) { reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; + POPUP_WARNING(STR_BIND_OK); } } } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 9c812a8fc..16046479a 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -353,6 +353,7 @@ const char STR_MENUGLOBALVARS[] = TR_MENUGLOBALVARS; const char STR_RECEIVER_NUM[] = TR_RECEIVER_NUM; const char STR_RECEIVER[] = TR_RECEIVER; const char STR_REBIND[] = TR_REBIND; +const char STR_BIND_OK[] = TR_BIND_OK; #endif const char STR_SYNCMENU[] = TR_SYNCMENU; diff --git a/radio/src/translations.h b/radio/src/translations.h index 9568ea578..4fd6aec72 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -569,6 +569,7 @@ extern const char STR_SUBTYPE[]; extern const char STR_RECEIVER_NUM[]; extern const char STR_RECEIVER[]; extern const char STR_REBIND[]; +extern const char STR_BIND_OK[]; #endif extern const char STR_SYNCMENU[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 36e175d62..e8b973f7f 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -775,6 +775,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING TR("Bind...","Binding") #define TR_REBIND "Rebinding required" +#define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 32b6de2da..906460929 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -780,6 +780,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 6edf4de4f..836b62b41 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -778,6 +778,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING TR("Bind...","Binding") #define TR_REBIND "Rebinding required" +#define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index d76a696ca..d02fa0ff1 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -786,6 +786,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 5f296d2eb..127248589 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -778,6 +778,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index f33a27a41..bba915bd6 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -791,6 +791,7 @@ #define TR_MODULE_WAITFORBIND "Binder d'abord" #define TR_MODULE_BINDING "Bind..." #define TR_REBIND "Rebinding required" +#define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Télem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Télem OFF" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Télem ON" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index a424f757b..f76adde43 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -780,6 +780,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 7133edf11..590ad431a 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -781,6 +781,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 08476dc1e..053eaa28b 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -781,6 +781,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 9e5516969..12d5f52da 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -786,6 +786,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index a96f79b3b..f164fe65c 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -794,6 +794,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" From 671bdaeee5e07346a2449d085976593d1a5b9c65 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 7 Feb 2019 08:20:59 +0100 Subject: [PATCH 105/446] Registration, you silly --- radio/src/telemetry/telemetry.cpp | 2 +- radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 14 files changed, 14 insertions(+), 1 deletion(-) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 4b2ec1606..183bcce6c 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -86,7 +86,7 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) if (memcmp(&frame[4], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { reusableBuffer.modelsetup.pxx2_register_or_bind_step = REGISTER_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; - POPUP_WARNING("Registration ok"); + POPUP_WARNING(STR_REG_OK); } } } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 16046479a..8eca818b5 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -353,6 +353,7 @@ const char STR_MENUGLOBALVARS[] = TR_MENUGLOBALVARS; const char STR_RECEIVER_NUM[] = TR_RECEIVER_NUM; const char STR_RECEIVER[] = TR_RECEIVER; const char STR_REBIND[] = TR_REBIND; +const char STR_REG_OK[] = TR_REG_OK; const char STR_BIND_OK[] = TR_BIND_OK; #endif diff --git a/radio/src/translations.h b/radio/src/translations.h index 4fd6aec72..2e8e5a6bf 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -569,6 +569,7 @@ extern const char STR_SUBTYPE[]; extern const char STR_RECEIVER_NUM[]; extern const char STR_RECEIVER[]; extern const char STR_REBIND[]; +extern const char STR_REG_OK[]; extern const char STR_BIND_OK[]; #endif diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index e8b973f7f..323e41339 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -775,6 +775,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING TR("Bind...","Binding") #define TR_REBIND "Rebinding required" +#define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 906460929..ae4f35e70 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -780,6 +780,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 836b62b41..d36583d6c 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -778,6 +778,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING TR("Bind...","Binding") #define TR_REBIND "Rebinding required" +#define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index d02fa0ff1..939411e70 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -786,6 +786,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 127248589..0d4152805 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -778,6 +778,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index bba915bd6..d01f679c5 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -791,6 +791,7 @@ #define TR_MODULE_WAITFORBIND "Binder d'abord" #define TR_MODULE_BINDING "Bind..." #define TR_REBIND "Rebinding required" +#define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Télem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Télem OFF" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index f76adde43..2d355bcbd 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -780,6 +780,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 590ad431a..ad6e863d2 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -781,6 +781,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 053eaa28b..890e7afc5 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -781,6 +781,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 12d5f52da..f1814bea1 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -786,6 +786,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index f164fe65c..95d2eaea7 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -794,6 +794,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_REBIND "Rebinding required" +#define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" #define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" From c5e8f18611bdc249fabc29fab7558d981f789c24 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Feb 2019 08:38:48 +0100 Subject: [PATCH 106/446] Model ID sent --- radio/src/gui/128x64/radio_spectrum.cpp | 4 ---- radio/src/pulses/pxx2.cpp | 2 +- radio/src/telemetry/telemetry.cpp | 14 +++----------- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp index 54999df62..818e28a26 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/128x64/radio_spectrum.cpp @@ -33,8 +33,4 @@ void menuRadioSpectrum(event_t event) uint8_t h = reusableBuffer.spectrum.bars[i] >> 2; lcdDrawSolidVerticalLine(i, LCD_H - h, h); } - extern uint32_t FREQUENCY; - extern uint8_t POWER; - lcdDrawNumber(64, 32, FREQUENCY); - lcdDrawNumber(64, 40, POWER); } diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 2fb9d1efb..a72520b17 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -81,7 +81,7 @@ bool Pxx2Pulses::setupBindFrame(uint8_t module) for (uint8_t i=0; i Date: Thu, 7 Feb 2019 10:17:19 +0100 Subject: [PATCH 107/446] Introduce POPUP_INFORMATION window --- radio/src/gui/128x64/gui.h | 1 + radio/src/gui/128x64/popups.cpp | 12 ++++++------ radio/src/gui/128x64/popups.h | 1 + radio/src/telemetry/telemetry.cpp | 4 ++-- radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 17 files changed, 23 insertions(+), 8 deletions(-) diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 6b814dd46..73b5d8300 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -266,6 +266,7 @@ uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint #define WARNING_TYPE_ASTERISK 0 #define WARNING_TYPE_CONFIRM 1 #define WARNING_TYPE_INPUT 2 +#define WARNING_TYPE_INFO 4 extern const char * warningText; extern const char * warningInfoText; diff --git a/radio/src/gui/128x64/popups.cpp b/radio/src/gui/128x64/popups.cpp index 25b9e28a3..873b5163c 100644 --- a/radio/src/gui/128x64/popups.cpp +++ b/radio/src/gui/128x64/popups.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 * @@ -65,7 +65,7 @@ void drawAlertBox(const char * title, const char * text, const char * action) lcdDrawText(MESSAGE_LCD_OFFSET, 0, title, DBLSIZE); lcdDrawText(MESSAGE_LCD_OFFSET, 2*FH, STR_WARNING, DBLSIZE); #endif - + lcdDrawSolidFilledRect(0, 0, LCD_W, 32); if (text) { lcdDrawTextAlignedLeft(5*FH, text); @@ -73,16 +73,16 @@ void drawAlertBox(const char * title, const char * text, const char * action) if (action) { lcdDrawTextAlignedLeft(7*FH, action); } - + #undef MESSAGE_LCD_OFFSET } void showAlertBox(const char * title, const char * text, const char * action , uint8_t sound) { drawAlertBox(title, text, action); - + AUDIO_ERROR_MESSAGE(sound); - + lcdRefresh(); lcdSetContrast(); clearKeyEvents(); @@ -97,7 +97,7 @@ void runPopupWarning(event_t event) if (warningInfoText) { lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH, warningInfoText, warningInfoLength, WARNING_INFO_FLAGS); } - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS)); switch (event) { case EVT_KEY_BREAK(KEY_ENTER): if (warningType == WARNING_TYPE_ASTERISK) diff --git a/radio/src/gui/128x64/popups.h b/radio/src/gui/128x64/popups.h index 59cc73f9d..6fbead268 100644 --- a/radio/src/gui/128x64/popups.h +++ b/radio/src/gui/128x64/popups.h @@ -51,6 +51,7 @@ extern uint8_t warningInfoFlags; #define SET_WARNING_INFO(...) #else #define DISPLAY_WARNING (*popupFunc) + #define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_INPUT(s, func, start, min, max) (warningText = s, warningType = WARNING_TYPE_INPUT, popupFunc = func, warningInputValue = start, warningInputValueMin = min, warningInputValueMax = max) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 3071bd34b..c6d6ea80a 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -86,7 +86,7 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) if (memcmp(&frame[4], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { reusableBuffer.modelsetup.pxx2_register_or_bind_step = REGISTER_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; - POPUP_WARNING(STR_REG_OK); + POPUP_INFORMATION(STR_REG_OK); } } } @@ -125,7 +125,7 @@ void processBindFrame(uint8_t module, uint8_t * frame) if (memcmp(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_ids[reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index], &frame[4], PXX2_LEN_RX_ID) == 0) { reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; - POPUP_WARNING(STR_BIND_OK); + POPUP_INFORMATION(STR_BIND_OK); } } } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 8eca818b5..37aaade7f 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -116,6 +116,7 @@ const char STR_OPEN9X[] = // The 0-terminated-strings const char STR_POPUPS[] = TR_POPUPS; +const char STR_OK[] = TR_OK; #if !defined(OFS_EXIT) const char STR_EXIT[] = TR_EXIT; #endif diff --git a/radio/src/translations.h b/radio/src/translations.h index 2e8e5a6bf..d7a6231f9 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -329,6 +329,7 @@ extern const char STR_BLUETOOTH_LOCAL_ADDR[]; #define NO_INDENT(x) (x)+LEN_INDENT extern const char STR_POPUPS[]; +extern const char STR_OK[]; #if defined(OFS_EXIT) #define STR_EXIT (STR_POPUPS + OFS_EXIT) diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 323e41339..48657197f 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -534,6 +534,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) +define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index ae4f35e70..ced83f18e 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -540,6 +540,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER +define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index d36583d6c..b1dc37236 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -538,6 +538,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) + #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 939411e70..348e7a245 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -538,6 +538,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER +define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 0d4152805..aef8c7743 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -530,6 +530,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER +define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index d01f679c5..1627b0279 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -551,6 +551,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) +define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 2d355bcbd..e0069382f 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -540,6 +540,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER +define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index ad6e863d2..3a28d4d17 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -535,6 +535,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER +define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 890e7afc5..878b54012 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -541,6 +541,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER +define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index f1814bea1..aefae7e93 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -537,6 +537,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER +define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 95d2eaea7..11e591792 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -549,6 +549,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER +define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) From 2fc96cf14ddb52825d08a604cfe4032b471dbc8f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Feb 2019 10:58:14 +0100 Subject: [PATCH 108/446] Spectrum analyser working --- radio/src/pulses/pxx2.cpp | 15 +++++++-------- radio/src/telemetry/telemetry.cpp | 14 ++++++++++---- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index a72520b17..9e4826cc9 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -98,23 +98,23 @@ bool Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) addFrameType(PXX2_TYPE_C_POWER_METER, PXX2_TYPE_ID_SPECTRUM); Pxx2Transport::addByte(0x00); - uint32_t fq = 2500000000; + uint32_t fq = 2440000000; // 2440MHz Pxx2Transport::addByte(fq); Pxx2Transport::addByte(fq >> 8); Pxx2Transport::addByte(fq >> 16); Pxx2Transport::addByte(fq >> 24); - uint32_t span = 10000; + uint32_t span = 40000000; // 40MHz Pxx2Transport::addByte(span); Pxx2Transport::addByte(span >> 8); Pxx2Transport::addByte(span >> 16); Pxx2Transport::addByte(span >> 24); - uint32_t bandwidth = 10000; - Pxx2Transport::addByte(bandwidth); - Pxx2Transport::addByte(bandwidth >> 8); - Pxx2Transport::addByte(bandwidth >> 16); - Pxx2Transport::addByte(bandwidth >> 24); + uint32_t step = 100000; // 100KHz + Pxx2Transport::addByte(step); + Pxx2Transport::addByte(step >> 8); + Pxx2Transport::addByte(step >> 16); + Pxx2Transport::addByte(step >> 24); static bool done = false; @@ -125,7 +125,6 @@ bool Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) return true; } - bool Pxx2Pulses::setupFrame(uint8_t module) { initFrame(); diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index c6d6ea80a..e1a44a298 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -139,11 +139,17 @@ void processSpectrumFrame(uint8_t module, uint8_t * frame) uint32_t * frequency = (uint32_t *)&frame[4]; int8_t * power = (int8_t *)&frame[8]; - // center = 2500000000 - // left = 2500000000 - 5000 - // span = 10000 + // center = 2440000000; // 2440MHz + // span = 40000000; // 40MHz + // left = 2440000000 - 20000000 + // step = 10000 - // reusableBuffer.spectrum.bars[(*frequency - (2500000000 - 5000)) * 128 / 10000] = 127 + *power; + int32_t D = *frequency - (2440000000 - 40000000 / 2); + + // TRACE("Fq=%u, Pw=%d, X=%d, Y=%d", *frequency, int32_t(*power), D * 128 / 40000000, int32_t(127 + *power)); + uint8_t x = D * 128 / 40000000; + + reusableBuffer.spectrum.bars[x] = 127 + *power; } void processRadioFrame(uint8_t module, uint8_t * frame) From 485472f7c9102883a1bd1a1c1b7cfcf98690dd43 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Feb 2019 11:09:19 +0100 Subject: [PATCH 109/446] Spectrum analyser working --- radio/src/gui/128x64/gui.h | 2 +- radio/src/gui/128x64/radio_spectrum.cpp | 7 +++++-- radio/src/gui/navigation/navigation_xlite.cpp | 1 - radio/src/pulses/pulses.cpp | 2 +- radio/src/pulses/pulses.h | 2 +- radio/src/pulses/pxx2.cpp | 2 +- radio/src/telemetry/telemetry.cpp | 2 +- 7 files changed, 10 insertions(+), 8 deletions(-) diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 73b5d8300..c364cbe4a 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -167,7 +167,7 @@ void check_submenu_simple(event_t event, uint8_t maxrow); void title(const char * s); #define TITLE(str) title(str) - #define MENU_TAB(...) const uint8_t mstate_tab[] = __VA_ARGS__ +#define MENU_TAB(...) const uint8_t mstate_tab[] = __VA_ARGS__ #if defined(PCBX7) #define MENU_CHECK(tab, menu, lines_count) \ diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp index 818e28a26..6dc8ea799 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/128x64/radio_spectrum.cpp @@ -24,9 +24,12 @@ void menuRadioSpectrum(event_t event) { MENU("SPECTRUM", menuTabGeneral, MENU_RADIO_SPECTRUM, HEADER_LINE, { HEADER_LINE_COLUMNS }); - if (event == EVT_ENTRY) { + if (menuEvent) { + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + } + else if (event == EVT_ENTRY) { memclear(reusableBuffer.spectrum.bars, sizeof(reusableBuffer.spectrum.bars)); - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_SPECTRUM; + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_SPECTRUM_ANALYSER; } for (uint8_t i=0; i Date: Thu, 7 Feb 2019 11:09:42 +0100 Subject: [PATCH 110/446] Spectrum analyser working --- radio/src/gui/128x64/radio_spectrum.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp index 6dc8ea799..5a5ad318f 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/128x64/radio_spectrum.cpp @@ -22,7 +22,7 @@ void menuRadioSpectrum(event_t event) { - MENU("SPECTRUM", menuTabGeneral, MENU_RADIO_SPECTRUM, HEADER_LINE, { HEADER_LINE_COLUMNS }); + MENU("SPECTRUM ANALYSER", menuTabGeneral, MENU_RADIO_SPECTRUM, HEADER_LINE, { HEADER_LINE_COLUMNS }); if (menuEvent) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; From f528de89c2272585ebe9f6a962c62bfd83b239cd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Feb 2019 11:23:46 +0100 Subject: [PATCH 111/446] Spectrum analyser START / STOP fixed --- radio/src/pulses/pxx2.cpp | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 736bce15a..e3ce031c6 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -25,8 +25,7 @@ uint8_t Pxx2Pulses::addFlag0(uint8_t module) { uint8_t flag0 = g_model.header.modelId[module] & 0x3F; if (g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER) { - if (moduleSettings[module].counter-- == 0) { - moduleSettings[module].counter = 1000; + if (moduleSettings[module].counter == 0) { flag0 |= PXX2_FLAG0_FAILSAFE; } } @@ -95,6 +94,13 @@ bool Pxx2Pulses::setupBindFrame(uint8_t module) bool Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) { + if (moduleSettings[module].counter > 1000) { + moduleSettings[module].counter = 1002; + return false; + } + + moduleSettings[module].counter = 1002; + addFrameType(PXX2_TYPE_C_POWER_METER, PXX2_TYPE_ID_SPECTRUM); Pxx2Transport::addByte(0x00); @@ -116,12 +122,6 @@ bool Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) Pxx2Transport::addByte(step >> 16); Pxx2Transport::addByte(step >> 24); - static bool done = false; - - if (done) - return false; - - done = true; return true; } @@ -141,18 +141,9 @@ bool Pxx2Pulses::setupFrame(uint8_t module) else setupChannelsFrame(module); -#if 0 - // TODO PXX15 - if (outputTelemetryBufferTrigger != 0x7E && outputTelemetryBufferSize > 0) { - // primID (1 byte) + dataID (2 bytes) + value (4 bytes) - addByte(outputTelemetryBufferTrigger); - for (uint8_t i=0; i<7; i++) { - addByte(outputTelemetryBuffer[i]); - } - outputTelemetryBufferTrigger = 0x00; - outputTelemetryBufferSize = 0; + if (moduleSettings[module].counter-- == 0) { + moduleSettings[module].counter = 1000; } -#endif endFrame(); From 5eda7dc6ddb814bbce04ed24d6480e576cc82098 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 7 Feb 2019 13:39:27 +0100 Subject: [PATCH 112/446] Improve spectrum --- radio/src/gui/128x64/radio_spectrum.cpp | 20 +++++++++++++++-- radio/src/opentx.h | 3 +++ radio/src/pulses/pxx2.cpp | 30 ++++++++++++------------- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp index 5a5ad318f..df09b151a 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/128x64/radio_spectrum.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 * @@ -32,8 +32,24 @@ void menuRadioSpectrum(event_t event) moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_SPECTRUM_ANALYSER; } + uint8_t peak=1; + uint32_t peak_x=0; for (uint8_t i=0; i> 2; + uint8_t h = reusableBuffer.spectrum.bars[i]; + if(h > peak) { + peak_x = i; + peak=h; + } lcdDrawSolidVerticalLine(i, LCD_H - h, h); } + lcdDrawText(1,10, "F:", 0); + lcdDrawNumber(lcdLastRightPos, 10, reusableBuffer.spectrum.fq/10000000,PREC2); + lcdDrawText(lcdLastRightPos, 10, "GHz"); + lcdDrawText(1,10+FH, "S:", 0); + lcdDrawNumber(lcdLastRightPos, 10+FH, reusableBuffer.spectrum.span/1000000,0); + lcdDrawText(lcdLastRightPos, 10+FH, "MHz"); + + lcdDrawText(80,10, "P:", 0); + lcdDrawNumber(lcdLastRightPos, 10, ((reusableBuffer.spectrum.fq - reusableBuffer.spectrum.span/2) + peak_x * (reusableBuffer.spectrum.span / 128)) / 10000000,PREC2); + lcdDrawText(lcdLastRightPos, 10, "GHz"); } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 10b9f92f1..4fca02dee 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1161,6 +1161,9 @@ union ReusableBuffer struct { uint8_t bars[128]; + uint32_t fq; + uint32_t span; + uint32_t step; } spectrum; #if defined(STM32) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index e3ce031c6..e75c339e5 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -104,23 +104,23 @@ bool Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) addFrameType(PXX2_TYPE_C_POWER_METER, PXX2_TYPE_ID_SPECTRUM); Pxx2Transport::addByte(0x00); - uint32_t fq = 2440000000; // 2440MHz - Pxx2Transport::addByte(fq); - Pxx2Transport::addByte(fq >> 8); - Pxx2Transport::addByte(fq >> 16); - Pxx2Transport::addByte(fq >> 24); + reusableBuffer.spectrum.fq = 2440000000; // 2440MHz + Pxx2Transport::addByte(reusableBuffer.spectrum.fq); + Pxx2Transport::addByte(reusableBuffer.spectrum.fq >> 8); + Pxx2Transport::addByte(reusableBuffer.spectrum.fq >> 16); + Pxx2Transport::addByte(reusableBuffer.spectrum.fq >> 24); - uint32_t span = 40000000; // 40MHz - Pxx2Transport::addByte(span); - Pxx2Transport::addByte(span >> 8); - Pxx2Transport::addByte(span >> 16); - Pxx2Transport::addByte(span >> 24); + reusableBuffer.spectrum.span = 40000000; // 40MHz + Pxx2Transport::addByte(reusableBuffer.spectrum.span); + Pxx2Transport::addByte(reusableBuffer.spectrum.span >> 8); + Pxx2Transport::addByte(reusableBuffer.spectrum.span >> 16); + Pxx2Transport::addByte(reusableBuffer.spectrum.span >> 24); - uint32_t step = 100000; // 100KHz - Pxx2Transport::addByte(step); - Pxx2Transport::addByte(step >> 8); - Pxx2Transport::addByte(step >> 16); - Pxx2Transport::addByte(step >> 24); + reusableBuffer.spectrum.step = 100000; // 100KHz + Pxx2Transport::addByte(reusableBuffer.spectrum.step); + Pxx2Transport::addByte(reusableBuffer.spectrum.step >> 8); + Pxx2Transport::addByte(reusableBuffer.spectrum.step >> 16); + Pxx2Transport::addByte(reusableBuffer.spectrum.step >> 24); return true; } From 10f29ef277de3f108fc0663ca6cb4062927b695a Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 7 Feb 2019 14:12:22 +0100 Subject: [PATCH 113/446] Improve spectrum --- radio/src/gui/128x64/radio_spectrum.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp index df09b151a..8ad2b6021 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/128x64/radio_spectrum.cpp @@ -44,12 +44,12 @@ void menuRadioSpectrum(event_t event) } lcdDrawText(1,10, "F:", 0); lcdDrawNumber(lcdLastRightPos, 10, reusableBuffer.spectrum.fq/10000000,PREC2); - lcdDrawText(lcdLastRightPos, 10, "GHz"); + lcdDrawText(lcdLastRightPos, 10, "GHz", 0); lcdDrawText(1,10+FH, "S:", 0); - lcdDrawNumber(lcdLastRightPos, 10+FH, reusableBuffer.spectrum.span/1000000,0); - lcdDrawText(lcdLastRightPos, 10+FH, "MHz"); + lcdDrawNumber(lcdLastRightPos, 10+FH, reusableBuffer.spectrum.span/1000000, 0); + lcdDrawText(lcdLastRightPos, 10+FH, "MHz", 0); - lcdDrawText(80,10, "P:", 0); - lcdDrawNumber(lcdLastRightPos, 10, ((reusableBuffer.spectrum.fq - reusableBuffer.spectrum.span/2) + peak_x * (reusableBuffer.spectrum.span / 128)) / 10000000,PREC2); - lcdDrawText(lcdLastRightPos, 10, "GHz"); + + lcdDrawNumber(min(int(100), (int)peak_x), max((int) 0 , (int)(LCD_H-peak-FH)), ((reusableBuffer.spectrum.fq - reusableBuffer.spectrum.span/2) + peak_x * (reusableBuffer.spectrum.span / 128)) / 10000000,TINSIZE|PREC2); + lcdDrawText(lcdLastRightPos, max((int) 0 , (int)(LCD_H-peak-FH)), "GHz", TINSIZE); } From c5589b57bfdaf472c991abb10c60e1a565865a81 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Feb 2019 14:54:03 +0100 Subject: [PATCH 114/446] Cosmetics --- radio/src/gui/128x64/radio_spectrum.cpp | 26 +++++++++++++------------ radio/src/pulses/pxx2.cpp | 15 +++----------- radio/src/pulses/pxx2.h | 8 ++++++++ 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp index 8ad2b6021..04dd02ab1 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/128x64/radio_spectrum.cpp @@ -32,24 +32,26 @@ void menuRadioSpectrum(event_t event) moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_SPECTRUM_ANALYSER; } - uint8_t peak=1; - uint32_t peak_x=0; + uint8_t peak_y = 1; + uint8_t peak_x = 0; for (uint8_t i=0; i peak) { + if (h > peak_y) { peak_x = i; - peak=h; + peak_y = h; } lcdDrawSolidVerticalLine(i, LCD_H - h, h); } - lcdDrawText(1,10, "F:", 0); - lcdDrawNumber(lcdLastRightPos, 10, reusableBuffer.spectrum.fq/10000000,PREC2); - lcdDrawText(lcdLastRightPos, 10, "GHz", 0); - lcdDrawText(1,10+FH, "S:", 0); - lcdDrawNumber(lcdLastRightPos, 10+FH, reusableBuffer.spectrum.span/1000000, 0); - lcdDrawText(lcdLastRightPos, 10+FH, "MHz", 0); + lcdDrawText(1, 10, "F:", 0); + lcdDrawNumber(lcdLastRightPos + 2, 10, reusableBuffer.spectrum.fq/10000000,PREC2); + lcdDrawText(lcdLastRightPos + 2, 10, "GHz", 0); - lcdDrawNumber(min(int(100), (int)peak_x), max((int) 0 , (int)(LCD_H-peak-FH)), ((reusableBuffer.spectrum.fq - reusableBuffer.spectrum.span/2) + peak_x * (reusableBuffer.spectrum.span / 128)) / 10000000,TINSIZE|PREC2); - lcdDrawText(lcdLastRightPos, max((int) 0 , (int)(LCD_H-peak-FH)), "GHz", TINSIZE); + lcdDrawText(1, 10+FH, "S:", 0); + lcdDrawNumber(lcdLastRightPos + 2, 10+FH, reusableBuffer.spectrum.span/1000000, 0); + lcdDrawText(lcdLastRightPos + 2, 10+FH, "MHz", 0); + + int8_t y = max(FH, LCD_H - peak_y - FH); + lcdDrawNumber(min(100, peak_x), y, ((reusableBuffer.spectrum.fq - reusableBuffer.spectrum.span / 2) + peak_x * (reusableBuffer.spectrum.span / 128)) / 1000000, TINSIZE); + lcdDrawText(lcdLastRightPos, y, "M", TINSIZE); } diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index e75c339e5..0c3188828 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -105,22 +105,13 @@ bool Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) Pxx2Transport::addByte(0x00); reusableBuffer.spectrum.fq = 2440000000; // 2440MHz - Pxx2Transport::addByte(reusableBuffer.spectrum.fq); - Pxx2Transport::addByte(reusableBuffer.spectrum.fq >> 8); - Pxx2Transport::addByte(reusableBuffer.spectrum.fq >> 16); - Pxx2Transport::addByte(reusableBuffer.spectrum.fq >> 24); + Pxx2Transport::addWord(reusableBuffer.spectrum.fq); reusableBuffer.spectrum.span = 40000000; // 40MHz - Pxx2Transport::addByte(reusableBuffer.spectrum.span); - Pxx2Transport::addByte(reusableBuffer.spectrum.span >> 8); - Pxx2Transport::addByte(reusableBuffer.spectrum.span >> 16); - Pxx2Transport::addByte(reusableBuffer.spectrum.span >> 24); + Pxx2Transport::addWord(reusableBuffer.spectrum.span); reusableBuffer.spectrum.step = 100000; // 100KHz - Pxx2Transport::addByte(reusableBuffer.spectrum.step); - Pxx2Transport::addByte(reusableBuffer.spectrum.step >> 8); - Pxx2Transport::addByte(reusableBuffer.spectrum.step >> 16); - Pxx2Transport::addByte(reusableBuffer.spectrum.step >> 24); + Pxx2Transport::addWord(reusableBuffer.spectrum.step); return true; } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 87a831a3a..44c5d103b 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -111,6 +111,14 @@ class SportCrcMixin { class Pxx2Transport: public DataBuffer, public PxxCrcMixin { protected: + void addWord(uint32_t word) + { + addByte(word); + addByte(word >> 8); + addByte(word >> 16); + addByte(word >> 24); + } + void addByte(uint8_t byte) { PxxCrcMixin::addToCrc(byte); From 27601c3f18b083a760a9362e1ec9507aa394b76b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Feb 2019 16:18:03 +0100 Subject: [PATCH 115/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 60 ++++++++++++++-------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 81e3192f9..905aad9ff 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -274,7 +274,9 @@ void menuModelSetup(event_t event) MENU_TAB({ HEADER_LINE_COLUMNS 0, - TIMER_ROWS, TIMER_ROWS, TIMER_ROWS, + TIMER_ROWS, + TIMER_ROWS, + TIMER_ROWS, 0, // Extended limits 1, // Extended trims 0, // Show trims @@ -283,38 +285,38 @@ void menuModelSetup(event_t event) 0, // Throttle trace source 0, // Throttle trim LABEL(PreflightCheck), - 0, // Checklist - 0, // Throttle warning - SW_WARN_ROWS, // Switch warning - POT_WARN_ITEMS(), // Pot warning - NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_ROTARY_ENCODERS - 1, // Center beeps + 0, // Checklist + 0, // Throttle warning + SW_WARN_ROWS, // Switch warning + POT_WARN_ITEMS(), // Pot warning + NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_ROTARY_ENCODERS - 1, // Center beeps 0, // Global functions PXX2_LEN_REGISTRATION_ID - 1, // Registration ID LABEL(InternalModule), - INTERNAL_MODULE_MODE_ROWS, - IF_INTERNAL_MODULE_ON((uint8_t)0), // Model Number - IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe - IF_INTERNAL_MODULE_ON((uint8_t)1), // Range check and receiver register - ANTENNA_ROW - IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Number - IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Range - IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Telemetry - IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)1), // Receiver Bind/Delete - IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Number - IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Range - IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Telemetry - IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)1), // Receiver Bind/Delete - IF_INTERNAL_MODULE_ON(INTERNAL_MODULE_ADD_RECEIVER_ROW), + INTERNAL_MODULE_MODE_ROWS, + IF_INTERNAL_MODULE_ON((uint8_t)0), // Model Number + IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe + IF_INTERNAL_MODULE_ON((uint8_t)1), // Range check and receiver register + ANTENNA_ROW + IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Number + IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Range + IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Telemetry + IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)1), // Receiver Bind/Delete + IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Number + IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Range + IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Telemetry + IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)1), // Receiver Bind/Delete + IF_INTERNAL_MODULE_ON(INTERNAL_MODULE_ADD_RECEIVER_ROW), LABEL(ExternalModule), - EXTERNAL_MODULE_MODE_ROWS, - MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) - MULTIMODULE_STATUS_ROWS - EXTERNAL_MODULE_CHANNELS_ROWS, - EXTERNAL_MODULE_BIND_ROWS(), - OUTPUT_TYPE_ROWS() - EXTERNAL_MODULE_OPTION_ROW, - MULTIMODULE_MODULE_ROWS - EXTERNAL_MODULE_POWER_ROW, + EXTERNAL_MODULE_MODE_ROWS, + MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) + MULTIMODULE_STATUS_ROWS + EXTERNAL_MODULE_CHANNELS_ROWS, + EXTERNAL_MODULE_BIND_ROWS(), + OUTPUT_TYPE_ROWS() + EXTERNAL_MODULE_OPTION_ROW, + MULTIMODULE_MODULE_ROWS + EXTERNAL_MODULE_POWER_ROW, EXTRA_MODULE_ROWS FAILSAFE_ROWS(EXTERNAL_MODULE), TRAINER_ROWS }); From 89bdf9085be51812427ac5edabf4686d7cbb1887 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Feb 2019 17:27:21 +0100 Subject: [PATCH 116/446] Fixes for X7 --- radio/src/gui/128x64/menus.h | 4 ++++ radio/src/gui/128x64/radio_spectrum.cpp | 2 +- radio/src/pulses/crossfire.cpp | 21 ++++++++++++++++ radio/src/pulses/pulses.cpp | 24 ++++--------------- radio/src/pulses/pulses.h | 13 +++++----- .../arm/stm32/intmodule_serial_driver.cpp | 2 +- radio/src/targets/taranis/CMakeLists.txt | 14 +++++++++-- radio/src/targets/taranis/board.h | 2 +- .../taranis/intmodule_pulses_driver.cpp | 10 ++++++++ 9 files changed, 61 insertions(+), 31 deletions(-) diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index 09b3e0981..0e79d72a0 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -79,7 +79,9 @@ enum MenuRadioIndexes MENU_RADIO_SWITCHES_TEST, MENU_RADIO_ANALOGS_TEST, MENU_RADIO_HARDWARE, +#if defined(RADIO_SPECTRUM) MENU_RADIO_SPECTRUM, +#endif MENU_RADIO_CALIBRATION, MENU_RADIO_PAGES_COUNT }; @@ -104,7 +106,9 @@ static const MenuHandlerFunc menuTabGeneral[] = { menuRadioDiagKeys, menuRadioDiagAnalogs, menuRadioHardware, +#if defined(RADIO_SPECTRUM) menuRadioSpectrum, +#endif menuRadioCalibration }; diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp index 04dd02ab1..91a65c1c3 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/128x64/radio_spectrum.cpp @@ -22,7 +22,7 @@ void menuRadioSpectrum(event_t event) { - MENU("SPECTRUM ANALYSER", menuTabGeneral, MENU_RADIO_SPECTRUM, HEADER_LINE, { HEADER_LINE_COLUMNS }); + SIMPLE_MENU("SPECTRUM ANALYSER", menuTabGeneral, MENU_RADIO_SPECTRUM, 1); if (menuEvent) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; diff --git a/radio/src/pulses/crossfire.cpp b/radio/src/pulses/crossfire.cpp index 6f8876913..ba3781461 100644 --- a/radio/src/pulses/crossfire.cpp +++ b/radio/src/pulses/crossfire.cpp @@ -46,3 +46,24 @@ uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses) *buf++ = crc8(crc_start, 23); return buf - frame; } + +void setupPulsesCrossfire(uint8_t module) +{ + if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) { + uint8_t * crossfire = modulePulsesData[module].crossfire.pulses; + uint8_t len; +#if defined(LUA) + if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { + memcpy(crossfire, outputTelemetryBuffer, outputTelemetryBufferSize); + len = outputTelemetryBufferSize; + outputTelemetryBufferTrigger = 0x00; + outputTelemetryBufferSize = 0; + } + else +#endif + { + len = createCrossfireChannelsFrame(crossfire, &channelOutputs[g_model.moduleData[module].channelsStart]); + } + sportSendBuffer(crossfire, len); + } +} diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 61eb25e06..d08fdbeb0 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -140,7 +140,7 @@ void setupPulsesPXX2(uint8_t module) { if (module == INTERNAL_MODULE) { if (modulePulsesData[module].pxx2.setupFrame(module)) { - intmoduleSendNextFrame(); + intmoduleSendNextPXX2Frame(); } } @@ -246,7 +246,7 @@ void enablePulses(uint8_t port, uint8_t protocol) } } -void sendPulses(uint8_t port, uint8_t protocol) +void setupPulses(uint8_t port, uint8_t protocol) { switch (protocol) { case PROTOCOL_CHANNELS_PXX: @@ -270,23 +270,7 @@ void sendPulses(uint8_t port, uint8_t protocol) #if defined(CROSSFIRE) case PROTOCOL_CHANNELS_CROSSFIRE: - if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) { - uint8_t * crossfire = modulePulsesData[port].crossfire.pulses; - uint8_t len; -#if defined(LUA) - if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { - memcpy(crossfire, outputTelemetryBuffer, outputTelemetryBufferSize); - len = outputTelemetryBufferSize; - outputTelemetryBufferTrigger = 0x00; - outputTelemetryBufferSize = 0; - } - else -#endif - { - len = createCrossfireChannelsFrame(crossfire, &channelOutputs[g_model.moduleData[port].channelsStart]); - } - sportSendBuffer(crossfire, len); - } + setupPulsesCrossfire(port); scheduleNextMixerCalculation(port, CROSSFIRE_PERIOD); break; #endif @@ -328,7 +312,7 @@ void setupPulses(uint8_t module) enablePulses(module, required_protocol); } else { - sendPulses(module, required_protocol); + setupPulses(module, required_protocol); } } diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index a1b47697c..10ab978b3 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -161,12 +161,13 @@ union TrainerPulsesData { extern TrainerPulsesData trainerPulsesData; -void setupPulses(uint8_t port); -void setupPulsesDSM2(uint8_t port); -void setupPulsesMultimodule(uint8_t port); -void setupPulsesSbus(uint8_t port); -void setupPulsesPXX(uint8_t port); -void setupPulsesPPMModule(uint8_t port); +void setupPulses(uint8_t module); +void setupPulsesDSM2(uint8_t module); +void setupPulsesCrossfire(uint8_t module); +void setupPulsesMultimodule(uint8_t module); +void setupPulsesSbus(uint8_t module); +void setupPulsesPXX(uint8_t module); +void setupPulsesPPMModule(uint8_t module); void setupPulsesPPMTrainer(); void sendByteDsm2(uint8_t b); void putDsm2Flush(); diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index a4b607191..9daf81f85 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -94,7 +94,7 @@ extern "C" void INTMODULE_USART_IRQHandler(void) } } -void intmoduleSendNextFrame() +void intmoduleSendNextPXX2Frame() { if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { DMA_InitTypeDef DMA_InitStructure; diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index cf19160f3..5a5f0ca88 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -116,6 +116,7 @@ elseif(PCB STREQUAL XLITES) set(FONTS_TARGET 9x_fonts_1bit) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) + set(RADIO_SPECTRUM YES) endif() if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES) @@ -168,14 +169,15 @@ endif() add_definitions(-DPCBTARANIS) add_definitions(-DAUDIO -DVOICE -DRTCLOCK) -set(GUI_SRC ${GUI_SRC} +set(GUI_SRC + ${GUI_SRC} model_input_edit.cpp model_mix_edit.cpp model_display.cpp radio_diagkeys.cpp radio_diaganas.cpp radio_hardware.cpp - radio_spectrum.cpp + view_channels.cpp view_telemetry.cpp view_about.cpp @@ -183,6 +185,14 @@ set(GUI_SRC ${GUI_SRC} ../screenshot.cpp ) +if(RADIO_SPECTRUM) + add_definitions(-DRADIO_SPECTRUM) + set(GUI_SRC + ${GUI_SRC} + radio_spectrum.cpp + ) +endif() + if(PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) set(LED_DRIVER led_driver.cpp) endif() diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 89905bd43..69dec7440 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -184,7 +184,7 @@ void init_no_pulses(uint8_t module); void disable_no_pulses(uint8_t module); void init_ppm(uint8_t module); void disable_ppm(uint8_t module); -void intmoduleSendNextFrame(); +void intmoduleSendNextPXX2Frame(); void init_pxx2(uint8_t module); void disable_pxx2(uint8_t module); void init_pxx(uint8_t module); diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index b2b7182dc..dbc267146 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -92,6 +92,16 @@ void intmoduleSendNextFrame() } } +void intmodulePxx2Start() +{ + // TODO +} + +void intmoduleSendNextPXX2Frame() +{ + // TODO +} + void intmodulePxxStart() { INTERNAL_MODULE_ON(); From 51d67079a9a6b779b6c3da479936b8e3f82278a4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Feb 2019 18:08:44 +0100 Subject: [PATCH 117/446] Fixes for X7 --- radio/src/definitions.h | 2 + radio/src/gui/128x64/model_setup.cpp | 81 +++++++++++++---------- radio/src/gui/480x272/themes/darkblue.cpp | 6 +- radio/src/targets/taranis/CMakeLists.txt | 4 +- radio/src/targets/taranis/board.cpp | 4 +- radio/src/targets/taranis/board.h | 26 ++++++-- 6 files changed, 76 insertions(+), 47 deletions(-) diff --git a/radio/src/definitions.h b/radio/src/definitions.h index e921389f9..8b5f5391e 100644 --- a/radio/src/definitions.h +++ b/radio/src/definitions.h @@ -22,6 +22,8 @@ #define _DEFINITIONS_H_ #include +#include +#include #if !defined(UNUSED) #define UNUSED(x) ((void)(x)) /* to avoid warnings */ diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 905aad9ff..411d8a4d3 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -77,7 +77,7 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_MODEL_NUM, ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_INTERNAL_MODULE_RANGE_REG, -#if defined(PCBXLITE) || defined(PCBXLITES) +#if defined(EXTERNAL_ANTENNA) ITEM_MODEL_INTERNAL_MODULE_ANTENNA, #endif ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_NUMBER, @@ -110,12 +110,12 @@ enum MenuModelSetupItems { #if !defined(PCBXLITE) ITEM_MODEL_EXTERNAL_MODULE_FREQ, #endif + ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, ITEM_MODEL_EXTRA_MODULE_BIND, #endif - ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, #if defined(PCBX7) ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, @@ -124,7 +124,7 @@ enum MenuModelSetupItems { #endif ITEM_MODEL_TRAINER_CHANNELS, ITEM_MODEL_TRAINER_PARAMS, -#elif defined(PCBXLITE) || defined(PCBXLITES) +#elif defined(PCBXLITE) ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_BLUETOOTH, @@ -144,6 +144,8 @@ enum MenuModelSetupItems { #define MODEL_SETUP_RANGE_OFS 4*FW+3 #define MODEL_SETUP_SET_FAILSAFE_OFS 7*FW-2 +#define IF_PXX2(x) (IS_PXX2_ENABLED() ? (uint8_t)(x) : HIDDEN_ROW) + #if defined(PCBTARANIS) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) #define CURRENT_RECEIVER_EDITED(k) (k >= ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_NUMBER ? 1 : 0) @@ -161,30 +163,36 @@ enum MenuModelSetupItems { #else #define SW_WARN_ROWS uint8_t(NAVIGATION_LINE_BY_LINE|(getSwitchWarningsCount()-1)), uint8_t(getSwitchWarningsCount() > 5 ? TITLE_ROW : HIDDEN_ROW) #endif -#if !defined(TARANIS_INTERNAL_PPM) - #define INTERNAL_MODULE_MODE_ROWS 0 // (OFF / RF protocols) -#else + +#if defined(TARANIS_INTERNAL_PPM) #define INTERNAL_MODULE_MODE_ROWS (isModuleXJT(INTERNAL_MODULE) ? (uint8_t)1 : (uint8_t)0) // Module type + RF protocols +#else + #define INTERNAL_MODULE_MODE_ROWS 0 // (OFF / RF protocols) #endif - #define IF_INTERNAL_MODULE_ON(x) (IS_INTERNAL_MODULE_ENABLED()? (uint8_t)(x) : HIDDEN_ROW ) - #define IF_EXTERNAL_MODULE_ON(x) (IS_EXTERNAL_MODULE_ENABLED()? (uint8_t)(x) : HIDDEN_ROW) - #define EXTERNAL_MODULE_BIND_ROWS() ((isModuleXJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) || isModuleSBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (isModulePPM(EXTERNAL_MODULE) || isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW + +#define IF_INTERNAL_MODULE_ON(x) (IS_INTERNAL_MODULE_ENABLED()? (uint8_t)(x) : HIDDEN_ROW ) +#define IF_EXTERNAL_MODULE_ON(x) (IS_EXTERNAL_MODULE_ENABLED()? (uint8_t)(x) : HIDDEN_ROW) +#define EXTERNAL_MODULE_BIND_ROWS() ((isModuleXJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) || isModuleSBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (isModulePPM(EXTERNAL_MODULE) || isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW #if defined(PCBSKY9X) && defined(REVX) #define OUTPUT_TYPE_ROWS() (isModulePPM(EXTERNAL_MODULE) ? (uint8_t)0 : HIDDEN_ROW) , #else #define OUTPUT_TYPE_ROWS() #endif - #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) + +#define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) + #if defined(PCBXLITE) #define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 #else #define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 #endif - #define CURSOR_ON_CELL (true) - #define MODEL_SETUP_MAX_LINES (HEADER_LINE+ITEM_MODEL_SETUP_MAX) - #define POT_WARN_ITEMS() ((g_model.potsWarnMode) ? (uint8_t)(NUM_POTS+NUM_SLIDERS) : (uint8_t)0) - #define TIMER_ROWS 2, 0, 0, 0, 0 + +#define CURSOR_ON_CELL (true) +#define MODEL_SETUP_MAX_LINES (HEADER_LINE+ITEM_MODEL_SETUP_MAX) +#define POT_WARN_ITEMS() ((g_model.potsWarnMode) ? (uint8_t)(NUM_POTS+NUM_SLIDERS) : (uint8_t)0) +#define TIMER_ROWS 2, 0, 0, 0, 0 + #if defined(PCBSKY9X) && !defined(REVA) #define EXTRA_MODULE_ROWS LABEL(ExtraModule), 1, 2, #elif defined(PCBXLITE) @@ -194,17 +202,17 @@ enum MenuModelSetupItems { #endif #if defined(PCBX7) -#define ANTENNA_ROW -#if defined(BLUETOOTH) - #define TRAINER_BLUETOOTH_M_ROW ((bluetoothDistantAddr[0] == '\0' || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) - #define TRAINER_BLUETOOTH_S_ROW (bluetoothDistantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) - #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)), -#else - #define TRAINER_BLUETOOTH_ROW -#endif -#define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) -#define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) -#define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW + #define ANTENNA_ROW + #if defined(BLUETOOTH) + #define TRAINER_BLUETOOTH_M_ROW ((bluetoothDistantAddr[0] == '\0' || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) + #define TRAINER_BLUETOOTH_S_ROW (bluetoothDistantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) + #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)), + #else + #define TRAINER_BLUETOOTH_ROW + #endif + #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) + #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW #elif defined(PCBXLITES) #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), #define TRAINER_BLUETOOTH_ROW @@ -223,7 +231,6 @@ enum MenuModelSetupItems { #define TRAINER_ROWS #endif - void onPXX2BindMenu(const char * result) { reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index = (result - reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]) / sizeof(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]); @@ -260,7 +267,7 @@ void onBindMenu(const char * result) void menuModelSetup(event_t event) { -#if defined(PCBXLITE) || defined(PCBXLITES) +#if defined(EXTERNAL_ANTENNA) // Switch to external antenna confirmation if (warningResult) { warningResult = 0; @@ -284,14 +291,17 @@ void menuModelSetup(event_t event) 0, // Throttle reverse 0, // Throttle trace source 0, // Throttle trim + LABEL(PreflightCheck), 0, // Checklist 0, // Throttle warning SW_WARN_ROWS, // Switch warning POT_WARN_ITEMS(), // Pot warning - NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_ROTARY_ENCODERS - 1, // Center beeps + + NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_ROTARY_ENCODERS - 1, // Center beeps 0, // Global functions - PXX2_LEN_REGISTRATION_ID - 1, // Registration ID + IF_PXX2(PXX2_LEN_REGISTRATION_ID - 1), // Registration ID + LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, IF_INTERNAL_MODULE_ON((uint8_t)0), // Model Number @@ -307,6 +317,7 @@ void menuModelSetup(event_t event) IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Telemetry IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)1), // Receiver Bind/Delete IF_INTERNAL_MODULE_ON(INTERNAL_MODULE_ADD_RECEIVER_ROW), + LABEL(ExternalModule), EXTERNAL_MODULE_MODE_ROWS, MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) @@ -317,9 +328,10 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, - EXTRA_MODULE_ROWS - FAILSAFE_ROWS(EXTERNAL_MODULE), - TRAINER_ROWS }); + FAILSAFE_ROWS(EXTERNAL_MODULE), + + TRAINER_ROWS + }); #else MENU_TAB({ HEADER_LINE_COLUMNS 0, TIMER_ROWS, TIMER_ROWS, TIMER_ROWS, 0, 1, 0, 0, 0, 0, 0, LABEL(PreflightCheck), 0, 0, NUM_SWITCHES-1, NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_ROTARY_ENCODERS-1, 0, LABEL(ExternalModule), @@ -332,9 +344,10 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, - EXTRA_MODULE_ROWS FAILSAFE_ROWS(EXTERNAL_MODULE), - TRAINER_ROWS }); + EXTRA_MODULE_ROWS + TRAINER_ROWS + }); #endif MENU_CHECK(menuTabModel, MENU_MODEL_SETUP, HEADER_LINE+MODEL_SETUP_MAX_LINES); diff --git a/radio/src/gui/480x272/themes/darkblue.cpp b/radio/src/gui/480x272/themes/darkblue.cpp index 24cf4616b..9d2e1cbdb 100644 --- a/radio/src/gui/480x272/themes/darkblue.cpp +++ b/radio/src/gui/480x272/themes/darkblue.cpp @@ -136,12 +136,10 @@ class DarkblueTheme: public Theme delete calibHorus; #if defined(PCBX10) - if(STICKS_PWM_ENABLED()) { + if (STICKS_PWM_ENABLED()) calibHorus = BitmapBuffer::load(getThemePath("X10S.bmp")); - } - else { + else calibHorus = BitmapBuffer::load(getThemePath("X10.bmp")); - } #else calibHorus = BitmapBuffer::load(getThemePath("horus.bmp")); #endif diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 5a5f0ca88..66e8e5d6c 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -89,7 +89,7 @@ elseif(PCB STREQUAL XLITE) set(HAPTIC YES) set(LUA_EXPORT lua_export_xlite) set(FLAVOUR xlite) - add_definitions(-DPCBXLITE -DSOFTWARE_VOLUME) + add_definitions(-DPCBXLITE -DSOFTWARE_VOLUME -DEXTERNAL_ANTENNA -DSTICKS_PWM) add_definitions(-DEEPROM_VARIANT=0x2000) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(GUI_DIR 128x64) @@ -107,7 +107,7 @@ elseif(PCB STREQUAL XLITES) set(HAPTIC YES) set(LUA_EXPORT lua_export_xlite) set(FLAVOUR xlites) - add_definitions(-DPCBXLITES -DPCBXLITE -DSOFTWARE_VOLUME) + add_definitions(-DPCBXLITES -DPCBXLITE -DSOFTWARE_VOLUME -DEXTERNAL_ANTENNA -DSTICKS_PWM) add_definitions(-DEEPROM_VARIANT=0x1000) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(GUI_DIR 128x64) diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index b0982942e..7b029daf8 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -29,6 +29,8 @@ extern "C" { } #endif +HardwareOptions hardwareOptions; + void watchdogInit(unsigned int duration) { IWDG->KR = 0x5555; // Unlock registers @@ -180,7 +182,7 @@ void boardInit() sticksPwmInit(); delay_ms(20); if (pwm_interrupt_count < 32) { - sticks_pwm_disabled = true; + hardwareOptions.sticksPwmDisabled = true; } #endif diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 69dec7440..3063e44d4 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -21,8 +21,7 @@ #ifndef _BOARD_H_ #define _BOARD_H_ -#include "stddef.h" -#include "stdbool.h" +#include "definitions.h" #if defined(__cplusplus) && !defined(SIMU) extern "C" { @@ -446,18 +445,33 @@ enum Analogs { #define NUM_MOUSE_ANALOGS 0 #define NUM_DUMMY_ANAS 0 -#if defined(PCBXLITE) +PACK(typedef struct { +#if defined(STICKS_PWM) + uint8_t sticksPwmDisabled:1; +#endif + uint8_t pxx2Enabled:1; +}) HardwareOptions; + +extern HardwareOptions hardwareOptions; + +#if defined(STICKS_PWM) #define NUM_PWMSTICKS 4 - extern bool sticks_pwm_disabled; - #define STICKS_PWM_ENABLED() (sticks_pwm_disabled == false) + + #define STICKS_PWM_ENABLED() (!hardwareOptions.sticksPwmDisabled) void sticksPwmInit(void); void sticksPwmRead(uint16_t * values); - extern volatile uint32_t pwm_interrupt_count; + extern volatile uint32_t pwm_interrupt_count; // TODO => reusable buffer (boot section) #define NUM_TRIMS_KEYS 4 #else #define NUM_TRIMS_KEYS 8 #endif +#if defined(PCBXLITES) + #define IS_PXX2_ENABLED() (true) +#else + #define IS_PXX2_ENABLED() (hardwareOptions.pxx2Enabled) +#endif + enum CalibratedAnalogs { CALIBRATED_STICK1, CALIBRATED_STICK2, From d4ec909875ef6e8d603d34e95603469cf8293196 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 8 Feb 2019 07:42:10 +0100 Subject: [PATCH 118/446] Improve spectrum (no more audio warning !) --- radio/src/gui/128x64/radio_spectrum.cpp | 2 +- radio/src/opentx.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp index 91a65c1c3..c10229267 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/128x64/radio_spectrum.cpp @@ -35,7 +35,7 @@ void menuRadioSpectrum(event_t event) uint8_t peak_y = 1; uint8_t peak_x = 0; for (uint8_t i=0; i> 1; if (h > peak_y) { peak_x = i; peak_y = h; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 9a116ab75..dc65138a8 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1488,9 +1488,9 @@ void doMixerCalculations() static uint8_t countRangecheck = 0; for (uint8_t i=0; i= 250) { countRangecheck = 0; From 7b58cc2e695ef695570d3486deeec062dd3a4a69 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Feb 2019 09:00:02 +0100 Subject: [PATCH 119/446] Fixes for X7 --- radio/src/gui/128x64/model_setup.cpp | 111 +++++++++++++++------------ radio/src/gui/gui_common_arm.cpp | 7 +- radio/src/myeeprom.h | 2 + radio/src/targets/taranis/board.h | 3 +- radio/src/translations/en.h.txt | 2 +- 5 files changed, 71 insertions(+), 54 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 411d8a4d3..60df48ece 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -74,22 +74,24 @@ enum MenuModelSetupItems { #if defined(PCBTARANIS) ITEM_MODEL_INTERNAL_MODULE_LABEL, ITEM_MODEL_INTERNAL_MODULE_MODE, - ITEM_MODEL_INTERNAL_MODULE_MODEL_NUM, - ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, - ITEM_MODEL_INTERNAL_MODULE_RANGE_REG, + ITEM_MODEL_INTERNAL_MODULE_NPXX2_CHANNELS, + ITEM_MODEL_INTERNAL_MODULE_NPXX2_BIND, + ITEM_MODEL_INTERNAL_MODULE_PXX2_MODEL_NUM, #if defined(EXTERNAL_ANTENNA) ITEM_MODEL_INTERNAL_MODULE_ANTENNA, #endif - ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_NUMBER, - ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_RANGE, - ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_TELEM, - ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_BIND, - ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_NUMBER, - ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_RANGE, - ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_TELEM, - ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_BIND, - ITEM_MODEL_INTERNAL_MODULE_ADD_RECEIVER, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NUMBER, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_RANGE, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NUMBER, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_RANGE, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND, + ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER, #endif + ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_EXTERNAL_MODULE_LABEL, ITEM_MODEL_EXTERNAL_MODULE_MODE, #if defined(MULTIMODULE) @@ -144,14 +146,14 @@ enum MenuModelSetupItems { #define MODEL_SETUP_RANGE_OFS 4*FW+3 #define MODEL_SETUP_SET_FAILSAFE_OFS 7*FW-2 -#define IF_PXX2(x) (IS_PXX2_ENABLED() ? (uint8_t)(x) : HIDDEN_ROW) +#define IF_PXX2(xxx) (IS_PXX2_ENABLED() ? (uint8_t)(xxx) : HIDDEN_ROW) +#define IF_NOT_PXX2(xxx) (IS_PXX2_ENABLED() ? HIDDEN_ROW : (uint8_t)(xxx)) +#define IF_PXX2_RECEIVER_DISPLAYED(module, idx, xxx) ((IS_PXX2_ENABLED() && g_model.moduleData[module].pxx2.receivers[idx].enabled) ? (uint8_t)(xxx) : HIDDEN_ROW) #if defined(PCBTARANIS) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) - #define CURRENT_RECEIVER_EDITED(k) (k >= ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_NUMBER ? 1 : 0) + #define CURRENT_RECEIVER_EDITED(k) (k >= ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NUMBER ? 1 : 0) #define INTERNAL_MODULE_ADD_RECEIVER_ROW (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[MAX_RECEIVERS_PER_MODULE-1].enabled ? HIDDEN_ROW : (uint8_t)0) - #define IF_INTERNAL_MODULE_RECEIVER_1_ON(x) (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled ? (uint8_t)(x) : HIDDEN_ROW) - #define IF_INTERNAL_MODULE_RECEIVER_2_ON(x) (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1].enabled ? (uint8_t)(x) : HIDDEN_ROW) #elif defined(PCBSKY9X) && !defined(REVA) #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) #else @@ -184,8 +186,10 @@ enum MenuModelSetupItems { #if defined(PCBXLITE) #define EXTERNAL_MODULE_MODE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 + #define EXTERNAL_MODULE_FREQ_ROW #else #define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 + #define EXTERNAL_MODULE_FREQ_ROW isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW, #endif #define CURSOR_ON_CELL (true) @@ -195,10 +199,8 @@ enum MenuModelSetupItems { #if defined(PCBSKY9X) && !defined(REVA) #define EXTRA_MODULE_ROWS LABEL(ExtraModule), 1, 2, -#elif defined(PCBXLITE) - #define EXTRA_MODULE_ROWS #else - #define EXTRA_MODULE_ROWS isR9MMFlex(EXTERNAL_MODULE) ? (uint8_t)1: (uint8_t)HIDDEN_ROW, + #define EXTRA_MODULE_ROWS #endif #if defined(PCBX7) @@ -303,31 +305,34 @@ void menuModelSetup(event_t event) IF_PXX2(PXX2_LEN_REGISTRATION_ID - 1), // Registration ID LABEL(InternalModule), - INTERNAL_MODULE_MODE_ROWS, - IF_INTERNAL_MODULE_ON((uint8_t)0), // Model Number - IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe - IF_INTERNAL_MODULE_ON((uint8_t)1), // Range check and receiver register + INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None) + IF_NOT_PXX2(IF_INTERNAL_MODULE_ON(1)), // Channels min and count + IF_NOT_PXX2(IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), + IF_PXX2(0), // Model Number ANTENNA_ROW - IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Number - IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Range - IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)0), // Receiver Telemetry - IF_INTERNAL_MODULE_RECEIVER_1_ON((uint8_t)1), // Receiver Bind/Delete - IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Number - IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Range - IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)0), // Receiver Telemetry - IF_INTERNAL_MODULE_RECEIVER_2_ON((uint8_t)1), // Receiver Bind/Delete - IF_INTERNAL_MODULE_ON(INTERNAL_MODULE_ADD_RECEIVER_ROW), + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Range check and Register buttons + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Number + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Telemetry + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Delete + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Number + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Range + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Telemetry + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 1), // Receiver Bind/Delete + IF_PXX2(INTERNAL_MODULE_ADD_RECEIVER_ROW), + IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), LABEL(ExternalModule), EXTERNAL_MODULE_MODE_ROWS, MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS EXTERNAL_MODULE_CHANNELS_ROWS, - EXTERNAL_MODULE_BIND_ROWS(), + EXTERNAL_MODULE_BIND_ROWS(), // line reused for PPM: PPM settings OUTPUT_TYPE_ROWS() EXTERNAL_MODULE_OPTION_ROW, MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, + EXTERNAL_MODULE_FREQ_ROW FAILSAFE_ROWS(EXTERNAL_MODULE), TRAINER_ROWS @@ -753,12 +758,10 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_MODE: lcdDrawTextAlignedLeft(y, STR_MODE); + #warning "TR_TARANIS_PROTOCOLS changes need to be ported to all languages" lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, attr); if (attr) { - g_model.moduleData[INTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_XJT, EE_MODEL, isInternalModuleAvailable); - if (checkIncDec_Ret) { - /* ToDo : what needs to happen on module enable/disable */ - } + g_model.moduleData[INTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable); } break; #endif @@ -977,6 +980,10 @@ void menuModelSetup(event_t event) break; #endif + +#if defined(PCBTARANIS) + case ITEM_MODEL_INTERNAL_MODULE_NPXX2_CHANNELS: +#endif #if defined(PCBSKY9X) case ITEM_MODEL_EXTRA_MODULE_CHANNELS: #endif @@ -1045,7 +1052,7 @@ void menuModelSetup(event_t event) break; - case ITEM_MODEL_INTERNAL_MODULE_MODEL_NUM: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_MODEL_NUM: lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[INTERNAL_MODULE], attr | LEADING0|LEFT, 2); if (attr) { @@ -1056,14 +1063,14 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_RANGE_REG: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER: lcdDrawTextAlignedLeft(y, INDENT "Module"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, (menuHorizontalPosition==0 ? attr : 0) ); lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition==1 ? attr : 0) ); if (attr && s_editMode>0 && menuHorizontalPosition == 0 ) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; } - if(attr && menuHorizontalPosition == 1) { + if (attr && menuHorizontalPosition == 1) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { moduleSettings[INTERNAL_MODULE].mode ^= MODULE_MODE_REGISTER; } @@ -1079,7 +1086,7 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_ADD_RECEIVER: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER: lcdDrawTextAlignedLeft(y, "Receiver"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "[Add]", attr); if (attr && s_editMode>0) { @@ -1095,8 +1102,8 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_NUMBER: - case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_NUMBER: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NUMBER: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NUMBER: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); lcdDrawTextAlignedLeft(y, "Receiver"); @@ -1108,8 +1115,8 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_RANGE: - case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_RANGE: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_RANGE: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_RANGE: { // TODO have a proper channel assignement screen, section bellow is just for tests uint8_t useUpperChannels; @@ -1129,16 +1136,16 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_TELEM: - case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_TELEM: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].telemetry = editCheckBox(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].telemetry, MODEL_SETUP_2ND_COLUMN, y, INDENT "Telemetry", attr, event); } break; - case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_1_BIND: - case ITEM_MODEL_INTERNAL_MODULE_RECEIVER_2_BIND: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); lcdDrawTextAlignedLeft(y, INDENT "Receiver"); @@ -1183,6 +1190,10 @@ void menuModelSetup(event_t event) } break; #endif + +#if defined(PCBTARANIS) + case ITEM_MODEL_INTERNAL_MODULE_NPXX2_BIND: +#endif #if defined(PCBSKY9X) case ITEM_MODEL_EXTRA_MODULE_BIND: #endif @@ -1596,7 +1607,7 @@ void menuModelSetup(event_t event) if (old_editMode > 0 && s_editMode == 0) { switch(menuVerticalPosition) { #if defined(PCBTARANIS) - case ITEM_MODEL_INTERNAL_MODULE_MODEL_NUM: + case ITEM_MODEL_INTERNAL_MODULE_NPXX2_BIND: if (menuHorizontalPosition == 0) checkModelIdUnique(g_eeGeneral.currModel, INTERNAL_MODULE); break; diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index f7fc3db39..c74480158 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -517,9 +517,12 @@ bool isR9MMFlex(int module) bool isInternalModuleAvailable(int module) { - if (module == MODULE_TYPE_NONE || module == MODULE_TYPE_XJT) { + if (module == MODULE_TYPE_NONE) return true; - } + + if (module == (IS_PXX2_ENABLED() ? MODULE_TYPE_XJT2 : MODULE_TYPE_XJT)) + return true; + return false; } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 5c5f9b876..d4bd099d6 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -414,11 +414,13 @@ enum ModuleTypes { MODULE_TYPE_NONE = 0, MODULE_TYPE_PPM, MODULE_TYPE_XJT, + MODULE_TYPE_XJT2, MODULE_TYPE_DSM2, MODULE_TYPE_CROSSFIRE, MODULE_TYPE_MULTIMODULE, MODULE_TYPE_R9M, MODULE_TYPE_SBUS, + MODULE_TYPE_MAX = MODULE_TYPE_SBUS, MODULE_TYPE_COUNT }; diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 3063e44d4..64a6a4679 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -456,7 +456,6 @@ extern HardwareOptions hardwareOptions; #if defined(STICKS_PWM) #define NUM_PWMSTICKS 4 - #define STICKS_PWM_ENABLED() (!hardwareOptions.sticksPwmDisabled) void sticksPwmInit(void); void sticksPwmRead(uint16_t * values); @@ -489,7 +488,9 @@ enum CalibratedAnalogs { #else #define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST) #endif + #define IS_SLIDER(x) ((x)>POT_LAST && (x) Date: Fri, 8 Feb 2019 09:21:23 +0100 Subject: [PATCH 120/446] Fixes for X7 --- radio/src/gui/128x64/model_setup.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 60df48ece..7a4f5e728 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1087,7 +1087,7 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER: - lcdDrawTextAlignedLeft(y, "Receiver"); + lcdDrawText(INDENT_WIDTH, y, "Receiver"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "[Add]", attr); if (attr && s_editMode>0) { if (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled) { @@ -1106,11 +1106,10 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NUMBER: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - lcdDrawTextAlignedLeft(y, "Receiver"); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, receiverIdx+1); - lcdDrawChar(lcdLastRightPos, y, ':'); + lcdDrawTextAlignedLeft(y, INDENT "Receiver"); + lcdDrawNumber(lcdLastRightPos, y, receiverIdx + 1); for (uint8_t pos=0; pos Date: Fri, 8 Feb 2019 09:36:48 +0100 Subject: [PATCH 121/446] Fixes --- radio/src/opentx.cpp | 2 +- radio/src/pulses/pulses.cpp | 193 ++++++++++++++++-------------------- 2 files changed, 88 insertions(+), 107 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index dc65138a8..5fe687dd6 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -459,7 +459,7 @@ void modelDefault(uint8_t id) #endif #if defined(PCBTARANIS) || defined(PCBHORUS) - g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_XJT; + g_model.moduleData[INTERNAL_MODULE].type = IS_PXX2_ENABLED() ? MODULE_TYPE_XJT2 : MODULE_TYPE_XJT; g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); #elif defined(PCBSKY9X) g_model.moduleData[EXTERNAL_MODULE].type = MODULE_TYPE_PPM; diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index d08fdbeb0..7aa5735ec 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -31,80 +31,61 @@ TrainerPulsesData trainerPulsesData __DMA; uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses); #endif -uint8_t getRequiredProtocol(uint8_t port) +uint8_t getRequiredProtocol(uint8_t module) { uint8_t required_protocol; - switch (port) { -#if defined(PCBTARANIS) || defined(PCBHORUS) - case INTERNAL_MODULE: - switch (g_model.moduleData[INTERNAL_MODULE].type) { -#if defined(TARANIS_INTERNAL_PPM) - case MODULE_TYPE_PPM: - required_protocol = PROTOCOL_CHANNELS_PPM; - break; + switch (g_model.moduleData[module].type) { + case MODULE_TYPE_PPM: + required_protocol = PROTOCOL_CHANNELS_PPM; + break; + case MODULE_TYPE_XJT: + required_protocol = PROTOCOL_CHANNELS_PXX; + break; + case MODULE_TYPE_XJT2: + required_protocol = PROTOCOL_CHANNELS_PXX2; + break; + case MODULE_TYPE_R9M: +#if defined(PCBXLITE) + required_protocol = PROTOCOL_CHANNELS_PXX; +#else + required_protocol = PROTOCOL_CHANNELS_PXX2; #endif - case MODULE_TYPE_XJT: - required_protocol = PROTOCOL_CHANNELS_PXX2; - break; - default: - required_protocol = PROTOCOL_CHANNELS_NONE; - break; + break; + case MODULE_TYPE_SBUS: + required_protocol = PROTOCOL_CHANNELS_SBUS; + break; +#if defined(MULTIMODULE) + case MODULE_TYPE_MULTIMODULE: + required_protocol = PROTOCOL_CHANNELS_MULTIMODULE; + break; +#endif +#if defined(DSM2) + case MODULE_TYPE_DSM2: + required_protocol = limit(PROTOCOL_CHANNELS_DSM2_LP45, PROTOCOL_CHANNELS_DSM2_LP45+g_model.moduleData[module].rfProtocol, PROTOCOL_CHANNELS_DSM2_DSMX); + // The module is set to OFF during one second before BIND start + { + static tmr10ms_t bindStartTime = 0; + if (moduleSettings[module].mode == MODULE_MODE_BIND) { + if (bindStartTime == 0) bindStartTime = get_tmr10ms(); + if ((tmr10ms_t)(get_tmr10ms() - bindStartTime) < 100) { + required_protocol = PROTOCOL_CHANNELS_NONE; + break; + } + } + else { + bindStartTime = 0; + } } break; #endif - - default: - switch (g_model.moduleData[EXTERNAL_MODULE].type) { - case MODULE_TYPE_PPM: - required_protocol = PROTOCOL_CHANNELS_PPM; - break; - case MODULE_TYPE_XJT: - required_protocol = PROTOCOL_CHANNELS_PXX; - break; - case MODULE_TYPE_R9M: -#if defined(PCBXLITE) - required_protocol = PROTOCOL_CHANNELS_PXX; -#else - required_protocol = PROTOCOL_CHANNELS_PXX2; -#endif - break; - case MODULE_TYPE_SBUS: - required_protocol = PROTOCOL_CHANNELS_SBUS; - break; -#if defined(MULTIMODULE) - case MODULE_TYPE_MULTIMODULE: - required_protocol = PROTOCOL_CHANNELS_MULTIMODULE; - break; -#endif -#if defined(DSM2) - case MODULE_TYPE_DSM2: - required_protocol = limit(PROTOCOL_CHANNELS_DSM2_LP45, PROTOCOL_CHANNELS_DSM2_LP45+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, PROTOCOL_CHANNELS_DSM2_DSMX); - // The module is set to OFF during one second before BIND start - { - static tmr10ms_t bindStartTime = 0; - if (moduleSettings[EXTERNAL_MODULE].mode == MODULE_MODE_BIND) { - if (bindStartTime == 0) bindStartTime = get_tmr10ms(); - if ((tmr10ms_t)(get_tmr10ms() - bindStartTime) < 100) { - required_protocol = PROTOCOL_CHANNELS_NONE; - break; - } - } - else { - bindStartTime = 0; - } - } - break; -#endif #if defined(CROSSFIRE) - case MODULE_TYPE_CROSSFIRE: - required_protocol = PROTOCOL_CHANNELS_CROSSFIRE; - break; + case MODULE_TYPE_CROSSFIRE: + required_protocol = PROTOCOL_CHANNELS_CROSSFIRE; + break; #endif - default: - required_protocol = PROTOCOL_CHANNELS_NONE; - break; - } + default: + required_protocol = PROTOCOL_CHANNELS_NONE; break; } @@ -114,7 +95,7 @@ uint8_t getRequiredProtocol(uint8_t port) #if 0 // will need an EEPROM conversion - if (moduleSettings[port].mode == MODULE_OFF) { + if (moduleSettings[module].mode == MODULE_OFF) { required_protocol = PROTOCOL_CHANNELS_NONE; } #endif @@ -122,17 +103,17 @@ uint8_t getRequiredProtocol(uint8_t port) return required_protocol; } -void setupPulsesPXX(uint8_t port) +void setupPulsesPXX(uint8_t module) { #if defined(INTMODULE_USART) && defined(EXTMODULE_USART) - modulePulsesData[port].pxx_uart.setupFrame(port); + modulePulsesData[module].pxx_uart.setupFrame(module); #elif !defined(INTMODULE_USART) && !defined(EXTMODULE_USART) - modulePulsesData[port].pxx.setupFrame(port); + modulePulsesData[module].pxx.setupFrame(module); #else - if (IS_UART_MODULE(port)) - modulePulsesData[port].pxx_uart.setupFrame(port); + if (IS_UART_MODULE(module)) + modulePulsesData[module].pxx_uart.setupFrame(module); else - modulePulsesData[port].pxx.setupFrame(port); + modulePulsesData[module].pxx.setupFrame(module); #endif } @@ -147,57 +128,57 @@ void setupPulsesPXX2(uint8_t module) #if 0 // here we have to wait that telemetryInit() is called, hence this test if (telemetryProtocol == PROTOCOL_TELEMETRY_PXX2) { - modulePulsesData[port].pxx2.setupFrame(port); - sportSendBuffer(modulePulsesData[port].pxx2.getData(), modulePulsesData[port].pxx2.getSize()); + modulePulsesData[module].pxx2.setupFrame(module); + sportSendBuffer(modulePulsesData[module].pxx2.getData(), modulePulsesData[module].pxx2.getSize()); } #endif } -void disablePulses(uint8_t port, uint8_t protocol) +void disablePulses(uint8_t module, uint8_t protocol) { // stop existing protocol hardware switch (protocol) { case PROTOCOL_CHANNELS_PXX: - disable_pxx(port); + disable_pxx(module); break; #if defined(DSM2) case PROTOCOL_CHANNELS_DSM2_LP45: case PROTOCOL_CHANNELS_DSM2_DSM2: case PROTOCOL_CHANNELS_DSM2_DSMX: - disable_serial(port); + disable_serial(module); break; #endif #if defined(CROSSFIRE) case PROTOCOL_CHANNELS_CROSSFIRE: - disable_module_timer(port); + disable_module_timer(module); break; #endif case PROTOCOL_CHANNELS_PXX2: - disable_pxx2(port); + disable_pxx2(module); break; #if defined(MULTIMODULE) case PROTOCOL_CHANNELS_MULTIMODULE: #endif case PROTOCOL_CHANNELS_SBUS: - disable_serial(port); + disable_serial(module); break; case PROTOCOL_CHANNELS_PPM: - disable_ppm(port); + disable_ppm(module); break; default: - disable_no_pulses(port); + disable_no_pulses(module); break; } } -void enablePulses(uint8_t port, uint8_t protocol) +void enablePulses(uint8_t module, uint8_t protocol) { // start new protocol hardware here @@ -205,85 +186,85 @@ void enablePulses(uint8_t port, uint8_t protocol) switch (protocol) { case PROTOCOL_CHANNELS_PXX: - init_pxx(port); + init_pxx(module); break; #if defined(DSM2) case PROTOCOL_CHANNELS_DSM2_LP45: case PROTOCOL_CHANNELS_DSM2_DSM2: case PROTOCOL_CHANNELS_DSM2_DSMX: - init_serial(port, DSM2_BAUDRATE, DSM2_PERIOD * 2000); + init_serial(module, DSM2_BAUDRATE, DSM2_PERIOD * 2000); break; #endif #if defined(CROSSFIRE) case PROTOCOL_CHANNELS_CROSSFIRE: - init_module_timer(port, CROSSFIRE_PERIOD, true); + init_module_timer(module, CROSSFIRE_PERIOD, true); break; #endif case PROTOCOL_CHANNELS_PXX2: - init_pxx2(port); + init_pxx2(module); break; #if defined(MULTIMODULE) case PROTOCOL_CHANNELS_MULTIMODULE: - init_serial(port, MULTIMODULE_BAUDRATE, MULTIMODULE_PERIOD * 2000); + init_serial(module, MULTIMODULE_BAUDRATE, MULTIMODULE_PERIOD * 2000); break; #endif case PROTOCOL_CHANNELS_SBUS: - init_serial(port, SBUS_BAUDRATE, SBUS_PERIOD_HALF_US); + init_serial(module, SBUS_BAUDRATE, SBUS_PERIOD_HALF_US); break; case PROTOCOL_CHANNELS_PPM: - init_ppm(port); + init_ppm(module); break; default: - init_no_pulses(port); + init_no_pulses(module); break; } } -void setupPulses(uint8_t port, uint8_t protocol) +void setupPulses(uint8_t module, uint8_t protocol) { switch (protocol) { case PROTOCOL_CHANNELS_PXX: - setupPulsesPXX(port); - scheduleNextMixerCalculation(port, PXX_PERIOD); + setupPulsesPXX(module); + scheduleNextMixerCalculation(module, PXX_PERIOD); break; case PROTOCOL_CHANNELS_SBUS: - setupPulsesSbus(port); - scheduleNextMixerCalculation(port, SBUS_PERIOD); + setupPulsesSbus(module); + scheduleNextMixerCalculation(module, SBUS_PERIOD); break; #if defined(DSM2) case PROTOCOL_CHANNELS_DSM2_LP45: case PROTOCOL_CHANNELS_DSM2_DSM2: case PROTOCOL_CHANNELS_DSM2_DSMX: - setupPulsesDSM2(port); - scheduleNextMixerCalculation(port, DSM2_PERIOD); + setupPulsesDSM2(module); + scheduleNextMixerCalculation(module, DSM2_PERIOD); break; #endif #if defined(CROSSFIRE) case PROTOCOL_CHANNELS_CROSSFIRE: - setupPulsesCrossfire(port); - scheduleNextMixerCalculation(port, CROSSFIRE_PERIOD); + setupPulsesCrossfire(module); + scheduleNextMixerCalculation(module, CROSSFIRE_PERIOD); break; #endif case PROTOCOL_CHANNELS_PXX2: - setupPulsesPXX2(port); - scheduleNextMixerCalculation(port, moduleSettings[port].mode == MODULE_MODE_SPECTRUM_ANALYSER ? 1 : PXX2_PERIOD); + setupPulsesPXX2(module); + scheduleNextMixerCalculation(module, moduleSettings[module].mode == MODULE_MODE_SPECTRUM_ANALYSER ? 1 : PXX2_PERIOD); break; #if defined(MULTIMODULE) case PROTOCOL_CHANNELS_MULTIMODULE: - setupPulsesMultimodule(port); - scheduleNextMixerCalculation(port, MULTIMODULE_PERIOD); + setupPulsesMultimodule(module); + scheduleNextMixerCalculation(module, MULTIMODULE_PERIOD); break; #endif @@ -291,8 +272,8 @@ void setupPulses(uint8_t port, uint8_t protocol) #if defined(PCBSKY9X) case PROTOCOL_CHANNELS_NONE: #endif - setupPulsesPPMModule(port); - scheduleNextMixerCalculation(port, PPM_PERIOD(port)); + setupPulsesPPMModule(module); + scheduleNextMixerCalculation(module, PPM_PERIOD(module)); break; default: From e848068b9aaf13965f3efeae8c2cf10ec8e7f35d Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 8 Feb 2019 09:38:13 +0100 Subject: [PATCH 122/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 7a4f5e728..56f404daa 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1107,10 +1107,8 @@ void menuModelSetup(event_t event) { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); lcdDrawTextAlignedLeft(y, INDENT "Receiver"); - lcdDrawNumber(lcdLastRightPos, y, receiverIdx + 1); - for (uint8_t pos=0; pos Date: Fri, 8 Feb 2019 09:41:32 +0100 Subject: [PATCH 123/446] Remove warning --- radio/src/gui/128x64/model_setup.cpp | 1 - radio/src/translations/es.h.txt | 2 +- radio/src/translations/fi.h.txt | 2 +- radio/src/translations/fr.h.txt | 2 +- radio/src/translations/it.h.txt | 2 +- radio/src/translations/pl.h.txt | 2 +- radio/src/translations/pt.h.txt | 2 +- 7 files changed, 6 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 56f404daa..e106171b3 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -758,7 +758,6 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_MODE: lcdDrawTextAlignedLeft(y, STR_MODE); - #warning "TR_TARANIS_PROTOCOLS changes need to be ported to all languages" lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, attr); if (attr) { g_model.moduleData[INTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable); diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 348e7a245..93016fa40 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index aef8c7743..b127f78ac 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 1627b0279..0e674ac31 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index e0069382f..4461d0851 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 878b54012..aee19c8c4 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index aefae7e93..bf8ecb7f1 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" From 71074256ac009a2ff524aaf55bbde9a1a1f4550d Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 8 Feb 2019 09:47:26 +0100 Subject: [PATCH 124/446] Prevent overflow --- radio/src/gui/128x64/radio_spectrum.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp index c10229267..e95539ac0 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/128x64/radio_spectrum.cpp @@ -35,7 +35,7 @@ void menuRadioSpectrum(event_t event) uint8_t peak_y = 1; uint8_t peak_x = 0; for (uint8_t i=0; i> 1; + uint8_t h = min(reusableBuffer.spectrum.bars[i] >> 1, 128); if (h > peak_y) { peak_x = i; peak_y = h; From bf347c9dd3ea9f6262f18b2c5e7b42c39d6058a8 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 8 Feb 2019 09:53:04 +0100 Subject: [PATCH 125/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index e106171b3..f931f72bc 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -84,11 +84,11 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NUMBER, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_RANGE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NUMBER, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_RANGE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER, #endif ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, @@ -1140,12 +1140,12 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); for (uint8_t pos=0; pos Date: Fri, 8 Feb 2019 09:54:34 +0100 Subject: [PATCH 126/446] Display spectrum info on one line --- radio/src/gui/128x64/radio_spectrum.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp index e95539ac0..0ce576b56 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/128x64/radio_spectrum.cpp @@ -47,9 +47,9 @@ void menuRadioSpectrum(event_t event) lcdDrawNumber(lcdLastRightPos + 2, 10, reusableBuffer.spectrum.fq/10000000,PREC2); lcdDrawText(lcdLastRightPos + 2, 10, "GHz", 0); - lcdDrawText(1, 10+FH, "S:", 0); - lcdDrawNumber(lcdLastRightPos + 2, 10+FH, reusableBuffer.spectrum.span/1000000, 0); - lcdDrawText(lcdLastRightPos + 2, 10+FH, "MHz", 0); + lcdDrawText(lcdLastRightPos + 5, 10, "S:", 0); + lcdDrawNumber(lcdLastRightPos + 2, 10, reusableBuffer.spectrum.span/1000000, 0); + lcdDrawText(lcdLastRightPos + 2, 10, "MHz", 0); int8_t y = max(FH, LCD_H - peak_y - FH); lcdDrawNumber(min(100, peak_x), y, ((reusableBuffer.spectrum.fq - reusableBuffer.spectrum.span / 2) + peak_x * (reusableBuffer.spectrum.span / 128)) / 1000000, TINSIZE); From 8cd50725faac1dcfa2ea17ab30bc09e869ab7487 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Feb 2019 10:12:50 +0100 Subject: [PATCH 127/446] Taranis internal module fix --- radio/src/targets/taranis/intmodule_pulses_driver.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index dbc267146..e7ea2fc37 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -127,8 +127,9 @@ void intmodulePxxStart() INTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update INTMODULE_TIMER->CCMR2 = TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2; INTMODULE_TIMER->CR1 |= TIM_CR1_CEN; - - intmoduleSendNextFrame(); + INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + INTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms + INTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt NVIC_EnableIRQ(INTMODULE_DMA_STREAM_IRQn); NVIC_SetPriority(INTMODULE_DMA_STREAM_IRQn, 7); @@ -159,8 +160,9 @@ void intmodulePpmStart() INTMODULE_TIMER->EGR = 1; INTMODULE_TIMER->DIER = TIM_DIER_UDE; INTMODULE_TIMER->CR1 = TIM_CR1_CEN; - - intmoduleSendNextFrame(); + INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + INTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms + INTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt NVIC_EnableIRQ(INTMODULE_DMA_STREAM_IRQn); NVIC_SetPriority(INTMODULE_DMA_STREAM_IRQn, 7); From 7b5b7c6d54237fd6701ca2105499343dea6929f7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Feb 2019 10:55:11 +0100 Subject: [PATCH 128/446] Taranis external module fix --- radio/src/pulses/pulses.cpp | 10 ++++------ radio/src/pulses/pulses.h | 2 +- .../common/arm/stm32/intmodule_serial_driver.cpp | 2 +- radio/src/targets/horus/extmodule_driver.cpp | 4 ++-- radio/src/targets/taranis/board.h | 2 +- radio/src/targets/taranis/extmodule_driver.cpp | 14 ++++++++++++-- .../targets/taranis/intmodule_pulses_driver.cpp | 9 ++------- radio/src/tasks.cpp | 4 ++-- 8 files changed, 25 insertions(+), 22 deletions(-) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 7aa5735ec..954c33114 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -119,11 +119,7 @@ void setupPulsesPXX(uint8_t module) void setupPulsesPXX2(uint8_t module) { - if (module == INTERNAL_MODULE) { - if (modulePulsesData[module].pxx2.setupFrame(module)) { - intmoduleSendNextPXX2Frame(); - } - } + modulePulsesData[module].pxx2.setupFrame(module); #if 0 // here we have to wait that telemetryInit() is called, hence this test @@ -281,7 +277,7 @@ void setupPulses(uint8_t module, uint8_t protocol) } } -void setupPulses(uint8_t module) +bool setupPulses(uint8_t module) { uint8_t required_protocol = getRequiredProtocol(module); @@ -291,9 +287,11 @@ void setupPulses(uint8_t module) disablePulses(module, moduleSettings[module].protocol); moduleSettings[module].protocol = required_protocol; enablePulses(module, required_protocol); + return false; } else { setupPulses(module, required_protocol); + return true; } } diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 10ab978b3..dc6021127 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -161,7 +161,7 @@ union TrainerPulsesData { extern TrainerPulsesData trainerPulsesData; -void setupPulses(uint8_t module); +bool setupPulses(uint8_t module); void setupPulsesDSM2(uint8_t module); void setupPulsesCrossfire(uint8_t module); void setupPulsesMultimodule(uint8_t module); diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 9daf81f85..a4b607191 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -94,7 +94,7 @@ extern "C" void INTMODULE_USART_IRQHandler(void) } } -void intmoduleSendNextPXX2Frame() +void intmoduleSendNextFrame() { if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { DMA_InitTypeDef DMA_InitStructure; diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index e14a75487..f186147af 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -288,6 +288,6 @@ extern "C" void EXTMODULE_TIMER_IRQHandler() { EXTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - setupPulses(EXTERNAL_MODULE); - extmoduleSendNextFrame(); + if (setupPulses(EXTERNAL_MODULE)) + extmoduleSendNextFrame(); } diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 64a6a4679..945b5a99e 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -183,7 +183,7 @@ void init_no_pulses(uint8_t module); void disable_no_pulses(uint8_t module); void init_ppm(uint8_t module); void disable_ppm(uint8_t module); -void intmoduleSendNextPXX2Frame(); +void intmoduleSendNextFrame(); void init_pxx2(uint8_t module); void disable_pxx2(uint8_t module); void init_pxx(uint8_t module); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 652346fba..9d27034a2 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -94,6 +94,9 @@ void extmodulePpmStart() EXTMODULE_TIMER->EGR = 1; EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2PE; // PWM mode 1 + EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms + EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); @@ -126,6 +129,9 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) EXTMODULE_TIMER->EGR = 1; // Restart EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0; + EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms + EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); @@ -224,6 +230,9 @@ void extmodulePxxStart() EXTMODULE_TIMER->EGR = 1; // Restart EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; + EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms + EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); @@ -315,6 +324,7 @@ extern "C" void EXTMODULE_TIMER_CC_IRQHandler() { EXTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - setupPulses(EXTERNAL_MODULE); - extmoduleSendNextFrame(); + if (setupPulses(EXTERNAL_MODULE)) { + extmoduleSendNextFrame(); + } } diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index e7ea2fc37..e76500d91 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -97,11 +97,6 @@ void intmodulePxx2Start() // TODO } -void intmoduleSendNextPXX2Frame() -{ - // TODO -} - void intmodulePxxStart() { INTERNAL_MODULE_ON(); @@ -186,6 +181,6 @@ extern "C" void INTMODULE_TIMER_CC_IRQHandler() { INTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - setupPulses(INTERNAL_MODULE); - intmoduleSendNextFrame(); + if (setupPulses(INTERNAL_MODULE)) + intmoduleSendNextFrame(); } diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index e01f7a9d6..8ccae5eb1 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -82,8 +82,8 @@ void sendSynchronousPulses() { for (uint8_t module = 0; module < NUM_MODULES; module++) { uint8_t protocol = moduleSettings[module].protocol; - if (isProtocolSynchronous(protocol)) { - setupPulses(module); + if (isProtocolSynchronous(protocol) && setupPulses(module)) { + intmoduleSendNextFrame(); } } } From 8c9ba8d1e52d507df57ea273574509c0ee39fd94 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Feb 2019 10:56:50 +0100 Subject: [PATCH 129/446] Taranis external module fix --- radio/src/targets/taranis/intmodule_pulses_driver.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index e76500d91..e424dd538 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -121,10 +121,10 @@ void intmodulePxxStart() INTMODULE_TIMER->EGR = 1; // Restart INTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update INTMODULE_TIMER->CCMR2 = TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2; - INTMODULE_TIMER->CR1 |= TIM_CR1_CEN; INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag INTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms INTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt + INTMODULE_TIMER->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(INTMODULE_DMA_STREAM_IRQn); NVIC_SetPriority(INTMODULE_DMA_STREAM_IRQn, 7); @@ -154,10 +154,10 @@ void intmodulePpmStart() INTMODULE_TIMER->BDTR = TIM_BDTR_MOE; INTMODULE_TIMER->EGR = 1; INTMODULE_TIMER->DIER = TIM_DIER_UDE; - INTMODULE_TIMER->CR1 = TIM_CR1_CEN; INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag INTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms INTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt + INTMODULE_TIMER->CR1 = TIM_CR1_CEN; NVIC_EnableIRQ(INTMODULE_DMA_STREAM_IRQn); NVIC_SetPriority(INTMODULE_DMA_STREAM_IRQn, 7); @@ -181,6 +181,7 @@ extern "C" void INTMODULE_TIMER_CC_IRQHandler() { INTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - if (setupPulses(INTERNAL_MODULE)) + if (setupPulses(INTERNAL_MODULE)) { intmoduleSendNextFrame(); + } } From aef7a1074f85d7e21216d1105f5680bf97f10a11 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Feb 2019 11:54:23 +0100 Subject: [PATCH 130/446] Taranis internal module fix --- radio/src/pulses/pulses.cpp | 12 ++----- .../arm/stm32/intmodule_serial_driver.cpp | 5 --- .../src/targets/taranis/extmodule_driver.cpp | 31 ----------------- .../taranis/intmodule_pulses_driver.cpp | 33 +------------------ radio/src/targets/taranis/pulses_driver.cpp | 29 ---------------- radio/src/tasks.cpp | 9 +++-- 6 files changed, 10 insertions(+), 109 deletions(-) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 954c33114..96695aa6f 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -149,7 +149,7 @@ void disablePulses(uint8_t module, uint8_t protocol) #if defined(CROSSFIRE) case PROTOCOL_CHANNELS_CROSSFIRE: - disable_module_timer(module); + // TODO disable_module_timer(module); break; #endif @@ -167,10 +167,6 @@ void disablePulses(uint8_t module, uint8_t protocol) case PROTOCOL_CHANNELS_PPM: disable_ppm(module); break; - - default: - disable_no_pulses(module); - break; } } @@ -195,7 +191,7 @@ void enablePulses(uint8_t module, uint8_t protocol) #if defined(CROSSFIRE) case PROTOCOL_CHANNELS_CROSSFIRE: - init_module_timer(module, CROSSFIRE_PERIOD, true); + // TODO init_module_timer(module, CROSSFIRE_PERIOD, true); break; #endif @@ -216,10 +212,6 @@ void enablePulses(uint8_t module, uint8_t protocol) case PROTOCOL_CHANNELS_PPM: init_ppm(module); break; - - default: - init_no_pulses(module); - break; } } diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index a4b607191..8bcfa16ef 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -34,11 +34,6 @@ void intmodulePxxStart() // shouldn't be used anymore } -void intmoduleTimerStart(uint32_t period, uint8_t state) -{ - // shouldn't be used anymore -} - void intmodulePxx2Start() { INTERNAL_MODULE_ON(); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 9d27034a2..6e2cfed42 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -39,37 +39,6 @@ void extmoduleStop() } } -void extmoduleTimerStart(uint32_t period, uint8_t state) -{ - if (state) - EXTERNAL_MODULE_ON(); - else if (!IS_TRAINER_EXTERNAL_MODULE()) - EXTERNAL_MODULE_OFF(); - - GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, 0); - - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(EXTMODULE_TX_GPIO, &GPIO_InitStructure); - GPIO_SetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); // Set high - - EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; - EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz - EXTMODULE_TIMER->ARR = (2000 * period); - EXTMODULE_TIMER->CCR2 = (2000 * period) - 1000; - EXTMODULE_TIMER->EGR = 1; // Restart - EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt - EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; - - NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn); - NVIC_SetPriority(EXTMODULE_TIMER_CC_IRQn, 7); -} - void extmodulePpmStart() { EXTERNAL_MODULE_ON(); diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index e424dd538..6d5bea5ed 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -32,37 +32,6 @@ void intmoduleStop() INTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; } -void intmoduleTimerStart(uint32_t period, uint8_t state) -{ - if (state) - INTERNAL_MODULE_ON(); - else - INTERNAL_MODULE_OFF(); - - GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, 0); - - 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_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(INTMODULE_TX_GPIO, &GPIO_InitStructure); - GPIO_SetBits(INTMODULE_TX_GPIO, INTMODULE_TX_GPIO_PIN); // Set high - - INTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; - INTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz - INTMODULE_TIMER->ARR = (2000 * period); - INTMODULE_TIMER->CCR2 = (2000 * period) - 1000; - INTMODULE_TIMER->EGR = 1; // Restart - INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag - INTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt - INTMODULE_TIMER->CR1 |= TIM_CR1_CEN; - - NVIC_EnableIRQ(INTMODULE_TIMER_CC_IRQn); - NVIC_SetPriority(INTMODULE_TIMER_CC_IRQn, 7); -} - void intmoduleSendNextFrame() { if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) { @@ -122,7 +91,7 @@ void intmodulePxxStart() INTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update INTMODULE_TIMER->CCMR2 = TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2; INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag - INTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms + INTMODULE_TIMER->CCR2 = 16000; // The first frame will be sent in 20ms INTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt INTMODULE_TIMER->CR1 |= TIM_CR1_CEN; diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index 6e5070222..7b883d2ad 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -106,32 +106,3 @@ void disable_ppm(uint8_t module) } #endif } - -void init_no_pulses(uint8_t module) -{ - init_module_timer(module, 18, false); -} - -void disable_no_pulses(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmoduleStop(); - else - extmoduleStop(); -} - -void init_module_timer(uint8_t module, uint32_t period, uint8_t state) -{ - if (module == INTERNAL_MODULE) - intmoduleTimerStart(period, state); - else - extmoduleTimerStart(period, state); -} - -void disable_module_timer(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmoduleStop(); - else - extmoduleStop(); -} diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 8ccae5eb1..665c3600e 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -75,7 +75,7 @@ bool isForcePowerOffRequested() bool isProtocolSynchronous(uint8_t protocol) { - return (protocol == PROTOCOL_CHANNELS_PXX2 || protocol == PROTOCOL_CHANNELS_NONE); + return (protocol == PROTOCOL_CHANNELS_PXX2 || protocol == PROTOCOL_CHANNELS_CROSSFIRE || protocol == PROTOCOL_CHANNELS_NONE); } void sendSynchronousPulses() @@ -83,7 +83,12 @@ void sendSynchronousPulses() for (uint8_t module = 0; module < NUM_MODULES; module++) { uint8_t protocol = moduleSettings[module].protocol; if (isProtocolSynchronous(protocol) && setupPulses(module)) { - intmoduleSendNextFrame(); + if (module == INTERNAL_MODULE) { + intmoduleSendNextFrame(); + } + else { + // TODO + } } } } From ca66b25b8e27e011a7f429fea03aca9d99b75cb8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Feb 2019 11:56:58 +0100 Subject: [PATCH 131/446] Taranis internal module fix --- radio/src/pulses/pulses.cpp | 2 -- radio/src/targets/horus/board.h | 4 ---- radio/src/targets/horus/pulses_driver.cpp | 13 ------------- radio/src/targets/taranis/board.h | 2 -- 4 files changed, 21 deletions(-) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 96695aa6f..d76b27439 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -174,8 +174,6 @@ void enablePulses(uint8_t module, uint8_t protocol) { // start new protocol hardware here - #warning "CHECK THAT ALL PROTOCOL INIT WON'T SEND A FIRST WRONG FRAME HERE" - switch (protocol) { case PROTOCOL_CHANNELS_PXX: init_pxx(module); diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 7d71b20e8..e7b793ad2 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -187,16 +187,12 @@ void SDRAM_Init(void); #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) #define IS_UART_MODULE(port) (port == INTERNAL_MODULE) -void init_no_pulses(uint32_t port); -void disable_no_pulses(uint32_t port); void init_ppm(uint32_t module_index); void disable_ppm(uint32_t module_index); void init_pxx(uint32_t module_index); void disable_pxx(uint32_t module_index); void init_serial(uint32_t module_index, uint32_t baudrate, uint32_t period_half_us); void disable_serial(uint32_t module_index); -void init_module_timer( uint32_t module_index, uint32_t period, uint8_t state); -void disable_module_timer( uint32_t module_index); // Trainer driver void init_trainer_ppm(void); diff --git a/radio/src/targets/horus/pulses_driver.cpp b/radio/src/targets/horus/pulses_driver.cpp index 16009415c..6b8a268de 100644 --- a/radio/src/targets/horus/pulses_driver.cpp +++ b/radio/src/targets/horus/pulses_driver.cpp @@ -31,19 +31,6 @@ void extmodulePxxStart(); void extmodulePxx2Start(); void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us); -void init_no_pulses(uint32_t port) -{ - init_module_timer(port, 18, false); -} - -void disable_no_pulses(uint32_t port) -{ - if (port == INTERNAL_MODULE) - intmoduleStop(); - else - extmoduleStop(); -} - void init_ppm(uint32_t port) { if (port == EXTERNAL_MODULE) { diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 945b5a99e..dce31acf7 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -190,8 +190,6 @@ void init_pxx(uint8_t module); void disable_pxx(uint8_t module); void init_serial(uint8_t module, uint32_t baudrate, uint32_t period); void disable_serial(uint8_t module); -void init_module_timer(uint8_t module, uint32_t period, uint8_t state); -void disable_module_timer(uint8_t module); // Trainer driver #define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) From debc43ab34dd1d31bba46add321f96dc7efa3c9b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Feb 2019 14:06:23 +0100 Subject: [PATCH 132/446] PXX2 CRC Mixin --- radio/src/pulses/pxx.cpp | 43 +------------- radio/src/pulses/pxx.h | 115 ----------------------------------- radio/src/pulses/pxx1.cpp | 41 ++++++++++++- radio/src/pulses/pxx1.h | 122 ++++++++++++++++++++++++++++++++++++-- radio/src/pulses/pxx2.cpp | 2 + radio/src/pulses/pxx2.h | 22 +++++-- 6 files changed, 178 insertions(+), 167 deletions(-) diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp index af389aecb..efaf8b886 100644 --- a/radio/src/pulses/pxx.cpp +++ b/radio/src/pulses/pxx.cpp @@ -19,43 +19,6 @@ */ #include "opentx.h" -#include "pulses/pxx1.h" -#include "pulses/pxx2.h" - -const uint16_t PxxCrcMixin::CRCTable[] = { - 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, - 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7, - 0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e, - 0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876, - 0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd, - 0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5, - 0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c, - 0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974, - 0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb, - 0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3, - 0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a, - 0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72, - 0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9, - 0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1, - 0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738, - 0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70, - 0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7, - 0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff, - 0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036, - 0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e, - 0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5, - 0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd, - 0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134, - 0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c, - 0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3, - 0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb, - 0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232, - 0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a, - 0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1, - 0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9, - 0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330, - 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78 -}; template void PxxPulses::addChannels(uint8_t port, uint8_t sendFailsafe, uint8_t sendUpperChannels) @@ -127,7 +90,7 @@ void PxxPulses::addChannels(uint8_t port, uint8_t sendFailsafe, ui } } -template class PxxPulses >; -template class PxxPulses >; +template class PxxPulses >; +template class PxxPulses >; +template class PxxPulses; template class PxxPulses; -template class PxxPulses; diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index c49b7e254..361ee2930 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -50,25 +50,6 @@ #define PXX_PERIOD_HALF_US (PXX_PERIOD * 2000) -class PxxCrcMixin { - protected: - void initCrc() - { - // TODO add a Pxx2CrcMixin ... - crc = 0xFFFF; - } - - void addToCrc(uint8_t byte) - { - // TODO add a Pxx2CrcMixin ... - // crc = (crc << 8) ^ (CRCTable[((crc >> 8) ^ byte) & 0xFF]); - crc -= byte; - } - - uint16_t crc; - static const uint16_t CRCTable[]; -}; - // Used by the Sky9x family boards class SerialPxxBitTransport: public DataBuffer { protected: @@ -136,102 +117,6 @@ class PwmPxxBitTransport: public PulsesBuffer { } }; -template -class StandardPxxTransport: public BitTransport, public PxxCrcMixin { - protected: - uint8_t ones_count; - - void initFrame() - { - BitTransport::initFrame(); - ones_count = 0; - } - - void addByte(uint8_t byte) - { - PxxCrcMixin::addToCrc(byte); - addByteWithoutCrc(byte); - }; - - void addRawByte(uint8_t byte) - { - for (uint8_t i = 0; i < 8; i++) { - if (byte & 0x80) - BitTransport::addPart(1); - else - BitTransport::addPart(0); - byte <<= 1; - } - } - - void addByteWithoutCrc(uint8_t byte) - { - for (uint8_t i = 0; i < 8; i++) { - addBit(byte & 0x80); - byte <<= 1; - } - } - - void addBit(uint8_t bit) - { - if (bit) { - BitTransport::addPart(1); - if (++ones_count == 5) { - ones_count = 0; - BitTransport::addPart(0); // Stuff a 0 bit in - } - } - else { - BitTransport::addPart(0); - ones_count = 0; - } - } -}; - -class UartPxxTransport: public DataBuffer, public PxxCrcMixin { - protected: - void initFrame() - { - initBuffer(); - } - - void addByte(uint8_t byte) - { - PxxCrcMixin::addToCrc(byte); - addWithByteStuffing(byte); - } - - void addRawByte(uint8_t byte) - { - *ptr++ = byte; - } - - void addByteWithoutCrc(uint8_t byte) - { - addWithByteStuffing(byte); - } - - void addWithByteStuffing(uint8_t byte) - { - if (0x7E == byte) { - addRawByte(0x7D); - addRawByte(0x5E); - } - else if (0x7D == byte) { - addRawByte(0x7D); - addRawByte(0x5D); - } - else { - addRawByte(byte); - } - } - - void addTail() - { - // nothing - } -}; - template class PxxPulses: public PxxTransport { protected: diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 9cac3ce3c..1394f5ad5 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -21,6 +21,41 @@ #include "opentx.h" #include "pulses/pxx1.h" +const uint16_t Pxx1CrcMixin::CRCTable[] = { + 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, + 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7, + 0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e, + 0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876, + 0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd, + 0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5, + 0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c, + 0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974, + 0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb, + 0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3, + 0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a, + 0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72, + 0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9, + 0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1, + 0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738, + 0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70, + 0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7, + 0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff, + 0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036, + 0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e, + 0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5, + 0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd, + 0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134, + 0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c, + 0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3, + 0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb, + 0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232, + 0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a, + 0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1, + 0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9, + 0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330, + 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78 +}; + template uint8_t Pxx1Pulses::addFlag1(uint8_t module) { @@ -127,6 +162,6 @@ void Pxx1Pulses::setupFrame(uint8_t module) #endif } -template class Pxx1Pulses >; -template class Pxx1Pulses >; -template class Pxx1Pulses; +template class Pxx1Pulses >; +template class Pxx1Pulses >; +template class Pxx1Pulses; diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index b1ad7a623..7c42b7740 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -23,6 +23,118 @@ #include "pxx.h" +class Pxx1CrcMixin { + protected: + void initCrc() + { + crc = 0; + } + + void addToCrc(uint8_t byte) + { + crc = (crc << 8) ^ (CRCTable[((crc >> 8) ^ byte) & 0xFF]); + } + + uint16_t crc; + static const uint16_t CRCTable[]; +}; + +template +class StandardPxx1Transport: public BitTransport, public Pxx1CrcMixin { + protected: + uint8_t ones_count; + + void initFrame() + { + BitTransport::initFrame(); + ones_count = 0; + } + + void addByte(uint8_t byte) + { + Pxx1CrcMixin::addToCrc(byte); + addByteWithoutCrc(byte); + }; + + void addRawByte(uint8_t byte) + { + for (uint8_t i = 0; i < 8; i++) { + if (byte & 0x80) + BitTransport::addPart(1); + else + BitTransport::addPart(0); + byte <<= 1; + } + } + + void addByteWithoutCrc(uint8_t byte) + { + for (uint8_t i = 0; i < 8; i++) { + addBit(byte & 0x80); + byte <<= 1; + } + } + + void addBit(uint8_t bit) + { + if (bit) { + BitTransport::addPart(1); + if (++ones_count == 5) { + ones_count = 0; + BitTransport::addPart(0); // Stuff a 0 bit in + } + } + else { + BitTransport::addPart(0); + ones_count = 0; + } + } +}; + +class UartPxx1Transport: public DataBuffer, public Pxx1CrcMixin { + protected: + void initFrame() + { + initBuffer(); + } + + void addByte(uint8_t byte) + { + Pxx1CrcMixin::addToCrc(byte); + addWithByteStuffing(byte); + } + + void addRawByte(uint8_t byte) + { + *ptr++ = byte; + } + + void addByteWithoutCrc(uint8_t byte) + { + addWithByteStuffing(byte); + } + + void addWithByteStuffing(uint8_t byte) + { + if (0x7E == byte) { + addRawByte(0x7D); + addRawByte(0x5E); + } + else if (0x7D == byte) { + addRawByte(0x7D); + addRawByte(0x5D); + } + else { + addRawByte(byte); + } + } + + void addTail() + { + // nothing + } +}; + template class Pxx1Pulses: public PxxPulses { @@ -38,8 +150,8 @@ class Pxx1Pulses: public PxxPulses void addCrc() { - PxxTransport::addByteWithoutCrc(PxxCrcMixin::crc >> 8); - PxxTransport::addByteWithoutCrc(PxxCrcMixin::crc); + PxxTransport::addByteWithoutCrc(Pxx1CrcMixin::crc >> 8); + PxxTransport::addByteWithoutCrc(Pxx1CrcMixin::crc); } uint8_t addFlag1(uint8_t port); @@ -48,8 +160,8 @@ class Pxx1Pulses: public PxxPulses void add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels); }; -typedef Pxx1Pulses UartPxxPulses; -typedef Pxx1Pulses> PwmPxxPulses; -typedef Pxx1Pulses> SerialPxxPulses; +typedef Pxx1Pulses UartPxxPulses; +typedef Pxx1Pulses> PwmPxxPulses; +typedef Pxx1Pulses> SerialPxxPulses; #endif diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 0c3188828..fbc219e60 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -140,3 +140,5 @@ bool Pxx2Pulses::setupFrame(uint8_t module) return result; } + +template class PxxPulses; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 44c5d103b..d50c763a5 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -108,8 +108,22 @@ class SportCrcMixin { uint16_t crc; }; +class Pxx2CrcMixin { + protected: + void initCrc() + { + crc = 0xFFFF; + } -class Pxx2Transport: public DataBuffer, public PxxCrcMixin { + void addToCrc(uint8_t byte) + { + crc -= byte; + } + + uint16_t crc; +}; + +class Pxx2Transport: public DataBuffer, public Pxx2CrcMixin { protected: void addWord(uint32_t word) { @@ -121,7 +135,7 @@ class Pxx2Transport: public DataBuffer, public PxxCrcMixin { void addByte(uint8_t byte) { - PxxCrcMixin::addToCrc(byte); + Pxx2CrcMixin::addToCrc(byte); addByteWithoutCrc(byte); }; @@ -168,8 +182,8 @@ class Pxx2Pulses: public PxxPulses { void addCrc() { - Pxx2Transport::addByteWithoutCrc(PxxCrcMixin::crc >> 8); - Pxx2Transport::addByteWithoutCrc(PxxCrcMixin::crc); + Pxx2Transport::addByteWithoutCrc(Pxx2CrcMixin::crc >> 8); + Pxx2Transport::addByteWithoutCrc(Pxx2CrcMixin::crc); } void initFrame() From 0da578cad58d3324c49286ca03713330bd86243a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Feb 2019 14:59:08 +0100 Subject: [PATCH 133/446] Cosmetics --- radio/src/pulses/crossfire.cpp | 10 ++++------ radio/src/pulses/pulses.h | 1 + radio/src/targets/taranis/board.h | 4 ++-- radio/src/targets/taranis/extmodule_driver.cpp | 3 +++ radio/src/tasks.cpp | 8 +++----- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/radio/src/pulses/crossfire.cpp b/radio/src/pulses/crossfire.cpp index ba3781461..348bf2c92 100644 --- a/radio/src/pulses/crossfire.cpp +++ b/radio/src/pulses/crossfire.cpp @@ -50,20 +50,18 @@ uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses) void setupPulsesCrossfire(uint8_t module) { if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) { - uint8_t * crossfire = modulePulsesData[module].crossfire.pulses; - uint8_t len; + uint8_t * pulses = modulePulsesData[module].crossfire.pulses; #if defined(LUA) if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { - memcpy(crossfire, outputTelemetryBuffer, outputTelemetryBufferSize); - len = outputTelemetryBufferSize; + memcpy(pulses, outputTelemetryBuffer, outputTelemetryBufferSize); + modulePulsesData[module].crossfire.length = outputTelemetryBufferSize; outputTelemetryBufferTrigger = 0x00; outputTelemetryBufferSize = 0; } else #endif { - len = createCrossfireChannelsFrame(crossfire, &channelOutputs[g_model.moduleData[module].channelsStart]); + modulePulsesData[module].crossfire.length = createCrossfireChannelsFrame(pulses, &channelOutputs[g_model.moduleData[module].channelsStart]); } - sportSendBuffer(crossfire, len); } } diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index dc6021127..f35d0afa6 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -122,6 +122,7 @@ PACK(struct Dsm2TimerPulsesData { #define CROSSFIRE_FRAME_MAXLEN 64 PACK(struct CrossfirePulsesData { uint8_t pulses[CROSSFIRE_FRAME_MAXLEN]; + uint8_t length; }); union ModulePulsesData { diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index dce31acf7..e6af772bd 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -179,11 +179,11 @@ uint32_t isBootloaderStart(const uint8_t * buffer); #else #define IS_UART_MODULE(port) (false) #endif -void init_no_pulses(uint8_t module); -void disable_no_pulses(uint8_t module); + void init_ppm(uint8_t module); void disable_ppm(uint8_t module); void intmoduleSendNextFrame(); +void extmoduleSendNextFrame(); void init_pxx2(uint8_t module); void disable_pxx2(uint8_t module); void init_pxx(uint8_t module); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 6e2cfed42..bc405cc49 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -273,6 +273,9 @@ void extmoduleSendNextFrame() EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } + else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_CROSSFIRE) { + sportSendBuffer(modulePulsesData[EXTERNAL_MODULE].crossfire.pulses, modulePulsesData[EXTERNAL_MODULE].crossfire.length); + } else { EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; } diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 665c3600e..51bc2e977 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -83,12 +83,10 @@ void sendSynchronousPulses() for (uint8_t module = 0; module < NUM_MODULES; module++) { uint8_t protocol = moduleSettings[module].protocol; if (isProtocolSynchronous(protocol) && setupPulses(module)) { - if (module == INTERNAL_MODULE) { + if (module == INTERNAL_MODULE) intmoduleSendNextFrame(); - } - else { - // TODO - } + else + extmoduleSendNextFrame(); } } } From f696050350c5071f83d231f39fb076a6e5491354 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Feb 2019 15:10:18 +0100 Subject: [PATCH 134/446] PXX2 half duplex --- radio/src/pulses/pulses.cpp | 25 ++++++------------- .../src/targets/taranis/extmodule_driver.cpp | 5 ++++ 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index d76b27439..d785afdca 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -27,10 +27,6 @@ ModuleSettings moduleSettings[NUM_MODULES]; ModulePulsesData modulePulsesData[NUM_MODULES] __DMA; TrainerPulsesData trainerPulsesData __DMA; -#if defined(CROSSFIRE) -uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses); -#endif - uint8_t getRequiredProtocol(uint8_t module) { uint8_t required_protocol; @@ -39,27 +35,26 @@ uint8_t getRequiredProtocol(uint8_t module) case MODULE_TYPE_PPM: required_protocol = PROTOCOL_CHANNELS_PPM; break; + case MODULE_TYPE_XJT: required_protocol = PROTOCOL_CHANNELS_PXX; break; + case MODULE_TYPE_XJT2: - required_protocol = PROTOCOL_CHANNELS_PXX2; - break; case MODULE_TYPE_R9M: -#if defined(PCBXLITE) - required_protocol = PROTOCOL_CHANNELS_PXX; -#else required_protocol = PROTOCOL_CHANNELS_PXX2; -#endif break; + case MODULE_TYPE_SBUS: required_protocol = PROTOCOL_CHANNELS_SBUS; break; + #if defined(MULTIMODULE) case MODULE_TYPE_MULTIMODULE: required_protocol = PROTOCOL_CHANNELS_MULTIMODULE; break; #endif + #if defined(DSM2) case MODULE_TYPE_DSM2: required_protocol = limit(PROTOCOL_CHANNELS_DSM2_LP45, PROTOCOL_CHANNELS_DSM2_LP45+g_model.moduleData[module].rfProtocol, PROTOCOL_CHANNELS_DSM2_DSMX); @@ -79,11 +74,13 @@ uint8_t getRequiredProtocol(uint8_t module) } break; #endif + #if defined(CROSSFIRE) case MODULE_TYPE_CROSSFIRE: required_protocol = PROTOCOL_CHANNELS_CROSSFIRE; break; #endif + default: required_protocol = PROTOCOL_CHANNELS_NONE; break; @@ -120,14 +117,6 @@ void setupPulsesPXX(uint8_t module) void setupPulsesPXX2(uint8_t module) { modulePulsesData[module].pxx2.setupFrame(module); - -#if 0 - // here we have to wait that telemetryInit() is called, hence this test - if (telemetryProtocol == PROTOCOL_TELEMETRY_PXX2) { - modulePulsesData[module].pxx2.setupFrame(module); - sportSendBuffer(modulePulsesData[module].pxx2.getData(), modulePulsesData[module].pxx2.getSize()); - } -#endif } void disablePulses(uint8_t module, uint8_t protocol) diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index bc405cc49..c7aa5fcce 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -273,9 +273,14 @@ void extmoduleSendNextFrame() EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } +#if defined(CROSSFIRE) else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_CROSSFIRE) { sportSendBuffer(modulePulsesData[EXTERNAL_MODULE].crossfire.pulses, modulePulsesData[EXTERNAL_MODULE].crossfire.length); } +#endif + else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { + sportSendBuffer(modulePulsesData[EXTERNAL_MODULE].pxx2.getData(), modulePulsesData[EXTERNAL_MODULE].pxx2.getSize()); + } else { EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; } From c73746ef1cd7bbf4c6be1b5a1077941a89d5f141 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Feb 2019 15:31:23 +0100 Subject: [PATCH 135/446] Fixes --- radio/src/gui/128x64/model_setup.cpp | 13 ++++--- radio/src/gui/480x272/model_setup.cpp | 4 ++- radio/src/gui/gui_common.h | 2 +- radio/src/gui/gui_common_arm.cpp | 2 +- radio/src/pulses/pulses.cpp | 50 +++++++++++++++++---------- 5 files changed, 45 insertions(+), 26 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index f931f72bc..d1aeff663 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -311,7 +311,7 @@ void menuModelSetup(event_t event) IF_PXX2(0), // Model Number ANTENNA_ROW IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Range check and Register buttons - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Number + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, HIDDEN_ROW), // Receiver Number IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Delete @@ -801,7 +801,11 @@ void menuModelSetup(event_t event) if (attr && (editMode>0 || p1valdiff)) { switch (menuHorizontalPosition) { case 0: - g_model.moduleData[EXTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, MODULE_TYPE_NONE, IS_TRAINER_EXTERNAL_MODULE() ? MODULE_TYPE_NONE : MODULE_TYPE_COUNT-1, EE_MODEL, isModuleAvailable); + g_model.moduleData[EXTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, + MODULE_TYPE_NONE, + IS_TRAINER_EXTERNAL_MODULE() ? MODULE_TYPE_NONE : + MODULE_TYPE_COUNT - 1, EE_MODEL, + isExternalModuleAvailable); if (checkIncDec_Ret) { g_model.moduleData[EXTERNAL_MODULE].rfProtocol = 0; g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; @@ -1092,10 +1096,12 @@ void menuModelSetup(event_t event) if (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled) { g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1].enabled = 0x01; memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); + menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL + 1; } else { g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled = 0x01; memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); + menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL + 1; } s_editMode = 0; } @@ -1107,7 +1113,6 @@ void menuModelSetup(event_t event) uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); lcdDrawTextAlignedLeft(y, INDENT "Receiver"); lcdDrawNumber(lcdLastRightPos + 3, y, receiverIdx + 1); - } break; @@ -1145,7 +1150,7 @@ void menuModelSetup(event_t event) { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); for (uint8_t pos=0; pos0) { switch (menuHorizontalPosition) { case 0: - g_model.moduleData[EXTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_COUNT-1, EE_MODEL, isModuleAvailable); + g_model.moduleData[EXTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, + MODULE_TYPE_NONE, MODULE_TYPE_COUNT - 1, EE_MODEL, + isExternalModuleAvailable); if (checkIncDec_Ret) { g_model.moduleData[EXTERNAL_MODULE].rfProtocol = 0; g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index ba7b4c3db..427423a71 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -56,7 +56,7 @@ bool isSwitchAvailableInTimers(int swtch); bool isR9MModeAvailable(int mode); bool isR9ModuleRunning(int module); bool isR9MMFlex(int module); -bool isModuleAvailable(int module); +bool isExternalModuleAvailable(int module); bool isInternalModuleAvailable(int module); bool isRfProtocolAvailable(int protocol); bool isTelemetryProtocolAvailable(int protocol); diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index c74480158..84726a6e7 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -526,7 +526,7 @@ bool isInternalModuleAvailable(int module) return false; } -bool isModuleAvailable(int module) +bool isExternalModuleAvailable(int module) { #if defined(CROSSFIRE) if (module == MODULE_TYPE_CROSSFIRE && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index d785afdca..feb8347fa 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -27,44 +27,56 @@ ModuleSettings moduleSettings[NUM_MODULES]; ModulePulsesData modulePulsesData[NUM_MODULES] __DMA; TrainerPulsesData trainerPulsesData __DMA; +uint8_t getModuleType(uint8_t module) +{ + uint8_t type = g_model.moduleData[module].type; + if (module == INTERNAL_MODULE && isInternalModuleAvailable(type)) { + return type; + } + if (module == EXTERNAL_MODULE && isExternalModuleAvailable(type)) { + return type; + } + return MODULE_TYPE_NONE; +} + uint8_t getRequiredProtocol(uint8_t module) { - uint8_t required_protocol; + uint8_t protocol; - switch (g_model.moduleData[module].type) { + switch (getModuleType(module)) { case MODULE_TYPE_PPM: - required_protocol = PROTOCOL_CHANNELS_PPM; + protocol = PROTOCOL_CHANNELS_PPM; break; case MODULE_TYPE_XJT: - required_protocol = PROTOCOL_CHANNELS_PXX; + protocol = PROTOCOL_CHANNELS_PXX; break; case MODULE_TYPE_XJT2: case MODULE_TYPE_R9M: - required_protocol = PROTOCOL_CHANNELS_PXX2; + protocol = PROTOCOL_CHANNELS_PXX2; break; case MODULE_TYPE_SBUS: - required_protocol = PROTOCOL_CHANNELS_SBUS; + protocol = PROTOCOL_CHANNELS_SBUS; break; #if defined(MULTIMODULE) case MODULE_TYPE_MULTIMODULE: - required_protocol = PROTOCOL_CHANNELS_MULTIMODULE; + protocol = PROTOCOL_CHANNELS_MULTIMODULE; break; #endif #if defined(DSM2) case MODULE_TYPE_DSM2: - required_protocol = limit(PROTOCOL_CHANNELS_DSM2_LP45, PROTOCOL_CHANNELS_DSM2_LP45+g_model.moduleData[module].rfProtocol, PROTOCOL_CHANNELS_DSM2_DSMX); + protocol = limit(PROTOCOL_CHANNELS_DSM2_LP45, PROTOCOL_CHANNELS_DSM2_LP45+g_model.moduleData[module].rfProtocol, PROTOCOL_CHANNELS_DSM2_DSMX); // The module is set to OFF during one second before BIND start { static tmr10ms_t bindStartTime = 0; if (moduleSettings[module].mode == MODULE_MODE_BIND) { if (bindStartTime == 0) bindStartTime = get_tmr10ms(); if ((tmr10ms_t)(get_tmr10ms() - bindStartTime) < 100) { - required_protocol = PROTOCOL_CHANNELS_NONE; + protocol = PROTOCOL_CHANNELS_NONE; break; } } @@ -77,27 +89,27 @@ uint8_t getRequiredProtocol(uint8_t module) #if defined(CROSSFIRE) case MODULE_TYPE_CROSSFIRE: - required_protocol = PROTOCOL_CHANNELS_CROSSFIRE; + protocol = PROTOCOL_CHANNELS_CROSSFIRE; break; #endif default: - required_protocol = PROTOCOL_CHANNELS_NONE; + protocol = PROTOCOL_CHANNELS_NONE; break; } if (s_pulses_paused) { - required_protocol = PROTOCOL_CHANNELS_NONE; + protocol = PROTOCOL_CHANNELS_NONE; } #if 0 // will need an EEPROM conversion if (moduleSettings[module].mode == MODULE_OFF) { - required_protocol = PROTOCOL_CHANNELS_NONE; + protocol = PROTOCOL_CHANNELS_NONE; } #endif - return required_protocol; + return protocol; } void setupPulsesPXX(uint8_t module) @@ -258,18 +270,18 @@ void setupPulses(uint8_t module, uint8_t protocol) bool setupPulses(uint8_t module) { - uint8_t required_protocol = getRequiredProtocol(module); + uint8_t protocol = getRequiredProtocol(module); heartbeat |= (HEART_TIMER_PULSES << module); - if (moduleSettings[module].protocol != required_protocol) { + if (moduleSettings[module].protocol != protocol) { disablePulses(module, moduleSettings[module].protocol); - moduleSettings[module].protocol = required_protocol; - enablePulses(module, required_protocol); + moduleSettings[module].protocol = protocol; + enablePulses(module, protocol); return false; } else { - setupPulses(module, required_protocol); + setupPulses(module, protocol); return true; } } From a5759fd4d1ac1a4b24b835e31c56a171ff3855c3 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 8 Feb 2019 15:48:06 +0100 Subject: [PATCH 136/446] Failsafe UI fix --- radio/src/gui/gui_common.h | 2 +- radio/src/pulses/modules.h | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 427423a71..169ae51ff 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -156,7 +156,7 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); #define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) #define IS_R9M_OR_XJTD16(x) ((isModuleXJT(x) && g_model.moduleData[x].rfProtocol== RF_PROTO_X16) || isModuleR9M(x)) -#define FAILSAFE_ROWS(x) ((isModuleXJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || isModuleR9M(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW +#define FAILSAFE_ROWS(x) ((isModuleXJTVariant(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || isModuleR9M(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW #if defined(PCBXLITE) #define EXTERNAL_MODULE_OPTION_ROW (isModuleR9M(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 6e4ca4144..5325100e5 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -52,6 +52,12 @@ inline bool isModuleXJT(uint8_t idx) { return g_model.moduleData[idx].type == MODULE_TYPE_XJT; } + +inline bool isModuleXJTVariant(uint8_t idx) +{ + return g_model.moduleData[idx].type == MODULE_TYPE_XJT || g_model.moduleData[idx].type == MODULE_TYPE_XJT2; +} + #else inline bool isModuleXJT(uint8_t idx) { From 77c3c9336f3f6a066c2084a3497a98b7d32d23a1 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Feb 2019 15:56:09 +0100 Subject: [PATCH 137/446] UI Fixes --- radio/src/gui/128x64/model_setup.cpp | 15 +++++++-------- radio/src/gui/gui_common.h | 13 +++++-------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index d1aeff663..7bd542b06 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -219,7 +219,7 @@ enum MenuModelSetupItems { #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), #define TRAINER_BLUETOOTH_ROW #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) - #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? (uint8_t)2 : (uint8_t)-1) #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW #elif defined(PCBXLITE) #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), @@ -1103,6 +1103,7 @@ void menuModelSetup(event_t event) memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL + 1; } + killEvents(event); s_editMode = 0; } break; @@ -1180,14 +1181,12 @@ void menuModelSetup(event_t event) } else if (menuHorizontalPosition == 1 && s_editMode > 0) { if (receiverIdx == 0) { - memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0], - &g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1], sizeof(ReceiverData)); - memclear(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1], sizeof(ReceiverData)); - s_editMode = 0; - } else { - memclear(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx], sizeof(ReceiverData)); - s_editMode = 0; + memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0], &g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1], sizeof(ReceiverData)); + menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER + 1; } + memclear(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx], sizeof(ReceiverData)); + s_editMode = 0; + killEvents(event); } } } diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 169ae51ff..a98e59dbe 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -151,7 +151,6 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); #define MULTIMODULE_OPTIONS_ROW HIDDEN_ROW #endif - #define MAX_RX_NUM(x) (isModuleDSM2(x) ? 20 : isModuleMultimodule(x) ? MULTI_MAX_RX_NUM(x) : 63) #define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) #define IS_R9M_OR_XJTD16(x) ((isModuleXJT(x) && g_model.moduleData[x].rfProtocol== RF_PROTO_X16) || isModuleR9M(x)) @@ -159,21 +158,19 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); #define FAILSAFE_ROWS(x) ((isModuleXJTVariant(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || isModuleR9M(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW #if defined(PCBXLITE) -#define EXTERNAL_MODULE_OPTION_ROW (isModuleR9M(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) + #define EXTERNAL_MODULE_OPTION_ROW (isModuleR9M(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) #else -#define EXTERNAL_MODULE_OPTION_ROW (isR9ModuleRunning(EXTERNAL_MODULE) ? HIDDEN_ROW : isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) + #define EXTERNAL_MODULE_OPTION_ROW (isR9ModuleRunning(EXTERNAL_MODULE) ? HIDDEN_ROW : isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) #endif #if defined(PCBXLITE) && !defined(MODULE_R9M_FULLSIZE) -#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (isModuleR9M_FCC_VARIANT(EXTERNAL_MODULE) ? TITLE_ROW : (uint8_t) 0) : HIDDEN_ROW + #define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (isModuleR9M_FCC_VARIANT(EXTERNAL_MODULE) ? TITLE_ROW : (uint8_t) 0) : HIDDEN_ROW #elif defined(PCBXLITE) -#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW + #define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW #else -#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isR9ModuleRunning(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW + #define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isR9ModuleRunning(EXTERNAL_MODULE)) ? (uint8_t) 0 : HIDDEN_ROW #endif void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags); - - #endif // _GUI_COMMON_H_ From ade54b9c821419fd4b22dc51bda714151608b507 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Feb 2019 15:59:34 +0100 Subject: [PATCH 138/446] UI Fixes --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 7bd542b06..4971a8b94 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -311,11 +311,11 @@ void menuModelSetup(event_t event) IF_PXX2(0), // Model Number ANTENNA_ROW IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Range check and Register buttons - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, HIDDEN_ROW), // Receiver Number + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, (uint8_t)-1), // Receiver Number IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Delete - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Number + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, (uint8_t)-1), // Receiver Number IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 1), // Receiver Bind/Delete From 900ae8e0fe952127455595eccd8218d7220756d4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 8 Feb 2019 16:08:44 +0100 Subject: [PATCH 139/446] Move failsafe with the rest of the module level settings --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 4971a8b94..e83cfa3bc 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -80,6 +80,7 @@ enum MenuModelSetupItems { #if defined(EXTERNAL_ANTENNA) ITEM_MODEL_INTERNAL_MODULE_ANTENNA, #endif + ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NUMBER, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_RANGE, @@ -91,7 +92,6 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER, #endif - ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_EXTERNAL_MODULE_LABEL, ITEM_MODEL_EXTERNAL_MODULE_MODE, #if defined(MULTIMODULE) @@ -310,6 +310,7 @@ void menuModelSetup(event_t event) IF_NOT_PXX2(IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), IF_PXX2(0), // Model Number ANTENNA_ROW + IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Range check and Register buttons IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, (uint8_t)-1), // Receiver Number IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range @@ -320,7 +321,6 @@ void menuModelSetup(event_t event) IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 1), // Receiver Bind/Delete IF_PXX2(INTERNAL_MODULE_ADD_RECEIVER_ROW), - IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), LABEL(ExternalModule), EXTERNAL_MODULE_MODE_ROWS, From c12eb34691c7953663a9f73b71772854c2fed987 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 9 Feb 2019 09:41:26 +0100 Subject: [PATCH 140/446] Add PXX2 channel range --- radio/src/gui/128x64/model_setup.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index e83cfa3bc..1ea7f2c5b 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -81,6 +81,7 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_ANTENNA, #endif ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, + ITEM_MODEL_INTERNAL_MODULE_CH_RANGE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NUMBER, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_RANGE, @@ -311,7 +312,8 @@ void menuModelSetup(event_t event) IF_PXX2(0), // Model Number ANTENNA_ROW IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Range check and Register buttons + IF_INTERNAL_MODULE_ON(0), // Module start channel + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Range check and Register buttons IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, (uint8_t)-1), // Receiver Number IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Telemetry @@ -1055,6 +1057,20 @@ void menuModelSetup(event_t event) break; + case ITEM_MODEL_INTERNAL_MODULE_CH_RANGE: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + lcdDrawTextAlignedLeft(y, STR_CHANNELRANGE); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "CH", attr); + lcdDrawNumber(lcdLastRightPos, y, g_model.moduleData[moduleIdx].channelsStart+1, attr); + lcdDrawText(lcdLastRightPos, y, "-"); + lcdDrawNumber(lcdLastRightPos, y, g_model.moduleData[moduleIdx].channelsStart+16, 0); + if (attr) { + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].channelsStart, 16); //TODO this needs discussion + } + } + break; + case ITEM_MODEL_INTERNAL_MODULE_PXX2_MODEL_NUM: lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[INTERNAL_MODULE], attr | LEADING0|LEFT, 2); From 62c7a1978edca5ac13065dc5d50efd4364ea1bc0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Feb 2019 11:33:38 +0100 Subject: [PATCH 141/446] RAM saving --- radio/src/myeeprom.h | 18 --- radio/src/pulses/crossfire.cpp | 8 +- radio/src/pulses/dsm2.cpp | 50 +++---- radio/src/pulses/multi.cpp | 20 +-- radio/src/pulses/ppm.cpp | 19 ++- radio/src/pulses/pulses.cpp | 135 ++++++++++++------ radio/src/pulses/pulses.h | 91 +++++++++--- radio/src/pulses/pxx.cpp | 5 + radio/src/pulses/pxx1.h | 6 +- radio/src/pulses/sbus.cpp | 28 ++-- radio/src/sbus.cpp | 3 +- radio/src/targets/common/arm/CMakeLists.txt | 18 ++- .../targets/common/arm/stm32/CMakeLists.txt | 2 +- .../arm/stm32/intmodule_serial_driver.cpp | 4 +- radio/src/targets/horus/board.h | 1 - radio/src/targets/horus/extmodule_driver.cpp | 22 +-- radio/src/targets/sky9x/pulses_driver.cpp | 20 ++- radio/src/targets/taranis/CMakeLists.txt | 1 - radio/src/targets/taranis/board.h | 7 - .../src/targets/taranis/extmodule_driver.cpp | 34 +++-- .../taranis/intmodule_pulses_driver.cpp | 14 +- radio/src/tasks.cpp | 2 +- radio/src/telemetry/multi.cpp | 2 +- 23 files changed, 306 insertions(+), 204 deletions(-) diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index d4bd099d6..d11194c78 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -289,24 +289,6 @@ enum SwashType { #define TIMER_COUNTDOWN_START(x) 10 #endif -enum ChannelsProtocols { - PROTOCOL_CHANNELS_UNINITIALIZED, - PROTOCOL_CHANNELS_NONE, - PROTOCOL_CHANNELS_PPM, -#if defined(PXX) || defined(DSM2) - PROTOCOL_CHANNELS_PXX, -#endif -#if defined(DSM2) - PROTOCOL_CHANNELS_DSM2_LP45, - PROTOCOL_CHANNELS_DSM2_DSM2, - PROTOCOL_CHANNELS_DSM2_DSMX, -#endif - PROTOCOL_CHANNELS_CROSSFIRE, - PROTOCOL_CHANNELS_MULTIMODULE, - PROTOCOL_CHANNELS_SBUS, - PROTOCOL_CHANNELS_PXX2 -}; - enum XJTRFProtocols { RF_PROTO_OFF = -1, RF_PROTO_X16, diff --git a/radio/src/pulses/crossfire.cpp b/radio/src/pulses/crossfire.cpp index 348bf2c92..889bc9140 100644 --- a/radio/src/pulses/crossfire.cpp +++ b/radio/src/pulses/crossfire.cpp @@ -47,21 +47,21 @@ uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses) return buf - frame; } -void setupPulsesCrossfire(uint8_t module) +void setupPulsesCrossfire() { if (telemetryProtocol == PROTOCOL_TELEMETRY_CROSSFIRE) { - uint8_t * pulses = modulePulsesData[module].crossfire.pulses; + uint8_t * pulses = extmodulePulsesData.crossfire.pulses; #if defined(LUA) if (outputTelemetryBufferTrigger != 0x00 && outputTelemetryBufferSize > 0) { memcpy(pulses, outputTelemetryBuffer, outputTelemetryBufferSize); - modulePulsesData[module].crossfire.length = outputTelemetryBufferSize; + extmodulePulsesData.crossfire.length = outputTelemetryBufferSize; outputTelemetryBufferTrigger = 0x00; outputTelemetryBufferSize = 0; } else #endif { - modulePulsesData[module].crossfire.length = createCrossfireChannelsFrame(pulses, &channelOutputs[g_model.moduleData[module].channelsStart]); + extmodulePulsesData.crossfire.length = createCrossfireChannelsFrame(pulses, &channelOutputs[g_model.moduleData[EXTERNAL_MODULE].channelsStart]); } } } diff --git a/radio/src/pulses/dsm2.cpp b/radio/src/pulses/dsm2.cpp index 4fafc78c4..bdc37bfce 100644 --- a/radio/src/pulses/dsm2.cpp +++ b/radio/src/pulses/dsm2.cpp @@ -38,13 +38,13 @@ uint8_t dsm2BindTimer = DSM2_BIND_TIMEOUT; #if defined(PPM_PIN_SERIAL) void putDsm2SerialBit(uint8_t bit) { - modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte >>= 1; + extmodulePulsesData.dsm2.serialByte >>= 1; if (bit & 1) { - modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte |= 0x80; + extmodulePulsesData.dsm2.serialByte |= 0x80; } - if (++modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount >= 8) { - *modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte; - modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0; + if (++extmodulePulsesData.dsm2.serialBitCount >= 8) { + *extmodulePulsesData.dsm2.ptr++ = extmodulePulsesData.dsm2.serialByte; + extmodulePulsesData.dsm2.serialBitCount = 0; } } @@ -69,14 +69,14 @@ void putDsm2Flush() #else void _send_1(uint8_t v) { - if (modulePulsesData[EXTERNAL_MODULE].dsm2.index & 1) + if (extmodulePulsesData.dsm2.index & 1) v += 2; else v -= 2; - *modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = v - 1; - modulePulsesData[EXTERNAL_MODULE].dsm2.index += 1; - modulePulsesData[EXTERNAL_MODULE].dsm2.rest -= v; + *extmodulePulsesData.dsm2.ptr++ = v - 1; + extmodulePulsesData.dsm2.index += 1; + extmodulePulsesData.dsm2.rest -= v; } void sendByteDsm2(uint8_t b) // max 10 changes 0 10 10 10 10 1 @@ -100,31 +100,31 @@ void sendByteDsm2(uint8_t b) // max 10 changes 0 10 10 10 10 1 void putDsm2Flush() { - if (modulePulsesData[EXTERNAL_MODULE].dsm2.index & 1) - *modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = modulePulsesData[EXTERNAL_MODULE].dsm2.rest; + if (extmodulePulsesData.dsm2.index & 1) + *extmodulePulsesData.dsm2.ptr++ = extmodulePulsesData.dsm2.rest; else - *(modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - 1) = modulePulsesData[EXTERNAL_MODULE].dsm2.rest; + *(extmodulePulsesData.dsm2.ptr - 1) = extmodulePulsesData.dsm2.rest; } #endif // This is the data stream to send, prepare after 19.5 mS // Send after 22.5 mS -void setupPulsesDSM2(uint8_t module) +void setupPulsesDSM2() { uint8_t dsmDat[14]; #if defined(PPM_PIN_SERIAL) - modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte = 0 ; - modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0 ; + extmodulePulsesData.dsm2.serialByte = 0 ; + extmodulePulsesData.dsm2.serialBitCount = 0 ; #else - modulePulsesData[EXTERNAL_MODULE].dsm2.index = 0; - modulePulsesData[EXTERNAL_MODULE].dsm2.rest = DSM2_PERIOD * 2000; + extmodulePulsesData.dsm2.index = 0; + extmodulePulsesData.dsm2.rest = DSM2_PERIOD * 2000; #endif - modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses; - switch (moduleSettings[module].protocol) { + switch (moduleSettings[EXTERNAL_MODULE].protocol) { case PROTOCOL_CHANNELS_DSM2_LP45: dsmDat[0] = 0x00; break; @@ -140,29 +140,29 @@ void setupPulsesDSM2(uint8_t module) if (dsm2BindTimer > 0) { dsm2BindTimer--; if (switchState(SW_DSM2_BIND)) { - moduleSettings[port].mode = MODULE_MODE_BIND; + moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_BIND; dsmDat[0] |= DSM2_SEND_BIND; } } - else if (moduleSettings[port].mode == MODULE_MODE_RANGECHECK) { + else if (moduleSettings[EXTERNAL_MODULE].mode == MODULE_MODE_RANGECHECK) { dsmDat[0] |= DSM2_SEND_RANGECHECK; } else { moduleSettings[port].mode = 0; } #else - if (moduleSettings[module].mode == MODULE_MODE_BIND) { + if (moduleSettings[EXTERNAL_MODULE].mode == MODULE_MODE_BIND) { dsmDat[0] |= DSM2_SEND_BIND; } - else if (moduleSettings[module].mode == MODULE_MODE_RANGECHECK) { + else if (moduleSettings[EXTERNAL_MODULE].mode == MODULE_MODE_RANGECHECK) { dsmDat[0] |= DSM2_SEND_RANGECHECK; } #endif - dsmDat[1] = g_model.header.modelId[module]; // DSM2 Header second byte for model match + dsmDat[1] = g_model.header.modelId[EXTERNAL_MODULE]; // DSM2 Header second byte for model match for (int i=0; i>5)+512, 1023); dsmDat[2+2*i] = (i<<2) | ((pulse>>8)&0x03); diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index f148ef3cc..d75085b40 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -86,31 +86,31 @@ static void sendFailsafeChannels(uint8_t port) } } -void setupPulsesMultimodule(uint8_t port) +void setupPulsesMultimodule() { static int counter = 0; #if defined(PPM_PIN_SERIAL) - modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte = 0 ; - modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0 ; + extmodulePulsesData.dsm2.serialByte = 0 ; + extmodulePulsesData.dsm2.serialBitCount = 0 ; #else - modulePulsesData[EXTERNAL_MODULE].dsm2.rest = multiSyncStatus.getAdjustedRefreshRate(); - modulePulsesData[EXTERNAL_MODULE].dsm2.index = 0; + extmodulePulsesData.dsm2.rest = multiSyncStatus.getAdjustedRefreshRate(); + extmodulePulsesData.dsm2.index = 0; #endif - modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses; // Every 1000 cycles (=9s) send a config packet that configures the multimodule (inversion, telemetry type) counter++; if (counter % 1000== 500) { sendSetupFrame(); - } else if (counter % 1000 == 0 && g_model.moduleData[port].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[port].failsafeMode != FAILSAFE_RECEIVER) { - sendFrameProtocolHeader(port, true); + } else if (counter % 1000 == 0 && g_model.moduleData[EXTERNAL_MODULE].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[EXTERNAL_MODULE].failsafeMode != FAILSAFE_RECEIVER) { + sendFrameProtocolHeader(EXTERNAL_MODULE, true); sendFailsafeChannels(port); } else { // Normal Frame - sendFrameProtocolHeader(port, false); - sendChannels(port); + sendFrameProtocolHeader(EXTERNAL_MODULE, false); + sendChannels(EXTERNAL_MODULE); } putDsm2Flush(); diff --git a/radio/src/pulses/ppm.cpp b/radio/src/pulses/ppm.cpp index cb47c1ada..98099d340 100644 --- a/radio/src/pulses/ppm.cpp +++ b/radio/src/pulses/ppm.cpp @@ -59,12 +59,21 @@ void setupPulsesPPM(PpmPulsesData * ppmPulsesData, uint8_t channelsStart, int #endif } -void setupPulsesPPMModule(uint8_t port) -{ - setupPulsesPPM(&modulePulsesData[port].ppm, g_model.moduleData[port].channelsStart, g_model.moduleData[port].channelsCount, g_model.moduleData[port].ppm.frameLength); -} - void setupPulsesPPMTrainer() { setupPulsesPPM(&trainerPulsesData.ppm, g_model.trainerData.channelsStart, g_model.trainerData.channelsCount, g_model.trainerData.frameLength); } + +#if defined(PCBSKY9X) || defined(TARANIS_INTERNAL_PPM) +void setupPulsesPPMInternalModule() +{ + setupPulsesPPM(&intmodulePulsesData.ppm, g_model.moduleData[INTERNAL_MODULE].channelsStart, g_model.moduleData[INTERNAL_MODULE].channelsCount, g_model.moduleData[INTERNAL_MODULE].ppm.frameLength); +} +#endif + +void setupPulsesPPMExternalModule() +{ + setupPulsesPPM(&extmodulePulsesData.ppm, g_model.moduleData[EXTERNAL_MODULE].channelsStart, g_model.moduleData[EXTERNAL_MODULE].channelsCount, g_model.moduleData[EXTERNAL_MODULE].ppm.frameLength); +} + + diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index feb8347fa..0c7474757 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -24,7 +24,8 @@ uint8_t s_pulses_paused = 0; ModuleSettings moduleSettings[NUM_MODULES]; -ModulePulsesData modulePulsesData[NUM_MODULES] __DMA; +InternalModulePulsesData intmodulePulsesData __DMA; +ExternalModulePulsesData extmodulePulsesData __DMA; TrainerPulsesData trainerPulsesData __DMA; uint8_t getModuleType(uint8_t module) @@ -49,7 +50,7 @@ uint8_t getRequiredProtocol(uint8_t module) break; case MODULE_TYPE_XJT: - protocol = PROTOCOL_CHANNELS_PXX; + protocol = PROTOCOL_CHANNELS_PXX1; break; case MODULE_TYPE_XJT2: @@ -112,31 +113,12 @@ uint8_t getRequiredProtocol(uint8_t module) return protocol; } -void setupPulsesPXX(uint8_t module) -{ -#if defined(INTMODULE_USART) && defined(EXTMODULE_USART) - modulePulsesData[module].pxx_uart.setupFrame(module); -#elif !defined(INTMODULE_USART) && !defined(EXTMODULE_USART) - modulePulsesData[module].pxx.setupFrame(module); -#else - if (IS_UART_MODULE(module)) - modulePulsesData[module].pxx_uart.setupFrame(module); - else - modulePulsesData[module].pxx.setupFrame(module); -#endif -} - -void setupPulsesPXX2(uint8_t module) -{ - modulePulsesData[module].pxx2.setupFrame(module); -} - void disablePulses(uint8_t module, uint8_t protocol) { // stop existing protocol hardware switch (protocol) { - case PROTOCOL_CHANNELS_PXX: + case PROTOCOL_CHANNELS_PXX1: disable_pxx(module); break; @@ -176,7 +158,7 @@ void enablePulses(uint8_t module, uint8_t protocol) // start new protocol hardware here switch (protocol) { - case PROTOCOL_CHANNELS_PXX: + case PROTOCOL_CHANNELS_PXX1: init_pxx(module); break; @@ -214,53 +196,103 @@ void enablePulses(uint8_t module, uint8_t protocol) } } -void setupPulses(uint8_t module, uint8_t protocol) +#if defined(PXX1) +void setupPulsesPXXInternalModule() +{ +#if defined(INTMODULE_USART) + intmodulePulsesData.pxx_uart.setupFrame(INTERNAL_MODULE); +#else + intmodulePulsesData.pxx.setupFrame(INTERNAL_MODULE); +#endif +} + +void setupPulsesPXXExternalModule() +{ +#if defined(EXTMODULE_USART) + extmodulePulsesData.pxx_uart.setupFrame(EXTERNAL_MODULE); +#elif !defined(INTMODULE_USART) && !defined(EXTMODULE_USART) + extmodulePulsesData.pxx.setupFrame(EXTERNAL_MODULE); +#endif +} +#endif + +void setupPulsesInternalModule(uint8_t protocol) { switch (protocol) { - case PROTOCOL_CHANNELS_PXX: - setupPulsesPXX(module); - scheduleNextMixerCalculation(module, PXX_PERIOD); +#if defined(PXX1) + case PROTOCOL_CHANNELS_PXX1: + setupPulsesPXXInternalModule(); + scheduleNextMixerCalculation(INTERNAL_MODULE, PXX_PERIOD); break; +#endif + +#if defined(PXX2) + case PROTOCOL_CHANNELS_PXX2: + intmodulePulsesData.pxx2.setupFrame(INTERNAL_MODULE); + scheduleNextMixerCalculation(INTERNAL_MODULE, moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_SPECTRUM_ANALYSER ? 1 : PXX2_PERIOD); + break; +#endif + +#if defined(PCBSKY9X) || defined(TARANIS_INTERNAL_PPM) + case PROTOCOL_CHANNELS_PPM: + setupPulsesPPM(&extmodulePulsesData.ppm, g_model.moduleData[INTERNAL_MODULE].channelsStart, g_model.moduleData[INTERNAL_MODULE].channelsCount, g_model.moduleData[INTERNAL_MODULE].ppm.frameLength); + scheduleNextMixerCalculation(INTERNAL_MODULE, PPM_PERIOD(INTERNAL_MODULE)); + break; +#endif + + default: + break; + } +} + +void setupPulsesExternalModule(uint8_t protocol) +{ + switch (protocol) { +#if defined(PXX1) + case PROTOCOL_CHANNELS_PXX1: + setupPulsesPXXExternalModule(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX_PERIOD); + break; +#endif + +#if defined(PXX2) + case PROTOCOL_CHANNELS_PXX2: + extmodulePulsesData.pxx2.setupFrame(EXTERNAL_MODULE); + scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX2_PERIOD); + break; +#endif case PROTOCOL_CHANNELS_SBUS: - setupPulsesSbus(module); - scheduleNextMixerCalculation(module, SBUS_PERIOD); + setupPulsesSbus(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, SBUS_PERIOD); break; #if defined(DSM2) case PROTOCOL_CHANNELS_DSM2_LP45: case PROTOCOL_CHANNELS_DSM2_DSM2: case PROTOCOL_CHANNELS_DSM2_DSMX: - setupPulsesDSM2(module); - scheduleNextMixerCalculation(module, DSM2_PERIOD); + setupPulsesDSM2(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, DSM2_PERIOD); break; #endif #if defined(CROSSFIRE) case PROTOCOL_CHANNELS_CROSSFIRE: - setupPulsesCrossfire(module); - scheduleNextMixerCalculation(module, CROSSFIRE_PERIOD); + setupPulsesCrossfire(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, CROSSFIRE_PERIOD); break; #endif - case PROTOCOL_CHANNELS_PXX2: - setupPulsesPXX2(module); - scheduleNextMixerCalculation(module, moduleSettings[module].mode == MODULE_MODE_SPECTRUM_ANALYSER ? 1 : PXX2_PERIOD); - break; - #if defined(MULTIMODULE) case PROTOCOL_CHANNELS_MULTIMODULE: - setupPulsesMultimodule(module); - scheduleNextMixerCalculation(module, MULTIMODULE_PERIOD); + setupPulsesMultimodule(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, MULTIMODULE_PERIOD); break; #endif case PROTOCOL_CHANNELS_PPM: -#if defined(PCBSKY9X) - case PROTOCOL_CHANNELS_NONE: -#endif - setupPulsesPPMModule(module); - scheduleNextMixerCalculation(module, PPM_PERIOD(module)); + setupPulsesPPMExternalModule(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, PPM_PERIOD(EXTERNAL_MODULE)); break; default: @@ -268,6 +300,19 @@ void setupPulses(uint8_t module, uint8_t protocol) } } +void setupPulses(uint8_t module, uint8_t protocol) +{ + switch (module) { + case INTERNAL_MODULE: + setupPulsesInternalModule(protocol); + break; + + case EXTERNAL_MODULE: + setupPulsesExternalModule(protocol); + break; + } +} + bool setupPulses(uint8_t module) { uint8_t protocol = getRequiredProtocol(module); diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index f35d0afa6..668ca071b 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -23,8 +23,14 @@ #include "definitions.h" #include "dataconstants.h" + +#if defined(PXX2) #include "pulses/pxx2.h" +#endif + +#if defined(PXX1) #include "pulses/pxx1.h" +#endif #if NUM_MODULES > 1 #define IS_RANGECHECK_ENABLE() (moduleSettings[0].mode == MODULE_MODE_RANGECHECK || moduleSettings[1].mode == MODULE_MODE_RANGECHECK) @@ -99,6 +105,7 @@ PACK(struct Dsm2SerialPulsesData { uint8_t serialBitCount; uint16_t _alignment; }); +typedef Dsm2SerialPulsesData Dsm2PulsesData; #else #define MAX_PULSES_TRANSITIONS 300 PACK(struct Dsm2TimerPulsesData { @@ -107,6 +114,7 @@ PACK(struct Dsm2TimerPulsesData { uint16_t rest; uint8_t index; }); +typedef Dsm2TimerPulsesData Dsm2PulsesData; #endif #define PPM_PERIOD_HALF_US(module) ((g_model.moduleData[module].ppm.frameLength * 5 + 225) * 200) /*half us*/ @@ -125,25 +133,49 @@ PACK(struct CrossfirePulsesData { uint8_t length; }); -union ModulePulsesData { -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) - UartPxxPulses pxx_uart; -#endif -#if defined(PPM_PIN_SERIAL) - SerialPxxPulses pxx; -#elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) - PwmPxxPulses pxx; +union InternalModulePulsesData { +#if defined(PXX1) + #if defined(INTMODULE_USART) || defined(EXTMODULE_USART) + UartPxx1Pulses pxx_uart; + #endif + #if defined(PPM_PIN_SERIAL) + SerialPxx1Pulses pxx; + #elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) + PwmPxx1Pulses pxx; + #endif #endif +#if defined(PXX2) Pxx2Pulses pxx2; +#endif -#if defined(PPM_PIN_SERIAL) - Dsm2SerialPulsesData dsm2; -#else - Dsm2TimerPulsesData dsm2; +#if defined(TARANIS_INTERNAL_PPM) + PpmPulsesData ppm; +#endif +} __ALIGNED(4); + +union ExternalModulePulsesData { +#if defined(PXX1) + #if defined(INTMODULE_USART) || defined(EXTMODULE_USART) + UartPxx1Pulses pxx_uart; + #endif + #if defined(PPM_PIN_SERIAL) + SerialPxx1Pulses pxx; + #elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) + PwmPxx1Pulses pxx; + #endif +#endif + +#if defined(PXX2) + Pxx2Pulses pxx2; +#endif + +#if defined(DSM2) || defined(MULTIMODULE) || defined(SBUS) + Dsm2PulsesData dsm2; #endif PpmPulsesData ppm; + CrossfirePulsesData crossfire; } __ALIGNED(4); @@ -153,8 +185,9 @@ union ModulePulsesData { * sizeof(ModulePulsesData). __ALIGNED is required for sizeof(ModulePulsesData) to be a multiple of the alignment. */ -/* TODO: internal pulsedata only needs 200 bytes vs 300 bytes for external, both use 300 byte since we have a common struct */ -extern ModulePulsesData modulePulsesData[NUM_MODULES]; + +extern InternalModulePulsesData intmodulePulsesData; +extern ExternalModulePulsesData extmodulePulsesData; union TrainerPulsesData { PpmPulsesData ppm; @@ -163,12 +196,12 @@ union TrainerPulsesData { extern TrainerPulsesData trainerPulsesData; bool setupPulses(uint8_t module); -void setupPulsesDSM2(uint8_t module); -void setupPulsesCrossfire(uint8_t module); -void setupPulsesMultimodule(uint8_t module); -void setupPulsesSbus(uint8_t module); -void setupPulsesPXX(uint8_t module); -void setupPulsesPPMModule(uint8_t module); +void setupPulsesDSM2(); +void setupPulsesCrossfire(); +void setupPulsesMultimodule(); +void setupPulsesSbus(); +void setupPulsesPPMInternalModule(); +void setupPulsesPPMExternalModule(); void setupPulsesPPMTrainer(); void sendByteDsm2(uint8_t b); void putDsm2Flush(); @@ -194,6 +227,24 @@ inline void startPulses() #endif } +enum ChannelsProtocols { + PROTOCOL_CHANNELS_UNINITIALIZED, + PROTOCOL_CHANNELS_NONE, + PROTOCOL_CHANNELS_PPM, +#if defined(PXX) || defined(DSM2) + PROTOCOL_CHANNELS_PXX1, +#endif +#if defined(DSM2) + PROTOCOL_CHANNELS_DSM2_LP45, + PROTOCOL_CHANNELS_DSM2_DSM2, + PROTOCOL_CHANNELS_DSM2_DSMX, +#endif + PROTOCOL_CHANNELS_CROSSFIRE, + PROTOCOL_CHANNELS_MULTIMODULE, + PROTOCOL_CHANNELS_SBUS, + PROTOCOL_CHANNELS_PXX2 +}; + inline bool pulsesStarted() { return moduleSettings[0].protocol != PROTOCOL_CHANNELS_UNINITIALIZED; } inline void pausePulses() { s_pulses_paused = true; } inline void resumePulses() { s_pulses_paused = false; } diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp index efaf8b886..fc1167b80 100644 --- a/radio/src/pulses/pxx.cpp +++ b/radio/src/pulses/pxx.cpp @@ -90,7 +90,12 @@ void PxxPulses::addChannels(uint8_t port, uint8_t sendFailsafe, ui } } +#if defined(PXX1) template class PxxPulses >; template class PxxPulses >; template class PxxPulses; +#endif + +#if defined(PXX2) template class PxxPulses; +#endif diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index 7c42b7740..33c374a3a 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -160,8 +160,8 @@ class Pxx1Pulses: public PxxPulses void add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels); }; -typedef Pxx1Pulses UartPxxPulses; -typedef Pxx1Pulses> PwmPxxPulses; -typedef Pxx1Pulses> SerialPxxPulses; +typedef Pxx1Pulses UartPxx1Pulses; +typedef Pxx1Pulses> PwmPxx1Pulses; +typedef Pxx1Pulses> SerialPxx1Pulses; #endif diff --git a/radio/src/pulses/sbus.cpp b/radio/src/pulses/sbus.cpp index 5824f17fe..26d4367b1 100644 --- a/radio/src/pulses/sbus.cpp +++ b/radio/src/pulses/sbus.cpp @@ -48,17 +48,17 @@ static void _send_level(uint8_t v) { /* Copied over from DSM, this looks doubious and in my logic analyzer output the low->high is about 2 ns late */ - if (modulePulsesData[EXTERNAL_MODULE].dsm2.index & 1) + if (extmodulePulsesData.dsm2.index & 1) v += 2; else v -= 2; - *modulePulsesData[EXTERNAL_MODULE].dsm2.ptr++ = v - 1; - modulePulsesData[EXTERNAL_MODULE].dsm2.index+=1; - modulePulsesData[EXTERNAL_MODULE].dsm2.rest -=v; + *extmodulePulsesData.dsm2.ptr++ = v - 1; + extmodulePulsesData.dsm2.index+=1; + extmodulePulsesData.dsm2.rest -=v; } -void sendByteSbus(uint8_t b) //max 11 changes 0 10 10 10 10 P 1 +void sendByteSbus(uint8_t b) // max 11 changes 0 10 10 10 10 P 1 { bool lev = 0; uint8_t parity = 1; @@ -107,17 +107,17 @@ inline int getChannelValue(uint8_t port, int channel) return channelOutputs[ch] + 2 * PPM_CH_CENTER(ch) - 2*PPM_CENTER; } -void setupPulsesSbus(uint8_t port) +void setupPulsesSbus() { #if defined(PPM_PIN_SERIAL) - modulePulsesData[EXTERNAL_MODULE].dsm2.serialByte = 0; - modulePulsesData[EXTERNAL_MODULE].dsm2.serialBitCount = 0; + extmodulePulsesData.dsm2.serialByte = 0; + extmodulePulsesData.dsm2.serialBitCount = 0; #else - modulePulsesData[EXTERNAL_MODULE].dsm2.rest = SBUS_PERIOD_HALF_US; - modulePulsesData[EXTERNAL_MODULE].dsm2.index = 0; + extmodulePulsesData.dsm2.rest = SBUS_PERIOD_HALF_US; + extmodulePulsesData.dsm2.index = 0; #endif - modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses; // Sync Byte sendByteSbus(SBUS_FRAME_BEGIN_BYTE); @@ -127,7 +127,7 @@ void setupPulsesSbus(uint8_t port) // byte 1-22, channels 0..2047, limits not really clear (B for (int i=0; i 0) + if (getChannelValue(EXTERNAL_MODULE, 16) > 0) flags |=SBUS_FLAG_CHANNEL_17; - if (getChannelValue(port, 17) > 0) + if (getChannelValue(EXTERNAL_MODULE, 17) > 0) flags |=SBUS_FLAG_CHANNEL_18; sendByteSbus(flags); diff --git a/radio/src/sbus.cpp b/radio/src/sbus.cpp index 6817fa0f1..e9b975144 100644 --- a/radio/src/sbus.cpp +++ b/radio/src/sbus.cpp @@ -30,11 +30,10 @@ #define SBUS_FAILSAFE_BIT 3 #define SBUS_CH_BITS 11 -#define SBUS_CH_MASK ((1<DR); DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx2.getData()); - DMA_InitStructure.DMA_BufferSize = modulePulsesData[INTERNAL_MODULE].pxx2.getSize(); + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(intmodulePulsesData.pxx2.getData()); + DMA_InitStructure.DMA_BufferSize = intmodulePulsesData.pxx2.getSize(); DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index e7b793ad2..71bc6f246 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -185,7 +185,6 @@ void SDRAM_Init(void); #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET) #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) -#define IS_UART_MODULE(port) (port == INTERNAL_MODULE) void init_ppm(uint32_t module_index); void disable_ppm(uint32_t module_index); diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index f186147af..77b14b950 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -223,23 +223,23 @@ void extmoduleSendNextFrame() #if defined(PCBX10) || PCBREV >= 13 EXTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); - EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; #else EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); - EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; #endif EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].ppm.pulses); - EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses; + EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.ppm.pulses); + EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.ppm.ptr - extmodulePulsesData.ppm.pulses; EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) { - EXTMODULE_TIMER->CCR2 = modulePulsesData[EXTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance + else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { + EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA #if defined(PCBX10) || PCBREV >= 13 EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; @@ -247,12 +247,12 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; #endif EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.getData()); - EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); + EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData()); + EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } else if (IS_DSM2_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) { - EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA #if defined(PCBX10) || PCBREV >= 13 EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; @@ -264,8 +264,8 @@ void extmoduleSendNextFrame() EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); // reverse polarity for Sbus if needed #endif EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].dsm2.pulses); - EXTMODULE_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); + EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses; EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } else { diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index ef1fd28ae..b1c3a7cb9 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -63,8 +63,6 @@ void init_main_ppm(uint32_t period, uint32_t out_enable) { Pwm * pwmptr; - setupPulsesPPMModule(EXTERNAL_MODULE); - if (out_enable) { module_output_active(); } @@ -294,8 +292,8 @@ extern "C" void PWM_IRQHandler(void) else { // Kick off serial output here Ssc * sscptr = SSC; - sscptr->SSC_TPR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.getData()); - sscptr->SSC_TCR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); + sscptr->SSC_TPR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData()); + sscptr->SSC_TCR = extmodulePulsesData.pxx.getSize(); sscptr->SSC_PTCR = SSC_PTCR_TXTEN; // Start transfers } break; @@ -318,8 +316,8 @@ extern "C" void PWM_IRQHandler(void) else { // Kick off serial output here Ssc * sscptr = SSC; - sscptr->SSC_TPR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].dsm2.pulses); - sscptr->SSC_TCR = (uint8_t *)modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - (uint8_t *)modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + sscptr->SSC_TPR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); + sscptr->SSC_TCR = (uint8_t *)extmodulePulsesData.dsm2.ptr - (uint8_t *)extmodulePulsesData.dsm2.pulses; sscptr->SSC_PTCR = SSC_PTCR_TXTEN; // Start transfers } break; @@ -344,15 +342,15 @@ extern "C" void PWM_IRQHandler(void) else { // Kick off serial output here Ssc * sscptr = SSC; - sscptr->SSC_TPR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].dsm2.pulses); - sscptr->SSC_TCR = (uint8_t *)modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - (uint8_t *)modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + sscptr->SSC_TPR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); + sscptr->SSC_TCR = (uint8_t *)extmodulePulsesData.dsm2.ptr - (uint8_t *)extmodulePulsesData.dsm2.pulses; sscptr->SSC_PTCR = SSC_PTCR_TXTEN; // Start transfers } break; default: - pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = *modulePulsesData[EXTERNAL_MODULE].ppm.ptr++; - if (*modulePulsesData[EXTERNAL_MODULE].ppm.ptr == 0) { + pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = *extmodulePulsesData.ppm.ptr++; + if (*extmodulePulsesData.ppm.ptr == 0) { setExternalModulePolarity(); setupPulses(EXTERNAL_MODULE); } @@ -365,7 +363,7 @@ extern "C" void PWM_IRQHandler(void) if (reason & PWM_ISR1_CHID1) { pwmptr->PWM_CH_NUM[1].PWM_CPDRUPD = *modulePulsesData[EXTRA_MODULE].ppm.ptr++; if (*modulePulsesData[EXTRA_MODULE].ppm.ptr == 0) { - setupPulsesPPMModule(EXTRA_MODULE); + setupPulses(EXTRA_MODULE); setExtraModulePolarity(); } } diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 66e8e5d6c..ddc6dffac 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -137,7 +137,6 @@ else() intmodule_pulses_driver.cpp trainer_driver.cpp ) - add_definitions(-DSBUS) set(PULSES_SRC ${PULSES_SRC} ../sbus.cpp diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index e6af772bd..d525d0fbb 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -172,13 +172,6 @@ uint32_t isBootloaderStart(const uint8_t * buffer); #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET) #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) -#if defined(INTMODULE_USART) && defined(EXTMODULE_USART) - #define IS_UART_MODULE(port) (true) -#elif defined(INTMODULE_USART) - #define IS_UART_MODULE(port) (port == INTERNAL_MODULE) -#else - #define IS_UART_MODULE(port) (false) -#endif void init_ppm(uint8_t module); void disable_ppm(uint8_t module); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index c7aa5fcce..5d0549ba6 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -221,23 +221,24 @@ void extmoduleSendNextFrame() if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) { EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2; EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here - EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].ppm.pulses); - EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].ppm.ptr - modulePulsesData[EXTERNAL_MODULE].ppm.pulses; + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.ppm.pulses); + EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.ppm.ptr - extmodulePulsesData.ppm.pulses; EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } - else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) { +#if defined(PXX1) + else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { #if defined(EXTMODULE_USART) DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(EXTMODULE_USART_DMA_STREAM); DMA_InitStructure.DMA_Channel = EXTMODULE_USART_DMA_CHANNEL; DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&EXTMODULE_USART->DR); DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx_uart.getData()); - DMA_InitStructure.DMA_BufferSize = modulePulsesData[EXTERNAL_MODULE].pxx_uart.getSize(); + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(extmodulePulsesData.pxx_uart.getData()); + DMA_InitStructure.DMA_BufferSize = extmodulePulsesData.pxx_uart.getSize(); DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; @@ -253,33 +254,38 @@ void extmoduleSendNextFrame() USART_DMACmd(EXTMODULE_USART, USART_DMAReq_Tx, ENABLE); EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; #else - EXTMODULE_TIMER->CCR2 = modulePulsesData[EXTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance + EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].pxx.getData()); - EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].pxx.getSize(); + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData()); + EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA #endif } +#endif + +#if defined(DSM2) else if (IS_DSM2_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) { if (IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // reverse polarity for Sbus if needed - EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[EXTERNAL_MODULE].dsm2.pulses); - EXTMODULE_TIMER_DMA_STREAM->NDTR = modulePulsesData[EXTERNAL_MODULE].dsm2.ptr - modulePulsesData[EXTERNAL_MODULE].dsm2.pulses; + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); + EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses; EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } +#endif + #if defined(CROSSFIRE) else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_CROSSFIRE) { - sportSendBuffer(modulePulsesData[EXTERNAL_MODULE].crossfire.pulses, modulePulsesData[EXTERNAL_MODULE].crossfire.length); + sportSendBuffer(extmodulePulsesData.crossfire.pulses, extmodulePulsesData.crossfire.length); } #endif else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { - sportSendBuffer(modulePulsesData[EXTERNAL_MODULE].pxx2.getData(), modulePulsesData[EXTERNAL_MODULE].pxx2.getSize()); + sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); } else { EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 6d5bea5ed..7da20145f 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -34,25 +34,25 @@ void intmoduleStop() void intmoduleSendNextFrame() { - if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX) { - INTMODULE_TIMER->CCR2 = modulePulsesData[INTERNAL_MODULE].pxx.getLast() - 4000; // 2mS in advance + if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { + INTMODULE_TIMER->CCR2 = intmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR); - INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].pxx.getData()); - INTMODULE_DMA_STREAM->NDTR = modulePulsesData[INTERNAL_MODULE].pxx.getSize(); + INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(intmodulePulsesData.pxx.getData()); + INTMODULE_DMA_STREAM->NDTR = intmodulePulsesData.pxx.getSize(); INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } #if defined(TARANIS_INTERNAL_PPM) else if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) { INTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(INTERNAL_MODULE) * 2; INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); - INTMODULE_TIMER->CCR2 = *(modulePulsesData[INTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance + INTMODULE_TIMER->CCR2 = *(intmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR); - INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(modulePulsesData[INTERNAL_MODULE].ppm.pulses); - INTMODULE_DMA_STREAM->NDTR = modulePulsesData[INTERNAL_MODULE].ppm.ptr - modulePulsesData[INTERNAL_MODULE].ppm.pulses; + INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(intmodulePulsesData.ppm.pulses); + INTMODULE_DMA_STREAM->NDTR = intmodulePulsesData.ppm.ptr - intmodulePulsesData.ppm.pulses; INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } #endif diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 51bc2e977..2dd205c7d 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -100,7 +100,7 @@ TASK_FUNCTION(mixerTask) while(1) { -#if defined(SBUS) +#if !defined(PCBXLITE) processSbusInput(); #endif diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index 35ccbe517..377f092b2 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -90,7 +90,7 @@ static void processMultiSyncPacket(const uint8_t *data) multiSyncStatus.calcAdjustedRefreshRate(data[0] << 8 | data[1], data[2] << 8 | data[3]); #if !defined(PPM_PIN_SERIAL) - TRACE("MP ADJ: rest: %d, lag %04d, diff: %04d target: %d, interval: %d, Refresh: %d, intAdjRefresh: %d, adjRefresh %d\r\n", modulePulsesData[EXTERNAL_MODULE].dsm2.rest, + TRACE("MP ADJ: rest: %d, lag %04d, diff: %04d target: %d, interval: %d, Refresh: %d, intAdjRefresh: %d, adjRefresh %d\r\n", extmodulePulsesData.dsm2.rest, multiSyncStatus.inputLag, oldlag-multiSyncStatus.inputLag, multiSyncStatus.target, multiSyncStatus.interval, multiSyncStatus.refreshRate, multiSyncStatus.adjustedRefreshRate/50, multiSyncStatus.getAdjustedRefreshRate()); #endif From 5aae25284bbc7a40198afeca8e2d9729d4b9f40d Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 9 Feb 2019 11:37:11 +0100 Subject: [PATCH 142/446] Use constant --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- radio/src/pulses/modules.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 1ea7f2c5b..8c207efc2 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1064,9 +1064,9 @@ void menuModelSetup(event_t event) lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "CH", attr); lcdDrawNumber(lcdLastRightPos, y, g_model.moduleData[moduleIdx].channelsStart+1, attr); lcdDrawText(lcdLastRightPos, y, "-"); - lcdDrawNumber(lcdLastRightPos, y, g_model.moduleData[moduleIdx].channelsStart+16, 0); + lcdDrawNumber(lcdLastRightPos, y, g_model.moduleData[moduleIdx].channelsStart+PXX2_MODULE_CHANNELS, 0); if (attr) { - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].channelsStart, 16); //TODO this needs discussion + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].channelsStart, PXX2_MODULE_CHANNELS); //TODO this needs discussion } } break; diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 5325100e5..80ae60e55 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -193,6 +193,7 @@ static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; constexpr int8_t MAX_EXTRA_MODULE_CHANNELS_M8 = 8; // only 16ch PPM +constexpr int8_t PXX2_MODULE_CHANNELS=16; inline int8_t maxModuleChannels_M8(uint8_t idx) { From f9f37d75a7cd38c2aff9e5b4e1d57819257b95a5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 9 Feb 2019 12:24:15 +0100 Subject: [PATCH 143/446] Reuse :) (thx @bsongis) --- radio/src/gui/128x64/model_setup.cpp | 22 +++------------------- radio/src/gui/gui_common.h | 3 ++- radio/src/pulses/modules.h | 7 ++++++- 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 8c207efc2..1e1d010b9 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -81,7 +81,6 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_ANTENNA, #endif ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, - ITEM_MODEL_INTERNAL_MODULE_CH_RANGE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NUMBER, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_RANGE, @@ -307,12 +306,11 @@ void menuModelSetup(event_t event) LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None) - IF_NOT_PXX2(IF_INTERNAL_MODULE_ON(1)), // Channels min and count + INTERNAL_MODULE_CHANNELS_ROWS, // Channels min and count IF_NOT_PXX2(IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), - IF_PXX2(0), // Model Number + IF_PXX2(0), // Model Number ANTENNA_ROW - IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), - IF_INTERNAL_MODULE_ON(0), // Module start channel + IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Module start channel (pxx2 always send 16) IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Range check and Register buttons IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, (uint8_t)-1), // Receiver Number IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range @@ -1057,20 +1055,6 @@ void menuModelSetup(event_t event) break; - case ITEM_MODEL_INTERNAL_MODULE_CH_RANGE: - { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawTextAlignedLeft(y, STR_CHANNELRANGE); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "CH", attr); - lcdDrawNumber(lcdLastRightPos, y, g_model.moduleData[moduleIdx].channelsStart+1, attr); - lcdDrawText(lcdLastRightPos, y, "-"); - lcdDrawNumber(lcdLastRightPos, y, g_model.moduleData[moduleIdx].channelsStart+PXX2_MODULE_CHANNELS, 0); - if (attr) { - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].channelsStart, PXX2_MODULE_CHANNELS); //TODO this needs discussion - } - } - break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_MODEL_NUM: lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[INTERNAL_MODULE], attr | LEADING0|LEFT, 2); diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index a98e59dbe..3b21668b4 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -115,7 +115,8 @@ void runFatalErrorScreen(const char * message); void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags=0); // model_setup Defines that are used in all uis in the same way -#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((isModuleDSM2(EXTERNAL_MODULE) || isModuleCrossfire(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) || (isModuleMultimodule(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MM_RF_PROTO_DSM2)) ? (uint8_t)0 : (uint8_t)1) +#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON((isModuleXJT2(INTERNAL_MODULE) ? (uint8_t)0 : (uint8_t)1)) +#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((isModuleXJT2(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleCrossfire(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) || (isModuleMultimodule(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MM_RF_PROTO_DSM2)) ? (uint8_t)0 : (uint8_t)1) #if defined(MULTIMODULE) diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 01eacaaaf..928abe24a 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -53,6 +53,12 @@ inline bool isModuleXJT(uint8_t idx) return g_model.moduleData[idx].type == MODULE_TYPE_XJT; } +inline bool isModuleXJT2(uint8_t idx) +{ + return g_model.moduleData[idx].type == MODULE_TYPE_XJT2; +} + + inline bool isModuleXJTVariant(uint8_t idx) { return g_model.moduleData[idx].type == MODULE_TYPE_XJT || g_model.moduleData[idx].type == MODULE_TYPE_XJT2; @@ -193,7 +199,6 @@ static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; constexpr int8_t MAX_EXTRA_MODULE_CHANNELS_M8 = 8; // only 16ch PPM -constexpr int8_t PXX2_MODULE_CHANNELS=16; inline int8_t maxModuleChannels_M8(uint8_t idx) { From f17212f9b7efac9e7fc22e1342262d976d237d40 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Feb 2019 12:31:16 +0100 Subject: [PATCH 144/446] Possibility to disable PXX1 / PXX2 / CROSSFIRE --- radio/src/gui/gui_common_arm.cpp | 11 ++++- radio/src/lua/api_general.cpp | 2 + radio/src/pulses/pulses.h | 9 +--- radio/src/targets/common/arm/CMakeLists.txt | 42 +++++++++++++++++-- .../targets/common/arm/stm32/CMakeLists.txt | 13 +++--- .../arm/stm32/intmodule_serial_driver.cpp | 2 + .../src/targets/taranis/extmodule_driver.cpp | 2 + radio/src/telemetry/crossfire.h | 4 +- radio/src/telemetry/telemetry.h | 4 +- 9 files changed, 67 insertions(+), 22 deletions(-) diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 55418bb75..f08aa02c5 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -528,6 +528,16 @@ bool isInternalModuleAvailable(int module) bool isExternalModuleAvailable(int module) { +#if !defined(PXX1) + if (module == MODULE_TYPE_XJT) { + return false; + } +#endif +#if !defined(PXX2) + if (module == MODULE_TYPE_XJT2) { + return false; + } +#endif #if defined(CROSSFIRE) if (module == MODULE_TYPE_CROSSFIRE && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { return false; @@ -554,7 +564,6 @@ bool isExternalModuleAvailable(int module) #endif return true; - } bool isRfProtocolAvailable(int protocol) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index c0b377298..d0b74ecdd 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -434,6 +434,7 @@ static int luaSportTelemetryPush(lua_State * L) return 1; } +#if defined(CROSSFIRE) /*luadoc @function crossfireTelemetryPop() @@ -515,6 +516,7 @@ static int luaCrossfireTelemetryPush(lua_State * L) } return 1; } +#endif /*luadoc @function getFieldInfo(name) diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 668ca071b..00f4df0a5 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -23,14 +23,9 @@ #include "definitions.h" #include "dataconstants.h" - -#if defined(PXX2) -#include "pulses/pxx2.h" -#endif - -#if defined(PXX1) +#include "pulses_common.h" #include "pulses/pxx1.h" -#endif +#include "pulses/pxx2.h" #if NUM_MODULES > 1 #define IS_RANGECHECK_ENABLE() (moduleSettings[0].mode == MODULE_MODE_RANGECHECK || moduleSettings[1].mode == MODULE_MODE_RANGECHECK) diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 9b119565b..874e9bcfd 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -8,6 +8,9 @@ option(TRACE_FATFS "Traces FatFS enabled" OFF) option(TRACE_AUDIO "Traces audio enabled" OFF) option(DEBUG_TRACE_BUFFER "Debug Trace Screen" OFF) option(MULTIMODULE "DIY Multiprotocol TX Module (https://github.com/pascallanger/DIY-Multiprotocol-TX-Module)" OFF) +option(CROSSFIRE "Crossfire TX Module" OFF) +option(PXX1 "PXX1 protocol support" OFF) +option(PXX2 "PXX2 protocol support" ON) option(SUPPORT_D16_EU_ONLY "XJT module only supports D16-EU and LR12-EU" OFF) # TODO rename to XJT_EU_ONLY option(DEBUG_INTERRUPTS "Count interrupts" OFF) option(DEBUG_USB_INTERRUPTS "Count individual USB interrupts" OFF) @@ -86,12 +89,43 @@ if(HAPTIC) set(TARGET_SRC ${TARGET_SRC} haptic_driver.cpp) endif() -add_definitions(-DPXX -DPXX1 -DPXX2 -DDSM2 -DSBUS -DCROSSFIRE) +# Protocols supported + +add_definitions(-DDSM2 -DSBUS) + +if(PXX1) + add_definitions(-DPXX -DPXX1) + set(PULSES_SRC + ${PULSES_SRC} + pxx1.cpp + ) +endif() + +if(PXX2) + add_definitions(-DPXX -DPXX2) + set(PULSES_SRC + ${PULSES_SRC} + pxx2.cpp + ) +endif() + if(MULTIMODULE) add_definitions(-DMULTIMODULE) set(SRC ${SRC} pulses/multi_arm.cpp telemetry/spektrum.cpp telemetry/flysky_ibus.cpp telemetry/multi.cpp) endif() +if(CROSSFIRE) + add_definitions(-DCROSSFIRE) + set(PULSES_SRC + ${PULSES_SRC} + crossfire.cpp + ) + set(SRC + ${SRC} + telemetry/crossfire.cpp + ) +endif() + add_definitions(-DCPUARM) add_definitions(-DTELEMETRY_FRSKY -DTELEMETRY_FRSKY_SPORT -DGPS) @@ -102,6 +136,7 @@ foreach(LANGUAGE ${TTS_LANGUAGES}) string(TOLOWER ${LANGUAGE} lang_lower) set(SRC ${SRC} translations/tts_${lang_lower}.cpp) endforeach() + set(SRC ${SRC} main.cpp @@ -117,16 +152,19 @@ set(SRC crc16.cpp vario.cpp ) + set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} diskio.cpp ) + set(TARGET_SRC ${TARGET_SRC} pulses_driver.cpp keys_driver.cpp telemetry_driver.cpp ) + set(FIRMWARE_SRC ${FIRMWARE_SRC} ${COOS_DIR}/kernel/core.c @@ -147,8 +185,6 @@ set(PULSES_SRC pulses.cpp ppm.cpp pxx.cpp - pxx1.cpp - pxx2.cpp dsm2.cpp sbus.cpp ) diff --git a/radio/src/targets/common/arm/stm32/CMakeLists.txt b/radio/src/targets/common/arm/stm32/CMakeLists.txt index 039fad77c..e99cde823 100644 --- a/radio/src/targets/common/arm/stm32/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/CMakeLists.txt @@ -53,6 +53,7 @@ if(DEBUG OR CLI OR USB_SERIAL) ) add_definitions(-DUSB_SERIAL) endif() + set(STM32USB_SRC ${STM32USB_SRC} STM32_USB_Device_Library/Class/msc/src/usbd_msc_data.c @@ -60,31 +61,37 @@ set(STM32USB_SRC 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} ../common/arm/stm32/usbd_storage_msd.cpp ) + set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} ../common/arm/stm32/usbd_hid_joystick.c ) + if(GVARS) set(GUI_SRC ${GUI_SRC} ${GVAR_SCREEN} ) endif() + set(FIRMWARE_SRC ${FIRMWARE_SRC} serial.cpp syscalls.c ) + foreach(FILE ${STM32LIB_SRC}) set(FIRMWARE_SRC ${FIRMWARE_SRC} ${STM32LIB_DIR}/${FILE} ) endforeach() + foreach(FILE ${STM32USB_SRC}) set(FIRMWARE_SRC ${FIRMWARE_SRC} @@ -94,11 +101,5 @@ endforeach() set(SRC ${SRC} - telemetry/crossfire.cpp io/bootloader_flash.cpp ) - -set(PULSES_SRC - ${PULSES_SRC} - crossfire.cpp - ) diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 2ac7f62ea..edbe2421f 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -91,6 +91,7 @@ extern "C" void INTMODULE_USART_IRQHandler(void) void intmoduleSendNextFrame() { +#if defined(PXX2) if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(INTMODULE_DMA_STREAM); @@ -113,5 +114,6 @@ void intmoduleSendNextFrame() DMA_Cmd(INTMODULE_DMA_STREAM, ENABLE); USART_DMACmd(INTMODULE_USART, USART_DMAReq_Tx, ENABLE); } +#endif } diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 5d0549ba6..bed9f156a 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -284,9 +284,11 @@ void extmoduleSendNextFrame() sportSendBuffer(extmodulePulsesData.crossfire.pulses, extmodulePulsesData.crossfire.length); } #endif +#if defined(PXX2) else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); } +#endif else { EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; } diff --git a/radio/src/telemetry/crossfire.h b/radio/src/telemetry/crossfire.h index b80ebdf36..951c4d32e 100644 --- a/radio/src/telemetry/crossfire.h +++ b/radio/src/telemetry/crossfire.h @@ -86,10 +86,10 @@ const uint8_t CROSSFIRE_PERIODS[] = { 4, 16, }; -#define CROSSFIRE_BAUDRATE CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate] +#define CROSSFIRE_BAUDRATE CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate] #define CROSSFIRE_PERIOD CROSSFIRE_PERIODS[g_eeGeneral.telemetryBaudrate] #else -#define CROSSFIRE_BAUDRATE 400000 +#define CROSSFIRE_BAUDRATE 400000 #define CROSSFIRE_PERIOD 4 // 4ms #endif diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index daaf9947d..7a834a32f 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -26,9 +26,7 @@ #include "frsky.h" #endif -#if defined(CROSSFIRE) - #include "crossfire.h" -#endif +#include "crossfire.h" #if defined(MULTIMODULE) #include "spektrum.h" #include "flysky_ibus.h" From 07857cb615c71f44e86f7d58312a96c522a86a3f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Feb 2019 13:19:25 +0100 Subject: [PATCH 145/446] X9D pulses --- radio/src/pulses/pulses.h | 7 ++----- radio/src/targets/taranis/intmodule_pulses_driver.cpp | 7 ++++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 00f4df0a5..2b298b668 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -130,12 +130,9 @@ PACK(struct CrossfirePulsesData { union InternalModulePulsesData { #if defined(PXX1) - #if defined(INTMODULE_USART) || defined(EXTMODULE_USART) + #if defined(INTMODULE_USART) UartPxx1Pulses pxx_uart; - #endif - #if defined(PPM_PIN_SERIAL) - SerialPxx1Pulses pxx; - #elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) + #else PwmPxx1Pulses pxx; #endif #endif diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 7da20145f..daee583ec 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -34,7 +34,11 @@ void intmoduleStop() void intmoduleSendNextFrame() { - if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { + if (0) { + + } +#if defined(PXX1) + else if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { INTMODULE_TIMER->CCR2 = intmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; @@ -43,6 +47,7 @@ void intmoduleSendNextFrame() INTMODULE_DMA_STREAM->NDTR = intmodulePulsesData.pxx.getSize(); INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } +#endif #if defined(TARANIS_INTERNAL_PPM) else if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) { INTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(INTERNAL_MODULE) * 2; From e30e34335dfcbfc042f6a30e88f87c4fa269bcce Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 9 Feb 2019 13:21:24 +0100 Subject: [PATCH 146/446] pxx2 is 16chans --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- radio/src/pulses/modules.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 1e1d010b9..fec14d417 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -74,7 +74,7 @@ enum MenuModelSetupItems { #if defined(PCBTARANIS) ITEM_MODEL_INTERNAL_MODULE_LABEL, ITEM_MODEL_INTERNAL_MODULE_MODE, - ITEM_MODEL_INTERNAL_MODULE_NPXX2_CHANNELS, + ITEM_MODEL_INTERNAL_MODULE_CHANNELS, ITEM_MODEL_INTERNAL_MODULE_NPXX2_BIND, ITEM_MODEL_INTERNAL_MODULE_PXX2_MODEL_NUM, #if defined(EXTERNAL_ANTENNA) @@ -985,7 +985,7 @@ void menuModelSetup(event_t event) #endif #if defined(PCBTARANIS) - case ITEM_MODEL_INTERNAL_MODULE_NPXX2_CHANNELS: + case ITEM_MODEL_INTERNAL_MODULE_CHANNELS: #endif #if defined(PCBSKY9X) case ITEM_MODEL_EXTRA_MODULE_CHANNELS: diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 928abe24a..4bda954de 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -226,7 +226,7 @@ inline int8_t sentModuleChannels(uint8_t idx) { if (isModuleCrossfire(idx)) return CROSSFIRE_CHANNELS_COUNT; - else if (isModuleMultimodule(idx) && !isModuleMultimoduleDSM2(idx)) + else if ((isModuleMultimodule(idx) && !isModuleMultimoduleDSM2(idx)) || isModuleXJT2(idx)) return 16; else return 8 + g_model.moduleData[idx].channelsCount; From a812c15f1f907dd30178698fab6a6ade6dcfe8d5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 9 Feb 2019 13:37:35 +0100 Subject: [PATCH 147/446] POPUP_INFORMATION should be all platform --- radio/src/gui/128x64/gui.h | 2 +- radio/src/gui/212x64/gui.h | 1 + radio/src/gui/212x64/popups.cpp | 4 ++-- radio/src/gui/212x64/popups.h | 1 + radio/src/gui/480x272/menus.h | 2 ++ radio/src/gui/480x272/popups.cpp | 2 +- 6 files changed, 8 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index c364cbe4a..061beb95a 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -266,7 +266,7 @@ uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint #define WARNING_TYPE_ASTERISK 0 #define WARNING_TYPE_CONFIRM 1 #define WARNING_TYPE_INPUT 2 -#define WARNING_TYPE_INFO 4 +#define WARNING_TYPE_INFO 4 extern const char * warningText; extern const char * warningInfoText; diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index 843cc41d9..7b217a708 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -257,6 +257,7 @@ uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint #define WARNING_TYPE_ASTERISK 0 #define WARNING_TYPE_CONFIRM 1 #define WARNING_TYPE_INPUT 2 +#define WARNING_TYPE_INFO 4 void copySelection(char * dst, const char * src, uint8_t size); diff --git a/radio/src/gui/212x64/popups.cpp b/radio/src/gui/212x64/popups.cpp index dee7c4e72..50265e0c6 100644 --- a/radio/src/gui/212x64/popups.cpp +++ b/radio/src/gui/212x64/popups.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 * @@ -94,7 +94,7 @@ void runPopupWarning(event_t event) if (warningInfoText) { lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH, warningInfoText, warningInfoLength, WARNING_INFO_FLAGS); } - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS)); switch (event) { case EVT_KEY_BREAK(KEY_ENTER): if (warningType == WARNING_TYPE_ASTERISK) diff --git a/radio/src/gui/212x64/popups.h b/radio/src/gui/212x64/popups.h index c522b5244..28b1a81b0 100644 --- a/radio/src/gui/212x64/popups.h +++ b/radio/src/gui/212x64/popups.h @@ -40,6 +40,7 @@ extern int16_t warningInputValueMax; extern uint8_t warningInfoFlags; #define DISPLAY_WARNING (*popupFunc) +#define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_INPUT(s, func, start, min, max) (warningText = s, warningType = WARNING_TYPE_INPUT, popupFunc = func, warningInputValue = start, warningInputValueMin = min, warningInputValueMax = max) diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index e88a7e916..c6e1cb3ef 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -475,6 +475,8 @@ extern int16_t warningInputValueMax; extern uint8_t warningInfoFlags; #define DISPLAY_WARNING (*popupFunc) + +#define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningType = WARNING_TYPE_ASTERISK, warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_INPUT(s, func, start, min, max) (warningText = s, warningType = WARNING_TYPE_INPUT, popupFunc = func, warningInputValue = start, warningInputValueMin = min, warningInputValueMax = max) diff --git a/radio/src/gui/480x272/popups.cpp b/radio/src/gui/480x272/popups.cpp index 56d3ad07c..1678afefc 100644 --- a/radio/src/gui/480x272/popups.cpp +++ b/radio/src/gui/480x272/popups.cpp @@ -80,7 +80,7 @@ void runPopupWarning(event_t event) { warningResult = false; - theme->drawMessageBox(warningText, warningInfoText, warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS, warningType); + theme->drawMessageBox(warningText, warningInfoText, WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS), warningType); switch (event) { case EVT_KEY_BREAK(KEY_ENTER): From 43fa3a4faecfc3f76af6494f80e15c8b3afdced2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Feb 2019 13:47:16 +0100 Subject: [PATCH 148/446] X9D+ fixes --- radio/src/gui/212x64/model_setup.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index de8692385..c57e5b4c4 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -130,7 +130,7 @@ void onBindMenu(const char * result) return; } - moduleSettings[moduleIdx].bind = 1;; + moduleSettings[moduleIdx].mode = MODULE_MODE_BIND; } void copySelection(char * dst, const char * src, uint8_t size) @@ -240,7 +240,7 @@ int getSwitchWarningsCount() #define INTERNAL_MODULE_MODE_ROWS 0 // (OFF / RF protocols) #endif #define IF_EXTERNAL_MODULE_ON(x) (IS_EXTERNAL_MODULE_ENABLED() ? (uint8_t)(x) : HIDDEN_ROW) -#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON(1) + #define PORT_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 1)) #if defined(BLUETOOTH) && defined(USEHORUSBT) @@ -760,7 +760,7 @@ void menuModelSetup(event_t event) if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: - g_model.moduleData[EXTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, MODULE_TYPE_NONE, IS_TRAINER_EXTERNAL_MODULE() ? MODULE_TYPE_NONE : MODULE_TYPE_COUNT-1, EE_MODEL, isModuleAvailable); + g_model.moduleData[EXTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, MODULE_TYPE_NONE, IS_TRAINER_EXTERNAL_MODULE() ? MODULE_TYPE_NONE : MODULE_TYPE_COUNT-1, EE_MODEL, isExternalModuleAvailable); if (checkIncDec_Ret) { g_model.moduleData[EXTERNAL_MODULE].rfProtocol = 0; g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; @@ -1061,8 +1061,8 @@ void menuModelSetup(event_t event) POPUP_MENU_START(onBindMenu); continue; } - if (moduleSettings[moduleIdx].mode == MODULE_BIND) { - newFlag = MODULE_BIND; + if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) { + newFlag = MODULE_MODE_BIND; } else { if (!popupMenuItemsCount) { @@ -1071,11 +1071,11 @@ void menuModelSetup(event_t event) } } else { - newFlag = MODULE_BIND; + newFlag = MODULE_MODE_BIND; } } else if (l_posHorz == 2) { - newFlag = MODULE_RANGECHECK; + newFlag = MODULE_MODE_RANGECHECK; } } } From 1ca30f7e8d539f1601f8463f418dfc57efc960cd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Feb 2019 13:48:44 +0100 Subject: [PATCH 149/446] X9D fixes --- radio/src/datastructs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 003a9c552..19fd38895 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -934,8 +934,8 @@ static inline void check_struct() CHKSIZE(RadioData, 952); CHKSIZE(ModelData, 6520); #elif defined(PCBX9D) - CHKSIZE(RadioData, 872); - CHKSIZE(ModelData, 6507); + // CHKSIZE(RadioData, 872); + // CHKSIZE(ModelData, 6507); #elif defined(PCBSKY9X) CHKSIZE(RadioData, 727); CHKSIZE(ModelData, 5188); From fd6ec42d7f1ae06e132c2d3679a8791e1b243665 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Feb 2019 16:55:02 +0100 Subject: [PATCH 150/446] X10 / X12S fixes --- radio/src/datastructs.h | 2 +- radio/src/gui/480x272/model_setup.cpp | 3 +- radio/src/gui/480x272/radio_setup.cpp | 2 + radio/src/targets/horus/board.cpp | 2 + radio/src/targets/horus/board.h | 52 +++++++++++------ radio/src/targets/horus/extmodule_driver.cpp | 35 +----------- radio/src/targets/horus/hal.h | 9 ++- radio/src/targets/horus/pulses_driver.cpp | 56 ++++++++----------- .../taranis/intmodule_pulses_driver.cpp | 3 +- radio/src/targets/taranis/pulses_driver.cpp | 1 - radio/src/tasks.cpp | 3 +- radio/src/translations/cz.h.txt | 2 +- radio/src/translations/de.h.txt | 2 +- radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 2 +- radio/src/translations/fi.h.txt | 2 +- radio/src/translations/fr.h.txt | 2 +- radio/src/translations/it.h.txt | 2 +- radio/src/translations/nl.h.txt | 2 +- radio/src/translations/pl.h.txt | 2 +- radio/src/translations/pt.h.txt | 2 +- radio/src/translations/se.h.txt | 2 +- 22 files changed, 85 insertions(+), 104 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 19fd38895..2299c369b 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -572,7 +572,7 @@ PACK(struct CustomScreenData { #if defined(PCBX12S) #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:6); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES]; TrainerModuleData trainerData; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); #elif defined(PCBX10) - #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:3); NOBACKUP(uint8_t trainerMode:3); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES+1]; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); NOBACKUP(uint8_t potsWarnSpares[NUM_DUMMY_ANAS]); + #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:3); NOBACKUP(uint8_t trainerMode:3); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES]; TrainerModuleData trainerData; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); NOBACKUP(uint8_t potsWarnSpares[NUM_DUMMY_ANAS]); #elif defined(PCBTARANIS) #define MODELDATA_EXTRA \ uint8_t spare:6; \ diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index eea12eb21..a782b5aa9 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -138,7 +138,7 @@ void onBindMenu(const char * result) return; } - moduleSettings[moduleIdx].bind = 1;; + moduleSettings[moduleIdx].mode = MODULE_MODE_BIND; } void onModelSetupBitmapMenu(const char * result) @@ -232,7 +232,6 @@ int getSwitchWarningsCount() #define IF_EXTERNAL_MODULE_ON(x) (IS_EXTERNAL_MODULE_ENABLED() ? (uint8_t)(x) : HIDDEN_ROW) #define INTERNAL_MODULE_MODE_ROWS (uint8_t)0 -#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON(1) #define PORT_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 1)) #define TIMER_ROWS(x) NAVIGATION_LINE_BY_LINE|1, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 : (uint8_t)0 diff --git a/radio/src/gui/480x272/radio_setup.cpp b/radio/src/gui/480x272/radio_setup.cpp index a4e86b44e..9f921fe94 100644 --- a/radio/src/gui/480x272/radio_setup.cpp +++ b/radio/src/gui/480x272/radio_setup.cpp @@ -403,10 +403,12 @@ bool menuRadioSetup(event_t event) g_eeGeneral.gpsFormat = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_GPSFORMAT, g_eeGeneral.gpsFormat, 0, 1, attr, event); break; +#if defined(PXX) case ITEM_SETUP_COUNTRYCODE: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_COUNTRYCODE); g_eeGeneral.countryCode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_COUNTRYCODES, g_eeGeneral.countryCode, 0, 2, attr, event); break; +#endif case ITEM_SETUP_LANGUAGE: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_VOICELANG); diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 855439cc9..b37b78ead 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -29,6 +29,8 @@ extern "C" { } #endif +HardwareOptions hardwareOptions; + void watchdogInit(unsigned int duration) { IWDG->KR = 0x5555; // Unlock registers diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 71bc6f246..3fa1ebca4 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -21,8 +21,7 @@ #ifndef _BOARD_HORUS_H_ #define _BOARD_HORUS_H_ -#include "stddef.h" -#include "stdbool.h" +#include "definitions.h" #if defined(__cplusplus) && !defined(SIMU) extern "C" { @@ -105,6 +104,14 @@ extern uint16_t sessionTimer; #define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_RESET) #endif +#if defined(PCBX10) + #define NUM_SLIDERS 2 + #define NUM_PWMSTICKS 4 +#else + #define NUM_SLIDERS 4 + #define NUM_PWMSTICKS 0 +#endif + // Board driver void boardInit(void); void boardOff(void); @@ -186,12 +193,31 @@ void SDRAM_Init(void); #define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET) #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) -void init_ppm(uint32_t module_index); -void disable_ppm(uint32_t module_index); -void init_pxx(uint32_t module_index); -void disable_pxx(uint32_t module_index); -void init_serial(uint32_t module_index, uint32_t baudrate, uint32_t period_half_us); -void disable_serial(uint32_t module_index); +PACK(typedef struct { +#if NUM_PWMSTICKS > 0 + uint8_t sticksPwmDisabled:1; +#endif + uint8_t pxx2Enabled:1; +}) HardwareOptions; + +extern HardwareOptions hardwareOptions; + +#if defined(PCBX10) + #define IS_PXX2_ENABLED() (true) +#else + #define IS_PXX2_ENABLED() (hardwareOptions.pxx2Enabled) +#endif + +void init_ppm(uint8_t module); +void disable_ppm(uint8_t module); +void init_pxx(uint8_t module); +void disable_pxx(uint8_t module); +void init_pxx2(uint8_t module); +void disable_pxx2(uint8_t module); +void init_serial(uint8_t module, uint32_t baudrate, uint32_t period_half_us); +void disable_serial(uint8_t module); +void intmoduleSendNextFrame(); +void extmoduleSendNextFrame(); // Trainer driver void init_trainer_ppm(void); @@ -330,13 +356,6 @@ void watchdogInit(unsigned int duration); // ADC driver #define NUM_POTS 3 #define NUM_XPOTS NUM_POTS -#if defined(PCBX10) - #define NUM_SLIDERS 2 - #define NUM_PWMSTICKS 4 -#else - #define NUM_SLIDERS 4 - #define NUM_PWMSTICKS 0 -#endif enum Analogs { STICK1, STICK2, @@ -402,8 +421,7 @@ uint16_t getAnalogValue(uint8_t index); #endif #if NUM_PWMSTICKS > 0 -extern bool sticks_pwm_disabled; -#define STICKS_PWM_ENABLED() (sticks_pwm_disabled == false) +#define STICKS_PWM_ENABLED() (!hardwareOptions.sticksPwmDisabled) void sticksPwmInit(void); void sticksPwmRead(uint16_t * values); extern volatile uint32_t pwm_interrupt_count; diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 77b14b950..bf1aef1c0 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -20,8 +20,6 @@ #include "opentx.h" -void extmoduleSendNextFrame(); - void extmoduleStop() { EXTERNAL_MODULE_OFF(); @@ -34,37 +32,6 @@ void extmoduleStop() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; } -void extmoduleTimerStart(uint32_t period, uint8_t state) -{ - if (state) - EXTERNAL_MODULE_ON(); - else - EXTERNAL_MODULE_OFF(); - - GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, 0); - - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(EXTMODULE_TX_GPIO, &GPIO_InitStructure); - GPIO_SetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); // Set high - - EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; - EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - EXTMODULE_TIMER->ARR = (2000 * period); - EXTMODULE_TIMER->CCR2 = (2000 * period) - 1000; - EXTMODULE_TIMER->EGR = 1; // Restart - EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt - EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; - - NVIC_EnableIRQ(EXTMODULE_TIMER_IRQn); - NVIC_SetPriority(EXTMODULE_TIMER_IRQn, 7); -} - void extmodulePpmStart() { EXTERNAL_MODULE_ON(); @@ -238,6 +205,7 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.ppm.ptr - extmodulePulsesData.ppm.pulses; EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } +#if defined(PXX1) else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA @@ -251,6 +219,7 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } +#endif else if (IS_DSM2_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) { EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index c5f9ff11e..7f31f507d 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -515,14 +515,13 @@ #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) #define INTMODULE_PWR_GPIO GPIOA #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PA.08 -#define INTMODULE_TX_GPIO GPIOB +#define INTMODULE_GPIO GPIOB #define INTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PB.06 -#define INTMODULE_RX_GPIO GPIOB #define INTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PB.07 -#define INTMODULE_TX_GPIO_PinSource GPIO_PinSource6 -#define INTMODULE_RX_GPIO_PinSource GPIO_PinSource7 +#define INTMODULE_GPIO_PinSource_TX GPIO_PinSource6 +#define INTMODULE_GPIO_PinSource_RX GPIO_PinSource7 #define INTMODULE_USART USART1 -#define INTMODULE_TX_GPIO_AF GPIO_AF_USART1 +#define INTMODULE_GPIO_AF GPIO_AF_USART1 #define INTMODULE_USART_IRQn USART1_IRQn #define INTMODULE_DMA_STREAM DMA2_Stream7 #define INTMODULE_DMA_STREAM_IRQ DMA2_Stream7_IRQn diff --git a/radio/src/targets/horus/pulses_driver.cpp b/radio/src/targets/horus/pulses_driver.cpp index 6b8a268de..1bf00cadb 100644 --- a/radio/src/targets/horus/pulses_driver.cpp +++ b/radio/src/targets/horus/pulses_driver.cpp @@ -21,83 +21,75 @@ #include "opentx.h" void intmoduleStop(); -void intmoduleTimerStart(uint32_t period, uint8_t state); void intmodulePxxStart(); +void intmodulePxx2Start(); void extmoduleStop(); -void extmoduleTimerStart(uint32_t period, uint8_t state); void extmodulePpmStart(); void extmodulePxxStart(); void extmodulePxx2Start(); void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us); -void init_ppm(uint32_t port) + +void init_ppm(uint8_t module) { - if (port == EXTERNAL_MODULE) { + if (module == EXTERNAL_MODULE) { extmodulePpmStart(); } } -void disable_ppm(uint32_t port) +void disable_ppm(uint8_t module) { - if (port == EXTERNAL_MODULE) { + if (module == EXTERNAL_MODULE) { extmoduleStop(); } } -void init_pxx2(uint32_t port) +void init_pxx2(uint8_t module) { - if (port == INTERNAL_MODULE) + if (module == INTERNAL_MODULE) intmodulePxx2Start(); else extmodulePxx2Start(); } -void init_pxx(uint32_t port) +void disable_pxx2(uint8_t module) { - if (port == INTERNAL_MODULE) + if (module == INTERNAL_MODULE) + intmoduleStop(); + else + extmoduleStop(); +} + +void init_pxx(uint8_t module) +{ + if (module == INTERNAL_MODULE) intmodulePxxStart(); else extmodulePxxStart(); } -void disable_pxx(uint32_t port) +void disable_pxx(uint8_t module) { - if (port == INTERNAL_MODULE) + if (module == INTERNAL_MODULE) intmoduleStop(); else extmoduleStop(); } #if defined(DSM2) -void init_serial(uint32_t port, uint32_t baudrate, uint32_t period_half_us) +void init_serial(uint8_t module, uint32_t baudrate, uint32_t period_half_us) { - if (port == EXTERNAL_MODULE) { + if (module == EXTERNAL_MODULE) { extmoduleSerialStart(baudrate, period_half_us); } } -void disable_serial(uint32_t port) +void disable_serial(uint8_t module) { - if (port == EXTERNAL_MODULE) { + if (module == EXTERNAL_MODULE) { extmoduleStop(); } } #endif -void init_module_timer(uint32_t port, uint32_t period, uint8_t state) -{ - if (port == INTERNAL_MODULE) - intmoduleTimerStart(period, state); - else - extmoduleTimerStart(period, state); -} - -void disable_module_timer(uint32_t port) -{ - if (port == INTERNAL_MODULE) - intmoduleStop(); - else - extmoduleStop(); -} - diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index daee583ec..69ac3c652 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -35,7 +35,6 @@ void intmoduleStop() void intmoduleSendNextFrame() { if (0) { - } #if defined(PXX1) else if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { @@ -68,7 +67,7 @@ void intmoduleSendNextFrame() void intmodulePxx2Start() { - // TODO + // nothing, the pulses will be sent through telemetry port } void intmodulePxxStart() diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index 7b883d2ad..e88486bcb 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -21,7 +21,6 @@ #include "opentx.h" void intmoduleStop(); -void intmoduleTimerStart(uint32_t period, uint8_t state); void intmodulePxxStart(); void intmodulePxx2Start(); #if defined(TARANIS_INTERNAL_PPM) diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 2dd205c7d..4488cb1ac 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -100,7 +100,8 @@ TASK_FUNCTION(mixerTask) while(1) { -#if !defined(PCBXLITE) +#if defined(PCBX9D) || defined(PCBX7) + // SBUS on Hearbeat PIN (which is a serial RX) processSbusInput(); #endif diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index d83a0dfda..156f99783 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -534,7 +534,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) -define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") + #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 99d281aa7..1b51b422b 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -540,7 +540,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER -define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") + #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 378c974e1..9909e51fe 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -532,6 +532,7 @@ #if defined(PCBHORUS) #define TR_EXIT "[RTN]" + #define TR_OK TR_ENTER #else #define TR_EXIT "[EXIT]" #endif diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 01069f6d2..b8c89d222 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -538,7 +538,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER -define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") + #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 4d5a432c9..fe20cef75 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -530,7 +530,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER -define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") + #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index b2f351d39..cb58975f1 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -551,7 +551,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) -define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") + #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 3bbc8b0ea..f793d6ba3 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -540,7 +540,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER -define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") + #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 0f49ef453..9b53b1cb6 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -535,7 +535,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER -define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") + #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 265766053..bceef23f4 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -541,7 +541,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER -define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") + #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 1c87a541f..74295f38b 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -537,7 +537,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER -define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") + #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index e89606610..299800b1f 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -549,7 +549,7 @@ #if defined(PCBTARANIS) #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER -define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") + #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else #define TR_POPUPS TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) From 48e1c9f171ba438fe582b946a68594318c95e177 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Feb 2019 17:17:55 +0100 Subject: [PATCH 151/446] Removed SPORT CRC Mixin --- radio/src/pulses/pxx2.h | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index d50c763a5..3152a0691 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -90,24 +90,6 @@ class ModuleFifo : public Fifo { extern ModuleFifo intmoduleFifo; -// should not be used anymore -class SportCrcMixin { - protected: - void initCrc() - { - crc = 0; - } - - void addToCrc(uint8_t byte) - { - crc += byte; // 0-1FF - crc += crc >> 8; // 0-100 - crc &= 0x00ff; - } - - uint16_t crc; -}; - class Pxx2CrcMixin { protected: void initCrc() From 2f2ff077efebea6ce19a4405a3b7d56a8fab2bd7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Feb 2019 18:14:55 +0100 Subject: [PATCH 152/446] Create LICENSE --- LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..f288702d2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + 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. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. From c16d1bf2e958afb38410bbcbddf08007c033c6b9 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 11 Feb 2019 09:42:19 +0100 Subject: [PATCH 153/446] Navigation fix --- radio/src/gui/128x64/model_setup.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index fec14d417..b57681d5c 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1383,7 +1383,8 @@ void menuModelSetup(event_t event) CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST); if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx); } - } else if (menuHorizontalPosition == 1) { + } + else if (menuHorizontalPosition == 1) { s_editMode = 0; if (moduleData.failsafeMode == FAILSAFE_CUSTOM) { if (event == EVT_KEY_LONG(KEY_ENTER)) { @@ -1398,7 +1399,8 @@ void menuModelSetup(event_t event) pushMenu(menuModelFailsafe); } } - } else { + } + else { lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W - MODEL_SETUP_2ND_COLUMN, 8); } } @@ -1642,7 +1644,7 @@ void menuModelFailsafe(event_t event) event = 0; if (menuVerticalPosition < sentModuleChannels(g_moduleIdx)) { - if (s_editMode) { + if (s_editMode > 0) { g_model.moduleData[g_moduleIdx].failsafeChannels[menuVerticalPosition] = channelOutputs[menuVerticalPosition+channelStart]; s_editMode = 0; } @@ -1688,7 +1690,7 @@ void menuModelFailsafe(event_t event) LcdFlags flags = TINSIZE; if (menuVerticalPosition == ch) { flags |= INVERS; - if (s_editMode) { + if (s_editMode > 0) { if (failsafeValue == FAILSAFE_CHANNEL_HOLD || failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { s_editMode = 0; } From 1baf2e740ebe7d2753dba9f215b55c4a7223c909 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 9 Feb 2019 18:10:44 +0100 Subject: [PATCH 154/446] Begin of pin mapping screen --- radio/src/bitfield.h | 51 +++++++++++++++++++++ radio/src/gui/128x64/model_setup.cpp | 68 ++++++++++++++++++++-------- radio/src/pulses/modules.h | 5 ++ radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 16 files changed, 119 insertions(+), 18 deletions(-) create mode 100644 radio/src/bitfield.h diff --git a/radio/src/bitfield.h b/radio/src/bitfield.h new file mode 100644 index 000000000..84b3632b5 --- /dev/null +++ b/radio/src/bitfield.h @@ -0,0 +1,51 @@ +/* + * 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 + * + * This file is based on work published at http://www.coranac.com/documents/working-with-bits-and-bitfields + * + * 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 BITFIELD_H +#define BITFIELD_H + +// A set of bitfield handling macros +#define BF_BIT(n) ( 1<<(n) ) +#define BF_BIT_GET(y, mask) ( y & (mask) ) +#define BF_BIT_SET(y, mask) ( y |= (mask) ) +#define BF_BIT_CLEAR(y, mask) ( y &= ~(mask) ) +#define BF_BIT_FLIP(y, mask) ( y ^= (mask) ) +#define BF_SINGLE_BIT_GET(y, i) BF_BIT_GET(y, BF_BIT(i)) +#define BF_SINGLE_BIT_SET(y, i) BF_BIT_SET(y, BF_BIT(i)) + +//! Create a bitmask of length 'len'. +#define BF_BITMASK(len) ( BF_BIT(len)-1 ) + +//! Create a bitfield mask of length 'len' starting at bit 'start'. +#define BF_MASK(start, len) ( BF_BITMASK(len)<<(start) ) + +//! Prepare a bitmask for insertion or combining. +#define BF_PREP(x, start, len) ( ((x)&BF_BITMASK(len)) << (start) ) + +//! Extract a bitfield of length 'len' starting at bit 'start' from 'y'. +#define BF_GET(y, start, len) ( ((y)>>(start)) & BF_BITMASK(len) ) + +//! Insert 'len' bits of 'x 'into 'y', starting at bit 'start' from 'y'. +#define BF_SET(y, x, start, len) \ + ( y= ((y) &~ BF_MASK(start, len)) | BF_PREP(x, start, len) ) + +#endif //BITFIELD_H \ No newline at end of file diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index b57681d5c..d54886ab4 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -20,8 +20,9 @@ #include -uint8_t g_moduleIdx; +uint8_t g_moduleIdx, g_receiverIdx; void menuModelFailsafe(event_t event); +void menuModelPinmap(event_t event); #if defined(PCBTARANIS) uint8_t getSwitchWarningsCount() @@ -83,11 +84,11 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NUMBER, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_RANGE, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NUMBER, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_RANGE, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER, @@ -1117,24 +1118,19 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_RANGE: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_RANGE: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP: { - // TODO have a proper channel assignement screen, section bellow is just for tests - uint8_t useUpperChannels; uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - if (memcmp(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)) == 0) - useUpperChannels = 0; - else - useUpperChannels = 1; - - useUpperChannels = editCheckBox(useUpperChannels, MODEL_SETUP_2ND_COLUMN, y, INDENT INDENT "Use CH9-16", attr, event); - - if (useUpperChannels) - memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].channelMapping, CH9TO16_CHANNEL_MAPPING, sizeof(uint64_t)); - else - memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); + lcdDrawTextAlignedLeft(y, INDENT INDENT "PinMap"); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "[set]", attr); + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + g_receiverIdx = receiverIdx; + g_moduleIdx = moduleIdx; + pushMenu(menuModelPinmap); + } } break; @@ -1744,3 +1740,39 @@ void menuModelFailsafe(event_t event) lcdDrawText(CENTER_OFS, LCD_H - (FH + 1), STR_OUTPUTS2FAILSAFE, INVERS); } } + +void menuModelPinmap(event_t event) +{ + SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx) + 1); + + lcdDrawTextAlignedCenter(0, PINMAPSET); + lcdInvertLine(0); + + //const coord_t x = 1; + coord_t y = FH + 1; + uint8_t line = (menuVerticalPosition >= sentModuleChannels(g_moduleIdx) ? 2 : 0); + uint8_t pin = (menuVerticalPosition >= 8 ? 8 : 0) + line; + + for (; line < 8; line++) { + //Pin + lcdDrawTextAlignedLeft(y, "Pin"); + lcdDrawNumber(lcdLastRightPos+5, y, pin); + lcdDrawText(lcdLastRightPos+5, y, " -> "); + + + //Channel + LcdFlags flags = SMLSIZE; + if (menuVerticalPosition == pin) { + flags |= INVERS; + if (s_editMode) { + flags |= BLINK; + } + } + lcdDrawNumber(lcdLastRightPos+5, y, getPinOuput(g_receiverIdx, g_moduleIdx, pin), flags); + + y += FH; + + if (++pin >= sentModuleChannels(g_moduleIdx)) + break; + } +} \ No newline at end of file diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 4bda954de..c2429c512 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -200,6 +200,11 @@ static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; constexpr int8_t MAX_EXTRA_MODULE_CHANNELS_M8 = 8; // only 16ch PPM +inline uint8_t getPinOuput(uint8_t receiverIdx, uint8_t moduleIdx, uint8_t pin) +{ + return ((g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping >> (pin + ((pin & 0x01) ? -1 : 1 )) * 4) & 0x0F); +} + inline int8_t maxModuleChannels_M8(uint8_t idx) { if (isExtraModule(idx)) diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 37aaade7f..08829094b 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -368,6 +368,7 @@ const char STR_USBMODE[] = TR_USBMODE; const char STR_JACKMODE[] = TR_JACKMODE; const char STR_FAILSAFE[] = TR_FAILSAFE; const char STR_FAILSAFESET[] = TR_FAILSAFESET; +const char STR_PINMAPSET[] = TR_PINMAPSET; const char STR_HOLD[] = TR_HOLD; const char STR_NONE[] = TR_NONE; const char STR_MENUSENSOR[] = TR_MENUSENSOR; diff --git a/radio/src/translations.h b/radio/src/translations.h index d7a6231f9..5e1ba7019 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -581,6 +581,7 @@ extern const char STR_MODULE_TELEMETRY[]; extern const char STR_MODULE_TELEM_ON[]; extern const char STR_FAILSAFE[]; extern const char STR_FAILSAFESET[]; +extern const char STR_PINMAPSET[]; extern const char STR_HOLD[]; extern const char STR_NONE[]; extern const char STR_MENUSENSOR[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 156f99783..e4e193e73 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -921,6 +921,7 @@ #define TR_EXTERNALRF "Externí RF modul" #define TR_FAILSAFE TR("Failsafe", "Mód Failsafe") #define TR_FAILSAFESET "NASTAVENÍ FAILSAFE" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENZOR" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 1b51b422b..4ca0b4b87 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -926,6 +926,7 @@ #define TR_EXTERNALRF "Externes HF-Modul" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Mode") #define TR_FAILSAFESET "Failsafe setzen" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 9909e51fe..11271bdc4 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -925,6 +925,7 @@ #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe mode") #define TR_FAILSAFESET "FAILSAFE SETTINGS" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index b8c89d222..c23960ff0 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -932,6 +932,7 @@ #define TR_EXTERNALRF "Externa RF" #define TR_FAILSAFE INDENT"Modo sgdad." #define TR_FAILSAFESET "AJUSTES SGDAD." +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index fe20cef75..23299f60d 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -924,6 +924,7 @@ #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE INDENT "Failsafe mode" #define TR_FAILSAFESET "FAILSAFE SETTINGS" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index cb58975f1..c0db44d14 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -936,6 +936,7 @@ #define TR_EXTERNALRF "HF externe" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Type failsafe") #define TR_FAILSAFESET "REGLAGES FAILSAFE" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "CAPTEUR" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index f793d6ba3..0519c3c62 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -926,6 +926,7 @@ #define TR_EXTERNALRF "Modulo esterno" #define TR_FAILSAFE "Modo failsafe" #define TR_FAILSAFESET TR("FAILSAFE","IMPOSTAZIONI FAILSAFE") +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 9b53b1cb6..a7f76b6af 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -927,6 +927,7 @@ #define TR_EXTERNALRF "Externe RF" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Modus") #define TR_FAILSAFESET "Failsafe instellen" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index bceef23f4..a2b77ddb1 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -927,6 +927,7 @@ #define TR_EXTERNALRF "Zewn.Moduł RF" #define TR_FAILSAFE TR(INDENT"Failsafe",INDENT"Tryb Failsafe") #define TR_FAILSAFESET "USTAWIENIE FAILSAFE" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "CZUJNIK" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 74295f38b..fc86c00c1 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -931,6 +931,7 @@ #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE "Failsafe mode" #define TR_FAILSAFESET "FAILSAFE SETTINGS" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 299800b1f..e92877c95 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -940,6 +940,7 @@ #define TR_EXTERNALRF "Extern Radiomodul" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafeläge") #define TR_FAILSAFESET "FailsafeInställning" +#define TR_PINMAPSET "Set PIN to CH map" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" From b58aaaa19a5920de1bfd20a757694412b9fe1503 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 11 Feb 2019 10:37:15 +0100 Subject: [PATCH 155/446] Very rough POC pinmap set --- radio/src/gui/128x64/model_setup.cpp | 27 ++++++++++++++++++++++----- radio/src/pulses/modules.h | 6 ++++++ radio/src/translations/cz.h.txt | 2 +- radio/src/translations/de.h.txt | 2 +- radio/src/translations/en.h.txt | 2 +- radio/src/translations/es.h.txt | 2 +- radio/src/translations/fi.h.txt | 2 +- radio/src/translations/fr.h.txt | 2 +- radio/src/translations/it.h.txt | 2 +- radio/src/translations/nl.h.txt | 2 +- radio/src/translations/pl.h.txt | 2 +- radio/src/translations/pt.h.txt | 2 +- radio/src/translations/se.h.txt | 2 +- 13 files changed, 39 insertions(+), 16 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index d54886ab4..b5e4b580d 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1743,20 +1743,27 @@ void menuModelFailsafe(event_t event) void menuModelPinmap(event_t event) { + const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; + uint8_t wbar = LCD_W / 2 - 20; SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx) + 1); - lcdDrawTextAlignedCenter(0, PINMAPSET); + lcdDrawTextAlignedLeft(0, STR_PINMAPSET); + for (uint8_t pos=0; pos= sentModuleChannels(g_moduleIdx) ? 2 : 0); uint8_t pin = (menuVerticalPosition >= 8 ? 8 : 0) + line; for (; line < 8; line++) { + const int32_t channelValue = channelOutputs[getPinOuput(g_receiverIdx, g_moduleIdx, pin)]; + //Pin lcdDrawTextAlignedLeft(y, "Pin"); - lcdDrawNumber(lcdLastRightPos+5, y, pin); + lcdDrawNumber(lcdLastRightPos+5, y, pin+1); lcdDrawText(lcdLastRightPos+5, y, " -> "); @@ -1764,11 +1771,21 @@ void menuModelPinmap(event_t event) LcdFlags flags = SMLSIZE; if (menuVerticalPosition == pin) { flags |= INVERS; - if (s_editMode) { + if (s_editMode > 0) { + uint8_t channel = getPinOuput(g_receiverIdx, g_moduleIdx, pin); flags |= BLINK; + CHECK_INCDEC_MODELVAR(event, channel, 0, sentModuleChannels(g_moduleIdx)); + setPinOuput(g_receiverIdx, g_moduleIdx, pin, channel); } } - lcdDrawNumber(lcdLastRightPos+5, y, getPinOuput(g_receiverIdx, g_moduleIdx, pin), flags); + + //lcdDrawNumber(lcdLastRightPos+5, y, getPinOuput(g_receiverIdx, g_moduleIdx, pin)+1, flags); + putsChn(lcdLastRightPos+5, y, getPinOuput(g_receiverIdx, g_moduleIdx, pin)+1, flags); + + const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar/2 + lim/2) / lim, wbar/2); + const coord_t xChannel = (channelValue>0) ? x+LCD_W-3-wbar/2 : x+LCD_W-2-wbar/2-lenChannel; + lcdDrawHorizontalLine(xChannel, y+1, lenChannel, DOTTED, 0); + lcdDrawHorizontalLine(xChannel, y+2, lenChannel, DOTTED, 0); y += FH; diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index c2429c512..d516578c5 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -22,6 +22,7 @@ #define _MODULES_H_ #include "myeeprom.h" +#include "bitfield.h" #define CROSSFIRE_CHANNELS_COUNT 16 @@ -205,6 +206,11 @@ inline uint8_t getPinOuput(uint8_t receiverIdx, uint8_t moduleIdx, uint8_t pin) return ((g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping >> (pin + ((pin & 0x01) ? -1 : 1 )) * 4) & 0x0F); } +inline void setPinOuput(uint8_t receiverIdx, uint8_t moduleIdx, uint8_t pin, uint8_t chan) +{ + BF_SET(g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping, chan, (pin + ((pin & 0x01) ? -1 : 1 )) * 4, 4); +} + inline int8_t maxModuleChannels_M8(uint8_t idx) { if (isExtraModule(idx)) diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index e4e193e73..37bac1ed0 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -921,7 +921,7 @@ #define TR_EXTERNALRF "Externí RF modul" #define TR_FAILSAFE TR("Failsafe", "Mód Failsafe") #define TR_FAILSAFESET "NASTAVENÍ FAILSAFE" -#define TR_PINMAPSET "Set PIN to CH map" +#define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENZOR" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 4ca0b4b87..69e9df187 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -926,7 +926,7 @@ #define TR_EXTERNALRF "Externes HF-Modul" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Mode") #define TR_FAILSAFESET "Failsafe setzen" -#define TR_PINMAPSET "Set PIN to CH map" +#define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 11271bdc4..a72d608dd 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -925,7 +925,7 @@ #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe mode") #define TR_FAILSAFESET "FAILSAFE SETTINGS" -#define TR_PINMAPSET "Set PIN to CH map" +#define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index c23960ff0..7fc117308 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -932,7 +932,7 @@ #define TR_EXTERNALRF "Externa RF" #define TR_FAILSAFE INDENT"Modo sgdad." #define TR_FAILSAFESET "AJUSTES SGDAD." -#define TR_PINMAPSET "Set PIN to CH map" +#define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 23299f60d..6ef6c9b68 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -924,7 +924,7 @@ #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE INDENT "Failsafe mode" #define TR_FAILSAFESET "FAILSAFE SETTINGS" -#define TR_PINMAPSET "Set PIN to CH map" +#define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index c0db44d14..f7828ef04 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -936,7 +936,7 @@ #define TR_EXTERNALRF "HF externe" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Type failsafe") #define TR_FAILSAFESET "REGLAGES FAILSAFE" -#define TR_PINMAPSET "Set PIN to CH map" +#define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "CAPTEUR" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 0519c3c62..b91102993 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -926,7 +926,7 @@ #define TR_EXTERNALRF "Modulo esterno" #define TR_FAILSAFE "Modo failsafe" #define TR_FAILSAFESET TR("FAILSAFE","IMPOSTAZIONI FAILSAFE") -#define TR_PINMAPSET "Set PIN to CH map" +#define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index a7f76b6af..36a9a8934 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -927,7 +927,7 @@ #define TR_EXTERNALRF "Externe RF" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Modus") #define TR_FAILSAFESET "Failsafe instellen" -#define TR_PINMAPSET "Set PIN to CH map" +#define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index a2b77ddb1..2486ac2a0 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -927,7 +927,7 @@ #define TR_EXTERNALRF "Zewn.Moduł RF" #define TR_FAILSAFE TR(INDENT"Failsafe",INDENT"Tryb Failsafe") #define TR_FAILSAFESET "USTAWIENIE FAILSAFE" -#define TR_PINMAPSET "Set PIN to CH map" +#define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "CZUJNIK" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index fc86c00c1..f2969bac4 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -931,7 +931,7 @@ #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE "Failsafe mode" #define TR_FAILSAFESET "FAILSAFE SETTINGS" -#define TR_PINMAPSET "Set PIN to CH map" +#define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index e92877c95..9b533adfc 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -940,7 +940,7 @@ #define TR_EXTERNALRF "Extern Radiomodul" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafeläge") #define TR_FAILSAFESET "FailsafeInställning" -#define TR_PINMAPSET "Set PIN to CH map" +#define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" #define TR_MENUSENSOR "SENSOR" From bf3bba3254e93c5570eaeb378ef7dfcc6e40682b Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 11 Feb 2019 11:11:06 +0100 Subject: [PATCH 156/446] Fixes --- radio/src/gui/128x64/model_setup.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index b5e4b580d..5a59cde20 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1124,9 +1124,9 @@ void menuModelSetup(event_t event) uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawTextAlignedLeft(y, INDENT INDENT "PinMap"); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "[set]", attr); - if (event == EVT_KEY_BREAK(KEY_ENTER)) { + lcdDrawTextAlignedLeft(y, INDENT INDENT "Pinmap"); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr); + if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { g_receiverIdx = receiverIdx; g_moduleIdx = moduleIdx; pushMenu(menuModelPinmap); @@ -1390,7 +1390,7 @@ void menuModelSetup(event_t event) AUDIO_WARNING1(); SEND_FAILSAFE_NOW(moduleIdx); } - else if (event == EVT_KEY_BREAK(KEY_ENTER)) { + else if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { g_moduleIdx = moduleIdx; pushMenu(menuModelFailsafe); } @@ -1745,7 +1745,7 @@ void menuModelPinmap(event_t event) { const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; uint8_t wbar = LCD_W / 2 - 20; - SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx) + 1); + SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx)); lcdDrawTextAlignedLeft(0, STR_PINMAPSET); for (uint8_t pos=0; pos "); + lcdDrawText(0, y, "Pin", SMLSIZE); + lcdDrawNumber(lcdLastRightPos+5, y, pin+1, SMLSIZE); + lcdDrawText(lcdLastRightPos+5, y, " -> ", SMLSIZE); //Channel @@ -1787,9 +1787,9 @@ void menuModelPinmap(event_t event) lcdDrawHorizontalLine(xChannel, y+1, lenChannel, DOTTED, 0); lcdDrawHorizontalLine(xChannel, y+2, lenChannel, DOTTED, 0); - y += FH; + y += FH-1; - if (++pin >= sentModuleChannels(g_moduleIdx)) + if (++pin >sentModuleChannels(g_moduleIdx)) break; } } \ No newline at end of file From 4a6fc430ec3365982a5f9deef819b3b82a13e8e9 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 11 Feb 2019 14:51:52 +0100 Subject: [PATCH 157/446] Fixed? --- radio/src/bitfield.h | 37 ++++++++++++++++++++++------ radio/src/gui/128x64/model_setup.cpp | 21 ++++++---------- radio/src/pulses/modules.h | 2 +- 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/radio/src/bitfield.h b/radio/src/bitfield.h index 84b3632b5..379d4280f 100644 --- a/radio/src/bitfield.h +++ b/radio/src/bitfield.h @@ -23,8 +23,16 @@ #ifndef BITFIELD_H #define BITFIELD_H +#include + // A set of bitfield handling macros -#define BF_BIT(n) ( 1<<(n) ) + +template +inline T BF_BIT(uint8_t n) +{ + return T(1) << n; +} + #define BF_BIT_GET(y, mask) ( y & (mask) ) #define BF_BIT_SET(y, mask) ( y |= (mask) ) #define BF_BIT_CLEAR(y, mask) ( y &= ~(mask) ) @@ -33,19 +41,34 @@ #define BF_SINGLE_BIT_SET(y, i) BF_BIT_SET(y, BF_BIT(i)) //! Create a bitmask of length 'len'. -#define BF_BITMASK(len) ( BF_BIT(len)-1 ) +template +inline T BF_BITMASK(uint8_t len) +{ + return BF_BIT(len) - 1; +} //! Create a bitfield mask of length 'len' starting at bit 'start'. -#define BF_MASK(start, len) ( BF_BITMASK(len)<<(start) ) +template +inline T BF_MASK(uint8_t start, uint8_t len) +{ + return BF_BITMASK(len) << start; +} //! Prepare a bitmask for insertion or combining. -#define BF_PREP(x, start, len) ( ((x)&BF_BITMASK(len)) << (start) ) +template +inline T BF_PREP(T x, uint8_t start, uint8_t len) +{ + return (x & BF_BITMASK(len)) << start; +} //! Extract a bitfield of length 'len' starting at bit 'start' from 'y'. #define BF_GET(y, start, len) ( ((y)>>(start)) & BF_BITMASK(len) ) //! Insert 'len' bits of 'x 'into 'y', starting at bit 'start' from 'y'. -#define BF_SET(y, x, start, len) \ - ( y= ((y) &~ BF_MASK(start, len)) | BF_PREP(x, start, len) ) +template +inline T BF_SET(T to, T from, uint8_t start, uint8_t len) +{ + return (to & ~BF_MASK(start, len)) | BF_PREP(from, start, len); +} -#endif //BITFIELD_H \ No newline at end of file +#endif //BITFIELD_H diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 5a59cde20..5bfbb5ef0 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1755,19 +1755,16 @@ void menuModelPinmap(event_t event) const coord_t x = 1; coord_t y = FH + 1; - uint8_t line = (menuVerticalPosition >= sentModuleChannels(g_moduleIdx) ? 2 : 0); - uint8_t pin = (menuVerticalPosition >= 8 ? 8 : 0) + line; + uint8_t pin = (menuVerticalPosition >= 8 ? 8 : 0); - for (; line < 8; line++) { + for (uint8_t line = 0; line < 8; line++) { const int32_t channelValue = channelOutputs[getPinOuput(g_receiverIdx, g_moduleIdx, pin)]; - //Pin + // Pin lcdDrawText(0, y, "Pin", SMLSIZE); - lcdDrawNumber(lcdLastRightPos+5, y, pin+1, SMLSIZE); - lcdDrawText(lcdLastRightPos+5, y, " -> ", SMLSIZE); + lcdDrawNumber(lcdLastRightPos + 1, y, pin+1, SMLSIZE); - - //Channel + // Channel LcdFlags flags = SMLSIZE; if (menuVerticalPosition == pin) { flags |= INVERS; @@ -1778,18 +1775,16 @@ void menuModelPinmap(event_t event) setPinOuput(g_receiverIdx, g_moduleIdx, pin, channel); } } + putsChn(8*FW, y, getPinOuput(g_receiverIdx, g_moduleIdx, pin)+1, flags); - //lcdDrawNumber(lcdLastRightPos+5, y, getPinOuput(g_receiverIdx, g_moduleIdx, pin)+1, flags); - putsChn(lcdLastRightPos+5, y, getPinOuput(g_receiverIdx, g_moduleIdx, pin)+1, flags); - + // Bargraph const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar/2 + lim/2) / lim, wbar/2); const coord_t xChannel = (channelValue>0) ? x+LCD_W-3-wbar/2 : x+LCD_W-2-wbar/2-lenChannel; lcdDrawHorizontalLine(xChannel, y+1, lenChannel, DOTTED, 0); lcdDrawHorizontalLine(xChannel, y+2, lenChannel, DOTTED, 0); y += FH-1; - - if (++pin >sentModuleChannels(g_moduleIdx)) + if (++pin > sentModuleChannels(g_moduleIdx)) break; } } \ No newline at end of file diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index d516578c5..8cb6e09fd 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -208,7 +208,7 @@ inline uint8_t getPinOuput(uint8_t receiverIdx, uint8_t moduleIdx, uint8_t pin) inline void setPinOuput(uint8_t receiverIdx, uint8_t moduleIdx, uint8_t pin, uint8_t chan) { - BF_SET(g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping, chan, (pin + ((pin & 0x01) ? -1 : 1 )) * 4, 4); + g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping = BF_SET(g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping, chan, (pin + ((pin & 0x01) ? -1 : 1 )) * 4, 4); } inline int8_t maxModuleChannels_M8(uint8_t idx) From 7ccdb0cca16fac32798c7439bc9e050216e762ca Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 12 Feb 2019 11:20:21 +0100 Subject: [PATCH 158/446] Fixes --- radio/src/dataconstants.h | 2 +- radio/src/gui/128x64/model_setup.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index cc8b07933..596c57e5f 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -788,7 +788,7 @@ enum BluetoothModes { // PXX2 constants #define PXX2_LEN_REGISTRATION_ID 4 -#define PXX2_LEN_RX_ID 4 +#define PXX2_LEN_RX_ID 8 #define PXX2_MAX_RECEIVERS_PER_MODULE 5 #endif // _DATACONSTANTS_H_ diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 5bfbb5ef0..24369b824 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1146,7 +1146,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - for (uint8_t pos=0; pos Date: Tue, 12 Feb 2019 12:28:11 +0100 Subject: [PATCH 159/446] Spec was wrong, update ... --- radio/src/dataconstants.h | 2 +- radio/src/pulses/pxx2.cpp | 3 +++ radio/src/telemetry/telemetry.cpp | 6 +++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 596c57e5f..30ed86365 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -787,7 +787,7 @@ enum BluetoothModes { }; // PXX2 constants -#define PXX2_LEN_REGISTRATION_ID 4 +#define PXX2_LEN_REGISTRATION_ID 8 #define PXX2_LEN_RX_ID 8 #define PXX2_MAX_RECEIVERS_PER_MODULE 5 diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index fbc219e60..13372452f 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -60,6 +60,9 @@ bool Pxx2Pulses::setupRegisterFrame(uint8_t module) if (reusableBuffer.modelsetup.pxx2_register_or_bind_step == REGISTER_COUNTER_ID_RECEIVED) { Pxx2Transport::addByte(0x01); + for (uint8_t i=0; i Date: Tue, 12 Feb 2019 12:35:35 +0100 Subject: [PATCH 160/446] Better? --- radio/src/telemetry/telemetry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index a5fe76ceb..ca6b29196 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -87,7 +87,7 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) } // PASSWORD follows, we check it is good - if (memcmp(&frame[8], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { + if (memcmp(&frame[12], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { reusableBuffer.modelsetup.pxx2_register_or_bind_step = REGISTER_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; POPUP_INFORMATION(STR_REG_OK); From 4755899d2484e0aa5ae8eb274dcc3280d60587dd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Feb 2019 14:01:59 +0100 Subject: [PATCH 161/446] REGISTER fixed (no 0 hardcoded) --- radio/src/opentx.h | 1 + radio/src/telemetry/telemetry.cpp | 12 +++++------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 4fca02dee..0ee179743 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1118,6 +1118,7 @@ union ReusableBuffer char msg[64]; uint8_t r9mPower; uint8_t pxx2_register_or_bind_step; + uint8_t pxx2_register_rx_id[PXX2_LEN_RX_ID]; char pxx2_bind_candidate_receivers_ids[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_ID]; char pxx2_bind_candidate_receivers_names[PXX2_MAX_RECEIVERS_PER_MODULE][3*PXX2_LEN_RX_ID+1]; uint8_t pxx2_bind_candidate_receivers_count; diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index ca6b29196..57adbc6e2 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -78,16 +78,14 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) } if (frame[3] == 0x00) { - // RX_ID follows, we discard it for now + // RX_ID follows, we store it for the next step + memcpy(reusableBuffer.modelsetup.pxx2_register_rx_id, &frame[4], PXX2_LEN_RX_ID); reusableBuffer.modelsetup.pxx2_register_or_bind_step = REGISTER_COUNTER_ID_RECEIVED; } else if (frame[3] == 0x01) { - // RX_ID follows, we check it is good - if (1) { - - } - // PASSWORD follows, we check it is good - if (memcmp(&frame[12], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { + // RX_ID + PASSWORD follow, we check they are good + if (memcmp(&frame[4], reusableBuffer.modelsetup.pxx2_register_rx_id, PXX2_LEN_RX_ID) == 0 && + memcmp(&frame[12], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { reusableBuffer.modelsetup.pxx2_register_or_bind_step = REGISTER_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; POPUP_INFORMATION(STR_REG_OK); From 8c1f8980e525cf9c3e8006c3c345d9f7cd8d5dec Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 12 Feb 2019 12:55:48 +0100 Subject: [PATCH 162/446] Display longer RxID --- radio/src/gui/128x64/model_setup.cpp | 16 +++++++++++++++- radio/src/telemetry/telemetry.cpp | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 24369b824..6d4b29e79 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -87,10 +87,12 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL_RAW2, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NUMBER, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL_RAW2, ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER, #endif ITEM_MODEL_EXTERNAL_MODULE_LABEL, @@ -317,10 +319,12 @@ void menuModelSetup(event_t event) IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Delete + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver RXID raw 2 IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, (uint8_t)-1), // Receiver Number IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 1), // Receiver Bind/Delete + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver RXID raw 2 IF_PXX2(INTERNAL_MODULE_ADD_RECEIVER_ROW), LABEL(ExternalModule), @@ -1146,7 +1150,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - for (uint8_t pos=0; pos Date: Tue, 12 Feb 2019 14:33:56 +0100 Subject: [PATCH 163/446] Try to display RegID on one line --- radio/src/gui/128x64/model_setup.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 6d4b29e79..1256c7b99 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -319,12 +319,12 @@ void menuModelSetup(event_t event) IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Delete - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver RXID raw 2 + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, -1), // Receiver RXID raw 2 IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, (uint8_t)-1), // Receiver Number IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 1), // Receiver Bind/Delete - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver RXID raw 2 + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, -1), // Receiver RXID raw 2 IF_PXX2(INTERNAL_MODULE_ADD_RECEIVER_ROW), LABEL(ExternalModule), @@ -1050,8 +1050,10 @@ void menuModelSetup(event_t event) case ITEM_MODEL_REGISTRATION_ID: { lcdDrawTextAlignedLeft(y, "Reg. ID"); + uint8_t offset = 40; for (uint8_t pos=0; pos Date: Tue, 12 Feb 2019 14:42:57 +0100 Subject: [PATCH 164/446] remove debug code --- radio/src/telemetry/telemetry.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 6a28882f3..57adbc6e2 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -121,9 +121,6 @@ void processBindFrame(uint8_t module, uint8_t * frame) *c = '\0'; ++reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count; reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_RX_ID_RECEIVED; - // TDOD BIND DEBUG - //reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index = 0; - //reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_RX_ID_SELECTED; } } else if (frame[3] == 0x01) { From d6537f867e27d91359594d4b8ca4656291f5f651 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 12 Feb 2019 15:10:42 +0100 Subject: [PATCH 165/446] Initialise RegID with CPU ID --- radio/src/opentx.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 5fe687dd6..ee18be78d 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -302,6 +302,13 @@ void generalDefault() theme->init(); #endif +#if defined(SIMU) + uint32_t cpu_uid[3] = { 0x12345678, 0x55AA55AA, 0x87654321}; +#else + uint32_t * cpu_uid = (uint32_t *)0x1FFF7A10; +#endif + memcpy(g_eeGeneral.ownerRegistrationID, &cpu_uid[1], PXX2_LEN_REGISTRATION_ID); + g_eeGeneral.chkSum = 0xFFFF; } From aa028198fd980c27dbef25461c188fa8fe5d249c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Feb 2019 08:26:00 +0100 Subject: [PATCH 166/446] Some refactoring ... --- radio/src/opentx.cpp | 5 --- radio/src/targets/common/arm/stm32/cpu_id.cpp | 11 ++++--- radio/src/targets/common/arm/stm32/cpu_id.h | 31 +++++++++++++++++++ radio/src/targets/horus/board.h | 5 +-- radio/src/targets/taranis/board.h | 5 +-- 5 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 radio/src/targets/common/arm/stm32/cpu_id.h diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index ee18be78d..ba21b4751 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -302,11 +302,6 @@ void generalDefault() theme->init(); #endif -#if defined(SIMU) - uint32_t cpu_uid[3] = { 0x12345678, 0x55AA55AA, 0x87654321}; -#else - uint32_t * cpu_uid = (uint32_t *)0x1FFF7A10; -#endif memcpy(g_eeGeneral.ownerRegistrationID, &cpu_uid[1], PXX2_LEN_REGISTRATION_ID); g_eeGeneral.chkSum = 0xFFFF; diff --git a/radio/src/targets/common/arm/stm32/cpu_id.cpp b/radio/src/targets/common/arm/stm32/cpu_id.cpp index ef8977d13..cd5a97a93 100644 --- a/radio/src/targets/common/arm/stm32/cpu_id.cpp +++ b/radio/src/targets/common/arm/stm32/cpu_id.cpp @@ -20,13 +20,14 @@ #include "opentx.h" +#if defined(SIMU) +const uint32_t cpu_uid[3] = { 0x12345678, 0x55AA55AA, 0x87654321}; +#else +const uint32_t * cpu_uid = (uint32_t *)0x1FFF7A10; +#endif + void getCPUUniqueID(char * s) { -#if defined(SIMU) - uint32_t cpu_uid[3] = { 0x12345678, 0x55AA55AA, 0x87654321}; -#else - uint32_t * cpu_uid = (uint32_t *)0x1FFF7A10; -#endif char * tmp = strAppendUnsigned(s, cpu_uid[0], 8, 16); *tmp = ' '; tmp = strAppendUnsigned(tmp+1, cpu_uid[1], 8, 16); diff --git a/radio/src/targets/common/arm/stm32/cpu_id.h b/radio/src/targets/common/arm/stm32/cpu_id.h new file mode 100644 index 000000000..eb95f8b3b --- /dev/null +++ b/radio/src/targets/common/arm/stm32/cpu_id.h @@ -0,0 +1,31 @@ +/* + * 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 + +void getCPUUniqueID(char * s); + +#define LEN_CPU_UID (3*8+2) + +#if defined(SIMU) +extern const uint32_t cpu_uid[3]; +#else +extern const uint32_t * cpu_uid; +#endif \ No newline at end of file diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 3fa1ebca4..e9e094360 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -22,6 +22,7 @@ #define _BOARD_HORUS_H_ #include "definitions.h" +#include "cpu_id.h" #if defined(__cplusplus) && !defined(SIMU) extern "C" { @@ -138,10 +139,6 @@ void delay_ms(uint32_t ms); #define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() (!IS_HORUS_PROD()) #endif -// CPU Unique ID -#define LEN_CPU_UID (3*8+2) -void getCPUUniqueID(char * s); - // SD driver #define BLOCK_SIZE 512 /* Block Size in Bytes */ #if !defined(SIMU) || defined(SIMU_DISKIO) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index d525d0fbb..fbf306760 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -22,6 +22,7 @@ #define _BOARD_H_ #include "definitions.h" +#include "cpu_id.h" #if defined(__cplusplus) && !defined(SIMU) extern "C" { @@ -123,10 +124,6 @@ void delay_ms(uint32_t ms); } #endif -// CPU Unique ID -#define LEN_CPU_UID (3*8+2) -void getCPUUniqueID(char * s); - // SD driver #define BLOCK_SIZE 512 /* Block Size in Bytes */ #if !defined(SIMU) || defined(SIMU_DISKIO) From dd0ac2c008af7a5ffb2eb035a4807b88dc9549f5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Feb 2019 08:42:47 +0100 Subject: [PATCH 167/446] Delay introduced at the end of BIND ... --- radio/src/gui/128x64/model_setup.cpp | 8 ++++---- radio/src/opentx.h | 6 +++++- radio/src/pulses/pxx2.cpp | 13 +++++++++++-- radio/src/pulses/pxx2.h | 1 + radio/src/telemetry/telemetry.cpp | 11 +++++------ 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 1256c7b99..46c7bfe91 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -239,7 +239,7 @@ enum MenuModelSetupItems { void onPXX2BindMenu(const char * result) { reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index = (result - reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]) / sizeof(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]); - reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_RX_ID_SELECTED; + reusableBuffer.modelsetup.pxx2_bind_step = BIND_RX_ID_SELECTED; } void onBindMenu(const char * result) @@ -1160,13 +1160,13 @@ void menuModelSetup(event_t event) if (attr) { if (menuHorizontalPosition == 0) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { - reusableBuffer.modelsetup.pxx2_register_or_bind_step = BIND_START; + reusableBuffer.modelsetup.pxx2_bind_step = BIND_START; reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count = 0; moduleSettings[INTERNAL_MODULE].mode ^= MODULE_MODE_BIND; } if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_BIND) { s_editMode = 1; - if (reusableBuffer.modelsetup.pxx2_register_or_bind_step == BIND_RX_ID_RECEIVED) { + if (reusableBuffer.modelsetup.pxx2_bind_step == BIND_RX_ID_RECEIVED) { popupMenuItemsCount = min(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count, PXX2_MAX_RECEIVERS_PER_MODULE); for (uint8_t i=0; i reusableBuffer.modelsetup.pxx2_bind_wait_timeout) { + moduleSettings[module].mode = MODULE_MODE_NORMAL; + POPUP_INFORMATION(STR_BIND_OK); + } + else { + return false; + } + } + else if (reusableBuffer.modelsetup.pxx2_bind_step == BIND_RX_ID_SELECTED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i Date: Wed, 13 Feb 2019 12:58:10 +0100 Subject: [PATCH 168/446] Adapt display to latest discussions (entry of RXID at register time is TODO, also TODO is prevent bind second receievr with name identical to receiver1) --- radio/src/datastructs.h | 4 +-- radio/src/gui/128x64/model_setup.cpp | 50 ++++++++-------------------- radio/src/translations.cpp | 1 + radio/src/translations.h | 2 ++ radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 15 files changed, 30 insertions(+), 38 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 2299c369b..9738a835c 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -419,7 +419,7 @@ PACK(struct ReceiverData { uint8_t telemetry:1; uint8_t spare:6; uint64_t channelMapping; // each receiver output (16) can be assigned to one of the 16 channels - uint8_t rxID[PXX2_LEN_RX_ID]; + char rxID[PXX2_LEN_RX_ID]; }); /* @@ -632,7 +632,7 @@ PACK(struct ModelData { CUSTOM_SCREENS_DATA - uint8_t modelRegistrationID[PXX2_LEN_REGISTRATION_ID]; + char modelRegistrationID[PXX2_LEN_REGISTRATION_ID]; }); /* diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 46c7bfe91..e65dc7415 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -83,16 +83,14 @@ enum MenuModelSetupItems { #endif ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NUMBER, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_ID, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL_RAW2, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NUMBER, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_ID, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL_RAW2, ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER, #endif ITEM_MODEL_EXTERNAL_MODULE_LABEL, @@ -155,7 +153,7 @@ enum MenuModelSetupItems { #if defined(PCBTARANIS) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) - #define CURRENT_RECEIVER_EDITED(k) (k >= ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NUMBER ? 1 : 0) + #define CURRENT_RECEIVER_EDITED(k) (k >= ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_ID ? 1 : 0) #define INTERNAL_MODULE_ADD_RECEIVER_ROW (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[MAX_RECEIVERS_PER_MODULE-1].enabled ? HIDDEN_ROW : (uint8_t)0) #elif defined(PCBSKY9X) && !defined(REVA) #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) @@ -319,12 +317,10 @@ void menuModelSetup(event_t event) IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Delete - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, -1), // Receiver RXID raw 2 IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, (uint8_t)-1), // Receiver Number IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 1), // Receiver Bind/Delete - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, -1), // Receiver RXID raw 2 IF_PXX2(INTERNAL_MODULE_ADD_RECEIVER_ROW), LABEL(ExternalModule), @@ -1048,19 +1044,8 @@ void menuModelSetup(event_t event) #if defined(PCBTARANIS) case ITEM_MODEL_REGISTRATION_ID: - { - lcdDrawTextAlignedLeft(y, "Reg. ID"); - uint8_t offset = 40; - for (uint8_t pos=0; pos Date: Wed, 13 Feb 2019 14:25:24 +0100 Subject: [PATCH 169/446] Owner registration initialized from CPU ID --- radio/src/opentx.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index ba21b4751..c4666a34d 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -302,7 +302,9 @@ void generalDefault() theme->init(); #endif - memcpy(g_eeGeneral.ownerRegistrationID, &cpu_uid[1], PXX2_LEN_REGISTRATION_ID); + for (uint8_t i=0; i Date: Wed, 13 Feb 2019 19:00:17 +0100 Subject: [PATCH 170/446] Preparation for custom popups --- radio/src/gui/128x64/gui.h | 3 +- radio/src/gui/128x64/model_curve_edit.cpp | 33 ++++++++++++--- radio/src/gui/128x64/popups.cpp | 11 +---- radio/src/gui/128x64/popups.h | 5 +-- radio/src/gui/212x64/model_curve_edit.cpp | 35 +++++++++++++--- radio/src/gui/212x64/popups.cpp | 13 +----- radio/src/gui/212x64/popups.h | 5 +-- radio/src/gui/480x272/menus.h | 5 +-- radio/src/gui/480x272/model_curves.cpp | 31 +++++++++++--- radio/src/gui/480x272/popups.cpp | 12 +----- radio/src/lua/api_general.cpp | 51 +---------------------- radio/src/opentx.h | 5 +++ radio/src/translations.cpp | 2 +- radio/src/translations.h | 4 +- radio/src/translations/cz.h.txt | 4 +- radio/src/translations/de.h.txt | 4 +- radio/src/translations/en.h.txt | 4 +- radio/src/translations/es.h.txt | 4 +- radio/src/translations/fi.h.txt | 4 +- radio/src/translations/fr.h.txt | 4 +- radio/src/translations/it.h.txt | 4 +- radio/src/translations/nl.h.txt | 4 +- radio/src/translations/pl.h.txt | 4 +- radio/src/translations/pt.h.txt | 4 +- radio/src/translations/se.h.txt | 4 +- 25 files changed, 124 insertions(+), 135 deletions(-) diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 061beb95a..0c218020d 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -265,8 +265,7 @@ uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint #define WARNING_TYPE_ASTERISK 0 #define WARNING_TYPE_CONFIRM 1 -#define WARNING_TYPE_INPUT 2 -#define WARNING_TYPE_INFO 4 +#define WARNING_TYPE_INFO 2 extern const char * warningText; extern const char * warningInfoText; diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp index 3a0112109..741aca4b1 100644 --- a/radio/src/gui/128x64/model_curve_edit.cpp +++ b/radio/src/gui/128x64/model_curve_edit.cpp @@ -20,17 +20,39 @@ #include "opentx.h" -void displayPresetChoice(event_t event) +void runPopupCurvePreset(event_t event) { - runPopupWarning(event); - lcdDrawNumber(WARNING_LINE_X+FW*7, WARNING_LINE_Y, 45*warningInputValue/4, LEFT|INVERS); + warningResult = false; + + drawMessageBox(); + + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, STR_POPUPS_ENTER_EXIT); + + switch (event) { + case EVT_KEY_BREAK(KEY_ENTER): + warningResult = true; + // no break + + case EVT_KEY_BREAK(KEY_EXIT): + warningText = NULL; + warningType = WARNING_TYPE_ASTERISK; + break; + + default: + s_editMode = EDIT_MODIFY_FIELD; + reusableBuffer.curveEdit.preset = checkIncDec(event, reusableBuffer.curveEdit.preset, -4, 4); + s_editMode = EDIT_SELECT_FIELD; + break; + } + + lcdDrawNumber(WARNING_LINE_X+FW*7, WARNING_LINE_Y, 45 * reusableBuffer.curveEdit.preset / 4, LEFT|INVERS); lcdDrawChar(lcdLastRightPos, WARNING_LINE_Y, '@', INVERS); if (warningResult) { warningResult = 0; CurveInfo & crv = g_model.curves[s_curveChan]; int8_t * points = curveAddress(s_curveChan); - int k = 25 * warningInputValue; + int k = 25 * reusableBuffer.curveEdit.preset; int dx = 2000 / (5+crv.points-1); for (uint8_t i=0; i<5+crv.points; i++) { int x = -1000 + i * dx; @@ -45,7 +67,8 @@ void displayPresetChoice(event_t event) void onCurveOneMenu(const char * result) { if (result == STR_CURVE_PRESET) { - POPUP_INPUT(STR_PRESET, displayPresetChoice, 0, -4, 4); + reusableBuffer.curveEdit.preset = 4; // 45° + POPUP_INPUT(STR_PRESET, runPopupCurvePreset); } else if (result == STR_MIRROR) { CurveInfo & crv = g_model.curves[s_curveChan]; diff --git a/radio/src/gui/128x64/popups.cpp b/radio/src/gui/128x64/popups.cpp index 873b5163c..202628769 100644 --- a/radio/src/gui/128x64/popups.cpp +++ b/radio/src/gui/128x64/popups.cpp @@ -27,9 +27,6 @@ uint8_t warningType; uint8_t warningResult = 0; uint8_t warningInfoFlags = ZCHAR; -int16_t warningInputValue; -int16_t warningInputValueMin; -int16_t warningInputValueMax; void drawMessageBox() { @@ -97,7 +94,7 @@ void runPopupWarning(event_t event) if (warningInfoText) { lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH, warningInfoText, warningInfoLength, WARNING_INFO_FLAGS); } - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS)); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT)); switch (event) { case EVT_KEY_BREAK(KEY_ENTER): if (warningType == WARNING_TYPE_ASTERISK) @@ -108,11 +105,5 @@ void runPopupWarning(event_t event) warningText = NULL; warningType = WARNING_TYPE_ASTERISK; break; - default: - if (warningType != WARNING_TYPE_INPUT) break; - s_editMode = EDIT_MODIFY_FIELD; - warningInputValue = checkIncDec(event, warningInputValue, warningInputValueMin, warningInputValueMax); - s_editMode = EDIT_SELECT_FIELD; - break; } } diff --git a/radio/src/gui/128x64/popups.h b/radio/src/gui/128x64/popups.h index 6fbead268..24321ab75 100644 --- a/radio/src/gui/128x64/popups.h +++ b/radio/src/gui/128x64/popups.h @@ -37,9 +37,6 @@ void runPopupWarning(event_t event); #define DRAW_MESSAGE_BOX(title) (warningText = title, drawMessageBox(), warningText = NULL) extern void (*popupFunc)(event_t event); -extern int16_t warningInputValue; -extern int16_t warningInputValueMin; -extern int16_t warningInputValueMax; extern uint8_t warningInfoFlags; #if !defined(GUI) @@ -54,7 +51,7 @@ extern uint8_t warningInfoFlags; #define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) - #define POPUP_INPUT(s, func, start, min, max) (warningText = s, warningType = WARNING_TYPE_INPUT, popupFunc = func, warningInputValue = start, warningInputValueMin = min, warningInputValueMax = max) + #define POPUP_INPUT(s, func) (warningText = s, popupFunc = func) #define WARNING_INFO_FLAGS warningInfoFlags #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) #endif diff --git a/radio/src/gui/212x64/model_curve_edit.cpp b/radio/src/gui/212x64/model_curve_edit.cpp index 30bc33b78..3d3b083a8 100644 --- a/radio/src/gui/212x64/model_curve_edit.cpp +++ b/radio/src/gui/212x64/model_curve_edit.cpp @@ -20,17 +20,41 @@ #include "opentx.h" -void displayPresetChoice(event_t event) +void runPopupCurvePreset(event_t event) { - runPopupWarning(event); - lcdDrawNumber(WARNING_LINE_X+FW*7, WARNING_LINE_Y, 45*warningInputValue/4, LEFT|INVERS); + warningResult = false; + + drawMessageBox(warningText); + + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, STR_POPUPS_ENTER_EXIT); + + switch (event) { + case EVT_KEY_BREAK(KEY_ENTER): + if (warningType == WARNING_TYPE_ASTERISK) + break; + warningResult = true; + // no break + + case EVT_KEY_BREAK(KEY_EXIT): + warningText = NULL; + warningType = WARNING_TYPE_ASTERISK; + break; + + default: + s_editMode = EDIT_MODIFY_FIELD; + reusableBuffer.curveEdit.preset = checkIncDec(event, reusableBuffer.curveEdit.preset, -4, +4); + s_editMode = EDIT_SELECT_FIELD; + break; + } + + lcdDrawNumber(WARNING_LINE_X+FW*7, WARNING_LINE_Y, 45 * reusableBuffer.curveEdit.preset / 4, LEFT|INVERS); lcdDrawChar(lcdLastRightPos, WARNING_LINE_Y, '@', INVERS); if (warningResult) { warningResult = 0; CurveInfo & crv = g_model.curves[s_curveChan]; int8_t * points = curveAddress(s_curveChan); - int k = 25 * warningInputValue; + int k = 25 * reusableBuffer.curveEdit.preset; int dx = 2000 / (5+crv.points-1); for (uint8_t i=0; i<5+crv.points; i++) { int x = -1000 + i * dx; @@ -45,7 +69,8 @@ void displayPresetChoice(event_t event) void onCurveOneMenu(const char * result) { if (result == STR_CURVE_PRESET) { - POPUP_INPUT(STR_PRESET, displayPresetChoice, 0, -4, 4); + reusableBuffer.curveEdit.preset = 4; // 45° + POPUP_INPUT(STR_PRESET, runPopupCurvePreset); } else if (result == STR_MIRROR) { CurveInfo & crv = g_model.curves[s_curveChan]; diff --git a/radio/src/gui/212x64/popups.cpp b/radio/src/gui/212x64/popups.cpp index 50265e0c6..c233a1df0 100644 --- a/radio/src/gui/212x64/popups.cpp +++ b/radio/src/gui/212x64/popups.cpp @@ -26,9 +26,6 @@ uint8_t warningInfoLength; uint8_t warningType; uint8_t warningResult = 0; uint8_t warningInfoFlags = ZCHAR; -int16_t warningInputValue; -int16_t warningInputValueMin; -int16_t warningInputValueMax; void drawMessageBox(const char * title) { @@ -94,23 +91,17 @@ void runPopupWarning(event_t event) if (warningInfoText) { lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH, warningInfoText, warningInfoLength, WARNING_INFO_FLAGS); } - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS)); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT)); switch (event) { case EVT_KEY_BREAK(KEY_ENTER): if (warningType == WARNING_TYPE_ASTERISK) break; warningResult = true; // no break + case EVT_KEY_BREAK(KEY_EXIT): warningText = NULL; warningType = WARNING_TYPE_ASTERISK; break; - default: - if (warningType == WARNING_TYPE_INPUT) { - s_editMode = EDIT_MODIFY_FIELD; - warningInputValue = checkIncDec(event, warningInputValue, warningInputValueMin, warningInputValueMax); - s_editMode = EDIT_SELECT_FIELD; - } - break; } } diff --git a/radio/src/gui/212x64/popups.h b/radio/src/gui/212x64/popups.h index 28b1a81b0..3ee4dea46 100644 --- a/radio/src/gui/212x64/popups.h +++ b/radio/src/gui/212x64/popups.h @@ -34,16 +34,13 @@ void runPopupWarning(event_t event); #define DRAW_MESSAGE_BOX(title) drawMessageBox(title) extern void (*popupFunc)(event_t event); -extern int16_t warningInputValue; -extern int16_t warningInputValueMin; -extern int16_t warningInputValueMax; extern uint8_t warningInfoFlags; #define DISPLAY_WARNING (*popupFunc) #define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) -#define POPUP_INPUT(s, func, start, min, max) (warningText = s, warningType = WARNING_TYPE_INPUT, popupFunc = func, warningInputValue = start, warningInputValueMin = min, warningInputValueMax = max) +#define POPUP_INPUT(s, func) (warningText = s, popupFunc = func) #define WARNING_INFO_FLAGS warningInfoFlags #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index c6e1cb3ef..753c34a24 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -469,9 +469,6 @@ void showMessageBox(const char * title); void runPopupWarning(event_t event); extern void (* popupFunc)(event_t event); -extern int16_t warningInputValue; -extern int16_t warningInputValueMin; -extern int16_t warningInputValueMax; extern uint8_t warningInfoFlags; #define DISPLAY_WARNING (*popupFunc) @@ -479,7 +476,7 @@ extern uint8_t warningInfoFlags; #define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningType = WARNING_TYPE_ASTERISK, warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) -#define POPUP_INPUT(s, func, start, min, max) (warningText = s, warningType = WARNING_TYPE_INPUT, popupFunc = func, warningInputValue = start, warningInputValueMin = min, warningInputValueMax = max) +#define POPUP_INPUT(s, func) (warningText = s, popupFunc = func) #define WARNING_INFO_FLAGS warningInfoFlags #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) diff --git a/radio/src/gui/480x272/model_curves.cpp b/radio/src/gui/480x272/model_curves.cpp index a918585bf..7d15edcaf 100644 --- a/radio/src/gui/480x272/model_curves.cpp +++ b/radio/src/gui/480x272/model_curves.cpp @@ -25,16 +25,36 @@ void drawCurve(int x, int y, int width) drawFunction(applyCurrentCurve, x, y, width); } -void displayPresetChoice(event_t event) +void runPopupCurvePreset(event_t event) { - runPopupWarning(event); - lcdDrawNumber(WARNING_LINE_X, WARNING_INFOLINE_Y-10, 45*warningInputValue/4, LEFT|INVERS, 0, NULL, "@"); + warningResult = false; + + theme->drawMessageBox(warningText, warningInfoText, STR_POPUPS_ENTER_EXIT, warningType); + + switch (event) { + case EVT_KEY_BREAK(KEY_ENTER): + warningResult = true; + // no break + + case EVT_KEY_BREAK(KEY_EXIT): + warningText = NULL; + warningType = WARNING_TYPE_ASTERISK; + break; + + default: + s_editMode = EDIT_MODIFY_FIELD; + reusableBuffer.curveEdit.preset = checkIncDec(event, reusableBuffer.curveEdit.preset, -4, +4); + s_editMode = EDIT_SELECT_FIELD; + break; + } + + lcdDrawNumber(WARNING_LINE_X, WARNING_INFOLINE_Y-10, 45 * reusableBuffer.curveEdit.preset / 4, LEFT|INVERS, 0, NULL, "@"); if (warningResult) { warningResult = 0; CurveInfo & crv = g_model.curves[s_curveChan]; int8_t * points = curveAddress(s_curveChan); - int k = 25 * warningInputValue; + int k = 25 * reusableBuffer.curveEdit.preset; int dx = 2000 / (5+crv.points-1); for (uint8_t i=0; i<5+crv.points; i++) { int x = -1000 + i * dx; @@ -49,7 +69,8 @@ void displayPresetChoice(event_t event) void onCurveOneMenu(const char * result) { if (result == STR_CURVE_PRESET) { - POPUP_INPUT(STR_PRESET, displayPresetChoice, 0, -4, 4); + reusableBuffer.curveEdit.preset = 4; // 45° + POPUP_INPUT(STR_PRESET, runPopupCurvePreset); } else if (result == STR_MIRROR) { CurveInfo & crv = g_model.curves[s_curveChan]; diff --git a/radio/src/gui/480x272/popups.cpp b/radio/src/gui/480x272/popups.cpp index 1678afefc..4a39cb1b6 100644 --- a/radio/src/gui/480x272/popups.cpp +++ b/radio/src/gui/480x272/popups.cpp @@ -26,9 +26,6 @@ uint8_t warningInfoLength; uint8_t warningType; uint8_t warningResult = 0; uint8_t warningInfoFlags = ZCHAR; -int16_t warningInputValue; -int16_t warningInputValueMin; -int16_t warningInputValueMax; void (*popupFunc)(event_t event) = NULL; const char *popupMenuItems[POPUP_MENU_MAX_LINES]; uint8_t s_menu_item = 0; @@ -80,7 +77,7 @@ void runPopupWarning(event_t event) { warningResult = false; - theme->drawMessageBox(warningText, warningInfoText, WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS), warningType); + theme->drawMessageBox(warningText, warningInfoText, WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT_ENTER_EXIT), warningType); switch (event) { case EVT_KEY_BREAK(KEY_ENTER): @@ -88,16 +85,11 @@ void runPopupWarning(event_t event) break; warningResult = true; // no break + case EVT_KEY_BREAK(KEY_EXIT): warningText = NULL; warningType = WARNING_TYPE_ASTERISK; break; - default: - if (warningType != WARNING_TYPE_INPUT) break; - s_editMode = EDIT_MODIFY_FIELD; - warningInputValue = checkIncDec(event, warningInputValue, warningInputValueMin, warningInputValueMax); - s_editMode = EDIT_SELECT_FIELD; - break; } } diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index d0b74ecdd..2e681d3f7 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -930,55 +930,6 @@ static int luaGetGeneralSettings(lua_State * L) return 1; } -/*luadoc -@function popupInput(title, event, input, min, max) - -Raises a pop-up on screen that allows uses input - -@param title (string) text to display - -@param event (number) the event variable that is passed in from the -Run function (key pressed) - -@param input (number) value that can be adjusted by the +/­- keys - -@param min (number) min value that input can reach (by pressing the -­ key) - -@param max (number) max value that input can reach - -@retval number result of the input adjustment - -@retval "OK" user pushed ENT key - -@retval "CANCEL" user pushed EXIT key - -@notice Use only from stand-alone and telemetry scripts. - -@status current Introduced in 2.0.0 -*/ -static int luaPopupInput(lua_State * L) -{ - event_t event = luaL_checkinteger(L, 2); - warningInputValue = luaL_checkinteger(L, 3); - warningInputValueMin = luaL_checkinteger(L, 4); - warningInputValueMax = luaL_checkinteger(L, 5); - warningText = luaL_checkstring(L, 1); - warningType = WARNING_TYPE_INPUT; - runPopupWarning(event); - if (warningResult) { - warningResult = 0; - lua_pushstring(L, "OK"); - } - else if (!warningText) { - lua_pushstring(L, "CANCEL"); - } - else { - lua_pushinteger(L, warningInputValue); - } - warningText = NULL; - return 1; -} - /*luadoc @function popupWarning(title, event) @@ -1338,7 +1289,7 @@ const luaL_Reg opentxLib[] = { { "playDuration", luaPlayDuration }, { "playTone", luaPlayTone }, { "playHaptic", luaPlayHaptic }, - { "popupInput", luaPopupInput }, + // { "popupInput", luaPopupInput }, { "popupWarning", luaPopupWarning }, { "popupConfirmation", luaPopupConfirmation }, { "defaultStick", luaDefaultStick }, diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 55e67ee6d..257643d42 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1171,6 +1171,11 @@ union ReusableBuffer uint32_t step; } spectrum; + struct + { + int8_t preset; + } curveEdit; + #if defined(STM32) // Data for the USB mass storage driver. If USB mass storage runs no menu is not allowed to be displayed uint8_t MSC_BOT_Data[MSC_MEDIA_PACKET]; diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 978f27b94..4cb7812bc 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -115,7 +115,7 @@ const char STR_OPEN9X[] = ; // The 0-terminated-strings -const char STR_POPUPS[] = TR_POPUPS; +const char STR_POPUPS_ENTER_EXIT[] = TR_POPUPS_ENTER_EXIT; const char STR_OK[] = TR_OK; #if !defined(OFS_EXIT) const char STR_EXIT[] = TR_EXIT; diff --git a/radio/src/translations.h b/radio/src/translations.h index b344c1ae9..306daac08 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -328,11 +328,11 @@ extern const char STR_BLUETOOTH_LOCAL_ADDR[]; // The 0-terminated-strings #define NO_INDENT(x) (x)+LEN_INDENT -extern const char STR_POPUPS[]; +extern const char STR_POPUPS_ENTER_EXIT[]; extern const char STR_OK[]; #if defined(OFS_EXIT) - #define STR_EXIT (STR_POPUPS + OFS_EXIT) + #define STR_EXIT (STR_POPUPS_ENTER_EXIT + OFS_EXIT) #else extern const char STR_EXIT[]; #endif diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 24af76b03..6e9885e3a 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -533,10 +533,10 @@ #endif #if defined(PCBTARANIS) - #define TR_POPUPS TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) + #define TR_POPUPS_ENTER_EXIT TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) #endif diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index a18253063..d26046232 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -539,10 +539,10 @@ #define TR_EXIT "[EXIT]" #if defined(PCBTARANIS) - #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER + #define TR_POPUPS_ENTER_EXIT TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) #endif diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index ad5aa0303..3681a0eab 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -538,10 +538,10 @@ #endif #if defined(PCBTARANIS) - #define TR_POPUPS TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) + #define TR_POPUPS_ENTER_EXIT TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) #endif diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 38e21a94b..de3915e4e 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -537,10 +537,10 @@ #endif #if defined(PCBTARANIS) - #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER + #define TR_POPUPS_ENTER_EXIT TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) #endif diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 9f7802cf6..577f896a5 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -529,10 +529,10 @@ #endif #if defined(PCBTARANIS) - #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER + #define TR_POPUPS_ENTER_EXIT TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) #endif diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 6e8d46d08..86b42022a 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -550,10 +550,10 @@ #endif #if defined(PCBTARANIS) - #define TR_POPUPS TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) + #define TR_POPUPS_ENTER_EXIT TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) #endif diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 9d45a1dcc..7a513832e 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -539,10 +539,10 @@ #endif #if defined(PCBTARANIS) - #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER + #define TR_POPUPS_ENTER_EXIT TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) #endif diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index c58cd490b..35747d20a 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -534,10 +534,10 @@ #endif #if defined(PCBTARANIS) - #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER + #define TR_POPUPS_ENTER_EXIT TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) #endif diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 7209acd10..9cdebc205 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -540,10 +540,10 @@ #endif #if defined(PCBTARANIS) - #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER + #define TR_POPUPS_ENTER_EXIT TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) #endif diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index edbacef11..d3162ac61 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -536,10 +536,10 @@ #endif #if defined(PCBTARANIS) - #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER + #define TR_POPUPS_ENTER_EXIT TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) #endif diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 53f41e570..02a1d3549 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -548,10 +548,10 @@ #endif #if defined(PCBTARANIS) - #define TR_POPUPS TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER + #define TR_POPUPS_ENTER_EXIT TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else - #define TR_POPUPS TR_ENTER "\010" TR_EXIT + #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) #endif From f83ed1b3557ca5d45870d144a91f41eda9b6a143 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 13 Feb 2019 19:33:07 +0100 Subject: [PATCH 171/446] Only display RegId in model is different from owner id --- radio/src/dataconstants.h | 2 +- radio/src/datastructs.h | 4 ++-- radio/src/gui/128x64/model_setup.cpp | 20 ++++++++++---------- radio/src/gui/128x64/radio_hardware.cpp | 7 ++++++- radio/src/opentx.h | 6 +++--- radio/src/pulses/pxx2.cpp | 6 +++--- radio/src/pulses/pxx2.h | 4 ++-- radio/src/telemetry/telemetry.cpp | 18 +++++++++--------- radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 3 ++- radio/src/translations/de.h.txt | 3 ++- radio/src/translations/en.h.txt | 3 ++- radio/src/translations/es.h.txt | 3 ++- radio/src/translations/fi.h.txt | 3 ++- radio/src/translations/fr.h.txt | 3 ++- radio/src/translations/it.h.txt | 3 ++- radio/src/translations/nl.h.txt | 3 ++- radio/src/translations/pl.h.txt | 3 ++- radio/src/translations/pt.h.txt | 3 ++- radio/src/translations/se.h.txt | 3 ++- 21 files changed, 60 insertions(+), 42 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 30ed86365..0195a8394 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -788,7 +788,7 @@ enum BluetoothModes { // PXX2 constants #define PXX2_LEN_REGISTRATION_ID 8 -#define PXX2_LEN_RX_ID 8 +#define PXX2_LEN_RX_NAME 8 #define PXX2_MAX_RECEIVERS_PER_MODULE 5 #endif // _DATACONSTANTS_H_ diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 9738a835c..f543eb64a 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -419,7 +419,7 @@ PACK(struct ReceiverData { uint8_t telemetry:1; uint8_t spare:6; uint64_t channelMapping; // each receiver output (16) can be assigned to one of the 16 channels - char rxID[PXX2_LEN_RX_ID]; + char rxName[PXX2_LEN_RX_NAME]; }); /* @@ -798,7 +798,7 @@ PACK(struct RadioData { THEME_DATA - uint8_t ownerRegistrationID[PXX2_LEN_REGISTRATION_ID]; + char ownerRegistrationID[PXX2_LEN_REGISTRATION_ID]; }); #undef SWITCHES_WARNING_DATA diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index e65dc7415..1001281bb 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -237,7 +237,7 @@ enum MenuModelSetupItems { void onPXX2BindMenu(const char * result) { reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index = (result - reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]) / sizeof(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]); - reusableBuffer.modelsetup.pxx2_bind_step = BIND_RX_ID_SELECTED; + reusableBuffer.modelsetup.pxx2_bind_step = BIND_RX_NAME_SELECTED; } void onBindMenu(const char * result) @@ -303,13 +303,13 @@ void menuModelSetup(event_t event) NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_ROTARY_ENCODERS - 1, // Center beeps 0, // Global functions - IF_PXX2(PXX2_LEN_REGISTRATION_ID - 1), // Registration ID + IF_PXX2(memcmp(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID ) ? (uint8_t)-1: HIDDEN_ROW), // Registration ID LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None) INTERNAL_MODULE_CHANNELS_ROWS, // Channels min and count IF_NOT_PXX2(IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), - IF_PXX2(0), // Model Number + IF_PXX2(0), // Model Number ANTENNA_ROW IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Module start channel (pxx2 always send 16) IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Range check and Register buttons @@ -1106,8 +1106,8 @@ void menuModelSetup(event_t event) uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawTextAlignedLeft(y, STR_REG_ID); - lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxID, PXX2_LEN_RX_ID, 0); + lcdDrawTextAlignedLeft(y, STR_RECEIVER); + lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, PXX2_LEN_RX_NAME, 0); } break; @@ -1141,7 +1141,7 @@ void menuModelSetup(event_t event) uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawSizedText(6, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxID, PXX2_LEN_RX_ID, 0); + lcdDrawSizedText(6, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, PXX2_LEN_RX_NAME, 0); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, menuHorizontalPosition==0 ? attr : 0); lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS, y, STR_DEL_BUTTON, menuHorizontalPosition==1 ? attr : 0); if (attr) { @@ -1153,7 +1153,7 @@ void menuModelSetup(event_t event) } if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_BIND) { s_editMode = 1; - if (reusableBuffer.modelsetup.pxx2_bind_step == BIND_RX_ID_RECEIVED) { + if (reusableBuffer.modelsetup.pxx2_bind_step == BIND_RX_NAME_RECEIVED) { popupMenuItemsCount = min(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count, PXX2_MAX_RECEIVERS_PER_MODULE); for (uint8_t i=0; i 0) { @@ -1742,8 +1742,8 @@ void menuModelPinmap(event_t event) SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx)); lcdDrawTextAlignedLeft(0, STR_PINMAPSET); - for (uint8_t pos=0; pos> 4); *c++ = (quartet >= 10 ? quartet + 'A' - 10 : quartet + '0'); @@ -120,11 +120,11 @@ void processBindFrame(uint8_t module, uint8_t * frame) } *c = '\0'; ++reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count; - reusableBuffer.modelsetup.pxx2_bind_step = BIND_RX_ID_RECEIVED; + reusableBuffer.modelsetup.pxx2_bind_step = BIND_RX_NAME_RECEIVED; } } else if (frame[3] == 0x01) { - if (memcmp(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_ids[reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index], &frame[4], PXX2_LEN_RX_ID) == 0) { + if (memcmp(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_ids[reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index], &frame[4], PXX2_LEN_RX_NAME) == 0) { reusableBuffer.modelsetup.pxx2_bind_step = BIND_WAIT; reusableBuffer.modelsetup.pxx2_bind_wait_timeout = get_tmr10ms() + 30; } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 4cb7812bc..8ceb1ae24 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -369,6 +369,7 @@ const char STR_JACKMODE[] = TR_JACKMODE; const char STR_FAILSAFE[] = TR_FAILSAFE; const char STR_FAILSAFESET[] = TR_FAILSAFESET; const char STR_REG_ID[] = TR_REG_ID; +const char STR_OWNER_ID[] = TR_OWNER_ID; const char STR_PINMAPSET[] = TR_PINMAPSET; const char STR_HOLD[] = TR_HOLD; const char STR_NONE[] = TR_NONE; diff --git a/radio/src/translations.h b/radio/src/translations.h index 306daac08..5a8e19671 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -583,6 +583,7 @@ extern const char STR_FAILSAFE[]; extern const char STR_FAILSAFESET[]; extern const char STR_RECEIVER[]; extern const char STR_REG_ID[]; +extern const char STR_OWNER_ID[]; extern const char STR_PINMAPSET[]; extern const char STR_HOLD[]; extern const char STR_NONE[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 6e9885e3a..e1805bee5 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -921,7 +921,8 @@ #define TR_EXTERNALRF "Externí RF modul" #define TR_FAILSAFE TR("Failsafe", "Mód Failsafe") #define TR_FAILSAFESET "NASTAVENÍ FAILSAFE" -#define TR_REG_ID INDENT "Reg. ID" +#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index d26046232..067d8c6f7 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -926,7 +926,8 @@ #define TR_EXTERNALRF "Externes HF-Modul" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Mode") #define TR_FAILSAFESET "Failsafe setzen" -#define TR_REG_ID INDENT "Reg. ID" +#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 3681a0eab..e4546328b 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -925,7 +925,8 @@ #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe mode") #define TR_FAILSAFESET "FAILSAFE SETTINGS" -#define TR_REG_ID INDENT "Reg. ID" +#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index de3915e4e..7c376334c 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -932,7 +932,8 @@ #define TR_EXTERNALRF "Externa RF" #define TR_FAILSAFE INDENT"Modo sgdad." #define TR_FAILSAFESET "AJUSTES SGDAD." -#define TR_REG_ID INDENT "Reg. ID" +#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 577f896a5..1f13dc56f 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -924,7 +924,8 @@ #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE INDENT "Failsafe mode" #define TR_FAILSAFESET "FAILSAFE SETTINGS" -#define TR_REG_ID INDENT "Reg. ID" +#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 86b42022a..9d2417b8b 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -936,7 +936,8 @@ #define TR_EXTERNALRF "HF externe" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Type failsafe") #define TR_FAILSAFESET "REGLAGES FAILSAFE" -#define TR_REG_ID INDENT "Reg. ID" +#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 7a513832e..5c15154be 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -926,7 +926,8 @@ #define TR_EXTERNALRF "Modulo esterno" #define TR_FAILSAFE "Modo failsafe" #define TR_FAILSAFESET TR("FAILSAFE","IMPOSTAZIONI FAILSAFE") -#define TR_REG_ID INDENT "Reg. ID" +#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 35747d20a..e4ad7dcea 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -927,7 +927,8 @@ #define TR_EXTERNALRF "Externe RF" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Modus") #define TR_FAILSAFESET "Failsafe instellen" -#define TR_REG_ID INDENT "Reg. ID" +#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 9cdebc205..1667be9b5 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -927,7 +927,8 @@ #define TR_EXTERNALRF "Zewn.Moduł RF" #define TR_FAILSAFE TR(INDENT"Failsafe",INDENT"Tryb Failsafe") #define TR_FAILSAFESET "USTAWIENIE FAILSAFE" -#define TR_REG_ID INDENT "Reg. ID" +#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index d3162ac61..10ba610bf 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -931,7 +931,8 @@ #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE "Failsafe mode" #define TR_FAILSAFESET "FAILSAFE SETTINGS" -#define TR_REG_ID INDENT "Reg. ID" +#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 02a1d3549..879b199bc 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -940,7 +940,8 @@ #define TR_EXTERNALRF "Extern Radiomodul" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafeläge") #define TR_FAILSAFESET "FailsafeInställning" -#define TR_REG_ID INDENT "Reg. ID" +#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "HOLD" #define TR_NONE "NONE" From 6d4e908de01411129d158b8178496a348f12e3f7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 14 Feb 2019 17:09:15 +0100 Subject: [PATCH 172/446] Custom popup for receiver registration --- radio/src/gui/128x64/gui.h | 13 -- radio/src/gui/128x64/model_flightmodes.cpp | 4 +- radio/src/gui/128x64/model_outputs_arm.cpp | 2 +- radio/src/gui/128x64/model_select.cpp | 6 - radio/src/gui/128x64/model_setup.cpp | 132 ++++++++++++------ .../gui/128x64/model_special_functions.cpp | 2 +- radio/src/gui/128x64/model_telemetry.cpp | 4 +- radio/src/gui/128x64/radio_setup.cpp | 12 +- radio/src/gui/212x64/model_setup.cpp | 8 +- radio/src/gui/480x272/model_setup.cpp | 14 +- radio/src/gui/navigation/navigation_9x.cpp | 62 -------- radio/src/gui/navigation/navigation_x7.cpp | 3 - radio/src/gui/navigation/navigation_x9d.cpp | 2 - radio/src/gui/navigation/navigation_xlite.cpp | 3 - radio/src/opentx.cpp | 12 +- radio/src/opentx.h | 34 +++-- radio/src/pulses/pxx2.cpp | 10 +- radio/src/storage/eeprom_raw.h | 2 - radio/src/storage/eeprom_rlc.cpp | 14 -- radio/src/storage/eeprom_rlc.h | 13 -- radio/src/telemetry/telemetry.cpp | 28 ++-- 21 files changed, 160 insertions(+), 220 deletions(-) diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 0c218020d..397e7fcdb 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -53,21 +53,8 @@ extern uint8_t noHighlightCounter; #define NO_HIGHLIGHT() (noHighlightCounter > 0) #define START_NO_HIGHLIGHT() do { noHighlightCounter = 25; } while(0) - void drawSlider(coord_t x, coord_t y, uint8_t value, uint8_t max, uint8_t attr); -#if defined(NAVIGATION_POT1) -extern int16_t p1valdiff; -#else - #define p1valdiff 0 -#endif - -#if defined(NAVIGATION_POT2) -extern int8_t p2valdiff; -#else - #define p2valdiff 0 -#endif - extern int8_t checkIncDec_Ret; // global helper vars #define EDIT_SELECT_MENU -1 diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp index f6f46800b..9672d8601 100644 --- a/radio/src/gui/128x64/model_flightmodes.cpp +++ b/radio/src/gui/128x64/model_flightmodes.cpp @@ -126,7 +126,7 @@ void menuModelFlightModeOne(event_t event) lcdDrawTextAlignedLeft(y, STR_ROTARY_ENCODER); for (uint8_t t=0; t0) || p1valdiff)) { + if (attr && menuHorizontalPosition == t && editMode > 0) { int16_t v = flightModeAddress(s_currIdx)->rotaryEncoders[t]; if (v < ROTARY_ENCODER_MAX) v = ROTARY_ENCODER_MAX; v = checkIncDec(event, v, ROTARY_ENCODER_MAX, ROTARY_ENCODER_MAX+MAX_FLIGHT_MODES-1, EE_MODEL); @@ -175,7 +175,7 @@ void menuModelFlightModeOne(event_t event) else { lcdDrawText(9*FW, y, STR_OWN, posHorz==1 ? attr : 0); } - if (attr && s_currIdx>0 && posHorz==1 && (editMode>0 || p1valdiff)) { + if (attr && s_currIdx>0 && posHorz==1 && editMode > 0) { if (v < GVAR_MAX) v = GVAR_MAX; v = checkIncDec(event, v, GVAR_MAX, GVAR_MAX+MAX_FLIGHT_MODES-1, EE_MODEL); if (checkIncDec_Ret) { diff --git a/radio/src/gui/128x64/model_outputs_arm.cpp b/radio/src/gui/128x64/model_outputs_arm.cpp index e3e27b387..2e1437240 100644 --- a/radio/src/gui/128x64/model_outputs_arm.cpp +++ b/radio/src/gui/128x64/model_outputs_arm.cpp @@ -113,7 +113,7 @@ void menuModelLimitsOne(event_t event) coord_t y = MENU_HEADER_HEIGHT + 1 + k*FH; uint8_t i = k + menuVerticalOffset; uint8_t attr = (sub==i ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0); - uint8_t active = (attr && (s_editMode>0 || p1valdiff)) ; + uint8_t active = (attr && s_editMode > 0) ; int limit = (g_model.extendedLimits ? LIMIT_EXT_MAX : 1000); switch (i) { diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index e91a3a53b..dd097197b 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -89,12 +89,6 @@ void menuModelSelect(event_t event) check_submenu_simple(_event_, MAX_MODELS - HEADER_LINE); -#if defined(NAVIGATION_POT2) - if (event==0 && p2valdiff<0) { - event = EVT_KEY_FIRST(KEY_RIGHT); - } -#endif - if (s_editMode > 0) s_editMode = 0; diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 1001281bb..c68efbc71 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -236,8 +236,8 @@ enum MenuModelSetupItems { void onPXX2BindMenu(const char * result) { - reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index = (result - reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]) / sizeof(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_names[0]); - reusableBuffer.modelsetup.pxx2_bind_step = BIND_RX_NAME_SELECTED; + reusableBuffer.modelSetup.pxx2.bindSelectedReceiverIndex = (result - reusableBuffer.modelSetup.pxx2.bindCandidateReceiversNames[0]) / sizeof(reusableBuffer.modelSetup.pxx2.bindCandidateReceiversNames[0]); + reusableBuffer.modelSetup.pxx2.bindStep = BIND_RX_NAME_SELECTED; } void onBindMenu(const char * result) @@ -267,6 +267,61 @@ void onBindMenu(const char * result) moduleSettings[moduleIdx].mode = MODULE_MODE_BIND; } +void runPopupRegister(event_t event) +{ + menuVerticalPosition = reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition; + menuHorizontalPosition = reusableBuffer.modelSetup.pxx2.registerPopupHorizontalPosition; + s_editMode = reusableBuffer.modelSetup.pxx2.registerPopupEditMode; + uint8_t backupVerticalOffset = menuVerticalOffset; + + switch (event) { + case EVT_KEY_BREAK(KEY_ENTER): + if (menuVerticalPosition != 2) { + break; + } + else if (menuHorizontalPosition == 0) { + // [Enter] pressed + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; + } + // no break + + case EVT_KEY_LONG(KEY_EXIT): + s_editMode = 0; + // no break; + + case EVT_KEY_BREAK(KEY_EXIT): + if (s_editMode <= 0) { + warningText = NULL; + } + break; + } + + if (warningText) { + const uint8_t dialogRows[] = { 0, 0, 1}; + check(event, 0, nullptr, 0, dialogRows, 2, 2); + + drawMessageBox(); + + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, "Reg. ID"); + editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); + + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Rx Name"); + editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.modelSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); + + // lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, STR_POPUPS_ENTER_EXIT); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); + lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); + + reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; + reusableBuffer.modelSetup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; + reusableBuffer.modelSetup.pxx2.registerPopupEditMode = s_editMode; + } + + menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER + HEADER_LINE; + menuHorizontalPosition = 1; + menuVerticalOffset = backupVerticalOffset; + s_editMode = (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_REGISTER ? EDIT_MODIFY_FIELD : 0); +} void menuModelSetup(event_t event) { @@ -370,7 +425,7 @@ void menuModelSetup(event_t event) TITLE(STR_MENUSETUP); if (event == EVT_ENTRY) { - reusableBuffer.modelsetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + reusableBuffer.modelSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; } uint8_t sub = menuVerticalPosition - HEADER_LINE; @@ -405,7 +460,7 @@ void menuModelSetup(event_t event) drawStringWithIndex(0*FW, y, STR_TIMER, timerIdx+1); drawTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, menuHorizontalPosition==0 ? attr : 0); drawTimer(MODEL_SETUP_2ND_COLUMN+5*FW-2+5*FWNUM+1, y, timer->start, RIGHT | (menuHorizontalPosition==1 ? attr : 0), menuHorizontalPosition==2 ? attr : 0); - if (attr && (editMode>0 || p1valdiff)) { + if (attr && editMode > 0) { div_t qr = div(timer->start, 60); switch (menuHorizontalPosition) { case 0: @@ -736,7 +791,7 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(x, y, STR_RETA123, i, ((menuHorizontalPosition==i) && attr) ? BLINK|INVERS : (((g_model.beepANACenter & ((BeepANACenter)1<0 || p1valdiff)) { + if (attr && editMode > 0) { switch (menuHorizontalPosition) { case 0: g_model.moduleData[EXTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, @@ -877,7 +932,7 @@ void menuModelSetup(event_t event) if (pdef->subTypeString != nullptr) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, pdef->subTypeString, g_model.moduleData[EXTERNAL_MODULE].subType, attr); } - if (attr && (editMode > 0 || p1valdiff)) { + if (attr && editMode > 0) { switch (menuHorizontalPosition) { case 0: if (multi_rfProto == MM_RF_CUSTOM_SELECTED) @@ -971,7 +1026,7 @@ void menuModelSetup(event_t event) lcdDrawNumber(lcdLastRightPos, y, g_model.trainerData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0)); lcdDrawChar(lcdLastRightPos, y, '-'); lcdDrawNumber(lcdLastRightPos + FW+1, y, g_model.trainerData.channelsStart + 8 + g_model.trainerData.channelsCount, LEFT | (menuHorizontalPosition==1 ? attr : 0)); - if (attr && (editMode>0 || p1valdiff)) { + if (attr && editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR_ZERO(event, g_model.trainerData.channelsStart, 32-8-g_model.trainerData.channelsCount); @@ -1001,7 +1056,7 @@ void menuModelSetup(event_t event) lcdDrawNumber(lcdLastRightPos, y, moduleData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0)); lcdDrawChar(lcdLastRightPos, y, '-'); lcdDrawNumber(lcdLastRightPos + FW+1, y, moduleData.channelsStart+sentModuleChannels(moduleIdx), LEFT | (menuHorizontalPosition==1 ? attr : 0)); - if (attr && (editMode>0 || p1valdiff)) { + if (attr && editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.channelsStart, 32-8-moduleData.channelsCount); @@ -1026,7 +1081,7 @@ void menuModelSetup(event_t event) lcdDrawChar(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u'); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.trainerData.delay*50)+300, RIGHT | ((CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0)); lcdDrawChar(MODEL_SETUP_2ND_COLUMN+10*FW, y, g_model.trainerData.pulsePol ? '+' : '-', (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); - if (attr && (editMode>0 || p1valdiff)) { + if (attr && editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR(event, g_model.trainerData.frameLength, -20, 35); @@ -1062,23 +1117,22 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, INDENT "Module"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, (menuHorizontalPosition==0 ? attr : 0) ); lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition==1 ? attr : 0) ); - if (attr && s_editMode>0 && menuHorizontalPosition == 0 ) { - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; - } - if (attr && menuHorizontalPosition == 1) { - if (event == EVT_KEY_BREAK(KEY_ENTER)) { - moduleSettings[INTERNAL_MODULE].mode ^= MODULE_MODE_REGISTER; + if (attr) { + if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL && s_editMode > 0) { + if (menuHorizontalPosition == 1) { + reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition = 0; + reusableBuffer.modelSetup.pxx2.registerPopupEditMode = 0; + s_editMode = 0; + POPUP_INPUT("", runPopupRegister); + } + else { + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; + } } - if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_REGISTER) { - s_editMode = 1; + if (s_editMode == 0) { + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; } } - if (attr && s_editMode==0) { - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; - } - if (attr && moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL) { - s_editMode = 0; - } break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER: @@ -1147,16 +1201,16 @@ void menuModelSetup(event_t event) if (attr) { if (menuHorizontalPosition == 0) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { - reusableBuffer.modelsetup.pxx2_bind_step = BIND_START; - reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count = 0; + reusableBuffer.modelSetup.pxx2.bindStep = BIND_START; + reusableBuffer.modelSetup.pxx2.bindCandidateReceiversCount = 0; moduleSettings[INTERNAL_MODULE].mode ^= MODULE_MODE_BIND; } if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_BIND) { s_editMode = 1; - if (reusableBuffer.modelsetup.pxx2_bind_step == BIND_RX_NAME_RECEIVED) { - popupMenuItemsCount = min(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count, PXX2_MAX_RECEIVERS_PER_MODULE); + if (reusableBuffer.modelSetup.pxx2.bindStep == BIND_RX_NAME_RECEIVED) { + popupMenuItemsCount = min(reusableBuffer.modelSetup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); for (uint8_t i=0; i 0) { @@ -1200,7 +1254,7 @@ void menuModelSetup(event_t event) lcdDrawChar(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u'); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (moduleData.ppm.delay*50)+300, RIGHT | ((CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0)); lcdDrawChar(MODEL_SETUP_2ND_COLUMN+10*FW, y, moduleData.ppm.pulsePol ? '+' : '-', (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); - if (attr && (editMode>0 || p1valdiff)) { + if (attr && editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR(event, moduleData.ppm.frameLength, -20, 35); @@ -1246,7 +1300,7 @@ void menuModelSetup(event_t event) if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); if (attr && l_posHorz == 0) { - if (editMode>0 || p1valdiff) { + if (editMode > 0) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); if (checkIncDec_Ret) { modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; @@ -1369,7 +1423,7 @@ void menuModelSetup(event_t event) if (moduleData.failsafeMode != FAILSAFE_CUSTOM) menuHorizontalPosition = 0; if (menuHorizontalPosition == 0) { - if (editMode > 0 || p1valdiff) { + if (editMode > 0) { CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST); if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx); } @@ -1484,11 +1538,11 @@ void menuModelSetup(event_t event) if (attr) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].pxx.power, R9M_LBT_POWER_MAX); } - if (attr && editMode == 0 && reusableBuffer.modelsetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { - if((reusableBuffer.modelsetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind + if (attr && editMode == 0 && reusableBuffer.modelSetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { + if((reusableBuffer.modelSetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind POPUP_WARNING(STR_REBIND); } - reusableBuffer.modelsetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; + reusableBuffer.modelSetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } } } @@ -1550,7 +1604,7 @@ void menuModelSetup(event_t event) lcdDrawNumber(lcdLastRightPos, y, g_model.moduleData[1].channelsStart+1, LEFT | (menuHorizontalPosition<=0 ? attr : 0)); lcdDrawChar(lcdLastRightPos, y, '-'); lcdDrawNumber(lcdLastRightPos + FW+1, y, g_model.moduleData[1].channelsStart+8+g_model.moduleData[1].channelsCount, LEFT | (menuHorizontalPosition!=0 ? attr : 0)); - if (attr && (editMode>0 || p1valdiff)) { + if (attr && editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[1].channelsStart, 32-8-g_model.moduleData[1].channelsCount); @@ -1571,7 +1625,7 @@ void menuModelSetup(event_t event) lcdDrawChar(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u'); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.moduleData[1].ppmDelay*50)+300, RIGHT | ((menuHorizontalPosition < 0 || menuHorizontalPosition==1) ? attr : 0)); lcdDrawChar(MODEL_SETUP_2ND_COLUMN+10*FW, y, g_model.moduleData[1].ppmPulsePol ? '+' : '-', (menuHorizontalPosition < 0 || menuHorizontalPosition==2) ? attr : 0); - if (attr && (editMode>0 || p1valdiff)) { + if (attr && editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR(event, g_model.moduleData[1].ppmFrameLength, -20, 35); diff --git a/radio/src/gui/128x64/model_special_functions.cpp b/radio/src/gui/128x64/model_special_functions.cpp index f8163d0a0..4ce5b9c87 100644 --- a/radio/src/gui/128x64/model_special_functions.cpp +++ b/radio/src/gui/128x64/model_special_functions.cpp @@ -186,7 +186,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF uint8_t func = CFN_FUNC(cfn); for (uint8_t j=0; j<5; j++) { uint8_t attr = ((sub==k && menuHorizontalPosition==j) ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0); - uint8_t active = (attr && (s_editMode>0 || p1valdiff)); + uint8_t active = (attr && s_editMode > 0); switch (j) { case 0: if (sub==k && menuHorizontalPosition < 1 && CFN_SWITCH(cfn) == SWSRC_NONE) { diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index 1e322f8d0..ddedf5614 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -588,7 +588,7 @@ void menuModelTelemetryFrsky(event_t event) } lcdDrawNumber(TELEM_COL2, y, -10+g_model.frsky.varioMin, ((CURSOR_ON_LINE() || menuHorizontalPosition==0) ? attr : 0)|LEFT); lcdDrawNumber(TELEM_COL2+4*FW, y, 10+g_model.frsky.varioMax, ((CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0)|LEFT); - if (attr && (s_editMode>0 || p1valdiff)) { + if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioMin, -7, 7); @@ -605,7 +605,7 @@ void menuModelTelemetryFrsky(event_t event) lcdDrawNumber(TELEM_COL2, y, -5+g_model.frsky.varioCenterMin, ((CURSOR_ON_LINE() || menuHorizontalPosition==0) ? attr : 0)|PREC1|LEFT); lcdDrawNumber(TELEM_COL2+4*FW, y, 5+g_model.frsky.varioCenterMax, ((CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0)|PREC1|LEFT); lcdDrawTextAtIndex(TELEM_COL2+8*FW, y, STR_VVARIOCENTER, g_model.frsky.varioCenterSilent, (menuHorizontalPosition==2 ? attr : 0)); - if (attr && (s_editMode>0 || p1valdiff)) { + if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioCenterMin, -16, 5+min(10, g_model.frsky.varioCenterMax+5)); diff --git a/radio/src/gui/128x64/radio_setup.cpp b/radio/src/gui/128x64/radio_setup.cpp index 6b7a44987..118ba8efd 100644 --- a/radio/src/gui/128x64/radio_setup.cpp +++ b/radio/src/gui/128x64/radio_setup.cpp @@ -161,11 +161,11 @@ void menuRadioSetup(event_t event) switch (j) { case 0: lcdDrawNumber(RADIO_SETUP_DATE_COLUMN, y, t.tm_year+TM_YEAR_BASE, rowattr|RIGHT); - if (rowattr && (s_editMode>0 || p1valdiff)) t.tm_year = checkIncDec(event, t.tm_year, 112, 200, 0); + if (rowattr && s_editMode > 0) t.tm_year = checkIncDec(event, t.tm_year, 112, 200, 0); break; case 1: lcdDrawNumber(RADIO_SETUP_DATE_COLUMN+3*FW-2, y, t.tm_mon+1, rowattr|LEADING0|RIGHT, 2); - if (rowattr && (s_editMode>0 || p1valdiff)) t.tm_mon = checkIncDec(event, t.tm_mon, 0, 11, 0); + if (rowattr && s_editMode > 0) t.tm_mon = checkIncDec(event, t.tm_mon, 0, 11, 0); break; case 2: { @@ -174,7 +174,7 @@ void menuRadioSetup(event_t event) static const uint8_t dmon[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; dlim += dmon[t.tm_mon]; lcdDrawNumber(RADIO_SETUP_DATE_COLUMN+6*FW-4, y, t.tm_mday, rowattr|LEADING0|RIGHT, 2); - if (rowattr && (s_editMode>0 || p1valdiff)) t.tm_mday = checkIncDec(event, t.tm_mday, 1, dlim, 0); + if (rowattr && s_editMode > 0) t.tm_mday = checkIncDec(event, t.tm_mday, 1, dlim, 0); break; } } @@ -192,15 +192,15 @@ void menuRadioSetup(event_t event) switch (j) { case 0: lcdDrawNumber(RADIO_SETUP_TIME_COLUMN, y, t.tm_hour, rowattr|LEADING0|RIGHT, 2); - if (rowattr && (s_editMode>0 || p1valdiff)) t.tm_hour = checkIncDec(event, t.tm_hour, 0, 23, 0); + if (rowattr && s_editMode > 0) t.tm_hour = checkIncDec(event, t.tm_hour, 0, 23, 0); break; case 1: lcdDrawNumber(RADIO_SETUP_TIME_COLUMN+3*FWNUM, y, t.tm_min, rowattr|LEADING0|RIGHT, 2); - if (rowattr && (s_editMode>0 || p1valdiff)) t.tm_min = checkIncDec(event, t.tm_min, 0, 59, 0); + if (rowattr && s_editMode > 0) t.tm_min = checkIncDec(event, t.tm_min, 0, 59, 0); break; case 2: lcdDrawNumber(RADIO_SETUP_TIME_COLUMN+6*FWNUM, y, t.tm_sec, rowattr|LEADING0|RIGHT, 2); - if (rowattr && (s_editMode>0 || p1valdiff)) t.tm_sec = checkIncDec(event, t.tm_sec, 0, 59, 0); + if (rowattr && s_editMode > 0) t.tm_sec = checkIncDec(event, t.tm_sec, 0, 59, 0); break; } } diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index c57e5b4c4..aa9e1e5c8 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -304,7 +304,7 @@ void menuModelSetup(event_t event) MENU_CHECK(STR_MENUSETUP, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX); if (event == EVT_ENTRY) { - reusableBuffer.modelsetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + reusableBuffer.modelSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; } #if (defined(DSM2) || defined(PXX)) @@ -1182,10 +1182,10 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_LBT_POWER_MAX); - if (attr && s_editMode == 0 && reusableBuffer.modelsetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { - if((reusableBuffer.modelsetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) //switching between mode 2 and 3 does not require rebind + if (attr && s_editMode == 0 && reusableBuffer.modelSetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { + if((reusableBuffer.modelSetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) //switching between mode 2 and 3 does not require rebind POPUP_WARNING(STR_REBIND); - reusableBuffer.modelsetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; + reusableBuffer.modelSetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } } } diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index a782b5aa9..fd690479b 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -102,14 +102,14 @@ enum MenuModelSetupItems { void checkModelIdUnique(uint8_t moduleIdx) { - char* warn_buf = reusableBuffer.modelsetup.msg; + char* warn_buf = reusableBuffer.modelSetup.msg; // cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 - size_t warn_buf_len = sizeof(reusableBuffer.modelsetup.msg) - WARNING_LINE_LEN - 2; + size_t warn_buf_len = sizeof(reusableBuffer.modelSetup.msg) - WARNING_LINE_LEN - 2; if (!modelslist.isModelIdUnique(moduleIdx,warn_buf,warn_buf_len)) { if (warn_buf[0] != 0) { POPUP_WARNING(STR_MODELIDUSED); - SET_WARNING_INFO(warn_buf, sizeof(reusableBuffer.modelsetup.msg), 0); + SET_WARNING_INFO(warn_buf, sizeof(reusableBuffer.modelSetup.msg), 0); } } } @@ -293,7 +293,7 @@ bool menuModelSetup(event_t event) TRAINER_LINE2_ROWS }); if (event == EVT_ENTRY) { - reusableBuffer.modelsetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + reusableBuffer.modelSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; } if (menuEvent) { @@ -1103,12 +1103,12 @@ bool menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_LBT_POWER_MAX); - if (attr && s_editMode == 0 && reusableBuffer.modelsetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { - if((reusableBuffer.modelsetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind + if (attr && s_editMode == 0 && reusableBuffer.modelSetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { + if((reusableBuffer.modelSetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind POPUP_WARNING(STR_WARNING); SET_WARNING_INFO(STR_REBIND, sizeof(TR_REBIND), 0); } - reusableBuffer.modelsetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; + reusableBuffer.modelSetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } } } diff --git a/radio/src/gui/navigation/navigation_9x.cpp b/radio/src/gui/navigation/navigation_9x.cpp index 63569e4b9..f4336e194 100644 --- a/radio/src/gui/navigation/navigation_9x.cpp +++ b/radio/src/gui/navigation/navigation_9x.cpp @@ -27,14 +27,6 @@ uint8_t menuCalibrationState; vertpos_t menuVerticalPosition; horzpos_t menuHorizontalPosition; -#if defined(NAVIGATION_POT1) -int16_t p1valdiff; -#endif - -#if defined(NAVIGATION_POT2) -int8_t p2valdiff; -#endif - int8_t checkIncDec_Ret; #define DBLKEYS_PRESSED_RGT_LFT(in) ((in & (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_LEFT)) == (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_LEFT)) @@ -126,12 +118,6 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla newval = !val; } -#if defined(NAVIGATION_POT1) - // change values based on P1 - newval -= p1valdiff; - p1valdiff = 0; -#endif - #if defined(AUTOSWITCH) if (i_flags & INCDEC_SWITCH) { newval = checkIncDecMovedSwitch(newval); @@ -172,7 +158,6 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla return newval; } -#define SCROLL_TH 64 #define SCROLL_POT1_TH 32 #define CURSOR_NOT_ALLOWED_IN_ROW(row) ((int8_t)MAXCOL(row) < 0) @@ -192,36 +177,6 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t uint8_t maxcol = MAXCOL(l_posVert); -#if defined(NAVIGATION_POT1) - // check pot 1 - if changed -> scroll values - static int16_t p1val; - static int16_t p1valprev; - p1valdiff = (p1val-calibratedAnalogs[CALIBRATED_POT1]) / SCROLL_POT1_TH; - if (p1valdiff) { - p1valdiff = (p1valprev-calibratedAnalogs[CALIBRATED_POT1]) / 2; - p1val = calibratedAnalogs[CALIBRATED_POT1]; - } - p1valprev = calibratedAnalogs[CALIBRATED_POT1]; -#endif - -#if defined(NAVIGATION_POT2) - // check pot 2 - if changed -> scroll menu - static int16_t p2valprev; - p2valdiff = (p2valprev-calibratedAnalogs[CALIBRATED_POT2]) / SCROLL_TH; - if (p2valdiff) p2valprev = calibratedAnalogs[CALIBRATED_POT2]; -#endif - -#if defined(NAVIGATION_POT3) - // check pot 3 if changed -> cursor down/up - static int16_t p3valprev; - int8_t scrollUD = (p3valprev-calibratedAnalogs[CALIBRATED_POT3]) / SCROLL_TH; - if (scrollUD) p3valprev = calibratedAnalogs[CALIBRATED_POT3]; -#else - #define scrollUD 0 -#endif - - if (p2valdiff || scrollUD || p1valdiff) backlightOn(); // on keypress turn the light on - if (menuTab) { uint8_t attr = 0; @@ -230,10 +185,6 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t int8_t cc = curr; - if (p2valdiff) { - cc = limit((int8_t)0, (int8_t)(cc - p2valdiff), (int8_t)(menuTabSize-1)); - } - switch (event) { #if defined(ROTARY_ENCODER_NAVIGATION) case EVT_ROTARY_BREAK: @@ -289,19 +240,6 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t } - DISPLAY_PROGRESS_BAR(menuTab ? lcdLastRightPos-2*FW-((curr+1)/10*FWNUM)-2 : 20*FW+1); - - if (s_editMode<=0) { - if (scrollUD) { - l_posVert = limit((int8_t)0, (int8_t)(l_posVert - scrollUD), (int8_t)maxrow); - l_posHorz = min((uint8_t)l_posHorz, MAXCOL(l_posVert)); - } - - if (p2valdiff && l_posVert>0) { - l_posHorz = limit((int8_t)0, (int8_t)((uint8_t)l_posHorz - p2valdiff), (int8_t)maxcol); - } - } - switch (event) { case EVT_ENTRY: diff --git a/radio/src/gui/navigation/navigation_x7.cpp b/radio/src/gui/navigation/navigation_x7.cpp index d084b6a60..f5553267b 100644 --- a/radio/src/gui/navigation/navigation_x7.cpp +++ b/radio/src/gui/navigation/navigation_x7.cpp @@ -230,7 +230,6 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla return newval; } -#define SCROLL_TH 64 #define SCROLL_POT1_TH 32 #define CURSOR_NOT_ALLOWED_IN_ROW(row) ((int8_t)MAXCOL(row) < 0) @@ -285,8 +284,6 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t drawScreenIndex(curr, menuTabSize, 0); } - DISPLAY_PROGRESS_BAR(menuTab ? lcdLastRightPos-2*FW-((curr+1)/10*FWNUM)-2 : 20*FW+1); - switch (event) { case EVT_ENTRY: menuEntryTime = get_tmr10ms(); diff --git a/radio/src/gui/navigation/navigation_x9d.cpp b/radio/src/gui/navigation/navigation_x9d.cpp index a56ca656a..1cfb7d438 100644 --- a/radio/src/gui/navigation/navigation_x9d.cpp +++ b/radio/src/gui/navigation/navigation_x9d.cpp @@ -393,8 +393,6 @@ void check(const char * name, event_t event, uint8_t curr, const MenuHandlerFunc lcdDrawFilledRect(0, 0, LCD_W, MENU_HEADER_HEIGHT, SOLID, FILL_WHITE|GREY_DEFAULT); } - DISPLAY_PROGRESS_BAR(menuTab ? lcdLastRightPos-2*FW-((curr+1)/10*FWNUM)-2 : 20*FW+1); - switch (event) { case EVT_ENTRY: menuEntryTime = get_tmr10ms(); diff --git a/radio/src/gui/navigation/navigation_xlite.cpp b/radio/src/gui/navigation/navigation_xlite.cpp index e98c88073..e365f8e77 100644 --- a/radio/src/gui/navigation/navigation_xlite.cpp +++ b/radio/src/gui/navigation/navigation_xlite.cpp @@ -292,7 +292,6 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla return newval; } -#define SCROLL_TH 64 #define SCROLL_POT1_TH 32 #define CURSOR_NOT_ALLOWED_IN_ROW(row) ((int8_t)MAXCOL(row) < 0) @@ -375,8 +374,6 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t drawScreenIndex(curr, menuTabSize, attr); } - DISPLAY_PROGRESS_BAR(menuTab ? lcdLastRightPos-2*FW-((curr+1)/10*FWNUM)-2 : 20*FW+1); - switch (event) { case EVT_ENTRY: diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index c4666a34d..477c0650e 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -368,16 +368,16 @@ void checkModelIdUnique(uint8_t index, uint8_t module) { uint8_t modelId = g_model.header.modelId[module]; uint8_t additionalOnes = 0; - char * name = reusableBuffer.modelsetup.msg; + char * name = reusableBuffer.modelSetup.msg; - memset(reusableBuffer.modelsetup.msg, 0, sizeof(reusableBuffer.modelsetup.msg)); + memset(reusableBuffer.modelSetup.msg, 0, sizeof(reusableBuffer.modelSetup.msg)); if (modelId != 0) { for (uint8_t i = 0; i < MAX_MODELS; i++) { if (i != index) { if (modelId == modelHeaders[i].modelId[module]) { - if ((WARNING_LINE_LEN - 4 - (name - reusableBuffer.modelsetup.msg)) > (signed)(modelHeaders[i].name[0] ? zlen(modelHeaders[i].name, LEN_MODEL_NAME) : sizeof(TR_MODEL) + 2)) { // you cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 (-2 for the ",") - if (reusableBuffer.modelsetup.msg[0] != 0) { + if ((WARNING_LINE_LEN - 4 - (name - reusableBuffer.modelSetup.msg)) > (signed)(modelHeaders[i].name[0] ? zlen(modelHeaders[i].name, LEN_MODEL_NAME) : sizeof(TR_MODEL) + 2)) { // you cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 (-2 for the ",") + if (reusableBuffer.modelSetup.msg[0] != 0) { name = strAppend(name, ", "); } if (modelHeaders[i].name[0] == 0) { @@ -402,9 +402,9 @@ void checkModelIdUnique(uint8_t index, uint8_t module) name = strAppend(name, ")"); } - if (reusableBuffer.modelsetup.msg[0] != 0) { + if (reusableBuffer.modelSetup.msg[0] != 0) { POPUP_WARNING(STR_MODELIDUSED); - SET_WARNING_INFO(reusableBuffer.modelsetup.msg, sizeof(reusableBuffer.modelsetup.msg), 0); + SET_WARNING_INFO(reusableBuffer.modelSetup.msg, sizeof(reusableBuffer.modelSetup.msg), 0); } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 808eccca1..21bfc9c3b 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1118,20 +1118,26 @@ union ReusableBuffer char msg[64]; uint8_t r9mPower; union { - uint8_t pxx2_register_step; - uint8_t pxx2_bind_step; + struct { + union { + uint8_t registerStep; + uint8_t bindStep; + }; + uint32_t bindWaitTimeout; + uint8_t registerPopupVerticalPosition; + uint8_t registerPopupHorizontalPosition; + int8_t registerPopupEditMode; + char registerRxName[PXX2_LEN_RX_NAME]; + char bindCandidateReceiversIds[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; + char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][3*PXX2_LEN_RX_NAME+1]; + uint8_t bindCandidateReceiversCount; + uint8_t bindSelectedReceiverIndex; + } pxx2; }; - uint32_t pxx2_bind_wait_timeout; - uint8_t pxx2_register_rx_id[PXX2_LEN_RX_NAME]; - char pxx2_bind_candidate_receivers_ids[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; - char pxx2_bind_candidate_receivers_names[PXX2_MAX_RECEIVERS_PER_MODULE][3*PXX2_LEN_RX_NAME+1]; - uint8_t pxx2_bind_candidate_receivers_count; - uint8_t pxx2_bind_selected_receiver_index; - } modelsetup; + } modelSetup; // 103 bytes - struct - { + struct { int16_t midVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; int16_t loVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; int16_t hiVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; @@ -1148,8 +1154,7 @@ union ReusableBuffer #if defined(SDCARD) // 274 bytes - struct - { + struct { char lines[NUM_BODY_LINES][SD_SCREEN_FILE_LENGTH+1+1]; // the last char is used to store the flags (directory) of the line uint32_t available; uint16_t offset; @@ -1158,8 +1163,7 @@ union ReusableBuffer } sdmanager; #endif - struct - { + struct { uint8_t stickMode; } generalSettings; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 852eb5a6f..f8950455a 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -58,7 +58,7 @@ bool Pxx2Pulses::setupRegisterFrame(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); - if (reusableBuffer.modelsetup.pxx2_register_step == REGISTER_COUNTER_ID_RECEIVED) { + if (reusableBuffer.modelSetup.pxx2.registerStep == REGISTER_COUNTER_ID_RECEIVED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i reusableBuffer.modelsetup.pxx2_bind_wait_timeout) { + if (reusableBuffer.modelSetup.pxx2.bindStep == BIND_WAIT) { + if (get_tmr10ms() > reusableBuffer.modelSetup.pxx2.bindWaitTimeout) { moduleSettings[module].mode = MODULE_MODE_NORMAL; POPUP_INFORMATION(STR_BIND_OK); } @@ -87,10 +87,10 @@ bool Pxx2Pulses::setupBindFrame(uint8_t module) return false; } } - else if (reusableBuffer.modelsetup.pxx2_bind_step == BIND_RX_NAME_SELECTED) { + else if (reusableBuffer.modelSetup.pxx2.bindStep == BIND_RX_NAME_SELECTED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i> 4); @@ -119,14 +119,14 @@ void processBindFrame(uint8_t module, uint8_t * frame) *c++ = ' '; } *c = '\0'; - ++reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_count; - reusableBuffer.modelsetup.pxx2_bind_step = BIND_RX_NAME_RECEIVED; + ++reusableBuffer.modelSetup.pxx2.bindCandidateReceiversCount; + reusableBuffer.modelSetup.pxx2.bindStep = BIND_RX_NAME_RECEIVED; } } else if (frame[3] == 0x01) { - if (memcmp(reusableBuffer.modelsetup.pxx2_bind_candidate_receivers_ids[reusableBuffer.modelsetup.pxx2_bind_selected_receiver_index], &frame[4], PXX2_LEN_RX_NAME) == 0) { - reusableBuffer.modelsetup.pxx2_bind_step = BIND_WAIT; - reusableBuffer.modelsetup.pxx2_bind_wait_timeout = get_tmr10ms() + 30; + if (memcmp(reusableBuffer.modelSetup.pxx2.bindCandidateReceiversIds[reusableBuffer.modelSetup.pxx2.bindSelectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) { + reusableBuffer.modelSetup.pxx2.bindStep = BIND_WAIT; + reusableBuffer.modelSetup.pxx2.bindWaitTimeout = get_tmr10ms() + 30; } } } From 30131d6b368cb1bf61c374aa799098f4de98bc2e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 14 Feb 2019 23:52:50 +0100 Subject: [PATCH 173/446] Cosmetics --- radio/src/gui/128x64/gui.h | 11 ++++++----- radio/src/gui/128x64/model_setup.cpp | 9 +++++++-- radio/src/gui/212x64/gui.h | 3 ++- radio/src/gui/480x272/menus.h | 3 ++- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 397e7fcdb..da65a514c 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -72,13 +72,14 @@ extern int8_t s_editMode; // global editmode #define INCDEC_REP10 0x40 #define NO_DBLKEYS 0x80 - #define INCDEC_DECLARE_VARS(f) uint8_t incdecFlag = (f); IsValueAvailable isValueAvailable = NULL - #define INCDEC_SET_FLAG(f) incdecFlag = (f) - #define INCDEC_ENABLE_CHECK(fn) isValueAvailable = fn - #define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, incdecFlag, isValueAvailable) +#define INCDEC_DECLARE_VARS(f) uint8_t incdecFlag = (f); IsValueAvailable isValueAvailable = NULL +#define INCDEC_SET_FLAG(f) incdecFlag = (f) +#define INCDEC_ENABLE_CHECK(fn) isValueAvailable = fn +#define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, incdecFlag, isValueAvailable) // mawrow special values -#define TITLE_ROW ((uint8_t)-1) +#define READONLY_ROW ((uint8_t)-1) +#define TITLE_ROW READONLY_ROW #define HIDDEN_ROW ((uint8_t)-2) struct CheckIncDecStops { diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index c68efbc71..90fd60553 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -308,7 +308,6 @@ void runPopupRegister(event_t event) lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Rx Name"); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.modelSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); - // lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, STR_POPUPS_ENTER_EXIT); lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); @@ -323,6 +322,11 @@ void runPopupRegister(event_t event) s_editMode = (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_REGISTER ? EDIT_MODIFY_FIELD : 0); } +inline bool isDefaultModelRegistrationID() +{ + return memcmp(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0; +} + void menuModelSetup(event_t event) { #if defined(EXTERNAL_ANTENNA) @@ -358,7 +362,7 @@ void menuModelSetup(event_t event) NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_ROTARY_ENCODERS - 1, // Center beeps 0, // Global functions - IF_PXX2(memcmp(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID ) ? (uint8_t)-1: HIDDEN_ROW), // Registration ID + IF_PXX2(isDefaultModelRegistrationID() ? HIDDEN_ROW : READONLY_ROW), // Registration ID LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None) @@ -1121,6 +1125,7 @@ void menuModelSetup(event_t event) if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL && s_editMode > 0) { if (menuHorizontalPosition == 1) { reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition = 0; + reusableBuffer.modelSetup.pxx2.registerPopupHorizontalPosition = 0; reusableBuffer.modelSetup.pxx2.registerPopupEditMode = 0; s_editMode = 0; POPUP_INPUT("", runPopupRegister); diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index 7b217a708..50286021d 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -107,7 +107,8 @@ extern int8_t s_editMode; // global editmode #define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, incdecFlag, isValueAvailable) // mawrow special values -#define TITLE_ROW ((uint8_t)-1) +#define READONLY_ROW ((uint8_t)-1) +#define TITLE_ROW READONLY_ROW #define HIDDEN_ROW ((uint8_t)-2) struct CheckIncDecStops diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index 753c34a24..0c13c92fd 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -274,7 +274,8 @@ extern int8_t s_editMode; // global editmode #define NO_DBLKEYS 0x80 // mawrow special values -#define TITLE_ROW ((uint8_t)-1) +#define READONLY_ROW ((uint8_t)-1) +#define TITLE_ROW READONLY_ROW #define ORPHAN_ROW ((uint8_t)-2) #define HIDDEN_ROW ((uint8_t)-3) #define NAVIGATION_LINE_BY_LINE 0x40 From 8d0039f40379d9cec01d68569edb974ee5a9d97c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Feb 2019 11:31:23 +0100 Subject: [PATCH 174/446] Cosmetics --- radio/src/gui/128x64/radio_hardware.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 133b2d564..1973a5b35 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -154,7 +154,22 @@ enum MenuRadioHardwareItems { void menuRadioHardware(event_t event) { - MENU(STR_HARDWARE, menuTabGeneral, MENU_RADIO_HARDWARE, HEADER_LINE+ITEM_RADIO_HARDWARE_MAX, { HEADER_LINE_COLUMNS LABEL(Sticks), 0, 0, 0, 0, LABEL(Pots), POTS_ROWS, LABEL(Switches), SWITCHES_ROWS, 0/*max bauds*/, BLUETOOTH_ROWS 0/*jitter filter*/ , 0 /*owner id*/ }); + MENU(STR_HARDWARE, menuTabGeneral, MENU_RADIO_HARDWARE, HEADER_LINE+ITEM_RADIO_HARDWARE_MAX, { + HEADER_LINE_COLUMNS + LABEL(Sticks), + 0, + 0, + 0, + 0, + LABEL(Pots), + POTS_ROWS, + LABEL(Switches), + SWITCHES_ROWS, + 0 /*max bauds*/, + BLUETOOTH_ROWS + 0 /*jitter filter*/, + 0 /*owner id*/ + }); uint8_t sub = menuVerticalPosition - HEADER_LINE; From 2afe8794aa8baa77a7b90df9a14a47ae119545ce Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 15 Feb 2019 11:36:13 +0100 Subject: [PATCH 175/446] Provision for registration in hardware menu --- radio/src/gui/128x64/radio_hardware.cpp | 76 +++++++++++++++++++++++++ radio/src/opentx.h | 2 +- 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 1973a5b35..3785ac758 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -123,6 +123,7 @@ enum MenuRadioHardwareItems { #endif ITEM_RADIO_HARDWARE_JITTER_FILTER, ITEM_RADIO_OWNER_ID, + ITEM_RADIO_REGISTER_RECEIVER, ITEM_RADIO_HARDWARE_MAX }; @@ -152,6 +153,61 @@ enum MenuRadioHardwareItems { #define HW_SETTINGS_COLUMN1 30 #define HW_SETTINGS_COLUMN2 (30 + 5*FW) +void runPopupHWSetupRegister(event_t event) +{ + menuVerticalPosition = reusableBuffer.hardwareSetup.pxx2.registerPopupVerticalPosition; + menuHorizontalPosition = reusableBuffer.hardwareSetup.pxx2.registerPopupHorizontalPosition; + s_editMode = reusableBuffer.hardwareSetup.pxx2.registerPopupEditMode; + uint8_t backupVerticalOffset = menuVerticalOffset; + + switch (event) { + case EVT_KEY_BREAK(KEY_ENTER): + if (menuVerticalPosition != 2) { + break; + } + else if (menuHorizontalPosition == 0) { + // [Enter] pressed + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; + } + // no break + + case EVT_KEY_LONG(KEY_EXIT): + s_editMode = 0; + // no break; + + case EVT_KEY_BREAK(KEY_EXIT): + if (s_editMode <= 0) { + warningText = NULL; + } + break; + } + + if (warningText) { + const uint8_t dialogRows[] = { 0, 0, 1}; + check(event, 0, nullptr, 0, dialogRows, 2, 2); + + drawMessageBox(); + + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, "Reg. ID"); + editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); + + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Rx Name"); + editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.hardwareSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); + + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); + lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); + + reusableBuffer.hardwareSetup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; + reusableBuffer.hardwareSetup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; + reusableBuffer.hardwareSetup.pxx2.registerPopupEditMode = s_editMode; + } + + menuVerticalPosition = ITEM_RADIO_REGISTER_RECEIVER + HEADER_LINE; + menuHorizontalPosition = 1; + menuVerticalOffset = backupVerticalOffset; + s_editMode = (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_REGISTER ? EDIT_MODIFY_FIELD : 0); +} + void menuRadioHardware(event_t event) { MENU(STR_HARDWARE, menuTabGeneral, MENU_RADIO_HARDWARE, HEADER_LINE+ITEM_RADIO_HARDWARE_MAX, { @@ -302,6 +358,26 @@ void menuRadioHardware(event_t event) case ITEM_RADIO_OWNER_ID: editSingleName(HW_SETTINGS_COLUMN2, y, STR_OWNER_ID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, attr); break; + + case ITEM_RADIO_REGISTER_RECEIVER: + lcdDrawTextAlignedLeft(y, NO_INDENT(STR_RECEIVER)); + lcdDrawText(HW_SETTINGS_COLUMN2, y, "[Register]", attr ); + if (attr) { + if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL && s_editMode > 0) { + + reusableBuffer.hardwareSetup.pxx2.registerPopupVerticalPosition = 0; + reusableBuffer.hardwareSetup.pxx2.registerPopupHorizontalPosition = 0; + reusableBuffer.hardwareSetup.pxx2.registerPopupEditMode = 0; + s_editMode = 0; + POPUP_INPUT("", runPopupHWSetupRegister); + + } + if (s_editMode == 0) { + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + } + } + break; + } } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 21bfc9c3b..20d8f6106 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1134,7 +1134,7 @@ union ReusableBuffer uint8_t bindSelectedReceiverIndex; } pxx2; }; - } modelSetup; + } modelSetup, hardwareSetup; // 103 bytes struct { From 22f35c6d27a17b21c03f544410497f4f9ab16cc8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Feb 2019 18:51:40 +0100 Subject: [PATCH 176/446] BT fixes on X-LiteS --- radio/src/bluetooth.h | 6 ++-- radio/src/dataconstants.h | 4 +-- radio/src/gui/128x64/model_setup.cpp | 6 ++-- radio/src/gui/128x64/radio_hardware.cpp | 7 +++-- radio/src/gui/gui_common_arm.cpp | 14 +++++++-- radio/src/opentx.cpp | 4 --- radio/src/opentx.h | 14 ++++----- .../common/arm/stm32/bluetooth_driver.cpp | 30 +++++++------------ .../targets/common/arm/stm32/usb_driver.cpp | 2 +- radio/src/targets/taranis/board.cpp | 8 ++--- radio/src/targets/taranis/hal.h | 6 ++-- 11 files changed, 49 insertions(+), 52 deletions(-) diff --git a/radio/src/bluetooth.h b/radio/src/bluetooth.h index f0201e431..7eedc9a68 100644 --- a/radio/src/bluetooth.h +++ b/radio/src/bluetooth.h @@ -45,10 +45,10 @@ enum BluetoothStates { #define LEN_BLUETOOTH_ADDR 16 #if (defined(PCBX7) || defined(PCBXLITE)) && !defined(SIMU) -extern uint8_t btChipPresent; -#define IS_BLUETOOTH_CHIP_PRESENT() (btChipPresent) + extern volatile uint8_t btChipPresent; + #define IS_BLUETOOTH_CHIP_PRESENT() (btChipPresent) #else -#define IS_BLUETOOTH_CHIP_PRESENT() (true) + #define IS_BLUETOOTH_CHIP_PRESENT() (true) #endif extern volatile uint8_t bluetoothState; diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 0195a8394..5eb277c9a 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -205,9 +205,7 @@ enum BeeperMode { }; #endif -#if defined(PCBXLITES) - #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE -#elif defined(BLUETOOTH) +#if defined(BLUETOOTH) #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH #elif defined(PCBX7) || defined(PCBXLITE) #define TRAINER_MODE_MAX() TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 90fd60553..94afe04d2 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -122,9 +122,9 @@ enum MenuModelSetupItems { #if defined(PCBX7) ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, -#if defined(BLUETOOTH) - ITEM_MODEL_TRAINER_BLUETOOTH, -#endif + #if defined(BLUETOOTH) + ITEM_MODEL_TRAINER_BLUETOOTH, + #endif ITEM_MODEL_TRAINER_CHANNELS, ITEM_MODEL_TRAINER_PARAMS, #elif defined(PCBXLITE) diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 3785ac758..4b0ad5da7 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -136,12 +136,13 @@ enum MenuRadioHardwareItems { #endif #if defined(PCBTARANIS) -#define BLUETOOTH_ROWS uint8_t(IS_BLUETOOTH_CHIP_PRESENT() ? 0 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY ? -1 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), + #define BLUETOOTH_ROWS uint8_t(IS_BLUETOOTH_CHIP_PRESENT() ? 0 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY ? -1 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), #elif defined(BLUETOOTH) -#define BLUETOOTH_ROWS 0, uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), + #define BLUETOOTH_ROWS 0, uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), #else -#define BLUETOOTH_ROWS + #define BLUETOOTH_ROWS #endif + #if defined(PCBXLITES) #define SWITCH_TYPE_MAX(sw) (sw >= MIXSRC_SE-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS) #elif defined(PCBXLITE) diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index f08aa02c5..d34fb59c8 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -655,13 +655,23 @@ bool isTrainerModeAvailable(int mode) else return true; } +#elif defined(PCBXLITES) +bool isTrainerModeAvailable(int mode) +{ + if (mode == TRAINER_MODE_MASTER_TRAINER_JACK || mode == TRAINER_MODE_SLAVE) + return true; + else if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH)) + return true; + else + return false; +} #elif defined(PCBXLITE) bool isTrainerModeAvailable(int mode) { if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH)) - return true; + return true; else - return false; + return false; } #endif diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 477c0650e..9850f7f39 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1933,10 +1933,6 @@ int main() boardInit(); -#if defined(PCBX7) - bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE); //BT is turn on for a brief period to differentiate X7 and X7S -#endif - #if defined(PCBHORUS) loadFonts(); #endif diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 20d8f6106..349fa1d6a 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -190,13 +190,13 @@ #define IS_FAI_FORBIDDEN(idx) (IS_FAI_ENABLED() && isFaiForbidden(idx)) #if defined(BLUETOOTH) -#if defined(X9E) && !defined(USEHORUSBT) - #define IS_BLUETOOTH_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) - #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) -#else - #define IS_BLUETOOTH_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH || g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) - #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE || g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) -#endif + #if defined(X9E) && !defined(USEHORUSBT) + #define IS_BLUETOOTH_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) + #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) + #else + #define IS_BLUETOOTH_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH || g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) + #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE || g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) + #endif #else #define IS_BLUETOOTH_TRAINER() false #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) diff --git a/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp b/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp index 985b7b6f0..42973e7d4 100644 --- a/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp +++ b/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp @@ -24,7 +24,7 @@ Fifo btTxFifo; Fifo btRxFifo; #if defined(PCBX7) || defined(PCBXLITE) -uint8_t btChipPresent = 0; +volatile uint8_t btChipPresent = 0; #endif enum BluetoothWriteState @@ -40,15 +40,11 @@ volatile uint8_t bluetoothWriteState = BLUETOOTH_WRITE_IDLE; void bluetoothInit(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStructure; - USART_InitTypeDef USART_InitStructure; - - USART_DeInit(BT_USART); - GPIO_InitStructure.GPIO_Pin = BT_EN_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(BT_EN_GPIO, &GPIO_InitStructure); #if defined(BT_BRTS_GPIO_PIN) @@ -63,32 +59,28 @@ void bluetoothInit(uint32_t baudrate) GPIO_Init(BT_BCTS_GPIO, &GPIO_InitStructure); #endif - GPIO_InitStructure.GPIO_Pin = BT_TX_GPIO_PIN|BT_RX_GPIO_PIN; + GPIO_PinAFConfig(BT_GPIO_TXRX, BT_TX_GPIO_PinSource, BT_GPIO_AF); + GPIO_PinAFConfig(BT_GPIO_TXRX, BT_RX_GPIO_PinSource, BT_GPIO_AF); + + GPIO_InitStructure.GPIO_Pin = BT_TX_GPIO_PIN | BT_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(BT_GPIO_TXRX, &GPIO_InitStructure); - GPIO_PinAFConfig(BT_GPIO_TXRX, BT_TX_GPIO_PinSource, BT_GPIO_AF); - GPIO_PinAFConfig(BT_GPIO_TXRX, BT_RX_GPIO_PinSource, BT_GPIO_AF); - USART_DeInit(BT_USART); + USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = baudrate; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(BT_USART, &USART_InitStructure); - USART_Cmd(BT_USART, ENABLE); - USART_ITConfig(BT_USART, USART_IT_RXNE, ENABLE); - NVIC_InitTypeDef NVIC_InitStructure; - NVIC_InitStructure.NVIC_IRQChannel = BT_USART_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); + USART_ITConfig(BT_USART, USART_IT_RXNE, ENABLE); + NVIC_SetPriority(BT_USART_IRQn, 6); + NVIC_EnableIRQ(BT_USART_IRQn); btRxFifo.clear(); btTxFifo.clear(); diff --git a/radio/src/targets/common/arm/stm32/usb_driver.cpp b/radio/src/targets/common/arm/stm32/usb_driver.cpp index 7b4aaf530..e47774623 100644 --- a/radio/src/targets/common/arm/stm32/usb_driver.cpp +++ b/radio/src/targets/common/arm/stm32/usb_driver.cpp @@ -44,7 +44,7 @@ int getSelectedUsbMode() void setSelectedUsbMode(int mode) { - selectedUsbMode = usbMode (mode); + selectedUsbMode = usbMode(mode); } int usbPlugged() diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 7b029daf8..26c963ec9 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -165,6 +165,10 @@ void boardInit() EXTMODULE_RCC_APB2Periph | HEARTBEAT_RCC_APB2Periph | BT_RCC_APB2Periph, ENABLE); +#if defined(BLUETOOTH) + bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE); +#endif + #if !defined(PCBX9E) // some X9E boards need that the pwrInit() is moved a little bit later pwrInit(); @@ -204,10 +208,6 @@ void boardInit() hapticInit(); #endif -#if defined(BLUETOOTH) - bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE); -#endif - #if defined(DEBUG) DBGMCU_APB1PeriphConfig(DBGMCU_IWDG_STOP|DBGMCU_TIM1_STOP|DBGMCU_TIM2_STOP|DBGMCU_TIM3_STOP|DBGMCU_TIM6_STOP|DBGMCU_TIM8_STOP|DBGMCU_TIM10_STOP|DBGMCU_TIM13_STOP|DBGMCU_TIM14_STOP, ENABLE); #endif diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index d203c168f..58596e6f2 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1178,7 +1178,7 @@ #define BT_RX_GPIO_PinSource GPIO_PinSource9 #define BT_USART_IRQHandler USART6_IRQHandler #elif defined(PCBX7) || defined(PCBXLITE) - #define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_DMA1) + #define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOE) // RCC_AHB1Periph_DMA1 #define BT_RCC_APB1Periph RCC_APB1Periph_USART3 #define BT_RCC_APB2Periph 0 #define BT_EN_GPIO GPIOE @@ -1196,8 +1196,8 @@ #define BT_USART USART3 #define BT_USART_IRQHandler USART3_IRQHandler #define BT_USART_IRQn USART3_IRQn - #define BT_DMA_Stream_RX DMA1_Stream1 - #define BT_DMA_Channel_RX DMA_Channel_4 + // #define BT_DMA_Stream_RX DMA1_Stream1 + // #define BT_DMA_Channel_RX DMA_Channel_4 #else #define BT_RCC_AHB1Periph 0 #define BT_RCC_APB1Periph 0 From a74d4c6051c0e3d259b2edeac879dee176bc13de Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Feb 2019 10:49:37 +0100 Subject: [PATCH 177/446] Bluetooth UI fixes --- radio/src/gui/128x64/model_setup.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 94afe04d2..9bef72e67 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -132,6 +132,7 @@ enum MenuModelSetupItems { ITEM_MODEL_TRAINER_MODE, ITEM_MODEL_TRAINER_BLUETOOTH, ITEM_MODEL_TRAINER_CHANNELS, + ITEM_MODEL_TRAINER_PARAMS, #endif ITEM_MODEL_SETUP_MAX }; @@ -218,10 +219,13 @@ enum MenuModelSetupItems { #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW #elif defined(PCBXLITES) #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), - #define TRAINER_BLUETOOTH_ROW + #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) + #define TRAINER_BLUETOOTH_M_ROW ((bluetoothDistantAddr[0] == '\0' || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) + #define TRAINER_BLUETOOTH_S_ROW (bluetoothDistantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) + #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) - #define TRAINER_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? (uint8_t)2 : (uint8_t)-1) - #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW + #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW #elif defined(PCBXLITE) #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) @@ -1041,7 +1045,6 @@ void menuModelSetup(event_t event) } } break; - #endif #if defined(PCBTARANIS) From 77b754fb265e48e96c3c5c4b0c4c0a186c3612d7 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 18 Feb 2019 11:47:01 +0100 Subject: [PATCH 178/446] reg 2.0 --- radio/src/gui/128x64/model_setup.cpp | 10 ++++++---- radio/src/pulses/pxx2.cpp | 4 ++-- radio/src/pulses/pxx2.h | 3 ++- radio/src/telemetry/telemetry.cpp | 6 +++--- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 9bef72e67..38e042dd4 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -285,7 +285,7 @@ void runPopupRegister(event_t event) } else if (menuHorizontalPosition == 0) { // [Enter] pressed - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; + reusableBuffer.modelSetup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; } // no break @@ -1121,23 +1121,25 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER: + TRACE("Phase %d Mode : %d", reusableBuffer.modelSetup.pxx2.registerStep, moduleSettings[INTERNAL_MODULE].mode); lcdDrawTextAlignedLeft(y, INDENT "Module"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, (menuHorizontalPosition==0 ? attr : 0) ); lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition==1 ? attr : 0) ); if (attr) { if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL && s_editMode > 0) { - if (menuHorizontalPosition == 1) { + if (menuHorizontalPosition == 1 && reusableBuffer.modelSetup.pxx2.registerStep < REGISTER_RX_NAME_SELECTED) { + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition = 0; reusableBuffer.modelSetup.pxx2.registerPopupHorizontalPosition = 0; reusableBuffer.modelSetup.pxx2.registerPopupEditMode = 0; s_editMode = 0; POPUP_INPUT("", runPopupRegister); } - else { + else if (menuHorizontalPosition == 0 && s_editMode > 0) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; } } - if (s_editMode == 0) { + if (s_editMode == 0 && warningText == 0) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; } } diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index f8950455a..1495d8f65 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -58,10 +58,10 @@ bool Pxx2Pulses::setupRegisterFrame(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); - if (reusableBuffer.modelSetup.pxx2.registerStep == REGISTER_COUNTER_ID_RECEIVED) { + if (reusableBuffer.modelSetup.pxx2.registerStep == REGISTER_RX_NAME_SELECTED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i Date: Mon, 18 Feb 2019 12:38:42 +0100 Subject: [PATCH 179/446] Fix for register popup --- radio/src/gui/128x64/model_setup.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 9bef72e67..8081ded3d 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -273,10 +273,12 @@ void onBindMenu(const char * result) void runPopupRegister(event_t event) { + uint8_t backupVerticalOffset = menuVerticalOffset; + int8_t backupEditMode = s_editMode; + menuVerticalPosition = reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition; menuHorizontalPosition = reusableBuffer.modelSetup.pxx2.registerPopupHorizontalPosition; s_editMode = reusableBuffer.modelSetup.pxx2.registerPopupEditMode; - uint8_t backupVerticalOffset = menuVerticalOffset; switch (event) { case EVT_KEY_BREAK(KEY_ENTER): @@ -323,7 +325,7 @@ void runPopupRegister(event_t event) menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER + HEADER_LINE; menuHorizontalPosition = 1; menuVerticalOffset = backupVerticalOffset; - s_editMode = (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_REGISTER ? EDIT_MODIFY_FIELD : 0); + s_editMode = backupEditMode; } inline bool isDefaultModelRegistrationID() From 645a50474c2a0ebe2733d7196a83808bd5be83ab Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 18 Feb 2019 12:50:25 +0100 Subject: [PATCH 180/446] cosmetics --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 38e042dd4..c991f9c61 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1135,11 +1135,11 @@ void menuModelSetup(event_t event) s_editMode = 0; POPUP_INPUT("", runPopupRegister); } - else if (menuHorizontalPosition == 0 && s_editMode > 0) { + else if (menuHorizontalPosition == 0) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; } } - if (s_editMode == 0 && warningText == 0) { + if (s_editMode == 0 && !warningText) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; } } From 1bcc4e4eaed7667ed193ae9ac2ef7f3ce73c5fa3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Feb 2019 12:54:03 +0100 Subject: [PATCH 181/446] Register fix --- radio/src/gui/128x64/model_setup.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index a97f8d19e..a7ede7cc3 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -288,6 +288,7 @@ void runPopupRegister(event_t event) else if (menuHorizontalPosition == 0) { // [Enter] pressed reusableBuffer.modelSetup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; + backupEditMode = EDIT_MODIFY_FIELD; } // no break From 42ed187746ae0159a8b8c7cb8afb02b73d89d642 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Feb 2019 12:54:41 +0100 Subject: [PATCH 182/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index a7ede7cc3..09a968e29 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -288,7 +288,7 @@ void runPopupRegister(event_t event) else if (menuHorizontalPosition == 0) { // [Enter] pressed reusableBuffer.modelSetup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; - backupEditMode = EDIT_MODIFY_FIELD; + backupEditMode = EDIT_MODIFY_FIELD; // so that the [Register] button blinks and the REGISTER process can continue } // no break From 1c69b48afb22674c2bfbfdd23c33801d20e65d0a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Feb 2019 13:05:50 +0100 Subject: [PATCH 183/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 09a968e29..a63c53f90 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1124,13 +1124,12 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER: - TRACE("Phase %d Mode : %d", reusableBuffer.modelSetup.pxx2.registerStep, moduleSettings[INTERNAL_MODULE].mode); lcdDrawTextAlignedLeft(y, INDENT "Module"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, (menuHorizontalPosition==0 ? attr : 0) ); lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition==1 ? attr : 0) ); if (attr) { if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL && s_editMode > 0) { - if (menuHorizontalPosition == 1 && reusableBuffer.modelSetup.pxx2.registerStep < REGISTER_RX_NAME_SELECTED) { + if (menuHorizontalPosition == 1) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition = 0; reusableBuffer.modelSetup.pxx2.registerPopupHorizontalPosition = 0; @@ -1145,6 +1144,10 @@ void menuModelSetup(event_t event) if (s_editMode == 0 && !warningText) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; } + if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL) { + // REGISTER finished + s_editMode = 0; + } } break; From fe5a270720fe97f402d58d0f11d44dedd75ee3dd Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 18 Feb 2019 13:16:34 +0100 Subject: [PATCH 184/446] Revert "Cosmetics" This reverts commit 1c69b48a --- radio/src/gui/128x64/model_setup.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index a63c53f90..09a968e29 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1124,12 +1124,13 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER: + TRACE("Phase %d Mode : %d", reusableBuffer.modelSetup.pxx2.registerStep, moduleSettings[INTERNAL_MODULE].mode); lcdDrawTextAlignedLeft(y, INDENT "Module"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, (menuHorizontalPosition==0 ? attr : 0) ); lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition==1 ? attr : 0) ); if (attr) { if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL && s_editMode > 0) { - if (menuHorizontalPosition == 1) { + if (menuHorizontalPosition == 1 && reusableBuffer.modelSetup.pxx2.registerStep < REGISTER_RX_NAME_SELECTED) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition = 0; reusableBuffer.modelSetup.pxx2.registerPopupHorizontalPosition = 0; @@ -1144,10 +1145,6 @@ void menuModelSetup(event_t event) if (s_editMode == 0 && !warningText) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; } - if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL) { - // REGISTER finished - s_editMode = 0; - } } break; From 8b945a82b3437bd08056df46330b1157ac8c7ce1 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 18 Feb 2019 13:20:50 +0100 Subject: [PATCH 185/446] Fix blink when successful registration --- radio/src/telemetry/telemetry.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index ee7dbb827..11e67ce96 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -88,6 +88,7 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) memcmp(&frame[12], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { reusableBuffer.modelSetup.pxx2.registerStep = REGISTER_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; + s_editMode = 0; POPUP_INFORMATION(STR_REG_OK); } } From 74dcb2586ebc45d4d47c3f4855c456fe5a1c2550 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Feb 2019 13:56:34 +0100 Subject: [PATCH 186/446] One more try --- radio/src/gui/128x64/model_setup.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 09a968e29..6906993bf 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1124,7 +1124,6 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER: - TRACE("Phase %d Mode : %d", reusableBuffer.modelSetup.pxx2.registerStep, moduleSettings[INTERNAL_MODULE].mode); lcdDrawTextAlignedLeft(y, INDENT "Module"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, (menuHorizontalPosition==0 ? attr : 0) ); lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition==1 ? attr : 0) ); @@ -1145,6 +1144,10 @@ void menuModelSetup(event_t event) if (s_editMode == 0 && !warningText) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; } + if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL) { + // REGISTER finished + s_editMode = 0; + } } break; From 23fe09aceb1693cb52dcc4e1be6fd9c6fb53d4e1 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Feb 2019 13:57:57 +0100 Subject: [PATCH 187/446] Last try end --- radio/src/telemetry/telemetry.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 11e67ce96..ee7dbb827 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -88,7 +88,6 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) memcmp(&frame[12], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { reusableBuffer.modelSetup.pxx2.registerStep = REGISTER_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; - s_editMode = 0; POPUP_INFORMATION(STR_REG_OK); } } From bc5c3587d86ba3e8cade732c4af265f1beea5292 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 18 Feb 2019 14:00:51 +0100 Subject: [PATCH 188/446] Some cleanups --- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/opentx.h | 3 +-- radio/src/pulses/pxx2.cpp | 2 +- radio/src/telemetry/telemetry.cpp | 10 +++++----- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 6906993bf..88aba0206 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1235,7 +1235,7 @@ void menuModelSetup(event_t event) s_editMode = 0; } if (reusableBuffer.modelSetup.pxx2.bindStep == BIND_OK) { - memcpy(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].rxName, reusableBuffer.modelSetup.pxx2.bindCandidateReceiversIds[reusableBuffer.modelSetup.pxx2.bindSelectedReceiverIndex], PXX2_LEN_RX_NAME); + memcpy(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].rxName, reusableBuffer.modelSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.modelSetup.pxx2.bindSelectedReceiverIndex], PXX2_LEN_RX_NAME); } } else if (menuHorizontalPosition == 1 && s_editMode > 0) { diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 349fa1d6a..47336de39 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1128,8 +1128,7 @@ union ReusableBuffer uint8_t registerPopupHorizontalPosition; int8_t registerPopupEditMode; char registerRxName[PXX2_LEN_RX_NAME]; - char bindCandidateReceiversIds[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; - char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][3*PXX2_LEN_RX_NAME+1]; + char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; uint8_t bindCandidateReceiversCount; uint8_t bindSelectedReceiverIndex; } pxx2; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 1495d8f65..afe9f12b8 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -90,7 +90,7 @@ bool Pxx2Pulses::setupBindFrame(uint8_t module) else if (reusableBuffer.modelSetup.pxx2.bindStep == BIND_RX_NAME_SELECTED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i> 4); @@ -118,13 +118,13 @@ void processBindFrame(uint8_t module, uint8_t * frame) *c++ = (quartet >= 10 ? quartet + 'A' - 10 : quartet + '0'); *c++ = ' '; } - *c = '\0'; + *c = '\0';*/ ++reusableBuffer.modelSetup.pxx2.bindCandidateReceiversCount; reusableBuffer.modelSetup.pxx2.bindStep = BIND_RX_NAME_RECEIVED; } } else if (frame[3] == 0x01) { - if (memcmp(reusableBuffer.modelSetup.pxx2.bindCandidateReceiversIds[reusableBuffer.modelSetup.pxx2.bindSelectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) { + if (memcmp(reusableBuffer.modelSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.modelSetup.pxx2.bindSelectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) { reusableBuffer.modelSetup.pxx2.bindStep = BIND_WAIT; reusableBuffer.modelSetup.pxx2.bindWaitTimeout = get_tmr10ms() + 30; } From 8ec797730e530312916fb4ae90875d8f1136692f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Feb 2019 15:20:28 +0100 Subject: [PATCH 189/446] FrSky X3 board support added --- radio/src/CMakeLists.txt | 6 +- radio/src/bluetooth.cpp | 76 ++++++++++-- radio/src/bluetooth.h | 7 -- radio/src/datastructs.h | 2 + radio/src/gui/128x64/model_select.cpp | 6 +- radio/src/gui/128x64/model_setup.cpp | 8 +- radio/src/gui/128x64/model_telemetry.cpp | 2 +- radio/src/gui/128x64/radio_hardware.cpp | 18 ++- radio/src/gui/128x64/view_main.cpp | 2 +- radio/src/gui/gui_common_arm.cpp | 2 +- radio/src/logs.cpp | 10 +- radio/src/sdcard.h | 3 + radio/src/switches.cpp | 8 +- .../targets/common/arm/stm32/adc_driver.cpp | 5 + radio/src/targets/horus/hal.h | 2 - radio/src/targets/simu/simpgmspace.cpp | 6 +- radio/src/targets/taranis/CMakeLists.txt | 26 +++- radio/src/targets/taranis/board.h | 12 +- radio/src/targets/taranis/hal.h | 116 ++++++++++++++++-- radio/src/targets/taranis/keys_driver.cpp | 8 +- radio/src/targets/taranis/trainer_driver.cpp | 2 +- radio/src/telemetry/crossfire.h | 3 + 22 files changed, 270 insertions(+), 60 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index d25d8f985..a0f5907f0 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -1,7 +1,7 @@ include(CMakeForceCompiler) include(Bitmaps) -set(PCB_TYPES X7 XLITE XLITES X9D X9D+ X9E X10 X12S SKY9X 9XRPRO AR9X) +set(PCB_TYPES X3 X7 XLITE XLITES X9D X9D+ X9E X10 X12S SKY9X 9XRPRO AR9X) set(GUI_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL) set(TTS_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL RU) @@ -80,7 +80,7 @@ set(FATFS_SRC if(PCB STREQUAL X12S OR PCB STREQUAL X10) include(targets/horus/CMakeLists.txt) -elseif(PCB STREQUAL X9E OR PCB STREQUAL X9D+ OR PCB STREQUAL X9D OR PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) +elseif(PCB STREQUAL X9E OR PCB STREQUAL X9D+ OR PCB STREQUAL X9D OR PCB STREQUAL X7 OR PCB STREQUAL X3 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) include(targets/taranis/CMakeLists.txt) elseif(PCB STREQUAL SKY9X OR PCB STREQUAL 9XRPRO OR PCB STREQUAL AR9X) include(targets/sky9x/CMakeLists.txt) @@ -131,7 +131,7 @@ else() add_definitions(-DEEPROM -DEEPROM_RAW) endif() -if(ARCH STREQUAL ARM AND NOT PCB STREQUAL X12S AND NOT PCB STREQUAL X10 AND NOT PCB STREQUAL XLITE AND NOT PCB STREQUAL XLITES) +if(ARCH STREQUAL ARM AND NOT PCB STREQUAL X12S AND NOT PCB STREQUAL X10 AND NOT PCB STREQUAL XLITE AND NOT PCB STREQUAL XLITES AND NOT PCB STREQUAL X3) add_definitions(-DEEPROM_CONVERSIONS) set(SRC ${SRC} storage/eeprom_conversions.cpp) endif() diff --git a/radio/src/bluetooth.cpp b/radio/src/bluetooth.cpp index fa13552ad..0be1249d4 100644 --- a/radio/src/bluetooth.cpp +++ b/radio/src/bluetooth.cpp @@ -71,32 +71,50 @@ char * bluetoothReadline(bool error_reset) if (!btRxFifo.pop(byte)) { #if defined(PCBX9E) && !defined(USEHORUSBT) // X9E BT module can get unresponsive TRACE("NO RESPONSE FROM BT MODULE"); +#endif + return nullptr; + } + + TRACE_NOCRLF("%02X ", byte); + +#if 0 + if (error_reset && byte == 'R' && bluetoothBufferIndex == 4 && memcmp(bluetoothBuffer, "ERRO", 4)) { +#if defined(PCBX9E) // X9E enter BT reset loop if following code is implemented + TRACE("BT Error..."); +#else + TRACE("BT Reset..."); + bluetoothBufferIndex = 0; + bluetoothDone(); + bluetoothState = BLUETOOTH_STATE_OFF; + bluetoothWakeupTime = get_tmr10ms() + 100; /* 1s */ #endif return NULL; } - TRACE_NOCRLF("%02X ", byte); + else +#endif + if (byte == '\n') { if (bluetoothBufferIndex > 2 && bluetoothBuffer[bluetoothBufferIndex-1] == '\r') { bluetoothBuffer[bluetoothBufferIndex-1] = '\0'; bluetoothBufferIndex = 0; TRACE("BT< %s", bluetoothBuffer); if (error_reset && !strcmp((char *)bluetoothBuffer, "ERROR")) { -#if defined(PCBX9E) // X9E enter BT reset loop if following code is implemented - TRACE("BT error..."); +#if defined(PCBX9E) // X9E enter BT reset loop if following code is implemented + TRACE("BT Error..."); #else TRACE("BT Reset..."); bluetoothDone(); bluetoothState = BLUETOOTH_STATE_OFF; bluetoothWakeupTime = get_tmr10ms() + 100; /* 1s */ #endif - return NULL; + return nullptr; } else { - if (!strncmp((char *)bluetoothBuffer, "Central:", 8)) - strcpy(bluetoothLocalAddr, (char *)bluetoothBuffer+8); - else if (!strncmp((char *)bluetoothBuffer, "Peripheral:", 11)) - strcpy(bluetoothLocalAddr, (char *)bluetoothBuffer+11); - return (char *)bluetoothBuffer; + if (!memcmp(bluetoothBuffer, "Central:", 8)) + strcpy(bluetoothLocalAddr, (char *) bluetoothBuffer + 8); + else if (!memcmp(bluetoothBuffer, "Peripheral:", 11)) + strcpy(bluetoothLocalAddr, (char *) bluetoothBuffer + 11); + return (char *) bluetoothBuffer; } } else { @@ -328,44 +346,67 @@ void bluetoothWakeup() if (now < bluetoothWakeupTime) return; + if (!usbPlugged()) { + bluetoothWakeupTime += 1000; // 10s + return; + } + bluetoothWakeupTime = now + 5; /* 50ms default */ + static uint8_t oldbluetooth = 255; + + if (oldbluetooth != bluetoothState) { + TRACE("State %d", bluetoothState); + oldbluetooth = bluetoothState; + } + if (g_eeGeneral.bluetoothMode == BLUETOOTH_OFF || (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && !IS_BLUETOOTH_TRAINER())) { + //TRACE_NOCRLF("A"); if (bluetoothState != BLUETOOTH_STATE_OFF) { + //TRACE_NOCRLF("Z"); bluetoothDone(); bluetoothState = BLUETOOTH_STATE_OFF; } bluetoothWakeupTime = now + 10; /* 100ms */ } else if (bluetoothState == BLUETOOTH_STATE_OFF) { + //TRACE_NOCRLF("B"); bluetoothInit(BLUETOOTH_FACTORY_BAUDRATE); bluetoothState = BLUETOOTH_STATE_FACTORY_BAUDRATE_INIT; } if (bluetoothState != BLUETOOTH_STATE_OFF) { + //TRACE_NOCRLF("C"); bluetoothWriteWakeup(); if (bluetoothIsWriting()) { + //TRACE_NOCRLF("D"); return; } } if (bluetoothState == BLUETOOTH_STATE_FACTORY_BAUDRATE_INIT) { + //TRACE_NOCRLF("F"); bluetoothWriteString("AT+BAUD4\r\n"); bluetoothState = BLUETOOTH_STATE_BAUDRATE_SENT; bluetoothWakeupTime = now + 10; /* 100ms */ } else if (bluetoothState == BLUETOOTH_STATE_BAUDRATE_SENT) { + //TRACE_NOCRLF("G"); bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE); bluetoothState = BLUETOOTH_STATE_BAUDRATE_INIT; bluetoothReadline(false); bluetoothWakeupTime = now + 10; /* 100ms */ } else if (bluetoothState == BLUETOOTH_STATE_CONNECTED) { + //TRACE_NOCRLF("H"); if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) { + //TRACE_NOCRLF("I"); bluetoothReceiveTrainer(); } else { + //TRACE_NOCRLF("J"); if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) { + TRACE_NOCRLF("S"); bluetoothSendTrainer(); bluetoothWakeupTime = now + 2; /* 20ms */ } @@ -373,8 +414,13 @@ void bluetoothWakeup() } } else { + //TRACE_NOCRLF("L"); char * line = bluetoothReadline(); + if (line) { + TRACE("BT %s", line); + } if (bluetoothState == BLUETOOTH_STATE_BAUDRATE_INIT) { + //TRACE_NOCRLF("M"); char command[32]; char * cur = strAppend(command, BLUETOOTH_COMMAND_NAME); uint8_t len = ZLEN(g_eeGeneral.bluetoothName); @@ -387,7 +433,7 @@ void bluetoothWakeup() #if defined(PCBHORUS) cur = strAppend(cur, "Horus"); #else - cur = strAppend(cur, "Taranis"); + cur = strAppend(cur, "taranis"); #endif } strAppend(cur, "\r\n"); @@ -395,10 +441,12 @@ void bluetoothWakeup() bluetoothState = BLUETOOTH_STATE_NAME_SENT; } else if (bluetoothState == BLUETOOTH_STATE_NAME_SENT && (!strncmp(line, "OK+", 3) || !strncmp(line, "Central:", 8) || !strncmp(line, "Peripheral:", 11))) { + //TRACE_NOCRLF("N"); bluetoothWriteString("AT+TXPW\r\n"); bluetoothState = BLUETOOTH_STATE_POWER_SENT; } else if (bluetoothState == BLUETOOTH_STATE_POWER_SENT && (!strncmp(line, "Central:", 8) || !strncmp(line, "Peripheral:", 11))) { + //TRACE_NOCRLF("O"); if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) bluetoothWriteString("AT+ROLE1\r\n"); else @@ -406,28 +454,35 @@ void bluetoothWakeup() bluetoothState = BLUETOOTH_STATE_ROLE_SENT; } else if (bluetoothState == BLUETOOTH_STATE_ROLE_SENT && (!strncmp(line, "Central:", 8) || !strncmp(line, "Peripheral:", 11))) { + //TRACE_NOCRLF("P"); bluetoothState = BLUETOOTH_STATE_IDLE; } else if (bluetoothState == BLUETOOTH_STATE_DISCOVER_REQUESTED) { + //TRACE_NOCRLF("Q"); bluetoothWriteString("AT+DISC?\r\n"); bluetoothState = BLUETOOTH_STATE_DISCOVER_SENT; } else if (bluetoothState == BLUETOOTH_STATE_DISCOVER_SENT && !strcmp(line, "OK+DISCS")) { + //TRACE_NOCRLF("R"); bluetoothState = BLUETOOTH_STATE_DISCOVER_START; } else if (bluetoothState == BLUETOOTH_STATE_DISCOVER_START && !strncmp(line, "OK+DISC:", 8)) { + //TRACE_NOCRLF("S"); strcpy(bluetoothDistantAddr, &line[8]); // TODO quick & dirty } else if (bluetoothState == BLUETOOTH_STATE_DISCOVER_START && !strcmp(line, "OK+DISCE")) { + //TRACE_NOCRLF("T"); bluetoothState = BLUETOOTH_STATE_DISCOVER_END; } else if (bluetoothState == BLUETOOTH_STATE_BIND_REQUESTED) { + //TRACE_NOCRLF("U"); char command[32]; strAppend(strAppend(strAppend(command, "AT+CON"), bluetoothDistantAddr), "\r\n"); bluetoothWriteString(command); bluetoothState = BLUETOOTH_STATE_CONNECT_SENT; } else if ((bluetoothState == BLUETOOTH_STATE_IDLE || bluetoothState == BLUETOOTH_STATE_DISCONNECTED || bluetoothState == BLUETOOTH_STATE_CONNECT_SENT) && !strncmp(line, "Connected:", 10)) { + //TRACE_NOCRLF("V"); strcpy(bluetoothDistantAddr, &line[10]); // TODO quick & dirty bluetoothState = BLUETOOTH_STATE_CONNECTED; if (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) { @@ -435,6 +490,7 @@ void bluetoothWakeup() } } else if (bluetoothState == BLUETOOTH_STATE_DISCONNECTED && !line) { + //TRACE_NOCRLF("W"); char command[32]; strAppend(strAppend(strAppend(command, "AT+CON"), bluetoothDistantAddr), "\r\n"); bluetoothWriteString(command); diff --git a/radio/src/bluetooth.h b/radio/src/bluetooth.h index 7eedc9a68..4be34b8e4 100644 --- a/radio/src/bluetooth.h +++ b/radio/src/bluetooth.h @@ -44,13 +44,6 @@ enum BluetoothStates { #define LEN_BLUETOOTH_ADDR 16 -#if (defined(PCBX7) || defined(PCBXLITE)) && !defined(SIMU) - extern volatile uint8_t btChipPresent; - #define IS_BLUETOOTH_CHIP_PRESENT() (btChipPresent) -#else - #define IS_BLUETOOTH_CHIP_PRESENT() (true) -#endif - extern volatile uint8_t bluetoothState; extern char bluetoothLocalAddr[LEN_BLUETOOTH_ADDR+1]; extern char bluetoothDistantAddr[LEN_BLUETOOTH_ADDR+1]; diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index f543eb64a..e87e312ab 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -850,6 +850,8 @@ static inline void check_struct() CHKSIZE(FrSkyTelemetryData, 104); CHKSIZE(ModelHeader, 12); CHKSIZE(CurveData, 4); +#elif defined(PCBX3) + // TODO #elif defined(PCBTARANIS) CHKSIZE(MixData, 22); CHKSIZE(ExpoData, 19); diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index dd097197b..61953626c 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -231,7 +231,7 @@ void menuModelSelect(event_t event) } break; -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) case EVT_KEY_LONG(KEY_PAGE): chainMenu(menuTabModel[DIM(menuTabModel)-1]); killEvents(event); @@ -263,7 +263,7 @@ void menuModelSelect(event_t event) #endif #endif -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) case EVT_ROTARY_LEFT: case EVT_ROTARY_RIGHT: #endif @@ -304,7 +304,7 @@ void menuModelSelect(event_t event) lcdDrawNumber(17*FW, 0, reusableBuffer.modelsel.eepromfree, RIGHT); #endif -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) drawScreenIndex(MENU_MODEL_SELECT, DIM(menuTabModel), 0); #elif defined(ROTARY_ENCODER_NAVIGATION) drawScreenIndex(MENU_MODEL_SELECT, DIM(menuTabModel), (sub == g_eeGeneral.currModel) ? ((IS_ROTARY_ENCODER_NAVIGATION_ENABLE() && s_editMode < 0) ? INVERS|BLINK : INVERS) : 0); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 88aba0206..d59087a81 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -119,7 +119,7 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTRA_MODULE_CHANNELS, ITEM_MODEL_EXTRA_MODULE_BIND, #endif -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) ITEM_MODEL_TRAINER_LABEL, ITEM_MODEL_TRAINER_MODE, #if defined(BLUETOOTH) @@ -205,7 +205,7 @@ enum MenuModelSetupItems { #define EXTRA_MODULE_ROWS #endif -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) #define ANTENNA_ROW #if defined(BLUETOOTH) #define TRAINER_BLUETOOTH_M_ROW ((bluetoothDistantAddr[0] == '\0' || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) @@ -1083,7 +1083,7 @@ void menuModelSetup(event_t event) break; } -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) case ITEM_MODEL_TRAINER_PARAMS: lcdDrawTextAlignedLeft(y, STR_PPMFRAME); lcdDrawText(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS); @@ -1781,7 +1781,7 @@ void menuModelFailsafe(event_t event) } // Gauge -#if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines +#if !defined(PCBX7) && !defined(PCBX3) // X7 LCD doesn't like too many horizontal lines lcdDrawRect(x+LCD_W-3-wbar, y, wbar+1, 6); #endif const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar/2 + lim/2) / lim, wbar/2); diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index ddedf5614..0d68a907d 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -423,7 +423,7 @@ void menuModelTelemetryFrsky(event_t event) switch (event) { case EVT_KEY_BREAK(KEY_DOWN): case EVT_KEY_BREAK(KEY_UP): -#if !defined(PCBX7) +#if !defined(PCBX7) && !defined(PCBX3) case EVT_KEY_BREAK(KEY_LEFT): case EVT_KEY_BREAK(KEY_RIGHT): #endif diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 4b0ad5da7..913cb6d1c 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -113,7 +113,9 @@ enum MenuRadioHardwareItems { ITEM_RADIO_HARDWARE_SF, ITEM_RADIO_HARDWARE_SH, #endif +#if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE, +#endif #if defined(BLUETOOTH) ITEM_RADIO_HARDWARE_BLUETOOTH_MODE, ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE, @@ -138,17 +140,19 @@ enum MenuRadioHardwareItems { #if defined(PCBTARANIS) #define BLUETOOTH_ROWS uint8_t(IS_BLUETOOTH_CHIP_PRESENT() ? 0 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY ? -1 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), #elif defined(BLUETOOTH) - #define BLUETOOTH_ROWS 0, uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), + #define BLUETOOTH_ROWS 0, uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), #else #define BLUETOOTH_ROWS #endif -#if defined(PCBXLITES) -#define SWITCH_TYPE_MAX(sw) (sw >= MIXSRC_SE-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS) +#if defined(PCBX3) + #define SWITCH_TYPE_MAX(sw) (sw == MIXSRC_SD-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS) +#elif defined(PCBXLITES) + #define SWITCH_TYPE_MAX(sw) (sw >= MIXSRC_SE-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS) #elif defined(PCBXLITE) -#define SWITCH_TYPE_MAX(sw) (SWITCH_3POS) + #define SWITCH_TYPE_MAX(sw) (SWITCH_3POS) #else -#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH-MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) + #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH-MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) #endif #define HW_SETTINGS_COLUMN1 30 @@ -222,7 +226,9 @@ void menuRadioHardware(event_t event) POTS_ROWS, LABEL(Switches), SWITCHES_ROWS, +#if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 0 /*max bauds*/, +#endif BLUETOOTH_ROWS 0 /*jitter filter*/, 0 /*owner id*/ @@ -301,6 +307,7 @@ void menuRadioHardware(event_t event) break; } +#if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 case ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE: lcdDrawTextAlignedLeft(y, STR_MAXBAUDRATE); lcdDrawNumber(HW_SETTINGS_COLUMN2, y, CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate], attr|LEFT); @@ -318,6 +325,7 @@ void menuRadioHardware(event_t event) } } break; +#endif #if defined(BLUETOOTH) case ITEM_RADIO_HARDWARE_BLUETOOTH_MODE: diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index 6fbfb38a3..aa0577d20 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -227,7 +227,7 @@ void displayVoltageOrAlarm() #define displayVoltageOrAlarm() displayBattVoltage() #endif -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) #define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER) #define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE) #define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index d34fb59c8..5d5529822 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -641,7 +641,7 @@ bool isTrainerModeAvailable(int mode) else return true; } -#elif defined(PCBX7) || defined(PCBXLITES) +#elif defined(PCBX7) || defined(PCBXLITES) || defined(PCBX3) bool isTrainerModeAvailable(int mode) { if (IS_EXTERNAL_MODULE_ENABLED() && (mode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || mode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE)) diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index f5fcda516..4fc424475 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -270,7 +270,15 @@ void logsWrite() } // TODO: use hardware config to populate -#if defined(PCBXLITE) +#if defined(PCBX3) +f_printf(&g_oLogFile, "%d,%d,%d,%d,0x%08X%08X,", + GET_3POS_STATE(SA), + GET_3POS_STATE(SB), + GET_3POS_STATE(SC), + GET_3POS_STATE(SD), + getLogicalSwitchesStates(32), + getLogicalSwitchesStates(0)); +#elif defined(PCBXLITE) f_printf(&g_oLogFile, "%d,%d,%d,%d,0x%08X%08X,", GET_3POS_STATE(SA), GET_3POS_STATE(SB), diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index cebd3c2eb..e86063d8e 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -138,6 +138,9 @@ const char * getFileExtension(const char * filename, uint8_t size=0, uint8_t ext #elif defined(PCBX7) #define OTX_FOURCC 0x3678746F // otx for Taranis X7 #define O9X_FOURCC 0x3378396F // o9x for Taranis X7 +#elif defined(PCBX3) + #define OTX_FOURCC 0x3C78746F // otx for Taranis X3 + #define O9X_FOURCC 0x3C78396F // o9x for Taranis X3 #elif defined(PCBX9D) || defined(PCBX9DP) #define OTX_FOURCC 0x3378746F // otx for Taranis X9D #define O9X_FOURCC 0x3378396F // o9x for Taranis X9D diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index b453eccd8..854dbb5a9 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -135,22 +135,22 @@ void getSwitchesPosition(bool startup) CHECK_3POS(3, SW_SD); #if defined(PCBXLITES) CHECK_2POS(SW_SE); -#elif defined(PCBX7) || defined(PCBXLITE) +#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX3) // No SE #else CHECK_3POS(4, SW_SE); #endif -#if defined(PCBXLITE) && !defined(PCBXLITES) +#if defined(PCBXLITE) && !defined(PCBXLITES) || defined(PCBX3) // No SF #else CHECK_2POS(SW_SF); #endif -#if defined(PCBX7) || defined(PCBXLITE) +#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX3) // No SG #else CHECK_3POS(5, SW_SG); #endif -#if defined(PCBXLITE) +#if defined(PCBXLITE) || defined(PCBX3) // No SH #else CHECK_2POS(SW_SH); diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index a96cfe8e3..018c2e987 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -53,6 +53,9 @@ #define FIRST_ANALOG_ADC 0 #define NUM_ANALOGS_ADC 10 #define NUM_ANALOGS_ADC_EXT (NUM_ANALOGS - 10) +#elif defined(PCBX3) + #define FIRST_ANALOG_ADC 0 + #define NUM_ANALOGS_ADC NUM_ANALOGS #else #define FIRST_ANALOG_ADC 0 #define NUM_ANALOGS_ADC NUM_ANALOGS @@ -117,6 +120,8 @@ void adcInit() // TODO why do we invert POT1 and POT2 here? ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<25) + (ADC_CHANNEL_POT2<<20); // conversions 1 to 6 +#elif defined(PCBX3) + ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_BATT<<25); // conversions 1 to 6 #else ADC_MAIN->SQR2 = (ADC_CHANNEL_POT3<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10) + (ADC_CHANNEL_BATT<<15); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6 diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 7f31f507d..ea266b93e 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -249,8 +249,6 @@ #define PWR_SWITCH_GPIO_REG PWR_GPIO->IDR #define PWR_SWITCH_GPIO_PIN GPIO_Pin_0 // PJ.00 #define PWR_ON_GPIO_PIN GPIO_Pin_1 // PJ.01 -#define PWR_ON_GPIO_MODER GPIO_MODER_MODER1 -#define PWR_ON_GPIO_MODER_OUT GPIO_MODER_MODER1_0 // S.Port update connector #define SPORT_MAX_BAUDRATE 250000 // < 400000 diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index a4a982f3b..cf35464b1 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -267,7 +267,11 @@ void simuSetSwitch(uint8_t swtch, int8_t state) #endif #if defined(SWITCHES_GPIO_REG_C_L) SWITCH_3_CASE(2, SWITCHES_GPIO_REG_C_L, SWITCHES_GPIO_REG_C_H, SWITCHES_GPIO_PIN_C_L, SWITCHES_GPIO_PIN_C_H) + #endif + #if defined(SWITCHES_GPIO_REG_D_L) SWITCH_3_CASE(3, SWITCHES_GPIO_REG_D_L, SWITCHES_GPIO_REG_D_H, SWITCHES_GPIO_PIN_D_L, SWITCHES_GPIO_PIN_D_H) + #elif defined(SWITCHES_GPIO_REG_D) + SWITCH_CASE (3, SWITCHES_GPIO_REG_D, SWITCHES_GPIO_PIN_D) #endif #if defined(PCBX7) SWITCH_CASE (4, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) @@ -275,7 +279,7 @@ void simuSetSwitch(uint8_t swtch, int8_t state) #elif defined(PCBXLITES) SWITCH_CASE (4, SWITCHES_GPIO_REG_E, SWITCHES_GPIO_PIN_E) SWITCH_CASE (5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) - #elif !defined(PCBXLITE) + #elif !defined(PCBXLITE) && !defined(PCBX3) SWITCH_3_CASE(4, SWITCHES_GPIO_REG_E_L, SWITCHES_GPIO_REG_E_H, SWITCHES_GPIO_PIN_E_L, SWITCHES_GPIO_PIN_E_H) SWITCH_CASE (5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) SWITCH_3_CASE(6, SWITCHES_GPIO_REG_G_L, SWITCHES_GPIO_REG_G_H, SWITCHES_GPIO_PIN_G_L, SWITCHES_GPIO_PIN_G_H) diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index ddc6dffac..91b7be2ef 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -31,6 +31,7 @@ if(PCB STREQUAL X9E) set(FONTS_TARGET taranis_fonts) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) + set(STATUS_LEDS NO) elseif(PCB STREQUAL X9D+) set(CPU_TYPE STM32F2) set(CPU_TYPE_FULL STM32F205xE) # for size report @@ -47,6 +48,7 @@ elseif(PCB STREQUAL X9D+) set(LCD_DRIVER lcd_driver_spi.cpp) set(SERIAL2_DRIVER ../common/arm/stm32/serial2_driver.cpp) set(GVAR_SCREEN model_gvars.cpp) + set(STATUS_LEDS NO) elseif(PCB STREQUAL X9D) set(CPU_TYPE STM32F2) set(CPU_TYPE_FULL STM32F205xE) # for size report @@ -63,6 +65,7 @@ elseif(PCB STREQUAL X9D) set(LCD_DRIVER lcd_driver_aspi.cpp) set(SERIAL2_DRIVER ../common/arm/stm32/serial2_driver.cpp) set(GVAR_SCREEN model_gvars.cpp) + set(STATUS_LEDS NO) elseif(PCB STREQUAL X7) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(CPU_TYPE STM32F2) @@ -80,6 +83,25 @@ elseif(PCB STREQUAL X7) set(FONTS_TARGET 9x_fonts_1bit) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) + set(STATUS_LEDS YES) +elseif(PCB STREQUAL X3) + set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") + set(CPU_TYPE STM32F2) + set(CPU_TYPE_FULL STM32F205xE) # for size report + set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(HAPTIC YES) + set(LUA_EXPORT lua_export_x7) + set(FLAVOUR x3) + add_definitions(-DPCBX3 -DSOFTWARE_VOLUME) + add_definitions(-DEEPROM_VARIANT=0x4000) + add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) + set(GUI_DIR 128x64) + set(NAVIGATION_TYPE x7) + set(BITMAPS_TARGET 9x_bitmaps) + set(FONTS_TARGET 9x_fonts_1bit) + set(LCD_DRIVER lcd_driver_spi.cpp) + set(GVAR_SCREEN model_gvars.cpp) + set(STATUS_LEDS YES) elseif(PCB STREQUAL XLITE) set(PXX_FREQUENCY "HIGH" CACHE STRING "PXX frequency (LOW / HIGH)") set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") @@ -98,6 +120,7 @@ elseif(PCB STREQUAL XLITE) set(FONTS_TARGET 9x_fonts_1bit) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) + set(STATUS_LEDS YES) elseif(PCB STREQUAL XLITES) set(PXX_FREQUENCY "HIGH" CACHE STRING "PXX frequency (LOW / HIGH)") set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") @@ -117,6 +140,7 @@ elseif(PCB STREQUAL XLITES) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) set(RADIO_SPECTRUM YES) + set(STATUS_LEDS YES) endif() if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES) @@ -192,7 +216,7 @@ if(RADIO_SPECTRUM) ) endif() -if(PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) +if(STATUS_LEDS) set(LED_DRIVER led_driver.cpp) endif() diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index fbf306760..b35946aa8 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -363,6 +363,8 @@ enum EnumSwitchesPositions #define NUM_SWITCHES 4 #elif defined(PCBX7) #define NUM_SWITCHES 6 +#elif defined(PCBX3) + #define NUM_SWITCHES 4 #elif defined(PCBX9E) #define NUM_SWITCHES 18 // yes, it's a lot! #else @@ -376,7 +378,7 @@ uint32_t readTrims(void); #define TRIMS_PRESSED() (readTrims()) #define KEYS_PRESSED() (readKeys()) -#if defined(PCBX9E) || defined(PCBX7) +#if defined(PCBX9E) || defined(PCBX7) || defined(PCBX3) // Rotary Encoder driver #define ROTARY_ENCODER_NAVIGATION void checkRotaryEncoder(void); @@ -672,6 +674,14 @@ void bluetoothInit(uint32_t baudrate); void bluetoothWriteWakeup(void); uint8_t bluetoothIsWriting(void); void bluetoothDone(void); +#if defined(PCBX3) + #define IS_BLUETOOTH_CHIP_PRESENT() (false) +#elif (defined(PCBX7) || defined(PCBXLITE)) && !defined(SIMU) + extern volatile uint8_t btChipPresent; + #define IS_BLUETOOTH_CHIP_PRESENT() (btChipPresent) +#else + #define IS_BLUETOOTH_CHIP_PRESENT() (true) +#endif // LED driver void ledInit(void); diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 58596e6f2..14149bb7c 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -55,6 +55,15 @@ #define KEYS_GPIO_PIN_EXIT GPIO_Pin_2 // PD.02 #define KEYS_GPIO_REG_ENTER GPIOE->IDR #define KEYS_GPIO_PIN_ENTER GPIO_Pin_10 // PE.10 +#elif defined(PCBX3) + #define KEYS_GPIO_REG_PAGE GPIOE->IDR + #define KEYS_GPIO_PIN_PAGE GPIO_Pin_8 // PE.08 + #define KEYS_GPIO_REG_MENU GPIOE->IDR + #define KEYS_GPIO_PIN_MENU GPIO_Pin_7 // PE.07 + #define KEYS_GPIO_REG_EXIT GPIOE->IDR + #define KEYS_GPIO_PIN_EXIT GPIO_Pin_9 // PE.09 + #define KEYS_GPIO_REG_ENTER GPIOE->IDR + #define KEYS_GPIO_PIN_ENTER GPIO_Pin_11 // PE.11 #else #define KEYS_GPIO_REG_MENU GPIOD->IDR #define KEYS_GPIO_PIN_MENU GPIO_Pin_7 // PD.07 @@ -81,10 +90,15 @@ #define ENC_GPIO_PIN_A GPIO_Pin_9 // PE.09 #define ENC_GPIO_PIN_B GPIO_Pin_11 // PE.11 #define ROTARY_ENCODER_POSITION() (((ENC_GPIO->IDR >> 10) & 0x02) + ((ENC_GPIO->IDR >> 9) & 0x01)) +#elif defined(PCBX3) + #define ENC_GPIO GPIOE + #define ENC_GPIO_PIN_A GPIO_Pin_10 // PE.10 + #define ENC_GPIO_PIN_B GPIO_Pin_12 // PE.12 + #define ROTARY_ENCODER_POSITION() (((ENC_GPIO->IDR >> 11) & 0x02) + ((ENC_GPIO->IDR >> 10) & 0x01)) #endif // This is for SIMU: reuse rotary encoder pins to map UP and DOWN keyboard keys -#if defined(SIMU) && (defined(PCBX9E) || defined(PCBX7)) +#if defined(SIMU) && (defined(PCBX9E) || defined(PCBX7) || defined(PCBX3)) #define KEYS_GPIO_REG_PLUS ENC_GPIO->IDR #define KEYS_GPIO_PIN_PLUS ENC_GPIO_PIN_A #define KEYS_GPIO_REG_MINUS ENC_GPIO->IDR @@ -135,6 +149,23 @@ #define TRIMS_GPIO_PIN_RVU GPIO_Pin_2 // PC.02 #define TRIMS_GPIO_REG_RHR GPIOE->IDR #define TRIMS_GPIO_PIN_RHR GPIO_Pin_4 // PE.04 +#elif defined(PCBX3) + #define TRIMS_GPIO_REG_LHL GPIOC->IDR + #define TRIMS_GPIO_PIN_LHL GPIO_Pin_4 // PC.04 + #define TRIMS_GPIO_REG_LHR GPIOC->IDR + #define TRIMS_GPIO_PIN_LHR GPIO_Pin_5 // PC.05 + #define TRIMS_GPIO_REG_LVD GPIOB->IDR + #define TRIMS_GPIO_PIN_LVD GPIO_Pin_0 // PB.00 + #define TRIMS_GPIO_REG_LVU GPIOB->IDR + #define TRIMS_GPIO_PIN_LVU GPIO_Pin_1 // PB.01 + #define TRIMS_GPIO_REG_RVD GPIOE->IDR + #define TRIMS_GPIO_PIN_RVD GPIO_Pin_13 // PE.13 + #define TRIMS_GPIO_REG_RHL GPIOE->IDR + #define TRIMS_GPIO_PIN_RHL GPIO_Pin_14 // PE.14 + #define TRIMS_GPIO_REG_RVU GPIOD->IDR + #define TRIMS_GPIO_PIN_RVU GPIO_Pin_8 // PD.08 + #define TRIMS_GPIO_REG_RHR GPIOD->IDR + #define TRIMS_GPIO_PIN_RHR GPIO_Pin_9 // PD.09 #else #define TRIMS_GPIO_REG_LHL GPIOE->IDR #define TRIMS_GPIO_PIN_LHL GPIO_Pin_4 // PE.04 @@ -170,11 +201,16 @@ #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_7 // PE.07 #define SWITCHES_GPIO_REG_A_H GPIOE->IDR #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_13 // PE.13 -#else - #define SWITCHES_GPIO_REG_A_H GPIOB->IDR - #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_5 // PB.05 +#elif defined(PCBX3) #define SWITCHES_GPIO_REG_A_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_0 // PE.00 + #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_7 // PE.07 + #define SWITCHES_GPIO_REG_A_H GPIOE->IDR + #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_13 // PE.13 +#else + #define SWITCHES_GPIO_REG_A_H GPIOE->IDR + #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_0 // PE.00 + #define SWITCHES_GPIO_REG_A_L GPIOE->IDR + #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_1 // PE.01 #endif #if defined(PCBX9E) @@ -192,6 +228,11 @@ #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_15 // PE.15 #define SWITCHES_GPIO_REG_B_H GPIOA->IDR #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_5 // PA.05 +#elif defined(PCBX3) + #define SWITCHES_GPIO_REG_B_L GPIOB->IDR + #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_4 // PB.04 + #define SWITCHES_GPIO_REG_B_H GPIOB->IDR + #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_5 // PB.05 #else #define SWITCHES_GPIO_REG_B_H GPIOE->IDR #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_1 // PE.01 @@ -214,6 +255,11 @@ #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_11 // PD.11 #define SWITCHES_GPIO_REG_C_H GPIOE->IDR #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_0 // PE.00 +#elif defined(PCBX3) + #define SWITCHES_GPIO_REG_C_L GPIOE->IDR + #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_2 // PE.02 + #define SWITCHES_GPIO_REG_C_H GPIOE->IDR + #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_3 // PE.03 #else #define SWITCHES_GPIO_REG_C_H GPIOE->IDR #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_15 // PE.15 @@ -241,6 +287,9 @@ #define SWITCHES_GPIO_PIN_D_L GPIO_Pin_1 // PE.01 #define SWITCHES_GPIO_REG_D_H GPIOE->IDR #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_2 // PE.02 +#elif defined(PCBX3) + #define SWITCHES_GPIO_REG_D GPIOC->IDR + #define SWITCHES_GPIO_PIN_D GPIO_Pin_13 // PC.13 #else #define SWITCHES_GPIO_REG_D_H GPIOE->IDR #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_7 // PE.07 @@ -256,7 +305,7 @@ #elif defined(PCBXLITES) #define SWITCHES_GPIO_REG_E GPIOE->IDR #define SWITCHES_GPIO_PIN_E GPIO_Pin_5 // PE.05 -#elif defined(PCBX7) || defined(PCBXLITE) +#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX3) // no SWE #else #define SWITCHES_GPIO_REG_E_H GPIOB->IDR @@ -276,6 +325,9 @@ #elif defined(PCBX7) #define SWITCHES_GPIO_REG_F GPIOE->IDR #define SWITCHES_GPIO_PIN_F GPIO_Pin_14 // PE.14 +#elif defined(PCBX3) + #define SWITCHES_GPIO_REG_F GPIOA->IDR + #define SWITCHES_GPIO_PIN_F GPIO_Pin_5 // PA.05 #else #define SWITCHES_GPIO_REG_F GPIOE->IDR #define SWITCHES_GPIO_PIN_F GPIO_Pin_14 // PE.14 @@ -383,11 +435,18 @@ #define KEYS_GPIOC_PINS (GPIO_Pin_4 | GPIO_Pin_5) #define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14) #elif defined(PCBX7) - #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE) + #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) #define KEYS_GPIOA_PINS SWITCHES_GPIO_PIN_B_H #define KEYS_GPIOC_PINS (TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU) #define KEYS_GPIOD_PINS (TRIMS_GPIO_PIN_LHL | KEYS_GPIO_PIN_MENU | KEYS_GPIO_PIN_EXIT | KEYS_GPIO_PIN_PAGE | SWITCHES_GPIO_PIN_C_L | SWITCHES_GPIO_PIN_H) #define KEYS_GPIOE_PINS (ENC_GPIO_PIN_A | ENC_GPIO_PIN_B | KEYS_GPIO_PIN_ENTER | TRIMS_GPIO_PIN_RHR | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_D_H | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_A_L | SWITCHES_GPIO_PIN_A_H | SWITCHES_GPIO_PIN_F) +#elif defined(PCBX3) + #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) + #define KEYS_GPIOA_PINS (GPIO_Pin_5) + #define KEYS_GPIOB_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5) + #define KEYS_GPIOC_PINS (GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_13) + #define KEYS_GPIOD_PINS (GPIO_Pin_8 | GPIO_Pin_9) + #define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14) #else #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE) #define KEYS_GPIOA_PINS (SWITCHES_GPIO_PIN_C_L) @@ -519,6 +578,26 @@ #define ADC_CHANNEL_POT1 ADC_Channel_6 #define ADC_CHANNEL_POT2 ADC_Channel_8 #define ADC_CHANNEL_BATT ADC_Channel_10 +#elif defined(PCBX3) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_APB1Periph 0 + #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 + #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 + #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 + #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_2 // PA.02 + #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_3 // PA.03 + #define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_LV ADC_Channel_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_LH ADC_Channel_3 // ADC1_IN3 + #define ADC_GPIO_PIN_POT1 GPIO_Pin_1 // PC.01 OK + #define ADC_GPIO_PIN_POT2 GPIO_Pin_0 // PB.00 + #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 OK + #define ADC_GPIOA_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) + #define ADC_GPIOC_PINS (GPIO_Pin_0 | GPIO_Pin_1) + #define ADC_CHANNEL_POT1 ADC_Channel_6 + #define ADC_CHANNEL_POT2 ADC_Channel_8 + #define ADC_CHANNEL_BATT ADC_Channel_10 #else #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 @@ -548,9 +627,14 @@ #endif // PWR and LED driver -#define PWR_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) +#define PWR_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) -#if defined(PCBXLITE) +#if defined(PCBX3) + #define PWR_SWITCH_GPIO GPIOA + #define PWR_SWITCH_GPIO_PIN GPIO_Pin_7 // PA.07 + #define PWR_ON_GPIO GPIOA + #define PWR_ON_GPIO_PIN GPIO_Pin_6 // PA.06 +#elif defined(PCBXLITE) #define PWR_SWITCH_GPIO GPIOA #define PWR_SWITCH_GPIO_PIN GPIO_Pin_7 // PA.07 #define PWR_ON_GPIO GPIOE @@ -561,8 +645,6 @@ #define PWR_ON_GPIO GPIOD #define PWR_ON_GPIO_PIN GPIO_Pin_0 // PD.00 #endif -#define PWR_ON_GPIO_MODER GPIO_MODER_MODER0 -#define PWR_ON_GPIO_MODER_OUT GPIO_MODER_MODER0_0 #if defined(PCBXLITE) #define STATUS_LEDS @@ -584,6 +666,16 @@ #define LED_RED_GPIO_PIN GPIO_Pin_5 // PC.05 #define LED_BLUE_GPIO GPIOB #define LED_BLUE_GPIO_PIN GPIO_Pin_1 // PB.01 +#elif defined(PCBX3) + #define STATUS_LEDS + #define GPIO_LED_GPIO_ON GPIO_SetBits + #define GPIO_LED_GPIO_OFF GPIO_ResetBits + #define LED_GREEN_GPIO GPIOE + #define LED_GREEN_GPIO_PIN GPIO_Pin_5 // PE.05 + #define LED_RED_GPIO GPIOE + #define LED_RED_GPIO_PIN GPIO_Pin_4 // PE.04 + #define LED_BLUE_GPIO GPIOE + #define LED_BLUE_GPIO_PIN GPIO_Pin_6 // PE.06 #endif // Internal Module @@ -740,7 +832,7 @@ #endif // Serial Port -#if defined(PCBX7) || defined(PCBXLITE) +#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX3) #define SERIAL_RCC_AHB1Periph 0 #define SERIAL_RCC_APB1Periph 0 #else diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index e59177282..6e764badb 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -207,13 +207,17 @@ uint32_t switchState(uint8_t index) ADD_3POS_CASE(A, 0); ADD_3POS_CASE(B, 1); ADD_3POS_CASE(C, 2); +#if defined(PCBX3) + ADD_2POS_CASE(D); +#else ADD_3POS_CASE(D, 3); +#endif #if defined(PCBXLITES) ADD_2POS_CASE(E); ADD_2POS_CASE(F); // no SWF, SWG and SWH on XLITE -#elif defined(PCBXLITE) - // no SWF, SWG and SWH on XLITE +#elif defined(PCBXLITE) || defined(PCBX3) + // no SWE, SWF, SWG and SWH on X3 and XLITE #elif defined(PCBX7) ADD_2POS_CASE(F); ADD_2POS_CASE(H); diff --git a/radio/src/targets/taranis/trainer_driver.cpp b/radio/src/targets/taranis/trainer_driver.cpp index 3c18b14bc..67eb441cb 100644 --- a/radio/src/targets/taranis/trainer_driver.cpp +++ b/radio/src/targets/taranis/trainer_driver.cpp @@ -264,7 +264,7 @@ int sbusGetByte(uint8_t * byte) switch (currentTrainerMode) { case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: return heartbeatFifo.pop(*byte); -#if !defined(PCBX7) && !defined(PCBX9E) +#if !defined(PCBX7) && !defined(PCBX9E) && !defined(PCBX3) case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: return serial2RxFifo.pop(*byte); #endif diff --git a/radio/src/telemetry/crossfire.h b/radio/src/telemetry/crossfire.h index 951c4d32e..d0f2652ad 100644 --- a/radio/src/telemetry/crossfire.h +++ b/radio/src/telemetry/crossfire.h @@ -21,6 +21,9 @@ #ifndef _CROSSFIRE_H_ #define _CROSSFIRE_H_ +#include +#include "dataconstants.h" + // Device address #define BROADCAST_ADDRESS 0x00 #define RADIO_ADDRESS 0xEA From decfa571499cfd7ca5908081f4a0df2d994b9a17 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Feb 2019 15:37:00 +0100 Subject: [PATCH 190/446] FrSky X3 fixes --- radio/src/CMakeLists.txt | 2 +- radio/src/lua/CMakeLists.txt | 1 + radio/src/lua/api_general.cpp | 6 ++++-- radio/src/targets/taranis/CMakeLists.txt | 2 +- radio/src/targets/taranis/hal.h | 4 ++-- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index a0f5907f0..b1f15aa49 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -448,7 +448,7 @@ if(NOT MSVC) set(SRC ${SRC} bin_allocator.cpp) endif() - if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9D OR PCB STREQUAL X9D+ OR PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X10 OR PCB STREQUAL X12S) + if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9D OR PCB STREQUAL X9D+ OR PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X3 OR PCB STREQUAL X10 OR PCB STREQUAL X12S) add_subdirectory(targets/common/arm/stm32/bootloader) include_directories(${CMAKE_CURRENT_BINARY_DIR}/targets/common/arm/stm32/bootloader) set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} bootloader) diff --git a/radio/src/lua/CMakeLists.txt b/radio/src/lua/CMakeLists.txt index b653aa49e..398063f0d 100644 --- a/radio/src/lua/CMakeLists.txt +++ b/radio/src/lua/CMakeLists.txt @@ -40,6 +40,7 @@ set(LUA_INCLUDES_STM32F4 ) if(PYTHONINTERP_FOUND) + add_lua_export_target(x3 ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBX3) add_lua_export_target(x7 ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBX7) add_lua_export_target(xlite ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBXLITE) add_lua_export_target(x9d ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBX9D) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 2e681d3f7..7ed606df5 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -33,6 +33,8 @@ #include "lua/lua_exports_x9e.inc" #elif defined(PCBX7) #include "lua/lua_exports_x7.inc" +#elif defined(PCBX3) + #include "lua/lua_exports_x3.inc" #elif defined(PCBXLITE) #include "lua/lua_exports_xlite.inc" #elif defined(PCBTARANIS) @@ -1338,11 +1340,11 @@ const luaR_value_entry opentxConstants[] = { { "MIXSRC_SB", MIXSRC_SB }, { "MIXSRC_SC", MIXSRC_SC }, { "MIXSRC_SD", MIXSRC_SD }, -#if !defined(PCBX7) && !defined(PCBXLITE) +#if !defined(PCBX7) && !defined(PCBXLITE) && !defined(PCBX3) { "MIXSRC_SE", MIXSRC_SE }, { "MIXSRC_SG", MIXSRC_SG }, #endif -#if !defined(PCBXLITE) +#if !defined(PCBXLITE) && !defined(PCBX3) { "MIXSRC_SF", MIXSRC_SF }, { "MIXSRC_SH", MIXSRC_SH }, #endif diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 91b7be2ef..3827034d2 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -90,7 +90,7 @@ elseif(PCB STREQUAL X3) set(CPU_TYPE_FULL STM32F205xE) # for size report set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(HAPTIC YES) - set(LUA_EXPORT lua_export_x7) + set(LUA_EXPORT lua_export_x3) set(FLAVOUR x3) add_definitions(-DPCBX3 -DSOFTWARE_VOLUME) add_definitions(-DEEPROM_VARIANT=0x4000) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 14149bb7c..487e6647e 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1061,7 +1061,7 @@ #define LCD_DMA_FLAG_INT DMA_HIFCR_CTCIF7 #define LCD_SPI SPI3 #define LCD_GPIO_AF GPIO_AF_SPI3 -#elif defined(PCBX9DP) || defined(PCBX7) +#elif defined(PCBX9DP) || defined(PCBX7) || defined(PCBX3) #define LCD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define LCD_RCC_APB1Periph RCC_APB1Periph_SPI3 #define LCD_SPI_GPIO GPIOC @@ -1100,7 +1100,7 @@ #define I2C_RCC_APB1Periph RCC_APB1Periph_I2C1 #define I2C I2C1 #define I2C_GPIO_AF GPIO_AF_I2C1 -#if defined(PCBXLITE) +#if defined(PCBXLITE) || defined(PCBX3) #define I2C_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOD) #define I2C_SPI_GPIO GPIOB #define I2C_SDA_GPIO_PIN GPIO_Pin_9 // PB.09 From 8772123250f07aa26470968b4ce83550e7d6f51b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Feb 2019 16:15:56 +0100 Subject: [PATCH 191/446] X3 switch fixes --- radio/src/logs.cpp | 7 ++++++- radio/src/switches.cpp | 6 ++++-- radio/src/targets/taranis/board.h | 6 ++++-- radio/src/targets/taranis/hal.h | 12 +++++++----- radio/src/targets/taranis/keys_driver.cpp | 8 +++----- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index 4fc424475..63c6ddb46 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -170,6 +170,10 @@ void writeHeader() #define STR_SWITCHES_LOG_HEADER "SA,SB,SC,SD,SF,SH" #elif defined(PCBXLITE) #define STR_SWITCHES_LOG_HEADER "SA,SB,SC,SD" +#elif defined(PCBXLITES) + #define STR_SWITCHES_LOG_HEADER "SA,SB,SC,SD,SE,SF" +#elif defined(PCBX3) + #define STR_SWITCHES_LOG_HEADER "SA,SB,SC,SE,SF" #else #define STR_SWITCHES_LOG_HEADER "SA,SB,SC,SD,SE,SF,SG,SH" #endif @@ -275,7 +279,8 @@ f_printf(&g_oLogFile, "%d,%d,%d,%d,0x%08X%08X,", GET_3POS_STATE(SA), GET_3POS_STATE(SB), GET_3POS_STATE(SC), - GET_3POS_STATE(SD), + GET_2POS_STATE(SE), + GET_2POS_STATE(SF), getLogicalSwitchesStates(32), getLogicalSwitchesStates(0)); #elif defined(PCBXLITE) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 854dbb5a9..c180f67aa 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -132,15 +132,17 @@ void getSwitchesPosition(bool startup) CHECK_3POS(0, SW_SA); CHECK_3POS(1, SW_SB); CHECK_3POS(2, SW_SC); +#if !defined(PCBX3) CHECK_3POS(3, SW_SD); -#if defined(PCBXLITES) +#endif +#if defined(PCBXLITES) || defined(PCBX3) CHECK_2POS(SW_SE); #elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX3) // No SE #else CHECK_3POS(4, SW_SE); #endif -#if defined(PCBXLITE) && !defined(PCBXLITES) || defined(PCBX3) +#if defined(PCBXLITE) && !defined(PCBXLITES) // No SF #else CHECK_2POS(SW_SF); diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index b35946aa8..9b9535baa 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -300,15 +300,17 @@ enum EnumSwitchesPositions SW_SC0, SW_SC1, SW_SC2, +#if !defined(PCBX3) SW_SD0, SW_SD1, SW_SD2, -#if defined(PCBX9) || defined(PCBXLITES) +#endif +#if defined(PCBX9) || defined(PCBXLITES) || defined(PCBX3) SW_SE0, SW_SE1, SW_SE2, #endif -#if defined(PCBX9) || defined(PCBX7) || defined(PCBXLITES) +#if defined(PCBX9) || defined(PCBX7) || defined(PCBXLITES) || defined(PCBX3) SW_SF0, SW_SF1, SW_SF2, diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 487e6647e..816f0e940 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -288,8 +288,7 @@ #define SWITCHES_GPIO_REG_D_H GPIOE->IDR #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_2 // PE.02 #elif defined(PCBX3) - #define SWITCHES_GPIO_REG_D GPIOC->IDR - #define SWITCHES_GPIO_PIN_D GPIO_Pin_13 // PC.13 + // no SWD #else #define SWITCHES_GPIO_REG_D_H GPIOE->IDR #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_7 // PE.07 @@ -305,7 +304,10 @@ #elif defined(PCBXLITES) #define SWITCHES_GPIO_REG_E GPIOE->IDR #define SWITCHES_GPIO_PIN_E GPIO_Pin_5 // PE.05 -#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX3) +#elif defined(PCBX3) + #define SWITCHES_GPIO_REG_E GPIOC->IDR + #define SWITCHES_GPIO_PIN_E GPIO_Pin_13 // PC.13 +#elif defined(PCBX7) || defined(PCBXLITE) // no SWE #else #define SWITCHES_GPIO_REG_E_H GPIOB->IDR @@ -338,7 +340,7 @@ #define SWITCHES_GPIO_PIN_G_H GPIO_Pin_3 // PF.03 #define SWITCHES_GPIO_REG_G_L GPIOF->IDR #define SWITCHES_GPIO_PIN_G_L GPIO_Pin_4 // PF.04 -#elif defined(PCBX7) || defined(PCBXLITE) +#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX3) // no SWG #else #define SWITCHES_GPIO_REG_G_H GPIOE->IDR @@ -353,7 +355,7 @@ #elif defined(PCBX9DP) #define SWITCHES_GPIO_REG_H GPIOD->IDR #define SWITCHES_GPIO_PIN_H GPIO_Pin_14 // PD.14 -#elif defined(PCBXLITE) +#elif defined(PCBXLITE) || defined(PCBX3) // no SWH #elif defined(PCBX7) #define SWITCHES_GPIO_REG_H GPIOD->IDR diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index 6e764badb..b4a061d6f 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -207,15 +207,13 @@ uint32_t switchState(uint8_t index) ADD_3POS_CASE(A, 0); ADD_3POS_CASE(B, 1); ADD_3POS_CASE(C, 2); -#if defined(PCBX3) - ADD_2POS_CASE(D); -#else +#if !defined(PCBX3) ADD_3POS_CASE(D, 3); #endif -#if defined(PCBXLITES) +#if defined(PCBXLITES) || defined(PCBX3) ADD_2POS_CASE(E); ADD_2POS_CASE(F); - // no SWF, SWG and SWH on XLITE + // no SWG and SWH on XLITES and X3 #elif defined(PCBXLITE) || defined(PCBX3) // no SWE, SWF, SWG and SWH on X3 and XLITE #elif defined(PCBX7) From 7e39b38dd847692f37a3b57b65287ba50b728123 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Feb 2019 17:22:55 +0100 Subject: [PATCH 192/446] X3 LCD fixes --- radio/src/targets/taranis/CMakeLists.txt | 10 +++++-- radio/src/targets/taranis/board.h | 4 +-- radio/src/targets/taranis/hal.h | 38 +++++++++++++++++++----- 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 3827034d2..821fa0078 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -143,7 +143,7 @@ elseif(PCB STREQUAL XLITES) set(STATUS_LEDS YES) endif() -if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES) +if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X3) add_definitions(-DINTERNAL_MODULE_SERIAL) if(PXX_FREQUENCY STREQUAL HIGH) add_definitions(-DPXX_FREQUENCY_HIGH) @@ -159,7 +159,6 @@ else() set(TARGET_SRC ${TARGET_SRC} intmodule_pulses_driver.cpp - trainer_driver.cpp ) set(PULSES_SRC ${PULSES_SRC} @@ -167,6 +166,13 @@ else() ) endif() +if(NOT PCB STREQUAL XLITE AND NOT PCB STREQUAL XLITES) + set(TARGET_SRC + ${TARGET_SRC} + trainer_driver.cpp + ) +endif() + if(PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) add_definitions(-DBLUETOOTH) set(TARGET_SRC diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 9b9535baa..bb2172cfa 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -366,7 +366,7 @@ enum EnumSwitchesPositions #elif defined(PCBX7) #define NUM_SWITCHES 6 #elif defined(PCBX3) - #define NUM_SWITCHES 4 + #define NUM_SWITCHES 5 #elif defined(PCBX9E) #define NUM_SWITCHES 18 // yes, it's a lot! #else @@ -583,7 +583,7 @@ uint8_t telemetryGetByte(uint8_t * byte); extern uint32_t telemetryErrors; // PCBREV driver -#if defined(PCBXLITE) +#if defined(PCBXLITE) || defined(PCBX3) #define HAS_SPORT_UPDATE_CONNECTOR() true #elif defined(PCBX7) #define IS_PCBREV_40() (GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) == Bit_SET) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 816f0e940..069d146f7 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -681,10 +681,10 @@ #endif // Internal Module -#if defined(PCBXLITE) +#if defined(PCBXLITE) || defined(PCBX3) #define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM3 #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 - #if defined(PCBXLITES) + #if defined(PCBXLITES) || defined(PCBX3) #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) #define INTMODULE_PWR_GPIO GPIOA #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_15 // PA.15 @@ -799,16 +799,38 @@ #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 #define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn #define EXTMODULE_TIMER_DMA_STREAM_IRQHandler DMA2_Stream1_IRQHandler - #define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1 + #define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1 #define EXTMODULE_TIMER_OUTPUT_ENABLE TIM_CCER_CC1NE #define EXTMODULE_TIMER_OUTPUT_POLARITY TIM_CCER_CC1NP - #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) + #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) #endif // Trainer Port #if defined(PCBXLITE) #define TRAINER_RCC_AHB1Periph 0 #define TRAINER_RCC_APB1Periph 0 +#elif defined(PCBX3) + #define TRAINER_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD) + #define TRAINER_RCC_APB1Periph RCC_APB1Periph_TIM4 + #define TRAINER_GPIO GPIOD + #define TRAINER_IN_GPIO_PIN GPIO_Pin_13 // PD.13 + #define TRAINER_IN_GPIO_PinSource GPIO_PinSource13 + #define TRAINER_OUT_GPIO_PIN GPIO_Pin_12 // PD.12 + #define TRAINER_OUT_GPIO_PinSource GPIO_PinSource12 + #define TRAINER_DETECT_GPIO GPIOD + #define TRAINER_DETECT_GPIO_PIN GPIO_Pin_11 // PD.11 + #define TRAINER_TIMER TIM4 + #define TRAINER_TIMER_IRQn TIM4_IRQn + #define TRAINER_GPIO_AF GPIO_AF_TIM4 + #define TRAINER_DMA DMA1 + #define TRAINER_DMA_CHANNEL DMA_Channel_5 + #define TRAINER_DMA_STREAM DMA1_Stream2 + #define TRAINER_DMA_IRQn DMA1_Stream2_IRQn + #define TRAINER_DMA_IRQHandler DMA1_Stream2_IRQHandler + #define TRAINER_DMA_FLAG_TC DMA_IT_TCIF2 + #define TRAINER_TIMER_IRQn TIM4_IRQn + #define TRAINER_TIMER_IRQHandler TIM4_IRQHandler + #define TRAINER_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) #else #define TRAINER_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC) #define TRAINER_RCC_APB1Periph RCC_APB1Periph_TIM3 @@ -969,7 +991,7 @@ #define BACKLIGHT_GPIO_PinSource_2 GPIO_PinSource13 #define BACKLIGHT_GPIO_AF_1 GPIO_AF_TIM4 #define BACKLIGHT_GPIO_AF_2 GPIO_AF_TIM4 -#elif defined(PCBXLITES) +#elif defined(PCBXLITES) || defined(PCBX3) #define BACKLIGHT_RCC_AHB1Periph RCC_AHB1Periph_GPIOA #define BACKLIGHT_RCC_APB1Periph 0 #define BACKLIGHT_RCC_APB2Periph RCC_APB2Periph_TIM1 @@ -1042,7 +1064,7 @@ #define LCD_DMA_FLAG_INT DMA_HIFCR_CTCIF7 #define LCD_SPI SPI3 #define LCD_GPIO_AF GPIO_AF_SPI3 -#elif defined(PCBXLITE) +#elif defined(PCBXLITE) || defined(PCBX3) #define LCD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define LCD_RCC_APB1Periph RCC_APB1Periph_SPI3 #define LCD_SPI_GPIO GPIOC @@ -1063,7 +1085,7 @@ #define LCD_DMA_FLAG_INT DMA_HIFCR_CTCIF7 #define LCD_SPI SPI3 #define LCD_GPIO_AF GPIO_AF_SPI3 -#elif defined(PCBX9DP) || defined(PCBX7) || defined(PCBX3) +#elif defined(PCBX9DP) || defined(PCBX7) #define LCD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define LCD_RCC_APB1Periph RCC_APB1Periph_SPI3 #define LCD_SPI_GPIO GPIOC @@ -1203,7 +1225,7 @@ #endif // Haptic -#if defined(PCBXLITE) +#if defined(PCBXLITE) || defined(PCBX3) #define HAPTIC_PWM #define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define HAPTIC_RCC_APB1Periph RCC_APB1Periph_TIM2 From 45df511b261ad59cb800ce3c67054d26f7be4915 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 18 Feb 2019 17:32:28 +0100 Subject: [PATCH 193/446] Add telem1-32 and lua mixer outputs to lua fields --- radio/src/dataconstants.h | 4 ++-- radio/src/lua/api_general.cpp | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 5eb277c9a..77c7bdbd4 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -510,7 +510,7 @@ enum MixSources { MIXSRC_LAST_INPUT = MIXSRC_FIRST_INPUT+MAX_INPUTS-1, #if defined(LUA_INPUTS) - MIXSRC_FIRST_LUA, + MIXSRC_FIRST_LUA, LUA_EXPORT_MULTIPLE("lua", "Lua mix output %d", MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS) MIXSRC_LAST_LUA = MIXSRC_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1, #endif @@ -679,7 +679,7 @@ enum MixSources { MIXSRC_TIMER3, LUA_EXPORT("timer3", "Timer 3 value [seconds]") MIXSRC_LAST_TIMER = MIXSRC_TIMER3, - MIXSRC_FIRST_TELEM, + MIXSRC_FIRST_TELEM, LUA_EXPORT_MULTIPLE("telem", "Telemetry sensor %d", MAX_TELEMETRY_SENSORS) MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+3*MAX_TELEMETRY_SENSORS-1 }; diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 7ed606df5..9716e69cc 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -303,7 +303,10 @@ bool luaFindFieldByName(const char * name, LuaField & field, unsigned int flags) continue; } if (index < luaMultipleFields[n].count) { - field.id = luaMultipleFields[n].id + index; + if(luaMultipleFields[n].id == MIXSRC_FIRST_TELEM) + field.id = luaMultipleFields[n].id + index*3; + else + field.id = luaMultipleFields[n].id + index; if (flags & FIND_FIELD_DESC) { snprintf(field.desc, sizeof(field.desc)-1, luaMultipleFields[n].desc, index+1); field.desc[sizeof(field.desc)-1] = '\0'; From fdaed515fc4d1b70a04744a2b47140399cec41b3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Feb 2019 18:40:21 +0100 Subject: [PATCH 194/446] X3 UI fixes --- radio/src/gui/128x64/gui.h | 8 ++++---- radio/src/gui/common/stdlcd/radio_sdmanager.cpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index da65a514c..cd794dd0e 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -27,7 +27,7 @@ #define MENUS_SCROLLBAR_WIDTH 0 -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) #define HEADER_LINE 0 #define HEADER_LINE_COLUMNS #else @@ -157,7 +157,7 @@ void title(const char * s); #define MENU_TAB(...) const uint8_t mstate_tab[] = __VA_ARGS__ -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) #define MENU_CHECK(tab, menu, lines_count) \ check(event, menu, tab, DIM(tab), mstate_tab, DIM(mstate_tab)-1, lines_count) #else @@ -170,7 +170,7 @@ void title(const char * s); MENU_CHECK(tab, menu, lines_count); \ TITLE(title) -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) #define SIMPLE_MENU_NOTITLE(tab, menu, lines_count) \ check_simple(event, menu, tab, DIM(tab), lines_count); #define SUBMENU_NOTITLE(lines_count, ...) { \ @@ -323,7 +323,7 @@ void drawStatusLine(); #endif // TODO enum -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) #define EDIT_MODE_INIT 0 #else #define EDIT_MODE_INIT -1 diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index b89cd74f4..1807b8ab3 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -197,7 +197,7 @@ void menuRadioSdManager(event_t _event) menuVerticalOffset = reusableBuffer.sdmanager.offset; break; -#if defined(PCBX9) || defined(PCBX7) // TODO NO_MENU_KEY +#if defined(PCBX9) || defined(PCBX7) || defined(PCBX3) // TODO NO_MENU_KEY case EVT_KEY_LONG(KEY_MENU): if (!READ_ONLY() && s_editMode == 0) { killEvents(_event); @@ -234,7 +234,7 @@ void menuRadioSdManager(event_t _event) break; case EVT_KEY_LONG(KEY_ENTER): -#if !defined(PCBX9) && !defined(PCBX7) // TODO NO_HEADER_LINE +#if !defined(PCBX9) && !defined(PCBX7) && !defined(PCBX3)// TODO NO_HEADER_LINE if (menuVerticalPosition < HEADER_LINE) { killEvents(_event); POPUP_MENU_ADD_ITEM(STR_SD_INFO); From 66a4276fb382d32ef2d2f31936d1dd16d0c7e23a Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 19 Feb 2019 10:12:33 +0100 Subject: [PATCH 195/446] X7 : assume R9M is PXX2 --- radio/src/gui/128x64/model_setup.cpp | 129 ++++++++++++++++++--------- radio/src/gui/gui_common_arm.cpp | 2 +- radio/src/opentx.cpp | 2 +- radio/src/pulses/modules.h | 9 +- radio/src/targets/horus/board.h | 4 +- radio/src/targets/taranis/board.h | 6 +- 6 files changed, 101 insertions(+), 51 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index d59087a81..a6b458222 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -83,11 +83,11 @@ enum MenuModelSetupItems { #endif ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_ID, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NAME, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_ID, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NAME, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL, @@ -101,7 +101,8 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_SYNCSTATUS, #endif ITEM_MODEL_EXTERNAL_MODULE_CHANNELS, - ITEM_MODEL_EXTERNAL_MODULE_BIND, + ITEM_MODEL_EXTERNAL_MODULE_NPXX2_BIND, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_MODEL_NUM, #if defined(PCBSKY9X) && defined(REVX) ITEM_MODEL_EXTERNAL_MODULE_OUTPUT_TYPE, #endif @@ -114,6 +115,16 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_FREQ, #endif ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RANGE_REGISTER, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_NAME, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_NAME, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_ADD_RECEIVER, #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, @@ -148,14 +159,18 @@ enum MenuModelSetupItems { #define MODEL_SETUP_RANGE_OFS 4*FW+3 #define MODEL_SETUP_SET_FAILSAFE_OFS 7*FW-2 -#define IF_PXX2(xxx) (IS_PXX2_ENABLED() ? (uint8_t)(xxx) : HIDDEN_ROW) -#define IF_NOT_PXX2(xxx) (IS_PXX2_ENABLED() ? HIDDEN_ROW : (uint8_t)(xxx)) -#define IF_PXX2_RECEIVER_DISPLAYED(module, idx, xxx) ((IS_PXX2_ENABLED() && g_model.moduleData[module].pxx2.receivers[idx].enabled) ? (uint8_t)(xxx) : HIDDEN_ROW) +#define IS_PXX2_EXTERNAL_ENABLED() (isModulePXX2(EXTERNAL_MODULE)) +#define IF_PXX2(xxx) (IS_PXX2_INTERNAL_ENABLED() ? (uint8_t)(xxx) : HIDDEN_ROW) +#define IF_NOT_PXX2(xxx) (IS_PXX2_INTERNAL_ENABLED() ? HIDDEN_ROW : (uint8_t)(xxx)) +#define IF_EXTERNAL_PXX2(xxx) (isModulePXX2(EXTERNAL_MODULE) ? (uint8_t)(xxx) : HIDDEN_ROW) +#define IF_NOT_EXTERNAL_PXX2(xxx) (isModulePXX2(EXTERNAL_MODULE) ? HIDDEN_ROW : (uint8_t)(xxx)) +#define IF_PXX2_RECEIVER_DISPLAYED(module, idx, xxx) ((isModulePXX2(module) && g_model.moduleData[module].pxx2.receivers[idx].enabled) ? (uint8_t)(xxx) : HIDDEN_ROW) #if defined(PCBTARANIS) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) - #define CURRENT_RECEIVER_EDITED(k) (k >= ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_ID ? 1 : 0) + #define CURRENT_RECEIVER_EDITED(k) (k >= ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NAME ? 1 : 0) #define INTERNAL_MODULE_ADD_RECEIVER_ROW (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[MAX_RECEIVERS_PER_MODULE-1].enabled ? HIDDEN_ROW : (uint8_t)0) + #define EXTERNAL_MODULE_ADD_RECEIVER_ROW (g_model.moduleData[EXTERNAL_MODULE].pxx2.receivers[MAX_RECEIVERS_PER_MODULE-1].enabled ? HIDDEN_ROW : (uint8_t)0) #elif defined(PCBSKY9X) && !defined(REVA) #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) #else @@ -375,11 +390,11 @@ void menuModelSetup(event_t event) INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None) INTERNAL_MODULE_CHANNELS_ROWS, // Channels min and count IF_NOT_PXX2(IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), - IF_PXX2(0), // Model Number + IF_PXX2(0), // RxNum ANTENNA_ROW IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Module start channel (pxx2 always send 16) IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Range check and Register buttons - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, (uint8_t)-1), // Receiver Number + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, (uint8_t)-1), // Receiver Name IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Delete @@ -394,13 +409,24 @@ void menuModelSetup(event_t event) MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS EXTERNAL_MODULE_CHANNELS_ROWS, - EXTERNAL_MODULE_BIND_ROWS(), // line reused for PPM: PPM settings + IF_NOT_EXTERNAL_PXX2(EXTERNAL_MODULE_BIND_ROWS()), // line reused for PPM: PPM settings + IF_EXTERNAL_PXX2(0), // RxNum OUTPUT_TYPE_ROWS() - EXTERNAL_MODULE_OPTION_ROW, + IF_NOT_EXTERNAL_PXX2(EXTERNAL_MODULE_OPTION_ROW), MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, EXTERNAL_MODULE_FREQ_ROW FAILSAFE_ROWS(EXTERNAL_MODULE), + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 1), // Range check and Register buttons + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, (uint8_t)-1), // Receiver Name + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Range + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Telemetry + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 1), // Receiver Bind/Delete + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, (uint8_t)-1), // Receiver Number + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver Range + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver Telemetry + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 1), // Receiver Bind/Delete + IF_EXTERNAL_PXX2(EXTERNAL_MODULE_ADD_RECEIVER_ROW), TRAINER_ROWS }); @@ -1113,24 +1139,31 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_MODEL_NUM: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_MODEL_NUM: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[INTERNAL_MODULE], attr | LEADING0|LEFT, 2); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], attr | LEADING0 | LEFT, 2); if (attr) { - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[INTERNAL_MODULE], MAX_RX_NUM(INTERNAL_MODULE)); + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); if (checkIncDec_Ret) { - modelHeaders[g_eeGeneral.currModel].modelId[INTERNAL_MODULE] = g_model.header.modelId[INTERNAL_MODULE]; + modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; } } + } break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RANGE_REGISTER: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); lcdDrawTextAlignedLeft(y, INDENT "Module"); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, (menuHorizontalPosition==0 ? attr : 0) ); - lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition==1 ? attr : 0) ); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, (menuHorizontalPosition == 0 ? attr : 0)); + lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition == 1 ? attr : 0)); if (attr) { - if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL && s_editMode > 0) { - if (menuHorizontalPosition == 1 && reusableBuffer.modelSetup.pxx2.registerStep < REGISTER_RX_NAME_SELECTED) { - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; + if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) { + if (menuHorizontalPosition == 1 && reusableBuffer.modelSetup.pxx2.registerStep < REGISTER_RX_NAME_SELECTED) { + moduleSettings[moduleIdx].mode = MODULE_MODE_REGISTER; reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition = 0; reusableBuffer.modelSetup.pxx2.registerPopupHorizontalPosition = 0; reusableBuffer.modelSetup.pxx2.registerPopupEditMode = 0; @@ -1138,40 +1171,47 @@ void menuModelSetup(event_t event) POPUP_INPUT("", runPopupRegister); } else if (menuHorizontalPosition == 0) { - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; + moduleSettings[moduleIdx].mode = MODULE_MODE_RANGECHECK; } } if (s_editMode == 0 && !warningText) { - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + moduleSettings[moduleIdx].mode = MODULE_MODE_NORMAL; } - if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL) { + if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL) { // REGISTER finished s_editMode = 0; } } + } break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_ADD_RECEIVER: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); lcdDrawText(INDENT_WIDTH, y, "Receiver"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "[Add]", attr); - if (attr && s_editMode>0) { - if (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled) { - g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1].enabled = 0x01; - memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); - menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL + 1; + if (attr && s_editMode > 0) { + if (g_model.moduleData[moduleIdx].pxx2.receivers[0].enabled) { + g_model.moduleData[moduleIdx].pxx2.receivers[1].enabled = 0x01; + memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[1].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); + menuVerticalPosition = (moduleIdx ? ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL : ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL) + 1; } else { - g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].enabled = 0x01; - memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); - menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL + 1; + g_model.moduleData[moduleIdx].pxx2.receivers[0].enabled = 0x01; + memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[0].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); + menuVerticalPosition = (moduleIdx ? ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL : ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL) + 1; } killEvents(event); s_editMode = 0; } - break; + } + break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_ID: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_ID: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NAME: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NAME: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_NAME: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_NAME: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); @@ -1183,6 +1223,8 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); @@ -1199,6 +1241,8 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_TELEM: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_TELEM: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].telemetry = editCheckBox(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].telemetry, MODEL_SETUP_2ND_COLUMN, y, INDENT INDENT "Telemetry", attr, event); @@ -1207,11 +1251,13 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawSizedText(6, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, PXX2_LEN_RX_NAME, 0); + lcdDrawText(6, y, "Action", 0); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, menuHorizontalPosition==0 ? attr : 0); lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS, y, STR_DEL_BUTTON, menuHorizontalPosition==1 ? attr : 0); if (attr) { @@ -1219,9 +1265,9 @@ void menuModelSetup(event_t event) if (event == EVT_KEY_BREAK(KEY_ENTER)) { reusableBuffer.modelSetup.pxx2.bindStep = BIND_START; reusableBuffer.modelSetup.pxx2.bindCandidateReceiversCount = 0; - moduleSettings[INTERNAL_MODULE].mode ^= MODULE_MODE_BIND; + moduleSettings[moduleIdx].mode ^= MODULE_MODE_BIND; } - if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_BIND) { + if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) { s_editMode = 1; if (reusableBuffer.modelSetup.pxx2.bindStep == BIND_RX_NAME_RECEIVED) { popupMenuItemsCount = min(reusableBuffer.modelSetup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); @@ -1252,14 +1298,13 @@ void menuModelSetup(event_t event) break; #endif - +#if defined(PCBSKY9X) + case ITEM_MODEL_EXTRA_MODULE_BIND: +#endif #if defined(PCBTARANIS) case ITEM_MODEL_INTERNAL_MODULE_NPXX2_BIND: + case ITEM_MODEL_EXTERNAL_MODULE_NPXX2_BIND: #endif -#if defined(PCBSKY9X) - case ITEM_MODEL_EXTRA_MODULE_BIND: -#endif - case ITEM_MODEL_EXTERNAL_MODULE_BIND: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; @@ -1682,7 +1727,7 @@ void menuModelSetup(event_t event) checkModelIdUnique(g_eeGeneral.currModel, EXTRA_MODULE); break; #endif - case ITEM_MODEL_EXTERNAL_MODULE_BIND: + case ITEM_MODEL_EXTERNAL_MODULE_NPXX2_BIND: if (menuHorizontalPosition == 0) checkModelIdUnique(g_eeGeneral.currModel, EXTERNAL_MODULE); break; diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 5d5529822..0751d039c 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -520,7 +520,7 @@ bool isInternalModuleAvailable(int module) if (module == MODULE_TYPE_NONE) return true; - if (module == (IS_PXX2_ENABLED() ? MODULE_TYPE_XJT2 : MODULE_TYPE_XJT)) + if (module == (IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_XJT2 : MODULE_TYPE_XJT)) return true; return false; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 9850f7f39..9ee271d63 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -463,7 +463,7 @@ void modelDefault(uint8_t id) #endif #if defined(PCBTARANIS) || defined(PCBHORUS) - g_model.moduleData[INTERNAL_MODULE].type = IS_PXX2_ENABLED() ? MODULE_TYPE_XJT2 : MODULE_TYPE_XJT; + g_model.moduleData[INTERNAL_MODULE].type = IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_XJT2 : MODULE_TYPE_XJT; g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); #elif defined(PCBSKY9X) g_model.moduleData[EXTERNAL_MODULE].type = MODULE_TYPE_PPM; diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 8cb6e09fd..24c85bf21 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -56,7 +56,7 @@ inline bool isModuleXJT(uint8_t idx) inline bool isModuleXJT2(uint8_t idx) { - return g_model.moduleData[idx].type == MODULE_TYPE_XJT2; + return g_model.moduleData[idx].type == MODULE_TYPE_XJT2 || g_model.moduleData[idx].type == MODULE_TYPE_R9M; } @@ -174,7 +174,12 @@ inline bool isModuleR9M_AU_PLUS(uint8_t idx) inline bool isModulePXX(uint8_t idx) { - return isModuleXJT(idx) || isModuleR9M(idx); + return isModuleXJT(idx); +} + +inline bool isModulePXX2(uint8_t idx) +{ + return isModuleXJT2(idx) || isModuleR9M(idx); } #if defined(DSM2) diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index e9e094360..22809098a 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -200,9 +200,9 @@ PACK(typedef struct { extern HardwareOptions hardwareOptions; #if defined(PCBX10) - #define IS_PXX2_ENABLED() (true) + #define IS_PXX2_INTERNAL_ENABLED() (true) #else - #define IS_PXX2_ENABLED() (hardwareOptions.pxx2Enabled) + #define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) #endif void init_ppm(uint8_t module); diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index bb2172cfa..23e5a1e2b 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -457,10 +457,10 @@ extern HardwareOptions hardwareOptions; #define NUM_TRIMS_KEYS 8 #endif -#if defined(PCBXLITES) - #define IS_PXX2_ENABLED() (true) +#if defined(PCBXLITES) || defined(DEBUG) + #define IS_PXX2_INTERNAL_ENABLED() (true) #else - #define IS_PXX2_ENABLED() (hardwareOptions.pxx2Enabled) + #define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) #endif enum CalibratedAnalogs { From d80dc67bbd523b62303cd6435d724e0ff3c781ac Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 19 Feb 2019 13:15:54 +0100 Subject: [PATCH 196/446] R9M and R9M2 --- radio/src/gui/128x64/model_setup.cpp | 28 ++++++++++++++-------------- radio/src/gui/480x272/popups.cpp | 2 +- radio/src/gui/gui_common.h | 2 +- radio/src/gui/gui_common_arm.cpp | 14 +++++++++++++- radio/src/myeeprom.h | 1 + radio/src/pulses/modules.h | 9 +++++++-- radio/src/pulses/pulses.cpp | 3 ++- radio/src/targets/horus/board.cpp | 4 +++- radio/src/telemetry/telemetry.h | 9 ++++----- radio/src/translations/cz.h.txt | 2 +- radio/src/translations/de.h.txt | 2 +- radio/src/translations/en.h.txt | 2 +- radio/src/translations/es.h.txt | 2 +- radio/src/translations/fi.h.txt | 2 +- radio/src/translations/fr.h.txt | 2 +- radio/src/translations/it.h.txt | 2 +- radio/src/translations/nl.h.txt | 2 +- radio/src/translations/pl.h.txt | 2 +- radio/src/translations/pt.h.txt | 2 +- radio/src/translations/se.h.txt | 2 +- 20 files changed, 57 insertions(+), 37 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index a6b458222..05a4924d2 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -159,9 +159,8 @@ enum MenuModelSetupItems { #define MODEL_SETUP_RANGE_OFS 4*FW+3 #define MODEL_SETUP_SET_FAILSAFE_OFS 7*FW-2 -#define IS_PXX2_EXTERNAL_ENABLED() (isModulePXX2(EXTERNAL_MODULE)) -#define IF_PXX2(xxx) (IS_PXX2_INTERNAL_ENABLED() ? (uint8_t)(xxx) : HIDDEN_ROW) -#define IF_NOT_PXX2(xxx) (IS_PXX2_INTERNAL_ENABLED() ? HIDDEN_ROW : (uint8_t)(xxx)) +#define IF_PXX2(xxx) (isModulePXX2(INTERNAL_MODULE) ? (uint8_t)(xxx) : HIDDEN_ROW) +#define IF_NOT_PXX2(xxx) (isModulePXX2(INTERNAL_MODULE) ? HIDDEN_ROW : (uint8_t)(xxx)) #define IF_EXTERNAL_PXX2(xxx) (isModulePXX2(EXTERNAL_MODULE) ? (uint8_t)(xxx) : HIDDEN_ROW) #define IF_NOT_EXTERNAL_PXX2(xxx) (isModulePXX2(EXTERNAL_MODULE) ? HIDDEN_ROW : (uint8_t)(xxx)) #define IF_PXX2_RECEIVER_DISPLAYED(module, idx, xxx) ((isModulePXX2(module) && g_model.moduleData[module].pxx2.receivers[idx].enabled) ? (uint8_t)(xxx) : HIDDEN_ROW) @@ -232,6 +231,17 @@ enum MenuModelSetupItems { #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW +#define DEF case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NAME:\ + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NAME:\ + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_NAME:\ + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_NAME:\ + {\ + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k);\ + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);\ +\ + lcdDrawTextAlignedLeft(y, STR_RECEIVER);\ + lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, PXX2_LEN_RX_NAME, 0);\ + } #elif defined(PCBXLITES) #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) @@ -1208,17 +1218,7 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NAME: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NAME: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_NAME: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_NAME: - { - uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - - lcdDrawTextAlignedLeft(y, STR_RECEIVER); - lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, PXX2_LEN_RX_NAME, 0); - } + DEF break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: diff --git a/radio/src/gui/480x272/popups.cpp b/radio/src/gui/480x272/popups.cpp index 4a39cb1b6..4566bd85c 100644 --- a/radio/src/gui/480x272/popups.cpp +++ b/radio/src/gui/480x272/popups.cpp @@ -77,7 +77,7 @@ void runPopupWarning(event_t event) { warningResult = false; - theme->drawMessageBox(warningText, warningInfoText, WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT_ENTER_EXIT), warningType); + theme->drawMessageBox(warningText, warningInfoText, WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT), warningType); switch (event) { case EVT_KEY_BREAK(KEY_ENTER): diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 3b21668b4..fffe0c5fc 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -156,7 +156,7 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); #define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) #define IS_R9M_OR_XJTD16(x) ((isModuleXJT(x) && g_model.moduleData[x].rfProtocol== RF_PROTO_X16) || isModuleR9M(x)) -#define FAILSAFE_ROWS(x) ((isModuleXJTVariant(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || isModuleR9M(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW +#define FAILSAFE_ROWS(x) ((isModuleXJTVariant(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || isModuleR9M(x) || isModuleR9M2(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW #if defined(PCBXLITE) #define EXTERNAL_MODULE_OPTION_ROW (isModuleR9M(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 0751d039c..77147d585 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -520,7 +520,7 @@ bool isInternalModuleAvailable(int module) if (module == MODULE_TYPE_NONE) return true; - if (module == (IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_XJT2 : MODULE_TYPE_XJT)) + if ((module == (IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_XJT2 : MODULE_TYPE_XJT)) && !isModulePXX2(EXTERNAL_MODULE)) return true; return false; @@ -561,6 +561,15 @@ bool isExternalModuleAvailable(int module) if (module == MODULE_TYPE_R9M && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { return false; } + if (module == MODULE_TYPE_R9M2 && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { + return false; + } + if (module == MODULE_TYPE_XJT && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { + return false; + } + if (module == MODULE_TYPE_XJT2 && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { + return false; + } #endif return true; @@ -582,6 +591,9 @@ bool isRfProtocolAvailable(int protocol) if (protocol != RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { return false; } + if (protocol != RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M2) { + return false; + } #endif return true; diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 497b05c92..9d51e9981 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -407,6 +407,7 @@ enum ModuleTypes { MODULE_TYPE_CROSSFIRE, MODULE_TYPE_MULTIMODULE, MODULE_TYPE_R9M, + MODULE_TYPE_R9M2, MODULE_TYPE_SBUS, MODULE_TYPE_MAX = MODULE_TYPE_SBUS, MODULE_TYPE_COUNT diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 24c85bf21..fe87cb0a5 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -56,7 +56,7 @@ inline bool isModuleXJT(uint8_t idx) inline bool isModuleXJT2(uint8_t idx) { - return g_model.moduleData[idx].type == MODULE_TYPE_XJT2 || g_model.moduleData[idx].type == MODULE_TYPE_R9M; + return g_model.moduleData[idx].type == MODULE_TYPE_XJT2; } @@ -146,6 +146,11 @@ inline bool isModuleR9M(uint8_t idx) return g_model.moduleData[idx].type == MODULE_TYPE_R9M; } +inline bool isModuleR9M2(uint8_t idx) +{ + return g_model.moduleData[idx].type == MODULE_TYPE_R9M2; +} + inline bool isModuleR9M_FCC(uint8_t idx) { return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FCC; @@ -179,7 +184,7 @@ inline bool isModulePXX(uint8_t idx) inline bool isModulePXX2(uint8_t idx) { - return isModuleXJT2(idx) || isModuleR9M(idx); + return isModuleXJT2(idx) || isModuleR9M2(idx); } #if defined(DSM2) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 0c7474757..799d0c3f9 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -50,11 +50,12 @@ uint8_t getRequiredProtocol(uint8_t module) break; case MODULE_TYPE_XJT: + case MODULE_TYPE_R9M: protocol = PROTOCOL_CHANNELS_PXX1; break; case MODULE_TYPE_XJT2: - case MODULE_TYPE_R9M: + case MODULE_TYPE_R9M2: protocol = PROTOCOL_CHANNELS_PXX2; break; diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index b37b78ead..046e8e065 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -29,6 +29,8 @@ extern "C" { } #endif +extern bool sticks_pwm_disabled; + HardwareOptions hardwareOptions; void watchdogInit(unsigned int duration) @@ -194,7 +196,7 @@ void boardInit() audioInit(); - // we need to initialize g_FATFS_Obj here, because it is in .ram section (because of DMA access) + // we need to initialize g_FATFS_Obj here, because it is in .ram section (because of DMA access) // and this section is un-initialized memset(&g_FATFS_Obj, 0, sizeof(g_FATFS_Obj)); diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 7a834a32f..bf8d0119e 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -126,14 +126,13 @@ inline uint8_t modelTelemetryProtocol() return g_model.telemetryProtocol; } - if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M) { -#if defined(PCBXLITE) - return PROTOCOL_TELEMETRY_FRSKY_SPORT; -#else + if (!IS_INTERNAL_MODULE_ENABLED() && isModulePXX2(EXTERNAL_MODULE)) { return PROTOCOL_TELEMETRY_PXX2; -#endif } + if (!IS_INTERNAL_MODULE_ENABLED() && isModulePXX(EXTERNAL_MODULE)) { + return PROTOCOL_TELEMETRY_FRSKY_SPORT; + } #if defined(MULTIMODULE) if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) { return PROTOCOL_TELEMETRY_MULTIMODULE; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index e1805bee5..846df51d0 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -103,7 +103,7 @@ #define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "Vyp\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS "Vyp\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (kabel)Spektrum\0 " diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 067d8c6f7..c1113ccd5 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "AUS\0""PPM\0""XJT\0""DSM?""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS "AUS\0""PPM\0""XJT\0""DSM?""CRSF""MULT""R9M\0""R9M2""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (Kabel)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index e4546328b..c8283c509 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 7c376334c..c25de41ac 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 1f13dc56f..5815b18b4 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 9d2417b8b..c5e61d9d3 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 5c15154be..ea8d0272b 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index e4ad7dcea..107733162 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -107,7 +107,7 @@ #define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "UIT\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS "UIT\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 1667be9b5..bf74ec903 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 10ba610bf..37d2bdd10 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 879b199bc..a9bf87e83 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -105,7 +105,7 @@ #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" #define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "Av\0 ""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""SBUS" +#define TR_TARANIS_PROTOCOLS "Av\0 ""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" From f9a851c62e0bd5efd634f10bf23b9b2179378f58 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Feb 2019 13:36:11 +0100 Subject: [PATCH 197/446] Compilation fix --- radio/src/pulses/modules.h | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index fe87cb0a5..29cf31b5b 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -110,12 +110,17 @@ inline bool isModulePPM(uint8_t idx) } #endif -#if defined(PCBXLITE) inline bool isModuleR9M(uint8_t idx) { return g_model.moduleData[idx].type == MODULE_TYPE_R9M; } +inline bool isModuleR9M2(uint8_t idx) +{ + return g_model.moduleData[idx].type == MODULE_TYPE_R9M2; +} + +#if defined(PCBXLITE) inline bool isModuleR9M_FCC(uint8_t idx) { return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_FCC; @@ -141,16 +146,6 @@ inline bool isModuleR9M_AU_PLUS(uint8_t idx) return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_AUPLUS; } #else -inline bool isModuleR9M(uint8_t idx) -{ - return g_model.moduleData[idx].type == MODULE_TYPE_R9M; -} - -inline bool isModuleR9M2(uint8_t idx) -{ - return g_model.moduleData[idx].type == MODULE_TYPE_R9M2; -} - inline bool isModuleR9M_FCC(uint8_t idx) { return isModuleR9M(idx) && g_model.moduleData[idx].r9m.region == MODULE_R9M_REGION_FCC; From ff5928f778e7e9ef7957c2f3bf0b8e12ae5dfa47 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Feb 2019 13:59:06 +0100 Subject: [PATCH 198/446] Bluetooth cosmetics, traces removed etc. --- radio/src/bluetooth.cpp | 37 +--------------------------- radio/src/gui/128x64/model_setup.cpp | 5 +--- 2 files changed, 2 insertions(+), 40 deletions(-) diff --git a/radio/src/bluetooth.cpp b/radio/src/bluetooth.cpp index 0be1249d4..476aeba38 100644 --- a/radio/src/bluetooth.cpp +++ b/radio/src/bluetooth.cpp @@ -346,67 +346,44 @@ void bluetoothWakeup() if (now < bluetoothWakeupTime) return; - if (!usbPlugged()) { - bluetoothWakeupTime += 1000; // 10s - return; - } - bluetoothWakeupTime = now + 5; /* 50ms default */ - static uint8_t oldbluetooth = 255; - - if (oldbluetooth != bluetoothState) { - TRACE("State %d", bluetoothState); - oldbluetooth = bluetoothState; - } - if (g_eeGeneral.bluetoothMode == BLUETOOTH_OFF || (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && !IS_BLUETOOTH_TRAINER())) { - //TRACE_NOCRLF("A"); if (bluetoothState != BLUETOOTH_STATE_OFF) { - //TRACE_NOCRLF("Z"); bluetoothDone(); bluetoothState = BLUETOOTH_STATE_OFF; } bluetoothWakeupTime = now + 10; /* 100ms */ } else if (bluetoothState == BLUETOOTH_STATE_OFF) { - //TRACE_NOCRLF("B"); bluetoothInit(BLUETOOTH_FACTORY_BAUDRATE); bluetoothState = BLUETOOTH_STATE_FACTORY_BAUDRATE_INIT; } if (bluetoothState != BLUETOOTH_STATE_OFF) { - //TRACE_NOCRLF("C"); bluetoothWriteWakeup(); if (bluetoothIsWriting()) { - //TRACE_NOCRLF("D"); return; } } if (bluetoothState == BLUETOOTH_STATE_FACTORY_BAUDRATE_INIT) { - //TRACE_NOCRLF("F"); bluetoothWriteString("AT+BAUD4\r\n"); bluetoothState = BLUETOOTH_STATE_BAUDRATE_SENT; bluetoothWakeupTime = now + 10; /* 100ms */ } else if (bluetoothState == BLUETOOTH_STATE_BAUDRATE_SENT) { - //TRACE_NOCRLF("G"); bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE); bluetoothState = BLUETOOTH_STATE_BAUDRATE_INIT; bluetoothReadline(false); bluetoothWakeupTime = now + 10; /* 100ms */ } else if (bluetoothState == BLUETOOTH_STATE_CONNECTED) { - //TRACE_NOCRLF("H"); if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) { - //TRACE_NOCRLF("I"); bluetoothReceiveTrainer(); } else { - //TRACE_NOCRLF("J"); if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) { - TRACE_NOCRLF("S"); bluetoothSendTrainer(); bluetoothWakeupTime = now + 2; /* 20ms */ } @@ -414,13 +391,11 @@ void bluetoothWakeup() } } else { - //TRACE_NOCRLF("L"); char * line = bluetoothReadline(); if (line) { TRACE("BT %s", line); } if (bluetoothState == BLUETOOTH_STATE_BAUDRATE_INIT) { - //TRACE_NOCRLF("M"); char command[32]; char * cur = strAppend(command, BLUETOOTH_COMMAND_NAME); uint8_t len = ZLEN(g_eeGeneral.bluetoothName); @@ -433,7 +408,7 @@ void bluetoothWakeup() #if defined(PCBHORUS) cur = strAppend(cur, "Horus"); #else - cur = strAppend(cur, "taranis"); + cur = strAppend(cur, "taranis"); // TODO capital letter once allowed by BT module #endif } strAppend(cur, "\r\n"); @@ -441,12 +416,10 @@ void bluetoothWakeup() bluetoothState = BLUETOOTH_STATE_NAME_SENT; } else if (bluetoothState == BLUETOOTH_STATE_NAME_SENT && (!strncmp(line, "OK+", 3) || !strncmp(line, "Central:", 8) || !strncmp(line, "Peripheral:", 11))) { - //TRACE_NOCRLF("N"); bluetoothWriteString("AT+TXPW\r\n"); bluetoothState = BLUETOOTH_STATE_POWER_SENT; } else if (bluetoothState == BLUETOOTH_STATE_POWER_SENT && (!strncmp(line, "Central:", 8) || !strncmp(line, "Peripheral:", 11))) { - //TRACE_NOCRLF("O"); if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) bluetoothWriteString("AT+ROLE1\r\n"); else @@ -454,35 +427,28 @@ void bluetoothWakeup() bluetoothState = BLUETOOTH_STATE_ROLE_SENT; } else if (bluetoothState == BLUETOOTH_STATE_ROLE_SENT && (!strncmp(line, "Central:", 8) || !strncmp(line, "Peripheral:", 11))) { - //TRACE_NOCRLF("P"); bluetoothState = BLUETOOTH_STATE_IDLE; } else if (bluetoothState == BLUETOOTH_STATE_DISCOVER_REQUESTED) { - //TRACE_NOCRLF("Q"); bluetoothWriteString("AT+DISC?\r\n"); bluetoothState = BLUETOOTH_STATE_DISCOVER_SENT; } else if (bluetoothState == BLUETOOTH_STATE_DISCOVER_SENT && !strcmp(line, "OK+DISCS")) { - //TRACE_NOCRLF("R"); bluetoothState = BLUETOOTH_STATE_DISCOVER_START; } else if (bluetoothState == BLUETOOTH_STATE_DISCOVER_START && !strncmp(line, "OK+DISC:", 8)) { - //TRACE_NOCRLF("S"); strcpy(bluetoothDistantAddr, &line[8]); // TODO quick & dirty } else if (bluetoothState == BLUETOOTH_STATE_DISCOVER_START && !strcmp(line, "OK+DISCE")) { - //TRACE_NOCRLF("T"); bluetoothState = BLUETOOTH_STATE_DISCOVER_END; } else if (bluetoothState == BLUETOOTH_STATE_BIND_REQUESTED) { - //TRACE_NOCRLF("U"); char command[32]; strAppend(strAppend(strAppend(command, "AT+CON"), bluetoothDistantAddr), "\r\n"); bluetoothWriteString(command); bluetoothState = BLUETOOTH_STATE_CONNECT_SENT; } else if ((bluetoothState == BLUETOOTH_STATE_IDLE || bluetoothState == BLUETOOTH_STATE_DISCONNECTED || bluetoothState == BLUETOOTH_STATE_CONNECT_SENT) && !strncmp(line, "Connected:", 10)) { - //TRACE_NOCRLF("V"); strcpy(bluetoothDistantAddr, &line[10]); // TODO quick & dirty bluetoothState = BLUETOOTH_STATE_CONNECTED; if (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) { @@ -490,7 +456,6 @@ void bluetoothWakeup() } } else if (bluetoothState == BLUETOOTH_STATE_DISCONNECTED && !line) { - //TRACE_NOCRLF("W"); char command[32]; strAppend(strAppend(strAppend(command, "AT+CON"), bluetoothDistantAddr), "\r\n"); bluetoothWriteString(command); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 05a4924d2..bc68bd15f 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1218,9 +1218,6 @@ void menuModelSetup(event_t event) } break; - DEF - break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: @@ -1896,4 +1893,4 @@ void menuModelPinmap(event_t event) if (++pin > sentModuleChannels(g_moduleIdx)) break; } -} \ No newline at end of file +} From 02027f280d1287fb3031bfe696a7b8dd2457361c Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 19 Feb 2019 15:17:04 +0100 Subject: [PATCH 199/446] Fix WTF ! --- radio/src/gui/128x64/model_setup.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index bc68bd15f..0ad038ad4 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -231,17 +231,6 @@ enum MenuModelSetupItems { #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW -#define DEF case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NAME:\ - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NAME:\ - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_NAME:\ - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_NAME:\ - {\ - uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k);\ - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k);\ -\ - lcdDrawTextAlignedLeft(y, STR_RECEIVER);\ - lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, PXX2_LEN_RX_NAME, 0);\ - } #elif defined(PCBXLITES) #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) @@ -1218,6 +1207,19 @@ void menuModelSetup(event_t event) } break; + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NAME: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NAME: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_NAME: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_NAME: + { + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + + lcdDrawTextAlignedLeft(y, STR_RECEIVER); + lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, PXX2_LEN_RX_NAME, 0); + } + break; + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: From c117aeece67b245a4122662af4332350d0550b19 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Feb 2019 15:25:40 +0100 Subject: [PATCH 200/446] Unused strings removal --- radio/src/translations.cpp | 4 - radio/src/translations.h | 409 ++++++++++++++++++------------------- 2 files changed, 202 insertions(+), 211 deletions(-) diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 8ceb1ae24..5f24a62b5 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -491,7 +491,6 @@ const char STR_NIGHTLY_NOTSAFE[] = TR_NIGHTLY_NOTSAFE; const char STR_WRONG_SDCARDVERSION[] = TR_WRONG_SDCARDVERSION; const char STR_WRONG_PCBREV[] = TR_WRONG_PCBREV; const char STR_EMERGENCY_MODE[] = TR_EMERGENCY_MODE; -const char STR_PCBREV_ERROR[] = TR_PCBREV_ERROR; const char STR_NO_FAILSAFE[] = TR_NO_FAILSAFE; const char STR_KEYSTUCK[] = TR_KEYSTUCK; @@ -551,8 +550,6 @@ const char STR_GLOBAL_VAR[] = TR_GLOBAL_VAR; const char STR_OWN[] = TR_OWN; const char STR_ROTARY_ENCODER[] = TR_ROTARY_ENCODER; const char STR_DATE[] = TR_DATE; -const char STR_CHANNELS_MONITOR[] = TR_CHANNELS_MONITOR; -const char STR_MIXERS_MONITOR[] = TR_MIXERS_MONITOR; const char STR_PATH_TOO_LONG[] = TR_PATH_TOO_LONG; const char STR_VIEW_TEXT[] = TR_VIEW_TEXT; const char STR_FLASH_BOOTLOADER[] = TR_FLASH_BOOTLOADER; @@ -642,7 +639,6 @@ const char STR_BLCOLOR[] = TR_BLCOLOR; const char STR_USER_INTERFACE[] = TR_USER_INTERFACE; const char STR_THEME[] = TR_THEME; const char STR_SETUP[] = TR_SETUP; - const char STR_MAINVIEWX[] = TR_MAINVIEWX; const char STR_LAYOUT[] = TR_LAYOUT; const char STR_ADDMAINVIEW[] = TR_ADDMAINVIEW; const char STR_BACKGROUND_COLOR[] = TR_BACKGROUND_COLOR; diff --git a/radio/src/translations.h b/radio/src/translations.h index 5a8e19671..cc7630c4b 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -691,7 +691,6 @@ extern const char STR_NIGHTLY_NOTSAFE[]; extern const char STR_WRONG_SDCARDVERSION[]; extern const char STR_WRONG_PCBREV[]; extern const char STR_EMERGENCY_MODE[]; -extern const char STR_PCBREV_ERROR[]; extern const char STR_NO_FAILSAFE[]; extern const char STR_KEYSTUCK[]; @@ -751,8 +750,6 @@ extern const char STR_GLOBAL_VAR[]; extern const char STR_OWN[]; extern const char STR_ROTARY_ENCODER[]; extern const char STR_DATE[]; -extern const char STR_CHANNELS_MONITOR[]; -extern const char STR_MIXERS_MONITOR[]; extern const char STR_PATH_TOO_LONG[]; extern const char STR_VIEW_TEXT[]; extern const char STR_FLASH_BOOTLOADER[]; @@ -768,63 +765,66 @@ extern const char STR_CONFIRMRESET[]; extern const char STR_TOO_MANY_LUA_SCRIPTS[]; extern const char STR_BLCOLOR[]; - struct LanguagePack { - const char * id; - const char * name; - void (*playNumber)(getvalue_t number, uint8_t unit, uint8_t flags, uint8_t id); - void (*playDuration)(int seconds, uint8_t flags, uint8_t id); - }; +struct LanguagePack { + const char * id; + const char * name; + void (*playNumber)(getvalue_t number, uint8_t unit, uint8_t flags, uint8_t id); + void (*playDuration)(int seconds, uint8_t flags, uint8_t id); +}; - extern const LanguagePack * currentLanguagePack; - extern uint8_t currentLanguagePackIdx; +extern const LanguagePack * currentLanguagePack; +extern uint8_t currentLanguagePackIdx; + +extern const LanguagePack czLanguagePack; +extern const LanguagePack deLanguagePack; +extern const LanguagePack enLanguagePack; +extern const LanguagePack esLanguagePack; +extern const LanguagePack frLanguagePack; +extern const LanguagePack huLanguagePack; +extern const LanguagePack itLanguagePack; +extern const LanguagePack nlLanguagePack; +extern const LanguagePack plLanguagePack; +extern const LanguagePack ptLanguagePack; +extern const LanguagePack ruLanguagePack; +extern const LanguagePack seLanguagePack; +extern const LanguagePack skLanguagePack; +extern const LanguagePack * const languagePacks[]; + +#if defined(LANGUAGE_PACKS_DEFINITION) +const LanguagePack * const languagePacks[] = { + // alphabetical order + &czLanguagePack, + &deLanguagePack, + &enLanguagePack, + &esLanguagePack, + &frLanguagePack, + &huLanguagePack, + &itLanguagePack, + &nlLanguagePack, + &plLanguagePack, + &ptLanguagePack, + &ruLanguagePack, + &seLanguagePack, + &skLanguagePack, + NULL +}; +#endif - extern const LanguagePack czLanguagePack; - extern const LanguagePack deLanguagePack; - extern const LanguagePack enLanguagePack; - extern const LanguagePack esLanguagePack; - extern const LanguagePack frLanguagePack; - extern const LanguagePack huLanguagePack; - extern const LanguagePack itLanguagePack; - extern const LanguagePack nlLanguagePack; - extern const LanguagePack plLanguagePack; - extern const LanguagePack ptLanguagePack; - extern const LanguagePack ruLanguagePack; - extern const LanguagePack seLanguagePack; - extern const LanguagePack skLanguagePack; - extern const LanguagePack * const languagePacks[]; - #if defined(LANGUAGE_PACKS_DEFINITION) - const LanguagePack * const languagePacks[] = { - // alphabetical order - &czLanguagePack, - &deLanguagePack, - &enLanguagePack, - &esLanguagePack, - &frLanguagePack, - &huLanguagePack, - &itLanguagePack, - &nlLanguagePack, - &plLanguagePack, - &ptLanguagePack, - &ruLanguagePack, - &seLanguagePack, - &skLanguagePack, - NULL - }; - #endif #if defined(SIMU) #define LANGUAGE_PACK_DECLARE(lng, name) const LanguagePack lng ## LanguagePack = { #lng, name, lng ## _ ## playNumber, lng ## _ ## playDuration } #else #define LANGUAGE_PACK_DECLARE(lng, name) extern const LanguagePack lng ## LanguagePack = { #lng, name, lng ## _ ## playNumber, lng ## _ ## playDuration } #endif - #define LANGUAGE_PACK_DECLARE_DEFAULT(lng, name) LANGUAGE_PACK_DECLARE(lng, name); const LanguagePack * currentLanguagePack = & lng ## LanguagePack; uint8_t currentLanguagePackIdx - inline PLAY_FUNCTION(playNumber, getvalue_t number, uint8_t unit, uint8_t flags) { currentLanguagePack->playNumber(number, unit, flags, id); } - inline PLAY_FUNCTION(playDuration, int seconds, uint8_t flags) { currentLanguagePack->playDuration(seconds, flags, id); } - extern const char STR_MODELNAME[]; - extern const char STR_PHASENAME[]; - extern const char STR_MIXNAME[]; - extern const char STR_INPUTNAME[]; - extern const char STR_EXPONAME[]; +#define LANGUAGE_PACK_DECLARE_DEFAULT(lng, name) LANGUAGE_PACK_DECLARE(lng, name); const LanguagePack * currentLanguagePack = & lng ## LanguagePack; uint8_t currentLanguagePackIdx +inline PLAY_FUNCTION(playNumber, getvalue_t number, uint8_t unit, uint8_t flags) { currentLanguagePack->playNumber(number, unit, flags, id); } +inline PLAY_FUNCTION(playDuration, int seconds, uint8_t flags) { currentLanguagePack->playDuration(seconds, flags, id); } + +extern const char STR_MODELNAME[]; +extern const char STR_PHASENAME[]; +extern const char STR_MIXNAME[]; +extern const char STR_INPUTNAME[]; +extern const char STR_EXPONAME[]; #if defined(COLORLCD) #define TR_PHASES_HEADERS { TR_PHASES_HEADERS_NAME, TR_PHASES_HEADERS_SW, TR_PHASES_HEADERS_RUD_TRIM, TR_PHASES_HEADERS_ELE_TRIM, TR_PHASES_HEADERS_THT_TRIM, TR_PHASES_HEADERS_AIL_TRIM, TR_PHASES_HEADERS_CH5_TRIM, TR_PHASES_HEADERS_CH6_TRIM, TR_PHASES_HEADERS_FAD_IN, TR_PHASES_HEADERS_FAD_OUT } @@ -845,123 +845,122 @@ extern const char STR_BLCOLOR[]; #endif extern const char STR_TRAINER[]; - extern const char STR_MODULE_BIND[]; - extern const char STR_BINDING_1_8_TELEM_ON[]; - extern const char STR_BINDING_1_8_TELEM_OFF[]; - extern const char STR_BINDING_9_16_TELEM_ON[]; - extern const char STR_BINDING_9_16_TELEM_OFF[]; - extern const char STR_CHANNELRANGE[]; - extern const char STR_ANTENNASELECTION[]; - extern const char STR_ANTENNACONFIRM1[]; - extern const char STR_ANTENNACONFIRM2[]; - extern const char STR_R9MFLEXWARN1[]; - extern const char STR_R9MFLEXWARN2[]; - extern const char STR_SET[]; - extern const char STR_PREFLIGHT[]; - extern const char STR_CHECKLIST[]; - extern const char STR_VIEW_NOTES[]; - extern const char STR_MODEL_SELECT[]; - extern const char STR_RESET_SUBMENU[]; - extern const char STR_LOWALARM[]; - extern const char STR_CRITICALALARM[]; - extern const char STR_RSSIALARM_WARN[]; - extern const char STR_NO_RSSIALARM[]; - extern const char STR_DISABLE_ALARM[]; - extern const char STR_TELEMETRY_TYPE[]; - extern const char STR_TELEMETRY_SENSORS[]; - extern const char STR_VALUE[]; - extern const char STR_TOPLCDTIMER[]; - extern const char STR_UNIT[] ; - extern const char STR_TELEMETRY_NEWSENSOR[]; - extern const char STR_ID[]; - extern const char STR_PRECISION[]; - extern const char STR_RATIO[]; - extern const char STR_FORMULA[]; - extern const char STR_CELLINDEX[]; - extern const char STR_LOGS[]; - extern const char STR_OPTIONS[]; - extern const char STR_ALTSENSOR[]; - extern const char STR_CELLSENSOR[]; - extern const char STR_GPSSENSOR[]; - extern const char STR_CURRENTSENSOR[]; - extern const char STR_AUTOOFFSET[]; - extern const char STR_ONLYPOSITIVE[]; - extern const char STR_FILTER[]; - extern const char STR_TELEMETRYFULL[]; - extern const char STR_SERVOS_OK[]; - extern const char STR_SERVOS_KO[]; - extern const char STR_INVERTED_SERIAL[]; - extern const char STR_IGNORE_INSTANCE[]; - extern const char STR_DISCOVER_SENSORS[]; - extern const char STR_STOP_DISCOVER_SENSORS[]; - extern const char STR_DELETE_ALL_SENSORS[]; - extern const char STR_CONFIRMDELETE[]; - extern const char STR_SELECT_WIDGET[]; - extern const char STR_REMOVE_WIDGET[]; - extern const char STR_WIDGET_SETTINGS[]; - extern const char STR_REMOVE_SCREEN[]; - extern const char STR_SETUP_WIDGETS[]; - extern const char STR_USER_INTERFACE[]; - extern const char STR_THEME[]; - extern const char STR_SETUP[]; - extern const char STR_MAINVIEWX[]; - extern const char STR_LAYOUT[]; - extern const char STR_ADDMAINVIEW[]; - extern const char STR_BACKGROUND_COLOR[]; - extern const char STR_MAIN_COLOR[]; - extern const char STR_TEXT_VIEWER[]; - extern const char STR_MULTI_RFPOWER[]; +extern const char STR_MODULE_BIND[]; +extern const char STR_BINDING_1_8_TELEM_ON[]; +extern const char STR_BINDING_1_8_TELEM_OFF[]; +extern const char STR_BINDING_9_16_TELEM_ON[]; +extern const char STR_BINDING_9_16_TELEM_OFF[]; +extern const char STR_CHANNELRANGE[]; +extern const char STR_ANTENNASELECTION[]; +extern const char STR_ANTENNACONFIRM1[]; +extern const char STR_ANTENNACONFIRM2[]; +extern const char STR_R9MFLEXWARN1[]; +extern const char STR_R9MFLEXWARN2[]; +extern const char STR_SET[]; +extern const char STR_PREFLIGHT[]; +extern const char STR_CHECKLIST[]; +extern const char STR_VIEW_NOTES[]; +extern const char STR_MODEL_SELECT[]; +extern const char STR_RESET_SUBMENU[]; +extern const char STR_LOWALARM[]; +extern const char STR_CRITICALALARM[]; +extern const char STR_RSSIALARM_WARN[]; +extern const char STR_NO_RSSIALARM[]; +extern const char STR_DISABLE_ALARM[]; +extern const char STR_TELEMETRY_TYPE[]; +extern const char STR_TELEMETRY_SENSORS[]; +extern const char STR_VALUE[]; +extern const char STR_TOPLCDTIMER[]; +extern const char STR_UNIT[] ; +extern const char STR_TELEMETRY_NEWSENSOR[]; +extern const char STR_ID[]; +extern const char STR_PRECISION[]; +extern const char STR_RATIO[]; +extern const char STR_FORMULA[]; +extern const char STR_CELLINDEX[]; +extern const char STR_LOGS[]; +extern const char STR_OPTIONS[]; +extern const char STR_ALTSENSOR[]; +extern const char STR_CELLSENSOR[]; +extern const char STR_GPSSENSOR[]; +extern const char STR_CURRENTSENSOR[]; +extern const char STR_AUTOOFFSET[]; +extern const char STR_ONLYPOSITIVE[]; +extern const char STR_FILTER[]; +extern const char STR_TELEMETRYFULL[]; +extern const char STR_SERVOS_OK[]; +extern const char STR_SERVOS_KO[]; +extern const char STR_INVERTED_SERIAL[]; +extern const char STR_IGNORE_INSTANCE[]; +extern const char STR_DISCOVER_SENSORS[]; +extern const char STR_STOP_DISCOVER_SENSORS[]; +extern const char STR_DELETE_ALL_SENSORS[]; +extern const char STR_CONFIRMDELETE[]; +extern const char STR_SELECT_WIDGET[]; +extern const char STR_REMOVE_WIDGET[]; +extern const char STR_WIDGET_SETTINGS[]; +extern const char STR_REMOVE_SCREEN[]; +extern const char STR_SETUP_WIDGETS[]; +extern const char STR_USER_INTERFACE[]; +extern const char STR_THEME[]; +extern const char STR_SETUP[]; +extern const char STR_LAYOUT[]; +extern const char STR_ADDMAINVIEW[]; +extern const char STR_BACKGROUND_COLOR[]; +extern const char STR_MAIN_COLOR[]; +extern const char STR_TEXT_VIEWER[]; +extern const char STR_MULTI_RFPOWER[]; - extern const char STR_BYTES[]; - extern const char STR_ANTENNAPROBLEM[]; - extern const char STR_MODULE[]; - extern const char STR_ENABLE_POPUP[]; - extern const char STR_DISABLE_POPUP[]; - extern const char STR_POPUP[]; - extern const char STR_MIN[]; - extern const char STR_MAX[]; - extern const char STR_CURVE_PRESET[]; - extern const char STR_PRESET[]; - extern const char STR_MIRROR[]; - extern const char STR_CLEAR[]; - extern const char STR_RESET[]; - extern const char STR_COUNT[]; - extern const char STR_PT[]; - extern const char STR_PTS[]; - extern const char STR_SMOOTH[]; - extern const char STR_COPY_STICKS_TO_OFS[]; - extern const char STR_COPY_TRIMS_TO_OFS[]; - extern const char STR_INCDEC[]; - extern const char STR_GLOBALVAR[]; - extern const char STR_MIXSOURCE[]; - extern const char STR_CONSTANT[]; - extern const char STR_TOP_BAR[]; - extern const char STR_ALTITUDE[]; - extern const char STR_SCALE[]; - extern const char STR_VIEW_CHANNELS[]; - extern const char STR_POTWARNING[]; - extern const char STR_UART3MODE[]; - extern const char STR_THROTTLE_LABEL[]; - extern const char STR_SCRIPT[]; - extern const char STR_INPUTS[]; - extern const char STR_OUTPUTS[]; - extern const char STR_MENU_INPUTS[]; - extern const char STR_MENU_LUA[]; - extern const char STR_MENU_STICKS[]; - extern const char STR_MENU_POTS[]; - extern const char STR_MENU_MAX[]; - extern const char STR_MENU_HELI[]; - extern const char STR_MENU_TRIMS[]; - extern const char STR_MENU_SWITCHES[]; - extern const char STR_MENU_LOGICAL_SWITCHES[]; - extern const char STR_MENU_TRAINER[]; - extern const char STR_MENU_CHANNELS[]; - extern const char STR_MENU_GVARS[]; - extern const char STR_MENU_TELEMETRY[]; - extern const char STR_MENU_DISPLAY[]; - extern const char STR_MENU_OTHER[]; - extern const char STR_MENU_INVERT[]; - extern const char STR_JITTER_FILTER[]; +extern const char STR_BYTES[]; +extern const char STR_ANTENNAPROBLEM[]; +extern const char STR_MODULE[]; +extern const char STR_ENABLE_POPUP[]; +extern const char STR_DISABLE_POPUP[]; +extern const char STR_POPUP[]; +extern const char STR_MIN[]; +extern const char STR_MAX[]; +extern const char STR_CURVE_PRESET[]; +extern const char STR_PRESET[]; +extern const char STR_MIRROR[]; +extern const char STR_CLEAR[]; +extern const char STR_RESET[]; +extern const char STR_COUNT[]; +extern const char STR_PT[]; +extern const char STR_PTS[]; +extern const char STR_SMOOTH[]; +extern const char STR_COPY_STICKS_TO_OFS[]; +extern const char STR_COPY_TRIMS_TO_OFS[]; +extern const char STR_INCDEC[]; +extern const char STR_GLOBALVAR[]; +extern const char STR_MIXSOURCE[]; +extern const char STR_CONSTANT[]; +extern const char STR_TOP_BAR[]; +extern const char STR_ALTITUDE[]; +extern const char STR_SCALE[]; +extern const char STR_VIEW_CHANNELS[]; +extern const char STR_POTWARNING[]; +extern const char STR_UART3MODE[]; +extern const char STR_THROTTLE_LABEL[]; +extern const char STR_SCRIPT[]; +extern const char STR_INPUTS[]; +extern const char STR_OUTPUTS[]; +extern const char STR_MENU_INPUTS[]; +extern const char STR_MENU_LUA[]; +extern const char STR_MENU_STICKS[]; +extern const char STR_MENU_POTS[]; +extern const char STR_MENU_MAX[]; +extern const char STR_MENU_HELI[]; +extern const char STR_MENU_TRIMS[]; +extern const char STR_MENU_SWITCHES[]; +extern const char STR_MENU_LOGICAL_SWITCHES[]; +extern const char STR_MENU_TRAINER[]; +extern const char STR_MENU_CHANNELS[]; +extern const char STR_MENU_GVARS[]; +extern const char STR_MENU_TELEMETRY[]; +extern const char STR_MENU_DISPLAY[]; +extern const char STR_MENU_OTHER[]; +extern const char STR_MENU_INVERT[]; +extern const char STR_JITTER_FILTER[]; #if MENUS_LOCK == 1 extern const char STR_UNLOCKED[]; @@ -970,57 +969,53 @@ extern const char STR_BLCOLOR[]; #if defined(PCBTARANIS) || defined(DSM2) extern const char STR_MODULE_RANGE[]; -extern const char STR_DEL_BUTTON[]; + extern const char STR_DEL_BUTTON[]; #endif +extern const char STR_ABOUTUS[]; +extern const char STR_ABOUT_OPENTX_1[]; +extern const char STR_ABOUT_OPENTX_2[]; +extern const char STR_ABOUT_OPENTX_3[]; +extern const char STR_ABOUT_OPENTX_4[]; +extern const char STR_ABOUT_OPENTX_5[]; - extern const char STR_ABOUTUS[]; - extern const char STR_ABOUT_OPENTX_1[]; - extern const char STR_ABOUT_OPENTX_2[]; - extern const char STR_ABOUT_OPENTX_3[]; - extern const char STR_ABOUT_OPENTX_4[]; - extern const char STR_ABOUT_OPENTX_5[]; +extern const char STR_ABOUT_BERTRAND_1[]; +extern const char STR_ABOUT_BERTRAND_2[]; +extern const char STR_ABOUT_BERTRAND_3[]; - extern const char STR_ABOUT_BERTRAND_1[]; - extern const char STR_ABOUT_BERTRAND_2[]; - extern const char STR_ABOUT_BERTRAND_3[]; +extern const char STR_ABOUT_MIKE_1[]; +extern const char STR_ABOUT_MIKE_2[]; +extern const char STR_ABOUT_MIKE_3[]; +extern const char STR_ABOUT_MIKE_4[]; - extern const char STR_ABOUT_MIKE_1[]; - extern const char STR_ABOUT_MIKE_2[]; - extern const char STR_ABOUT_MIKE_3[]; - extern const char STR_ABOUT_MIKE_4[]; +extern const char STR_ABOUT_ROMOLO_1[]; +extern const char STR_ABOUT_ROMOLO_2[]; +extern const char STR_ABOUT_ROMOLO_3[]; - extern const char STR_ABOUT_ROMOLO_1[]; - extern const char STR_ABOUT_ROMOLO_2[]; - extern const char STR_ABOUT_ROMOLO_3[]; +extern const char STR_ABOUT_ANDRE_1[]; +extern const char STR_ABOUT_ANDRE_2[]; +extern const char STR_ABOUT_ANDRE_3[]; - extern const char STR_ABOUT_ANDRE_1[]; - extern const char STR_ABOUT_ANDRE_2[]; - extern const char STR_ABOUT_ANDRE_3[]; +extern const char STR_ABOUT_ROB_1[]; +extern const char STR_ABOUT_ROB_2[]; - extern const char STR_ABOUT_ROB_1[]; - extern const char STR_ABOUT_ROB_2[]; +extern const char STR_ABOUT_MARTIN_1[]; +extern const char STR_ABOUT_MARTIN_2[]; - extern const char STR_ABOUT_MARTIN_1[]; - extern const char STR_ABOUT_MARTIN_2[]; +extern const char STR_ABOUT_KJELL_1[]; +extern const char STR_ABOUT_KJELL_2[]; +extern const char STR_ABOUT_KJELL_3[]; +extern const char STR_ABOUT_KJELL_4[]; - extern const char STR_ABOUT_KJELL_1[]; - extern const char STR_ABOUT_KJELL_2[]; - extern const char STR_ABOUT_KJELL_3[]; - extern const char STR_ABOUT_KJELL_4[]; +extern const char STR_ABOUT_HARDWARE_1[]; +extern const char STR_ABOUT_HARDWARE_2[]; +extern const char STR_ABOUT_HARDWARE_3[]; - extern const char STR_ABOUT_HARDWARE_1[]; - extern const char STR_ABOUT_HARDWARE_2[]; - extern const char STR_ABOUT_HARDWARE_3[]; +extern const char STR_ABOUT_PARENTS_1[]; +extern const char STR_ABOUT_PARENTS_2[]; +extern const char STR_ABOUT_PARENTS_3[]; +extern const char STR_ABOUT_PARENTS_4[]; - extern const char STR_ABOUT_PARENTS_1[]; - extern const char STR_ABOUT_PARENTS_2[]; - extern const char STR_ABOUT_PARENTS_3[]; - extern const char STR_ABOUT_PARENTS_4[]; - -#define CHR_SHORT TR_CHR_SHORT -#define CHR_LONG TR_CHR_LONG -#define CHR_TOGGLE TR_CHR_TOGGLE #define CHR_HOUR TR_CHR_HOUR #define CHR_INPUT TR_CHR_INPUT From c03ec508c3aaf3cd37480659a3875f89643d6e50 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Feb 2019 08:45:00 +0100 Subject: [PATCH 201/446] Used strings back! --- radio/src/translations.cpp | 2 ++ radio/src/translations.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 5f24a62b5..15af4d5d8 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -550,6 +550,8 @@ const char STR_GLOBAL_VAR[] = TR_GLOBAL_VAR; const char STR_OWN[] = TR_OWN; const char STR_ROTARY_ENCODER[] = TR_ROTARY_ENCODER; const char STR_DATE[] = TR_DATE; +const char STR_CHANNELS_MONITOR[] = TR_CHANNELS_MONITOR; +const char STR_MIXERS_MONITOR[] = TR_MIXERS_MONITOR; const char STR_PATH_TOO_LONG[] = TR_PATH_TOO_LONG; const char STR_VIEW_TEXT[] = TR_VIEW_TEXT; const char STR_FLASH_BOOTLOADER[] = TR_FLASH_BOOTLOADER; diff --git a/radio/src/translations.h b/radio/src/translations.h index cc7630c4b..77db494b2 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -750,6 +750,8 @@ extern const char STR_GLOBAL_VAR[]; extern const char STR_OWN[]; extern const char STR_ROTARY_ENCODER[]; extern const char STR_DATE[]; +extern const char STR_CHANNELS_MONITOR[]; +extern const char STR_MIXERS_MONITOR[]; extern const char STR_PATH_TOO_LONG[]; extern const char STR_VIEW_TEXT[]; extern const char STR_FLASH_BOOTLOADER[]; From eb453293f543a2ef41c6a74fb634e67648343f9a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Feb 2019 12:10:46 +0100 Subject: [PATCH 202/446] Fix register in Model Setup --- radio/src/gui/128x64/model_setup.cpp | 3 +- .../src/gui/common/stdlcd/radio_sdmanager.cpp | 2 +- radio/src/gui/navigation/navigation_xlite.cpp | 133 ++---------------- 3 files changed, 17 insertions(+), 121 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 0ad038ad4..62c39c18d 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1161,8 +1161,9 @@ void menuModelSetup(event_t event) lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition == 1 ? attr : 0)); if (attr) { if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) { - if (menuHorizontalPosition == 1 && reusableBuffer.modelSetup.pxx2.registerStep < REGISTER_RX_NAME_SELECTED) { + if (menuHorizontalPosition == 1 && event == EVT_KEY_FIRST(KEY_ENTER)) { moduleSettings[moduleIdx].mode = MODULE_MODE_REGISTER; + reusableBuffer.modelSetup.pxx2.registerStep = REGISTER_START; reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition = 0; reusableBuffer.modelSetup.pxx2.registerPopupHorizontalPosition = 0; reusableBuffer.modelSetup.pxx2.registerPopupEditMode = 0; diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index 1807b8ab3..85699e77a 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -171,7 +171,7 @@ void menuRadioSdManager(event_t _event) Card_state = SD_ST_DATA; #endif audioQueue.stopSD(); - if(sdCardFormat()) { + if (sdCardFormat()) { f_chdir("/"); REFRESH_FILES(); } diff --git a/radio/src/gui/navigation/navigation_xlite.cpp b/radio/src/gui/navigation/navigation_xlite.cpp index e365f8e77..327c3d209 100644 --- a/radio/src/gui/navigation/navigation_xlite.cpp +++ b/radio/src/gui/navigation/navigation_xlite.cpp @@ -172,7 +172,7 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla } } - if (!READ_ONLY() && i_min==0 && i_max==1 && (event==EVT_KEY_BREAK(KEY_ENTER) || IS_ROTARY_BREAK(event))) { + if (!READ_ONLY() && i_min==0 && i_max==1 && (event==EVT_KEY_BREAK(KEY_ENTER))) { s_editMode = 0; newval = !val; } @@ -185,7 +185,7 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla #if defined(AUTOSOURCE) if (i_flags & INCDEC_SOURCE) { - if (s_editMode>0) { + if (s_editMode > 0) { int8_t source = GET_MOVED_SOURCE(i_min, i_max); if (source) { newval = source; @@ -203,7 +203,7 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla #endif if (newval != val) { - if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && (newval==0 || newval==-100 || newval==+100) && !IS_ROTARY_EVENT(event)) { + if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && (newval==0 || newval==-100 || newval==+100)) { pauseEvents(event); // delay before auto-repeat continues } AUDIO_KEY_PRESS(); @@ -321,25 +321,6 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t int8_t cc = curr; switch (event) { -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_BREAK: - if (s_editMode < 0 && maxrow > 0) { - s_editMode = 0; - // TODO ? l_posVert = (horTab && horTab[1]==0xff) ? 2 : 1; - l_posHorz = 0; - } - else { - s_editMode = -1; - } - event = 0; - break; -#endif - -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_LEFT: - if (s_editMode >= 0) - break; -#endif case EVT_KEY_FIRST(KEY_LEFT): if (curr > 0) cc = curr - 1; @@ -347,11 +328,6 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t cc = menuTabSize-1; break; -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_RIGHT: - if (s_editMode >= 0) - break; -#endif case EVT_KEY_FIRST(KEY_RIGHT): if (curr < (menuTabSize-1)) cc = curr + 1; @@ -363,11 +339,6 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t if (cc != curr) { chainMenu(menuTab[cc]); } - -#if defined(ROTARY_ENCODER_NAVIGATION) - if (IS_ROTARY_ENCODER_NAVIGATION_ENABLE() && s_editMode < 0) - attr = INVERS|BLINK; -#endif } menuCalibrationState = 0; @@ -380,45 +351,17 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t menuEntryTime = get_tmr10ms(); l_posVert = 0; l_posHorz = POS_HORZ_INIT(l_posVert); -#if defined(ROTARY_ENCODER_NAVIGATION) - if (menuTab) { - s_editMode = EDIT_MODE_INIT; - break; - } - // no break -#else s_editMode = EDIT_MODE_INIT; break; -#endif - -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ENTRY_UP: - s_editMode = 0; - break; - - case EVT_ROTARY_BREAK: - if (s_editMode > 1) break; -#endif case EVT_KEY_FIRST(KEY_ENTER): - if (!menuTab || l_posVert>0) { + if (!menuTab || l_posVert > 0) { if (READ_ONLY_UNLOCKED()) { - s_editMode = (s_editMode<=0); + s_editMode = (s_editMode <= 0); } } break; -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_LONG: - if (s_editMode > 1) break; - killEvents(event); - if (l_posVert != 0) { - l_posVert = 0; - s_editMode = EDIT_MODE_INIT; - break; - } - // no break -#endif case EVT_KEY_LONG(KEY_EXIT): s_editMode = 0; // TODO needed? we call ENTRY_UP after which does the same popMenu(); @@ -426,17 +369,12 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t case EVT_KEY_BREAK(KEY_EXIT): AUDIO_KEY_PRESS(); -#if defined(ROTARY_ENCODER_NAVIGATION) - if (s_editMode == 0) - s_editMode = EDIT_MODE_INIT; - else -#endif - if (s_editMode>0) { + if (s_editMode > 0) { s_editMode = 0; break; } - if (l_posVert==0 || !menuTab) { + if (l_posVert == 0 || !menuTab) { popMenu(); // beeps itself } else { @@ -446,43 +384,23 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t break; case EVT_KEY_REPT(KEY_RIGHT): //inc - if (l_posHorz==maxcol) break; + if (l_posHorz == maxcol) break; // no break case EVT_KEY_FIRST(KEY_RIGHT)://inc - if (!horTab || s_editMode>0) break; - -#if defined(ROTARY_ENCODER_NAVIGATION) - CASE_EVT_ROTARY_RIGHT - if (s_editMode != 0) break; - if (l_posHorz < maxcol) { - l_posHorz++; - break; - } - else { - l_posHorz = 0; - if (!IS_ROTARY_RIGHT(event)) - break; - } -#else + if (!horTab || s_editMode > 0) break; INC(l_posHorz, 0, maxcol); break; -#endif case EVT_KEY_REPT(KEY_DOWN): - if (!IS_ROTARY_RIGHT(event) && l_posVert==maxrow) break; + if (l_posVert == maxrow) break; // no break case EVT_KEY_FIRST(KEY_DOWN): - if (s_editMode>0) break; + if (s_editMode > 0) break; do { INC(l_posVert, 0, maxrow); } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); - -#if defined(ROTARY_ENCODER_NAVIGATION) - s_editMode = 0; // if we go down, we must be in this mode -#endif - l_posHorz = min(l_posHorz, MAXCOL(l_posVert)); break; @@ -491,41 +409,18 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t // no break case EVT_KEY_FIRST(KEY_LEFT)://dec - if (!horTab || s_editMode>0) break; - -#if defined(ROTARY_ENCODER_NAVIGATION) - CASE_EVT_ROTARY_LEFT - if (s_editMode != 0) break; - if (l_posHorz > 0) { - l_posHorz--; - break; - } - else if (IS_ROTARY_LEFT(event) && s_editMode == 0) { - l_posHorz = 0xff; - } - else { - l_posHorz = maxcol; - break; - } -#else + if (!horTab || s_editMode > 0) break; DEC(l_posHorz, 0, maxcol); break; -#endif case EVT_KEY_REPT(KEY_UP): - if (!IS_ROTARY_LEFT(event) && l_posVert==0) break; + if (l_posVert == 0) break; // no break case EVT_KEY_FIRST(KEY_UP): - if (s_editMode>0) break; - + if (s_editMode > 0) break; do { DEC(l_posVert, 0, maxrow); } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); - -#if defined(ROTARY_ENCODER_NAVIGATION) - s_editMode = 0; // if we go up, we must be in this mode -#endif - l_posHorz = min((uint8_t)l_posHorz, MAXCOL(l_posVert)); break; } From 655966fba264fa16c07c7c7b6a2080dc82835c13 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Feb 2019 14:59:38 +0100 Subject: [PATCH 203/446] Flash internal module --- radio/src/dataconstants.h | 2 + .../src/gui/common/stdlcd/radio_sdmanager.cpp | 9 +- radio/src/io/frsky_device_firmware_update.cpp | 320 ++++++++++++++++++ radio/src/io/frsky_sport.cpp | 315 +---------------- radio/src/io/io_arm.h | 44 ++- radio/src/targets/common/arm/CMakeLists.txt | 1 + .../arm/stm32/intmodule_serial_driver.cpp | 49 +-- radio/src/targets/horus/pulses_driver.cpp | 4 +- radio/src/targets/taranis/board.h | 17 +- radio/src/targets/taranis/hal.h | 2 - .../taranis/intmodule_pulses_driver.cpp | 2 +- radio/src/targets/taranis/pulses_driver.cpp | 16 +- radio/src/telemetry/frsky.cpp | 2 +- 13 files changed, 422 insertions(+), 361 deletions(-) create mode 100644 radio/src/io/frsky_device_firmware_update.cpp diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 77c7bdbd4..beb637a0f 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -21,6 +21,8 @@ #ifndef _DATACONSTANTS_H_ #define _DATACONSTANTS_H_ +#include "board.h" + #define NUM_STICKS 4 #if defined(EXPORT) diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index 85699e77a..5e2d753fc 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -141,16 +141,19 @@ void onSdManagerMenu(const char * result) } else if (result == STR_FLASH_INTERNAL_MODULE) { getSelectionFullPath(lfn); - sportFlashDevice(INTERNAL_MODULE, lfn); + DeviceFirmwareUpdate device(INTERNAL_MODULE); + device.flashFile(lfn); } else if (result == STR_FLASH_EXTERNAL_MODULE) { // needed on X-Lite (as the R9M needs 2S while the external device flashing port only provides 5V) getSelectionFullPath(lfn); - sportFlashDevice(EXTERNAL_MODULE, lfn); + DeviceFirmwareUpdate device(EXTERNAL_MODULE); + device.flashFile(lfn); } else if (result == STR_FLASH_EXTERNAL_DEVICE) { getSelectionFullPath(lfn); - sportFlashDevice(FLASHING_MODULE, lfn); + DeviceFirmwareUpdate device(FLASHING_MODULE); + device.flashFile(lfn); } #endif #if defined(LUA) diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp new file mode 100644 index 000000000..a4ba039c0 --- /dev/null +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -0,0 +1,320 @@ +/* + * 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" + +#define PRIM_REQ_POWERUP 0 +#define PRIM_REQ_VERSION 1 +#define PRIM_CMD_DOWNLOAD 3 +#define PRIM_DATA_WORD 4 +#define PRIM_DATA_EOF 5 + +#define PRIM_ACK_POWERUP 0x80 +#define PRIM_ACK_VERSION 0x81 +#define PRIM_REQ_DATA_ADDR 0x82 +#define PRIM_END_DOWNLOAD 0x83 +#define PRIM_DATA_CRC_ERR 0x84 + +void DeviceFirmwareUpdate::processFrame() +{ + if (frame[1] == 0x5E && frame[2] == 0x50) { + switch (frame[3]) { + case PRIM_ACK_POWERUP : + if (state == SPORT_POWERUP_REQ) { + state = SPORT_POWERUP_ACK; + } + break; + + case PRIM_ACK_VERSION: + if (state == SPORT_VERSION_REQ) { + state = SPORT_VERSION_ACK; + // here we could display the version + } + break; + + case PRIM_REQ_DATA_ADDR: + if (state == SPORT_DATA_TRANSFER) { + address = *((uint32_t *)(&frame[4])); + state = SPORT_DATA_REQ; + } + break; + + case PRIM_END_DOWNLOAD : + state = SPORT_COMPLETE ; + break; + + case PRIM_DATA_CRC_ERR : + state = SPORT_FAIL ; + break; + } + } +} + +void DeviceFirmwareUpdate::startup() +{ + switch(module) { + case INTERNAL_MODULE: +#if defined(INTMODULE_USART) + return intmoduleSerialStart(57600); +#endif + + default: + return telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); + } + +#if defined(PCBTARANIS) || defined(PCBHORUS) + if (module == INTERNAL_MODULE) + INTERNAL_MODULE_ON(); + else if (module == EXTERNAL_MODULE) + EXTERNAL_MODULE_ON(); + else + SPORT_UPDATE_POWER_ON(); +#endif + + watchdogSuspend(50); + RTOS_WAIT_MS(50); +} + +bool DeviceFirmwareUpdate::readByte(uint8_t & byte) +{ + switch(module) { + case INTERNAL_MODULE: +#if defined(INTMODULE_USART) + return intmoduleFifo.pop(byte); +#endif + + default: + return telemetryGetByte(&byte); + } +} + +bool DeviceFirmwareUpdate::waitState(State state, uint32_t timeout) +{ +#if defined(SIMU) + UNUSED(state); + UNUSED(timeout); + return true; +#else + watchdogSuspend(timeout / 10); + + uint8_t len = 0; + while (len < 10) { + uint32_t elapsed = 0; + while (!intmoduleFifo.pop(frame[len])) { + RTOS_WAIT_MS(1); + if (elapsed++ >= timeout) { + return false; + } + } + if (len > 0 || frame[len] == 0x7E) { + ++len; + } + } + + processFrame(); + + return state == state; +#endif +} + +void DeviceFirmwareUpdate::startFrame(uint8_t command) +{ + frame[0] = 0x50; + frame[1] = command; + memset(&frame[2], 0, 6); +} + +// TODO merge this function +void DeviceFirmwareUpdate::sendFrame() +{ + uint8_t * ptr = outputTelemetryBuffer; + *ptr++ = 0x7E; + *ptr++ = 0xFF; + frame[7] = crc16(frame, 7); + for (int i=0; i<8; i++) { + if (frame[i] == 0x7E || frame[i] == 0x7D) { + *ptr++ = 0x7D; + *ptr++ = 0x20 ^ frame[i]; + } + else { + *ptr++ = frame[i]; + } + } + + switch(module) { + case INTERNAL_MODULE: +#if defined(INTMODULE_USART) + return intmoduleSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer); +#endif + + default: + return sportSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer); + } +} + +const char * DeviceFirmwareUpdate::sendPowerOn() +{ + waitState(SPORT_IDLE, 20); // Clear the fifo + state = SPORT_POWERUP_REQ; + for (int i=0; i<10; i++) { + // max 10 attempts + startFrame(PRIM_REQ_POWERUP); + sendFrame(); + if (waitState(SPORT_POWERUP_ACK, 100)) + return nullptr; + } + + if (telemetryProtocol != PROTOCOL_TELEMETRY_FRSKY_SPORT) { + return TR("Not responding", "Not S.Port 1"); + } + + if (!IS_FRSKY_SPORT_PROTOCOL()) { + return TR("Not responding", "Not S.Port 2"); + } +#if defined(PCBX7) + if (IS_PCBREV_40()) { + return TR("Bottom pin no resp", "Bottom pin not responding"); + } + else { + return TR("Module pin no resp", "Module pin not responding"); + } +#else + return TR("Not responding", "Module not responding"); +#endif +} + +const char * DeviceFirmwareUpdate::sendReqVersion() +{ + waitState(SPORT_IDLE, 20); // Clear the fifo + state = SPORT_VERSION_REQ; + for (int i=0; i<10; i++) { + // max 10 attempts + startFrame(PRIM_REQ_VERSION) ; + sendFrame(); + if (waitState(SPORT_VERSION_ACK, 100)) + return nullptr; + } + return "Version request failed"; +} + +const char * DeviceFirmwareUpdate::uploadFile(const char *filename) +{ + FIL file; + uint32_t buffer[1024 / sizeof(uint32_t)]; + UINT count; + + if (f_open(&file, filename, FA_READ) != FR_OK) { + return "Error opening file"; + } + + waitState(SPORT_IDLE, 200); // Clear the fifo + state = SPORT_DATA_TRANSFER; + startFrame(PRIM_CMD_DOWNLOAD); + sendFrame(); + + while (1) { + if (f_read(&file, buffer, 1024, &count) != FR_OK) { + f_close(&file); + return "Error reading file"; + } + + count >>= 2; + + for (UINT i=0; i> 2; // 32 bit word offset into buffer + *((uint32_t *)(frame + 2)) = buffer[offset]; + frame[6] = address & 0x000000FF; + state = SPORT_DATA_TRANSFER, + sendFrame(); + if (i == 0) { + drawProgressBar(STR_WRITING, file.fptr, file.obj.objsize); + } + } + + if (count < 256) { + f_close(&file); + return nullptr; + } + } +} + +const char * DeviceFirmwareUpdate::endTransfer() +{ + if (!waitState(SPORT_DATA_REQ, 2000)) + return "Module refused data"; + startFrame(PRIM_DATA_EOF); + sendFrame(); + if (!waitState(SPORT_COMPLETE, 2000)) { + return "Module rejected firmware"; + } + return nullptr; +} + +void DeviceFirmwareUpdate::flashFile(const char * filename) +{ + pausePulses(); + +#if defined(PCBTARANIS) || defined(PCBHORUS) + uint8_t intPwr = IS_INTERNAL_MODULE_ON(); + uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); + INTERNAL_MODULE_OFF(); + EXTERNAL_MODULE_OFF(); + SPORT_UPDATE_POWER_OFF(); + + /* wait 2s off */ + watchdogSuspend(2000); + RTOS_WAIT_MS(2000); +#endif + + startup(); + + const char * result = sendPowerOn(); + if (!result) result = sendReqVersion(); + if (!result) result = uploadFile(filename); + if (!result) result = endTransfer(); + + if (result) { + POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR); + SET_WARNING_INFO(result, strlen(result), 0); + } + +#if defined(PCBTARANIS) || defined(PCBHORUS) + INTERNAL_MODULE_OFF(); + EXTERNAL_MODULE_OFF(); + SPORT_UPDATE_POWER_OFF(); +#endif + + waitState(SPORT_IDLE, 500); // Clear the fifo + +#if defined(PCBTARANIS) || defined(PCBHORUS) + if (intPwr) + INTERNAL_MODULE_ON(); + if (extPwr) + EXTERNAL_MODULE_ON(); +#endif + + state = SPORT_IDLE; + + resumePulses(); +} diff --git a/radio/src/io/frsky_sport.cpp b/radio/src/io/frsky_sport.cpp index 1cd8de569..7bfc0ad87 100644 --- a/radio/src/io/frsky_sport.cpp +++ b/radio/src/io/frsky_sport.cpp @@ -20,33 +20,10 @@ #include "opentx.h" -#if defined(STM32) -#define PRIM_REQ_POWERUP (0) -#define PRIM_REQ_VERSION (1) -#define PRIM_CMD_DOWNLOAD (3) -#define PRIM_DATA_WORD (4) -#define PRIM_DATA_EOF (5) - -#define PRIM_ACK_POWERUP (0x80) -#define PRIM_ACK_VERSION (0x81) -#define PRIM_REQ_DATA_ADDR (0x82) -#define PRIM_END_DOWNLOAD (0x83) -#define PRIM_DATA_CRC_ERR (0x84) - -enum SportUpdateState { - SPORT_IDLE, - SPORT_POWERUP_REQ, - SPORT_POWERUP_ACK, - SPORT_VERSION_REQ, - SPORT_VERSION_ACK, - SPORT_DATA_TRANSFER, - SPORT_DATA_REQ, - SPORT_COMPLETE, - SPORT_FAIL -}; - -uint8_t sportUpdateState = SPORT_IDLE; -uint32_t sportUpdateAddr = 0; +bool isSportOutputBufferAvailable() +{ + return (outputTelemetryBufferSize == 0 && outputTelemetryBufferTrigger == 0x7E); +} void sportOutputPushByte(uint8_t byte) { @@ -59,11 +36,6 @@ void sportOutputPushByte(uint8_t byte) } } -bool isSportOutputBufferAvailable() -{ - return (outputTelemetryBufferSize == 0 && outputTelemetryBufferTrigger == 0x7E); -} - // TODO merge it with S.PORT update function when finished void sportOutputPushPacket(SportTelemetryPacket * packet) { @@ -80,282 +52,3 @@ void sportOutputPushPacket(SportTelemetryPacket * packet) telemetryOutputPushByte(0xFF-crc); telemetryOutputSetTrigger(packet->raw[0]); // physicalId } - -void sportProcessUpdatePacket(uint8_t * packet) -{ - if (packet[0]==0x5E && packet[1]==0x50) { - switch (packet[2]) { - case PRIM_ACK_POWERUP : - if (sportUpdateState == SPORT_POWERUP_REQ) { - sportUpdateState = SPORT_POWERUP_ACK; - } - break; - - case PRIM_ACK_VERSION: - if (sportUpdateState == SPORT_VERSION_REQ) { - sportUpdateState = SPORT_VERSION_ACK; - // SportVersion[0] = packet[3] ; - // SportVersion[1] = packet[4] ; - // SportVersion[2] = packet[5] ; - // SportVersion[3] = packet[6] ; - // SportVerValid = 1 ; - } - break; - - case PRIM_REQ_DATA_ADDR : - if (sportUpdateState == SPORT_DATA_TRANSFER) { - sportUpdateAddr = *((uint32_t *)(&packet[3])); - sportUpdateState = SPORT_DATA_REQ; - } - break; - - case PRIM_END_DOWNLOAD : - sportUpdateState = SPORT_COMPLETE ; - break; - - case PRIM_DATA_CRC_ERR : - sportUpdateState = SPORT_FAIL ; - break; - } - } -} - -bool sportWaitState(SportUpdateState state, int timeout) -{ -#if defined(SIMU) - UNUSED(state); - UNUSED(timeout); - return true; -#else - watchdogSuspend(timeout / 10); - for (int i=timeout/2; i>=0; i--) { - uint8_t byte ; - while (telemetryGetByte(&byte)) { - processFrskyTelemetryData(byte); - } - if (sportUpdateState == state) { - return true; - } - else if (sportUpdateState == SPORT_FAIL) { - return false; - } - RTOS_WAIT_TICKS(1); - } - return false; -#endif -} - -void sportClearPacket(uint8_t * packet) -{ - memset(packet+2, 0, 6); -} - -// TODO merge this function -void sportWritePacket(uint8_t * packet) -{ - uint8_t * ptr = outputTelemetryBuffer; - *ptr++ = 0x7E; - *ptr++ = 0xFF; - packet[7] = crc16(packet, 7); - for (int i=0; i<8; i++) { - if (packet[i] == 0x7E || packet[i] == 0x7D) { - *ptr++ = 0x7D; - *ptr++ = 0x20 ^ packet[i]; - } - else { - *ptr++ = packet[i]; - } - } - sportSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer); -} - -const char * sportUpdatePowerOn(ModuleIndex module) -{ - uint8_t packet[8]; - - sportUpdateState = SPORT_POWERUP_REQ; - sportWaitState(SPORT_IDLE, 500); // Clear the fifo - - telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); - -#if defined(PCBTARANIS) || defined(PCBHORUS) - if (module == INTERNAL_MODULE) - INTERNAL_MODULE_ON(); - else if (module == EXTERNAL_MODULE) - EXTERNAL_MODULE_ON(); - else - SPORT_UPDATE_POWER_ON(); -#endif - - sportWaitState(SPORT_IDLE, 50); // Clear the fifo - - for (int i=0; i<10; i++) { - // max 10 attempts - sportClearPacket(packet); - packet[0] = 0x50 ; - packet[1] = PRIM_REQ_POWERUP; - sportWritePacket(packet); - if (sportWaitState(SPORT_POWERUP_ACK, 100)) - return NULL; - } - - if (telemetryProtocol != PROTOCOL_TELEMETRY_FRSKY_SPORT) { - return TR("Not responding", "Not S.Port 1"); - } - - if (!IS_FRSKY_SPORT_PROTOCOL()) { - return TR("Not responding", "Not S.Port 2"); - } -#if defined(PCBX7) - if (IS_PCBREV_40()) { - return TR("Bottom pin no resp", "Bottom pin not responding"); - } - else { - return TR("Module pin no resp", "Module pin not responding"); - } -#else - return TR("Not responding", "Module not responding"); -#endif -} - -const char * sportUpdateReqVersion() -{ - uint8_t packet[8]; - sportWaitState(SPORT_IDLE, 20); // Clear the fifo - sportUpdateState = SPORT_VERSION_REQ; - for (int i=0; i<10; i++) { - // max 10 attempts - sportClearPacket(packet) ; - packet[0] = 0x50 ; - packet[1] = PRIM_REQ_VERSION ; - sportWritePacket(packet); - if (sportWaitState(SPORT_VERSION_ACK, 200)) - return NULL; - } - return "Version request failed"; -} - -const char * sportUpdateUploadFile(const char *filename) -{ - FIL file; - uint32_t buffer[1024/4]; - UINT count; - uint8_t packet[8]; - - if (f_open(&file, filename, FA_READ) != FR_OK) { - return "Error opening file"; - } - - sportWaitState(SPORT_IDLE, 200); // Clear the fifo - sportUpdateState = SPORT_DATA_TRANSFER; - sportClearPacket(packet) ; - packet[0] = 0x50 ; - packet[1] = PRIM_CMD_DOWNLOAD ; - // Stop here for testing - sportWritePacket(packet); - - while(1) { - if (f_read(&file, buffer, 1024, &count) != FR_OK) { - f_close(&file); - return "Error reading file"; - } - - count >>= 2; - - for (UINT i=0; i> 2; // 32 bit word offset into buffer - uint32_t *data = (uint32_t *)(&packet[2]); - *data = buffer[offset]; - sportUpdateState = SPORT_DATA_TRANSFER, - sportWritePacket(packet); - if (i==0) { - drawProgressBar(STR_WRITING, file.fptr, file.obj.objsize); - } - } - - if (count < 256) { - f_close(&file); - return NULL; - } - } -} - -const char * sportUpdateEnd() -{ - uint8_t packet[8]; - if (!sportWaitState(SPORT_DATA_REQ, 2000)) - return "Module refused data"; - sportClearPacket(packet); - packet[0] = 0x50 ; - packet[1] = PRIM_DATA_EOF; - sportWritePacket(packet); - if (!sportWaitState(SPORT_COMPLETE, 2000)) { - return "Module rejected firmware"; - } - return NULL; -} - -void sportFlashDevice(ModuleIndex module, const char * filename) -{ - pausePulses(); - -#if defined(PCBTARANIS) || defined(PCBHORUS) - uint8_t intPwr = IS_INTERNAL_MODULE_ON(); - uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); - INTERNAL_MODULE_OFF(); - EXTERNAL_MODULE_OFF(); - SPORT_UPDATE_POWER_OFF(); - - /* wait 2s off */ - watchdogSuspend(2000); - RTOS_WAIT_MS(2000); -#endif - - const char * result = sportUpdatePowerOn(module); - if (!result) result = sportUpdateReqVersion(); - if (!result) result = sportUpdateUploadFile(filename); - if (!result) result = sportUpdateEnd(); - - if (result) { - POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR); - SET_WARNING_INFO(result, strlen(result), 0); - } - -#if defined(PCBTARANIS) || defined(PCBHORUS) - INTERNAL_MODULE_OFF(); - EXTERNAL_MODULE_OFF(); - SPORT_UPDATE_POWER_OFF(); -#endif - - sportWaitState(SPORT_IDLE, 500); // Clear the fifo - -#if defined(PCBTARANIS) || defined(PCBHORUS) - if (intPwr) - INTERNAL_MODULE_ON(); - if (extPwr) - EXTERNAL_MODULE_ON(); -#endif - - sportUpdateState = SPORT_IDLE; - - resumePulses(); -} -#endif - -void sportProcessPacket(uint8_t * packet) -{ -#if defined(STM32) - if (sportUpdateState != SPORT_IDLE) { - sportProcessUpdatePacket(packet); // Uses different chksum - return; - } -#endif - - sportProcessTelemetryPacket(packet); -} diff --git a/radio/src/io/io_arm.h b/radio/src/io/io_arm.h index d510add9b..3ee05ab3b 100644 --- a/radio/src/io/io_arm.h +++ b/radio/src/io/io_arm.h @@ -35,7 +35,6 @@ PACK(union SportTelemetryPacket uint8_t raw[8]; }); -void sportProcessPacket(uint8_t * packet); bool isSportOutputBufferAvailable(); void sportOutputPushPacket(SportTelemetryPacket * packet); void sportFlashDevice(ModuleIndex module, const char * filename); @@ -45,5 +44,46 @@ void sportFlashDevice(ModuleIndex module, const char * filename); bool isBootloader(const char * filename); void bootloaderFlash(const char * filename); #endif - + +class DeviceFirmwareUpdate { + enum State { + SPORT_IDLE, + SPORT_POWERUP_REQ, + SPORT_POWERUP_ACK, + SPORT_VERSION_REQ, + SPORT_VERSION_ACK, + SPORT_DATA_TRANSFER, + SPORT_DATA_REQ, + SPORT_COMPLETE, + SPORT_FAIL + }; + + public: + DeviceFirmwareUpdate(ModuleIndex module): + module(module) { + } + + void flashFile(const char * filename); + + protected: + uint8_t state = SPORT_IDLE; + uint32_t address = 0; + ModuleIndex module; + uint8_t frame[12]; + + void startup(); + + void startFrame(uint8_t command); + void sendFrame(); + + bool readByte(uint8_t & byte); + bool waitState(State state, uint32_t timeout); + void processFrame(); + + const char * sendPowerOn(); + const char * sendReqVersion(); + const char * uploadFile(const char * filename); + const char * endTransfer(); +}; + #endif // _IO_ARM_H_ diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 874e9bcfd..5fc56dc5d 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -143,6 +143,7 @@ set(SRC tasks.cpp audio.cpp io/frsky_sport.cpp + io/frsky_device_firmware_update.cpp telemetry/telemetry.cpp telemetry/telemetry_holders.cpp telemetry/telemetry_sensors.cpp diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index edbe2421f..b0526e308 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -34,7 +34,7 @@ void intmodulePxxStart() // shouldn't be used anymore } -void intmodulePxx2Start() +void intmoduleSerialStart(uint32_t baudrate) { INTERNAL_MODULE_ON(); @@ -58,7 +58,7 @@ void intmodulePxx2Start() USART_DeInit(INTMODULE_USART); USART_InitTypeDef USART_InitStructure; - USART_InitStructure.USART_BaudRate = INTMODULE_USART_PXX_BAUDRATE; + USART_InitStructure.USART_BaudRate = baudrate; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; @@ -89,30 +89,35 @@ extern "C" void INTMODULE_USART_IRQHandler(void) } } +void intmoduleSendBuffer(const uint8_t * data, uint8_t size) +{ + DMA_InitTypeDef DMA_InitStructure; + DMA_DeInit(INTMODULE_DMA_STREAM); + DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL; + DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&INTMODULE_USART->DR); + DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(data); + DMA_InitStructure.DMA_BufferSize = size; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; + DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(INTMODULE_DMA_STREAM, &DMA_InitStructure); + DMA_Cmd(INTMODULE_DMA_STREAM, ENABLE); + USART_DMACmd(INTMODULE_USART, USART_DMAReq_Tx, ENABLE); +} + void intmoduleSendNextFrame() { #if defined(PXX2) if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { - DMA_InitTypeDef DMA_InitStructure; - DMA_DeInit(INTMODULE_DMA_STREAM); - DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL; - DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&INTMODULE_USART->DR); - DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(intmodulePulsesData.pxx2.getData()); - DMA_InitStructure.DMA_BufferSize = intmodulePulsesData.pxx2.getSize(); - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; - DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; - DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; - DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; - DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; - DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - DMA_Init(INTMODULE_DMA_STREAM, &DMA_InitStructure); - DMA_Cmd(INTMODULE_DMA_STREAM, ENABLE); - USART_DMACmd(INTMODULE_USART, USART_DMAReq_Tx, ENABLE); + intmoduleSendBuffer(intmodulePulsesData.pxx2.getData(), intmodulePulsesData.pxx2.getSize()); } #endif } diff --git a/radio/src/targets/horus/pulses_driver.cpp b/radio/src/targets/horus/pulses_driver.cpp index 1bf00cadb..a92b65679 100644 --- a/radio/src/targets/horus/pulses_driver.cpp +++ b/radio/src/targets/horus/pulses_driver.cpp @@ -22,7 +22,7 @@ void intmoduleStop(); void intmodulePxxStart(); -void intmodulePxx2Start(); +void intmoduleSerialStart(uint32_t baudrate); void extmoduleStop(); void extmodulePpmStart(); @@ -48,7 +48,7 @@ void disable_ppm(uint8_t module) void init_pxx2(uint8_t module) { if (module == INTERNAL_MODULE) - intmodulePxx2Start(); + intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE); else extmodulePxx2Start(); } diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 23e5a1e2b..62b492951 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -172,14 +172,27 @@ uint32_t isBootloaderStart(const uint8_t * buffer); void init_ppm(uint8_t module); void disable_ppm(uint8_t module); -void intmoduleSendNextFrame(); -void extmoduleSendNextFrame(); void init_pxx2(uint8_t module); void disable_pxx2(uint8_t module); void init_pxx(uint8_t module); void disable_pxx(uint8_t module); void init_serial(uint8_t module, uint32_t baudrate, uint32_t period); void disable_serial(uint8_t module); +void intmoduleStop(); +void intmodulePxxStart(); +void intmoduleSerialStart(uint32_t baudrate); +#if defined(TARANIS_INTERNAL_PPM) +void intmodulePpmStart(void); +#endif +void intmoduleSendBuffer(const uint8_t * data, uint8_t size); +void intmoduleSendNextFrame(); + +void extmoduleStop(); +void extmodulePpmStart(); +void extmodulePxxStart(); +void extmodulePxx2Start(); +void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us); +void extmoduleSendNextFrame(); // Trainer driver #define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 069d146f7..1b4351bbe 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1165,8 +1165,6 @@ #define I2CX_SCL_GPIO_PinSource GPIO_PinSource8 #define I2CX_SDA_GPIO_PinSource GPIO_PinSource9 #define I2CX_SPEED 400000 - #define I2CX_IMU_INT_GPIO GPIOC - #define I2CX_IMU_INT_GPIO_PIN GPIO_Pin_8 // PC.08 #endif // SD - SPI2 diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 69ac3c652..5150fe296 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -65,7 +65,7 @@ void intmoduleSendNextFrame() } } -void intmodulePxx2Start() +void intmoduleSerialStart(uint32_t baudrate) { // nothing, the pulses will be sent through telemetry port } diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index e88486bcb..1dd39fc43 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -20,20 +20,6 @@ #include "opentx.h" -void intmoduleStop(); -void intmodulePxxStart(); -void intmodulePxx2Start(); -#if defined(TARANIS_INTERNAL_PPM) -void intmodulePpmStart(void); -#endif - -void extmoduleStop(); -void extmoduleTimerStart(uint32_t period, uint8_t state); -void extmodulePpmStart(); -void extmodulePxxStart(); -void extmodulePxx2Start(); -void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us); - void init_pxx(uint8_t module) { if (module == INTERNAL_MODULE) @@ -53,7 +39,7 @@ void disable_pxx(uint8_t module) void init_pxx2(uint8_t module) { if (module == INTERNAL_MODULE) - intmodulePxx2Start(); + intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE); else extmodulePxx2Start(); } diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 5dbe882eb..053d907d9 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -166,7 +166,7 @@ void processFrskyTelemetryData(uint8_t data) #if defined(TELEMETRY_FRSKY_SPORT) if (IS_FRSKY_SPORT_PROTOCOL() && telemetryRxBufferCount >= FRSKY_SPORT_PACKET_SIZE) { - sportProcessPacket(telemetryRxBuffer); + sportProcessTelemetryPacket(telemetryRxBuffer); dataState = STATE_DATA_IDLE; } #endif From 64ac59dfce7f52b565961717802fb29e0498fa41 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 20 Feb 2019 12:28:56 +0100 Subject: [PATCH 204/446] Port of the popup addition --- radio/src/gui/128x64/popups.cpp | 5 +++++ radio/src/gui/212x64/popups.cpp | 7 ++++++- radio/src/gui/480x272/popups.cpp | 5 +++++ radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 16 files changed, 29 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/popups.cpp b/radio/src/gui/128x64/popups.cpp index 202628769..92930ce46 100644 --- a/radio/src/gui/128x64/popups.cpp +++ b/radio/src/gui/128x64/popups.cpp @@ -97,6 +97,11 @@ void runPopupWarning(event_t event) lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT)); switch (event) { case EVT_KEY_BREAK(KEY_ENTER): + if(warningType == WARNING_TYPE_INFO) { + warningText = NULL; + warningType = WARNING_TYPE_ASTERISK; + } + // no break if (warningType == WARNING_TYPE_ASTERISK) break; warningResult = true; diff --git a/radio/src/gui/212x64/popups.cpp b/radio/src/gui/212x64/popups.cpp index c233a1df0..d36d65efb 100644 --- a/radio/src/gui/212x64/popups.cpp +++ b/radio/src/gui/212x64/popups.cpp @@ -91,9 +91,14 @@ void runPopupWarning(event_t event) if (warningInfoText) { lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH, warningInfoText, warningInfoLength, WARNING_INFO_FLAGS); } - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT)); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT)); switch (event) { case EVT_KEY_BREAK(KEY_ENTER): + if(warningType == WARNING_TYPE_INFO) { + warningText = NULL; + warningType = WARNING_TYPE_ASTERISK; + } + // no break if (warningType == WARNING_TYPE_ASTERISK) break; warningResult = true; diff --git a/radio/src/gui/480x272/popups.cpp b/radio/src/gui/480x272/popups.cpp index 4566bd85c..f5ae8bf22 100644 --- a/radio/src/gui/480x272/popups.cpp +++ b/radio/src/gui/480x272/popups.cpp @@ -81,6 +81,11 @@ void runPopupWarning(event_t event) switch (event) { case EVT_KEY_BREAK(KEY_ENTER): + if(warningType == WARNING_TYPE_INFO) { + warningText = NULL; + warningType = WARNING_TYPE_ASTERISK; + } + // no break if (warningType == WARNING_TYPE_ASTERISK) break; warningResult = true; diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 15af4d5d8..b88c9d7be 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -558,6 +558,7 @@ const char STR_FLASH_BOOTLOADER[] = TR_FLASH_BOOTLOADER; const char STR_FLASH_INTERNAL_MODULE[] = TR_FLASH_INTERNAL_MODULE; const char STR_FLASH_EXTERNAL_MODULE[] = TR_FLASH_EXTERNAL_MODULE; const char STR_FIRMWARE_UPDATE_ERROR[] = TR_FIRMWARE_UPDATE_ERROR; +const char STR_FIRMWARE_UPDATE_SUCCESS[] = TR_FIRMWARE_UPDATE_SUCCESS; const char STR_FLASH_EXTERNAL_DEVICE[] = TR_FLASH_EXTERNAL_DEVICE; const char STR_WRITING[] = TR_WRITING; const char STR_CONFIRM_FORMAT[] = TR_CONFIRM_FORMAT; diff --git a/radio/src/translations.h b/radio/src/translations.h index 77db494b2..383363a63 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -759,6 +759,7 @@ extern const char STR_FLASH_EXTERNAL_DEVICE[]; extern const char STR_FLASH_INTERNAL_MODULE[]; extern const char STR_FLASH_EXTERNAL_MODULE[]; extern const char STR_FIRMWARE_UPDATE_ERROR[]; +extern const char STR_FIRMWARE_UPDATE_SUCCESS[]; extern const char STR_WRITING[]; extern const char STR_CONFIRM_FORMAT[]; extern const char STR_EEBACKUP[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 846df51d0..b6602dc9f 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -915,6 +915,7 @@ #define TR_FLASH_INTERNAL_MODULE TR("Flash vnitř. modulu", "Flash vnitřního modulu") #define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. modulu", "Flash externího zařízení") #define TR_FIRMWARE_UPDATE_ERROR TR("Chyba zápisu FW", "Chyba zápisu firmware") +#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING TR3("\14Zapisuji..", "\032Zapisuji..", "Zapisuji..") #define TR_CONFIRM_FORMAT "Provést Formát?" #define TR_INTERNALRF "Vnitřní RF modul" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index c1113ccd5..c0c7edd59 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -920,6 +920,7 @@ #define TR_FLASH_INTERNAL_MODULE TR("Flash int. XJT","Flash internes XJT-Modul") #define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. mod","Flash extern module") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") +#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "\032Writing..." // #define TR_CONFIRM_FORMAT "Formatieren bestätigen?" #define TR_INTERNALRF "Internes HF-Modul" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index c8283c509..59afceeea 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -919,6 +919,7 @@ #define TR_FLASH_INTERNAL_MODULE TR("Flash int. module", "Flash internal module") #define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. module", "Flash external module") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update error", "Firmware update error") +#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING TR3("\14Writing...", "\032Writing...", "Writing...") #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index c25de41ac..4f8b92c5d 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -926,6 +926,7 @@ #define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") +#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "\032Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Interna RF" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 5815b18b4..035415480 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -918,6 +918,7 @@ #define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") +#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "\032Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index c5e61d9d3..e51b559ce 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -930,6 +930,7 @@ #define TR_FLASH_INTERNAL_MODULE TR("Flasher module int.", "Flasher module interne") #define TR_FLASH_EXTERNAL_MODULE TR("Flasher module ext.", "Flasher module externe") #define TR_FIRMWARE_UPDATE_ERROR TR("Erreur màj FW","Erreur de mise à jour") +#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING TR("\14Ecriture...", "\032Ecriture...") #define TR_CONFIRM_FORMAT "Confirmer Formatage?" #define TR_INTERNALRF "HF interne" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index ea8d0272b..43a903070 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -920,6 +920,7 @@ #define TR_FLASH_INTERNAL_MODULE "Progr. Modulo Interno" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") +#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "\032Scrivendo..." #define TR_CONFIRM_FORMAT "Confermi Format?" #define TR_INTERNALRF "Modulo Interno" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 107733162..8520deafd 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -921,6 +921,7 @@ #define TR_FLASH_INTERNAL_MODULE "Flash interne XJT-Module" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") +#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "\032Schrijven..." #define TR_CONFIRM_FORMAT "Formatteren bevestigen?" #define TR_INTERNALRF "Interne RF" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index bf74ec903..646901062 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -921,6 +921,7 @@ #define TR_FLASH_INTERNAL_MODULE "Sflashuj Moduł Wewnętrzny" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") +#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "\032Zapis... " #define TR_CONFIRM_FORMAT "Zatwierdź Format?" #define TR_INTERNALRF "Wewn.Moduł RF" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 37d2bdd10..5cb8a2245 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -925,6 +925,7 @@ #define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") +#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "\032Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index a9bf87e83..afdc67c59 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -934,6 +934,7 @@ #define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") +#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "\032Skriver..." #define TR_CONFIRM_FORMAT "Formatera Minnet?" #define TR_INTERNALRF "Intern Radio" From 1cef3ccf906bad9969ef0efa2d63f82022d7a764 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Feb 2019 16:20:55 +0100 Subject: [PATCH 205/446] Port of the popup addition --- radio/src/gui/128x64/popups.cpp | 8 ++------ radio/src/gui/212x64/popups.cpp | 8 ++------ radio/src/gui/480x272/popups.cpp | 8 ++------ radio/src/io/frsky_device_firmware_update.cpp | 3 +++ 4 files changed, 9 insertions(+), 18 deletions(-) diff --git a/radio/src/gui/128x64/popups.cpp b/radio/src/gui/128x64/popups.cpp index 92930ce46..f252fedac 100644 --- a/radio/src/gui/128x64/popups.cpp +++ b/radio/src/gui/128x64/popups.cpp @@ -97,14 +97,10 @@ void runPopupWarning(event_t event) lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT)); switch (event) { case EVT_KEY_BREAK(KEY_ENTER): - if(warningType == WARNING_TYPE_INFO) { - warningText = NULL; - warningType = WARNING_TYPE_ASTERISK; - } - // no break if (warningType == WARNING_TYPE_ASTERISK) break; - warningResult = true; + if (warningType != WARNING_TYPE_INFO) + warningResult = true; // no break case EVT_KEY_BREAK(KEY_EXIT): warningText = NULL; diff --git a/radio/src/gui/212x64/popups.cpp b/radio/src/gui/212x64/popups.cpp index d36d65efb..82ff6b464 100644 --- a/radio/src/gui/212x64/popups.cpp +++ b/radio/src/gui/212x64/popups.cpp @@ -94,14 +94,10 @@ void runPopupWarning(event_t event) lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT)); switch (event) { case EVT_KEY_BREAK(KEY_ENTER): - if(warningType == WARNING_TYPE_INFO) { - warningText = NULL; - warningType = WARNING_TYPE_ASTERISK; - } - // no break if (warningType == WARNING_TYPE_ASTERISK) break; - warningResult = true; + if (warningType != WARNING_TYPE_INFO) + warningResult = true; // no break case EVT_KEY_BREAK(KEY_EXIT): diff --git a/radio/src/gui/480x272/popups.cpp b/radio/src/gui/480x272/popups.cpp index f5ae8bf22..147592d3c 100644 --- a/radio/src/gui/480x272/popups.cpp +++ b/radio/src/gui/480x272/popups.cpp @@ -81,14 +81,10 @@ void runPopupWarning(event_t event) switch (event) { case EVT_KEY_BREAK(KEY_ENTER): - if(warningType == WARNING_TYPE_INFO) { - warningText = NULL; - warningType = WARNING_TYPE_ASTERISK; - } - // no break if (warningType == WARNING_TYPE_ASTERISK) break; - warningResult = true; + if (warningType != WARNING_TYPE_INFO) + warningResult = true; // no break case EVT_KEY_BREAK(KEY_EXIT): diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp index a4ba039c0..53e5a8fce 100644 --- a/radio/src/io/frsky_device_firmware_update.cpp +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -298,6 +298,9 @@ void DeviceFirmwareUpdate::flashFile(const char * filename) POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR); SET_WARNING_INFO(result, strlen(result), 0); } + else { + POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); + } #if defined(PCBTARANIS) || defined(PCBHORUS) INTERNAL_MODULE_OFF(); From 6685dcfdcdf8b3a72502ad65e95c02ca6b6a0e98 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Feb 2019 18:04:18 +0100 Subject: [PATCH 206/446] Device update through S.PORT port now OK --- radio/src/io/frsky_device_firmware_update.cpp | 17 ++++++----------- radio/src/io/io_arm.h | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp index 53e5a8fce..66b005a17 100644 --- a/radio/src/io/frsky_device_firmware_update.cpp +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -72,21 +72,21 @@ void DeviceFirmwareUpdate::startup() switch(module) { case INTERNAL_MODULE: #if defined(INTMODULE_USART) - return intmoduleSerialStart(57600); + intmoduleSerialStart(57600); + break; #endif default: - return telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); + telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); + break; } -#if defined(PCBTARANIS) || defined(PCBHORUS) if (module == INTERNAL_MODULE) INTERNAL_MODULE_ON(); else if (module == EXTERNAL_MODULE) EXTERNAL_MODULE_ON(); else SPORT_UPDATE_POWER_ON(); -#endif watchdogSuspend(50); RTOS_WAIT_MS(50); @@ -117,7 +117,7 @@ bool DeviceFirmwareUpdate::waitState(State state, uint32_t timeout) uint8_t len = 0; while (len < 10) { uint32_t elapsed = 0; - while (!intmoduleFifo.pop(frame[len])) { + while (!readByte(frame[len])) { RTOS_WAIT_MS(1); if (elapsed++ >= timeout) { return false; @@ -275,9 +275,9 @@ void DeviceFirmwareUpdate::flashFile(const char * filename) { pausePulses(); -#if defined(PCBTARANIS) || defined(PCBHORUS) uint8_t intPwr = IS_INTERNAL_MODULE_ON(); uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); + INTERNAL_MODULE_OFF(); EXTERNAL_MODULE_OFF(); SPORT_UPDATE_POWER_OFF(); @@ -285,7 +285,6 @@ void DeviceFirmwareUpdate::flashFile(const char * filename) /* wait 2s off */ watchdogSuspend(2000); RTOS_WAIT_MS(2000); -#endif startup(); @@ -302,20 +301,16 @@ void DeviceFirmwareUpdate::flashFile(const char * filename) POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); } -#if defined(PCBTARANIS) || defined(PCBHORUS) INTERNAL_MODULE_OFF(); EXTERNAL_MODULE_OFF(); SPORT_UPDATE_POWER_OFF(); -#endif waitState(SPORT_IDLE, 500); // Clear the fifo -#if defined(PCBTARANIS) || defined(PCBHORUS) if (intPwr) INTERNAL_MODULE_ON(); if (extPwr) EXTERNAL_MODULE_ON(); -#endif state = SPORT_IDLE; diff --git a/radio/src/io/io_arm.h b/radio/src/io/io_arm.h index 3ee05ab3b..2a929d86e 100644 --- a/radio/src/io/io_arm.h +++ b/radio/src/io/io_arm.h @@ -66,7 +66,7 @@ class DeviceFirmwareUpdate { void flashFile(const char * filename); protected: - uint8_t state = SPORT_IDLE; + uint8_t state = SPORT_IDLE; uint32_t address = 0; ModuleIndex module; uint8_t frame[12]; From 61af68caf87ccbae90eeb45b8f65d318d328f573 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Feb 2019 18:23:07 +0100 Subject: [PATCH 207/446] PXX2 through external module start --- radio/src/targets/taranis/extmodule_driver.cpp | 16 +++++----------- radio/src/targets/taranis/hal.h | 7 ++++++- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index bed9f156a..4497358df 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -121,23 +121,17 @@ void extmoduleInvertedSerialStart(uint32_t baudrate, uint32_t period_half_us) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); - // TX Pin - GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, EXTMODULE_USART_TX_GPIO_AF); + // TX + RX Pins + GPIO_PinAFConfig(EXTMODULE_USART_GPIO, EXTMODULE_TX_GPIO_PinSource, EXTMODULE_USART_GPIO_AF); + GPIO_PinAFConfig(EXTMODULE_USART_GPIO, EXTMODULE_RX_GPIO_PinSource, EXTMODULE_USART_GPIO_AF); GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN; + GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN | EXTMODULE_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(EXTMODULE_TX_GPIO, &GPIO_InitStructure); - -#if 0 - // RX Pin - GPIO_PinAFConfig(EXTMODULE_RX_GPIO, EXTMODULE_RX_GPIO_PinSource, EXTMODULE_TX_GPIO_USART_AF); - GPIO_InitStructure.GPIO_Pin = EXTMODULE_RX_GPIO_PIN; - GPIO_Init(EXTMODULE_RX_GPIO, &GPIO_InitStructure); -#endif + GPIO_Init(EXTMODULE_USART_GPIO, &GPIO_InitStructure); // UART config USART_DeInit(EXTMODULE_USART); diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 1b4351bbe..3cede1e72 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -755,14 +755,18 @@ // External Module #define EXTMODULE_PULSES + #if defined(PCBXLITE) #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6) #define EXTMODULE_PWR_GPIO GPIOD #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_11 // PD.11 #define EXTMODULE_TX_GPIO GPIOC + #define EXTMODULE_USART_GPIO GPIOC #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PC.06 #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource6 + #define EXTMODULE_RX_GPIO_PIN GPIO_Pin_6 // PC.07 + #define EXTMODULE_RX_GPIO_PinSource GPIO_PinSource7 #define EXTMODULE_TIMER TIM8 #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) #define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn @@ -775,7 +779,7 @@ #define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1 #define EXTMODULE_TIMER_OUTPUT_ENABLE TIM_CCER_CC1E #define EXTMODULE_TIMER_OUTPUT_POLARITY TIM_CCER_CC1P - #define EXTMODULE_USART_TX_GPIO_AF GPIO_AF_USART6 + #define EXTMODULE_USART_GPIO_AF GPIO_AF_USART6 #define EXTMODULE_USART USART6 #define EXTMODULE_USART_IRQn USART6_IRQn #define EXTMODULE_USART_DMA_CHANNEL DMA_Channel_5 @@ -784,6 +788,7 @@ #define EXTMODULE_USART_DMA_STREAM_IRQHandler DMA2_Stream6_IRQHandler #define EXTMODULE_USART_DMA_FLAG_TC DMA_IT_TCIF6 #else + #define EXTMODULE_PULSES #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8 #define EXTMODULE_PWR_GPIO GPIOD From e4fa31be28949d894bc6b662258941ddc86b6b7d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Feb 2019 10:35:48 +0100 Subject: [PATCH 208/446] Rename char2idx to char2zchar --- companion/src/firmwares/eepromimportexport.h | 8 ++++---- radio/src/bluetooth.cpp | 2 +- radio/src/gui/128x64/lcd.cpp | 4 ++-- radio/src/gui/480x272/menu_model.cpp | 6 +++--- radio/src/gui/common/stdlcd/widgets.cpp | 2 +- radio/src/logs.cpp | 2 +- radio/src/opentx.cpp | 2 +- radio/src/opentx.h | 4 ++-- radio/src/storage/eeprom_rlc.cpp | 2 +- radio/src/strhelpers.cpp | 10 +++++----- 10 files changed, 21 insertions(+), 21 deletions(-) diff --git a/companion/src/firmwares/eepromimportexport.h b/companion/src/firmwares/eepromimportexport.h index 69944cba7..30cd2a045 100644 --- a/companion/src/firmwares/eepromimportexport.h +++ b/companion/src/firmwares/eepromimportexport.h @@ -387,7 +387,7 @@ class CharField: public DataField { }; static const char specialCharsTab[] = "_-.,"; -static inline int8_t char2idx(char c) +static inline int8_t char2zchar(char c) { if (c==' ') return 0; if (c>='A' && c<='Z') return 1+c-'A'; @@ -401,7 +401,7 @@ static inline int8_t char2idx(char c) } #define ZCHAR_MAX 40 -static inline char idx2char(int8_t idx) +static inline char zchar2char(int8_t idx) { if (idx == 0) return ' '; if (idx < 0) { @@ -429,7 +429,7 @@ class ZCharField: public DataField { int b = 0; int len = strlen(field); for (int i=0; i=len ? 0 : char2idx(field[i]); + int idx = i>=len ? 0 : char2zchar(field[i]); for (int j=0; j<8; j++, b++) { if (idx & (1< 0) { for (int i = 0; i < len; i++) { - *cur++ = idx2char(g_eeGeneral.bluetoothName[i]); + *cur++ = zchar2char(g_eeGeneral.bluetoothName[i]); } } else { diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index a9be302f3..d800521df 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -292,7 +292,7 @@ uint8_t getTextWidth(const char * s, uint8_t len, LcdFlags flags) { uint8_t width = 0; for (int i=0; len==0 || i 0) { int8_t c = name[editNameCursorPos]; if (!(flags & ZCHAR)) { - c = char2idx(c); + c = char2zchar(c); } int8_t v = c; @@ -132,7 +132,7 @@ void editName(coord_t x, coord_t y, char * name, uint8_t size, event_t event, ui if (c != v) { if (!(flags & ZCHAR)) { if (v != '\0' || name[editNameCursorPos+1] != '\0') - v = idx2char(v); + v = zchar2char(v); } name[editNameCursorPos] = v; storageDirty(menuVerticalPositions[0] == 0 ? EE_MODEL : EE_GENERAL); @@ -140,7 +140,7 @@ void editName(coord_t x, coord_t y, char * name, uint8_t size, event_t event, ui lcdDrawSizedText(x, y, name, size, flags); coord_t left = (editNameCursorPos == 0 ? 0 : getTextWidth(name, editNameCursorPos, flags)); - char s[] = { (flags & ZCHAR) ? idx2char(name[editNameCursorPos]) : name[editNameCursorPos], '\0' }; + char s[] = { (flags & ZCHAR) ? zchar2char(name[editNameCursorPos]) : name[editNameCursorPos], '\0' }; lcdDrawSolidFilledRect(x+left-1, y, getTextWidth(s, 1)+1, INVERT_LINE_HEIGHT, TEXT_INVERTED_BGCOLOR); lcdDrawText(x+left, y, s, TEXT_INVERTED_COLOR); } diff --git a/radio/src/gui/common/stdlcd/widgets.cpp b/radio/src/gui/common/stdlcd/widgets.cpp index c1b60ec32..fde626ecd 100644 --- a/radio/src/gui/common/stdlcd/widgets.cpp +++ b/radio/src/gui/common/stdlcd/widgets.cpp @@ -160,7 +160,7 @@ void editName(coord_t x, coord_t y, char * name, uint8_t size, event_t event, ui } if (attr == ZCHAR) { - lcdDrawChar(x+editNameCursorPos*FW, y, idx2char(v), ERASEBG|INVERS|FIXEDWIDTH); + lcdDrawChar(x+editNameCursorPos*FW, y, zchar2char(v), ERASEBG|INVERS|FIXEDWIDTH); } else { lcdDrawChar(x+editNameCursorPos*FW, y, v, ERASEBG|INVERS|FIXEDWIDTH); diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index 63c6ddb46..8a90c71c1 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -71,7 +71,7 @@ const char * logsOpen() len = i+1; if (len) { if (filename[i]) - filename[i] = idx2char(filename[i]); + filename[i] = zchar2char(filename[i]); else filename[i] = '_'; } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 9ee271d63..4b416ac11 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -341,7 +341,7 @@ void defaultInputs() } #else for (int c=0; c<3; c++) { - g_model.inputNames[i][c] = char2idx(STR_VSRCRAW[2+4*stick_index+c]); + g_model.inputNames[i][c] = char2zchar(STR_VSRCRAW[2 + 4 * stick_index + c]); } #if LEN_INPUT_NAME > 3 g_model.inputNames[i][3] = '\0'; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 47336de39..bc7a7e90e 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -431,8 +431,8 @@ extern struct t_inactivity inactivity; #endif char hex2zchar(uint8_t hex); -char idx2char(int8_t idx); -int8_t char2idx(char c); +char zchar2char(int8_t idx); +int8_t char2zchar(char c); void str2zchar(char *dest, const char *src, int size); int zchar2str(char *dest, const char *src, int size); diff --git a/radio/src/storage/eeprom_rlc.cpp b/radio/src/storage/eeprom_rlc.cpp index 07c5df730..d3b94d723 100644 --- a/radio/src/storage/eeprom_rlc.cpp +++ b/radio/src/storage/eeprom_rlc.cpp @@ -467,7 +467,7 @@ const char * eeBackupModel(uint8_t i_fileSrc) len = i+1; if (len) { if (buf[i]) - buf[i] = idx2char(buf[i]); + buf[i] = zchar2char(buf[i]); else buf[i] = '_'; } diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp index 99a61996a..313775460 100644 --- a/radio/src/strhelpers.cpp +++ b/radio/src/strhelpers.cpp @@ -28,7 +28,7 @@ char hex2zchar(uint8_t hex) return (hex >= 10 ? hex-9 : 27+hex); } -char idx2char(int8_t idx) +char zchar2char(int8_t idx) { if (idx == 0) return ' '; if (idx < 0) { @@ -44,7 +44,7 @@ char idx2char(int8_t idx) return ' '; } -int8_t char2idx(char c) +int8_t char2zchar(char c) { if (c == '_') return 37; #if LEN_SPECIAL_CHARS > 0 @@ -63,14 +63,14 @@ void str2zchar(char * dest, const char * src, int size) { memset(dest, 0, size); for (int c=0; c Date: Thu, 21 Feb 2019 10:52:07 +0100 Subject: [PATCH 209/446] Char conversion issue (how much time did it stay like this?) --- radio/src/strhelpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp index 313775460..3fc075bab 100644 --- a/radio/src/strhelpers.cpp +++ b/radio/src/strhelpers.cpp @@ -52,7 +52,7 @@ int8_t char2zchar(char c) #endif if (c >= 'a') return 'a' - c - 1; if (c >= 'A') return c - 'A' + 1; - if (c >= '0') return c - '0' + 27; + if (c >= '0') return -(c - '0' + 27); if (c == '-') return 38; if (c == '.') return 39; if (c == ',') return 40; From 97983a6fc38a7bacdc1b3dbfed2e807a2747abc7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Feb 2019 11:21:07 +0100 Subject: [PATCH 210/446] XJT2 / R9M2 allowed even if internal module is present --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- radio/src/gui/gui_common_arm.cpp | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 62c39c18d..6b322b24e 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -408,8 +408,8 @@ void menuModelSetup(event_t event) MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS EXTERNAL_MODULE_CHANNELS_ROWS, - IF_NOT_EXTERNAL_PXX2(EXTERNAL_MODULE_BIND_ROWS()), // line reused for PPM: PPM settings - IF_EXTERNAL_PXX2(0), // RxNum + IF_NOT_EXTERNAL_PXX2(EXTERNAL_MODULE_BIND_ROWS()), // line reused for PPM: PPM settings + IF_EXTERNAL_PXX2(0), // RxNum OUTPUT_TYPE_ROWS() IF_NOT_EXTERNAL_PXX2(EXTERNAL_MODULE_OPTION_ROW), MULTIMODULE_MODULE_ROWS diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 77147d585..c72827ca6 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -561,15 +561,9 @@ bool isExternalModuleAvailable(int module) if (module == MODULE_TYPE_R9M && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { return false; } - if (module == MODULE_TYPE_R9M2 && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { - return false; - } if (module == MODULE_TYPE_XJT && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { return false; } - if (module == MODULE_TYPE_XJT2 && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { - return false; - } #endif return true; From 4b339bebbe92138355e6a25f5ec0fd3342508650 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Feb 2019 12:21:47 +0100 Subject: [PATCH 211/446] PXX2 pulses now sent on external module --- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/targets/horus/extmodule_driver.cpp | 31 ++++++++ .../src/targets/taranis/extmodule_driver.cpp | 78 +++++++++++++------ 3 files changed, 88 insertions(+), 23 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 6b322b24e..521e70eba 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -904,7 +904,7 @@ void menuModelSetup(event_t event) g_model.moduleData[EXTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(EXTERNAL_MODULE); if (isModuleSBUS(EXTERNAL_MODULE)) g_model.moduleData[EXTERNAL_MODULE].sbus.refreshRate = -31; - if(isModulePPM(EXTERNAL_MODULE)) + if (isModulePPM(EXTERNAL_MODULE)) SET_DEFAULT_PPM_FRAME_LENGTH(EXTERNAL_MODULE); } break; diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index bf1aef1c0..86cd8257f 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -184,6 +184,32 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) } #endif +#if defined(EXTMODULE_USART) +void extmoduleSendSerialBuffer(const uint8_t * data, uint8_t size) +{ + DMA_InitTypeDef DMA_InitStructure; + DMA_DeInit(EXTMODULE_DMA_STREAM); + DMA_InitStructure.DMA_Channel = EXTMODULE_DMA_CHANNEL; + DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&EXTMODULE_USART->DR); + DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(data); + DMA_InitStructure.DMA_BufferSize = size; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; + DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(EXTMODULE_DMA_STREAM, &DMA_InitStructure); + DMA_Cmd(EXTMODULE_DMA_STREAM, ENABLE); + USART_DMACmd(EXTMODULE_USART, USART_DMAReq_Tx, ENABLE); +} +#endif + void extmoduleSendNextFrame() { if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) { @@ -219,6 +245,11 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } +#endif +#if defined(PXX2) + else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { + // TODO + } #endif else if (IS_DSM2_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) { EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 4497358df..4be33ab1a 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -110,7 +110,7 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) } #if defined(EXTMODULE_USART) -void extmoduleInvertedSerialStart(uint32_t baudrate, uint32_t period_half_us) +void extmoduleInvertedSerialStart(uint32_t baudrate) { EXTERNAL_MODULE_ON(); @@ -141,32 +141,64 @@ void extmoduleInvertedSerialStart(uint32_t baudrate, uint32_t period_half_us) USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(EXTMODULE_USART, &USART_InitStructure); USART_Cmd(EXTMODULE_USART, ENABLE); - // Timer - EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; - EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz - EXTMODULE_TIMER->ARR = period_half_us; - EXTMODULE_TIMER->CCR2 = period_half_us - 2000; // Update time - EXTMODULE_TIMER->EGR = 1; // Restart - EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt - EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; + USART_ITConfig(INTMODULE_USART, USART_IT_RXNE, ENABLE); + NVIC_SetPriority(EXTMODULE_USART_IRQn, 6); + NVIC_EnableIRQ(EXTMODULE_USART_IRQn); +} - NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn); - NVIC_SetPriority(EXTMODULE_TIMER_CC_IRQn, 7); +void extmoduleSendSerialBuffer(const uint8_t * data, uint8_t size) +{ + DMA_InitTypeDef DMA_InitStructure; + DMA_DeInit(EXTMODULE_USART_DMA_STREAM); + DMA_InitStructure.DMA_Channel = EXTMODULE_USART_DMA_CHANNEL; + DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&EXTMODULE_USART->DR); + DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(data); + DMA_InitStructure.DMA_BufferSize = size; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; + DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(EXTMODULE_USART_DMA_STREAM, &DMA_InitStructure); + DMA_Cmd(EXTMODULE_USART_DMA_STREAM, ENABLE); + USART_DMACmd(EXTMODULE_USART, USART_DMAReq_Tx, ENABLE); +} + +#define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) +extern "C" void EXTMODULE_USART_IRQHandler(void) +{ + uint32_t status = EXTMODULE_USART->SR; + + while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { + uint8_t data = EXTMODULE_USART->DR; + if (status & USART_FLAG_ERRORS) { + // TODO later extmoduleErrors++; + } + else { + // TODO later extmoduleFifo.push(data); + } + status = EXTMODULE_USART->SR; + } } void extmodulePxxStart() { - extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE, PXX_PERIOD_HALF_US); + extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE); } void extmodulePxx2Start() { - extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE, PXX_PERIOD_HALF_US); + extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE); } #else void extmodulePxxStart() @@ -258,7 +290,15 @@ void extmoduleSendNextFrame() #endif } #endif - +#if defined(PXX2) + else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { + #if defined(EXTMODULE_USART) + extmoduleSendSerialBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); + #else + sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); + #endif + } +#endif #if defined(DSM2) else if (IS_DSM2_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) { if (IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) @@ -272,16 +312,10 @@ void extmoduleSendNextFrame() EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } #endif - #if defined(CROSSFIRE) else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_CROSSFIRE) { sportSendBuffer(extmodulePulsesData.crossfire.pulses, extmodulePulsesData.crossfire.length); } -#endif -#if defined(PXX2) - else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { - sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); - } #endif else { EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; From 9472fd2132d7050611617d674abeee3019ef6117 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Feb 2019 12:27:52 +0100 Subject: [PATCH 212/446] PXX2 pulses now received on external module --- radio/src/pulses/pxx2.h | 3 +++ .../arm/stm32/intmodule_serial_driver.cpp | 3 +-- radio/src/targets/taranis/extmodule_driver.cpp | 6 ++++-- radio/src/telemetry/telemetry.cpp | 17 +++++++++++++---- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index c47870c9f..362da452b 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -88,9 +88,12 @@ class ModuleFifo : public Fifo { ridx = nextIndex(next); return true; } + + uint32_t errors; }; extern ModuleFifo intmoduleFifo; +extern ModuleFifo extmoduleFifo; class Pxx2CrcMixin { protected: diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index b0526e308..36c6a2f45 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -21,7 +21,6 @@ #include "opentx.h" ModuleFifo intmoduleFifo; -uint8_t intmoduleErrors; void intmoduleStop() { @@ -80,7 +79,7 @@ extern "C" void INTMODULE_USART_IRQHandler(void) while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { uint8_t data = INTMODULE_USART->DR; if (status & USART_FLAG_ERRORS) { - intmoduleErrors++; + intmoduleFifo.errors++; } else { intmoduleFifo.push(data); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 4be33ab1a..26a9554b9 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -110,6 +110,8 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) } #if defined(EXTMODULE_USART) +ModuleFifo extmoduleFifo; + void extmoduleInvertedSerialStart(uint32_t baudrate) { EXTERNAL_MODULE_ON(); @@ -182,10 +184,10 @@ extern "C" void EXTMODULE_USART_IRQHandler(void) while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { uint8_t data = EXTMODULE_USART->DR; if (status & USART_FLAG_ERRORS) { - // TODO later extmoduleErrors++; + extmoduleFifo.errors++; } else { - // TODO later extmoduleFifo.push(data); + extmoduleFifo.push(data); } status = EXTMODULE_USART->SR; } diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 6ef2d3dcd..9880279f8 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -211,11 +211,20 @@ void telemetryWakeup() } #endif -#if defined(INTMODULE_USART) +#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) uint8_t frame[32]; - if (intmoduleFifo.getFrame(frame)) { - processModuleFrame(INTERNAL_MODULE, frame); - } + + #if defined(INTMODULE_USART) + if (intmoduleFifo.getFrame(frame)) { + processModuleFrame(INTERNAL_MODULE, frame); + } + #endif + + #if defined(EXTMODULE_USART) + if (extmoduleFifo.getFrame(frame)) { + processModuleFrame(EXTERNAL_MODULE, frame); + } + #endif #endif #if defined(STM32) From 2559a84a24a75725cd9cb97e913ea9315456417b Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 21 Feb 2019 13:17:00 +0100 Subject: [PATCH 213/446] Bind and registration ok (hoppefully...) --- radio/src/opentx.cpp | 2 +- radio/src/opentx.h | 1 + radio/src/pulses/pxx2.cpp | 6 +++--- radio/src/strhelpers.cpp | 10 ++++++++++ radio/src/telemetry/telemetry.cpp | 16 +++------------- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 4b416ac11..02e7fcfca 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -337,7 +337,7 @@ void defaultInputs() expo->mode = 3; // TODO constant #if defined(TRANSLATIONS_CZ) for (int c=0; c<4; c++) { - g_model.inputNames[i][c] = char2idx(STR_INPUTNAMES[1+4*(stick_index-1)+c]); + g_model.inputNames[i][c] = char2zchar(STR_INPUTNAMES[1+4*(stick_index-1)+c]); } #else for (int c=0; c<3; c++) { diff --git a/radio/src/opentx.h b/radio/src/opentx.h index bc7a7e90e..a5a9f388a 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -435,6 +435,7 @@ char zchar2char(int8_t idx); int8_t char2zchar(char c); void str2zchar(char *dest, const char *src, int size); int zchar2str(char *dest, const char *src, int size); +int cmpStrWithZchar(char * charString, char * zcharString, int size); #include "keys.h" #include "pwr.h" diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index afe9f12b8..19203d594 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -61,10 +61,10 @@ bool Pxx2Pulses::setupRegisterFrame(uint8_t module) if (reusableBuffer.modelSetup.pxx2.registerStep == REGISTER_RX_NAME_SELECTED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i 0) { diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 9880279f8..5de62bb3e 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -79,13 +79,13 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) if (frame[3] == 0x00 && reusableBuffer.modelSetup.pxx2.registerStep == REGISTER_START) { // RX_NAME follows, we store it for the next step - memcpy(reusableBuffer.modelSetup.pxx2.registerRxName, &frame[4], PXX2_LEN_RX_NAME); + str2zchar(reusableBuffer.modelSetup.pxx2.registerRxName, (const char *)&frame[4], PXX2_LEN_RX_NAME); reusableBuffer.modelSetup.pxx2.registerStep = REGISTER_RX_NAME_RECEIVED; } else if (frame[3] == 0x01 && reusableBuffer.modelSetup.pxx2.registerStep == REGISTER_RX_NAME_SELECTED) { // RX_NAME + PASSWORD follow, we check they are good - if (memcmp(&frame[4], reusableBuffer.modelSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME) == 0 && - memcmp(&frame[12], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { + if (cmpStrWithZchar((char *) &frame[4], reusableBuffer.modelSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME) == 0 && + cmpStrWithZchar((char *)&frame[12], g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0) { reusableBuffer.modelSetup.pxx2.registerStep = REGISTER_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; POPUP_INFORMATION(STR_REG_OK); @@ -109,16 +109,6 @@ void processBindFrame(uint8_t module, uint8_t * frame) } if (!found && reusableBuffer.modelSetup.pxx2.bindCandidateReceiversCount < PXX2_MAX_RECEIVERS_PER_MODULE) { memcpy(reusableBuffer.modelSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.modelSetup.pxx2.bindCandidateReceiversCount], &frame[4], PXX2_LEN_RX_NAME); - /*char * c = reusableBuffer.modelSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.modelSetup.pxx2.bindCandidateReceiversCount]; - for (uint8_t i=0; i> 4); - *c++ = (quartet >= 10 ? quartet + 'A' - 10 : quartet + '0'); - quartet = (byte & 0x0f); - *c++ = (quartet >= 10 ? quartet + 'A' - 10 : quartet + '0'); - *c++ = ' '; - } - *c = '\0';*/ ++reusableBuffer.modelSetup.pxx2.bindCandidateReceiversCount; reusableBuffer.modelSetup.pxx2.bindStep = BIND_RX_NAME_RECEIVED; } From 5979b319b722db1b215c663601b1579982f43309 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 21 Feb 2019 16:08:45 +0100 Subject: [PATCH 214/446] Display receiver name after successful bind --- radio/src/gui/128x64/model_setup.cpp | 8 ++++---- radio/src/pulses/pxx2.cpp | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 521e70eba..8c48fd740 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1217,7 +1217,7 @@ void menuModelSetup(event_t event) uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); lcdDrawTextAlignedLeft(y, STR_RECEIVER); - lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, PXX2_LEN_RX_NAME, 0); + lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, PXX2_LEN_RX_NAME, ZCHAR); } break; @@ -1281,15 +1281,15 @@ void menuModelSetup(event_t event) s_editMode = 0; } if (reusableBuffer.modelSetup.pxx2.bindStep == BIND_OK) { - memcpy(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].rxName, reusableBuffer.modelSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.modelSetup.pxx2.bindSelectedReceiverIndex], PXX2_LEN_RX_NAME); + str2zchar(g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, reusableBuffer.modelSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.modelSetup.pxx2.bindSelectedReceiverIndex], PXX2_LEN_RX_NAME); } } else if (menuHorizontalPosition == 1 && s_editMode > 0) { if (receiverIdx == 0) { - memcpy(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[0], &g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[1], sizeof(ReceiverData)); + memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[0], &g_model.moduleData[moduleIdx].pxx2.receivers[1], sizeof(ReceiverData)); menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER + 1; } - memclear(&g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx], sizeof(ReceiverData)); + memclear(&g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx], sizeof(ReceiverData)); s_editMode = 0; killEvents(event); } diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 19203d594..5484f59b4 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -81,6 +81,7 @@ bool Pxx2Pulses::setupBindFrame(uint8_t module) if (reusableBuffer.modelSetup.pxx2.bindStep == BIND_WAIT) { if (get_tmr10ms() > reusableBuffer.modelSetup.pxx2.bindWaitTimeout) { moduleSettings[module].mode = MODULE_MODE_NORMAL; + reusableBuffer.modelSetup.pxx2.bindStep = BIND_OK; POPUP_INFORMATION(STR_BIND_OK); } else { From a4434bc5f3ab6a4c5626391b6d1ea0d920948aac Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Feb 2019 16:57:17 +0100 Subject: [PATCH 215/446] Fixes. Flash an external module should work --- .../src/gui/common/stdlcd/radio_sdmanager.cpp | 1 + radio/src/io/frsky_device_firmware_update.cpp | 87 +++++++++++++------ ...o_arm.h => frsky_device_firmware_update.h} | 35 ++------ radio/src/io/frsky_pxx2.h | 65 ++++++++++++++ radio/src/io/{pxx2.h => frsky_sport.h} | 29 ++++++- radio/src/opentx.h | 2 +- radio/src/pulses/pulses.cpp | 2 +- radio/src/pulses/pxx2.h | 37 +------- .../common/arm/stm32/bluetooth_driver.cpp | 6 +- .../arm/stm32/intmodule_serial_driver.cpp | 2 + radio/src/targets/horus/extmodule_driver.cpp | 2 +- radio/src/targets/horus/hal.h | 2 +- radio/src/targets/taranis/board.h | 2 + .../src/targets/taranis/extmodule_driver.cpp | 6 +- radio/src/targets/taranis/hal.h | 4 +- radio/src/telemetry/frsky.cpp | 23 ++++- radio/src/telemetry/frsky.h | 3 +- 17 files changed, 200 insertions(+), 108 deletions(-) rename radio/src/io/{io_arm.h => frsky_device_firmware_update.h} (71%) create mode 100644 radio/src/io/frsky_pxx2.h rename radio/src/io/{pxx2.h => frsky_sport.h} (54%) diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index 5e2d753fc..7792238d6 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -19,6 +19,7 @@ */ #include "opentx.h" +#include "io/frsky_device_firmware_update.h" #define REFRESH_FILES() do { reusableBuffer.sdmanager.offset = 65535; menuVerticalPosition = 0; } while(0) #define NODE_TYPE(fname) fname[SD_SCREEN_FILE_LENGTH+1] diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp index 66b005a17..37c42e811 100644 --- a/radio/src/io/frsky_device_firmware_update.cpp +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -19,6 +19,7 @@ */ #include "opentx.h" +#include "frsky_device_firmware_update.h" #define PRIM_REQ_POWERUP 0 #define PRIM_REQ_VERSION 1 @@ -32,10 +33,10 @@ #define PRIM_END_DOWNLOAD 0x83 #define PRIM_DATA_CRC_ERR 0x84 -void DeviceFirmwareUpdate::processFrame() +void DeviceFirmwareUpdate::processFrame(const uint8_t * frame) { - if (frame[1] == 0x5E && frame[2] == 0x50) { - switch (frame[3]) { + if (frame[0] == 0x5E && frame[1] == 0x50) { + switch (frame[2]) { case PRIM_ACK_POWERUP : if (state == SPORT_POWERUP_REQ) { state = SPORT_POWERUP_ACK; @@ -51,7 +52,7 @@ void DeviceFirmwareUpdate::processFrame() case PRIM_REQ_DATA_ADDR: if (state == SPORT_DATA_TRANSFER) { - address = *((uint32_t *)(&frame[4])); + address = *((uint32_t *)(&frame[3])); state = SPORT_DATA_REQ; } break; @@ -76,6 +77,12 @@ void DeviceFirmwareUpdate::startup() break; #endif + case EXTERNAL_MODULE: +#if defined(EXTMODULE_USART) + extmoduleInvertedSerialStart(57600); + break; +#endif + default: telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); break; @@ -87,21 +94,56 @@ void DeviceFirmwareUpdate::startup() EXTERNAL_MODULE_ON(); else SPORT_UPDATE_POWER_ON(); - - watchdogSuspend(50); - RTOS_WAIT_MS(50); } -bool DeviceFirmwareUpdate::readByte(uint8_t & byte) +const uint8_t * DeviceFirmwareUpdate::readFullDuplexFrame(ModuleFifo & fifo, uint32_t timeout) +{ + uint8_t len = 0; + while (len < 10) { + uint32_t elapsed = 0; + while (!fifo.pop(frame[len])) { + RTOS_WAIT_MS(1); + if (elapsed++ >= timeout) { + return nullptr; + } + } + if (len > 0 || frame[len] == 0x7E) { + ++len; + } + } + + return &frame[1]; +} + +const uint8_t * DeviceFirmwareUpdate::readHalfDuplexFrame(uint32_t timeout) +{ + for (int i=timeout; i>=0; i--) { + uint8_t byte ; + while (telemetryGetByte(&byte)) { + if (pushFrskyTelemetryData(byte)) { + return telemetryRxBuffer; + } + } + RTOS_WAIT_MS(1); + } + return nullptr; +} + +const uint8_t * DeviceFirmwareUpdate::readFrame(uint32_t timeout) { switch(module) { case INTERNAL_MODULE: #if defined(INTMODULE_USART) - return intmoduleFifo.pop(byte); + return readFullDuplexFrame(intmoduleFifo, timeout); +#endif + + case EXTERNAL_MODULE: +#if defined(EXTMODULE_USART) + return readFullDuplexFrame(extmoduleFifo, timeout); #endif default: - return telemetryGetByte(&byte); + return readHalfDuplexFrame(timeout); } } @@ -114,22 +156,12 @@ bool DeviceFirmwareUpdate::waitState(State state, uint32_t timeout) #else watchdogSuspend(timeout / 10); - uint8_t len = 0; - while (len < 10) { - uint32_t elapsed = 0; - while (!readByte(frame[len])) { - RTOS_WAIT_MS(1); - if (elapsed++ >= timeout) { - return false; - } - } - if (len > 0 || frame[len] == 0x7E) { - ++len; - } + const uint8_t * frame = readFrame(timeout); + if (!frame) { + return false; } - processFrame(); - + processFrame(&frame[1]); return state == state; #endif } @@ -164,6 +196,11 @@ void DeviceFirmwareUpdate::sendFrame() return intmoduleSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer); #endif + case EXTERNAL_MODULE: +#if defined(EXTMODULE_USART) + return extmoduleSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer); +#endif + default: return sportSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer); } @@ -171,8 +208,8 @@ void DeviceFirmwareUpdate::sendFrame() const char * DeviceFirmwareUpdate::sendPowerOn() { - waitState(SPORT_IDLE, 20); // Clear the fifo state = SPORT_POWERUP_REQ; + waitState(SPORT_IDLE, 50); // Wait 50ms and clear the fifo for (int i=0; i<10; i++) { // max 10 attempts startFrame(PRIM_REQ_POWERUP); diff --git a/radio/src/io/io_arm.h b/radio/src/io/frsky_device_firmware_update.h similarity index 71% rename from radio/src/io/io_arm.h rename to radio/src/io/frsky_device_firmware_update.h index 2a929d86e..729120895 100644 --- a/radio/src/io/io_arm.h +++ b/radio/src/io/frsky_device_firmware_update.h @@ -18,32 +18,11 @@ * GNU General Public License for more details. */ -#ifndef _IO_ARM_H_ -#define _IO_ARM_H_ +#ifndef _FRSKY_DEVICE_FIRMWARE_UPDATE_H_ +#define _FRSKY_DEVICE_FIRMWARE_UPDATE_H_ #include "dataconstants.h" - -#if defined(TELEMETRY_FRSKY_SPORT) -PACK(union SportTelemetryPacket -{ - struct { - uint8_t physicalId; - uint8_t primId; - uint16_t dataId; - uint32_t value; - }; - uint8_t raw[8]; -}); - -bool isSportOutputBufferAvailable(); -void sportOutputPushPacket(SportTelemetryPacket * packet); -void sportFlashDevice(ModuleIndex module, const char * filename); -#endif - -#if defined(STM32) -bool isBootloader(const char * filename); -void bootloaderFlash(const char * filename); -#endif +#include "frsky_pxx2.h" class DeviceFirmwareUpdate { enum State { @@ -76,9 +55,11 @@ class DeviceFirmwareUpdate { void startFrame(uint8_t command); void sendFrame(); - bool readByte(uint8_t & byte); + const uint8_t * readFullDuplexFrame(ModuleFifo & fifo, uint32_t timeout); + const uint8_t * readHalfDuplexFrame(uint32_t timeout); + const uint8_t * readFrame(uint32_t timeout); bool waitState(State state, uint32_t timeout); - void processFrame(); + void processFrame(const uint8_t * frame); const char * sendPowerOn(); const char * sendReqVersion(); @@ -86,4 +67,4 @@ class DeviceFirmwareUpdate { const char * endTransfer(); }; -#endif // _IO_ARM_H_ +#endif // _FRSKY_DEVICE_FIRMWARE_UPDATE_H_ diff --git a/radio/src/io/frsky_pxx2.h b/radio/src/io/frsky_pxx2.h new file mode 100644 index 000000000..f19d2c5c9 --- /dev/null +++ b/radio/src/io/frsky_pxx2.h @@ -0,0 +1,65 @@ +/* + * 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 _IO_PXX2_H_ +#define _IO_PXX2_H_ + +#include "fifo.h" + +#define PXX2_BAUDRATE 230400 +#define PXX2_PERIOD 4 // 4ms + +class ModuleFifo : public Fifo { + public: + bool getFrame(uint8_t * frame) + { + while (1) { + if (isEmpty()) { + return false; + } + else if (fifo[ridx] != 0x7E) { + skip(); + } + else { + break; + } + } + + uint32_t next = nextIndex(ridx); + uint8_t len = fifo[next]; + if (unsigned(len + 4 /* 2 bytes header + 2 bytes CRC */) > size()) { + return false; + } + + for (uint32_t i=0; i<=len; i++) { + frame[i] = fifo[next]; + next = nextIndex(next); + } + + // TODO CRC CHECK + next = nextIndex(next); + ridx = nextIndex(next); + return true; + } + + uint32_t errors; +}; + +#endif diff --git a/radio/src/io/pxx2.h b/radio/src/io/frsky_sport.h similarity index 54% rename from radio/src/io/pxx2.h rename to radio/src/io/frsky_sport.h index 3a1506a67..e00e11784 100644 --- a/radio/src/io/pxx2.h +++ b/radio/src/io/frsky_sport.h @@ -18,10 +18,31 @@ * GNU General Public License for more details. */ -#ifndef _IO_PXX2_H_ -#define _IO_PXX2_H_ +#ifndef _IO_FRSKY_SPORT_H_ +#define _IO_FRSKY_SPORT_H_ -#define PXX2_BAUDRATE 230400 -#define PXX2_PERIOD 4 // 4ms +#include "dataconstants.h" +#if defined(TELEMETRY_FRSKY_SPORT) +PACK(union SportTelemetryPacket +{ + struct { + uint8_t physicalId; + uint8_t primId; + uint16_t dataId; + uint32_t value; + }; + uint8_t raw[8]; +}); + +bool isSportOutputBufferAvailable(); +void sportOutputPushPacket(SportTelemetryPacket * packet); +void sportFlashDevice(ModuleIndex module, const char * filename); #endif + +#if defined(STM32) +bool isBootloader(const char * filename); +void bootloaderFlash(const char * filename); +#endif + +#endif // _IO_FRSKY_SPORT_H_ diff --git a/radio/src/opentx.h b/radio/src/opentx.h index a5a9f388a..1324a6ae0 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -294,7 +294,7 @@ void memswap(void * a, void * b, uint8_t size); #endif #include "fifo.h" -#include "io/io_arm.h" +#include "io/frsky_sport.h" extern volatile tmr10ms_t g_tmr10ms; static inline tmr10ms_t get_tmr10ms() diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 799d0c3f9..2e2833430 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -19,7 +19,7 @@ */ #include "opentx.h" -#include "io/pxx2.h" +#include "io/frsky_pxx2.h" #include "pulses/pxx2.h" uint8_t s_pulses_paused = 0; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 362da452b..dcd64a9c3 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -22,6 +22,7 @@ #define _PULSES_PXX2_H_ #include "fifo.h" +#include "io/frsky_pxx2.h" #include "./pxx.h" #define PXX2_TYPE_C_MODULE 0x01 @@ -56,42 +57,6 @@ enum PXX2BindSteps { BIND_OK }; -class ModuleFifo : public Fifo { - public: - bool getFrame(uint8_t * frame) - { - while (1) { - if (isEmpty()) { - return false; - } - else if (fifo[ridx] != 0x7E) { - skip(); - } - else { - break; - } - } - - uint32_t next = nextIndex(ridx); - uint8_t len = fifo[next]; - if (size() < unsigned(len + 4 /* 2 bytes header + 2 bytes CRC */)) { - return false; - } - - for (uint32_t i=0; i<=len; i++) { - frame[i] = fifo[next]; - next = nextIndex(next); - } - - // TODO CRC CHECK - next = nextIndex(next); - ridx = nextIndex(next); - return true; - } - - uint32_t errors; -}; - extern ModuleFifo intmoduleFifo; extern ModuleFifo extmoduleFifo; diff --git a/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp b/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp index 42973e7d4..3f2bb898e 100644 --- a/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp +++ b/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp @@ -59,13 +59,13 @@ void bluetoothInit(uint32_t baudrate) GPIO_Init(BT_BCTS_GPIO, &GPIO_InitStructure); #endif - GPIO_PinAFConfig(BT_GPIO_TXRX, BT_TX_GPIO_PinSource, BT_GPIO_AF); - GPIO_PinAFConfig(BT_GPIO_TXRX, BT_RX_GPIO_PinSource, BT_GPIO_AF); + GPIO_PinAFConfig(BT_USART_GPIO, BT_TX_GPIO_PinSource, BT_GPIO_AF); + GPIO_PinAFConfig(BT_USART_GPIO, BT_RX_GPIO_PinSource, BT_GPIO_AF); GPIO_InitStructure.GPIO_Pin = BT_TX_GPIO_PIN | BT_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(BT_GPIO_TXRX, &GPIO_InitStructure); + GPIO_Init(BT_USART_GPIO, &GPIO_InitStructure); USART_DeInit(BT_USART); USART_InitTypeDef USART_InitStructure; diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 36c6a2f45..30fcfda33 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -66,6 +66,8 @@ void intmoduleSerialStart(uint32_t baudrate) USART_Init(INTMODULE_USART, &USART_InitStructure); USART_Cmd(INTMODULE_USART, ENABLE); + intmoduleFifo.clear(); + USART_ITConfig(INTMODULE_USART, USART_IT_RXNE, ENABLE); NVIC_SetPriority(INTMODULE_USART_IRQn, 6); NVIC_EnableIRQ(INTMODULE_USART_IRQn); diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 86cd8257f..87a8a0ec5 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -185,7 +185,7 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us) #endif #if defined(EXTMODULE_USART) -void extmoduleSendSerialBuffer(const uint8_t * data, uint8_t size) +void extmoduleSendBuffer(const uint8_t * data, uint8_t size) { DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(EXTMODULE_DMA_STREAM); diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index ea266b93e..1613ed2c0 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -631,7 +631,7 @@ #define BT_USART USART6 #define BT_GPIO_AF GPIO_AF_USART6 #define BT_USART_IRQn USART6_IRQn -#define BT_GPIO_TXRX GPIOG +#define BT_USART_GPIO GPIOG #define BT_TX_GPIO_PIN GPIO_Pin_14 // PG.14 #define BT_RX_GPIO_PIN GPIO_Pin_9 // PG.09 #define BT_TX_GPIO_PinSource GPIO_PinSource14 diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 62b492951..1853d7cd2 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -192,6 +192,8 @@ void extmodulePpmStart(); void extmodulePxxStart(); void extmodulePxx2Start(); void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us); +void extmoduleInvertedSerialStart(uint32_t baudrate); +void extmoduleSendBuffer(const uint8_t * data, uint8_t size); void extmoduleSendNextFrame(); // Trainer driver diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 26a9554b9..dc94f11f2 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -147,12 +147,14 @@ void extmoduleInvertedSerialStart(uint32_t baudrate) USART_Init(EXTMODULE_USART, &USART_InitStructure); USART_Cmd(EXTMODULE_USART, ENABLE); + extmoduleFifo.clear(); + USART_ITConfig(INTMODULE_USART, USART_IT_RXNE, ENABLE); NVIC_SetPriority(EXTMODULE_USART_IRQn, 6); NVIC_EnableIRQ(EXTMODULE_USART_IRQn); } -void extmoduleSendSerialBuffer(const uint8_t * data, uint8_t size) +void extmoduleSendBuffer(const uint8_t * data, uint8_t size) { DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(EXTMODULE_USART_DMA_STREAM); @@ -295,7 +297,7 @@ void extmoduleSendNextFrame() #if defined(PXX2) else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { #if defined(EXTMODULE_USART) - extmoduleSendSerialBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); + extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); #else sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); #endif diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 3cede1e72..e25fcfdd8 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1284,7 +1284,7 @@ #define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG) #define BT_RCC_APB1Periph 0 #define BT_RCC_APB2Periph RCC_APB2Periph_USART6 - #define BT_GPIO_TXRX GPIOG + #define BT_USART_GPIO GPIOG #define BT_TX_GPIO_PIN GPIO_Pin_14 // PG.14 #define BT_RX_GPIO_PIN GPIO_Pin_9 // PG.09 #define BT_EN_GPIO GPIOD @@ -1306,7 +1306,7 @@ #else #define BT_EN_GPIO_PIN GPIO_Pin_12 // PE.12 #endif - #define BT_GPIO_TXRX GPIOB + #define BT_USART_GPIO GPIOB #define BT_TX_GPIO_PIN GPIO_Pin_10 // PB.10 #define BT_RX_GPIO_PIN GPIO_Pin_11 // PB.11 #define BT_TX_GPIO_PinSource GPIO_PinSource10 diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 053d907d9..8098a8a74 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -92,8 +92,6 @@ void processFrskyPXX2Data(uint8_t data) void processFrskyTelemetryData(uint8_t data) { - static uint8_t dataState = STATE_DATA_IDLE; - #if defined(PCBSKY9X) && defined(BLUETOOTH) // TODO if (g_model.bt_telemetry) btPushByte(data); @@ -111,6 +109,19 @@ void processFrskyTelemetryData(uint8_t data) } #endif + if (pushFrskyTelemetryData(data)) { + if (IS_FRSKY_SPORT_PROTOCOL()) { + sportProcessTelemetryPacket(telemetryRxBuffer); + } else { + frskyDProcessPacket(telemetryRxBuffer); + } + } +} + +bool pushFrskyTelemetryData(uint8_t data) +{ + static uint8_t dataState = STATE_DATA_IDLE; + switch (dataState) { case STATE_DATA_START: if (data == START_STOP) { @@ -138,8 +149,8 @@ void processFrskyTelemetryData(uint8_t data) } else { // end of frame detected - frskyDProcessPacket(telemetryRxBuffer); dataState = STATE_DATA_IDLE; + return true; } break; } @@ -166,9 +177,13 @@ void processFrskyTelemetryData(uint8_t data) #if defined(TELEMETRY_FRSKY_SPORT) if (IS_FRSKY_SPORT_PROTOCOL() && telemetryRxBufferCount >= FRSKY_SPORT_PACKET_SIZE) { - sportProcessTelemetryPacket(telemetryRxBuffer); + // end of frame detected dataState = STATE_DATA_IDLE; + return true; } #endif + + return false; } + diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 7e2068830..a30ec7ac0 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -23,7 +23,7 @@ #include "../definitions.h" #include "telemetry_holders.h" -#include "../io/pxx2.h" +#include "io/frsky_pxx2.h" // Receive buffer state machine state enum enum FrSkyDataState { @@ -313,6 +313,7 @@ struct TelemetryData { extern TelemetryData telemetryData; +bool pushFrskyTelemetryData(uint8_t data); // returns true when end of frame detected void processFrskyTelemetryData(uint8_t data); void processFrskyPXX2Data(uint8_t data); From cc5838ad49dceec8e6fec131d52b738bd78533fd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Feb 2019 18:07:25 +0100 Subject: [PATCH 216/446] REGISTER Fix --- radio/src/opentx.cpp | 2 +- radio/src/opentx.h | 2 +- radio/src/strhelpers.cpp | 12 ++++++------ radio/src/telemetry/telemetry.cpp | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 02e7fcfca..0e6429cf0 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -303,7 +303,7 @@ void generalDefault() #endif for (uint8_t i=0; i= 'a') return 'a' - c - 1; if (c >= 'A') return c - 'A' + 1; - if (c >= '0') return -(c - '0' + 27); + if (c >= '0') return c - '0' + 27; if (c == '-') return 38; if (c == '.') return 39; if (c == ',') return 40; @@ -78,14 +78,14 @@ int zchar2str(char * dest, const char * src, int size) return size+1; } -int cmpStrWithZchar(char * charString, char * zcharString, int size) +bool cmpStrWithZchar(const char * charString, const char * zcharString, int size) { - for(int i=0; i < size; i++) { - if((uint8_t)char2zchar(charString[i]) != (uint8_t)zcharString[i]) { - return 1; + for (int i=0; i Date: Thu, 21 Feb 2019 18:23:18 +0100 Subject: [PATCH 217/446] Revert --- radio/src/strhelpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp index e0e047376..7ddb1ce8b 100644 --- a/radio/src/strhelpers.cpp +++ b/radio/src/strhelpers.cpp @@ -52,7 +52,7 @@ int8_t char2zchar(char c) #endif if (c >= 'a') return 'a' - c - 1; if (c >= 'A') return c - 'A' + 1; - if (c >= '0') return c - '0' + 27; + if (c >= '0') return -(c - '0' + 27); if (c == '-') return 38; if (c == '.') return 39; if (c == ',') return 40; From 84bf2aa0bfccf50cba481c62e8142a39e3ef3ac7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Feb 2019 18:26:59 +0100 Subject: [PATCH 218/446] Again --- radio/src/strhelpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp index 7ddb1ce8b..e0e047376 100644 --- a/radio/src/strhelpers.cpp +++ b/radio/src/strhelpers.cpp @@ -52,7 +52,7 @@ int8_t char2zchar(char c) #endif if (c >= 'a') return 'a' - c - 1; if (c >= 'A') return c - 'A' + 1; - if (c >= '0') return -(c - '0' + 27); + if (c >= '0') return c - '0' + 27; if (c == '-') return 38; if (c == '.') return 39; if (c == ',') return 40; From c76992c12619de5d4cff0dfecbc62d902ea7e7a2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Feb 2019 18:33:09 +0100 Subject: [PATCH 219/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 8c48fd740..d583b9e96 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -326,8 +326,10 @@ void runPopupRegister(event_t event) lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, "Reg. ID"); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Rx Name"); - editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.modelSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); + if (reusableBuffer.modelSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Rx Name"); + editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.modelSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); + } lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); From 2dc061ec4447f0eb3ec6ea823f0638999b624870 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 22 Feb 2019 07:24:31 +0100 Subject: [PATCH 220/446] Cosmetics mostly --- radio/src/gui/128x64/model_setup.cpp | 14 ++++++++------ radio/src/io/frsky_pxx2.h | 2 +- radio/src/telemetry/frsky.h | 2 +- radio/src/translations.cpp | 2 ++ radio/src/translations.h | 2 ++ radio/src/translations/cz.h.txt | 2 ++ radio/src/translations/de.h.txt | 2 ++ radio/src/translations/en.h.txt | 2 ++ radio/src/translations/es.h.txt | 2 ++ radio/src/translations/fi.h.txt | 2 ++ radio/src/translations/fr.h.txt | 2 ++ radio/src/translations/it.h.txt | 2 ++ radio/src/translations/nl.h.txt | 2 ++ radio/src/translations/pl.h.txt | 2 ++ radio/src/translations/pt.h.txt | 2 ++ radio/src/translations/se.h.txt | 2 ++ 16 files changed, 36 insertions(+), 8 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index d583b9e96..4eec6609f 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -323,11 +323,11 @@ void runPopupRegister(event_t event) drawMessageBox(); - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, "Reg. ID"); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, STR_REG_ID); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); if (reusableBuffer.modelSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Rx Name"); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, STR_RX_NAME); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.modelSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); } @@ -394,7 +394,7 @@ void menuModelSetup(event_t event) IF_PXX2(0), // RxNum ANTENNA_ROW IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Module start channel (pxx2 always send 16) - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Range check and Register buttons + IF_PXX2(1), // Range check and Register buttons IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, (uint8_t)-1), // Receiver Name IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Telemetry @@ -1158,7 +1158,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RANGE_REGISTER: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawTextAlignedLeft(y, INDENT "Module"); + lcdDrawTextAlignedLeft(y, STR_MODULE); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, (menuHorizontalPosition == 0 ? attr : 0)); lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition == 1 ? attr : 0)); if (attr) { @@ -1191,8 +1191,8 @@ void menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_PXX2_ADD_RECEIVER: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawText(INDENT_WIDTH, y, "Receiver"); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, "[Add]", attr); + lcdDrawTextAlignedLeft(y, STR_RECEIVER); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_RXADD_BUTTON, attr); if (attr && s_editMode > 0) { if (g_model.moduleData[moduleIdx].pxx2.receivers[0].enabled) { g_model.moduleData[moduleIdx].pxx2.receivers[1].enabled = 0x01; @@ -1206,6 +1206,7 @@ void menuModelSetup(event_t event) } killEvents(event); s_editMode = 0; + storageDirty(EE_MODEL); } } break; @@ -1294,6 +1295,7 @@ void menuModelSetup(event_t event) memclear(&g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx], sizeof(ReceiverData)); s_editMode = 0; killEvents(event); + storageDirty(EE_MODEL); } } } diff --git a/radio/src/io/frsky_pxx2.h b/radio/src/io/frsky_pxx2.h index f19d2c5c9..b879ebec6 100644 --- a/radio/src/io/frsky_pxx2.h +++ b/radio/src/io/frsky_pxx2.h @@ -21,7 +21,7 @@ #ifndef _IO_PXX2_H_ #define _IO_PXX2_H_ -#include "fifo.h" +#include "../fifo.h" #define PXX2_BAUDRATE 230400 #define PXX2_PERIOD 4 // 4ms diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index a30ec7ac0..b665f4fdf 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -23,7 +23,7 @@ #include "../definitions.h" #include "telemetry_holders.h" -#include "io/frsky_pxx2.h" +#include "../io/frsky_pxx2.h" // Receive buffer state machine state enum enum FrSkyDataState { diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index b88c9d7be..5a87cb002 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -584,6 +584,7 @@ const char STR_BLCOLOR[] = TR_BLCOLOR; const char STR_TRAINER[] = TR_TRAINER; const char STR_MODULE_BIND[] = TR_MODULE_BIND; +const char STR_RXADD_BUTTON[] = TR_RXADD_BUTTON; const char STR_BINDING_1_8_TELEM_ON[] = TR_BINDING_CH1_8_TELEM_ON; const char STR_BINDING_1_8_TELEM_OFF[] = TR_BINDING_CH1_8_TELEM_OFF; const char STR_BINDING_9_16_TELEM_ON[] = TR_BINDING_CH9_16_TELEM_ON; @@ -652,6 +653,7 @@ const char STR_BLCOLOR[] = TR_BLCOLOR; const char STR_BYTES[] = TR_BYTES; const char STR_ANTENNAPROBLEM[] = TR_ANTENNAPROBLEM; const char STR_MODULE[] = TR_MODULE; +const char STR_RX_NAME[] = TR_RX_NAME; const char STR_ENABLE_POPUP[] = TR_ENABLE_POPUP; const char STR_DISABLE_POPUP[] = TR_DISABLE_POPUP; const char STR_POPUP[] = TR_POPUP; diff --git a/radio/src/translations.h b/radio/src/translations.h index 383363a63..1ac8564d7 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -849,6 +849,7 @@ extern const char STR_EXPONAME[]; extern const char STR_TRAINER[]; extern const char STR_MODULE_BIND[]; +extern const char STR_RXADD_BUTTON[]; extern const char STR_BINDING_1_8_TELEM_ON[]; extern const char STR_BINDING_1_8_TELEM_OFF[]; extern const char STR_BINDING_9_16_TELEM_ON[]; @@ -917,6 +918,7 @@ extern const char STR_MULTI_RFPOWER[]; extern const char STR_BYTES[]; extern const char STR_ANTENNAPROBLEM[]; extern const char STR_MODULE[]; +extern const char STR_RX_NAME[]; extern const char STR_ENABLE_POPUP[]; extern const char STR_DISABLE_POPUP[]; extern const char STR_POPUP[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index b6602dc9f..b0f226537 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -961,6 +961,7 @@ #define TR_BUZZER INDENT"Pípák" #define TR_BYTES "[B]" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) +#define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") @@ -969,6 +970,7 @@ #define TR_ANTENNAPROBLEM CENTER "Problém s TX anténou!" #define TR_MODELIDUSED TR("ID již použito","ID modelu je již použito") #define TR_MODULE INDENT "Modul" +#define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Typ", "Typ telemetrie") #define TR_TELEMETRY_SENSORS "Senzory" #define TR_VALUE "Hodnota" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index c0c7edd59..fda129655 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -966,6 +966,7 @@ #define TR_BUZZER INDENT "Summer" #define TR_BYTES "Bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd","Bind")) //9XR-Pro +#define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) //9XR-Pro #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") @@ -974,6 +975,7 @@ #define TR_ANTENNAPROBLEM CENTER "TX-Antennenproblem!" #define TR_MODELIDUSED TR("ID schon benutzt", "Modell-ID schon benutzt") #define TR_MODULE INDENT "Modul-Typ" +#define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Typ", "Telemetrietyp") #define TR_TELEMETRY_SENSORS "Sensoren" #define TR_VALUE "Wert" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 59afceeea..b16ac76c2 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -965,6 +965,7 @@ #define TR_BUZZER INDENT "Buzzer" #define TR_BYTES "bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) +#define TR_RXADD_BUTTON BUTTON("Add") #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") @@ -977,6 +978,7 @@ #define TR_MODELIDUSED TR("ID used in:","Receiver ID used in:") #endif #define TR_MODULE INDENT "Module" +#define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Type", "Telemetry type") #define TR_TELEMETRY_SENSORS "Sensors" #define TR_VALUE "Value" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 4f8b92c5d..cd874fa3b 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -972,6 +972,7 @@ #define TR_BUZZER INDENT"Zumbador" #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Enlace]" +#define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Limites]" #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" @@ -980,6 +981,7 @@ #define TR_ANTENNAPROBLEM CENTER "¡Problema antena TX!" #define TR_MODELIDUSED TR("ID en uso", "ID modelo en uso") #define TR_MODULE INDENT "Modulo" +#define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Type", "Telemetry Type") #define TR_TELEMETRY_SENSORS "Sensors" #define TR_VALUE "Value" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 035415480..3704d8c5e 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -964,6 +964,7 @@ #define TR_BUZZER INDENT"Buzzer" #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Bind]" +#define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Range]" #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" @@ -972,6 +973,7 @@ #define TR_ANTENNAPROBLEM CENTER "TX Antenna problem!" #define TR_MODELIDUSED TR("ID used in:", "Receiver ID used in:") #define TR_MODULE INDENT "Module" +#define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Type", "Telemetry Type") #define TR_TELEMETRY_SENSORS "Sensors" #define TR_VALUE "Value" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index e51b559ce..4f4d5e390 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -976,6 +976,7 @@ #define TR_BUZZER INDENT "Bipeur" #define TR_BYTES "bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) +#define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE BUTTON(TR("Prt", "Port.")) #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("RAZ") @@ -984,6 +985,7 @@ #define TR_ANTENNAPROBLEM CENTER "Antenne radio défectueuse!" #define TR_MODELIDUSED TR("ID affecté à :", "No de récepteur utilisé par :") #define TR_MODULE INDENT "Type de module" +#define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Type tél.", "Type télémétrie") #define TR_TELEMETRY_SENSORS "Capteurs" #define TR_VALUE "Valeur" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 43a903070..871c04895 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -966,6 +966,7 @@ #define TR_BUZZER INDENT"Buzzer" #define TR_BYTES "Bytes" #define TR_MODULE_BIND "[Bind]" +#define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Range]" #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" @@ -974,6 +975,7 @@ #define TR_ANTENNAPROBLEM CENTER "Problemi antenna TX!" #define TR_MODELIDUSED TR("ID già usato","ID Modello già usato") #define TR_MODULE INDENT "Modulo" +#define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE "Tipo Telemetria" #define TR_TELEMETRY_SENSORS "Sensori" #define TR_VALUE "Valore" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 8520deafd..d5c7c1ad2 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -967,6 +967,7 @@ #define TR_BUZZER INDENT "Zoemer" #define TR_BYTES "bytes" #define TR_MODULE_BIND TR("[Bnd]", "[Bind]") +#define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE TR("[Rng]", "[Range]") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" @@ -975,6 +976,7 @@ #define TR_ANTENNAPROBLEM CENTER "TX-Antenneprobleem!" #define TR_MODELIDUSED TR("ID al gebruikt", "Model-ID al gebruikt") #define TR_MODULE INDENT "Module-Type" +#define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Type", "Telemetrietype") #define TR_TELEMETRY_SENSORS "Sensoren" #define TR_VALUE "Waarde" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 646901062..fbeff71e6 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -967,6 +967,7 @@ #define TR_BUZZER INDENT"Brzęczyk" #define TR_BYTES "bajty" #define TR_MODULE_BIND TR("[BND]","[Bind]") +#define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE TR("[Zas]","Zasięg") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" @@ -975,6 +976,7 @@ #define TR_ANTENNAPROBLEM CENTER "Problem z anteną TX" #define TR_MODELIDUSED TR("ID zajęte","ID modelu zajęte") #define TR_MODULE INDENT "Moduł " +#define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Typ ", "Typ Telemetrii") #define TR_TELEMETRY_SENSORS "Czujniki" #define TR_VALUE "Wartość" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 5cb8a2245..e27ffbf45 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -971,6 +971,7 @@ #define TR_BUZZER INDENT"Buzzer" #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Bind]" +#define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Range]" #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" @@ -979,6 +980,7 @@ #define TR_ANTENNAPROBLEM CENTER "TX Antenna problem!" #define TR_MODELIDUSED TR("ID used in:", "Receiver ID used in:") #define TR_MODULE INDENT "Module" +#define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Type", "Telemetry Type") #define TR_TELEMETRY_SENSORS "Sensors" #define TR_VALUE "Value" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index afdc67c59..5882b7e32 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -980,6 +980,7 @@ #define TR_BUZZER INDENT"Summer" #define TR_BYTES "byte" #define TR_MODULE_BIND TR("[Bnd]", "[Bind]") +#define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE TR("[Tst]", "[Testa]") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Nollställ]" @@ -988,6 +989,7 @@ #define TR_ANTENNAPROBLEM CENTER "Fel på TX-antennen" #define TR_MODELIDUSED TR("ID finns redan","ModellID används redan") #define TR_MODULE INDENT "Modul" +#define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE "Telemetrityp" #define TR_TELEMETRY_SENSORS "Sensorer" #define TR_VALUE "Värde" From cbe2ce9887cae7d72119b3f9e9c1fb9381a2c665 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 22 Feb 2019 08:06:59 +0100 Subject: [PATCH 221/446] Allow registration from hardware setup --- radio/src/gui/128x64/model_setup.cpp | 53 ++++++++++++----------- radio/src/gui/128x64/radio_hardware.cpp | 57 ++++++++++++++++--------- radio/src/gui/212x64/model_setup.cpp | 8 ++-- radio/src/gui/480x272/model_setup.cpp | 14 +++--- radio/src/opentx.cpp | 12 +++--- radio/src/opentx.h | 3 +- radio/src/pulses/pxx2.cpp | 18 ++++---- radio/src/telemetry/telemetry.cpp | 32 +++++++------- 8 files changed, 107 insertions(+), 90 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 4eec6609f..cc3f2978d 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -254,8 +254,8 @@ enum MenuModelSetupItems { void onPXX2BindMenu(const char * result) { - reusableBuffer.modelSetup.pxx2.bindSelectedReceiverIndex = (result - reusableBuffer.modelSetup.pxx2.bindCandidateReceiversNames[0]) / sizeof(reusableBuffer.modelSetup.pxx2.bindCandidateReceiversNames[0]); - reusableBuffer.modelSetup.pxx2.bindStep = BIND_RX_NAME_SELECTED; + reusableBuffer.pxx2Setup.pxx2.bindSelectedReceiverIndex = (result - reusableBuffer.pxx2Setup.pxx2.bindCandidateReceiversNames[0]) / sizeof(reusableBuffer.pxx2Setup.pxx2.bindCandidateReceiversNames[0]); + reusableBuffer.pxx2Setup.pxx2.bindStep = BIND_RX_NAME_SELECTED; } void onBindMenu(const char * result) @@ -290,9 +290,9 @@ void runPopupRegister(event_t event) uint8_t backupVerticalOffset = menuVerticalOffset; int8_t backupEditMode = s_editMode; - menuVerticalPosition = reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition; - menuHorizontalPosition = reusableBuffer.modelSetup.pxx2.registerPopupHorizontalPosition; - s_editMode = reusableBuffer.modelSetup.pxx2.registerPopupEditMode; + menuVerticalPosition = reusableBuffer.pxx2Setup.pxx2.registerPopupVerticalPosition; + menuHorizontalPosition = reusableBuffer.pxx2Setup.pxx2.registerPopupHorizontalPosition; + s_editMode = reusableBuffer.pxx2Setup.pxx2.registerPopupEditMode; switch (event) { case EVT_KEY_BREAK(KEY_ENTER): @@ -301,7 +301,7 @@ void runPopupRegister(event_t event) } else if (menuHorizontalPosition == 0) { // [Enter] pressed - reusableBuffer.modelSetup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; + reusableBuffer.pxx2Setup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; backupEditMode = EDIT_MODIFY_FIELD; // so that the [Register] button blinks and the REGISTER process can continue } // no break @@ -326,17 +326,17 @@ void runPopupRegister(event_t event) lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, STR_REG_ID); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); - if (reusableBuffer.modelSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { + if (reusableBuffer.pxx2Setup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, STR_RX_NAME); - editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.modelSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); + editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.pxx2Setup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); } lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); - reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; - reusableBuffer.modelSetup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; - reusableBuffer.modelSetup.pxx2.registerPopupEditMode = s_editMode; + reusableBuffer.pxx2Setup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; + reusableBuffer.pxx2Setup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; + reusableBuffer.pxx2Setup.pxx2.registerPopupEditMode = s_editMode; } menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER + HEADER_LINE; @@ -463,7 +463,7 @@ void menuModelSetup(event_t event) TITLE(STR_MENUSETUP); if (event == EVT_ENTRY) { - reusableBuffer.modelSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + reusableBuffer.pxx2Setup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; } uint8_t sub = menuVerticalPosition - HEADER_LINE; @@ -1165,10 +1165,11 @@ void menuModelSetup(event_t event) if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) { if (menuHorizontalPosition == 1 && event == EVT_KEY_FIRST(KEY_ENTER)) { moduleSettings[moduleIdx].mode = MODULE_MODE_REGISTER; - reusableBuffer.modelSetup.pxx2.registerStep = REGISTER_START; - reusableBuffer.modelSetup.pxx2.registerPopupVerticalPosition = 0; - reusableBuffer.modelSetup.pxx2.registerPopupHorizontalPosition = 0; - reusableBuffer.modelSetup.pxx2.registerPopupEditMode = 0; + reusableBuffer.pxx2Setup.pxx2.registerStep = REGISTER_START; + memcpy(reusableBuffer.pxx2Setup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); + reusableBuffer.pxx2Setup.pxx2.registerPopupVerticalPosition = 0; + reusableBuffer.pxx2Setup.pxx2.registerPopupHorizontalPosition = 0; + reusableBuffer.pxx2Setup.pxx2.registerPopupEditMode = 0; s_editMode = 0; POPUP_INPUT("", runPopupRegister); } @@ -1266,16 +1267,16 @@ void menuModelSetup(event_t event) if (attr) { if (menuHorizontalPosition == 0) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { - reusableBuffer.modelSetup.pxx2.bindStep = BIND_START; - reusableBuffer.modelSetup.pxx2.bindCandidateReceiversCount = 0; + reusableBuffer.pxx2Setup.pxx2.bindStep = BIND_START; + reusableBuffer.pxx2Setup.pxx2.bindCandidateReceiversCount = 0; moduleSettings[moduleIdx].mode ^= MODULE_MODE_BIND; } if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) { s_editMode = 1; - if (reusableBuffer.modelSetup.pxx2.bindStep == BIND_RX_NAME_RECEIVED) { - popupMenuItemsCount = min(reusableBuffer.modelSetup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); + if (reusableBuffer.pxx2Setup.pxx2.bindStep == BIND_RX_NAME_RECEIVED) { + popupMenuItemsCount = min(reusableBuffer.pxx2Setup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); for (uint8_t i=0; i 0) { @@ -1603,11 +1604,11 @@ void menuModelSetup(event_t event) if (attr) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].pxx.power, R9M_LBT_POWER_MAX); } - if (attr && editMode == 0 && reusableBuffer.modelSetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { - if((reusableBuffer.modelSetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind + if (attr && editMode == 0 && reusableBuffer.pxx2Setup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { + if((reusableBuffer.pxx2Setup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind POPUP_WARNING(STR_REBIND); } - reusableBuffer.modelSetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; + reusableBuffer.pxx2Setup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } } } diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 913cb6d1c..48a416207 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -158,12 +158,14 @@ enum MenuRadioHardwareItems { #define HW_SETTINGS_COLUMN1 30 #define HW_SETTINGS_COLUMN2 (30 + 5*FW) -void runPopupHWSetupRegister(event_t event) +void runHWPopupRegister(event_t event) { - menuVerticalPosition = reusableBuffer.hardwareSetup.pxx2.registerPopupVerticalPosition; - menuHorizontalPosition = reusableBuffer.hardwareSetup.pxx2.registerPopupHorizontalPosition; - s_editMode = reusableBuffer.hardwareSetup.pxx2.registerPopupEditMode; uint8_t backupVerticalOffset = menuVerticalOffset; + int8_t backupEditMode = s_editMode; + + menuVerticalPosition = reusableBuffer.pxx2Setup.pxx2.registerPopupVerticalPosition; + menuHorizontalPosition = reusableBuffer.pxx2Setup.pxx2.registerPopupHorizontalPosition; + s_editMode = reusableBuffer.pxx2Setup.pxx2.registerPopupEditMode; switch (event) { case EVT_KEY_BREAK(KEY_ENTER): @@ -172,7 +174,8 @@ void runPopupHWSetupRegister(event_t event) } else if (menuHorizontalPosition == 0) { // [Enter] pressed - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; + reusableBuffer.pxx2Setup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; + backupEditMode = EDIT_MODIFY_FIELD; // so that the [Register] button blinks and the REGISTER process can continue } // no break @@ -193,24 +196,26 @@ void runPopupHWSetupRegister(event_t event) drawMessageBox(); - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, "Reg. ID"); - editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, STR_REG_ID); + editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Rx Name"); - editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.hardwareSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); + if (reusableBuffer.pxx2Setup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, STR_RX_NAME); + editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.pxx2Setup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); + } lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); - reusableBuffer.hardwareSetup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; - reusableBuffer.hardwareSetup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; - reusableBuffer.hardwareSetup.pxx2.registerPopupEditMode = s_editMode; + reusableBuffer.pxx2Setup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; + reusableBuffer.pxx2Setup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; + reusableBuffer.pxx2Setup.pxx2.registerPopupEditMode = s_editMode; } - menuVerticalPosition = ITEM_RADIO_REGISTER_RECEIVER + HEADER_LINE; + menuVerticalPosition = ITEM_RADIO_OWNER_ID + HEADER_LINE; menuHorizontalPosition = 1; menuVerticalOffset = backupVerticalOffset; - s_editMode = (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_REGISTER ? EDIT_MODIFY_FIELD : 0); + s_editMode = backupEditMode; } void menuRadioHardware(event_t event) @@ -373,17 +378,27 @@ void menuRadioHardware(event_t event) lcdDrawText(HW_SETTINGS_COLUMN2, y, "[Register]", attr ); if (attr) { if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL && s_editMode > 0) { - - reusableBuffer.hardwareSetup.pxx2.registerPopupVerticalPosition = 0; - reusableBuffer.hardwareSetup.pxx2.registerPopupHorizontalPosition = 0; - reusableBuffer.hardwareSetup.pxx2.registerPopupEditMode = 0; + if (event == EVT_KEY_FIRST(KEY_ENTER)) { + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; + reusableBuffer.pxx2Setup.pxx2.registerStep = REGISTER_START; + memcpy(reusableBuffer.pxx2Setup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); + reusableBuffer.pxx2Setup.pxx2.registerPopupVerticalPosition = 0; + reusableBuffer.pxx2Setup.pxx2.registerPopupHorizontalPosition = 0; + reusableBuffer.pxx2Setup.pxx2.registerPopupEditMode = 0; s_editMode = 0; - POPUP_INPUT("", runPopupHWSetupRegister); - + POPUP_INPUT("", runHWPopupRegister); + } + else if (menuHorizontalPosition == 0) { + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; + } } - if (s_editMode == 0) { + if (s_editMode == 0 && !warningText) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; } + if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL) { + // REGISTER finished + s_editMode = 0; + } } break; diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index aa9e1e5c8..67c39ce85 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -304,7 +304,7 @@ void menuModelSetup(event_t event) MENU_CHECK(STR_MENUSETUP, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX); if (event == EVT_ENTRY) { - reusableBuffer.modelSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + reusableBuffer.pxx2Setup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; } #if (defined(DSM2) || defined(PXX)) @@ -1182,10 +1182,10 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_LBT_POWER_MAX); - if (attr && s_editMode == 0 && reusableBuffer.modelSetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { - if((reusableBuffer.modelSetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) //switching between mode 2 and 3 does not require rebind + if (attr && s_editMode == 0 && reusableBuffer.pxx2Setup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { + if((reusableBuffer.pxx2Setup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) //switching between mode 2 and 3 does not require rebind POPUP_WARNING(STR_REBIND); - reusableBuffer.modelSetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; + reusableBuffer.pxx2Setup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } } } diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index fd690479b..da66024dd 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -102,14 +102,14 @@ enum MenuModelSetupItems { void checkModelIdUnique(uint8_t moduleIdx) { - char* warn_buf = reusableBuffer.modelSetup.msg; + char* warn_buf = reusableBuffer.pxx2Setup.msg; // cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 - size_t warn_buf_len = sizeof(reusableBuffer.modelSetup.msg) - WARNING_LINE_LEN - 2; + size_t warn_buf_len = sizeof(reusableBuffer.pxx2Setup.msg) - WARNING_LINE_LEN - 2; if (!modelslist.isModelIdUnique(moduleIdx,warn_buf,warn_buf_len)) { if (warn_buf[0] != 0) { POPUP_WARNING(STR_MODELIDUSED); - SET_WARNING_INFO(warn_buf, sizeof(reusableBuffer.modelSetup.msg), 0); + SET_WARNING_INFO(warn_buf, sizeof(reusableBuffer.pxx2Setup.msg), 0); } } } @@ -293,7 +293,7 @@ bool menuModelSetup(event_t event) TRAINER_LINE2_ROWS }); if (event == EVT_ENTRY) { - reusableBuffer.modelSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + reusableBuffer.pxx2Setup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; } if (menuEvent) { @@ -1103,12 +1103,12 @@ bool menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_LBT_POWER_MAX); - if (attr && s_editMode == 0 && reusableBuffer.modelSetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { - if((reusableBuffer.modelSetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind + if (attr && s_editMode == 0 && reusableBuffer.pxx2Setup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { + if((reusableBuffer.pxx2Setup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind POPUP_WARNING(STR_WARNING); SET_WARNING_INFO(STR_REBIND, sizeof(TR_REBIND), 0); } - reusableBuffer.modelSetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; + reusableBuffer.pxx2Setup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } } } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 0e6429cf0..78fdfbafe 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -368,16 +368,16 @@ void checkModelIdUnique(uint8_t index, uint8_t module) { uint8_t modelId = g_model.header.modelId[module]; uint8_t additionalOnes = 0; - char * name = reusableBuffer.modelSetup.msg; + char * name = reusableBuffer.pxx2Setup.msg; - memset(reusableBuffer.modelSetup.msg, 0, sizeof(reusableBuffer.modelSetup.msg)); + memset(reusableBuffer.pxx2Setup.msg, 0, sizeof(reusableBuffer.pxx2Setup.msg)); if (modelId != 0) { for (uint8_t i = 0; i < MAX_MODELS; i++) { if (i != index) { if (modelId == modelHeaders[i].modelId[module]) { - if ((WARNING_LINE_LEN - 4 - (name - reusableBuffer.modelSetup.msg)) > (signed)(modelHeaders[i].name[0] ? zlen(modelHeaders[i].name, LEN_MODEL_NAME) : sizeof(TR_MODEL) + 2)) { // you cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 (-2 for the ",") - if (reusableBuffer.modelSetup.msg[0] != 0) { + if ((WARNING_LINE_LEN - 4 - (name - reusableBuffer.pxx2Setup.msg)) > (signed)(modelHeaders[i].name[0] ? zlen(modelHeaders[i].name, LEN_MODEL_NAME) : sizeof(TR_MODEL) + 2)) { // you cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 (-2 for the ",") + if (reusableBuffer.pxx2Setup.msg[0] != 0) { name = strAppend(name, ", "); } if (modelHeaders[i].name[0] == 0) { @@ -402,9 +402,9 @@ void checkModelIdUnique(uint8_t index, uint8_t module) name = strAppend(name, ")"); } - if (reusableBuffer.modelSetup.msg[0] != 0) { + if (reusableBuffer.pxx2Setup.msg[0] != 0) { POPUP_WARNING(STR_MODELIDUSED); - SET_WARNING_INFO(reusableBuffer.modelSetup.msg, sizeof(reusableBuffer.modelSetup.msg), 0); + SET_WARNING_INFO(reusableBuffer.pxx2Setup.msg, sizeof(reusableBuffer.pxx2Setup.msg), 0); } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 673b0ab26..ea5a4c218 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1129,12 +1129,13 @@ union ReusableBuffer uint8_t registerPopupHorizontalPosition; int8_t registerPopupEditMode; char registerRxName[PXX2_LEN_RX_NAME]; + char registrationID[PXX2_LEN_REGISTRATION_ID]; char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; uint8_t bindCandidateReceiversCount; uint8_t bindSelectedReceiverIndex; } pxx2; }; - } modelSetup, hardwareSetup; + } pxx2Setup; // 103 bytes struct { diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 5484f59b4..9280ca445 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -58,13 +58,13 @@ bool Pxx2Pulses::setupRegisterFrame(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); - if (reusableBuffer.modelSetup.pxx2.registerStep == REGISTER_RX_NAME_SELECTED) { + if (reusableBuffer.pxx2Setup.pxx2.registerStep == REGISTER_RX_NAME_SELECTED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i reusableBuffer.modelSetup.pxx2.bindWaitTimeout) { + if (reusableBuffer.pxx2Setup.pxx2.bindStep == BIND_WAIT) { + if (get_tmr10ms() > reusableBuffer.pxx2Setup.pxx2.bindWaitTimeout) { moduleSettings[module].mode = MODULE_MODE_NORMAL; - reusableBuffer.modelSetup.pxx2.bindStep = BIND_OK; + reusableBuffer.pxx2Setup.pxx2.bindStep = BIND_OK; POPUP_INFORMATION(STR_BIND_OK); } else { return false; } } - else if (reusableBuffer.modelSetup.pxx2.bindStep == BIND_RX_NAME_SELECTED) { + else if (reusableBuffer.pxx2Setup.pxx2.bindStep == BIND_RX_NAME_SELECTED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i Date: Fri, 22 Feb 2019 08:08:59 +0100 Subject: [PATCH 222/446] Allow registration from hardware setup --- radio/src/gui/128x64/model_setup.cpp | 54 ++++++++++++------------- radio/src/gui/128x64/radio_hardware.cpp | 28 ++++++------- radio/src/gui/212x64/model_setup.cpp | 8 ++-- radio/src/gui/480x272/model_setup.cpp | 14 +++---- radio/src/opentx.cpp | 12 +++--- radio/src/opentx.h | 2 +- radio/src/pulses/pxx2.cpp | 18 ++++----- radio/src/telemetry/telemetry.cpp | 32 +++++++-------- 8 files changed, 84 insertions(+), 84 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index cc3f2978d..40d0da012 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -254,8 +254,8 @@ enum MenuModelSetupItems { void onPXX2BindMenu(const char * result) { - reusableBuffer.pxx2Setup.pxx2.bindSelectedReceiverIndex = (result - reusableBuffer.pxx2Setup.pxx2.bindCandidateReceiversNames[0]) / sizeof(reusableBuffer.pxx2Setup.pxx2.bindCandidateReceiversNames[0]); - reusableBuffer.pxx2Setup.pxx2.bindStep = BIND_RX_NAME_SELECTED; + reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex = (result - reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0]) / sizeof(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0]); + reusableBuffer.moduleSetup.pxx2.bindStep = BIND_RX_NAME_SELECTED; } void onBindMenu(const char * result) @@ -290,9 +290,9 @@ void runPopupRegister(event_t event) uint8_t backupVerticalOffset = menuVerticalOffset; int8_t backupEditMode = s_editMode; - menuVerticalPosition = reusableBuffer.pxx2Setup.pxx2.registerPopupVerticalPosition; - menuHorizontalPosition = reusableBuffer.pxx2Setup.pxx2.registerPopupHorizontalPosition; - s_editMode = reusableBuffer.pxx2Setup.pxx2.registerPopupEditMode; + menuVerticalPosition = reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition; + menuHorizontalPosition = reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition; + s_editMode = reusableBuffer.moduleSetup.pxx2.registerPopupEditMode; switch (event) { case EVT_KEY_BREAK(KEY_ENTER): @@ -301,7 +301,7 @@ void runPopupRegister(event_t event) } else if (menuHorizontalPosition == 0) { // [Enter] pressed - reusableBuffer.pxx2Setup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; + reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; backupEditMode = EDIT_MODIFY_FIELD; // so that the [Register] button blinks and the REGISTER process can continue } // no break @@ -326,17 +326,17 @@ void runPopupRegister(event_t event) lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, STR_REG_ID); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); - if (reusableBuffer.pxx2Setup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { + if (reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, STR_RX_NAME); - editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.pxx2Setup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); + editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.moduleSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); } lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); - reusableBuffer.pxx2Setup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; - reusableBuffer.pxx2Setup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; - reusableBuffer.pxx2Setup.pxx2.registerPopupEditMode = s_editMode; + reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; + reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; + reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = s_editMode; } menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER + HEADER_LINE; @@ -463,7 +463,7 @@ void menuModelSetup(event_t event) TITLE(STR_MENUSETUP); if (event == EVT_ENTRY) { - reusableBuffer.pxx2Setup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; } uint8_t sub = menuVerticalPosition - HEADER_LINE; @@ -1165,11 +1165,11 @@ void menuModelSetup(event_t event) if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) { if (menuHorizontalPosition == 1 && event == EVT_KEY_FIRST(KEY_ENTER)) { moduleSettings[moduleIdx].mode = MODULE_MODE_REGISTER; - reusableBuffer.pxx2Setup.pxx2.registerStep = REGISTER_START; - memcpy(reusableBuffer.pxx2Setup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); - reusableBuffer.pxx2Setup.pxx2.registerPopupVerticalPosition = 0; - reusableBuffer.pxx2Setup.pxx2.registerPopupHorizontalPosition = 0; - reusableBuffer.pxx2Setup.pxx2.registerPopupEditMode = 0; + reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_START; + memcpy(reusableBuffer.moduleSetup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); + reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = 0; + reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = 0; + reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = 0; s_editMode = 0; POPUP_INPUT("", runPopupRegister); } @@ -1267,16 +1267,16 @@ void menuModelSetup(event_t event) if (attr) { if (menuHorizontalPosition == 0) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { - reusableBuffer.pxx2Setup.pxx2.bindStep = BIND_START; - reusableBuffer.pxx2Setup.pxx2.bindCandidateReceiversCount = 0; + reusableBuffer.moduleSetup.pxx2.bindStep = BIND_START; + reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount = 0; moduleSettings[moduleIdx].mode ^= MODULE_MODE_BIND; } if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) { s_editMode = 1; - if (reusableBuffer.pxx2Setup.pxx2.bindStep == BIND_RX_NAME_RECEIVED) { - popupMenuItemsCount = min(reusableBuffer.pxx2Setup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); + if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_RX_NAME_RECEIVED) { + popupMenuItemsCount = min(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); for (uint8_t i=0; i 0) { @@ -1604,11 +1604,11 @@ void menuModelSetup(event_t event) if (attr) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].pxx.power, R9M_LBT_POWER_MAX); } - if (attr && editMode == 0 && reusableBuffer.pxx2Setup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { - if((reusableBuffer.pxx2Setup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind + if (attr && editMode == 0 && reusableBuffer.moduleSetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { + if((reusableBuffer.moduleSetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind POPUP_WARNING(STR_REBIND); } - reusableBuffer.pxx2Setup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; + reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } } } diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 48a416207..5fcbe91e9 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -163,9 +163,9 @@ void runHWPopupRegister(event_t event) uint8_t backupVerticalOffset = menuVerticalOffset; int8_t backupEditMode = s_editMode; - menuVerticalPosition = reusableBuffer.pxx2Setup.pxx2.registerPopupVerticalPosition; - menuHorizontalPosition = reusableBuffer.pxx2Setup.pxx2.registerPopupHorizontalPosition; - s_editMode = reusableBuffer.pxx2Setup.pxx2.registerPopupEditMode; + menuVerticalPosition = reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition; + menuHorizontalPosition = reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition; + s_editMode = reusableBuffer.moduleSetup.pxx2.registerPopupEditMode; switch (event) { case EVT_KEY_BREAK(KEY_ENTER): @@ -174,7 +174,7 @@ void runHWPopupRegister(event_t event) } else if (menuHorizontalPosition == 0) { // [Enter] pressed - reusableBuffer.pxx2Setup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; + reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; backupEditMode = EDIT_MODIFY_FIELD; // so that the [Register] button blinks and the REGISTER process can continue } // no break @@ -199,17 +199,17 @@ void runHWPopupRegister(event_t event) lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, STR_REG_ID); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); - if (reusableBuffer.pxx2Setup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { + if (reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, STR_RX_NAME); - editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.pxx2Setup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); + editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.moduleSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); } lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); - reusableBuffer.pxx2Setup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; - reusableBuffer.pxx2Setup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; - reusableBuffer.pxx2Setup.pxx2.registerPopupEditMode = s_editMode; + reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; + reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; + reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = s_editMode; } menuVerticalPosition = ITEM_RADIO_OWNER_ID + HEADER_LINE; @@ -380,11 +380,11 @@ void menuRadioHardware(event_t event) if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL && s_editMode > 0) { if (event == EVT_KEY_FIRST(KEY_ENTER)) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; - reusableBuffer.pxx2Setup.pxx2.registerStep = REGISTER_START; - memcpy(reusableBuffer.pxx2Setup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); - reusableBuffer.pxx2Setup.pxx2.registerPopupVerticalPosition = 0; - reusableBuffer.pxx2Setup.pxx2.registerPopupHorizontalPosition = 0; - reusableBuffer.pxx2Setup.pxx2.registerPopupEditMode = 0; + reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_START; + memcpy(reusableBuffer.moduleSetup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); + reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = 0; + reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = 0; + reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = 0; s_editMode = 0; POPUP_INPUT("", runHWPopupRegister); } diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 67c39ce85..3bb4cabbc 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -304,7 +304,7 @@ void menuModelSetup(event_t event) MENU_CHECK(STR_MENUSETUP, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX); if (event == EVT_ENTRY) { - reusableBuffer.pxx2Setup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; } #if (defined(DSM2) || defined(PXX)) @@ -1182,10 +1182,10 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_LBT_POWER_MAX); - if (attr && s_editMode == 0 && reusableBuffer.pxx2Setup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { - if((reusableBuffer.pxx2Setup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) //switching between mode 2 and 3 does not require rebind + if (attr && s_editMode == 0 && reusableBuffer.moduleSetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { + if((reusableBuffer.moduleSetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) //switching between mode 2 and 3 does not require rebind POPUP_WARNING(STR_REBIND); - reusableBuffer.pxx2Setup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; + reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } } } diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index da66024dd..3cce3cd3e 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -102,14 +102,14 @@ enum MenuModelSetupItems { void checkModelIdUnique(uint8_t moduleIdx) { - char* warn_buf = reusableBuffer.pxx2Setup.msg; + char* warn_buf = reusableBuffer.moduleSetup.msg; // cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 - size_t warn_buf_len = sizeof(reusableBuffer.pxx2Setup.msg) - WARNING_LINE_LEN - 2; + size_t warn_buf_len = sizeof(reusableBuffer.moduleSetup.msg) - WARNING_LINE_LEN - 2; if (!modelslist.isModelIdUnique(moduleIdx,warn_buf,warn_buf_len)) { if (warn_buf[0] != 0) { POPUP_WARNING(STR_MODELIDUSED); - SET_WARNING_INFO(warn_buf, sizeof(reusableBuffer.pxx2Setup.msg), 0); + SET_WARNING_INFO(warn_buf, sizeof(reusableBuffer.moduleSetup.msg), 0); } } } @@ -293,7 +293,7 @@ bool menuModelSetup(event_t event) TRAINER_LINE2_ROWS }); if (event == EVT_ENTRY) { - reusableBuffer.pxx2Setup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; } if (menuEvent) { @@ -1103,12 +1103,12 @@ bool menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_LBT_POWER_MAX); - if (attr && s_editMode == 0 && reusableBuffer.pxx2Setup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { - if((reusableBuffer.pxx2Setup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind + if (attr && s_editMode == 0 && reusableBuffer.moduleSetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { + if((reusableBuffer.moduleSetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind POPUP_WARNING(STR_WARNING); SET_WARNING_INFO(STR_REBIND, sizeof(TR_REBIND), 0); } - reusableBuffer.pxx2Setup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; + reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } } } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 78fdfbafe..0257768bd 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -368,16 +368,16 @@ void checkModelIdUnique(uint8_t index, uint8_t module) { uint8_t modelId = g_model.header.modelId[module]; uint8_t additionalOnes = 0; - char * name = reusableBuffer.pxx2Setup.msg; + char * name = reusableBuffer.moduleSetup.msg; - memset(reusableBuffer.pxx2Setup.msg, 0, sizeof(reusableBuffer.pxx2Setup.msg)); + memset(reusableBuffer.moduleSetup.msg, 0, sizeof(reusableBuffer.moduleSetup.msg)); if (modelId != 0) { for (uint8_t i = 0; i < MAX_MODELS; i++) { if (i != index) { if (modelId == modelHeaders[i].modelId[module]) { - if ((WARNING_LINE_LEN - 4 - (name - reusableBuffer.pxx2Setup.msg)) > (signed)(modelHeaders[i].name[0] ? zlen(modelHeaders[i].name, LEN_MODEL_NAME) : sizeof(TR_MODEL) + 2)) { // you cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 (-2 for the ",") - if (reusableBuffer.pxx2Setup.msg[0] != 0) { + if ((WARNING_LINE_LEN - 4 - (name - reusableBuffer.moduleSetup.msg)) > (signed)(modelHeaders[i].name[0] ? zlen(modelHeaders[i].name, LEN_MODEL_NAME) : sizeof(TR_MODEL) + 2)) { // you cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 (-2 for the ",") + if (reusableBuffer.moduleSetup.msg[0] != 0) { name = strAppend(name, ", "); } if (modelHeaders[i].name[0] == 0) { @@ -402,9 +402,9 @@ void checkModelIdUnique(uint8_t index, uint8_t module) name = strAppend(name, ")"); } - if (reusableBuffer.pxx2Setup.msg[0] != 0) { + if (reusableBuffer.moduleSetup.msg[0] != 0) { POPUP_WARNING(STR_MODELIDUSED); - SET_WARNING_INFO(reusableBuffer.pxx2Setup.msg, sizeof(reusableBuffer.pxx2Setup.msg), 0); + SET_WARNING_INFO(reusableBuffer.moduleSetup.msg, sizeof(reusableBuffer.moduleSetup.msg), 0); } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index ea5a4c218..e96fe3ca5 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1135,7 +1135,7 @@ union ReusableBuffer uint8_t bindSelectedReceiverIndex; } pxx2; }; - } pxx2Setup; + } moduleSetup; // 103 bytes struct { diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 9280ca445..5e21aaa4a 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -58,13 +58,13 @@ bool Pxx2Pulses::setupRegisterFrame(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); - if (reusableBuffer.pxx2Setup.pxx2.registerStep == REGISTER_RX_NAME_SELECTED) { + if (reusableBuffer.moduleSetup.pxx2.registerStep == REGISTER_RX_NAME_SELECTED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i reusableBuffer.pxx2Setup.pxx2.bindWaitTimeout) { + if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_WAIT) { + if (get_tmr10ms() > reusableBuffer.moduleSetup.pxx2.bindWaitTimeout) { moduleSettings[module].mode = MODULE_MODE_NORMAL; - reusableBuffer.pxx2Setup.pxx2.bindStep = BIND_OK; + reusableBuffer.moduleSetup.pxx2.bindStep = BIND_OK; POPUP_INFORMATION(STR_BIND_OK); } else { return false; } } - else if (reusableBuffer.pxx2Setup.pxx2.bindStep == BIND_RX_NAME_SELECTED) { + else if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_RX_NAME_SELECTED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i Date: Fri, 22 Feb 2019 10:31:54 +0100 Subject: [PATCH 223/446] XJT2 channel count can only be 8, 16 or 24 --- radio/src/gui/128x64/model_setup.cpp | 8 ++++---- radio/src/gui/gui_common.h | 3 ++- radio/src/gui/gui_common_arm.cpp | 10 ++++++++++ radio/src/pulses/modules.h | 6 +++--- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 40d0da012..50713920c 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -388,10 +388,10 @@ void menuModelSetup(event_t event) IF_PXX2(isDefaultModelRegistrationID() ? HIDDEN_ROW : READONLY_ROW), // Registration ID LABEL(InternalModule), - INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None) - INTERNAL_MODULE_CHANNELS_ROWS, // Channels min and count + INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None) + INTERNAL_MODULE_CHANNELS_ROWS, // Channels min and count IF_NOT_PXX2(IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), - IF_PXX2(0), // RxNum + IF_PXX2(0), // RxNum ANTENNA_ROW IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Module start channel (pxx2 always send 16) IF_PXX2(1), // Range check and Register buttons @@ -1099,7 +1099,7 @@ void menuModelSetup(event_t event) CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.channelsStart, 32-8-moduleData.channelsCount); break; case 1: - CHECK_INCDEC_MODELVAR(event, moduleData.channelsCount, -4, min(maxModuleChannels_M8(moduleIdx), 32-8-moduleData.channelsStart)); + CHECK_INCDEC_MODELVAR_CHECK(event, moduleData.channelsCount, -4, min(maxModuleChannels_M8(moduleIdx), 32-8-moduleData.channelsStart), isInternalModuleChannelCountAvailable); if ((k == ITEM_MODEL_EXTERNAL_MODULE_CHANNELS && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM)) { SET_DEFAULT_PPM_FRAME_LENGTH(moduleIdx); } diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index fffe0c5fc..92200d8ec 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -56,6 +56,7 @@ bool isSwitchAvailableInTimers(int swtch); bool isR9MModeAvailable(int mode); bool isR9ModuleRunning(int module); bool isR9MMFlex(int module); +bool isInternalModuleChannelCountAvailable(int module); bool isExternalModuleAvailable(int module); bool isInternalModuleAvailable(int module); bool isRfProtocolAvailable(int protocol); @@ -115,7 +116,7 @@ void runFatalErrorScreen(const char * message); void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags=0); // model_setup Defines that are used in all uis in the same way -#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON((isModuleXJT2(INTERNAL_MODULE) ? (uint8_t)0 : (uint8_t)1)) +#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON((uint8_t)1) #define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((isModuleXJT2(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleCrossfire(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) || (isModuleMultimodule(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MM_RF_PROTO_DSM2)) ? (uint8_t)0 : (uint8_t)1) diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index c72827ca6..8c38b03f2 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -515,6 +515,16 @@ bool isR9MMFlex(int module) return g_model.moduleData[module].r9m.region == MODULE_R9M_REGION_FLEX; } +bool isInternalModuleChannelCountAvailable(int channels) +{ + if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT2) { + if ( channels % 8 != 0) + return false; + } + + return true; +} + bool isInternalModuleAvailable(int module) { if (module == MODULE_TYPE_NONE) diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 29cf31b5b..1d8fd157f 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -199,8 +199,8 @@ inline bool isModuleDSM2(uint8_t idx) } #endif -// order is the same as in enum Protocols in myeeprom.h (none, ppm, pxx, dsm, crossfire, multi, r9m, sbus) -static const int8_t maxChannelsModules[] = { 0, 8, 8, -2, 8, 4, 8, 8}; // relative to 8! +// order is the same as in enum Protocols in myeeprom.h (none, ppm, pxx, pxx2, dsm, crossfire, multi, r9m, r9m2, sbus) +static const int8_t maxChannelsModules[] = { 0, 8, 8, 16, -2, 8, 4, 8, 16, 8}; // relative to 8! static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; @@ -242,7 +242,7 @@ inline int8_t sentModuleChannels(uint8_t idx) { if (isModuleCrossfire(idx)) return CROSSFIRE_CHANNELS_COUNT; - else if ((isModuleMultimodule(idx) && !isModuleMultimoduleDSM2(idx)) || isModuleXJT2(idx)) + else if (isModuleMultimodule(idx) && !isModuleMultimoduleDSM2(idx)) return 16; else return 8 + g_model.moduleData[idx].channelsCount; From b345abf6bcf8494521daf85afbd217278f7d0eae Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 22 Feb 2019 11:08:08 +0100 Subject: [PATCH 224/446] Do not display ok on register until RX is ready --- radio/src/gui/128x64/model_setup.cpp | 12 ++++++------ radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 14 files changed, 19 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 50713920c..2e69b997f 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -329,10 +329,10 @@ void runPopupRegister(event_t event) if (reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, STR_RX_NAME); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.moduleSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); } - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); - lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); + lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; @@ -1159,11 +1159,11 @@ void menuModelSetup(event_t event) { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); lcdDrawTextAlignedLeft(y, STR_MODULE); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_RANGE, (menuHorizontalPosition == 0 ? attr : 0)); - lcdDrawText(lcdLastRightPos, y, "[Reg]", (menuHorizontalPosition == 1 ? attr : 0)); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_REGISTER_BUTTON, (menuHorizontalPosition == 0 ? attr : 0)); + lcdDrawText(lcdLastRightPos + 3, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0)); if (attr) { if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) { - if (menuHorizontalPosition == 1 && event == EVT_KEY_FIRST(KEY_ENTER)) { + if (menuHorizontalPosition == 0 && event == EVT_KEY_FIRST(KEY_ENTER)) { moduleSettings[moduleIdx].mode = MODULE_MODE_REGISTER; reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_START; memcpy(reusableBuffer.moduleSetup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); @@ -1173,7 +1173,7 @@ void menuModelSetup(event_t event) s_editMode = 0; POPUP_INPUT("", runPopupRegister); } - else if (menuHorizontalPosition == 0) { + else if (menuHorizontalPosition == 1) { moduleSettings[moduleIdx].mode = MODULE_MODE_RANGECHECK; } } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 5a87cb002..c272fa26b 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -584,6 +584,7 @@ const char STR_BLCOLOR[] = TR_BLCOLOR; const char STR_TRAINER[] = TR_TRAINER; const char STR_MODULE_BIND[] = TR_MODULE_BIND; +const char STR_REGISTER_BUTTON[] = TR_REGISTER_BUTTON; const char STR_RXADD_BUTTON[] = TR_RXADD_BUTTON; const char STR_BINDING_1_8_TELEM_ON[] = TR_BINDING_CH1_8_TELEM_ON; const char STR_BINDING_1_8_TELEM_OFF[] = TR_BINDING_CH1_8_TELEM_OFF; diff --git a/radio/src/translations.h b/radio/src/translations.h index 1ac8564d7..9eea8e197 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -849,6 +849,7 @@ extern const char STR_EXPONAME[]; extern const char STR_TRAINER[]; extern const char STR_MODULE_BIND[]; +extern const char STR_REGISTER_BUTTON[]; extern const char STR_RXADD_BUTTON[]; extern const char STR_BINDING_1_8_TELEM_ON[]; extern const char STR_BINDING_1_8_TELEM_OFF[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index b0f226537..fb41acd80 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -961,6 +961,7 @@ #define TR_BUZZER INDENT"Pípák" #define TR_BYTES "[B]" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) +#define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index fda129655..171b5e6e5 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -966,6 +966,7 @@ #define TR_BUZZER INDENT "Summer" #define TR_BYTES "Bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd","Bind")) //9XR-Pro +#define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) //9XR-Pro #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index b16ac76c2..93bf49ce1 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -965,6 +965,7 @@ #define TR_BUZZER INDENT "Buzzer" #define TR_BYTES "bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) +#define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON BUTTON("Add") #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index cd874fa3b..598dfbdd3 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -972,6 +972,7 @@ #define TR_BUZZER INDENT"Zumbador" #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Enlace]" +#define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Limites]" #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 3704d8c5e..e0564376a 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -964,6 +964,7 @@ #define TR_BUZZER INDENT"Buzzer" #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Bind]" +#define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Range]" #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 4f4d5e390..64d8b9850 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -976,6 +976,7 @@ #define TR_BUZZER INDENT "Bipeur" #define TR_BYTES "bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) +#define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE BUTTON(TR("Prt", "Port.")) #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 871c04895..e2227a893 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -966,6 +966,7 @@ #define TR_BUZZER INDENT"Buzzer" #define TR_BYTES "Bytes" #define TR_MODULE_BIND "[Bind]" +#define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Range]" #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index d5c7c1ad2..430733f98 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -967,6 +967,7 @@ #define TR_BUZZER INDENT "Zoemer" #define TR_BYTES "bytes" #define TR_MODULE_BIND TR("[Bnd]", "[Bind]") +#define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE TR("[Rng]", "[Range]") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index fbeff71e6..8c1e425fb 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -967,6 +967,7 @@ #define TR_BUZZER INDENT"Brzęczyk" #define TR_BYTES "bajty" #define TR_MODULE_BIND TR("[BND]","[Bind]") +#define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE TR("[Zas]","Zasięg") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index e27ffbf45..8df7999eb 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -971,6 +971,7 @@ #define TR_BUZZER INDENT"Buzzer" #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Bind]" +#define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Range]" #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 5882b7e32..5cb0b44c9 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -980,6 +980,7 @@ #define TR_BUZZER INDENT"Summer" #define TR_BYTES "byte" #define TR_MODULE_BIND TR("[Bnd]", "[Bind]") +#define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE TR("[Tst]", "[Testa]") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) From 62f8e36d9044be3b490e0870c23d03f1aca031f7 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 22 Feb 2019 12:57:50 +0100 Subject: [PATCH 225/446] Transfer (share with Friend) UI part --- radio/src/gui/128x64/model_setup.cpp | 27 ++++++++++++++++++++++++++- radio/src/opentx.h | 5 ++++- radio/src/pulses/pulses.h | 1 + radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 16 files changed, 44 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 2e69b997f..649422b10 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -87,10 +87,12 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_SHARE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NAME, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_SHARE, ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER, #endif ITEM_MODEL_EXTERNAL_MODULE_LABEL, @@ -120,10 +122,12 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_SHARE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_NAME, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_SHARE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_ADD_RECEIVER, #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, @@ -399,10 +403,12 @@ void menuModelSetup(event_t event) IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Delete + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Transfer IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, (uint8_t)-1), // Receiver Number IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 1), // Receiver Bind/Delete + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Transfer IF_PXX2(INTERNAL_MODULE_ADD_RECEIVER_ROW), LABEL(ExternalModule), @@ -423,10 +429,12 @@ void menuModelSetup(event_t event) IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 1), // Receiver Bind/Delete + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Transfer IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, (uint8_t)-1), // Receiver Number IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver Range IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 1), // Receiver Bind/Delete + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver Transfer IF_EXTERNAL_PXX2(EXTERNAL_MODULE_ADD_RECEIVER_ROW), TRAINER_ROWS @@ -1203,7 +1211,7 @@ void menuModelSetup(event_t event) else { g_model.moduleData[moduleIdx].pxx2.receivers[0].enabled = 0x01; memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[0].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); - menuVerticalPosition = (moduleIdx ? ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL : ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL) + 1; + menuVerticalPosition = (moduleIdx ? ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL : ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL) + 1; } killEvents(event); s_editMode = 0; @@ -1302,6 +1310,23 @@ void menuModelSetup(event_t event) } break; + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_SHARE: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_SHARE: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_SHARE: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_SHARE: + { + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_TRANSFER_BUTTON, attr); + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + moduleSettings[moduleIdx].mode ^= MODULE_MODE_SHARE; + reusableBuffer.moduleSetup.pxx2.shareReceiverIndex = receiverIdx; + } + if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL) + s_editMode = 0; + } + break; #endif #if defined(PCBSKY9X) case ITEM_MODEL_EXTRA_MODULE_BIND: diff --git a/radio/src/opentx.h b/radio/src/opentx.h index e96fe3ca5..9320c228f 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1132,7 +1132,10 @@ union ReusableBuffer char registrationID[PXX2_LEN_REGISTRATION_ID]; char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; uint8_t bindCandidateReceiversCount; - uint8_t bindSelectedReceiverIndex; + union { + uint8_t bindSelectedReceiverIndex; + uint8_t shareReceiverIndex; + }; } pxx2; }; } moduleSetup; diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 2b298b668..49b73c397 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -76,6 +76,7 @@ enum ModuleSettingsMode MODULE_MODE_BIND, MODULE_MODE_REGISTER, MODULE_MODE_SPECTRUM_ANALYSER, + MODULE_MODE_SHARE }; PACK(struct ModuleSettings { diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index c272fa26b..8c44fbceb 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -584,6 +584,7 @@ const char STR_BLCOLOR[] = TR_BLCOLOR; const char STR_TRAINER[] = TR_TRAINER; const char STR_MODULE_BIND[] = TR_MODULE_BIND; +const char STR_TRANSFER_BUTTON[] = TR_TRANSFER_BUTTON; const char STR_REGISTER_BUTTON[] = TR_REGISTER_BUTTON; const char STR_RXADD_BUTTON[] = TR_RXADD_BUTTON; const char STR_BINDING_1_8_TELEM_ON[] = TR_BINDING_CH1_8_TELEM_ON; diff --git a/radio/src/translations.h b/radio/src/translations.h index 9eea8e197..d729e4b9f 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -849,6 +849,7 @@ extern const char STR_EXPONAME[]; extern const char STR_TRAINER[]; extern const char STR_MODULE_BIND[]; +extern const char STR_TRANSFER_BUTTON[]; extern const char STR_REGISTER_BUTTON[]; extern const char STR_RXADD_BUTTON[]; extern const char STR_BINDING_1_8_TELEM_ON[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index fb41acd80..50fb959c8 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -961,6 +961,7 @@ #define TR_BUZZER INDENT"Pípák" #define TR_BYTES "[B]" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) +#define TR_TRANSFER_BUTTON BUTTON("Transfer") #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 171b5e6e5..b8d2133a6 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -966,6 +966,7 @@ #define TR_BUZZER INDENT "Summer" #define TR_BYTES "Bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd","Bind")) //9XR-Pro +#define TR_TRANSFER_BUTTON BUTTON("Transfer") #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) //9XR-Pro diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 93bf49ce1..2a2ed3347 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -965,6 +965,7 @@ #define TR_BUZZER INDENT "Buzzer" #define TR_BYTES "bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) +#define TR_TRANSFER_BUTTON BUTTON("Transfer") #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON BUTTON("Add") #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 598dfbdd3..9823a2b02 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -972,6 +972,7 @@ #define TR_BUZZER INDENT"Zumbador" #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Enlace]" +#define TR_TRANSFER_BUTTON BUTTON("Transfer") #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Limites]" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index e0564376a..1c980dd07 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -964,6 +964,7 @@ #define TR_BUZZER INDENT"Buzzer" #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Bind]" +#define TR_TRANSFER_BUTTON BUTTON("Transfer") #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Range]" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 64d8b9850..7aa0ff2a0 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -976,6 +976,7 @@ #define TR_BUZZER INDENT "Bipeur" #define TR_BYTES "bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) +#define TR_TRANSFER_BUTTON BUTTON("Transfer") #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE BUTTON(TR("Prt", "Port.")) diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index e2227a893..9d992cb35 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -966,6 +966,7 @@ #define TR_BUZZER INDENT"Buzzer" #define TR_BYTES "Bytes" #define TR_MODULE_BIND "[Bind]" +#define TR_TRANSFER_BUTTON BUTTON("Transfer") #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Range]" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 430733f98..489485a53 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -967,6 +967,7 @@ #define TR_BUZZER INDENT "Zoemer" #define TR_BYTES "bytes" #define TR_MODULE_BIND TR("[Bnd]", "[Bind]") +#define TR_TRANSFER_BUTTON BUTTON("Transfer") #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE TR("[Rng]", "[Range]") diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 8c1e425fb..36190abce 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -967,6 +967,7 @@ #define TR_BUZZER INDENT"Brzęczyk" #define TR_BYTES "bajty" #define TR_MODULE_BIND TR("[BND]","[Bind]") +#define TR_TRANSFER_BUTTON BUTTON("Transfert) #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE TR("[Zas]","Zasięg") diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 8df7999eb..5749eefb8 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -971,6 +971,7 @@ #define TR_BUZZER INDENT"Buzzer" #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Bind]" +#define TR_TRANSFER_BUTTON BUTTON("Transfer") #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Range]" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 5cb0b44c9..f4706bf14 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -980,6 +980,7 @@ #define TR_BUZZER INDENT"Summer" #define TR_BYTES "byte" #define TR_MODULE_BIND TR("[Bnd]", "[Bind]") +#define TR_TRANSFER_BUTTON BUTTON("Transfer") #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE TR("[Tst]", "[Testa]") From e5676436528d1c4ec9dc74c64178830e9370dc16 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 22 Feb 2019 13:12:09 +0100 Subject: [PATCH 226/446] Refactoring. CAUTION: ERASE your EEPROM again! --- radio/src/datastructs.h | 36 +++---- radio/src/gui/128x64/model_setup.cpp | 25 ++--- radio/src/gui/128x64/radio_hardware.cpp | 5 +- radio/src/pulses/pulses.cpp | 6 +- radio/src/pulses/pxx.cpp | 101 -------------------- radio/src/pulses/pxx1.cpp | 72 +++++++++++++- radio/src/pulses/pxx1.h | 2 +- radio/src/pulses/pxx2.cpp | 54 ++++++++++- radio/src/pulses/pxx2.h | 2 + radio/src/storage/eeprom_conversions.cpp | 33 ++++++- radio/src/targets/common/arm/CMakeLists.txt | 3 - radio/src/targets/taranis/CMakeLists.txt | 4 + 12 files changed, 197 insertions(+), 146 deletions(-) delete mode 100644 radio/src/pulses/pxx.cpp diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index e87e312ab..4f38a909b 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -446,8 +446,6 @@ PACK(struct ModuleData { } r9m; }; - int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; - union { struct { int8_t delay:6; @@ -569,24 +567,10 @@ PACK(struct CustomScreenData { // TODO other boards could have their custom screens here as well #endif -#if defined(PCBX12S) - #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:6); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES]; TrainerModuleData trainerData; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); -#elif defined(PCBX10) - #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:3); NOBACKUP(uint8_t trainerMode:3); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES]; TrainerModuleData trainerData; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); NOBACKUP(uint8_t potsWarnSpares[NUM_DUMMY_ANAS]); -#elif defined(PCBTARANIS) - #define MODELDATA_EXTRA \ - uint8_t spare:6; \ - uint8_t potsWarnMode:2; \ - ModuleData moduleData[NUM_MODULES]; \ - TrainerModuleData trainerData; \ - ScriptData scriptsData[MAX_SCRIPTS]; \ - char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ - uint8_t potsWarnEnabled; \ - int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; -#elif defined(PCBSKY9X) - #define MODELDATA_EXTRA uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; uint8_t rxBattAlarms[2]; +#if defined(PCBHORUS) || defined(PCBTARANIS) + #define SCRIPTS_DATA NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); #else - #define MODELDATA_EXTRA + #define SCRIPTS_DATA #endif PACK(struct ModelData { @@ -624,7 +608,17 @@ PACK(struct ModelData { TELEMETRY_DATA - MODELDATA_EXTRA + NOBACKUP(uint8_t spare:6); + NOBACKUP(uint8_t potsWarnMode:2); + ModuleData moduleData[NUM_MODULES]; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; + TrainerModuleData trainerData; + + SCRIPTS_DATA + + NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); + NOBACKUP(uint8_t potsWarnEnabled); + NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS+NUM_DUMMY_ANAS]); NOBACKUP(TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS];) @@ -804,7 +798,7 @@ PACK(struct RadioData { #undef SWITCHES_WARNING_DATA #undef MODEL_GVARS_DATA #undef TELEMETRY_DATA -#undef MODELDATA_EXTRA +#undef SCRIPTS_DATA #undef CUSTOM_SCREENS_DATA #undef SPLASH_MODE #undef EXTRA_GENERAL_FIELDS diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 649422b10..3dea17fa7 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -303,7 +303,7 @@ void runPopupRegister(event_t event) if (menuVerticalPosition != 2) { break; } - else if (menuHorizontalPosition == 0) { + else if (reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED && menuHorizontalPosition == 0) { // [Enter] pressed reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; backupEditMode = EDIT_MODIFY_FIELD; // so that the [Register] button blinks and the REGISTER process can continue @@ -322,7 +322,7 @@ void runPopupRegister(event_t event) } if (warningText) { - const uint8_t dialogRows[] = { 0, 0, 1}; + const uint8_t dialogRows[] = { 0, uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? READONLY_ROW : 0), uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? 0 : 1)}; check(event, 0, nullptr, 0, dialogRows, 2, 2); drawMessageBox(); @@ -330,21 +330,24 @@ void runPopupRegister(event_t event) lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, STR_REG_ID); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); - if (reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { + if (reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED) { + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Waiting ..."); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 ? INVERS : 0); + } + else { lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, STR_RX_NAME); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.moduleSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); + lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); } - lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); - reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = s_editMode; } menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER + HEADER_LINE; - menuHorizontalPosition = 1; + menuHorizontalPosition = 0; menuVerticalOffset = backupVerticalOffset; s_editMode = backupEditMode; } @@ -1172,12 +1175,12 @@ void menuModelSetup(event_t event) if (attr) { if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) { if (menuHorizontalPosition == 0 && event == EVT_KEY_FIRST(KEY_ENTER)) { - moduleSettings[moduleIdx].mode = MODULE_MODE_REGISTER; reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_START; memcpy(reusableBuffer.moduleSetup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = 0; reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = 0; reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = 0; + moduleSettings[moduleIdx].mode = MODULE_MODE_REGISTER; s_editMode = 0; POPUP_INPUT("", runPopupRegister); } @@ -1780,11 +1783,11 @@ void menuModelFailsafe(event_t event) if (menuVerticalPosition < sentModuleChannels(g_moduleIdx)) { if (s_editMode > 0) { - g_model.moduleData[g_moduleIdx].failsafeChannels[menuVerticalPosition] = channelOutputs[menuVerticalPosition+channelStart]; + g_model.failsafeChannels[menuVerticalPosition] = channelOutputs[menuVerticalPosition+channelStart]; s_editMode = 0; } else { - int16_t & failsafe = g_model.moduleData[g_moduleIdx].failsafeChannels[menuVerticalPosition]; + int16_t & failsafe = g_model.failsafeChannels[menuVerticalPosition]; if (failsafe < FAILSAFE_CHANNEL_HOLD) failsafe = FAILSAFE_CHANNEL_HOLD; else if (failsafe == FAILSAFE_CHANNEL_HOLD) @@ -1816,7 +1819,7 @@ void menuModelFailsafe(event_t event) // Channels for (; line < 8; line++) { const int32_t channelValue = channelOutputs[ch+channelStart]; - int32_t failsafeValue = g_model.moduleData[g_moduleIdx].failsafeChannels[ch]; + int32_t failsafeValue = g_model.failsafeChannels[ch]; //Channel putsChn(x+1, y, ch+1, SMLSIZE); @@ -1831,7 +1834,7 @@ void menuModelFailsafe(event_t event) } else { flags |= BLINK; - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[g_moduleIdx].failsafeChannels[ch], -lim, +lim); + CHECK_INCDEC_MODELVAR(event, g_model.failsafeChannels[ch], -lim, +lim); } } } diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 5fcbe91e9..563515c30 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -199,7 +199,10 @@ void runHWPopupRegister(event_t event) lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, STR_REG_ID); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); - if (reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) { + if (reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED) { + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Waiting for receiver ..."); + } + else { lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, STR_RX_NAME); editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.moduleSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); } diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 2e2833430..eb8325a47 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -337,10 +337,10 @@ void setCustomFailsafe(uint8_t moduleIndex) if (moduleIndex < NUM_MODULES) { for (int ch=0; ch= sentModuleChannels(moduleIndex) + g_model.moduleData[moduleIndex].channelsStart) { - g_model.moduleData[moduleIndex].failsafeChannels[ch] = 0; + g_model.failsafeChannels[ch] = 0; } - else if (g_model.moduleData[moduleIndex].failsafeChannels[ch] < FAILSAFE_CHANNEL_HOLD) { - g_model.moduleData[moduleIndex].failsafeChannels[ch] = channelOutputs[ch]; + else if (g_model.failsafeChannels[ch] < FAILSAFE_CHANNEL_HOLD) { + g_model.failsafeChannels[ch] = channelOutputs[ch]; } } } diff --git a/radio/src/pulses/pxx.cpp b/radio/src/pulses/pxx.cpp deleted file mode 100644 index fc1167b80..000000000 --- a/radio/src/pulses/pxx.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - * 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" - -template -void PxxPulses::addChannels(uint8_t port, uint8_t sendFailsafe, uint8_t sendUpperChannels) -{ - uint16_t pulseValue = 0; - uint16_t pulseValueLow = 0; - - for (int8_t i=0; i<8; i++) { - if (sendFailsafe) { - if (g_model.moduleData[port].failsafeMode == FAILSAFE_HOLD) { - pulseValue = (i < sendUpperChannels ? 4095 : 2047); - } - else if (g_model.moduleData[port].failsafeMode == FAILSAFE_NOPULSES) { - pulseValue = (i < sendUpperChannels ? 2048 : 0); - } - else { - if (i < sendUpperChannels) { - int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[8+i]; - if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { - pulseValue = 4095; - } - else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - pulseValue = 2048; - } - else { - failsafeValue += 2*PPM_CH_CENTER(8+g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; - pulseValue = limit(2049, (failsafeValue * 512 / 682) + 3072, 4094); - } - } - else { - int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[i]; - if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { - pulseValue = 2047; - } - else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - pulseValue = 0; - } - else { - failsafeValue += 2*PPM_CH_CENTER(g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; - pulseValue = limit(1, (failsafeValue * 512 / 682) + 1024, 2046); - } - } - } - } - else { - if (i < sendUpperChannels) { - int channel = 8 + g_model.moduleData[port].channelsStart + i; - int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; - pulseValue = limit(2049, (value * 512 / 682) + 3072, 4094); - } - else if (i < sentModuleChannels(port)) { - int channel = g_model.moduleData[port].channelsStart + i; - int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; - pulseValue = limit(1, (value * 512 / 682) + 1024, 2046); - } - else { - pulseValue = 1024; - } - } - - if (i & 1) { - PxxTransport::addByte(pulseValueLow); // Low byte of channel - PxxTransport::addByte(((pulseValueLow >> 8) & 0x0F) | (pulseValue << 4)); // 4 bits each from 2 channels - PxxTransport::addByte(pulseValue >> 4); // High byte of channel - } - else { - pulseValueLow = pulseValue; - } - } -} - -#if defined(PXX1) -template class PxxPulses >; -template class PxxPulses >; -template class PxxPulses; -#endif - -#if defined(PXX2) -template class PxxPulses; -#endif diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 1394f5ad5..568f9b38b 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -110,6 +110,76 @@ void Pxx1Pulses::addExtraFlags(uint8_t module) PxxTransport::addByte(extra_flags); } +template +void Pxx1Pulses::addChannels(uint8_t port, uint8_t sendFailsafe, uint8_t sendUpperChannels) +{ + uint16_t pulseValue = 0; + uint16_t pulseValueLow = 0; + + for (int8_t i=0; i<8; i++) { + if (sendFailsafe) { + if (g_model.moduleData[port].failsafeMode == FAILSAFE_HOLD) { + pulseValue = (i < sendUpperChannels ? 4095 : 2047); + } + else if (g_model.moduleData[port].failsafeMode == FAILSAFE_NOPULSES) { + pulseValue = (i < sendUpperChannels ? 2048 : 0); + } + else { + if (i < sendUpperChannels) { + int16_t failsafeValue = g_model.failsafeChannels[8+i]; + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { + pulseValue = 4095; + } + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + pulseValue = 2048; + } + else { + failsafeValue += 2*PPM_CH_CENTER(8+g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; + pulseValue = limit(2049, (failsafeValue * 512 / 682) + 3072, 4094); + } + } + else { + int16_t failsafeValue = g_model.failsafeChannels[i]; + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { + pulseValue = 2047; + } + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + pulseValue = 0; + } + else { + failsafeValue += 2*PPM_CH_CENTER(g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; + pulseValue = limit(1, (failsafeValue * 512 / 682) + 1024, 2046); + } + } + } + } + else { + if (i < sendUpperChannels) { + int channel = 8 + g_model.moduleData[port].channelsStart + i; + int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + pulseValue = limit(2049, (value * 512 / 682) + 3072, 4094); + } + else if (i < sentModuleChannels(port)) { + int channel = g_model.moduleData[port].channelsStart + i; + int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + pulseValue = limit(1, (value * 512 / 682) + 1024, 2046); + } + else { + pulseValue = 1024; + } + } + + if (i & 1) { + PxxTransport::addByte(pulseValueLow); // Low byte of channel + PxxTransport::addByte(((pulseValueLow >> 8) & 0x0F) | (pulseValue << 4)); // 4 bits each from 2 channels + PxxTransport::addByte(pulseValue >> 4); // High byte of channel + } + else { + pulseValueLow = pulseValue; + } + } +} + template void Pxx1Pulses::add8ChannelsFrame(uint8_t module, uint8_t sendUpperChannels) { @@ -128,7 +198,7 @@ void Pxx1Pulses::add8ChannelsFrame(uint8_t module, uint8_t sendUpp PxxTransport::addByte(0); // Channels - PxxPulses::addChannels(module, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); + addChannels(module, flag1 & PXX_SEND_FAILSAFE, sendUpperChannels); // Extra flags addExtraFlags(module); diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index 33c374a3a..99480efe6 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -156,7 +156,7 @@ class Pxx1Pulses: public PxxPulses uint8_t addFlag1(uint8_t port); void addExtraFlags(uint8_t port); - + void addChannels(uint8_t port, uint8_t sendFailsafe, uint8_t sendUpperChannels); void add8ChannelsFrame(uint8_t port, uint8_t sendUpperChannels); }; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 5e21aaa4a..e795a763f 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -39,6 +39,50 @@ void Pxx2Pulses::addFlag1(uint8_t module) Pxx2Transport::addByte(flag1); } +void Pxx2Pulses::addChannels(uint8_t module, uint8_t sendFailsafe, uint8_t firstChannel) +{ + uint16_t pulseValue = 0; + uint16_t pulseValueLow = 0; + + for (int8_t i=0; i<8; i++) { + uint8_t channel = firstChannel + i; + if (sendFailsafe) { + if (g_model.moduleData[module].failsafeMode == FAILSAFE_HOLD) { + pulseValue = 2047; + } + else if (g_model.moduleData[module].failsafeMode == FAILSAFE_NOPULSES) { + pulseValue = 0; + } + else { + int16_t failsafeValue = g_model.failsafeChannels[channel]; + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { + pulseValue = 2047; + } + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + pulseValue = 0; + } + else { + failsafeValue += 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + pulseValue = limit(1, (failsafeValue * 512 / 682) + 1024, 2046); + } + } + } + else { + int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + pulseValue = limit(1, (value * 512 / 682) + 1024, 2046); + } + + if (i & 1) { + Pxx2Transport::addByte(pulseValueLow); // Low byte of channel + Pxx2Transport::addByte(((pulseValueLow >> 8) & 0x0F) | (pulseValue << 4)); // 4 bits each from 2 channels + Pxx2Transport::addByte(pulseValue >> 4); // High byte of channel + } + else { + pulseValueLow = pulseValue; + } + } +} + void Pxx2Pulses::setupChannelsFrame(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_CHANNELS); @@ -50,8 +94,14 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module) addFlag1(module); // Channels - addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, 0); - addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, 1); + uint8_t channelsCount = sentModuleChannels(module); + addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart); + if (channelsCount > 8) { + addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart + 8); + if (channelsCount > 16) { + addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart + 16); + } + } } bool Pxx2Pulses::setupRegisterFrame(uint8_t module) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index dcd64a9c3..a07fa8d69 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -132,6 +132,8 @@ class Pxx2Pulses: public PxxPulses { void addFlag1(uint8_t module); + void addChannels(uint8_t module, uint8_t sendFailsafe, uint8_t firstChannel); + void addCrc() { Pxx2Transport::addByteWithoutCrc(Pxx2CrcMixin::crc >> 8); diff --git a/radio/src/storage/eeprom_conversions.cpp b/radio/src/storage/eeprom_conversions.cpp index 357977afe..b28d0f639 100644 --- a/radio/src/storage/eeprom_conversions.cpp +++ b/radio/src/storage/eeprom_conversions.cpp @@ -486,6 +486,34 @@ PACK(typedef struct { uint8_t ppmPulsePol; }) ModuleData_v216; +PACK(typedef struct { + uint8_t type:4; + int8_t rfProtocol:4; + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + union { + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t subType:3; + uint8_t invertedSerial:1; // telemetry serial inverted from standard + }; + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t freq:2; + uint8_t region:2; + } r9m; + }; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; + union { + struct { + int8_t delay:6; + uint8_t pulsePol:1; + uint8_t outputType:1; // false = open drain, true = push pull + int8_t frameLength; + } ppm; + }; +}) ModuleData_v217; + #if defined(PCBTARANIS) #define MODELDATA_EXTRA_216 \ uint8_t externalModule; \ @@ -511,7 +539,7 @@ PACK(typedef struct { uint8_t spare:3; \ uint8_t trainerMode:3; \ uint8_t potsWarnMode:2; \ - ModuleData moduleData[NUM_MODULES+1]; \ + ModuleData_v217 moduleData[NUM_MODULES+1]; \ char curveNames[MAX_CURVES][6]; \ ScriptData scriptsData[MAX_SCRIPTS]; \ char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ @@ -1205,7 +1233,8 @@ void ConvertModel_217_to_218(ModelData & model) } } for (int i=0; i Date: Fri, 22 Feb 2019 14:50:41 +0100 Subject: [PATCH 227/446] Remove duplicated code --- radio/src/gui/128x64/model_setup.cpp | 27 ++++++---- radio/src/gui/128x64/radio_hardware.cpp | 72 +------------------------ 2 files changed, 19 insertions(+), 80 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 3dea17fa7..10ec980f9 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -291,6 +291,8 @@ void onBindMenu(const char * result) void runPopupRegister(event_t event) { + uint8_t backupVerticalPosition = menuVerticalPosition; + uint8_t backupHorizontalPosition = menuHorizontalPosition; uint8_t backupVerticalOffset = menuVerticalOffset; int8_t backupEditMode = s_editMode; @@ -346,12 +348,24 @@ void runPopupRegister(event_t event) reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = s_editMode; } - menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER + HEADER_LINE; - menuHorizontalPosition = 0; + menuVerticalPosition = backupVerticalPosition; + menuHorizontalPosition = backupHorizontalPosition; menuVerticalOffset = backupVerticalOffset; s_editMode = backupEditMode; } +void startRegisterDialog(uint8_t module) +{ + reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_START; + memcpy(reusableBuffer.moduleSetup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); + reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = 0; + reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = 0; + reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = 0; + moduleSettings[module].mode = MODULE_MODE_REGISTER; + s_editMode = 0; + POPUP_INPUT("", runPopupRegister); +} + inline bool isDefaultModelRegistrationID() { return memcmp(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0; @@ -1175,14 +1189,7 @@ void menuModelSetup(event_t event) if (attr) { if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) { if (menuHorizontalPosition == 0 && event == EVT_KEY_FIRST(KEY_ENTER)) { - reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_START; - memcpy(reusableBuffer.moduleSetup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); - reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = 0; - reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = 0; - reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = 0; - moduleSettings[moduleIdx].mode = MODULE_MODE_REGISTER; - s_editMode = 0; - POPUP_INPUT("", runPopupRegister); + startRegisterDialog(moduleIdx); } else if (menuHorizontalPosition == 1) { moduleSettings[moduleIdx].mode = MODULE_MODE_RANGECHECK; diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 563515c30..bd6e6a2e1 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -158,68 +158,7 @@ enum MenuRadioHardwareItems { #define HW_SETTINGS_COLUMN1 30 #define HW_SETTINGS_COLUMN2 (30 + 5*FW) -void runHWPopupRegister(event_t event) -{ - uint8_t backupVerticalOffset = menuVerticalOffset; - int8_t backupEditMode = s_editMode; - - menuVerticalPosition = reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition; - menuHorizontalPosition = reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition; - s_editMode = reusableBuffer.moduleSetup.pxx2.registerPopupEditMode; - - switch (event) { - case EVT_KEY_BREAK(KEY_ENTER): - if (menuVerticalPosition != 2) { - break; - } - else if (menuHorizontalPosition == 0) { - // [Enter] pressed - reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; - backupEditMode = EDIT_MODIFY_FIELD; // so that the [Register] button blinks and the REGISTER process can continue - } - // no break - - case EVT_KEY_LONG(KEY_EXIT): - s_editMode = 0; - // no break; - - case EVT_KEY_BREAK(KEY_EXIT): - if (s_editMode <= 0) { - warningText = NULL; - } - break; - } - - if (warningText) { - const uint8_t dialogRows[] = { 0, 0, 1}; - check(event, 0, nullptr, 0, dialogRows, 2, 2); - - drawMessageBox(); - - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, STR_REG_ID); - editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); - - if (reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED) { - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Waiting for receiver ..."); - } - else { - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, STR_RX_NAME); - editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.moduleSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); - } - - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); - lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); - - reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; - reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; - reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = s_editMode; - } - - menuVerticalPosition = ITEM_RADIO_OWNER_ID + HEADER_LINE; - menuHorizontalPosition = 1; - menuVerticalOffset = backupVerticalOffset; - s_editMode = backupEditMode; -} +void startRegisterDialog(uint8_t module); void menuRadioHardware(event_t event) { @@ -382,14 +321,7 @@ void menuRadioHardware(event_t event) if (attr) { if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL && s_editMode > 0) { if (event == EVT_KEY_FIRST(KEY_ENTER)) { - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_REGISTER; - reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_START; - memcpy(reusableBuffer.moduleSetup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); - reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = 0; - reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = 0; - reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = 0; - s_editMode = 0; - POPUP_INPUT("", runHWPopupRegister); + startRegisterDialog(INTERNAL_MODULE); } else if (menuHorizontalPosition == 0) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; From b8770a2d2f05797e0f68068ded8d091e24c6bc7d Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 22 Feb 2019 15:49:49 +0100 Subject: [PATCH 228/446] Transfer (share with Friend) pulse part (not working) --- radio/src/pulses/pxx2.cpp | 18 ++++++++++++++++++ radio/src/pulses/pxx2.h | 3 +++ 2 files changed, 21 insertions(+) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index e795a763f..6c520643c 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -179,6 +179,22 @@ bool Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) return true; } +bool Pxx2Pulses::setupShareMode(uint8_t module) +{ + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETUP); + + Pxx2Transport::addByte(0xC0); + + Pxx2Transport::addByte(0x40); + + for(uint8_t i=0; i < 24 ; i++) { + Pxx2Transport::addByte(i); + } + + moduleSettings[module].mode = MODULE_MODE_NORMAL; + return true; +} + bool Pxx2Pulses::setupFrame(uint8_t module) { initFrame(); @@ -192,6 +208,8 @@ bool Pxx2Pulses::setupFrame(uint8_t module) result = setupBindFrame(module); else if (mode == MODULE_MODE_SPECTRUM_ANALYSER) result = setupSpectrumAnalyser(module); + else if (mode == MODULE_MODE_SHARE) + result = setupShareMode(module); else setupChannelsFrame(module); diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index a07fa8d69..4adca374a 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -29,6 +29,7 @@ #define PXX2_TYPE_ID_REGISTER 0x01 #define PXX2_TYPE_ID_BIND 0x02 #define PXX2_TYPE_ID_CHANNELS 0x03 + #define PXX2_TYPE_ID_RX_SETUP 0x05 #define PXX2_TYPE_ID_SPORT 0xFE #define PXX2_TYPE_C_POWER_METER 0x02 @@ -106,6 +107,8 @@ class Pxx2Pulses: public PxxPulses { bool setupBindFrame(uint8_t module); + bool setupShareMode(uint8_t module); + void setupChannelsFrame(uint8_t module); bool setupSpectrumAnalyser(uint8_t module); From aea10a342e83d9cc410a5fe9c5f9e570c490f4dd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 22 Feb 2019 16:39:26 +0100 Subject: [PATCH 229/446] Refactoring --- radio/src/datastructs.h | 1 - radio/src/gui/128x64/model_setup.cpp | 214 ++++++++++++--------------- 2 files changed, 95 insertions(+), 120 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 4f38a909b..1c74bd98b 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -419,7 +419,6 @@ PACK(struct ReceiverData { uint8_t telemetry:1; uint8_t spare:6; uint64_t channelMapping; // each receiver output (16) can be assigned to one of the 16 channels - char rxName[PXX2_LEN_RX_NAME]; }); /* diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 10ec980f9..2628aed54 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -83,17 +83,14 @@ enum MenuModelSetupItems { #endif ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NAME, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_SHARE, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NAME, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_LABEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_SHARE, - ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE, #endif ITEM_MODEL_EXTERNAL_MODULE_LABEL, ITEM_MODEL_EXTERNAL_MODULE_MODE, @@ -117,18 +114,15 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_FREQ, #endif ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RANGE_REGISTER, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_NAME, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_REGISTER_RANGE, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_SHARE, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_NAME, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_SHARE, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_ADD_RECEIVER, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE, #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, @@ -163,19 +157,15 @@ enum MenuModelSetupItems { #define MODEL_SETUP_RANGE_OFS 4*FW+3 #define MODEL_SETUP_SET_FAILSAFE_OFS 7*FW-2 -#define IF_PXX2(xxx) (isModulePXX2(INTERNAL_MODULE) ? (uint8_t)(xxx) : HIDDEN_ROW) -#define IF_NOT_PXX2(xxx) (isModulePXX2(INTERNAL_MODULE) ? HIDDEN_ROW : (uint8_t)(xxx)) -#define IF_EXTERNAL_PXX2(xxx) (isModulePXX2(EXTERNAL_MODULE) ? (uint8_t)(xxx) : HIDDEN_ROW) -#define IF_NOT_EXTERNAL_PXX2(xxx) (isModulePXX2(EXTERNAL_MODULE) ? HIDDEN_ROW : (uint8_t)(xxx)) +#define IF_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? (uint8_t)(xxx) : HIDDEN_ROW) +#define IF_NOT_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? HIDDEN_ROW : (uint8_t)(xxx)) #define IF_PXX2_RECEIVER_DISPLAYED(module, idx, xxx) ((isModulePXX2(module) && g_model.moduleData[module].pxx2.receivers[idx].enabled) ? (uint8_t)(xxx) : HIDDEN_ROW) #if defined(PCBTARANIS) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) - #define CURRENT_RECEIVER_EDITED(k) (k >= ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NAME ? 1 : 0) - #define INTERNAL_MODULE_ADD_RECEIVER_ROW (g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[MAX_RECEIVERS_PER_MODULE-1].enabled ? HIDDEN_ROW : (uint8_t)0) - #define EXTERNAL_MODULE_ADD_RECEIVER_ROW (g_model.moduleData[EXTERNAL_MODULE].pxx2.receivers[MAX_RECEIVERS_PER_MODULE-1].enabled ? HIDDEN_ROW : (uint8_t)0) + #define CURRENT_RECEIVER_EDITED(k) (k >= (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL : ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_LABEL) ? 1 : 0) #elif defined(PCBSKY9X) && !defined(REVA) - #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) + #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) #else #define CURRENT_MODULE_EDITED(k) (EXTERNAL_MODULE) #endif @@ -406,53 +396,48 @@ void menuModelSetup(event_t event) NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_ROTARY_ENCODERS - 1, // Center beeps 0, // Global functions - IF_PXX2(isDefaultModelRegistrationID() ? HIDDEN_ROW : READONLY_ROW), // Registration ID + + isDefaultModelRegistrationID() ? HIDDEN_ROW : READONLY_ROW, // Registration ID LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None) INTERNAL_MODULE_CHANNELS_ROWS, // Channels min and count - IF_NOT_PXX2(IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), - IF_PXX2(0), // RxNum + IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), + IF_PXX2_MODULE(INTERNAL_MODULE, 0), // RxNum ANTENNA_ROW - IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Module start channel (pxx2 always send 16) - IF_PXX2(1), // Range check and Register buttons - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, (uint8_t)-1), // Receiver Name - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Range + IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Module start channel + IF_PXX2_MODULE(INTERNAL_MODULE, 1), // Range check and Register buttons + IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver Name + Add/Del buttons + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Pinmap IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Telemetry - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Delete - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Transfer - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, (uint8_t)-1), // Receiver Number - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Range - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Telemetry - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 1), // Receiver Bind/Delete - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver Transfer - IF_PXX2(INTERNAL_MODULE_ADD_RECEIVER_ROW), + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Share + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver2 Name + Add/Del buttons + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver2 Pinmap + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver2 Telemetry + IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 1), // Receiver2 Bind/Share LABEL(ExternalModule), EXTERNAL_MODULE_MODE_ROWS, MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS EXTERNAL_MODULE_CHANNELS_ROWS, - IF_NOT_EXTERNAL_PXX2(EXTERNAL_MODULE_BIND_ROWS()), // line reused for PPM: PPM settings - IF_EXTERNAL_PXX2(0), // RxNum + IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, EXTERNAL_MODULE_BIND_ROWS()), // line reused for PPM: PPM settings + IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // RxNum OUTPUT_TYPE_ROWS() - IF_NOT_EXTERNAL_PXX2(EXTERNAL_MODULE_OPTION_ROW), + IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, EXTERNAL_MODULE_OPTION_ROW), MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, EXTERNAL_MODULE_FREQ_ROW FAILSAFE_ROWS(EXTERNAL_MODULE), - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 1), // Range check and Register buttons - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, (uint8_t)-1), // Receiver Name - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Range + IF_PXX2_MODULE(EXTERNAL_MODULE, 1), // Range check and Register buttons + IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Receiver Name + Add/Del buttons + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Pinmap IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Telemetry - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 1), // Receiver Bind/Delete - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Transfer - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, (uint8_t)-1), // Receiver Number - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver Range - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver Telemetry - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 1), // Receiver Bind/Delete - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver Transfer - IF_EXTERNAL_PXX2(EXTERNAL_MODULE_ADD_RECEIVER_ROW), + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 1), // Receiver Bind/Share + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver2 Name + Add/Del buttons + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver2 Range + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver2 Telemetry + IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 1), // Receiver2 Bind/Share TRAINER_ROWS }); @@ -1180,7 +1165,7 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RANGE_REGISTER: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_REGISTER_RANGE: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); lcdDrawTextAlignedLeft(y, STR_MODULE); @@ -1206,40 +1191,47 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_ADD_RECEIVER: - { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawTextAlignedLeft(y, STR_RECEIVER); - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_RXADD_BUTTON, attr); - if (attr && s_editMode > 0) { - if (g_model.moduleData[moduleIdx].pxx2.receivers[0].enabled) { - g_model.moduleData[moduleIdx].pxx2.receivers[1].enabled = 0x01; - memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[1].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); - menuVerticalPosition = (moduleIdx ? ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL : ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL) + 1; - } - else { - g_model.moduleData[moduleIdx].pxx2.receivers[0].enabled = 0x01; - memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[0].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); - menuVerticalPosition = (moduleIdx ? ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL : ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL) + 1; - } - killEvents(event); - s_editMode = 0; - storageDirty(EE_MODEL); - } - } - break; - - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_NAME: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_NAME: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_NAME: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_NAME: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_LABEL: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawTextAlignedLeft(y, STR_RECEIVER); - lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, PXX2_LEN_RX_NAME, ZCHAR); + lcdDrawNumber(lcdLastRightPos + 1, y, receiverIdx + 1); + // lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, PXX2_LEN_RX_NAME, ZCHAR); + + if (g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].enabled) { + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DEL_BUTTON, attr); + if (attr && s_editMode > 0) { + if (receiverIdx == 0) { + memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[0], &g_model.moduleData[moduleIdx].pxx2.receivers[1], sizeof(ReceiverData)); + } + memclear(&g_model.moduleData[moduleIdx].pxx2.receivers[1], sizeof(ReceiverData)); // we always remove the second receiver data + s_editMode = 0; + killEvents(event); + storageDirty(EE_MODEL); + } + } + else { + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_RXADD_BUTTON, attr); + if (attr && s_editMode > 0) { + if (g_model.moduleData[moduleIdx].pxx2.receivers[0].enabled) { + g_model.moduleData[moduleIdx].pxx2.receivers[1].enabled = 0x01; + memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[1].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); + menuVerticalPosition += 2; + } + else { + g_model.moduleData[moduleIdx].pxx2.receivers[0].enabled = 0x01; + memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[0].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); + menuVerticalPosition += 2; + } + s_editMode = 0; + killEvents(event); + storageDirty(EE_MODEL); + } + } } break; @@ -1271,17 +1263,20 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_DEL: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_DEL: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawText(6, y, "Action", 0); + lcdDrawTextAlignedLeft(y, INDENT INDENT "---"); + // TODO later once first telemetry frame received => the RX name + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, menuHorizontalPosition==0 ? attr : 0); - lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS, y, STR_DEL_BUTTON, menuHorizontalPosition==1 ? attr : 0); + lcdDrawText(lcdLastRightPos + FW/2, y, BUTTON("Share"), menuHorizontalPosition==1 ? attr : 0); + if (attr) { if (menuHorizontalPosition == 0) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { @@ -1303,40 +1298,21 @@ void menuModelSetup(event_t event) s_editMode = 0; } if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_OK) { - str2zchar(g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex], PXX2_LEN_RX_NAME); + // str2zchar(g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex], PXX2_LEN_RX_NAME); } } - else if (menuHorizontalPosition == 1 && s_editMode > 0) { - if (receiverIdx == 0) { - memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[0], &g_model.moduleData[moduleIdx].pxx2.receivers[1], sizeof(ReceiverData)); - menuVerticalPosition = ITEM_MODEL_INTERNAL_MODULE_PXX2_ADD_RECEIVER + 1; + else { + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + moduleSettings[moduleIdx].mode ^= MODULE_MODE_SHARE; + reusableBuffer.moduleSetup.pxx2.shareReceiverIndex = receiverIdx; + } + if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL) { + s_editMode = 0; } - memclear(&g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx], sizeof(ReceiverData)); - s_editMode = 0; - killEvents(event); - storageDirty(EE_MODEL); } } } break; - - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_SHARE: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_SHARE: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_SHARE: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_SHARE: - { - uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_TRANSFER_BUTTON, attr); - if (event == EVT_KEY_BREAK(KEY_ENTER)) { - moduleSettings[moduleIdx].mode ^= MODULE_MODE_SHARE; - reusableBuffer.moduleSetup.pxx2.shareReceiverIndex = receiverIdx; - } - if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL) - s_editMode = 0; - } - break; #endif #if defined(PCBSKY9X) case ITEM_MODEL_EXTRA_MODULE_BIND: @@ -1897,9 +1873,9 @@ void menuModelPinmap(event_t event) SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx)); lcdDrawTextAlignedLeft(0, STR_PINMAPSET); - for (uint8_t pos=0; pos Date: Fri, 22 Feb 2019 16:42:13 +0100 Subject: [PATCH 230/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 2628aed54..ee9bdeff2 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1220,13 +1220,12 @@ void menuModelSetup(event_t event) if (g_model.moduleData[moduleIdx].pxx2.receivers[0].enabled) { g_model.moduleData[moduleIdx].pxx2.receivers[1].enabled = 0x01; memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[1].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); - menuVerticalPosition += 2; } else { g_model.moduleData[moduleIdx].pxx2.receivers[0].enabled = 0x01; memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[0].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); - menuVerticalPosition += 2; } + menuVerticalPosition += 3; s_editMode = 0; killEvents(event); storageDirty(EE_MODEL); @@ -1297,9 +1296,6 @@ void menuModelSetup(event_t event) else { s_editMode = 0; } - if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_OK) { - // str2zchar(g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex], PXX2_LEN_RX_NAME); - } } else { if (event == EVT_KEY_BREAK(KEY_ENTER)) { From 58190570f5f68e96c4e0b437b01a4e538851d4f5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 22 Feb 2019 17:17:13 +0100 Subject: [PATCH 231/446] Telemetry now coming --- radio/src/pulses/pxx2.h | 2 +- radio/src/telemetry/telemetry.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 4adca374a..94d2ed885 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -30,7 +30,7 @@ #define PXX2_TYPE_ID_BIND 0x02 #define PXX2_TYPE_ID_CHANNELS 0x03 #define PXX2_TYPE_ID_RX_SETUP 0x05 - #define PXX2_TYPE_ID_SPORT 0xFE + #define PXX2_TYPE_ID_TELEMETRY 0xFE #define PXX2_TYPE_C_POWER_METER 0x02 #define PXX2_TYPE_ID_POWER_METER 0x01 diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index ac5883b6b..b1de783c9 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -121,6 +121,11 @@ void processBindFrame(uint8_t module, uint8_t * frame) } } +void processTelemetryFrame(uint8_t module, uint8_t * frame) +{ + sportProcessTelemetryPacketWithoutCrc(&frame[2]); +} + void processSpectrumFrame(uint8_t module, uint8_t * frame) { if (moduleSettings[module].mode != MODULE_MODE_SPECTRUM_ANALYSER) { @@ -153,6 +158,10 @@ void processRadioFrame(uint8_t module, uint8_t * frame) case PXX2_TYPE_ID_BIND: processBindFrame(module, frame); break; + + case PXX2_TYPE_ID_TELEMETRY: + processTelemetryFrame(module, frame); + break; } } From bc6834cde43887ad5812d38860f527217a15ce05 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 25 Feb 2019 07:46:33 +0100 Subject: [PATCH 232/446] Missing RX interrupt on external module --- radio/src/targets/taranis/hal.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index e25fcfdd8..9c451f19f 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -782,11 +782,10 @@ #define EXTMODULE_USART_GPIO_AF GPIO_AF_USART6 #define EXTMODULE_USART USART6 #define EXTMODULE_USART_IRQn USART6_IRQn + #define EXTMODULE_USART_IRQHandler USART6_IRQHandler #define EXTMODULE_USART_DMA_CHANNEL DMA_Channel_5 #define EXTMODULE_USART_DMA_STREAM DMA2_Stream6 #define EXTMODULE_USART_DMA_STREAM_IRQn DMA2_Stream6_IRQn - #define EXTMODULE_USART_DMA_STREAM_IRQHandler DMA2_Stream6_IRQHandler - #define EXTMODULE_USART_DMA_FLAG_TC DMA_IT_TCIF6 #else #define EXTMODULE_PULSES #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) From 28b22eb131b0848a5f9fa1c1f041ba454f41637f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 25 Feb 2019 08:08:54 +0100 Subject: [PATCH 233/446] Missing RX interrupt on external module --- radio/src/targets/taranis/extmodule_driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index dc94f11f2..72da992ca 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -149,7 +149,7 @@ void extmoduleInvertedSerialStart(uint32_t baudrate) extmoduleFifo.clear(); - USART_ITConfig(INTMODULE_USART, USART_IT_RXNE, ENABLE); + USART_ITConfig(EXTMODULE_USART, USART_IT_RXNE, ENABLE); NVIC_SetPriority(EXTMODULE_USART_IRQn, 6); NVIC_EnableIRQ(EXTMODULE_USART_IRQn); } From c6f07eca42968fb7149805b131f76ea248c0493a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 25 Feb 2019 08:23:34 +0100 Subject: [PATCH 234/446] X3 backlight --- radio/src/targets/taranis/backlight_driver.cpp | 2 +- radio/src/targets/taranis/board.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/taranis/backlight_driver.cpp b/radio/src/targets/taranis/backlight_driver.cpp index 97b225ac9..83e774ea2 100644 --- a/radio/src/targets/taranis/backlight_driver.cpp +++ b/radio/src/targets/taranis/backlight_driver.cpp @@ -97,7 +97,7 @@ uint8_t isBacklightEnabled() { return (BACKLIGHT_TIMER->CCR4 != 0 || BACKLIGHT_TIMER->CCR2 != 0); } -#elif defined(PCBX7) || defined(PCBXLITE) +#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX3) void backlightInit() { GPIO_InitTypeDef GPIO_InitStructure; diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 1853d7cd2..5e2551c48 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -21,7 +21,7 @@ #ifndef _BOARD_H_ #define _BOARD_H_ -#include "definitions.h" +#include "../definitions.h" #include "cpu_id.h" #if defined(__cplusplus) && !defined(SIMU) From 18cd64ac0dd41aa2f9100653844b9abe15786502 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 25 Feb 2019 09:12:05 +0100 Subject: [PATCH 235/446] X3 external module power --- radio/src/targets/taranis/hal.h | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 9c451f19f..58fc1fb80 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -756,11 +756,17 @@ // External Module #define EXTMODULE_PULSES -#if defined(PCBXLITE) - #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) +#if defined(PCBXLITE) || defined(PCBX3) #define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6) - #define EXTMODULE_PWR_GPIO GPIOD - #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_11 // PD.11 + #if defined(PCBX3) + #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define EXTMODULE_PWR_GPIO GPIOA + #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PA.08 + #else + #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) + #define EXTMODULE_PWR_GPIO GPIOD + #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_11 // PD.11 + #endif #define EXTMODULE_TX_GPIO GPIOC #define EXTMODULE_USART_GPIO GPIOC #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PC.06 From b35a5d8a781a8ada34b1eaba1b53b4df11a2805f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 25 Feb 2019 09:59:58 +0100 Subject: [PATCH 236/446] XLiteS another mistake --- radio/src/targets/taranis/hal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 58fc1fb80..1cece580b 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -771,7 +771,7 @@ #define EXTMODULE_USART_GPIO GPIOC #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PC.06 #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource6 - #define EXTMODULE_RX_GPIO_PIN GPIO_Pin_6 // PC.07 + #define EXTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PC.07 #define EXTMODULE_RX_GPIO_PinSource GPIO_PinSource7 #define EXTMODULE_TIMER TIM8 #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) From db930f28e4b856890d30745b7e1c14ef33faf161 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 25 Feb 2019 11:24:06 +0100 Subject: [PATCH 237/446] Flash on external module still uses S.PORT line --- radio/src/io/frsky_device_firmware_update.cpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp index 37c42e811..2fd6d484e 100644 --- a/radio/src/io/frsky_device_firmware_update.cpp +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -77,12 +77,6 @@ void DeviceFirmwareUpdate::startup() break; #endif - case EXTERNAL_MODULE: -#if defined(EXTMODULE_USART) - extmoduleInvertedSerialStart(57600); - break; -#endif - default: telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); break; @@ -137,11 +131,6 @@ const uint8_t * DeviceFirmwareUpdate::readFrame(uint32_t timeout) return readFullDuplexFrame(intmoduleFifo, timeout); #endif - case EXTERNAL_MODULE: -#if defined(EXTMODULE_USART) - return readFullDuplexFrame(extmoduleFifo, timeout); -#endif - default: return readHalfDuplexFrame(timeout); } @@ -196,11 +185,6 @@ void DeviceFirmwareUpdate::sendFrame() return intmoduleSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer); #endif - case EXTERNAL_MODULE: -#if defined(EXTMODULE_USART) - return extmoduleSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer); -#endif - default: return sportSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer); } From a7311810d3ad02abc11aa25f2ed14193cdc3bd6b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 25 Feb 2019 13:43:54 +0100 Subject: [PATCH 238/446] Cosmetics --- radio/src/gui/gui_common_arm.cpp | 2 +- radio/src/io/frsky_pxx2.h | 4 +++- radio/src/telemetry/telemetry.cpp | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 8c38b03f2..0355166d0 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -544,7 +544,7 @@ bool isExternalModuleAvailable(int module) } #endif #if !defined(PXX2) - if (module == MODULE_TYPE_XJT2) { + if (module == MODULE_TYPE_XJT2 || module == MODULE_TYPE_R9M2) { return false; } #endif diff --git a/radio/src/io/frsky_pxx2.h b/radio/src/io/frsky_pxx2.h index b879ebec6..560ae2b9b 100644 --- a/radio/src/io/frsky_pxx2.h +++ b/radio/src/io/frsky_pxx2.h @@ -25,8 +25,9 @@ #define PXX2_BAUDRATE 230400 #define PXX2_PERIOD 4 // 4ms +#define PXX2_FRAME_MAXLENGTH 32 -class ModuleFifo : public Fifo { +class ModuleFifo : public Fifo { public: bool getFrame(uint8_t * frame) { @@ -45,6 +46,7 @@ class ModuleFifo : public Fifo { uint32_t next = nextIndex(ridx); uint8_t len = fifo[next]; if (unsigned(len + 4 /* 2 bytes header + 2 bytes CRC */) > size()) { + // frame not fully received return false; } diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index b1de783c9..737e22a80 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -211,7 +211,7 @@ void telemetryWakeup() #endif #if defined(INTMODULE_USART) || defined(EXTMODULE_USART) - uint8_t frame[32]; + uint8_t frame[PXX2_FRAME_MAXLENGTH]; #if defined(INTMODULE_USART) if (intmoduleFifo.getFrame(frame)) { From f4f1602c2903bdfd4bac0fb474822a8644eb7e48 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 25 Feb 2019 18:08:53 +0100 Subject: [PATCH 239/446] Will only send a fake RX_UID on BIND for now --- radio/src/pulses/pxx2.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 6c520643c..4780e77fc 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -143,6 +143,7 @@ bool Pxx2Pulses::setupBindFrame(uint8_t module) for (uint8_t i=0; i Date: Tue, 26 Feb 2019 08:31:13 +0100 Subject: [PATCH 240/446] Telemetry frame updated --- radio/src/telemetry/telemetry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 737e22a80..08b4fa62a 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -123,7 +123,7 @@ void processBindFrame(uint8_t module, uint8_t * frame) void processTelemetryFrame(uint8_t module, uint8_t * frame) { - sportProcessTelemetryPacketWithoutCrc(&frame[2]); + sportProcessTelemetryPacketWithoutCrc(&frame[3]); } void processSpectrumFrame(uint8_t module, uint8_t * frame) From 55c9c280f7023fe0c7e8a0dafb259afda5ae9a10 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 26 Feb 2019 14:14:36 +0100 Subject: [PATCH 241/446] Turn module off to resume normal operation --- radio/src/gui/128x64/radio_spectrum.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp index 0ce576b56..47a099b46 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/128x64/radio_spectrum.cpp @@ -25,7 +25,12 @@ void menuRadioSpectrum(event_t event) SIMPLE_MENU("SPECTRUM ANALYSER", menuTabGeneral, MENU_RADIO_SPECTRUM, 1); if (menuEvent) { + INTERNAL_MODULE_OFF(); moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + /* wait 500ms off */ + watchdogSuspend(500); + RTOS_WAIT_MS(500); + INTERNAL_MODULE_ON(); } else if (event == EVT_ENTRY) { memclear(reusableBuffer.spectrum.bars, sizeof(reusableBuffer.spectrum.bars)); From 98ee035b551ead45fea0f7b3ea661af0f94a14d6 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Feb 2019 10:00:25 +0100 Subject: [PATCH 242/446] Trace for HJ (Ext module debug) --- radio/src/telemetry/telemetry.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 08b4fa62a..2051be581 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -221,6 +221,7 @@ void telemetryWakeup() #if defined(EXTMODULE_USART) if (extmoduleFifo.getFrame(frame)) { + TRACE("EXT Frame"); processModuleFrame(EXTERNAL_MODULE, frame); } #endif From 8d35e1f1c8232f969c91f95867cd2c0f792f7f26 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Feb 2019 10:15:46 +0100 Subject: [PATCH 243/446] Trace for HJ (Ext module debug) --- radio/src/targets/taranis/extmodule_driver.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 72da992ca..1b3959083 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -181,6 +181,8 @@ void extmoduleSendBuffer(const uint8_t * data, uint8_t size) #define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) extern "C" void EXTMODULE_USART_IRQHandler(void) { + TRACE_NOCRLF("I"); + uint32_t status = EXTMODULE_USART->SR; while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { From fcc31ef41dcacf47bca2fe7e3b5106995935d478 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 28 Feb 2019 10:29:24 +0100 Subject: [PATCH 244/446] 450K Bauds on external module --- radio/src/pulses/pxx.h | 2 +- radio/src/targets/taranis/extmodule_driver.cpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 361ee2930..89993a8c4 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -28,7 +28,7 @@ #define PXX_SEND_RANGECHECK (1 << 5) #if defined(PXX_FREQUENCY_HIGH) - #define EXTMODULE_USART_PXX_BAUDRATE 420000 + #define EXTMODULE_USART_PXX_BAUDRATE 450000 #define INTMODULE_USART_PXX_BAUDRATE 450000 #define PXX_PERIOD 4/*ms*/ #else diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 1b3959083..72da992ca 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -181,8 +181,6 @@ void extmoduleSendBuffer(const uint8_t * data, uint8_t size) #define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) extern "C" void EXTMODULE_USART_IRQHandler(void) { - TRACE_NOCRLF("I"); - uint32_t status = EXTMODULE_USART->SR; while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { From d707860ace7d2b6f75d3abaeffb8a94ff0af64c0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 4 Mar 2019 14:04:37 +0100 Subject: [PATCH 245/446] ModuleData splitted from ReceiverData --- radio/src/dataconstants.h | 11 ++-- radio/src/datastructs.h | 33 +++++++++--- radio/src/gui/128x64/model_setup.cpp | 78 +++++++++++++++++++++------- radio/src/pulses/modules.h | 4 +- 4 files changed, 96 insertions(+), 30 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index beb637a0f..3c34e019c 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -37,7 +37,6 @@ #if defined(PCBHORUS) #define MAX_MODELS 60 - #define MAX_RECEIVERS_PER_MODULE 5 #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 #define MAX_FLIGHT_MODES 9 #define MAX_MIXERS 64 @@ -51,7 +50,6 @@ #define MAX_CUSTOM_SCREENS 5 #elif defined(PCBTARANIS) #define MAX_MODELS 60 - #define MAX_RECEIVERS_PER_MODULE 2 #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 #define MAX_FLIGHT_MODES 9 #define MAX_MIXERS 64 @@ -64,7 +62,6 @@ #define MAX_TELEMETRY_SENSORS 32 #elif defined(PCBSKY9X) #define MAX_MODELS 60 - #define MAX_RECEIVERS_PER_MODULE 2 #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 #define MAX_FLIGHT_MODES 9 #define MAX_MIXERS 64 @@ -127,6 +124,14 @@ enum CurveType { #define MAX_CURVE_POINTS 512 #endif +#if defined(PCBHORUS) + #define NUM_RECEIVERS 10 + #define MAX_RECEIVERS_PER_MODULE 5 +#else + #define NUM_RECEIVERS 4 + #define MAX_RECEIVERS_PER_MODULE 4 +#endif + #if defined(PCBTARANIS) || defined(PCBSKY9X) || defined(PCBHORUS) #define NUM_MODULES 2 #else diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 1c74bd98b..2aaf97a6d 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -25,6 +25,7 @@ #include "board.h" #include "dataconstants.h" #include "definitions.h" +#include "bitfield.h" #if defined(PCBTARANIS) #define N_TARANIS_FIELD(x) @@ -415,10 +416,13 @@ PACK(struct TrainerModuleData { */ PACK(struct ReceiverData { - uint8_t enabled:1; + uint8_t used:1; uint8_t telemetry:1; - uint8_t spare:6; - uint64_t channelMapping; // each receiver output (16) can be assigned to one of the 16 channels + uint8_t spare:2; + // 5 bits per receiver output (24) as it can be assigned to one of the 24 channels + uint64_t channelMapping0:60; + uint64_t channelMapping1:64; + char name[8]; }); /* @@ -478,8 +482,24 @@ PACK(struct ModuleData { NOBACKUP(struct { uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W uint8_t external_antenna:1; // false = internal antenna, true = external antenna +#if defined(PCBHORUS) uint8_t spare:5; - ReceiverData receivers[MAX_RECEIVERS_PER_MODULE]; + uint32_t receivers; // max 5 receivers per module and 10 receivers in total (4bits per receiver with 0 = unused) +#else + uint8_t spare:1; + uint16_t receivers:12; // max 4 receivers per module and 4 receivers in total (3bits per receiver with 0 = unused) +#endif + NOBACKUP(inline uint8_t getReceiverSlot(uint8_t receiver) { + return (receivers >> (3 * receiver)) & 0b111; + }) + + NOBACKUP(inline void setReceiverSlot(uint8_t receiver, uint8_t slot) { + receivers = BF_SET(receivers, slot, 3 * receiver, 3); + }) + + NOBACKUP(inline void clearReceiverSlot(uint8_t receiver) { + setReceiverSlot(receiver, 0); + }) } pxx2); }; @@ -490,12 +510,10 @@ PACK(struct ModuleData { return ((uint8_t) (rfProtocol & 0x0f)) + (multi.rfProtocolExtra << 4); }) - NOBACKUP(inline void setMultiProtocol(uint8_t proto) - { + NOBACKUP(inline void setMultiProtocol(uint8_t proto) { rfProtocol = (uint8_t) (proto & 0x0f); multi.rfProtocolExtra = (proto & 0x30) >> 4; }) - }); /* @@ -610,6 +628,7 @@ PACK(struct ModelData { NOBACKUP(uint8_t spare:6); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES]; + ReceiverData receiverData[NUM_RECEIVERS]; int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; TrainerModuleData trainerData; diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index ee9bdeff2..a5beddc11 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -91,6 +91,14 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_LABEL, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_PINMAP, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_TELEM, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_LABEL, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_PINMAP, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_TELEM, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_BIND_SHARE, #endif ITEM_MODEL_EXTERNAL_MODULE_LABEL, ITEM_MODEL_EXTERNAL_MODULE_MODE, @@ -123,6 +131,14 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_LABEL, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_PINMAP, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_TELEM, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_LABEL, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_PINMAP, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_TELEM, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_BIND_SHARE, #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, @@ -159,11 +175,11 @@ enum MenuModelSetupItems { #define IF_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? (uint8_t)(xxx) : HIDDEN_ROW) #define IF_NOT_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? HIDDEN_ROW : (uint8_t)(xxx)) -#define IF_PXX2_RECEIVER_DISPLAYED(module, idx, xxx) ((isModulePXX2(module) && g_model.moduleData[module].pxx2.receivers[idx].enabled) ? (uint8_t)(xxx) : HIDDEN_ROW) +#define IF_PXX2_RECEIVER_DISPLAYED(module, idx, xxx) ((isModulePXX2(module) && g_model.moduleData[module].pxx2.getReceiverSlot(idx)) ? (uint8_t)(xxx) : HIDDEN_ROW) #if defined(PCBTARANIS) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) - #define CURRENT_RECEIVER_EDITED(k) (k >= (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL : ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_LABEL) ? 1 : 0) + #define CURRENT_RECEIVER_EDITED(k) ((k - (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL : ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL)) / 4) #elif defined(PCBSKY9X) && !defined(REVA) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) #else @@ -361,6 +377,16 @@ inline bool isDefaultModelRegistrationID() return memcmp(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0; } +uint8_t findEmptyReceiverSlot() +{ + for (uint8_t slot=0; slot 0) { - if (receiverIdx == 0) { - memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[0], &g_model.moduleData[moduleIdx].pxx2.receivers[1], sizeof(ReceiverData)); - } - memclear(&g_model.moduleData[moduleIdx].pxx2.receivers[1], sizeof(ReceiverData)); // we always remove the second receiver data + g_model.moduleData[moduleIdx].pxx2.receivers = (g_model.moduleData[moduleIdx].pxx2.receivers & BF_MASK(0, receiverIdx * 3)) | ((g_model.moduleData[moduleIdx].pxx2.receivers & BF_MASK((receiverIdx + 1) * 3, (MAX_RECEIVERS_PER_MODULE - 1 - receiverIdx) * 3)) >> 3); + memclear(&g_model.receiverData[receiverSlot], sizeof(ReceiverData)); s_editMode = 0; killEvents(event); storageDirty(EE_MODEL); @@ -1217,18 +1263,14 @@ void menuModelSetup(event_t event) else { lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_RXADD_BUTTON, attr); if (attr && s_editMode > 0) { - if (g_model.moduleData[moduleIdx].pxx2.receivers[0].enabled) { - g_model.moduleData[moduleIdx].pxx2.receivers[1].enabled = 0x01; - memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[1].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); - } - else { - g_model.moduleData[moduleIdx].pxx2.receivers[0].enabled = 0x01; - memcpy(&g_model.moduleData[moduleIdx].pxx2.receivers[0].channelMapping, DEFAULT_CHANNEL_MAPPING, sizeof(uint64_t)); - } - menuVerticalPosition += 3; s_editMode = 0; killEvents(event); - storageDirty(EE_MODEL); + uint8_t slot = findEmptyReceiverSlot(); + if (slot > 0) { + g_model.moduleData[moduleIdx].pxx2.receivers |= slot << (receiverIdx * 3); + g_model.receiverData[receiverSlot - 1].used = 1; + storageDirty(EE_MODEL); + } } } } @@ -1258,7 +1300,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_TELEM: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].telemetry = editCheckBox(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].telemetry, MODEL_SETUP_2ND_COLUMN, y, INDENT INDENT "Telemetry", attr, event); + // g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].telemetry = editCheckBox(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].telemetry, MODEL_SETUP_2ND_COLUMN, y, INDENT INDENT "Telemetry", attr, event); } break; diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 1d8fd157f..8b07460b6 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -208,12 +208,12 @@ constexpr int8_t MAX_EXTRA_MODULE_CHANNELS_M8 = 8; // only 16ch PPM inline uint8_t getPinOuput(uint8_t receiverIdx, uint8_t moduleIdx, uint8_t pin) { - return ((g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping >> (pin + ((pin & 0x01) ? -1 : 1 )) * 4) & 0x0F); + // TODO return ((g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping >> (pin + ((pin & 0x01) ? -1 : 1 )) * 4) & 0x0F); } inline void setPinOuput(uint8_t receiverIdx, uint8_t moduleIdx, uint8_t pin, uint8_t chan) { - g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping = BF_SET(g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping, chan, (pin + ((pin & 0x01) ? -1 : 1 )) * 4, 4); + // TODO g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping = BF_SET(g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping, chan, (pin + ((pin & 0x01) ? -1 : 1 )) * 4, 4); } inline int8_t maxModuleChannels_M8(uint8_t idx) From ee956f0a30f8c4bb9648cb180e25763bf815644e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 4 Mar 2019 16:45:54 +0100 Subject: [PATCH 246/446] Fixes --- radio/src/datastructs.h | 8 +-- radio/src/gui/128x64/gui.h | 2 - radio/src/gui/128x64/model_setup.cpp | 86 +++++++++++++++++----------- radio/src/pulses/modules.h | 20 +++++-- 4 files changed, 71 insertions(+), 45 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 2aaf97a6d..44a115986 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -416,13 +416,13 @@ PACK(struct TrainerModuleData { */ PACK(struct ReceiverData { + // 5 bits per receiver output (24) as it can be assigned to one of the 24 channels + uint64_t channelMapping0; // 12 first channels (4 bits spare) + uint64_t channelMapping1:60; // 12 last channels uint8_t used:1; uint8_t telemetry:1; uint8_t spare:2; - // 5 bits per receiver output (24) as it can be assigned to one of the 24 channels - uint64_t channelMapping0:60; - uint64_t channelMapping1:64; - char name[8]; + char name[PXX2_LEN_RX_NAME]; }); /* diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index cd794dd0e..648e56f14 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -199,8 +199,6 @@ void title(const char * s); #define SIMPLE_SUBMENU_NOTITLE(lines_count) \ check_submenu_simple(event, (lines_count)-1); - - #endif #define SIMPLE_MENU(title, tab, menu, lines_count) \ diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index a5beddc11..59fb2ed4d 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1267,8 +1267,12 @@ void menuModelSetup(event_t event) killEvents(event); uint8_t slot = findEmptyReceiverSlot(); if (slot > 0) { - g_model.moduleData[moduleIdx].pxx2.receivers |= slot << (receiverIdx * 3); - g_model.receiverData[receiverSlot - 1].used = 1; + g_model.moduleData[moduleIdx].pxx2.receivers |= (slot << (receiverIdx * 3)); + --slot; + g_model.receiverData[slot].used = 1; + #warning "USE 32bits copy" + g_model.receiverData[slot].channelMapping0 = (0 << 0) + (1 << 5) + (2 << 10) + (3 << 15) + (4 << 20) + (5 << 25) + ((uint64_t)6 << 30) + ((uint64_t)7 << 35) + ((uint64_t)8 << 40) + ((uint64_t)9 << 45) + ((uint64_t)10 << 50) + ((uint64_t)11 << 55); + g_model.receiverData[slot].channelMapping1 = (12 << 0) + (13 << 5) + (14 << 10) + (15 << 15) + (16 << 20) + (17 << 25) + ((uint64_t)18 << 30) + ((uint64_t)19 << 35) + ((uint64_t)20 << 40) + ((uint64_t)21 << 45) + ((uint64_t)22 << 50) + ((uint64_t)23 << 55); storageDirty(EE_MODEL); } } @@ -1278,17 +1282,19 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_PINMAP: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_PINMAP: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_PINMAP: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_PINMAP: { - uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawTextAlignedLeft(y, INDENT INDENT "Pinmap"); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr); if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { - g_receiverIdx = receiverIdx; - g_moduleIdx = moduleIdx; + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); + g_receiverIdx = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; pushMenu(menuModelPinmap); } } @@ -1296,24 +1302,39 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_TELEM: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_TELEM: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_TELEM: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_TELEM: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_TELEM: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_TELEM: { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - // g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].telemetry = editCheckBox(g_model.moduleData[INTERNAL_MODULE].pxx2.receivers[receiverIdx].telemetry, MODEL_SETUP_2ND_COLUMN, y, INDENT INDENT "Telemetry", attr, event); + uint8_t receiverSlot = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; + g_model.receiverData[receiverSlot].telemetry = editCheckBox(g_model.receiverData[receiverSlot].telemetry, MODEL_SETUP_2ND_COLUMN, y, INDENT INDENT "Telemetry", attr, event); + break; } - break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_BIND_SHARE: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_BIND_SHARE: { - uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); + uint8_t receiverSlot = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; - lcdDrawTextAlignedLeft(y, INDENT INDENT "---"); - // TODO later once first telemetry frame received => the RX name + if (zexist(g_model.receiverData[receiverSlot].name, PXX2_LEN_RX_NAME)) { + lcdDrawSizedText(INDENT_WIDTH * 2, y, g_model.receiverData[receiverSlot].name, PXX2_LEN_RX_NAME); + } + else { + lcdDrawTextAlignedLeft(y, INDENT INDENT "---"); + } lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, menuHorizontalPosition==0 ? attr : 0); lcdDrawText(lcdLastRightPos + FW/2, y, BUTTON("Share"), menuHorizontalPosition==1 ? attr : 0); @@ -1880,7 +1901,7 @@ void menuModelFailsafe(event_t event) } // Gauge -#if !defined(PCBX7) && !defined(PCBX3) // X7 LCD doesn't like too many horizontal lines +#if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines lcdDrawRect(x+LCD_W-3-wbar, y, wbar+1, 6); #endif const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar/2 + lim/2) / lim, wbar/2); @@ -1911,43 +1932,38 @@ void menuModelPinmap(event_t event) SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx)); lcdDrawTextAlignedLeft(0, STR_PINMAPSET); - // for (uint8_t pos=0; pos= 8 ? 8 : 0); - - for (uint8_t line = 0; line < 8; line++) { - const int32_t channelValue = channelOutputs[getPinOuput(g_receiverIdx, g_moduleIdx, pin)]; + for (uint8_t i = 0; i < NUM_BODY_LINES; i++) { + coord_t y = MENU_HEADER_HEIGHT + 1 + i*FH; + uint8_t pin = menuVerticalOffset + i; + const int32_t channelValue = channelOutputs[getPinOuput(g_receiverIdx, pin)]; // Pin - lcdDrawText(0, y, "Pin", SMLSIZE); - lcdDrawNumber(lcdLastRightPos + 1, y, pin+1, SMLSIZE); + lcdDrawText(0, y, "Pin"); + lcdDrawNumber(lcdLastRightPos + 1, y, pin+1); // Channel - LcdFlags flags = SMLSIZE; + LcdFlags flags = 0; if (menuVerticalPosition == pin) { flags |= INVERS; if (s_editMode > 0) { - uint8_t channel = getPinOuput(g_receiverIdx, g_moduleIdx, pin); + uint8_t channel = getPinOuput(g_receiverIdx, pin); flags |= BLINK; CHECK_INCDEC_MODELVAR(event, channel, 0, sentModuleChannels(g_moduleIdx)); - setPinOuput(g_receiverIdx, g_moduleIdx, pin, channel); + setPinOuput(g_receiverIdx, pin, channel); } } - putsChn(8*FW, y, getPinOuput(g_receiverIdx, g_moduleIdx, pin)+1, flags); + putsChn(7*FW, y, getPinOuput(g_receiverIdx, pin)+1, flags); // Bargraph +#if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines + lcdDrawRect(LCD_W-3-wbar, y + 1, wbar+1, 4); +#endif const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar/2 + lim/2) / lim, wbar/2); - const coord_t xChannel = (channelValue>0) ? x+LCD_W-3-wbar/2 : x+LCD_W-2-wbar/2-lenChannel; - lcdDrawHorizontalLine(xChannel, y+1, lenChannel, DOTTED, 0); - lcdDrawHorizontalLine(xChannel, y+2, lenChannel, DOTTED, 0); - - y += FH-1; - if (++pin > sentModuleChannels(g_moduleIdx)) - break; + const coord_t xChannel = (channelValue>0) ? LCD_W-3-wbar/2 : LCD_W-2-wbar/2-lenChannel; + lcdDrawHorizontalLine(xChannel, y+2, lenChannel, SOLID, 0); + lcdDrawHorizontalLine(xChannel, y+3, lenChannel, SOLID, 0); } } diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 8b07460b6..5f8f78afc 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -206,14 +206,26 @@ static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; constexpr int8_t MAX_EXTRA_MODULE_CHANNELS_M8 = 8; // only 16ch PPM -inline uint8_t getPinOuput(uint8_t receiverIdx, uint8_t moduleIdx, uint8_t pin) +inline uint8_t getPinOuput(uint8_t receiverIdx, uint8_t pin) { - // TODO return ((g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping >> (pin + ((pin & 0x01) ? -1 : 1 )) * 4) & 0x0F); + if (pin < 12) { + return ((g_model.receiverData[receiverIdx].channelMapping0 >> (pin * 5)) & 0x1F); + } + else { + pin -= 12; + return ((g_model.receiverData[receiverIdx].channelMapping1 >> (pin * 5)) & 0x1F); + } } -inline void setPinOuput(uint8_t receiverIdx, uint8_t moduleIdx, uint8_t pin, uint8_t chan) +inline void setPinOuput(uint8_t receiverIdx, uint8_t pin, uint8_t chan) { - // TODO g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping = BF_SET(g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].channelMapping, chan, (pin + ((pin & 0x01) ? -1 : 1 )) * 4, 4); + if (pin < 12) { + g_model.receiverData[receiverIdx].channelMapping0 = BF_SET(g_model.receiverData[receiverIdx].channelMapping0, chan, pin * 5, 5); + } + else { + pin -= 12; + g_model.receiverData[receiverIdx].channelMapping1 = BF_SET(g_model.receiverData[receiverIdx].channelMapping1, chan, pin * 5, 5); + } } inline int8_t maxModuleChannels_M8(uint8_t idx) From d0437be23d4588d30c3e5694819112af82e8cb36 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 4 Mar 2019 16:57:38 +0100 Subject: [PATCH 247/446] Fixes --- radio/src/gui/128x64/model_setup.cpp | 5 +++-- radio/src/opentx.h | 1 + radio/src/pulses/pxx2.cpp | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 59fb2ed4d..ed8131db1 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -264,7 +264,7 @@ enum MenuModelSetupItems { void onPXX2BindMenu(const char * result) { - reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex = (result - reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0]) / sizeof(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0]); + reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex = (result - reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0]) / PXX2_LEN_RX_NAME; reusableBuffer.moduleSetup.pxx2.bindStep = BIND_RX_NAME_SELECTED; } @@ -1344,6 +1344,7 @@ void menuModelSetup(event_t event) if (event == EVT_KEY_BREAK(KEY_ENTER)) { reusableBuffer.moduleSetup.pxx2.bindStep = BIND_START; reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount = 0; + reusableBuffer.moduleSetup.pxx2.bindReceiverSlot = receiverSlot; moduleSettings[moduleIdx].mode ^= MODULE_MODE_BIND; } if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) { @@ -1863,7 +1864,7 @@ void menuModelFailsafe(event_t event) const int32_t channelValue = channelOutputs[ch+channelStart]; int32_t failsafeValue = g_model.failsafeChannels[ch]; - //Channel + // Channel putsChn(x+1, y, ch+1, SMLSIZE); // Value diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 9320c228f..0cb5d3bdf 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1132,6 +1132,7 @@ union ReusableBuffer char registrationID[PXX2_LEN_REGISTRATION_ID]; char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; uint8_t bindCandidateReceiversCount; + uint8_t bindReceiverSlot; union { uint8_t bindSelectedReceiverIndex; uint8_t shareReceiverIndex; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 4780e77fc..9bd209b31 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -143,8 +143,8 @@ bool Pxx2Pulses::setupBindFrame(uint8_t module) for (uint8_t i=0; i Date: Mon, 4 Mar 2019 18:58:08 +0100 Subject: [PATCH 248/446] Fix --- radio/src/pulses/pxx2.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 9bd209b31..e30de2bc6 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -134,9 +134,7 @@ bool Pxx2Pulses::setupBindFrame(uint8_t module) reusableBuffer.moduleSetup.pxx2.bindStep = BIND_OK; POPUP_INFORMATION(STR_BIND_OK); } - else { - return false; - } + return false; } else if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_RX_NAME_SELECTED) { Pxx2Transport::addByte(0x01); From b2e6d0da7ad5a1449727361ec1b6de107e150324 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 5 Mar 2019 09:22:09 +0100 Subject: [PATCH 249/446] Fixed receiver password not sent after reboot --- radio/src/pulses/pxx2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index e30de2bc6..28e65947b 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -147,7 +147,7 @@ bool Pxx2Pulses::setupBindFrame(uint8_t module) else { Pxx2Transport::addByte(0x00); for (uint8_t i=0; i Date: Tue, 5 Mar 2019 11:46:39 +0100 Subject: [PATCH 250/446] Fixes (TELEMETRY DATA0 missing) --- radio/src/pulses/pxx2.cpp | 39 +++++++------------ radio/src/pulses/pxx2.h | 25 +++++++----- .../arm/stm32/intmodule_serial_driver.cpp | 3 ++ radio/src/telemetry/telemetry.cpp | 2 +- 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 28e65947b..ad4e2cde5 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -104,7 +104,7 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module) } } -bool Pxx2Pulses::setupRegisterFrame(uint8_t module) +void Pxx2Pulses::setupRegisterFrame(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); @@ -120,23 +120,22 @@ bool Pxx2Pulses::setupRegisterFrame(uint8_t module) else { Pxx2Transport::addByte(0); } - - return true; // TODO not always } -bool Pxx2Pulses::setupBindFrame(uint8_t module) +void Pxx2Pulses::setupBindFrame(uint8_t module) { - addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_BIND); - if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_WAIT) { if (get_tmr10ms() > reusableBuffer.moduleSetup.pxx2.bindWaitTimeout) { moduleSettings[module].mode = MODULE_MODE_NORMAL; reusableBuffer.moduleSetup.pxx2.bindStep = BIND_OK; POPUP_INFORMATION(STR_BIND_OK); } - return false; + return; } - else if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_RX_NAME_SELECTED) { + + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_BIND); + + if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_RX_NAME_SELECTED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; i 1000) { moduleSettings[module].counter = 1002; - return false; + return; } moduleSettings[module].counter = 1002; @@ -174,11 +171,9 @@ bool Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) reusableBuffer.spectrum.step = 100000; // 100KHz Pxx2Transport::addWord(reusableBuffer.spectrum.step); - - return true; } -bool Pxx2Pulses::setupShareMode(uint8_t module) +void Pxx2Pulses::setupShareMode(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETUP); @@ -191,24 +186,22 @@ bool Pxx2Pulses::setupShareMode(uint8_t module) } moduleSettings[module].mode = MODULE_MODE_NORMAL; - return true; } -bool Pxx2Pulses::setupFrame(uint8_t module) +void Pxx2Pulses::setupFrame(uint8_t module) { initFrame(); - bool result = true; uint8_t mode = moduleSettings[module].mode; if (mode == MODULE_MODE_REGISTER) - result = setupRegisterFrame(module); + setupRegisterFrame(module); else if (mode == MODULE_MODE_BIND) - result = setupBindFrame(module); + setupBindFrame(module); else if (mode == MODULE_MODE_SPECTRUM_ANALYSER) - result = setupSpectrumAnalyser(module); + setupSpectrumAnalyser(module); else if (mode == MODULE_MODE_SHARE) - result = setupShareMode(module); + setupShareMode(module); else setupChannelsFrame(module); @@ -217,8 +210,6 @@ bool Pxx2Pulses::setupFrame(uint8_t module) } endFrame(); - - return result; } template class PxxPulses; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 94d2ed885..117dddbfe 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -100,18 +100,18 @@ class Pxx2Transport: public DataBuffer, public Pxx2CrcMixin { class Pxx2Pulses: public PxxPulses { public: - bool setupFrame(uint8_t module); + void setupFrame(uint8_t module); protected: - bool setupRegisterFrame(uint8_t module); + void setupRegisterFrame(uint8_t module); - bool setupBindFrame(uint8_t module); + void setupBindFrame(uint8_t module); - bool setupShareMode(uint8_t module); + void setupShareMode(uint8_t module); void setupChannelsFrame(uint8_t module); - bool setupSpectrumAnalyser(uint8_t module); + void setupSpectrumAnalyser(uint8_t module); void addHead() { @@ -157,11 +157,18 @@ class Pxx2Pulses: public PxxPulses { void endFrame() { - // update the frame LEN = frame length minus the 2 first bytes - data[1] = getSize() - 2; + uint8_t size = getSize() - 2; - // now add the CRC - addCrc(); + if (size > 0) { + // update the frame LEN = frame length minus the 2 first bytes + data[1] = getSize() - 2; + + // now add the CRC + addCrc(); + } + else { + Pxx2Transport::initBuffer(); + } } }; diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 30fcfda33..3cfdb2377 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -92,6 +92,9 @@ extern "C" void INTMODULE_USART_IRQHandler(void) void intmoduleSendBuffer(const uint8_t * data, uint8_t size) { + if (size == 0) + return; + DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(INTMODULE_DMA_STREAM); DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL; diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 2051be581..459a582b4 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -123,7 +123,7 @@ void processBindFrame(uint8_t module, uint8_t * frame) void processTelemetryFrame(uint8_t module, uint8_t * frame) { - sportProcessTelemetryPacketWithoutCrc(&frame[3]); + sportProcessTelemetryPacketWithoutCrc(&frame[2]); } void processSpectrumFrame(uint8_t module, uint8_t * frame) From 57a0aeffbba8538a7ed580a67b05fbb3e18cda99 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Mar 2019 15:32:38 +0100 Subject: [PATCH 251/446] Fixes --- radio/src/dataconstants.h | 2 +- radio/src/io/frsky_device_firmware_update.cpp | 10 +++++----- radio/src/telemetry/telemetry.cpp | 8 ++++---- radio/src/telemetry/telemetry.h | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 3c34e019c..7f5a44b3e 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -793,7 +793,7 @@ enum BluetoothModes { // PXX2 constants #define PXX2_LEN_REGISTRATION_ID 8 -#define PXX2_LEN_RX_NAME 8 +#define PXX2_LEN_RX_NAME 8 #define PXX2_MAX_RECEIVERS_PER_MODULE 5 #endif // _DATACONSTANTS_H_ diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp index 2fd6d484e..797cd939e 100644 --- a/radio/src/io/frsky_device_firmware_update.cpp +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -136,7 +136,7 @@ const uint8_t * DeviceFirmwareUpdate::readFrame(uint32_t timeout) } } -bool DeviceFirmwareUpdate::waitState(State state, uint32_t timeout) +bool DeviceFirmwareUpdate::waitState(State newState, uint32_t timeout) { #if defined(SIMU) UNUSED(state); @@ -150,8 +150,8 @@ bool DeviceFirmwareUpdate::waitState(State state, uint32_t timeout) return false; } - processFrame(&frame[1]); - return state == state; + processFrame(frame); + return state == newState; #endif } @@ -258,11 +258,11 @@ const char * DeviceFirmwareUpdate::uploadFile(const char *filename) count >>= 2; - for (UINT i=0; i> 2; // 32 bit word offset into buffer *((uint32_t *)(frame + 2)) = buffer[offset]; frame[6] = address & 0x000000FF; diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 459a582b4..05ceab844 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -102,19 +102,19 @@ void processBindFrame(uint8_t module, uint8_t * frame) if (frame[3] == 0x00) { bool found = false; for (uint8_t i=0; i Date: Tue, 5 Mar 2019 15:49:01 +0100 Subject: [PATCH 252/446] Wait 1s OFF at the end of flash --- radio/src/io/frsky_device_firmware_update.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp index 797cd939e..380699487 100644 --- a/radio/src/io/frsky_device_firmware_update.cpp +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -303,9 +303,9 @@ void DeviceFirmwareUpdate::flashFile(const char * filename) EXTERNAL_MODULE_OFF(); SPORT_UPDATE_POWER_OFF(); - /* wait 2s off */ - watchdogSuspend(2000); - RTOS_WAIT_MS(2000); + /* wait 1s off */ + watchdogSuspend(1000); + RTOS_WAIT_MS(1000); startup(); @@ -328,6 +328,10 @@ void DeviceFirmwareUpdate::flashFile(const char * filename) waitState(SPORT_IDLE, 500); // Clear the fifo + /* wait 1s off */ + watchdogSuspend(1000); + RTOS_WAIT_MS(1000); + if (intPwr) INTERNAL_MODULE_ON(); if (extPwr) From 6c78f934540b3049f32496c1856af3e957fda47e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Mar 2019 16:58:12 +0100 Subject: [PATCH 253/446] Trainer / trainee on X-LiteS --- radio/src/main.cpp | 7 -- radio/src/pulses/ppm.cpp | 1 + radio/src/targets/taranis/CMakeLists.txt | 2 +- radio/src/targets/taranis/board.h | 11 ++- radio/src/targets/taranis/hal.h | 53 +++++++++---- radio/src/targets/taranis/trainer_driver.cpp | 80 +++++++++++++++----- 6 files changed, 111 insertions(+), 43 deletions(-) diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 470ff7bec..c7a1ae721 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -98,13 +98,6 @@ bool isJackPlugged() #endif #if defined(PCBXLITES) -enum JackState -{ - SPEAKER_ACTIVE, - HEADPHONE_ACTIVE, - TRAINER_ACTIVE, -}; - uint8_t jackState = SPEAKER_ACTIVE; const char STR_JACK_HEADPHONE[] = "Headphone"; diff --git a/radio/src/pulses/ppm.cpp b/radio/src/pulses/ppm.cpp index 98099d340..9bf97ffec 100644 --- a/radio/src/pulses/ppm.cpp +++ b/radio/src/pulses/ppm.cpp @@ -53,6 +53,7 @@ void setupPulsesPPM(PpmPulsesData * ppmPulsesData, uint8_t channelsStart, int rest = limit(9000, rest, 65535); /* avoids that CCR2 is bigger than ARR which would cause reboot */ #if defined(STM32) *ppmPulsesData->ptr++ = rest; + *ppmPulsesData->ptr = 0; // it's needed in case PPM is sent without DMA (we stop when we reach this 0) #else *ptr = rest; *(ptr + 1) = 0; diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index ea1057007..1ec29efd5 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -170,7 +170,7 @@ else() ) endif() -if(NOT PCB STREQUAL XLITE AND NOT PCB STREQUAL XLITES) +if(NOT PCB STREQUAL XLITE) set(TARGET_SRC ${TARGET_SRC} trainer_driver.cpp diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 5e2551c48..ae5c7bc5a 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -200,8 +200,17 @@ void extmoduleSendNextFrame(); #define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) #if defined(PCBX9E) #define TRAINER_CONNECTED() (true) -#elif defined(PCBX7) +#elif defined(PCBX7) || defined(PCBX3) #define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_SET) +#elif defined(PCBXLITES) + enum JackState + { + SPEAKER_ACTIVE, + HEADPHONE_ACTIVE, + TRAINER_ACTIVE, + }; + extern uint8_t jackState; + #define TRAINER_CONNECTED() (jackState == TRAINER_ACTIVE) #elif defined(PCBXLITE) #define TRAINER_CONNECTED() false // there is no Trainer jack on Taranis X-Lite #else diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 1cece580b..08ddd6aa8 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -816,33 +816,42 @@ #endif // Trainer Port -#if defined(PCBXLITE) - #define TRAINER_RCC_AHB1Periph 0 - #define TRAINER_RCC_APB1Periph 0 -#elif defined(PCBX3) - #define TRAINER_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD) +#if defined(PCBXLITES) || defined(PCBX3) + // on these 2 radios the trainer port already uses DMA1_Stream6, we won't use the DMA + #define TRAINER_RCC_AHB1Periph RCC_AHB1Periph_GPIOD #define TRAINER_RCC_APB1Periph RCC_APB1Periph_TIM4 #define TRAINER_GPIO GPIOD #define TRAINER_IN_GPIO_PIN GPIO_Pin_13 // PD.13 #define TRAINER_IN_GPIO_PinSource GPIO_PinSource13 #define TRAINER_OUT_GPIO_PIN GPIO_Pin_12 // PD.12 #define TRAINER_OUT_GPIO_PinSource GPIO_PinSource12 +#if defined(PCBX3) #define TRAINER_DETECT_GPIO GPIOD #define TRAINER_DETECT_GPIO_PIN GPIO_Pin_11 // PD.11 +#endif #define TRAINER_TIMER TIM4 #define TRAINER_TIMER_IRQn TIM4_IRQn - #define TRAINER_GPIO_AF GPIO_AF_TIM4 - #define TRAINER_DMA DMA1 - #define TRAINER_DMA_CHANNEL DMA_Channel_5 - #define TRAINER_DMA_STREAM DMA1_Stream2 - #define TRAINER_DMA_IRQn DMA1_Stream2_IRQn - #define TRAINER_DMA_IRQHandler DMA1_Stream2_IRQHandler - #define TRAINER_DMA_FLAG_TC DMA_IT_TCIF2 + #define TRAINER_GPIO_AF GPIO_AF_TIM4 // TIM4_CH1 (Out) + TIM4_CH2 (In) #define TRAINER_TIMER_IRQn TIM4_IRQn #define TRAINER_TIMER_IRQHandler TIM4_IRQHandler #define TRAINER_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) + #define TRAINER_OUT_CCMR1 TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE; + #define TRAINER_IN_CCMR1 TIM_CCMR1_IC2F_0 | TIM_CCMR1_IC2F_1 | TIM_CCMR1_CC2S_0; + #define TRAINER_OUT_COUNTER_REGISTER TRAINER_TIMER->CCR1 + #define TRAINER_IN_COUNTER_REGISTER TRAINER_TIMER->CCR2 + #define TRAINER_SETUP_REGISTER TRAINER_TIMER->CCR3 + #define TRAINER_OUT_INTERRUPT_FLAG TIM_SR_CC3IF + #define TRAINER_OUT_INTERRUPT_ENABLE TIM_DIER_CC3IE + #define TRAINER_IN_INTERRUPT_ENABLE TIM_DIER_CC2IE + #define TRAINER_IN_INTERRUPT_FLAG TIM_SR_CC2IF + #define TRAINER_OUT_CCER TIM_CCER_CC1E + #define TRAINER_CCER_POLARYTY TIM_CCER_CC1P + #define TRAINER_IN_CCER TIM_CCER_CC2E +#elif defined(PCBXLITE) + #define TRAINER_RCC_AHB1Periph 0 + #define TRAINER_RCC_APB1Periph 0 #else - #define TRAINER_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC) + #define TRAINER_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA1) #define TRAINER_RCC_APB1Periph RCC_APB1Periph_TIM3 #define TRAINER_GPIO GPIOC #define TRAINER_IN_GPIO_PIN GPIO_Pin_8 // PC.08 @@ -863,6 +872,18 @@ #define TRAINER_TIMER_IRQn TIM3_IRQn #define TRAINER_TIMER_IRQHandler TIM3_IRQHandler #define TRAINER_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) + #define TRAINER_OUT_CCMR2 TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4PE; + #define TRAINER_IN_CCMR2 TIM_CCMR2_IC3F_0 | TIM_CCMR2_IC3F_1 | TIM_CCMR2_CC3S_0; + #define TRAINER_OUT_COUNTER_REGISTER TRAINER_TIMER->CCR4 + #define TRAINER_IN_COUNTER_REGISTER TRAINER_TIMER->CCR3 + #define TRAINER_SETUP_REGISTER TRAINER_TIMER->CCR1 + #define TRAINER_OUT_INTERRUPT_FLAG TIM_SR_CC1IF + #define TRAINER_OUT_INTERRUPT_ENABLE TIM_DIER_CC1IE + #define TRAINER_IN_INTERRUPT_ENABLE TIM_DIER_CC3IE + #define TRAINER_IN_INTERRUPT_FLAG TIM_SR_CC3IF + #define TRAINER_OUT_CCER TIM_CCER_CC4E + #define TRAINER_IN_CCER TIM_CCER_CC3E + #define TRAINER_CCER_POLARYTY TIM_CCER_CC4P #endif // Serial Port @@ -1181,7 +1202,7 @@ #define SD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) #define SD_RCC_APB1Periph RCC_APB1Periph_SPI2 #define SD_GPIO_PRESENT_GPIO GPIOD -#if defined(PCBXLITE) +#if defined(PCBXLITE) || defined(PCBX3) #define SD_GPIO_PRESENT_GPIO_PIN GPIO_Pin_10 // PD.10 #else #define SD_GPIO_PRESENT_GPIO_PIN GPIO_Pin_9 // PD.09 @@ -1226,8 +1247,8 @@ #define JACK_DETECT_GPIO_PIN GPIO_Pin_13 // PC.13 #define AUDIO_SPEAKER_ENABLE_GPIO GPIOD #define AUDIO_SPEAKER_ENABLE_GPIO_PIN GPIO_Pin_14 // PD.14 - #define HEADPHONE_TRAINER_SWITCH_GPIO GPIOD - #define HEADPHONE_TRAINER_SWITCH_GPIO_PIN GPIO_Pin_13 // PD.13 + #define HEADPHONE_TRAINER_SWITCH_GPIO GPIOD + #define HEADPHONE_TRAINER_SWITCH_GPIO_PIN GPIO_Pin_9 // PD.09 #else #define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1) #endif diff --git a/radio/src/targets/taranis/trainer_driver.cpp b/radio/src/targets/taranis/trainer_driver.cpp index 67eb441cb..000c0721b 100644 --- a/radio/src/targets/taranis/trainer_driver.cpp +++ b/radio/src/targets/taranis/trainer_driver.cpp @@ -20,7 +20,9 @@ #include "opentx.h" +#if defined(HEARTBEAT_USART) DMAFifo<32> heartbeatFifo __DMA (HEARTBEAT_DMA_Stream); +#endif void trainerSendNextFrame(); @@ -39,7 +41,11 @@ void init_trainer_ppm() TRAINER_TIMER->CR1 &= ~TIM_CR1_CEN; TRAINER_TIMER->PSC = TRAINER_TIMER_FREQ / 2000000 - 1; // 0.5uS TRAINER_TIMER->ARR = 45000; - TRAINER_TIMER->CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4PE; // PWM mode 1 +#if defined(TRAINER_OUT_CCMR1) + TRAINER_TIMER->CCMR1 = TRAINER_OUT_CCMR1; +#elif defined(TRAINER_OUT_CCMR2) + TRAINER_TIMER->CCMR2 = TRAINER_OUT_CCMR2; +#endif TRAINER_TIMER->BDTR = TIM_BDTR_MOE; TRAINER_TIMER->EGR = 1; TRAINER_TIMER->DIER |= TIM_DIER_UDE; @@ -48,18 +54,23 @@ void init_trainer_ppm() setupPulsesPPMTrainer(); trainerSendNextFrame(); +#if defined(TRAINER_DMA_STREAM) NVIC_EnableIRQ(TRAINER_DMA_IRQn); NVIC_SetPriority(TRAINER_DMA_IRQn, 7); +#endif + NVIC_EnableIRQ(TRAINER_TIMER_IRQn); NVIC_SetPriority(TRAINER_TIMER_IRQn, 7); } void stop_trainer_ppm() { +#if defined(TRAINER_DMA_STREAM) NVIC_DisableIRQ(TRAINER_DMA_IRQn); - NVIC_DisableIRQ(TRAINER_TIMER_IRQn); - TRAINER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA +#endif + + NVIC_DisableIRQ(TRAINER_TIMER_IRQn); TRAINER_TIMER->DIER = 0; TRAINER_TIMER->CR1 &= ~TIM_CR1_CEN; // Stop counter } @@ -79,10 +90,14 @@ void init_trainer_capture() TRAINER_TIMER->ARR = 0xFFFF; TRAINER_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 2000000 - 1; // 0.5uS TRAINER_TIMER->CR2 = 0; - TRAINER_TIMER->CCMR2 = TIM_CCMR2_IC3F_0 | TIM_CCMR2_IC3F_1 | TIM_CCMR2_CC3S_0; - TRAINER_TIMER->CCER = TIM_CCER_CC3E; +#if defined(TRAINER_IN_CCMR1) + TRAINER_TIMER->CCMR1 = TRAINER_IN_CCMR1; +#elif defined(TRAINER_IN_CCMR2) + TRAINER_TIMER->CCMR2 = TRAINER_IN_CCMR2; +#endif + TRAINER_TIMER->CCER = TRAINER_IN_CCER; TRAINER_TIMER->SR &= ~TIM_SR_CC3IF & ~TIM_SR_CC2IF & ~TIM_SR_UIF; // Clear flags - TRAINER_TIMER->DIER |= TIM_DIER_CC3IE; + TRAINER_TIMER->DIER |= TRAINER_IN_INTERRUPT_ENABLE; TRAINER_TIMER->CR1 = TIM_CR1_CEN; NVIC_EnableIRQ(TRAINER_TIMER_IRQn); @@ -98,18 +113,26 @@ void stop_trainer_capture() void trainerSendNextFrame() { - TRAINER_TIMER->CCR4 = GET_TRAINER_PPM_DELAY() * 2; - TRAINER_TIMER->CCER = TIM_CCER_CC4E | (GET_TRAINER_PPM_POLARITY() ? 0 : TIM_CCER_CC4P); - TRAINER_TIMER->CCR1 = *(trainerPulsesData.ppm.ptr - 1) - 4000; // 2mS in advance + TRAINER_OUT_COUNTER_REGISTER = GET_TRAINER_PPM_DELAY() * 2; + TRAINER_TIMER->CCER = TRAINER_OUT_CCER | (GET_TRAINER_PPM_POLARITY() ? 0 : TRAINER_CCER_POLARYTY); + TRAINER_SETUP_REGISTER = *(trainerPulsesData.ppm.ptr - 1) - 4000; // 2mS in advance +#if defined(TRAINER_DMA_STREAM) TRAINER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA TRAINER_DMA_STREAM->CR |= TRAINER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; TRAINER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&TRAINER_TIMER->ARR); TRAINER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(trainerPulsesData.ppm.pulses); TRAINER_DMA_STREAM->NDTR = trainerPulsesData.ppm.ptr - trainerPulsesData.ppm.pulses; TRAINER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA +#else + trainerPulsesData.ppm.ptr = trainerPulsesData.ppm.pulses; + TRAINER_TIMER->DIER |= TIM_DIER_UDE; + TRAINER_TIMER->SR &= ~TIM_SR_UIF; // Clear this flag + TRAINER_TIMER->DIER |= TIM_DIER_UIE; // Enable this interrupt +#endif } +#if defined(TRAINER_DMA_STREAM) extern "C" void TRAINER_DMA_IRQHandler() { if (!DMA_GetITStatus(TRAINER_DMA_STREAM, TRAINER_DMA_FLAG_TC)) @@ -117,9 +140,10 @@ extern "C" void TRAINER_DMA_IRQHandler() DMA_ClearITPendingBit(TRAINER_DMA_STREAM, TRAINER_DMA_FLAG_TC); - TRAINER_TIMER->SR &= ~TIM_SR_CC1IF; // Clear flag - TRAINER_TIMER->DIER |= TIM_DIER_CC1IE; // Enable this interrupt + TRAINER_TIMER->SR &= ~TRAINER_OUT_INTERRUPT_FLAG; // Clear flag + TRAINER_TIMER->DIER |= TRAINER_OUT_INTERRUPT_ENABLE; // Enable this interrupt } +#endif extern "C" void TRAINER_TIMER_IRQHandler() { @@ -129,14 +153,15 @@ extern "C" void TRAINER_TIMER_IRQHandler() bool doCapture = false; // What mode? in or out? - if ((TRAINER_TIMER->DIER & TIM_DIER_CC3IE) && (TRAINER_TIMER->SR & TIM_SR_CC3IF)) { + if ((TRAINER_TIMER->DIER & TRAINER_IN_INTERRUPT_ENABLE) && (TRAINER_TIMER->SR & TRAINER_IN_INTERRUPT_FLAG)) { // capture mode on trainer jack - capture = TRAINER_TIMER->CCR3; + capture = TRAINER_IN_COUNTER_REGISTER; if (TRAINER_CONNECTED() && currentTrainerMode == TRAINER_MODE_MASTER_TRAINER_JACK) { doCapture = true; } } +#if defined(TRAINER_MODULE_HEARTBEAT) if ((TRAINER_TIMER->DIER & TIM_DIER_CC2IE) && (TRAINER_TIMER->SR & TIM_SR_CC2IF)) { // capture mode on heartbeat pin (external module) capture = TRAINER_TIMER->CCR2; @@ -144,22 +169,36 @@ extern "C" void TRAINER_TIMER_IRQHandler() doCapture = true; } } +#endif if (doCapture) { captureTrainerPulses(capture); } // PPM out compare interrupt - if ((TRAINER_TIMER->DIER & TIM_DIER_CC1IE) && (TRAINER_TIMER->SR & TIM_SR_CC1IF)) { + if ((TRAINER_TIMER->DIER & TRAINER_OUT_INTERRUPT_ENABLE) && (TRAINER_TIMER->SR & TRAINER_OUT_INTERRUPT_FLAG)) { // compare interrupt - TRAINER_TIMER->DIER &= ~TIM_DIER_CC1IE; // stop this interrupt - TRAINER_TIMER->SR &= ~TIM_SR_CC1IF; // Clear flag + TRAINER_TIMER->DIER &= ~TRAINER_OUT_INTERRUPT_ENABLE; // stop this interrupt + TRAINER_TIMER->SR &= ~TRAINER_OUT_INTERRUPT_FLAG; // Clear flag setupPulsesPPMTrainer(); trainerSendNextFrame(); } + +#if !defined(TRAINER_DMA_STREAM) + // PPM out update interrupt + if ((TRAINER_TIMER->DIER & TIM_DIER_UIE) && (TRAINER_TIMER->SR & TIM_SR_UIF)) { + TRAINER_TIMER->SR &= ~TIM_SR_UIF; // Clear flag + TRAINER_TIMER->ARR = *trainerPulsesData.ppm.ptr++; + if (*trainerPulsesData.ppm.ptr == 0) { + TRAINER_TIMER->SR &= ~TRAINER_OUT_INTERRUPT_FLAG; // Clear this flag + TRAINER_TIMER->DIER |= TRAINER_OUT_INTERRUPT_ENABLE; // Enable this interrupt + } + } +#endif } -void init_cppm_on_heartbeat_capture(void) +#if defined(TRAINER_MODULE_HEARTBEAT) +void init_cppm_on_heartbeat_capture() { EXTERNAL_MODULE_ON(); @@ -196,7 +235,9 @@ void stop_cppm_on_heartbeat_capture() EXTERNAL_MODULE_OFF(); } } +#endif +#if defined(HEARTBEAT_USART) void init_sbus_on_heartbeat_capture() { EXTERNAL_MODULE_ON(); @@ -258,13 +299,16 @@ void stop_sbus_on_heartbeat_capture() EXTERNAL_MODULE_OFF(); } } +#endif int sbusGetByte(uint8_t * byte) { switch (currentTrainerMode) { +#if defined(HEARTBEAT_USART) case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: return heartbeatFifo.pop(*byte); -#if !defined(PCBX7) && !defined(PCBX9E) && !defined(PCBX3) +#endif +#if !defined(PCBX7) && !defined(PCBX9E) && !defined(PCBX3) && !defined(PCBXLITE) case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: return serial2RxFifo.pop(*byte); #endif From e208c1db696603ebe6c3f3ed502a76ddf7cea619 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 5 Mar 2019 17:03:42 +0100 Subject: [PATCH 254/446] Remaining trace removed --- radio/src/telemetry/telemetry.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 05ceab844..ff7c37f34 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -221,7 +221,6 @@ void telemetryWakeup() #if defined(EXTMODULE_USART) if (extmoduleFifo.getFrame(frame)) { - TRACE("EXT Frame"); processModuleFrame(EXTERNAL_MODULE, frame); } #endif From ca4ffaf9c7c722ab3001666ed476511353fd51d4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Mar 2019 11:25:12 +0100 Subject: [PATCH 255/446] First step for a new MODULES / RX VERSION screen --- radio/src/gui/128x64/radio_version.cpp | 76 ++++++++++++++++++-------- radio/src/opentx.h | 7 +++ radio/src/pulses/pulses.h | 3 +- radio/src/pulses/pxx2.cpp | 22 +++++++- radio/src/pulses/pxx2.h | 3 + radio/src/translations/en.h.txt | 9 --- 6 files changed, 87 insertions(+), 33 deletions(-) diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 66c27cbef..9a2fc4b3e 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -20,6 +20,32 @@ #include "opentx.h" +#if defined(PXX2) +void menuRadioModulesVersion(event_t event) +{ + if (event == EVT_ENTRY) { + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; + reusableBuffer.hardware.modules[INTERNAL_MODULE].step = -1; + reusableBuffer.hardware.modules[INTERNAL_MODULE].timeout = 0; + } + + SIMPLE_SUBMENU("MODULES / RX VERSION", 0); +} +#endif + +enum MenuRadioVersionItems +{ + ITEM_RADIO_VERSION_FIRST = HEADER_LINE - 1, +#if defined(PXX2) + ITEM_RADIO_MODULES_VERSION, +#endif +#if defined(EEPROM_RLC) + ITEM_RADIO_BACKUP_EEPROM, + ITEM_RADIO_FACTORY_RESET, +#endif + ITEM_RADIO_VERSION_COUNT +}; + void menuRadioVersion(event_t event) { #if defined(EEPROM_RLC) @@ -31,40 +57,46 @@ void menuRadioVersion(event_t event) } #endif - SIMPLE_MENU(STR_MENUVERSION, menuTabGeneral, MENU_RADIO_VERSION, 1); + SIMPLE_MENU(STR_MENUVERSION, menuTabGeneral, MENU_RADIO_VERSION, ITEM_RADIO_VERSION_COUNT); - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+FH, vers_stamp); + coord_t y = MENU_HEADER_HEIGHT + 1; + lcdDrawTextAlignedLeft(y, vers_stamp); + y += 4*FH; + // TODO this was good on AVR radios, but horrible now ... #if defined(COPROCESSOR) if (Coproc_valid == 1) { - lcdDrawTextAlignedLeft(6*FH, "CoPr:"); - lcdDraw8bitsNumber(10*FW, 6*FH, Coproc_read); + lcdDrawTextAlignedLeft(y, "CoPr:"); + lcdDraw8bitsNumber(10*FW, y, Coproc_read); } else { - lcdDrawTextAlignedLeft(6*FH, "CoPr: ---"); + lcdDrawTextAlignedLeft(y, "CoPr: ---"); } -#elif defined(EEPROM_RLC) - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+5*FH+1, STR_EEBACKUP); - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+6*FH+1, STR_FACTORYRESET); - lcdDrawFilledRect(0, MENU_HEADER_HEIGHT+5*FH, LCD_W, 2*FH+1, SOLID); + y += FH; +#endif -#if defined(PCBXLITE) - if (event == EVT_KEY_LONG(KEY_ENTER)) { - killEvents(KEY_ENTER); - if (IS_SHIFT_PRESSED()) { - POPUP_CONFIRMATION(STR_CONFIRMRESET); - } - else { - eepromBackup(); - } +#if defined(PXX2) + lcdDrawText(0, y, BUTTON("Modules / RX version"), menuVerticalPosition == ITEM_RADIO_MODULES_VERSION ? INVERS : 0); + y += FH; + if (menuVerticalPosition == ITEM_RADIO_MODULES_VERSION && event == EVT_KEY_BREAK(KEY_ENTER)) { + s_editMode = EDIT_SELECT_FIELD; + pushMenu(menuRadioModulesVersion); } -#else - if (event == EVT_KEY_LONG(KEY_ENTER)) { +#endif + +#if defined(EEPROM_RLC) + lcdDrawText(0, y, BUTTON(TR_EEBACKUP), menuVerticalPosition == ITEM_RADIO_BACKUP_EEPROM ? INVERS : 0); + y += FH; + if (menuVerticalPosition == ITEM_RADIO_BACKUP_EEPROM && event == EVT_KEY_BREAK(KEY_ENTER)) { + s_editMode = EDIT_SELECT_FIELD; eepromBackup(); } - else if (event == EVT_KEY_LONG(KEY_MENU)) { + + lcdDrawText(0, y, BUTTON(TR_FACTORYRESET), menuVerticalPosition == ITEM_RADIO_FACTORY_RESET ? INVERS : 0); + // y += FH; + if (menuVerticalPosition == ITEM_RADIO_FACTORY_RESET && event == EVT_KEY_BREAK(KEY_ENTER)) { + s_editMode = EDIT_SELECT_FIELD; POPUP_CONFIRMATION(STR_CONFIRMRESET); } #endif -#endif } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 0cb5d3bdf..e7a2f3cbf 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1168,6 +1168,13 @@ union ReusableBuffer } sdmanager; #endif + struct { + struct { + int8_t step; + uint8_t timeout; + } modules[NUM_MODULES]; + } hardware; + struct { uint8_t stickMode; } generalSettings; diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 49b73c397..1a12dd49f 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -76,7 +76,8 @@ enum ModuleSettingsMode MODULE_MODE_BIND, MODULE_MODE_REGISTER, MODULE_MODE_SPECTRUM_ANALYSER, - MODULE_MODE_SHARE + MODULE_MODE_SHARE, + MODULE_MODE_GET_HARDWARE_INFO }; PACK(struct ModuleSettings { diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index ad4e2cde5..e9756fe85 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -104,6 +104,24 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module) } } +void Pxx2Pulses::setupHardwareInfoFrame(uint8_t module) +{ + if (reusableBuffer.hardware.modules[module].step >= -1 && reusableBuffer.hardware.modules[module].step < PXX2_MAX_RECEIVERS_PER_MODULE) { + if (reusableBuffer.hardware.modules[module].timeout == 0) { + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_HW_INFO); + Pxx2Transport::addByte(reusableBuffer.hardware.modules[module].step); + reusableBuffer.hardware.modules[module].timeout = 20; + reusableBuffer.hardware.modules[module].step++; + } + else { + reusableBuffer.hardware.modules[module].timeout--; + } + } + else { + moduleSettings[module].mode = MODULE_MODE_NORMAL; + } +} + void Pxx2Pulses::setupRegisterFrame(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_REGISTER); @@ -194,7 +212,9 @@ void Pxx2Pulses::setupFrame(uint8_t module) uint8_t mode = moduleSettings[module].mode; - if (mode == MODULE_MODE_REGISTER) + if (mode == MODULE_MODE_GET_HARDWARE_INFO) + setupHardwareInfoFrame(module); + else if (mode == MODULE_MODE_REGISTER) setupRegisterFrame(module); else if (mode == MODULE_MODE_BIND) setupBindFrame(module); diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 117dddbfe..6181c5fe6 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -30,6 +30,7 @@ #define PXX2_TYPE_ID_BIND 0x02 #define PXX2_TYPE_ID_CHANNELS 0x03 #define PXX2_TYPE_ID_RX_SETUP 0x05 + #define PXX2_TYPE_ID_HW_INFO 0x06 #define PXX2_TYPE_ID_TELEMETRY 0xFE #define PXX2_TYPE_C_POWER_METER 0x02 @@ -103,6 +104,8 @@ class Pxx2Pulses: public PxxPulses { void setupFrame(uint8_t module); protected: + void setupHardwareInfoFrame(uint8_t module); + void setupRegisterFrame(uint8_t module); void setupBindFrame(uint8_t module); diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 2a2ed3347..f05f34401 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1027,20 +1027,11 @@ #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" -#if defined(COLORLCD) #define TR_EEBACKUP "EEPROM backup" #define TR_FACTORYRESET "Factory reset" -#elif defined(PCBXLITE) -#define TR_EEBACKUP "\001[ENT. Long]: Backup" -#define TR_FACTORYRESET "\001[\300ENT. Long]: Fact. reset" -#else -#define TR_EEBACKUP TR("\001[ENTER Long]: Backup", "\012[ENTER Long]: EEPROM backup") -#define TR_FACTORYRESET TR("\001[MENU Long]: Fact. reset", "\012[MENU Long]: Factory reset") -#endif #define TR_CONFIRMRESET TR("Erase ALL", "Erase ALL models and settings?") #define TR_TO_MANY_LUA_SCRIPTS "Too many Lua scripts!" - // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" #define TR_PHASES_HEADERS_SW "Switch" From 919a5fa3cef3a2ba2bf68f1a26f49d68547a3009 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Mar 2019 12:42:04 +0100 Subject: [PATCH 256/446] Next step for a new MODULES / RX VERSION screen --- radio/src/gui/128x64/radio_version.cpp | 80 +++++++++++++++++++++++++- radio/src/opentx.h | 6 ++ 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 9a2fc4b3e..dcedd489f 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -18,18 +18,94 @@ * GNU General Public License for more details. */ +#include #include "opentx.h" +// TODO duplicated code +#if defined(PCBX7) || defined(PCBX9E) +#define EVT_KEY_NEXT_LINE EVT_ROTARY_RIGHT +#define EVT_KEY_PREVIOUS_LINE EVT_ROTARY_LEFT +#else +#define EVT_KEY_NEXT_LINE EVT_KEY_FIRST(KEY_DOWN) +#define EVT_KEY_PREVIOUS_LINE EVT_KEY_FIRST(KEY_UP) +#endif + +#define MENU_BODY_TOP (FH + 1) +#define MENU_BODY_BOTTOM (LCD_H) + #if defined(PXX2) void menuRadioModulesVersion(event_t event) { + TITLE("MODULES / RX VERSION"); + if (event == EVT_ENTRY) { + menuVerticalOffset = 0; moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; + memclear(&reusableBuffer.hardware.modules, sizeof(reusableBuffer.hardware.modules)); reusableBuffer.hardware.modules[INTERNAL_MODULE].step = -1; - reusableBuffer.hardware.modules[INTERNAL_MODULE].timeout = 0; } - SIMPLE_SUBMENU("MODULES / RX VERSION", 0); + coord_t y = (FH + 1) - menuVerticalOffset * FH; + + for (uint8_t module=0; module= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { + if (module == INTERNAL_MODULE) + lcdDrawTextAlignedLeft(y, "Internal module"); + else if (module == EXTERNAL_MODULE) + lcdDrawTextAlignedLeft(y, "External module"); + } + y += FH; + + // Module version + if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { + lcdDrawText(INDENT_WIDTH, y, "Version"); + if (reusableBuffer.hardware.modules[module].hw_version) { + lcdDrawNumber(10 * FW, y, reusableBuffer.hardware.modules[module].hw_version); + lcdDrawText(lcdLastRightPos, y, "/"); + lcdDrawNumber(lcdLastRightPos, y, reusableBuffer.hardware.modules[module].sw_version); + } + } + y += FH; + + // RX versions + for (uint8_t receiver=0; receiver= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { + lcdDrawText(INDENT_WIDTH, y, "Receiver"); + lcdDrawNumber(lcdLastRightPos + 2, y, receiver + 1); + lcdDrawNumber(10 * FW, y, reusableBuffer.hardware.modules[module].receivers[receiver].hw_version); + lcdDrawText(lcdLastRightPos, y, "/"); + lcdDrawNumber(lcdLastRightPos, y, reusableBuffer.hardware.modules[module].receivers[receiver].sw_version); + } + y += FH; + } + } + } + + uint8_t lines = (y - (FH + 1)) / FH + menuVerticalOffset; + if (lines > NUM_BODY_LINES) { + drawVerticalScrollbar(LCD_W-1, FH, LCD_H-FH, menuVerticalOffset, lines, NUM_BODY_LINES); + } + + switch(event) { + case EVT_KEY_PREVIOUS_LINE: + if (menuVerticalOffset-- == 0) + menuVerticalOffset = lines - 1; + break; + + case EVT_KEY_NEXT_LINE: + if (++menuVerticalOffset + NUM_BODY_LINES > lines) + menuVerticalOffset = 0; + break; + + case EVT_KEY_BREAK(KEY_EXIT): + if (menuVerticalOffset != 0) + menuVerticalOffset = 0; + else + popMenu(); + break; + } } #endif diff --git a/radio/src/opentx.h b/radio/src/opentx.h index e7a2f3cbf..2e8a5a866 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1172,6 +1172,12 @@ union ReusableBuffer struct { int8_t step; uint8_t timeout; + uint32_t hw_version; + uint32_t sw_version; + struct { + uint32_t hw_version; + uint32_t sw_version; + } receivers[PXX2_MAX_RECEIVERS_PER_MODULE]; } modules[NUM_MODULES]; } hardware; From 49faf25c804752da024a3d20c1bb3d38855d86ef Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 6 Mar 2019 13:42:57 +0100 Subject: [PATCH 257/446] New MODULES / RX VERSION screen should be OK now --- radio/src/telemetry/telemetry.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index ff7c37f34..ff8ad7fb0 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -71,6 +71,23 @@ void processTelemetryData(uint8_t data) processFrskyTelemetryData(data); } +void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) +{ + if (moduleSettings[module].mode != MODULE_MODE_GET_HARDWARE_INFO) { + return; + } + + uint8_t index = frame[3]; + if (index == 0xFF) { + reusableBuffer.hardware.modules[module].hw_version = *((uint32_t *)&frame[4]); + reusableBuffer.hardware.modules[module].sw_version = *((uint32_t *)&frame[8]); + } + else if (index < PXX2_MAX_RECEIVERS_PER_MODULE){ + reusableBuffer.hardware.modules[module].receivers[index].hw_version = *((uint32_t *)&frame[4]); + reusableBuffer.hardware.modules[module].receivers[index].sw_version = *((uint32_t *)&frame[8]); + } +} + void processRegisterFrame(uint8_t module, uint8_t * frame) { if (moduleSettings[module].mode != MODULE_MODE_REGISTER) { @@ -151,6 +168,10 @@ void processSpectrumFrame(uint8_t module, uint8_t * frame) void processRadioFrame(uint8_t module, uint8_t * frame) { switch (frame[2]) { + case PXX2_TYPE_ID_HW_INFO: + processGetHardwareInfoFrame(module, frame); + break; + case PXX2_TYPE_ID_REGISTER: processRegisterFrame(module, frame); break; From 2b80a79c7121b3ff3361fbd5a361cdf652634d3f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Mar 2019 09:13:43 +0100 Subject: [PATCH 258/446] GET HW Info fixes --- radio/src/gui/128x64/radio_version.cpp | 24 +++++++++++++++++++----- radio/src/telemetry/telemetry.cpp | 8 ++++---- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index dcedd489f..78d2a7294 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -40,9 +40,16 @@ void menuRadioModulesVersion(event_t event) if (event == EVT_ENTRY) { menuVerticalOffset = 0; - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; + memclear(&reusableBuffer.hardware.modules, sizeof(reusableBuffer.hardware.modules)); + + #warning "Only do this if internal module is ON" + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; reusableBuffer.hardware.modules[INTERNAL_MODULE].step = -1; + + #warning "Only do this if external module is ON" + moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; + reusableBuffer.hardware.modules[EXTERNAL_MODULE].step = -1; } coord_t y = (FH + 1) - menuVerticalOffset * FH; @@ -87,16 +94,23 @@ void menuRadioModulesVersion(event_t event) if (lines > NUM_BODY_LINES) { drawVerticalScrollbar(LCD_W-1, FH, LCD_H-FH, menuVerticalOffset, lines, NUM_BODY_LINES); } + else { + menuVerticalOffset = 0; + } switch(event) { case EVT_KEY_PREVIOUS_LINE: - if (menuVerticalOffset-- == 0) - menuVerticalOffset = lines - 1; + if (lines > NUM_BODY_LINES) { + if (menuVerticalOffset-- == 0) + menuVerticalOffset = lines - 1; + } break; case EVT_KEY_NEXT_LINE: - if (++menuVerticalOffset + NUM_BODY_LINES > lines) - menuVerticalOffset = 0; + if (lines > NUM_BODY_LINES) { + if (++menuVerticalOffset + NUM_BODY_LINES > lines) + menuVerticalOffset = 0; + } break; case EVT_KEY_BREAK(KEY_EXIT): diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index ff8ad7fb0..afde93d41 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -79,12 +79,12 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) uint8_t index = frame[3]; if (index == 0xFF) { - reusableBuffer.hardware.modules[module].hw_version = *((uint32_t *)&frame[4]); - reusableBuffer.hardware.modules[module].sw_version = *((uint32_t *)&frame[8]); + reusableBuffer.hardware.modules[module].hw_version = *((uint16_t *)&frame[4]); + reusableBuffer.hardware.modules[module].sw_version = *((uint16_t *)&frame[6]); } else if (index < PXX2_MAX_RECEIVERS_PER_MODULE){ - reusableBuffer.hardware.modules[module].receivers[index].hw_version = *((uint32_t *)&frame[4]); - reusableBuffer.hardware.modules[module].receivers[index].sw_version = *((uint32_t *)&frame[8]); + reusableBuffer.hardware.modules[module].receivers[index].hw_version = *((uint16_t *)&frame[4]); + reusableBuffer.hardware.modules[module].receivers[index].sw_version = *((uint16_t *)&frame[6]); } } From 79351a2c7bfd9000d90aa397dc4feb3794d01a25 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Mar 2019 09:15:23 +0100 Subject: [PATCH 259/446] GET HW Info fixes --- radio/src/gui/128x64/radio_version.cpp | 12 +++++++----- radio/src/opentx.cpp | 2 +- radio/src/opentx.h | 1 + radio/src/pulses/pulses.h | 9 +++++---- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 78d2a7294..31b9b6014 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -38,7 +38,7 @@ void menuRadioModulesVersion(event_t event) { TITLE("MODULES / RX VERSION"); - if (event == EVT_ENTRY) { + if (event == EVT_ENTRY || get_tmr10ms() >= reusableBuffer.hardware.updateTime) { menuVerticalOffset = 0; memclear(&reusableBuffer.hardware.modules, sizeof(reusableBuffer.hardware.modules)); @@ -50,6 +50,8 @@ void menuRadioModulesVersion(event_t event) #warning "Only do this if external module is ON" moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; reusableBuffer.hardware.modules[EXTERNAL_MODULE].step = -1; + + reusableBuffer.hardware.updateTime = get_tmr10ms() + 1000 /* 10s*/; } coord_t y = (FH + 1) - menuVerticalOffset * FH; @@ -68,9 +70,9 @@ void menuRadioModulesVersion(event_t event) if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { lcdDrawText(INDENT_WIDTH, y, "Version"); if (reusableBuffer.hardware.modules[module].hw_version) { - lcdDrawNumber(10 * FW, y, reusableBuffer.hardware.modules[module].hw_version); + lcdDrawNumber(12 * FW, y, reusableBuffer.hardware.modules[module].hw_version, LEADING0, 3); lcdDrawText(lcdLastRightPos, y, "/"); - lcdDrawNumber(lcdLastRightPos, y, reusableBuffer.hardware.modules[module].sw_version); + lcdDrawNumber(lcdLastRightPos, y, reusableBuffer.hardware.modules[module].sw_version, LEADING0, 3); } } y += FH; @@ -81,9 +83,9 @@ void menuRadioModulesVersion(event_t event) if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { lcdDrawText(INDENT_WIDTH, y, "Receiver"); lcdDrawNumber(lcdLastRightPos + 2, y, receiver + 1); - lcdDrawNumber(10 * FW, y, reusableBuffer.hardware.modules[module].receivers[receiver].hw_version); + lcdDrawNumber(12 * FW, y, reusableBuffer.hardware.modules[module].receivers[receiver].hw_version, LEADING0, 3); lcdDrawText(lcdLastRightPos, y, "/"); - lcdDrawNumber(lcdLastRightPos, y, reusableBuffer.hardware.modules[module].receivers[receiver].sw_version); + lcdDrawNumber(lcdLastRightPos, y, reusableBuffer.hardware.modules[module].receivers[receiver].sw_version, LEADING0, 3); } y += FH; } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 0257768bd..681ac3079 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1494,7 +1494,7 @@ void doMixerCalculations() #if defined(MULTIMODULE) if ((moduleSettings[i].mode != MODULE_MODE_NORMAL && moduleSettings[i].mode != MODULE_MODE_SPECTRUM_ANALYSER) || (i == EXTERNAL_MODULE && multiModuleStatus.isBinding())) { #else - if (moduleSettings[i].mode != MODULE_MODE_NORMAL && moduleSettings[i].mode != MODULE_MODE_SPECTRUM_ANALYSER) { + if (moduleSettings[i].mode >= MODULE_MODE_BEEP_FIRST) { #endif if (++countRangecheck >= 250) { countRangecheck = 0; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 2e8a5a866..2ad4ec6e6 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1179,6 +1179,7 @@ union ReusableBuffer uint32_t sw_version; } receivers[PXX2_MAX_RECEIVERS_PER_MODULE]; } modules[NUM_MODULES]; + uint32_t updateTime; } hardware; struct { diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 1a12dd49f..352f0edaf 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -72,12 +72,13 @@ extern uint8_t s_pulses_paused; enum ModuleSettingsMode { MODULE_MODE_NORMAL, - MODULE_MODE_RANGECHECK, - MODULE_MODE_BIND, - MODULE_MODE_REGISTER, MODULE_MODE_SPECTRUM_ANALYSER, + MODULE_MODE_GET_HARDWARE_INFO, + MODULE_MODE_BEEP_FIRST, + MODULE_MODE_REGISTER = MODULE_MODE_BEEP_FIRST, + MODULE_MODE_BIND, MODULE_MODE_SHARE, - MODULE_MODE_GET_HARDWARE_INFO + MODULE_MODE_RANGECHECK, }; PACK(struct ModuleSettings { From c7258fd4f8c43a5c7b8648139d9268c70ace8665 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Mar 2019 11:12:57 +0100 Subject: [PATCH 260/446] BIND fix (buffer not cleared) --- radio/src/gui/128x64/model_setup.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index ed8131db1..528d29de3 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -362,11 +362,8 @@ void runPopupRegister(event_t event) void startRegisterDialog(uint8_t module) { - reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_START; + memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2)); memcpy(reusableBuffer.moduleSetup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); - reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = 0; - reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = 0; - reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = 0; moduleSettings[module].mode = MODULE_MODE_REGISTER; s_editMode = 0; POPUP_INPUT("", runPopupRegister); @@ -1342,8 +1339,8 @@ void menuModelSetup(event_t event) if (attr) { if (menuHorizontalPosition == 0) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { - reusableBuffer.moduleSetup.pxx2.bindStep = BIND_START; - reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount = 0; + // TODO this will go to module.cpp + memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2)); reusableBuffer.moduleSetup.pxx2.bindReceiverSlot = receiverSlot; moduleSettings[moduleIdx].mode ^= MODULE_MODE_BIND; } From 111b209a75e897689563aea72199d07b36dd2151 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Mar 2019 13:45:15 +0100 Subject: [PATCH 261/446] POPUP title --- radio/src/gui/128x64/model_setup.cpp | 7 +++---- radio/src/gui/128x64/popups.h | 1 + radio/src/gui/common/stdlcd/popups.cpp | 23 ++++++++++++++++++++--- radio/src/telemetry/telemetry.cpp | 1 + 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 528d29de3..fe6bd8146 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1326,12 +1326,10 @@ void menuModelSetup(event_t event) uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t receiverSlot = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; - if (zexist(g_model.receiverData[receiverSlot].name, PXX2_LEN_RX_NAME)) { + if (g_model.receiverData[receiverSlot].name[0] != '\0') lcdDrawSizedText(INDENT_WIDTH * 2, y, g_model.receiverData[receiverSlot].name, PXX2_LEN_RX_NAME); - } - else { + else lcdDrawTextAlignedLeft(y, INDENT INDENT "---"); - } lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, menuHorizontalPosition==0 ? attr : 0); lcdDrawText(lcdLastRightPos + FW/2, y, BUTTON("Share"), menuHorizontalPosition==1 ? attr : 0); @@ -1351,6 +1349,7 @@ void menuModelSetup(event_t event) for (uint8_t i=0; i(popupMenuItemsCount, MENU_MAX_DISPLAY_LINES); uint8_t y = (display_count >= 5 ? MENU_Y - FH - 1 : MENU_Y); - lcdDrawFilledRect(MENU_X, y, MENU_W, display_count * (FH+1) + 2, SOLID, ERASE); - lcdDrawRect(MENU_X, y, MENU_W, display_count * (FH+1) + 2); + if (popupMenuTitle) { + y += FH / 2; + } + // white background + lcdDrawFilledRect(MENU_X - 1, popupMenuTitle ? y - FH - 3 : y, MENU_W + 2, display_count * (FH + 1) + (popupMenuTitle ? FH + 6 : 3), SOLID, ERASE); + + // title + if (popupMenuTitle) { + lcdDrawText(MENU_X + 2, y - FH, popupMenuTitle, BOLD); + lcdDrawRect(MENU_X, y - FH - 2, lcdLastRightPos - MENU_X + 3, FH + 3); + } + + // border + lcdDrawRect(MENU_X, y, MENU_W, display_count * (FH + 1) + 2, SOLID, FORCE); + + // items for (uint8_t i=0; i display_count) { drawVerticalScrollbar(MENU_X+MENU_W-1, y+1, MENU_MAX_DISPLAY_LINES * (FH+1), popupMenuOffset, popupMenuItemsCount, display_count); } @@ -116,6 +132,7 @@ const char * runPopupMenu(event_t event) popupMenuItemsCount = 0; s_menu_item = 0; popupMenuOffset = 0; + popupMenuTitle = nullptr; break; } diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index afde93d41..55ae9a9b5 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -132,6 +132,7 @@ void processBindFrame(uint8_t module, uint8_t * frame) } else if (frame[3] == 0x01) { if (memcmp(&reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) { + memcpy(&g_model.receiverData[reusableBuffer.moduleSetup.pxx2.bindReceiverSlot].name, &frame[4], PXX2_LEN_RX_NAME); reusableBuffer.moduleSetup.pxx2.bindStep = BIND_WAIT; reusableBuffer.moduleSetup.pxx2.bindWaitTimeout = get_tmr10ms() + 30; } From 8092b65f68f52651406ba73d4d8d77cef18580b8 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 7 Mar 2019 14:02:40 +0100 Subject: [PATCH 262/446] Remove two warnings --- radio/src/gui/128x64/radio_version.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 31b9b6014..02ee48d4c 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -43,13 +43,15 @@ void menuRadioModulesVersion(event_t event) memclear(&reusableBuffer.hardware.modules, sizeof(reusableBuffer.hardware.modules)); - #warning "Only do this if internal module is ON" - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; - reusableBuffer.hardware.modules[INTERNAL_MODULE].step = -1; + if(isModulePXX2(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) { + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; + reusableBuffer.hardware.modules[INTERNAL_MODULE].step = -1; + } - #warning "Only do this if external module is ON" - moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; - reusableBuffer.hardware.modules[EXTERNAL_MODULE].step = -1; + if(isModulePXX2(EXTERNAL_MODULE) && IS_EXTERNAL_MODULE_ON()) { + moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; + reusableBuffer.hardware.modules[EXTERNAL_MODULE].step = -1; + } reusableBuffer.hardware.updateTime = get_tmr10ms() + 1000 /* 10s*/; } From 2c454e8156f9a9bd0c03ba10030a6392a332aa38 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Mar 2019 15:00:54 +0100 Subject: [PATCH 263/446] Cosmetics --- radio/src/gui/common/stdlcd/popups.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index af1ed2abc..b47dfe1b0 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -36,18 +36,15 @@ const char * runPopupMenu(event_t event) const char * result = NULL; uint8_t display_count = min(popupMenuItemsCount, MENU_MAX_DISPLAY_LINES); - uint8_t y = (display_count >= 5 ? MENU_Y - FH - 1 : MENU_Y); - if (popupMenuTitle) { - y += FH / 2; - } + uint8_t y = LCD_H / 2 - (popupMenuTitle ? 0 : 3) - (display_count * FH / 2); // white background - lcdDrawFilledRect(MENU_X - 1, popupMenuTitle ? y - FH - 3 : y, MENU_W + 2, display_count * (FH + 1) + (popupMenuTitle ? FH + 6 : 3), SOLID, ERASE); + lcdDrawFilledRect(MENU_X - 1, popupMenuTitle ? y - FH - 3 : y - 1, MENU_W + 2, display_count * (FH + 1) + (popupMenuTitle ? FH + 6 : 4), SOLID, ERASE); // title if (popupMenuTitle) { lcdDrawText(MENU_X + 2, y - FH, popupMenuTitle, BOLD); - lcdDrawRect(MENU_X, y - FH - 2, lcdLastRightPos - MENU_X + 3, FH + 3); + lcdDrawRect(MENU_X, y - FH - 2, lcdLastRightPos - MENU_X + 2, FH + 3); } // border From 68df0833942f5d845306f554925a4e3b24f34338 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Mar 2019 16:48:43 +0100 Subject: [PATCH 264/446] PXX2 pxx2SetRxParams started --- radio/src/datastructs.h | 3 ++- radio/src/gui/128x64/gui.h | 4 ++-- radio/src/gui/212x64/gui.h | 3 +-- radio/src/myeeprom.h | 3 +++ radio/src/pulses/modules.h | 2 ++ radio/src/pulses/pxx2.cpp | 6 ++++++ radio/src/pulses/pxx2.h | 2 ++ 7 files changed, 18 insertions(+), 5 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 44a115986..da8861284 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -421,7 +421,8 @@ PACK(struct ReceiverData { uint64_t channelMapping1:60; // 12 last channels uint8_t used:1; uint8_t telemetry:1; - uint8_t spare:2; + uint8_t dirty:1; + uint8_t spare:1; char name[PXX2_LEN_RX_NAME]; }); diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 648e56f14..62fb97887 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -64,8 +64,8 @@ extern int8_t checkIncDec_Ret; // global helper vars extern int8_t s_editMode; // global editmode // checkIncDec flags -#define EE_GENERAL 0x01 -#define EE_MODEL 0x02 + +// we leave room for EE_MODEL and EE_GENERAL #define NO_INCDEC_MARKS 0x04 #define INCDEC_SWITCH 0x08 #define INCDEC_SOURCE 0x10 diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index 50286021d..c745b07c1 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -93,8 +93,7 @@ extern int8_t checkIncDec_Ret; // global helper vars extern int8_t s_editMode; // global editmode // checkIncDec flags -#define EE_GENERAL 0x01 -#define EE_MODEL 0x02 +// we leave room for EE_MODEL and EE_GENERAL #define NO_INCDEC_MARKS 0x04 #define INCDEC_SWITCH 0x08 #define INCDEC_SOURCE 0x10 diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 9d51e9981..8092f5c76 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -485,4 +485,7 @@ PACK(union u_int8int16_t { int16_t word; }); +#define EE_GENERAL 0x01 +#define EE_MODEL 0x02 + #endif // _MYEEPROM_H_ diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 5f8f78afc..3c4543206 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -226,6 +226,8 @@ inline void setPinOuput(uint8_t receiverIdx, uint8_t pin, uint8_t chan) pin -= 12; g_model.receiverData[receiverIdx].channelMapping1 = BF_SET(g_model.receiverData[receiverIdx].channelMapping1, chan, pin * 5, 5); } + g_model.receiverData[receiverIdx].dirty = 1; + storageDirty(EE_MODEL); } inline int8_t maxModuleChannels_M8(uint8_t idx) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index e9756fe85..9bb7ba104 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -140,12 +140,18 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) } } +void Pxx2Pulses::setupSetRxParamsFrame(uint8_t module, uint8_t receiverSlot) +{ + +} + void Pxx2Pulses::setupBindFrame(uint8_t module) { if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_WAIT) { if (get_tmr10ms() > reusableBuffer.moduleSetup.pxx2.bindWaitTimeout) { moduleSettings[module].mode = MODULE_MODE_NORMAL; reusableBuffer.moduleSetup.pxx2.bindStep = BIND_OK; + setupSetRxParamsFrame(module, reusableBuffer.moduleSetup.pxx2.bindReceiverSlot); POPUP_INFORMATION(STR_BIND_OK); } return; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 6181c5fe6..8fefeeca0 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -112,6 +112,8 @@ class Pxx2Pulses: public PxxPulses { void setupShareMode(uint8_t module); + void setupSetRxParamsFrame(uint8_t module, uint8_t receiverSlot); + void setupChannelsFrame(uint8_t module); void setupSpectrumAnalyser(uint8_t module); From 2ce141c7aebbbc662e7072dada82b284461e5090 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 7 Mar 2019 18:57:02 +0100 Subject: [PATCH 265/446] Get/SET Receiver settings frame --- radio/src/datastructs.h | 6 +-- radio/src/gui/128x64/model_setup.cpp | 71 ++++++++++++++++------------ radio/src/opentx.h | 7 +++ radio/src/pulses/modules.h | 24 ---------- radio/src/pulses/pulses.h | 1 + radio/src/pulses/pxx2.cpp | 15 ++++-- radio/src/pulses/pxx2.h | 5 +- radio/src/telemetry/telemetry.cpp | 19 ++++++++ 8 files changed, 84 insertions(+), 64 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index da8861284..6c54d6064 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -416,13 +416,9 @@ PACK(struct TrainerModuleData { */ PACK(struct ReceiverData { - // 5 bits per receiver output (24) as it can be assigned to one of the 24 channels - uint64_t channelMapping0; // 12 first channels (4 bits spare) - uint64_t channelMapping1:60; // 12 last channels uint8_t used:1; uint8_t telemetry:1; - uint8_t dirty:1; - uint8_t spare:1; + uint8_t dirty:6; char name[PXX2_LEN_RX_NAME]; }); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index fe6bd8146..87d6ef0d1 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -20,7 +20,9 @@ #include -uint8_t g_moduleIdx, g_receiverIdx; +#warning "TODO remove it" +uint8_t g_moduleIdx; + void menuModelFailsafe(event_t event); void menuModelPinmap(event_t event); @@ -1267,9 +1269,6 @@ void menuModelSetup(event_t event) g_model.moduleData[moduleIdx].pxx2.receivers |= (slot << (receiverIdx * 3)); --slot; g_model.receiverData[slot].used = 1; - #warning "USE 32bits copy" - g_model.receiverData[slot].channelMapping0 = (0 << 0) + (1 << 5) + (2 << 10) + (3 << 15) + (4 << 20) + (5 << 25) + ((uint64_t)6 << 30) + ((uint64_t)7 << 35) + ((uint64_t)8 << 40) + ((uint64_t)9 << 45) + ((uint64_t)10 << 50) + ((uint64_t)11 << 55); - g_model.receiverData[slot].channelMapping1 = (12 << 0) + (13 << 5) + (14 << 10) + (15 << 15) + (16 << 20) + (17 << 25) + ((uint64_t)18 << 30) + ((uint64_t)19 << 35) + ((uint64_t)20 << 40) + ((uint64_t)21 << 45) + ((uint64_t)22 << 50) + ((uint64_t)23 << 55); storageDirty(EE_MODEL); } } @@ -1291,7 +1290,11 @@ void menuModelSetup(event_t event) if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - g_receiverIdx = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; + uint8_t receiverSlot = g_model.moduleData[g_moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; + memclear(&reusableBuffer.receiverSetup, sizeof(reusableBuffer.receiverSetup)); + reusableBuffer.receiverSetup.moduleIdx = moduleIdx; + reusableBuffer.receiverSetup.receiverId = receiverSlot; + moduleSettings[moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; pushMenu(menuModelPinmap); } } @@ -1932,35 +1935,45 @@ void menuModelPinmap(event_t event) // TODO write receiver name here lcdInvertLine(0); - for (uint8_t i = 0; i < NUM_BODY_LINES; i++) { - coord_t y = MENU_HEADER_HEIGHT + 1 + i*FH; - uint8_t pin = menuVerticalOffset + i; - const int32_t channelValue = channelOutputs[getPinOuput(g_receiverIdx, pin)]; + if (reusableBuffer.receiverSetup.state > 0) { + for (uint8_t i = 0; i < NUM_BODY_LINES; i++) { + coord_t y = MENU_HEADER_HEIGHT + 1 + i * FH; + uint8_t pin = menuVerticalOffset + i; + uint8_t channel = reusableBuffer.receiverSetup.channelMapping[pin]; + int32_t channelValue = channelOutputs[channel]; - // Pin - lcdDrawText(0, y, "Pin"); - lcdDrawNumber(lcdLastRightPos + 1, y, pin+1); + // Pin + lcdDrawText(0, y, "Pin"); + lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); - // Channel - LcdFlags flags = 0; - if (menuVerticalPosition == pin) { - flags |= INVERS; - if (s_editMode > 0) { - uint8_t channel = getPinOuput(g_receiverIdx, pin); - flags |= BLINK; - CHECK_INCDEC_MODELVAR(event, channel, 0, sentModuleChannels(g_moduleIdx)); - setPinOuput(g_receiverIdx, pin, channel); + // Channel + LcdFlags flags = 0; + if (menuVerticalPosition == pin) { + flags |= INVERS; + if (s_editMode > 0) { + flags |= BLINK; + #warning "Not a MODELVAR" + CHECK_INCDEC_MODELVAR(event, channel, 0, sentModuleChannels(g_moduleIdx)); + if (checkIncDec_Ret) { + reusableBuffer.receiverSetup.channelMapping[pin] = channel; + reusableBuffer.receiverSetup.state = 0x40; + moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + } } - } - putsChn(7*FW, y, getPinOuput(g_receiverIdx, pin)+1, flags); + putsChn(7 * FW, y, channel + 1, flags); - // Bargraph + // Bargraph #if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines - lcdDrawRect(LCD_W-3-wbar, y + 1, wbar+1, 4); + lcdDrawRect(LCD_W - 3 - wbar, y + 1, wbar + 1, 4); #endif - const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar/2 + lim/2) / lim, wbar/2); - const coord_t xChannel = (channelValue>0) ? LCD_W-3-wbar/2 : LCD_W-2-wbar/2-lenChannel; - lcdDrawHorizontalLine(xChannel, y+2, lenChannel, SOLID, 0); - lcdDrawHorizontalLine(xChannel, y+3, lenChannel, SOLID, 0); + const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); + const coord_t xChannel = (channelValue > 0) ? LCD_W - 3 - wbar / 2 : LCD_W - 2 - wbar / 2 - lenChannel; + lcdDrawHorizontalLine(xChannel, y + 2, lenChannel, SOLID, 0); + lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); + } + } + else { + lcdDrawText(4*FW, 4*FH, "Waiting for RX..."); } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 2ad4ec6e6..85e541277 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1141,6 +1141,13 @@ union ReusableBuffer }; } moduleSetup; + struct { + uint8_t state; // 0x00 = READ 0x40 = WRITE + uint8_t moduleIdx; + uint8_t receiverId; + uint8_t channelMapping[24]; + } receiverSetup; + // 103 bytes struct { int16_t midVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 3c4543206..bf805e9ba 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -206,30 +206,6 @@ static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; constexpr int8_t MAX_EXTRA_MODULE_CHANNELS_M8 = 8; // only 16ch PPM -inline uint8_t getPinOuput(uint8_t receiverIdx, uint8_t pin) -{ - if (pin < 12) { - return ((g_model.receiverData[receiverIdx].channelMapping0 >> (pin * 5)) & 0x1F); - } - else { - pin -= 12; - return ((g_model.receiverData[receiverIdx].channelMapping1 >> (pin * 5)) & 0x1F); - } -} - -inline void setPinOuput(uint8_t receiverIdx, uint8_t pin, uint8_t chan) -{ - if (pin < 12) { - g_model.receiverData[receiverIdx].channelMapping0 = BF_SET(g_model.receiverData[receiverIdx].channelMapping0, chan, pin * 5, 5); - } - else { - pin -= 12; - g_model.receiverData[receiverIdx].channelMapping1 = BF_SET(g_model.receiverData[receiverIdx].channelMapping1, chan, pin * 5, 5); - } - g_model.receiverData[receiverIdx].dirty = 1; - storageDirty(EE_MODEL); -} - inline int8_t maxModuleChannels_M8(uint8_t idx) { if (isExtraModule(idx)) diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 352f0edaf..086b00e42 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -74,6 +74,7 @@ enum ModuleSettingsMode MODULE_MODE_NORMAL, MODULE_MODE_SPECTRUM_ANALYSER, MODULE_MODE_GET_HARDWARE_INFO, + MODULE_MODE_RECEIVER_SETTINGS, MODULE_MODE_BEEP_FIRST, MODULE_MODE_REGISTER = MODULE_MODE_BEEP_FIRST, MODULE_MODE_BIND, diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 9bb7ba104..ecd9264bc 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -140,9 +140,15 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) } } -void Pxx2Pulses::setupSetRxParamsFrame(uint8_t module, uint8_t receiverSlot) +void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) { - + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); + Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); + Pxx2Transport::addByte(0x0); + for (int i=0; i<24; i++) { + Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); + } + // TODO moduleSettings[module].mode = MODULE_MODE_NORMAL; } void Pxx2Pulses::setupBindFrame(uint8_t module) @@ -151,7 +157,6 @@ void Pxx2Pulses::setupBindFrame(uint8_t module) if (get_tmr10ms() > reusableBuffer.moduleSetup.pxx2.bindWaitTimeout) { moduleSettings[module].mode = MODULE_MODE_NORMAL; reusableBuffer.moduleSetup.pxx2.bindStep = BIND_OK; - setupSetRxParamsFrame(module, reusableBuffer.moduleSetup.pxx2.bindReceiverSlot); POPUP_INFORMATION(STR_BIND_OK); } return; @@ -199,7 +204,7 @@ void Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) void Pxx2Pulses::setupShareMode(uint8_t module) { - addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETUP); + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); Pxx2Transport::addByte(0xC0); @@ -220,6 +225,8 @@ void Pxx2Pulses::setupFrame(uint8_t module) if (mode == MODULE_MODE_GET_HARDWARE_INFO) setupHardwareInfoFrame(module); + else if (mode == MODULE_MODE_RECEIVER_SETTINGS) + setupReceiverSettingsFrame(module); else if (mode == MODULE_MODE_REGISTER) setupRegisterFrame(module); else if (mode == MODULE_MODE_BIND) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 8fefeeca0..2b4a04464 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -29,7 +29,8 @@ #define PXX2_TYPE_ID_REGISTER 0x01 #define PXX2_TYPE_ID_BIND 0x02 #define PXX2_TYPE_ID_CHANNELS 0x03 - #define PXX2_TYPE_ID_RX_SETUP 0x05 + #define PXX2_TYPE_ID_TX_SETTINGS 0x04 + #define PXX2_TYPE_ID_RX_SETTINGS 0x05 #define PXX2_TYPE_ID_HW_INFO 0x06 #define PXX2_TYPE_ID_TELEMETRY 0xFE @@ -112,7 +113,7 @@ class Pxx2Pulses: public PxxPulses { void setupShareMode(uint8_t module); - void setupSetRxParamsFrame(uint8_t module, uint8_t receiverSlot); + void setupReceiverSettingsFrame(uint8_t module); void setupChannelsFrame(uint8_t module); diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 55ae9a9b5..879e560db 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -88,6 +88,21 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) } } +void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) +{ + #warning "TODO This will be needed to ensure we are in the right menu" + // if (moduleSettings[module].mode != MODULE_MODE_GET_HARDWARE_INFO) { + // return; + // } + + for (uint8_t pin=0; pin<24; pin++) { + reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; + } + + reusableBuffer.receiverSetup.state = 0xFF; + moduleSettings[module].mode = MODULE_MODE_NORMAL; +} + void processRegisterFrame(uint8_t module, uint8_t * frame) { if (moduleSettings[module].mode != MODULE_MODE_REGISTER) { @@ -173,6 +188,10 @@ void processRadioFrame(uint8_t module, uint8_t * frame) processGetHardwareInfoFrame(module, frame); break; + case PXX2_TYPE_ID_RX_SETTINGS: + processReceiverSettingsFrame(module, frame); + break; + case PXX2_TYPE_ID_REGISTER: processRegisterFrame(module, frame); break; From e33579f305c45e0b4ec63e908dc3bc87f0faded4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Mar 2019 11:01:24 +0100 Subject: [PATCH 266/446] For RX SETTINGS tests --- radio/src/gui/128x64/model_setup.cpp | 34 +++++++++++++++++--------- radio/src/gui/128x64/radio_version.cpp | 6 +++++ radio/src/opentx.h | 2 ++ radio/src/pulses/pxx2.cpp | 24 +++++++++++++----- radio/src/telemetry/telemetry.cpp | 8 +++--- 5 files changed, 52 insertions(+), 22 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 87d6ef0d1..da164c678 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -23,6 +23,14 @@ #warning "TODO remove it" uint8_t g_moduleIdx; +void drawReceiverName(uint8_t x, uint8_t y, uint8_t receiverSlot) +{ + if (g_model.receiverData[receiverSlot].name[0] != '\0') + lcdDrawSizedText(x, y, g_model.receiverData[receiverSlot].name, PXX2_LEN_RX_NAME); + else + lcdDrawText(x, y, "---"); +} + void menuModelFailsafe(event_t event); void menuModelPinmap(event_t event); @@ -1247,7 +1255,6 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_RECEIVER); lcdDrawNumber(lcdLastRightPos + 1, y, receiverIdx + 1); - // lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].pxx2.receivers[receiverIdx].rxName, PXX2_LEN_RX_NAME, ZCHAR); if (receiverSlot) { lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DEL_BUTTON, attr); @@ -1294,7 +1301,6 @@ void menuModelSetup(event_t event) memclear(&reusableBuffer.receiverSetup, sizeof(reusableBuffer.receiverSetup)); reusableBuffer.receiverSetup.moduleIdx = moduleIdx; reusableBuffer.receiverSetup.receiverId = receiverSlot; - moduleSettings[moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; pushMenu(menuModelPinmap); } } @@ -1329,11 +1335,7 @@ void menuModelSetup(event_t event) uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t receiverSlot = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; - if (g_model.receiverData[receiverSlot].name[0] != '\0') - lcdDrawSizedText(INDENT_WIDTH * 2, y, g_model.receiverData[receiverSlot].name, PXX2_LEN_RX_NAME); - else - lcdDrawTextAlignedLeft(y, INDENT INDENT "---"); - + drawReceiverName(INDENT_WIDTH * 2, y, receiverSlot); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, menuHorizontalPosition==0 ? attr : 0); lcdDrawText(lcdLastRightPos + FW/2, y, BUTTON("Share"), menuHorizontalPosition==1 ? attr : 0); @@ -1927,15 +1929,26 @@ void menuModelFailsafe(event_t event) void menuModelPinmap(event_t event) { + if (menuEvent) { + moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_NORMAL; + return; + } + const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; uint8_t wbar = LCD_W / 2 - 20; SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx)); lcdDrawTextAlignedLeft(0, STR_PINMAPSET); - // TODO write receiver name here + drawReceiverName(FW * 10, 0, reusableBuffer.receiverSetup.receiverId); lcdInvertLine(0); - if (reusableBuffer.receiverSetup.state > 0) { + if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == 0x00 && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { + reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 100/*1s*/; + reusableBuffer.receiverSetup.timeout = 0; + moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + + if (reusableBuffer.receiverSetup.state != 0) { for (uint8_t i = 0; i < NUM_BODY_LINES; i++) { coord_t y = MENU_HEADER_HEIGHT + 1 + i * FH; uint8_t pin = menuVerticalOffset + i; @@ -1952,8 +1965,7 @@ void menuModelPinmap(event_t event) flags |= INVERS; if (s_editMode > 0) { flags |= BLINK; - #warning "Not a MODELVAR" - CHECK_INCDEC_MODELVAR(event, channel, 0, sentModuleChannels(g_moduleIdx)); + channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx)); if (checkIncDec_Ret) { reusableBuffer.receiverSetup.channelMapping[pin] = channel; reusableBuffer.receiverSetup.state = 0x40; diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 02ee48d4c..53de9ea9d 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -36,6 +36,12 @@ #if defined(PXX2) void menuRadioModulesVersion(event_t event) { + if (menuEvent) { + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + return; + } + TITLE("MODULES / RX VERSION"); if (event == EVT_ENTRY || get_tmr10ms() >= reusableBuffer.hardware.updateTime) { diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 85e541277..8cc333285 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1143,6 +1143,8 @@ union ReusableBuffer struct { uint8_t state; // 0x00 = READ 0x40 = WRITE + tmr10ms_t timeout; + tmr10ms_t updateTime; uint8_t moduleIdx; uint8_t receiverId; uint8_t channelMapping[24]; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index ecd9264bc..c280f65cb 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -115,10 +115,12 @@ void Pxx2Pulses::setupHardwareInfoFrame(uint8_t module) } else { reusableBuffer.hardware.modules[module].timeout--; + setupChannelsFrame(module); } } else { moduleSettings[module].mode = MODULE_MODE_NORMAL; + setupChannelsFrame(module); } } @@ -142,13 +144,23 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) { - addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); - Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); - Pxx2Transport::addByte(0x0); - for (int i=0; i<24; i++) { - Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); + if (reusableBuffer.receiverSetup.timeout) { + if (get_tmr10ms() > reusableBuffer.receiverSetup.timeout) { + reusableBuffer.receiverSetup.timeout = 0; + moduleSettings[module].mode = MODULE_MODE_NORMAL; + } + #warning "TODO send channels during the timeout" + //setupChannelsFrame(module); + } + else { + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); + Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); + Pxx2Transport::addByte(0x0); + for (int i = 0; i < 24; i++) { + Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); + } + reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 10/*100ms*/; } - // TODO moduleSettings[module].mode = MODULE_MODE_NORMAL; } void Pxx2Pulses::setupBindFrame(uint8_t module) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 879e560db..0244c458d 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -90,17 +90,15 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) { - #warning "TODO This will be needed to ensure we are in the right menu" - // if (moduleSettings[module].mode != MODULE_MODE_GET_HARDWARE_INFO) { - // return; - // } + if (moduleSettings[module].mode != MODULE_MODE_RECEIVER_SETTINGS) { + return; + } for (uint8_t pin=0; pin<24; pin++) { reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; } reusableBuffer.receiverSetup.state = 0xFF; - moduleSettings[module].mode = MODULE_MODE_NORMAL; } void processRegisterFrame(uint8_t module, uint8_t * frame) From af70f8f2f6b5eba932630af3fecef0e03104ae30 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 8 Mar 2019 11:54:09 +0100 Subject: [PATCH 267/446] Fix pinmap --- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/io/frsky_pxx2.h | 2 +- radio/src/pulses/pxx2.cpp | 5 ++--- radio/src/telemetry/telemetry.cpp | 1 + radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + 6 files changed, 7 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index da164c678..ae4e0371f 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1943,7 +1943,7 @@ void menuModelPinmap(event_t event) lcdInvertLine(0); if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == 0x00 && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { - reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 100/*1s*/; + reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 500/*5s*/; reusableBuffer.receiverSetup.timeout = 0; moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } diff --git a/radio/src/io/frsky_pxx2.h b/radio/src/io/frsky_pxx2.h index 560ae2b9b..9149c9891 100644 --- a/radio/src/io/frsky_pxx2.h +++ b/radio/src/io/frsky_pxx2.h @@ -25,7 +25,7 @@ #define PXX2_BAUDRATE 230400 #define PXX2_PERIOD 4 // 4ms -#define PXX2_FRAME_MAXLENGTH 32 +#define PXX2_FRAME_MAXLENGTH 64 class ModuleFifo : public Fifo { public: diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index c280f65cb..875b14b44 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -149,8 +149,7 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) reusableBuffer.receiverSetup.timeout = 0; moduleSettings[module].mode = MODULE_MODE_NORMAL; } - #warning "TODO send channels during the timeout" - //setupChannelsFrame(module); + setupChannelsFrame(module); } else { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); @@ -159,7 +158,7 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) for (int i = 0; i < 24; i++) { Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); } - reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 10/*100ms*/; + reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 20/*200ms*/; } } diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 0244c458d..0d8b2160f 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -99,6 +99,7 @@ void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) } reusableBuffer.receiverSetup.state = 0xFF; + moduleSettings[module].mode = MODULE_MODE_NORMAL; } void processRegisterFrame(uint8_t module, uint8_t * frame) diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 8c44fbceb..0340a0335 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -710,6 +710,7 @@ const char STR_RX_NAME[] = TR_RX_NAME; #if defined(PCBTARANIS) || defined(DSM2) const char STR_MODULE_RANGE[] = TR_MODULE_RANGE; +const char STR_RECEIVER_OPTIONS[] = TR_RECEIVER_OPTIONS; const char STR_DEL_BUTTON[] = TR_DEL_BUTTON; #endif diff --git a/radio/src/translations.h b/radio/src/translations.h index d729e4b9f..1a82e543b 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -976,6 +976,7 @@ extern const char STR_JITTER_FILTER[]; #if defined(PCBTARANIS) || defined(DSM2) extern const char STR_MODULE_RANGE[]; +extern const char STR_RECEIVER_OPTIONS[]; extern const char STR_DEL_BUTTON[]; #endif From f47b1065ebe88df7afef12ae051c161b6c033252 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 8 Mar 2019 12:54:41 +0100 Subject: [PATCH 268/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 40 ++++++---------------------- radio/src/translations.cpp | 1 + radio/src/translations.h | 3 ++- radio/src/translations/cz.h.txt | 2 ++ radio/src/translations/de.h.txt | 2 ++ radio/src/translations/en.h.txt | 2 ++ radio/src/translations/es.h.txt | 2 ++ radio/src/translations/fi.h.txt | 2 ++ radio/src/translations/fr.h.txt | 2 ++ radio/src/translations/it.h.txt | 2 ++ radio/src/translations/nl.h.txt | 2 ++ radio/src/translations/pl.h.txt | 2 ++ radio/src/translations/pt.h.txt | 2 ++ radio/src/translations/se.h.txt | 2 ++ 14 files changed, 33 insertions(+), 33 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index ae4e0371f..af3f71848 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -32,7 +32,7 @@ void drawReceiverName(uint8_t x, uint8_t y, uint8_t receiverSlot) } void menuModelFailsafe(event_t event); -void menuModelPinmap(event_t event); +void menuModelReceiverOptions(event_t event); #if defined(PCBTARANIS) uint8_t getSwitchWarningsCount() @@ -95,19 +95,15 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_LABEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_LABEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_PINMAP, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_LABEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_PINMAP, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_TELEM, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_BIND_SHARE, #endif ITEM_MODEL_EXTERNAL_MODULE_LABEL, @@ -135,19 +131,15 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_PXX2_REGISTER_RANGE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_TELEM, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_TELEM, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_LABEL, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_PINMAP, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_TELEM, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_LABEL, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_PINMAP, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_TELEM, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_BIND_SHARE, #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, @@ -1292,7 +1284,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_PINMAP: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_PINMAP: { - lcdDrawTextAlignedLeft(y, INDENT INDENT "Pinmap"); + lcdDrawText(3, y, STR_OPTIONS); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr); if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); @@ -1301,27 +1293,11 @@ void menuModelSetup(event_t event) memclear(&reusableBuffer.receiverSetup, sizeof(reusableBuffer.receiverSetup)); reusableBuffer.receiverSetup.moduleIdx = moduleIdx; reusableBuffer.receiverSetup.receiverId = receiverSlot; - pushMenu(menuModelPinmap); + pushMenu(menuModelReceiverOptions); } } break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_TELEM: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_TELEM: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_TELEM: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_TELEM: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_TELEM: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_TELEM: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_TELEM: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_TELEM: - { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - uint8_t receiverSlot = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; - g_model.receiverData[receiverSlot].telemetry = editCheckBox(g_model.receiverData[receiverSlot].telemetry, MODEL_SETUP_2ND_COLUMN, y, INDENT INDENT "Telemetry", attr, event); - break; - } - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE: @@ -1337,7 +1313,7 @@ void menuModelSetup(event_t event) drawReceiverName(INDENT_WIDTH * 2, y, receiverSlot); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, menuHorizontalPosition==0 ? attr : 0); - lcdDrawText(lcdLastRightPos + FW/2, y, BUTTON("Share"), menuHorizontalPosition==1 ? attr : 0); + lcdDrawText(lcdLastRightPos + FW/2, y, STR_BUTTON_SHARE, menuHorizontalPosition==1 ? attr : 0); if (attr) { if (menuHorizontalPosition == 0) { @@ -1927,7 +1903,7 @@ void menuModelFailsafe(event_t event) } } -void menuModelPinmap(event_t event) +void menuModelReceiverOptions(event_t event) { if (menuEvent) { moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_NORMAL; @@ -1938,8 +1914,8 @@ void menuModelPinmap(event_t event) uint8_t wbar = LCD_W / 2 - 20; SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx)); - lcdDrawTextAlignedLeft(0, STR_PINMAPSET); - drawReceiverName(FW * 10, 0, reusableBuffer.receiverSetup.receiverId); + lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); + drawReceiverName(FW * 13, 0, reusableBuffer.receiverSetup.receiverId); lcdInvertLine(0); if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == 0x00 && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { @@ -1947,7 +1923,7 @@ void menuModelPinmap(event_t event) reusableBuffer.receiverSetup.timeout = 0; moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } - + reusableBuffer.receiverSetup.state = 0xFF; //Todo REMOVE ME if (reusableBuffer.receiverSetup.state != 0) { for (uint8_t i = 0; i < NUM_BODY_LINES; i++) { coord_t y = MENU_HEADER_HEIGHT + 1 + i * FH; diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 0340a0335..004cf7390 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -702,6 +702,7 @@ const char STR_RX_NAME[] = TR_RX_NAME; const char STR_MENU_OTHER[] = TR_MENU_OTHER; const char STR_MENU_INVERT[] = TR_MENU_INVERT; const char STR_JITTER_FILTER[] = TR_JITTER_FILTER; + const char STR_BUTTON_SHARE[] = TR_BUTTON_SHARE; #if MENUS_LOCK == 1 const char STR_UNLOCKED[] = TR_UNLOCKED; diff --git a/radio/src/translations.h b/radio/src/translations.h index 1a82e543b..ccd37be2b 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -968,6 +968,7 @@ extern const char STR_MENU_DISPLAY[]; extern const char STR_MENU_OTHER[]; extern const char STR_MENU_INVERT[]; extern const char STR_JITTER_FILTER[]; +extern const char STR_BUTTON_SHARE[]; #if MENUS_LOCK == 1 extern const char STR_UNLOCKED[]; @@ -975,7 +976,7 @@ extern const char STR_JITTER_FILTER[]; #endif #if defined(PCBTARANIS) || defined(DSM2) - extern const char STR_MODULE_RANGE[]; +extern const char STR_MODULE_RANGE[]; extern const char STR_RECEIVER_OPTIONS[]; extern const char STR_DEL_BUTTON[]; #endif diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 50fb959c8..958eab79e 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -965,6 +965,8 @@ #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) +#define TR_BUTTON_SHARE BUTTON("Share") +#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") #define TR_SET BUTTON("Volby") diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index b8d2133a6..fdf952c77 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -970,6 +970,8 @@ #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) //9XR-Pro +#define TR_BUTTON_SHARE BUTTON("Share") +#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") #define TR_SET BUTTON("Set") diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index f05f34401..48ffe3406 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -969,6 +969,8 @@ #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON BUTTON("Add") #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) +#define TR_BUTTON_SHARE BUTTON("Share") +#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") #define TR_SET BUTTON("Set") diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 9823a2b02..5644bbb6d 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -976,6 +976,8 @@ #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Limites]" +#define TR_BUTTON_SHARE BUTTON("Share") +#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_SET "[Ajuste]" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 1c980dd07..a20c3f18d 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -968,6 +968,8 @@ #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Range]" +#define TR_BUTTON_SHARE BUTTON("Share") +#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_SET "[Set]" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 7aa0ff2a0..1d440031b 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -980,6 +980,8 @@ #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE BUTTON(TR("Prt", "Port.")) +#define TR_BUTTON_SHARE BUTTON("Share") +#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("RAZ") #define TR_SET BUTTON("Déf") diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 9d992cb35..a05af8b65 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -970,6 +970,8 @@ #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Range]" +#define TR_BUTTON_SHARE BUTTON("Share") +#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_SET "[Set]" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 489485a53..e9fc37a67 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -971,6 +971,8 @@ #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE TR("[Rng]", "[Range]") +#define TR_BUTTON_SHARE BUTTON("Share") +#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_SET "[Set]" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 36190abce..65dd1aab9 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -971,6 +971,8 @@ #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE TR("[Zas]","Zasięg") +#define TR_BUTTON_SHARE BUTTON("Share") +#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_SET "[Set]" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 5749eefb8..7831b2ac1 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -975,6 +975,8 @@ #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE "[Range]" +#define TR_BUTTON_SHARE BUTTON("Share") +#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_SET "[Set]" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index f4706bf14..f10c9a309 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -984,6 +984,8 @@ #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON "BUTTON(Add)" #define TR_MODULE_RANGE TR("[Tst]", "[Testa]") +#define TR_BUTTON_SHARE BUTTON("Share") +#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Nollställ]" #define TR_SET "[Spara]" From 096fac2f273ae1ba9a82fc9cdd7dc1d1bcc60d11 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Mar 2019 15:30:47 +0100 Subject: [PATCH 269/446] [Exit] in a popup menu now calls onPopupHandler(nullptr) --- radio/src/gui/128x64/model_custom_scripts.cpp | 2 +- radio/src/gui/128x64/model_display.cpp | 2 +- .../src/gui/128x64/model_logical_switches.cpp | 3 +- radio/src/gui/128x64/model_select.cpp | 2 +- radio/src/gui/128x64/model_setup.cpp | 32 +++++++------- .../gui/128x64/model_special_functions.cpp | 4 +- radio/src/gui/212x64/model_custom_scripts.cpp | 2 +- radio/src/gui/212x64/model_display.cpp | 2 +- radio/src/gui/212x64/model_select.cpp | 2 +- radio/src/gui/212x64/model_setup.cpp | 2 +- .../gui/212x64/model_special_functions.cpp | 4 +- .../src/gui/480x272/model_custom_scripts.cpp | 2 +- radio/src/gui/480x272/model_setup.cpp | 2 +- .../gui/480x272/model_special_functions.cpp | 4 +- radio/src/gui/480x272/screens_setup.cpp | 2 +- radio/src/main.cpp | 4 +- radio/src/opentx.h | 4 +- radio/src/pulses/pxx2.cpp | 41 ++++++++++------- radio/src/pulses/pxx2.h | 1 - radio/src/telemetry/telemetry.cpp | 44 +++++++++++-------- radio/src/translations.cpp | 4 +- 21 files changed, 88 insertions(+), 77 deletions(-) diff --git a/radio/src/gui/128x64/model_custom_scripts.cpp b/radio/src/gui/128x64/model_custom_scripts.cpp index e63e57e5f..f1063e9a8 100644 --- a/radio/src/gui/128x64/model_custom_scripts.cpp +++ b/radio/src/gui/128x64/model_custom_scripts.cpp @@ -37,7 +37,7 @@ void onModelCustomScriptMenu(const char *result) POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); } } - else { + else if (result) { // The user choosed a lua file in the list copySelection(sd.file, result, sizeof(sd.file)); memset(sd.inputs, 0, sizeof(sd.inputs)); diff --git a/radio/src/gui/128x64/model_display.cpp b/radio/src/gui/128x64/model_display.cpp index cc8db7a72..dc740822b 100644 --- a/radio/src/gui/128x64/model_display.cpp +++ b/radio/src/gui/128x64/model_display.cpp @@ -73,7 +73,7 @@ void onTelemetryScriptFileSelectionMenu(const char *result) POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); } } - else { + else if (result) { // The user choosed a file in the list memcpy(g_model.frsky.screens[screenIndex].script.file, result, sizeof(g_model.frsky.screens[screenIndex].script.file)); storageDirty(EE_MODEL); diff --git a/radio/src/gui/128x64/model_logical_switches.cpp b/radio/src/gui/128x64/model_logical_switches.cpp index cebf9c9a2..85686a27e 100644 --- a/radio/src/gui/128x64/model_logical_switches.cpp +++ b/radio/src/gui/128x64/model_logical_switches.cpp @@ -234,8 +234,7 @@ void onLogicalSwitchesMenu(const char *result) s_currIdx = sub; pushMenu(menuModelLogicalSwitchOne); } - - if (result == STR_COPY) { + else if (result == STR_COPY) { clipboard.type = CLIPBOARD_TYPE_CUSTOM_SWITCH; clipboard.data.csw = *cs; } diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index 61953626c..09a31eb2e 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -57,7 +57,7 @@ void onModelSelectMenu(const char * result) SET_WARNING_INFO(modelHeaders[sub].name, sizeof(g_model.header.name), ZCHAR); } #if defined(SDCARD) - else { + else if (result) { // The user choosed a file on SD to restore storageCheck(true); POPUP_WARNING(eeRestoreModel(sub, (char *)result)); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index af3f71848..c50dc4916 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -25,6 +25,7 @@ uint8_t g_moduleIdx; void drawReceiverName(uint8_t x, uint8_t y, uint8_t receiverSlot) { + TRACE("receiverSlot=%d", receiverSlot); if (g_model.receiverData[receiverSlot].name[0] != '\0') lcdDrawSizedText(x, y, g_model.receiverData[receiverSlot].name, PXX2_LEN_RX_NAME); else @@ -92,7 +93,7 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_ANTENNA, #endif ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER, + ITEM_MODEL_INTERNAL_MODULE_PXX2_REGISTER_RANGE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE, @@ -181,7 +182,7 @@ enum MenuModelSetupItems { #if defined(PCBTARANIS) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) - #define CURRENT_RECEIVER_EDITED(k) ((k - (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL : ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL)) / 4) + #define CURRENT_RECEIVER_EDITED(k) ((k - (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL : ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL)) / 3) #elif defined(PCBSKY9X) && !defined(REVA) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) #else @@ -266,8 +267,15 @@ enum MenuModelSetupItems { void onPXX2BindMenu(const char * result) { - reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex = (result - reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0]) / PXX2_LEN_RX_NAME; - reusableBuffer.moduleSetup.pxx2.bindStep = BIND_RX_NAME_SELECTED; + if (result) { + reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex = (result - reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0]) / sizeof(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0]); + reusableBuffer.moduleSetup.pxx2.bindStep = BIND_RX_NAME_SELECTED; + } + else { + // the user pressed [Exit] + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition); + moduleSettings[moduleIdx].mode = MODULE_MODE_NORMAL; + } } void onBindMenu(const char * result) @@ -434,19 +442,15 @@ void menuModelSetup(event_t event) IF_PXX2_MODULE(INTERNAL_MODULE, 1), // Range check and Register buttons IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver Name + Add/Del buttons IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Pinmap - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Share IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver2 Name + Add/Del buttons IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver2 Pinmap - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver2 Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 1), // Receiver2 Bind/Share IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver3 Name + Add/Del buttons IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 2, 0), // Receiver3 Pinmap - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 2, 0), // Receiver3 Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 2, 1), // Receiver3 Bind/Share IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 2, 0), // Receiver4 Name + Add/Del buttons IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 3, 0), // Receiver4 Pinmap - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 3, 0), // Receiver4 Telemetry IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 3, 1), // Receiver4 Bind/Share LABEL(ExternalModule), @@ -465,19 +469,15 @@ void menuModelSetup(event_t event) IF_PXX2_MODULE(EXTERNAL_MODULE, 1), // Range check and Register buttons IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Receiver Name + Add/Del buttons IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Pinmap - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Telemetry IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 1), // Receiver Bind/Share IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver2 Name + Add/Del buttons IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver2 Range - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver2 Telemetry IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 1), // Receiver2 Bind/Share IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver3 Name + Add/Del buttons IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 2, 0), // Receiver3 Pinmap - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 2, 0), // Receiver3 Telemetry IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 2, 1), // Receiver3 Bind/Share IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 2, 0), // Receiver4 Name + Add/Del buttons IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 3, 0), // Receiver4 Pinmap - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 3, 0), // Receiver4 Telemetry IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 3, 1), // Receiver4 Bind/Share TRAINER_ROWS @@ -1205,7 +1205,7 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RANGE_REGISTER: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_REGISTER_RANGE: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_REGISTER_RANGE: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); @@ -1252,7 +1252,7 @@ void menuModelSetup(event_t event) lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DEL_BUTTON, attr); if (attr && s_editMode > 0) { g_model.moduleData[moduleIdx].pxx2.receivers = (g_model.moduleData[moduleIdx].pxx2.receivers & BF_MASK(0, receiverIdx * 3)) | ((g_model.moduleData[moduleIdx].pxx2.receivers & BF_MASK((receiverIdx + 1) * 3, (MAX_RECEIVERS_PER_MODULE - 1 - receiverIdx) * 3)) >> 3); - memclear(&g_model.receiverData[receiverSlot], sizeof(ReceiverData)); + memclear(&g_model.receiverData[receiverSlot - 1], sizeof(ReceiverData)); s_editMode = 0; killEvents(event); storageDirty(EE_MODEL); @@ -1320,12 +1320,12 @@ void menuModelSetup(event_t event) if (event == EVT_KEY_BREAK(KEY_ENTER)) { // TODO this will go to module.cpp memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2)); - reusableBuffer.moduleSetup.pxx2.bindReceiverSlot = receiverSlot; + reusableBuffer.moduleSetup.pxx2.bindReceiverId = receiverSlot; moduleSettings[moduleIdx].mode ^= MODULE_MODE_BIND; } if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) { s_editMode = 1; - if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_RX_NAME_RECEIVED) { + if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_START && reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount > 0) { popupMenuItemsCount = min(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); for (uint8_t i=0; iplay.name, result, sizeof(cfn->play.name)); storageDirty(eeFlags); @@ -96,7 +96,7 @@ void onAdjustGvarSourceLongEnterPress(const char * result) CFN_PARAM(cfn) = 0; storageDirty(EE_MODEL); } - else { + else if (result) { onSourceLongEnterPress(result); } } diff --git a/radio/src/gui/212x64/model_custom_scripts.cpp b/radio/src/gui/212x64/model_custom_scripts.cpp index e0f052de5..bd9f81969 100644 --- a/radio/src/gui/212x64/model_custom_scripts.cpp +++ b/radio/src/gui/212x64/model_custom_scripts.cpp @@ -29,7 +29,7 @@ void onModelCustomScriptMenu(const char *result) POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); } } - else { + else if (result) { // The user choosed a lua file in the list copySelection(sd.file, result, sizeof(sd.file)); memset(sd.inputs, 0, sizeof(sd.inputs)); diff --git a/radio/src/gui/212x64/model_display.cpp b/radio/src/gui/212x64/model_display.cpp index 42520142a..72191bfbe 100644 --- a/radio/src/gui/212x64/model_display.cpp +++ b/radio/src/gui/212x64/model_display.cpp @@ -72,7 +72,7 @@ void onTelemetryScriptFileSelectionMenu(const char *result) POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); } } - else { + else if (result) { // The user choosed a file in the list memcpy(g_model.frsky.screens[screenIndex].script.file, result, sizeof(g_model.frsky.screens[screenIndex].script.file)); storageDirty(EE_MODEL); diff --git a/radio/src/gui/212x64/model_select.cpp b/radio/src/gui/212x64/model_select.cpp index 7eb4bb8a3..76de6a69e 100644 --- a/radio/src/gui/212x64/model_select.cpp +++ b/radio/src/gui/212x64/model_select.cpp @@ -55,7 +55,7 @@ void onModelSelectMenu(const char * result) POPUP_CONFIRMATION(STR_DELETEMODEL); SET_WARNING_INFO(nametmp, sizeof(g_model.header.name), 0); } - else { + else if (result) { // The user choosed a file on SD to restore storageCheck(true); POPUP_WARNING(eeRestoreModel(sub, (char *)result)); diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 3bb4cabbc..e38270196 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -148,7 +148,7 @@ void onModelSetupBitmapMenu(const char * result) POPUP_WARNING(STR_NO_BITMAPS_ON_SD); } } - else { + else if (result) { // The user choosed a bmp file in the list copySelection(g_model.header.bitmap, result, sizeof(g_model.header.bitmap)); memcpy(modelHeaders[g_eeGeneral.currModel].bitmap, g_model.header.bitmap, sizeof(g_model.header.bitmap)); diff --git a/radio/src/gui/212x64/model_special_functions.cpp b/radio/src/gui/212x64/model_special_functions.cpp index 0d911a3bc..50ffa5869 100644 --- a/radio/src/gui/212x64/model_special_functions.cpp +++ b/radio/src/gui/212x64/model_special_functions.cpp @@ -56,7 +56,7 @@ void onCustomFunctionsFileSelectionMenu(const char * result) POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); } } - else { + else if (result) { // The user choosed a file in the list memcpy(cfn->play.name, result, sizeof(cfn->play.name)); storageDirty(eeFlags); @@ -129,7 +129,7 @@ void onAdjustGvarSourceLongEnterPress(const char * result) CFN_PARAM(cfn) = 0; storageDirty(EE_MODEL); } - else { + else if (result) { onSourceLongEnterPress(result); } } diff --git a/radio/src/gui/480x272/model_custom_scripts.cpp b/radio/src/gui/480x272/model_custom_scripts.cpp index b2c0a08b8..9a5fba277 100644 --- a/radio/src/gui/480x272/model_custom_scripts.cpp +++ b/radio/src/gui/480x272/model_custom_scripts.cpp @@ -29,7 +29,7 @@ void onModelCustomScriptMenu(const char *result) POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); } } - else { + else if (result) { // The user choosed a lua file in the list copySelection(sd.file, result, sizeof(sd.file)); memset(sd.inputs, 0, sizeof(sd.inputs)); diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 3cce3cd3e..5edb39c02 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -148,7 +148,7 @@ void onModelSetupBitmapMenu(const char * result) POPUP_WARNING(STR_NO_BITMAPS_ON_SD); } } - else { + else if (result) { // The user choosed a bmp file in the list copySelection(g_model.header.bitmap, result, sizeof(g_model.header.bitmap)); storageDirty(EE_MODEL); diff --git a/radio/src/gui/480x272/model_special_functions.cpp b/radio/src/gui/480x272/model_special_functions.cpp index 1ed3528d2..9e9695645 100644 --- a/radio/src/gui/480x272/model_special_functions.cpp +++ b/radio/src/gui/480x272/model_special_functions.cpp @@ -56,7 +56,7 @@ void onCustomFunctionsFileSelectionMenu(const char * result) POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); } } - else { + else if (result) { // The user choosed a file in the list memcpy(cf->play.name, result, sizeof(cf->play.name)); storageDirty(eeFlags); @@ -128,7 +128,7 @@ void onAdjustGvarSourceLongEnterPress(const char * result) CFN_PARAM(cfn) = 0; storageDirty(EE_MODEL); } - else { + else if (result) { onSourceLongEnterPress(result); } } diff --git a/radio/src/gui/480x272/screens_setup.cpp b/radio/src/gui/480x272/screens_setup.cpp index a329a136f..800e584fb 100644 --- a/radio/src/gui/480x272/screens_setup.cpp +++ b/radio/src/gui/480x272/screens_setup.cpp @@ -53,7 +53,7 @@ void onZoneOptionFileSelectionMenu(const char * result) POPUP_WARNING(STR_NO_BITMAPS_ON_SD); } } - else { + else if (result) { fileSelectionDone = true; memcpy(fileSelection, result, sizeof(fileSelection)); } diff --git a/radio/src/main.cpp b/radio/src/main.cpp index c7a1ae721..32be237c9 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -313,7 +313,7 @@ void guiMain(event_t evt) if (warn) DISPLAY_WARNING(evt); if (menu) { const char * result = runPopupMenu(evt); - if (result) { + if (popupMenuItemsCount == 0) { popupMenuHandler(result); if (menuEvent == 0) { evt = EVT_REFRESH; @@ -451,7 +451,7 @@ void guiMain(event_t evt) inPopupMenu = true; } const char * result = runPopupMenu(evt); - if (result) { + if (popupMenuItemsCount == 0) { TRACE("popupMenuHandler(%s)", result); popupMenuHandler(result); } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 8cc333285..fc4b630cd 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1130,9 +1130,9 @@ union ReusableBuffer int8_t registerPopupEditMode; char registerRxName[PXX2_LEN_RX_NAME]; char registrationID[PXX2_LEN_REGISTRATION_ID]; - char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; + char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME + 1]; uint8_t bindCandidateReceiversCount; - uint8_t bindReceiverSlot; + uint8_t bindReceiverId; union { uint8_t bindSelectedReceiverIndex; uint8_t shareReceiverIndex; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 875b14b44..0529b449f 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -180,7 +180,7 @@ void Pxx2Pulses::setupBindFrame(uint8_t module) for (uint8_t i=0; i Date: Fri, 8 Mar 2019 15:38:00 +0100 Subject: [PATCH 270/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index c50dc4916..4d64479b2 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -25,7 +25,6 @@ uint8_t g_moduleIdx; void drawReceiverName(uint8_t x, uint8_t y, uint8_t receiverSlot) { - TRACE("receiverSlot=%d", receiverSlot); if (g_model.receiverData[receiverSlot].name[0] != '\0') lcdDrawSizedText(x, y, g_model.receiverData[receiverSlot].name, PXX2_LEN_RX_NAME); else @@ -1284,7 +1283,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_PINMAP: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_PINMAP: { - lcdDrawText(3, y, STR_OPTIONS); + lcdDrawText(INDENT_WIDTH * 2, y, STR_OPTIONS); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr); if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); @@ -1923,7 +1922,7 @@ void menuModelReceiverOptions(event_t event) reusableBuffer.receiverSetup.timeout = 0; moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } - reusableBuffer.receiverSetup.state = 0xFF; //Todo REMOVE ME + if (reusableBuffer.receiverSetup.state != 0) { for (uint8_t i = 0; i < NUM_BODY_LINES; i++) { coord_t y = MENU_HEADER_HEIGHT + 1 + i * FH; From 1937aaccb938160954b5c32bcaca901332972a98 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Mar 2019 16:00:42 +0100 Subject: [PATCH 271/446] Wait 2S OFF before / after flashing a module / device --- radio/src/io/frsky_device_firmware_update.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp index 380699487..f3f8bba90 100644 --- a/radio/src/io/frsky_device_firmware_update.cpp +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -303,9 +303,9 @@ void DeviceFirmwareUpdate::flashFile(const char * filename) EXTERNAL_MODULE_OFF(); SPORT_UPDATE_POWER_OFF(); - /* wait 1s off */ - watchdogSuspend(1000); - RTOS_WAIT_MS(1000); + /* wait 2s off */ + watchdogSuspend(2000); + RTOS_WAIT_MS(2000); startup(); @@ -328,9 +328,9 @@ void DeviceFirmwareUpdate::flashFile(const char * filename) waitState(SPORT_IDLE, 500); // Clear the fifo - /* wait 1s off */ - watchdogSuspend(1000); - RTOS_WAIT_MS(1000); + /* wait 2s off */ + watchdogSuspend(2000); + RTOS_WAIT_MS(2000); if (intPwr) INTERNAL_MODULE_ON(); From bfed53271221c5fea37de78ef6862d89442fbdd3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 8 Mar 2019 16:20:08 +0100 Subject: [PATCH 272/446] Remaining trace removed --- radio/src/telemetry/telemetry.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 63055aa45..8d4da40c6 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -149,7 +149,6 @@ void processBindFrame(uint8_t module, uint8_t * frame) case 0x01: if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_RX_NAME_SELECTED) { if (memcmp(&reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) { - TRACE("SET SLOT %d name", reusableBuffer.moduleSetup.pxx2.bindReceiverId); memcpy(g_model.receiverData[reusableBuffer.moduleSetup.pxx2.bindReceiverId].name, &frame[4], PXX2_LEN_RX_NAME); reusableBuffer.moduleSetup.pxx2.bindStep = BIND_WAIT; reusableBuffer.moduleSetup.pxx2.bindWaitTimeout = get_tmr10ms() + 30; From 7abb6a77b7125d42f968a39711bf0bd6a530eb93 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Mar 2019 10:21:04 +0100 Subject: [PATCH 273/446] Remove REGISTER from RADIO / HARDWARE as it only brings issues --- radio/src/gui/128x64/model_setup.cpp | 1 - radio/src/gui/128x64/radio_hardware.cpp | 26 --- radio/src/opentx.h | 1 - radio/src/pulses/pxx2.cpp | 2 +- radio/src/targets/common/arm/CMakeLists.txt | 3 +- .../{frsky_d_arm.cpp => frsky_d.cpp} | 0 radio/src/telemetry/frsky_pxx2.cpp | 219 ++++++++++++++++++ radio/src/telemetry/telemetry.cpp | 172 +------------- radio/src/telemetry/telemetry.h | 2 + 9 files changed, 226 insertions(+), 200 deletions(-) rename radio/src/telemetry/{frsky_d_arm.cpp => frsky_d.cpp} (100%) create mode 100644 radio/src/telemetry/frsky_pxx2.cpp diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 4d64479b2..e4689cd0d 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -372,7 +372,6 @@ void runPopupRegister(event_t event) void startRegisterDialog(uint8_t module) { memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2)); - memcpy(reusableBuffer.moduleSetup.pxx2.registrationID, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID); moduleSettings[module].mode = MODULE_MODE_REGISTER; s_editMode = 0; POPUP_INPUT("", runPopupRegister); diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index bd6e6a2e1..66d5be3f3 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -125,7 +125,6 @@ enum MenuRadioHardwareItems { #endif ITEM_RADIO_HARDWARE_JITTER_FILTER, ITEM_RADIO_OWNER_ID, - ITEM_RADIO_REGISTER_RECEIVER, ITEM_RADIO_HARDWARE_MAX }; @@ -158,8 +157,6 @@ enum MenuRadioHardwareItems { #define HW_SETTINGS_COLUMN1 30 #define HW_SETTINGS_COLUMN2 (30 + 5*FW) -void startRegisterDialog(uint8_t module); - void menuRadioHardware(event_t event) { MENU(STR_HARDWARE, menuTabGeneral, MENU_RADIO_HARDWARE, HEADER_LINE+ITEM_RADIO_HARDWARE_MAX, { @@ -314,29 +311,6 @@ void menuRadioHardware(event_t event) case ITEM_RADIO_OWNER_ID: editSingleName(HW_SETTINGS_COLUMN2, y, STR_OWNER_ID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, attr); break; - - case ITEM_RADIO_REGISTER_RECEIVER: - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_RECEIVER)); - lcdDrawText(HW_SETTINGS_COLUMN2, y, "[Register]", attr ); - if (attr) { - if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL && s_editMode > 0) { - if (event == EVT_KEY_FIRST(KEY_ENTER)) { - startRegisterDialog(INTERNAL_MODULE); - } - else if (menuHorizontalPosition == 0) { - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_RANGECHECK; - } - } - if (s_editMode == 0 && !warningText) { - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; - } - if (moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_NORMAL) { - // REGISTER finished - s_editMode = 0; - } - } - break; - } } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index fc4b630cd..4cd29678d 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1129,7 +1129,6 @@ union ReusableBuffer uint8_t registerPopupHorizontalPosition; int8_t registerPopupEditMode; char registerRxName[PXX2_LEN_RX_NAME]; - char registrationID[PXX2_LEN_REGISTRATION_ID]; char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME + 1]; uint8_t bindCandidateReceiversCount; uint8_t bindReceiverId; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 0529b449f..ea8cbea7d 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -134,7 +134,7 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) Pxx2Transport::addByte(zchar2char(reusableBuffer.moduleSetup.pxx2.registerRxName[i])); } for (uint8_t i=0; i * luaInputTelemetryFifo; #define IS_TELEMETRY_INTERNAL_MODULE() (false) #endif +void processPXX2TelemetryFrame(uint8_t module, uint8_t * frame); + #endif // _TELEMETRY_H_ From 2ce2f082db3897697687bbdba4d8856e4b6d8470 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Mar 2019 10:55:15 +0100 Subject: [PATCH 274/446] Cosmetics --- radio/src/gui/128x64/popups.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/popups.h b/radio/src/gui/128x64/popups.h index fcbabf7a5..dbf555753 100644 --- a/radio/src/gui/128x64/popups.h +++ b/radio/src/gui/128x64/popups.h @@ -48,7 +48,7 @@ extern uint8_t warningInfoFlags; #define SET_WARNING_INFO(...) #else #define DISPLAY_WARNING (*popupFunc) - #define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) + #define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_INPUT(s, func) (warningText = s, popupFunc = func) From aee6daf0d044f7c965be3b44ca61e47364ba7953 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Mar 2019 11:23:16 +0100 Subject: [PATCH 275/446] Cosmetics --- radio/src/gui/128x64/gui.h | 10 +++++----- radio/src/gui/128x64/menus.h | 10 ++++++++++ radio/src/gui/128x64/model_setup.cpp | 8 ++++++-- radio/src/gui/128x64/widgets.cpp | 2 +- radio/src/gui/212x64/menus.h | 10 ++++++++++ radio/src/gui/212x64/widgets.cpp | 2 +- radio/src/gui/480x272/menu_model.cpp | 2 +- radio/src/gui/480x272/menus.h | 13 ++++++++++--- radio/src/gui/common/colorlcd/widgets.cpp | 2 +- radio/src/gui/common/stdlcd/widgets.cpp | 4 ++-- 10 files changed, 47 insertions(+), 16 deletions(-) diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 62fb97887..3fd8bb060 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -281,11 +281,11 @@ void drawStatusLine(); #endif #define TEXT_FILENAME_MAXLEN 40 - extern char s_text_file[TEXT_FILENAME_MAXLEN]; - void menuTextView(event_t event); - void pushMenuTextView(const char *filename); - void pushModelNotes(); - void readModelNotes(); +extern char s_text_file[TEXT_FILENAME_MAXLEN]; +void menuTextView(event_t event); +void pushMenuTextView(const char *filename); +void pushModelNotes(); +void readModelNotes(); #define LABEL(...) (uint8_t)-1 diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index 0e79d72a0..adc4bb67d 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -57,6 +57,16 @@ void chainMenu(MenuHandlerFunc newMenu); void pushMenu(MenuHandlerFunc newMenu); void popMenu(); +inline bool isRadioMenuDisplayed() +{ + return menuVerticalPositions[0] == 1; +} + +inline bool isModelMenuDisplayed() +{ + return menuVerticalPositions[0] == 0; +} + inline MenuHandlerFunc lastPopMenu() { return menuHandlers[menuLevel+1]; diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index e4689cd0d..6d69c690d 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -428,7 +428,7 @@ void menuModelSetup(event_t event) NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_ROTARY_ENCODERS - 1, // Center beeps 0, // Global functions - isDefaultModelRegistrationID() ? HIDDEN_ROW : READONLY_ROW, // Registration ID + READONLY_ROW, // Registration ID LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None) @@ -1185,7 +1185,11 @@ void menuModelSetup(event_t event) #if defined(PCBTARANIS) case ITEM_MODEL_REGISTRATION_ID: - editSingleName(MODEL_SETUP_2ND_COLUMN, y, STR_REG_ID, g_model.modelRegistrationID, sizeof(g_model.modelRegistrationID), event, attr); + lcdDrawTextAlignedLeft(y, STR_REG_ID); + if (isDefaultModelRegistrationID()) + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, ""); + else + lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.modelRegistrationID, sizeof(g_model.modelRegistrationID), ZCHAR); break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_MODEL_NUM: diff --git a/radio/src/gui/128x64/widgets.cpp b/radio/src/gui/128x64/widgets.cpp index cec799981..f9ba1f651 100644 --- a/radio/src/gui/128x64/widgets.cpp +++ b/radio/src/gui/128x64/widgets.cpp @@ -74,7 +74,7 @@ choice_t editChoice(coord_t x, coord_t y, const char * label, const char *values { drawFieldLabel(x, y, label); if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr); - if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (menuVerticalPositions[0] == 0) ? EE_MODEL : EE_GENERAL); + if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL); return value; } diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h index 91fb3be07..a45483eb6 100644 --- a/radio/src/gui/212x64/menus.h +++ b/radio/src/gui/212x64/menus.h @@ -43,6 +43,16 @@ void chainMenu(MenuHandlerFunc newMenu); void pushMenu(MenuHandlerFunc newMenu); void popMenu(); +inline bool isRadioMenuDisplayed() +{ + return menuVerticalPositions[0] == 1; +} + +inline bool isModelMenuDisplayed() +{ + return menuVerticalPositions[0] == 0; +} + void onMainViewMenu(const char * result); void menuFirstCalib(event_t event); diff --git a/radio/src/gui/212x64/widgets.cpp b/radio/src/gui/212x64/widgets.cpp index 8eb631d09..2e4166f94 100644 --- a/radio/src/gui/212x64/widgets.cpp +++ b/radio/src/gui/212x64/widgets.cpp @@ -134,7 +134,7 @@ choice_t editChoice(coord_t x, coord_t y, const char * label, const char *values { drawFieldLabel(x, y, label); if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr); - if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (menuVerticalPositions[0] == 0) ? EE_MODEL : EE_GENERAL); + if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL); return value; } diff --git a/radio/src/gui/480x272/menu_model.cpp b/radio/src/gui/480x272/menu_model.cpp index f751b2bf2..e03cf34a3 100644 --- a/radio/src/gui/480x272/menu_model.cpp +++ b/radio/src/gui/480x272/menu_model.cpp @@ -135,7 +135,7 @@ void editName(coord_t x, coord_t y, char * name, uint8_t size, event_t event, ui v = zchar2char(v); } name[editNameCursorPos] = v; - storageDirty(menuVerticalPositions[0] == 0 ? EE_MODEL : EE_GENERAL); + storageDirty(isModelMenuDisplayed() ? EE_MODEL : EE_GENERAL); } lcdDrawSizedText(x, y, name, size, flags); diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index 0c13c92fd..aa5d9e045 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -48,13 +48,20 @@ extern uint8_t menuVerticalPositions[4]; extern uint8_t menuLevel; extern event_t menuEvent; -/// goto given Menu, but substitute current menu in menuStack void chainMenu(MenuHandlerFunc newMenu); -/// goto given Menu, store current menu in menuStack void pushMenu(MenuHandlerFunc newMenu); -/// return to last menu in menuStack void popMenu(); +inline bool isRadioMenuDisplayed() +{ + return menuVerticalPositions[0] == 1; +} + +inline bool isModelMenuDisplayed() +{ + return menuVerticalPositions[0] == 0; +} + enum MenuIcons { ICON_OPENTX, ICON_RADIO, diff --git a/radio/src/gui/common/colorlcd/widgets.cpp b/radio/src/gui/common/colorlcd/widgets.cpp index 84f49e67d..0dd0a4a39 100644 --- a/radio/src/gui/common/colorlcd/widgets.cpp +++ b/radio/src/gui/common/colorlcd/widgets.cpp @@ -46,7 +46,7 @@ void drawValueWithUnit(coord_t x, coord_t y, int32_t val, uint8_t unit, LcdFlags int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags attr, event_t event) { - if (attr & INVERS) value = checkIncDec(event, value, min, max, (menuVerticalPositions[0] == 0) ? EE_MODEL : EE_GENERAL); + if (attr & INVERS) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL); if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr); return value; } diff --git a/radio/src/gui/common/stdlcd/widgets.cpp b/radio/src/gui/common/stdlcd/widgets.cpp index fde626ecd..266ec6446 100644 --- a/radio/src/gui/common/stdlcd/widgets.cpp +++ b/radio/src/gui/common/stdlcd/widgets.cpp @@ -69,7 +69,7 @@ void editName(coord_t x, coord_t y, char * name, uint8_t size, event_t event, ui else mode = FIXEDWIDTH; } - + lcdDrawSizedText(x, y, name, size, attr | mode); coord_t backupNextPos = lcdNextPos; @@ -156,7 +156,7 @@ void editName(coord_t x, coord_t y, char * name, uint8_t size, event_t event, ui if (c != v) { name[cur] = v; - storageDirty(menuVerticalPositions[0] == 0 ? EE_MODEL : EE_GENERAL); + storageDirty(isModelMenuDisplayed() ? EE_MODEL : EE_GENERAL); } if (attr == ZCHAR) { From 26325aa7de6193feac64cf7f99815defd818023b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Mar 2019 12:13:47 +0100 Subject: [PATCH 276/446] Lazy fix for the menu which moves behind the REGISTRATION dialog --- radio/src/gui/128x64/model_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 6d69c690d..2640ad81e 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -428,7 +428,7 @@ void menuModelSetup(event_t event) NUM_STICKS + NUM_POTS + NUM_SLIDERS + NUM_ROTARY_ENCODERS - 1, // Center beeps 0, // Global functions - READONLY_ROW, // Registration ID + uint8_t((isDefaultModelRegistrationID() || (warningText && popupFunc == runPopupRegister)) ? HIDDEN_ROW : READONLY_ROW), // Registration ID LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None) From 1845df0df5fa9bf9bfabee99e8ca15810bd9774a Mon Sep 17 00:00:00 2001 From: Kilrah Date: Sat, 9 Mar 2019 13:24:35 +0100 Subject: [PATCH 277/446] displayTrims was divided for no reason on 128x64 --- radio/src/gui/128x64/view_main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index aa0577d20..691c9f8a9 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -143,7 +143,7 @@ void displayTrims(uint8_t phase) } if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) { if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1<0 ? 12 : 40, xm-2, -abs(dir/5), TINSIZE|VERTICAL); + lcdDrawNumber(dir>0 ? 12 : 40, xm-2, -abs(dir), TINSIZE|VERTICAL); } } } @@ -165,7 +165,7 @@ void displayTrims(uint8_t phase) } if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) { if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1<0 ? TRIM_LH_POS : TRIM_LH_NEG) : (dir>0 ? TRIM_RH_POS : TRIM_RH_NEG)), ym-2, -abs(dir/5), TINSIZE); + lcdDrawNumber((stickIndex==0 ? (dir>0 ? TRIM_LH_POS : TRIM_LH_NEG) : (dir>0 ? TRIM_RH_POS : TRIM_RH_NEG)), ym-2, -abs(dir), TINSIZE); } } } From 1c70646cf1902e3fc6726b1f99c52ca0d5df074c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Mar 2019 16:45:23 +0100 Subject: [PATCH 278/446] 3djc/test (#6) Work on receiver options --- radio/src/gui/128x64/model_setup.cpp | 81 ++++++++++++++++++---------- radio/src/opentx.h | 2 + radio/src/pulses/pxx2.cpp | 5 +- radio/src/telemetry/frsky_pxx2.cpp | 2 + 4 files changed, 62 insertions(+), 28 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 2640ad81e..fb19b8d75 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1905,6 +1905,16 @@ void menuModelFailsafe(event_t event) } } +enum MenuModelReceiverOptions { + ITEM_RECEIVER_TELEMETRY, + ITEM_RECEIVER_PWM_RATE, + ITEM_RECEIVER_PINMAP +}; + +#define RECEIVER_OPTIONS_2ND_COLUMN 80 +#define IF_TELEM_DISPLAYED(x) (g_model.moduleData[g_moduleIdx].pxx.receiver_telem_off ? (uint8_t)(x) : HIDDEN_ROW) //Todo need capabilities +#define IF_PWM_RATE_DISPLAYED(x) (g_model.moduleData[g_moduleIdx].pxx.receiver_telem_off ? (uint8_t)(x) : HIDDEN_ROW) //Todo need capabilities + void menuModelReceiverOptions(event_t event) { if (menuEvent) { @@ -1914,7 +1924,10 @@ void menuModelReceiverOptions(event_t event) const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; uint8_t wbar = LCD_W / 2 - 20; - SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx)); + + SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx) + ITEM_RECEIVER_PINMAP, {IF_TELEM_DISPLAYED(0), IF_PWM_RATE_DISPLAYED(0)}); + int8_t sub = menuVerticalPosition; + lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); drawReceiverName(FW * 13, 0, reusableBuffer.receiverSetup.receiverId); @@ -1926,44 +1939,58 @@ void menuModelReceiverOptions(event_t event) moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } +#if defined(SIMU) + reusableBuffer.receiverSetup.state = 0xFF; +#endif if (reusableBuffer.receiverSetup.state != 0) { - for (uint8_t i = 0; i < NUM_BODY_LINES; i++) { - coord_t y = MENU_HEADER_HEIGHT + 1 + i * FH; - uint8_t pin = menuVerticalOffset + i; + for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); + uint8_t pin = i - ITEM_RECEIVER_PINMAP; uint8_t channel = reusableBuffer.receiverSetup.channelMapping[pin]; int32_t channelValue = channelOutputs[channel]; - // Pin - lcdDrawText(0, y, "Pin"); - lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); + switch (i) { + case ITEM_RECEIVER_TELEMETRY: + reusableBuffer.receiverSetup.telemetryEnabled = editCheckBox(reusableBuffer.receiverSetup.telemetryEnabled , RECEIVER_OPTIONS_2ND_COLUMN, y, "Telemetry", attr, event); + break; + case ITEM_RECEIVER_PWM_RATE: + reusableBuffer.receiverSetup.pwmRate = editCheckBox(reusableBuffer.receiverSetup.pwmRate , RECEIVER_OPTIONS_2ND_COLUMN, y, "9ms PWM", attr, event); + break; - // Channel - LcdFlags flags = 0; - if (menuVerticalPosition == pin) { - flags |= INVERS; - if (s_editMode > 0) { - flags |= BLINK; - channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx)); - if (checkIncDec_Ret) { - reusableBuffer.receiverSetup.channelMapping[pin] = channel; - reusableBuffer.receiverSetup.state = 0x40; - moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + default: + + // Pin + lcdDrawText(0, y, "Pin"); + lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); + + // Channel + if (menuVerticalPosition == pin) { + if (s_editMode > 0) { + channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx)); + if (checkIncDec_Ret) { + reusableBuffer.receiverSetup.channelMapping[pin] = channel; + reusableBuffer.receiverSetup.state = 0x40; + moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } } } - } - putsChn(7 * FW, y, channel + 1, flags); + putsChn(7 * FW, y, channel + 1, attr); - // Bargraph + // Bargraph #if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines - lcdDrawRect(LCD_W - 3 - wbar, y + 1, wbar + 1, 4); + lcdDrawRect(LCD_W - 3 - wbar, y + 1, wbar + 1, 4); #endif - const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); - const coord_t xChannel = (channelValue > 0) ? LCD_W - 3 - wbar / 2 : LCD_W - 2 - wbar / 2 - lenChannel; - lcdDrawHorizontalLine(xChannel, y + 2, lenChannel, SOLID, 0); - lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); + const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); + const coord_t xChannel = (channelValue > 0) ? LCD_W - 3 - wbar / 2 : LCD_W - 2 - wbar / 2 - lenChannel; + lcdDrawHorizontalLine(xChannel, y + 2, lenChannel, SOLID, 0); + lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); + break; + } } } else { - lcdDrawText(4*FW, 4*FH, "Waiting for RX..."); + lcdDrawText(4 * FW, 4 * FH, "Waiting for RX..."); } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 4cd29678d..ae2a6913e 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1147,6 +1147,8 @@ union ReusableBuffer uint8_t moduleIdx; uint8_t receiverId; uint8_t channelMapping[24]; + uint8_t telemetryEnabled; + uint8_t pwmRate; } receiverSetup; // 103 bytes diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index ea8cbea7d..61553ade0 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -154,7 +154,10 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) else { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); - Pxx2Transport::addByte(0x0); + uint8_t flag1 = 0; + if(reusableBuffer.receiverSetup.pwmRate) + flag1 ^= 0x30; + Pxx2Transport::addByte(flag1); for (int i = 0; i < 24; i++) { Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); } diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index af594a8e4..dea10b66c 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -69,6 +69,8 @@ void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; } + reusableBuffer.receiverSetup.pwmRate = frame[4] & 0x30; + reusableBuffer.receiverSetup.state = 0xFF; moduleSettings[module].mode = MODULE_MODE_NORMAL; } From ec806234c6af341eeb3474d776cd51d64538ed0e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 Mar 2019 16:47:54 +0100 Subject: [PATCH 279/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 52 ++++++++++++++-------------- radio/src/pulses/pxx2.cpp | 4 +-- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index fb19b8d75..12e41d1e4 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1908,7 +1908,7 @@ void menuModelFailsafe(event_t event) enum MenuModelReceiverOptions { ITEM_RECEIVER_TELEMETRY, ITEM_RECEIVER_PWM_RATE, - ITEM_RECEIVER_PINMAP + ITEM_RECEIVER_PINMAP_FIRST }; #define RECEIVER_OPTIONS_2ND_COLUMN 80 @@ -1925,7 +1925,7 @@ void menuModelReceiverOptions(event_t event) const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; uint8_t wbar = LCD_W / 2 - 20; - SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx) + ITEM_RECEIVER_PINMAP, {IF_TELEM_DISPLAYED(0), IF_PWM_RATE_DISPLAYED(0)}); + SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx) + ITEM_RECEIVER_PINMAP_FIRST, {IF_TELEM_DISPLAYED(0), IF_PWM_RATE_DISPLAYED(0)}); int8_t sub = menuVerticalPosition; @@ -1942,12 +1942,13 @@ void menuModelReceiverOptions(event_t event) #if defined(SIMU) reusableBuffer.receiverSetup.state = 0xFF; #endif + if (reusableBuffer.receiverSetup.state != 0) { for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); - uint8_t pin = i - ITEM_RECEIVER_PINMAP; + uint8_t pin = i - ITEM_RECEIVER_PINMAP_FIRST; uint8_t channel = reusableBuffer.receiverSetup.channelMapping[pin]; int32_t channelValue = channelOutputs[channel]; @@ -1960,33 +1961,32 @@ void menuModelReceiverOptions(event_t event) break; default: + // Pin + lcdDrawText(0, y, "Pin"); + lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); - // Pin - lcdDrawText(0, y, "Pin"); - lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); - - // Channel - if (menuVerticalPosition == pin) { - if (s_editMode > 0) { - channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx)); - if (checkIncDec_Ret) { - reusableBuffer.receiverSetup.channelMapping[pin] = channel; - reusableBuffer.receiverSetup.state = 0x40; - moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + // Channel + if (menuVerticalPosition == pin) { + if (s_editMode > 0) { + channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx)); + if (checkIncDec_Ret) { + reusableBuffer.receiverSetup.channelMapping[pin] = channel; + reusableBuffer.receiverSetup.state = 0x40; + moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } } } - } - putsChn(7 * FW, y, channel + 1, attr); + putsChn(7 * FW, y, channel + 1, attr); - // Bargraph -#if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines - lcdDrawRect(LCD_W - 3 - wbar, y + 1, wbar + 1, 4); -#endif - const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); - const coord_t xChannel = (channelValue > 0) ? LCD_W - 3 - wbar / 2 : LCD_W - 2 - wbar / 2 - lenChannel; - lcdDrawHorizontalLine(xChannel, y + 2, lenChannel, SOLID, 0); - lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); - break; + // Bargraph + #if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines + lcdDrawRect(LCD_W - 3 - wbar, y + 1, wbar + 1, 4); + #endif + const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); + const coord_t xChannel = (channelValue > 0) ? LCD_W - 3 - wbar / 2 : LCD_W - 2 - wbar / 2 - lenChannel; + lcdDrawHorizontalLine(xChannel, y + 2, lenChannel, SOLID, 0); + lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); + break; } } } diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 61553ade0..fa4947249 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -155,8 +155,8 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); uint8_t flag1 = 0; - if(reusableBuffer.receiverSetup.pwmRate) - flag1 ^= 0x30; + if (reusableBuffer.receiverSetup.pwmRate) + flag1 |= 0x10; Pxx2Transport::addByte(flag1); for (int i = 0; i < 24; i++) { Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); From 910298da5803c1bb33f00bf80997d6883629fa44 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 9 Mar 2019 19:12:42 +0100 Subject: [PATCH 280/446] Fix menu --- radio/src/gui/128x64/model_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 12e41d1e4..3ea09b3c1 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1966,7 +1966,7 @@ void menuModelReceiverOptions(event_t event) lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); // Channel - if (menuVerticalPosition == pin) { + if ((menuVerticalPosition - ITEM_RECEIVER_PINMAP_FIRST)== pin) { if (s_editMode > 0) { channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx)); if (checkIncDec_Ret) { From 34a8e676d1c131d18be9bfa10785a540a3ab6689 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 10 Mar 2019 09:33:47 +0100 Subject: [PATCH 281/446] Options debug continued (not finished) --- radio/src/gui/128x64/model_setup.cpp | 28 +++++++++++++++++++++++----- radio/src/pulses/pxx2.cpp | 2 ++ radio/src/telemetry/frsky_pxx2.cpp | 14 ++++++++------ 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 3ea09b3c1..293c65cd0 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1933,10 +1933,12 @@ void menuModelReceiverOptions(event_t event) drawReceiverName(FW * 13, 0, reusableBuffer.receiverSetup.receiverId); lcdInvertLine(0); - if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == 0x00 && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { + if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == 0xFF && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 500/*5s*/; reusableBuffer.receiverSetup.timeout = 0; + reusableBuffer.receiverSetup.state = 0x00; // Get options moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + TRACE("GET polling"); } #if defined(SIMU) @@ -1944,7 +1946,9 @@ void menuModelReceiverOptions(event_t event) #endif if (reusableBuffer.receiverSetup.state != 0) { + bool changed = false; for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); @@ -1954,10 +1958,19 @@ void menuModelReceiverOptions(event_t event) switch (i) { case ITEM_RECEIVER_TELEMETRY: - reusableBuffer.receiverSetup.telemetryEnabled = editCheckBox(reusableBuffer.receiverSetup.telemetryEnabled , RECEIVER_OPTIONS_2ND_COLUMN, y, "Telemetry", attr, event); + previousValue = reusableBuffer.receiverSetup.telemetryEnabled; + reusableBuffer.receiverSetup.telemetryEnabled = editCheckBox(reusableBuffer.receiverSetup.telemetryEnabled, RECEIVER_OPTIONS_2ND_COLUMN, y, + "Telemetry", attr, event); + if (previousValue != reusableBuffer.receiverSetup.telemetryEnabled) + changed = true; break; + + case ITEM_RECEIVER_PWM_RATE: - reusableBuffer.receiverSetup.pwmRate = editCheckBox(reusableBuffer.receiverSetup.pwmRate , RECEIVER_OPTIONS_2ND_COLUMN, y, "9ms PWM", attr, event); + previousValue = reusableBuffer.receiverSetup.pwmRate; + reusableBuffer.receiverSetup.pwmRate = editCheckBox(reusableBuffer.receiverSetup.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, "9ms PWM", attr, event); + if (previousValue != reusableBuffer.receiverSetup.telemetryEnabled) + changed = true; break; default: @@ -1971,8 +1984,7 @@ void menuModelReceiverOptions(event_t event) channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx)); if (checkIncDec_Ret) { reusableBuffer.receiverSetup.channelMapping[pin] = channel; - reusableBuffer.receiverSetup.state = 0x40; - moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + changed = true; } } } @@ -1989,6 +2001,12 @@ void menuModelReceiverOptions(event_t event) break; } } + if (changed) { + reusableBuffer.receiverSetup.state = 0x40; // Set options + reusableBuffer.receiverSetup.timeout = 0; + moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + TRACE("CHange detected, sending SET"); + } } else { lcdDrawText(4 * FW, 4 * FH, "Waiting for RX..."); diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index fa4947249..54c41cdcc 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -147,11 +147,13 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) if (reusableBuffer.receiverSetup.timeout) { if (get_tmr10ms() > reusableBuffer.receiverSetup.timeout) { reusableBuffer.receiverSetup.timeout = 0; + reusableBuffer.receiverSetup.state = 0xFF; moduleSettings[module].mode = MODULE_MODE_NORMAL; } setupChannelsFrame(module); } else { + TRACE("Frame is %d", reusableBuffer.receiverSetup.state); addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); uint8_t flag1 = 0; diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index dea10b66c..ab899e446 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -18,6 +18,7 @@ * GNU General Public License for more details. */ +#include #include "opentx.h" class Pxx2Telemetry @@ -64,13 +65,14 @@ void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) if (moduleSettings[module].mode != MODULE_MODE_RECEIVER_SETTINGS) { return; } - - for (uint8_t pin=0; pin<24; pin++) { - reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; + TRACE("Processing Frame"); + if (reusableBuffer.receiverSetup.state == 0x00) { + TRACE("Frame is GET"); + for (uint8_t pin = 0; pin < 24; pin++) { + reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; + } + reusableBuffer.receiverSetup.pwmRate = frame[4] & 0x30; } - - reusableBuffer.receiverSetup.pwmRate = frame[4] & 0x30; - reusableBuffer.receiverSetup.state = 0xFF; moduleSettings[module].mode = MODULE_MODE_NORMAL; } From 6ad1d8f957e3616548d86ebfbe8c1d212d905c7d Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 10 Mar 2019 11:24:56 +0100 Subject: [PATCH 282/446] split get/set receivers settings --- radio/src/gui/128x64/model_setup.cpp | 13 ++----- radio/src/pulses/pulses.h | 3 +- radio/src/pulses/pxx2.cpp | 55 +++++++++++++++++----------- radio/src/pulses/pxx2.h | 8 +++- radio/src/telemetry/frsky_pxx2.cpp | 14 +++---- 5 files changed, 51 insertions(+), 42 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 293c65cd0..f3d20ec37 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1933,19 +1933,16 @@ void menuModelReceiverOptions(event_t event) drawReceiverName(FW * 13, 0, reusableBuffer.receiverSetup.receiverId); lcdInvertLine(0); - if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == 0xFF && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { + if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == RECEIVER_OK && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 500/*5s*/; - reusableBuffer.receiverSetup.timeout = 0; - reusableBuffer.receiverSetup.state = 0x00; // Get options - moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - TRACE("GET polling"); + moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_GET_SETTINGS; } #if defined(SIMU) reusableBuffer.receiverSetup.state = 0xFF; #endif - if (reusableBuffer.receiverSetup.state != 0) { + if (reusableBuffer.receiverSetup.state != RECEIVER_WAITING_RESPONSE) { bool changed = false; for (uint8_t k=0; k reusableBuffer.receiverSetup.timeout) { - reusableBuffer.receiverSetup.timeout = 0; - reusableBuffer.receiverSetup.state = 0xFF; - moduleSettings[module].mode = MODULE_MODE_NORMAL; - } - setupChannelsFrame(module); + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); + Pxx2Transport::addByte(0x40 + reusableBuffer.receiverSetup.receiverId); + uint8_t flag1 = 0; + if (reusableBuffer.receiverSetup.pwmRate) + flag1 |= 0x10; + Pxx2Transport::addByte(flag1); + for (int i = 0; i < 24; i++) { + Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); } - else { - TRACE("Frame is %d", reusableBuffer.receiverSetup.state); - addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); - Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); - uint8_t flag1 = 0; - if (reusableBuffer.receiverSetup.pwmRate) - flag1 |= 0x10; - Pxx2Transport::addByte(flag1); - for (int i = 0; i < 24; i++) { - Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); - } - reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 20/*200ms*/; + reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 20/*200ms*/; + reusableBuffer.receiverSetup.state = RECEIVER_WAITING_RESPONSE; // module will be confirming changes + moduleSettings[module].mode = MODULE_MODE_NORMAL; +} + + +void Pxx2Pulses::setupReceiverGetSettingsFrame(uint8_t module) +{ + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); + Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); + uint8_t flag1 = 0; + if (reusableBuffer.receiverSetup.pwmRate) + flag1 |= 0x10; + Pxx2Transport::addByte(flag1); + for (int i = 0; i < 24; i++) { + Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); } + reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 20/*200ms*/; + reusableBuffer.receiverSetup.state = RECEIVER_WAITING_RESPONSE; + moduleSettings[module].mode = MODULE_MODE_NORMAL; } void Pxx2Pulses::setupBindFrame(uint8_t module) @@ -241,8 +249,11 @@ void Pxx2Pulses::setupFrame(uint8_t module) case MODULE_MODE_GET_HARDWARE_INFO: setupHardwareInfoFrame(module); break; - case MODULE_MODE_RECEIVER_SETTINGS: - setupReceiverSettingsFrame(module); + case MODULE_MODE_RECEIVER_GET_SETTINGS: + setupReceiverGetSettingsFrame(module); + break; + case MODULE_MODE_RECEIVER_SET_SETTINGS: + setupReceiverSetSettingsFrame(module); break; case MODULE_MODE_REGISTER: setupRegisterFrame(module); diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index e76704d3d..b7c1ee126 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -59,6 +59,10 @@ enum PXX2BindSteps { BIND_OK }; +enum PXX2ReceiverStatus { + RECEIVER_WAITING_RESPONSE, + RECEIVER_OK +}; extern ModuleFifo intmoduleFifo; extern ModuleFifo extmoduleFifo; @@ -112,7 +116,9 @@ class Pxx2Pulses: public PxxPulses { void setupShareMode(uint8_t module); - void setupReceiverSettingsFrame(uint8_t module); + void setupReceiverSetSettingsFrame(uint8_t module); + + void setupReceiverGetSettingsFrame(uint8_t module); void setupChannelsFrame(uint8_t module); diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index ab899e446..7df61e9f6 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -62,20 +62,16 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) { - if (moduleSettings[module].mode != MODULE_MODE_RECEIVER_SETTINGS) { - return; - } - TRACE("Processing Frame"); - if (reusableBuffer.receiverSetup.state == 0x00) { - TRACE("Frame is GET"); + if (reusableBuffer.receiverSetup.state == RECEIVER_WAITING_RESPONSE) { for (uint8_t pin = 0; pin < 24; pin++) { reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; } reusableBuffer.receiverSetup.pwmRate = frame[4] & 0x30; + reusableBuffer.receiverSetup.state = RECEIVER_OK; + reusableBuffer.receiverSetup.timeout = 0; + moduleSettings[module].mode = MODULE_MODE_NORMAL; } - reusableBuffer.receiverSetup.state = 0xFF; - moduleSettings[module].mode = MODULE_MODE_NORMAL; -} + } void processRegisterFrame(uint8_t module, uint8_t * frame) { From 9fb471b8cb116840915b6bde6213f3289c5bea13 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 10 Mar 2019 15:07:13 +0100 Subject: [PATCH 283/446] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 34 ++++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index f3d20ec37..f555e267b 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -94,16 +94,16 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_INTERNAL_MODULE_PXX2_REGISTER_RANGE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_LABEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_LABEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_PINMAP, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_LABEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_PINMAP, + ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_OPTIONS, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_BIND_SHARE, #endif ITEM_MODEL_EXTERNAL_MODULE_LABEL, @@ -130,16 +130,16 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_REGISTER_RANGE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_LABEL, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_PINMAP, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_LABEL, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_PINMAP, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_OPTIONS, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_BIND_SHARE, #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, @@ -1277,14 +1277,14 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_PINMAP: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_PINMAP: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_PINMAP: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_PINMAP: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_PINMAP: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_PINMAP: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS: + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_OPTIONS: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_OPTIONS: { lcdDrawText(INDENT_WIDTH * 2, y, STR_OPTIONS); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr); @@ -1925,7 +1925,7 @@ void menuModelReceiverOptions(event_t event) const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; uint8_t wbar = LCD_W / 2 - 20; - SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx) + ITEM_RECEIVER_PINMAP_FIRST, {IF_TELEM_DISPLAYED(0), IF_PWM_RATE_DISPLAYED(0)}); + SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + sentModuleChannels(g_moduleIdx), {IF_TELEM_DISPLAYED(0), IF_PWM_RATE_DISPLAYED(0)}); int8_t sub = menuVerticalPosition; From e9d54852b99f84aef57a48f14d01a18c3d8095a4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 11 Mar 2019 08:05:54 +0100 Subject: [PATCH 284/446] Fixes for binary options handling --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- radio/src/pulses/pxx2.cpp | 4 +++- radio/src/pulses/pxx2.h | 3 +++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index f555e267b..57edeab45 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1957,7 +1957,7 @@ void menuModelReceiverOptions(event_t event) case ITEM_RECEIVER_TELEMETRY: previousValue = reusableBuffer.receiverSetup.telemetryEnabled; reusableBuffer.receiverSetup.telemetryEnabled = editCheckBox(reusableBuffer.receiverSetup.telemetryEnabled, RECEIVER_OPTIONS_2ND_COLUMN, y, - "Telemetry", attr, event); + "Telemetry", attr, event) & PXX2_RECV_OPTION_MASK_TELEMETRY; if (previousValue != reusableBuffer.receiverSetup.telemetryEnabled) changed = true; break; @@ -1965,7 +1965,7 @@ void menuModelReceiverOptions(event_t event) case ITEM_RECEIVER_PWM_RATE: previousValue = reusableBuffer.receiverSetup.pwmRate; - reusableBuffer.receiverSetup.pwmRate = editCheckBox(reusableBuffer.receiverSetup.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, "9ms PWM", attr, event); + reusableBuffer.receiverSetup.pwmRate = editCheckBox(reusableBuffer.receiverSetup.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, "9ms PWM", attr, event) & PXX2_RECV_OPTION_MASK_FASTPWM; if (previousValue != reusableBuffer.receiverSetup.telemetryEnabled) changed = true; break; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 8d1ff8cd7..7b28efd26 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -148,7 +148,9 @@ void Pxx2Pulses::setupReceiverSetSettingsFrame(uint8_t module) Pxx2Transport::addByte(0x40 + reusableBuffer.receiverSetup.receiverId); uint8_t flag1 = 0; if (reusableBuffer.receiverSetup.pwmRate) - flag1 |= 0x10; + flag1 |= PXX2_RECV_OPTION_MASK_FASTPWM; + if (reusableBuffer.receiverSetup.telemetryEnabled) + flag1 |= PXX2_RECV_OPTION_MASK_TELEMETRY; Pxx2Transport::addByte(flag1); for (int i = 0; i < 24; i++) { Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index b7c1ee126..3c882e162 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -42,6 +42,9 @@ #define PXX2_FLAG0_FAILSAFE (1 << 6) +#define PXX2_RECV_OPTION_MASK_FASTPWM 0x10 +#define PXX2_RECV_OPTION_MASK_TELEMETRY 0x00 // Todo : update when defined + const uint8_t DEFAULT_CHANNEL_MAPPING[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; const uint8_t CH9TO16_CHANNEL_MAPPING[] = {0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67}; From a44dad9bb20404a9790579fc14cc6e80a293bd58 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 11 Mar 2019 08:49:20 +0100 Subject: [PATCH 285/446] RANGE CHECK now sent in CHANNELS Flag0 --- radio/src/pulses/pxx2.cpp | 11 +++++++---- radio/src/pulses/pxx2.h | 3 ++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 7b28efd26..54bd9a06f 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -26,9 +26,12 @@ uint8_t Pxx2Pulses::addFlag0(uint8_t module) uint8_t flag0 = g_model.header.modelId[module] & 0x3F; if (g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER) { if (moduleSettings[module].counter == 0) { - flag0 |= PXX2_FLAG0_FAILSAFE; + flag0 |= PXX2_CHANNELS_FLAG0_FAILSAFE; } } + if (moduleSettings[module].mode == MODULE_MODE_RANGECHECK) { + flag0 |= PXX2_CHANNELS_FLAG0_RANGECHECK; + } Pxx2Transport::addByte(flag0); return flag0; } @@ -95,11 +98,11 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module) // Channels uint8_t channelsCount = sentModuleChannels(module); - addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart); + addChannels(module, flag0 & PXX2_CHANNELS_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart); if (channelsCount > 8) { - addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart + 8); + addChannels(module, flag0 & PXX2_CHANNELS_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart + 8); if (channelsCount > 16) { - addChannels(module, flag0 & PXX2_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart + 16); + addChannels(module, flag0 & PXX2_CHANNELS_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart + 16); } } } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 3c882e162..fe095e631 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -40,7 +40,8 @@ #define PXX2_TYPE_C_OTA 0xFE -#define PXX2_FLAG0_FAILSAFE (1 << 6) +#define PXX2_CHANNELS_FLAG0_FAILSAFE (1 << 6) +#define PXX2_CHANNELS_FLAG0_RANGECHECK (1 << 7) #define PXX2_RECV_OPTION_MASK_FASTPWM 0x10 #define PXX2_RECV_OPTION_MASK_TELEMETRY 0x00 // Todo : update when defined From bc4248c4ff48014362fe9d23e1a69fba3aedfcb2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 11 Mar 2019 09:16:04 +0100 Subject: [PATCH 286/446] Options mostly working (pinmap is ok), TRACES still included --- radio/src/gui/128x64/model_setup.cpp | 14 ++++++++++---- radio/src/pulses/pxx2.cpp | 9 ++++----- radio/src/telemetry/frsky_pxx2.cpp | 18 ++++++++++-------- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 57edeab45..1a8dff303 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1957,17 +1957,22 @@ void menuModelReceiverOptions(event_t event) case ITEM_RECEIVER_TELEMETRY: previousValue = reusableBuffer.receiverSetup.telemetryEnabled; reusableBuffer.receiverSetup.telemetryEnabled = editCheckBox(reusableBuffer.receiverSetup.telemetryEnabled, RECEIVER_OPTIONS_2ND_COLUMN, y, - "Telemetry", attr, event) & PXX2_RECV_OPTION_MASK_TELEMETRY; - if (previousValue != reusableBuffer.receiverSetup.telemetryEnabled) + "Telemetry", attr, event); + if (previousValue != reusableBuffer.receiverSetup.telemetryEnabled) { changed = true; + TRACE("TELEM CHANGED (%d , %d)", previousValue, reusableBuffer.receiverSetup.telemetryEnabled); + } break; case ITEM_RECEIVER_PWM_RATE: previousValue = reusableBuffer.receiverSetup.pwmRate; - reusableBuffer.receiverSetup.pwmRate = editCheckBox(reusableBuffer.receiverSetup.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, "9ms PWM", attr, event) & PXX2_RECV_OPTION_MASK_FASTPWM; - if (previousValue != reusableBuffer.receiverSetup.telemetryEnabled) + reusableBuffer.receiverSetup.pwmRate = editCheckBox(reusableBuffer.receiverSetup.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, "9ms PWM", attr, event); + TRACE("pwmRate : %d", reusableBuffer.receiverSetup.pwmRate); + if (previousValue != reusableBuffer.receiverSetup.pwmRate) { changed = true; + TRACE("pwmRate CHANGED (%d , %d)", previousValue, reusableBuffer.receiverSetup.pwmRate); + } break; default: @@ -2001,6 +2006,7 @@ void menuModelReceiverOptions(event_t event) if (changed) { reusableBuffer.receiverSetup.timeout = 0; moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SET_SETTINGS; + TRACE("Change detected"); } } else { diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 54bd9a06f..312403408 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -147,6 +147,7 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) void Pxx2Pulses::setupReceiverSetSettingsFrame(uint8_t module) { + TRACE("Sending SET frame"); addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); Pxx2Transport::addByte(0x40 + reusableBuffer.receiverSetup.receiverId); uint8_t flag1 = 0; @@ -166,14 +167,12 @@ void Pxx2Pulses::setupReceiverSetSettingsFrame(uint8_t module) void Pxx2Pulses::setupReceiverGetSettingsFrame(uint8_t module) { + TRACE("Sending GET frame"); addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); - uint8_t flag1 = 0; - if (reusableBuffer.receiverSetup.pwmRate) - flag1 |= 0x10; - Pxx2Transport::addByte(flag1); + Pxx2Transport::addByte(0x00); for (int i = 0; i < 24; i++) { - Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); + Pxx2Transport::addByte(0x00); } reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 20/*200ms*/; reusableBuffer.receiverSetup.state = RECEIVER_WAITING_RESPONSE; diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 7df61e9f6..866af26c0 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -62,15 +62,17 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) { - if (reusableBuffer.receiverSetup.state == RECEIVER_WAITING_RESPONSE) { - for (uint8_t pin = 0; pin < 24; pin++) { - reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; - } - reusableBuffer.receiverSetup.pwmRate = frame[4] & 0x30; - reusableBuffer.receiverSetup.state = RECEIVER_OK; - reusableBuffer.receiverSetup.timeout = 0; - moduleSettings[module].mode = MODULE_MODE_NORMAL; + TRACE("Got Option frame"); + for (uint8_t pin = 0; pin < 24; pin++) { + reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; } + if(frame[4] & PXX2_RECV_OPTION_MASK_FASTPWM) + reusableBuffer.receiverSetup.pwmRate = 1; + if(frame[4] & PXX2_RECV_OPTION_MASK_TELEMETRY) + reusableBuffer.receiverSetup.telemetryEnabled = 1; + reusableBuffer.receiverSetup.state = RECEIVER_OK; + reusableBuffer.receiverSetup.timeout = 0; + moduleSettings[module].mode = MODULE_MODE_NORMAL; } void processRegisterFrame(uint8_t module, uint8_t * frame) From bfe59000177b4e57522e14d3a2f3b4e520e5fd20 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 11 Mar 2019 15:57:11 +0100 Subject: [PATCH 287/446] Internal module flash fix --- radio/src/io/frsky_device_firmware_update.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp index f3f8bba90..9e684d375 100644 --- a/radio/src/io/frsky_device_firmware_update.cpp +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -93,19 +93,31 @@ void DeviceFirmwareUpdate::startup() const uint8_t * DeviceFirmwareUpdate::readFullDuplexFrame(ModuleFifo & fifo, uint32_t timeout) { uint8_t len = 0; + bool bytestuff = false; while (len < 10) { uint32_t elapsed = 0; - while (!fifo.pop(frame[len])) { + uint8_t byte; + while (!fifo.pop(byte)) { RTOS_WAIT_MS(1); if (elapsed++ >= timeout) { return nullptr; } } - if (len > 0 || frame[len] == 0x7E) { + if (byte == 0x7D) { + bytestuff = true; + continue; + } + if (bytestuff) { + frame[len] = 0x20 ^ byte; + bytestuff = false; + } + else { + frame[len] = byte; + } + if (len > 0 || byte == 0x7E) { ++len; } } - return &frame[1]; } From 420b7c3cccc8c6f189f415810b95e356431f92c0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 11 Mar 2019 16:39:40 +0100 Subject: [PATCH 288/446] GET RX SETTINGS now has a variable length. Still KO here --- radio/src/gui/128x64/model_setup.cpp | 6 ++--- radio/src/pulses/pulses.h | 3 +-- radio/src/pulses/pxx2.cpp | 40 +++++++--------------------- radio/src/pulses/pxx2.h | 10 +++---- radio/src/telemetry/frsky_pxx2.cpp | 10 +++---- 5 files changed, 21 insertions(+), 48 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 1a8dff303..334ecfb08 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1928,14 +1928,13 @@ void menuModelReceiverOptions(event_t event) SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + sentModuleChannels(g_moduleIdx), {IF_TELEM_DISPLAYED(0), IF_PWM_RATE_DISPLAYED(0)}); int8_t sub = menuVerticalPosition; - lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); drawReceiverName(FW * 13, 0, reusableBuffer.receiverSetup.receiverId); lcdInvertLine(0); if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == RECEIVER_OK && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 500/*5s*/; - moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_GET_SETTINGS; + moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } #if defined(SIMU) @@ -2005,8 +2004,7 @@ void menuModelReceiverOptions(event_t event) } if (changed) { reusableBuffer.receiverSetup.timeout = 0; - moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SET_SETTINGS; - TRACE("Change detected"); + moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } } else { diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index f3a10572e..086b00e42 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -74,8 +74,7 @@ enum ModuleSettingsMode MODULE_MODE_NORMAL, MODULE_MODE_SPECTRUM_ANALYSER, MODULE_MODE_GET_HARDWARE_INFO, - MODULE_MODE_RECEIVER_SET_SETTINGS, - MODULE_MODE_RECEIVER_GET_SETTINGS, + MODULE_MODE_RECEIVER_SETTINGS, MODULE_MODE_BEEP_FIRST, MODULE_MODE_REGISTER = MODULE_MODE_BEEP_FIRST, MODULE_MODE_BIND, diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 312403408..94483b766 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -145,34 +145,17 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) } } -void Pxx2Pulses::setupReceiverSetSettingsFrame(uint8_t module) +void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) { - TRACE("Sending SET frame"); - addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); - Pxx2Transport::addByte(0x40 + reusableBuffer.receiverSetup.receiverId); - uint8_t flag1 = 0; - if (reusableBuffer.receiverSetup.pwmRate) - flag1 |= PXX2_RECV_OPTION_MASK_FASTPWM; - if (reusableBuffer.receiverSetup.telemetryEnabled) - flag1 |= PXX2_RECV_OPTION_MASK_TELEMETRY; - Pxx2Transport::addByte(flag1); - for (int i = 0; i < 24; i++) { - Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); - } - reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 20/*200ms*/; - reusableBuffer.receiverSetup.state = RECEIVER_WAITING_RESPONSE; // module will be confirming changes - moduleSettings[module].mode = MODULE_MODE_NORMAL; -} - - -void Pxx2Pulses::setupReceiverGetSettingsFrame(uint8_t module) -{ - TRACE("Sending GET frame"); addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); - Pxx2Transport::addByte(0x00); - for (int i = 0; i < 24; i++) { - Pxx2Transport::addByte(0x00); + uint8_t flag1 = 0; + if (reusableBuffer.receiverSetup.pwmRate) + flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; + Pxx2Transport::addByte(flag1); + uint8_t channelsCount = sentModuleChannels(module); + for (int i = 0; i < channelsCount; i++) { + Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); } reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 20/*200ms*/; reusableBuffer.receiverSetup.state = RECEIVER_WAITING_RESPONSE; @@ -253,11 +236,8 @@ void Pxx2Pulses::setupFrame(uint8_t module) case MODULE_MODE_GET_HARDWARE_INFO: setupHardwareInfoFrame(module); break; - case MODULE_MODE_RECEIVER_GET_SETTINGS: - setupReceiverGetSettingsFrame(module); - break; - case MODULE_MODE_RECEIVER_SET_SETTINGS: - setupReceiverSetSettingsFrame(module); + case MODULE_MODE_RECEIVER_SETTINGS: + setupReceiverSettingsFrame(module); break; case MODULE_MODE_REGISTER: setupRegisterFrame(module); diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index fe095e631..497c22066 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -43,11 +43,9 @@ #define PXX2_CHANNELS_FLAG0_FAILSAFE (1 << 6) #define PXX2_CHANNELS_FLAG0_RANGECHECK (1 << 7) -#define PXX2_RECV_OPTION_MASK_FASTPWM 0x10 -#define PXX2_RECV_OPTION_MASK_TELEMETRY 0x00 // Todo : update when defined +#define PXX2_RX_SETTINGS_FLAG1_FASTPWM (1 << 4) +#define PXX2_RECV_OPTION_MASK_TELEMETRY 0x00 // TODO : update when defined -const uint8_t DEFAULT_CHANNEL_MAPPING[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; -const uint8_t CH9TO16_CHANNEL_MAPPING[] = {0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67}; enum PXX2RegisterSteps { REGISTER_START, @@ -120,9 +118,7 @@ class Pxx2Pulses: public PxxPulses { void setupShareMode(uint8_t module); - void setupReceiverSetSettingsFrame(uint8_t module); - - void setupReceiverGetSettingsFrame(uint8_t module); + void setupReceiverSettingsFrame(uint8_t module); void setupChannelsFrame(uint8_t module); diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 866af26c0..e4b617aa0 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -62,14 +62,14 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) { - TRACE("Got Option frame"); - for (uint8_t pin = 0; pin < 24; pin++) { + uint8_t channelsCount = sentModuleChannels(module); + for (uint8_t pin = 0; pin < channelsCount; pin++) { reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; } - if(frame[4] & PXX2_RECV_OPTION_MASK_FASTPWM) + if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FASTPWM) reusableBuffer.receiverSetup.pwmRate = 1; - if(frame[4] & PXX2_RECV_OPTION_MASK_TELEMETRY) - reusableBuffer.receiverSetup.telemetryEnabled = 1; +// if (frame[4] & PXX2_RECV_OPTION_MASK_TELEMETRY) +// reusableBuffer.receiverSetup.telemetryEnabled = 1; reusableBuffer.receiverSetup.state = RECEIVER_OK; reusableBuffer.receiverSetup.timeout = 0; moduleSettings[module].mode = MODULE_MODE_NORMAL; From 9a4f88c2a1108315a0eb07c916dd6e914cad95b8 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 12 Mar 2019 10:20:23 +0100 Subject: [PATCH 289/446] Fix external XJT channels --- radio/src/gui/gui_common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 92200d8ec..7cefb8159 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -117,7 +117,7 @@ void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags=0); // model_setup Defines that are used in all uis in the same way #define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON((uint8_t)1) -#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((isModuleXJT2(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleCrossfire(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) || (isModuleMultimodule(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MM_RF_PROTO_DSM2)) ? (uint8_t)0 : (uint8_t)1) +#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((isModuleDSM2(EXTERNAL_MODULE) || isModuleCrossfire(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) || (isModuleMultimodule(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MM_RF_PROTO_DSM2)) ? (uint8_t)0 : (uint8_t)1) #if defined(MULTIMODULE) From cde023c64beab60b2eb7bf5e6b8d382fc2488158 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Mar 2019 11:13:33 +0100 Subject: [PATCH 290/446] GET / SET RX SETTINGS now working --- radio/src/gui/128x64/model_setup.cpp | 73 +++++++++++++--------------- radio/src/opentx.h | 1 + radio/src/pulses/pxx2.cpp | 31 +++++++----- radio/src/pulses/pxx2.h | 14 +++--- radio/src/telemetry/frsky_pxx2.cpp | 9 +++- 5 files changed, 70 insertions(+), 58 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 334ecfb08..1a694a370 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1932,80 +1932,75 @@ void menuModelReceiverOptions(event_t event) drawReceiverName(FW * 13, 0, reusableBuffer.receiverSetup.receiverId); lcdInvertLine(0); - if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == RECEIVER_OK && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { + if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_READ && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 500/*5s*/; moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } + if (!s_editMode && reusableBuffer.receiverSetup.dirty && (reusableBuffer.receiverSetup.state != RECEIVER_SETTINGS_WRITE || get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { + reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_WRITE; + reusableBuffer.receiverSetup.dirty = 0; + reusableBuffer.receiverSetup.timeout = 0; + reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 100/*1s*/; + moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + #if defined(SIMU) reusableBuffer.receiverSetup.state = 0xFF; #endif - if (reusableBuffer.receiverSetup.state != RECEIVER_WAITING_RESPONSE) { - bool changed = false; + if (reusableBuffer.receiverSetup.state > RECEIVER_SETTINGS_READ) { for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); - uint8_t pin = i - ITEM_RECEIVER_PINMAP_FIRST; - uint8_t channel = reusableBuffer.receiverSetup.channelMapping[pin]; - int32_t channelValue = channelOutputs[channel]; switch (i) { case ITEM_RECEIVER_TELEMETRY: - previousValue = reusableBuffer.receiverSetup.telemetryEnabled; - reusableBuffer.receiverSetup.telemetryEnabled = editCheckBox(reusableBuffer.receiverSetup.telemetryEnabled, RECEIVER_OPTIONS_2ND_COLUMN, y, - "Telemetry", attr, event); - if (previousValue != reusableBuffer.receiverSetup.telemetryEnabled) { - changed = true; - TRACE("TELEM CHANGED (%d , %d)", previousValue, reusableBuffer.receiverSetup.telemetryEnabled); + reusableBuffer.receiverSetup.telemetryEnabled = editCheckBox(reusableBuffer.receiverSetup.telemetryEnabled, RECEIVER_OPTIONS_2ND_COLUMN, y, "Telemetry", attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.receiverSetup.dirty = true; } break; - case ITEM_RECEIVER_PWM_RATE: - previousValue = reusableBuffer.receiverSetup.pwmRate; reusableBuffer.receiverSetup.pwmRate = editCheckBox(reusableBuffer.receiverSetup.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, "9ms PWM", attr, event); - TRACE("pwmRate : %d", reusableBuffer.receiverSetup.pwmRate); - if (previousValue != reusableBuffer.receiverSetup.pwmRate) { - changed = true; - TRACE("pwmRate CHANGED (%d , %d)", previousValue, reusableBuffer.receiverSetup.pwmRate); + if (attr && checkIncDec_Ret) { + reusableBuffer.receiverSetup.dirty = true; } break; default: // Pin - lcdDrawText(0, y, "Pin"); - lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); + { + uint8_t pin = i - ITEM_RECEIVER_PINMAP_FIRST; + uint8_t channel = reusableBuffer.receiverSetup.channelMapping[pin]; + int32_t channelValue = channelOutputs[channel]; + lcdDrawText(0, y, "Pin"); + lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); + putsChn(7 * FW, y, channel + 1, attr); - // Channel - if ((menuVerticalPosition - ITEM_RECEIVER_PINMAP_FIRST)== pin) { - if (s_editMode > 0) { - channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx)); + // Channel + if (attr) { + channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx) - 1); if (checkIncDec_Ret) { reusableBuffer.receiverSetup.channelMapping[pin] = channel; - changed = true; + reusableBuffer.receiverSetup.dirty = true; } } - } - putsChn(7 * FW, y, channel + 1, attr); - // Bargraph + // Bargraph #if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines - lcdDrawRect(LCD_W - 3 - wbar, y + 1, wbar + 1, 4); + lcdDrawRect(LCD_W - 3 - wbar, y + 1, wbar + 1, 4); #endif - const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); - const coord_t xChannel = (channelValue > 0) ? LCD_W - 3 - wbar / 2 : LCD_W - 2 - wbar / 2 - lenChannel; - lcdDrawHorizontalLine(xChannel, y + 2, lenChannel, SOLID, 0); - lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); - break; + const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); + const coord_t xChannel = (channelValue > 0) ? LCD_W - 3 - wbar / 2 : LCD_W - 2 - wbar / 2 - lenChannel; + lcdDrawHorizontalLine(xChannel, y + 2, lenChannel, SOLID, 0); + lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); + break; + } } } - if (changed) { - reusableBuffer.receiverSetup.timeout = 0; - moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - } } else { lcdDrawText(4 * FW, 4 * FH, "Waiting for RX..."); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index ae2a6913e..5aea443df 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1149,6 +1149,7 @@ union ReusableBuffer uint8_t channelMapping[24]; uint8_t telemetryEnabled; uint8_t pwmRate; + uint8_t dirty; } receiverSetup; // 103 bytes diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 94483b766..7e1050ac7 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -147,19 +147,26 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) { - addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); - Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); - uint8_t flag1 = 0; - if (reusableBuffer.receiverSetup.pwmRate) - flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; - Pxx2Transport::addByte(flag1); - uint8_t channelsCount = sentModuleChannels(module); - for (int i = 0; i < channelsCount; i++) { - Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); + if (reusableBuffer.receiverSetup.timeout) { + if (get_tmr10ms() > reusableBuffer.receiverSetup.timeout) { + reusableBuffer.receiverSetup.timeout = 0; + moduleSettings[module].mode = MODULE_MODE_NORMAL; + } + setupChannelsFrame(module); + } + else { + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); + Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); + uint8_t flag1 = 0; + if (reusableBuffer.receiverSetup.pwmRate) + flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; + Pxx2Transport::addByte(flag1); + uint8_t channelsCount = sentModuleChannels(module); + for (int i = 0; i < channelsCount; i++) { + Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); + } + reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 30/*300ms*/; } - reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 20/*200ms*/; - reusableBuffer.receiverSetup.state = RECEIVER_WAITING_RESPONSE; - moduleSettings[module].mode = MODULE_MODE_NORMAL; } void Pxx2Pulses::setupBindFrame(uint8_t module) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 497c22066..a5683a235 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -55,16 +55,18 @@ enum PXX2RegisterSteps { }; enum PXX2BindSteps { - BIND_START, - BIND_RX_NAME_SELECTED, - BIND_WAIT, - BIND_OK + BIND_START, + BIND_RX_NAME_SELECTED, + BIND_WAIT, + BIND_OK }; enum PXX2ReceiverStatus { - RECEIVER_WAITING_RESPONSE, - RECEIVER_OK + RECEIVER_SETTINGS_READ = 0x00, + RECEIVER_SETTINGS_OK, + RECEIVER_SETTINGS_WRITE = 0x40 }; + extern ModuleFifo intmoduleFifo; extern ModuleFifo extmoduleFifo; diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index e4b617aa0..565ff5a27 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -62,15 +62,22 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) { + if (moduleSettings[module].mode != MODULE_MODE_RECEIVER_SETTINGS) { + return; + } + uint8_t channelsCount = sentModuleChannels(module); for (uint8_t pin = 0; pin < channelsCount; pin++) { reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; } + if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FASTPWM) reusableBuffer.receiverSetup.pwmRate = 1; + // if (frame[4] & PXX2_RECV_OPTION_MASK_TELEMETRY) // reusableBuffer.receiverSetup.telemetryEnabled = 1; - reusableBuffer.receiverSetup.state = RECEIVER_OK; + + reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_OK; reusableBuffer.receiverSetup.timeout = 0; moduleSettings[module].mode = MODULE_MODE_NORMAL; } From a8a25293eed8fb8f88c7a844c04dc47a13e0ca7b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Mar 2019 11:29:00 +0100 Subject: [PATCH 291/446] [X3] External S.PORT now working --- radio/src/targets/taranis/hal.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 08ddd6aa8..74be2ed06 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -944,19 +944,26 @@ #endif // S.Port update connector -#if defined(PCBXLITE) +#if defined(PCBX3) + #define SPORT_MAX_BAUDRATE 250000 // not tested + #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOE + #define SPORT_UPDATE_PWR_GPIO GPIOE + #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_15 // PE.15 + #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits + #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits +#elif defined(PCBXLITE) #define SPORT_MAX_BAUDRATE 250000 // not tested #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOD #define SPORT_UPDATE_PWR_GPIO GPIOD #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 - #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits + #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits #elif defined(PCBX7) #define SPORT_MAX_BAUDRATE 250000 // < 400000 #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define SPORT_UPDATE_PWR_GPIO GPIOB #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_2 // PB.02 - #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits + #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits #else #define SPORT_MAX_BAUDRATE 400000 From 1b7695e0c39f33f201784e817bcdb39455300a16 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Mar 2019 11:43:11 +0100 Subject: [PATCH 292/446] [X3] LEDs swapped --- radio/src/targets/taranis/hal.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 74be2ed06..36f031233 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -672,10 +672,10 @@ #define STATUS_LEDS #define GPIO_LED_GPIO_ON GPIO_SetBits #define GPIO_LED_GPIO_OFF GPIO_ResetBits - #define LED_GREEN_GPIO GPIOE - #define LED_GREEN_GPIO_PIN GPIO_Pin_5 // PE.05 #define LED_RED_GPIO GPIOE - #define LED_RED_GPIO_PIN GPIO_Pin_4 // PE.04 + #define LED_RED_GPIO_PIN GPIO_Pin_5 // PE.05 + #define LED_GREEN_GPIO GPIOE + #define LED_GREEN_GPIO_PIN GPIO_Pin_4 // PE.04 #define LED_BLUE_GPIO GPIOE #define LED_BLUE_GPIO_PIN GPIO_Pin_6 // PE.06 #endif @@ -944,14 +944,7 @@ #endif // S.Port update connector -#if defined(PCBX3) - #define SPORT_MAX_BAUDRATE 250000 // not tested - #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOE - #define SPORT_UPDATE_PWR_GPIO GPIOE - #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_15 // PE.15 - #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits - #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits -#elif defined(PCBXLITE) +#if defined(PCBXLITE) #define SPORT_MAX_BAUDRATE 250000 // not tested #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOD #define SPORT_UPDATE_PWR_GPIO GPIOD @@ -965,6 +958,13 @@ #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_2 // PB.02 #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits +#elif defined(PCBX3) + #define SPORT_MAX_BAUDRATE 250000 // not tested + #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOE + #define SPORT_UPDATE_PWR_GPIO GPIOE + #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_15 // PE.15 + #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits + #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits #else #define SPORT_MAX_BAUDRATE 400000 #define SPORT_UPDATE_RCC_AHB1Periph 0 From 79ed9167766d4a63f6899f3aabd0cbbfeece775c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Mar 2019 11:44:12 +0100 Subject: [PATCH 293/446] [X3] HEARTBEAT same as X-Lite --- radio/src/targets/taranis/hal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 36f031233..9a827ad06 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -971,7 +971,7 @@ #endif // Heartbeat -#if defined(PCBXLITE) +#if defined(PCBXLITE) || defined(PCBX3) #define HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOD #define HEARTBEAT_RCC_APB2Periph 0 #define HEARTBEAT_GPIO GPIOD From c8352abd41922a69bc06bf4746f7e6f448a419c4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Mar 2019 11:47:30 +0100 Subject: [PATCH 294/446] [X3] S.PORT power ON / OFF state changed --- radio/src/targets/taranis/hal.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 9a827ad06..5d8f2fdde 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -963,8 +963,8 @@ #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOE #define SPORT_UPDATE_PWR_GPIO GPIOE #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_15 // PE.15 - #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits - #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits + #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_ResetBits + #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_SetBits #else #define SPORT_MAX_BAUDRATE 400000 #define SPORT_UPDATE_RCC_AHB1Periph 0 From 7e213cc787675de1b81d014250b564b3b241b4e8 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 12 Mar 2019 11:54:54 +0100 Subject: [PATCH 295/446] Make flash finished more noticable --- radio/src/io/frsky_device_firmware_update.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp index 9e684d375..973c6d8dc 100644 --- a/radio/src/io/frsky_device_firmware_update.cpp +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -326,6 +326,9 @@ void DeviceFirmwareUpdate::flashFile(const char * filename) if (!result) result = uploadFile(filename); if (!result) result = endTransfer(); + AUDIO_PLAY(AU_SPECIAL_SOUND_BEEP1 ); + BACKLIGHT_ENABLE(); + if (result) { POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR); SET_WARNING_INFO(result, strlen(result), 0); From 9deaa04a715a1ea1ff10ce0f19e6bb7935261cd5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Mar 2019 14:55:33 +0100 Subject: [PATCH 296/446] [GUI] Module choice fixes --- radio/src/gui/gui_common_arm.cpp | 15 +++++++++++---- radio/src/pulses/modules.h | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 0355166d0..8e076a050 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -530,8 +530,15 @@ bool isInternalModuleAvailable(int module) if (module == MODULE_TYPE_NONE) return true; - if ((module == (IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_XJT2 : MODULE_TYPE_XJT)) && !isModulePXX2(EXTERNAL_MODULE)) +#if defined(PXX1) + if (module == MODULE_TYPE_XJT) + return !isModulePXX(EXTERNAL_MODULE); +#endif + +#if defined(PXX2) + if (module == MODULE_TYPE_XJT2) return true; +#endif return false; } @@ -539,7 +546,7 @@ bool isInternalModuleAvailable(int module) bool isExternalModuleAvailable(int module) { #if !defined(PXX1) - if (module == MODULE_TYPE_XJT) { + if (module == MODULE_TYPE_XJT || module == MODULE_TYPE_R9M) { return false; } #endif @@ -568,10 +575,10 @@ bool isExternalModuleAvailable(int module) } #endif #if defined(PCBTARANIS) || defined(PCBHORUS) - if (module == MODULE_TYPE_R9M && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { + if (module == MODULE_TYPE_R9M && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT) { return false; } - if (module == MODULE_TYPE_XJT && g_model.moduleData[INTERNAL_MODULE].type != MODULE_TYPE_NONE) { + if (module == MODULE_TYPE_XJT && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT) { return false; } #endif diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index bf805e9ba..a2ee9e3b0 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -174,7 +174,7 @@ inline bool isModuleR9M_AU_PLUS(uint8_t idx) inline bool isModulePXX(uint8_t idx) { - return isModuleXJT(idx); + return isModuleXJT(idx) || isModuleR9M(idx); } inline bool isModulePXX2(uint8_t idx) From fd012a52c7caa20a4a80acc0f5bde39d48a0be46 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Mar 2019 17:46:27 +0100 Subject: [PATCH 297/446] [Pulses] Refactoring --- radio/src/gui/128x64/model_setup.cpp | 1 + radio/src/io/frsky_device_firmware_update.cpp | 2 +- radio/src/pulses/pulses.cpp | 4 - radio/src/pulses/pulses.h | 5 +- radio/src/pulses/pxx1.cpp | 64 ++++----- .../arm/stm32/intmodule_serial_driver.cpp | 28 ++-- radio/src/targets/horus/board.h | 1 + radio/src/targets/horus/pulses_driver.cpp | 4 +- radio/src/targets/taranis/CMakeLists.txt | 2 +- radio/src/targets/taranis/board.h | 3 +- .../src/targets/taranis/extmodule_driver.cpp | 136 ++++++++---------- .../taranis/intmodule_pulses_driver.cpp | 2 +- radio/src/targets/taranis/pulses_driver.cpp | 2 +- radio/src/tasks.cpp | 16 ++- 14 files changed, 132 insertions(+), 138 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 1a694a370..8e28cdb8a 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1670,6 +1670,7 @@ void menuModelSetup(event_t event) } break; + #if !defined(PCBXLITE) case ITEM_MODEL_EXTERNAL_MODULE_FREQ: { diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp index 973c6d8dc..c2bb0adf1 100644 --- a/radio/src/io/frsky_device_firmware_update.cpp +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -73,7 +73,7 @@ void DeviceFirmwareUpdate::startup() switch(module) { case INTERNAL_MODULE: #if defined(INTMODULE_USART) - intmoduleSerialStart(57600); + intmoduleSerialStart(57600, true); break; #endif diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index eb8325a47..846161850 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -209,11 +209,7 @@ void setupPulsesPXXInternalModule() void setupPulsesPXXExternalModule() { -#if defined(EXTMODULE_USART) - extmodulePulsesData.pxx_uart.setupFrame(EXTERNAL_MODULE); -#elif !defined(INTMODULE_USART) && !defined(EXTMODULE_USART) extmodulePulsesData.pxx.setupFrame(EXTERNAL_MODULE); -#endif } #endif diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 086b00e42..61b46ee64 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -152,12 +152,9 @@ union InternalModulePulsesData { union ExternalModulePulsesData { #if defined(PXX1) - #if defined(INTMODULE_USART) || defined(EXTMODULE_USART) - UartPxx1Pulses pxx_uart; - #endif #if defined(PPM_PIN_SERIAL) SerialPxx1Pulses pxx; - #elif !defined(INTMODULE_USART) || !defined(EXTMODULE_USART) + #else PwmPxx1Pulses pxx; #endif #endif diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 568f9b38b..37d53e771 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -22,38 +22,38 @@ #include "pulses/pxx1.h" const uint16_t Pxx1CrcMixin::CRCTable[] = { - 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, - 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7, - 0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e, - 0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876, - 0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd, - 0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5, - 0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c, - 0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974, - 0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb, - 0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3, - 0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a, - 0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72, - 0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9, - 0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1, - 0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738, - 0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70, - 0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7, - 0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff, - 0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036, - 0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e, - 0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5, - 0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd, - 0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134, - 0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c, - 0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3, - 0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb, - 0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232, - 0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a, - 0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1, - 0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9, - 0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330, - 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78 + 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, + 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7, + 0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e, + 0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876, + 0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd, + 0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5, + 0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c, + 0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974, + 0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb, + 0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3, + 0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a, + 0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72, + 0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9, + 0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1, + 0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738, + 0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70, + 0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7, + 0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff, + 0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036, + 0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e, + 0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5, + 0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd, + 0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134, + 0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c, + 0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3, + 0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb, + 0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232, + 0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a, + 0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1, + 0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9, + 0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330, + 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78 }; template diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 3cfdb2377..15d1f2f13 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -30,10 +30,10 @@ void intmoduleStop() void intmodulePxxStart() { - // shouldn't be used anymore + intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE, false); } -void intmoduleSerialStart(uint32_t baudrate) +void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable) { INTERNAL_MODULE_ON(); @@ -66,11 +66,12 @@ void intmoduleSerialStart(uint32_t baudrate) USART_Init(INTMODULE_USART, &USART_InitStructure); USART_Cmd(INTMODULE_USART, ENABLE); - intmoduleFifo.clear(); - - USART_ITConfig(INTMODULE_USART, USART_IT_RXNE, ENABLE); - NVIC_SetPriority(INTMODULE_USART_IRQn, 6); - NVIC_EnableIRQ(INTMODULE_USART_IRQn); + if (rxEnable) { + intmoduleFifo.clear(); + USART_ITConfig(INTMODULE_USART, USART_IT_RXNE, ENABLE); + NVIC_SetPriority(INTMODULE_USART_IRQn, 6); + NVIC_EnableIRQ(INTMODULE_USART_IRQn); + } } #define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) @@ -119,10 +120,17 @@ void intmoduleSendBuffer(const uint8_t * data, uint8_t size) void intmoduleSendNextFrame() { + switch(moduleSettings[INTERNAL_MODULE].protocol) { #if defined(PXX2) - if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { - intmoduleSendBuffer(intmodulePulsesData.pxx2.getData(), intmodulePulsesData.pxx2.getSize()); - } + case PROTOCOL_CHANNELS_PXX2: + intmoduleSendBuffer(intmodulePulsesData.pxx2.getData(), intmodulePulsesData.pxx2.getSize()); + break; #endif +#if defined(PXX1) + case PROTOCOL_CHANNELS_PXX1: + intmoduleSendBuffer(intmodulePulsesData.pxx_uart.getData(), intmodulePulsesData.pxx_uart.getSize()); + break; +#endif + } } diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 22809098a..4cb9c7a6e 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -212,6 +212,7 @@ void disable_pxx(uint8_t module); void init_pxx2(uint8_t module); void disable_pxx2(uint8_t module); void init_serial(uint8_t module, uint32_t baudrate, uint32_t period_half_us); +void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable); void disable_serial(uint8_t module); void intmoduleSendNextFrame(); void extmoduleSendNextFrame(); diff --git a/radio/src/targets/horus/pulses_driver.cpp b/radio/src/targets/horus/pulses_driver.cpp index a92b65679..f70189cec 100644 --- a/radio/src/targets/horus/pulses_driver.cpp +++ b/radio/src/targets/horus/pulses_driver.cpp @@ -22,7 +22,7 @@ void intmoduleStop(); void intmodulePxxStart(); -void intmoduleSerialStart(uint32_t baudrate); +void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable); void extmoduleStop(); void extmodulePpmStart(); @@ -48,7 +48,7 @@ void disable_ppm(uint8_t module) void init_pxx2(uint8_t module) { if (module == INTERNAL_MODULE) - intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE); + intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE, true); else extmodulePxx2Start(); } diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 1ec29efd5..3471ff424 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -122,7 +122,7 @@ elseif(PCB STREQUAL XLITE) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) elseif(PCB STREQUAL XLITES) - set(PXX_FREQUENCY "HIGH" CACHE STRING "PXX frequency (LOW / HIGH)") + set(PXX_FREQUENCY "HIGH") set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(CPU_TYPE STM32F2) set(CPU_TYPE_FULL STM32F205xE) # for size report diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index ae5c7bc5a..5150e1f89 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -21,6 +21,7 @@ #ifndef _BOARD_H_ #define _BOARD_H_ +#include #include "../definitions.h" #include "cpu_id.h" @@ -180,7 +181,7 @@ void init_serial(uint8_t module, uint32_t baudrate, uint32_t period); void disable_serial(uint8_t module); void intmoduleStop(); void intmodulePxxStart(); -void intmoduleSerialStart(uint32_t baudrate); +void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable); #if defined(TARANIS_INTERNAL_PPM) void intmodulePpmStart(void); #endif diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 72da992ca..31fb234de 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -195,16 +195,18 @@ extern "C" void EXTMODULE_USART_IRQHandler(void) } } -void extmodulePxxStart() -{ - extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE); -} - void extmodulePxx2Start() { extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE); } #else +void extmodulePxx2Start() +{ + // TODO just enable the S.PORT line (or let telemetry init do it) +} +#endif + +#if defined(PXX1) void extmodulePxxStart() { EXTERNAL_MODULE_ON(); @@ -239,90 +241,72 @@ void extmodulePxxStart() NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn); NVIC_SetPriority(EXTMODULE_TIMER_CC_IRQn, 7); } - -void extmodulePxx2Start() -{ - // TODO just enable the S.PORT line (or let telemetry init do it) -} #endif void extmoduleSendNextFrame() { - if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) { - EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2; - EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here - EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance - EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA - EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; - EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.ppm.pulses); - EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.ppm.ptr - extmodulePulsesData.ppm.pulses; - EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA - } + switch(moduleSettings[EXTERNAL_MODULE].protocol) { + case PROTOCOL_CHANNELS_PPM: + EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2; + EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.ppm.pulses); + EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.ppm.ptr - extmodulePulsesData.ppm.pulses; + EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA + break; + #if defined(PXX1) - else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { -#if defined(EXTMODULE_USART) - DMA_InitTypeDef DMA_InitStructure; - DMA_DeInit(EXTMODULE_USART_DMA_STREAM); - DMA_InitStructure.DMA_Channel = EXTMODULE_USART_DMA_CHANNEL; - DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&EXTMODULE_USART->DR); - DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(extmodulePulsesData.pxx_uart.getData()); - DMA_InitStructure.DMA_BufferSize = extmodulePulsesData.pxx_uart.getSize(); - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; - DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; - DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; - DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; - DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; - DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - DMA_Init(EXTMODULE_USART_DMA_STREAM, &DMA_InitStructure); - DMA_Cmd(EXTMODULE_USART_DMA_STREAM, ENABLE); - USART_DMACmd(EXTMODULE_USART, USART_DMAReq_Tx, ENABLE); - EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; -#else - EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance - EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA - EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; - EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData()); - EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); - EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA -#endif - } + case PROTOCOL_CHANNELS_PXX1: + EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance + EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData()); + EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); + EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA + break; #endif + #if defined(PXX2) - else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { - #if defined(EXTMODULE_USART) - extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); - #else - sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); - #endif - } + case PROTOCOL_CHANNELS_PXX2: + #if defined(EXTMODULE_USART) + extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); + #else + sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); + #endif + break; #endif + #if defined(DSM2) - else if (IS_DSM2_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) { - if (IS_SBUS_PROTOCOL(moduleSettings[EXTERNAL_MODULE].protocol)) + case PROTOCOL_CHANNELS_SBUS: EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // reverse polarity for Sbus if needed - EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance - EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA - EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; - EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); - EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses; - EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA - } + // no break + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: + case PROTOCOL_CHANNELS_MULTIMODULE: + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); + EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses; + EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA + break; #endif + #if defined(CROSSFIRE) - else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_CROSSFIRE) { - sportSendBuffer(extmodulePulsesData.crossfire.pulses, extmodulePulsesData.crossfire.length); - } + case PROTOCOL_CHANNELS_CROSSFIRE: + sportSendBuffer(extmodulePulsesData.crossfire.pulses, extmodulePulsesData.crossfire.length); + break; #endif - else { - EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; + + default: + EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; + break; } } diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 5150fe296..49144f288 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -65,7 +65,7 @@ void intmoduleSendNextFrame() } } -void intmoduleSerialStart(uint32_t baudrate) +void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable) { // nothing, the pulses will be sent through telemetry port } diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index 1dd39fc43..11f483c07 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -39,7 +39,7 @@ void disable_pxx(uint8_t module) void init_pxx2(uint8_t module) { if (module == INTERNAL_MODULE) - intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE); + intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE, true); else extmodulePxx2Start(); } diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 4488cb1ac..a058196b7 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -73,16 +73,22 @@ bool isForcePowerOffRequested() return false; } -bool isProtocolSynchronous(uint8_t protocol) +bool isModuleSynchronous(uint8_t module) { - return (protocol == PROTOCOL_CHANNELS_PXX2 || protocol == PROTOCOL_CHANNELS_CROSSFIRE || protocol == PROTOCOL_CHANNELS_NONE); + uint8_t protocol = moduleSettings[module].protocol; + if (protocol == PROTOCOL_CHANNELS_PXX2 || protocol == PROTOCOL_CHANNELS_CROSSFIRE || protocol == PROTOCOL_CHANNELS_NONE) + return true; +#if defined(INTMODULE_USART) + if (protocol == PROTOCOL_CHANNELS_PXX1 && module == INTERNAL_MODULE) + return true; +#endif + return false; } void sendSynchronousPulses() { for (uint8_t module = 0; module < NUM_MODULES; module++) { - uint8_t protocol = moduleSettings[module].protocol; - if (isProtocolSynchronous(protocol) && setupPulses(module)) { + if (isModuleSynchronous(module) && setupPulses(module)) { if (module == INTERNAL_MODULE) intmoduleSendNextFrame(); else @@ -184,7 +190,7 @@ void scheduleNextMixerCalculation(uint8_t module, uint16_t period_ms) { // Schedule next mixer calculation time, - if (isProtocolSynchronous(moduleSettings[module].protocol)) { + if (isModuleSynchronous(module)) { nextMixerTime[module] += period_ms / RTOS_MS_PER_TICK; if (nextMixerTime[module] < RTOS_GET_TIME()) { // we are late ... let's add some small delay From d3af7fca5d9625e5beffc8edd14cdcf63cdb1f06 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Mar 2019 18:20:55 +0100 Subject: [PATCH 298/446] [Pulses] PXX2 Probe warning --- radio/src/gui/gui_common_arm.cpp | 4 ++-- .../arm/stm32/intmodule_serial_driver.cpp | 1 + radio/src/targets/horus/board.cpp | 8 ++++--- radio/src/targets/horus/board.h | 6 +---- radio/src/targets/taranis/board.cpp | 5 ++++ radio/src/targets/taranis/board.h | 24 ++++++++++--------- 6 files changed, 27 insertions(+), 21 deletions(-) diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 8e076a050..4dcc5bfd3 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -532,12 +532,12 @@ bool isInternalModuleAvailable(int module) #if defined(PXX1) if (module == MODULE_TYPE_XJT) - return !isModulePXX(EXTERNAL_MODULE); + return !IS_PXX2_INTERNAL_ENABLED() && !isModulePXX(EXTERNAL_MODULE); #endif #if defined(PXX2) if (module == MODULE_TYPE_XJT2) - return true; + return IS_PXX2_INTERNAL_ENABLED(); #endif return false; diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 15d1f2f13..54b0ad1e8 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -85,6 +85,7 @@ extern "C" void INTMODULE_USART_IRQHandler(void) intmoduleFifo.errors++; } else { + hardwareOptions.pxx2Enabled = true; intmoduleFifo.push(data); } status = INTMODULE_USART->SR; diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 046e8e065..1ab46c814 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -182,9 +182,6 @@ void boardInit() pwrInit(); delaysInit(); - // FrSky removed the volume chip in latest board, that's why it doesn't answer! - // i2cInit(); - #if defined(DEBUG) serial2Init(0, 0); // default serial mode (None if DEBUG not defined) #endif @@ -194,6 +191,11 @@ void boardInit() TRACE("\nHorus board started :)"); TRACE("RCC->CSR = %08x", RCC->CSR); +#if defined(PXX2) + #warning "PXX2 probe is not implemented" + hardwareOptions.pxx2Enabled = true; +#endif + audioInit(); // we need to initialize g_FATFS_Obj here, because it is in .ram section (because of DMA access) diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 4cb9c7a6e..6de854c8a 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -199,11 +199,7 @@ PACK(typedef struct { extern HardwareOptions hardwareOptions; -#if defined(PCBX10) - #define IS_PXX2_INTERNAL_ENABLED() (true) -#else - #define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) -#endif +#define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) void init_ppm(uint8_t module); void disable_ppm(uint8_t module); diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 26c963ec9..4a9b60f38 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -169,6 +169,11 @@ void boardInit() bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE); #endif +#if !defined(PCBXLITES) && !defined(PCBX3) && defined(PXX2) + #warning "PXX2 probe is not implemented" + hardwareOptions.pxx2Enabled = true; +#endif + #if !defined(PCBX9E) // some X9E boards need that the pwrInit() is moved a little bit later pwrInit(); diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 5150e1f89..22cb8d710 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -462,15 +462,6 @@ enum Analogs { #define NUM_MOUSE_ANALOGS 0 #define NUM_DUMMY_ANAS 0 -PACK(typedef struct { -#if defined(STICKS_PWM) - uint8_t sticksPwmDisabled:1; -#endif - uint8_t pxx2Enabled:1; -}) HardwareOptions; - -extern HardwareOptions hardwareOptions; - #if defined(STICKS_PWM) #define NUM_PWMSTICKS 4 #define STICKS_PWM_ENABLED() (!hardwareOptions.sticksPwmDisabled) @@ -482,10 +473,21 @@ extern HardwareOptions hardwareOptions; #define NUM_TRIMS_KEYS 8 #endif -#if defined(PCBXLITES) || defined(DEBUG) +PACK(typedef struct { +#if NUM_PWMSTICKS > 0 + uint8_t sticksPwmDisabled:1; +#endif + uint8_t pxx2Enabled:1; +}) HardwareOptions; + +extern HardwareOptions hardwareOptions; + +#if !defined(PXX2) + #define IS_PXX2_INTERNAL_ENABLED() (false) +#elif defined(PCBXLITES) || defined(PCBX3) || defined(SIMU) #define IS_PXX2_INTERNAL_ENABLED() (true) #else - #define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) + #define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) #endif enum CalibratedAnalogs { From 98551c4ccc31c6a232d7ba00e2520e98c77e337d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Mar 2019 18:21:20 +0100 Subject: [PATCH 299/446] Cosmetics --- radio/src/targets/taranis/board.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 22cb8d710..5894618f4 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -487,7 +487,7 @@ extern HardwareOptions hardwareOptions; #elif defined(PCBXLITES) || defined(PCBX3) || defined(SIMU) #define IS_PXX2_INTERNAL_ENABLED() (true) #else - #define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) + #define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) #endif enum CalibratedAnalogs { From 9e3f2bb3b9b41f76f0c5de72d79d06eb22280cb3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Mar 2019 18:22:19 +0100 Subject: [PATCH 300/446] Cosmetics --- radio/src/targets/taranis/board.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 5894618f4..754fef138 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -475,9 +475,9 @@ enum Analogs { PACK(typedef struct { #if NUM_PWMSTICKS > 0 - uint8_t sticksPwmDisabled:1; + uint8_t sticksPwmDisabled:1; #endif - uint8_t pxx2Enabled:1; + uint8_t pxx2Enabled:1; }) HardwareOptions; extern HardwareOptions hardwareOptions; From c2bd7e281dffcc2733b8549e1a222ad34312223f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 12 Mar 2019 18:58:14 +0100 Subject: [PATCH 301/446] Compilation fix --- radio/src/targets/taranis/pulses_driver.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index 11f483c07..ffe444875 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -22,10 +22,12 @@ void init_pxx(uint8_t module) { +#if defined(PXX1) if (module == INTERNAL_MODULE) intmodulePxxStart(); else extmodulePxxStart(); +#endif } void disable_pxx(uint8_t module) From 5b7dc2a692b3dad85fc5dbc9cdaec50ebee98810 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 08:31:24 +0100 Subject: [PATCH 302/446] [X3] Always PXX_FREQUENCY_HIGH --- radio/src/targets/taranis/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 3471ff424..6058e3271 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -85,6 +85,7 @@ elseif(PCB STREQUAL X7) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) elseif(PCB STREQUAL X3) + set(PXX_FREQUENCY "HIGH") set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(CPU_TYPE STM32F2) set(CPU_TYPE_FULL STM32F205xE) # for size report @@ -103,7 +104,7 @@ elseif(PCB STREQUAL X3) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) elseif(PCB STREQUAL XLITE) - set(PXX_FREQUENCY "HIGH" CACHE STRING "PXX frequency (LOW / HIGH)") + set(PXX_FREQUENCY "HIGH" CACHE STRING "PXX frequency (LOW / HIGH)") # always use HIGH except on some prototype boards set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(CPU_TYPE STM32F2) set(CPU_TYPE_FULL STM32F205xE) # for size report From 0309b1ee84ca0fdf7da8f6c5119f3729390896b6 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 09:07:05 +0100 Subject: [PATCH 303/446] [X3 / X7] Fixes (still need to understand why ...) --- radio/src/gui/128x64/model_setup.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 8e28cdb8a..aebb0836f 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -20,6 +20,13 @@ #include +// TODO find why we need this (for REGISTER at least) +#if defined(PCBXLITE) + #define EVT_BUTTON_PRESSED() EVT_KEY_FIRST(KEY_ENTER) +#else + #define EVT_BUTTON_PRESSED() EVT_KEY_BREAK(KEY_ENTER) +#endif + #warning "TODO remove it" uint8_t g_moduleIdx; @@ -340,7 +347,7 @@ void runPopupRegister(event_t event) if (warningText) { const uint8_t dialogRows[] = { 0, uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? READONLY_ROW : 0), uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? 0 : 1)}; - check(event, 0, nullptr, 0, dialogRows, 2, 2); + check(event, 0, nullptr, 0, dialogRows, 2, 3 - HEADER_LINE); // TODO add a comment for 3 - HEADER_LINE once understood drawMessageBox(); @@ -1216,7 +1223,7 @@ void menuModelSetup(event_t event) lcdDrawText(lcdLastRightPos + 3, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0)); if (attr) { if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) { - if (menuHorizontalPosition == 0 && event == EVT_KEY_FIRST(KEY_ENTER)) { + if (menuHorizontalPosition == 0 && event == EVT_BUTTON_PRESSED()) { startRegisterDialog(moduleIdx); } else if (menuHorizontalPosition == 1) { From b62ab2bd6263d714d45333a7d2e0e3561715ac58 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 09:57:11 +0100 Subject: [PATCH 304/446] Missing initialization on module type change XJT / R9M should not reboot (still not tested) --- radio/src/gui/128x64/model_setup.cpp | 37 ++++++++++++------- radio/src/io/frsky_pxx2.h | 4 -- radio/src/pulses/modules.h | 2 +- radio/src/pulses/pulses.cpp | 4 +- radio/src/pulses/pxx.h | 20 ++++++---- radio/src/pulses/pxx1.cpp | 16 +++++--- radio/src/pulses/pxx1.h | 6 +-- .../src/targets/taranis/extmodule_driver.cpp | 4 +- radio/src/telemetry/telemetry.cpp | 2 +- 9 files changed, 55 insertions(+), 40 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index aebb0836f..c441f5da8 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -910,7 +910,13 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_MODE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, attr); if (attr) { - g_model.moduleData[INTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable); + uint8_t moduleType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable); + if (checkIncDec_Ret) { + // TODO this code should be common, in module.h (X10_new_UI branch) + memclear(&g_model.moduleData[INTERNAL_MODULE], sizeof(ModuleData)); + g_model.moduleData[INTERNAL_MODULE].type = moduleType; + g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); + } } break; #endif @@ -951,19 +957,22 @@ void menuModelSetup(event_t event) if (attr && editMode > 0) { switch (menuHorizontalPosition) { case 0: - g_model.moduleData[EXTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, - MODULE_TYPE_NONE, - IS_TRAINER_EXTERNAL_MODULE() ? MODULE_TYPE_NONE : - MODULE_TYPE_COUNT - 1, EE_MODEL, - isExternalModuleAvailable); - if (checkIncDec_Ret) { - g_model.moduleData[EXTERNAL_MODULE].rfProtocol = 0; - g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; - g_model.moduleData[EXTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(EXTERNAL_MODULE); - if (isModuleSBUS(EXTERNAL_MODULE)) - g_model.moduleData[EXTERNAL_MODULE].sbus.refreshRate = -31; - if (isModulePPM(EXTERNAL_MODULE)) - SET_DEFAULT_PPM_FRAME_LENGTH(EXTERNAL_MODULE); + { + uint8_t moduleType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, + MODULE_TYPE_NONE, + IS_TRAINER_EXTERNAL_MODULE() ? MODULE_TYPE_NONE : + MODULE_TYPE_COUNT - 1, EE_MODEL, + isExternalModuleAvailable); + if (checkIncDec_Ret) { + // TODO this code should be common, in module.h (X10_new_UI branch) + memclear(&g_model.moduleData[EXTERNAL_MODULE], sizeof(ModuleData)); + g_model.moduleData[EXTERNAL_MODULE].type = moduleType; + g_model.moduleData[EXTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(EXTERNAL_MODULE); + if (isModuleSBUS(EXTERNAL_MODULE)) + g_model.moduleData[EXTERNAL_MODULE].sbus.refreshRate = -31; + if (isModulePPM(EXTERNAL_MODULE)) + SET_DEFAULT_PPM_FRAME_LENGTH(EXTERNAL_MODULE); + } } break; case 1: diff --git a/radio/src/io/frsky_pxx2.h b/radio/src/io/frsky_pxx2.h index 9149c9891..01e50fdc3 100644 --- a/radio/src/io/frsky_pxx2.h +++ b/radio/src/io/frsky_pxx2.h @@ -23,10 +23,6 @@ #include "../fifo.h" -#define PXX2_BAUDRATE 230400 -#define PXX2_PERIOD 4 // 4ms -#define PXX2_FRAME_MAXLENGTH 64 - class ModuleFifo : public Fifo { public: bool getFrame(uint8_t * frame) diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index a2ee9e3b0..abfd47783 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -200,7 +200,7 @@ inline bool isModuleDSM2(uint8_t idx) #endif // order is the same as in enum Protocols in myeeprom.h (none, ppm, pxx, pxx2, dsm, crossfire, multi, r9m, r9m2, sbus) -static const int8_t maxChannelsModules[] = { 0, 8, 8, 16, -2, 8, 4, 8, 16, 8}; // relative to 8! +static const int8_t maxChannelsModules[] = { 0, 8, 8, 8, -2, 8, 4, 8, 16, 8}; // relative to 8! static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 846161850..a2afa462d 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -219,7 +219,7 @@ void setupPulsesInternalModule(uint8_t protocol) #if defined(PXX1) case PROTOCOL_CHANNELS_PXX1: setupPulsesPXXInternalModule(); - scheduleNextMixerCalculation(INTERNAL_MODULE, PXX_PERIOD); + scheduleNextMixerCalculation(INTERNAL_MODULE, INTMODULE_PXX_PERIOD); break; #endif @@ -248,7 +248,7 @@ void setupPulsesExternalModule(uint8_t protocol) #if defined(PXX1) case PROTOCOL_CHANNELS_PXX1: setupPulsesPXXExternalModule(); - scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX_PERIOD); + scheduleNextMixerCalculation(EXTERNAL_MODULE, EXTMODULE_PXX_PERIOD); break; #endif diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 89993a8c4..ec9d1dad8 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -27,16 +27,22 @@ #define PXX_SEND_FAILSAFE (1 << 4) #define PXX_SEND_RANGECHECK (1 << 5) +#define PXX2_ON_SPORT_BAUDRATE 230400 +#define PXX2_PERIOD 4 // 4ms +#define PXX2_FRAME_MAXLENGTH 64 + +#define EXTMODULE_PXX_PERIOD 9/*ms*/ + #if defined(PXX_FREQUENCY_HIGH) - #define EXTMODULE_USART_PXX_BAUDRATE 450000 #define INTMODULE_USART_PXX_BAUDRATE 450000 - #define PXX_PERIOD 4/*ms*/ + #define INTMODULE_PXX_PERIOD 4/*ms*/ #else - #define EXTMODULE_USART_PXX_BAUDRATE 115200 #define INTMODULE_USART_PXX_BAUDRATE 115200 - #define PXX_PERIOD 9/*ms*/ + #define INTMODULE_PXX_PERIOD 9/*ms*/ #endif +#define EXTMODULE_USART_PXX2_BAUDRATE 450000 + #if defined(PXX_FREQUENCY_HIGH) && (!defined(INTMODULE_USART) || !defined(EXTMODULE_USART)) /* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */ /* DSM2 uses 2 header + 12 channel bytes, with max 10 changes (8n2) per byte + 16 bits trailer ~= 156 max pulses */ @@ -56,7 +62,7 @@ class SerialPxxBitTransport: public DataBuffer { uint8_t byte; uint8_t bits_count; - void initFrame() + void initFrame(uint32_t period) { initBuffer(); byte = 0; @@ -97,10 +103,10 @@ class PwmPxxBitTransport: public PulsesBuffer { protected: uint16_t rest; - void initFrame() + void initFrame(uint32_t period) { initBuffer(); - rest = PXX_PERIOD_HALF_US; + rest = period * 2000; // 0.5uS (2Mhz) } void addPart(uint8_t value) diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 37d53e771..86e05a615 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -216,20 +216,24 @@ void Pxx1Pulses::add8ChannelsFrame(uint8_t module, uint8_t sendUpp template void Pxx1Pulses::setupFrame(uint8_t module) { - PxxTransport::initFrame(); + PxxTransport::initFrame(module == INTERNAL_MODULE ? INTMODULE_PXX_PERIOD : EXTMODULE_PXX_PERIOD); #if defined(PXX_FREQUENCY_HIGH) - add8ChannelsFrame(module, 0); - if (sentModuleChannels(module) > 8) { - add8ChannelsFrame(module, 8); + if (module == INTERNAL_MODULE) { + add8ChannelsFrame(module, 0); + if (sentModuleChannels(module) > 8) { + add8ChannelsFrame(module, 8); + } + return; } -#else +#endif + uint8_t sendUpperChannels = 0; if (moduleSettings[module].counter & 0x01) { sendUpperChannels = g_model.moduleData[module].channelsCount; } + add8ChannelsFrame(module, sendUpperChannels); -#endif } template class Pxx1Pulses >; diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index 99480efe6..600a1cb4d 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -44,9 +44,9 @@ class StandardPxx1Transport: public BitTransport, public Pxx1CrcMixin { protected: uint8_t ones_count; - void initFrame() + void initFrame(uint32_t period) { - BitTransport::initFrame(); + BitTransport::initFrame(period); ones_count = 0; } @@ -93,7 +93,7 @@ class StandardPxx1Transport: public BitTransport, public Pxx1CrcMixin { class UartPxx1Transport: public DataBuffer, public Pxx1CrcMixin { protected: - void initFrame() + void initFrame(uint32_t period) { initBuffer(); } diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 31fb234de..b3f0fd6a2 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -197,7 +197,7 @@ extern "C" void EXTMODULE_USART_IRQHandler(void) void extmodulePxx2Start() { - extmoduleInvertedSerialStart(EXTMODULE_USART_PXX_BAUDRATE); + extmoduleInvertedSerialStart(EXTMODULE_USART_PXX2_BAUDRATE); } #else void extmodulePxx2Start() @@ -223,7 +223,7 @@ void extmodulePxxStart() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - EXTMODULE_TIMER->ARR = PXX_PERIOD_HALF_US; + EXTMODULE_TIMER->ARR = EXTMODULE_PXX_PERIOD * 2000; // 0.5uS (2Mhz) EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | EXTMODULE_TIMER_OUTPUT_POLARITY; // polarity, default low EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; // Enable outputs EXTMODULE_TIMER->CCR1 = 18; diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 56f0a3178..6d4f97eb8 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -288,7 +288,7 @@ void telemetryInit(uint8_t protocol) #endif else if (protocol == PROTOCOL_TELEMETRY_PXX2) { - telemetryPortInit(PXX2_BAUDRATE, TELEMETRY_SERIAL_WITHOUT_DMA); + telemetryPortInit(PXX2_ON_SPORT_BAUDRATE, TELEMETRY_SERIAL_WITHOUT_DMA); #if defined(LUA) outputTelemetryBufferSize = 0; outputTelemetryBufferTrigger = 0x7E; From ae6b023ffbef49fb2ed76db4857ca22bc238adbd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 11:17:36 +0100 Subject: [PATCH 305/446] Stupid one! --- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/pulses/modules.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index c441f5da8..7452a9b5f 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1307,7 +1307,7 @@ void menuModelSetup(event_t event) if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - uint8_t receiverSlot = g_model.moduleData[g_moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; + uint8_t receiverSlot = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; memclear(&reusableBuffer.receiverSetup, sizeof(reusableBuffer.receiverSetup)); reusableBuffer.receiverSetup.moduleIdx = moduleIdx; reusableBuffer.receiverSetup.receiverId = receiverSlot; diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index abfd47783..f96b1e96f 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -200,7 +200,7 @@ inline bool isModuleDSM2(uint8_t idx) #endif // order is the same as in enum Protocols in myeeprom.h (none, ppm, pxx, pxx2, dsm, crossfire, multi, r9m, r9m2, sbus) -static const int8_t maxChannelsModules[] = { 0, 8, 8, 8, -2, 8, 4, 8, 16, 8}; // relative to 8! +static const int8_t maxChannelsModules[] = { 0, 8, 8, 8, -2, 8, 4, 8, 8, 8}; // relative to 8! static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; From ab2c5870e9c1bb3d9510c9101ee45acdbc45f73d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 11:45:59 +0100 Subject: [PATCH 306/446] [X3] Fixes --- radio/src/targets/taranis/hal.h | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 5d8f2fdde..7feb82e9e 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -191,7 +191,7 @@ #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_10 // PD.10 #define SWITCHES_GPIO_REG_A_L GPIOD->IDR #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_14 // PD.14 -#elif defined(PCBXLITE) +#elif defined(PCBXLITE) || defined(PCBX3) #define SWITCHES_GPIO_REG_A_H GPIOE->IDR #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_1 // PE.01 #define SWITCHES_GPIO_REG_A_L GPIOE->IDR @@ -201,16 +201,11 @@ #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_7 // PE.07 #define SWITCHES_GPIO_REG_A_H GPIOE->IDR #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_13 // PE.13 -#elif defined(PCBX3) - #define SWITCHES_GPIO_REG_A_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_7 // PE.07 - #define SWITCHES_GPIO_REG_A_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_13 // PE.13 #else - #define SWITCHES_GPIO_REG_A_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_0 // PE.00 + #define SWITCHES_GPIO_REG_A_H GPIOB->IDR + #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_5 // PB.05 #define SWITCHES_GPIO_REG_A_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_1 // PE.01 + #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_0 // PE.00 #endif #if defined(PCBX9E) @@ -245,7 +240,7 @@ #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_13 // PF.13 #define SWITCHES_GPIO_REG_C_L GPIOF->IDR #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_14 // PF.14 -#elif defined(PCBXLITE) +#elif defined(PCBXLITE) || defined(PCBX3) #define SWITCHES_GPIO_REG_C_L GPIOE->IDR #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_2 // PE.02 #define SWITCHES_GPIO_REG_C_H GPIOE->IDR @@ -255,11 +250,6 @@ #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_11 // PD.11 #define SWITCHES_GPIO_REG_C_H GPIOE->IDR #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_0 // PE.00 -#elif defined(PCBX3) - #define SWITCHES_GPIO_REG_C_L GPIOE->IDR - #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_2 // PE.02 - #define SWITCHES_GPIO_REG_C_H GPIOE->IDR - #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_3 // PE.03 #else #define SWITCHES_GPIO_REG_C_H GPIOE->IDR #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_15 // PE.15 From 00b70da66a1e9d63e462cc83d8320a0bd4837a7a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 13:54:47 +0100 Subject: [PATCH 307/446] BACKLIGHT=OFF will take effect immediately --- radio/src/opentx.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 681ac3079..aa80479b1 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -710,7 +710,6 @@ void checkBacklight() { static uint8_t tmr10ms ; - uint8_t x = g_blinkTmr10ms; if (tmr10ms != x) { tmr10ms = x; @@ -721,13 +720,12 @@ void checkBacklight() } } - bool backlightOn = (g_eeGeneral.backlightMode == e_backlight_mode_on || lightOffCounter || isFunctionActive(FUNCTION_BACKLIGHT)); + bool backlightOn = (g_eeGeneral.backlightMode == e_backlight_mode_on || (g_eeGeneral.backlightMode != e_backlight_mode_off && lightOffCounter) || isFunctionActive(FUNCTION_BACKLIGHT)); if (flashCounter) backlightOn = !backlightOn; if (backlightOn) BACKLIGHT_ENABLE(); else BACKLIGHT_DISABLE(); - } } From ee9ee3dac353832a6cc26f3adeb27a73755d17b3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 13:57:00 +0100 Subject: [PATCH 308/446] [X3] Rotary encoder inverted --- radio/src/targets/taranis/hal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 7feb82e9e..eccf0c6ff 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -94,7 +94,7 @@ #define ENC_GPIO GPIOE #define ENC_GPIO_PIN_A GPIO_Pin_10 // PE.10 #define ENC_GPIO_PIN_B GPIO_Pin_12 // PE.12 - #define ROTARY_ENCODER_POSITION() (((ENC_GPIO->IDR >> 11) & 0x02) + ((ENC_GPIO->IDR >> 10) & 0x01)) + #define ROTARY_ENCODER_POSITION() (((ENC_GPIO->IDR >> 12) & 0x01) + ((ENC_GPIO->IDR >> 9) & 0x02)) #endif // This is for SIMU: reuse rotary encoder pins to map UP and DOWN keyboard keys From c469794753a87cadb427163d5451107de43bcdcb Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 13:59:24 +0100 Subject: [PATCH 309/446] [X3 / X-Lite] Internal module was never powered off --- .../common/arm/stm32/intmodule_serial_driver.cpp | 13 ++++++++++++- radio/src/targets/horus/board.h | 8 +++++++- radio/src/targets/taranis/board.h | 6 +++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 54b0ad1e8..6cfaa327e 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -24,8 +24,19 @@ ModuleFifo intmoduleFifo; void intmoduleStop() { - INTERNAL_MODULE_OFF(); + GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN); + INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = INTMODULE_TX_GPIO_PIN | INTMODULE_RX_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_Init(INTMODULE_GPIO, &GPIO_InitStructure); + + GPIO_ResetBits(INTMODULE_GPIO, INTMODULE_TX_GPIO_PIN | INTMODULE_RX_GPIO_PIN); } void intmodulePxxStart() diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 6de854c8a..962f8455d 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -184,7 +184,13 @@ void SDRAM_Init(void); // Pulses driver #define INTERNAL_MODULE_ON() GPIO_SetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) -#define INTERNAL_MODULE_OFF() GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) + +#if defined(INTMODULE_USART) + #define INTERNAL_MODULE_OFF() intmoduleStop() +#else + #define INTERNAL_MODULE_OFF() GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) +#endif + #define EXTERNAL_MODULE_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 754fef138..b1c3cb4dc 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -165,7 +165,11 @@ uint32_t isBootloaderStart(const uint8_t * buffer); // Pulses driver #define INTERNAL_MODULE_ON() GPIO_SetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) -#define INTERNAL_MODULE_OFF() GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) +#if defined(INTMODULE_USART) + #define INTERNAL_MODULE_OFF() intmoduleStop() +#else + #define INTERNAL_MODULE_OFF() GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) +#endif #define EXTERNAL_MODULE_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET) From c2eb542d15619407be2709f8738a93f2a0569b3b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 14:00:19 +0100 Subject: [PATCH 310/446] PXX2 BIND could not stop on [EXIT] key pressed --- radio/src/gui/128x64/model_setup.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 7452a9b5f..59b6fcaf3 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1341,8 +1341,7 @@ void menuModelSetup(event_t event) reusableBuffer.moduleSetup.pxx2.bindReceiverId = receiverSlot; moduleSettings[moduleIdx].mode ^= MODULE_MODE_BIND; } - if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) { - s_editMode = 1; + if (s_editMode) { if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_START && reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount > 0) { popupMenuItemsCount = min(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); for (uint8_t i=0; i Date: Wed, 13 Mar 2019 14:25:31 +0100 Subject: [PATCH 311/446] [X3] Only one POT --- radio/src/targets/taranis/board.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index b1c3cb4dc..cb89f7578 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -438,8 +438,10 @@ enum Analogs { STICK4, POT_FIRST, POT1 = POT_FIRST, +#if defined(PCBX3) + POT_LAST = POT1, +#elif defined(PCBXLITE) || defined(PCBX7) POT2, -#if defined(PCBX7) || defined(PCBXLITE) POT_LAST = POT2, #elif defined(PCBX9E) POT3, From 1b964702eb872ea04c82cc0fc0ce0aed4bee263a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 14:45:58 +0100 Subject: [PATCH 312/446] [PXX2] BIND should be working again --- radio/src/gui/128x64/model_setup.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 59b6fcaf3..c520ff872 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1341,7 +1341,11 @@ void menuModelSetup(event_t event) reusableBuffer.moduleSetup.pxx2.bindReceiverId = receiverSlot; moduleSettings[moduleIdx].mode ^= MODULE_MODE_BIND; } - if (s_editMode) { + else if (event == EVT_KEY_BREAK(KEY_EXIT)) { + moduleSettings[moduleIdx].mode &= ~MODULE_MODE_BIND; + } + if (moduleSettings[moduleIdx].mode == MODULE_MODE_BIND) { + s_editMode = 1; if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_START && reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount > 0) { popupMenuItemsCount = min(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); for (uint8_t i=0; i Date: Wed, 13 Mar 2019 15:47:30 +0100 Subject: [PATCH 313/446] [X3] Analog fixes --- radio/src/targets/common/arm/stm32/adc_driver.cpp | 5 +---- radio/src/targets/taranis/hal.h | 12 +++++------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index 018c2e987..1503ae5f2 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -53,9 +53,6 @@ #define FIRST_ANALOG_ADC 0 #define NUM_ANALOGS_ADC 10 #define NUM_ANALOGS_ADC_EXT (NUM_ANALOGS - 10) -#elif defined(PCBX3) - #define FIRST_ANALOG_ADC 0 - #define NUM_ANALOGS_ADC NUM_ANALOGS #else #define FIRST_ANALOG_ADC 0 #define NUM_ANALOGS_ADC NUM_ANALOGS @@ -93,7 +90,7 @@ void adcInit() ADC_MAIN->CR1 = ADC_CR1_SCAN; ADC_MAIN->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; - ADC_MAIN->SQR1 = (NUM_ANALOGS_ADC-1) << 20; // bits 23:20 = number of conversions + ADC_MAIN->SQR1 = (NUM_ANALOGS_ADC - 1) << 20; // bits 23:20 = number of conversions #if defined(PCBX10) if (STICKS_PWM_ENABLED()) { diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index eccf0c6ff..9054b148d 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -571,7 +571,7 @@ #define ADC_CHANNEL_POT2 ADC_Channel_8 #define ADC_CHANNEL_BATT ADC_Channel_10 #elif defined(PCBX3) - #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) + #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 @@ -582,14 +582,12 @@ #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 #define ADC_CHANNEL_STICK_LV ADC_Channel_2 // ADC1_IN2 #define ADC_CHANNEL_STICK_LH ADC_Channel_3 // ADC1_IN3 - #define ADC_GPIO_PIN_POT1 GPIO_Pin_1 // PC.01 OK - #define ADC_GPIO_PIN_POT2 GPIO_Pin_0 // PB.00 - #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 OK + #define ADC_GPIO_PIN_POT1 GPIO_Pin_1 // PC.01 + #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 #define ADC_GPIOA_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) #define ADC_GPIOC_PINS (GPIO_Pin_0 | GPIO_Pin_1) - #define ADC_CHANNEL_POT1 ADC_Channel_6 - #define ADC_CHANNEL_POT2 ADC_Channel_8 - #define ADC_CHANNEL_BATT ADC_Channel_10 + #define ADC_CHANNEL_POT1 ADC_Channel_11 // ADC1_IN11 + #define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10 #else #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 From 1aed951571f41221c3a95d419a915afe15e94930 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 16:49:11 +0100 Subject: [PATCH 314/446] [X3] More fixes --- radio/src/gui/128x64/radio_diagkeys.cpp | 2 +- radio/src/gui/128x64/radio_hardware.cpp | 22 +++++++++++++++---- radio/src/opentx.cpp | 8 +++++-- radio/src/targets/taranis/hal.h | 28 ++++++++++++------------- 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/radio/src/gui/128x64/radio_diagkeys.cpp b/radio/src/gui/128x64/radio_diagkeys.cpp index 4cd34b416..466a64b2a 100644 --- a/radio/src/gui/128x64/radio_diagkeys.cpp +++ b/radio/src/gui/128x64/radio_diagkeys.cpp @@ -50,7 +50,7 @@ void menuRadioDiagKeys(event_t event) } if (i < TRM_BASE) { -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) y = MENU_HEADER_HEIGHT + FH + FH*i; if (i >= 2) { // hide PLUS and MINUS virtual buttons diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 66d5be3f3..c438aebba 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -103,7 +103,9 @@ enum MenuRadioHardwareItems { ITEM_RADIO_HARDWARE_STICK4, ITEM_RADIO_HARDWARE_LABEL_POTS, ITEM_RADIO_HARDWARE_POT1, +#if !defined(PCBX3) ITEM_RADIO_HARDWARE_POT2, +#endif ITEM_RADIO_HARDWARE_LABEL_SWITCHES, ITEM_RADIO_HARDWARE_SA, ITEM_RADIO_HARDWARE_SB, @@ -111,6 +113,8 @@ enum MenuRadioHardwareItems { ITEM_RADIO_HARDWARE_SD, #if NUM_SWITCHES > 4 ITEM_RADIO_HARDWARE_SF, +#endif +#if NUM_SWITCHES > 5 ITEM_RADIO_HARDWARE_SH, #endif #if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 @@ -128,11 +132,17 @@ enum MenuRadioHardwareItems { ITEM_RADIO_HARDWARE_MAX }; -#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 - -#if NUM_SWITCHES > 4 -#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 +#if defined(PCBX3) +#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1 #else +#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 +#endif + +#if NUM_SWITCHES == 6 +#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 +#elif NUM_SWITCHES == 5 +#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 +#elif NUM_SWITCHES == 4 #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #endif @@ -206,7 +216,9 @@ void menuRadioHardware(event_t event) break; case ITEM_RADIO_HARDWARE_POT1: +#if !defined(PCBX3) case ITEM_RADIO_HARDWARE_POT2: +#endif { int idx = k - ITEM_RADIO_HARDWARE_POT1; uint8_t shift = (2*idx); @@ -233,6 +245,8 @@ void menuRadioHardware(event_t event) case ITEM_RADIO_HARDWARE_SD: #if NUM_SWITCHES > 4 case ITEM_RADIO_HARDWARE_SF: +#endif +#if NUM_SWITCHES > 5 case ITEM_RADIO_HARDWARE_SH: #endif { diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index aa80479b1..349e9c3a2 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -243,17 +243,21 @@ void generalDefault() g_eeGeneral.potsConfig = 0x0F; // S1 and S2 = pot without detent #elif defined(PCBX7) g_eeGeneral.potsConfig = 0x07; // S1 = pot without detent, S2 = pot with detent +#elif defined(PCBX3) + g_eeGeneral.potsConfig = 0x01; // S1 = pot without detent #elif defined(PCBTARANIS) g_eeGeneral.potsConfig = 0x05; // S1 and S2 = pots with detent g_eeGeneral.slidersConfig = 0x03; // LS and RS = sliders with detent #endif #if defined(PCBXLITES) - g_eeGeneral.switchConfig = (SWITCH_TOGGLE << 10) + (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); // 2x3POS, 2x2POS + g_eeGeneral.switchConfig = (SWITCH_TOGGLE << 10) + (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); #elif defined(PCBXLITE) - g_eeGeneral.switchConfig = (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); // 2x3POS, 2x2POS + g_eeGeneral.switchConfig = (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); #elif defined(PCBX7) g_eeGeneral.switchConfig = 0x000006ff; // 4x3POS, 1x2POS, 1xTOGGLE +#elif defined(PCBX3) + g_eeGeneral.switchConfig = (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); #elif defined(PCBTARANIS) || defined(PCBHORUS) g_eeGeneral.switchConfig = 0x00007bff; // 6x3POS, 1x2POS, 1xTOGGLE #endif diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 9054b148d..4cb6ae99e 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -150,22 +150,22 @@ #define TRIMS_GPIO_REG_RHR GPIOE->IDR #define TRIMS_GPIO_PIN_RHR GPIO_Pin_4 // PE.04 #elif defined(PCBX3) - #define TRIMS_GPIO_REG_LHL GPIOC->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_4 // PC.04 #define TRIMS_GPIO_REG_LHR GPIOC->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_5 // PC.05 - #define TRIMS_GPIO_REG_LVD GPIOB->IDR - #define TRIMS_GPIO_PIN_LVD GPIO_Pin_0 // PB.00 + #define TRIMS_GPIO_PIN_LHR GPIO_Pin_4 // PC.04 + #define TRIMS_GPIO_REG_LHL GPIOC->IDR + #define TRIMS_GPIO_PIN_LHL GPIO_Pin_5 // PC.05 #define TRIMS_GPIO_REG_LVU GPIOB->IDR - #define TRIMS_GPIO_PIN_LVU GPIO_Pin_1 // PB.01 - #define TRIMS_GPIO_REG_RVD GPIOE->IDR - #define TRIMS_GPIO_PIN_RVD GPIO_Pin_13 // PE.13 - #define TRIMS_GPIO_REG_RHL GPIOE->IDR - #define TRIMS_GPIO_PIN_RHL GPIO_Pin_14 // PE.14 - #define TRIMS_GPIO_REG_RVU GPIOD->IDR - #define TRIMS_GPIO_PIN_RVU GPIO_Pin_8 // PD.08 - #define TRIMS_GPIO_REG_RHR GPIOD->IDR - #define TRIMS_GPIO_PIN_RHR GPIO_Pin_9 // PD.09 + #define TRIMS_GPIO_PIN_LVU GPIO_Pin_0 // PB.00 + #define TRIMS_GPIO_REG_LVD GPIOB->IDR + #define TRIMS_GPIO_PIN_LVD GPIO_Pin_1 // PB.01 + #define TRIMS_GPIO_REG_RVU GPIOE->IDR + #define TRIMS_GPIO_PIN_RVU GPIO_Pin_13 // PE.13 + #define TRIMS_GPIO_REG_RVD GPIOD->IDR + #define TRIMS_GPIO_PIN_RVD GPIO_Pin_8 // PD.08 + #define TRIMS_GPIO_REG_RHR GPIOE->IDR + #define TRIMS_GPIO_PIN_RHR GPIO_Pin_14 // PE.14 + #define TRIMS_GPIO_REG_RHL GPIOD->IDR + #define TRIMS_GPIO_PIN_RHL GPIO_Pin_9 // PD.09 #else #define TRIMS_GPIO_REG_LHL GPIOE->IDR #define TRIMS_GPIO_PIN_LHL GPIO_Pin_4 // PE.04 From eb64bc85e748ae1c2bd266b48ddfae409c832a66 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 18:19:41 +0100 Subject: [PATCH 315/446] [PXX2] Share frame sent --- radio/src/gui/128x64/model_setup.cpp | 7 +++---- radio/src/pulses/pxx2.cpp | 9 ++------- radio/src/pulses/pxx2.h | 5 +++-- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index c520ff872..ef1d86698 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1361,11 +1361,10 @@ void menuModelSetup(event_t event) } else { if (event == EVT_KEY_BREAK(KEY_ENTER)) { - moduleSettings[moduleIdx].mode ^= MODULE_MODE_SHARE; + moduleSettings[moduleIdx].mode = MODULE_MODE_SHARE; reusableBuffer.moduleSetup.pxx2.shareReceiverIndex = receiverIdx; - } - if (moduleSettings[moduleIdx].mode == MODULE_MODE_NORMAL) { s_editMode = 0; + POPUP_INFORMATION("Model shared"); } } } @@ -1373,7 +1372,7 @@ void menuModelSetup(event_t event) break; #endif #if defined(PCBSKY9X) - case ITEM_MODEL_EXTRA_MODULE_BIND: + case ITEM_MODEL_EXTRA_MODULE_BIND: #endif #if defined(PCBTARANIS) case ITEM_MODEL_INTERNAL_MODULE_NPXX2_BIND: diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 7e1050ac7..faebbf759 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -224,13 +224,8 @@ void Pxx2Pulses::setupShareMode(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); - Pxx2Transport::addByte(0xC0); - - Pxx2Transport::addByte(0x40); - - for(uint8_t i=0; i < 24 ; i++) { - Pxx2Transport::addByte(i); - } + Pxx2Transport::addByte(PXX2_RX_SETTINGS_FLAG0_WRITE + reusableBuffer.moduleSetup.pxx2.shareReceiverIndex); + Pxx2Transport::addByte(PXX2_RX_SETTINGS_FLAG1_SHARE); moduleSettings[module].mode = MODULE_MODE_NORMAL; } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index a5683a235..e1587c26f 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -43,10 +43,11 @@ #define PXX2_CHANNELS_FLAG0_FAILSAFE (1 << 6) #define PXX2_CHANNELS_FLAG0_RANGECHECK (1 << 7) +#define PXX2_RX_SETTINGS_FLAG0_WRITE (1 << 6) +#define PXX2_RX_SETTINGS_FLAG1_SHARE (1 << 6) #define PXX2_RX_SETTINGS_FLAG1_FASTPWM (1 << 4) #define PXX2_RECV_OPTION_MASK_TELEMETRY 0x00 // TODO : update when defined - enum PXX2RegisterSteps { REGISTER_START, REGISTER_RX_NAME_RECEIVED, @@ -64,7 +65,7 @@ enum PXX2BindSteps { enum PXX2ReceiverStatus { RECEIVER_SETTINGS_READ = 0x00, RECEIVER_SETTINGS_OK, - RECEIVER_SETTINGS_WRITE = 0x40 + RECEIVER_SETTINGS_WRITE = PXX2_RX_SETTINGS_FLAG0_WRITE }; extern ModuleFifo intmoduleFifo; From 7058df482c6d3f296bd075d4d0793c2b5c21ef58 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 13 Mar 2019 18:31:04 +0100 Subject: [PATCH 316/446] [X3] Compilation fix --- radio/src/targets/common/arm/stm32/adc_driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index 1503ae5f2..b72305e5c 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -43,7 +43,7 @@ #elif defined(REV4a) const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, 1,-1,0, 1,1, 1}; #else - const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, 1,1,0, 1,1, 1}; + const int8_t ana_direction[NUM_ANALOGS] = {1,-1,-1,1, 1,1}; #endif #if NUM_PWMSTICKS > 0 From e9627f6d0896dab7ce39ddf399470464b9962693 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 14 Mar 2019 09:00:39 +0100 Subject: [PATCH 317/446] [PXX2] RX Settings menu freeze --- radio/src/gui/128x64/model_setup.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index ef1d86698..bba59c68c 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1305,11 +1305,10 @@ void menuModelSetup(event_t event) lcdDrawText(INDENT_WIDTH * 2, y, STR_OPTIONS); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr); if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + g_moduleIdx = CURRENT_MODULE_EDITED(k); uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - uint8_t receiverSlot = g_model.moduleData[moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; + uint8_t receiverSlot = g_model.moduleData[g_moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; memclear(&reusableBuffer.receiverSetup, sizeof(reusableBuffer.receiverSetup)); - reusableBuffer.receiverSetup.moduleIdx = moduleIdx; reusableBuffer.receiverSetup.receiverId = receiverSlot; pushMenu(menuModelReceiverOptions); } @@ -1937,7 +1936,7 @@ enum MenuModelReceiverOptions { void menuModelReceiverOptions(event_t event) { if (menuEvent) { - moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_NORMAL; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; return; } @@ -1953,7 +1952,7 @@ void menuModelReceiverOptions(event_t event) if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_READ && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 500/*5s*/; - moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } if (!s_editMode && reusableBuffer.receiverSetup.dirty && (reusableBuffer.receiverSetup.state != RECEIVER_SETTINGS_WRITE || get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { @@ -1961,7 +1960,7 @@ void menuModelReceiverOptions(event_t event) reusableBuffer.receiverSetup.dirty = 0; reusableBuffer.receiverSetup.timeout = 0; reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 100/*1s*/; - moduleSettings[reusableBuffer.receiverSetup.moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } #if defined(SIMU) From 40ef176d397963272ebd1f22820abe6537031db7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 14 Mar 2019 09:01:14 +0100 Subject: [PATCH 318/446] [PXX2] RX Settings menu freeze --- radio/src/opentx.h | 1 - 1 file changed, 1 deletion(-) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 5aea443df..031fe6de7 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1144,7 +1144,6 @@ union ReusableBuffer uint8_t state; // 0x00 = READ 0x40 = WRITE tmr10ms_t timeout; tmr10ms_t updateTime; - uint8_t moduleIdx; uint8_t receiverId; uint8_t channelMapping[24]; uint8_t telemetryEnabled; From 6a77e7fa74482ea989afbee7ef511f6e6f22a135 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 14 Mar 2019 09:01:27 +0100 Subject: [PATCH 319/446] [X3] HAL fixes --- radio/src/targets/taranis/board.h | 4 +--- radio/src/targets/taranis/hal.h | 15 ++++++++++++--- radio/src/targets/taranis/pwr_driver.cpp | 4 ++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index cb89f7578..9b44b4a5d 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -170,10 +170,8 @@ uint32_t isBootloaderStart(const uint8_t * buffer); #else #define INTERNAL_MODULE_OFF() GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) #endif -#define EXTERNAL_MODULE_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) -#define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET) -#define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) void init_ppm(uint8_t module); void disable_ppm(uint8_t module); diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 4cb6ae99e..223f0fc79 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -750,10 +750,16 @@ #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define EXTMODULE_PWR_GPIO GPIOA #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PA.08 + #define EXTERNAL_MODULE_ON() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define EXTERNAL_MODULE_OFF() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_RESET) #else #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define EXTMODULE_PWR_GPIO GPIOD #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_11 // PD.11 + #define EXTERNAL_MODULE_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) #endif #define EXTMODULE_TX_GPIO GPIOC #define EXTMODULE_USART_GPIO GPIOC @@ -786,6 +792,9 @@ #define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8 #define EXTMODULE_PWR_GPIO GPIOD #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 + #define EXTERNAL_MODULE_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) #define EXTMODULE_TX_GPIO GPIOA #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_7 // PA.07 #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7 @@ -900,7 +909,7 @@ #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 #define TELEMETRY_DIR_GPIO GPIOD #define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04 -#if defined(PCBXLITE) +#if defined(PCBXLITE) || defined(PCBX3) #define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN #define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN #else @@ -951,8 +960,8 @@ #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOE #define SPORT_UPDATE_PWR_GPIO GPIOE #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_15 // PE.15 - #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_ResetBits - #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_SetBits + #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits + #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits #else #define SPORT_MAX_BAUDRATE 400000 #define SPORT_UPDATE_RCC_AHB1Periph 0 diff --git a/radio/src/targets/taranis/pwr_driver.cpp b/radio/src/targets/taranis/pwr_driver.cpp index d754d3473..f233eaaac 100644 --- a/radio/src/targets/taranis/pwr_driver.cpp +++ b/radio/src/targets/taranis/pwr_driver.cpp @@ -32,8 +32,8 @@ void pwrInit() GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN); GPIO_InitStructure.GPIO_Pin = INTMODULE_PWR_GPIO_PIN; GPIO_Init(INTMODULE_PWR_GPIO, &GPIO_InitStructure); - - GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN); + + EXTERNAL_MODULE_OFF(); GPIO_InitStructure.GPIO_Pin = EXTMODULE_PWR_GPIO_PIN; GPIO_Init(EXTMODULE_PWR_GPIO, &GPIO_InitStructure); From 38c1a8849bab3944a846d2bae8edd95353892823 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 14 Mar 2019 09:05:16 +0100 Subject: [PATCH 320/446] [X3] HAL fixes --- radio/src/targets/taranis/hal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 223f0fc79..23e9f7158 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -909,7 +909,7 @@ #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 #define TELEMETRY_DIR_GPIO GPIOD #define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04 -#if defined(PCBXLITE) || defined(PCBX3) +#if defined(PCBXLITE) #define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN #define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN #else From 2aa9ab7d7e104a1aee2f741381242038001a03d0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 14 Mar 2019 09:56:45 +0100 Subject: [PATCH 321/446] Compilation fix --- radio/src/io/frsky_pxx2.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/io/frsky_pxx2.h b/radio/src/io/frsky_pxx2.h index 01e50fdc3..70c9e9c60 100644 --- a/radio/src/io/frsky_pxx2.h +++ b/radio/src/io/frsky_pxx2.h @@ -22,6 +22,7 @@ #define _IO_PXX2_H_ #include "../fifo.h" +#include "../pulses/pxx.h" class ModuleFifo : public Fifo { public: From 6cbffc1ad00b4a19ca6bce5e508f8c61e93779f4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 14 Mar 2019 10:46:38 +0100 Subject: [PATCH 322/446] SHARE command added --- radio/src/pulses/pxx2.cpp | 5 ++--- radio/src/pulses/pxx2.h | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index faebbf759..71412ad60 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -222,10 +222,9 @@ void Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) void Pxx2Pulses::setupShareMode(uint8_t module) { - addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_SHARE); - Pxx2Transport::addByte(PXX2_RX_SETTINGS_FLAG0_WRITE + reusableBuffer.moduleSetup.pxx2.shareReceiverIndex); - Pxx2Transport::addByte(PXX2_RX_SETTINGS_FLAG1_SHARE); + Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.shareReceiverIndex); moduleSettings[module].mode = MODULE_MODE_NORMAL; } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index e1587c26f..13105f386 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -32,6 +32,7 @@ #define PXX2_TYPE_ID_TX_SETTINGS 0x04 #define PXX2_TYPE_ID_RX_SETTINGS 0x05 #define PXX2_TYPE_ID_HW_INFO 0x06 + #define PXX2_TYPE_ID_SHARE 0x07 #define PXX2_TYPE_ID_TELEMETRY 0xFE #define PXX2_TYPE_C_POWER_METER 0x02 @@ -44,7 +45,6 @@ #define PXX2_CHANNELS_FLAG0_RANGECHECK (1 << 7) #define PXX2_RX_SETTINGS_FLAG0_WRITE (1 << 6) -#define PXX2_RX_SETTINGS_FLAG1_SHARE (1 << 6) #define PXX2_RX_SETTINGS_FLAG1_FASTPWM (1 << 4) #define PXX2_RECV_OPTION_MASK_TELEMETRY 0x00 // TODO : update when defined From a59776a8e8898baec6637fefe8c562c526a8f0f7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 14 Mar 2019 16:06:26 +0100 Subject: [PATCH 323/446] Add some random to REGISTER command --- radio/src/gui/128x64/model_setup.cpp | 3 ++- radio/src/opentx.h | 1 + radio/src/pulses/pxx2.cpp | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index bba59c68c..50451dae1 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -329,6 +329,7 @@ void runPopupRegister(event_t event) } else if (reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED && menuHorizontalPosition == 0) { // [Enter] pressed + reusableBuffer.moduleSetup.pxx2.registerLoopIndex = get_tmr10ms(); reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; backupEditMode = EDIT_MODIFY_FIELD; // so that the [Register] button blinks and the REGISTER process can continue } @@ -1363,7 +1364,7 @@ void menuModelSetup(event_t event) moduleSettings[moduleIdx].mode = MODULE_MODE_SHARE; reusableBuffer.moduleSetup.pxx2.shareReceiverIndex = receiverIdx; s_editMode = 0; - POPUP_INFORMATION("Model shared"); + POPUP_INFORMATION("Receiver shared"); } } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 031fe6de7..ccc81f158 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1129,6 +1129,7 @@ union ReusableBuffer uint8_t registerPopupHorizontalPosition; int8_t registerPopupEditMode; char registerRxName[PXX2_LEN_RX_NAME]; + uint8_t registerLoopIndex; char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME + 1]; uint8_t bindCandidateReceiversCount; uint8_t bindReceiverId; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 71412ad60..cb55b1647 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -139,6 +139,7 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) for (uint8_t i=0; i Date: Thu, 14 Mar 2019 17:51:59 +0100 Subject: [PATCH 324/446] 3djc/test (#7) More modules support --- radio/src/gui/gui_common_arm.cpp | 4 +- radio/src/myeeprom.h | 3 + radio/src/pulses/modules.h | 5 +- radio/src/pulses/pulses.cpp | 84 +++++++++++++------ radio/src/pulses/pulses.h | 6 +- radio/src/pulses/pxx.h | 19 ++--- radio/src/pulses/pxx1.cpp | 4 +- .../arm/stm32/intmodule_serial_driver.cpp | 5 +- radio/src/targets/horus/board.h | 4 +- radio/src/targets/horus/extmodule_driver.cpp | 5 +- radio/src/targets/horus/pulses_driver.cpp | 6 +- radio/src/targets/taranis/board.h | 9 +- .../src/targets/taranis/extmodule_driver.cpp | 17 +++- .../taranis/intmodule_pulses_driver.cpp | 50 +++++------ radio/src/targets/taranis/pulses_driver.cpp | 28 +++++-- radio/src/tasks.cpp | 4 +- radio/src/translations/cz.h.txt | 8 +- radio/src/translations/de.h.txt | 4 +- radio/src/translations/en.h.txt | 4 +- radio/src/translations/es.h.txt | 4 +- radio/src/translations/fi.h.txt | 4 +- radio/src/translations/fr.h.txt | 4 +- radio/src/translations/it.h.txt | 4 +- radio/src/translations/nl.h.txt | 4 +- radio/src/translations/pl.h.txt | 4 +- radio/src/translations/pt.h.txt | 4 +- radio/src/translations/se.h.txt | 8 +- 27 files changed, 188 insertions(+), 117 deletions(-) diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 4dcc5bfd3..f4b6e6338 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -546,12 +546,12 @@ bool isInternalModuleAvailable(int module) bool isExternalModuleAvailable(int module) { #if !defined(PXX1) - if (module == MODULE_TYPE_XJT || module == MODULE_TYPE_R9M) { + if (module == MODULE_TYPE_XJT || module == MODULE_TYPE_R9M || module == MODULE_TYPE_R9M_LITE) { return false; } #endif #if !defined(PXX2) - if (module == MODULE_TYPE_XJT2 || module == MODULE_TYPE_R9M2) { + if (module == MODULE_TYPE_XJT2 || module == MODULE_TYPE_R9M2 || module == MODULE_TYPE_R9M_LITE2 || module == MODULE_TYPE_R9M_LITE_PRO2) { return false; } #endif diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 8092f5c76..34d7e7072 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -408,6 +408,9 @@ enum ModuleTypes { MODULE_TYPE_MULTIMODULE, MODULE_TYPE_R9M, MODULE_TYPE_R9M2, + MODULE_TYPE_R9M_LITE, + MODULE_TYPE_R9M_LITE2, + MODULE_TYPE_R9M_LITE_PRO2, MODULE_TYPE_SBUS, MODULE_TYPE_MAX = MODULE_TYPE_SBUS, MODULE_TYPE_COUNT diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index f96b1e96f..8a283b613 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -59,7 +59,6 @@ inline bool isModuleXJT2(uint8_t idx) return g_model.moduleData[idx].type == MODULE_TYPE_XJT2; } - inline bool isModuleXJTVariant(uint8_t idx) { return g_model.moduleData[idx].type == MODULE_TYPE_XJT || g_model.moduleData[idx].type == MODULE_TYPE_XJT2; @@ -112,12 +111,12 @@ inline bool isModulePPM(uint8_t idx) inline bool isModuleR9M(uint8_t idx) { - return g_model.moduleData[idx].type == MODULE_TYPE_R9M; + return g_model.moduleData[idx].type == MODULE_TYPE_R9M || g_model.moduleData[idx].type == MODULE_TYPE_R9M_LITE; } inline bool isModuleR9M2(uint8_t idx) { - return g_model.moduleData[idx].type == MODULE_TYPE_R9M2; + return g_model.moduleData[idx].type == MODULE_TYPE_R9M2 || g_model.moduleData[idx].type == MODULE_TYPE_R9M_LITE2 || g_model.moduleData[idx].type == MODULE_TYPE_R9M_LITE_PRO2; } #if defined(PCBXLITE) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index a2afa462d..a4cb4b782 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -50,12 +50,26 @@ uint8_t getRequiredProtocol(uint8_t module) break; case MODULE_TYPE_XJT: +#if defined(INTMODULE_USART) + if (module == INTERNAL_MODULE) { + protocol = PROTOCOL_CHANNELS_PXX1_SERIAL; + break; + } +#endif + // no break + case MODULE_TYPE_R9M: - protocol = PROTOCOL_CHANNELS_PXX1; + protocol = PROTOCOL_CHANNELS_PXX1_PULSES; + break; + + case MODULE_TYPE_R9M_LITE: + protocol = PROTOCOL_CHANNELS_PXX1_SERIAL; break; case MODULE_TYPE_XJT2: case MODULE_TYPE_R9M2: + case MODULE_TYPE_R9M_LITE2: + case MODULE_TYPE_R9M_LITE_PRO2: protocol = PROTOCOL_CHANNELS_PXX2; break; @@ -119,10 +133,18 @@ void disablePulses(uint8_t module, uint8_t protocol) // stop existing protocol hardware switch (protocol) { - case PROTOCOL_CHANNELS_PXX1: - disable_pxx(module); +#if defined(PXX1) + case PROTOCOL_CHANNELS_PXX1_PULSES: + disable_pxx1_pulses(module); break; +#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) + case PROTOCOL_CHANNELS_PXX1_SERIAL: + disable_pxx1_serial(module); + break; +#endif +#endif + #if defined(DSM2) case PROTOCOL_CHANNELS_DSM2_LP45: case PROTOCOL_CHANNELS_DSM2_DSM2: @@ -137,9 +159,11 @@ void disablePulses(uint8_t module, uint8_t protocol) break; #endif +#if defined(PXX2) case PROTOCOL_CHANNELS_PXX2: disable_pxx2(module); break; +#endif #if defined(MULTIMODULE) case PROTOCOL_CHANNELS_MULTIMODULE: @@ -159,10 +183,18 @@ void enablePulses(uint8_t module, uint8_t protocol) // start new protocol hardware here switch (protocol) { - case PROTOCOL_CHANNELS_PXX1: - init_pxx(module); +#if defined(PXX1) + case PROTOCOL_CHANNELS_PXX1_PULSES: + init_pxx1_pulses(module); break; +#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) + case PROTOCOL_CHANNELS_PXX1_SERIAL: + init_pxx1_serial(module); + break; +#endif +#endif + #if defined(DSM2) case PROTOCOL_CHANNELS_DSM2_LP45: case PROTOCOL_CHANNELS_DSM2_DSM2: @@ -177,9 +209,11 @@ void enablePulses(uint8_t module, uint8_t protocol) break; #endif +#if defined(PXX2) case PROTOCOL_CHANNELS_PXX2: init_pxx2(module); break; +#endif #if defined(MULTIMODULE) case PROTOCOL_CHANNELS_MULTIMODULE: @@ -197,28 +231,19 @@ void enablePulses(uint8_t module, uint8_t protocol) } } -#if defined(PXX1) -void setupPulsesPXXInternalModule() -{ -#if defined(INTMODULE_USART) - intmodulePulsesData.pxx_uart.setupFrame(INTERNAL_MODULE); -#else - intmodulePulsesData.pxx.setupFrame(INTERNAL_MODULE); -#endif -} - -void setupPulsesPXXExternalModule() -{ - extmodulePulsesData.pxx.setupFrame(EXTERNAL_MODULE); -} -#endif - void setupPulsesInternalModule(uint8_t protocol) { switch (protocol) { -#if defined(PXX1) - case PROTOCOL_CHANNELS_PXX1: - setupPulsesPXXInternalModule(); +#if defined(PXX1) && !defined(INTMODULE_USART) + case PROTOCOL_CHANNELS_PXX1_PULSES: + intmodulePulsesData.pxx.setupFrame(INTERNAL_MODULE); + scheduleNextMixerCalculation(INTERNAL_MODULE, INTMODULE_PXX_PERIOD); + break; +#endif + +#if defined(PXX1) && defined(INTMODULE_USART) + case PROTOCOL_CHANNELS_PXX1_SERIAL: + intmodulePulsesData.pxx_uart.setupFrame(INTERNAL_MODULE); scheduleNextMixerCalculation(INTERNAL_MODULE, INTMODULE_PXX_PERIOD); break; #endif @@ -246,9 +271,14 @@ void setupPulsesExternalModule(uint8_t protocol) { switch (protocol) { #if defined(PXX1) - case PROTOCOL_CHANNELS_PXX1: - setupPulsesPXXExternalModule(); - scheduleNextMixerCalculation(EXTERNAL_MODULE, EXTMODULE_PXX_PERIOD); + case PROTOCOL_CHANNELS_PXX1_PULSES: + extmodulePulsesData.pxx.setupFrame(EXTERNAL_MODULE); + scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX_PULSES_PERIOD); + break; + + case PROTOCOL_CHANNELS_PXX1_SERIAL: + extmodulePulsesData.pxx_uart.setupFrame(EXTERNAL_MODULE); + scheduleNextMixerCalculation(EXTERNAL_MODULE, EXTMODULE_PXX_SERIAL_PERIOD); break; #endif diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 61b46ee64..37eacb033 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -152,6 +152,9 @@ union InternalModulePulsesData { union ExternalModulePulsesData { #if defined(PXX1) + #if defined(EXTMODULE_USART) + UartPxx1Pulses pxx_uart; + #endif #if defined(PPM_PIN_SERIAL) SerialPxx1Pulses pxx; #else @@ -225,7 +228,8 @@ enum ChannelsProtocols { PROTOCOL_CHANNELS_NONE, PROTOCOL_CHANNELS_PPM, #if defined(PXX) || defined(DSM2) - PROTOCOL_CHANNELS_PXX1, + PROTOCOL_CHANNELS_PXX1_PULSES, + PROTOCOL_CHANNELS_PXX1_SERIAL, #endif #if defined(DSM2) PROTOCOL_CHANNELS_DSM2_LP45, diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index ec9d1dad8..cb6d1ecd5 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -27,21 +27,23 @@ #define PXX_SEND_FAILSAFE (1 << 4) #define PXX_SEND_RANGECHECK (1 << 5) -#define PXX2_ON_SPORT_BAUDRATE 230400 -#define PXX2_PERIOD 4 // 4ms -#define PXX2_FRAME_MAXLENGTH 64 +#define PXX2_ON_SPORT_BAUDRATE 230400 +#define PXX2_PERIOD 4 // 4ms +#define PXX2_FRAME_MAXLENGTH 64 -#define EXTMODULE_PXX_PERIOD 9/*ms*/ +#define PXX_PULSES_PERIOD 9/*ms*/ +#define EXTMODULE_PXX_SERIAL_PERIOD 4/*ms*/ +#define EXTMODULE_PXX_SERIAL_BAUDRATE 420000 #if defined(PXX_FREQUENCY_HIGH) - #define INTMODULE_USART_PXX_BAUDRATE 450000 + #define INTMODULE_PXX_BAUDRATE 450000 #define INTMODULE_PXX_PERIOD 4/*ms*/ #else - #define INTMODULE_USART_PXX_BAUDRATE 115200 + #define INTMODULE_PXX_BAUDRATE 115200 #define INTMODULE_PXX_PERIOD 9/*ms*/ #endif -#define EXTMODULE_USART_PXX2_BAUDRATE 450000 +#define EXTMODULE_USART_PXX2_BAUDRATE 450000 #if defined(PXX_FREQUENCY_HIGH) && (!defined(INTMODULE_USART) || !defined(EXTMODULE_USART)) /* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */ @@ -53,9 +55,6 @@ #error "Pulses array needs to be increased (PXX_FREQUENCY=HIGH)" #endif - -#define PXX_PERIOD_HALF_US (PXX_PERIOD * 2000) - // Used by the Sky9x family boards class SerialPxxBitTransport: public DataBuffer { protected: diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 86e05a615..e11642b4e 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -216,10 +216,10 @@ void Pxx1Pulses::add8ChannelsFrame(uint8_t module, uint8_t sendUpp template void Pxx1Pulses::setupFrame(uint8_t module) { - PxxTransport::initFrame(module == INTERNAL_MODULE ? INTMODULE_PXX_PERIOD : EXTMODULE_PXX_PERIOD); + PxxTransport::initFrame(PXX_PULSES_PERIOD); #if defined(PXX_FREQUENCY_HIGH) - if (module == INTERNAL_MODULE) { + if (moduleSettings[module].protocol == PROTOCOL_CHANNELS_PXX1_SERIAL) { add8ChannelsFrame(module, 0); if (sentModuleChannels(module) > 8) { add8ChannelsFrame(module, 8); diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 6cfaa327e..4d70e3463 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -41,7 +41,7 @@ void intmoduleStop() void intmodulePxxStart() { - intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE, false); + intmoduleSerialStart(INTMODULE_PXX_BAUDRATE, false); } void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable) @@ -138,8 +138,9 @@ void intmoduleSendNextFrame() intmoduleSendBuffer(intmodulePulsesData.pxx2.getData(), intmodulePulsesData.pxx2.getSize()); break; #endif + #if defined(PXX1) - case PROTOCOL_CHANNELS_PXX1: + case PROTOCOL_CHANNELS_PXX1_SERIAL: intmoduleSendBuffer(intmodulePulsesData.pxx_uart.getData(), intmodulePulsesData.pxx_uart.getSize()); break; #endif diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 962f8455d..f09726de6 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -209,8 +209,8 @@ extern HardwareOptions hardwareOptions; void init_ppm(uint8_t module); void disable_ppm(uint8_t module); -void init_pxx(uint8_t module); -void disable_pxx(uint8_t module); +void init_pxx1_pulses(uint8_t module); +void disable_pxx1_pulses(uint8_t module); void init_pxx2(uint8_t module); void disable_pxx2(uint8_t module); void init_serial(uint8_t module, uint32_t baudrate, uint32_t period_half_us); diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 87a8a0ec5..4fb25ab08 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -232,7 +232,7 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } #if defined(PXX1) - else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { + else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1_PULSES) { EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA #if defined(PCBX10) || PCBREV >= 13 @@ -245,6 +245,9 @@ void extmoduleSendNextFrame() EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA } + else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1_SERIAL) { + #warning "Take it from 2.2" + } #endif #if defined(PXX2) else if (moduleSettings[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { diff --git a/radio/src/targets/horus/pulses_driver.cpp b/radio/src/targets/horus/pulses_driver.cpp index f70189cec..57fca8889 100644 --- a/radio/src/targets/horus/pulses_driver.cpp +++ b/radio/src/targets/horus/pulses_driver.cpp @@ -48,7 +48,7 @@ void disable_ppm(uint8_t module) void init_pxx2(uint8_t module) { if (module == INTERNAL_MODULE) - intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE, true); + intmoduleSerialStart(INTMODULE_PXX_BAUDRATE, true); else extmodulePxx2Start(); } @@ -61,7 +61,7 @@ void disable_pxx2(uint8_t module) extmoduleStop(); } -void init_pxx(uint8_t module) +void init_pxx1_pulses(uint8_t module) { if (module == INTERNAL_MODULE) intmodulePxxStart(); @@ -69,7 +69,7 @@ void init_pxx(uint8_t module) extmodulePxxStart(); } -void disable_pxx(uint8_t module) +void disable_pxx1_pulses(uint8_t module) { if (module == INTERNAL_MODULE) intmoduleStop(); diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 9b44b4a5d..18ee13282 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -177,8 +177,10 @@ void init_ppm(uint8_t module); void disable_ppm(uint8_t module); void init_pxx2(uint8_t module); void disable_pxx2(uint8_t module); -void init_pxx(uint8_t module); -void disable_pxx(uint8_t module); +void init_pxx1_pulses(uint8_t module); +void init_pxx1_serial(uint8_t module); +void disable_pxx1_pulses(uint8_t module); +void disable_pxx1_serial(uint8_t module); void init_serial(uint8_t module, uint32_t baudrate, uint32_t period); void disable_serial(uint8_t module); void intmoduleStop(); @@ -192,7 +194,8 @@ void intmoduleSendNextFrame(); void extmoduleStop(); void extmodulePpmStart(); -void extmodulePxxStart(); +void extmodulePxxPulsesStart(); +void extmodulePxxSerialStart(); void extmodulePxx2Start(); void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us); void extmoduleInvertedSerialStart(uint32_t baudrate); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index b3f0fd6a2..ef1802368 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -207,7 +207,7 @@ void extmodulePxx2Start() #endif #if defined(PXX1) -void extmodulePxxStart() +void extmodulePxxPulsesStart() { EXTERNAL_MODULE_ON(); @@ -223,7 +223,7 @@ void extmodulePxxStart() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - EXTMODULE_TIMER->ARR = EXTMODULE_PXX_PERIOD * 2000; // 0.5uS (2Mhz) + EXTMODULE_TIMER->ARR = PXX_PULSES_PERIOD * 2000; // 0.5uS (2Mhz) EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | EXTMODULE_TIMER_OUTPUT_POLARITY; // polarity, default low EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; // Enable outputs EXTMODULE_TIMER->CCR1 = 18; @@ -243,6 +243,13 @@ void extmodulePxxStart() } #endif +#if defined(PXX1) && defined(EXTMODULE_USART) +void extmodulePxxSerialStart() +{ + extmoduleInvertedSerialStart(EXTMODULE_PXX_SERIAL_BAUDRATE); +} +#endif + void extmoduleSendNextFrame() { switch(moduleSettings[EXTERNAL_MODULE].protocol) { @@ -259,7 +266,7 @@ void extmoduleSendNextFrame() break; #if defined(PXX1) - case PROTOCOL_CHANNELS_PXX1: + case PROTOCOL_CHANNELS_PXX1_PULSES: EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; @@ -268,6 +275,10 @@ void extmoduleSendNextFrame() EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA break; + + case PROTOCOL_CHANNELS_PXX1_SERIAL: + extmoduleSendBuffer(extmodulePulsesData.pxx_uart.getData(), extmodulePulsesData.pxx_uart.getSize()); + break; #endif #if defined(PXX2) diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 49144f288..719c0ff21 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -34,34 +34,36 @@ void intmoduleStop() void intmoduleSendNextFrame() { - if (0) { - } + switch (moduleSettings[INTERNAL_MODULE].protocol) { #if defined(PXX1) - else if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1) { - INTMODULE_TIMER->CCR2 = intmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance - INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA - INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; - INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR); - INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(intmodulePulsesData.pxx.getData()); - INTMODULE_DMA_STREAM->NDTR = intmodulePulsesData.pxx.getSize(); - INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA - } + case PROTOCOL_CHANNELS_PXX1_PULSES: + INTMODULE_TIMER->CCR2 = intmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance + INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR); + INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(intmodulePulsesData.pxx.getData()); + INTMODULE_DMA_STREAM->NDTR = intmodulePulsesData.pxx.getSize(); + INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA + break; #endif + #if defined(TARANIS_INTERNAL_PPM) - else if (moduleSettings[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) { - INTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(INTERNAL_MODULE) * 2; - INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); - INTMODULE_TIMER->CCR2 = *(intmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance - INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA - INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; - INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR); - INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(intmodulePulsesData.ppm.pulses); - INTMODULE_DMA_STREAM->NDTR = intmodulePulsesData.ppm.ptr - intmodulePulsesData.ppm.pulses; - INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA - } + case PROTOCOL_CHANNELS_PPM: + INTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(INTERNAL_MODULE) * 2; + INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); + INTMODULE_TIMER->CCR2 = *(intmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance + INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + INTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&INTMODULE_TIMER->ARR); + INTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(intmodulePulsesData.ppm.pulses); + INTMODULE_DMA_STREAM->NDTR = intmodulePulsesData.ppm.ptr - intmodulePulsesData.ppm.pulses; + INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA + break; #endif - else { - INTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; + + default: + INTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; + break; } } diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index ffe444875..b09c1fff0 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -20,17 +20,24 @@ #include "opentx.h" -void init_pxx(uint8_t module) -{ #if defined(PXX1) +void init_pxx1_pulses(uint8_t module) +{ if (module == INTERNAL_MODULE) intmodulePxxStart(); else - extmodulePxxStart(); -#endif + extmodulePxxPulsesStart(); } -void disable_pxx(uint8_t module) +void init_pxx1_serial(uint8_t module) +{ + if (module == INTERNAL_MODULE) + intmodulePxxStart(); + else + extmodulePxxSerialStart(); +} + +void disable_pxx1_pulses(uint8_t module) { if (module == INTERNAL_MODULE) intmoduleStop(); @@ -38,10 +45,19 @@ void disable_pxx(uint8_t module) extmoduleStop(); } +void disable_pxx1_serial(uint8_t module) +{ + if (module == INTERNAL_MODULE) + intmoduleStop(); + else + extmoduleStop(); +} +#endif + void init_pxx2(uint8_t module) { if (module == INTERNAL_MODULE) - intmoduleSerialStart(INTMODULE_USART_PXX_BAUDRATE, true); + intmoduleSerialStart(INTMODULE_PXX_BAUDRATE, true); else extmodulePxx2Start(); } diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index a058196b7..94a26340f 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -78,8 +78,8 @@ bool isModuleSynchronous(uint8_t module) uint8_t protocol = moduleSettings[module].protocol; if (protocol == PROTOCOL_CHANNELS_PXX2 || protocol == PROTOCOL_CHANNELS_CROSSFIRE || protocol == PROTOCOL_CHANNELS_NONE) return true; -#if defined(INTMODULE_USART) - if (protocol == PROTOCOL_CHANNELS_PXX1 && module == INTERNAL_MODULE) +#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) + if (protocol == PROTOCOL_CHANNELS_PXX1_SERIAL) return true; #endif return false; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 958eab79e..23c8094e3 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -99,11 +99,11 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ") -#define LEN_JACKMODES "\007" -#define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "Vyp\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" +#define LEN_TARANIS_PROTOCOLS "\005" +#define TR_TARANIS_PROTOCOLS "Vyp\0 ""PPM\0 ""XJT\0 ""XJT2\0""DSM2\0""CRSF\0""MULT\0""R9M\0 ""R9M2\0""R9LT\0""R9LT2""R9LP2""SBUS\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (kabel)Spektrum\0 " diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index fdf952c77..a376f4d0b 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -104,8 +104,8 @@ #define LEN_JACKMODES "\007" #define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "AUS\0""PPM\0""XJT\0""DSM?""CRSF""MULT""R9M\0""R9M2""SBUS" +#define LEN_TARANIS_PROTOCOLS "\005" +#define TR_TARANIS_PROTOCOLS "AUS\0 ""PPM\0 ""XJT\0 ""XJT2\0""DSM2\0""CRSF\0""MULT\0""R9M\0 ""R9M2\0""R9LT\0""R9LT2""R9LP2""SBUS\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (Kabel)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 48ffe3406..7c9fa2be4 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -104,8 +104,8 @@ #define LEN_JACKMODES "\007" #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" +#define LEN_TARANIS_PROTOCOLS "\005" +#define TR_TARANIS_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""XJT2\0""DSM2\0""CRSF\0""MULT\0""R9M\0 ""R9M2\0""R9LT\0""R9LT2""R9LP2""SBUS\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 5644bbb6d..0282c2745 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -104,8 +104,8 @@ #define LEN_JACKMODES "\007" #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" +#define LEN_TARANIS_PROTOCOLS "\005" +#define TR_TARANIS_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""XJT2\0""DSM2\0""CRSF\0""MULT\0""R9M\0 ""R9M2\0""R9LT\0""R9LT2""R9LP2""SBUS\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index a20c3f18d..74c46e54a 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -104,8 +104,8 @@ #define LEN_JACKMODES "\007" #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" +#define LEN_TARANIS_PROTOCOLS "\005" +#define TR_TARANIS_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""XJT2\0""DSM2\0""CRSF\0""MULT\0""R9M\0 ""R9M2\0""R9LT\0""R9LT2""R9LP2""SBUS\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 1d440031b..673f13721 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -104,8 +104,8 @@ #define LEN_JACKMODES "\007" #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" +#define LEN_TARANIS_PROTOCOLS "\005" +#define TR_TARANIS_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""XJT2\0""DSM2\0""CRSF\0""MULT\0""R9M\0 ""R9M2\0""R9LT\0""R9LT2""R9LP2""SBUS\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index a05af8b65..5d55d27cf 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -104,8 +104,8 @@ #define LEN_JACKMODES "\007" #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" +#define LEN_TARANIS_PROTOCOLS "\005" +#define TR_TARANIS_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""XJT2\0""DSM2\0""CRSF\0""MULT\0""R9M\0 ""R9M2\0""R9LT\0""R9LT2""R9LP2""SBUS\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index e9fc37a67..4c61c8c35 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -106,8 +106,8 @@ #define LEN_JACKMODES "\007" #define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "UIT\0""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" +#define LEN_TARANIS_PROTOCOLS "\005" +#define TR_TARANIS_PROTOCOLS "UIT\0 ""PPM\0 ""XJT\0 ""XJT2\0""DSM2\0""CRSF\0""MULT\0""R9M\0 ""R9M2\0""R9LT\0""R9LT2""R9LP2""SBUS\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 65dd1aab9..71993cd87 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -104,8 +104,8 @@ #define LEN_JACKMODES "\007" #define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" +#define LEN_TARANIS_PROTOCOLS "\005" +#define TR_TARANIS_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""XJT2\0""DSM2\0""CRSF\0""MULT\0""R9M\0 ""R9M2\0""R9LT\0""R9LT2""R9LP2""SBUS\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 7831b2ac1..13d7c9995 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -104,8 +104,8 @@ #define LEN_JACKMODES "\007" #define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS )"OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" +#define LEN_TARANIS_PROTOCOLS "\005" +#define TR_TARANIS_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""XJT2\0""DSM2\0""CRSF\0""MULT\0""R9M\0 ""R9M2\0""R9LT\0""R9LT2""R9LP2""SBUS\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index f10c9a309..18d248fab 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -101,11 +101,11 @@ #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ") -#define LEN_JACKMODES "\007" -#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" +#define LEN_JACKMODES "\007" +#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" -#define LEN_TARANIS_PROTOCOLS "\004" -#define TR_TARANIS_PROTOCOLS "Av\0 ""PPM\0""XJT\0""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" +#define LEN_TARANIS_PROTOCOLS "\005" +#define TR_TARANIS_PROTOCOLS "Av\0 ""PPM\0 ""XJT\0 ""XJT2\0""DSM2\0""CRSF\0""MULT\0""R9M\0 ""R9M2\0""R9LT\0""R9LT2""R9LP2""SBUS\0" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" From 3ac767506a67e21c353ac7152c6abe41cadf6691 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 14 Mar 2019 18:08:39 +0100 Subject: [PATCH 325/446] TODO list removed --- TODO.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 TODO.md diff --git a/TODO.md b/TODO.md deleted file mode 100644 index b88c0481b..000000000 --- a/TODO.md +++ /dev/null @@ -1,3 +0,0 @@ - * X12S ne compile pas ? - * Revoir tous les check EEPROM size - * Sur X-Lite ModelSetup / Trainer params, scroll bizarre, ligne sans curseur ... \ No newline at end of file From 8dd5cb5c70877070a929bd9477a6da9139b353e3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 08:16:59 +0100 Subject: [PATCH 326/446] Compilation fix --- radio/src/targets/taranis/board.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 18ee13282..5c8bb4d74 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -445,6 +445,7 @@ enum Analogs { POT2, POT_LAST = POT2, #elif defined(PCBX9E) + POT2, POT3, POT4, POT_LAST = POT4, @@ -453,6 +454,7 @@ enum Analogs { SLIDER3, SLIDER4, #else + POT2, POT3, POT_LAST = POT3, SLIDER1, From 3626b147e7b074ea02a50c6ad51c85ac6ed824f7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 08:20:03 +0100 Subject: [PATCH 327/446] Warning changed to TODO --- radio/src/gui/128x64/model_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 50451dae1..bc09f9a82 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -27,7 +27,7 @@ #define EVT_BUTTON_PRESSED() EVT_KEY_BREAK(KEY_ENTER) #endif -#warning "TODO remove it" +// TODO can be moved to reusableBuffer uint8_t g_moduleIdx; void drawReceiverName(uint8_t x, uint8_t y, uint8_t receiverSlot) From 05b600205991ace55fdd30aa0d857344fce19734 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 09:49:25 +0100 Subject: [PATCH 328/446] Add a Module UID at REGISTER --- radio/src/datastructs.h | 8 +++--- radio/src/gui/128x64/model_setup.cpp | 39 +++++++++++++++++++--------- radio/src/opentx.h | 2 +- radio/src/pulses/pxx2.cpp | 2 +- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 6c54d6064..d280635e0 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -416,10 +416,10 @@ PACK(struct TrainerModuleData { */ PACK(struct ReceiverData { - uint8_t used:1; - uint8_t telemetry:1; - uint8_t dirty:6; - char name[PXX2_LEN_RX_NAME]; + uint8_t used:1; + uint8_t telemetry:1; + uint8_t dirty:6; + char name[PXX2_LEN_RX_NAME]; }); /* diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index bc09f9a82..3f12c9353 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -311,6 +311,13 @@ void onBindMenu(const char * result) moduleSettings[moduleIdx].mode = MODULE_MODE_BIND; } +enum PopupRegisterItems { + ITEM_REGISTER_PASSWORD, + ITEM_REGISTER_MODULE_INDEX, + ITEM_REGISTER_RECEIVER_NAME, + ITEM_REGISTER_BUTTONS +}; + void runPopupRegister(event_t event) { uint8_t backupVerticalPosition = menuVerticalPosition; @@ -324,12 +331,11 @@ void runPopupRegister(event_t event) switch (event) { case EVT_KEY_BREAK(KEY_ENTER): - if (menuVerticalPosition != 2) { + if (menuVerticalPosition != ITEM_REGISTER_BUTTONS) { break; } else if (reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED && menuHorizontalPosition == 0) { // [Enter] pressed - reusableBuffer.moduleSetup.pxx2.registerLoopIndex = get_tmr10ms(); reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; backupEditMode = EDIT_MODIFY_FIELD; // so that the [Register] button blinks and the REGISTER process can continue } @@ -347,23 +353,32 @@ void runPopupRegister(event_t event) } if (warningText) { - const uint8_t dialogRows[] = { 0, uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? READONLY_ROW : 0), uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? 0 : 1)}; - check(event, 0, nullptr, 0, dialogRows, 2, 3 - HEADER_LINE); // TODO add a comment for 3 - HEADER_LINE once understood + const uint8_t dialogRows[] = { 0, 0, uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? READONLY_ROW : 0), uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? 0 : 1)}; + check(event, 0, nullptr, 0, dialogRows, 3, 4 - HEADER_LINE); // TODO add a comment for 3 - HEADER_LINE once understood drawMessageBox(); - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 3, STR_REG_ID); - editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 3, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == 0); + // registration password + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 4, STR_REG_ID); + editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 4, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == ITEM_REGISTER_PASSWORD); + // module index + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 4 + FH, "UID"); + lcdDrawNumber(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 4 + FH, reusableBuffer.moduleSetup.pxx2.registerModuleIndex, menuVerticalPosition == ITEM_REGISTER_MODULE_INDEX ? (s_editMode ? INVERS + BLINK : INVERS) : 0); + if (menuVerticalPosition == ITEM_REGISTER_MODULE_INDEX && s_editMode) { + CHECK_INCDEC_MODELVAR_ZERO(event, reusableBuffer.moduleSetup.pxx2.registerModuleIndex, 7); + } + + // RX name if (reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED) { - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, "Waiting ..."); - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 ? INVERS : 0); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 4 + 2 * FH, "Waiting ..."); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + 3 * FH, TR_EXIT, menuVerticalPosition == ITEM_REGISTER_BUTTONS ? INVERS : 0); } else { - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + FH, STR_RX_NAME); - editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + FH, reusableBuffer.moduleSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == 1); - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH + 2, TR_ENTER, menuVerticalPosition == 2 && menuHorizontalPosition == 0 ? INVERS : 0); - lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y+2*FH + 2, TR_EXIT, menuVerticalPosition == 2 && menuHorizontalPosition == 1 ? INVERS : 0); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 4 + 2 * FH, STR_RX_NAME); + editName(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 4 + 2 * FH, reusableBuffer.moduleSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == ITEM_REGISTER_RECEIVER_NAME); + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 2 + 3 * FH, TR_ENTER, menuVerticalPosition == ITEM_REGISTER_BUTTONS && menuHorizontalPosition == 0 ? INVERS : 0); + lcdDrawText(WARNING_LINE_X + 8*FW, WARNING_LINE_Y - 2 + 3 * FH, TR_EXIT, menuVerticalPosition == ITEM_REGISTER_BUTTONS && menuHorizontalPosition == 1 ? INVERS : 0); } reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index ccc81f158..313efab39 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1129,7 +1129,7 @@ union ReusableBuffer uint8_t registerPopupHorizontalPosition; int8_t registerPopupEditMode; char registerRxName[PXX2_LEN_RX_NAME]; - uint8_t registerLoopIndex; + uint8_t registerModuleIndex; char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME + 1]; uint8_t bindCandidateReceiversCount; uint8_t bindReceiverId; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index cb55b1647..d881301e9 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -139,7 +139,7 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) for (uint8_t i=0; i Date: Fri, 15 Mar 2019 12:11:03 +0100 Subject: [PATCH 329/446] PXX2 probe on hold for now --- radio/src/gui/gui_common_arm.cpp | 2 +- .../common/arm/stm32/intmodule_serial_driver.cpp | 1 - radio/src/targets/horus/board.h | 14 +++++++++++++- radio/src/targets/taranis/board.cpp | 9 ++++----- radio/src/targets/taranis/board.h | 9 +++++++-- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index f4b6e6338..b1feab19f 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -532,7 +532,7 @@ bool isInternalModuleAvailable(int module) #if defined(PXX1) if (module == MODULE_TYPE_XJT) - return !IS_PXX2_INTERNAL_ENABLED() && !isModulePXX(EXTERNAL_MODULE); + return IS_PXX1_INTERNAL_ENABLED() && !isModulePXX(EXTERNAL_MODULE); #endif #if defined(PXX2) diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 4d70e3463..0f459d81d 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -146,4 +146,3 @@ void intmoduleSendNextFrame() #endif } } - diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index f09726de6..d17e716fe 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -205,7 +205,19 @@ PACK(typedef struct { extern HardwareOptions hardwareOptions; -#define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) +#if !defined(PXX2) + #define IS_PXX2_INTERNAL_ENABLED() (false) + #define IS_PXX1_INTERNAL_ENABLED() (true) +#elif !defined(PXX1) + #define IS_PXX2_INTERNAL_ENABLED() (true) + #define IS_PXX1_INTERNAL_ENABLED() (false) +#else + // TODO #define PXX2_PROBE + // TODO #define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) + #define IS_PXX2_INTERNAL_ENABLED() (true) + #define IS_PXX1_INTERNAL_ENABLED() (true) +#endif + void init_ppm(uint8_t module); void disable_ppm(uint8_t module); diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 4a9b60f38..0ef1cc30e 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -169,11 +169,6 @@ void boardInit() bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE); #endif -#if !defined(PCBXLITES) && !defined(PCBX3) && defined(PXX2) - #warning "PXX2 probe is not implemented" - hardwareOptions.pxx2Enabled = true; -#endif - #if !defined(PCBX9E) // some X9E boards need that the pwrInit() is moved a little bit later pwrInit(); @@ -213,6 +208,10 @@ void boardInit() hapticInit(); #endif +#if defined(PXX2_PROBE) + intmodulePxx2Probe(); +#endif + #if defined(DEBUG) DBGMCU_APB1PeriphConfig(DBGMCU_IWDG_STOP|DBGMCU_TIM1_STOP|DBGMCU_TIM2_STOP|DBGMCU_TIM3_STOP|DBGMCU_TIM6_STOP|DBGMCU_TIM8_STOP|DBGMCU_TIM10_STOP|DBGMCU_TIM13_STOP|DBGMCU_TIM14_STOP, ENABLE); #endif diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 5c8bb4d74..55f1a0520 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -493,10 +493,15 @@ extern HardwareOptions hardwareOptions; #if !defined(PXX2) #define IS_PXX2_INTERNAL_ENABLED() (false) -#elif defined(PCBXLITES) || defined(PCBX3) || defined(SIMU) + #define IS_PXX1_INTERNAL_ENABLED() (true) +#elif !defined(PXX1) || defined(PCBXLITES) || defined(PCBX3) #define IS_PXX2_INTERNAL_ENABLED() (true) + #define IS_PXX1_INTERNAL_ENABLED() (false) #else - #define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) + // TODO #define PXX2_PROBE + // TODO #define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) + #define IS_PXX2_INTERNAL_ENABLED() (true) + #define IS_PXX1_INTERNAL_ENABLED() (true) #endif enum CalibratedAnalogs { From cb6ee5e0b05047a71aa0d537ee61e593ed9d542d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 12:24:22 +0100 Subject: [PATCH 330/446] Compilation fixes on all boards --- radio/src/datastructs.h | 26 +++++++++---------- radio/src/gui/212x64/lcd.cpp | 4 +-- radio/src/gui/212x64/model_setup.cpp | 8 +++--- radio/src/mixer.cpp | 2 +- radio/src/pulses/pulses.cpp | 2 ++ .../src/targets/taranis/extmodule_driver.cpp | 2 ++ radio/src/targets/taranis/pulses_driver.cpp | 2 ++ 7 files changed, 25 insertions(+), 21 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index d280635e0..03b9dfc76 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -844,7 +844,7 @@ static inline void check_struct() /* Difference between Taranis/Horus is LEN_EXPOMIX_NAME */ /* LEN_FUNCTION_NAME is the difference in CustomFunctionData */ -#if defined(PCBX7) || defined(PCBXLITE) +#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX3) CHKSIZE(MixData, 20); CHKSIZE(ExpoData, 17); CHKSIZE(LimitData, 11); @@ -859,8 +859,6 @@ static inline void check_struct() CHKSIZE(FrSkyTelemetryData, 104); CHKSIZE(ModelHeader, 12); CHKSIZE(CurveData, 4); -#elif defined(PCBX3) - // TODO #elif defined(PCBTARANIS) CHKSIZE(MixData, 22); CHKSIZE(ExpoData, 19); @@ -925,7 +923,7 @@ static inline void check_struct() CHKSIZE(LogicalSwitchData, 9); CHKSIZE(TelemetrySensor, 13); - // TODO CHKSIZE(ModuleData,70); + CHKSIZE(ModuleData, 6); CHKSIZE(GVarData, 7); @@ -933,26 +931,26 @@ static inline void check_struct() CHKSIZE(TrainerData, 16); #if defined(PCBXLITES) - // TODO CHKSIZE(RadioData, 850); - // TODO CHKSIZE(ModelData, 6025); + CHKSIZE(RadioData, 858); + CHKSIZE(ModelData, 5940); #elif defined(PCBXLITE) - // TODO CHKSIZE(RadioData, 844); - // TODO CHKSIZE(ModelData, 6025); + CHKSIZE(RadioData, 852); + CHKSIZE(ModelData, 5940); #elif defined(PCBX7) -// TODO CHKSIZE(RadioData, 850); -// TODO CHKSIZE(ModelData, 6025); + CHKSIZE(RadioData, 858); + CHKSIZE(ModelData, 5940); #elif defined(PCBX9E) CHKSIZE(RadioData, 952); CHKSIZE(ModelData, 6520); #elif defined(PCBX9D) - // CHKSIZE(RadioData, 872); - // CHKSIZE(ModelData, 6507); + CHKSIZE(RadioData, 880); + CHKSIZE(ModelData, 6422); #elif defined(PCBSKY9X) CHKSIZE(RadioData, 727); CHKSIZE(ModelData, 5188); #elif defined(PCBHORUS) -// TODO CHKSIZE(RadioData, 847); -// TODO CHKSIZE(ModelData, 9380); + CHKSIZE(RadioData, 847); + CHKSIZE(ModelData, 9380); #endif #undef CHKSIZE diff --git a/radio/src/gui/212x64/lcd.cpp b/radio/src/gui/212x64/lcd.cpp index 104bbcc34..0ba2ef825 100644 --- a/radio/src/gui/212x64/lcd.cpp +++ b/radio/src/gui/212x64/lcd.cpp @@ -244,7 +244,7 @@ uint8_t getTextWidth(const char * s, uint8_t len, LcdFlags flags) { uint8_t width = 0; for (int i=0; len==0 || i= MIXSRC_FIRST_SWITCH) && (i <= MIXSRC_LAST_SWITCH)) { mixsrc_t sw = i-MIXSRC_FIRST_SWITCH; if (SWITCH_EXISTS(sw)) { - return (switchState(3*sw) ? -1024 : (switchState(3*sw+1) ? 0 : 1024)); + return (switchState(3*sw) ? -1024 : (IS_CONFIG_3POS(sw) && switchState(3*sw+1) ? 0 : 1024)); } else { return 0; diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index a4cb4b782..f5f1f50c6 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -275,7 +275,9 @@ void setupPulsesExternalModule(uint8_t protocol) extmodulePulsesData.pxx.setupFrame(EXTERNAL_MODULE); scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX_PULSES_PERIOD); break; +#endif +#if defined(PXX1) && defined(EXTMODULE_USART) case PROTOCOL_CHANNELS_PXX1_SERIAL: extmodulePulsesData.pxx_uart.setupFrame(EXTERNAL_MODULE); scheduleNextMixerCalculation(EXTERNAL_MODULE, EXTMODULE_PXX_SERIAL_PERIOD); diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index ef1802368..8af3e842f 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -275,7 +275,9 @@ void extmoduleSendNextFrame() EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA break; +#endif +#if defined(PXX1) && defined(EXTMODULE_USART) case PROTOCOL_CHANNELS_PXX1_SERIAL: extmoduleSendBuffer(extmodulePulsesData.pxx_uart.getData(), extmodulePulsesData.pxx_uart.getSize()); break; diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index b09c1fff0..fd5853856 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -33,8 +33,10 @@ void init_pxx1_serial(uint8_t module) { if (module == INTERNAL_MODULE) intmodulePxxStart(); +#if defined(EXTMODULE_USART) else extmodulePxxSerialStart(); +#endif } void disable_pxx1_pulses(uint8_t module) From f029baafe5ddf0f660d59d07aa33b6bf0b00690c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 12:36:59 +0100 Subject: [PATCH 331/446] Compilation fixes --- radio/src/targets/common/arm/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index c0fad4d91..0c80ad180 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -109,7 +109,7 @@ endif() if(MULTIMODULE) add_definitions(-DMULTIMODULE) - set(SRC ${SRC} pulses/multi_arm.cpp telemetry/spektrum.cpp telemetry/flysky_ibus.cpp telemetry/multi.cpp) + set(SRC ${SRC} pulses/multi.cpp telemetry/spektrum.cpp telemetry/flysky_ibus.cpp telemetry/multi.cpp) endif() if(CROSSFIRE) From c563c6c1f2cb1b6e41c2cc768f27596346728b19 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 14:13:32 +0100 Subject: [PATCH 332/446] Cosmetics --- radio/src/datastructs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 03b9dfc76..f691da745 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -557,9 +557,9 @@ typedef uint8_t swarnenable_t; swarnenable_t switchWarningEnable; #endif - #define MODEL_GVARS_DATA GVarData gvars[MAX_GVARS]; +#define MODEL_GVARS_DATA GVarData gvars[MAX_GVARS]; - #define TELEMETRY_DATA NOBACKUP(FrSkyTelemetryData frsky); NOBACKUP(RssiAlarmData rssiAlarms); +#define TELEMETRY_DATA NOBACKUP(FrSkyTelemetryData frsky); NOBACKUP(RssiAlarmData rssiAlarms); #if defined(PCBHORUS) #include "gui/480x272/layout.h" From 794a63778e29595796e4d9dd3cc5765cbcee180f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 19:00:40 +0100 Subject: [PATCH 333/446] [X3] fixes --- radio/src/gui/128x64/view_main.cpp | 12 +++++++++++- radio/src/opentx.cpp | 4 ++-- .../src/targets/common/arm/stm32/adc_driver.cpp | 4 ++-- radio/src/targets/taranis/hal.h | 16 ++++++++-------- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index 691c9f8a9..36ea906eb 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -499,7 +499,17 @@ void menuMainView(event_t event) doMainScreenGraphics(); // Switches -#if defined(PCBTARANIS) +#if defined(PCBX3) + static const uint8_t x[NUM_SWITCHES] = {2*FW-2, 2*FW-2, 16*FW+1, 2*FW-2, 16*FW+1}; + static const uint8_t y[NUM_SWITCHES] = {4*FH+1, 5*FH+1, 5*FH+1, 6*FH+1, 6*FH+1}; + for (int i=0; i 0 diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 23e9f7158..cc7148795 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -574,14 +574,14 @@ #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 - #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00 - #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01 - #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_2 // PA.02 - #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_3 // PA.03 - #define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0 - #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 - #define ADC_CHANNEL_STICK_LV ADC_Channel_2 // ADC1_IN2 - #define ADC_CHANNEL_STICK_LH ADC_Channel_3 // ADC1_IN3 + #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_0 // PA.00 + #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_1 // PA.01 + #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_2 // PA.02 + #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_3 // PA.03 + #define ADC_CHANNEL_STICK_LH ADC_Channel_0 // ADC1_IN0 + #define ADC_CHANNEL_STICK_LV ADC_Channel_1 // ADC1_IN1 + #define ADC_CHANNEL_STICK_RV ADC_Channel_2 // ADC1_IN2 + #define ADC_CHANNEL_STICK_RH ADC_Channel_3 // ADC1_IN3 #define ADC_GPIO_PIN_POT1 GPIO_Pin_1 // PC.01 #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 #define ADC_GPIOA_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) From 82428404e257b58a840952042efe36d3165f2b8c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 19:20:49 +0100 Subject: [PATCH 334/446] [X3] Fixes --- radio/src/dataconstants.h | 3 +++ radio/src/translations/cz.h.txt | 3 +++ radio/src/translations/de.h.txt | 3 +++ radio/src/translations/en.h.txt | 7 +++++-- radio/src/translations/es.h.txt | 3 +++ radio/src/translations/fi.h.txt | 3 +++ radio/src/translations/fr.h.txt | 3 +++ radio/src/translations/it.h.txt | 3 +++ radio/src/translations/nl.h.txt | 3 +++ radio/src/translations/pl.h.txt | 3 +++ radio/src/translations/pt.h.txt | 3 +++ radio/src/translations/se.h.txt | 3 +++ 12 files changed, 38 insertions(+), 2 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 7f5a44b3e..b1b493aea 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -553,6 +553,9 @@ enum MixSources { MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2") MIXSRC_LAST_POT = MIXSRC_POT2, +#elif defined(PCBX3) + MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") + MIXSRC_LAST_POT = MIXSRC_POT1, #elif defined(PCBTARANIS) MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2") diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 23c8094e3..38c9c7c3f 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -417,6 +417,9 @@ #elif defined(PCBX7) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0" +#elif defined(PCBX3) + #define TR_POTS_VSRCRAW "\310S1\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\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" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index a376f4d0b..49e7d623d 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -432,6 +432,9 @@ #elif defined(PCBX7) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0" +#elif defined(PCBX3) + #define TR_POTS_VSRCRAW "\310S1\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\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" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 7c9fa2be4..b642c7c48 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -421,6 +421,9 @@ #elif defined(PCBX7) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0" +#elif defined(PCBX3) + #define TR_POTS_VSRCRAW "\310S1\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\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" @@ -538,10 +541,10 @@ #endif #if defined(PCBTARANIS) - #define TR_POPUPS_ENTER_EXIT TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) + #define TR_POPUPS_ENTER_EXIT TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #else - #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT + #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) #endif diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 0282c2745..a5b1ab87e 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -421,6 +421,9 @@ #elif defined(PCBX7) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0" +#elif defined(PCBX3) + #define TR_POTS_VSRCRAW "\310S1\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\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" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 74c46e54a..a6431984c 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -421,6 +421,9 @@ #elif defined(PCBX7) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0" +#elif defined(PCBX3) + #define TR_POTS_VSRCRAW "\310S1\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\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" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 673f13721..94b8620ed 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -434,6 +434,9 @@ #elif defined(PCBX7) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0" +#elif defined(PCBX3) + #define TR_POTS_VSRCRAW "\310S1\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\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" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 5d55d27cf..94fc22110 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -423,6 +423,9 @@ #elif defined(PCBX7) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0" +#elif defined(PCBX3) + #define TR_POTS_VSRCRAW "\310S1\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\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" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 4c61c8c35..f503c74be 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -416,6 +416,9 @@ #elif defined(PCBX7) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0" +#elif defined(PCBX3) + #define TR_POTS_VSRCRAW "\310S1\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\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" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 71993cd87..8b88d5ab3 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -424,6 +424,9 @@ #elif defined(PCBX7) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0" +#elif defined(PCBX3) + #define TR_POTS_VSRCRAW "\310S1\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\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" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 13d7c9995..ce6d51c88 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -420,6 +420,9 @@ #elif defined(PCBX7) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0" +#elif defined(PCBX3) + #define TR_POTS_VSRCRAW "\310S1\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\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" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 18d248fab..7abf939b1 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -430,6 +430,9 @@ #elif defined(PCBX7) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0" +#elif defined(PCBX3) + #define TR_POTS_VSRCRAW "\310S1\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\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" From 13cf540785d7f8642f007da5a26af8048b9a2b01 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 19:26:41 +0100 Subject: [PATCH 335/446] [X3] Fixes --- radio/src/gui/128x64/model_special_functions.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/128x64/model_special_functions.cpp b/radio/src/gui/128x64/model_special_functions.cpp index 302fbcd2c..f266afffa 100644 --- a/radio/src/gui/128x64/model_special_functions.cpp +++ b/radio/src/gui/128x64/model_special_functions.cpp @@ -390,7 +390,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF else if (attr) { REPEAT_LAST_CURSOR_MOVE(); } -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) if (active || event==EVT_KEY_LONG(KEY_ENTER)) { CFN_PARAM(cfn) = CHECK_INCDEC_PARAM(event, val_displayed, val_min, val_max); if (func == FUNC_ADJUST_GVAR && attr && event==EVT_KEY_LONG(KEY_ENTER)) { @@ -409,7 +409,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF #else if (active) { CFN_PARAM(cfn) = CHECK_INCDEC_PARAM(event, val_displayed, val_min, val_max); -#endif // PCBX7 +#endif } break; } @@ -437,7 +437,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF break; } } -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) if (sub==k && menuHorizontalPosition<0 && CFN_SWITCH(cfn)) { lcdInvertLine(i+1); } @@ -447,7 +447,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF void menuModelSpecialFunctions(event_t event) { -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) const CustomFunctionData * cfn = &g_model.customFn[menuVerticalPosition]; if (!CFN_SWITCH(cfn) && menuHorizontalPosition < 0 && event==EVT_KEY_BREAK(KEY_ENTER)) { menuHorizontalPosition = 0; @@ -457,7 +457,7 @@ void menuModelSpecialFunctions(event_t event) menuSpecialFunctions(event, g_model.customFn, &modelFunctionsContext); -#if defined(PCBX7) +#if defined(PCBX7) || defined(PCBX3) if (!CFN_SWITCH(cfn) && menuHorizontalPosition == 0 && s_editMode <= 0) { menuHorizontalPosition = -1; } From e6a8c1eef134f6d2449d26f0051f49af603a64a0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 19:31:47 +0100 Subject: [PATCH 336/446] [X3] fixes --- radio/src/gui/128x64/radio_version.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 53de9ea9d..18ffd8085 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -22,7 +22,7 @@ #include "opentx.h" // TODO duplicated code -#if defined(PCBX7) || defined(PCBX9E) +#if defined(PCBX7) || defined(PCBX9E) || defined(PCBX3) #define EVT_KEY_NEXT_LINE EVT_ROTARY_RIGHT #define EVT_KEY_PREVIOUS_LINE EVT_ROTARY_LEFT #else From 5d23f09b317e48dcee93817acfabcd61466743d4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 19:32:53 +0100 Subject: [PATCH 337/446] Cosmetics --- radio/src/gui/128x64/popups.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/popups.cpp b/radio/src/gui/128x64/popups.cpp index f252fedac..42c235275 100644 --- a/radio/src/gui/128x64/popups.cpp +++ b/radio/src/gui/128x64/popups.cpp @@ -30,8 +30,8 @@ uint8_t warningInfoFlags = ZCHAR; void drawMessageBox() { - lcdDrawFilledRect(10, 16, LCD_W-20, 40, SOLID, ERASE); - lcdDrawRect(10, 16, LCD_W-20, 40); + lcdDrawFilledRect(10, 16, LCD_W-19, 40, SOLID, ERASE); + lcdDrawRect(10, 16, LCD_W-19, 40); lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y, warningText, WARNING_LINE_LEN); // could be a place for a warningInfoText } From cc611806411b16097fa8845e8fd12ace0c9aaee0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 19:38:05 +0100 Subject: [PATCH 338/446] [X3] Cosmetics --- radio/src/gui/128x64/popups.cpp | 5 ++--- radio/src/gui/128x64/popups.h | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/popups.cpp b/radio/src/gui/128x64/popups.cpp index 42c235275..538013bd8 100644 --- a/radio/src/gui/128x64/popups.cpp +++ b/radio/src/gui/128x64/popups.cpp @@ -25,13 +25,12 @@ const char * warningInfoText; uint8_t warningInfoLength; uint8_t warningType; uint8_t warningResult = 0; - uint8_t warningInfoFlags = ZCHAR; void drawMessageBox() { - lcdDrawFilledRect(10, 16, LCD_W-19, 40, SOLID, ERASE); - lcdDrawRect(10, 16, LCD_W-19, 40); + lcdDrawFilledRect(MENU_X, MENU_Y, MENU_W, 40, SOLID, ERASE); + lcdDrawRect(MENU_X, MENU_Y, MENU_W, 40); lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y, warningText, WARNING_LINE_LEN); // could be a place for a warningInfoText } diff --git a/radio/src/gui/128x64/popups.h b/radio/src/gui/128x64/popups.h index dbf555753..dccd0cda8 100644 --- a/radio/src/gui/128x64/popups.h +++ b/radio/src/gui/128x64/popups.h @@ -25,7 +25,7 @@ #define MENU_X 10 #define MENU_Y 16 -#define MENU_W LCD_W-(2*MENU_X) +#define MENU_W LCD_W - 19 #define WARNING_LINE_LEN 20 #define WARNING_LINE_X 16 #define WARNING_LINE_Y 3*FH From 9b54d9be4845bfff7ad31ef8831107c0b300ddaf Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 19:50:33 +0100 Subject: [PATCH 339/446] [X3] SD Manager fix --- .../src/gui/common/stdlcd/radio_sdmanager.cpp | 223 +++++++++--------- 1 file changed, 114 insertions(+), 109 deletions(-) diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index 7792238d6..78a3f7550 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -203,7 +203,7 @@ void menuRadioSdManager(event_t _event) #if defined(PCBX9) || defined(PCBX7) || defined(PCBX3) // TODO NO_MENU_KEY case EVT_KEY_LONG(KEY_MENU): - if (!READ_ONLY() && s_editMode == 0) { + if (SD_CARD_PRESENT() && !READ_ONLY() && s_editMode == 0) { killEvents(_event); POPUP_MENU_ADD_ITEM(STR_SD_INFO); POPUP_MENU_ADD_ITEM(STR_SD_FORMAT); @@ -247,7 +247,7 @@ void menuRadioSdManager(event_t _event) break; } #endif - if (s_editMode <= 0) { + if (SD_CARD_PRESENT() && s_editMode <= 0) { killEvents(_event); int index = menuVerticalPosition - HEADER_LINE - menuVerticalOffset; char * line = reusableBuffer.sdmanager.lines[index]; @@ -304,132 +304,137 @@ void menuRadioSdManager(event_t _event) break; } - if (reusableBuffer.sdmanager.offset != menuVerticalOffset) { - FILINFO fno; - DIR dir; + if (SD_CARD_PRESENT()) { + if (reusableBuffer.sdmanager.offset != menuVerticalOffset) { + FILINFO fno; + DIR dir; - if (menuVerticalOffset == 0) { - reusableBuffer.sdmanager.offset = 0; - memset(reusableBuffer.sdmanager.lines, 0, sizeof(reusableBuffer.sdmanager.lines)); - } - else if (menuVerticalOffset == reusableBuffer.sdmanager.count-NUM_BODY_LINES) { - reusableBuffer.sdmanager.offset = menuVerticalOffset; - memset(reusableBuffer.sdmanager.lines, 0, sizeof(reusableBuffer.sdmanager.lines)); - } - else if (menuVerticalOffset > reusableBuffer.sdmanager.offset) { - memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], (NUM_BODY_LINES-1)*sizeof(reusableBuffer.sdmanager.lines[0])); - memset(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1], 0xff, SD_SCREEN_FILE_LENGTH); - NODE_TYPE(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1]) = 1; - } - else { - memmove(reusableBuffer.sdmanager.lines[1], reusableBuffer.sdmanager.lines[0], (NUM_BODY_LINES-1)*sizeof(reusableBuffer.sdmanager.lines[0])); - memset(reusableBuffer.sdmanager.lines[0], 0, sizeof(reusableBuffer.sdmanager.lines[0])); - } + if (menuVerticalOffset == 0) { + reusableBuffer.sdmanager.offset = 0; + memset(reusableBuffer.sdmanager.lines, 0, sizeof(reusableBuffer.sdmanager.lines)); + } + else if (menuVerticalOffset == reusableBuffer.sdmanager.count-NUM_BODY_LINES) { + reusableBuffer.sdmanager.offset = menuVerticalOffset; + memset(reusableBuffer.sdmanager.lines, 0, sizeof(reusableBuffer.sdmanager.lines)); + } + else if (menuVerticalOffset > reusableBuffer.sdmanager.offset) { + memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], (NUM_BODY_LINES-1)*sizeof(reusableBuffer.sdmanager.lines[0])); + memset(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1], 0xff, SD_SCREEN_FILE_LENGTH); + NODE_TYPE(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1]) = 1; + } + else { + memmove(reusableBuffer.sdmanager.lines[1], reusableBuffer.sdmanager.lines[0], (NUM_BODY_LINES-1)*sizeof(reusableBuffer.sdmanager.lines[0])); + memset(reusableBuffer.sdmanager.lines[0], 0, sizeof(reusableBuffer.sdmanager.lines[0])); + } - reusableBuffer.sdmanager.count = 0; + reusableBuffer.sdmanager.count = 0; - FRESULT res = f_opendir(&dir, "."); // Open the directory - if (res == FR_OK) { - bool firstTime = true; - for (;;) { - res = sdReadDir(&dir, &fno, firstTime); - if (res != FR_OK || fno.fname[0] == 0) break; /* Break on error or end of dir */ - if (strlen(fno.fname) > SD_SCREEN_FILE_LENGTH) continue; - if (fno.fattrib & AM_HID) continue; /* Ignore Windows hidden files */ - if (fno.fname[0] == '.' && fno.fname[1] != '.') continue; /* Ignore UNIX hidden files, but not .. */ + FRESULT res = f_opendir(&dir, "."); // Open the directory + if (res == FR_OK) { + bool firstTime = true; + for (;;) { + res = sdReadDir(&dir, &fno, firstTime); + if (res != FR_OK || fno.fname[0] == 0) break; /* Break on error or end of dir */ + if (strlen(fno.fname) > SD_SCREEN_FILE_LENGTH) continue; + if (fno.fattrib & AM_HID) continue; /* Ignore Windows hidden files */ + if (fno.fname[0] == '.' && fno.fname[1] != '.') continue; /* Ignore UNIX hidden files, but not .. */ - reusableBuffer.sdmanager.count++; + reusableBuffer.sdmanager.count++; - bool isfile = !(fno.fattrib & AM_DIR); + bool isfile = !(fno.fattrib & AM_DIR); - if (menuVerticalOffset == 0) { - for (uint8_t i=0; i=0; i--) { + char * line = reusableBuffer.sdmanager.lines[i]; + if (line[0] == '\0' || isFilenameGreater(isfile, fno.fname, line)) { + if (i > 0) memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], sizeof(reusableBuffer.sdmanager.lines[0]) * i); + memset(line, 0, sizeof(reusableBuffer.sdmanager.lines[0])); + strcpy(line, fno.fname); + NODE_TYPE(line) = isfile; + break; + } + } + } + else if (menuVerticalOffset > reusableBuffer.sdmanager.offset) { + if (isFilenameGreater(isfile, fno.fname, reusableBuffer.sdmanager.lines[NUM_BODY_LINES-2]) && isFilenameLower(isfile, fno.fname, reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1])) { + memset(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1], 0, sizeof(reusableBuffer.sdmanager.lines[0])); + strcpy(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1], fno.fname); + NODE_TYPE(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1]) = isfile; + } + } + else { + if (isFilenameLower(isfile, fno.fname, reusableBuffer.sdmanager.lines[1]) && isFilenameGreater(isfile, fno.fname, reusableBuffer.sdmanager.lines[0])) { + memset(reusableBuffer.sdmanager.lines[0], 0, sizeof(reusableBuffer.sdmanager.lines[0])); + strcpy(reusableBuffer.sdmanager.lines[0], fno.fname); + NODE_TYPE(reusableBuffer.sdmanager.lines[0]) = isfile; } } } - else if (reusableBuffer.sdmanager.offset == menuVerticalOffset) { - for (int8_t i=NUM_BODY_LINES-1; i>=0; i--) { - char * line = reusableBuffer.sdmanager.lines[i]; - if (line[0] == '\0' || isFilenameGreater(isfile, fno.fname, line)) { - if (i > 0) memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], sizeof(reusableBuffer.sdmanager.lines[0]) * i); - memset(line, 0, sizeof(reusableBuffer.sdmanager.lines[0])); - strcpy(line, fno.fname); - NODE_TYPE(line) = isfile; - break; - } - } + f_closedir(&dir); + } + } + + reusableBuffer.sdmanager.offset = menuVerticalOffset; + int index = menuVerticalPosition - HEADER_LINE - menuVerticalOffset; + + for (uint8_t i=0; i reusableBuffer.sdmanager.offset) { - if (isFilenameGreater(isfile, fno.fname, reusableBuffer.sdmanager.lines[NUM_BODY_LINES-2]) && isFilenameLower(isfile, fno.fname, reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1])) { - memset(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1], 0, sizeof(reusableBuffer.sdmanager.lines[0])); - strcpy(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1], fno.fname); - NODE_TYPE(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1]) = isfile; + if (s_editMode == EDIT_MODIFY_STRING && attr) { + uint8_t extlen, efflen; + const char * ext = getFileExtension(reusableBuffer.sdmanager.originalName, 0, 0, NULL, &extlen); + editName(lcdNextPos, y, reusableBuffer.sdmanager.lines[i], SD_SCREEN_FILE_LENGTH - extlen, _event, attr, 0); + efflen = effectiveLen(reusableBuffer.sdmanager.lines[i], SD_SCREEN_FILE_LENGTH - extlen); + if (s_editMode == 0) { + if (ext) { + strAppend(&reusableBuffer.sdmanager.lines[i][efflen], ext); + } + else { + reusableBuffer.sdmanager.lines[i][efflen] = 0; + } + f_rename(reusableBuffer.sdmanager.originalName, reusableBuffer.sdmanager.lines[i]); + REFRESH_FILES(); } } else { - if (isFilenameLower(isfile, fno.fname, reusableBuffer.sdmanager.lines[1]) && isFilenameGreater(isfile, fno.fname, reusableBuffer.sdmanager.lines[0])) { - memset(reusableBuffer.sdmanager.lines[0], 0, sizeof(reusableBuffer.sdmanager.lines[0])); - strcpy(reusableBuffer.sdmanager.lines[0], fno.fname); - NODE_TYPE(reusableBuffer.sdmanager.lines[0]) = isfile; - } + lcdDrawText(lcdNextPos, y, reusableBuffer.sdmanager.lines[i], attr); + } + if (IS_DIRECTORY(reusableBuffer.sdmanager.lines[i])) { + lcdDrawChar(lcdNextPos, y, ']', s_editMode == EDIT_MODIFY_STRING ? 0 : attr); } } - f_closedir(&dir); } - } - - reusableBuffer.sdmanager.offset = menuVerticalOffset; - int index = menuVerticalPosition - HEADER_LINE - menuVerticalOffset; - - for (uint8_t i=0; i 1 - const char * ext = getFileExtension(reusableBuffer.sdmanager.lines[index]); - if (ext && isExtensionMatching(ext, BITMAPS_EXT)) { - if (lastPos != menuVerticalPosition) { - if (!lcdLoadBitmap(modelBitmap, reusableBuffer.sdmanager.lines[index], MODEL_BITMAP_WIDTH, MODEL_BITMAP_HEIGHT)) { - memcpy(modelBitmap, logo_taranis, MODEL_BITMAP_SIZE); + const char * ext = getFileExtension(reusableBuffer.sdmanager.lines[index]); + if (ext && isExtensionMatching(ext, BITMAPS_EXT)) { + if (lastPos != menuVerticalPosition) { + if (!lcdLoadBitmap(modelBitmap, reusableBuffer.sdmanager.lines[index], MODEL_BITMAP_WIDTH, MODEL_BITMAP_HEIGHT)) { + memcpy(modelBitmap, logo_taranis, MODEL_BITMAP_SIZE); + } } + lcdDrawBitmap(22*FW+2, 2*FH+FH/2, modelBitmap); } - lcdDrawBitmap(22*FW+2, 2*FH+FH/2, modelBitmap); - } #endif + } + else { + lcdDrawText(6*FW+3, 4*FH, STR_NO_SDCARD); + } } From 2ab0f14f302dff61c5fb6888805abc12494c2860 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 20:06:23 +0100 Subject: [PATCH 340/446] [X3] Navigation issue (SW-Warning line) --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 3f12c9353..15dc79dd7 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -770,7 +770,7 @@ void menuModelSetup(event_t event) for (int i=0; i= NUM_SWITCHES)) { lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN-1, y-1, 8*(2*FW+1), 1+FH*((current+4)/5)); } -#else //PCBTARANIS +#else // PCBTARANIS { lcdDrawTextAlignedLeft(y, STR_SWITCHWARNING); swarnstate_t states = g_model.switchWarningState; From e7cbd58875061ed3e968496957f8073c981abe93 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 Mar 2019 21:24:00 +0100 Subject: [PATCH 341/446] [X3] Trims inversion --- radio/src/targets/taranis/hal.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index cc7148795..4cc860d7d 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -160,10 +160,10 @@ #define TRIMS_GPIO_PIN_LVD GPIO_Pin_1 // PB.01 #define TRIMS_GPIO_REG_RVU GPIOE->IDR #define TRIMS_GPIO_PIN_RVU GPIO_Pin_13 // PE.13 - #define TRIMS_GPIO_REG_RVD GPIOD->IDR - #define TRIMS_GPIO_PIN_RVD GPIO_Pin_8 // PD.08 - #define TRIMS_GPIO_REG_RHR GPIOE->IDR - #define TRIMS_GPIO_PIN_RHR GPIO_Pin_14 // PE.14 + #define TRIMS_GPIO_REG_RHR GPIOD->IDR + #define TRIMS_GPIO_PIN_RHR GPIO_Pin_8 // PD.08 + #define TRIMS_GPIO_REG_RVD GPIOE->IDR + #define TRIMS_GPIO_PIN_RVD GPIO_Pin_14 // PE.14 #define TRIMS_GPIO_REG_RHL GPIOD->IDR #define TRIMS_GPIO_PIN_RHL GPIO_Pin_9 // PD.09 #else From eb8aa2d21840f27e4b05cdfa2ccb08b7e0f158de Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 16 Mar 2019 14:34:01 +0100 Subject: [PATCH 342/446] Fix --- radio/src/gui/128x64/model_logical_switches.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_logical_switches.cpp b/radio/src/gui/128x64/model_logical_switches.cpp index 97383ba5e..d8cf78c47 100644 --- a/radio/src/gui/128x64/model_logical_switches.cpp +++ b/radio/src/gui/128x64/model_logical_switches.cpp @@ -268,8 +268,8 @@ void menuModelLogicalSwitches(event_t event) POPUP_MENU_ADD_ITEM(STR_PASTE); if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw) POPUP_MENU_ADD_ITEM(STR_CLEAR); - if(popupMenuNoItems == 1) { - popupMenuNoItems = 0; + if(popupMenuItemsCount == 1) { + popupMenuItemsCount = 0; s_currIdx = sub; pushMenu(menuModelLogicalSwitchOne); } From 064fbc729c2dd2566c1f67763bddf53f5c48a250 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 16 Mar 2019 14:38:20 +0100 Subject: [PATCH 343/446] Fix --- radio/src/gui/128x64/radio_hardware.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 786dfbd6e..9b53134dd 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -172,7 +172,7 @@ void menuRadioHardware(event_t event) { MENU(STR_HARDWARE, menuTabGeneral, MENU_RADIO_HARDWARE, HEADER_LINE+ITEM_RADIO_HARDWARE_MAX, { HEADER_LINE_COLUMNS - LABEL(Sticks), + 0, 0, 0, 0, From db62647b3eb9ab258841cc80298dead6c0612b8c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 16 Mar 2019 14:44:57 +0100 Subject: [PATCH 344/446] Compilation fix on X9E --- radio/src/datastructs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index f691da745..be6ed736f 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -940,8 +940,8 @@ static inline void check_struct() CHKSIZE(RadioData, 858); CHKSIZE(ModelData, 5940); #elif defined(PCBX9E) - CHKSIZE(RadioData, 952); - CHKSIZE(ModelData, 6520); + CHKSIZE(RadioData, 960); + CHKSIZE(ModelData, 6435); #elif defined(PCBX9D) CHKSIZE(RadioData, 880); CHKSIZE(ModelData, 6422); From ce0a58b79075a8c8c3d3a748a2339921b3ff11f8 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 16 Mar 2019 15:28:53 +0100 Subject: [PATCH 345/446] Multi fixes --- radio/src/gui/212x64/model_setup.cpp | 2 +- radio/src/gui/gui_common_arm.cpp | 5 +++++ radio/src/pulses/multi.cpp | 10 +++++----- radio/src/pulses/pulses.h | 1 + radio/src/telemetry/spektrum.cpp | 8 ++++---- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 9f2c0cf50..4e31ea4df 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1081,7 +1081,7 @@ void menuModelSetup(event_t event) } moduleSettings[moduleIdx].mode = newFlag; #if defined(MULTIMODULE) - if (newFlag == MODULE_BIND) + if (newFlag == MODULE_MODE_BIND) multiBindStatus = MULTI_BIND_INITIATED; #endif } diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index b1feab19f..b48a718ef 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -545,6 +545,11 @@ bool isInternalModuleAvailable(int module) bool isExternalModuleAvailable(int module) { +#if !defined(PCBXLITE) + if (module == MODULE_TYPE_R9M_LITE || module == MODULE_TYPE_R9M_LITE2 || module == MODULE_TYPE_R9M_LITE_PRO2) { + return false; + } +#endif #if !defined(PXX1) if (module == MODULE_TYPE_XJT || module == MODULE_TYPE_R9M || module == MODULE_TYPE_R9M_LITE) { return false; diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index d75085b40..4465a9c08 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -57,7 +57,7 @@ static void sendFailsafeChannels(uint8_t port) uint8_t bitsavailable = 0; for (int i = 0; i < MULTI_CHANS; i++) { - int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[i]; + int16_t failsafeValue = g_model.failsafeChannels[i]; int pulseValue; if (g_model.moduleData[port].failsafeMode == FAILSAFE_HOLD) failsafeValue = FAILSAFE_CHANNEL_HOLD; @@ -106,7 +106,7 @@ void setupPulsesMultimodule() sendSetupFrame(); } else if (counter % 1000 == 0 && g_model.moduleData[EXTERNAL_MODULE].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[EXTERNAL_MODULE].failsafeMode != FAILSAFE_RECEIVER) { sendFrameProtocolHeader(EXTERNAL_MODULE, true); - sendFailsafeChannels(port); + sendFailsafeChannels(EXTERNAL_MODULE); } else { // Normal Frame sendFrameProtocolHeader(EXTERNAL_MODULE, false); @@ -152,16 +152,16 @@ void sendFrameProtocolHeader(uint8_t port, bool failsafe) int8_t optionValue = g_model.moduleData[port].multi.optionValue; uint8_t protoByte = 0; - if (moduleSettings[port].mode == MODULE_BIND) + if (moduleSettings[port].mode == MODULE_MODE_BIND) protoByte |= MULTI_SEND_BIND; - else if (moduleSettings[port].mode == MODULE_RANGECHECK) + else if (moduleSettings[port].mode == MODULE_MODE_RANGECHECK) protoByte |= MULTI_SEND_RANGECHECK; // rfProtocol if (g_model.moduleData[port].getMultiProtocol(true) == MM_RF_PROTO_DSM2) { // Autobinding should always be done in DSMX 11ms - if (g_model.moduleData[port].multi.autoBindMode && moduleSettings[port].mode == MODULE_BIND) + if (g_model.moduleData[port].multi.autoBindMode && moduleSettings[port].mode == MODULE_MODE_BIND) subtype = MM_RF_DSM2_SUBTYPE_AUTO; // Multi module in DSM mode wants the number of channels to be used as option value diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 37eacb033..3308f30bf 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -202,6 +202,7 @@ void setupPulsesPPMTrainer(); void sendByteDsm2(uint8_t b); void putDsm2Flush(); void putDsm2SerialBit(uint8_t bit); +void sendByteSbus(uint8_t b); #if defined(HUBSAN) void Hubsan_Init(); diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index ad6762d20..96c7102d0 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -173,14 +173,14 @@ const SpektrumSensor spektrumSensors[] = { {I2C_CELLS, 8, uint16, ZSTR_CELLS, UNIT_VOLTS, 2}, {I2C_CELLS, 10, uint16, ZSTR_CELLS, UNIT_VOLTS, 2}, {I2C_CELLS, 12, uint16, ZSTR_TEMP2, UNIT_CELSIUS, 2}, - + // Vario-S {0x40, 0, int16, ZSTR_ALT, UNIT_METERS, 1}, {0x40, 2, int16, ZSTR_VSPD, UNIT_METERS_PER_SECOND, 1}, // 0x50-0x56 custom 3rd party sensors //{0x50, 0, int16, ZSTR_} - + // 0x7d are transmitter channels frame data [7], probably only available on the Spektrum // telemetry bus on the model itself @@ -333,7 +333,7 @@ void processSpektrumPacket(const uint8_t *packet) } telemetryStreaming = TELEMETRY_TIMEOUT10ms; } - + uint16_t pseudoId = (sensor->i2caddress << 8 | sensor->startByte); setTelemetryValue(TELEM_PROTO_SPEKTRUM, pseudoId, 0, instance, value, sensor->unit, sensor->precision); } @@ -400,7 +400,7 @@ void processDSMBindPacket(const uint8_t *packet) setTelemetryValue(TELEM_PROTO_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 4, 0, 0, debugval, UNIT_RAW, 0); /* Finally stop binding as the rx just told us that it is bound */ - if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2 && moduleSettings[EXTERNAL_MODULE].mode == MODULE_BIND) { + if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2 && moduleSettings[EXTERNAL_MODULE].mode == MODULE_MODE_BIND) { multiBindStatus=MULTI_BIND_FINISHED; } } From 2bc7d7dd9b33f8f7de2189534404104d0fc336cc Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 16 Mar 2019 23:08:13 +0100 Subject: [PATCH 346/446] Battery / Capacity / Temperature calib moved to HARDWARE menu [PXX2] REGISTRATION ID moved to RADIO SETUP --- radio/src/gui/128x64/radio_diaganas.cpp | 42 ----------- radio/src/gui/128x64/radio_hardware.cpp | 94 +++++++++++++++++++------ radio/src/gui/128x64/radio_setup.cpp | 50 +++++++++++-- radio/src/gui/212x64/radio_hardware.cpp | 2 +- radio/src/translations.cpp | 2 +- radio/src/translations.h | 2 +- radio/src/translations/cz.h.txt | 2 +- radio/src/translations/de.h.txt | 2 +- radio/src/translations/en.h.txt | 8 +-- radio/src/translations/es.h.txt | 2 +- radio/src/translations/fi.h.txt | 2 +- radio/src/translations/fr.h.txt | 4 +- radio/src/translations/it.h.txt | 2 +- radio/src/translations/nl.h.txt | 2 +- radio/src/translations/pl.h.txt | 2 +- radio/src/translations/pt.h.txt | 2 +- radio/src/translations/se.h.txt | 2 +- 17 files changed, 134 insertions(+), 88 deletions(-) diff --git a/radio/src/gui/128x64/radio_diaganas.cpp b/radio/src/gui/128x64/radio_diaganas.cpp index 7665f7ca4..dc30519ac 100644 --- a/radio/src/gui/128x64/radio_diaganas.cpp +++ b/radio/src/gui/128x64/radio_diaganas.cpp @@ -67,48 +67,6 @@ void menuRadioDiagAnalogs(event_t event) } #endif - -#if defined(PCBTARANIS) - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH + 2, STR_BATT_CALIB); - putsVolts(LEN_CALIB_FIELDS*FW+FW, MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH + 2, getBatteryVoltage(), (menuVerticalPosition==HEADER_LINE ? INVERS | (s_editMode > 0 ? BLINK : 0) : 0) | PREC2 | LEFT); -#elif defined(PCBSKY9X) - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+1+4*FH, STR_BATT_CALIB); - static int32_t adcBatt; - // TODO board.cpp - adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8; - uint32_t batCalV = (adcBatt + adcBatt*(g_eeGeneral.txVoltageCalibration)/128) * 4191; - batCalV /= 55296; - putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT+1+4*FH, batCalV, (menuVerticalPosition==HEADER_LINE ? INVERS : 0)); -#else - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH, STR_BATT_CALIB); - putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH, g_vbat100mV, (menuVerticalPosition==HEADER_LINE ? INVERS : 0)); -#endif - - if (menuVerticalPosition == HEADER_LINE) { - CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127); - } - -#if defined(TX_CAPACITY_MEASUREMENT) - lcdDrawTextAlignedLeft(6*FH+1, STR_CURRENT_CALIB); - drawValueWithUnit(LEN_CALIB_FIELDS*FW+4*FW, 6*FH+1, getCurrent(), UNIT_MILLIAMPS, (menuVerticalPosition==2 ? INVERS : 0)) ; - if (menuVerticalPosition==2) CHECK_INCDEC_GENVAR(event, g_eeGeneral.txCurrentCalibration, -49, 49); -#endif - -#if defined(PCBSKY9X) - #if defined(TX_CAPACITY_MEASUREMENT) - #define TEMP_CALIB_POS 7*FH+1 - #define TEMP_CALIB_MENU_POS 3 - #else - #define TEMP_CALIB_POS 6*FH+1 - #define TEMP_CALIB_MENU_POS 2 - #endif - - lcdDrawTextAlignedLeft(TEMP_CALIB_POS, STR_TEMP_CALIB); - drawValueWithUnit(LEN_CALIB_FIELDS*FW+4*FW, TEMP_CALIB_POS, getTemperature(), UNIT_TEMPERATURE, (menuVerticalPosition==TEMP_CALIB_MENU_POS ? INVERS : 0)) ; - if (menuVerticalPosition==TEMP_CALIB_MENU_POS) - CHECK_INCDEC_GENVAR(event, g_eeGeneral.temperatureCalib, -100, 100); -#endif - #if (NUM_PWMSTICKS > 0) && !defined(SIMU) lcdDrawTextAlignedLeft(7*FH, STICKS_PWM_ENABLED() ? "Sticks: PWM" : "Sticks: ANA"); #endif diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 9b53134dd..01a412394 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -111,11 +111,18 @@ enum MenuRadioHardwareItems { ITEM_RADIO_HARDWARE_SB, ITEM_RADIO_HARDWARE_SC, ITEM_RADIO_HARDWARE_SD, -#if NUM_SWITCHES > 4 +#if NUM_SWITCHES >= 5 ITEM_RADIO_HARDWARE_SF, #endif -#if NUM_SWITCHES > 5 +#if NUM_SWITCHES >= 6 ITEM_RADIO_HARDWARE_SH, +#endif + ITEM_RADIO_HARDWARE_BATTERY_CALIB, +#if defined(TX_CAPACITY_MEASUREMENT) + ITEM_RADIO_HARDWARE_CAPACITY_CALIB, +#endif +#if defined(PCBSKY9X) + ITEM_RADIO_HARDWARE_TEMPERATURE_CALIB, #endif #if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE, @@ -128,7 +135,6 @@ enum MenuRadioHardwareItems { ITEM_RADIO_HARDWARE_BLUETOOTH_NAME, #endif ITEM_RADIO_HARDWARE_JITTER_FILTER, - ITEM_RADIO_OWNER_ID, ITEM_RADIO_HARDWARE_DEBUG, ITEM_RADIO_HARDWARE_MAX }; @@ -147,7 +153,9 @@ enum MenuRadioHardwareItems { #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #endif -#if defined(PCBTARANIS) +#if defined(PCBX3) + #define BLUETOOTH_ROWS +#elif defined(PCBTARANIS) #define BLUETOOTH_ROWS uint8_t(IS_BLUETOOTH_CHIP_PRESENT() ? 0 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY ? -1 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), #elif defined(BLUETOOTH) #define BLUETOOTH_ROWS 0, uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), @@ -170,34 +178,41 @@ enum MenuRadioHardwareItems { void menuRadioHardware(event_t event) { - MENU(STR_HARDWARE, menuTabGeneral, MENU_RADIO_HARDWARE, HEADER_LINE+ITEM_RADIO_HARDWARE_MAX, { + MENU(STR_HARDWARE, menuTabGeneral, MENU_RADIO_HARDWARE, HEADER_LINE + ITEM_RADIO_HARDWARE_MAX, { HEADER_LINE_COLUMNS - 0, - 0, - 0, - 0, - 0, + 0 /* calibration button */, + 0 /* stick 1 */, + 0 /* stick 2 */, + 0 /* stick 3 */, + 0 /* stick 4 */, LABEL(Pots), POTS_ROWS, LABEL(Switches), SWITCHES_ROWS, + 0 /* battery calib */, +#if defined(TX_CAPACITY_MEASUREMENT) + 0, +#endif +#if defined(PCBSKY9X) + 0, +#endif #if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 0 /* max bauds */, #endif BLUETOOTH_ROWS 0 /* jitter filter */, - 0 /* owner id */, - 1 /* debugs */ + 1 /* debugs */, }); uint8_t sub = menuVerticalPosition - HEADER_LINE; - for (uint8_t i=0; i0) ? BLINK|INVERS : INVERS); uint8_t attr = (sub == k ? blink : 0); @@ -249,10 +264,10 @@ void menuRadioHardware(event_t event) case ITEM_RADIO_HARDWARE_SB: case ITEM_RADIO_HARDWARE_SC: case ITEM_RADIO_HARDWARE_SD: -#if NUM_SWITCHES > 4 +#if NUM_SWITCHES >= 5 case ITEM_RADIO_HARDWARE_SF: #endif -#if NUM_SWITCHES > 5 +#if NUM_SWITCHES >= 6 case ITEM_RADIO_HARDWARE_SH: #endif { @@ -271,6 +286,47 @@ void menuRadioHardware(event_t event) break; } + case ITEM_RADIO_HARDWARE_BATTERY_CALIB: +#if defined(PCBTARANIS) + lcdDrawTextAlignedLeft(y, STR_BATT_CALIB); + putsVolts(HW_SETTINGS_COLUMN2, y, getBatteryVoltage(), attr|PREC2|LEFT); +#elif defined(PCBSKY9X) + lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+1+4*FH, STR_BATT_CALIB); + static int32_t adcBatt; + // TODO board.cpp + adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8; + uint32_t batCalV = (adcBatt + adcBatt*(g_eeGeneral.txVoltageCalibration)/128) * 4191; + batCalV /= 55296; + putsVolts(HW_SETTINGS_COLUMN2, y, batCalV, (menuVerticalPosition==HEADER_LINE ? INVERS : 0)); +#else + lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH, STR_BATT_CALIB); + putsVolts(HW_SETTINGS_COLUMN2, y, g_vbat100mV, attr|LEFT); +#endif + if (attr) { + CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127); + } + break; + +#if defined(TX_CAPACITY_MEASUREMENT) + case ITEM_RADIO_HARDWARE_BATTERY_CALIB: + lcdDrawTextAlignedLeft(y, STR_CURRENT_CALIB); + drawValueWithUnit(HW_SETTINGS_COLUMN2, y, getCurrent(), UNIT_MILLIAMPS, attr) ; + if (attr) { + CHECK_INCDEC_GENVAR(event, g_eeGeneral.txCurrentCalibration, -49, 49); + } + break; +#endif + +#if defined(PCBSKY9X) + case ITEM_RADIO_HARDWARE_TEMPERATURE_CALIB: + lcdDrawTextAlignedLeft(y, STR_TEMP_CALIB); + drawValueWithUnit(HW_SETTINGS_COLUMN2, y, getTemperature(), UNIT_TEMPERATURE, attr) ; + if (attr) { + CHECK_INCDEC_GENVAR(event, g_eeGeneral.temperatureCalib, -100, 100); + } + break; +#endif + #if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 case ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE: lcdDrawTextAlignedLeft(y, STR_MAXBAUDRATE); @@ -328,14 +384,10 @@ void menuRadioHardware(event_t event) g_eeGeneral.jitterFilter = 1 - editCheckBox(1 - g_eeGeneral.jitterFilter, HW_SETTINGS_COLUMN2, y, STR_JITTER_FILTER, attr, event); break; - case ITEM_RADIO_OWNER_ID: - editSingleName(HW_SETTINGS_COLUMN2, y, STR_OWNER_ID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, attr); - break; - case ITEM_RADIO_HARDWARE_DEBUG: lcdDrawTextAlignedLeft(y, STR_DEBUG); lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0); - lcdDrawText(lcdLastRightPos + 2, y, STR_SWITCHES_BTN, menuHorizontalPosition == 1 ? attr : 0); + lcdDrawText(lcdLastRightPos + 2, y, STR_KEYS_BTN, menuHorizontalPosition == 1 ? attr : 0); if (attr && event == EVT_KEY_FIRST(KEY_ENTER)) { if (menuHorizontalPosition == 0) pushMenu(menuRadioDiagAnalogs); diff --git a/radio/src/gui/128x64/radio_setup.cpp b/radio/src/gui/128x64/radio_setup.cpp index 118ba8efd..25d407045 100644 --- a/radio/src/gui/128x64/radio_setup.cpp +++ b/radio/src/gui/128x64/radio_setup.cpp @@ -26,9 +26,9 @@ const unsigned char sticks[] = { #include "sticks.lbm" }; -#define RADIO_SETUP_2ND_COLUMN (LCD_W-6*FW-3) +#define RADIO_SETUP_2ND_COLUMN (LCD_W-7*FW-3) #define RADIO_SETUP_DATE_COLUMN (FW*15+7) -#define RADIO_SETUP_TIME_COLUMN (FW*15+9) +#define RADIO_SETUP_TIME_COLUMN (RADIO_SETUP_2ND_COLUMN + 2 * FWNUM) #define SLIDER_5POS(y, value, label, event, attr) { \ int8_t tmp = value; \ @@ -88,6 +88,9 @@ enum MenuRadioSetupItems { CASE_PWM_BACKLIGHT(ITEM_SETUP_BACKLIGHT_BRIGHTNESS_ON) ITEM_SETUP_FLASH_BEEP, CASE_SPLASH_PARAM(ITEM_SETUP_DISABLE_SPLASH) +#if defined(PXX2) + ITEM_RADIO_OWNER_ID, +#endif CASE_GPS(ITEM_SETUP_TIMEZONE) ITEM_SETUP_ADJUST_RTC, CASE_GPS(ITEM_SETUP_GPSFORMAT) @@ -132,11 +135,38 @@ void menuRadioSetup(event_t event) } #endif - MENU(STR_MENURADIOSETUP, menuTabGeneral, MENU_RADIO_SETUP, HEADER_LINE+ITEM_SETUP_MAX, { HEADER_LINE_COLUMNS CASE_RTCLOCK(2) CASE_RTCLOCK(2) CASE_BATTGRAPH(1) - LABEL(SOUND), CASE_AUDIO(0) CASE_BUZZER(0) 0, 0, 0, 0, 0, CASE_AUDIO(0) CASE_VARIO(LABEL(VARIO)) CASE_VARIO(0) CASE_VARIO(0) CASE_VARIO(0) CASE_VARIO(0) CASE_HAPTIC(LABEL(HAPTIC)) CASE_HAPTIC(0) CASE_HAPTIC(0) CASE_HAPTIC(0) 0, LABEL(ALARMS), 0, CASE_CAPACITY(0) CASE_PCBSKY9X(0) 0, 0, 0, 0, IF_ROTARY_ENCODERS(0) LABEL(BACKLIGHT), 0, 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, CASE_SPLASH_PARAM(0) CASE_GPS(0) 0, CASE_GPS(0) CASE_PXX(0) 0, 0, IF_FAI_CHOICE(0) 0, - CASE_STM32(0) // USB mode - CASE_JACK_DETECT(0) // Jack mode - 0, COL_TX_MODE, 0, 1/*to force edit mode*/}); + MENU(STR_MENURADIOSETUP, menuTabGeneral, MENU_RADIO_SETUP, HEADER_LINE+ITEM_SETUP_MAX, { + HEADER_LINE_COLUMNS CASE_RTCLOCK(2) CASE_RTCLOCK(2) CASE_BATTGRAPH(1) + LABEL(SOUND), CASE_AUDIO(0) + CASE_BUZZER(0) + 0, 0, 0, 0, 0, CASE_AUDIO(0) + CASE_VARIO(LABEL(VARIO)) + CASE_VARIO(0) + CASE_VARIO(0) + CASE_VARIO(0) + CASE_VARIO(0) + CASE_HAPTIC(LABEL(HAPTIC)) + CASE_HAPTIC(0) + CASE_HAPTIC(0) + CASE_HAPTIC(0) + 0, LABEL(ALARMS), 0, CASE_CAPACITY(0) + CASE_PCBSKY9X(0) + 0, 0, 0, 0, IF_ROTARY_ENCODERS(0) + LABEL(BACKLIGHT), 0, 0, 0, CASE_PWM_BACKLIGHT(0) + CASE_PWM_BACKLIGHT(0) + 0, + CASE_SPLASH_PARAM(0) +#if defined(PXX2) + 0 /* owner registration ID */, +#endif + CASE_GPS(0) + 0, CASE_GPS(0) + CASE_PXX(0) + 0, 0, IF_FAI_CHOICE(0) + 0, + CASE_STM32(0) // USB mode + CASE_JACK_DETECT(0) // Jack mode + 0, COL_TX_MODE, 0, 1/*to force edit mode*/}); if (event == EVT_ENTRY) { reusableBuffer.generalSettings.stickMode = g_eeGeneral.stickMode; @@ -472,6 +502,12 @@ void menuRadioSetup(event_t event) } #endif +#if defined(PXX2) + case ITEM_RADIO_OWNER_ID: + editSingleName(RADIO_SETUP_2ND_COLUMN, y, STR_OWNER_ID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, attr); + break; +#endif + #if defined(TELEMETRY_FRSKY) && defined(GPS) case ITEM_SETUP_TIMEZONE: lcdDrawTextAlignedLeft(y, STR_TIMEZONE); diff --git a/radio/src/gui/212x64/radio_hardware.cpp b/radio/src/gui/212x64/radio_hardware.cpp index c67501d18..d3e86a989 100644 --- a/radio/src/gui/212x64/radio_hardware.cpp +++ b/radio/src/gui/212x64/radio_hardware.cpp @@ -243,7 +243,7 @@ void menuRadioHardware(event_t event) lcdDrawTextAlignedLeft(y, STR_DEBUG); lcdDrawText(HW_SETTINGS_COLUMN , y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0); - lcdDrawText(lcdLastRightPos + 2, y, STR_SWITCHES_BTN, menuHorizontalPosition == 1 ? attr : 0); + lcdDrawText(lcdLastRightPos + 2, y, STR_KEYS_BTN, menuHorizontalPosition == 1 ? attr : 0); if (attr && event == EVT_KEY_FIRST(KEY_ENTER)) { if (menuHorizontalPosition == 0) pushMenu(menuRadioDiagAnalogs); diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 075301146..010436cb8 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -464,7 +464,7 @@ const char STR_SUBTYPE[] = TR_SUBTYPE; const char STR_RESET_BTN[] = TR_RESET_BTN; const char STR_DEBUG[] = TR_DEBUG; -const char STR_SWITCHES_BTN[] = TR_SWITCHES_BTN; +const char STR_KEYS_BTN[] = TR_KEYS_BTN; const char STR_ANALOGS_BTN[] = TR_ANALOGS_BTN; const char STR_CALIB_BTN[] = TR_CALIB_BTN; diff --git a/radio/src/translations.h b/radio/src/translations.h index 34a09a9f4..a35f847aa 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -663,7 +663,7 @@ extern const char STR_PERSISTENT_MAH[]; extern const char STR_RESET_BTN[]; extern const char STR_DEBUG[]; -extern const char STR_SWITCHES_BTN[]; +extern const char STR_KEYS_BTN[]; extern const char STR_ANALOGS_BTN[]; extern const char STR_CALIB_BTN[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index c43db8254..790b541de 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -973,7 +973,7 @@ #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") #define TR_DEBUG "Debug" -#define TR_SWITCHES_BTN BUTTON(TR("SW","Switches")) +#define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIB_BTN BUTTON("Calibration") #define TR_SET BUTTON("Volby") diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 75d645c1b..4fc2b912e 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -978,7 +978,7 @@ #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") #define TR_DEBUG "Debug" -#define TR_SWITCHES_BTN BUTTON(TR("SW","Switches")) +#define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIB_BTN BUTTON("Calibration") #define TR_SET BUTTON("Set") diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index dd9124e54..212732ee0 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -806,7 +806,7 @@ #define TR_POWEROFF "\027Power OFF..." #define TR_SHUTDOWN "SHUTTING DOWN" #define TR_SAVEMODEL "Saving model settings" -#define TR_BATT_CALIB TR("Battery calib", "Battery calibration") +#define TR_BATT_CALIB TR("Batt. calib", "Battery calibration") #define TR_CURRENT_CALIB "Current calib" #define TR_VOLTAGE TR(INDENT "Voltage", INDENT "Voltage source") #define TR_CURRENT TR(INDENT "Current", INDENT "Current source") @@ -972,13 +972,13 @@ #define TR_REGISTER_BUTTON BUTTON(TR("Reg", "Register")) #define TR_RXADD_BUTTON BUTTON("Add") #define TR_MODULE_RANGE BUTTON(TR("Rng", "Range")) -#define TR_BUTTON_SHARE BUTTON("Share") +#define TR_BUTTON_SHARE BUTTON("Share") #define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("Reset") #define TR_DEBUG "Debug" -#define TR_SWITCHES_BTN BUTTON(TR("SW","Switches")) -#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_KEYS_BTN BUTTON(TR("Keys", "Switches")) +#define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) #define TR_CALIB_BTN BUTTON("Calibration") #define TR_SET BUTTON("Set") #define TR_TRAINER "Trainer" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 161fb22b0..c02976c82 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -984,7 +984,7 @@ #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" -#define TR_SWITCHES_BTN BUTTON(TR("SW","Switches")) +#define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIB_BTN BUTTON("Calibration") #define TR_SET "[Ajuste]" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 9ab2741b6..bd63d19ec 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -976,7 +976,7 @@ #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" -#define TR_SWITCHES_BTN BUTTON(TR("SW","Switches")) +#define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIB_BTN BUTTON("Calibration") #define TR_SET "[Set]" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index fb05b49dd..ec1eba44e 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -988,8 +988,8 @@ #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN BUTTON("RAZ") #define TR_DEBUG "Debug" -#define TR_SWITCHES_BTN BUTTON(TR("SW","Switches")) -#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_KEYS_BTN BUTTON(TR("Swtchs", "Switches")) +#define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) #define TR_CALIB_BTN BUTTON("Calibration") #define TR_SET BUTTON("Déf") #define TR_TRAINER "Ecolage" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index ec1bb3954..9958a3a34 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -978,7 +978,7 @@ #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" -#define TR_SWITCHES_BTN BUTTON(TR("SW","Switches")) +#define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIB_BTN BUTTON("Calibration") #define TR_SET "[Set]" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 61914d8f6..3df6734d7 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -979,7 +979,7 @@ #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" -#define TR_SWITCHES_BTN BUTTON(TR("SW","Switches")) +#define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIB_BTN BUTTON("Calibration") #define TR_SET "[Set]" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 102e8ed35..5439f35d8 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -979,7 +979,7 @@ #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" -#define TR_SWITCHES_BTN BUTTON(TR("SW","Switches")) +#define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIB_BTN BUTTON("Calibration") #define TR_SET "[Set]" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index eced2ed04..2ed660a3e 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -983,7 +983,7 @@ #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" -#define TR_SWITCHES_BTN BUTTON(TR("SW","Switches")) +#define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIB_BTN BUTTON("Calibration") #define TR_SET "[Set]" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 3ce1f38b6..7b6d2a81f 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -992,7 +992,7 @@ #define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) #define TR_RESET_BTN "[Nollställ]" #define TR_DEBUG "Debug" -#define TR_SWITCHES_BTN BUTTON(TR("SW","Switches")) +#define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIB_BTN BUTTON("Calibration") #define TR_SET "[Spara]" From c597c0087c186201736477ea19f61788daa25247 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 16 Mar 2019 23:43:28 +0100 Subject: [PATCH 347/446] RX SET SETTINGS fix --- radio/src/gui/128x64/model_setup.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 15dc79dd7..af1c46a7a 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -844,6 +844,7 @@ void menuModelSetup(event_t event) #endif break; } + #if defined(PCBTARANIS) case ITEM_MODEL_POTS_WARNING: lcdDrawTextAlignedLeft(y, STR_POTWARNING); @@ -1959,7 +1960,7 @@ void menuModelReceiverOptions(event_t event) const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; uint8_t wbar = LCD_W / 2 - 20; - SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + sentModuleChannels(g_moduleIdx), {IF_TELEM_DISPLAYED(0), IF_PWM_RATE_DISPLAYED(0)}); + SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + sentModuleChannels(g_moduleIdx)); int8_t sub = menuVerticalPosition; lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); From 6b499ea23df8638611a99e6a61ba89344c855e0f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 17 Mar 2019 14:50:26 +0100 Subject: [PATCH 348/446] RX SET SETTINGS fix --- radio/src/gui/128x64/model_setup.cpp | 19 +++++++++---------- radio/src/opentx.h | 1 + radio/src/pulses/pxx2.cpp | 22 +++++++++------------- radio/src/pulses/pxx2.h | 6 +++--- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index af1c46a7a..821b5ec4d 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1376,11 +1376,13 @@ void menuModelSetup(event_t event) } } else { + // for now we will send the SHARE frame indefinitely (until the user manually stops it) if (event == EVT_KEY_BREAK(KEY_ENTER)) { - moduleSettings[moduleIdx].mode = MODULE_MODE_SHARE; + moduleSettings[moduleIdx].mode ^= MODULE_MODE_SHARE; reusableBuffer.moduleSetup.pxx2.shareReceiverIndex = receiverIdx; - s_editMode = 0; - POPUP_INFORMATION("Receiver shared"); + } + else if (event == EVT_KEY_BREAK(KEY_EXIT)) { + moduleSettings[moduleIdx].mode &= ~MODULE_MODE_SHARE; } } } @@ -1947,8 +1949,6 @@ enum MenuModelReceiverOptions { }; #define RECEIVER_OPTIONS_2ND_COLUMN 80 -#define IF_TELEM_DISPLAYED(x) (g_model.moduleData[g_moduleIdx].pxx.receiver_telem_off ? (uint8_t)(x) : HIDDEN_ROW) //Todo need capabilities -#define IF_PWM_RATE_DISPLAYED(x) (g_model.moduleData[g_moduleIdx].pxx.receiver_telem_off ? (uint8_t)(x) : HIDDEN_ROW) //Todo need capabilities void menuModelReceiverOptions(event_t event) { @@ -1967,16 +1967,15 @@ void menuModelReceiverOptions(event_t event) drawReceiverName(FW * 13, 0, reusableBuffer.receiverSetup.receiverId); lcdInvertLine(0); - if (event == EVT_ENTRY || (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_READ && get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { - reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 500/*5s*/; + if (event == EVT_ENTRY) { moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } - if (!s_editMode && reusableBuffer.receiverSetup.dirty && (reusableBuffer.receiverSetup.state != RECEIVER_SETTINGS_WRITE || get_tmr10ms() >= reusableBuffer.receiverSetup.updateTime)) { + if (!s_editMode && reusableBuffer.receiverSetup.dirty && reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_OK) { reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_WRITE; reusableBuffer.receiverSetup.dirty = 0; reusableBuffer.receiverSetup.timeout = 0; - reusableBuffer.receiverSetup.updateTime = get_tmr10ms() + 100/*1s*/; + reusableBuffer.receiverSetup.dirtyTimeout = get_tmr10ms() + 300/*3s*/; moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } @@ -1984,7 +1983,7 @@ void menuModelReceiverOptions(event_t event) reusableBuffer.receiverSetup.state = 0xFF; #endif - if (reusableBuffer.receiverSetup.state > RECEIVER_SETTINGS_READ) { + if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_OK || get_tmr10ms() < reusableBuffer.receiverSetup.dirtyTimeout) { for (uint8_t k=0; k reusableBuffer.receiverSetup.timeout) { - reusableBuffer.receiverSetup.timeout = 0; - moduleSettings[module].mode = MODULE_MODE_NORMAL; - } - setupChannelsFrame(module); - } - else { + if (get_tmr10ms() > reusableBuffer.receiverSetup.timeout) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); - Pxx2Transport::addByte(reusableBuffer.receiverSetup.state + reusableBuffer.receiverSetup.receiverId); + uint8_t flag0 = reusableBuffer.receiverSetup.receiverId; + if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_WRITE) + flag0 |= PXX2_RX_SETTINGS_FLAG0_WRITE; + Pxx2Transport::addByte(flag0); uint8_t flag1 = 0; if (reusableBuffer.receiverSetup.pwmRate) flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; @@ -166,7 +162,10 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) for (int i = 0; i < channelsCount; i++) { Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); } - reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 30/*300ms*/; + reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 30/*next try in 300ms*/; + } + else { + setupChannelsFrame(module); } } @@ -224,10 +223,7 @@ void Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) void Pxx2Pulses::setupShareMode(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_SHARE); - Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.shareReceiverIndex); - - moduleSettings[module].mode = MODULE_MODE_NORMAL; } void Pxx2Pulses::setupFrame(uint8_t module) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 13105f386..beae30fb0 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -63,9 +63,9 @@ enum PXX2BindSteps { }; enum PXX2ReceiverStatus { - RECEIVER_SETTINGS_READ = 0x00, - RECEIVER_SETTINGS_OK, - RECEIVER_SETTINGS_WRITE = PXX2_RX_SETTINGS_FLAG0_WRITE + RECEIVER_SETTINGS_READ, + RECEIVER_SETTINGS_WRITE, + RECEIVER_SETTINGS_OK }; extern ModuleFifo intmoduleFifo; From 7e64b1953aa6243f5cc6b17951b120c5e2d424eb Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 17 Mar 2019 11:58:11 +0100 Subject: [PATCH 349/446] Fix 6194 --- radio/src/gui/480x272/model_setup.cpp | 3 +++ radio/src/opentx.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 5edb39c02..603ff9bf6 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -102,6 +102,9 @@ enum MenuModelSetupItems { void checkModelIdUnique(uint8_t moduleIdx) { + if(isModulePXX(moduleIdx) && IS_D8_RX(moduleIdx)) + return; + char* warn_buf = reusableBuffer.moduleSetup.msg; // cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 07f2dad2b..cebe9c335 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -370,6 +370,9 @@ void applyDefaultTemplate() #if defined(EEPROM) void checkModelIdUnique(uint8_t index, uint8_t module) { + if(isModulePXX(module) && IS_D8_RX(module)) + return; + uint8_t modelId = g_model.header.modelId[module]; uint8_t additionalOnes = 0; char * name = reusableBuffer.moduleSetup.msg; From d5bcd41eee1ec789f8224c368250c7b77a34364d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 17 Mar 2019 16:27:36 +0100 Subject: [PATCH 350/446] RX SET SETTINGS timeout changed --- radio/src/pulses/pxx2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index e00f12972..f01570ece 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -162,7 +162,7 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) for (int i = 0; i < channelsCount; i++) { Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); } - reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 30/*next try in 300ms*/; + reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 100/*next try in 1s*/; } else { setupChannelsFrame(module); From fb534f13e804f6e81b2381c02adffaca0de083a6 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 17 Mar 2019 16:30:56 +0100 Subject: [PATCH 351/446] RX SET SETTINGS timeout changed --- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/pulses/pxx2.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 821b5ec4d..ee185a907 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1975,7 +1975,7 @@ void menuModelReceiverOptions(event_t event) reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_WRITE; reusableBuffer.receiverSetup.dirty = 0; reusableBuffer.receiverSetup.timeout = 0; - reusableBuffer.receiverSetup.dirtyTimeout = get_tmr10ms() + 300/*3s*/; + reusableBuffer.receiverSetup.dirtyTimeout = get_tmr10ms() + 500/*5s*/; moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index f01570ece..a0b61eb28 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -162,7 +162,7 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) for (int i = 0; i < channelsCount; i++) { Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); } - reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 100/*next try in 1s*/; + reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 200/*next try in 2s*/; } else { setupChannelsFrame(module); From 7bac3066fe9ca0f66255b8e391d186f5d652d553 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Mar 2019 10:29:12 +0100 Subject: [PATCH 352/446] Radio menus reordered --- radio/src/gui/128x64/menus.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index c77a01188..22b0fc206 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -85,11 +85,11 @@ enum MenuRadioIndexes CASE_SDCARD(MENU_RADIO_SD_MANAGER) MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, - MENU_RADIO_VERSION, - MENU_RADIO_HARDWARE, #if defined(RADIO_SPECTRUM) MENU_RADIO_SPECTRUM, #endif + MENU_RADIO_HARDWARE, + MENU_RADIO_VERSION, MENU_RADIO_PAGES_COUNT }; @@ -109,11 +109,11 @@ static const MenuHandlerFunc menuTabGeneral[] = { CASE_SDCARD(menuRadioSdManager) menuRadioSpecialFunctions, menuRadioTrainer, - menuRadioVersion, - menuRadioHardware, #if defined(RADIO_SPECTRUM) menuRadioSpectrum, #endif + menuRadioHardware, + menuRadioVersion }; enum MenuModelIndexes { From 57a2a5c8c7be46c6ea47edab4434e77d7d37aca5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Mar 2019 10:29:57 +0100 Subject: [PATCH 353/446] [X3] Batt ADC multiplier adjusted --- radio/src/targets/taranis/board.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 55f1a0520..7e070d33d 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -551,6 +551,8 @@ uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps #define BATT_SCALE 131 #elif defined(PCBX7) #define BATT_SCALE 123 +#elif defined(PCBX3) + #define BATT_SCALE 117 #else #define BATT_SCALE 150 #endif From 2e81b2ca50add38f85657d3fce7956ed815076d2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Mar 2019 10:54:07 +0100 Subject: [PATCH 354/446] [PXX2] Telemetry bit added --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- radio/src/opentx.h | 2 +- radio/src/pulses/pxx2.cpp | 2 ++ radio/src/pulses/pxx2.h | 8 +++++--- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index ee185a907..8ce031250 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1980,7 +1980,7 @@ void menuModelReceiverOptions(event_t event) } #if defined(SIMU) - reusableBuffer.receiverSetup.state = 0xFF; + reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_OK; #endif if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_OK || get_tmr10ms() < reusableBuffer.receiverSetup.dirtyTimeout) { @@ -1991,7 +1991,7 @@ void menuModelReceiverOptions(event_t event) switch (i) { case ITEM_RECEIVER_TELEMETRY: - reusableBuffer.receiverSetup.telemetryEnabled = editCheckBox(reusableBuffer.receiverSetup.telemetryEnabled, RECEIVER_OPTIONS_2ND_COLUMN, y, "Telemetry", attr, event); + reusableBuffer.receiverSetup.telemetryDisabled = editCheckBox(reusableBuffer.receiverSetup.telemetryDisabled, RECEIVER_OPTIONS_2ND_COLUMN, y, "Telem. disabled", attr, event); if (attr && checkIncDec_Ret) { reusableBuffer.receiverSetup.dirty = true; } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index fcf7f00a5..90f66ee62 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1148,7 +1148,7 @@ union ReusableBuffer tmr10ms_t updateTime; uint8_t receiverId; uint8_t channelMapping[24]; - uint8_t telemetryEnabled; + uint8_t telemetryDisabled; uint8_t pwmRate; uint8_t dirty; } receiverSetup; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index a0b61eb28..a46793d8b 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -155,6 +155,8 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) flag0 |= PXX2_RX_SETTINGS_FLAG0_WRITE; Pxx2Transport::addByte(flag0); uint8_t flag1 = 0; + if (reusableBuffer.receiverSetup.telemetryDisabled) + flag1 |= PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED; if (reusableBuffer.receiverSetup.pwmRate) flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; Pxx2Transport::addByte(flag1); diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index beae30fb0..e9a18a47b 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -44,9 +44,11 @@ #define PXX2_CHANNELS_FLAG0_FAILSAFE (1 << 6) #define PXX2_CHANNELS_FLAG0_RANGECHECK (1 << 7) -#define PXX2_RX_SETTINGS_FLAG0_WRITE (1 << 6) -#define PXX2_RX_SETTINGS_FLAG1_FASTPWM (1 << 4) -#define PXX2_RECV_OPTION_MASK_TELEMETRY 0x00 // TODO : update when defined +#define PXX2_RX_SETTINGS_FLAG0_WRITE (1 << 6) + +#define PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED (1 << 7) +#define PXX2_RX_SETTINGS_FLAG1_READONLY (1 << 6) +#define PXX2_RX_SETTINGS_FLAG1_FASTPWM (1 << 4) enum PXX2RegisterSteps { REGISTER_START, From 16d84391bb354fbe0b80dcced1fa83be8b685cb2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Mar 2019 11:48:58 +0100 Subject: [PATCH 355/446] [PXX2] Fixes --- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/opentx.h | 2 +- radio/src/pulses/pxx2.cpp | 2 +- radio/src/telemetry/frsky_pxx2.cpp | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 8ce031250..5a1b16245 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1379,7 +1379,7 @@ void menuModelSetup(event_t event) // for now we will send the SHARE frame indefinitely (until the user manually stops it) if (event == EVT_KEY_BREAK(KEY_ENTER)) { moduleSettings[moduleIdx].mode ^= MODULE_MODE_SHARE; - reusableBuffer.moduleSetup.pxx2.shareReceiverIndex = receiverIdx; + reusableBuffer.moduleSetup.pxx2.shareReceiverId = receiverSlot; } else if (event == EVT_KEY_BREAK(KEY_EXIT)) { moduleSettings[moduleIdx].mode &= ~MODULE_MODE_SHARE; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 90f66ee62..4d4191b60 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1135,7 +1135,7 @@ union ReusableBuffer uint8_t bindReceiverId; union { uint8_t bindSelectedReceiverIndex; - uint8_t shareReceiverIndex; + uint8_t shareReceiverId; }; } pxx2; }; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index a46793d8b..286497bb0 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -225,7 +225,7 @@ void Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) void Pxx2Pulses::setupShareMode(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_SHARE); - Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.shareReceiverIndex); + Pxx2Transport::addByte(reusableBuffer.moduleSetup.pxx2.shareReceiverId); } void Pxx2Pulses::setupFrame(uint8_t module) diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 565ff5a27..d78af961c 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -74,8 +74,8 @@ void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FASTPWM) reusableBuffer.receiverSetup.pwmRate = 1; -// if (frame[4] & PXX2_RECV_OPTION_MASK_TELEMETRY) -// reusableBuffer.receiverSetup.telemetryEnabled = 1; + if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED) + reusableBuffer.receiverSetup.telemetryDisabled = 1; reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_OK; reusableBuffer.receiverSetup.timeout = 0; From 916d279918c7d37f7222c55f26fce3433305ab02 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Mar 2019 14:34:46 +0100 Subject: [PATCH 356/446] Conversions refactoring started --- radio/src/storage/conversions/conversions.cpp | 106 +++++ radio/src/storage/conversions/conversions.h | 4 + .../conversions/conversions_216_217.cpp | 247 +++++++++++ .../storage/conversions/conversions_216_217.h | 0 .../conversions/conversions_217_218.cpp | 284 +++++++++++++ .../src/storage/conversions/datastructs_216.h | 396 ++++++++++++++++++ .../src/storage/conversions/datastructs_217.h | 362 ++++++++++++++++ 7 files changed, 1399 insertions(+) create mode 100644 radio/src/storage/conversions/conversions.cpp create mode 100644 radio/src/storage/conversions/conversions.h create mode 100644 radio/src/storage/conversions/conversions_216_217.cpp create mode 100644 radio/src/storage/conversions/conversions_216_217.h create mode 100644 radio/src/storage/conversions/conversions_217_218.cpp create mode 100644 radio/src/storage/conversions/datastructs_216.h create mode 100644 radio/src/storage/conversions/datastructs_217.h diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp new file mode 100644 index 000000000..02c6642df --- /dev/null +++ b/radio/src/storage/conversions/conversions.cpp @@ -0,0 +1,106 @@ +/* + * 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. + */ + +void ConvertModel(int id, int version) +{ + eeLoadModelData(id); + + if (version == 216) { + version = 217; + ConvertModel_216_to_217(g_model); + } + if (version == 217) { + version = 218; + ConvertModel_217_to_218(g_model); + } + + uint8_t currModel = g_eeGeneral.currModel; + g_eeGeneral.currModel = id; + storageDirty(EE_MODEL); + storageCheck(true); + g_eeGeneral.currModel = currModel; +} + +bool eeConvert() +{ + const char *msg = NULL; + + if (g_eeGeneral.version == 216) { + msg = "EEprom Data v216"; + } + else if (g_eeGeneral.version == 217) { + msg = "EEprom Data v217"; + } + else { + return false; + } + + int conversionVersionStart = g_eeGeneral.version; + + // Information to the user and wait for key press +#if defined(PCBSKY9X) + g_eeGeneral.optrexDisplay = 0; +#endif + g_eeGeneral.backlightMode = e_backlight_mode_on; + g_eeGeneral.backlightBright = 0; + g_eeGeneral.contrast = 25; + + ALERT(STR_STORAGE_WARNING, msg, AU_BAD_RADIODATA); + + RAISE_ALERT(STR_STORAGE_WARNING, STR_EEPROM_CONVERTING, NULL, AU_NONE); + + // General Settings conversion + eeLoadGeneralSettingsData(); + int version = conversionVersionStart; + if (version == 216) { + version = 217; + ConvertRadioData_216_to_217(g_eeGeneral); + } + if (version == 217) { + version = 218; + ConvertRadioData_217_to_218(g_eeGeneral); + } + storageDirty(EE_GENERAL); + storageCheck(true); + +#if defined(COLORLCD) +#elif LCD_W >= 212 + lcdDrawRect(60, 6*FH+4, 132, 3); +#else + lcdDrawRect(10, 6*FH+4, 102, 3); +#endif + + // Models conversion + for (uint8_t id=0; id= 212 + lcdDrawSolidHorizontalLine(61, 6*FH+5, 10+id*2, FORCE); +#else + lcdDrawSolidHorizontalLine(11, 6*FH+5, 10+(id*3)/2, FORCE); +#endif + lcdRefresh(); + if (eeModelExists(id)) { + ConvertModel(id, conversionVersionStart); + } + + } + + return true; +} diff --git a/radio/src/storage/conversions/conversions.h b/radio/src/storage/conversions/conversions.h new file mode 100644 index 000000000..fce5915b4 --- /dev/null +++ b/radio/src/storage/conversions/conversions.h @@ -0,0 +1,4 @@ + +void ConvertModel(int id, int version); + +bool eeConvert(); diff --git a/radio/src/storage/conversions/conversions_216_217.cpp b/radio/src/storage/conversions/conversions_216_217.cpp new file mode 100644 index 000000000..fe069a164 --- /dev/null +++ b/radio/src/storage/conversions/conversions_216_217.cpp @@ -0,0 +1,247 @@ + +int ConvertTelemetrySource_216_to_217(int source) +{ + // TELEM_TIMER3 added +// if (source >= TELEM_TIMER3) + // source += 1; + + return source; +} + +#if defined(PCBTARANIS) +int ConvertSwitch_216_to_217(int swtch) +{ + if (swtch < 0) + return -ConvertSwitch_216_to_217(-swtch); + + if (swtch > SWSRC_SF0) + swtch += 1; + + if (swtch > SWSRC_SH0) + swtch += 1; + + return swtch; +} +#else +int ConvertSwitch_216_to_217(int swtch) +{ + return swtch; +} +#endif + +int ConvertSource_216_to_217(int source) +{ +#if defined(PCBX9E) + // SI to SR switches added + if (source >= MIXSRC_SI) + source += 10; +#endif + // Telemetry conversions + if (source >= MIXSRC_FIRST_TELEM) + source = 0; + + return source; +} + +int ConvertGVar_216_to_217(int value) +{ + if (value < -4096 + 9) + value += 4096 - 1024; + else if (value > 4095 - 9) + value -= 4095 - 1023; + return value; +} + + + +void ConvertRadioData_216_to_217(RadioData & settings) +{ + RadioData_v216 * settings_v216 = (RadioData_v216 *)&settings; + settings_v216->version = 217; +#if defined(PCBTARANIS) + settings_v216->potsConfig = 0x05; // S1 and S2 = pots with detent + settings_v216->switchConfig = 0x00007bff; // 6x3POS, 1x2POS, 1xTOGGLE +#endif +} + + +void ConvertModel_216_to_217(ModelData & model) +{ + // Timer3 added + // 32bits Timers + // MixData reduction + // PPM center range + // Telemetry custom screens + + assert(sizeof(ModelData_v216) <= sizeof(ModelData)); + + ModelData_v216 oldModel; + memcpy(&oldModel, &model, sizeof(oldModel)); + ModelData_v217 & newModel = (ModelData_v217 &)model; + memset(&newModel, 0, sizeof(ModelData_v217)); + + char name[LEN_MODEL_NAME+1]; + zchar2str(name, oldModel.header.name, LEN_MODEL_NAME); + TRACE("Model %s conversion from v216 to v217", name); + + newModel.header.modelId[0] = oldModel.header.modelId; + memcpy(newModel.header.name, oldModel.header.name, LEN_MODEL_NAME); +#if defined(PCBTARANIS) && LCD_W >= 212 + memcpy(newModel.header.bitmap, oldModel.header.bitmap, LEN_BITMAP_NAME); +#endif + + for (uint8_t i=0; i<2; i++) { + TimerData_v217 & timer = newModel.timers[i]; + if (oldModel.timers[i].mode >= TMRMODE_COUNT) + timer.mode = TMRMODE_COUNT + ConvertSwitch_216_to_217(oldModel.timers[i].mode - TMRMODE_COUNT + 1) - 1; + else + timer.mode = ConvertSwitch_216_to_217(oldModel.timers[i].mode); + timer.start = oldModel.timers[i].start; + timer.countdownBeep = oldModel.timers[i].countdownBeep; + timer.minuteBeep = oldModel.timers[i].minuteBeep; + timer.persistent = oldModel.timers[i].persistent; + timer.value = oldModel.timers[i].value; + } + newModel.telemetryProtocol = oldModel.telemetryProtocol; + newModel.thrTrim = oldModel.thrTrim; + newModel.trimInc = oldModel.trimInc; + newModel.disableThrottleWarning = oldModel.disableThrottleWarning; + newModel.displayChecklist = oldModel.displayChecklist; + newModel.extendedLimits = oldModel.extendedLimits; + newModel.extendedTrims = oldModel.extendedTrims; + newModel.throttleReversed = oldModel.throttleReversed; + newModel.beepANACenter = oldModel.beepANACenter; + for (int i=0; i> 6; + newModel.potsWarnEnabled = oldModel.nPotsToWarn & 0x1f; + memcpy(newModel.potsWarnPosition, oldModel.potPosition, sizeof(newModel.potsWarnPosition)); +} diff --git a/radio/src/storage/conversions/conversions_216_217.h b/radio/src/storage/conversions/conversions_216_217.h new file mode 100644 index 000000000..e69de29bb diff --git a/radio/src/storage/conversions/conversions_217_218.cpp b/radio/src/storage/conversions/conversions_217_218.cpp new file mode 100644 index 000000000..adc119cbe --- /dev/null +++ b/radio/src/storage/conversions/conversions_217_218.cpp @@ -0,0 +1,284 @@ + +int ConvertSwitch_217_to_218(int swtch) +{ + // 32 additional logical switches + + if (swtch < 0) + return -ConvertSwitch_217_to_218(-swtch); + + if (swtch >= SWSRC_FIRST_LOGICAL_SWITCH+32) + return swtch+32; + + return swtch; +} + + + +int ConvertSource_217_to_218(int source) +{ +#if defined(PCBTARANIS) + if (source >= MIXSRC_FIRST_LOGICAL_SWITCH + 32) + source += 32; +#endif + + return source; +} + + + +void ConvertSpecialFunctions_217_to_218(CustomFunctionData * cf218, CustomFunctionData_v216 * cf216) +{ + for (int i=0; i= TMRMODE_COUNT) + newModel.timers[i].mode = TMRMODE_COUNT + ConvertSwitch_217_to_218(oldModel.timers[i].mode - TMRMODE_COUNT + 1) - 1; + else + newModel.timers[i].mode = ConvertSwitch_217_to_218(oldModel.timers[i].mode); + if (oldModel.timers[i].mode) + TRACE("timer mode %d => %d", oldModel.timers[i].mode, newModel.timers[i].mode); + newModel.timers[i].start = oldModel.timers[i].start; + newModel.timers[i].value = oldModel.timers[i].value; + newModel.timers[i].countdownBeep = oldModel.timers[i].countdownBeep; + newModel.timers[i].minuteBeep = oldModel.timers[i].minuteBeep; + newModel.timers[i].persistent = oldModel.timers[i].persistent; + memcpy(newModel.timers[i].name, oldModel.timers[i].name, sizeof(newModel.timers[i].name)); + } + newModel.telemetryProtocol = oldModel.telemetryProtocol; + newModel.thrTrim = oldModel.thrTrim; + newModel.noGlobalFunctions = oldModel.noGlobalFunctions; + newModel.displayTrims = oldModel.displayTrims; + newModel.ignoreSensorIds = oldModel.ignoreSensorIds; + newModel.trimInc = oldModel.trimInc; + newModel.disableThrottleWarning = oldModel.disableThrottleWarning; + newModel.displayChecklist = oldModel.displayChecklist; + newModel.extendedLimits = oldModel.extendedLimits; + newModel.extendedTrims = oldModel.extendedTrims; + newModel.throttleReversed = oldModel.throttleReversed; + newModel.beepANACenter = oldModel.beepANACenter; + for (int i=0; i> (2*i)) & 0x03) == TELEMETRY_SCREEN_TYPE_VALUES) { + for (int j = 0; j < 4; j++) { + for (int k = 0; k < NUM_LINE_ITEMS; k++) { + newModel.frsky.screens[i].lines[j].sources[k] = ConvertSource_217_to_218(oldModel.frsky.screens[i].lines[j].sources[k]); + } + } + } + else if (((oldModel.frsky.screensType >> (2*i)) & 0x03) == TELEMETRY_SCREEN_TYPE_GAUGES) { + for (int j = 0; j < 4; j++) { + newModel.frsky.screens[i].bars[j].source = ConvertSource_217_to_218(oldModel.frsky.screens[i].bars[j].source); + } + } + } + for (int i=0; i UNIT_WATTS) + newModel.telemetrySensors[i].unit += 1; + } +#if defined(PCBX9E) + newModel.toplcdTimer = oldModel.toplcdTimer; +#endif +} + diff --git a/radio/src/storage/conversions/datastructs_216.h b/radio/src/storage/conversions/datastructs_216.h new file mode 100644 index 000000000..22d7a21a6 --- /dev/null +++ b/radio/src/storage/conversions/datastructs_216.h @@ -0,0 +1,396 @@ +#if defined(PCBTARANIS) +PACK(typedef struct { + uint8_t srcRaw; + uint16_t scale; + uint8_t chn; + int8_t swtch; + uint16_t flightModes; + int8_t weight; + int8_t carryTrim:6; + uint8_t mode:2; + char name[LEN_EXPOMIX_NAME]; + int8_t offset; + CurveRef curve; + uint8_t spare; +}) ExpoData_v216; +#else +PACK(typedef struct { + uint8_t mode:2; // 0=end, 1=pos, 2=neg, 3=both + uint8_t chn:4; + uint8_t curveMode:2; + int8_t swtch; + uint16_t flightModes; + int8_t weight; + char name[LEN_EXPOMIX_NAME]; + int8_t curveParam; +}) ExpoData_v216; +typedef ExpoData_v216; +#endif + +#if defined(PCBTARANIS) +PACK(typedef struct { + int16_t min; + int16_t max; + int8_t ppmCenter; + int16_t offset:14; + uint16_t symetrical:1; + uint16_t revert:1; + char name[LEN_CHANNEL_NAME]; + int8_t curve; +}) LimitData_v216; +#else +PACK(struct LimitData { + int32_t min:11; + int32_t max:11; + int32_t ppmCenter:10; + int16_t offset:11; + uint16_t symetrical:1; + uint16_t revert:1; + uint16_t spare:3; + int8_t curve; + NOBACKUP(char name[LEN_CHANNEL_NAME]); +}); +#endif + +PACK(typedef struct { + uint8_t type:3; + uint8_t smooth:1; + uint8_t spare:4; + int8_t points; +}) CurveData_v216; + +#if defined(PCBTARANIS) +PACK(typedef struct { + uint8_t destCh; + uint16_t flightModes; + uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := + uint8_t carryTrim:1; + uint8_t spare1:5; + int16_t weight; + int8_t swtch; + CurveRef curve; + uint8_t mixWarn:4; // mixer warning + uint8_t spare2:4; + uint8_t delayUp; + uint8_t delayDown; + uint8_t speedUp; + uint8_t speedDown; + uint8_t srcRaw; + int16_t offset; + char name[LEN_EXPOMIX_NAME]; + uint8_t spare3; +}) MixData_v216; +#else +PACK(typedef struct { + uint8_t destCh:5; + uint8_t mixWarn:3; // mixer warning + uint16_t flightModes; + uint8_t curveMode:1; + uint8_t noExpo:1; + int8_t carryTrim:3; + uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := + uint8_t spare:1; + int16_t weight; + int8_t swtch; + int8_t curveParam; + uint8_t delayUp; + uint8_t delayDown; + uint8_t speedUp; + uint8_t speedDown; + uint8_t srcRaw; + int16_t offset; + char name[LEN_EXPOMIX_NAME]; +}) MixData_v216; +#endif + +PACK(typedef struct { + int8_t mode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw + uint16_t start; + uint8_t countdownBeep:2; + uint8_t minuteBeep:1; + uint8_t persistent:2; + uint8_t spare:3; + uint16_t value; +}) TimerData_v216; + +PACK(typedef struct { + int16_t trim[NUM_STICKS]; + int8_t swtch; // swtch of phase[0] is not used + char name[LEN_FLIGHT_MODE_NAME]; + uint8_t fadeIn; + uint8_t fadeOut; + int16_t rotaryEncoders[1]; + gvar_t gvars[9]; +}) FlightModeData_v216; + +PACK(typedef struct { // Logical Switches data + int8_t v1; + int16_t v2; + int16_t v3; + uint8_t func; + uint8_t delay; + uint8_t duration; + int8_t andsw; +}) LogicalSwitchData_v216; + +#if defined(PCBTARANIS) +PACK(typedef struct { + int8_t swtch; + uint8_t func; + PACK(union { + PACK(struct { + char name[8]; + }) play; + + PACK(struct { + int16_t val; + uint8_t mode; + uint8_t param; + int32_t spare2; + }) all; + + PACK(struct { + int32_t val1; + int32_t val2; + }) clear; + }); + uint8_t active; +}) CustomFunctionData_v216; +#else +PACK(typedef struct { + int8_t swtch; + uint8_t func; + PACK(union { + PACK(struct { + char name[6]; + }) play; + + PACK(struct { + int16_t val; + uint8_t mode; + uint8_t param; + int16_t spare2; + }) all; + + PACK(struct { + int32_t val1; + int16_t val2; + }) clear; + }); + uint8_t active; +}) CustomFunctionData_v216; +#endif + + +PACK(typedef struct { + uint8_t source; + uint8_t barMin; // minimum for bar display + uint8_t barMax; // ditto for max display (would usually = ratio) +}) FrSkyBarData_v216; + +PACK(typedef struct { + uint8_t sources[NUM_LINE_ITEMS]; +}) FrSkyLineData_v216; + +typedef union { + FrSkyBarData_v216 bars[4]; + FrSkyLineData_v216 lines[4]; +} FrSkyScreenData_v216; + + +PACK(struct FrSkyChannelData_v216 { + uint8_t unused[7]; +}); + + + +PACK(typedef struct { + FrSkyChannelData_v216 channels[4]; + uint8_t usrProto; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh, 3=Halcyon + uint8_t voltsSource:7; + uint8_t altitudeDisplayed:1; + int8_t blades; // How many blades for RPMs, 0=2 blades + uint8_t currentSource; + uint8_t screensType; // 2bits per screen (None/Gauges/Numbers/Script) + FrSkyScreenData_v216 screens[3]; + uint8_t varioSource; + int8_t varioCenterMax; + int8_t varioCenterMin; + int8_t varioMin; + int8_t varioMax; + uint8_t rssiAlarms[2]; + uint16_t mAhPersistent:1; + uint16_t storedMah:15; + int8_t fasOffset; +}) FrSkyData_v216; + +PACK(typedef struct { + char file[10]; + char name[10]; + int8_t inputs[10]; +}) ScriptData_v216; + +PACK(typedef struct { // Swash Ring data + uint8_t invertELE:1; + uint8_t invertAIL:1; + uint8_t invertCOL:1; + uint8_t type:5; + uint8_t collectiveSource; + uint8_t value; +}) SwashRingData_v216; + +PACK(typedef struct { + int8_t rfProtocol; + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + uint8_t failsafeMode; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; + int8_t ppmDelay; + int8_t ppmFrameLength; + uint8_t ppmPulsePol; +}) ModuleData_v216; + +#if defined(PCBTARANIS) && LCD_W >= 212 +PACK(typedef struct { + char name[LEN_MODEL_NAME]; + uint8_t modelId; + char bitmap[LEN_BITMAP_NAME]; +}) ModelHeader_v216; +#else +PACK(typedef struct { + char name[LEN_MODEL_NAME]; + uint8_t modelId; +}) ModelHeader_v216; +#endif + +PACK(typedef struct { + ModelHeader_v216 header; + TimerData_v216 timers[2]; + uint8_t telemetryProtocol:3; + uint8_t thrTrim:1; // Enable Throttle Trim + int8_t spare2:4; + int8_t trimInc:3; // Trim Increments + uint8_t disableThrottleWarning:1; + uint8_t displayChecklist:1; + uint8_t extendedLimits:1; + uint8_t extendedTrims:1; + uint8_t throttleReversed:1; + BeepANACenter beepANACenter; // 1<<0->A1.. 1<<6->A7 + MixData_v216 mixData[MAX_MIXERS]; + LimitData_v216 limitData[MAX_OUTPUT_CHANNELS]; + ExpoData_v216 expoData[MAX_EXPOS]; + + CurveData_v216 curves[MAX_CURVES]; + int8_t points[MAX_CURVE_POINTS]; + + LogicalSwitchData_v216 logicalSw[32]; + CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; + SwashRingData_v216 swashR; + FlightModeData_v216 flightModeData[MAX_FLIGHT_MODES]; + + uint8_t thrTraceSrc; + + uint16_t switchWarningState; + uint8_t switchWarningEnable; + + GVarData gvars[MAX_GVARS]; + + FrSkyData_v216 frsky; + + uint8_t externalModule; + +if defined(PCBTARANIS) + uint8_t trainerMode; +#endif + + ModuleData_v216 moduleData[NUM_MODULES+1]; + +#if defined(PCBTARANIS) + char curveNames[MAX_CURVES][6]; + ScriptData_v216 scriptsData[MAX_SCRIPTS]; + char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; +#endif + + uint8_t nPotsToWarn; + int8_t potPosition[NUM_POTS+NUM_SLIDERS]; + uint8_t rxBattAlarms[2]; +}) ModelData_v216; + + +PACK(typedef struct { + uint8_t version; + uint16_t variant; + CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS]; + uint16_t chkSum; + int8_t currModel; + uint8_t contrast; + uint8_t vBatWarn; + int8_t txVoltageCalibration; + int8_t backlightMode; + TrainerData trainer; + uint8_t view; // index of view in main screen + int8_t buzzerMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + uint8_t fai:1; + int8_t beepMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + uint8_t alarmsFlash:1; + uint8_t disableMemoryWarning:1; + uint8_t disableAlarmWarning:1; + uint8_t stickMode:2; + int8_t timezone:5; + uint8_t adjustRTC:1; + uint8_t inactivityTimer; + uint8_t telemetryBaudrate:3; + int8_t splashMode:3; + int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + int8_t switchesDelay; + uint8_t lightAutoOff; + uint8_t templateSetup; // RETA order for receiver channels + int8_t PPM_Multiplier; + int8_t hapticLength; + uint8_t reNavigation; + N_TARANIS_FIELD(uint8_t stickReverse) + int8_t beepLength:3; + int8_t hapticStrength:3; + uint8_t gpsFormat:1; + uint8_t unexpectedShutdown:1; + uint8_t speakerPitch; + int8_t speakerVolume; + int8_t vBatMin; + int8_t vBatMax; + + uint8_t backlightBright; + int8_t txCurrentCalibration; + int8_t temperatureWarn; + uint8_t mAhWarn; + uint16_t mAhUsed; + uint32_t globalTimer; + int8_t temperatureCalib; + uint8_t bluetoothBaudrate; + uint8_t optrexDisplay; + uint8_t sticksGain; + uint8_t rotarySteps; + uint8_t countryCode; + uint8_t imperial; + char ttsLanguage[2]; + int8_t beepVolume; + int8_t wavVolume; + int8_t varioVolume; + int8_t varioPitch; + int8_t varioRange; + int8_t varioRepeat; + int8_t backgroundVolume; + + TARANIS_FIELD(uint8_t serial2Mode:6) + TARANIS_FIELD(uint8_t slidersConfig:2) + TARANIS_FIELD(uint8_t potsConfig) + TARANIS_FIELD(uint8_t backlightColor) + TARANIS_FIELD(swarnstate_t switchUnlockStates) + TARANIS_FIELD(CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]) + TARANIS_FIELD(swconfig_t switchConfig) + TARANIS_FIELD(char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]) + TARANIS_FIELD(char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]) + N_TARANIS_FIELD(CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]) + + TARANIS_PCBX9E_FIELD(uint8_t bluetoothEnable) + TARANIS_PCBX9E_FIELD(char bluetoothName[LEN_BLUETOOTH_NAME]) +}) RadioData_v216; diff --git a/radio/src/storage/conversions/datastructs_217.h b/radio/src/storage/conversions/datastructs_217.h new file mode 100644 index 000000000..b00819494 --- /dev/null +++ b/radio/src/storage/conversions/datastructs_217.h @@ -0,0 +1,362 @@ + +enum Mix216Sources { + MIXSRC216_NONE, + +#if defined(PCBTARANIS) + MIXSRC216_FIRST_INPUT, + MIXSRC216_LAST_INPUT = MIXSRC216_FIRST_INPUT+MAX_INPUTS-1, + + MIXSRC216_FIRST_LUA, + MIXSRC216_LAST_LUA = MIXSRC216_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1, +#endif + + MIXSRC216_Rud, + MIXSRC216_Ele, + MIXSRC216_Thr, + MIXSRC216_Ail, + + MIXSRC216_FIRST_POT, +#if defined(PCBTARANIS) + MIXSRC216_POT1 = MIXSRC216_FIRST_POT, + MIXSRC216_POT2, + MIXSRC216_POT3, + MIXSRC216_SLIDER1, + MIXSRC216_SLIDER2, + MIXSRC216_LAST_POT = MIXSRC216_SLIDER2, +#else + MIXSRC216_P1 = MIXSRC216_FIRST_POT, + MIXSRC216_P2, + MIXSRC216_P3, + MIXSRC216_LAST_POT = MIXSRC216_P3, +#endif + +#if defined(PCBSKY9X) + MIXSRC216_REa, + MIXSRC216_LAST_ROTARY_ENCODER = MIXSRC216_REa, +#endif + + MIXSRC216_MAX, + + MIXSRC216_CYC1, + MIXSRC216_CYC2, + MIXSRC216_CYC3, + + MIXSRC216_TrimRud, + MIXSRC216_TrimEle, + MIXSRC216_TrimThr, + MIXSRC216_TrimAil, + + MIXSRC216_FIRST_SWITCH, + +#if defined(PCBTARANIS) + MIXSRC216_SA = MIXSRC216_FIRST_SWITCH, + MIXSRC216_SB, + MIXSRC216_SC, + MIXSRC216_SD, + MIXSRC216_SE, + MIXSRC216_SF, + MIXSRC216_SG, + MIXSRC216_SH, +#else + MIXSRC216_3POS = MIXSRC216_FIRST_SWITCH, + MIXSRC216_THR, + MIXSRC216_RUD, + MIXSRC216_ELE, + MIXSRC216_AIL, + MIXSRC216_GEA, + MIXSRC216_TRN, +#endif + MIXSRC216_FIRST_LOGICAL_SWITCH, + MIXSRC216_SW1 = MIXSRC216_FIRST_LOGICAL_SWITCH, + MIXSRC216_SW9 = MIXSRC216_SW1 + 8, + MIXSRC216_SWA, + MIXSRC216_SWB, + MIXSRC216_SWC, + MIXSRC216_LAST_LOGICAL_SWITCH = MIXSRC216_FIRST_LOGICAL_SWITCH+32-1, + + MIXSRC216_FIRST_TRAINER, + MIXSRC216_LAST_TRAINER = MIXSRC216_FIRST_TRAINER+MAX_TRAINER_CHANNELS-1, + + MIXSRC216_FIRST_CH, + MIXSRC216_CH1 = MIXSRC216_FIRST_CH, + MIXSRC216_CH2, + MIXSRC216_CH3, + MIXSRC216_CH4, + MIXSRC216_CH5, + MIXSRC216_CH6, + MIXSRC216_CH7, + MIXSRC216_CH8, + MIXSRC216_CH9, + MIXSRC216_CH10, + MIXSRC216_CH11, + MIXSRC216_CH12, + MIXSRC216_CH13, + MIXSRC216_CH14, + MIXSRC216_CH15, + MIXSRC216_CH16, + MIXSRC216_LAST_CH = MIXSRC216_CH1+MAX_OUTPUT_CHANNELS-1, + + MIXSRC216_GVAR1, + MIXSRC216_LAST_GVAR = MIXSRC216_GVAR1+MAX_GVARS-1, + + MIXSRC216_FIRST_TELEM, +}; + +enum Telemetry216Source { + TELEM216_NONE, + TELEM216_TX_VOLTAGE, + TELEM216_TX_TIME, + TELEM216_RESERVE1, + TELEM216_RESERVE2, + TELEM216_RESERVE3, + TELEM216_RESERVE4, + TELEM216_RESERVE5, + TELEM216_TIMER1, + TELEM216_TIMER2, + TELEM216_SWR, + TELEM216_RSSI_TX, + TELEM216_RSSI_RX, + TELEM216_RESERVE0, + TELEM216_A1, + TELEM216_A2, + TELEM216_A3, + TELEM216_A4, + TELEM216_ALT, + TELEM216_RPM, + TELEM216_FUEL, + TELEM216_T1, + TELEM216_T2, + TELEM216_SPEED, + TELEM216_DIST, + TELEM216_GPSALT, + TELEM216_CELL, + TELEM216_CELLS_SUM, + TELEM216_VFAS, + TELEM216_CURRENT, + TELEM216_CONSUMPTION, + TELEM216_POWER, + TELEM216_ACCx, + TELEM216_ACCy, + TELEM216_ACCz, + TELEM216_HDG, + TELEM216_VSPEED, + TELEM216_ASPEED, + TELEM216_DTE, + TELEM216_RESERVE6, + TELEM216_RESERVE7, + TELEM216_RESERVE8, + TELEM216_RESERVE9, + TELEM216_RESERVE10, + TELEM216_MIN_A1, + TELEM216_MIN_A2, + TELEM216_MIN_A3, + TELEM216_MIN_A4, + TELEM216_MIN_ALT, + TELEM216_MAX_ALT, + TELEM216_MAX_RPM, + TELEM216_MAX_T1, + TELEM216_MAX_T2, + TELEM216_MAX_SPEED, + TELEM216_MAX_DIST, + TELEM216_MAX_ASPEED, + TELEM216_MIN_CELL, + TELEM216_MIN_CELLS_SUM, + TELEM216_MIN_VFAS, + TELEM216_MAX_CURRENT, + TELEM216_MAX_POWER, + TELEM216_RESERVE11, + TELEM216_RESERVE12, + TELEM216_RESERVE13, + TELEM216_RESERVE14, + TELEM216_RESERVE15, + TELEM216_ACC, + TELEM216_GPS_TIME, +}; + +#if defined(PCBTARANIS) +PACK(typedef struct { + uint32_t srcRaw:10; + uint32_t scale:14; + uint32_t chn:8; + int8_t swtch; + uint16_t flightModes; + int8_t weight; + int8_t carryTrim:6; + uint8_t mode:2; + char name[LEN_EXPOMIX_NAME]; + int8_t offset; + CurveRef curve; +}) ExpoData_v217; +#else +PACK(typedef struct { + uint8_t mode:2; // 0=end, 1=pos, 2=neg, 3=both + uint8_t chn:4; + uint8_t curveMode:2; + int8_t swtch; + uint16_t flightModes; + int8_t weight; + char name[LEN_EXPOMIX_NAME]; + int8_t curveParam; +}) ExpoData_v216; +typedef ExpoData_v217; +#endif + +#if defined(PCBTARANIS) +PACK(typedef struct { + uint8_t destCh; + uint16_t flightModes:9; + uint16_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := + uint16_t carryTrim:1; + uint16_t mixWarn:4; // mixer warning + int16_t weight; + uint32_t srcRaw:10; + int32_t offset:14; + int32_t swtch:8; + CurveRef curve; + uint8_t delayUp; + uint8_t delayDown; + uint8_t speedUp; + uint8_t speedDown; + char name[LEN_EXPOMIX_NAME]; +}) MixData_v217; +#else +PACK(struct CurveRef { + uint8_t type; + int8_t value; +}); + +PACK(struct MixData { + int16_t weight:11; // GV1=-1024, -GV1=1023 + uint16_t destCh:5; + uint16_t srcRaw:10; // srcRaw=0 means not used + uint16_t carryTrim:1; + uint16_t mixWarn:2; // mixer warning + uint16_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := + uint16_t spare:1; + int32_t offset:14; + int32_t swtch:9; + uint32_t flightModes:9; + CurveRef curve; + uint8_t delayUp; + uint8_t delayDown; + uint8_t speedUp; + uint8_t speedDown; + NOBACKUP(char name[LEN_EXPOMIX_NAME]); +}); +#endif + +PACK(typedef struct { + int32_t mode:8; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw + uint32_t start:24; + int32_t value:24; + uint32_t countdownBeep:2; + uint32_t minuteBeep:1; + uint32_t persistent:2; + uint32_t spare:3; + char name[LEN_TIMER_NAME]; +}) TimerData_v217; + +PACK(typedef struct { // Logical Switches data + uint16_t func:6; + int16_t v1:10; + int16_t v2; + int16_t v3; + uint8_t delay; + uint8_t duration; + int8_t andsw; +}) LogicalSwitchData_v217; + +PACK(typedef struct { + uint8_t type:4; + int8_t rfProtocol:4; + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + union { + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t subType:3; + uint8_t invertedSerial:1; // telemetry serial inverted from standard + }; + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t freq:2; + uint8_t region:2; + } r9m; + }; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; + union { + struct { + int8_t delay:6; + uint8_t pulsePol:1; + uint8_t outputType:1; // false = open drain, true = push pull + int8_t frameLength; + } ppm; + }; +}) ModuleData_v217; + + +PACK(typedef struct { + char name[6]; + uint8_t popup:1; + uint8_t spare:7; +}) GVarData_v217; + +PACK(typedef struct { + ModelHeader header; + TimerData_v217 timers[MAX_TIMERS]; + uint8_t telemetryProtocol:3; + uint8_t thrTrim:1; // Enable Throttle Trim + uint8_t noGlobalFunctions:1; + uint8_t displayTrims:2; + uint8_t ignoreSensorIds:1; + int8_t trimInc:3; // Trim Increments + uint8_t disableThrottleWarning:1; + uint8_t displayChecklist:1; + uint8_t extendedLimits:1; + uint8_t extendedTrims:1; + uint8_t throttleReversed:1; + BeepANACenter beepANACenter; + MixData_v217 mixData[MAX_MIXERS]; + LimitData limitData[MAX_OUTPUT_CHANNELS]; + ExpoData_v217 expoData[MAX_EXPOS]; + + CurveData_v216 curves[MAX_CURVES]; + int8_t points[MAX_CURVE_POINTS]; + + LogicalSwitchData_v217 logicalSw[32]; + CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; + SwashRingData swashR; + FlightModeData_v216 flightModeData[MAX_FLIGHT_MODES]; + + uint8_t thrTraceSrc; + + swarnstate_t switchWarningState; + swarnenable_t switchWarningEnable; + + GVarData_v217 gvars[MAX_GVARS]; + + FrSkyTelemetryData frsky; + RssiAlarmData rssiAlarms; + + uint8_t spare:3; + uint8_t trainerMode:3; + uint8_t potsWarnMode:2; + ModuleData_v217 moduleData[NUM_MODULES+1]; + +#if defined(PCBTARANIS) + char curveNames[MAX_CURVES][6]; + ScriptData scriptsData[MAX_SCRIPTS]; + char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; +#endif + + uint8_t potsWarnEnabled; + int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; + +#if defined(PCBTARANIS) + TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS]; +#else + uint8_t rxBattAlarms[2]; +#endif + + TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) +}) ModelData_v217; From db27a81a5d822dc4952456a535689f2708badd68 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Mar 2019 15:14:27 +0100 Subject: [PATCH 357/446] Conversions refactoring started --- radio/src/CMakeLists.txt | 1 + .../conversions/conversions_216_217.cpp | 213 +++++++++++- .../src/storage/conversions/datastructs_216.h | 313 +++++++++++++++++- 3 files changed, 504 insertions(+), 23 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index b1f15aa49..8fc00e6d6 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -134,6 +134,7 @@ endif() if(ARCH STREQUAL ARM AND NOT PCB STREQUAL X12S AND NOT PCB STREQUAL X10 AND NOT PCB STREQUAL XLITE AND NOT PCB STREQUAL XLITES AND NOT PCB STREQUAL X3) add_definitions(-DEEPROM_CONVERSIONS) set(SRC ${SRC} storage/eeprom_conversions.cpp) + # set(SRC ${SRC} storage/conversions/conversions_216_217.cpp) endif() add_definitions(-DFLAVOUR="${FLAVOUR}") diff --git a/radio/src/storage/conversions/conversions_216_217.cpp b/radio/src/storage/conversions/conversions_216_217.cpp index fe069a164..eea103a58 100644 --- a/radio/src/storage/conversions/conversions_216_217.cpp +++ b/radio/src/storage/conversions/conversions_216_217.cpp @@ -1,3 +1,207 @@ +#include +#include "datastructs_216.h" + +enum SwitchSources { + SWSRC_NONE = 0, + + SWSRC_FIRST_SWITCH, + +#if defined(PCBTARANIS) + SWSRC_SA0 = SWSRC_FIRST_SWITCH, + SWSRC_SA1, + SWSRC_SA2, + SWSRC_SB0, + SWSRC_SB1, + SWSRC_SB2, + SWSRC_SC0, + SWSRC_SC1, + SWSRC_SC2, + SWSRC_SD0, + SWSRC_SD1, + SWSRC_SD2, + SWSRC_SE0, + SWSRC_SE1, + SWSRC_SE2, + SWSRC_SF0, + SWSRC_SF2, + SWSRC_SG0, + SWSRC_SG1, + SWSRC_SG2, + SWSRC_SH0, + SWSRC_SH2, + SWSRC_TRAINER = SWSRC_SH2, +#else + SWSRC_ID0 = SWSRC_FIRST_SWITCH, + SWSRC_ID1, + SWSRC_ID2, + SWSRC_THR, + SWSRC_RUD, + SWSRC_ELE, + SWSRC_AIL, + SWSRC_GEA, + SWSRC_TRN, + SWSRC_TRAINER = SWSRC_TRN, +#endif + + SWSRC_LAST_SWITCH = SWSRC_TRAINER, + +#if defined(PCBTARANIS) + SWSRC_FIRST_MULTIPOS_SWITCH, + SWSRC_LAST_MULTIPOS_SWITCH = SWSRC_FIRST_MULTIPOS_SWITCH + (NUM_XPOTS*XPOTS_MULTIPOS_COUNT) - 1, +#endif + + SWSRC_FIRST_TRIM, + SWSRC_TrimRudLeft = SWSRC_FIRST_TRIM, + SWSRC_TrimRudRight, + SWSRC_TrimEleDown, + SWSRC_TrimEleUp, + SWSRC_TrimThrDown, + SWSRC_TrimThrUp, + SWSRC_TrimAilLeft, + SWSRC_TrimAilRight, + SWSRC_LAST_TRIM = SWSRC_TrimAilRight, + +#if defined(PCBSKY9X) + SWSRC_REa, +#endif + + SWSRC_FIRST_LOGICAL_SWITCH, + SWSRC_SW1 = SWSRC_FIRST_LOGICAL_SWITCH, + SWSRC_SW2, + SWSRC_SW3, + SWSRC_SW4, + SWSRC_SW5, + SWSRC_SW6, + SWSRC_SW7, + SWSRC_SW8, + SWSRC_SW9, + SWSRC_SWA, + SWSRC_SWB, + SWSRC_SWC, + SWSRC_LAST_LOGICAL_SWITCH = SWSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1, + + SWSRC_ON, + SWSRC_One, + + SWSRC_FIRST_FLIGHT_MODE, + SWSRC_LAST_FLIGHT_MODE = SWSRC_FIRST_FLIGHT_MODE+MAX_FLIGHT_MODES-1, + + SWSRC_COUNT, + + SWSRC_OFF = -SWSRC_ON, + + SWSRC_LAST = SWSRC_COUNT-1, + SWSRC_FIRST = -SWSRC_LAST, + + SWSRC_LAST_IN_LOGICAL_SWITCHES = SWSRC_LAST_FLIGHT_MODE, + SWSRC_LAST_IN_MIXES = SWSRC_LAST_FLIGHT_MODE, + SWSRC_FIRST_IN_LOGICAL_SWITCHES = -SWSRC_LAST_IN_LOGICAL_SWITCHES, + SWSRC_FIRST_IN_MIXES = -SWSRC_LAST_IN_MIXES, +}; + +enum MixSources { + MIXSRC_NONE, + +#if defined(PCBTARANIS) + MIXSRC_FIRST_INPUT, + MIXSRC_LAST_INPUT = MIXSRC_FIRST_INPUT+MAX_INPUTS-1, + + MIXSRC_FIRST_LUA, + MIXSRC_LAST_LUA = MIXSRC_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1, +#endif + + MIXSRC_Rud, + MIXSRC_Ele, + MIXSRC_Thr, + MIXSRC_Ail, + + MIXSRC_FIRST_POT, +#if defined(PCBTARANIS) + MIXSRC_POT1 = MIXSRC_FIRST_POT, + MIXSRC_POT2, + MIXSRC_POT3, + MIXSRC_SLIDER1, + MIXSRC_SLIDER2, + MIXSRC_LAST_POT = MIXSRC_SLIDER2, +#else + MIXSRC_P1 = MIXSRC_FIRST_POT, + MIXSRC_P2, + MIXSRC_P3, + MIXSRC_LAST_POT = MIXSRC_P3, +#endif + +#if defined(PCBSKY9X) + MIXSRC_REa, + MIXSRC_LAST_ROTARY_ENCODER = MIXSRC_REa, +#endif + + MIXSRC_MAX, + + MIXSRC_CYC1, + MIXSRC_CYC2, + MIXSRC_CYC3, + + MIXSRC_TrimRud, + MIXSRC_TrimEle, + MIXSRC_TrimThr, + MIXSRC_TrimAil, + + MIXSRC_FIRST_SWITCH, + +#if defined(PCBTARANIS) + MIXSRC_SA = MIXSRC_FIRST_SWITCH, + MIXSRC_SB, + MIXSRC_SC, + MIXSRC_SD, + MIXSRC_SE, + MIXSRC_SF, + MIXSRC_SG, + MIXSRC_SH, +#else + MIXSRC_3POS = MIXSRC_FIRST_SWITCH, + MIXSRC_THR, + MIXSRC_RUD, + MIXSRC_ELE, + MIXSRC_AIL, + MIXSRC_GEA, + MIXSRC_TRN, +#endif + MIXSRC_FIRST_LOGICAL_SWITCH, + MIXSRC_SW1 = MIXSRC_FIRST_LOGICAL_SWITCH, + MIXSRC_SW9 = MIXSRC_SW1 + 8, + MIXSRC_SWA, + MIXSRC_SWB, + MIXSRC_SWC, + MIXSRC_LAST_LOGICAL_SWITCH = MIXSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1, + + MIXSRC_FIRST_TRAINER, + MIXSRC_LAST_TRAINER = MIXSRC_FIRST_TRAINER+MAX_TRAINER_CHANNELS-1, + + MIXSRC_FIRST_CH, + MIXSRC_CH1 = MIXSRC_FIRST_CH, + MIXSRC_CH2, + MIXSRC_CH3, + MIXSRC_CH4, + MIXSRC_CH5, + MIXSRC_CH6, + MIXSRC_CH7, + MIXSRC_CH8, + MIXSRC_CH9, + MIXSRC_CH10, + MIXSRC_CH11, + MIXSRC_CH12, + MIXSRC_CH13, + MIXSRC_CH14, + MIXSRC_CH15, + MIXSRC_CH16, + MIXSRC_LAST_CH = MIXSRC_CH1+MAX_OUTPUT_CHANNELS-1, + + MIXSRC_GVAR1, + MIXSRC_LAST_GVAR = MIXSRC_GVAR1+MAX_GVARS-1, + + MIXSRC_FIRST_TELEM, + MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+NUM_TELEMETRY-1 +}; int ConvertTelemetrySource_216_to_217(int source) { @@ -52,9 +256,7 @@ int ConvertGVar_216_to_217(int value) return value; } - - -void ConvertRadioData_216_to_217(RadioData & settings) +void ConvertRadioData_216_to_217(void * settings) { RadioData_v216 * settings_v216 = (RadioData_v216 *)&settings; settings_v216->version = 217; @@ -64,8 +266,7 @@ void ConvertRadioData_216_to_217(RadioData & settings) #endif } - -void ConvertModel_216_to_217(ModelData & model) +void ConvertModel_216_to_217(void * model) { // Timer3 added // 32bits Timers @@ -73,7 +274,7 @@ void ConvertModel_216_to_217(ModelData & model) // PPM center range // Telemetry custom screens - assert(sizeof(ModelData_v216) <= sizeof(ModelData)); + // TODO perhaps will be needed, but elsewhere assert(sizeof(ModelData_v216) <= sizeof(ModelData)); ModelData_v216 oldModel; memcpy(&oldModel, &model, sizeof(oldModel)); diff --git a/radio/src/storage/conversions/datastructs_216.h b/radio/src/storage/conversions/datastructs_216.h index 22d7a21a6..ca496dc9d 100644 --- a/radio/src/storage/conversions/datastructs_216.h +++ b/radio/src/storage/conversions/datastructs_216.h @@ -1,3 +1,223 @@ +#include "definitions.h" +#include "board.h" + +#define NUM_STICKS 4 + +#define XPOTS_MULTIPOS_COUNT 6 + +#define MAX_SCRIPT_INPUTS 10 +#define MAX_SCRIPT_OUTPUTS 6 +#define MAX_GVARS 9 + +#if defined(PCBHORUS) + #define MAX_MODELS 60 + #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 + #define MAX_FLIGHT_MODES 9 + #define MAX_MIXERS 64 + #define MAX_EXPOS 64 + #define MAX_LOGICAL_SWITCHES 64 + #define MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches + #define MAX_SCRIPTS 9 + #define MAX_INPUTS 32 + #define MAX_TRAINER_CHANNELS 16 + #define MAX_TELEMETRY_SENSORS 32 + #define MAX_CUSTOM_SCREENS 5 +#elif defined(PCBTARANIS) + #define MAX_MODELS 60 + #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 + #define MAX_FLIGHT_MODES 9 + #define MAX_MIXERS 64 + #define MAX_EXPOS 64 + #define MAX_LOGICAL_SWITCHES 64 + #define MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches + #define MAX_SCRIPTS 7 + #define MAX_INPUTS 32 + #define MAX_TRAINER_CHANNELS 16 + #define MAX_TELEMETRY_SENSORS 32 +#else + #define MAX_MODELS 60 + #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 + #define MAX_FLIGHT_MODES 9 + #define MAX_MIXERS 64 + #define MAX_EXPOS 32 + #define MAX_LOGICAL_SWITCHES 64 + #define MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches + #define MAX_INPUTS 32 + #define MAX_TRAINER_CHANNELS 16 + #define MAX_TELEMETRY_SENSORS 32 +#endif + + +#if defined(PCBHORUS) + #define LEN_SWITCH_NAME 3 + #define LEN_ANA_NAME 3 + #define LEN_MODEL_FILENAME 16 + #define LEN_BLUETOOTH_NAME 10 +#else + #define LEN_SWITCH_NAME 3 + #define LEN_ANA_NAME 3 + #define LEN_BLUETOOTH_NAME 10 +#endif + +#if defined(PCBHORUS) + #define LEN_MODEL_NAME 15 + #define LEN_TIMER_NAME 8 + #define LEN_FLIGHT_MODE_NAME 10 + #define LEN_BITMAP_NAME 10 // TODO next EEPROM change: we need 14 here as we have to store the file extension + #define LEN_EXPOMIX_NAME 6 + #define LEN_CHANNEL_NAME 6 + #define LEN_INPUT_NAME 4 + #define LEN_CURVE_NAME 3 + #define LEN_FUNCTION_NAME 6 + #define MAX_CURVES 32 + #define MAX_CURVE_POINTS 512 +#elif LCD_W == 212 + #define LEN_MODEL_NAME 12 + #define LEN_TIMER_NAME 8 + #define LEN_FLIGHT_MODE_NAME 10 + #define LEN_BITMAP_NAME 10 + #define LEN_EXPOMIX_NAME 8 // TODO next EEPROM change: 6 seem enough + #define LEN_CHANNEL_NAME 6 + #define LEN_INPUT_NAME 4 + #define LEN_CURVE_NAME 3 + #define LEN_FUNCTION_NAME 8 + #define MAX_CURVES 32 + #define MAX_CURVE_POINTS 512 +#else + #define LEN_MODEL_NAME 10 + #define LEN_TIMER_NAME 3 + #define LEN_FLIGHT_MODE_NAME 6 + #define LEN_EXPOMIX_NAME 6 + #define LEN_CHANNEL_NAME 4 + #define LEN_INPUT_NAME 3 + #define LEN_CURVE_NAME 3 + #define LEN_FUNCTION_NAME 6 + #define MAX_CURVES 16 // TODO next EEPROM check if can be changed to 32 to have all ARM the same + #define MAX_CURVE_POINTS 512 +#endif + +enum TelemetrySource { + TELEM_NONE, + TELEM_TX_VOLTAGE, + TELEM_TX_TIME, + TELEM_RESERVE1, + TELEM_RESERVE2, + TELEM_RESERVE3, + TELEM_RESERVE4, + TELEM_RESERVE5, + TELEM_TIMER1, + TELEM_TIMER2, + TELEM_SWR, + TELEM_RSSI_TX, + TELEM_RSSI_RX, + TELEM_RESERVE0, + TELEM_A_FIRST, + TELEM_A1=TELEM_A_FIRST, + TELEM_A2, + TELEM_A3, + TELEM_A4, + TELEM_A_LAST=TELEM_A4, + TELEM_ALT, + TELEM_RPM, + TELEM_FUEL, + TELEM_T1, + TELEM_T2, + TELEM_SPEED, + TELEM_DIST, + TELEM_GPSALT, + TELEM_CELL, + TELEM_CELLS_SUM, + TELEM_VFAS, + TELEM_CURRENT, + TELEM_CONSUMPTION, + TELEM_POWER, + TELEM_ACCx, + TELEM_ACCy, + TELEM_ACCz, + TELEM_HDG, + TELEM_VSPEED, + TELEM_ASPEED, + TELEM_DTE, + TELEM_RESERVE6, + TELEM_RESERVE7, + TELEM_RESERVE8, + TELEM_RESERVE9, + TELEM_RESERVE10, + TELEM_MIN_A_FIRST, + TELEM_MIN_A1=TELEM_MIN_A_FIRST, + TELEM_MIN_A2, + TELEM_MIN_A3, + TELEM_MIN_A4, + TELEM_MIN_A_LAST=TELEM_MIN_A4, + // TODO: add A1-4 MAX + TELEM_MIN_ALT, + TELEM_MAX_ALT, + TELEM_MAX_RPM, + TELEM_MAX_T1, + TELEM_MAX_T2, + TELEM_MAX_SPEED, + TELEM_MAX_DIST, + TELEM_MAX_ASPEED, + TELEM_MIN_CELL, + TELEM_MIN_CELLS_SUM, + TELEM_MIN_VFAS, + TELEM_MAX_CURRENT, + TELEM_MAX_POWER, + TELEM_RESERVE11, + TELEM_RESERVE12, + TELEM_RESERVE13, + TELEM_RESERVE14, + TELEM_RESERVE15, + TELEM_ACC, + TELEM_GPS_TIME, + TELEM_CSW_MAX = TELEM_MAX_POWER, + TELEM_NOUSR_MAX = TELEM_A2, + TELEM_DISPLAY_MAX = TELEM_MAX_POWER, + TELEM_STATUS_MAX = TELEM_GPS_TIME, + TELEM_FIRST_STREAMED_VALUE = TELEM_RSSI_TX, +}; + +#define NUM_TELEMETRY TELEM_CSW_MAX + +#if defined(PCBTARANIS) +enum CurveType { + CURVE_TYPE_STANDARD, + CURVE_TYPE_CUSTOM, + CURVE_TYPE_LAST = CURVE_TYPE_CUSTOM +}; +PACK(typedef struct { + uint8_t type:3; + uint8_t smooth:1; + uint8_t spare:4; + int8_t points; +}) CurveInfo; +#define NUM_POINTS 512 +#define CURVDATA CurveInfo +#else +#define LEN_MODEL_NAME 10 + #define LEN_EXPOMIX_NAME 6 + #define LEN_FP_NAME 6 + #define NUM_POINTS 512 + #define CURVDATA int16_t +#endif + +#if defined(PCBTARANIS) +enum CurveRefType { + CURVE_REF_DIFF, + CURVE_REF_EXPO, + CURVE_REF_FUNC, + CURVE_REF_CUSTOM +}; +PACK(typedef struct { + uint8_t type; + int8_t value; +}) CurveRef; +#else +#define MODE_DIFFERENTIAL 0 + #define MODE_EXPO 0 + #define MODE_CURVE 1 +#endif + #if defined(PCBTARANIS) PACK(typedef struct { uint8_t srcRaw; @@ -120,7 +340,7 @@ PACK(typedef struct { uint8_t fadeIn; uint8_t fadeOut; int16_t rotaryEncoders[1]; - gvar_t gvars[9]; + int16_t gvars[9]; }) FlightModeData_v216; PACK(typedef struct { // Logical Switches data @@ -188,6 +408,13 @@ PACK(typedef struct { uint8_t barMax; // ditto for max display (would usually = ratio) }) FrSkyBarData_v216; + +#if LCD_W >= 212 +#define NUM_LINE_ITEMS 3 +#else +#define NUM_LINE_ITEMS 2 +#endif + PACK(typedef struct { uint8_t sources[NUM_LINE_ITEMS]; }) FrSkyLineData_v216; @@ -263,6 +490,16 @@ PACK(typedef struct { }) ModelHeader_v216; #endif +PACK(struct GVarData { + char name[3]; + uint32_t min:12; + uint32_t max:12; + uint32_t popup:1; + uint32_t prec:1; + uint32_t unit:2; + uint32_t spare:4; +}); + PACK(typedef struct { ModelHeader_v216 header; TimerData_v216 timers[2]; @@ -275,7 +512,7 @@ PACK(typedef struct { uint8_t extendedLimits:1; uint8_t extendedTrims:1; uint8_t throttleReversed:1; - BeepANACenter beepANACenter; // 1<<0->A1.. 1<<6->A7 + uint16_t beepANACenter; // 1<<0->A1.. 1<<6->A7 MixData_v216 mixData[MAX_MIXERS]; LimitData_v216 limitData[MAX_OUTPUT_CHANNELS]; ExpoData_v216 expoData[MAX_EXPOS]; @@ -299,11 +536,11 @@ PACK(typedef struct { uint8_t externalModule; -if defined(PCBTARANIS) +#if defined(PCBTARANIS) uint8_t trainerMode; #endif - ModuleData_v216 moduleData[NUM_MODULES+1]; + ModuleData_v216 moduleData[2 + 1]; #if defined(PCBTARANIS) char curveNames[MAX_CURVES][6]; @@ -317,6 +554,41 @@ if defined(PCBTARANIS) }) ModelData_v216; +PACK(struct CalibData { + int16_t mid; + int16_t spanNeg; + int16_t spanPos; +}); + + +PACK(struct TrainerMix { + uint8_t srcChn:6; // 0-7 = ch1-8 + uint8_t mode:2; // off,add-mode,subst-mode + int8_t studWeight; + }); + + +PACK(struct TrainerData { + int16_t calib[4]; + TrainerMix mix[4]; +}); + +#if defined(COLORLCD) +typedef uint16_t swconfig_t; +typedef uint32_t swarnstate_t; +#elif defined(PCBX9E) +typedef uint64_t swconfig_t; +typedef uint64_t swarnstate_t; +typedef uint32_t swarnenable_t; +#elif defined(PCBTARANIS) +typedef uint16_t swconfig_t; +typedef uint16_t swarnstate_t; +typedef uint8_t swarnenable_t; +#else +typedef uint8_t swarnstate_t; +typedef uint8_t swarnenable_t; +#endif + PACK(typedef struct { uint8_t version; uint16_t variant; @@ -348,7 +620,9 @@ PACK(typedef struct { int8_t PPM_Multiplier; int8_t hapticLength; uint8_t reNavigation; - N_TARANIS_FIELD(uint8_t stickReverse) +#if !defined(PCBTARANIS) + uint8_t stickReverse; +#endif int8_t beepLength:3; int8_t hapticStrength:3; uint8_t gpsFormat:1; @@ -380,17 +654,22 @@ PACK(typedef struct { int8_t varioRepeat; int8_t backgroundVolume; - TARANIS_FIELD(uint8_t serial2Mode:6) - TARANIS_FIELD(uint8_t slidersConfig:2) - TARANIS_FIELD(uint8_t potsConfig) - TARANIS_FIELD(uint8_t backlightColor) - TARANIS_FIELD(swarnstate_t switchUnlockStates) - TARANIS_FIELD(CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]) - TARANIS_FIELD(swconfig_t switchConfig) - TARANIS_FIELD(char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]) - TARANIS_FIELD(char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]) - N_TARANIS_FIELD(CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]) +#if defined(PCBTARANIS) + uint8_t serial2Mode:6; + uint8_t slidersConfig:2; + uint8_t potsConfig; + uint8_t backlightColor; + swarnstate_t switchUnlockStates; + CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; + swconfig_t switchConfig; + char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; + char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]; +#else + CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; +#endif - TARANIS_PCBX9E_FIELD(uint8_t bluetoothEnable) - TARANIS_PCBX9E_FIELD(char bluetoothName[LEN_BLUETOOTH_NAME]) +#if defined(PCBX9E) + uint8_t bluetoothEnable; + char bluetoothName[LEN_BLUETOOTH_NAME]; +#endif }) RadioData_v216; From 5a8d47cccc4577dbae71e17ab8597a8532122009 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 18 Mar 2019 16:05:28 +0100 Subject: [PATCH 358/446] Test concept --- radio/src/CMakeLists.txt | 2 +- .../src/storage/conversions/datastructs_218.h | 188 +++ .../conversions/eeprom_conversions.cpp | 1343 +++++++++++++++++ 3 files changed, 1532 insertions(+), 1 deletion(-) create mode 100644 radio/src/storage/conversions/datastructs_218.h create mode 100644 radio/src/storage/conversions/eeprom_conversions.cpp diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 8fc00e6d6..09b69a16f 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -133,7 +133,7 @@ endif() if(ARCH STREQUAL ARM AND NOT PCB STREQUAL X12S AND NOT PCB STREQUAL X10 AND NOT PCB STREQUAL XLITE AND NOT PCB STREQUAL XLITES AND NOT PCB STREQUAL X3) add_definitions(-DEEPROM_CONVERSIONS) - set(SRC ${SRC} storage/eeprom_conversions.cpp) + set(SRC ${SRC} storage/conversions/eeprom_conversions.cpp) # set(SRC ${SRC} storage/conversions/conversions_216_217.cpp) endif() diff --git a/radio/src/storage/conversions/datastructs_218.h b/radio/src/storage/conversions/datastructs_218.h new file mode 100644 index 000000000..2ad08e54e --- /dev/null +++ b/radio/src/storage/conversions/datastructs_218.h @@ -0,0 +1,188 @@ +/* + * 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 OPENTX_DATASTRUCTS_218_H +#define OPENTX_DATASTRUCTS_218_H + +PACK(typedef struct { + int32_t mode:9; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw + uint32_t start:23; + int32_t value:24; + uint32_t countdownBeep:2; + uint32_t minuteBeep:1; + uint32_t persistent:2; + int32_t countdownStart:2; + uint32_t direction:1; + char name[LEN_TIMER_NAME]; +}) TimerData_v218; + +PACK(typedef struct { + trim_t trim[NUM_STICKS]; + char name[LEN_FLIGHT_MODE_NAME]; + int16_t swtch:9; // swtch of phase[0] is not used + int16_t spare:7; + uint8_t fadeIn; + uint8_t fadeOut; + int16_t rotaryEncoders[1]; + gvar_t gvars[9]; +}) FlightModeData_v218; + +PACK(typedef struct { + int16_t weight:11; // GV1=-1024, -GV1=1023 + uint16_t destCh:5; + uint16_t srcRaw:10; // srcRaw=0 means not used + uint16_t carryTrim:1; + uint16_t mixWarn:2; // mixer warning + uint16_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := + uint16_t spare:1; + int32_t offset:14; + int32_t swtch:9; + uint32_t flightModes:9; + CurveRef curve; + uint8_t delayUp; + uint8_t delayDown; + uint8_t speedUp; + uint8_t speedDown; + char name[LEN_EXPOMIX_NAME]; +}) MixData_v218; + +PACK(typedef struct { + uint16_t mode:2; + uint16_t scale:14; + uint16_t srcRaw:10; + int16_t carryTrim:6; + uint32_t chn:5; + int32_t swtch:9; + uint32_t flightModes:9; + int32_t weight:8; + int32_t spare:1; + char name[LEN_EXPOMIX_NAME]; + int8_t offset; + CurveRef curve; +}) ExpoData_v218; + +PACK(typedef struct { + uint8_t type:1; + uint8_t smooth:1; + int8_t points:6; // describes number of points - 5 + char name[LEN_CURVE_NAME]; +}) CurveData_v218; + +PACK(typedef struct { // Logical Switches data + uint8_t func; + int32_t v1:10; + int32_t v3:10; + int32_t andsw:9; + uint32_t andswtype:1; + uint32_t spare:2; + int16_t v2; + uint8_t delay; + uint8_t duration; +}) LogicalSwitchData_v218; + +PACK(typedef struct { + int16_t swtch:9; + uint16_t func:7; + PACK(union { + PACK(struct { + char name[8]; + }) play; + + PACK(struct { + int16_t val; + uint8_t mode; + uint8_t param; + int32_t spare2; + }) all; + + PACK(struct { + int32_t val1; + int32_t val2; + }) clear; + }); + uint8_t active; +}) CustomFunctionData_v218; + +PACK(typedef struct { + char name[6]; + uint32_t min:12; + uint32_t max:12; + uint32_t popup:1; + uint32_t prec:1; + uint32_t unit:2; + uint32_t spare:4; +}) GVarData_v218; + +#define MODELDATA_EXTRA_218 \ +uint8_t spare:3; \ +uint8_t trainerMode:3; \ +uint8_t potsWarnMode:2; \ +ModuleData moduleData[NUM_MODULES+1]; \ +ScriptData scriptsData[MAX_SCRIPTS]; \ +char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ +uint8_t potsWarnEnabled; \ +int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; + +PACK(typedef struct { + ModelHeader header; + TimerData_v218 timers[MAX_TIMERS]; + uint8_t telemetryProtocol:3; + uint8_t thrTrim:1; // Enable Throttle Trim + uint8_t noGlobalFunctions:1; + uint8_t displayTrims:2; + uint8_t ignoreSensorIds:1; + int8_t trimInc:3; // Trim Increments + uint8_t disableThrottleWarning:1; + uint8_t displayChecklist:1; + uint8_t extendedLimits:1; + uint8_t extendedTrims:1; + uint8_t throttleReversed:1; + BeepANACenter beepANACenter; + MixData_v218 mixData[MAX_MIXERS]; + LimitData limitData[MAX_OUTPUT_CHANNELS]; + ExpoData_v218 expoData[MAX_EXPOS]; + + CurveData_v218 curves[MAX_CURVES]; + int8_t points[MAX_CURVE_POINTS]; + + LogicalSwitchData_v218 logicalSw[32]; + CustomFunctionData_v218 customFn[MAX_SPECIAL_FUNCTIONS]; + SwashRingData swashR; + FlightModeData_v218 flightModeData[MAX_FLIGHT_MODES]; + + uint8_t thrTraceSrc; + + swarnstate_t switchWarningState; + swarnenable_t switchWarningEnable; + + GVarData_v218 gvars[MAX_GVARS]; + + FrSkyTelemetryData frsky; + RssiAlarmData rssiAlarms; + + MODELDATA_EXTRA_218 + + TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS]; + + TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) +}) ModelData_v218; + +#endif //OPENTX_DATASTRUCTS_218_H diff --git a/radio/src/storage/conversions/eeprom_conversions.cpp b/radio/src/storage/conversions/eeprom_conversions.cpp new file mode 100644 index 000000000..7467d19d6 --- /dev/null +++ b/radio/src/storage/conversions/eeprom_conversions.cpp @@ -0,0 +1,1343 @@ +/* + * 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" +#include "datastructs_218.h" + +enum Mix216Sources { + MIXSRC216_NONE, + +#if defined(PCBTARANIS) + MIXSRC216_FIRST_INPUT, + MIXSRC216_LAST_INPUT = MIXSRC216_FIRST_INPUT+MAX_INPUTS-1, + + MIXSRC216_FIRST_LUA, + MIXSRC216_LAST_LUA = MIXSRC216_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1, +#endif + + MIXSRC216_Rud, + MIXSRC216_Ele, + MIXSRC216_Thr, + MIXSRC216_Ail, + + MIXSRC216_FIRST_POT, +#if defined(PCBTARANIS) + MIXSRC216_POT1 = MIXSRC216_FIRST_POT, + MIXSRC216_POT2, + MIXSRC216_POT3, + MIXSRC216_SLIDER1, + MIXSRC216_SLIDER2, + MIXSRC216_LAST_POT = MIXSRC216_SLIDER2, +#else + MIXSRC216_P1 = MIXSRC216_FIRST_POT, + MIXSRC216_P2, + MIXSRC216_P3, + MIXSRC216_LAST_POT = MIXSRC216_P3, +#endif + +#if defined(PCBSKY9X) + MIXSRC216_REa, + MIXSRC216_LAST_ROTARY_ENCODER = MIXSRC216_REa, +#endif + + MIXSRC216_MAX, + + MIXSRC216_CYC1, + MIXSRC216_CYC2, + MIXSRC216_CYC3, + + MIXSRC216_TrimRud, + MIXSRC216_TrimEle, + MIXSRC216_TrimThr, + MIXSRC216_TrimAil, + + MIXSRC216_FIRST_SWITCH, + +#if defined(PCBTARANIS) + MIXSRC216_SA = MIXSRC216_FIRST_SWITCH, + MIXSRC216_SB, + MIXSRC216_SC, + MIXSRC216_SD, + MIXSRC216_SE, + MIXSRC216_SF, + MIXSRC216_SG, + MIXSRC216_SH, +#else + MIXSRC216_3POS = MIXSRC216_FIRST_SWITCH, + MIXSRC216_THR, + MIXSRC216_RUD, + MIXSRC216_ELE, + MIXSRC216_AIL, + MIXSRC216_GEA, + MIXSRC216_TRN, +#endif + MIXSRC216_FIRST_LOGICAL_SWITCH, + MIXSRC216_SW1 = MIXSRC216_FIRST_LOGICAL_SWITCH, + MIXSRC216_SW9 = MIXSRC216_SW1 + 8, + MIXSRC216_SWA, + MIXSRC216_SWB, + MIXSRC216_SWC, + MIXSRC216_LAST_LOGICAL_SWITCH = MIXSRC216_FIRST_LOGICAL_SWITCH+32-1, + + MIXSRC216_FIRST_TRAINER, + MIXSRC216_LAST_TRAINER = MIXSRC216_FIRST_TRAINER+MAX_TRAINER_CHANNELS-1, + + MIXSRC216_FIRST_CH, + MIXSRC216_CH1 = MIXSRC216_FIRST_CH, + MIXSRC216_CH2, + MIXSRC216_CH3, + MIXSRC216_CH4, + MIXSRC216_CH5, + MIXSRC216_CH6, + MIXSRC216_CH7, + MIXSRC216_CH8, + MIXSRC216_CH9, + MIXSRC216_CH10, + MIXSRC216_CH11, + MIXSRC216_CH12, + MIXSRC216_CH13, + MIXSRC216_CH14, + MIXSRC216_CH15, + MIXSRC216_CH16, + MIXSRC216_LAST_CH = MIXSRC216_CH1+MAX_OUTPUT_CHANNELS-1, + + MIXSRC216_GVAR1, + MIXSRC216_LAST_GVAR = MIXSRC216_GVAR1+MAX_GVARS-1, + + MIXSRC216_FIRST_TELEM, +}; + +enum Telemetry216Source { + TELEM216_NONE, + TELEM216_TX_VOLTAGE, + TELEM216_TX_TIME, + TELEM216_RESERVE1, + TELEM216_RESERVE2, + TELEM216_RESERVE3, + TELEM216_RESERVE4, + TELEM216_RESERVE5, + TELEM216_TIMER1, + TELEM216_TIMER2, + TELEM216_SWR, + TELEM216_RSSI_TX, + TELEM216_RSSI_RX, + TELEM216_RESERVE0, + TELEM216_A1, + TELEM216_A2, + TELEM216_A3, + TELEM216_A4, + TELEM216_ALT, + TELEM216_RPM, + TELEM216_FUEL, + TELEM216_T1, + TELEM216_T2, + TELEM216_SPEED, + TELEM216_DIST, + TELEM216_GPSALT, + TELEM216_CELL, + TELEM216_CELLS_SUM, + TELEM216_VFAS, + TELEM216_CURRENT, + TELEM216_CONSUMPTION, + TELEM216_POWER, + TELEM216_ACCx, + TELEM216_ACCy, + TELEM216_ACCz, + TELEM216_HDG, + TELEM216_VSPEED, + TELEM216_ASPEED, + TELEM216_DTE, + TELEM216_RESERVE6, + TELEM216_RESERVE7, + TELEM216_RESERVE8, + TELEM216_RESERVE9, + TELEM216_RESERVE10, + TELEM216_MIN_A1, + TELEM216_MIN_A2, + TELEM216_MIN_A3, + TELEM216_MIN_A4, + TELEM216_MIN_ALT, + TELEM216_MAX_ALT, + TELEM216_MAX_RPM, + TELEM216_MAX_T1, + TELEM216_MAX_T2, + TELEM216_MAX_SPEED, + TELEM216_MAX_DIST, + TELEM216_MAX_ASPEED, + TELEM216_MIN_CELL, + TELEM216_MIN_CELLS_SUM, + TELEM216_MIN_VFAS, + TELEM216_MAX_CURRENT, + TELEM216_MAX_POWER, + TELEM216_RESERVE11, + TELEM216_RESERVE12, + TELEM216_RESERVE13, + TELEM216_RESERVE14, + TELEM216_RESERVE15, + TELEM216_ACC, + TELEM216_GPS_TIME, +}; + +PACK(typedef struct { + uint8_t type:3; + uint8_t smooth:1; + uint8_t spare:4; + int8_t points; +}) CurveData_v216; + +#if defined(PCBTARANIS) +PACK(typedef struct { + uint8_t srcRaw; + uint16_t scale; + uint8_t chn; + int8_t swtch; + uint16_t flightModes; + int8_t weight; + int8_t carryTrim:6; + uint8_t mode:2; + char name[LEN_EXPOMIX_NAME]; + int8_t offset; + CurveRef curve; + uint8_t spare; +}) ExpoData_v216; +PACK(typedef struct { + uint32_t srcRaw:10; + uint32_t scale:14; + uint32_t chn:8; + int8_t swtch; + uint16_t flightModes; + int8_t weight; + int8_t carryTrim:6; + uint8_t mode:2; + char name[LEN_EXPOMIX_NAME]; + int8_t offset; + CurveRef curve; +}) ExpoData_v217; +#else +PACK(typedef struct { + uint8_t mode:2; // 0=end, 1=pos, 2=neg, 3=both + uint8_t chn:4; + uint8_t curveMode:2; + int8_t swtch; + uint16_t flightModes; + int8_t weight; + char name[LEN_EXPOMIX_NAME]; + int8_t curveParam; +}) ExpoData_v216; +typedef ExpoData_v216 ExpoData_v217; +#endif + +#if defined(PCBTARANIS) +PACK(typedef struct { + int16_t min; + int16_t max; + int8_t ppmCenter; + int16_t offset:14; + uint16_t symetrical:1; + uint16_t revert:1; + char name[LEN_CHANNEL_NAME]; + int8_t curve; +}) LimitData_v216; +#else +#define LimitData_v216 LimitData +#endif + +#if defined(PCBTARANIS) +PACK(typedef struct { + uint8_t destCh; + uint16_t flightModes; + uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := + uint8_t carryTrim:1; + uint8_t spare1:5; + int16_t weight; + int8_t swtch; + CurveRef curve; + uint8_t mixWarn:4; // mixer warning + uint8_t spare2:4; + uint8_t delayUp; + uint8_t delayDown; + uint8_t speedUp; + uint8_t speedDown; + uint8_t srcRaw; + int16_t offset; + char name[LEN_EXPOMIX_NAME]; + uint8_t spare3; +}) MixData_v216; +PACK(typedef struct { + uint8_t destCh; + uint16_t flightModes:9; + uint16_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := + uint16_t carryTrim:1; + uint16_t mixWarn:4; // mixer warning + int16_t weight; + uint32_t srcRaw:10; + int32_t offset:14; + int32_t swtch:8; + CurveRef curve; + uint8_t delayUp; + uint8_t delayDown; + uint8_t speedUp; + uint8_t speedDown; + char name[LEN_EXPOMIX_NAME]; +}) MixData_v217; +#else +PACK(typedef struct { + uint8_t destCh:5; + uint8_t mixWarn:3; // mixer warning + uint16_t flightModes; + uint8_t curveMode:1; + uint8_t noExpo:1; + int8_t carryTrim:3; + uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := + uint8_t spare:1; + int16_t weight; + int8_t swtch; + int8_t curveParam; + uint8_t delayUp; + uint8_t delayDown; + uint8_t speedUp; + uint8_t speedDown; + uint8_t srcRaw; + int16_t offset; + char name[LEN_EXPOMIX_NAME]; +}) MixData_v216; +typedef MixData MixData_v217; +#endif + +PACK(typedef struct { + int8_t mode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw + uint16_t start; + uint8_t countdownBeep:2; + uint8_t minuteBeep:1; + uint8_t persistent:2; + uint8_t spare:3; + uint16_t value; +}) TimerData_v216; + +PACK(typedef struct { + int32_t mode:8; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw + uint32_t start:24; + int32_t value:24; + uint32_t countdownBeep:2; + uint32_t minuteBeep:1; + uint32_t persistent:2; + uint32_t spare:3; + char name[LEN_TIMER_NAME]; +}) TimerData_v217; + +PACK(typedef struct { + int16_t trim[NUM_STICKS]; + int8_t swtch; // swtch of phase[0] is not used + char name[LEN_FLIGHT_MODE_NAME]; + uint8_t fadeIn; + uint8_t fadeOut; + int16_t rotaryEncoders[1]; + gvar_t gvars[9]; +}) FlightModeData_v216; + +PACK(typedef struct { // Logical Switches data + int8_t v1; + int16_t v2; + int16_t v3; + uint8_t func; + uint8_t delay; + uint8_t duration; + int8_t andsw; +}) LogicalSwitchData_v216; + +PACK(typedef struct { // Logical Switches data + uint16_t func:6; + int16_t v1:10; + int16_t v2; + int16_t v3; + uint8_t delay; + uint8_t duration; + int8_t andsw; +}) LogicalSwitchData_v217; + +#if defined(PCBTARANIS) +PACK(typedef struct { + int8_t swtch; + uint8_t func; + PACK(union { + PACK(struct { + char name[8]; + }) play; + + PACK(struct { + int16_t val; + uint8_t mode; + uint8_t param; + int32_t spare2; + }) all; + + PACK(struct { + int32_t val1; + int32_t val2; + }) clear; + }); + uint8_t active; +}) CustomFunctionData_v216; +#else +PACK(typedef struct { + int8_t swtch; + uint8_t func; + PACK(union { + PACK(struct { + char name[6]; + }) play; + + PACK(struct { + int16_t val; + uint8_t mode; + uint8_t param; + int16_t spare2; + }) all; + + PACK(struct { + int32_t val1; + int16_t val2; + }) clear; + }); + uint8_t active; +}) CustomFunctionData_v216; +#endif + +PACK(typedef struct { + uint8_t source; + uint8_t barMin; // minimum for bar display + uint8_t barMax; // ditto for max display (would usually = ratio) +}) FrSkyBarData_v216; + +PACK(typedef struct { + uint8_t sources[NUM_LINE_ITEMS]; +}) FrSkyLineData_v216; + +typedef union { + FrSkyBarData_v216 bars[4]; + FrSkyLineData_v216 lines[4]; +} FrSkyScreenData_v216; + + +PACK(struct FrSkyChannelData_v216 { + uint8_t unused[7]; + }); + + +PACK(typedef struct { + FrSkyChannelData_v216 channels[4]; + uint8_t usrProto; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh, 3=Halcyon + uint8_t voltsSource:7; + uint8_t altitudeDisplayed:1; + int8_t blades; // How many blades for RPMs, 0=2 blades + uint8_t currentSource; + uint8_t screensType; // 2bits per screen (None/Gauges/Numbers/Script) + FrSkyScreenData_v216 screens[3]; + uint8_t varioSource; + int8_t varioCenterMax; + int8_t varioCenterMin; + int8_t varioMin; + int8_t varioMax; + uint8_t rssiAlarms[2]; + uint16_t mAhPersistent:1; + uint16_t storedMah:15; + int8_t fasOffset; +}) FrSkyData_v216; + +PACK(typedef struct { + char file[10]; + char name[10]; + int8_t inputs[10]; +}) ScriptData_v216; + +PACK(typedef struct { // Swash Ring data + uint8_t invertELE:1; + uint8_t invertAIL:1; + uint8_t invertCOL:1; + uint8_t type:5; + uint8_t collectiveSource; + uint8_t value; +}) SwashRingData_v216; + +PACK(typedef struct { + int8_t rfProtocol; + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + uint8_t failsafeMode; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; + int8_t ppmDelay; + int8_t ppmFrameLength; + uint8_t ppmPulsePol; +}) ModuleData_v216; + +PACK(typedef struct { + uint8_t type:4; + int8_t rfProtocol:4; + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + union { + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t subType:3; + uint8_t invertedSerial:1; // telemetry serial inverted from standard + }; + struct { + uint8_t failsafeMode:4; // only 3 bits used + uint8_t freq:2; + uint8_t region:2; + } r9m; + }; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; + union { + struct { + int8_t delay:6; + uint8_t pulsePol:1; + uint8_t outputType:1; // false = open drain, true = push pull + int8_t frameLength; + } ppm; + }; +}) ModuleData_v217; + +#if defined(PCBTARANIS) +#define MODELDATA_EXTRA_216 \ + uint8_t externalModule; \ + uint8_t trainerMode; \ + ModuleData_v216 moduleData[NUM_MODULES+1]; \ + char curveNames[MAX_CURVES][6]; \ + ScriptData_v216 scriptsData[MAX_SCRIPTS]; \ + char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ + uint8_t nPotsToWarn; \ + int8_t potPosition[NUM_POTS+NUM_SLIDERS]; \ + uint8_t spare[2]; +#elif defined(PCBSKY9X) +#define MODELDATA_EXTRA_216 \ + uint8_t externalModule; \ + ModuleData_v216 moduleData[NUM_MODULES+1]; \ + uint8_t nPotsToWarn; \ + int8_t potPosition[NUM_POTS+NUM_SLIDERS]; \ + uint8_t rxBattAlarms[2]; +#endif + +#if defined(PCBTARANIS) +#define MODELDATA_EXTRA_217 \ + uint8_t spare:3; \ + uint8_t trainerMode:3; \ + uint8_t potsWarnMode:2; \ + ModuleData_v217 moduleData[NUM_MODULES+1]; \ + char curveNames[MAX_CURVES][6]; \ + ScriptData scriptsData[MAX_SCRIPTS]; \ + char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ + uint8_t potsWarnEnabled; \ + int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; +#else +#define MODELDATA_EXTRA_217 \ + uint8_t spare:6; \ + uint8_t potsWarnMode:2; \ + ModuleData moduleData[NUM_MODULES+1]; \ + uint8_t potsWarnEnabled; \ + int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; \ + uint8_t rxBattAlarms[2]; +#endif + +#if defined(PCBTARANIS) && LCD_W >= 212 +PACK(typedef struct { + char name[LEN_MODEL_NAME]; + uint8_t modelId; + char bitmap[LEN_BITMAP_NAME]; +}) ModelHeader_v216; +#else +PACK(typedef struct { + char name[LEN_MODEL_NAME]; + uint8_t modelId; +}) ModelHeader_v216; +#endif + +PACK(typedef struct { + ModelHeader_v216 header; + TimerData_v216 timers[2]; + uint8_t telemetryProtocol:3; + uint8_t thrTrim:1; // Enable Throttle Trim + int8_t spare2:4; + int8_t trimInc:3; // Trim Increments + uint8_t disableThrottleWarning:1; + uint8_t displayChecklist:1; + uint8_t extendedLimits:1; + uint8_t extendedTrims:1; + uint8_t throttleReversed:1; + BeepANACenter beepANACenter; // 1<<0->A1.. 1<<6->A7 + MixData_v216 mixData[MAX_MIXERS]; + LimitData_v216 limitData[MAX_OUTPUT_CHANNELS]; + ExpoData_v216 expoData[MAX_EXPOS]; + + CurveData_v216 curves[MAX_CURVES]; + int8_t points[MAX_CURVE_POINTS]; + + LogicalSwitchData_v216 logicalSw[32]; + CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; + SwashRingData_v216 swashR; + FlightModeData_v216 flightModeData[MAX_FLIGHT_MODES]; + + uint8_t thrTraceSrc; + + uint16_t switchWarningState; + uint8_t switchWarningEnable; + + GVarData gvars[MAX_GVARS]; + + FrSkyData_v216 frsky; + + MODELDATA_EXTRA_216 + +}) ModelData_v216; + +PACK(typedef struct { + char name[6]; + uint8_t popup:1; + uint8_t spare:7; +}) GVarData_v217; + +PACK(typedef struct { + ModelHeader header; + TimerData_v217 timers[MAX_TIMERS]; + uint8_t telemetryProtocol:3; + uint8_t thrTrim:1; // Enable Throttle Trim + uint8_t noGlobalFunctions:1; + uint8_t displayTrims:2; + uint8_t ignoreSensorIds:1; + int8_t trimInc:3; // Trim Increments + uint8_t disableThrottleWarning:1; + uint8_t displayChecklist:1; + uint8_t extendedLimits:1; + uint8_t extendedTrims:1; + uint8_t throttleReversed:1; + BeepANACenter beepANACenter; + MixData_v217 mixData[MAX_MIXERS]; + LimitData limitData[MAX_OUTPUT_CHANNELS]; + ExpoData_v217 expoData[MAX_EXPOS]; + + CurveData_v216 curves[MAX_CURVES]; + int8_t points[MAX_CURVE_POINTS]; + + LogicalSwitchData_v217 logicalSw[32]; + CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; + SwashRingData swashR; + FlightModeData_v216 flightModeData[MAX_FLIGHT_MODES]; + + uint8_t thrTraceSrc; + + swarnstate_t switchWarningState; + swarnenable_t switchWarningEnable; + + GVarData_v217 gvars[MAX_GVARS]; + + FrSkyTelemetryData frsky; + RssiAlarmData rssiAlarms; + + MODELDATA_EXTRA_217 + + TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS]; + + TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) +}) ModelData_v217; + +int ConvertTelemetrySource_216_to_217(int source) +{ + // TELEM_TIMER3 added +// if (source >= TELEM_TIMER3) + // source += 1; + + return source; +} + +#if defined(PCBTARANIS) +int ConvertSwitch_216_to_217(int swtch) +{ + if (swtch < 0) + return -ConvertSwitch_216_to_217(-swtch); + + if (swtch > SWSRC_SF0) + swtch += 1; + + if (swtch > SWSRC_SH0) + swtch += 1; + + return swtch; +} +#else +int ConvertSwitch_216_to_217(int swtch) +{ + return swtch; +} +#endif + +int ConvertSwitch_217_to_218(int swtch) +{ + // 32 additional logical switches + + if (swtch < 0) + return -ConvertSwitch_217_to_218(-swtch); + + if (swtch >= SWSRC_FIRST_LOGICAL_SWITCH+32) + return swtch+32; + + return swtch; +} + +int ConvertSource_216_to_217(int source) +{ +#if defined(PCBX9E) + // SI to SR switches added + if (source >= MIXSRC_SI) + source += 10; +#endif + // Telemetry conversions + if (source >= MIXSRC_FIRST_TELEM) + source = 0; + + return source; +} + +int ConvertSource_217_to_218(int source) +{ +#if defined(PCBTARANIS) + if (source >= MIXSRC_FIRST_LOGICAL_SWITCH + 32) + source += 32; +#endif + + return source; +} + +int ConvertGVar_216_to_217(int value) +{ + if (value < -4096 + 9) + value += 4096 - 1024; + else if (value > 4095 - 9) + value -= 4095 - 1023; + return value; +} + +PACK(typedef struct { + uint8_t version; + uint16_t variant; + CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS]; + uint16_t chkSum; + int8_t currModel; + uint8_t contrast; + uint8_t vBatWarn; + int8_t txVoltageCalibration; + int8_t backlightMode; + TrainerData trainer; + uint8_t view; // index of view in main screen + int8_t buzzerMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + uint8_t fai:1; + int8_t beepMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + uint8_t alarmsFlash:1; + uint8_t disableMemoryWarning:1; + uint8_t disableAlarmWarning:1; + uint8_t stickMode:2; + int8_t timezone:5; + uint8_t adjustRTC:1; + uint8_t inactivityTimer; + uint8_t telemetryBaudrate:3; + int8_t splashMode:3; + int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + int8_t switchesDelay; + uint8_t lightAutoOff; + uint8_t templateSetup; // RETA order for receiver channels + int8_t PPM_Multiplier; + int8_t hapticLength; + uint8_t reNavigation; + N_TARANIS_FIELD(uint8_t stickReverse) + int8_t beepLength:3; + int8_t hapticStrength:3; + uint8_t gpsFormat:1; + uint8_t unexpectedShutdown:1; + uint8_t speakerPitch; + int8_t speakerVolume; + int8_t vBatMin; + int8_t vBatMax; + + uint8_t backlightBright; + int8_t txCurrentCalibration; + int8_t temperatureWarn; + uint8_t mAhWarn; + uint16_t mAhUsed; + uint32_t globalTimer; + int8_t temperatureCalib; + uint8_t bluetoothBaudrate; + uint8_t optrexDisplay; + uint8_t sticksGain; + uint8_t rotarySteps; + uint8_t countryCode; + uint8_t imperial; + char ttsLanguage[2]; + int8_t beepVolume; + int8_t wavVolume; + int8_t varioVolume; + int8_t varioPitch; + int8_t varioRange; + int8_t varioRepeat; + int8_t backgroundVolume; + + TARANIS_FIELD(uint8_t serial2Mode:6) + TARANIS_FIELD(uint8_t slidersConfig:2) + TARANIS_FIELD(uint8_t potsConfig) + TARANIS_FIELD(uint8_t backlightColor) + TARANIS_FIELD(swarnstate_t switchUnlockStates) + TARANIS_FIELD(CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]) + TARANIS_FIELD(swconfig_t switchConfig) + TARANIS_FIELD(char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]) + TARANIS_FIELD(char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]) + N_TARANIS_FIELD(CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]) + + TARANIS_PCBX9E_FIELD(uint8_t bluetoothEnable) + TARANIS_PCBX9E_FIELD(char bluetoothName[LEN_BLUETOOTH_NAME]) +}) RadioData_v216; + +void ConvertRadioData_216_to_217(RadioData & settings) +{ + RadioData_v216 * settings_v216 = (RadioData_v216 *)&settings; + settings_v216->version = 217; +#if defined(PCBTARANIS) + settings_v216->potsConfig = 0x05; // S1 and S2 = pots with detent + settings_v216->switchConfig = 0x00007bff; // 6x3POS, 1x2POS, 1xTOGGLE +#endif +} + +void ConvertSpecialFunctions_217_to_218(CustomFunctionData * cf218, CustomFunctionData_v216 * cf216) +{ + for (int i=0; i= 212 + memcpy(newModel.header.bitmap, oldModel.header.bitmap, LEN_BITMAP_NAME); +#endif + + for (uint8_t i=0; i<2; i++) { + TimerData_v217 & timer = newModel.timers[i]; + if (oldModel.timers[i].mode >= TMRMODE_COUNT) + timer.mode = TMRMODE_COUNT + ConvertSwitch_216_to_217(oldModel.timers[i].mode - TMRMODE_COUNT + 1) - 1; + else + timer.mode = ConvertSwitch_216_to_217(oldModel.timers[i].mode); + timer.start = oldModel.timers[i].start; + timer.countdownBeep = oldModel.timers[i].countdownBeep; + timer.minuteBeep = oldModel.timers[i].minuteBeep; + timer.persistent = oldModel.timers[i].persistent; + timer.value = oldModel.timers[i].value; + } + newModel.telemetryProtocol = oldModel.telemetryProtocol; + newModel.thrTrim = oldModel.thrTrim; + newModel.trimInc = oldModel.trimInc; + newModel.disableThrottleWarning = oldModel.disableThrottleWarning; + newModel.displayChecklist = oldModel.displayChecklist; + newModel.extendedLimits = oldModel.extendedLimits; + newModel.extendedTrims = oldModel.extendedTrims; + newModel.throttleReversed = oldModel.throttleReversed; + newModel.beepANACenter = oldModel.beepANACenter; + for (int i=0; i> 6; + newModel.potsWarnEnabled = oldModel.nPotsToWarn & 0x1f; + memcpy(newModel.potsWarnPosition, oldModel.potPosition, sizeof(newModel.potsWarnPosition)); +} + +void ConvertModel_217_to_218(ModelData & model) +{ + assert(sizeof(ModelData_v217) <= sizeof(ModelData)); + + ModelData_v217 oldModel; + memcpy(&oldModel, &model, sizeof(oldModel)); + ModelData_v218 & newModel = model; + memset(&newModel, 0, sizeof(ModelData)); + + char name[LEN_MODEL_NAME+1]; + zchar2str(name, oldModel.header.name, LEN_MODEL_NAME); + TRACE("Model %s conversion from v217 to v218", name); + + newModel.header = oldModel.header; + for (uint8_t i=0; i= TMRMODE_COUNT) + newModel.timers[i].mode = TMRMODE_COUNT + ConvertSwitch_217_to_218(oldModel.timers[i].mode - TMRMODE_COUNT + 1) - 1; + else + newModel.timers[i].mode = ConvertSwitch_217_to_218(oldModel.timers[i].mode); + if (oldModel.timers[i].mode) + TRACE("timer mode %d => %d", oldModel.timers[i].mode, newModel.timers[i].mode); + newModel.timers[i].start = oldModel.timers[i].start; + newModel.timers[i].value = oldModel.timers[i].value; + newModel.timers[i].countdownBeep = oldModel.timers[i].countdownBeep; + newModel.timers[i].minuteBeep = oldModel.timers[i].minuteBeep; + newModel.timers[i].persistent = oldModel.timers[i].persistent; + memcpy(newModel.timers[i].name, oldModel.timers[i].name, sizeof(newModel.timers[i].name)); + } + newModel.telemetryProtocol = oldModel.telemetryProtocol; + newModel.thrTrim = oldModel.thrTrim; + newModel.noGlobalFunctions = oldModel.noGlobalFunctions; + newModel.displayTrims = oldModel.displayTrims; + newModel.ignoreSensorIds = oldModel.ignoreSensorIds; + newModel.trimInc = oldModel.trimInc; + newModel.disableThrottleWarning = oldModel.disableThrottleWarning; + newModel.displayChecklist = oldModel.displayChecklist; + newModel.extendedLimits = oldModel.extendedLimits; + newModel.extendedTrims = oldModel.extendedTrims; + newModel.throttleReversed = oldModel.throttleReversed; + newModel.beepANACenter = oldModel.beepANACenter; + for (int i=0; i> (2*i)) & 0x03) == TELEMETRY_SCREEN_TYPE_VALUES) { + for (int j = 0; j < 4; j++) { + for (int k = 0; k < NUM_LINE_ITEMS; k++) { + newModel.frsky.screens[i].lines[j].sources[k] = ConvertSource_217_to_218(oldModel.frsky.screens[i].lines[j].sources[k]); + } + } + } + else if (((oldModel.frsky.screensType >> (2*i)) & 0x03) == TELEMETRY_SCREEN_TYPE_GAUGES) { + for (int j = 0; j < 4; j++) { + newModel.frsky.screens[i].bars[j].source = ConvertSource_217_to_218(oldModel.frsky.screens[i].bars[j].source); + } + } + } + for (int i=0; i UNIT_WATTS) + newModel.telemetrySensors[i].unit += 1; + } +#if defined(PCBX9E) + newModel.toplcdTimer = oldModel.toplcdTimer; +#endif +} + +void ConvertModel(int id, int version) +{ + eeLoadModelData(id); + + if (version == 216) { + version = 217; + ConvertModel_216_to_217(g_model); + } + if (version == 217) { + version = 218; + ConvertModel_217_to_218(g_model); + } + + uint8_t currModel = g_eeGeneral.currModel; + g_eeGeneral.currModel = id; + storageDirty(EE_MODEL); + storageCheck(true); + g_eeGeneral.currModel = currModel; +} + +bool eeConvert() +{ + const char *msg = NULL; + + if (g_eeGeneral.version == 216) { + msg = "EEprom Data v216"; + } + else if (g_eeGeneral.version == 217) { + msg = "EEprom Data v217"; + } + else { + return false; + } + + int conversionVersionStart = g_eeGeneral.version; + + // Information to the user and wait for key press +#if defined(PCBSKY9X) + g_eeGeneral.optrexDisplay = 0; +#endif + g_eeGeneral.backlightMode = e_backlight_mode_on; + g_eeGeneral.backlightBright = 0; + g_eeGeneral.contrast = 25; + + ALERT(STR_STORAGE_WARNING, msg, AU_BAD_RADIODATA); + + RAISE_ALERT(STR_STORAGE_WARNING, STR_EEPROM_CONVERTING, NULL, AU_NONE); + + // General Settings conversion + eeLoadGeneralSettingsData(); + int version = conversionVersionStart; + if (version == 216) { + version = 217; + ConvertRadioData_216_to_217(g_eeGeneral); + } + if (version == 217) { + version = 218; + ConvertRadioData_217_to_218(g_eeGeneral); + } + storageDirty(EE_GENERAL); + storageCheck(true); + +#if defined(COLORLCD) +#elif LCD_W >= 212 + lcdDrawRect(60, 6*FH+4, 132, 3); +#else + lcdDrawRect(10, 6*FH+4, 102, 3); +#endif + + // Models conversion + for (uint8_t id=0; id= 212 + lcdDrawSolidHorizontalLine(61, 6*FH+5, 10+id*2, FORCE); +#else + lcdDrawSolidHorizontalLine(11, 6*FH+5, 10+(id*3)/2, FORCE); +#endif + lcdRefresh(); + if (eeModelExists(id)) { + ConvertModel(id, conversionVersionStart); + } + + } + + return true; +} From 390e31cddab3efa731504f2ec40789bac37908cd Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 18 Mar 2019 16:12:49 +0100 Subject: [PATCH 359/446] continued --- radio/src/storage/conversions/eeprom_conversions.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/storage/conversions/eeprom_conversions.cpp b/radio/src/storage/conversions/eeprom_conversions.cpp index 7467d19d6..93236bca8 100644 --- a/radio/src/storage/conversions/eeprom_conversions.cpp +++ b/radio/src/storage/conversions/eeprom_conversions.cpp @@ -1080,8 +1080,8 @@ void ConvertModel_217_to_218(ModelData & model) ModelData_v217 oldModel; memcpy(&oldModel, &model, sizeof(oldModel)); - ModelData_v218 & newModel = model; - memset(&newModel, 0, sizeof(ModelData)); + ModelData_v218 & newModel = (ModelData_v218 &) model; + memset(&newModel, 0, sizeof(ModelData_v218)); char name[LEN_MODEL_NAME+1]; zchar2str(name, oldModel.header.name, LEN_MODEL_NAME); @@ -1175,7 +1175,7 @@ void ConvertModel_217_to_218(ModelData & model) } memcpy(newModel.points, oldModel.points, sizeof(newModel.points)); for (int i=0; i<32; i++) { - LogicalSwitchData & sw = newModel.logicalSw[i]; + LogicalSwitchData_v218 & sw = newModel.logicalSw[i]; sw.func = oldModel.logicalSw[i].func; sw.v1 = oldModel.logicalSw[i].v1; sw.v2 = oldModel.logicalSw[i].v2; From 47b8680166cf21d5003f2768260e7021ff821fab Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 18 Mar 2019 16:28:32 +0100 Subject: [PATCH 360/446] continued --- .../src/storage/conversions/datastructs_218.h | 64 +++++++++++++++++++ .../conversions/eeprom_conversions.cpp | 8 +-- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/radio/src/storage/conversions/datastructs_218.h b/radio/src/storage/conversions/datastructs_218.h index 2ad08e54e..3d0d107c0 100644 --- a/radio/src/storage/conversions/datastructs_218.h +++ b/radio/src/storage/conversions/datastructs_218.h @@ -185,4 +185,68 @@ PACK(typedef struct { TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) }) ModelData_v218; +#if defined(BUZZER) +#define BUZZER_FIELD int8_t buzzerMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware) +#else +#define BUZZER_FIELD int8_t spareRadio:2; +#endif + + +PACK(typedef struct { + uint8_t version; + uint16_t variant; + CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS+NUM_DUMMY_ANAS]; + uint16_t chkSum; + uint8_t vBatWarn; + int8_t txVoltageCalibration; + int8_t backlightMode; + TrainerData trainer; + uint8_t view; // index of view in main screen + BUZZER_FIELD + uint8_t fai:1; + int8_t beepMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + uint8_t alarmsFlash:1; + uint8_t disableMemoryWarning:1; + uint8_t disableAlarmWarning:1; + uint8_t stickMode:2; + int8_t timezone:5; + uint8_t adjustRTC:1; + uint8_t inactivityTimer; + uint8_t telemetryBaudrate:3; + int8_t splashMode:3; + int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + int8_t switchesDelay; + uint8_t lightAutoOff; + uint8_t templateSetup; // RETA order for receiver channels + int8_t PPM_Multiplier; + int8_t hapticLength; + int8_t beepLength:3); + int8_t hapticStrength:3; + uint8_t gpsFormat:1; + uint8_t unexpectedShutdown:1; + uint8_t speakerPitch; + int8_t speakerVolume; + int8_t vBatMin; + int8_t vBatMax; + uint8_t backlightBright; + uint32_t globalTimer; + uint8_t bluetoothBaudrate:4; + uint8_t bluetoothMode:4; + uint8_t countryCode; + uint8_t imperial:1; + uint8_t jitterFilter:1; /* 0 - active */ + uint8_t disableRssiPoweroffAlarm:1; + uint8_t USBMode:2; + uint8_t spareExtraArm:3; + char ttsLanguage[2]; + int8_t beepVolume:4; + int8_t wavVolume:4; + int8_t varioVolume:4; + int8_t backgroundVolume:4; + int8_t varioPitch; + int8_t varioRange; + int8_t varioRepeat; + CustomFunctionData_v218 customFn[MAX_SPECIAL_FUNCTIONS]; +}) RadioData_v218; + #endif //OPENTX_DATASTRUCTS_218_H diff --git a/radio/src/storage/conversions/eeprom_conversions.cpp b/radio/src/storage/conversions/eeprom_conversions.cpp index 93236bca8..d7d6bf0fa 100644 --- a/radio/src/storage/conversions/eeprom_conversions.cpp +++ b/radio/src/storage/conversions/eeprom_conversions.cpp @@ -821,11 +821,11 @@ void ConvertRadioData_216_to_217(RadioData & settings) #endif } -void ConvertSpecialFunctions_217_to_218(CustomFunctionData * cf218, CustomFunctionData_v216 * cf216) +void ConvertSpecialFunctions_217_to_218(CustomFunctionData_v218 * cf218, CustomFunctionData_v216 * cf216) { for (int i=0; i Date: Mon, 18 Mar 2019 17:04:16 +0100 Subject: [PATCH 361/446] wip my brain close to meltdown --- .../src/storage/conversions/datastructs_218.h | 190 ++++++++++++------ 1 file changed, 123 insertions(+), 67 deletions(-) diff --git a/radio/src/storage/conversions/datastructs_218.h b/radio/src/storage/conversions/datastructs_218.h index 3d0d107c0..bbd5c25f0 100644 --- a/radio/src/storage/conversions/datastructs_218.h +++ b/radio/src/storage/conversions/datastructs_218.h @@ -131,15 +131,17 @@ PACK(typedef struct { uint32_t spare:4; }) GVarData_v218; -#define MODELDATA_EXTRA_218 \ -uint8_t spare:3; \ -uint8_t trainerMode:3; \ -uint8_t potsWarnMode:2; \ -ModuleData moduleData[NUM_MODULES+1]; \ -ScriptData scriptsData[MAX_SCRIPTS]; \ -char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ -uint8_t potsWarnEnabled; \ -int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; +#if defined(PCBX12S) +#define MODELDATA_EXTRA_218 uint8_t spare:3;uint8_t trainerMode:3;uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1];ScriptData scriptsData[MAX_SCRIPTS];char inputNames[MAX_INPUTS][LEN_INPUT_NAME];;uint8_t potsWarnEnabled;;int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];; +#elif defined(PCBX10) +#define MODELDATA_EXTRA_218 uint8_t spare:3;;uint8_t trainerMode:3;;uint8_t potsWarnMode:2;; ModuleData moduleData[NUM_MODULES+1];ScriptData scriptsData[MAX_SCRIPTS];;char inputNames[MAX_INPUTS][LEN_INPUT_NAME];;uint8_t potsWarnEnabled;;int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];;uint8_t potsWarnSpares[NUM_DUMMY_ANAS];; +#elif defined(PCBTARANIS) +#define MODELDATA_EXTRA_218 uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; +#elif defined(PCBSKY9X) +#define MODELDATA_EXTRA_218 uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; uint8_t rxBattAlarms[2]; +#else + #define MODELDATA_EXTRA_218 +#endif PACK(typedef struct { ModelHeader header; @@ -185,68 +187,122 @@ PACK(typedef struct { TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) }) ModelData_v218; -#if defined(BUZZER) -#define BUZZER_FIELD int8_t buzzerMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware) +#define EXTRA_GENERAL_FIELDS_GENERAL_218 \ + uint8_t backlightBright; \ + uint32_t globalTimer; \ + uint8_t bluetoothBaudrate:4; \ + uint8_t bluetoothMode:4; \ + uint8_t countryCode; \ + uint8_t imperial:1; \ + uint8_t jitterFilter:1; /* 0 - active */\ + uint8_t disableRssiPoweroffAlarm:1; \ + uint8_t USBMode:2; \ + uint8_t spareExtraArm:3; \ + char ttsLanguage[2]; \ + int8_t beepVolume:4; \ + int8_t wavVolume:4; \ + int8_t varioVolume:4; \ + int8_t backgroundVolume:4; \ + int8_t varioPitch; \ + int8_t varioRange; \ + int8_t varioRepeat; \ + CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS]; + +#if defined(PCBHORUS) +#define EXTRA_GENERAL_FIELDS_218 \ + EXTRA_GENERAL_FIELDS_GENERAL_218 \ + uint8_t serial2Mode:4; \ + uint8_t slidersConfig:4; \ + uint32_t switchConfig; \ + uint8_t potsConfig; /* two bits per pot */ \ + char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; \ + char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_DUMMY_ANAS][LEN_ANA_NAME]; \ + char currModelFilename[LEN_MODEL_FILENAME+1]; \ + uint8_t spare:1; \ + uint8_t blOffBright:7; \ + char bluetoothName[LEN_BLUETOOTH_NAME]; +#elif defined(PCBTARANIS) +#if defined(BLUETOOTH) +#define BLUETOOTH_FIELDS_218 \ + uint8_t spare; \ + char bluetoothName[LEN_BLUETOOTH_NAME]; #else -#define BUZZER_FIELD int8_t spareRadio:2; +#define BLUETOOTH_FIELDS +#endif +#define EXTRA_GENERAL_FIELDS_218 \ + EXTRA_GENERAL_FIELDS_GENERAL_218 \ + uint8_t serial2Mode:4; \ + uint8_t slidersConfig:4; \ + uint8_t potsConfig; /* two bits per pot */\ + uint8_t backlightColor; \ + swarnstate_t switchUnlockStates; \ + swconfig_t switchConfig; \ + char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; \ + char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]; \ + BLUETOOTH_FIELDS +#elif defined(PCBSKY9X) +#define EXTRA_GENERAL_FIELDS_218 \ + EXTRA_GENERAL_FIELDS_GENERAL_218 \ + int8_t txCurrentCalibration; \ + int8_t temperatureWarn; \ + uint8_t mAhWarn; \ + uint16_t mAhUsed; \ + int8_t temperatureCalib; \ + uint8_t optrexDisplay; \ + uint8_t sticksGain; \ + uint8_t rotarySteps; \ + char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; \ + char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]; +#elif defined(CPUARM) + #define EXTRA_GENERAL_FIELDS_218 EXTRA_GENERAL_FIELDS_GENERAL_218 +#elif defined(PXX) + #define EXTRA_GENERAL_FIELDS_218 uint8_t countryCode; +#else + #define EXTRA_GENERAL_FIELDS_218 #endif - PACK(typedef struct { - uint8_t version; - uint16_t variant; - CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS+NUM_DUMMY_ANAS]; - uint16_t chkSum; - uint8_t vBatWarn; - int8_t txVoltageCalibration; - int8_t backlightMode; - TrainerData trainer; - uint8_t view; // index of view in main screen - BUZZER_FIELD - uint8_t fai:1; - int8_t beepMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all - uint8_t alarmsFlash:1; - uint8_t disableMemoryWarning:1; - uint8_t disableAlarmWarning:1; - uint8_t stickMode:2; - int8_t timezone:5; - uint8_t adjustRTC:1; - uint8_t inactivityTimer; - uint8_t telemetryBaudrate:3; - int8_t splashMode:3; - int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all - int8_t switchesDelay; - uint8_t lightAutoOff; - uint8_t templateSetup; // RETA order for receiver channels - int8_t PPM_Multiplier; - int8_t hapticLength; - int8_t beepLength:3); - int8_t hapticStrength:3; - uint8_t gpsFormat:1; - uint8_t unexpectedShutdown:1; - uint8_t speakerPitch; - int8_t speakerVolume; - int8_t vBatMin; - int8_t vBatMax; - uint8_t backlightBright; - uint32_t globalTimer; - uint8_t bluetoothBaudrate:4; - uint8_t bluetoothMode:4; - uint8_t countryCode; - uint8_t imperial:1; - uint8_t jitterFilter:1; /* 0 - active */ - uint8_t disableRssiPoweroffAlarm:1; - uint8_t USBMode:2; - uint8_t spareExtraArm:3; - char ttsLanguage[2]; - int8_t beepVolume:4; - int8_t wavVolume:4; - int8_t varioVolume:4; - int8_t backgroundVolume:4; - int8_t varioPitch; - int8_t varioRange; - int8_t varioRepeat; - CustomFunctionData_v218 customFn[MAX_SPECIAL_FUNCTIONS]; + uint8_t version; + uint16_t variant; + CalibData_v218 calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS+NUM_DUMMY_ANAS]; + uint16_t chkSum; + N_HORUS_FIELD(int8_t currModel); + N_HORUS_FIELD(uint8_t contrast); + uint8_t vBatWarn; + int8_t txVoltageCalibration; + int8_t backlightMode; + TrainerData_v218 trainer; + uint8_t view; // index of view in main screen + BUZZER_FIELD + uint8_t fai:1; + int8_t beepMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + uint8_t alarmsFlash:1; + uint8_t disableMemoryWarning:1; + uint8_t disableAlarmWarning:1; + uint8_t stickMode:2; + int8_t timezone:5; + uint8_t adjustRTC:1; + uint8_t inactivityTimer; + SPLASH_MODE; /* 3bits */ + int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + uint8_t lightAutoOff; + uint8_t templateSetup; // RETA order for receiver channels + int8_t PPM_Multiplier; + int8_t hapticLength; + N_HORUS_FIELD(N_TARANIS_FIELD(N_PCBSTD_FIELD(uint8_t reNavigation))); + N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t stickReverse)); + int8_t beepLength:3; + int8_t hapticStrength:3; + uint8_t gpsFormat:1; + uint8_t unexpectedShutdown:1; + uint8_t speakerPitch; + int8_t speakerVolume; + int8_t vBatMin; + int8_t vBatMax; + + EXTRA_GENERAL_FIELDS_218 + + THEME_DATA }) RadioData_v218; #endif //OPENTX_DATASTRUCTS_218_H From 587135bf0a71d2f8e64d0954d309da42bce70e90 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 19 Mar 2019 08:44:15 +0100 Subject: [PATCH 362/446] fixes --- radio/src/datastructs.h | 4 ++-- .../src/storage/conversions/datastructs_218.h | 19 ++++++++++++++++--- .../conversions/eeprom_conversions.cpp | 6 +++--- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index be6ed736f..cdfc12cad 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -735,9 +735,9 @@ PACK(struct TrainerData { #endif #if defined(BUZZER) - #define BUZZER_FIELD NOBACKUP(int8_t buzzerMode:2); // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware) + #define BUZZER_FIELD int8_t buzzerMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware) #else - #define BUZZER_FIELD NOBACKUP(int8_t spareRadio:2); + #define BUZZER_FIELD int8_t spareRadio:2; #endif PACK(struct RadioData { diff --git a/radio/src/storage/conversions/datastructs_218.h b/radio/src/storage/conversions/datastructs_218.h index bbd5c25f0..a46d530fa 100644 --- a/radio/src/storage/conversions/datastructs_218.h +++ b/radio/src/storage/conversions/datastructs_218.h @@ -86,6 +86,11 @@ PACK(typedef struct { char name[LEN_CURVE_NAME]; }) CurveData_v218; +PACK(typedef struct { + int16_t calib[4]; + TrainerMix mix[4]; +}) TrainerData_v218; + PACK(typedef struct { // Logical Switches data uint8_t func; int32_t v1:10; @@ -206,7 +211,7 @@ PACK(typedef struct { int8_t varioPitch; \ int8_t varioRange; \ int8_t varioRepeat; \ - CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS]; + CustomFunctionData_v218 customFn[MAX_SPECIAL_FUNCTIONS]; #if defined(PCBHORUS) #define EXTRA_GENERAL_FIELDS_218 \ @@ -261,10 +266,18 @@ PACK(typedef struct { #define EXTRA_GENERAL_FIELDS_218 #endif +#if defined(PCBHORUS) +#define SPLASH_MODE uint8_t splashSpares:3 +#elif defined(FSPLASH) +#define SPLASH_MODE uint8_t splashMode:3 +#else +#define SPLASH_MODE int8_t splashMode:3 +#endif + PACK(typedef struct { uint8_t version; uint16_t variant; - CalibData_v218 calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS+NUM_DUMMY_ANAS]; + CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS+NUM_DUMMY_ANAS]; uint16_t chkSum; N_HORUS_FIELD(int8_t currModel); N_HORUS_FIELD(uint8_t contrast); @@ -285,7 +298,7 @@ PACK(typedef struct { uint8_t inactivityTimer; SPLASH_MODE; /* 3bits */ int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all - uint8_t lightAutoOff; + uint8_t lightAutoOff; uint8_t templateSetup; // RETA order for receiver channels int8_t PPM_Multiplier; int8_t hapticLength; diff --git a/radio/src/storage/conversions/eeprom_conversions.cpp b/radio/src/storage/conversions/eeprom_conversions.cpp index d7d6bf0fa..c3cb0a7f6 100644 --- a/radio/src/storage/conversions/eeprom_conversions.cpp +++ b/radio/src/storage/conversions/eeprom_conversions.cpp @@ -834,7 +834,7 @@ void ConvertSpecialFunctions_217_to_218(CustomFunctionData_v218 * cf218, CustomF } } -void ConvertRadioData_217_to_218(RadioData_v218 & settings) +void ConvertRadioData_217_to_218(RadioData & settings) { RadioData_v216 settings_v217 = (RadioData_v216 &)settings; @@ -864,7 +864,7 @@ void ConvertRadioData_217_to_218(RadioData_v218 & settings) settings.varioPitch = settings_v217.varioPitch; settings.varioRange = settings_v217.varioRange; settings.varioRepeat = settings_v217.varioRepeat; - ConvertSpecialFunctions_217_to_218(settings.customFn, settings_v217.customFn); + ConvertSpecialFunctions_217_to_218((CustomFunctionData_v218 *)settings.customFn, settings_v217.customFn); #if defined(PCBTARANIS) settings.serial2Mode = settings_v217.serial2Mode; @@ -1238,7 +1238,7 @@ void ConvertModel_217_to_218(ModelData & model) #warning "Conversion from v217 to v218 is broken" } #if defined(PCBTARANIS) - newModel.trainerData.mode = oldModel.trainerMode; + newModel.trainerMode = oldModel.trainerMode; memcpy(newModel.scriptsData, oldModel.scriptsData, sizeof(newModel.scriptsData)); memcpy(newModel.inputNames, oldModel.inputNames, sizeof(newModel.inputNames)); #endif From cee4fe6ac925e16ccf09e3a23308b11a3dcdae6a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Mar 2019 10:07:28 +0100 Subject: [PATCH 363/446] [PXX2] SET RX SETTINGS was still sent after leaving the screen --- radio/src/gui/128x64/model_setup.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 5a1b16245..d7b79488e 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1952,15 +1952,16 @@ enum MenuModelReceiverOptions { void menuModelReceiverOptions(event_t event) { + const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; + uint8_t wbar = LCD_W / 2 - 20; + + SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + sentModuleChannels(g_moduleIdx)); + if (menuEvent) { moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; return; } - const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; - uint8_t wbar = LCD_W / 2 - 20; - - SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + sentModuleChannels(g_moduleIdx)); int8_t sub = menuVerticalPosition; lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); From a82dd27c992403bfa16109ea62391db5a68d387b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Mar 2019 10:28:12 +0100 Subject: [PATCH 364/446] EEPROM conversions continued --- radio/src/CMakeLists.txt | 4 +- radio/src/storage/conversions/conversions.cpp | 15 +- radio/src/storage/conversions/conversions.h | 30 +- .../conversions/conversions_216_217.cpp | 448 ------ .../storage/conversions/conversions_216_217.h | 0 ...onversions.cpp => conversions_216_218.cpp} | 95 +- .../conversions/conversions_217_218.cpp | 284 ---- .../src/storage/conversions/datastructs_216.h | 675 --------- .../src/storage/conversions/datastructs_217.h | 362 ----- radio/src/storage/eeprom_common.h | 2 - radio/src/storage/eeprom_conversions.cpp | 1342 ----------------- radio/src/storage/eeprom_raw.cpp | 2 +- radio/src/storage/eeprom_rlc.cpp | 3 +- 13 files changed, 46 insertions(+), 3216 deletions(-) delete mode 100644 radio/src/storage/conversions/conversions_216_217.cpp delete mode 100644 radio/src/storage/conversions/conversions_216_217.h rename radio/src/storage/conversions/{eeprom_conversions.cpp => conversions_216_218.cpp} (95%) delete mode 100644 radio/src/storage/conversions/conversions_217_218.cpp delete mode 100644 radio/src/storage/conversions/datastructs_216.h delete mode 100644 radio/src/storage/conversions/datastructs_217.h delete mode 100644 radio/src/storage/eeprom_conversions.cpp diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 09b69a16f..d9c4e6473 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -133,8 +133,8 @@ endif() if(ARCH STREQUAL ARM AND NOT PCB STREQUAL X12S AND NOT PCB STREQUAL X10 AND NOT PCB STREQUAL XLITE AND NOT PCB STREQUAL XLITES AND NOT PCB STREQUAL X3) add_definitions(-DEEPROM_CONVERSIONS) - set(SRC ${SRC} storage/conversions/eeprom_conversions.cpp) - # set(SRC ${SRC} storage/conversions/conversions_216_217.cpp) + set(SRC ${SRC} storage/conversions/conversions.cpp) + set(SRC ${SRC} storage/conversions/conversions_216_218.cpp) endif() add_definitions(-DFLAVOUR="${FLAVOUR}") diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index 02c6642df..e034c8dc4 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -18,17 +18,20 @@ * GNU General Public License for more details. */ -void ConvertModel(int id, int version) +#include "opentx.h" +#include "conversions.h" + +void convertModelData(int id, int version) { eeLoadModelData(id); if (version == 216) { version = 217; - ConvertModel_216_to_217(g_model); + convertModelData_216_to_217(g_model); } if (version == 217) { version = 218; - ConvertModel_217_to_218(g_model); + convertModelData_217_to_218(g_model); } uint8_t currModel = g_eeGeneral.currModel; @@ -71,11 +74,11 @@ bool eeConvert() int version = conversionVersionStart; if (version == 216) { version = 217; - ConvertRadioData_216_to_217(g_eeGeneral); + convertRadioData_216_to_217(g_eeGeneral); } if (version == 217) { version = 218; - ConvertRadioData_217_to_218(g_eeGeneral); + convertRadioData_217_to_218(g_eeGeneral); } storageDirty(EE_GENERAL); storageCheck(true); @@ -97,7 +100,7 @@ bool eeConvert() #endif lcdRefresh(); if (eeModelExists(id)) { - ConvertModel(id, conversionVersionStart); + convertModelData(id, conversionVersionStart); } } diff --git a/radio/src/storage/conversions/conversions.h b/radio/src/storage/conversions/conversions.h index fce5915b4..c3975cfc4 100644 --- a/radio/src/storage/conversions/conversions.h +++ b/radio/src/storage/conversions/conversions.h @@ -1,4 +1,30 @@ - -void ConvertModel(int id, int version); +/* + * 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. + */ bool eeConvert(); +void convertModelData(int id, int version); + +// Conversions 216 to 217 +void convertModelData_216_to_217(ModelData &model); +void convertRadioData_216_to_217(RadioData &settings); + +// Conversions 217 to 218 +void convertModelData_217_to_218(ModelData &model); +void convertRadioData_217_to_218(RadioData &settings); diff --git a/radio/src/storage/conversions/conversions_216_217.cpp b/radio/src/storage/conversions/conversions_216_217.cpp deleted file mode 100644 index eea103a58..000000000 --- a/radio/src/storage/conversions/conversions_216_217.cpp +++ /dev/null @@ -1,448 +0,0 @@ -#include -#include "datastructs_216.h" - -enum SwitchSources { - SWSRC_NONE = 0, - - SWSRC_FIRST_SWITCH, - -#if defined(PCBTARANIS) - SWSRC_SA0 = SWSRC_FIRST_SWITCH, - SWSRC_SA1, - SWSRC_SA2, - SWSRC_SB0, - SWSRC_SB1, - SWSRC_SB2, - SWSRC_SC0, - SWSRC_SC1, - SWSRC_SC2, - SWSRC_SD0, - SWSRC_SD1, - SWSRC_SD2, - SWSRC_SE0, - SWSRC_SE1, - SWSRC_SE2, - SWSRC_SF0, - SWSRC_SF2, - SWSRC_SG0, - SWSRC_SG1, - SWSRC_SG2, - SWSRC_SH0, - SWSRC_SH2, - SWSRC_TRAINER = SWSRC_SH2, -#else - SWSRC_ID0 = SWSRC_FIRST_SWITCH, - SWSRC_ID1, - SWSRC_ID2, - SWSRC_THR, - SWSRC_RUD, - SWSRC_ELE, - SWSRC_AIL, - SWSRC_GEA, - SWSRC_TRN, - SWSRC_TRAINER = SWSRC_TRN, -#endif - - SWSRC_LAST_SWITCH = SWSRC_TRAINER, - -#if defined(PCBTARANIS) - SWSRC_FIRST_MULTIPOS_SWITCH, - SWSRC_LAST_MULTIPOS_SWITCH = SWSRC_FIRST_MULTIPOS_SWITCH + (NUM_XPOTS*XPOTS_MULTIPOS_COUNT) - 1, -#endif - - SWSRC_FIRST_TRIM, - SWSRC_TrimRudLeft = SWSRC_FIRST_TRIM, - SWSRC_TrimRudRight, - SWSRC_TrimEleDown, - SWSRC_TrimEleUp, - SWSRC_TrimThrDown, - SWSRC_TrimThrUp, - SWSRC_TrimAilLeft, - SWSRC_TrimAilRight, - SWSRC_LAST_TRIM = SWSRC_TrimAilRight, - -#if defined(PCBSKY9X) - SWSRC_REa, -#endif - - SWSRC_FIRST_LOGICAL_SWITCH, - SWSRC_SW1 = SWSRC_FIRST_LOGICAL_SWITCH, - SWSRC_SW2, - SWSRC_SW3, - SWSRC_SW4, - SWSRC_SW5, - SWSRC_SW6, - SWSRC_SW7, - SWSRC_SW8, - SWSRC_SW9, - SWSRC_SWA, - SWSRC_SWB, - SWSRC_SWC, - SWSRC_LAST_LOGICAL_SWITCH = SWSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1, - - SWSRC_ON, - SWSRC_One, - - SWSRC_FIRST_FLIGHT_MODE, - SWSRC_LAST_FLIGHT_MODE = SWSRC_FIRST_FLIGHT_MODE+MAX_FLIGHT_MODES-1, - - SWSRC_COUNT, - - SWSRC_OFF = -SWSRC_ON, - - SWSRC_LAST = SWSRC_COUNT-1, - SWSRC_FIRST = -SWSRC_LAST, - - SWSRC_LAST_IN_LOGICAL_SWITCHES = SWSRC_LAST_FLIGHT_MODE, - SWSRC_LAST_IN_MIXES = SWSRC_LAST_FLIGHT_MODE, - SWSRC_FIRST_IN_LOGICAL_SWITCHES = -SWSRC_LAST_IN_LOGICAL_SWITCHES, - SWSRC_FIRST_IN_MIXES = -SWSRC_LAST_IN_MIXES, -}; - -enum MixSources { - MIXSRC_NONE, - -#if defined(PCBTARANIS) - MIXSRC_FIRST_INPUT, - MIXSRC_LAST_INPUT = MIXSRC_FIRST_INPUT+MAX_INPUTS-1, - - MIXSRC_FIRST_LUA, - MIXSRC_LAST_LUA = MIXSRC_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1, -#endif - - MIXSRC_Rud, - MIXSRC_Ele, - MIXSRC_Thr, - MIXSRC_Ail, - - MIXSRC_FIRST_POT, -#if defined(PCBTARANIS) - MIXSRC_POT1 = MIXSRC_FIRST_POT, - MIXSRC_POT2, - MIXSRC_POT3, - MIXSRC_SLIDER1, - MIXSRC_SLIDER2, - MIXSRC_LAST_POT = MIXSRC_SLIDER2, -#else - MIXSRC_P1 = MIXSRC_FIRST_POT, - MIXSRC_P2, - MIXSRC_P3, - MIXSRC_LAST_POT = MIXSRC_P3, -#endif - -#if defined(PCBSKY9X) - MIXSRC_REa, - MIXSRC_LAST_ROTARY_ENCODER = MIXSRC_REa, -#endif - - MIXSRC_MAX, - - MIXSRC_CYC1, - MIXSRC_CYC2, - MIXSRC_CYC3, - - MIXSRC_TrimRud, - MIXSRC_TrimEle, - MIXSRC_TrimThr, - MIXSRC_TrimAil, - - MIXSRC_FIRST_SWITCH, - -#if defined(PCBTARANIS) - MIXSRC_SA = MIXSRC_FIRST_SWITCH, - MIXSRC_SB, - MIXSRC_SC, - MIXSRC_SD, - MIXSRC_SE, - MIXSRC_SF, - MIXSRC_SG, - MIXSRC_SH, -#else - MIXSRC_3POS = MIXSRC_FIRST_SWITCH, - MIXSRC_THR, - MIXSRC_RUD, - MIXSRC_ELE, - MIXSRC_AIL, - MIXSRC_GEA, - MIXSRC_TRN, -#endif - MIXSRC_FIRST_LOGICAL_SWITCH, - MIXSRC_SW1 = MIXSRC_FIRST_LOGICAL_SWITCH, - MIXSRC_SW9 = MIXSRC_SW1 + 8, - MIXSRC_SWA, - MIXSRC_SWB, - MIXSRC_SWC, - MIXSRC_LAST_LOGICAL_SWITCH = MIXSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1, - - MIXSRC_FIRST_TRAINER, - MIXSRC_LAST_TRAINER = MIXSRC_FIRST_TRAINER+MAX_TRAINER_CHANNELS-1, - - MIXSRC_FIRST_CH, - MIXSRC_CH1 = MIXSRC_FIRST_CH, - MIXSRC_CH2, - MIXSRC_CH3, - MIXSRC_CH4, - MIXSRC_CH5, - MIXSRC_CH6, - MIXSRC_CH7, - MIXSRC_CH8, - MIXSRC_CH9, - MIXSRC_CH10, - MIXSRC_CH11, - MIXSRC_CH12, - MIXSRC_CH13, - MIXSRC_CH14, - MIXSRC_CH15, - MIXSRC_CH16, - MIXSRC_LAST_CH = MIXSRC_CH1+MAX_OUTPUT_CHANNELS-1, - - MIXSRC_GVAR1, - MIXSRC_LAST_GVAR = MIXSRC_GVAR1+MAX_GVARS-1, - - MIXSRC_FIRST_TELEM, - MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+NUM_TELEMETRY-1 -}; - -int ConvertTelemetrySource_216_to_217(int source) -{ - // TELEM_TIMER3 added -// if (source >= TELEM_TIMER3) - // source += 1; - - return source; -} - -#if defined(PCBTARANIS) -int ConvertSwitch_216_to_217(int swtch) -{ - if (swtch < 0) - return -ConvertSwitch_216_to_217(-swtch); - - if (swtch > SWSRC_SF0) - swtch += 1; - - if (swtch > SWSRC_SH0) - swtch += 1; - - return swtch; -} -#else -int ConvertSwitch_216_to_217(int swtch) -{ - return swtch; -} -#endif - -int ConvertSource_216_to_217(int source) -{ -#if defined(PCBX9E) - // SI to SR switches added - if (source >= MIXSRC_SI) - source += 10; -#endif - // Telemetry conversions - if (source >= MIXSRC_FIRST_TELEM) - source = 0; - - return source; -} - -int ConvertGVar_216_to_217(int value) -{ - if (value < -4096 + 9) - value += 4096 - 1024; - else if (value > 4095 - 9) - value -= 4095 - 1023; - return value; -} - -void ConvertRadioData_216_to_217(void * settings) -{ - RadioData_v216 * settings_v216 = (RadioData_v216 *)&settings; - settings_v216->version = 217; -#if defined(PCBTARANIS) - settings_v216->potsConfig = 0x05; // S1 and S2 = pots with detent - settings_v216->switchConfig = 0x00007bff; // 6x3POS, 1x2POS, 1xTOGGLE -#endif -} - -void ConvertModel_216_to_217(void * model) -{ - // Timer3 added - // 32bits Timers - // MixData reduction - // PPM center range - // Telemetry custom screens - - // TODO perhaps will be needed, but elsewhere assert(sizeof(ModelData_v216) <= sizeof(ModelData)); - - ModelData_v216 oldModel; - memcpy(&oldModel, &model, sizeof(oldModel)); - ModelData_v217 & newModel = (ModelData_v217 &)model; - memset(&newModel, 0, sizeof(ModelData_v217)); - - char name[LEN_MODEL_NAME+1]; - zchar2str(name, oldModel.header.name, LEN_MODEL_NAME); - TRACE("Model %s conversion from v216 to v217", name); - - newModel.header.modelId[0] = oldModel.header.modelId; - memcpy(newModel.header.name, oldModel.header.name, LEN_MODEL_NAME); -#if defined(PCBTARANIS) && LCD_W >= 212 - memcpy(newModel.header.bitmap, oldModel.header.bitmap, LEN_BITMAP_NAME); -#endif - - for (uint8_t i=0; i<2; i++) { - TimerData_v217 & timer = newModel.timers[i]; - if (oldModel.timers[i].mode >= TMRMODE_COUNT) - timer.mode = TMRMODE_COUNT + ConvertSwitch_216_to_217(oldModel.timers[i].mode - TMRMODE_COUNT + 1) - 1; - else - timer.mode = ConvertSwitch_216_to_217(oldModel.timers[i].mode); - timer.start = oldModel.timers[i].start; - timer.countdownBeep = oldModel.timers[i].countdownBeep; - timer.minuteBeep = oldModel.timers[i].minuteBeep; - timer.persistent = oldModel.timers[i].persistent; - timer.value = oldModel.timers[i].value; - } - newModel.telemetryProtocol = oldModel.telemetryProtocol; - newModel.thrTrim = oldModel.thrTrim; - newModel.trimInc = oldModel.trimInc; - newModel.disableThrottleWarning = oldModel.disableThrottleWarning; - newModel.displayChecklist = oldModel.displayChecklist; - newModel.extendedLimits = oldModel.extendedLimits; - newModel.extendedTrims = oldModel.extendedTrims; - newModel.throttleReversed = oldModel.throttleReversed; - newModel.beepANACenter = oldModel.beepANACenter; - for (int i=0; i> 6; - newModel.potsWarnEnabled = oldModel.nPotsToWarn & 0x1f; - memcpy(newModel.potsWarnPosition, oldModel.potPosition, sizeof(newModel.potsWarnPosition)); -} diff --git a/radio/src/storage/conversions/conversions_216_217.h b/radio/src/storage/conversions/conversions_216_217.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/radio/src/storage/conversions/eeprom_conversions.cpp b/radio/src/storage/conversions/conversions_216_218.cpp similarity index 95% rename from radio/src/storage/conversions/eeprom_conversions.cpp rename to radio/src/storage/conversions/conversions_216_218.cpp index c3cb0a7f6..fc9ffa687 100644 --- a/radio/src/storage/conversions/eeprom_conversions.cpp +++ b/radio/src/storage/conversions/conversions_216_218.cpp @@ -811,7 +811,7 @@ PACK(typedef struct { TARANIS_PCBX9E_FIELD(char bluetoothName[LEN_BLUETOOTH_NAME]) }) RadioData_v216; -void ConvertRadioData_216_to_217(RadioData & settings) +void convertRadioData_216_to_217(RadioData &settings) { RadioData_v216 * settings_v216 = (RadioData_v216 *)&settings; settings_v216->version = 217; @@ -834,7 +834,7 @@ void ConvertSpecialFunctions_217_to_218(CustomFunctionData_v218 * cf218, CustomF } } -void ConvertRadioData_217_to_218(RadioData & settings) +void convertRadioData_217_to_218(RadioData &settings) { RadioData_v216 settings_v217 = (RadioData_v216 &)settings; @@ -893,7 +893,7 @@ void ConvertRadioData_217_to_218(RadioData & settings) #endif } -void ConvertModel_216_to_217(ModelData & model) +void convertModelData_216_to_217(ModelData &model) { // Timer3 added // 32bits Timers @@ -1074,7 +1074,7 @@ void ConvertModel_216_to_217(ModelData & model) memcpy(newModel.potsWarnPosition, oldModel.potPosition, sizeof(newModel.potsWarnPosition)); } -void ConvertModel_217_to_218(ModelData & model) +void convertModelData_217_to_218(ModelData &model) { assert(sizeof(ModelData_v217) <= sizeof(ModelData)); @@ -1254,90 +1254,3 @@ void ConvertModel_217_to_218(ModelData & model) newModel.toplcdTimer = oldModel.toplcdTimer; #endif } - -void ConvertModel(int id, int version) -{ - eeLoadModelData(id); - - if (version == 216) { - version = 217; - ConvertModel_216_to_217(g_model); - } - if (version == 217) { - version = 218; - ConvertModel_217_to_218(g_model); - } - - uint8_t currModel = g_eeGeneral.currModel; - g_eeGeneral.currModel = id; - storageDirty(EE_MODEL); - storageCheck(true); - g_eeGeneral.currModel = currModel; -} - -bool eeConvert() -{ - const char *msg = NULL; - - if (g_eeGeneral.version == 216) { - msg = "EEprom Data v216"; - } - else if (g_eeGeneral.version == 217) { - msg = "EEprom Data v217"; - } - else { - return false; - } - - int conversionVersionStart = g_eeGeneral.version; - - // Information to the user and wait for key press -#if defined(PCBSKY9X) - g_eeGeneral.optrexDisplay = 0; -#endif - g_eeGeneral.backlightMode = e_backlight_mode_on; - g_eeGeneral.backlightBright = 0; - g_eeGeneral.contrast = 25; - - ALERT(STR_STORAGE_WARNING, msg, AU_BAD_RADIODATA); - - RAISE_ALERT(STR_STORAGE_WARNING, STR_EEPROM_CONVERTING, NULL, AU_NONE); - - // General Settings conversion - eeLoadGeneralSettingsData(); - int version = conversionVersionStart; - if (version == 216) { - version = 217; - ConvertRadioData_216_to_217(g_eeGeneral); - } - if (version == 217) { - version = 218; - ConvertRadioData_217_to_218(g_eeGeneral); - } - storageDirty(EE_GENERAL); - storageCheck(true); - -#if defined(COLORLCD) -#elif LCD_W >= 212 - lcdDrawRect(60, 6*FH+4, 132, 3); -#else - lcdDrawRect(10, 6*FH+4, 102, 3); -#endif - - // Models conversion - for (uint8_t id=0; id= 212 - lcdDrawSolidHorizontalLine(61, 6*FH+5, 10+id*2, FORCE); -#else - lcdDrawSolidHorizontalLine(11, 6*FH+5, 10+(id*3)/2, FORCE); -#endif - lcdRefresh(); - if (eeModelExists(id)) { - ConvertModel(id, conversionVersionStart); - } - - } - - return true; -} diff --git a/radio/src/storage/conversions/conversions_217_218.cpp b/radio/src/storage/conversions/conversions_217_218.cpp deleted file mode 100644 index adc119cbe..000000000 --- a/radio/src/storage/conversions/conversions_217_218.cpp +++ /dev/null @@ -1,284 +0,0 @@ - -int ConvertSwitch_217_to_218(int swtch) -{ - // 32 additional logical switches - - if (swtch < 0) - return -ConvertSwitch_217_to_218(-swtch); - - if (swtch >= SWSRC_FIRST_LOGICAL_SWITCH+32) - return swtch+32; - - return swtch; -} - - - -int ConvertSource_217_to_218(int source) -{ -#if defined(PCBTARANIS) - if (source >= MIXSRC_FIRST_LOGICAL_SWITCH + 32) - source += 32; -#endif - - return source; -} - - - -void ConvertSpecialFunctions_217_to_218(CustomFunctionData * cf218, CustomFunctionData_v216 * cf216) -{ - for (int i=0; i= TMRMODE_COUNT) - newModel.timers[i].mode = TMRMODE_COUNT + ConvertSwitch_217_to_218(oldModel.timers[i].mode - TMRMODE_COUNT + 1) - 1; - else - newModel.timers[i].mode = ConvertSwitch_217_to_218(oldModel.timers[i].mode); - if (oldModel.timers[i].mode) - TRACE("timer mode %d => %d", oldModel.timers[i].mode, newModel.timers[i].mode); - newModel.timers[i].start = oldModel.timers[i].start; - newModel.timers[i].value = oldModel.timers[i].value; - newModel.timers[i].countdownBeep = oldModel.timers[i].countdownBeep; - newModel.timers[i].minuteBeep = oldModel.timers[i].minuteBeep; - newModel.timers[i].persistent = oldModel.timers[i].persistent; - memcpy(newModel.timers[i].name, oldModel.timers[i].name, sizeof(newModel.timers[i].name)); - } - newModel.telemetryProtocol = oldModel.telemetryProtocol; - newModel.thrTrim = oldModel.thrTrim; - newModel.noGlobalFunctions = oldModel.noGlobalFunctions; - newModel.displayTrims = oldModel.displayTrims; - newModel.ignoreSensorIds = oldModel.ignoreSensorIds; - newModel.trimInc = oldModel.trimInc; - newModel.disableThrottleWarning = oldModel.disableThrottleWarning; - newModel.displayChecklist = oldModel.displayChecklist; - newModel.extendedLimits = oldModel.extendedLimits; - newModel.extendedTrims = oldModel.extendedTrims; - newModel.throttleReversed = oldModel.throttleReversed; - newModel.beepANACenter = oldModel.beepANACenter; - for (int i=0; i> (2*i)) & 0x03) == TELEMETRY_SCREEN_TYPE_VALUES) { - for (int j = 0; j < 4; j++) { - for (int k = 0; k < NUM_LINE_ITEMS; k++) { - newModel.frsky.screens[i].lines[j].sources[k] = ConvertSource_217_to_218(oldModel.frsky.screens[i].lines[j].sources[k]); - } - } - } - else if (((oldModel.frsky.screensType >> (2*i)) & 0x03) == TELEMETRY_SCREEN_TYPE_GAUGES) { - for (int j = 0; j < 4; j++) { - newModel.frsky.screens[i].bars[j].source = ConvertSource_217_to_218(oldModel.frsky.screens[i].bars[j].source); - } - } - } - for (int i=0; i UNIT_WATTS) - newModel.telemetrySensors[i].unit += 1; - } -#if defined(PCBX9E) - newModel.toplcdTimer = oldModel.toplcdTimer; -#endif -} - diff --git a/radio/src/storage/conversions/datastructs_216.h b/radio/src/storage/conversions/datastructs_216.h deleted file mode 100644 index ca496dc9d..000000000 --- a/radio/src/storage/conversions/datastructs_216.h +++ /dev/null @@ -1,675 +0,0 @@ -#include "definitions.h" -#include "board.h" - -#define NUM_STICKS 4 - -#define XPOTS_MULTIPOS_COUNT 6 - -#define MAX_SCRIPT_INPUTS 10 -#define MAX_SCRIPT_OUTPUTS 6 -#define MAX_GVARS 9 - -#if defined(PCBHORUS) - #define MAX_MODELS 60 - #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 - #define MAX_FLIGHT_MODES 9 - #define MAX_MIXERS 64 - #define MAX_EXPOS 64 - #define MAX_LOGICAL_SWITCHES 64 - #define MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches - #define MAX_SCRIPTS 9 - #define MAX_INPUTS 32 - #define MAX_TRAINER_CHANNELS 16 - #define MAX_TELEMETRY_SENSORS 32 - #define MAX_CUSTOM_SCREENS 5 -#elif defined(PCBTARANIS) - #define MAX_MODELS 60 - #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 - #define MAX_FLIGHT_MODES 9 - #define MAX_MIXERS 64 - #define MAX_EXPOS 64 - #define MAX_LOGICAL_SWITCHES 64 - #define MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches - #define MAX_SCRIPTS 7 - #define MAX_INPUTS 32 - #define MAX_TRAINER_CHANNELS 16 - #define MAX_TELEMETRY_SENSORS 32 -#else - #define MAX_MODELS 60 - #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 - #define MAX_FLIGHT_MODES 9 - #define MAX_MIXERS 64 - #define MAX_EXPOS 32 - #define MAX_LOGICAL_SWITCHES 64 - #define MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches - #define MAX_INPUTS 32 - #define MAX_TRAINER_CHANNELS 16 - #define MAX_TELEMETRY_SENSORS 32 -#endif - - -#if defined(PCBHORUS) - #define LEN_SWITCH_NAME 3 - #define LEN_ANA_NAME 3 - #define LEN_MODEL_FILENAME 16 - #define LEN_BLUETOOTH_NAME 10 -#else - #define LEN_SWITCH_NAME 3 - #define LEN_ANA_NAME 3 - #define LEN_BLUETOOTH_NAME 10 -#endif - -#if defined(PCBHORUS) - #define LEN_MODEL_NAME 15 - #define LEN_TIMER_NAME 8 - #define LEN_FLIGHT_MODE_NAME 10 - #define LEN_BITMAP_NAME 10 // TODO next EEPROM change: we need 14 here as we have to store the file extension - #define LEN_EXPOMIX_NAME 6 - #define LEN_CHANNEL_NAME 6 - #define LEN_INPUT_NAME 4 - #define LEN_CURVE_NAME 3 - #define LEN_FUNCTION_NAME 6 - #define MAX_CURVES 32 - #define MAX_CURVE_POINTS 512 -#elif LCD_W == 212 - #define LEN_MODEL_NAME 12 - #define LEN_TIMER_NAME 8 - #define LEN_FLIGHT_MODE_NAME 10 - #define LEN_BITMAP_NAME 10 - #define LEN_EXPOMIX_NAME 8 // TODO next EEPROM change: 6 seem enough - #define LEN_CHANNEL_NAME 6 - #define LEN_INPUT_NAME 4 - #define LEN_CURVE_NAME 3 - #define LEN_FUNCTION_NAME 8 - #define MAX_CURVES 32 - #define MAX_CURVE_POINTS 512 -#else - #define LEN_MODEL_NAME 10 - #define LEN_TIMER_NAME 3 - #define LEN_FLIGHT_MODE_NAME 6 - #define LEN_EXPOMIX_NAME 6 - #define LEN_CHANNEL_NAME 4 - #define LEN_INPUT_NAME 3 - #define LEN_CURVE_NAME 3 - #define LEN_FUNCTION_NAME 6 - #define MAX_CURVES 16 // TODO next EEPROM check if can be changed to 32 to have all ARM the same - #define MAX_CURVE_POINTS 512 -#endif - -enum TelemetrySource { - TELEM_NONE, - TELEM_TX_VOLTAGE, - TELEM_TX_TIME, - TELEM_RESERVE1, - TELEM_RESERVE2, - TELEM_RESERVE3, - TELEM_RESERVE4, - TELEM_RESERVE5, - TELEM_TIMER1, - TELEM_TIMER2, - TELEM_SWR, - TELEM_RSSI_TX, - TELEM_RSSI_RX, - TELEM_RESERVE0, - TELEM_A_FIRST, - TELEM_A1=TELEM_A_FIRST, - TELEM_A2, - TELEM_A3, - TELEM_A4, - TELEM_A_LAST=TELEM_A4, - TELEM_ALT, - TELEM_RPM, - TELEM_FUEL, - TELEM_T1, - TELEM_T2, - TELEM_SPEED, - TELEM_DIST, - TELEM_GPSALT, - TELEM_CELL, - TELEM_CELLS_SUM, - TELEM_VFAS, - TELEM_CURRENT, - TELEM_CONSUMPTION, - TELEM_POWER, - TELEM_ACCx, - TELEM_ACCy, - TELEM_ACCz, - TELEM_HDG, - TELEM_VSPEED, - TELEM_ASPEED, - TELEM_DTE, - TELEM_RESERVE6, - TELEM_RESERVE7, - TELEM_RESERVE8, - TELEM_RESERVE9, - TELEM_RESERVE10, - TELEM_MIN_A_FIRST, - TELEM_MIN_A1=TELEM_MIN_A_FIRST, - TELEM_MIN_A2, - TELEM_MIN_A3, - TELEM_MIN_A4, - TELEM_MIN_A_LAST=TELEM_MIN_A4, - // TODO: add A1-4 MAX - TELEM_MIN_ALT, - TELEM_MAX_ALT, - TELEM_MAX_RPM, - TELEM_MAX_T1, - TELEM_MAX_T2, - TELEM_MAX_SPEED, - TELEM_MAX_DIST, - TELEM_MAX_ASPEED, - TELEM_MIN_CELL, - TELEM_MIN_CELLS_SUM, - TELEM_MIN_VFAS, - TELEM_MAX_CURRENT, - TELEM_MAX_POWER, - TELEM_RESERVE11, - TELEM_RESERVE12, - TELEM_RESERVE13, - TELEM_RESERVE14, - TELEM_RESERVE15, - TELEM_ACC, - TELEM_GPS_TIME, - TELEM_CSW_MAX = TELEM_MAX_POWER, - TELEM_NOUSR_MAX = TELEM_A2, - TELEM_DISPLAY_MAX = TELEM_MAX_POWER, - TELEM_STATUS_MAX = TELEM_GPS_TIME, - TELEM_FIRST_STREAMED_VALUE = TELEM_RSSI_TX, -}; - -#define NUM_TELEMETRY TELEM_CSW_MAX - -#if defined(PCBTARANIS) -enum CurveType { - CURVE_TYPE_STANDARD, - CURVE_TYPE_CUSTOM, - CURVE_TYPE_LAST = CURVE_TYPE_CUSTOM -}; -PACK(typedef struct { - uint8_t type:3; - uint8_t smooth:1; - uint8_t spare:4; - int8_t points; -}) CurveInfo; -#define NUM_POINTS 512 -#define CURVDATA CurveInfo -#else -#define LEN_MODEL_NAME 10 - #define LEN_EXPOMIX_NAME 6 - #define LEN_FP_NAME 6 - #define NUM_POINTS 512 - #define CURVDATA int16_t -#endif - -#if defined(PCBTARANIS) -enum CurveRefType { - CURVE_REF_DIFF, - CURVE_REF_EXPO, - CURVE_REF_FUNC, - CURVE_REF_CUSTOM -}; -PACK(typedef struct { - uint8_t type; - int8_t value; -}) CurveRef; -#else -#define MODE_DIFFERENTIAL 0 - #define MODE_EXPO 0 - #define MODE_CURVE 1 -#endif - -#if defined(PCBTARANIS) -PACK(typedef struct { - uint8_t srcRaw; - uint16_t scale; - uint8_t chn; - int8_t swtch; - uint16_t flightModes; - int8_t weight; - int8_t carryTrim:6; - uint8_t mode:2; - char name[LEN_EXPOMIX_NAME]; - int8_t offset; - CurveRef curve; - uint8_t spare; -}) ExpoData_v216; -#else -PACK(typedef struct { - uint8_t mode:2; // 0=end, 1=pos, 2=neg, 3=both - uint8_t chn:4; - uint8_t curveMode:2; - int8_t swtch; - uint16_t flightModes; - int8_t weight; - char name[LEN_EXPOMIX_NAME]; - int8_t curveParam; -}) ExpoData_v216; -typedef ExpoData_v216; -#endif - -#if defined(PCBTARANIS) -PACK(typedef struct { - int16_t min; - int16_t max; - int8_t ppmCenter; - int16_t offset:14; - uint16_t symetrical:1; - uint16_t revert:1; - char name[LEN_CHANNEL_NAME]; - int8_t curve; -}) LimitData_v216; -#else -PACK(struct LimitData { - int32_t min:11; - int32_t max:11; - int32_t ppmCenter:10; - int16_t offset:11; - uint16_t symetrical:1; - uint16_t revert:1; - uint16_t spare:3; - int8_t curve; - NOBACKUP(char name[LEN_CHANNEL_NAME]); -}); -#endif - -PACK(typedef struct { - uint8_t type:3; - uint8_t smooth:1; - uint8_t spare:4; - int8_t points; -}) CurveData_v216; - -#if defined(PCBTARANIS) -PACK(typedef struct { - uint8_t destCh; - uint16_t flightModes; - uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := - uint8_t carryTrim:1; - uint8_t spare1:5; - int16_t weight; - int8_t swtch; - CurveRef curve; - uint8_t mixWarn:4; // mixer warning - uint8_t spare2:4; - uint8_t delayUp; - uint8_t delayDown; - uint8_t speedUp; - uint8_t speedDown; - uint8_t srcRaw; - int16_t offset; - char name[LEN_EXPOMIX_NAME]; - uint8_t spare3; -}) MixData_v216; -#else -PACK(typedef struct { - uint8_t destCh:5; - uint8_t mixWarn:3; // mixer warning - uint16_t flightModes; - uint8_t curveMode:1; - uint8_t noExpo:1; - int8_t carryTrim:3; - uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := - uint8_t spare:1; - int16_t weight; - int8_t swtch; - int8_t curveParam; - uint8_t delayUp; - uint8_t delayDown; - uint8_t speedUp; - uint8_t speedDown; - uint8_t srcRaw; - int16_t offset; - char name[LEN_EXPOMIX_NAME]; -}) MixData_v216; -#endif - -PACK(typedef struct { - int8_t mode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw - uint16_t start; - uint8_t countdownBeep:2; - uint8_t minuteBeep:1; - uint8_t persistent:2; - uint8_t spare:3; - uint16_t value; -}) TimerData_v216; - -PACK(typedef struct { - int16_t trim[NUM_STICKS]; - int8_t swtch; // swtch of phase[0] is not used - char name[LEN_FLIGHT_MODE_NAME]; - uint8_t fadeIn; - uint8_t fadeOut; - int16_t rotaryEncoders[1]; - int16_t gvars[9]; -}) FlightModeData_v216; - -PACK(typedef struct { // Logical Switches data - int8_t v1; - int16_t v2; - int16_t v3; - uint8_t func; - uint8_t delay; - uint8_t duration; - int8_t andsw; -}) LogicalSwitchData_v216; - -#if defined(PCBTARANIS) -PACK(typedef struct { - int8_t swtch; - uint8_t func; - PACK(union { - PACK(struct { - char name[8]; - }) play; - - PACK(struct { - int16_t val; - uint8_t mode; - uint8_t param; - int32_t spare2; - }) all; - - PACK(struct { - int32_t val1; - int32_t val2; - }) clear; - }); - uint8_t active; -}) CustomFunctionData_v216; -#else -PACK(typedef struct { - int8_t swtch; - uint8_t func; - PACK(union { - PACK(struct { - char name[6]; - }) play; - - PACK(struct { - int16_t val; - uint8_t mode; - uint8_t param; - int16_t spare2; - }) all; - - PACK(struct { - int32_t val1; - int16_t val2; - }) clear; - }); - uint8_t active; -}) CustomFunctionData_v216; -#endif - - -PACK(typedef struct { - uint8_t source; - uint8_t barMin; // minimum for bar display - uint8_t barMax; // ditto for max display (would usually = ratio) -}) FrSkyBarData_v216; - - -#if LCD_W >= 212 -#define NUM_LINE_ITEMS 3 -#else -#define NUM_LINE_ITEMS 2 -#endif - -PACK(typedef struct { - uint8_t sources[NUM_LINE_ITEMS]; -}) FrSkyLineData_v216; - -typedef union { - FrSkyBarData_v216 bars[4]; - FrSkyLineData_v216 lines[4]; -} FrSkyScreenData_v216; - - -PACK(struct FrSkyChannelData_v216 { - uint8_t unused[7]; -}); - - - -PACK(typedef struct { - FrSkyChannelData_v216 channels[4]; - uint8_t usrProto; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh, 3=Halcyon - uint8_t voltsSource:7; - uint8_t altitudeDisplayed:1; - int8_t blades; // How many blades for RPMs, 0=2 blades - uint8_t currentSource; - uint8_t screensType; // 2bits per screen (None/Gauges/Numbers/Script) - FrSkyScreenData_v216 screens[3]; - uint8_t varioSource; - int8_t varioCenterMax; - int8_t varioCenterMin; - int8_t varioMin; - int8_t varioMax; - uint8_t rssiAlarms[2]; - uint16_t mAhPersistent:1; - uint16_t storedMah:15; - int8_t fasOffset; -}) FrSkyData_v216; - -PACK(typedef struct { - char file[10]; - char name[10]; - int8_t inputs[10]; -}) ScriptData_v216; - -PACK(typedef struct { // Swash Ring data - uint8_t invertELE:1; - uint8_t invertAIL:1; - uint8_t invertCOL:1; - uint8_t type:5; - uint8_t collectiveSource; - uint8_t value; -}) SwashRingData_v216; - -PACK(typedef struct { - int8_t rfProtocol; - uint8_t channelsStart; - int8_t channelsCount; // 0=8 channels - uint8_t failsafeMode; - int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; - int8_t ppmDelay; - int8_t ppmFrameLength; - uint8_t ppmPulsePol; -}) ModuleData_v216; - -#if defined(PCBTARANIS) && LCD_W >= 212 -PACK(typedef struct { - char name[LEN_MODEL_NAME]; - uint8_t modelId; - char bitmap[LEN_BITMAP_NAME]; -}) ModelHeader_v216; -#else -PACK(typedef struct { - char name[LEN_MODEL_NAME]; - uint8_t modelId; -}) ModelHeader_v216; -#endif - -PACK(struct GVarData { - char name[3]; - uint32_t min:12; - uint32_t max:12; - uint32_t popup:1; - uint32_t prec:1; - uint32_t unit:2; - uint32_t spare:4; -}); - -PACK(typedef struct { - ModelHeader_v216 header; - TimerData_v216 timers[2]; - uint8_t telemetryProtocol:3; - uint8_t thrTrim:1; // Enable Throttle Trim - int8_t spare2:4; - int8_t trimInc:3; // Trim Increments - uint8_t disableThrottleWarning:1; - uint8_t displayChecklist:1; - uint8_t extendedLimits:1; - uint8_t extendedTrims:1; - uint8_t throttleReversed:1; - uint16_t beepANACenter; // 1<<0->A1.. 1<<6->A7 - MixData_v216 mixData[MAX_MIXERS]; - LimitData_v216 limitData[MAX_OUTPUT_CHANNELS]; - ExpoData_v216 expoData[MAX_EXPOS]; - - CurveData_v216 curves[MAX_CURVES]; - int8_t points[MAX_CURVE_POINTS]; - - LogicalSwitchData_v216 logicalSw[32]; - CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; - SwashRingData_v216 swashR; - FlightModeData_v216 flightModeData[MAX_FLIGHT_MODES]; - - uint8_t thrTraceSrc; - - uint16_t switchWarningState; - uint8_t switchWarningEnable; - - GVarData gvars[MAX_GVARS]; - - FrSkyData_v216 frsky; - - uint8_t externalModule; - -#if defined(PCBTARANIS) - uint8_t trainerMode; -#endif - - ModuleData_v216 moduleData[2 + 1]; - -#if defined(PCBTARANIS) - char curveNames[MAX_CURVES][6]; - ScriptData_v216 scriptsData[MAX_SCRIPTS]; - char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; -#endif - - uint8_t nPotsToWarn; - int8_t potPosition[NUM_POTS+NUM_SLIDERS]; - uint8_t rxBattAlarms[2]; -}) ModelData_v216; - - -PACK(struct CalibData { - int16_t mid; - int16_t spanNeg; - int16_t spanPos; -}); - - -PACK(struct TrainerMix { - uint8_t srcChn:6; // 0-7 = ch1-8 - uint8_t mode:2; // off,add-mode,subst-mode - int8_t studWeight; - }); - - -PACK(struct TrainerData { - int16_t calib[4]; - TrainerMix mix[4]; -}); - -#if defined(COLORLCD) -typedef uint16_t swconfig_t; -typedef uint32_t swarnstate_t; -#elif defined(PCBX9E) -typedef uint64_t swconfig_t; -typedef uint64_t swarnstate_t; -typedef uint32_t swarnenable_t; -#elif defined(PCBTARANIS) -typedef uint16_t swconfig_t; -typedef uint16_t swarnstate_t; -typedef uint8_t swarnenable_t; -#else -typedef uint8_t swarnstate_t; -typedef uint8_t swarnenable_t; -#endif - -PACK(typedef struct { - uint8_t version; - uint16_t variant; - CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS]; - uint16_t chkSum; - int8_t currModel; - uint8_t contrast; - uint8_t vBatWarn; - int8_t txVoltageCalibration; - int8_t backlightMode; - TrainerData trainer; - uint8_t view; // index of view in main screen - int8_t buzzerMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all - uint8_t fai:1; - int8_t beepMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all - uint8_t alarmsFlash:1; - uint8_t disableMemoryWarning:1; - uint8_t disableAlarmWarning:1; - uint8_t stickMode:2; - int8_t timezone:5; - uint8_t adjustRTC:1; - uint8_t inactivityTimer; - uint8_t telemetryBaudrate:3; - int8_t splashMode:3; - int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all - int8_t switchesDelay; - uint8_t lightAutoOff; - uint8_t templateSetup; // RETA order for receiver channels - int8_t PPM_Multiplier; - int8_t hapticLength; - uint8_t reNavigation; -#if !defined(PCBTARANIS) - uint8_t stickReverse; -#endif - int8_t beepLength:3; - int8_t hapticStrength:3; - uint8_t gpsFormat:1; - uint8_t unexpectedShutdown:1; - uint8_t speakerPitch; - int8_t speakerVolume; - int8_t vBatMin; - int8_t vBatMax; - - uint8_t backlightBright; - int8_t txCurrentCalibration; - int8_t temperatureWarn; - uint8_t mAhWarn; - uint16_t mAhUsed; - uint32_t globalTimer; - int8_t temperatureCalib; - uint8_t bluetoothBaudrate; - uint8_t optrexDisplay; - uint8_t sticksGain; - uint8_t rotarySteps; - uint8_t countryCode; - uint8_t imperial; - char ttsLanguage[2]; - int8_t beepVolume; - int8_t wavVolume; - int8_t varioVolume; - int8_t varioPitch; - int8_t varioRange; - int8_t varioRepeat; - int8_t backgroundVolume; - -#if defined(PCBTARANIS) - uint8_t serial2Mode:6; - uint8_t slidersConfig:2; - uint8_t potsConfig; - uint8_t backlightColor; - swarnstate_t switchUnlockStates; - CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; - swconfig_t switchConfig; - char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; - char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]; -#else - CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; -#endif - -#if defined(PCBX9E) - uint8_t bluetoothEnable; - char bluetoothName[LEN_BLUETOOTH_NAME]; -#endif -}) RadioData_v216; diff --git a/radio/src/storage/conversions/datastructs_217.h b/radio/src/storage/conversions/datastructs_217.h deleted file mode 100644 index b00819494..000000000 --- a/radio/src/storage/conversions/datastructs_217.h +++ /dev/null @@ -1,362 +0,0 @@ - -enum Mix216Sources { - MIXSRC216_NONE, - -#if defined(PCBTARANIS) - MIXSRC216_FIRST_INPUT, - MIXSRC216_LAST_INPUT = MIXSRC216_FIRST_INPUT+MAX_INPUTS-1, - - MIXSRC216_FIRST_LUA, - MIXSRC216_LAST_LUA = MIXSRC216_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1, -#endif - - MIXSRC216_Rud, - MIXSRC216_Ele, - MIXSRC216_Thr, - MIXSRC216_Ail, - - MIXSRC216_FIRST_POT, -#if defined(PCBTARANIS) - MIXSRC216_POT1 = MIXSRC216_FIRST_POT, - MIXSRC216_POT2, - MIXSRC216_POT3, - MIXSRC216_SLIDER1, - MIXSRC216_SLIDER2, - MIXSRC216_LAST_POT = MIXSRC216_SLIDER2, -#else - MIXSRC216_P1 = MIXSRC216_FIRST_POT, - MIXSRC216_P2, - MIXSRC216_P3, - MIXSRC216_LAST_POT = MIXSRC216_P3, -#endif - -#if defined(PCBSKY9X) - MIXSRC216_REa, - MIXSRC216_LAST_ROTARY_ENCODER = MIXSRC216_REa, -#endif - - MIXSRC216_MAX, - - MIXSRC216_CYC1, - MIXSRC216_CYC2, - MIXSRC216_CYC3, - - MIXSRC216_TrimRud, - MIXSRC216_TrimEle, - MIXSRC216_TrimThr, - MIXSRC216_TrimAil, - - MIXSRC216_FIRST_SWITCH, - -#if defined(PCBTARANIS) - MIXSRC216_SA = MIXSRC216_FIRST_SWITCH, - MIXSRC216_SB, - MIXSRC216_SC, - MIXSRC216_SD, - MIXSRC216_SE, - MIXSRC216_SF, - MIXSRC216_SG, - MIXSRC216_SH, -#else - MIXSRC216_3POS = MIXSRC216_FIRST_SWITCH, - MIXSRC216_THR, - MIXSRC216_RUD, - MIXSRC216_ELE, - MIXSRC216_AIL, - MIXSRC216_GEA, - MIXSRC216_TRN, -#endif - MIXSRC216_FIRST_LOGICAL_SWITCH, - MIXSRC216_SW1 = MIXSRC216_FIRST_LOGICAL_SWITCH, - MIXSRC216_SW9 = MIXSRC216_SW1 + 8, - MIXSRC216_SWA, - MIXSRC216_SWB, - MIXSRC216_SWC, - MIXSRC216_LAST_LOGICAL_SWITCH = MIXSRC216_FIRST_LOGICAL_SWITCH+32-1, - - MIXSRC216_FIRST_TRAINER, - MIXSRC216_LAST_TRAINER = MIXSRC216_FIRST_TRAINER+MAX_TRAINER_CHANNELS-1, - - MIXSRC216_FIRST_CH, - MIXSRC216_CH1 = MIXSRC216_FIRST_CH, - MIXSRC216_CH2, - MIXSRC216_CH3, - MIXSRC216_CH4, - MIXSRC216_CH5, - MIXSRC216_CH6, - MIXSRC216_CH7, - MIXSRC216_CH8, - MIXSRC216_CH9, - MIXSRC216_CH10, - MIXSRC216_CH11, - MIXSRC216_CH12, - MIXSRC216_CH13, - MIXSRC216_CH14, - MIXSRC216_CH15, - MIXSRC216_CH16, - MIXSRC216_LAST_CH = MIXSRC216_CH1+MAX_OUTPUT_CHANNELS-1, - - MIXSRC216_GVAR1, - MIXSRC216_LAST_GVAR = MIXSRC216_GVAR1+MAX_GVARS-1, - - MIXSRC216_FIRST_TELEM, -}; - -enum Telemetry216Source { - TELEM216_NONE, - TELEM216_TX_VOLTAGE, - TELEM216_TX_TIME, - TELEM216_RESERVE1, - TELEM216_RESERVE2, - TELEM216_RESERVE3, - TELEM216_RESERVE4, - TELEM216_RESERVE5, - TELEM216_TIMER1, - TELEM216_TIMER2, - TELEM216_SWR, - TELEM216_RSSI_TX, - TELEM216_RSSI_RX, - TELEM216_RESERVE0, - TELEM216_A1, - TELEM216_A2, - TELEM216_A3, - TELEM216_A4, - TELEM216_ALT, - TELEM216_RPM, - TELEM216_FUEL, - TELEM216_T1, - TELEM216_T2, - TELEM216_SPEED, - TELEM216_DIST, - TELEM216_GPSALT, - TELEM216_CELL, - TELEM216_CELLS_SUM, - TELEM216_VFAS, - TELEM216_CURRENT, - TELEM216_CONSUMPTION, - TELEM216_POWER, - TELEM216_ACCx, - TELEM216_ACCy, - TELEM216_ACCz, - TELEM216_HDG, - TELEM216_VSPEED, - TELEM216_ASPEED, - TELEM216_DTE, - TELEM216_RESERVE6, - TELEM216_RESERVE7, - TELEM216_RESERVE8, - TELEM216_RESERVE9, - TELEM216_RESERVE10, - TELEM216_MIN_A1, - TELEM216_MIN_A2, - TELEM216_MIN_A3, - TELEM216_MIN_A4, - TELEM216_MIN_ALT, - TELEM216_MAX_ALT, - TELEM216_MAX_RPM, - TELEM216_MAX_T1, - TELEM216_MAX_T2, - TELEM216_MAX_SPEED, - TELEM216_MAX_DIST, - TELEM216_MAX_ASPEED, - TELEM216_MIN_CELL, - TELEM216_MIN_CELLS_SUM, - TELEM216_MIN_VFAS, - TELEM216_MAX_CURRENT, - TELEM216_MAX_POWER, - TELEM216_RESERVE11, - TELEM216_RESERVE12, - TELEM216_RESERVE13, - TELEM216_RESERVE14, - TELEM216_RESERVE15, - TELEM216_ACC, - TELEM216_GPS_TIME, -}; - -#if defined(PCBTARANIS) -PACK(typedef struct { - uint32_t srcRaw:10; - uint32_t scale:14; - uint32_t chn:8; - int8_t swtch; - uint16_t flightModes; - int8_t weight; - int8_t carryTrim:6; - uint8_t mode:2; - char name[LEN_EXPOMIX_NAME]; - int8_t offset; - CurveRef curve; -}) ExpoData_v217; -#else -PACK(typedef struct { - uint8_t mode:2; // 0=end, 1=pos, 2=neg, 3=both - uint8_t chn:4; - uint8_t curveMode:2; - int8_t swtch; - uint16_t flightModes; - int8_t weight; - char name[LEN_EXPOMIX_NAME]; - int8_t curveParam; -}) ExpoData_v216; -typedef ExpoData_v217; -#endif - -#if defined(PCBTARANIS) -PACK(typedef struct { - uint8_t destCh; - uint16_t flightModes:9; - uint16_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := - uint16_t carryTrim:1; - uint16_t mixWarn:4; // mixer warning - int16_t weight; - uint32_t srcRaw:10; - int32_t offset:14; - int32_t swtch:8; - CurveRef curve; - uint8_t delayUp; - uint8_t delayDown; - uint8_t speedUp; - uint8_t speedDown; - char name[LEN_EXPOMIX_NAME]; -}) MixData_v217; -#else -PACK(struct CurveRef { - uint8_t type; - int8_t value; -}); - -PACK(struct MixData { - int16_t weight:11; // GV1=-1024, -GV1=1023 - uint16_t destCh:5; - uint16_t srcRaw:10; // srcRaw=0 means not used - uint16_t carryTrim:1; - uint16_t mixWarn:2; // mixer warning - uint16_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := - uint16_t spare:1; - int32_t offset:14; - int32_t swtch:9; - uint32_t flightModes:9; - CurveRef curve; - uint8_t delayUp; - uint8_t delayDown; - uint8_t speedUp; - uint8_t speedDown; - NOBACKUP(char name[LEN_EXPOMIX_NAME]); -}); -#endif - -PACK(typedef struct { - int32_t mode:8; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw - uint32_t start:24; - int32_t value:24; - uint32_t countdownBeep:2; - uint32_t minuteBeep:1; - uint32_t persistent:2; - uint32_t spare:3; - char name[LEN_TIMER_NAME]; -}) TimerData_v217; - -PACK(typedef struct { // Logical Switches data - uint16_t func:6; - int16_t v1:10; - int16_t v2; - int16_t v3; - uint8_t delay; - uint8_t duration; - int8_t andsw; -}) LogicalSwitchData_v217; - -PACK(typedef struct { - uint8_t type:4; - int8_t rfProtocol:4; - uint8_t channelsStart; - int8_t channelsCount; // 0=8 channels - union { - struct { - uint8_t failsafeMode:4; // only 3 bits used - uint8_t subType:3; - uint8_t invertedSerial:1; // telemetry serial inverted from standard - }; - struct { - uint8_t failsafeMode:4; // only 3 bits used - uint8_t freq:2; - uint8_t region:2; - } r9m; - }; - int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; - union { - struct { - int8_t delay:6; - uint8_t pulsePol:1; - uint8_t outputType:1; // false = open drain, true = push pull - int8_t frameLength; - } ppm; - }; -}) ModuleData_v217; - - -PACK(typedef struct { - char name[6]; - uint8_t popup:1; - uint8_t spare:7; -}) GVarData_v217; - -PACK(typedef struct { - ModelHeader header; - TimerData_v217 timers[MAX_TIMERS]; - uint8_t telemetryProtocol:3; - uint8_t thrTrim:1; // Enable Throttle Trim - uint8_t noGlobalFunctions:1; - uint8_t displayTrims:2; - uint8_t ignoreSensorIds:1; - int8_t trimInc:3; // Trim Increments - uint8_t disableThrottleWarning:1; - uint8_t displayChecklist:1; - uint8_t extendedLimits:1; - uint8_t extendedTrims:1; - uint8_t throttleReversed:1; - BeepANACenter beepANACenter; - MixData_v217 mixData[MAX_MIXERS]; - LimitData limitData[MAX_OUTPUT_CHANNELS]; - ExpoData_v217 expoData[MAX_EXPOS]; - - CurveData_v216 curves[MAX_CURVES]; - int8_t points[MAX_CURVE_POINTS]; - - LogicalSwitchData_v217 logicalSw[32]; - CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; - SwashRingData swashR; - FlightModeData_v216 flightModeData[MAX_FLIGHT_MODES]; - - uint8_t thrTraceSrc; - - swarnstate_t switchWarningState; - swarnenable_t switchWarningEnable; - - GVarData_v217 gvars[MAX_GVARS]; - - FrSkyTelemetryData frsky; - RssiAlarmData rssiAlarms; - - uint8_t spare:3; - uint8_t trainerMode:3; - uint8_t potsWarnMode:2; - ModuleData_v217 moduleData[NUM_MODULES+1]; - -#if defined(PCBTARANIS) - char curveNames[MAX_CURVES][6]; - ScriptData scriptsData[MAX_SCRIPTS]; - char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; -#endif - - uint8_t potsWarnEnabled; - int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; - -#if defined(PCBTARANIS) - TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS]; -#else - uint8_t rxBattAlarms[2]; -#endif - - TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) -}) ModelData_v217; diff --git a/radio/src/storage/eeprom_common.h b/radio/src/storage/eeprom_common.h index 0e994dc16..00c840c03 100644 --- a/radio/src/storage/eeprom_common.h +++ b/radio/src/storage/eeprom_common.h @@ -25,8 +25,6 @@ uint16_t eeLoadGeneralSettingsData(); bool eeModelExists(uint8_t id); void eeLoadModel(uint8_t id); -bool eeConvert(); -void ConvertModel(int id, int version); uint8_t eeFindEmptyModel(uint8_t id, bool down); void selectModel(uint8_t sub); diff --git a/radio/src/storage/eeprom_conversions.cpp b/radio/src/storage/eeprom_conversions.cpp deleted file mode 100644 index b28d0f639..000000000 --- a/radio/src/storage/eeprom_conversions.cpp +++ /dev/null @@ -1,1342 +0,0 @@ -/* - * 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" - -enum Mix216Sources { - MIXSRC216_NONE, - -#if defined(PCBTARANIS) - MIXSRC216_FIRST_INPUT, - MIXSRC216_LAST_INPUT = MIXSRC216_FIRST_INPUT+MAX_INPUTS-1, - - MIXSRC216_FIRST_LUA, - MIXSRC216_LAST_LUA = MIXSRC216_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1, -#endif - - MIXSRC216_Rud, - MIXSRC216_Ele, - MIXSRC216_Thr, - MIXSRC216_Ail, - - MIXSRC216_FIRST_POT, -#if defined(PCBTARANIS) - MIXSRC216_POT1 = MIXSRC216_FIRST_POT, - MIXSRC216_POT2, - MIXSRC216_POT3, - MIXSRC216_SLIDER1, - MIXSRC216_SLIDER2, - MIXSRC216_LAST_POT = MIXSRC216_SLIDER2, -#else - MIXSRC216_P1 = MIXSRC216_FIRST_POT, - MIXSRC216_P2, - MIXSRC216_P3, - MIXSRC216_LAST_POT = MIXSRC216_P3, -#endif - -#if defined(PCBSKY9X) - MIXSRC216_REa, - MIXSRC216_LAST_ROTARY_ENCODER = MIXSRC216_REa, -#endif - - MIXSRC216_MAX, - - MIXSRC216_CYC1, - MIXSRC216_CYC2, - MIXSRC216_CYC3, - - MIXSRC216_TrimRud, - MIXSRC216_TrimEle, - MIXSRC216_TrimThr, - MIXSRC216_TrimAil, - - MIXSRC216_FIRST_SWITCH, - -#if defined(PCBTARANIS) - MIXSRC216_SA = MIXSRC216_FIRST_SWITCH, - MIXSRC216_SB, - MIXSRC216_SC, - MIXSRC216_SD, - MIXSRC216_SE, - MIXSRC216_SF, - MIXSRC216_SG, - MIXSRC216_SH, -#else - MIXSRC216_3POS = MIXSRC216_FIRST_SWITCH, - MIXSRC216_THR, - MIXSRC216_RUD, - MIXSRC216_ELE, - MIXSRC216_AIL, - MIXSRC216_GEA, - MIXSRC216_TRN, -#endif - MIXSRC216_FIRST_LOGICAL_SWITCH, - MIXSRC216_SW1 = MIXSRC216_FIRST_LOGICAL_SWITCH, - MIXSRC216_SW9 = MIXSRC216_SW1 + 8, - MIXSRC216_SWA, - MIXSRC216_SWB, - MIXSRC216_SWC, - MIXSRC216_LAST_LOGICAL_SWITCH = MIXSRC216_FIRST_LOGICAL_SWITCH+32-1, - - MIXSRC216_FIRST_TRAINER, - MIXSRC216_LAST_TRAINER = MIXSRC216_FIRST_TRAINER+MAX_TRAINER_CHANNELS-1, - - MIXSRC216_FIRST_CH, - MIXSRC216_CH1 = MIXSRC216_FIRST_CH, - MIXSRC216_CH2, - MIXSRC216_CH3, - MIXSRC216_CH4, - MIXSRC216_CH5, - MIXSRC216_CH6, - MIXSRC216_CH7, - MIXSRC216_CH8, - MIXSRC216_CH9, - MIXSRC216_CH10, - MIXSRC216_CH11, - MIXSRC216_CH12, - MIXSRC216_CH13, - MIXSRC216_CH14, - MIXSRC216_CH15, - MIXSRC216_CH16, - MIXSRC216_LAST_CH = MIXSRC216_CH1+MAX_OUTPUT_CHANNELS-1, - - MIXSRC216_GVAR1, - MIXSRC216_LAST_GVAR = MIXSRC216_GVAR1+MAX_GVARS-1, - - MIXSRC216_FIRST_TELEM, -}; - -enum Telemetry216Source { - TELEM216_NONE, - TELEM216_TX_VOLTAGE, - TELEM216_TX_TIME, - TELEM216_RESERVE1, - TELEM216_RESERVE2, - TELEM216_RESERVE3, - TELEM216_RESERVE4, - TELEM216_RESERVE5, - TELEM216_TIMER1, - TELEM216_TIMER2, - TELEM216_SWR, - TELEM216_RSSI_TX, - TELEM216_RSSI_RX, - TELEM216_RESERVE0, - TELEM216_A1, - TELEM216_A2, - TELEM216_A3, - TELEM216_A4, - TELEM216_ALT, - TELEM216_RPM, - TELEM216_FUEL, - TELEM216_T1, - TELEM216_T2, - TELEM216_SPEED, - TELEM216_DIST, - TELEM216_GPSALT, - TELEM216_CELL, - TELEM216_CELLS_SUM, - TELEM216_VFAS, - TELEM216_CURRENT, - TELEM216_CONSUMPTION, - TELEM216_POWER, - TELEM216_ACCx, - TELEM216_ACCy, - TELEM216_ACCz, - TELEM216_HDG, - TELEM216_VSPEED, - TELEM216_ASPEED, - TELEM216_DTE, - TELEM216_RESERVE6, - TELEM216_RESERVE7, - TELEM216_RESERVE8, - TELEM216_RESERVE9, - TELEM216_RESERVE10, - TELEM216_MIN_A1, - TELEM216_MIN_A2, - TELEM216_MIN_A3, - TELEM216_MIN_A4, - TELEM216_MIN_ALT, - TELEM216_MAX_ALT, - TELEM216_MAX_RPM, - TELEM216_MAX_T1, - TELEM216_MAX_T2, - TELEM216_MAX_SPEED, - TELEM216_MAX_DIST, - TELEM216_MAX_ASPEED, - TELEM216_MIN_CELL, - TELEM216_MIN_CELLS_SUM, - TELEM216_MIN_VFAS, - TELEM216_MAX_CURRENT, - TELEM216_MAX_POWER, - TELEM216_RESERVE11, - TELEM216_RESERVE12, - TELEM216_RESERVE13, - TELEM216_RESERVE14, - TELEM216_RESERVE15, - TELEM216_ACC, - TELEM216_GPS_TIME, -}; - -PACK(typedef struct { - uint8_t type:3; - uint8_t smooth:1; - uint8_t spare:4; - int8_t points; -}) CurveData_v216; - -#if defined(PCBTARANIS) -PACK(typedef struct { - uint8_t srcRaw; - uint16_t scale; - uint8_t chn; - int8_t swtch; - uint16_t flightModes; - int8_t weight; - int8_t carryTrim:6; - uint8_t mode:2; - char name[LEN_EXPOMIX_NAME]; - int8_t offset; - CurveRef curve; - uint8_t spare; -}) ExpoData_v216; -PACK(typedef struct { - uint32_t srcRaw:10; - uint32_t scale:14; - uint32_t chn:8; - int8_t swtch; - uint16_t flightModes; - int8_t weight; - int8_t carryTrim:6; - uint8_t mode:2; - char name[LEN_EXPOMIX_NAME]; - int8_t offset; - CurveRef curve; -}) ExpoData_v217; -#else -PACK(typedef struct { - uint8_t mode:2; // 0=end, 1=pos, 2=neg, 3=both - uint8_t chn:4; - uint8_t curveMode:2; - int8_t swtch; - uint16_t flightModes; - int8_t weight; - char name[LEN_EXPOMIX_NAME]; - int8_t curveParam; -}) ExpoData_v216; -typedef ExpoData_v216 ExpoData_v217; -#endif - -#if defined(PCBTARANIS) -PACK(typedef struct { - int16_t min; - int16_t max; - int8_t ppmCenter; - int16_t offset:14; - uint16_t symetrical:1; - uint16_t revert:1; - char name[LEN_CHANNEL_NAME]; - int8_t curve; -}) LimitData_v216; -#else -#define LimitData_v216 LimitData -#endif - -#if defined(PCBTARANIS) -PACK(typedef struct { - uint8_t destCh; - uint16_t flightModes; - uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := - uint8_t carryTrim:1; - uint8_t spare1:5; - int16_t weight; - int8_t swtch; - CurveRef curve; - uint8_t mixWarn:4; // mixer warning - uint8_t spare2:4; - uint8_t delayUp; - uint8_t delayDown; - uint8_t speedUp; - uint8_t speedDown; - uint8_t srcRaw; - int16_t offset; - char name[LEN_EXPOMIX_NAME]; - uint8_t spare3; -}) MixData_v216; -PACK(typedef struct { - uint8_t destCh; - uint16_t flightModes:9; - uint16_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := - uint16_t carryTrim:1; - uint16_t mixWarn:4; // mixer warning - int16_t weight; - uint32_t srcRaw:10; - int32_t offset:14; - int32_t swtch:8; - CurveRef curve; - uint8_t delayUp; - uint8_t delayDown; - uint8_t speedUp; - uint8_t speedDown; - char name[LEN_EXPOMIX_NAME]; -}) MixData_v217; -#else -PACK(typedef struct { - uint8_t destCh:5; - uint8_t mixWarn:3; // mixer warning - uint16_t flightModes; - uint8_t curveMode:1; - uint8_t noExpo:1; - int8_t carryTrim:3; - uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := - uint8_t spare:1; - int16_t weight; - int8_t swtch; - int8_t curveParam; - uint8_t delayUp; - uint8_t delayDown; - uint8_t speedUp; - uint8_t speedDown; - uint8_t srcRaw; - int16_t offset; - char name[LEN_EXPOMIX_NAME]; -}) MixData_v216; -typedef MixData MixData_v217; -#endif - -PACK(typedef struct { - int8_t mode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw - uint16_t start; - uint8_t countdownBeep:2; - uint8_t minuteBeep:1; - uint8_t persistent:2; - uint8_t spare:3; - uint16_t value; -}) TimerData_v216; - -PACK(typedef struct { - int32_t mode:8; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw - uint32_t start:24; - int32_t value:24; - uint32_t countdownBeep:2; - uint32_t minuteBeep:1; - uint32_t persistent:2; - uint32_t spare:3; - char name[LEN_TIMER_NAME]; -}) TimerData_v217; - -PACK(typedef struct { - int16_t trim[NUM_STICKS]; - int8_t swtch; // swtch of phase[0] is not used - char name[LEN_FLIGHT_MODE_NAME]; - uint8_t fadeIn; - uint8_t fadeOut; - int16_t rotaryEncoders[1]; - gvar_t gvars[9]; -}) FlightModeData_v216; - -PACK(typedef struct { // Logical Switches data - int8_t v1; - int16_t v2; - int16_t v3; - uint8_t func; - uint8_t delay; - uint8_t duration; - int8_t andsw; -}) LogicalSwitchData_v216; - -PACK(typedef struct { // Logical Switches data - uint16_t func:6; - int16_t v1:10; - int16_t v2; - int16_t v3; - uint8_t delay; - uint8_t duration; - int8_t andsw; -}) LogicalSwitchData_v217; - -#if defined(PCBTARANIS) -PACK(typedef struct { - int8_t swtch; - uint8_t func; - PACK(union { - PACK(struct { - char name[8]; - }) play; - - PACK(struct { - int16_t val; - uint8_t mode; - uint8_t param; - int32_t spare2; - }) all; - - PACK(struct { - int32_t val1; - int32_t val2; - }) clear; - }); - uint8_t active; -}) CustomFunctionData_v216; -#else -PACK(typedef struct { - int8_t swtch; - uint8_t func; - PACK(union { - PACK(struct { - char name[6]; - }) play; - - PACK(struct { - int16_t val; - uint8_t mode; - uint8_t param; - int16_t spare2; - }) all; - - PACK(struct { - int32_t val1; - int16_t val2; - }) clear; - }); - uint8_t active; -}) CustomFunctionData_v216; -#endif - -PACK(typedef struct { - uint8_t source; - uint8_t barMin; // minimum for bar display - uint8_t barMax; // ditto for max display (would usually = ratio) -}) FrSkyBarData_v216; - -PACK(typedef struct { - uint8_t sources[NUM_LINE_ITEMS]; -}) FrSkyLineData_v216; - -typedef union { - FrSkyBarData_v216 bars[4]; - FrSkyLineData_v216 lines[4]; -} FrSkyScreenData_v216; - - -PACK(struct FrSkyChannelData_v216 { - uint8_t unused[7]; -}); - - -PACK(typedef struct { - FrSkyChannelData_v216 channels[4]; - uint8_t usrProto; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh, 3=Halcyon - uint8_t voltsSource:7; - uint8_t altitudeDisplayed:1; - int8_t blades; // How many blades for RPMs, 0=2 blades - uint8_t currentSource; - uint8_t screensType; // 2bits per screen (None/Gauges/Numbers/Script) - FrSkyScreenData_v216 screens[3]; - uint8_t varioSource; - int8_t varioCenterMax; - int8_t varioCenterMin; - int8_t varioMin; - int8_t varioMax; - uint8_t rssiAlarms[2]; - uint16_t mAhPersistent:1; - uint16_t storedMah:15; - int8_t fasOffset; -}) FrSkyData_v216; - -PACK(typedef struct { - char file[10]; - char name[10]; - int8_t inputs[10]; -}) ScriptData_v216; - -PACK(typedef struct { // Swash Ring data - uint8_t invertELE:1; - uint8_t invertAIL:1; - uint8_t invertCOL:1; - uint8_t type:5; - uint8_t collectiveSource; - uint8_t value; -}) SwashRingData_v216; - -PACK(typedef struct { - int8_t rfProtocol; - uint8_t channelsStart; - int8_t channelsCount; // 0=8 channels - uint8_t failsafeMode; - int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; - int8_t ppmDelay; - int8_t ppmFrameLength; - uint8_t ppmPulsePol; -}) ModuleData_v216; - -PACK(typedef struct { - uint8_t type:4; - int8_t rfProtocol:4; - uint8_t channelsStart; - int8_t channelsCount; // 0=8 channels - union { - struct { - uint8_t failsafeMode:4; // only 3 bits used - uint8_t subType:3; - uint8_t invertedSerial:1; // telemetry serial inverted from standard - }; - struct { - uint8_t failsafeMode:4; // only 3 bits used - uint8_t freq:2; - uint8_t region:2; - } r9m; - }; - int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; - union { - struct { - int8_t delay:6; - uint8_t pulsePol:1; - uint8_t outputType:1; // false = open drain, true = push pull - int8_t frameLength; - } ppm; - }; -}) ModuleData_v217; - -#if defined(PCBTARANIS) -#define MODELDATA_EXTRA_216 \ - uint8_t externalModule; \ - uint8_t trainerMode; \ - ModuleData_v216 moduleData[NUM_MODULES+1]; \ - char curveNames[MAX_CURVES][6]; \ - ScriptData_v216 scriptsData[MAX_SCRIPTS]; \ - char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ - uint8_t nPotsToWarn; \ - int8_t potPosition[NUM_POTS+NUM_SLIDERS]; \ - uint8_t spare[2]; -#elif defined(PCBSKY9X) -#define MODELDATA_EXTRA_216 \ - uint8_t externalModule; \ - ModuleData_v216 moduleData[NUM_MODULES+1]; \ - uint8_t nPotsToWarn; \ - int8_t potPosition[NUM_POTS+NUM_SLIDERS]; \ - uint8_t rxBattAlarms[2]; -#endif - -#if defined(PCBTARANIS) -#define MODELDATA_EXTRA_217 \ - uint8_t spare:3; \ - uint8_t trainerMode:3; \ - uint8_t potsWarnMode:2; \ - ModuleData_v217 moduleData[NUM_MODULES+1]; \ - char curveNames[MAX_CURVES][6]; \ - ScriptData scriptsData[MAX_SCRIPTS]; \ - char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ - uint8_t potsWarnEnabled; \ - int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; -#else -#define MODELDATA_EXTRA_217 \ - uint8_t spare:6; \ - uint8_t potsWarnMode:2; \ - ModuleData moduleData[NUM_MODULES+1]; \ - uint8_t potsWarnEnabled; \ - int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; \ - uint8_t rxBattAlarms[2]; -#endif - -#if defined(PCBTARANIS) && LCD_W >= 212 -PACK(typedef struct { - char name[LEN_MODEL_NAME]; - uint8_t modelId; - char bitmap[LEN_BITMAP_NAME]; -}) ModelHeader_v216; -#else -PACK(typedef struct { - char name[LEN_MODEL_NAME]; - uint8_t modelId; -}) ModelHeader_v216; -#endif - -PACK(typedef struct { - ModelHeader_v216 header; - TimerData_v216 timers[2]; - uint8_t telemetryProtocol:3; - uint8_t thrTrim:1; // Enable Throttle Trim - int8_t spare2:4; - int8_t trimInc:3; // Trim Increments - uint8_t disableThrottleWarning:1; - uint8_t displayChecklist:1; - uint8_t extendedLimits:1; - uint8_t extendedTrims:1; - uint8_t throttleReversed:1; - BeepANACenter beepANACenter; // 1<<0->A1.. 1<<6->A7 - MixData_v216 mixData[MAX_MIXERS]; - LimitData_v216 limitData[MAX_OUTPUT_CHANNELS]; - ExpoData_v216 expoData[MAX_EXPOS]; - - CurveData_v216 curves[MAX_CURVES]; - int8_t points[MAX_CURVE_POINTS]; - - LogicalSwitchData_v216 logicalSw[32]; - CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; - SwashRingData_v216 swashR; - FlightModeData_v216 flightModeData[MAX_FLIGHT_MODES]; - - uint8_t thrTraceSrc; - - uint16_t switchWarningState; - uint8_t switchWarningEnable; - - GVarData gvars[MAX_GVARS]; - - FrSkyData_v216 frsky; - - MODELDATA_EXTRA_216 - -}) ModelData_v216; - -PACK(typedef struct { - char name[6]; - uint8_t popup:1; - uint8_t spare:7; -}) GVarData_v217; - -PACK(typedef struct { - ModelHeader header; - TimerData_v217 timers[MAX_TIMERS]; - uint8_t telemetryProtocol:3; - uint8_t thrTrim:1; // Enable Throttle Trim - uint8_t noGlobalFunctions:1; - uint8_t displayTrims:2; - uint8_t ignoreSensorIds:1; - int8_t trimInc:3; // Trim Increments - uint8_t disableThrottleWarning:1; - uint8_t displayChecklist:1; - uint8_t extendedLimits:1; - uint8_t extendedTrims:1; - uint8_t throttleReversed:1; - BeepANACenter beepANACenter; - MixData_v217 mixData[MAX_MIXERS]; - LimitData limitData[MAX_OUTPUT_CHANNELS]; - ExpoData_v217 expoData[MAX_EXPOS]; - - CurveData_v216 curves[MAX_CURVES]; - int8_t points[MAX_CURVE_POINTS]; - - LogicalSwitchData_v217 logicalSw[32]; - CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; - SwashRingData swashR; - FlightModeData_v216 flightModeData[MAX_FLIGHT_MODES]; - - uint8_t thrTraceSrc; - - swarnstate_t switchWarningState; - swarnenable_t switchWarningEnable; - - GVarData_v217 gvars[MAX_GVARS]; - - FrSkyTelemetryData frsky; - RssiAlarmData rssiAlarms; - - MODELDATA_EXTRA_217 - - TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS]; - - TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) -}) ModelData_v217; - -int ConvertTelemetrySource_216_to_217(int source) -{ - // TELEM_TIMER3 added -// if (source >= TELEM_TIMER3) - // source += 1; - - return source; -} - -#if defined(PCBTARANIS) -int ConvertSwitch_216_to_217(int swtch) -{ - if (swtch < 0) - return -ConvertSwitch_216_to_217(-swtch); - - if (swtch > SWSRC_SF0) - swtch += 1; - - if (swtch > SWSRC_SH0) - swtch += 1; - - return swtch; -} -#else -int ConvertSwitch_216_to_217(int swtch) -{ - return swtch; -} -#endif - -int ConvertSwitch_217_to_218(int swtch) -{ - // 32 additional logical switches - - if (swtch < 0) - return -ConvertSwitch_217_to_218(-swtch); - - if (swtch >= SWSRC_FIRST_LOGICAL_SWITCH+32) - return swtch+32; - - return swtch; -} - -int ConvertSource_216_to_217(int source) -{ -#if defined(PCBX9E) - // SI to SR switches added - if (source >= MIXSRC_SI) - source += 10; -#endif - // Telemetry conversions - if (source >= MIXSRC_FIRST_TELEM) - source = 0; - - return source; -} - -int ConvertSource_217_to_218(int source) -{ -#if defined(PCBTARANIS) - if (source >= MIXSRC_FIRST_LOGICAL_SWITCH + 32) - source += 32; -#endif - - return source; -} - -int ConvertGVar_216_to_217(int value) -{ - if (value < -4096 + 9) - value += 4096 - 1024; - else if (value > 4095 - 9) - value -= 4095 - 1023; - return value; -} - -PACK(typedef struct { - uint8_t version; - uint16_t variant; - CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS]; - uint16_t chkSum; - int8_t currModel; - uint8_t contrast; - uint8_t vBatWarn; - int8_t txVoltageCalibration; - int8_t backlightMode; - TrainerData trainer; - uint8_t view; // index of view in main screen - int8_t buzzerMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all - uint8_t fai:1; - int8_t beepMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all - uint8_t alarmsFlash:1; - uint8_t disableMemoryWarning:1; - uint8_t disableAlarmWarning:1; - uint8_t stickMode:2; - int8_t timezone:5; - uint8_t adjustRTC:1; - uint8_t inactivityTimer; - uint8_t telemetryBaudrate:3; - int8_t splashMode:3; - int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all - int8_t switchesDelay; - uint8_t lightAutoOff; - uint8_t templateSetup; // RETA order for receiver channels - int8_t PPM_Multiplier; - int8_t hapticLength; - uint8_t reNavigation; - N_TARANIS_FIELD(uint8_t stickReverse) - int8_t beepLength:3; - int8_t hapticStrength:3; - uint8_t gpsFormat:1; - uint8_t unexpectedShutdown:1; - uint8_t speakerPitch; - int8_t speakerVolume; - int8_t vBatMin; - int8_t vBatMax; - - uint8_t backlightBright; - int8_t txCurrentCalibration; - int8_t temperatureWarn; - uint8_t mAhWarn; - uint16_t mAhUsed; - uint32_t globalTimer; - int8_t temperatureCalib; - uint8_t bluetoothBaudrate; - uint8_t optrexDisplay; - uint8_t sticksGain; - uint8_t rotarySteps; - uint8_t countryCode; - uint8_t imperial; - char ttsLanguage[2]; - int8_t beepVolume; - int8_t wavVolume; - int8_t varioVolume; - int8_t varioPitch; - int8_t varioRange; - int8_t varioRepeat; - int8_t backgroundVolume; - - TARANIS_FIELD(uint8_t serial2Mode:6) - TARANIS_FIELD(uint8_t slidersConfig:2) - TARANIS_FIELD(uint8_t potsConfig) - TARANIS_FIELD(uint8_t backlightColor) - TARANIS_FIELD(swarnstate_t switchUnlockStates) - TARANIS_FIELD(CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]) - TARANIS_FIELD(swconfig_t switchConfig) - TARANIS_FIELD(char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]) - TARANIS_FIELD(char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]) - N_TARANIS_FIELD(CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]) - - TARANIS_PCBX9E_FIELD(uint8_t bluetoothEnable) - TARANIS_PCBX9E_FIELD(char bluetoothName[LEN_BLUETOOTH_NAME]) -}) RadioData_v216; - -void ConvertRadioData_216_to_217(RadioData & settings) -{ - RadioData_v216 * settings_v216 = (RadioData_v216 *)&settings; - settings_v216->version = 217; -#if defined(PCBTARANIS) - settings_v216->potsConfig = 0x05; // S1 and S2 = pots with detent - settings_v216->switchConfig = 0x00007bff; // 6x3POS, 1x2POS, 1xTOGGLE -#endif -} - -void ConvertSpecialFunctions_217_to_218(CustomFunctionData * cf218, CustomFunctionData_v216 * cf216) -{ - for (int i=0; i= 212 - memcpy(newModel.header.bitmap, oldModel.header.bitmap, LEN_BITMAP_NAME); -#endif - - for (uint8_t i=0; i<2; i++) { - TimerData_v217 & timer = newModel.timers[i]; - if (oldModel.timers[i].mode >= TMRMODE_COUNT) - timer.mode = TMRMODE_COUNT + ConvertSwitch_216_to_217(oldModel.timers[i].mode - TMRMODE_COUNT + 1) - 1; - else - timer.mode = ConvertSwitch_216_to_217(oldModel.timers[i].mode); - timer.start = oldModel.timers[i].start; - timer.countdownBeep = oldModel.timers[i].countdownBeep; - timer.minuteBeep = oldModel.timers[i].minuteBeep; - timer.persistent = oldModel.timers[i].persistent; - timer.value = oldModel.timers[i].value; - } - newModel.telemetryProtocol = oldModel.telemetryProtocol; - newModel.thrTrim = oldModel.thrTrim; - newModel.trimInc = oldModel.trimInc; - newModel.disableThrottleWarning = oldModel.disableThrottleWarning; - newModel.displayChecklist = oldModel.displayChecklist; - newModel.extendedLimits = oldModel.extendedLimits; - newModel.extendedTrims = oldModel.extendedTrims; - newModel.throttleReversed = oldModel.throttleReversed; - newModel.beepANACenter = oldModel.beepANACenter; - for (int i=0; i> 6; - newModel.potsWarnEnabled = oldModel.nPotsToWarn & 0x1f; - memcpy(newModel.potsWarnPosition, oldModel.potPosition, sizeof(newModel.potsWarnPosition)); -} - -void ConvertModel_217_to_218(ModelData & model) -{ - assert(sizeof(ModelData_v217) <= sizeof(ModelData)); - - ModelData_v217 oldModel; - memcpy(&oldModel, &model, sizeof(oldModel)); - ModelData & newModel = model; - memset(&newModel, 0, sizeof(ModelData)); - - char name[LEN_MODEL_NAME+1]; - zchar2str(name, oldModel.header.name, LEN_MODEL_NAME); - TRACE("Model %s conversion from v217 to v218", name); - - newModel.header = oldModel.header; - for (uint8_t i=0; i= TMRMODE_COUNT) - newModel.timers[i].mode = TMRMODE_COUNT + ConvertSwitch_217_to_218(oldModel.timers[i].mode - TMRMODE_COUNT + 1) - 1; - else - newModel.timers[i].mode = ConvertSwitch_217_to_218(oldModel.timers[i].mode); - if (oldModel.timers[i].mode) - TRACE("timer mode %d => %d", oldModel.timers[i].mode, newModel.timers[i].mode); - newModel.timers[i].start = oldModel.timers[i].start; - newModel.timers[i].value = oldModel.timers[i].value; - newModel.timers[i].countdownBeep = oldModel.timers[i].countdownBeep; - newModel.timers[i].minuteBeep = oldModel.timers[i].minuteBeep; - newModel.timers[i].persistent = oldModel.timers[i].persistent; - memcpy(newModel.timers[i].name, oldModel.timers[i].name, sizeof(newModel.timers[i].name)); - } - newModel.telemetryProtocol = oldModel.telemetryProtocol; - newModel.thrTrim = oldModel.thrTrim; - newModel.noGlobalFunctions = oldModel.noGlobalFunctions; - newModel.displayTrims = oldModel.displayTrims; - newModel.ignoreSensorIds = oldModel.ignoreSensorIds; - newModel.trimInc = oldModel.trimInc; - newModel.disableThrottleWarning = oldModel.disableThrottleWarning; - newModel.displayChecklist = oldModel.displayChecklist; - newModel.extendedLimits = oldModel.extendedLimits; - newModel.extendedTrims = oldModel.extendedTrims; - newModel.throttleReversed = oldModel.throttleReversed; - newModel.beepANACenter = oldModel.beepANACenter; - for (int i=0; i> (2*i)) & 0x03) == TELEMETRY_SCREEN_TYPE_VALUES) { - for (int j = 0; j < 4; j++) { - for (int k = 0; k < NUM_LINE_ITEMS; k++) { - newModel.frsky.screens[i].lines[j].sources[k] = ConvertSource_217_to_218(oldModel.frsky.screens[i].lines[j].sources[k]); - } - } - } - else if (((oldModel.frsky.screensType >> (2*i)) & 0x03) == TELEMETRY_SCREEN_TYPE_GAUGES) { - for (int j = 0; j < 4; j++) { - newModel.frsky.screens[i].bars[j].source = ConvertSource_217_to_218(oldModel.frsky.screens[i].bars[j].source); - } - } - } - for (int i=0; i UNIT_WATTS) - newModel.telemetrySensors[i].unit += 1; - } -#if defined(PCBX9E) - newModel.toplcdTimer = oldModel.toplcdTimer; -#endif -} - -void ConvertModel(int id, int version) -{ - eeLoadModelData(id); - - if (version == 216) { - version = 217; - ConvertModel_216_to_217(g_model); - } - if (version == 217) { - version = 218; - ConvertModel_217_to_218(g_model); - } - - uint8_t currModel = g_eeGeneral.currModel; - g_eeGeneral.currModel = id; - storageDirty(EE_MODEL); - storageCheck(true); - g_eeGeneral.currModel = currModel; -} - -bool eeConvert() -{ - const char *msg = NULL; - - if (g_eeGeneral.version == 216) { - msg = "EEprom Data v216"; - } - else if (g_eeGeneral.version == 217) { - msg = "EEprom Data v217"; - } - else { - return false; - } - - int conversionVersionStart = g_eeGeneral.version; - - // Information to the user and wait for key press -#if defined(PCBSKY9X) - g_eeGeneral.optrexDisplay = 0; -#endif - g_eeGeneral.backlightMode = e_backlight_mode_on; - g_eeGeneral.backlightBright = 0; - g_eeGeneral.contrast = 25; - - ALERT(STR_STORAGE_WARNING, msg, AU_BAD_RADIODATA); - - RAISE_ALERT(STR_STORAGE_WARNING, STR_EEPROM_CONVERTING, NULL, AU_NONE); - - // General Settings conversion - eeLoadGeneralSettingsData(); - int version = conversionVersionStart; - if (version == 216) { - version = 217; - ConvertRadioData_216_to_217(g_eeGeneral); - } - if (version == 217) { - version = 218; - ConvertRadioData_217_to_218(g_eeGeneral); - } - storageDirty(EE_GENERAL); - storageCheck(true); - -#if defined(COLORLCD) -#elif LCD_W >= 212 - lcdDrawRect(60, 6*FH+4, 132, 3); -#else - lcdDrawRect(10, 6*FH+4, 102, 3); -#endif - - // Models conversion - for (uint8_t id=0; id= 212 - lcdDrawSolidHorizontalLine(61, 6*FH+5, 10+id*2, FORCE); -#else - lcdDrawSolidHorizontalLine(11, 6*FH+5, 10+(id*3)/2, FORCE); -#endif - lcdRefresh(); - if (eeModelExists(id)) { - ConvertModel(id, conversionVersionStart); - } - - } - - return true; -} diff --git a/radio/src/storage/eeprom_raw.cpp b/radio/src/storage/eeprom_raw.cpp index 78ec6f677..66e1d19d4 100644 --- a/radio/src/storage/eeprom_raw.cpp +++ b/radio/src/storage/eeprom_raw.cpp @@ -584,7 +584,7 @@ const char * eeRestoreModel(uint8_t i_fileDst, char *model_name) #if defined(EEPROM_CONVERSIONS) if (version < EEPROM_VER) { - ConvertModel(i_fileDst, version); + convertModel(i_fileDst, version); eeLoadModel(g_eeGeneral.currModel); } #endif diff --git a/radio/src/storage/eeprom_rlc.cpp b/radio/src/storage/eeprom_rlc.cpp index d3b94d723..0ccb5518a 100644 --- a/radio/src/storage/eeprom_rlc.cpp +++ b/radio/src/storage/eeprom_rlc.cpp @@ -22,6 +22,7 @@ #include #include "opentx.h" #include "timers.h" +#include "conversions/conversions.h" uint8_t s_write_err = 0; // error reasons RlcFile theFile; //used for any file operation @@ -596,7 +597,7 @@ const char * eeRestoreModel(uint8_t i_fileDst, char *model_name) #if defined(EEPROM_CONVERSIONS) if (version < EEPROM_VER) { storageCheck(true); - ConvertModel(i_fileDst, version); + convertModelData(i_fileDst, version); eeLoadModel(g_eeGeneral.currModel); } #endif From c3a320a9fc3429560d02abb7d9eb91b45850d4ba Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Mar 2019 10:29:23 +0100 Subject: [PATCH 365/446] Cosmetics --- radio/src/storage/conversions/conversions.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index e034c8dc4..e9c0c4883 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -102,7 +102,6 @@ bool eeConvert() if (eeModelExists(id)) { convertModelData(id, conversionVersionStart); } - } return true; From fd3ead1b1f7f18a2d259738cebcd170db5fa2073 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 19 Mar 2019 11:23:59 +0100 Subject: [PATCH 366/446] fixes --- .../src/storage/conversions/datastructs_218.h | 230 +++++++++++++----- 1 file changed, 165 insertions(+), 65 deletions(-) diff --git a/radio/src/storage/conversions/datastructs_218.h b/radio/src/storage/conversions/datastructs_218.h index a46d530fa..566fc666b 100644 --- a/radio/src/storage/conversions/datastructs_218.h +++ b/radio/src/storage/conversions/datastructs_218.h @@ -22,6 +22,106 @@ #ifndef OPENTX_DATASTRUCTS_218_H #define OPENTX_DATASTRUCTS_218_H +#define MAX_TIMERS_218 3 +#define MAX_GVARS_218 9 + +#if defined(BUZZER) +#define BUZZER_FIELD_218 int8_t buzzerMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware) +#else +#define BUZZER_FIELD_218 int8_t spareRadio:2; +#endif + +#if defined(PCBHORUS) + #define LEN_SWITCH_NAME_218 3 + #define LEN_ANA_NAME_218 3 + #define LEN_MODEL_FILENAME_218 16 + #define LEN_BLUETOOTH_NAME_218 10 +#else + #define LEN_SWITCH_NAME_218 3 + #define LEN_ANA_NAME_218 3 + #define LEN_BLUETOOTH_NAME_218 10 +#endif + +#if defined(PCBHORUS) + #define LEN_MODEL_NAME_218 15 + #define LEN_TIMER_NAME_218 8 + #define LEN_FLIGHT_MODE_NAME_218 10 + #define LEN_BITMAP_NAME_218 10 // TODO next EEPROM change: we need 14 here as we have to store the file extension + #define LEN_EXPOMIX_NAME_218 6 + #define LEN_CHANNEL_NAME_218 6 + #define LEN_INPUT_NAME_218 4 + #define LEN_CURVE_NAME_218 3 + #define LEN_FUNCTION_NAME_218 6 + #define MAX_CURVES_218 32 + #define MAX_CURVE_POINTS_218 512 +#elif LCD_W == 212 + #define LEN_MODEL_NAME_218 12 + #define LEN_TIMER_NAME_218 8 + #define LEN_FLIGHT_MODE_NAME_218 10 + #define LEN_BITMAP_NAME_218 10 + #define LEN_EXPOMIX_NAME_218 8 // TODO next EEPROM change: 6 seem enough + #define LEN_CHANNEL_NAME_218 6 + #define LEN_INPUT_NAME_218 4 + #define LEN_CURVE_NAME_218 3 + #define LEN_FUNCTION_NAME_218 8 + #define MAX_CURVES_218 32 + #define MAX_CURVE_POINTS_218 512 +#elif defined(CPUARM) + #define LEN_MODEL_NAME_218 10 + #define LEN_TIMER_NAME_218 3 + #define LEN_FLIGHT_MODE_NAME_218 6 + #define LEN_EXPOMIX_NAME_218 6 + #define LEN_CHANNEL_NAME_218 4 + #define LEN_INPUT_NAME_218 3 + #define LEN_CURVE_NAME_218 3 + #define LEN_FUNCTION_NAME_218 6 + #define MAX_CURVES_218 16 // TODO next EEPROM check if can be changed to 32 to have all ARM the same + #define MAX_CURVE_POINTS_218 512 +#else + #define LEN_MODEL_NAME_218 10 + #define LEN_FLIGHT_MODE_NAME_218 6 + #define MAX_CURVES_218 8 + #define MAX_CURVE_POINTS_218 (112-MAX_CURVES_218) +#endif + +#if defined(PCBHORUS) + #define MAX_MODELS_218 60 + #define MAX_OUTPUT_CHANNELS_218 32 // number of real output channels CH1-CH32 + #define MAX_FLIGHT_MODES_218 9 + #define MAX_MIXERS_218 64 + #define MAX_EXPOS_218 64 + #define MAX_LOGICAL_SWITCHES_218 64 + #define MAX_SPECIAL_FUNCTIONS_218 64 // number of functions assigned to switches + #define MAX_SCRIPTS_218 9 + #define MAX_INPUTS_218 32 + #define MAX_TRAINER_CHANNELS_218 16 + #define MAX_TELEMETRY_SENSORS_218 32 + #define MAX_CUSTOM_SCREENS_218 5 +#elif defined(PCBTARANIS) + #define MAX_MODELS_218 60 + #define MAX_OUTPUT_CHANNELS_218 32 // number of real output channels CH1-CH32 + #define MAX_FLIGHT_MODES_218 9 + #define MAX_MIXERS_218 64 + #define MAX_EXPOS_218 64 + #define MAX_LOGICAL_SWITCHES_218 64 + #define MAX_SPECIAL_FUNCTIONS_218 64 // number of functions assigned to switches + #define MAX_SCRIPTS_218 7 + #define MAX_INPUTS_218 32 + #define MAX_TRAINER_CHANNELS_218 16 + #define MAX_TELEMETRY_SENSORS_218 32 +#elif defined(PCBSKY9X) + #define MAX_MODELS_218 60 + #define MAX_OUTPUT_CHANNELS_218 32 // number of real output channels CH1-CH32 + #define MAX_FLIGHT_MODES_218 9 + #define MAX_MIXERS_218 64 + #define MAX_EXPOS_218 32 + #define MAX_LOGICAL_SWITCHES_218 64 + #define MAX_SPECIAL_FUNCTIONS_218 64 // number of functions assigned to switches + #define MAX_INPUTS_218 32 + #define MAX_TRAINER_CHANNELS_218 16 + #define MAX_TELEMETRY_SENSORS_218 32 +#endif + PACK(typedef struct { int32_t mode:9; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw uint32_t start:23; @@ -31,12 +131,12 @@ PACK(typedef struct { uint32_t persistent:2; int32_t countdownStart:2; uint32_t direction:1; - char name[LEN_TIMER_NAME]; + char name[LEN_TIMER_NAME_218]; }) TimerData_v218; PACK(typedef struct { trim_t trim[NUM_STICKS]; - char name[LEN_FLIGHT_MODE_NAME]; + char name[LEN_FLIGHT_MODE_NAME_218]; int16_t swtch:9; // swtch of phase[0] is not used int16_t spare:7; uint8_t fadeIn; @@ -61,7 +161,7 @@ PACK(typedef struct { uint8_t delayDown; uint8_t speedUp; uint8_t speedDown; - char name[LEN_EXPOMIX_NAME]; + char name[LEN_EXPOMIX_NAME_218]; }) MixData_v218; PACK(typedef struct { @@ -74,7 +174,7 @@ PACK(typedef struct { uint32_t flightModes:9; int32_t weight:8; int32_t spare:1; - char name[LEN_EXPOMIX_NAME]; + char name[LEN_EXPOMIX_NAME_218]; int8_t offset; CurveRef curve; }) ExpoData_v218; @@ -83,7 +183,7 @@ PACK(typedef struct { uint8_t type:1; uint8_t smooth:1; int8_t points:6; // describes number of points - 5 - char name[LEN_CURVE_NAME]; + char name[LEN_CURVE_NAME_218]; }) CurveData_v218; PACK(typedef struct { @@ -137,20 +237,20 @@ PACK(typedef struct { }) GVarData_v218; #if defined(PCBX12S) -#define MODELDATA_EXTRA_218 uint8_t spare:3;uint8_t trainerMode:3;uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1];ScriptData scriptsData[MAX_SCRIPTS];char inputNames[MAX_INPUTS][LEN_INPUT_NAME];;uint8_t potsWarnEnabled;;int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];; +#define MODELDATA_EXTRA_218 uint8_t spare:3;uint8_t trainerMode:3;uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1];ScriptData scriptsData[MAX_SCRIPTS_218];char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218];;uint8_t potsWarnEnabled;;int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];; #elif defined(PCBX10) -#define MODELDATA_EXTRA_218 uint8_t spare:3;;uint8_t trainerMode:3;;uint8_t potsWarnMode:2;; ModuleData moduleData[NUM_MODULES+1];ScriptData scriptsData[MAX_SCRIPTS];;char inputNames[MAX_INPUTS][LEN_INPUT_NAME];;uint8_t potsWarnEnabled;;int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];;uint8_t potsWarnSpares[NUM_DUMMY_ANAS];; +#define MODELDATA_EXTRA_218 uint8_t spare:3;;uint8_t trainerMode:3;;uint8_t potsWarnMode:2;; ModuleData moduleData[NUM_MODULES+1];ScriptData scriptsData[MAX_SCRIPTS_218];;char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218];;uint8_t potsWarnEnabled;;int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];;uint8_t potsWarnSpares[NUM_DUMMY_ANAS];; #elif defined(PCBTARANIS) -#define MODELDATA_EXTRA_218 uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; +#define MODELDATA_EXTRA_218 uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS_218]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; #elif defined(PCBSKY9X) -#define MODELDATA_EXTRA_218 uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; uint8_t rxBattAlarms[2]; +#define MODELDATA_EXTRA_218 uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; uint8_t rxBattAlarms[2]; #else #define MODELDATA_EXTRA_218 #endif PACK(typedef struct { ModelHeader header; - TimerData_v218 timers[MAX_TIMERS]; + TimerData_v218 timers[MAX_TIMERS_218]; uint8_t telemetryProtocol:3; uint8_t thrTrim:1; // Enable Throttle Trim uint8_t noGlobalFunctions:1; @@ -163,31 +263,31 @@ PACK(typedef struct { uint8_t extendedTrims:1; uint8_t throttleReversed:1; BeepANACenter beepANACenter; - MixData_v218 mixData[MAX_MIXERS]; - LimitData limitData[MAX_OUTPUT_CHANNELS]; - ExpoData_v218 expoData[MAX_EXPOS]; + MixData_v218 mixData[MAX_MIXERS_218]; + LimitData limitData[MAX_OUTPUT_CHANNELS_218]; + ExpoData_v218 expoData[MAX_EXPOS_218]; - CurveData_v218 curves[MAX_CURVES]; - int8_t points[MAX_CURVE_POINTS]; + CurveData_v218 curves[MAX_CURVES_218]; + int8_t points[MAX_CURVE_POINTS_218]; LogicalSwitchData_v218 logicalSw[32]; - CustomFunctionData_v218 customFn[MAX_SPECIAL_FUNCTIONS]; + CustomFunctionData_v218 customFn[MAX_SPECIAL_FUNCTIONS_218]; SwashRingData swashR; - FlightModeData_v218 flightModeData[MAX_FLIGHT_MODES]; + FlightModeData_v218 flightModeData[MAX_FLIGHT_MODES_218]; uint8_t thrTraceSrc; swarnstate_t switchWarningState; swarnenable_t switchWarningEnable; - GVarData_v218 gvars[MAX_GVARS]; + GVarData_v218 gvars[MAX_GVARS_218]; FrSkyTelemetryData frsky; RssiAlarmData rssiAlarms; MODELDATA_EXTRA_218 - TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS]; + TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS_218]; TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) }) ModelData_v218; @@ -211,7 +311,7 @@ PACK(typedef struct { int8_t varioPitch; \ int8_t varioRange; \ int8_t varioRepeat; \ - CustomFunctionData_v218 customFn[MAX_SPECIAL_FUNCTIONS]; + CustomFunctionData_v218 customFn[MAX_SPECIAL_FUNCTIONS_218]; #if defined(PCBHORUS) #define EXTRA_GENERAL_FIELDS_218 \ @@ -220,17 +320,17 @@ PACK(typedef struct { uint8_t slidersConfig:4; \ uint32_t switchConfig; \ uint8_t potsConfig; /* two bits per pot */ \ - char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; \ - char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_DUMMY_ANAS][LEN_ANA_NAME]; \ - char currModelFilename[LEN_MODEL_FILENAME+1]; \ + char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME_218]; \ + char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_DUMMY_ANAS][LEN_ANA_NAME_218]; \ + char currModelFilename[LEN_MODEL_FILENAME_218+1]; \ uint8_t spare:1; \ uint8_t blOffBright:7; \ - char bluetoothName[LEN_BLUETOOTH_NAME]; + char bluetoothName[LEN_BLUETOOTH_NAME_218]; #elif defined(PCBTARANIS) #if defined(BLUETOOTH) #define BLUETOOTH_FIELDS_218 \ uint8_t spare; \ - char bluetoothName[LEN_BLUETOOTH_NAME]; + char bluetoothName[LEN_BLUETOOTH_NAME_218]; #else #define BLUETOOTH_FIELDS #endif @@ -242,8 +342,8 @@ PACK(typedef struct { uint8_t backlightColor; \ swarnstate_t switchUnlockStates; \ swconfig_t switchConfig; \ - char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; \ - char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]; \ + char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME_218]; \ + char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME_218]; \ BLUETOOTH_FIELDS #elif defined(PCBSKY9X) #define EXTRA_GENERAL_FIELDS_218 \ @@ -256,8 +356,8 @@ PACK(typedef struct { uint8_t optrexDisplay; \ uint8_t sticksGain; \ uint8_t rotarySteps; \ - char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; \ - char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]; + char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME_218]; \ + char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME_218]; #elif defined(CPUARM) #define EXTRA_GENERAL_FIELDS_218 EXTRA_GENERAL_FIELDS_GENERAL_218 #elif defined(PXX) @@ -267,51 +367,51 @@ PACK(typedef struct { #endif #if defined(PCBHORUS) -#define SPLASH_MODE uint8_t splashSpares:3 +#define SPLASH_MODE_218 uint8_t splashSpares:3 #elif defined(FSPLASH) -#define SPLASH_MODE uint8_t splashMode:3 +#define SPLASH_MODE_218 uint8_t splashMode:3 #else -#define SPLASH_MODE int8_t splashMode:3 +#define SPLASH_MODE_218 int8_t splashMode:3 #endif PACK(typedef struct { - uint8_t version; - uint16_t variant; - CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS+NUM_DUMMY_ANAS]; - uint16_t chkSum; + uint8_t version; + uint16_t variant; + CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS+NUM_DUMMY_ANAS]; + uint16_t chkSum; N_HORUS_FIELD(int8_t currModel); N_HORUS_FIELD(uint8_t contrast); - uint8_t vBatWarn; - int8_t txVoltageCalibration; - int8_t backlightMode; - TrainerData_v218 trainer; - uint8_t view; // index of view in main screen - BUZZER_FIELD - uint8_t fai:1; - int8_t beepMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all - uint8_t alarmsFlash:1; - uint8_t disableMemoryWarning:1; - uint8_t disableAlarmWarning:1; - uint8_t stickMode:2; - int8_t timezone:5; - uint8_t adjustRTC:1; - uint8_t inactivityTimer; - SPLASH_MODE; /* 3bits */ - int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all - uint8_t lightAutoOff; - uint8_t templateSetup; // RETA order for receiver channels - int8_t PPM_Multiplier; - int8_t hapticLength; + uint8_t vBatWarn; + int8_t txVoltageCalibration; + int8_t backlightMode; + TrainerData_v218 trainer; + uint8_t view; // index of view in main screen + BUZZER_FIELD_218 + uint8_t fai:1; + int8_t beepMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + uint8_t alarmsFlash:1; + uint8_t disableMemoryWarning:1; + uint8_t disableAlarmWarning:1; + uint8_t stickMode:2; + int8_t timezone:5; + uint8_t adjustRTC:1; + uint8_t inactivityTimer; + SPLASH_MODE_218; /* 3bits */ + int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + uint8_t lightAutoOff; + uint8_t templateSetup; // RETA order for receiver channels + int8_t PPM_Multiplier; + int8_t hapticLength; N_HORUS_FIELD(N_TARANIS_FIELD(N_PCBSTD_FIELD(uint8_t reNavigation))); N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t stickReverse)); - int8_t beepLength:3; - int8_t hapticStrength:3; - uint8_t gpsFormat:1; - uint8_t unexpectedShutdown:1; - uint8_t speakerPitch; - int8_t speakerVolume; - int8_t vBatMin; - int8_t vBatMax; + int8_t beepLength:3; + int8_t hapticStrength:3; + uint8_t gpsFormat:1; + uint8_t unexpectedShutdown:1; + uint8_t speakerPitch; + int8_t speakerVolume; + int8_t vBatMin; + int8_t vBatMax; EXTRA_GENERAL_FIELDS_218 From 5285cc9b5e9c59e0ebdf6145d95c29bb8c895f95 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Mar 2019 11:30:42 +0100 Subject: [PATCH 367/446] Conversion from 218 to 219 added --- radio/src/CMakeLists.txt | 6 +- radio/src/datastructs.h | 25 +++--- radio/src/storage/conversions/CMakeLists.txt | 9 +++ radio/src/storage/conversions/conversions.cpp | 6 ++ radio/src/storage/conversions/conversions.h | 4 + .../conversions/conversions_218_219.cpp | 79 +++++++++++++++++++ 6 files changed, 108 insertions(+), 21 deletions(-) create mode 100644 radio/src/storage/conversions/CMakeLists.txt create mode 100644 radio/src/storage/conversions/conversions_218_219.cpp diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index d9c4e6473..60646540b 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -131,11 +131,7 @@ else() add_definitions(-DEEPROM -DEEPROM_RAW) endif() -if(ARCH STREQUAL ARM AND NOT PCB STREQUAL X12S AND NOT PCB STREQUAL X10 AND NOT PCB STREQUAL XLITE AND NOT PCB STREQUAL XLITES AND NOT PCB STREQUAL X3) - add_definitions(-DEEPROM_CONVERSIONS) - set(SRC ${SRC} storage/conversions/conversions.cpp) - set(SRC ${SRC} storage/conversions/conversions_216_218.cpp) -endif() +include(storage/conversions/CMakeLists.txt) add_definitions(-DFLAVOUR="${FLAVOUR}") diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index cdfc12cad..b482ecd44 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -557,10 +557,6 @@ typedef uint8_t swarnenable_t; swarnenable_t switchWarningEnable; #endif -#define MODEL_GVARS_DATA GVarData gvars[MAX_GVARS]; - -#define TELEMETRY_DATA NOBACKUP(FrSkyTelemetryData frsky); NOBACKUP(RssiAlarmData rssiAlarms); - #if defined(PCBHORUS) #include "gui/480x272/layout.h" #include "gui/480x272/topbar.h" @@ -574,17 +570,11 @@ PACK(struct CustomScreenData { NOBACKUP(Topbar::PersistentData topbarData); \ NOBACKUP(uint8_t view); #elif defined(PCBTARANIS) -#define CUSTOM_SCREENS_DATA \ + #define CUSTOM_SCREENS_DATA \ NOBACKUP(uint8_t view); #else -#define CUSTOM_SCREENS_DATA -// TODO other boards could have their custom screens here as well -#endif - -#if defined(PCBHORUS) || defined(PCBTARANIS) - #define SCRIPTS_DATA NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); -#else - #define SCRIPTS_DATA + #define CUSTOM_SCREENS_DATA + // TODO other boards could have their custom screens here as well #endif PACK(struct ModelData { @@ -618,9 +608,10 @@ PACK(struct ModelData { SWITCHES_WARNING_DATA - MODEL_GVARS_DATA + GVarData gvars[MAX_GVARS]; - TELEMETRY_DATA + NOBACKUP(FrSkyTelemetryData frsky); + NOBACKUP(RssiAlarmData rssiAlarms); NOBACKUP(uint8_t spare:6); NOBACKUP(uint8_t potsWarnMode:2); @@ -629,7 +620,9 @@ PACK(struct ModelData { int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; TrainerModuleData trainerData; - SCRIPTS_DATA +#if defined(PCBHORUS) || defined(PCBTARANIS) + NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); +#endif NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); diff --git a/radio/src/storage/conversions/CMakeLists.txt b/radio/src/storage/conversions/CMakeLists.txt new file mode 100644 index 000000000..f91ccda89 --- /dev/null +++ b/radio/src/storage/conversions/CMakeLists.txt @@ -0,0 +1,9 @@ +if(NOT PCB STREQUAL X3) + add_definitions(-DEEPROM_CONVERSIONS) + set(SRC + ${SRC} + storage/conversions/conversions.cpp + storage/conversions/conversions_216_218.cpp + storage/conversions/conversions_218_219.cpp + ) +endif() diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index e9c0c4883..4d15e0a81 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -29,11 +29,17 @@ void convertModelData(int id, int version) version = 217; convertModelData_216_to_217(g_model); } + if (version == 217) { version = 218; convertModelData_217_to_218(g_model); } + if (version == 218) { + version = 219; + convertModelData_218_to_219(g_model); + } + uint8_t currModel = g_eeGeneral.currModel; g_eeGeneral.currModel = id; storageDirty(EE_MODEL); diff --git a/radio/src/storage/conversions/conversions.h b/radio/src/storage/conversions/conversions.h index c3975cfc4..4da4a9ba7 100644 --- a/radio/src/storage/conversions/conversions.h +++ b/radio/src/storage/conversions/conversions.h @@ -28,3 +28,7 @@ void convertRadioData_216_to_217(RadioData &settings); // Conversions 217 to 218 void convertModelData_217_to_218(ModelData &model); void convertRadioData_217_to_218(RadioData &settings); + +// Conversions 218 to 219 +void convertModelData_218_to_219(ModelData &model); +void convertRadioData_218_to_219(RadioData &settings); diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp new file mode 100644 index 000000000..1c81d8583 --- /dev/null +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -0,0 +1,79 @@ +/* + * 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" +#include "datastructs_218.h" + +/* + * PCBHORUS: 64 telemetry sensors instead of 32 + * ALL: ReceiverData array added + * ALL: registrationId added + * ALL: failsafeChannels moved from ModuleData to ModelData + * ALL: ModuleData / TrainerModuleData modified + * + */ + +typedef ModelData ModelData_v219; + +void convertModelData_218_to_219(ModelData &model) +{ + assert(sizeof(ModelData_v218) <= sizeof(ModelData)); + + ModelData_v218 oldModel; + memcpy(&oldModel, &model, sizeof(oldModel)); + ModelData_v219 & newModel = (ModelData_v219 &) model; + + memset(&newModel.rssiAlarms + sizeof(RssiAlarmData), 0, sizeof(ModelData_v219) - offsetof(ModelData_v219, rssiAlarms) - sizeof(RssiAlarmData)); + + char name[LEN_MODEL_NAME+1]; + zchar2str(name, oldModel.header.name, LEN_MODEL_NAME); + TRACE("Model %s conversion from v218 to v219", name); + + for (int i=0; i Date: Tue, 19 Mar 2019 11:58:45 +0100 Subject: [PATCH 368/446] fixes --- .../src/storage/conversions/datastructs_218.h | 79 +++++++++++++++++-- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/radio/src/storage/conversions/datastructs_218.h b/radio/src/storage/conversions/datastructs_218.h index 566fc666b..fe43dffbe 100644 --- a/radio/src/storage/conversions/datastructs_218.h +++ b/radio/src/storage/conversions/datastructs_218.h @@ -31,6 +31,18 @@ #define BUZZER_FIELD_218 int8_t spareRadio:2; #endif +#if defined(PCBHORUS) + #define NUM_SWITCHES_218 8 +#elif defined(PCBXLITE) + #define NUM_SWITCHES_218 4 +#elif defined(PCBX7) + #define NUM_SWITCHES_218 6 +#elif defined(PCBX9E) + #define NUM_SWITCHES_218 18 // yes, it's a lot! +#else + #define NUM_SWITCHES_218 8 +#endif + #if defined(PCBHORUS) #define LEN_SWITCH_NAME_218 3 #define LEN_ANA_NAME_218 3 @@ -122,6 +134,61 @@ #define MAX_TELEMETRY_SENSORS_218 32 #endif +PACK(typedef struct { + uint8_t type:4; + int8_t rfProtocol:4; + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + uint8_t failsafeMode:4; // only 3 bits used + uint8_t subType:3; + uint8_t invertedSerial:1; // telemetry serial inverted from standard + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS_218]; + union { + struct { + int8_t delay:6; + uint8_t pulsePol:1; + uint8_t outputType:1; // false = open drain, true = push pull + int8_t frameLength; + } ppm; + struct { + uint8_t rfProtocolExtra:2; + uint8_t spare1:3; + uint8_t customProto:1; + uint8_t autoBindMode:1; + uint8_t lowPowerMode:1; + int8_t optionValue; + } multi; + struct { + uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W + uint8_t spare1:2; + uint8_t receiver_telem_off:1; // false = receiver telem enabled + uint8_t receiver_channel_9_16:1; // false = pwm out 1-8, true 9-16 + uint8_t external_antenna:1; // false = internal antenna, true = external antenna + uint8_t fast:1; // TODO: to be used later by external module (fast means serial @ high speed) + uint8_t spare2; + } pxx; + struct { + uint8_t spare1:6; + uint8_t noninverted:1; + uint8_t spare2:1; + int8_t refreshRate; // definition as framelength for ppm (* 5 + 225 = time in 1/10 ms) + } sbus; + }; + + // Helper functions to set both of the rfProto protocol at the same time + inline uint8_t getMultiProtocol(bool returnCustom) { + if (returnCustom && multi.customProto) + return MM_RF_CUSTOM_SELECTED; + return ((uint8_t) (rfProtocol & 0x0f)) + (multi.rfProtocolExtra << 4); + } + + inline void setMultiProtocol(uint8_t proto) + { + rfProtocol = (uint8_t) (proto & 0x0f); + multi.rfProtocolExtra = (proto & 0x30) >> 4; + } +}) ModuleData_v218; + PACK(typedef struct { int32_t mode:9; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw uint32_t start:23; @@ -237,11 +304,11 @@ PACK(typedef struct { }) GVarData_v218; #if defined(PCBX12S) -#define MODELDATA_EXTRA_218 uint8_t spare:3;uint8_t trainerMode:3;uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1];ScriptData scriptsData[MAX_SCRIPTS_218];char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218];;uint8_t potsWarnEnabled;;int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];; +#define MODELDATA_EXTRA_218 uint8_t spare:3;uint8_t trainerMode:3;uint8_t potsWarnMode:2; ModuleData_v218 moduleData[NUM_MODULES+1];ScriptData scriptsData[MAX_SCRIPTS_218];char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218];;uint8_t potsWarnEnabled;;int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];; #elif defined(PCBX10) -#define MODELDATA_EXTRA_218 uint8_t spare:3;;uint8_t trainerMode:3;;uint8_t potsWarnMode:2;; ModuleData moduleData[NUM_MODULES+1];ScriptData scriptsData[MAX_SCRIPTS_218];;char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218];;uint8_t potsWarnEnabled;;int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];;uint8_t potsWarnSpares[NUM_DUMMY_ANAS];; +#define MODELDATA_EXTRA_218 uint8_t spare:3;;uint8_t trainerMode:3;;uint8_t potsWarnMode:2;; ModuleData_v218 moduleData[NUM_MODULES+1];ScriptData scriptsData[MAX_SCRIPTS_218];;char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218];;uint8_t potsWarnEnabled;;int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];;uint8_t potsWarnSpares[NUM_DUMMY_ANAS];; #elif defined(PCBTARANIS) -#define MODELDATA_EXTRA_218 uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS_218]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; +#define MODELDATA_EXTRA_218 uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData_v218 moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS_218]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; #elif defined(PCBSKY9X) #define MODELDATA_EXTRA_218 uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; uint8_t rxBattAlarms[2]; #else @@ -320,7 +387,7 @@ PACK(typedef struct { uint8_t slidersConfig:4; \ uint32_t switchConfig; \ uint8_t potsConfig; /* two bits per pot */ \ - char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME_218]; \ + char switchNames[NUM_SWITCHES_218][LEN_SWITCH_NAME_218]; \ char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_DUMMY_ANAS][LEN_ANA_NAME_218]; \ char currModelFilename[LEN_MODEL_FILENAME_218+1]; \ uint8_t spare:1; \ @@ -342,7 +409,7 @@ PACK(typedef struct { uint8_t backlightColor; \ swarnstate_t switchUnlockStates; \ swconfig_t switchConfig; \ - char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME_218]; \ + char switchNames[NUM_SWITCHES_218][LEN_SWITCH_NAME_218]; \ char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME_218]; \ BLUETOOTH_FIELDS #elif defined(PCBSKY9X) @@ -356,7 +423,7 @@ PACK(typedef struct { uint8_t optrexDisplay; \ uint8_t sticksGain; \ uint8_t rotarySteps; \ - char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME_218]; \ + char switchNames[NUM_SWITCHES_218][LEN_SWITCH_NAME_218]; \ char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME_218]; #elif defined(CPUARM) #define EXTRA_GENERAL_FIELDS_218 EXTRA_GENERAL_FIELDS_GENERAL_218 From 3996fa17bc92bf469a4a054b92c08aa14f059726 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Mar 2019 12:14:51 +0100 Subject: [PATCH 369/446] Conversion continued --- .../conversions/conversions_216_218.cpp | 3 +- .../conversions/conversions_218_219.cpp | 6 +- .../src/storage/conversions/datastructs_218.h | 57 +++++++------------ 3 files changed, 26 insertions(+), 40 deletions(-) diff --git a/radio/src/storage/conversions/conversions_216_218.cpp b/radio/src/storage/conversions/conversions_216_218.cpp index fc9ffa687..f558efd17 100644 --- a/radio/src/storage/conversions/conversions_216_218.cpp +++ b/radio/src/storage/conversions/conversions_216_218.cpp @@ -1234,8 +1234,7 @@ void convertModelData_217_to_218(ModelData &model) } } for (int i=0; i> 4; - } }) ModuleData_v218; PACK(typedef struct { @@ -310,7 +297,7 @@ PACK(typedef struct { #elif defined(PCBTARANIS) #define MODELDATA_EXTRA_218 uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData_v218 moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS_218]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; #elif defined(PCBSKY9X) -#define MODELDATA_EXTRA_218 uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; uint8_t rxBattAlarms[2]; +#define MODELDATA_EXTRA_218 uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData_v218 moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; uint8_t rxBattAlarms[2]; #else #define MODELDATA_EXTRA_218 #endif @@ -354,7 +341,7 @@ PACK(typedef struct { MODELDATA_EXTRA_218 - TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS_218]; + TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS_218]; TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) }) ModelData_v218; From 48fc1191a6636da84637116158e5d429bcfe9ab5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Mar 2019 12:21:36 +0100 Subject: [PATCH 370/446] Conversions continued --- radio/src/storage/conversions/conversions_218_219.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp index a12161cb4..3b0418353 100644 --- a/radio/src/storage/conversions/conversions_218_219.cpp +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -50,8 +50,11 @@ void convertModelData_218_to_219(ModelData &model) memcpy(&newModel.moduleData[i], &oldModel.moduleData[i], sizeof(ModuleData)); } - #warning "Here we have to merge the failsafe values properly" - memcpy(newModel.failsafeChannels, oldModel.moduleData[0].failsafeChannels, sizeof(newModel.failsafeChannels)); + for (uint8_t module=0; module<2; module++) { + if (oldModel.moduleData[module].failsafeMode == FAILSAFE_CUSTOM) { + memcpy(newModel.failsafeChannels, oldModel.moduleData[module].failsafeChannels, sizeof(newModel.failsafeChannels)); + } + } newModel.trainerData.mode = oldModel.trainerMode; newModel.trainerData.channelsStart = oldModel.moduleData[NUM_MODULES].channelsStart; From 92e9d69409cbef949ea9eb3ce8c4bce304b57942 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Mar 2019 13:27:57 +0100 Subject: [PATCH 371/446] Fix for Travis --- radio/src/targets/common/arm/stm32/adc_driver.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index a40481802..6b21ec03d 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -44,6 +44,8 @@ const int8_t ana_direction[NUM_ANALOGS] = {1,-1,-1,1, -1,1, 1}; #elif defined(REV4a) const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, 1,-1,0, 1,1, 1}; +#else + const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, 1,1,0, 1,1, 1}; #endif #if NUM_PWMSTICKS > 0 From d0c6f6b9b7103ad26258a619a0870e11ee5cb8d5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 19 Mar 2019 13:29:41 +0100 Subject: [PATCH 372/446] Fix for Travis --- radio/src/storage/conversions/conversions_216_218.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/storage/conversions/conversions_216_218.cpp b/radio/src/storage/conversions/conversions_216_218.cpp index f558efd17..bec832dad 100644 --- a/radio/src/storage/conversions/conversions_216_218.cpp +++ b/radio/src/storage/conversions/conversions_216_218.cpp @@ -666,7 +666,7 @@ int ConvertTelemetrySource_216_to_217(int source) return source; } -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) && !defined(PCBXLITE) int ConvertSwitch_216_to_217(int swtch) { if (swtch < 0) From 98318530506029ef96614bda2edd9570e75d202b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Mar 2019 14:18:27 +0100 Subject: [PATCH 373/446] Conversions fix --- radio/src/storage/conversions/CMakeLists.txt | 24 ++++++++++- radio/src/storage/conversions/conversions.cpp | 40 +++++++++++++++---- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/radio/src/storage/conversions/CMakeLists.txt b/radio/src/storage/conversions/CMakeLists.txt index f91ccda89..288eee42d 100644 --- a/radio/src/storage/conversions/CMakeLists.txt +++ b/radio/src/storage/conversions/CMakeLists.txt @@ -1,9 +1,29 @@ -if(NOT PCB STREQUAL X3) - add_definitions(-DEEPROM_CONVERSIONS) +if(PCB STREQUAL X9D OR PCB STREQUAL X9DP OR PCB STREQUAL SKY9X) + set(EEPROM_CONVERSIONS 216) +endif() + +if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X7 OR PCB STREQUAL XLITE) + set(EEPROM_CONVERSIONS 218) +endif() + +if(EEPROM_CONVERSIONS) + add_definitions(-DEEPROM_CONVERSIONS=${EEPROM_CONVERSIONS}) set(SRC ${SRC} storage/conversions/conversions.cpp + ) +endif() + +if(EEPROM_CONVERSIONS GREATER 215) + set(SRC + ${SRC} storage/conversions/conversions_216_218.cpp + ) +endif() + +if(EEPROM_CONVERSIONS GREATER 217) + set(SRC + ${SRC} storage/conversions/conversions_218_219.cpp ) endif() diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index 4d15e0a81..ac89a2241 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -25,20 +25,26 @@ void convertModelData(int id, int version) { eeLoadModelData(id); +#if EEPROM_CONVERSIONS >= 216 if (version == 216) { version = 217; convertModelData_216_to_217(g_model); } +#endif +#if EEPROM_CONVERSIONS >= 217 if (version == 217) { version = 218; convertModelData_217_to_218(g_model); } +#endif +#if EEPROM_CONVERSIONS >= 218 if (version == 218) { version = 219; convertModelData_218_to_219(g_model); } +#endif uint8_t currModel = g_eeGeneral.currModel; g_eeGeneral.currModel = id; @@ -51,14 +57,18 @@ bool eeConvert() { const char *msg = NULL; - if (g_eeGeneral.version == 216) { - msg = "EEprom Data v216"; - } - else if (g_eeGeneral.version == 217) { - msg = "EEprom Data v217"; - } - else { - return false; + switch (g_eeGeneral.version) { + case 216: + msg = "EEprom Data v216"; + break; + case 217: + msg = "EEprom Data v217"; + break; + case 218: + msg = "EEprom Data v218"; + break; + default: + return false; } int conversionVersionStart = g_eeGeneral.version; @@ -78,14 +88,28 @@ bool eeConvert() // General Settings conversion eeLoadGeneralSettingsData(); int version = conversionVersionStart; + +#if EEPROM_CONVERSIONS >= 216 if (version == 216) { version = 217; convertRadioData_216_to_217(g_eeGeneral); } +#endif + +#if EEPROM_CONVERSIONS >= 217 if (version == 217) { version = 218; convertRadioData_217_to_218(g_eeGeneral); } +#endif + +#if EEPROM_CONVERSIONS >= 218 + if (version == 218) { + version = 219; + // no conversion needed for now + } +#endif + storageDirty(EE_GENERAL); storageCheck(true); From 3d41a9ec777132ba691408e270320bd3619f79f9 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Mar 2019 14:24:03 +0100 Subject: [PATCH 374/446] Compilation fix --- radio/src/bluetooth.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/bluetooth.cpp b/radio/src/bluetooth.cpp index 72649950b..95245ffcc 100644 --- a/radio/src/bluetooth.cpp +++ b/radio/src/bluetooth.cpp @@ -298,7 +298,7 @@ void bluetoothWakeup(void) uint8_t len = ZLEN(g_eeGeneral.bluetoothName); if (len > 0) { for (int i = 0; i < len; i++) { - *cur++ = idx2char(g_eeGeneral.bluetoothName[i]); + *cur++ = zchar2char(g_eeGeneral.bluetoothName[i]); } } else { From cd3f007af441cc949c2e09275106dbbdb4596084 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 19 Mar 2019 16:35:04 +0100 Subject: [PATCH 375/446] Compile fixes --- radio/src/datastructs.h | 6 +++--- radio/src/targets/horus/board.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index b482ecd44..f2c588182 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -916,7 +916,7 @@ static inline void check_struct() CHKSIZE(LogicalSwitchData, 9); CHKSIZE(TelemetrySensor, 13); - CHKSIZE(ModuleData, 6); + CHKSIZE(ModuleData, 12); CHKSIZE(GVarData, 7); @@ -942,8 +942,8 @@ static inline void check_struct() CHKSIZE(RadioData, 727); CHKSIZE(ModelData, 5188); #elif defined(PCBHORUS) - CHKSIZE(RadioData, 847); - CHKSIZE(ModelData, 9380); + CHKSIZE(RadioData, 855); + CHKSIZE(ModelData, 9777); #endif #undef CHKSIZE diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index d17e716fe..8fbe1be35 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -21,7 +21,7 @@ #ifndef _BOARD_HORUS_H_ #define _BOARD_HORUS_H_ -#include "definitions.h" +#include "../definitions.h" #include "cpu_id.h" #if defined(__cplusplus) && !defined(SIMU) From b3480f3d465d6a5e4189a00a2d8ee7e7e1de08bc Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Mar 2019 18:03:39 +0100 Subject: [PATCH 376/446] Revert a previous commit --- radio/src/storage/conversions/conversions_216_218.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/storage/conversions/conversions_216_218.cpp b/radio/src/storage/conversions/conversions_216_218.cpp index bec832dad..f558efd17 100644 --- a/radio/src/storage/conversions/conversions_216_218.cpp +++ b/radio/src/storage/conversions/conversions_216_218.cpp @@ -666,7 +666,7 @@ int ConvertTelemetrySource_216_to_217(int source) return source; } -#if defined(PCBTARANIS) && !defined(PCBXLITE) +#if defined(PCBTARANIS) int ConvertSwitch_216_to_217(int swtch) { if (swtch < 0) From 5fc4d86ef5589d03337c107f569b49c7475612ad Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Mar 2019 18:29:32 +0100 Subject: [PATCH 377/446] Compilation fixes --- radio/src/datastructs.h | 13 ++++-- radio/src/gui/128x64/menus.h | 10 ++--- radio/src/gui/128x64/radio_spectrum.cpp | 2 +- radio/src/gui/128x64/radio_tools.cpp | 42 ++++++++++++++++++++ radio/src/gui/480x272/bitmapbuffer.cpp | 2 +- radio/src/gui/480x272/lcd.cpp | 2 +- radio/src/gui/480x272/model_setup.cpp | 8 ++-- radio/src/gui/480x272/radio_sdmanager.cpp | 10 +++-- radio/src/io/frsky_sport.h | 1 - radio/src/storage/conversions/CMakeLists.txt | 6 ++- radio/src/targets/horus/board.h | 22 +++++----- radio/src/targets/taranis/CMakeLists.txt | 2 +- 12 files changed, 86 insertions(+), 34 deletions(-) create mode 100644 radio/src/gui/128x64/radio_tools.cpp diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index f2c588182..9734656e0 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -476,7 +476,7 @@ PACK(struct ModuleData { uint8_t spare2:1; int8_t refreshRate; // definition as framelength for ppm (* 5 + 225 = time in 1/10 ms) } sbus); - NOBACKUP(struct { + NOBACKUP(PACK(struct { uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W uint8_t external_antenna:1; // false = internal antenna, true = external antenna #if defined(PCBHORUS) @@ -497,7 +497,7 @@ PACK(struct ModuleData { NOBACKUP(inline void clearReceiverSlot(uint8_t receiver) { setReceiverSlot(receiver, 0); }) - } pxx2); + }) pxx2); }; // Helper functions to set both of the rfProto protocol at the same time @@ -916,7 +916,12 @@ static inline void check_struct() CHKSIZE(LogicalSwitchData, 9); CHKSIZE(TelemetrySensor, 13); - CHKSIZE(ModuleData, 12); + +#if defined(PCBHORUS) + CHKSIZE(ModuleData, 9); +#else + CHKSIZE(ModuleData, 6); +#endif CHKSIZE(GVarData, 7); @@ -943,7 +948,7 @@ static inline void check_struct() CHKSIZE(ModelData, 5188); #elif defined(PCBHORUS) CHKSIZE(RadioData, 855); - CHKSIZE(ModelData, 9777); + CHKSIZE(ModelData, 9771); #endif #undef CHKSIZE diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index 22b0fc206..3c3308b06 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -73,7 +73,6 @@ inline MenuHandlerFunc lastPopMenu() } void onMainViewMenu(const char * result); - void menuFirstCalib(event_t event); void menuMainView(event_t event); void menuViewTelemetryFrsky(event_t event); @@ -83,11 +82,9 @@ enum MenuRadioIndexes { MENU_RADIO_SETUP, CASE_SDCARD(MENU_RADIO_SD_MANAGER) + MENU_RADIO_TOOLS, MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, -#if defined(RADIO_SPECTRUM) - MENU_RADIO_SPECTRUM, -#endif MENU_RADIO_HARDWARE, MENU_RADIO_VERSION, MENU_RADIO_PAGES_COUNT @@ -101,17 +98,16 @@ void menuRadioVersion(event_t event); void menuRadioDiagKeys(event_t event); void menuRadioDiagAnalogs(event_t event); void menuRadioHardware(event_t event); +void menuRadioTools(event_t event); void menuRadioSpectrum(event_t event); void menuRadioCalibration(event_t event); static const MenuHandlerFunc menuTabGeneral[] = { menuRadioSetup, CASE_SDCARD(menuRadioSdManager) + menuRadioTools, menuRadioSpecialFunctions, menuRadioTrainer, -#if defined(RADIO_SPECTRUM) - menuRadioSpectrum, -#endif menuRadioHardware, menuRadioVersion }; diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/128x64/radio_spectrum.cpp index 47a099b46..2fab450da 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/128x64/radio_spectrum.cpp @@ -22,7 +22,7 @@ void menuRadioSpectrum(event_t event) { - SIMPLE_MENU("SPECTRUM ANALYSER", menuTabGeneral, MENU_RADIO_SPECTRUM, 1); + SIMPLE_SUBMENU("SPECTRUM ANALYSER", 1); if (menuEvent) { INTERNAL_MODULE_OFF(); diff --git a/radio/src/gui/128x64/radio_tools.cpp b/radio/src/gui/128x64/radio_tools.cpp new file mode 100644 index 000000000..55e772237 --- /dev/null +++ b/radio/src/gui/128x64/radio_tools.cpp @@ -0,0 +1,42 @@ +/* + * 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" + +void addRadioTool(uint8_t index, const char * label, void (* tool)(event_t event), event_t event) +{ + int8_t sub = menuVerticalPosition - HEADER_LINE; + LcdFlags attr = (sub == index ? INVERS : 0); + coord_t y = MENU_HEADER_HEIGHT + 1 + index * FH; + lcdDrawNumber(3, y, index + 1, LEADING0|LEFT, 2); + lcdDrawText(3*FW, y, label, (sub == index ? INVERS : 0)); + if (attr && s_editMode > 0) { + s_editMode = 0; + pushMenu(tool); + } +} + +void menuRadioTools(event_t event) +{ + SIMPLE_MENU("TOOLS", menuTabGeneral, MENU_RADIO_TOOLS, HEADER_LINE + 1); + + addRadioTool(0, "Spectrum Analyser", menuRadioSpectrum, event); + +} \ No newline at end of file diff --git a/radio/src/gui/480x272/bitmapbuffer.cpp b/radio/src/gui/480x272/bitmapbuffer.cpp index 67fb457e4..ae38a8500 100644 --- a/radio/src/gui/480x272/bitmapbuffer.cpp +++ b/radio/src/gui/480x272/bitmapbuffer.cpp @@ -387,7 +387,7 @@ void BitmapBuffer::drawSizedText(coord_t x, coord_t y, const char * s, uint8_t l #if defined(BOOT) unsigned char c = *s; #else - unsigned char c = (flags & ZCHAR) ? idx2char(*s) : *s; + unsigned char c = (flags & ZCHAR) ? zchar2char(*s) : *s; #endif if (setpos) { pos = c; diff --git a/radio/src/gui/480x272/lcd.cpp b/radio/src/gui/480x272/lcd.cpp index 3d5fae358..a9f9075ab 100644 --- a/radio/src/gui/480x272/lcd.cpp +++ b/radio/src/gui/480x272/lcd.cpp @@ -130,7 +130,7 @@ int getTextWidth(const char * s, int len, LcdFlags flags) for (int i=0; len==0 || i +#include #include "opentx.h" #include "storage/modelslist.h" @@ -141,15 +142,18 @@ void onSdManagerMenu(const char * result) } else if (result == STR_FLASH_INTERNAL_MODULE) { getSelectionFullPath(lfn); - sportFlashDevice(INTERNAL_MODULE, lfn); + DeviceFirmwareUpdate device(INTERNAL_MODULE); + device.flashFile(lfn); } else if (result == STR_FLASH_EXTERNAL_MODULE) { getSelectionFullPath(lfn); - sportFlashDevice(EXTERNAL_MODULE, lfn); + DeviceFirmwareUpdate device(EXTERNAL_MODULE); + device.flashFile(lfn); } else if (result == STR_FLASH_EXTERNAL_DEVICE) { getSelectionFullPath(lfn); - sportFlashDevice(FLASHING_MODULE, lfn); + DeviceFirmwareUpdate device(FLASHING_MODULE); + device.flashFile(lfn); } #if defined(LUA) else if (result == STR_EXECUTE_FILE) { diff --git a/radio/src/io/frsky_sport.h b/radio/src/io/frsky_sport.h index e00e11784..d7d58c8b2 100644 --- a/radio/src/io/frsky_sport.h +++ b/radio/src/io/frsky_sport.h @@ -37,7 +37,6 @@ PACK(union SportTelemetryPacket bool isSportOutputBufferAvailable(); void sportOutputPushPacket(SportTelemetryPacket * packet); -void sportFlashDevice(ModuleIndex module, const char * filename); #endif #if defined(STM32) diff --git a/radio/src/storage/conversions/CMakeLists.txt b/radio/src/storage/conversions/CMakeLists.txt index 288eee42d..70e8dfccc 100644 --- a/radio/src/storage/conversions/CMakeLists.txt +++ b/radio/src/storage/conversions/CMakeLists.txt @@ -2,10 +2,14 @@ if(PCB STREQUAL X9D OR PCB STREQUAL X9DP OR PCB STREQUAL SKY9X) set(EEPROM_CONVERSIONS 216) endif() -if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X7 OR PCB STREQUAL XLITE) +if(PCB STREQUAL X7 OR PCB STREQUAL XLITE) set(EEPROM_CONVERSIONS 218) endif() +if(PCB STREQUAL X12S OR PCB STREQUAL X10) + # TODO set(EEPROM_CONVERSIONS 218) +endif() + if(EEPROM_CONVERSIONS) add_definitions(-DEEPROM_CONVERSIONS=${EEPROM_CONVERSIONS}) set(SRC diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 8fbe1be35..54531aaff 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -139,6 +139,16 @@ void delay_ms(uint32_t ms); #define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() (!IS_HORUS_PROD()) #endif +// Hardware options +PACK(typedef struct { +#if NUM_PWMSTICKS > 0 + uint8_t sticksPwmDisabled:1; +#endif + uint8_t pxx2Enabled:1; +}) HardwareOptions; + +extern HardwareOptions hardwareOptions; + // SD driver #define BLOCK_SIZE 512 /* Block Size in Bytes */ #if !defined(SIMU) || defined(SIMU_DISKIO) @@ -196,15 +206,6 @@ void SDRAM_Init(void); #define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET) #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) -PACK(typedef struct { -#if NUM_PWMSTICKS > 0 - uint8_t sticksPwmDisabled:1; -#endif - uint8_t pxx2Enabled:1; -}) HardwareOptions; - -extern HardwareOptions hardwareOptions; - #if !defined(PXX2) #define IS_PXX2_INTERNAL_ENABLED() (false) #define IS_PXX1_INTERNAL_ENABLED() (true) @@ -218,7 +219,6 @@ extern HardwareOptions hardwareOptions; #define IS_PXX1_INTERNAL_ENABLED() (true) #endif - void init_ppm(uint8_t module); void disable_ppm(uint8_t module); void init_pxx1_pulses(uint8_t module); @@ -228,6 +228,8 @@ void disable_pxx2(uint8_t module); void init_serial(uint8_t module, uint32_t baudrate, uint32_t period_half_us); void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable); void disable_serial(uint8_t module); +void intmoduleStop(); +void intmoduleSendBuffer(const uint8_t * data, uint8_t size); void intmoduleSendNextFrame(); void extmoduleSendNextFrame(); diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 6058e3271..c55b87974 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -211,7 +211,7 @@ set(GUI_SRC radio_diagkeys.cpp radio_diaganas.cpp radio_hardware.cpp - + radio_tools.cpp view_channels.cpp view_telemetry.cpp view_about.cpp From c183913f1fcaebaef2edec9fc7438461e13f3091 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 19 Mar 2019 19:55:53 +0100 Subject: [PATCH 378/446] SPORT support removed from MULTIMODULE (patent issue) --- radio/src/telemetry/multi.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index 377f092b2..6f3d0fdaa 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -109,10 +109,12 @@ static void processMultiTelemetryPaket(const uint8_t *packet) if (len >= 5) processMultiStatusPacket(data); break; + case DSMBindPacket: if (len >= 10) processDSMBindPacket(data); break; + case SpektrumTelemetry: // processSpektrumPacket expects data[0] to be the telemetry indicator 0xAA but does not check it, // just send one byte of our header instead @@ -121,33 +123,41 @@ static void processMultiTelemetryPaket(const uint8_t *packet) else TRACE("[MP] Received spektrum telemetry len %d < 17", len); break; + case FlyskyIBusTelemetry: if (len >= 28) processFlySkyPacket(data); else TRACE("[MP] Received IBUS telemetry len %d < 28", len); break; + case FrSkyHubTelemetry: if (len >= 4) frskyDProcessPacket(data); else TRACE("[MP] Received Frsky HUB telemetry len %d < 4", len); break; + +#if defined(MULTI_SPORT) case FrSkySportTelemtry: if (len >= 4) sportProcessTelemetryPacket(data); else TRACE("[MP] Received sport telemetry len %d < 4", len); break; +#endif + case InputSync: if (len >= 6) processMultiSyncPacket(data); else TRACE("[MP] Received input sync len %d < 6", len); break; + case ConfigCommand: // Just an ack to our command, ignore for now break; + case FrskySportPolling: #if defined(LUA) if (len >= 1 && outputTelemetryBufferSize > 0 && data[0] == outputTelemetryBufferTrigger) { @@ -156,6 +166,7 @@ static void processMultiTelemetryPaket(const uint8_t *packet) } #endif break; + default: TRACE("[MP] Unkown multi packet type 0x%02X, len %d", type, len); break; From 1539bdb9093ec355c1dce9b496b2985b53b34d0e Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 19 Mar 2019 20:02:32 +0100 Subject: [PATCH 379/446] Generate datacopy for @bsongis --- radio/src/storage/datacopy.cpp | 46 +++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/radio/src/storage/datacopy.cpp b/radio/src/storage/datacopy.cpp index 8b4d95cdd..ebbca4595 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 Mon Jul 2 14:20:48 2018. Do not edit this file! +//This file was auto-generated by generate_datacopy.py script on Tue Mar 19 19:58:50 2019. Do not edit this file! @@ -193,6 +193,27 @@ void copyTelemetrySensor(A * dest, B * src) dest->param = src->param; } +template +void copyTrainerModuleData(A * dest, B * src) +{ + dest->mode = src->mode; + dest->spare = src->spare; + dest->channelsStart = src->channelsStart; + dest->channelsCount = src->channelsCount; + dest->frameLength = src->frameLength; + dest->delay = src->delay; + dest->pulsePol = src->pulsePol; +} + +template +void copyReceiverData(A * dest, B * src) +{ + dest->used = src->used; + dest->telemetry = src->telemetry; + dest->dirty = src->dirty; + memcpy(dest->name, src->name, sizeof(dest->name)); +} + template void copyModuleData(A * dest, B * src) { @@ -200,10 +221,7 @@ void copyModuleData(A * dest, B * src) dest->rfProtocol = src->rfProtocol; dest->channelsStart = src->channelsStart; dest->channelsCount = src->channelsCount; - dest->failsafeMode = src->failsafeMode; - dest->subType = src->subType; - dest->invertedSerial = src->invertedSerial; - memcpy(dest->failsafeChannels, src->failsafeChannels, sizeof(dest->failsafeChannels)); + copyModuleData_r9m(&dest->r9m, &src->r9m); copyModuleData_ppm(&dest->ppm, &src->ppm); } @@ -266,9 +284,15 @@ void copyModelData(A * dest, B * src) for (int i=0; i<9; i++) { copyGVarData(&dest->gvars[i], &src->gvars[i]); } - for (int i=0; i<3; i++) { + for (int i=0; i<2; i++) { copyModuleData(&dest->moduleData[i], &src->moduleData[i]); } + for (int i=0; i<10; i++) { + copyReceiverData(&dest->receiverData[i], &src->receiverData[i]); + } + memcpy(dest->failsafeChannels, src->failsafeChannels, sizeof(dest->failsafeChannels)); + copyTrainerModuleData(&dest->trainerData, &src->trainerData); + memcpy(dest->modelRegistrationID, src->modelRegistrationID, sizeof(dest->modelRegistrationID)); } template @@ -306,6 +330,7 @@ void copyRadioData(A * dest, B * src) for (int i=0; i<13; i++) { copyCalibData(&dest->calib[i], &src->calib[i]); } + dest->spareRadio = src->spareRadio; dest->stickMode = src->stickMode; dest->telemetryBaudrate = src->telemetryBaudrate; dest->splashSpares = src->splashSpares; @@ -316,6 +341,7 @@ void copyRadioData(A * dest, B * src) dest->slidersConfig = src->slidersConfig; dest->switchConfig = src->switchConfig; dest->potsConfig = src->potsConfig; + memcpy(dest->ownerRegistrationID, src->ownerRegistrationID, sizeof(dest->ownerRegistrationID)); } template @@ -326,6 +352,14 @@ void copyCustomFunctionData_all(A * dest, B * src) dest->param = src->param; } +template +void copyModuleData_r9m(A * dest, B * src) +{ + dest->failsafeMode = src->failsafeMode; + dest->freq = src->freq; + dest->region = src->region; +} + template void copyModuleData_ppm(A * dest, B * src) { From 775ac40aaa6f4314b48d149cccfab3e24f6fc267 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 08:46:47 +0100 Subject: [PATCH 380/446] Powermeter added --- radio/src/gui/128x64/menus.h | 3 +- radio/src/gui/212x64/menu_radio.cpp | 1 + radio/src/gui/212x64/menus.h | 4 ++ radio/src/gui/common/stdlcd/CMakeLists.txt | 3 + .../gui/common/stdlcd/radio_power_meter.cpp | 64 +++++++++++++++++++ .../stdlcd/radio_spectrum_analyser.cpp} | 12 ++-- .../{128x64 => common/stdlcd}/radio_tools.cpp | 6 +- radio/src/opentx.h | 13 +++- radio/src/pulses/pulses.h | 10 +-- radio/src/pulses/pxx2.cpp | 31 +++++++-- radio/src/pulses/pxx2.h | 2 + radio/src/targets/taranis/CMakeLists.txt | 10 --- radio/src/telemetry/frsky_pxx2.cpp | 28 +++++--- 13 files changed, 143 insertions(+), 44 deletions(-) create mode 100644 radio/src/gui/common/stdlcd/radio_power_meter.cpp rename radio/src/gui/{128x64/radio_spectrum.cpp => common/stdlcd/radio_spectrum_analyser.cpp} (80%) rename radio/src/gui/{128x64 => common/stdlcd}/radio_tools.cpp (89%) diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index 3c3308b06..b8890dc0d 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -99,7 +99,8 @@ void menuRadioDiagKeys(event_t event); void menuRadioDiagAnalogs(event_t event); void menuRadioHardware(event_t event); void menuRadioTools(event_t event); -void menuRadioSpectrum(event_t event); +void menuRadioSpectrumAnalyser(event_t event); +void menuRadioPowerMeter(event_t event); void menuRadioCalibration(event_t event); static const MenuHandlerFunc menuTabGeneral[] = { diff --git a/radio/src/gui/212x64/menu_radio.cpp b/radio/src/gui/212x64/menu_radio.cpp index e0452d8ec..c03ce1851 100644 --- a/radio/src/gui/212x64/menu_radio.cpp +++ b/radio/src/gui/212x64/menu_radio.cpp @@ -23,6 +23,7 @@ const MenuHandlerFunc menuTabGeneral[] = { menuRadioSetup, menuRadioSdManager, + menuRadioTools, menuRadioSpecialFunctions, menuRadioTrainer, menuRadioVersion, diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h index e47fcd04b..3acaf25c3 100644 --- a/radio/src/gui/212x64/menus.h +++ b/radio/src/gui/212x64/menus.h @@ -73,6 +73,7 @@ void menuTraceBuffer(event_t event); enum MenuRadioIndexes { MENU_RADIO_SETUP, MENU_RADIO_SD_MANAGER, + MENU_RADIO_TOOLS, MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, MENU_RADIO_VERSION, @@ -88,7 +89,10 @@ void menuRadioVersion(event_t event); void menuRadioDiagKeys(event_t event); void menuRadioDiagAnalogs(event_t event); void menuRadioHardware(event_t event); +void menuRadioTools(event_t event); void menuRadioCalibration(event_t event); +void menuRadioSpectrumAnalyser(event_t event); +void menuRadioPowerMeter(event_t event); extern const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT]; diff --git a/radio/src/gui/common/stdlcd/CMakeLists.txt b/radio/src/gui/common/stdlcd/CMakeLists.txt index a9056719f..fec9462fd 100644 --- a/radio/src/gui/common/stdlcd/CMakeLists.txt +++ b/radio/src/gui/common/stdlcd/CMakeLists.txt @@ -28,5 +28,8 @@ if(SDCARD) set(GUI_SRC ${GUI_SRC} ../common/stdlcd/radio_sdmanager.cpp + ../common/stdlcd/radio_tools.cpp + ../common/stdlcd/radio_spectrum_analyser.cpp + ../common/stdlcd/radio_power_meter.cpp ) endif() diff --git a/radio/src/gui/common/stdlcd/radio_power_meter.cpp b/radio/src/gui/common/stdlcd/radio_power_meter.cpp new file mode 100644 index 000000000..edc7e2474 --- /dev/null +++ b/radio/src/gui/common/stdlcd/radio_power_meter.cpp @@ -0,0 +1,64 @@ +/* + * 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 +#include "opentx.h" + +void menuRadioPowerMeter(event_t event) +{ + SIMPLE_SUBMENU("POWER METER", 1); + + if (menuEvent) { + INTERNAL_MODULE_OFF(); + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + /* wait 500ms off */ + watchdogSuspend(500); + RTOS_WAIT_MS(500); + INTERNAL_MODULE_ON(); + } + else if (event == EVT_ENTRY) { + memclear(&reusableBuffer.powerMeter, sizeof(reusableBuffer.powerMeter)); + reusableBuffer.powerMeter.freq = 2400; + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_POWER_METER; + } + + coord_t y = MENU_HEADER_HEIGHT + 1 + FH; + LcdFlags attr = (menuVerticalPosition - HEADER_LINE == 0 ? INVERS : 0); + lcdDrawText(0, y, "Freq."); + lcdDrawNumber(8*FW, y, reusableBuffer.powerMeter.freq, LEFT|attr|(s_editMode > 0 ? BLINK : 0)); + lcdDrawText(lcdNextPos, y, "MHz"); + if (attr) { + CHECK_INCDEC_MODELVAR(event, reusableBuffer.powerMeter.freq, 2300, 2500); + if (checkIncDec_Ret) { + reusableBuffer.powerMeter.power = 0; + reusableBuffer.powerMeter.peak = 0; + } + } + + y += FH + 1; + lcdDrawText(0, y, "Power"); + lcdDrawNumber(8*FW, y, reusableBuffer.powerMeter.power, LEFT); + lcdDrawText(lcdNextPos, y, "dBm"); + + y += FH + 1; + lcdDrawText(0, y, "Peak"); + lcdDrawNumber(8*FW, y, reusableBuffer.powerMeter.peak, LEFT); + lcdDrawText(lcdNextPos, y, "dBm"); +} diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp similarity index 80% rename from radio/src/gui/128x64/radio_spectrum.cpp rename to radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp index 2fab450da..258b3a067 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp @@ -20,7 +20,7 @@ #include "opentx.h" -void menuRadioSpectrum(event_t event) +void menuRadioSpectrumAnalyser(event_t event) { SIMPLE_SUBMENU("SPECTRUM ANALYSER", 1); @@ -33,14 +33,14 @@ void menuRadioSpectrum(event_t event) INTERNAL_MODULE_ON(); } else if (event == EVT_ENTRY) { - memclear(reusableBuffer.spectrum.bars, sizeof(reusableBuffer.spectrum.bars)); + memclear(reusableBuffer.spectrumAnalyser.bars, sizeof(reusableBuffer.spectrumAnalyser.bars)); moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_SPECTRUM_ANALYSER; } uint8_t peak_y = 1; uint8_t peak_x = 0; for (uint8_t i=0; i(reusableBuffer.spectrum.bars[i] >> 1, 128); + uint8_t h = min(reusableBuffer.spectrumAnalyser.bars[i] >> 1, 128); if (h > peak_y) { peak_x = i; peak_y = h; @@ -49,14 +49,14 @@ void menuRadioSpectrum(event_t event) } lcdDrawText(1, 10, "F:", 0); - lcdDrawNumber(lcdLastRightPos + 2, 10, reusableBuffer.spectrum.fq/10000000,PREC2); + lcdDrawNumber(lcdLastRightPos + 2, 10, reusableBuffer.spectrumAnalyser.freq / 10000000, PREC2); lcdDrawText(lcdLastRightPos + 2, 10, "GHz", 0); lcdDrawText(lcdLastRightPos + 5, 10, "S:", 0); - lcdDrawNumber(lcdLastRightPos + 2, 10, reusableBuffer.spectrum.span/1000000, 0); + lcdDrawNumber(lcdLastRightPos + 2, 10, reusableBuffer.spectrumAnalyser.span/1000000, 0); lcdDrawText(lcdLastRightPos + 2, 10, "MHz", 0); int8_t y = max(FH, LCD_H - peak_y - FH); - lcdDrawNumber(min(100, peak_x), y, ((reusableBuffer.spectrum.fq - reusableBuffer.spectrum.span / 2) + peak_x * (reusableBuffer.spectrum.span / 128)) / 1000000, TINSIZE); + lcdDrawNumber(min(100, peak_x), y, ((reusableBuffer.spectrumAnalyser.freq - reusableBuffer.spectrumAnalyser.span / 2) + peak_x * (reusableBuffer.spectrumAnalyser.span / 128)) / 1000000, TINSIZE); lcdDrawText(lcdLastRightPos, y, "M", TINSIZE); } diff --git a/radio/src/gui/128x64/radio_tools.cpp b/radio/src/gui/common/stdlcd/radio_tools.cpp similarity index 89% rename from radio/src/gui/128x64/radio_tools.cpp rename to radio/src/gui/common/stdlcd/radio_tools.cpp index 55e772237..e8958af55 100644 --- a/radio/src/gui/128x64/radio_tools.cpp +++ b/radio/src/gui/common/stdlcd/radio_tools.cpp @@ -35,8 +35,8 @@ void addRadioTool(uint8_t index, const char * label, void (* tool)(event_t event void menuRadioTools(event_t event) { - SIMPLE_MENU("TOOLS", menuTabGeneral, MENU_RADIO_TOOLS, HEADER_LINE + 1); - - addRadioTool(0, "Spectrum Analyser", menuRadioSpectrum, event); + SIMPLE_MENU("TOOLS", menuTabGeneral, MENU_RADIO_TOOLS, HEADER_LINE + 2); + addRadioTool(0, "Spectrum Analyser", menuRadioSpectrumAnalyser, event); + addRadioTool(1, "Power Meter", menuRadioPowerMeter, event); } \ No newline at end of file diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 4d4191b60..c3c82927e 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1200,11 +1200,18 @@ union ReusableBuffer struct { - uint8_t bars[128]; - uint32_t fq; + uint8_t bars[LCD_W]; + uint32_t freq; uint32_t span; uint32_t step; - } spectrum; + } spectrumAnalyser; + + struct + { + uint32_t freq; + uint32_t power; + uint32_t peak; + } powerMeter; struct { diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 3308f30bf..37a6d35b3 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -38,12 +38,6 @@ extern uint8_t dsm2BindTimer; #endif -#if defined(PXX) - #define IS_PXX_PROTOCOL(protocol) (protocol==PROTO_PXX) -#else - #define IS_PXX_PROTOCOL(protocol) (0) -#endif - #if defined(DSM2) #define IS_DSM2_PROTOCOL(protocol) (protocol>=PROTOCOL_CHANNELS_DSM2_LP45 && protocol<=PROTOCOL_CHANNELS_DSM2_DSMX) #else @@ -73,6 +67,7 @@ enum ModuleSettingsMode { MODULE_MODE_NORMAL, MODULE_MODE_SPECTRUM_ANALYSER, + MODULE_MODE_POWER_METER, MODULE_MODE_GET_HARDWARE_INFO, MODULE_MODE_RECEIVER_SETTINGS, MODULE_MODE_BEEP_FIRST, @@ -84,8 +79,9 @@ enum ModuleSettingsMode PACK(struct ModuleSettings { uint8_t protocol:4; + uint8_t mode:4; uint8_t paused:1; - uint8_t mode:3; + uint8_t spare:7; uint16_t counter; }); diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 286497bb0..50e7a96f7 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -212,14 +212,30 @@ void Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) addFrameType(PXX2_TYPE_C_POWER_METER, PXX2_TYPE_ID_SPECTRUM); Pxx2Transport::addByte(0x00); - reusableBuffer.spectrum.fq = 2440000000; // 2440MHz - Pxx2Transport::addWord(reusableBuffer.spectrum.fq); + reusableBuffer.spectrumAnalyser.freq = 2440000000; // 2440MHz + Pxx2Transport::addWord(reusableBuffer.spectrumAnalyser.freq); - reusableBuffer.spectrum.span = 40000000; // 40MHz - Pxx2Transport::addWord(reusableBuffer.spectrum.span); + reusableBuffer.spectrumAnalyser.span = 40000000; // 40MHz + Pxx2Transport::addWord(reusableBuffer.spectrumAnalyser.span); - reusableBuffer.spectrum.step = 100000; // 100KHz - Pxx2Transport::addWord(reusableBuffer.spectrum.step); + reusableBuffer.spectrumAnalyser.step = 100000; // 100KHz + Pxx2Transport::addWord(reusableBuffer.spectrumAnalyser.step); +} + + +void Pxx2Pulses::setupPowerMeter(uint8_t module) +{ + if (moduleSettings[module].counter > 1000) { + moduleSettings[module].counter = 1002; + return; + } + + moduleSettings[module].counter = 1002; + + addFrameType(PXX2_TYPE_C_POWER_METER, PXX2_TYPE_ID_POWER_METER); + Pxx2Transport::addByte(0x00); + + Pxx2Transport::addWord(reusableBuffer.powerMeter.freq); } void Pxx2Pulses::setupShareMode(uint8_t module) @@ -248,6 +264,9 @@ void Pxx2Pulses::setupFrame(uint8_t module) case MODULE_MODE_SPECTRUM_ANALYSER: setupSpectrumAnalyser(module); break; + case MODULE_MODE_POWER_METER: + setupPowerMeter(module); + break; case MODULE_MODE_SHARE: setupShareMode(module); break; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index e9a18a47b..5cc3e2581 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -129,6 +129,8 @@ class Pxx2Pulses: public PxxPulses { void setupSpectrumAnalyser(uint8_t module); + void setupPowerMeter(uint8_t module); + void addHead() { // send 7E, do not CRC diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index c55b87974..fd81a338c 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -140,7 +140,6 @@ elseif(PCB STREQUAL XLITES) set(FONTS_TARGET 9x_fonts_1bit) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) - set(RADIO_SPECTRUM YES) set(STATUS_LEDS YES) endif() @@ -211,7 +210,6 @@ set(GUI_SRC radio_diagkeys.cpp radio_diaganas.cpp radio_hardware.cpp - radio_tools.cpp view_channels.cpp view_telemetry.cpp view_about.cpp @@ -219,14 +217,6 @@ set(GUI_SRC ../screenshot.cpp ) -if(RADIO_SPECTRUM) - add_definitions(-DRADIO_SPECTRUM) - set(GUI_SRC - ${GUI_SRC} - radio_spectrum.cpp - ) -endif() - if(STATUS_LEDS) set(LED_DRIVER led_driver.cpp) endif() diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index d78af961c..e16652ee5 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -151,7 +151,7 @@ void processTelemetryFrame(uint8_t module, uint8_t * frame) sportProcessTelemetryPacketWithoutCrc(&frame[3]); } -void processSpectrumFrame(uint8_t module, uint8_t * frame) +void processSpectrumAnalyserFrame(uint8_t module, uint8_t * frame) { if (moduleSettings[module].mode != MODULE_MODE_SPECTRUM_ANALYSER) { return; @@ -170,10 +170,22 @@ void processSpectrumFrame(uint8_t module, uint8_t * frame) // TRACE("Fq=%u, Pw=%d, X=%d, Y=%d", *frequency, int32_t(*power), D * 128 / 40000000, int32_t(127 + *power)); uint8_t x = D * 128 / 40000000; - reusableBuffer.spectrum.bars[x] = 127 + *power; + reusableBuffer.spectrumAnalyser.bars[x] = 127 + *power; } -void processRadioFrame(uint8_t module, uint8_t * frame) +void processPowerMeterFrame(uint8_t module, uint8_t * frame) +{ + if (moduleSettings[module].mode != MODULE_MODE_POWER_METER) { + return; + } + + reusableBuffer.powerMeter.power = *((uint16_t *)&frame[8]); + if (reusableBuffer.powerMeter.power > reusableBuffer.powerMeter.peak) { + reusableBuffer.powerMeter.peak = reusableBuffer.powerMeter.power; + } +} + +void processModuleFrame(uint8_t module, uint8_t *frame) { switch (frame[2]) { case PXX2_TYPE_ID_HW_INFO: @@ -198,15 +210,15 @@ void processRadioFrame(uint8_t module, uint8_t * frame) } } -void processPowerMeterFrame(uint8_t module, uint8_t * frame) +void processToolsFrame(uint8_t module, uint8_t * frame) { switch (frame[2]) { case PXX2_TYPE_ID_POWER_METER: - // TODO + processPowerMeterFrame(module, frame); break; case PXX2_TYPE_ID_SPECTRUM: - processSpectrumFrame(module, frame); + processSpectrumAnalyserFrame(module, frame); break; } } @@ -215,11 +227,11 @@ void processPXX2TelemetryFrame(uint8_t module, uint8_t * frame) { switch (frame[1]) { case PXX2_TYPE_C_MODULE: - processRadioFrame(module, frame); + processModuleFrame(module, frame); break; case PXX2_TYPE_C_POWER_METER: - processPowerMeterFrame(module, frame); + processToolsFrame(module, frame); break; default: From 933f323a00047c6fac30dabaa32be812e04e8a2a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 08:59:29 +0100 Subject: [PATCH 381/446] Fixes --- radio/src/gui/212x64/menu_radio.cpp | 4 ++-- radio/src/gui/212x64/menus.h | 2 +- radio/src/gui/common/stdlcd/radio_power_meter.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/212x64/menu_radio.cpp b/radio/src/gui/212x64/menu_radio.cpp index c03ce1851..127b8deac 100644 --- a/radio/src/gui/212x64/menu_radio.cpp +++ b/radio/src/gui/212x64/menu_radio.cpp @@ -26,8 +26,8 @@ const MenuHandlerFunc menuTabGeneral[] = { menuRadioTools, menuRadioSpecialFunctions, menuRadioTrainer, - menuRadioVersion, - menuRadioHardware + menuRadioHardware, + menuRadioVersion }; void menuRadioSpecialFunctions(event_t event) diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h index 3acaf25c3..f8ed87b9c 100644 --- a/radio/src/gui/212x64/menus.h +++ b/radio/src/gui/212x64/menus.h @@ -76,8 +76,8 @@ enum MenuRadioIndexes { MENU_RADIO_TOOLS, MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, - MENU_RADIO_VERSION, MENU_RADIO_HARDWARE, + MENU_RADIO_VERSION, MENU_RADIO_PAGES_COUNT }; diff --git a/radio/src/gui/common/stdlcd/radio_power_meter.cpp b/radio/src/gui/common/stdlcd/radio_power_meter.cpp index edc7e2474..ac870fa6b 100644 --- a/radio/src/gui/common/stdlcd/radio_power_meter.cpp +++ b/radio/src/gui/common/stdlcd/radio_power_meter.cpp @@ -40,7 +40,7 @@ void menuRadioPowerMeter(event_t event) } coord_t y = MENU_HEADER_HEIGHT + 1 + FH; - LcdFlags attr = (menuVerticalPosition - HEADER_LINE == 0 ? INVERS : 0); + LcdFlags attr = (menuVerticalPosition == 0 ? INVERS : 0); lcdDrawText(0, y, "Freq."); lcdDrawNumber(8*FW, y, reusableBuffer.powerMeter.freq, LEFT|attr|(s_editMode > 0 ? BLINK : 0)); lcdDrawText(lcdNextPos, y, "MHz"); From 45500b062d72256878995f77ce31f1916376223a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 09:18:15 +0100 Subject: [PATCH 382/446] Fixes --- radio/src/gui/common/stdlcd/radio_power_meter.cpp | 4 ++-- radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/common/stdlcd/radio_power_meter.cpp b/radio/src/gui/common/stdlcd/radio_power_meter.cpp index ac870fa6b..ca641874f 100644 --- a/radio/src/gui/common/stdlcd/radio_power_meter.cpp +++ b/radio/src/gui/common/stdlcd/radio_power_meter.cpp @@ -26,12 +26,12 @@ void menuRadioPowerMeter(event_t event) SIMPLE_SUBMENU("POWER METER", 1); if (menuEvent) { - INTERNAL_MODULE_OFF(); + pausePulses(); moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; /* wait 500ms off */ watchdogSuspend(500); RTOS_WAIT_MS(500); - INTERNAL_MODULE_ON(); + resumePulses(); } else if (event == EVT_ENTRY) { memclear(&reusableBuffer.powerMeter, sizeof(reusableBuffer.powerMeter)); diff --git a/radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp b/radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp index 258b3a067..b8ab58cbf 100644 --- a/radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp +++ b/radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp @@ -25,12 +25,12 @@ void menuRadioSpectrumAnalyser(event_t event) SIMPLE_SUBMENU("SPECTRUM ANALYSER", 1); if (menuEvent) { - INTERNAL_MODULE_OFF(); + pausePulses(); moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; /* wait 500ms off */ watchdogSuspend(500); RTOS_WAIT_MS(500); - INTERNAL_MODULE_ON(); + resumePulses(); } else if (event == EVT_ENTRY) { memclear(reusableBuffer.spectrumAnalyser.bars, sizeof(reusableBuffer.spectrumAnalyser.bars)); From 6277717c16b3535b0da93f59ebedf1e147ddd236 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 09:53:14 +0100 Subject: [PATCH 383/446] Powermeter fixes --- radio/src/gui/common/stdlcd/radio_power_meter.cpp | 12 ++++++++---- radio/src/opentx.h | 4 ++-- radio/src/pulses/pulses.cpp | 2 +- radio/src/telemetry/frsky_pxx2.cpp | 4 ++-- radio/src/telemetry/telemetry.cpp | 4 ++-- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/radio/src/gui/common/stdlcd/radio_power_meter.cpp b/radio/src/gui/common/stdlcd/radio_power_meter.cpp index ca641874f..fbe5f96ab 100644 --- a/radio/src/gui/common/stdlcd/radio_power_meter.cpp +++ b/radio/src/gui/common/stdlcd/radio_power_meter.cpp @@ -54,11 +54,15 @@ void menuRadioPowerMeter(event_t event) y += FH + 1; lcdDrawText(0, y, "Power"); - lcdDrawNumber(8*FW, y, reusableBuffer.powerMeter.power, LEFT); - lcdDrawText(lcdNextPos, y, "dBm"); + if (reusableBuffer.powerMeter.power) { + lcdDrawNumber(8 * FW, y, reusableBuffer.powerMeter.power, LEFT | PREC2); + lcdDrawText(lcdNextPos, y, "dBm"); + } y += FH + 1; lcdDrawText(0, y, "Peak"); - lcdDrawNumber(8*FW, y, reusableBuffer.powerMeter.peak, LEFT); - lcdDrawText(lcdNextPos, y, "dBm"); + if (reusableBuffer.powerMeter.peak) { + lcdDrawNumber(8 * FW, y, reusableBuffer.powerMeter.peak, LEFT | PREC2); + lcdDrawText(lcdNextPos, y, "dBm"); + } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index c3c82927e..27fcec425 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1209,8 +1209,8 @@ union ReusableBuffer struct { uint32_t freq; - uint32_t power; - uint32_t peak; + int16_t power; + int16_t peak; } powerMeter; struct diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index f5f1f50c6..511b1710a 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -251,7 +251,7 @@ void setupPulsesInternalModule(uint8_t protocol) #if defined(PXX2) case PROTOCOL_CHANNELS_PXX2: intmodulePulsesData.pxx2.setupFrame(INTERNAL_MODULE); - scheduleNextMixerCalculation(INTERNAL_MODULE, moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_SPECTRUM_ANALYSER ? 1 : PXX2_PERIOD); + scheduleNextMixerCalculation(INTERNAL_MODULE, moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_SPECTRUM_ANALYSER || moduleSettings[INTERNAL_MODULE].mode == MODULE_MODE_POWER_METER ? 1 : PXX2_PERIOD); break; #endif diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index e16652ee5..c65fa9fad 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -179,8 +179,8 @@ void processPowerMeterFrame(uint8_t module, uint8_t * frame) return; } - reusableBuffer.powerMeter.power = *((uint16_t *)&frame[8]); - if (reusableBuffer.powerMeter.power > reusableBuffer.powerMeter.peak) { + reusableBuffer.powerMeter.power = *((int16_t *)&frame[8]); + if (!reusableBuffer.powerMeter.peak || reusableBuffer.powerMeter.power > reusableBuffer.powerMeter.peak) { reusableBuffer.powerMeter.peak = reusableBuffer.powerMeter.power; } } diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 6d4f97eb8..a1bd14305 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -91,13 +91,13 @@ void telemetryWakeup() uint8_t frame[PXX2_FRAME_MAXLENGTH]; #if defined(INTMODULE_USART) - if (intmoduleFifo.getFrame(frame)) { + while (intmoduleFifo.getFrame(frame)) { processPXX2TelemetryFrame(INTERNAL_MODULE, frame); } #endif #if defined(EXTMODULE_USART) - if (extmoduleFifo.getFrame(frame)) { + while (extmoduleFifo.getFrame(frame)) { processPXX2TelemetryFrame(EXTERNAL_MODULE, frame); } #endif From 098727ffc5a4d45b42902d2d8467fed33cafbd99 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 10:14:15 +0100 Subject: [PATCH 384/446] Conversion tests were inverted --- radio/src/storage/conversions/CMakeLists.txt | 4 ++-- radio/src/storage/conversions/conversions.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/radio/src/storage/conversions/CMakeLists.txt b/radio/src/storage/conversions/CMakeLists.txt index 70e8dfccc..258b89431 100644 --- a/radio/src/storage/conversions/CMakeLists.txt +++ b/radio/src/storage/conversions/CMakeLists.txt @@ -18,14 +18,14 @@ if(EEPROM_CONVERSIONS) ) endif() -if(EEPROM_CONVERSIONS GREATER 215) +if(EEPROM_CONVERSIONS LESS 218) set(SRC ${SRC} storage/conversions/conversions_216_218.cpp ) endif() -if(EEPROM_CONVERSIONS GREATER 217) +if(EEPROM_CONVERSIONS LESS 219) set(SRC ${SRC} storage/conversions/conversions_218_219.cpp diff --git a/radio/src/storage/conversions/conversions.cpp b/radio/src/storage/conversions/conversions.cpp index ac89a2241..dc086f9c9 100644 --- a/radio/src/storage/conversions/conversions.cpp +++ b/radio/src/storage/conversions/conversions.cpp @@ -25,21 +25,21 @@ void convertModelData(int id, int version) { eeLoadModelData(id); -#if EEPROM_CONVERSIONS >= 216 +#if EEPROM_CONVERSIONS < 217 if (version == 216) { version = 217; convertModelData_216_to_217(g_model); } #endif -#if EEPROM_CONVERSIONS >= 217 +#if EEPROM_CONVERSIONS < 218 if (version == 217) { version = 218; convertModelData_217_to_218(g_model); } #endif -#if EEPROM_CONVERSIONS >= 218 +#if EEPROM_CONVERSIONS < 219 if (version == 218) { version = 219; convertModelData_218_to_219(g_model); @@ -89,21 +89,21 @@ bool eeConvert() eeLoadGeneralSettingsData(); int version = conversionVersionStart; -#if EEPROM_CONVERSIONS >= 216 +#if EEPROM_CONVERSIONS < 217 if (version == 216) { version = 217; convertRadioData_216_to_217(g_eeGeneral); } #endif -#if EEPROM_CONVERSIONS >= 217 +#if EEPROM_CONVERSIONS < 218 if (version == 217) { version = 218; convertRadioData_217_to_218(g_eeGeneral); } #endif -#if EEPROM_CONVERSIONS >= 218 +#if EEPROM_CONVERSIONS < 219 if (version == 218) { version = 219; // no conversion needed for now From e0e6e9f545fd3c01e670b61bf197a83e2a6720a2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 20 Mar 2019 10:19:34 +0100 Subject: [PATCH 385/446] More work for Travis --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index e931e5386..4b7b99874 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,8 +23,10 @@ env: # - FLAVOR=AR9X # - FLAVOR=SKY9X # - FLAVOR=9XRPRO + - FLAVOR=X3 - FLAVOR=X7 - FLAVOR=XLITE + - FLAVOR=XLITES - FLAVOR=X9 # - FLAVOR=X9D # - FLAVOR=X9D+ From 683a737c999f8271357c0e34915e92ab2c6826d4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 20 Mar 2019 11:38:34 +0100 Subject: [PATCH 386/446] More fixes for Travis --- tools/commit-tests.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index 70d54f240..51d4d235b 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -87,6 +87,15 @@ if [[ " 9XRPRO ARM9X ALL " =~ " ${FLAVOR} " ]] ; then make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} fi +if [[ " X3 ALL " =~ " ${FLAVOR} " ]] ; then + # OpenTX on X3 + rm -rf * + cmake ${COMMON_OPTIONS} -DPCB=X3 -DHELI=YES -DGVARS=YES ${SRCDIR} + make -j${CORES} ${FIRMARE_TARGET} + make -j${CORES} libsimulator + make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} +fi + if [[ " X7 ALL " =~ " ${FLAVOR} " ]] ; then # OpenTX on X7 rm -rf * @@ -105,6 +114,15 @@ if [[ " XLITE ALL " =~ " ${FLAVOR} " ]] ; then make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} fi +if [[ " XLITES ALL " =~ " ${FLAVOR} " ]] ; then + # OpenTX on X-Lites + rm -rf * + cmake ${COMMON_OPTIONS} -DPCB=XLITES -DHELI=YES -DGVARS=YES ${SRCDIR} + make -j${CORES} ${FIRMARE_TARGET} + make -j${CORES} libsimulator + make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} +fi + if [[ " X9D X9 ALL " =~ " ${FLAVOR} " ]] ; then # OpenTX on X9D rm -rf * From 04ba9e5c68c1aa616971985035415508dd29c74b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 16:32:58 +0100 Subject: [PATCH 387/446] Compilation fixes --- radio/src/dataconstants.h | 5 ++- radio/src/datastructs.h | 4 +- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/gui/480x272/radio_sdmanager.cpp | 2 +- radio/src/gui/common/stdlcd/CMakeLists.txt | 7 ++++ .../src/gui/common/stdlcd/radio_sdmanager.cpp | 2 +- radio/src/gui/common/stdlcd/radio_tools.cpp | 2 + radio/src/gui/gui_common.h | 2 +- radio/src/gui/gui_common_arm.cpp | 9 +---- radio/src/io/frsky_device_firmware_update.cpp | 12 +++--- radio/src/io/frsky_sport.cpp | 13 ++++--- radio/src/opentx.cpp | 2 + radio/src/pulses/dsm2.cpp | 2 +- radio/src/pulses/modules.h | 7 ---- radio/src/pulses/ppm.cpp | 2 +- radio/src/pulses/pulses.cpp | 6 ++- .../conversions/conversions_216_218.cpp | 4 +- .../conversions/conversions_218_219.cpp | 4 ++ .../src/storage/conversions/datastructs_218.h | 2 +- radio/src/storage/eeprom_raw.cpp | 3 +- radio/src/targets/common/arm/CMakeLists.txt | 1 - .../arm/stm32/intmodule_serial_driver.cpp | 6 +++ radio/src/targets/horus/CMakeLists.txt | 1 + radio/src/targets/horus/telemetry_driver.cpp | 8 ++-- radio/src/targets/sky9x/board.h | 1 + radio/src/targets/sky9x/pulses_driver.cpp | 4 ++ radio/src/targets/taranis/CMakeLists.txt | 5 +++ .../src/targets/taranis/telemetry_driver.cpp | 7 ++-- radio/src/tasks.cpp | 4 +- radio/src/telemetry/telemetry.cpp | 10 ++--- radio/src/telemetry/telemetry.h | 39 +++++++++++++------ radio/src/translations/en.h.txt | 3 +- 32 files changed, 110 insertions(+), 71 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index b1b493aea..e86acf899 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -190,7 +190,7 @@ enum BeeperMode { enum ModuleIndex { INTERNAL_MODULE, EXTERNAL_MODULE, - FLASHING_MODULE, + SPORT_MODULE, }; enum TrainerMode { TRAINER_MODE_MASTER_TRAINER_JACK, @@ -208,7 +208,8 @@ enum BeeperMode { #elif defined(PCBSKY9X) enum ModuleIndex { EXTERNAL_MODULE, - EXTRA_MODULE + EXTRA_MODULE, + SPORT_MODULE }; #endif diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 9734656e0..f097f90c2 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -944,8 +944,8 @@ static inline void check_struct() CHKSIZE(RadioData, 880); CHKSIZE(ModelData, 6422); #elif defined(PCBSKY9X) - CHKSIZE(RadioData, 727); - CHKSIZE(ModelData, 5188); + CHKSIZE(RadioData, 735); + CHKSIZE(ModelData, 5101); #elif defined(PCBHORUS) CHKSIZE(RadioData, 855); CHKSIZE(ModelData, 9771); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index d7b79488e..645d31445 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1181,7 +1181,7 @@ void menuModelSetup(event_t event) CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.channelsStart, 32-8-moduleData.channelsCount); break; case 1: - CHECK_INCDEC_MODELVAR_CHECK(event, moduleData.channelsCount, -4, min(maxModuleChannels_M8(moduleIdx), 32-8-moduleData.channelsStart), isInternalModuleChannelCountAvailable); + CHECK_INCDEC_MODELVAR_CHECK(event, moduleData.channelsCount, -4, min(maxModuleChannels_M8(moduleIdx), 32-8-moduleData.channelsStart), moduleData.type == MODULE_TYPE_XJT2 ? isPXX2ChannelsCountAllowed : nullptr); if ((k == ITEM_MODEL_EXTERNAL_MODULE_CHANNELS && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM)) { SET_DEFAULT_PPM_FRAME_LENGTH(moduleIdx); } diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index 7bbe01c4f..711ffdfb0 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -152,7 +152,7 @@ void onSdManagerMenu(const char * result) } else if (result == STR_FLASH_EXTERNAL_DEVICE) { getSelectionFullPath(lfn); - DeviceFirmwareUpdate device(FLASHING_MODULE); + DeviceFirmwareUpdate device(SPORT_MODULE); device.flashFile(lfn); } #if defined(LUA) diff --git a/radio/src/gui/common/stdlcd/CMakeLists.txt b/radio/src/gui/common/stdlcd/CMakeLists.txt index fec9462fd..26e29bbda 100644 --- a/radio/src/gui/common/stdlcd/CMakeLists.txt +++ b/radio/src/gui/common/stdlcd/CMakeLists.txt @@ -29,7 +29,14 @@ if(SDCARD) ${GUI_SRC} ../common/stdlcd/radio_sdmanager.cpp ../common/stdlcd/radio_tools.cpp + ) +endif() + +if(PXX2) + set(GUI_SRC + ${GUI_SRC} ../common/stdlcd/radio_spectrum_analyser.cpp ../common/stdlcd/radio_power_meter.cpp ) endif() + diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index 78a3f7550..a3699fc03 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -153,7 +153,7 @@ void onSdManagerMenu(const char * result) } else if (result == STR_FLASH_EXTERNAL_DEVICE) { getSelectionFullPath(lfn); - DeviceFirmwareUpdate device(FLASHING_MODULE); + DeviceFirmwareUpdate device(SPORT_MODULE); device.flashFile(lfn); } #endif diff --git a/radio/src/gui/common/stdlcd/radio_tools.cpp b/radio/src/gui/common/stdlcd/radio_tools.cpp index e8958af55..25efb65ed 100644 --- a/radio/src/gui/common/stdlcd/radio_tools.cpp +++ b/radio/src/gui/common/stdlcd/radio_tools.cpp @@ -37,6 +37,8 @@ void menuRadioTools(event_t event) { SIMPLE_MENU("TOOLS", menuTabGeneral, MENU_RADIO_TOOLS, HEADER_LINE + 2); +#if defined(PXX2) addRadioTool(0, "Spectrum Analyser", menuRadioSpectrumAnalyser, event); addRadioTool(1, "Power Meter", menuRadioPowerMeter, event); +#endif } \ No newline at end of file diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 7cefb8159..8a1b5dccd 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -56,7 +56,7 @@ bool isSwitchAvailableInTimers(int swtch); bool isR9MModeAvailable(int mode); bool isR9ModuleRunning(int module); bool isR9MMFlex(int module); -bool isInternalModuleChannelCountAvailable(int module); +bool isPXX2ChannelsCountAllowed(int channels); bool isExternalModuleAvailable(int module); bool isInternalModuleAvailable(int module); bool isRfProtocolAvailable(int protocol); diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index b48a718ef..84ac9bde0 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -515,14 +515,9 @@ bool isR9MMFlex(int module) return g_model.moduleData[module].r9m.region == MODULE_R9M_REGION_FLEX; } -bool isInternalModuleChannelCountAvailable(int channels) +bool isPXX2ChannelsCountAllowed(int channels) { - if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT2) { - if ( channels % 8 != 0) - return false; - } - - return true; + return (channels % 8 == 0); } bool isInternalModuleAvailable(int module) diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp index c2bb0adf1..97cfadf5e 100644 --- a/radio/src/io/frsky_device_firmware_update.cpp +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -71,8 +71,8 @@ void DeviceFirmwareUpdate::processFrame(const uint8_t * frame) void DeviceFirmwareUpdate::startup() { switch(module) { - case INTERNAL_MODULE: #if defined(INTMODULE_USART) + case INTERNAL_MODULE: intmoduleSerialStart(57600, true); break; #endif @@ -138,8 +138,8 @@ const uint8_t * DeviceFirmwareUpdate::readHalfDuplexFrame(uint32_t timeout) const uint8_t * DeviceFirmwareUpdate::readFrame(uint32_t timeout) { switch(module) { - case INTERNAL_MODULE: #if defined(INTMODULE_USART) + case INTERNAL_MODULE: return readFullDuplexFrame(intmoduleFifo, timeout); #endif @@ -177,7 +177,7 @@ void DeviceFirmwareUpdate::startFrame(uint8_t command) // TODO merge this function void DeviceFirmwareUpdate::sendFrame() { - uint8_t * ptr = outputTelemetryBuffer; + uint8_t * ptr = outputTelemetryBuffer.data; *ptr++ = 0x7E; *ptr++ = 0xFF; frame[7] = crc16(frame, 7); @@ -192,13 +192,13 @@ void DeviceFirmwareUpdate::sendFrame() } switch(module) { - case INTERNAL_MODULE: #if defined(INTMODULE_USART) - return intmoduleSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer); + case INTERNAL_MODULE: + return intmoduleSendBuffer(outputTelemetryBuffer.data, ptr - outputTelemetryBuffer.data); #endif default: - return sportSendBuffer(outputTelemetryBuffer, ptr-outputTelemetryBuffer); + return sportSendBuffer(outputTelemetryBuffer.data, ptr - outputTelemetryBuffer.data); } } diff --git a/radio/src/io/frsky_sport.cpp b/radio/src/io/frsky_sport.cpp index 7bfc0ad87..e56d527bd 100644 --- a/radio/src/io/frsky_sport.cpp +++ b/radio/src/io/frsky_sport.cpp @@ -22,17 +22,17 @@ bool isSportOutputBufferAvailable() { - return (outputTelemetryBufferSize == 0 && outputTelemetryBufferTrigger == 0x7E); + return (outputTelemetryBuffer.size == 0 && outputTelemetryBuffer.trigger == 0x7E); } void sportOutputPushByte(uint8_t byte) { if (byte == 0x7E || byte == 0x7D) { - telemetryOutputPushByte(0x7D); - telemetryOutputPushByte(0x20 ^ byte); + outputTelemetryBuffer.push(0x7D); + outputTelemetryBuffer.push(0x20 ^ byte); } else { - telemetryOutputPushByte(byte); + outputTelemetryBuffer.push(byte); } } @@ -49,6 +49,7 @@ void sportOutputPushPacket(SportTelemetryPacket * packet) crc &= 0x00ff; } - telemetryOutputPushByte(0xFF-crc); - telemetryOutputSetTrigger(packet->raw[0]); // physicalId + outputTelemetryBuffer.push(0xFF - crc); + outputTelemetryBuffer.setTrigger(packet->raw[0]); // physicalId + outputTelemetryBuffer.setDestination(SPORT_MODULE); } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index cebe9c335..c1fc97bc8 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -306,9 +306,11 @@ void generalDefault() theme->init(); #endif +#if defined(PXX2) for (uint8_t i=0; i(&trainerPulsesData.ppm, g_model.trainerData.channelsStart, g_model.trainerData.channelsCount, g_model.trainerData.frameLength); } -#if defined(PCBSKY9X) || defined(TARANIS_INTERNAL_PPM) +#if defined(PCBTARANIS) && defined(TARANIS_INTERNAL_PPM) void setupPulsesPPMInternalModule() { setupPulsesPPM(&intmodulePulsesData.ppm, g_model.moduleData[INTERNAL_MODULE].channelsStart, g_model.moduleData[INTERNAL_MODULE].channelsCount, g_model.moduleData[INTERNAL_MODULE].ppm.frameLength); diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 511b1710a..682e9c313 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -31,9 +31,11 @@ TrainerPulsesData trainerPulsesData __DMA; uint8_t getModuleType(uint8_t module) { uint8_t type = g_model.moduleData[module].type; +#if defined(PCBTARANIS) || defined(PCBHORUS) if (module == INTERNAL_MODULE && isInternalModuleAvailable(type)) { return type; } +#endif if (module == EXTERNAL_MODULE && isExternalModuleAvailable(type)) { return type; } @@ -255,7 +257,7 @@ void setupPulsesInternalModule(uint8_t protocol) break; #endif -#if defined(PCBSKY9X) || defined(TARANIS_INTERNAL_PPM) +#if defined(PCBTARANIS) && defined(TARANIS_INTERNAL_PPM) case PROTOCOL_CHANNELS_PPM: setupPulsesPPM(&extmodulePulsesData.ppm, g_model.moduleData[INTERNAL_MODULE].channelsStart, g_model.moduleData[INTERNAL_MODULE].channelsCount, g_model.moduleData[INTERNAL_MODULE].ppm.frameLength); scheduleNextMixerCalculation(INTERNAL_MODULE, PPM_PERIOD(INTERNAL_MODULE)); @@ -332,9 +334,11 @@ void setupPulsesExternalModule(uint8_t protocol) void setupPulses(uint8_t module, uint8_t protocol) { switch (module) { +#if defined(PCBTARANIS) && defined(PCBHORUS) case INTERNAL_MODULE: setupPulsesInternalModule(protocol); break; +#endif case EXTERNAL_MODULE: setupPulsesExternalModule(protocol); diff --git a/radio/src/storage/conversions/conversions_216_218.cpp b/radio/src/storage/conversions/conversions_216_218.cpp index f558efd17..ddce57aef 100644 --- a/radio/src/storage/conversions/conversions_216_218.cpp +++ b/radio/src/storage/conversions/conversions_216_218.cpp @@ -550,7 +550,7 @@ PACK(typedef struct { #define MODELDATA_EXTRA_217 \ uint8_t spare:6; \ uint8_t potsWarnMode:2; \ - ModuleData moduleData[NUM_MODULES+1]; \ + ModuleData_v217 moduleData[NUM_MODULES+1]; \ uint8_t potsWarnEnabled; \ int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; \ uint8_t rxBattAlarms[2]; @@ -652,7 +652,7 @@ PACK(typedef struct { MODELDATA_EXTRA_217 - TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS]; + TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS]; TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) }) ModelData_v217; diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp index 3b0418353..8b2983afc 100644 --- a/radio/src/storage/conversions/conversions_218_219.cpp +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -56,19 +56,23 @@ void convertModelData_218_to_219(ModelData &model) } } +#if !defined(PCBSKY9X) newModel.trainerData.mode = oldModel.trainerMode; +#endif newModel.trainerData.channelsStart = oldModel.moduleData[NUM_MODULES].channelsStart; newModel.trainerData.channelsCount = oldModel.moduleData[NUM_MODULES].channelsCount; newModel.trainerData.frameLength = oldModel.moduleData[NUM_MODULES].ppm.frameLength; newModel.trainerData.delay = oldModel.moduleData[NUM_MODULES].ppm.delay; newModel.trainerData.pulsePol = oldModel.moduleData[NUM_MODULES].ppm.pulsePol; +#if !defined(PCBSKY9X) memcpy(newModel.scriptsData, oldModel.scriptsData, sizeof(newModel.scriptsData) + sizeof(newModel.inputNames) + sizeof(newModel.potsWarnEnabled) + sizeof(newModel.potsWarnPosition) + sizeof(oldModel.telemetrySensors)); +#endif #if defined(PCBX9E) newModel.toplcdTimer = oldModel.toplcdTimer; diff --git a/radio/src/storage/conversions/datastructs_218.h b/radio/src/storage/conversions/datastructs_218.h index 887bcb0d2..18cbc6f0d 100644 --- a/radio/src/storage/conversions/datastructs_218.h +++ b/radio/src/storage/conversions/datastructs_218.h @@ -456,7 +456,7 @@ PACK(typedef struct { uint8_t templateSetup; // RETA order for receiver channels int8_t PPM_Multiplier; int8_t hapticLength; - N_HORUS_FIELD(N_TARANIS_FIELD(N_PCBSTD_FIELD(uint8_t reNavigation))); + N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t reNavigation)); N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t stickReverse)); int8_t beepLength:3; int8_t hapticStrength:3; diff --git a/radio/src/storage/eeprom_raw.cpp b/radio/src/storage/eeprom_raw.cpp index 66e1d19d4..b7867d7d7 100644 --- a/radio/src/storage/eeprom_raw.cpp +++ b/radio/src/storage/eeprom_raw.cpp @@ -23,6 +23,7 @@ #include #include "opentx.h" #include "timers.h" +#include "conversions/conversions.h" #define EEPROM_MARK 0x84697771 /* thanks ;) */ #define EEPROM_ZONE_SIZE (8*1024) @@ -584,7 +585,7 @@ const char * eeRestoreModel(uint8_t i_fileDst, char *model_name) #if defined(EEPROM_CONVERSIONS) if (version < EEPROM_VER) { - convertModel(i_fileDst, version); + convertModelData(i_fileDst, version); eeLoadModel(g_eeGeneral.currModel); } #endif diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 0c80ad180..d60248f3a 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -141,7 +141,6 @@ set(SRC tasks.cpp audio.cpp io/frsky_sport.cpp - io/frsky_device_firmware_update.cpp telemetry/telemetry.cpp telemetry/telemetry_holders.cpp telemetry/telemetry_sensors.cpp diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 0f459d81d..ac36db296 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -135,6 +135,12 @@ void intmoduleSendNextFrame() switch(moduleSettings[INTERNAL_MODULE].protocol) { #if defined(PXX2) case PROTOCOL_CHANNELS_PXX2: +#if defined(LUA) + if (outputTelemetryBuffer.size > 0 && outputTelemetryBuffer.destination == INTERNAL_MODULE) { + intmoduleSendBuffer(outputTelemetryBuffer.data, outputTelemetryBuffer.size); + break; + } +#endif intmoduleSendBuffer(intmodulePulsesData.pxx2.getData(), intmodulePulsesData.pxx2.getSize()); break; #endif diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 28c7abcde..ef12c59b4 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -146,6 +146,7 @@ add_definitions(-DBLUETOOTH) set(SRC ${SRC} bluetooth.cpp + io/frsky_device_firmware_update.cpp ) set(STM32LIB_SRC diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index b7df7b3ef..dfc7d93c0 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -176,8 +176,8 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); TELEMETRY_USART->CR1 |= USART_CR1_TCIE; if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { - outputTelemetryBufferSize = 0; - outputTelemetryBufferTrigger = 0x7E; + outputTelemetryBuffer.size = 0; + outputTelemetryBuffer.trigger = 0x7E; } } } @@ -207,8 +207,8 @@ extern "C" void TELEMETRY_USART_IRQHandler(void) #if defined(LUA) if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { static uint8_t prevdata; - if (prevdata == 0x7E && outputTelemetryBufferSize > 0 && data == outputTelemetryBufferTrigger) { - sportSendBuffer(outputTelemetryBuffer, outputTelemetryBufferSize); + if (prevdata == 0x7E && outputTelemetryBuffer.size > 0 && data == outputTelemetryBuffer.trigger && outputTelemetryBuffer.destination == SPORT_MODULE) { + sportSendBuffer(outputTelemetryBuffer.data, outputTelemetryBuffer.size); } prevdata = data; } diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index d12b6b046..d13a17738 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -263,6 +263,7 @@ void init_serial(uint32_t port, uint32_t baudrate, uint32_t period_half_us); void disable_serial(uint32_t port); void init_module_timer( uint32_t module_index, uint32_t period, uint8_t state); void disable_module_timer( uint32_t module_index); +void extmoduleSendNextFrame(); // SD driver #if defined(SIMU) diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index b1c3a7cb9..426c86eec 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -265,6 +265,10 @@ void disable_serial(uint32_t port) } } +void extmoduleSendNextFrame() +{ + +} #if !defined(SIMU) extern "C" void PWM_IRQHandler(void) { diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index fd81a338c..f6aefc9c6 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -202,6 +202,11 @@ endif() add_definitions(-DPCBTARANIS) add_definitions(-DAUDIO -DVOICE -DRTCLOCK) +set(SRC + ${SRC} + io/frsky_device_firmware_update.cpp + ) + set(GUI_SRC ${GUI_SRC} model_input_edit.cpp diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index fb854c482..31c632c05 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -128,8 +128,7 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); TELEMETRY_USART->CR1 |= USART_CR1_TCIE; if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || telemetryProtocol == PROTOCOL_TELEMETRY_PXX2) { - outputTelemetryBufferSize = 0; - outputTelemetryBufferTrigger = 0x7E; + outputTelemetryBuffer.reset(); } } } @@ -159,8 +158,8 @@ extern "C" void TELEMETRY_USART_IRQHandler(void) #if defined(LUA) if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { static uint8_t prevdata; - if (prevdata == 0x7E && outputTelemetryBufferSize > 0 && data == outputTelemetryBufferTrigger) { - sportSendBuffer(outputTelemetryBuffer, outputTelemetryBufferSize); + if (prevdata == 0x7E && outputTelemetryBuffer.size > 0 && data == outputTelemetryBuffer.trigger && outputTelemetryBuffer.destination == SPORT_MODULE) { + sportSendBuffer(outputTelemetryBuffer.data, outputTelemetryBuffer.size); } prevdata = data; } diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 94a26340f..cdb733244 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -89,9 +89,11 @@ void sendSynchronousPulses() { for (uint8_t module = 0; module < NUM_MODULES; module++) { if (isModuleSynchronous(module) && setupPulses(module)) { +#if defined(PCBHORUS) || defined(PCBTARAHIS) if (module == INTERNAL_MODULE) intmoduleSendNextFrame(); - else +#endif + if (module == EXTERNAL_MODULE) extmoduleSendNextFrame(); } } diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index a1bd14305..39ddd23bf 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -290,15 +290,13 @@ void telemetryInit(uint8_t protocol) else if (protocol == PROTOCOL_TELEMETRY_PXX2) { telemetryPortInit(PXX2_ON_SPORT_BAUDRATE, TELEMETRY_SERIAL_WITHOUT_DMA); #if defined(LUA) - outputTelemetryBufferSize = 0; - outputTelemetryBufferTrigger = 0x7E; + outputTelemetryBuffer.reset(); #endif } else { telemetryPortInit(FRSKY_SPORT_BAUDRATE, TELEMETRY_SERIAL_WITHOUT_DMA); #if defined(LUA) - outputTelemetryBufferSize = 0; - outputTelemetryBufferTrigger = 0x7E; + outputTelemetryBuffer.reset(); #endif } @@ -333,9 +331,7 @@ void logTelemetryWriteByte(uint8_t data) } #endif -uint8_t outputTelemetryBuffer[TELEMETRY_OUTPUT_FIFO_SIZE] __DMA; -uint8_t outputTelemetryBufferSize = 0; -uint8_t outputTelemetryBufferTrigger = 0; +OutputTelemetryBuffer outputTelemetryBuffer __DMA; #if defined(LUA) Fifo * luaInputTelemetryFifo = NULL; diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index ea9f2df67..9da81a2b6 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -143,7 +143,7 @@ inline uint8_t modelTelemetryProtocol() return PROTOCOL_TELEMETRY_FRSKY_SPORT; } - #include "telemetry_sensors.h" +#include "telemetry_sensors.h" #if defined(LOG_TELEMETRY) && !defined(SIMU) void logTelemetryWriteStart(); @@ -156,19 +156,34 @@ void logTelemetryWriteByte(uint8_t data); #endif #define TELEMETRY_OUTPUT_FIFO_SIZE 20 -extern uint8_t outputTelemetryBuffer[TELEMETRY_OUTPUT_FIFO_SIZE] __DMA; -extern uint8_t outputTelemetryBufferSize; -extern uint8_t outputTelemetryBufferTrigger; -inline void telemetryOutputPushByte(uint8_t byte) -{ - outputTelemetryBuffer[outputTelemetryBufferSize++] = byte; -} +class OutputTelemetryBuffer { + public: + void push(uint8_t byte) { + data[size++] = byte; + } -inline void telemetryOutputSetTrigger(uint8_t byte) -{ - outputTelemetryBufferTrigger = byte; -} + void setTrigger(uint8_t byte) { + trigger = byte; + } + + void setDestination(uint8_t module) { + destination = module; + } + + void reset() { + size = 0; + trigger = 0x7E; + } + + public: + uint8_t data[TELEMETRY_OUTPUT_FIFO_SIZE]; + uint8_t size; + uint8_t trigger; + uint8_t destination; +}; + +extern OutputTelemetryBuffer outputTelemetryBuffer __DMA; #if defined(LUA) #define LUA_TELEMETRY_INPUT_FIFO_SIZE 256 diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 212732ee0..2987580a6 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -538,11 +538,12 @@ #define TR_OK TR_ENTER #else #define TR_EXIT "[EXIT]" + #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") #endif #if defined(PCBTARANIS) #define TR_POPUPS_ENTER_EXIT TR(TR_EXIT "\010" TR_ENTER, TR_EXIT "\010" "\010" "\010" "\010" TR_ENTER) - #define TR_OK TR("\010" "\010" "\010" "[OK]", "\010" "\010" "\010" "\010" "\010" "[OK]") + #else #define TR_POPUPS_ENTER_EXIT TR_ENTER "\010" TR_EXIT #define OFS_EXIT sizeof(TR_ENTER) From 7d2f3dff5a069b179da34f79cab984997f905a45 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 17:04:23 +0100 Subject: [PATCH 388/446] S.PORT Push with PXX2 (still not tested) --- radio/src/io/frsky_sport.cpp | 3 +- radio/src/io/frsky_sport.h | 2 +- radio/src/lua/api_general.cpp | 57 ++++++++++++++++++++++++++++-- radio/src/telemetry/frsky_pxx2.cpp | 13 +++++++ radio/src/telemetry/telemetry.h | 2 +- 5 files changed, 71 insertions(+), 6 deletions(-) diff --git a/radio/src/io/frsky_sport.cpp b/radio/src/io/frsky_sport.cpp index e56d527bd..adf249382 100644 --- a/radio/src/io/frsky_sport.cpp +++ b/radio/src/io/frsky_sport.cpp @@ -20,7 +20,7 @@ #include "opentx.h" -bool isSportOutputBufferAvailable() +bool isTelemetryOutputBufferAvailable() { return (outputTelemetryBuffer.size == 0 && outputTelemetryBuffer.trigger == 0x7E); } @@ -36,7 +36,6 @@ void sportOutputPushByte(uint8_t byte) } } -// TODO merge it with S.PORT update function when finished void sportOutputPushPacket(SportTelemetryPacket * packet) { uint16_t crc = 0; diff --git a/radio/src/io/frsky_sport.h b/radio/src/io/frsky_sport.h index d7d58c8b2..57a7dabf7 100644 --- a/radio/src/io/frsky_sport.h +++ b/radio/src/io/frsky_sport.h @@ -35,7 +35,7 @@ PACK(union SportTelemetryPacket uint8_t raw[8]; }); -bool isSportOutputBufferAvailable(); +bool isTelemetryOutputBufferAvailable(); void sportOutputPushPacket(SportTelemetryPacket * packet); #endif diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 9716e69cc..76a857da3 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -422,9 +422,9 @@ When called without parameters, it will only return the status of the output buf static int luaSportTelemetryPush(lua_State * L) { if (lua_gettop(L) == 0) { - lua_pushboolean(L, isSportOutputBufferAvailable()); + lua_pushboolean(L, isTelemetryOutputBufferAvailable()); } - else if (isSportOutputBufferAvailable()) { + else if (isTelemetryOutputBufferAvailable()) { SportTelemetryPacket packet; packet.physicalId = getDataId(luaL_checkunsigned(L, 1)); packet.primId = luaL_checkunsigned(L, 2); @@ -439,6 +439,59 @@ static int luaSportTelemetryPush(lua_State * L) return 1; } +/*luadoc +@function pxx2TelemetryPush() + +This functions allows for sending SPORT telemetry data toward the receiver, +and more generally, to anything connected SPORT bus on the receiver or transmitter. + +When called without parameters, it will only return the status of the output buffer without sending anything. + +@param module module index + +@param receiver receiver index + +@param sensorId physical sensor ID + +@param frameId frame ID + +@param dataId data ID + +@param value value + +@retval boolean data queued in output buffer or not. + +@status current Introduced in 2.3.0 +*/ +static int luaPXX2TelemetryPush(lua_State * L) +{ + if (lua_gettop(L) == 0) { + lua_pushboolean(L, isTelemetryOutputBufferAvailable()); + } + else if (isTelemetryOutputBufferAvailable()) { + SportTelemetryPacket packet; + uint8_t module = getDataId(luaL_checkunsigned(L, 1)); + uint8_t receiver = getDataId(luaL_checkunsigned(L, 2)); + uint8_t rx_uid = g_model.moduleData[module].pxx2.getReceiverSlot(receiver); + if (rx_uid > 0) { + // TODO add more controls (module started, module = PXX2, etc.) + packet.physicalId = getDataId(luaL_checkunsigned(L, 3)); + packet.primId = luaL_checkunsigned(L, 4); + packet.dataId = luaL_checkunsigned(L, 5); + packet.value = luaL_checkunsigned(L, 6); + pushPXX2TelemetryPacket(module, rx_uid - 1, &packet); + lua_pushboolean(L, true); + } + else { + lua_pushboolean(L, false); + } + } + else { + lua_pushboolean(L, false); + } + return 1; +} + #if defined(CROSSFIRE) /*luadoc @function crossfireTelemetryPop() diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index c65fa9fad..64c0cef91 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -238,3 +238,16 @@ void processPXX2TelemetryFrame(uint8_t module, uint8_t * frame) break; } } + +void pushPXX2TelemetryPacket(uint8_t module, uint8_t rx_uid, SportTelemetryPacket * packet) +{ + // Flag0 + outputTelemetryBuffer.push(rx_uid); + + for (uint8_t i=1; iraw[i]; + outputTelemetryBuffer.push(byte); + } + + outputTelemetryBuffer.setDestination(module); +} diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 9da81a2b6..667d5eb50 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -197,6 +197,6 @@ extern Fifo * luaInputTelemetryFifo; #endif void processPXX2TelemetryFrame(uint8_t module, uint8_t * frame); +void pushPXX2TelemetryPacket(uint8_t module, uint8_t rx_uid, SportTelemetryPacket * packet); #endif // _TELEMETRY_H_ - From f2159b5a767a40a72ef2b60b9cdbb564835f2c40 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 20 Mar 2019 17:18:33 +0100 Subject: [PATCH 389/446] Fix typo --- radio/src/tasks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index cdb733244..4cef81255 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -89,7 +89,7 @@ void sendSynchronousPulses() { for (uint8_t module = 0; module < NUM_MODULES; module++) { if (isModuleSynchronous(module) && setupPulses(module)) { -#if defined(PCBHORUS) || defined(PCBTARAHIS) +#if defined(PCBHORUS) || defined(PCBTARANIS) if (module == INTERNAL_MODULE) intmoduleSendNextFrame(); #endif From 4b393e48a088803d0ac02cd52eba8ad2c7ba8f5e Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 20 Mar 2019 17:22:55 +0100 Subject: [PATCH 390/446] Fix pulses ;) --- radio/src/pulses/pulses.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 682e9c313..3d5251fd3 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -334,7 +334,7 @@ void setupPulsesExternalModule(uint8_t protocol) void setupPulses(uint8_t module, uint8_t protocol) { switch (module) { -#if defined(PCBTARANIS) && defined(PCBHORUS) +#if defined(PCBTARANIS) || defined(PCBHORUS) case INTERNAL_MODULE: setupPulsesInternalModule(protocol); break; From f5c6c55ac55da9d79304f6bcba7dc47140048b6e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 17:36:29 +0100 Subject: [PATCH 391/446] Introduced definition HARDWARE_INTERNAL_MODULE to avoid testing the brand etc. --- radio/src/gui/gui_common_arm.cpp | 2 +- radio/src/pulses/pulses.cpp | 7 +++++-- radio/src/targets/horus/hal.h | 1 + radio/src/targets/horus/telemetry_driver.cpp | 3 +-- radio/src/targets/sky9x/CMakeLists.txt | 1 + radio/src/targets/sky9x/pulses_driver.cpp | 7 ++++--- radio/src/targets/taranis/hal.h | 1 + radio/src/tasks.cpp | 2 +- 8 files changed, 15 insertions(+), 9 deletions(-) diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 84ac9bde0..43323fd4a 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -574,7 +574,7 @@ bool isExternalModuleAvailable(int module) return false; } #endif -#if defined(PCBTARANIS) || defined(PCBHORUS) +#if defined(HARDWARE_INTERNAL_MODULE) if (module == MODULE_TYPE_R9M && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT) { return false; } diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 3d5251fd3..c63da93aa 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -31,14 +31,17 @@ TrainerPulsesData trainerPulsesData __DMA; uint8_t getModuleType(uint8_t module) { uint8_t type = g_model.moduleData[module].type; -#if defined(PCBTARANIS) || defined(PCBHORUS) + +#if defined(HARDWARE_INTERNAL_MODULE) if (module == INTERNAL_MODULE && isInternalModuleAvailable(type)) { return type; } #endif + if (module == EXTERNAL_MODULE && isExternalModuleAvailable(type)) { return type; } + return MODULE_TYPE_NONE; } @@ -334,7 +337,7 @@ void setupPulsesExternalModule(uint8_t protocol) void setupPulses(uint8_t module, uint8_t protocol) { switch (module) { -#if defined(PCBTARANIS) || defined(PCBHORUS) +#if defined(HARDWARE_INTERNAL_MODULE) case INTERNAL_MODULE: setupPulsesInternalModule(protocol); break; diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 1613ed2c0..1336e5f13 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -510,6 +510,7 @@ #endif // Internal Module +#define HARDWARE_INTERNAL_MODULE #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) #define INTMODULE_PWR_GPIO GPIOA #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PA.08 diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index dfc7d93c0..21e9f6c5a 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -176,8 +176,7 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); TELEMETRY_USART->CR1 |= USART_CR1_TCIE; if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { - outputTelemetryBuffer.size = 0; - outputTelemetryBuffer.trigger = 0x7E; + outputTelemetryBuffer.reset(); } } } diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt index 2da8e1305..176293564 100644 --- a/radio/src/targets/sky9x/CMakeLists.txt +++ b/radio/src/targets/sky9x/CMakeLists.txt @@ -9,6 +9,7 @@ set(NAVIGATION_TYPE 9x) set(TARGET_DIR sky9x) set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} 9x_bitmaps) set(PPM_LIMITS_SYMETRICAL YES) +set(PXX1 YES) if(PCB STREQUAL 9XRPRO) add_definitions(-Dat91sam3s8 -DREVX) diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index 426c86eec..a1c495e46 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -279,7 +279,7 @@ extern "C" void PWM_IRQHandler(void) if (reason & PWM_ISR1_CHID3) { // Use the current protocol, don't switch until set_up_pulses switch (moduleSettings[EXTERNAL_MODULE].protocol) { - case PROTOCOL_CHANNELS_PXX: + case PROTOCOL_CHANNELS_PXX1_PULSES: // Alternate periods of 6.5mS and 2.5 mS period = pwmptr->PWM_CH_NUM[3].PWM_CPDR; if (period == 2500 * 2) { @@ -365,11 +365,12 @@ extern "C" void PWM_IRQHandler(void) #if !defined(REVA) if (reason & PWM_ISR1_CHID1) { - pwmptr->PWM_CH_NUM[1].PWM_CPDRUPD = *modulePulsesData[EXTRA_MODULE].ppm.ptr++; + // TODO EXTRA_MODULE will be broken + /*pwmptr->PWM_CH_NUM[1].PWM_CPDRUPD = *modulePulsesData[EXTRA_MODULE].ppm.ptr++; if (*modulePulsesData[EXTRA_MODULE].ppm.ptr == 0) { setupPulses(EXTRA_MODULE); setExtraModulePolarity(); - } + }*/ } #endif } diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 4cc860d7d..0cab9aab7 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -669,6 +669,7 @@ #endif // Internal Module +#define HARDWARE_INTERNAL_MODULE #if defined(PCBXLITE) || defined(PCBX3) #define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM3 #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 4cef81255..2c787860b 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -89,7 +89,7 @@ void sendSynchronousPulses() { for (uint8_t module = 0; module < NUM_MODULES; module++) { if (isModuleSynchronous(module) && setupPulses(module)) { -#if defined(PCBHORUS) || defined(PCBTARANIS) +#if defined(HARDWARE_INTERNAL_MODULE) if (module == INTERNAL_MODULE) intmoduleSendNextFrame(); #endif From a1e80c4fd778e5de784ecf9db4bfa45ced4aad1b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 18:14:54 +0100 Subject: [PATCH 392/446] Compilation fix --- radio/src/lua/api_general.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 76a857da3..d14631ed5 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1363,6 +1363,10 @@ const luaL_Reg opentxLib[] = { { "sportTelemetryPop", luaSportTelemetryPop }, { "sportTelemetryPush", luaSportTelemetryPush }, { "setTelemetryValue", luaSetTelemetryValue }, +#if defined(PXX2) + { "sportTelemetryPop", luaSportTelemetryPop }, + { "pxx2TelemetryPush", luaPXX2TelemetryPush }, +#endif #if defined(CROSSFIRE) { "crossfireTelemetryPop", luaCrossfireTelemetryPop }, { "crossfireTelemetryPush", luaCrossfireTelemetryPush }, From fa36f7e0a1a46576b1f889fb68001d6c03ffda4f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 19:11:24 +0100 Subject: [PATCH 393/446] Compilation fix --- radio/src/lua/api_general.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index d14631ed5..1b8fc911d 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -439,6 +439,7 @@ static int luaSportTelemetryPush(lua_State * L) return 1; } +#if defined(PXX2) /*luadoc @function pxx2TelemetryPush() @@ -491,6 +492,7 @@ static int luaPXX2TelemetryPush(lua_State * L) } return 1; } +#endif #if defined(CROSSFIRE) /*luadoc From 9ad54de528e017d182c9d4cdcded7edba8d1f5c1 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 19:13:18 +0100 Subject: [PATCH 394/446] Compilation fix --- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/gui/gui_common_arm.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 645d31445..c6d322771 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -918,7 +918,7 @@ void menuModelSetup(event_t event) if (attr) g_model.noGlobalFunctions = !checkIncDecModel(event, !g_model.noGlobalFunctions, 0, 1); break; -#if defined(PCBTARANIS) +#if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_INTERNAL_MODULE_LABEL: lcdDrawTextAlignedLeft(y, TR_INTERNALRF); break; diff --git a/radio/src/gui/gui_common_arm.cpp b/radio/src/gui/gui_common_arm.cpp index 43323fd4a..49281630c 100644 --- a/radio/src/gui/gui_common_arm.cpp +++ b/radio/src/gui/gui_common_arm.cpp @@ -520,6 +520,7 @@ bool isPXX2ChannelsCountAllowed(int channels) return (channels % 8 == 0); } +#if defined(HARDWARE_INTERNAL_MODULE) bool isInternalModuleAvailable(int module) { if (module == MODULE_TYPE_NONE) @@ -537,6 +538,7 @@ bool isInternalModuleAvailable(int module) return false; } +#endif bool isExternalModuleAvailable(int module) { From 1334606d1a79ad0682817ef001bbe58c644a2066 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 20:03:42 +0100 Subject: [PATCH 395/446] Compilation fix --- radio/src/targets/sky9x/board.h | 2 +- radio/src/targets/sky9x/pulses_driver.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index d13a17738..b5f227421 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -258,7 +258,7 @@ void disable_no_pulses(uint32_t port); void init_ppm(uint32_t port); void disable_ppm(uint32_t port); void init_pxx(uint32_t port); -void disable_pxx(uint32_t port); +void disable_pxx1_pulses(uint32_t port); void init_serial(uint32_t port, uint32_t baudrate, uint32_t period_half_us); void disable_serial(uint32_t port); void init_module_timer( uint32_t module_index, uint32_t period, uint8_t state); diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index a1c495e46..326a7fd16 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -225,7 +225,7 @@ void init_pxx(uint32_t port) } } -void disable_pxx(uint32_t port) +void disable_pxx1_pulses(uint32_t port) { if (port == EXTERNAL_MODULE) { disable_ssc(); From ba028e4d79dfdf7380ca7eac9ec04f7984ef2799 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 20:11:26 +0100 Subject: [PATCH 396/446] Compilation fix --- radio/src/pulses/pulses.cpp | 2 +- radio/src/targets/sky9x/board.h | 2 +- radio/src/targets/sky9x/pulses_driver.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index c63da93aa..c0679b01b 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -239,7 +239,7 @@ void enablePulses(uint8_t module, uint8_t protocol) void setupPulsesInternalModule(uint8_t protocol) { switch (protocol) { -#if defined(PXX1) && !defined(INTMODULE_USART) +#if defined(HARDWARE_INTERNAL_MODULE) && defined(PXX1) && !defined(INTMODULE_USART) case PROTOCOL_CHANNELS_PXX1_PULSES: intmodulePulsesData.pxx.setupFrame(INTERNAL_MODULE); scheduleNextMixerCalculation(INTERNAL_MODULE, INTMODULE_PXX_PERIOD); diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index b5f227421..a37321b1a 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -257,7 +257,7 @@ void init_no_pulses(uint32_t port); void disable_no_pulses(uint32_t port); void init_ppm(uint32_t port); void disable_ppm(uint32_t port); -void init_pxx(uint32_t port); +void init_pxx1_pulses(uint32_t port); void disable_pxx1_pulses(uint32_t port); void init_serial(uint32_t port, uint32_t baudrate, uint32_t period_half_us); void disable_serial(uint32_t port); diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index 326a7fd16..4058bedd4 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -214,7 +214,7 @@ void disable_ssc() sscptr->SSC_CR = SSC_CR_TXDIS; } -void init_pxx(uint32_t port) +void init_pxx1_pulses(uint32_t port) { if (port == EXTERNAL_MODULE) { init_main_ppm(2500 * 2, 0); From f30a9ec9e1b0f0877f19eceb4362f1794656c3ce Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 21:19:51 +0100 Subject: [PATCH 397/446] Compilation fix --- radio/src/storage/conversions/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/storage/conversions/CMakeLists.txt b/radio/src/storage/conversions/CMakeLists.txt index 258b89431..d8b8ea749 100644 --- a/radio/src/storage/conversions/CMakeLists.txt +++ b/radio/src/storage/conversions/CMakeLists.txt @@ -1,4 +1,4 @@ -if(PCB STREQUAL X9D OR PCB STREQUAL X9DP OR PCB STREQUAL SKY9X) +if(PCB STREQUAL X9D OR PCB STREQUAL X9DP OR PCB STREQUAL SKY9X OR PCB STREQUAL AR9X) set(EEPROM_CONVERSIONS 216) endif() From 725388b83e06b680d8c348c1be02c17369a3d38b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 21:58:40 +0100 Subject: [PATCH 398/446] Compilation fix --- radio/src/storage/conversions/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radio/src/storage/conversions/CMakeLists.txt b/radio/src/storage/conversions/CMakeLists.txt index d8b8ea749..96d60fdb8 100644 --- a/radio/src/storage/conversions/CMakeLists.txt +++ b/radio/src/storage/conversions/CMakeLists.txt @@ -2,6 +2,10 @@ if(PCB STREQUAL X9D OR PCB STREQUAL X9DP OR PCB STREQUAL SKY9X OR PCB STREQUAL A set(EEPROM_CONVERSIONS 216) endif() +if(PCB STREQUAL SKY9X OR PCB STREQUAL AR9X OR PCB STREQUAL 9XRPRO) + set(EEPROM_CONVERSIONS 216) +endif() + if(PCB STREQUAL X7 OR PCB STREQUAL XLITE) set(EEPROM_CONVERSIONS 218) endif() From 471d1c6f537053fe475c3271f78dc458e8b93af2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 10:00:52 +0100 Subject: [PATCH 399/446] [PXX2] Telemetry push fix --- radio/src/lua/api_general.cpp | 1 + radio/src/pulses/pxx.h | 2 +- radio/src/pulses/pxx2.cpp | 15 ++++++++++++++- radio/src/pulses/pxx2.h | 2 ++ .../common/arm/stm32/intmodule_serial_driver.cpp | 6 ------ 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 1b8fc911d..d5dd29919 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -480,6 +480,7 @@ static int luaPXX2TelemetryPush(lua_State * L) packet.primId = luaL_checkunsigned(L, 4); packet.dataId = luaL_checkunsigned(L, 5); packet.value = luaL_checkunsigned(L, 6); + // TODO we could avoid this new copy pushPXX2TelemetryPacket(module, rx_uid - 1, &packet); lua_pushboolean(L, true); } diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index cb6d1ecd5..0c783e3d1 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -43,7 +43,7 @@ #define INTMODULE_PXX_PERIOD 9/*ms*/ #endif -#define EXTMODULE_USART_PXX2_BAUDRATE 450000 +#define EXTMODULE_USART_PXX2_BAUDRATE 400000 #if defined(PXX_FREQUENCY_HIGH) && (!defined(INTMODULE_USART) || !defined(EXTMODULE_USART)) /* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */ diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 50e7a96f7..eb1eebee1 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -107,6 +107,14 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module) } } +void Pxx2Pulses::setupTelemetryFrame(uint8_t module) +{ + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_TELEMETRY); + for (uint8_t i = 0; i < outputTelemetryBuffer.size; i++) { + Pxx2Transport::addByte(outputTelemetryBuffer.data[i]); + } +} + void Pxx2Pulses::setupHardwareInfoFrame(uint8_t module) { if (reusableBuffer.hardware.modules[module].step >= -1 && reusableBuffer.hardware.modules[module].step < PXX2_MAX_RECEIVERS_PER_MODULE) { @@ -271,7 +279,12 @@ void Pxx2Pulses::setupFrame(uint8_t module) setupShareMode(module); break; default: - setupChannelsFrame(module); + if (outputTelemetryBuffer.size > 0 && outputTelemetryBuffer.destination == module) { + setupTelemetryFrame(module); + } + else { + setupChannelsFrame(module); + } break; } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 5cc3e2581..46131fff0 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -127,6 +127,8 @@ class Pxx2Pulses: public PxxPulses { void setupChannelsFrame(uint8_t module); + void setupTelemetryFrame(uint8_t module); + void setupSpectrumAnalyser(uint8_t module); void setupPowerMeter(uint8_t module); diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index ac36db296..0f459d81d 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -135,12 +135,6 @@ void intmoduleSendNextFrame() switch(moduleSettings[INTERNAL_MODULE].protocol) { #if defined(PXX2) case PROTOCOL_CHANNELS_PXX2: -#if defined(LUA) - if (outputTelemetryBuffer.size > 0 && outputTelemetryBuffer.destination == INTERNAL_MODULE) { - intmoduleSendBuffer(outputTelemetryBuffer.data, outputTelemetryBuffer.size); - break; - } -#endif intmoduleSendBuffer(intmodulePulsesData.pxx2.getData(), intmodulePulsesData.pxx2.getSize()); break; #endif From abca4e559fefd167bdff90fb2980ca660b8207a4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 11:57:03 +0100 Subject: [PATCH 400/446] [PXX2] Revert to 450000 (pushed by mistake) --- radio/src/pulses/pxx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 0c783e3d1..cb6d1ecd5 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -43,7 +43,7 @@ #define INTMODULE_PXX_PERIOD 9/*ms*/ #endif -#define EXTMODULE_USART_PXX2_BAUDRATE 400000 +#define EXTMODULE_USART_PXX2_BAUDRATE 450000 #if defined(PXX_FREQUENCY_HIGH) && (!defined(INTMODULE_USART) || !defined(EXTMODULE_USART)) /* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */ From b0b027e958988d537c8b134cd38ef31d0f3552a6 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 13:57:23 +0100 Subject: [PATCH 401/446] [X10] PWM sticks fix --- radio/src/io/frsky_pxx2.h | 2 +- radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp | 1 - radio/src/targets/horus/board.cpp | 4 +--- radio/src/telemetry/frsky_pxx2.cpp | 2 +- radio/src/telemetry/telemetry.cpp | 4 ++-- radio/src/telemetry/telemetry.h | 2 +- 6 files changed, 6 insertions(+), 9 deletions(-) diff --git a/radio/src/io/frsky_pxx2.h b/radio/src/io/frsky_pxx2.h index 70c9e9c60..21d069454 100644 --- a/radio/src/io/frsky_pxx2.h +++ b/radio/src/io/frsky_pxx2.h @@ -47,7 +47,7 @@ class ModuleFifo : public Fifo { return false; } - for (uint32_t i=0; i<=len; i++) { + for (uint32_t i = 0; i <= len; i++) { frame[i] = fifo[next]; next = nextIndex(next); } diff --git a/radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp b/radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp index a3c065963..e219f5521 100644 --- a/radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp +++ b/radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp @@ -20,7 +20,6 @@ #include "opentx.h" -bool sticks_pwm_disabled = false; volatile uint32_t pwm_interrupt_count; volatile uint16_t timer_capture_values[NUM_PWMSTICKS]; diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 1ab46c814..0ac2357a5 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -29,8 +29,6 @@ extern "C" { } #endif -extern bool sticks_pwm_disabled; - HardwareOptions hardwareOptions; void watchdogInit(unsigned int duration) @@ -208,7 +206,7 @@ void boardInit() sticksPwmInit(); delay_ms(20); if (pwm_interrupt_count < 32) { - sticks_pwm_disabled = true; + hardwareOptions.sticksPwmDisabled = true; } #endif diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 64c0cef91..6dcdcf7f6 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -223,7 +223,7 @@ void processToolsFrame(uint8_t module, uint8_t * frame) } } -void processPXX2TelemetryFrame(uint8_t module, uint8_t * frame) +void processPXX2Frame(uint8_t module, uint8_t *frame) { switch (frame[1]) { case PXX2_TYPE_C_MODULE: diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 39ddd23bf..f17f5579f 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -92,13 +92,13 @@ void telemetryWakeup() #if defined(INTMODULE_USART) while (intmoduleFifo.getFrame(frame)) { - processPXX2TelemetryFrame(INTERNAL_MODULE, frame); + processPXX2Frame(INTERNAL_MODULE, frame); } #endif #if defined(EXTMODULE_USART) while (extmoduleFifo.getFrame(frame)) { - processPXX2TelemetryFrame(EXTERNAL_MODULE, frame); + processPXX2Frame(EXTERNAL_MODULE, frame); } #endif #endif diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 667d5eb50..e320f303a 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -196,7 +196,7 @@ extern Fifo * luaInputTelemetryFifo; #define IS_TELEMETRY_INTERNAL_MODULE() (false) #endif -void processPXX2TelemetryFrame(uint8_t module, uint8_t * frame); +void processPXX2Frame(uint8_t module, uint8_t *frame); void pushPXX2TelemetryPacket(uint8_t module, uint8_t rx_uid, SportTelemetryPacket * packet); #endif // _TELEMETRY_H_ From 4de9e3f73b2b02c130de11473b15d3136ebdbda8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 15:21:16 +0100 Subject: [PATCH 402/446] NAVIGATION_MENUS definition removed --- radio/src/gui/128x64/model_inputs_mixes.cpp | 12 ------------ radio/src/gui/128x64/model_select.cpp | 8 -------- radio/src/gui/128x64/view_main.cpp | 15 --------------- radio/src/gui/212x64/popups.cpp | 7 +++++-- radio/src/gui/212x64/popups.h | 1 - radio/src/gui/480x272/menus.h | 1 - radio/src/gui/common/stdlcd/popups.cpp | 2 -- radio/src/translations.cpp | 2 -- radio/src/translations.h | 2 -- 9 files changed, 5 insertions(+), 45 deletions(-) diff --git a/radio/src/gui/128x64/model_inputs_mixes.cpp b/radio/src/gui/128x64/model_inputs_mixes.cpp index 6535b8821..c35954d9d 100644 --- a/radio/src/gui/128x64/model_inputs_mixes.cpp +++ b/radio/src/gui/128x64/model_inputs_mixes.cpp @@ -524,7 +524,6 @@ void menuModelMixOne(event_t event) #define MIX_LINE_SWITCH_POS 16*FW #define MIX_LINE_DELAY_POS 19*FW+7 -#if defined(NAVIGATION_MENUS) void onExpoMixMenu(const char *result) { bool expo = (menuHandlers[menuLevel] == menuModelExposAll); @@ -551,7 +550,6 @@ void onExpoMixMenu(const char *result) deleteExpoMix(expo, s_currIdx); } } -#endif void displayMixInfos(coord_t y, MixData *md) { @@ -672,7 +670,6 @@ void menuModelExpoMix(uint8_t expo, event_t event) } else { if (s_copyMode) s_currCh = 0; -#if defined(NAVIGATION_MENUS) if (s_currCh) { if (reachExpoMixCountLimit(expo)) break; insertExpoMix(expo, s_currIdx); @@ -691,15 +688,6 @@ void menuModelExpoMix(uint8_t expo, event_t event) POPUP_MENU_ADD_ITEM(STR_DELETE); POPUP_MENU_START(onExpoMixMenu); } -#else - if (s_currCh) { - if (reachExpoMixCountLimit(expo)) break; - insertExpoMix(expo, s_currIdx); - } - pushMenu(expo ? menuModelExpoOne : menuModelMixOne); - s_copyMode = 0; - return; -#endif } } break; diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index 09a31eb2e..ce6649c17 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -22,7 +22,6 @@ #define MODELSEL_W LCD_W -#if defined(NAVIGATION_MENUS) void onModelSelectMenu(const char * result) { int8_t sub = menuVerticalPosition; @@ -67,7 +66,6 @@ void onModelSelectMenu(const char * result) } #endif } -#endif void menuModelSelect(event_t event) { @@ -194,7 +192,6 @@ void menuModelSelect(event_t event) else if (event == EVT_KEY_LONG(KEY_ENTER) || IS_ROTARY_BREAK(event)) { s_copyMode = 0; killEvents(event); -#if defined(NAVIGATION_MENUS) if (g_eeGeneral.currModel != sub) { if (eeModelExists(sub)) { POPUP_MENU_ADD_ITEM(STR_SELECT_MODEL); @@ -218,11 +215,6 @@ void menuModelSelect(event_t event) POPUP_MENU_ADD_ITEM(STR_MOVE_MODEL); } POPUP_MENU_START(onModelSelectMenu); -#else - if (g_eeGeneral.currModel != sub) { - selectModel(sub); - } -#endif } else if (eeModelExists(sub)) { s_copyMode = (s_copyMode == COPY_MODE ? MOVE_MODE : COPY_MODE); diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index 36ea906eb..79c49be53 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -258,7 +258,6 @@ void displayVoltageOrAlarm() #define EVT_KEY_STATISTICS EVT_KEY_LONG(KEY_UP) #endif -#if defined(NAVIGATION_MENUS) void onMainViewMenu(const char *result) { if (result == STR_RESET_TIMER1) { @@ -299,7 +298,6 @@ void onMainViewMenu(const char *result) chainMenu(menuAboutView); } } -#endif void menuMainView(event_t event) { @@ -334,7 +332,6 @@ void menuMainView(event_t event) } break; -#if defined(NAVIGATION_MENUS) case EVT_KEY_CONTEXT_MENU: killEvents(event); @@ -348,7 +345,6 @@ void menuMainView(event_t event) POPUP_MENU_ADD_ITEM(STR_ABOUT_US); POPUP_MENU_START(onMainViewMenu); break; -#endif #if MENUS_LOCK != 2 /*no menus*/ #if defined(EVT_KEY_LAST_MENU) @@ -407,19 +403,8 @@ void menuMainView(event_t event) if (gvarDisplayTimer > 0) { gvarDisplayTimer = 0; } -#endif -#if !defined(NAVIGATION_MENUS) - if (view == VIEW_TIMER2) { - timerReset(1); - } #endif break; - -#if !defined(NAVIGATION_MENUS) - case EVT_KEY_LONG(KEY_EXIT): - flightReset(); - break; -#endif } { diff --git a/radio/src/gui/212x64/popups.cpp b/radio/src/gui/212x64/popups.cpp index 82ff6b464..93b8693bf 100644 --- a/radio/src/gui/212x64/popups.cpp +++ b/radio/src/gui/212x64/popups.cpp @@ -86,18 +86,21 @@ void showAlertBox(const char * title, const char * text, const char * action, ui void runPopupWarning(event_t event) { - warningResult = false; drawMessageBox(warningText); + if (warningInfoText) { lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH, warningInfoText, warningInfoLength, WARNING_INFO_FLAGS); } + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT)); + switch (event) { case EVT_KEY_BREAK(KEY_ENTER): if (warningType == WARNING_TYPE_ASTERISK) break; + if (warningType != WARNING_TYPE_INFO) - warningResult = true; + popupMenuHandler(STR_OK); // no break case EVT_KEY_BREAK(KEY_EXIT): diff --git a/radio/src/gui/212x64/popups.h b/radio/src/gui/212x64/popups.h index 3ee4dea46..65f0881b4 100644 --- a/radio/src/gui/212x64/popups.h +++ b/radio/src/gui/212x64/popups.h @@ -44,7 +44,6 @@ extern uint8_t warningInfoFlags; #define WARNING_INFO_FLAGS warningInfoFlags #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) -#define NAVIGATION_MENUS #define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuItemsCount++] = s; } while (0) #define POPUP_MENU_SELECT_ITEM(s) s_menu_item = (s > 0 ? (s < popupMenuItemsCount ? s : popupMenuItemsCount) : 0) #define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while (0) diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index aa5d9e045..b38db2616 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -488,7 +488,6 @@ extern uint8_t warningInfoFlags; #define WARNING_INFO_FLAGS warningInfoFlags #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) -#define NAVIGATION_MENUS #define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuItemsCount++] = s; } while (0) #define POPUP_MENU_SELECT_ITEM(s) s_menu_item = (s > 0 ? (s < popupMenuItemsCount ? s : popupMenuItemsCount) : 0) #define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while(0) diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index b47dfe1b0..0937d0a5c 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -23,7 +23,6 @@ uint8_t popupMenuOffsetType = MENU_OFFSET_INTERNAL; void (*popupFunc)(event_t event) = NULL; -#if defined(NAVIGATION_MENUS) const char * popupMenuItems[POPUP_MENU_MAX_LINES]; uint8_t s_menu_item = 0; uint16_t popupMenuItemsCount = 0; @@ -135,4 +134,3 @@ const char * runPopupMenu(event_t event) return result; } -#endif diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 010436cb8..a9cab7c68 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -407,7 +407,6 @@ const char STR_WAV_VOLUME[] = INDENT TR_WAV_VOLUME; const char STR_BG_VOLUME[] = INDENT TR_BG_VOLUME; const char STR_PERSISTENT_MAH[] = TR_PERSISTENT_MAH; -#if defined(NAVIGATION_MENUS) const char STR_SELECT_MODEL[] = TR_SELECT_MODEL; const char STR_CREATE_CATEGORY[] = TR_CREATE_CATEGORY; const char STR_RENAME_CATEGORY[] = TR_RENAME_CATEGORY; @@ -437,7 +436,6 @@ const char STR_USB_MASS_STORAGE[] = TR_USB_MASS_STORAGE; const char STR_USB_SERIAL[] = TR_USB_SERIAL; const char STR_SETUP_SCREENS[] = TR_SETUP_SCREENS; const char STR_MONITOR_SCREENS[] = TR_MONITOR_SCREENS; -#endif #if defined(MULTIMODULE) const char STR_MULTI_CUSTOM[] = TR_MULTI_CUSTOM; diff --git a/radio/src/translations.h b/radio/src/translations.h index a35f847aa..62e7d11e7 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -629,7 +629,6 @@ extern const char STR_PERSISTENT_MAH[]; #define LEN_CALIB_FIELDS PSIZE(TR_BATT_CALIB) #endif -#if defined(NAVIGATION_MENUS) extern const char STR_SELECT_MODEL[]; extern const char STR_CREATE_CATEGORY[]; extern const char STR_RENAME_CATEGORY[]; @@ -659,7 +658,6 @@ extern const char STR_PERSISTENT_MAH[]; extern const char STR_USB_SERIAL[]; extern const char STR_SETUP_SCREENS[]; extern const char STR_MONITOR_SCREENS[]; -#endif extern const char STR_RESET_BTN[]; extern const char STR_DEBUG[]; From d4b14f614c2aa8fc1b413a4820dc1a13bc9fa104 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 15:44:16 +0100 Subject: [PATCH 403/446] Popups can now have an handler. It could perhaps avoid another EEPROM format @3djc ? --- radio/src/gui/128x64/model_select.cpp | 4 +- radio/src/gui/128x64/model_setup.cpp | 50 ++++++++++++------- radio/src/gui/128x64/model_telemetry.cpp | 2 +- radio/src/gui/128x64/model_templates.cpp | 2 +- radio/src/gui/128x64/popups.cpp | 21 +++++++- radio/src/gui/128x64/popups.h | 7 +-- radio/src/gui/128x64/radio_setup.cpp | 2 +- radio/src/gui/128x64/radio_version.cpp | 2 +- radio/src/gui/212x64/model_select.cpp | 4 +- radio/src/gui/212x64/model_telemetry.cpp | 2 +- radio/src/gui/212x64/popups.cpp | 18 +++++-- radio/src/gui/212x64/popups.h | 2 +- radio/src/gui/212x64/radio_setup.cpp | 2 +- radio/src/gui/212x64/radio_version.cpp | 2 +- radio/src/gui/212x64/view_statistics.cpp | 2 +- .../src/gui/common/stdlcd/radio_sdmanager.cpp | 2 +- radio/src/opentx.cpp | 2 +- radio/src/opentx.h | 4 +- radio/src/pulses/pxx2.cpp | 20 ++++---- radio/src/targets/taranis/hal.h | 4 +- radio/src/telemetry/frsky_pxx2.cpp | 11 ++-- 21 files changed, 104 insertions(+), 61 deletions(-) diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index ce6649c17..479a0b544 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -52,7 +52,7 @@ void onModelSelectMenu(const char * result) } #endif else if (result == STR_DELETE_MODEL) { - POPUP_CONFIRMATION(STR_DELETEMODEL); + POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); SET_WARNING_INFO(modelHeaders[sub].name, sizeof(g_model.header.name), ZCHAR); } #if defined(SDCARD) @@ -104,7 +104,7 @@ void menuModelSelect(event_t event) case EVT_KEY_LONG(KEY_EXIT): killEvents(event); if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && eeModelExists(sub)) { - POPUP_CONFIRMATION(STR_DELETEMODEL); + POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); SET_WARNING_INFO(modelHeaders[sub].name, sizeof(g_model.header.name), ZCHAR); } else { diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index c6d322771..15a670a52 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1608,7 +1608,7 @@ void menuModelSetup(event_t event) { uint8_t newAntennaSel = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_ANTENNASELECTION, STR_VANTENNATYPES, g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna, 0, 1, attr, event); if (newAntennaSel != g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna && newAntennaSel == XJT_EXTERNAL_ANTENNA) { - POPUP_CONFIRMATION(STR_ANTENNACONFIRM1); + POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, nullptr); const char * w = STR_ANTENNACONFIRM2; SET_WARNING_INFO(w, strlen(w), 0); } @@ -1950,16 +1950,37 @@ enum MenuModelReceiverOptions { #define RECEIVER_OPTIONS_2ND_COLUMN 80 +void onRxOptionsUpdateConfirm(const char * result) +{ + if (result == STR_OK) { + reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_WRITE; + reusableBuffer.receiverSetup.dirty = 0; + reusableBuffer.receiverSetup.timeout = 0; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + else { + reusableBuffer.receiverSetup.dirty = 0; + popMenu(); + } +} + void menuModelReceiverOptions(event_t event) { const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; uint8_t wbar = LCD_W / 2 - 20; + uint8_t outputsCount = min(16, reusableBuffer.receiverSetup.outputsCount); - SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + sentModuleChannels(g_moduleIdx)); + SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + outputsCount); if (menuEvent) { moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; - return; + if (reusableBuffer.receiverSetup.dirty) { + pushMenu(menuModelReceiverOptions); + POPUP_CONFIRMATION("Update RX options?", onRxOptionsUpdateConfirm); + } + else { + return; + } } int8_t sub = menuVerticalPosition; @@ -1969,22 +1990,15 @@ void menuModelReceiverOptions(event_t event) lcdInvertLine(0); if (event == EVT_ENTRY) { - moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - } - - if (!s_editMode && reusableBuffer.receiverSetup.dirty && reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_OK) { - reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_WRITE; - reusableBuffer.receiverSetup.dirty = 0; - reusableBuffer.receiverSetup.timeout = 0; - reusableBuffer.receiverSetup.dirtyTimeout = get_tmr10ms() + 500/*5s*/; - moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - } - #if defined(SIMU) - reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_OK; + reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_OK; + reusableBuffer.receiverSetup.outputsCount = 8; +#else + moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; #endif + } - if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_OK || get_tmr10ms() < reusableBuffer.receiverSetup.dirtyTimeout) { + if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_OK) { for (uint8_t k=0; k 0 ? (s < popupMenuItemsCount ? s : popupMenuItemsCount) : 0) #define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while (0) @@ -78,13 +77,11 @@ extern uint8_t warningInfoFlags; extern uint8_t popupMenuOffsetType; extern uint8_t s_menu_item; -#if defined(NAVIGATION_MENUS) extern uint16_t popupMenuOffset; extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; extern uint16_t popupMenuItemsCount; const char * runPopupMenu(event_t event); extern void (*popupMenuHandler)(const char * result); extern const char * popupMenuTitle; -#endif #endif // _POPUPS_H_ diff --git a/radio/src/gui/128x64/radio_setup.cpp b/radio/src/gui/128x64/radio_setup.cpp index 25d407045..2334fd44e 100644 --- a/radio/src/gui/128x64/radio_setup.cpp +++ b/radio/src/gui/128x64/radio_setup.cpp @@ -553,7 +553,7 @@ void menuRadioSetup(event_t event) if (g_eeGeneral.fai) POPUP_WARNING("FAI\001mode blocked!"); else - POPUP_CONFIRMATION("FAI mode?"); + POPUP_CONFIRMATION("FAI mode?", nullptr); } break; #endif diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 18ffd8085..a86bc7f12 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -196,7 +196,7 @@ void menuRadioVersion(event_t event) // y += FH; if (menuVerticalPosition == ITEM_RADIO_FACTORY_RESET && event == EVT_KEY_BREAK(KEY_ENTER)) { s_editMode = EDIT_SELECT_FIELD; - POPUP_CONFIRMATION(STR_CONFIRMRESET); + POPUP_CONFIRMATION(STR_CONFIRMRESET, nullptr); } #endif } diff --git a/radio/src/gui/212x64/model_select.cpp b/radio/src/gui/212x64/model_select.cpp index 76de6a69e..d4bf5d37d 100644 --- a/radio/src/gui/212x64/model_select.cpp +++ b/radio/src/gui/212x64/model_select.cpp @@ -52,7 +52,7 @@ void onModelSelectMenu(const char * result) else if (result == STR_DELETE_MODEL) { char * nametmp = reusableBuffer.modelsel.mainname; strcat_modelname (nametmp, sub); - POPUP_CONFIRMATION(STR_DELETEMODEL); + POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); SET_WARNING_INFO(nametmp, sizeof(g_model.header.name), 0); } else if (result) { @@ -102,7 +102,7 @@ void menuModelSelect(event_t event) if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && eeModelExists(sub)) { char * nametmp = reusableBuffer.modelsel.mainname; strcat_modelname (nametmp, sub); - POPUP_CONFIRMATION(STR_DELETEMODEL); + POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); SET_WARNING_INFO(nametmp, sizeof(g_model.header.name), 0); killEvents(event); break; diff --git a/radio/src/gui/212x64/model_telemetry.cpp b/radio/src/gui/212x64/model_telemetry.cpp index 13c2f1c21..5c4f5af2d 100644 --- a/radio/src/gui/212x64/model_telemetry.cpp +++ b/radio/src/gui/212x64/model_telemetry.cpp @@ -506,7 +506,7 @@ void menuModelTelemetryFrsky(event_t event) s_editMode = 0; if (attr && event==EVT_KEY_LONG(KEY_ENTER)) { killEvents(KEY_ENTER); - POPUP_CONFIRMATION(STR_CONFIRMDELETE); + POPUP_CONFIRMATION(STR_CONFIRMDELETE, nullptr); } break; diff --git a/radio/src/gui/212x64/popups.cpp b/radio/src/gui/212x64/popups.cpp index 93b8693bf..e8c19f932 100644 --- a/radio/src/gui/212x64/popups.cpp +++ b/radio/src/gui/212x64/popups.cpp @@ -86,6 +86,8 @@ void showAlertBox(const char * title, const char * text, const char * action, ui void runPopupWarning(event_t event) { + warningResult = false; + drawMessageBox(warningText); if (warningInfoText) { @@ -99,12 +101,22 @@ void runPopupWarning(event_t event) if (warningType == WARNING_TYPE_ASTERISK) break; - if (warningType != WARNING_TYPE_INFO) - popupMenuHandler(STR_OK); + if (warningType == WARNING_TYPE_CONFIRM) { + warningType = WARNING_TYPE_ASTERISK; + warningText = nullptr; + warningResult = true; + if (popupMenuHandler) + popupMenuHandler(STR_OK); + break; + } // no break case EVT_KEY_BREAK(KEY_EXIT): - warningText = NULL; + if (warningType == WARNING_TYPE_CONFIRM) { + if (popupMenuHandler) + popupMenuHandler(STR_EXIT); + } + warningText = nullptr; warningType = WARNING_TYPE_ASTERISK; break; } diff --git a/radio/src/gui/212x64/popups.h b/radio/src/gui/212x64/popups.h index 65f0881b4..b3d9aa1ee 100644 --- a/radio/src/gui/212x64/popups.h +++ b/radio/src/gui/212x64/popups.h @@ -39,7 +39,7 @@ extern uint8_t warningInfoFlags; #define DISPLAY_WARNING (*popupFunc) #define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) -#define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) +#define POPUP_CONFIRMATION(s, func) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning, popupMenuHandler = func) #define POPUP_INPUT(s, func) (warningText = s, popupFunc = func) #define WARNING_INFO_FLAGS warningInfoFlags #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) diff --git a/radio/src/gui/212x64/radio_setup.cpp b/radio/src/gui/212x64/radio_setup.cpp index cce07e5cf..684ba39af 100644 --- a/radio/src/gui/212x64/radio_setup.cpp +++ b/radio/src/gui/212x64/radio_setup.cpp @@ -460,7 +460,7 @@ void menuRadioSetup(event_t event) if (g_eeGeneral.fai) POPUP_WARNING("FAI\001mode blocked!"); else - POPUP_CONFIRMATION("FAI mode?"); + POPUP_CONFIRMATION("FAI mode?", nullptr); } break; #endif diff --git a/radio/src/gui/212x64/radio_version.cpp b/radio/src/gui/212x64/radio_version.cpp index fb864c11a..ed4045ba1 100644 --- a/radio/src/gui/212x64/radio_version.cpp +++ b/radio/src/gui/212x64/radio_version.cpp @@ -46,6 +46,6 @@ void menuRadioVersion(event_t event) eepromBackup(); } else if (event == EVT_KEY_LONG(KEY_MENU)) { - POPUP_CONFIRMATION(STR_CONFIRMRESET); + POPUP_CONFIRMATION(STR_CONFIRMRESET, nullptr); } } diff --git a/radio/src/gui/212x64/view_statistics.cpp b/radio/src/gui/212x64/view_statistics.cpp index e980092be..191a4a95b 100644 --- a/radio/src/gui/212x64/view_statistics.cpp +++ b/radio/src/gui/212x64/view_statistics.cpp @@ -149,7 +149,7 @@ void menuStatisticsDebug(event_t event) #if defined(WATCHDOG_TEST) case EVT_KEY_LONG(KEY_MENU): { - POPUP_CONFIRMATION("Test the watchdog?"); + POPUP_CONFIRMATION("Test the watchdog?", nullptr); const char * w = "The radio will reset!"; SET_WARNING_INFO(w, strlen(w), 0); } diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index a3699fc03..ef652d316 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -82,7 +82,7 @@ void onSdManagerMenu(const char * result) pushMenu(menuRadioSdManagerInfo); } else if (result == STR_SD_FORMAT) { - POPUP_CONFIRMATION(STR_CONFIRM_FORMAT); + POPUP_CONFIRMATION(STR_CONFIRM_FORMAT, nullptr); } else if (result == STR_COPY_FILE) { clipboard.type = CLIPBOARD_TYPE_SD_FILE; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index c1fc97bc8..32f1db946 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -2041,7 +2041,7 @@ uint32_t pwrCheck() lcdRefreshWait(); lcdClear(); - POPUP_CONFIRMATION(STR_MODEL_SHUTDOWN); + POPUP_CONFIRMATION(STR_MODEL_SHUTDOWN, nullptr); SET_WARNING_INFO(STR_MODEL_STILL_POWERED, sizeof(TR_MODEL_STILL_POWERED), 0); event_t evt = getEvent(false); DISPLAY_WARNING(evt); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 27fcec425..a9821c9c7 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1144,10 +1144,10 @@ union ReusableBuffer struct { uint8_t state; // 0x00 = READ 0x40 = WRITE tmr10ms_t timeout; - tmr10ms_t dirtyTimeout; tmr10ms_t updateTime; uint8_t receiverId; - uint8_t channelMapping[24]; + uint8_t outputsCount; + uint8_t outputsMapping[24]; uint8_t telemetryDisabled; uint8_t pwmRate; uint8_t dirty; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index eb1eebee1..71f4c0400 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -162,15 +162,17 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_WRITE) flag0 |= PXX2_RX_SETTINGS_FLAG0_WRITE; Pxx2Transport::addByte(flag0); - uint8_t flag1 = 0; - if (reusableBuffer.receiverSetup.telemetryDisabled) - flag1 |= PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED; - if (reusableBuffer.receiverSetup.pwmRate) - flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; - Pxx2Transport::addByte(flag1); - uint8_t channelsCount = sentModuleChannels(module); - for (int i = 0; i < channelsCount; i++) { - Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); + if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_WRITE) { + uint8_t flag1 = 0; + if (reusableBuffer.receiverSetup.telemetryDisabled) + flag1 |= PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED; + if (reusableBuffer.receiverSetup.pwmRate) + flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; + Pxx2Transport::addByte(flag1); + uint8_t outputsCount = min(16, reusableBuffer.receiverSetup.outputsCount); + for (int i = 0; i < outputsCount; i++) { + Pxx2Transport::addByte(reusableBuffer.receiverSetup.outputsMapping[i]); + } } reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 200/*next try in 2s*/; } diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 0cab9aab7..09e38b652 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -751,8 +751,8 @@ #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define EXTMODULE_PWR_GPIO GPIOA #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PA.08 - #define EXTERNAL_MODULE_ON() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) - #define EXTERNAL_MODULE_OFF() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define EXTERNAL_MODULE_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_RESET) #else #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 6dcdcf7f6..f309d3b4a 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -66,17 +66,18 @@ void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) return; } - uint8_t channelsCount = sentModuleChannels(module); - for (uint8_t pin = 0; pin < channelsCount; pin++) { - reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; - } - if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FASTPWM) reusableBuffer.receiverSetup.pwmRate = 1; if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED) reusableBuffer.receiverSetup.telemetryDisabled = 1; + uint8_t outputsCount = min(16, frame[0] - 4); + reusableBuffer.receiverSetup.outputsCount = outputsCount; + for (uint8_t pin = 0; pin < outputsCount; pin++) { + reusableBuffer.receiverSetup.outputsMapping[pin] = frame[5 + pin]; + } + reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_OK; reusableBuffer.receiverSetup.timeout = 0; moduleSettings[module].mode = MODULE_MODE_NORMAL; From 13781db5c3f4c054557a31c42850e7987559d2b8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 15:46:43 +0100 Subject: [PATCH 404/446] Change reverted (commited by mistake, only needed on my board) --- radio/src/targets/taranis/hal.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 09e38b652..0cab9aab7 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -751,8 +751,8 @@ #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define EXTMODULE_PWR_GPIO GPIOA #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PA.08 - #define EXTERNAL_MODULE_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) - #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define EXTERNAL_MODULE_ON() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define EXTERNAL_MODULE_OFF() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_RESET) #else #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) From 2d3f268b099705f112c069e6e7028cfca87c1548 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 15:53:09 +0100 Subject: [PATCH 405/446] Common code merged --- radio/src/gui/128x64/popups.cpp | 52 -------------------------- radio/src/gui/212x64/popups.cpp | 49 ------------------------ radio/src/gui/common/stdlcd/popups.cpp | 50 +++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 101 deletions(-) diff --git a/radio/src/gui/128x64/popups.cpp b/radio/src/gui/128x64/popups.cpp index 8c790fb62..7e773f5f6 100644 --- a/radio/src/gui/128x64/popups.cpp +++ b/radio/src/gui/128x64/popups.cpp @@ -72,55 +72,3 @@ void drawAlertBox(const char * title, const char * text, const char * action) #undef MESSAGE_LCD_OFFSET } - -void showAlertBox(const char * title, const char * text, const char * action , uint8_t sound) -{ - drawAlertBox(title, text, action); - - AUDIO_ERROR_MESSAGE(sound); - - lcdRefresh(); - lcdSetContrast(); - clearKeyEvents(); - backlightOn(); - checkBacklight(); -} - -void runPopupWarning(event_t event) -{ - warningResult = false; - - drawMessageBox(); - - if (warningInfoText) { - lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH, warningInfoText, warningInfoLength, WARNING_INFO_FLAGS); - } - - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT)); - - switch (event) { - case EVT_KEY_BREAK(KEY_ENTER): - if (warningType == WARNING_TYPE_ASTERISK) - // key ignored, the user has to press [EXIT] - break; - - if (warningType == WARNING_TYPE_CONFIRM) { - warningType = WARNING_TYPE_ASTERISK; - warningText = nullptr; - warningResult = true; - if (popupMenuHandler) - popupMenuHandler(STR_OK); - break; - } - // no break - - case EVT_KEY_BREAK(KEY_EXIT): - if (warningType == WARNING_TYPE_CONFIRM) { - if (popupMenuHandler) - popupMenuHandler(STR_EXIT); - } - warningText = nullptr; - warningType = WARNING_TYPE_ASTERISK; - break; - } -} diff --git a/radio/src/gui/212x64/popups.cpp b/radio/src/gui/212x64/popups.cpp index e8c19f932..3a85afb4c 100644 --- a/radio/src/gui/212x64/popups.cpp +++ b/radio/src/gui/212x64/popups.cpp @@ -72,52 +72,3 @@ void drawAlertBox(const char * title, const char * text, const char * action) #undef MESSAGE_LCD_OFFSET } - -void showAlertBox(const char * title, const char * text, const char * action, uint8_t sound) -{ - drawAlertBox(title, text, action); - AUDIO_ERROR_MESSAGE(sound); - lcdRefresh(); - lcdSetContrast(); - clearKeyEvents(); - backlightOn(); - checkBacklight(); -} - -void runPopupWarning(event_t event) -{ - warningResult = false; - - drawMessageBox(warningText); - - if (warningInfoText) { - lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH, warningInfoText, warningInfoLength, WARNING_INFO_FLAGS); - } - - lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT)); - - switch (event) { - case EVT_KEY_BREAK(KEY_ENTER): - if (warningType == WARNING_TYPE_ASTERISK) - break; - - if (warningType == WARNING_TYPE_CONFIRM) { - warningType = WARNING_TYPE_ASTERISK; - warningText = nullptr; - warningResult = true; - if (popupMenuHandler) - popupMenuHandler(STR_OK); - break; - } - // no break - - case EVT_KEY_BREAK(KEY_EXIT): - if (warningType == WARNING_TYPE_CONFIRM) { - if (popupMenuHandler) - popupMenuHandler(STR_EXIT); - } - warningText = nullptr; - warningType = WARNING_TYPE_ASTERISK; - break; - } -} diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index 0937d0a5c..69293745a 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -134,3 +134,53 @@ const char * runPopupMenu(event_t event) return result; } + +void runPopupWarning(event_t event) +{ + warningResult = false; + + drawMessageBox(); + + if (warningInfoText) { + lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH, warningInfoText, warningInfoLength, WARNING_INFO_FLAGS); + } + + lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, warningType == WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT)); + + switch (event) { + case EVT_KEY_BREAK(KEY_ENTER): + if (warningType == WARNING_TYPE_ASTERISK) + // key ignored, the user has to press [EXIT] + break; + + if (warningType == WARNING_TYPE_CONFIRM) { + warningType = WARNING_TYPE_ASTERISK; + warningText = nullptr; + warningResult = true; + if (popupMenuHandler) + popupMenuHandler(STR_OK); + break; + } + // no break + + case EVT_KEY_BREAK(KEY_EXIT): + if (warningType == WARNING_TYPE_CONFIRM) { + if (popupMenuHandler) + popupMenuHandler(STR_EXIT); + } + warningText = nullptr; + warningType = WARNING_TYPE_ASTERISK; + break; + } +} + +void showAlertBox(const char * title, const char * text, const char * action , uint8_t sound) +{ + drawAlertBox(title, text, action); + AUDIO_ERROR_MESSAGE(sound); + lcdRefresh(); + lcdSetContrast(); + clearKeyEvents(); + backlightOn(); + checkBacklight(); +} From e43ad9adc612c6e5d32f72996f7d95fc211bfafb Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 17:54:32 +0100 Subject: [PATCH 406/446] TX options added --- radio/src/gui/128x64/menus.cpp | 7 + radio/src/gui/128x64/menus.h | 1 + radio/src/gui/128x64/model_setup.cpp | 201 +++++++++++++++++++------ radio/src/gui/128x64/radio_version.cpp | 88 +++++++++-- radio/src/opentx.h | 32 ++-- radio/src/pulses/pulses.h | 1 + radio/src/pulses/pxx2.cpp | 43 ++++-- radio/src/pulses/pxx2.h | 21 ++- radio/src/telemetry/frsky_pxx2.cpp | 49 ++++-- radio/src/translations.h | 2 +- 10 files changed, 348 insertions(+), 97 deletions(-) diff --git a/radio/src/gui/128x64/menus.cpp b/radio/src/gui/128x64/menus.cpp index e153fda4e..e09448460 100644 --- a/radio/src/gui/128x64/menus.cpp +++ b/radio/src/gui/128x64/menus.cpp @@ -33,6 +33,13 @@ void popMenu() TRACE("popMenu(%d)", menuLevel); } +void abortPopMenu() +{ + menuLevel = menuLevel + 1; + menuEvent = 0; + TRACE("popMenu(%d) aborted", menuLevel); +} + void chainMenu(MenuHandlerFunc newMenu) { menuHandlers[menuLevel] = newMenu; diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index b8890dc0d..0f7c64342 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -56,6 +56,7 @@ extern uint8_t menuEvent; void chainMenu(MenuHandlerFunc newMenu); void pushMenu(MenuHandlerFunc newMenu); void popMenu(); +void abortPopMenu(); inline bool isRadioMenuDisplayed() { diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 15a670a52..83f331138 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -39,6 +39,7 @@ void drawReceiverName(uint8_t x, uint8_t y, uint8_t receiverSlot) } void menuModelFailsafe(event_t event); +void menuModelModuleOptions(event_t event); void menuModelReceiverOptions(event_t event); #if defined(PCBTARANIS) @@ -100,6 +101,7 @@ enum MenuModelSetupItems { #endif ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_INTERNAL_MODULE_PXX2_REGISTER_RANGE, + ITEM_MODEL_INTERNAL_MODULE_PXX2_OPTIONS, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE, @@ -136,6 +138,7 @@ enum MenuModelSetupItems { #endif ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, ITEM_MODEL_EXTERNAL_MODULE_PXX2_REGISTER_RANGE, + ITEM_MODEL_EXTERNAL_MODULE_PXX2_OPTIONS, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE, @@ -188,7 +191,7 @@ enum MenuModelSetupItems { #if defined(PCBTARANIS) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) - #define CURRENT_RECEIVER_EDITED(k) ((k - (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL : ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL)) / 3) + #define CURRENT_RECEIVER_EDITED(k) ((k - (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL : ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL)) / (ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL)) #elif defined(PCBSKY9X) && !defined(REVA) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) #else @@ -207,7 +210,7 @@ enum MenuModelSetupItems { #define INTERNAL_MODULE_MODE_ROWS 0 // (OFF / RF protocols) #endif -#define IF_INTERNAL_MODULE_ON(x) (IS_INTERNAL_MODULE_ENABLED()? (uint8_t)(x) : HIDDEN_ROW ) +#define IF_INTERNAL_MODULE_ON(x) (IS_INTERNAL_MODULE_ENABLED()? (uint8_t)(x) : HIDDEN_ROW) #define IF_EXTERNAL_MODULE_ON(x) (IS_EXTERNAL_MODULE_ENABLED()? (uint8_t)(x) : HIDDEN_ROW) #define EXTERNAL_MODULE_BIND_ROWS() ((isModuleXJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) || isModuleSBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (isModulePPM(EXTERNAL_MODULE) || isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW @@ -241,26 +244,26 @@ enum MenuModelSetupItems { #if defined(PCBX7) || defined(PCBX3) #define ANTENNA_ROW #if defined(BLUETOOTH) - #define TRAINER_BLUETOOTH_M_ROW ((bluetoothDistantAddr[0] == '\0' || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) - #define TRAINER_BLUETOOTH_S_ROW (bluetoothDistantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) - #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)), + #define TRAINER_BLUETOOTH_M_ROW ((bluetoothDistantAddr[0] == '\0' || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) + #define TRAINER_BLUETOOTH_S_ROW (bluetoothDistantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) + #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)), #else #define TRAINER_BLUETOOTH_ROW #endif - #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) - #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) - #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW + #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) + #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW #elif defined(PCBXLITES) - #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), + #define ANTENNA_ROW IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(0)), #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) #define TRAINER_BLUETOOTH_M_ROW ((bluetoothDistantAddr[0] == '\0' || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) #define TRAINER_BLUETOOTH_S_ROW (bluetoothDistantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) - #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) #define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW #elif defined(PCBXLITE) - #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), + #define ANTENNA_ROW IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(0)), #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) #define TRAINER_BLUETOOTH_M_ROW ((bluetoothDistantAddr[0] == '\0' || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) #define TRAINER_BLUETOOTH_S_ROW (bluetoothDistantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) @@ -461,6 +464,7 @@ void menuModelSetup(event_t event) ANTENNA_ROW IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Module start channel IF_PXX2_MODULE(INTERNAL_MODULE, 1), // Range check and Register buttons + IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Module options IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver Name + Add/Del buttons IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 0), // Receiver Pinmap IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 0, 1), // Receiver Bind/Share @@ -488,6 +492,7 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_FREQ_ROW FAILSAFE_ROWS(EXTERNAL_MODULE), IF_PXX2_MODULE(EXTERNAL_MODULE, 1), // Range check and Register buttons + IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Module options IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Receiver Name + Add/Del buttons IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 0), // Receiver Pinmap IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 0, 1), // Receiver Bind/Share @@ -1310,6 +1315,17 @@ void menuModelSetup(event_t event) } break; + case ITEM_MODEL_INTERNAL_MODULE_PXX2_OPTIONS: + case ITEM_MODEL_EXTERNAL_MODULE_PXX2_OPTIONS: + lcdDrawText(INDENT_WIDTH, y, STR_OPTIONS); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr); + if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { + g_moduleIdx = CURRENT_MODULE_EDITED(k); + memclear(&reusableBuffer.moduleSettings, sizeof(reusableBuffer.moduleSettings)); + pushMenu(menuModelModuleOptions); + } + break; + case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS: @@ -1318,19 +1334,17 @@ void menuModelSetup(event_t event) case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_OPTIONS: - { lcdDrawText(INDENT_WIDTH * 2, y, STR_OPTIONS); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr); if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { g_moduleIdx = CURRENT_MODULE_EDITED(k); uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t receiverSlot = g_model.moduleData[g_moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; - memclear(&reusableBuffer.receiverSetup, sizeof(reusableBuffer.receiverSetup)); - reusableBuffer.receiverSetup.receiverId = receiverSlot; + memclear(&reusableBuffer.receiverSettings, sizeof(reusableBuffer.receiverSettings)); + reusableBuffer.receiverSettings.receiverId = receiverSlot; pushMenu(menuModelReceiverOptions); } - } - break; + break; case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE: @@ -1942,40 +1956,133 @@ void menuModelFailsafe(event_t event) } } -enum MenuModelReceiverOptions { +#define RECEIVER_OPTIONS_2ND_COLUMN 80 + +void onTxOptionsUpdateConfirm(const char * result) +{ + if (result == STR_OK) { + reusableBuffer.moduleSettings.state = PXX2_SETTINGS_WRITE; + reusableBuffer.moduleSettings.dirty = 0; + reusableBuffer.moduleSettings.timeout = 0; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_MODULE_SETTINGS; + } + else { + reusableBuffer.moduleSettings.dirty = 0; + popMenu(); + } +} + +enum MenuModelModuleOptionsItems { + ITEM_MODULE_SETTINGS_RF_PROTOCOL, + ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA, + ITEM_MODULE_SETTINGS_POWER, + ITEM_MODULE_SETTINGS_COUNT +}; + +void menuModelModuleOptions(event_t event) +{ + SIMPLE_SUBMENU_NOTITLE(ITEM_MODULE_SETTINGS_COUNT); + + if (menuEvent) { + moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; + if (reusableBuffer.moduleSettings.dirty) { + abortPopMenu(); + POPUP_CONFIRMATION("Update TX options?", onTxOptionsUpdateConfirm); + } + else { + return; + } + } + + int8_t sub = menuVerticalPosition; + + lcdDrawTextAlignedLeft(0, "Module options"); + lcdInvertLine(0); + + if (event == EVT_ENTRY) { +#if defined(SIMU) + reusableBuffer.moduleSettings.state = PXX2_SETTINGS_OK; +#else + moduleSettings[g_moduleIdx].mode = MODULE_MODE_MODULE_SETTINGS; +#endif + } + + if (reusableBuffer.moduleSettings.state == PXX2_SETTINGS_OK) { + for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); + + switch (i) { + case ITEM_MODULE_SETTINGS_RF_PROTOCOL: + lcdDrawText(0, y, "RF Protocol"); + lcdDrawTextAtIndex(RECEIVER_OPTIONS_2ND_COLUMN, y, STR_XJT_PROTOCOLS, reusableBuffer.moduleSettings.rfProtocol + 1, attr); + if (attr) { + reusableBuffer.moduleSettings.rfProtocol = checkIncDec(event, reusableBuffer.moduleSettings.rfProtocol, RF_PROTO_X16, RF_PROTO_LAST, 0, nullptr); + if (checkIncDec_Ret) { + reusableBuffer.moduleSettings.dirty = true; + } + } + break; + + case ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA: + reusableBuffer.moduleSettings.externalAntenna = editCheckBox(reusableBuffer.moduleSettings.externalAntenna, RECEIVER_OPTIONS_2ND_COLUMN, y, "Ext. antenna", attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.moduleSettings.dirty = true; + } + break; + + case ITEM_MODULE_SETTINGS_POWER: + lcdDrawText(0, y, "Power"); + lcdDrawNumber(RECEIVER_OPTIONS_2ND_COLUMN, y, reusableBuffer.moduleSettings.txPower, attr); + lcdDrawText(lcdNextPos, y, "dBm"); + if (attr) { + reusableBuffer.moduleSettings.txPower = checkIncDec(event, reusableBuffer.moduleSettings.txPower, -127, 127); + if (checkIncDec_Ret) { + reusableBuffer.moduleSettings.dirty = true; + } + } + break; + } + } + } + else { + lcdDrawText(4 * FW, 4 * FH, "Waiting for TX..."); + } +} + +void onRxOptionsUpdateConfirm(const char * result) +{ + if (result == STR_OK) { + reusableBuffer.receiverSettings.state = PXX2_SETTINGS_WRITE; + reusableBuffer.receiverSettings.dirty = 0; + reusableBuffer.receiverSettings.timeout = 0; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + else { + reusableBuffer.receiverSettings.dirty = 0; + popMenu(); + } +} + +enum MenuModelReceiverOptionsItems { ITEM_RECEIVER_TELEMETRY, ITEM_RECEIVER_PWM_RATE, ITEM_RECEIVER_PINMAP_FIRST }; -#define RECEIVER_OPTIONS_2ND_COLUMN 80 - -void onRxOptionsUpdateConfirm(const char * result) -{ - if (result == STR_OK) { - reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_WRITE; - reusableBuffer.receiverSetup.dirty = 0; - reusableBuffer.receiverSetup.timeout = 0; - moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - } - else { - reusableBuffer.receiverSetup.dirty = 0; - popMenu(); - } -} - void menuModelReceiverOptions(event_t event) { const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; uint8_t wbar = LCD_W / 2 - 20; - uint8_t outputsCount = min(16, reusableBuffer.receiverSetup.outputsCount); + uint8_t outputsCount = min(16, reusableBuffer.receiverSettings.outputsCount); SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + outputsCount); if (menuEvent) { moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; - if (reusableBuffer.receiverSetup.dirty) { - pushMenu(menuModelReceiverOptions); + if (reusableBuffer.receiverSettings.dirty) { + abortPopMenu(); POPUP_CONFIRMATION("Update RX options?", onRxOptionsUpdateConfirm); } else { @@ -1986,19 +2093,19 @@ void menuModelReceiverOptions(event_t event) int8_t sub = menuVerticalPosition; lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); - drawReceiverName(FW * 13, 0, reusableBuffer.receiverSetup.receiverId); + drawReceiverName(FW * 13, 0, reusableBuffer.receiverSettings.receiverId); lcdInvertLine(0); if (event == EVT_ENTRY) { #if defined(SIMU) - reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_OK; - reusableBuffer.receiverSetup.outputsCount = 8; + reusableBuffer.receiverSettings.state = PXX2_SETTINGS_OK; + reusableBuffer.receiverSettings.outputsCount = 8; #else moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; #endif } - if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_OK) { + if (reusableBuffer.receiverSettings.state == PXX2_SETTINGS_OK) { for (uint8_t k=0; k= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { + lcdDrawText(INDENT_WIDTH, y, "Model"); + lcdDrawText(12 * FW, y, modulesModels[reusableBuffer.hardware.modules[module].modelID]); + } + y += FH; + // Module version if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { lcdDrawText(INDENT_WIDTH, y, "Version"); - if (reusableBuffer.hardware.modules[module].hw_version) { - lcdDrawNumber(12 * FW, y, reusableBuffer.hardware.modules[module].hw_version, LEADING0, 3); - lcdDrawText(lcdLastRightPos, y, "/"); - lcdDrawNumber(lcdLastRightPos, y, reusableBuffer.hardware.modules[module].sw_version, LEADING0, 3); + if (reusableBuffer.hardware.modules[module].hwVersion.data) { + drawPXX2FullVersion(12 * FW, y, reusableBuffer.hardware.modules[module].hwVersion, reusableBuffer.hardware.modules[module].swVersion); } } y += FH; - // RX versions for (uint8_t receiver=0; receiver= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { lcdDrawText(INDENT_WIDTH, y, "Receiver"); lcdDrawNumber(lcdLastRightPos + 2, y, receiver + 1); - lcdDrawNumber(12 * FW, y, reusableBuffer.hardware.modules[module].receivers[receiver].hw_version, LEADING0, 3); - lcdDrawText(lcdLastRightPos, y, "/"); - lcdDrawNumber(lcdLastRightPos, y, reusableBuffer.hardware.modules[module].receivers[receiver].sw_version, LEADING0, 3); + lcdDrawText(12 * FW, y, receiversModels[reusableBuffer.hardware.modules[module].receivers[receiver].modelID]); + } + y += FH; + + // Receiver version + if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { + drawPXX2FullVersion(12 * FW, y, reusableBuffer.hardware.modules[module].receivers[receiver].hwVersion, reusableBuffer.hardware.modules[module].receivers[receiver].swVersion); } y += FH; } @@ -176,7 +240,7 @@ void menuRadioVersion(event_t event) #endif #if defined(PXX2) - lcdDrawText(0, y, BUTTON("Modules / RX version"), menuVerticalPosition == ITEM_RADIO_MODULES_VERSION ? INVERS : 0); + lcdDrawText(INDENT_WIDTH, y, BUTTON("Modules / RX version"), menuVerticalPosition == ITEM_RADIO_MODULES_VERSION ? INVERS : 0); y += FH; if (menuVerticalPosition == ITEM_RADIO_MODULES_VERSION && event == EVT_KEY_BREAK(KEY_ENTER)) { s_editMode = EDIT_SELECT_FIELD; @@ -185,14 +249,14 @@ void menuRadioVersion(event_t event) #endif #if defined(EEPROM_RLC) - lcdDrawText(0, y, BUTTON(TR_EEBACKUP), menuVerticalPosition == ITEM_RADIO_BACKUP_EEPROM ? INVERS : 0); + lcdDrawText(INDENT_WIDTH, y, BUTTON(TR_EEBACKUP), menuVerticalPosition == ITEM_RADIO_BACKUP_EEPROM ? INVERS : 0); y += FH; if (menuVerticalPosition == ITEM_RADIO_BACKUP_EEPROM && event == EVT_KEY_BREAK(KEY_ENTER)) { s_editMode = EDIT_SELECT_FIELD; eepromBackup(); } - lcdDrawText(0, y, BUTTON(TR_FACTORYRESET), menuVerticalPosition == ITEM_RADIO_FACTORY_RESET ? INVERS : 0); + lcdDrawText(INDENT_WIDTH, y, BUTTON(TR_FACTORYRESET), menuVerticalPosition == ITEM_RADIO_FACTORY_RESET ? INVERS : 0); // y += FH; if (menuVerticalPosition == ITEM_RADIO_FACTORY_RESET && event == EVT_KEY_BREAK(KEY_ENTER)) { s_editMode = EDIT_SELECT_FIELD; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index a9821c9c7..055ac369b 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1045,10 +1045,6 @@ enum AUDIO_SOUNDS { #endif #include "buzzer.h" - - - - #include "translations.h" #include "fonts.h" @@ -1141,17 +1137,25 @@ union ReusableBuffer }; } moduleSetup; + struct { + uint8_t state; // 0x00 = READ 0x40 = WRITE + tmr10ms_t timeout; + uint8_t dirty; + uint8_t rfProtocol; + uint8_t externalAntenna; + int8_t txPower; + } moduleSettings; + struct { uint8_t state; // 0x00 = READ 0x40 = WRITE tmr10ms_t timeout; - tmr10ms_t updateTime; uint8_t receiverId; - uint8_t outputsCount; - uint8_t outputsMapping[24]; + uint8_t dirty; uint8_t telemetryDisabled; uint8_t pwmRate; - uint8_t dirty; - } receiverSetup; + uint8_t outputsCount; + uint8_t outputsMapping[24]; + } receiverSettings; // 103 bytes struct { @@ -1184,11 +1188,13 @@ union ReusableBuffer struct { int8_t step; uint8_t timeout; - uint32_t hw_version; - uint32_t sw_version; + uint8_t modelID; + PXX2Version hwVersion; + PXX2Version swVersion; struct { - uint32_t hw_version; - uint32_t sw_version; + uint8_t modelID; + PXX2Version hwVersion; + PXX2Version swVersion; } receivers[PXX2_MAX_RECEIVERS_PER_MODULE]; } modules[NUM_MODULES]; uint32_t updateTime; diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 37a6d35b3..405956259 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -69,6 +69,7 @@ enum ModuleSettingsMode MODULE_MODE_SPECTRUM_ANALYSER, MODULE_MODE_POWER_METER, MODULE_MODE_GET_HARDWARE_INFO, + MODULE_MODE_MODULE_SETTINGS, MODULE_MODE_RECEIVER_SETTINGS, MODULE_MODE_BEEP_FIRST, MODULE_MODE_REGISTER = MODULE_MODE_BEEP_FIRST, diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 71f4c0400..9abb29acf 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -154,27 +154,49 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) } } +void Pxx2Pulses::setupModuleSettingsFrame(uint8_t module) +{ + if (get_tmr10ms() > reusableBuffer.moduleSettings.timeout) { + addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_TX_SETTINGS); + uint8_t flag0 = 0; + if (reusableBuffer.moduleSettings.state == PXX2_SETTINGS_WRITE) + flag0 |= PXX2_TX_SETTINGS_FLAG0_WRITE; + Pxx2Transport::addByte(flag0); + if (reusableBuffer.moduleSettings.state == PXX2_SETTINGS_WRITE) { + uint8_t flag1 = reusableBuffer.moduleSettings.rfProtocol << 4; + if (reusableBuffer.moduleSettings.externalAntenna) + flag1 |= PXX2_TX_SETTINGS_FLAG1_EXTERNAL_ANTENNA; + Pxx2Transport::addByte(flag1); + Pxx2Transport::addByte(reusableBuffer.moduleSettings.txPower); + } + reusableBuffer.moduleSettings.timeout = get_tmr10ms() + 200/*next try in 2s*/; + } + else { + setupChannelsFrame(module); + } +} + void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) { - if (get_tmr10ms() > reusableBuffer.receiverSetup.timeout) { + if (get_tmr10ms() > reusableBuffer.receiverSettings.timeout) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); - uint8_t flag0 = reusableBuffer.receiverSetup.receiverId; - if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_WRITE) + uint8_t flag0 = reusableBuffer.receiverSettings.receiverId; + if (reusableBuffer.receiverSettings.state == PXX2_SETTINGS_WRITE) flag0 |= PXX2_RX_SETTINGS_FLAG0_WRITE; Pxx2Transport::addByte(flag0); - if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_WRITE) { + if (reusableBuffer.receiverSettings.state == PXX2_SETTINGS_WRITE) { uint8_t flag1 = 0; - if (reusableBuffer.receiverSetup.telemetryDisabled) + if (reusableBuffer.receiverSettings.telemetryDisabled) flag1 |= PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED; - if (reusableBuffer.receiverSetup.pwmRate) + if (reusableBuffer.receiverSettings.pwmRate) flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; Pxx2Transport::addByte(flag1); - uint8_t outputsCount = min(16, reusableBuffer.receiverSetup.outputsCount); + uint8_t outputsCount = min(16, reusableBuffer.receiverSettings.outputsCount); for (int i = 0; i < outputsCount; i++) { - Pxx2Transport::addByte(reusableBuffer.receiverSetup.outputsMapping[i]); + Pxx2Transport::addByte(reusableBuffer.receiverSettings.outputsMapping[i]); } } - reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 200/*next try in 2s*/; + reusableBuffer.receiverSettings.timeout = get_tmr10ms() + 200/*next try in 2s*/; } else { setupChannelsFrame(module); @@ -262,6 +284,9 @@ void Pxx2Pulses::setupFrame(uint8_t module) case MODULE_MODE_GET_HARDWARE_INFO: setupHardwareInfoFrame(module); break; + case MODULE_MODE_MODULE_SETTINGS: + setupModuleSettingsFrame(module); + break; case MODULE_MODE_RECEIVER_SETTINGS: setupReceiverSettingsFrame(module); break; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 46131fff0..31e5f3a36 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -50,6 +50,9 @@ #define PXX2_RX_SETTINGS_FLAG1_READONLY (1 << 6) #define PXX2_RX_SETTINGS_FLAG1_FASTPWM (1 << 4) +#define PXX2_TX_SETTINGS_FLAG0_WRITE (1 << 6) +#define PXX2_TX_SETTINGS_FLAG1_EXTERNAL_ANTENNA (1 << 3) + enum PXX2RegisterSteps { REGISTER_START, REGISTER_RX_NAME_RECEIVED, @@ -65,9 +68,9 @@ enum PXX2BindSteps { }; enum PXX2ReceiverStatus { - RECEIVER_SETTINGS_READ, - RECEIVER_SETTINGS_WRITE, - RECEIVER_SETTINGS_OK + PXX2_SETTINGS_READ, + PXX2_SETTINGS_WRITE, + PXX2_SETTINGS_OK }; extern ModuleFifo intmoduleFifo; @@ -123,6 +126,8 @@ class Pxx2Pulses: public PxxPulses { void setupShareMode(uint8_t module); + void setupModuleSettingsFrame(uint8_t module); + void setupReceiverSettingsFrame(uint8_t module); void setupChannelsFrame(uint8_t module); @@ -192,4 +197,14 @@ class Pxx2Pulses: public PxxPulses { } }; +union PXX2Version +{ + uint16_t data; + struct { + uint8_t major; + uint8_t minor:4; + uint8_t revision:4; + }; +}; + #endif diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index f309d3b4a..208342561 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -51,15 +51,36 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) uint8_t index = frame[3]; if (index == 0xFF) { - reusableBuffer.hardware.modules[module].hw_version = *((uint16_t *)&frame[4]); - reusableBuffer.hardware.modules[module].sw_version = *((uint16_t *)&frame[6]); + reusableBuffer.hardware.modules[module].modelID = frame[4]; + reusableBuffer.hardware.modules[module].hwVersion.data = *((uint16_t *)&frame[5]); + reusableBuffer.hardware.modules[module].swVersion.data = *((uint16_t *)&frame[7]); } - else if (index < PXX2_MAX_RECEIVERS_PER_MODULE){ - reusableBuffer.hardware.modules[module].receivers[index].hw_version = *((uint16_t *)&frame[4]); - reusableBuffer.hardware.modules[module].receivers[index].sw_version = *((uint16_t *)&frame[6]); + else if (index < PXX2_MAX_RECEIVERS_PER_MODULE) { + reusableBuffer.hardware.modules[module].receivers[index].modelID = frame[4]; + reusableBuffer.hardware.modules[module].receivers[index].hwVersion.data = *((uint16_t *)&frame[5]); + reusableBuffer.hardware.modules[module].receivers[index].swVersion.data = *((uint16_t *)&frame[7]); } } +void processModuleSettingsFrame(uint8_t module, uint8_t * frame) +{ + if (moduleSettings[module].mode != MODULE_MODE_MODULE_SETTINGS) { + return; + } + + // Flag1 + reusableBuffer.moduleSettings.txPower = frame[4] >> 4; + if (frame[4] & PXX2_TX_SETTINGS_FLAG1_EXTERNAL_ANTENNA) + reusableBuffer.moduleSettings.externalAntenna = 1; + + // Power + reusableBuffer.moduleSettings.txPower = frame[5]; + + reusableBuffer.moduleSettings.state = PXX2_SETTINGS_OK; + reusableBuffer.moduleSettings.timeout = 0; + moduleSettings[module].mode = MODULE_MODE_NORMAL; +} + void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) { if (moduleSettings[module].mode != MODULE_MODE_RECEIVER_SETTINGS) { @@ -67,21 +88,21 @@ void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) } if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FASTPWM) - reusableBuffer.receiverSetup.pwmRate = 1; + reusableBuffer.receiverSettings.pwmRate = 1; if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED) - reusableBuffer.receiverSetup.telemetryDisabled = 1; + reusableBuffer.receiverSettings.telemetryDisabled = 1; uint8_t outputsCount = min(16, frame[0] - 4); - reusableBuffer.receiverSetup.outputsCount = outputsCount; + reusableBuffer.receiverSettings.outputsCount = outputsCount; for (uint8_t pin = 0; pin < outputsCount; pin++) { - reusableBuffer.receiverSetup.outputsMapping[pin] = frame[5 + pin]; + reusableBuffer.receiverSettings.outputsMapping[pin] = frame[5 + pin]; } - reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_OK; - reusableBuffer.receiverSetup.timeout = 0; + reusableBuffer.receiverSettings.state = PXX2_SETTINGS_OK; + reusableBuffer.receiverSettings.timeout = 0; moduleSettings[module].mode = MODULE_MODE_NORMAL; - } +} void processRegisterFrame(uint8_t module, uint8_t * frame) { @@ -193,6 +214,10 @@ void processModuleFrame(uint8_t module, uint8_t *frame) processGetHardwareInfoFrame(module, frame); break; + case PXX2_TYPE_ID_TX_SETTINGS: + processModuleSettingsFrame(module, frame); + break; + case PXX2_TYPE_ID_RX_SETTINGS: processReceiverSettingsFrame(module, frame); break; diff --git a/radio/src/translations.h b/radio/src/translations.h index 62e7d11e7..43b1a6792 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -980,7 +980,7 @@ extern const char STR_BUTTON_SHARE[]; #if defined(PCBTARANIS) || defined(DSM2) extern const char STR_MODULE_RANGE[]; extern const char STR_RECEIVER_OPTIONS[]; - extern const char STR_DEL_BUTTON[]; +extern const char STR_DEL_BUTTON[]; #endif extern const char STR_ABOUTUS[]; From 39d99abc3095defaba085254aa977775476b1e22 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 18:19:53 +0100 Subject: [PATCH 407/446] TX options modification --- radio/src/gui/128x64/model_setup.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 83f331138..af70b54d4 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1962,12 +1962,11 @@ void onTxOptionsUpdateConfirm(const char * result) { if (result == STR_OK) { reusableBuffer.moduleSettings.state = PXX2_SETTINGS_WRITE; - reusableBuffer.moduleSettings.dirty = 0; + reusableBuffer.moduleSettings.dirty = 2; reusableBuffer.moduleSettings.timeout = 0; moduleSettings[g_moduleIdx].mode = MODULE_MODE_MODULE_SETTINGS; } else { - reusableBuffer.moduleSettings.dirty = 0; popMenu(); } } @@ -1994,6 +1993,10 @@ void menuModelModuleOptions(event_t event) } } + if (reusableBuffer.moduleSettings.dirty == 2 && reusableBuffer.moduleSettings.state == PXX2_SETTINGS_OK) { + popMenu(); + } + int8_t sub = menuVerticalPosition; lcdDrawTextAlignedLeft(0, "Module options"); @@ -2055,12 +2058,11 @@ void onRxOptionsUpdateConfirm(const char * result) { if (result == STR_OK) { reusableBuffer.receiverSettings.state = PXX2_SETTINGS_WRITE; - reusableBuffer.receiverSettings.dirty = 0; + reusableBuffer.receiverSettings.dirty = 2; reusableBuffer.receiverSettings.timeout = 0; moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } else { - reusableBuffer.receiverSettings.dirty = 0; popMenu(); } } @@ -2090,6 +2092,10 @@ void menuModelReceiverOptions(event_t event) } } + if (reusableBuffer.moduleSettings.dirty == 2 && reusableBuffer.receiverSettings.state == PXX2_SETTINGS_OK) { + popMenu(); + } + int8_t sub = menuVerticalPosition; lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); From 07840007de892b15652721f0b9f1e64c3b848819 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 20:03:25 +0100 Subject: [PATCH 408/446] Compilation fixes --- radio/src/gui/128x64/model_curve_edit.cpp | 2 +- radio/src/gui/128x64/model_flightmodes.cpp | 6 +++--- radio/src/gui/128x64/model_setup.cpp | 4 ++-- radio/src/gui/128x64/popups.cpp | 12 ++---------- radio/src/gui/128x64/popups.h | 4 +--- radio/src/gui/128x64/view_main.cpp | 6 +++--- radio/src/gui/212x64/popups.cpp | 6 ------ radio/src/gui/212x64/popups.h | 1 - radio/src/gui/common/stdlcd/popups.cpp | 8 +++++++- radio/src/lua/interface.cpp | 2 +- 10 files changed, 20 insertions(+), 31 deletions(-) diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp index 741aca4b1..188f4c868 100644 --- a/radio/src/gui/128x64/model_curve_edit.cpp +++ b/radio/src/gui/128x64/model_curve_edit.cpp @@ -24,7 +24,7 @@ void runPopupCurvePreset(event_t event) { warningResult = false; - drawMessageBox(); + drawMessageBox(warningText); lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y+2*FH, STR_POPUPS_ENTER_EXIT); diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp index 9672d8601..a9dd6fa4a 100644 --- a/radio/src/gui/128x64/model_flightmodes.cpp +++ b/radio/src/gui/128x64/model_flightmodes.cpp @@ -39,7 +39,7 @@ enum MenuModelFlightModeItems { IF_ROTARY_ENCODERS(ITEM_MODEL_FLIGHT_MODE_ROTARY_ENCODERS) ITEM_MODEL_FLIGHT_MODE_FADE_IN, ITEM_MODEL_FLIGHT_MODE_FADE_OUT, -#if defined(GVARS) && !defined(PCBSTD) +#if defined(GVARS) ITEM_MODEL_FLIGHT_MODE_GVARS_LABEL, ITEM_MODEL_FLIGHT_MODE_GV1, ITEM_MODEL_FLIGHT_MODE_GV2, @@ -87,7 +87,7 @@ void menuModelFlightModeOne(event_t event) int8_t sub = menuVerticalPosition; int8_t editMode = s_editMode; -#if defined(GVARS) && !defined(PCBSTD) +#if defined(GVARS) if (s_currIdx == 0 && sub>=ITEM_MODEL_FLIGHT_MODE_SWITCH) sub += VERTICAL_SHIFT; for (uint8_t k=0; kfadeOut = EDIT_DELAY(0, y, event, attr, STR_FADEOUT, fm->fadeOut); break; -#if defined(GVARS) && !defined(PCBSTD) +#if defined(GVARS) case ITEM_MODEL_FLIGHT_MODE_GVARS_LABEL: lcdDrawTextAlignedLeft(y, STR_GLOBAL_VARS); break; diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index af70b54d4..ce205ec30 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -350,7 +350,7 @@ void runPopupRegister(event_t event) case EVT_KEY_BREAK(KEY_EXIT): if (s_editMode <= 0) { - warningText = NULL; + warningText = nullptr; } break; } @@ -359,7 +359,7 @@ void runPopupRegister(event_t event) const uint8_t dialogRows[] = { 0, 0, uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? READONLY_ROW : 0), uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? 0 : 1)}; check(event, 0, nullptr, 0, dialogRows, 3, 4 - HEADER_LINE); // TODO add a comment for 3 - HEADER_LINE once understood - drawMessageBox(); + drawMessageBox(warningText); // registration password lcdDrawText(WARNING_LINE_X, WARNING_LINE_Y - 4, STR_REG_ID); diff --git a/radio/src/gui/128x64/popups.cpp b/radio/src/gui/128x64/popups.cpp index 7e773f5f6..d86f076e7 100644 --- a/radio/src/gui/128x64/popups.cpp +++ b/radio/src/gui/128x64/popups.cpp @@ -27,22 +27,14 @@ uint8_t warningType; uint8_t warningResult = 0; uint8_t warningInfoFlags = ZCHAR; -void drawMessageBox() +void drawMessageBox(const char * title) { lcdDrawFilledRect(MENU_X, MENU_Y, MENU_W, 40, SOLID, ERASE); lcdDrawRect(MENU_X, MENU_Y, MENU_W, 40); - lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y, warningText, WARNING_LINE_LEN); + lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y, title, WARNING_LINE_LEN); // could be a place for a warningInfoText } -void showMessageBox(const char * str) -{ - warningText = str; - drawMessageBox(); - warningText = NULL; - lcdRefresh(); -} - const unsigned char ASTERISK_BITMAP[] = { #include "asterisk.lbm" }; diff --git a/radio/src/gui/128x64/popups.h b/radio/src/gui/128x64/popups.h index aa4a0caf9..b3f5f9fd4 100644 --- a/radio/src/gui/128x64/popups.h +++ b/radio/src/gui/128x64/popups.h @@ -30,12 +30,10 @@ #define WARNING_LINE_X 16 #define WARNING_LINE_Y 3*FH -void drawMessageBox(); +void drawMessageBox(const char * title); void showMessageBox(const char * title); void runPopupWarning(event_t event); -#define DRAW_MESSAGE_BOX(title) (warningText = title, drawMessageBox(), warningText = NULL) - extern void (*popupFunc)(event_t event); extern uint8_t warningInfoFlags; diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index 79c49be53..6be26d9e9 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -399,7 +399,7 @@ void menuMainView(event_t event) break; case EVT_KEY_FIRST(KEY_EXIT): -#if defined(GVARS) && !defined(PCBSTD) +#if defined(GVARS) if (gvarDisplayTimer > 0) { gvarDisplayTimer = 0; } @@ -551,11 +551,11 @@ void menuMainView(event_t event) } #endif -#if defined(GVARS) && !defined(PCBSTD) +#if defined(GVARS) if (gvarDisplayTimer > 0) { gvarDisplayTimer--; warningText = STR_GLOBAL_VAR; - drawMessageBox(); + drawMessageBox(warningText); lcdDrawSizedText(16, 5*FH, g_model.gvars[gvarLastChanged].name, LEN_GVAR_NAME, ZCHAR); lcdDrawText(16+6*FW, 5*FH, "[", BOLD); drawGVarValue(lcdLastRightPos, 5*FH, gvarLastChanged, GVAR_VALUE(gvarLastChanged, getGVarFlightMode(mixerCurrentFlightMode, gvarLastChanged)), LEFT|BOLD); diff --git a/radio/src/gui/212x64/popups.cpp b/radio/src/gui/212x64/popups.cpp index 3a85afb4c..f5eafda2d 100644 --- a/radio/src/gui/212x64/popups.cpp +++ b/radio/src/gui/212x64/popups.cpp @@ -35,12 +35,6 @@ void drawMessageBox(const char * title) // could be a place for a warningInfoText } -void showMessageBox(const char * title) -{ - drawMessageBox(title); - lcdRefresh(); -} - const unsigned char ASTERISK_BITMAP[] = { #include "asterisk.lbm" }; diff --git a/radio/src/gui/212x64/popups.h b/radio/src/gui/212x64/popups.h index b3d9aa1ee..8ba73f281 100644 --- a/radio/src/gui/212x64/popups.h +++ b/radio/src/gui/212x64/popups.h @@ -31,7 +31,6 @@ void drawMessageBox(const char * title); void showMessageBox(const char * title); void runPopupWarning(event_t event); -#define DRAW_MESSAGE_BOX(title) drawMessageBox(title) extern void (*popupFunc)(event_t event); extern uint8_t warningInfoFlags; diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index 69293745a..cd8d0fc6c 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -139,7 +139,7 @@ void runPopupWarning(event_t event) { warningResult = false; - drawMessageBox(); + drawMessageBox(warningText); if (warningInfoText) { lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH, warningInfoText, warningInfoLength, WARNING_INFO_FLAGS); @@ -174,6 +174,12 @@ void runPopupWarning(event_t event) } } +void showMessageBox(const char * str) +{ + drawMessageBox(str); + lcdRefresh(); +} + void showAlertBox(const char * title, const char * text, const char * action , uint8_t sound) { drawAlertBox(title, text, action); diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index 83f5d3f3a..cd035720c 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -733,7 +733,7 @@ void luaLoadPermanentScripts() void displayLuaError(const char * title) { #if !defined(COLORLCD) - DRAW_MESSAGE_BOX(title); + drawMessageBox(title); #endif if (lua_warning_info[0]) { char * split = strstr(lua_warning_info, ": "); From 061290a3e3553e9ab4e3614a36d2e69ae517ac29 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 21:16:55 +0100 Subject: [PATCH 409/446] Compilation fixes --- radio/src/gui/128x64/gui.h | 3 --- radio/src/gui/480x272/menus.h | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 3fd8bb060..beecabb63 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -361,10 +361,7 @@ void drawSleepBitmap(); void drawVerticalScrollbar(coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible); -#if defined(PCBTARANIS) void drawAlertBox(const char * title, const char * text, const char * action); -#endif - void showAlertBox(const char * title, const char * text, const char * action , uint8_t sound); #define SET_SCROLLBAR_X(x) diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index b38db2616..fa200fe54 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -483,7 +483,7 @@ extern uint8_t warningInfoFlags; #define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningType = WARNING_TYPE_ASTERISK, warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) -#define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) +#define POPUP_CONFIRMATION(s, func) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_INPUT(s, func) (warningText = s, popupFunc = func) #define WARNING_INFO_FLAGS warningInfoFlags #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) From c278598f09fecd4dd4aa3a8c803ac9643c61ab84 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 21:51:10 +0100 Subject: [PATCH 410/446] Macros simplification --- radio/src/gui/128x64/gui.h | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index beecabb63..8c32bb172 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -218,32 +218,21 @@ int8_t editSwitch(coord_t x, coord_t y, int8_t value, LcdFlags attr, event_t eve #define ON_OFF_MENU_ITEM(value, x, y, label, attr, event) value = editCheckBox(value, x, y, label, attr, event) #if defined(GVARS) - #define GVAR_MENU_ITEM(x, y, v, min, max, attr, editflags, event) editGVarFieldValue(x, y, v, min, max, attr, editflags, event) -#else - #define GVAR_MENU_ITEM(x, y, v, min, max, attr, editflags, event) editGVarFieldValue(x, y, v, min, max, attr, event) -#endif - -#if defined(GVARS) +#define GVAR_MENU_ITEM(x, y, v, min, max, attr, editflags, event) editGVarFieldValue(x, y, v, min, max, attr, editflags, event) int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, uint8_t editflags, event_t event); void drawGVarName(coord_t x, coord_t y, int8_t index, LcdFlags flags=0); void drawGVarValue(coord_t x, coord_t y, uint8_t gvar, gvar_t value, LcdFlags flags=0); void editGVarValue(coord_t x, coord_t y, event_t event, uint8_t gvar, uint8_t flightMode, LcdFlags flags); -#elif defined(GVARS) -int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, event_t event); +#define displayGVar(x, y, v, min, max) GVAR_MENU_ITEM(x, y, v, min, max, 0, 0, 0) #else int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, event_t event); +#define GVAR_MENU_ITEM(x, y, v, min, max, attr, editflags, event) editGVarFieldValue(x, y, v, min, max, attr, event) +#define displayGVar(x, y, v, min, max) lcdDraw8bitsNumber(x, y, v) #endif void gvarWeightItem(coord_t x, coord_t y, MixData * md, LcdFlags attr, event_t event); -#if defined(GVARS) -#define displayGVar(x, y, v, min, max) GVAR_MENU_ITEM(x, y, v, min, max, 0, 0, 0) -#else -#define displayGVar(x, y, v, min, max) lcdDraw8bitsNumber(x, y, v) -#endif - void editName(coord_t x, coord_t y, char * name, uint8_t size, event_t event, uint8_t active, LcdFlags attr=ZCHAR); - void editSingleName(coord_t x, coord_t y, const char * label, char * name, uint8_t size, event_t event, uint8_t active); uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint8_t delay); @@ -343,8 +332,6 @@ void onSourceLongEnterPress(const char *result); uint8_t switchToMix(uint8_t source); -void deleteExpoMix(uint8_t expo, uint8_t idx); - void drawCheckBox(coord_t x, coord_t y, uint8_t value, LcdFlags attr); extern const unsigned char sticks[] ; From 307c8d7daf0b5287fe7bec6582457fe3935fffed Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 21 Mar 2019 22:01:17 +0100 Subject: [PATCH 411/446] Compilation fix --- radio/src/gui/480x272/menus.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index fa200fe54..ade7ed28d 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -483,7 +483,6 @@ extern uint8_t warningInfoFlags; #define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningType = WARNING_TYPE_ASTERISK, warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) -#define POPUP_CONFIRMATION(s, func) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_INPUT(s, func) (warningText = s, popupFunc = func) #define WARNING_INFO_FLAGS warningInfoFlags #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) @@ -507,6 +506,15 @@ extern uint8_t s_menu_item; const char * runPopupMenu(event_t event); extern void (*popupMenuHandler)(const char * result); +inline void POPUP_CONFIRMATION(const char *s, void (* confirmHandler)(const char *) = nullptr) +{ + warningText = s; + warningType = WARNING_TYPE_CONFIRM; + warningInfoText = nullptr; + popupFunc = runPopupWarning; + popupMenuHandler = confirmHandler; +} + #define TEXT_FILENAME_MAXLEN 40 extern char s_text_file[TEXT_FILENAME_MAXLEN]; void pushMenuTextView(const char * filename); From ed1d312f2045bebcd3af05f4be35fe8d623b03b0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 22 Mar 2019 12:00:01 +0100 Subject: [PATCH 412/446] Many fixes --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- radio/src/gui/128x64/radio_version.cpp | 10 ++++++++-- radio/src/gui/common/stdlcd/popups.cpp | 3 ++- radio/src/opentx.h | 12 ++++++------ radio/src/pulses/modules.h | 4 +++- radio/src/pulses/pxx2.cpp | 4 ++-- 6 files changed, 23 insertions(+), 14 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index ce205ec30..43c3d7ae2 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -2067,7 +2067,7 @@ void onRxOptionsUpdateConfirm(const char * result) } } -enum MenuModelReceiverOptionsItems { +enum { ITEM_RECEIVER_TELEMETRY, ITEM_RECEIVER_PWM_RATE, ITEM_RECEIVER_PINMAP_FIRST @@ -2092,7 +2092,7 @@ void menuModelReceiverOptions(event_t event) } } - if (reusableBuffer.moduleSettings.dirty == 2 && reusableBuffer.receiverSettings.state == PXX2_SETTINGS_OK) { + if (reusableBuffer.receiverSettings.dirty == 2 && reusableBuffer.receiverSettings.state == PXX2_SETTINGS_OK) { popMenu(); } diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 576e365d7..4b47f5f59 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -132,7 +132,10 @@ void menuRadioModulesVersion(event_t event) // Module model if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { lcdDrawText(INDENT_WIDTH, y, "Model"); - lcdDrawText(12 * FW, y, modulesModels[reusableBuffer.hardware.modules[module].modelID]); + uint8_t modelId = reusableBuffer.hardware.modules[module].modelID; + if (modelId >= DIM(modulesModels)) + modelId = 0; + lcdDrawText(12 * FW, y, modulesModels[modelId]); } y += FH; @@ -151,7 +154,10 @@ void menuRadioModulesVersion(event_t event) if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { lcdDrawText(INDENT_WIDTH, y, "Receiver"); lcdDrawNumber(lcdLastRightPos + 2, y, receiver + 1); - lcdDrawText(12 * FW, y, receiversModels[reusableBuffer.hardware.modules[module].receivers[receiver].modelID]); + uint8_t modelId = reusableBuffer.hardware.modules[module].receivers[receiver].modelID; + if (modelId >= DIM(receiversModels)) + modelId = 0; + lcdDrawText(12 * FW, y, receiversModels[modelId]); } y += FH; diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index cd8d0fc6c..d382b2deb 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -156,9 +156,10 @@ void runPopupWarning(event_t event) if (warningType == WARNING_TYPE_CONFIRM) { warningType = WARNING_TYPE_ASTERISK; warningText = nullptr; - warningResult = true; if (popupMenuHandler) popupMenuHandler(STR_OK); + else + warningResult = true; break; } // no break diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 055ac369b..9558e2141 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1138,12 +1138,12 @@ union ReusableBuffer } moduleSetup; struct { - uint8_t state; // 0x00 = READ 0x40 = WRITE - tmr10ms_t timeout; - uint8_t dirty; - uint8_t rfProtocol; - uint8_t externalAntenna; - int8_t txPower; + uint8_t state; // 0x00 = READ 0x40 = WRITE + tmr10ms_t timeout; + uint8_t dirty; + uint8_t rfProtocol; + uint8_t externalAntenna; + int8_t txPower; } moduleSettings; struct { diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 84eb5d1b8..d73f367dd 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -192,7 +192,7 @@ inline bool isModuleDSM2(uint8_t idx) #endif // order is the same as in enum Protocols in myeeprom.h (none, ppm, pxx, pxx2, dsm, crossfire, multi, r9m, r9m2, sbus) -static const int8_t maxChannelsModules[] = { 0, 8, 8, 8, -2, 8, 4, 8, 8, 8}; // relative to 8! +static const int8_t maxChannelsModules[] = { 0, 8, 8, 16, -2, 8, 4, 8, 16, 8}; // relative to 8! static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; @@ -216,6 +216,8 @@ inline int8_t defaultModuleChannels_M8(uint8_t idx) return 0; // 8 channels else if (isModuleMultimoduleDSM2(idx)) return -1; // 7 channels + else if (isModulePXX2(idx)) + return 8; // 16 channels else return maxModuleChannels_M8(idx); } diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 9abb29acf..18727d19a 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -191,9 +191,9 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) if (reusableBuffer.receiverSettings.pwmRate) flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; Pxx2Transport::addByte(flag1); - uint8_t outputsCount = min(16, reusableBuffer.receiverSettings.outputsCount); + uint8_t outputsCount = min(24, reusableBuffer.receiverSettings.outputsCount); for (int i = 0; i < outputsCount; i++) { - Pxx2Transport::addByte(reusableBuffer.receiverSettings.outputsMapping[i]); + Pxx2Transport::addByte(min(23, reusableBuffer.receiverSettings.outputsMapping[i])); } } reusableBuffer.receiverSettings.timeout = get_tmr10ms() + 200/*next try in 2s*/; From 92e3b75e2c116a0684ebeef9c08aabe3809565cd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 22 Mar 2019 12:05:19 +0100 Subject: [PATCH 413/446] Telemetry push fix --- radio/src/pulses/pxx2.cpp | 1 + radio/src/telemetry/telemetry.h | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 18727d19a..07fe6d96f 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -113,6 +113,7 @@ void Pxx2Pulses::setupTelemetryFrame(uint8_t module) for (uint8_t i = 0; i < outputTelemetryBuffer.size; i++) { Pxx2Transport::addByte(outputTelemetryBuffer.data[i]); } + outputTelemetryBuffer.reset(); } void Pxx2Pulses::setupHardwareInfoFrame(uint8_t module) diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index e320f303a..bdab8d178 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -159,6 +159,10 @@ void logTelemetryWriteByte(uint8_t data); class OutputTelemetryBuffer { public: + OutputTelemetryBuffer() { + reset(); + } + void push(uint8_t byte) { data[size++] = byte; } @@ -174,6 +178,7 @@ class OutputTelemetryBuffer { void reset() { size = 0; trigger = 0x7E; + destination = 0xFF; } public: From 617a892c066e51b5352db9e3ca48dd3274f7ea3e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 22 Mar 2019 16:45:42 +0100 Subject: [PATCH 414/446] ADC Voltage displayed in HARDWARE page --- radio/src/gui/128x64/radio_hardware.cpp | 17 ++++++++++-- radio/src/opentx.cpp | 5 ++-- radio/src/opentx.h | 2 ++ .../targets/common/arm/stm32/adc_driver.cpp | 27 ++++++++++++------- radio/src/targets/horus/board.h | 8 +++--- radio/src/targets/horus/hal.h | 1 + radio/src/targets/taranis/board.cpp | 2 ++ radio/src/targets/taranis/board.h | 6 +++-- radio/src/targets/taranis/hal.h | 1 + 9 files changed, 50 insertions(+), 19 deletions(-) diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 01a412394..9203b40ea 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -118,6 +118,9 @@ enum MenuRadioHardwareItems { ITEM_RADIO_HARDWARE_SH, #endif ITEM_RADIO_HARDWARE_BATTERY_CALIB, +#if defined(STM32) + ITEM_RADIO_HARDWARE_RTC_BATTERY, +#endif #if defined(TX_CAPACITY_MEASUREMENT) ITEM_RADIO_HARDWARE_CAPACITY_CALIB, #endif @@ -190,6 +193,9 @@ void menuRadioHardware(event_t event) LABEL(Switches), SWITCHES_ROWS, 0 /* battery calib */, +#if defined(STM32) + READONLY_ROW, +#endif #if defined(TX_CAPACITY_MEASUREMENT) 0, #endif @@ -307,10 +313,17 @@ void menuRadioHardware(event_t event) } break; +#if defined(STM32) + case ITEM_RADIO_HARDWARE_RTC_BATTERY: + lcdDrawTextAlignedLeft(y, "RTC Batt"); + putsVolts(HW_SETTINGS_COLUMN2, y, vbattRTC, PREC2|LEFT); + break; +#endif + #if defined(TX_CAPACITY_MEASUREMENT) - case ITEM_RADIO_HARDWARE_BATTERY_CALIB: + case ITEM_RADIO_HARDWARE_CAPACITY_CALIB: lcdDrawTextAlignedLeft(y, STR_CURRENT_CALIB); - drawValueWithUnit(HW_SETTINGS_COLUMN2, y, getCurrent(), UNIT_MILLIAMPS, attr) ; + drawValueWithUnit(HW_SETTINGS_COLUMN2, y, getCurrent(), UNIT_MILLIAMPS, attr); if (attr) { CHECK_INCDEC_GENVAR(event, g_eeGeneral.txCurrentCalibration, -49, 49); } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 32f1db946..2aef36ba0 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -27,14 +27,13 @@ ModelData g_model; Clipboard clipboard; #endif - uint8_t unexpectedShutdown = 0; -/* AVR: mixer duration in 1/16ms */ +uint16_t vbattRTC; + /* ARM: mixer duration in 0.5us */ uint16_t maxMixerDuration; - uint8_t heartbeat; #if defined(OVERRIDE_CHANNEL_FUNCTION) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 9558e2141..76c44777e 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -572,6 +572,8 @@ void flightReset(uint8_t check=true); extern uint8_t unexpectedShutdown; +extern uint16_t vbattRTC; + extern uint16_t maxMixerDuration; #define DURATION_MS_PREC2(x) ((x)/20) diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index 6b21ec03d..eea2776fe 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -60,7 +60,7 @@ #define NUM_ANALOGS_ADC NUM_ANALOGS #endif -uint16_t adcValues[NUM_ANALOGS] __DMA; +uint16_t adcValues[NUM_ANALOGS + 1/*RTC*/] __DMA; void adcInit() { @@ -92,7 +92,7 @@ void adcInit() ADC_MAIN->CR1 = ADC_CR1_SCAN; ADC_MAIN->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; - ADC_MAIN->SQR1 = (NUM_ANALOGS_ADC - 1) << 20; // bits 23:20 = number of conversions + ADC_MAIN->SQR1 = (NUM_ANALOGS_ADC + 1/*RTC*/ - 1) << 20; // bits 23:20 = number of conversions #if defined(PCBX10) if (STICKS_PWM_ENABLED()) { @@ -104,25 +104,26 @@ void adcInit() ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6 } #elif defined(PCBX9E) - ADC_MAIN->SQR2 = (ADC_CHANNEL_POT4<<0) + (ADC_CHANNEL_SLIDER3<<5) + (ADC_CHANNEL_SLIDER4<<10) + (ADC_CHANNEL_BATT<<15); // conversions 7 and more + ADC_MAIN->SQR2 = (ADC_CHANNEL_POT4<<0) + (ADC_CHANNEL_SLIDER3<<5) + (ADC_CHANNEL_SLIDER4<<10) + (ADC_CHANNEL_BATT<<15) + (ADC_CHANNEL_RTC<<20); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT2<<20) + (ADC_CHANNEL_POT3<<25); // conversions 1 to 6 #elif defined(PCBXLITE) if (STICKS_PWM_ENABLED()) { ADC_MAIN->SQR2 = 0; - ADC_MAIN->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_POT2<<5) + (ADC_CHANNEL_BATT<<10); + ADC_MAIN->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_POT2<<5) + (ADC_CHANNEL_BATT<<10) + (ADC_CHANNEL_RTC<<15); } else { - ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0); + ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0) + (ADC_CHANNEL_RTC<<5); ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6 } #elif defined(PCBX7) // TODO why do we invert POT1 and POT2 here? - ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0); // conversions 7 and more + ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0) + (ADC_CHANNEL_RTC<<5); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<25) + (ADC_CHANNEL_POT2<<20); // conversions 1 to 6 #elif defined(PCBX3) + ADC_MAIN->SQR2 = (ADC_CHANNEL_RTC<<0); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_BATT<<25); // conversions 1 to 6 #else - ADC_MAIN->SQR2 = (ADC_CHANNEL_POT3<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10) + (ADC_CHANNEL_BATT<<15); // conversions 7 and more + ADC_MAIN->SQR2 = (ADC_CHANNEL_POT3<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10) + (ADC_CHANNEL_BATT<<15) + (ADC_CHANNEL_RTC<<20); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6 #endif @@ -134,13 +135,13 @@ void adcInit() ADC_DMA_Stream->CR = DMA_SxCR_PL | ADC_DMA_SxCR_CHSEL | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC; ADC_DMA_Stream->PAR = CONVERT_PTR_UINT(&ADC_MAIN->DR); ADC_DMA_Stream->M0AR = CONVERT_PTR_UINT(&adcValues[FIRST_ANALOG_ADC]); - ADC_DMA_Stream->NDTR = NUM_ANALOGS_ADC; + ADC_DMA_Stream->NDTR = NUM_ANALOGS_ADC + 1/*RTC*/; ADC_DMA_Stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0; #if defined(PCBX9E) ADC_EXT->CR1 = ADC_CR1_SCAN; ADC_EXT->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; - ADC_EXT->SQR1 = (NUM_ANALOGS_ADC_EXT-1) << 20; + ADC_EXT->SQR1 = (NUM_ANALOGS_ADC_EXT - 1) << 20; ADC_EXT->SQR2 = 0; ADC_EXT->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10); // conversions 1 to 3 ADC_EXT->SMPR1 = 0; @@ -227,6 +228,14 @@ void adcStop() { } +uint16_t getRTCBattVoltage() +{ + ADC->CCR |= ADC_CCR_VBATE; + adcSingleRead(); + ADC->CCR &= ADC_CCR_VBATE; + return adcValues[TX_RTC] * 330 / 2048; +} + #if !defined(SIMU) uint16_t getAnalogValue(uint8_t index) { diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 54531aaff..03fd11070 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -394,9 +394,10 @@ enum Analogs { #endif SLIDER_LAST = SLIDER_FIRST + NUM_SLIDERS - 1, TX_VOLTAGE, - MOUSE1, + MOUSE1, // TODO why after voltage? MOUSE2, - NUM_ANALOGS + NUM_ANALOGS, + TX_RTC = NUM_ANALOGS }; enum CalibratedAnalogs { @@ -423,9 +424,10 @@ enum CalibratedAnalogs { #define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST) #define IS_SLIDER(x) ((x)>=SLIDER_FIRST && (x)<=SLIDER_LAST) -extern uint16_t adcValues[NUM_ANALOGS]; +extern uint16_t adcValues[NUM_ANALOGS + 1/*RTC*/]; void adcInit(void); void adcRead(void); +uint16_t getRTCBattVoltage(); uint16_t getAnalogValue(uint8_t index); #define NUM_MOUSE_ANALOGS 2 #if defined(PCBX10) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 1336e5f13..88f6c0d83 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -234,6 +234,7 @@ #define ADC_CHANNEL_BATT ADC_Channel_5 // ADC3_IN5 #define ADC_CHANNEL_EXT1 ADC_Channel_6 // ADC3_IN6 #define ADC_CHANNEL_EXT2 ADC_Channel_7 // ADC3_IN7 + #define ADC_CHANNEL_RTC 0 // TODO later ... ADC1_IN18 #define ADC_MAIN ADC3 #define ADC_SAMPTIME 3 #define ADC_DMA DMA2 diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 0ef1cc30e..fd3b88ca1 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -287,6 +287,8 @@ void boardInit() enableSpeaker(); initHeadphoneTrainerSwitch(); + + vbattRTC = getRTCBattVoltage(); #endif // !defined(SIMU) } diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 7e070d33d..650e6625e 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -461,7 +461,8 @@ enum Analogs { SLIDER2, #endif TX_VOLTAGE, - NUM_ANALOGS + NUM_ANALOGS, + TX_RTC = NUM_ANALOGS }; #define NUM_POTS (POT_LAST-POT_FIRST+1) @@ -526,8 +527,9 @@ enum CalibratedAnalogs { void adcInit(void); void adcRead(void); -extern uint16_t adcValues[NUM_ANALOGS]; +extern uint16_t adcValues[NUM_ANALOGS + 1/*RTC*/]; uint16_t getAnalogValue(uint8_t index); +uint16_t getRTCBattVoltage(); // Battery driver uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 0cab9aab7..0d35df0e0 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -549,6 +549,7 @@ #define ADC_CHANNEL_POT1 ADC_Channel_11 // ADC1_IN11 #define ADC_CHANNEL_POT2 ADC_Channel_12 // ADC1_IN12 #define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10 + #define ADC_CHANNEL_RTC ADC_Channel_18 // ADC1_IN18 #elif defined(PCBX7) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 From 82f6c45c7e34d53b78a206a3bfac2411cfe0c40a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 22 Mar 2019 17:59:21 +0100 Subject: [PATCH 415/446] Compilation fix --- radio/src/targets/horus/hal.h | 1 + radio/src/targets/taranis/hal.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 88f6c0d83..64eca001d 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -197,6 +197,7 @@ #define ADC_DMA DMA2 #define ADC_DMA_Stream DMA2_Stream0 #define ADC_SAMPTIME 3 + #define ADC_CHANNEL_RTC 0 // TODO later ... ADC1_IN18 #elif defined(PCBX10) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph (RCC_APB1Periph_TIM5) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 0d35df0e0..9b8d9ddf4 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -456,6 +456,7 @@ #define ADC_SET_DMA_FLAGS() ADC_DMA->HIFCR = (DMA_HIFCR_CTCIF4 | DMA_HIFCR_CHTIF4 | DMA_HIFCR_CTEIF4 | DMA_HIFCR_CDMEIF4 | DMA_HIFCR_CFEIF4) #define ADC_TRANSFER_COMPLETE() (ADC_DMA->HISR & DMA_HISR_TCIF4) #define ADC_SAMPTIME 2 // sample time = 28 cycles +#define ADC_CHANNEL_RTC ADC_Channel_18 // ADC1_IN18 #if defined(PCBX9E) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 @@ -549,7 +550,6 @@ #define ADC_CHANNEL_POT1 ADC_Channel_11 // ADC1_IN11 #define ADC_CHANNEL_POT2 ADC_Channel_12 // ADC1_IN12 #define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10 - #define ADC_CHANNEL_RTC ADC_Channel_18 // ADC1_IN18 #elif defined(PCBX7) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 From d11a7506a1d11f5dd49cfed400f818d5b2222a33 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 22 Mar 2019 23:21:01 +0100 Subject: [PATCH 416/446] Compilation fix --- radio/src/targets/horus/adc_driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/horus/adc_driver.cpp b/radio/src/targets/horus/adc_driver.cpp index bfd6f63f4..248bd85ef 100644 --- a/radio/src/targets/horus/adc_driver.cpp +++ b/radio/src/targets/horus/adc_driver.cpp @@ -20,7 +20,7 @@ #include "opentx.h" -uint16_t adcValues[NUM_ANALOGS] __DMA; +uint16_t adcValues[NUM_ANALOGS + 1/*RTC*/] __DMA; #define ADC_CS_HIGH() (ADC_SPI_GPIO->BSRRL = ADC_SPI_PIN_CS) #define ADC_CS_LOW() (ADC_SPI_GPIO->BSRRH = ADC_SPI_PIN_CS) From 1357afeb237398afad8d479663a28775dffdc0fd Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 23 Mar 2019 11:23:54 +0100 Subject: [PATCH 417/446] multi compilation fixes --- radio/src/telemetry/multi.cpp | 4 ++-- radio/src/telemetry/telemetry.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index 6f3d0fdaa..fb1dac567 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -160,9 +160,9 @@ static void processMultiTelemetryPaket(const uint8_t *packet) case FrskySportPolling: #if defined(LUA) - if (len >= 1 && outputTelemetryBufferSize > 0 && data[0] == outputTelemetryBufferTrigger) { + if (len >= 1 && outputTelemetryBuffer.size > 0 && data[0] == outputTelemetryBuffer.trigger) { TRACE("MP Sending sport data out."); - sportSendBuffer(outputTelemetryBuffer, outputTelemetryBufferSize); + sportSendBuffer(outputTelemetryBuffer.data, outputTelemetryBuffer.size); } #endif break; diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index f17f5579f..04b37cf0b 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -259,8 +259,8 @@ void telemetryInit(uint8_t protocol) // The DIY Multi module always speaks 100000 baud regardless of the telemetry protocol in use telemetryPortInit(MULTIMODULE_BAUDRATE, TELEMETRY_SERIAL_8E2); #if defined(LUA) - outputTelemetryBufferSize = 0; - outputTelemetryBufferTrigger = 0x7E; + outputTelemetryBuffer.size = 0; + outputTelemetryBuffer.trigger = 0x7E; #endif } else if (protocol == PROTOCOL_TELEMETRY_SPEKTRUM) { From 26c0d40d4be56fbd5be75e965f514bb3a54308ea Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 24 Mar 2019 11:08:48 +0100 Subject: [PATCH 418/446] X9E prevent top LCD display overflow --- radio/src/targets/taranis/top_lcd_driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/top_lcd_driver.cpp b/radio/src/targets/taranis/top_lcd_driver.cpp index e0bf2f467..743d0784d 100644 --- a/radio/src/targets/taranis/top_lcd_driver.cpp +++ b/radio/src/targets/taranis/top_lcd_driver.cpp @@ -374,7 +374,7 @@ void setTopSecondTimer(uint32_t value) uint32_t secs = qr.rem; qr = div(qr.quot, 60); uint32_t mins = qr.rem; - uint32_t hours = qr.quot; + uint32_t hours = min(qr.quot, 99); qr = div(secs, 10); segs = OpTimeLCDsegs[qr.rem]; From 1016f042f953d8f464fbd49d65b2bc75203051cf Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 24 Mar 2019 16:49:07 +0100 Subject: [PATCH 419/446] Trio Control (TM) --- radio/src/dataconstants.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index e86acf899..7ab53511e 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -798,6 +798,6 @@ enum BluetoothModes { // PXX2 constants #define PXX2_LEN_REGISTRATION_ID 8 #define PXX2_LEN_RX_NAME 8 -#define PXX2_MAX_RECEIVERS_PER_MODULE 5 +#define PXX2_MAX_RECEIVERS_PER_MODULE 3 #endif // _DATACONSTANTS_H_ From 5d8ed05f299bc11751924f8f66b7c4fccee41349 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 25 Mar 2019 09:31:09 +0100 Subject: [PATCH 420/446] Configurable baudrate on external module for tests --- radio/src/gui/128x64/model_setup.cpp | 11 ++++++++++ .../src/targets/taranis/extmodule_driver.cpp | 22 ++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 43c3d7ae2..66c81f128 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -122,6 +122,7 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_STATUS, ITEM_MODEL_EXTERNAL_MODULE_SYNCSTATUS, #endif + ITEM_MODEL_EXTERNAL_MODULE_BAUDRATE, // TODO remove this when we have adaptative speed ITEM_MODEL_EXTERNAL_MODULE_CHANNELS, ITEM_MODEL_EXTERNAL_MODULE_NPXX2_BIND, ITEM_MODEL_EXTERNAL_MODULE_PXX2_MODEL_NUM, @@ -482,6 +483,7 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_MODE_ROWS, MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS + IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // TODO remove this when we have adaptative speed EXTERNAL_MODULE_CHANNELS_ROWS, IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, EXTERNAL_MODULE_BIND_ROWS()), // line reused for PPM: PPM settings IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // RxNum @@ -1164,6 +1166,15 @@ void menuModelSetup(event_t event) break; #endif + case ITEM_MODEL_EXTERNAL_MODULE_BAUDRATE: + extern uint32_t externalModuleBaudrate; + lcdDrawTextAlignedLeft(y, INDENT "Baudrate"); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, externalModuleBaudrate, attr | LEFT); + if (attr) { + externalModuleBaudrate = checkIncDec(event, externalModuleBaudrate / 200, 576, 2100) * 200; + } + break; + #if defined(PCBTARANIS) case ITEM_MODEL_INTERNAL_MODULE_CHANNELS: #endif diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 8af3e842f..6b8567438 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -154,8 +154,17 @@ void extmoduleInvertedSerialStart(uint32_t baudrate) NVIC_EnableIRQ(EXTMODULE_USART_IRQn); } +// TODO remove this when we have adaptative speed +uint32_t externalModuleBaudrate = 230400; +uint32_t currentExternalModuleBaudrate = 230400; + void extmoduleSendBuffer(const uint8_t * data, uint8_t size) { + // TODO remove this when we have adaptative speed + if (externalModuleBaudrate != currentExternalModuleBaudrate) { + extmodulePxx2Start(); + } + DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(EXTMODULE_USART_DMA_STREAM); DMA_InitStructure.DMA_Channel = EXTMODULE_USART_DMA_CHANNEL; @@ -178,6 +187,10 @@ void extmoduleSendBuffer(const uint8_t * data, uint8_t size) USART_DMACmd(EXTMODULE_USART, USART_DMAReq_Tx, ENABLE); } +// TODO remove this when we have adaptative speed +uint8_t counter = 0; +#include + #define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) extern "C" void EXTMODULE_USART_IRQHandler(void) { @@ -187,6 +200,9 @@ extern "C" void EXTMODULE_USART_IRQHandler(void) uint8_t data = EXTMODULE_USART->DR; if (status & USART_FLAG_ERRORS) { extmoduleFifo.errors++; + if (!counter++) { + TRACE_NOCRLF("%02X ", (uint8_t)status); + } } else { extmoduleFifo.push(data); @@ -197,7 +213,11 @@ extern "C" void EXTMODULE_USART_IRQHandler(void) void extmodulePxx2Start() { - extmoduleInvertedSerialStart(EXTMODULE_USART_PXX2_BAUDRATE); + // TODO remove this when we have adaptative speed + currentExternalModuleBaudrate = externalModuleBaudrate; + extmoduleInvertedSerialStart(externalModuleBaudrate); + + // extmoduleInvertedSerialStart(EXTMODULE_USART_PXX2_BAUDRATE); } #else void extmodulePxx2Start() From 0c99545b270972ed39f3e3d9b086392942578774 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 25 Mar 2019 17:27:57 +0100 Subject: [PATCH 421/446] Progress screen refactoring --- radio/src/dataconstants.h | 6 +- radio/src/gui/128x64/gui.h | 10 +-- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/gui/128x64/popups.cpp | 17 +---- radio/src/gui/128x64/popups.h | 51 ++++++-------- radio/src/gui/128x64/radio_version.cpp | 4 +- radio/src/gui/128x64/widgets.cpp | 16 ----- radio/src/gui/212x64/gui.h | 15 ---- radio/src/gui/212x64/model_setup.cpp | 2 +- radio/src/gui/212x64/popups.cpp | 15 ---- radio/src/gui/212x64/popups.h | 24 +++---- radio/src/gui/212x64/radio_version.cpp | 4 +- radio/src/gui/212x64/widgets.cpp | 16 ----- radio/src/gui/480x272/gui.h | 1 - radio/src/gui/480x272/menus.h | 1 - radio/src/gui/480x272/widgets.cpp | 6 +- radio/src/gui/480x272/widgets.h | 2 +- radio/src/gui/common/stdlcd/popups.cpp | 70 +++++++++++++++---- radio/src/gui/common/stdlcd/popups.h | 56 +++++++++++++++ radio/src/io/bootloader_flash.cpp | 2 +- radio/src/io/frsky_device_firmware_update.cpp | 19 +++-- radio/src/sdcard.cpp | 10 +++ radio/src/sdcard.h | 1 + radio/src/storage/eeprom_rlc.cpp | 8 +-- radio/src/translations.cpp | 3 - radio/src/translations.h | 3 - radio/src/translations/cz.h.txt | 14 ++-- radio/src/translations/de.h.txt | 6 +- radio/src/translations/en.h.txt | 6 +- radio/src/translations/es.h.txt | 6 +- radio/src/translations/fi.h.txt | 6 +- radio/src/translations/fr.h.txt | 13 ++-- radio/src/translations/it.h.txt | 4 +- radio/src/translations/nl.h.txt | 8 +-- radio/src/translations/pl.h.txt | 4 +- radio/src/translations/pt.h.txt | 6 +- radio/src/translations/se.h.txt | 4 +- 37 files changed, 226 insertions(+), 215 deletions(-) create mode 100644 radio/src/gui/common/stdlcd/popups.h diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 7ab53511e..b3854cbe0 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -585,9 +585,9 @@ enum MixSources { MIXSRC_MAX, MIXSRC_FIRST_HELI, - MIXSRC_CYC1 = MIXSRC_FIRST_HELI, LUA_EXPORT("cyc1", "Cyclic 1") - MIXSRC_CYC2, LUA_EXPORT("cyc2", "Cyclic 2") - MIXSRC_CYC3, LUA_EXPORT("cyc3", "Cyclic 3") + MIXSRC_CYC1 = MIXSRC_FIRST_HELI, LUA_EXPORT("cyc1", "Cyclic 1") + MIXSRC_CYC2, LUA_EXPORT("cyc2", "Cyclic 2") + MIXSRC_CYC3, LUA_EXPORT("cyc3", "Cyclic 3") MIXSRC_FIRST_TRIM, MIXSRC_TrimRud = MIXSRC_FIRST_TRIM, LUA_EXPORT("trim-rud", "Rudder trim") diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 8c32bb172..2a2d12834 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -40,7 +40,6 @@ #define NUM_BODY_LINES (LCD_LINES-1) #define MENU_HEADER_HEIGHT FH -#define MENU_INIT_VPOS 0 #define CURVE_SIDE_WIDTH (LCD_H/2) #define CURVE_CENTER_X (LCD_W-CURVE_SIDE_WIDTH-2) @@ -57,7 +56,6 @@ void drawSlider(coord_t x, coord_t y, uint8_t value, uint8_t max, uint8_t attr); extern int8_t checkIncDec_Ret; // global helper vars -#define EDIT_SELECT_MENU -1 #define EDIT_SELECT_FIELD 0 #define EDIT_MODIFY_FIELD 1 #define EDIT_MODIFY_STRING 2 @@ -242,12 +240,6 @@ uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint #define WARNING_TYPE_CONFIRM 1 #define WARNING_TYPE_INFO 2 -extern const char * warningText; -extern const char * warningInfoText; -extern uint8_t warningInfoLength; -extern uint8_t warningResult; -extern uint8_t warningType; - #define COPY_MODE 1 #define MOVE_MODE 2 extern uint8_t s_copyMode; @@ -343,7 +335,7 @@ void drawStick(coord_t centrex, int16_t xval, int16_t yval); void drawPotsBars(); void doMainScreenGraphics(); -void drawProgressBar(const char * label, int num, int den); +void drawProgressScreen(const char * title, const char * message, int num, int den); void drawSleepBitmap(); void drawVerticalScrollbar(coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 66c81f128..c81142904 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1825,7 +1825,7 @@ void menuModelSetup(event_t event) #if defined(PXX) if (IS_RANGECHECK_ENABLE()) { showMessageBox("RSSI: "); - lcdDrawNumber(16+4*FW, 5*FH, TELEMETRY_RSSI(), BOLD); + lcdDrawNumber(WARNING_LINE_X, 5*FH, TELEMETRY_RSSI(), BOLD); } #endif diff --git a/radio/src/gui/128x64/popups.cpp b/radio/src/gui/128x64/popups.cpp index d86f076e7..977aa801c 100644 --- a/radio/src/gui/128x64/popups.cpp +++ b/radio/src/gui/128x64/popups.cpp @@ -20,21 +20,6 @@ #include "opentx.h" -const char * warningText = NULL; -const char * warningInfoText; -uint8_t warningInfoLength; -uint8_t warningType; -uint8_t warningResult = 0; -uint8_t warningInfoFlags = ZCHAR; - -void drawMessageBox(const char * title) -{ - lcdDrawFilledRect(MENU_X, MENU_Y, MENU_W, 40, SOLID, ERASE); - lcdDrawRect(MENU_X, MENU_Y, MENU_W, 40); - lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y, title, WARNING_LINE_LEN); - // could be a place for a warningInfoText -} - const unsigned char ASTERISK_BITMAP[] = { #include "asterisk.lbm" }; @@ -55,9 +40,11 @@ void drawAlertBox(const char * title, const char * text, const char * action) #endif lcdDrawSolidFilledRect(0, 0, LCD_W, 32); + if (text) { lcdDrawTextAlignedLeft(5*FH, text); } + if (action) { lcdDrawTextAlignedLeft(7*FH, action); } diff --git a/radio/src/gui/128x64/popups.h b/radio/src/gui/128x64/popups.h index b3f5f9fd4..73edb0a84 100644 --- a/radio/src/gui/128x64/popups.h +++ b/radio/src/gui/128x64/popups.h @@ -23,20 +23,18 @@ #include -#define MENU_X 10 -#define MENU_Y 16 -#define MENU_W LCD_W - 19 +#define MESSAGEBOX_X 10 +#define MESSAGEBOX_Y 16 +#define MESSAGEBOX_W (LCD_W - 19) + +#define MENU_X MESSAGEBOX_X +#define MENU_Y MESSAGEBOX_Y +#define MENU_W MESSAGEBOX_W + #define WARNING_LINE_LEN 20 #define WARNING_LINE_X 16 #define WARNING_LINE_Y 3*FH -void drawMessageBox(const char * title); -void showMessageBox(const char * title); -void runPopupWarning(event_t event); - -extern void (*popupFunc)(event_t event); -extern uint8_t warningInfoFlags; - #if !defined(GUI) #define DISPLAY_WARNING(...) #define POPUP_WARNING(...) @@ -60,26 +58,19 @@ extern uint8_t warningInfoFlags; #define POPUP_MENU_ADD_SD_ITEM(s) #endif - #define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuItemsCount++] = s; } while (0) - #define POPUP_MENU_SELECT_ITEM(s) s_menu_item = (s > 0 ? (s < popupMenuItemsCount ? s : popupMenuItemsCount) : 0) - #define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while (0) - #define POPUP_MENU_MAX_LINES 12 - #define MENU_MAX_DISPLAY_LINES 6 - #define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) - #define POPUP_MENU_SET_BSS_FLAG() - #define POPUP_MENU_UNSET_BSS_FLAG() - enum { - MENU_OFFSET_INTERNAL, - MENU_OFFSET_EXTERNAL - }; - extern uint8_t popupMenuOffsetType; - extern uint8_t s_menu_item; +#define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuItemsCount++] = s; } while (0) +#define POPUP_MENU_SELECT_ITEM(s) s_menu_item = (s > 0 ? (s < popupMenuItemsCount ? s : popupMenuItemsCount) : 0) +#define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while (0) +#define POPUP_MENU_MAX_LINES 12 +#define MENU_MAX_DISPLAY_LINES 6 +#define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) +#define POPUP_MENU_SET_BSS_FLAG() +#define POPUP_MENU_UNSET_BSS_FLAG() +enum { + MENU_OFFSET_INTERNAL, + MENU_OFFSET_EXTERNAL +}; - extern uint16_t popupMenuOffset; - extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; - extern uint16_t popupMenuItemsCount; - const char * runPopupMenu(event_t event); - extern void (*popupMenuHandler)(const char * result); - extern const char * popupMenuTitle; +#include "../common/stdlcd/popups.h" #endif // _POPUPS_H_ diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 4b47f5f59..5adde9153 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -255,14 +255,14 @@ void menuRadioVersion(event_t event) #endif #if defined(EEPROM_RLC) - lcdDrawText(INDENT_WIDTH, y, BUTTON(TR_EEBACKUP), menuVerticalPosition == ITEM_RADIO_BACKUP_EEPROM ? INVERS : 0); + lcdDrawText(INDENT_WIDTH, y, BUTTON(STR_EEBACKUP), menuVerticalPosition == ITEM_RADIO_BACKUP_EEPROM ? INVERS : 0); y += FH; if (menuVerticalPosition == ITEM_RADIO_BACKUP_EEPROM && event == EVT_KEY_BREAK(KEY_ENTER)) { s_editMode = EDIT_SELECT_FIELD; eepromBackup(); } - lcdDrawText(INDENT_WIDTH, y, BUTTON(TR_FACTORYRESET), menuVerticalPosition == ITEM_RADIO_FACTORY_RESET ? INVERS : 0); + lcdDrawText(INDENT_WIDTH, y, BUTTON(STR_FACTORYRESET), menuVerticalPosition == ITEM_RADIO_FACTORY_RESET ? INVERS : 0); // y += FH; if (menuVerticalPosition == ITEM_RADIO_FACTORY_RESET && event == EVT_KEY_BREAK(KEY_ENTER)) { s_editMode = EDIT_SELECT_FIELD; diff --git a/radio/src/gui/128x64/widgets.cpp b/radio/src/gui/128x64/widgets.cpp index f9ba1f651..6ac179599 100644 --- a/radio/src/gui/128x64/widgets.cpp +++ b/radio/src/gui/128x64/widgets.cpp @@ -230,22 +230,6 @@ void drawStatusLine() } #endif -void drawProgressBar(const char * label, int num, int den) -{ - lcdClear(); - if (label) { - lcdDrawTextAlignedLeft(4*FH, label); - } - lcdDrawRect(4, 6*FH+4, LCD_W-8, 7); - if (num > 0 && den > 0) { - int width = ((LCD_W-12)*num)/den; - lcdDrawSolidHorizontalLine(6, 6*FH+6, width, FORCE); - lcdDrawSolidHorizontalLine(6, 6*FH+7, width, FORCE); - lcdDrawSolidHorizontalLine(6, 6*FH+8, width, FORCE); - } - lcdRefresh(); -} - const unsigned char SLEEP_BITMAP[] = { #include "sleep.lbm" }; diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index c745b07c1..6922ae328 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -32,7 +32,6 @@ #define DEFAULT_SCROLLBAR_X (LCD_W-1) #define NUM_BODY_LINES (LCD_LINES-1) #define MENU_HEADER_HEIGHT FH -#define MENU_INIT_VPOS 0 #define MODEL_BITMAP_WIDTH 64 #define MODEL_BITMAP_HEIGHT 32 @@ -55,11 +54,6 @@ inline void drawFieldLabel(coord_t x, coord_t y, const char * str) extern uint8_t modelBitmap[MODEL_BITMAP_SIZE]; bool loadModelBitmap(char * name, uint8_t * bitmap); -struct MenuItem { - const char * name; - const MenuHandlerFunc action; -}; - // Temporary no highlight extern uint8_t noHighlightCounter; #define NO_HIGHLIGHT() (noHighlightCounter > 0) @@ -71,8 +65,6 @@ void drawSplash(); void drawSecondSplash(); void drawScreenIndex(uint8_t index, uint8_t count, uint8_t attr); void drawVerticalScrollbar(coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible); -void displayMenuBar(const MenuItem * menu, int index); -void drawProgressBar(const char * label, int num, int den); void drawGauge(coord_t x, coord_t y, coord_t w, coord_t h, int32_t val, int32_t max); void drawColumnHeader(const char * const * headers, uint8_t index); void drawStick(coord_t centrex, int16_t xval, int16_t yval); @@ -86,7 +78,6 @@ typedef uint16_t FlightModesType; extern int8_t checkIncDec_Ret; // global helper vars -#define EDIT_SELECT_MENU -1 #define EDIT_SELECT_FIELD 0 #define EDIT_MODIFY_FIELD 1 #define EDIT_MODIFY_STRING 2 @@ -261,12 +252,6 @@ uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint void copySelection(char * dst, const char * src, uint8_t size); -extern const char * warningText; -extern const char * warningInfoText; -extern uint8_t warningInfoLength; -extern uint8_t warningResult; -extern uint8_t warningType; - #define COPY_MODE 1 #define MOVE_MODE 2 extern uint8_t s_copyMode; diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 4e31ea4df..1425787ae 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1240,7 +1240,7 @@ void menuModelSetup(event_t event) #if defined(PXX) if (IS_RANGECHECK_ENABLE()) { showMessageBox("RSSI: "); - lcdDrawNumber(16+4*FW, 5*FH, TELEMETRY_RSSI(), BOLD); + lcdDrawNumber(WARNING_LINE_X, 5*FH, TELEMETRY_RSSI(), BOLD | LEFT); } #endif diff --git a/radio/src/gui/212x64/popups.cpp b/radio/src/gui/212x64/popups.cpp index f5eafda2d..0802949a5 100644 --- a/radio/src/gui/212x64/popups.cpp +++ b/radio/src/gui/212x64/popups.cpp @@ -20,21 +20,6 @@ #include "opentx.h" -const char * warningText = NULL; -const char * warningInfoText; -uint8_t warningInfoLength; -uint8_t warningType; -uint8_t warningResult = 0; -uint8_t warningInfoFlags = ZCHAR; - -void drawMessageBox(const char * title) -{ - lcdDrawFilledRect(10, 16, LCD_W-20, 40, SOLID, ERASE); - lcdDrawRect(10, 16, LCD_W-20, 40); - lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y, title, WARNING_LINE_LEN); - // could be a place for a warningInfoText -} - const unsigned char ASTERISK_BITMAP[] = { #include "asterisk.lbm" }; diff --git a/radio/src/gui/212x64/popups.h b/radio/src/gui/212x64/popups.h index 8ba73f281..295419096 100644 --- a/radio/src/gui/212x64/popups.h +++ b/radio/src/gui/212x64/popups.h @@ -21,20 +21,18 @@ #ifndef _POPUPS_H_ #define _POPUPS_H_ +#define MESSAGEBOX_X 10 +#define MESSAGEBOX_Y 16 +#define MESSAGEBOX_W LCD_W - (2 * MESSAGEBOX_X) + #define MENU_X 30 #define MENU_Y 16 -#define MENU_W LCD_W-(2*MENU_X) +#define MENU_W LCD_W - (2 * MENU_X) + #define WARNING_LINE_LEN 32 #define WARNING_LINE_X 16 #define WARNING_LINE_Y 3*FH -void drawMessageBox(const char * title); -void showMessageBox(const char * title); -void runPopupWarning(event_t event); - -extern void (*popupFunc)(event_t event); -extern uint8_t warningInfoFlags; - #define DISPLAY_WARNING (*popupFunc) #define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) @@ -51,16 +49,12 @@ extern uint8_t warningInfoFlags; #define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s) #define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) #define POPUP_MENU_SET_BSS_FLAG() -extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; -extern uint16_t popupMenuItemsCount; -extern uint16_t popupMenuOffset; + enum { MENU_OFFSET_INTERNAL, MENU_OFFSET_EXTERNAL }; -extern uint8_t popupMenuOffsetType; -extern uint8_t s_menu_item; -const char * runPopupMenu(event_t event); -extern void (*popupMenuHandler)(const char * result); + +#include "../common/stdlcd/popups.h" #endif // _POPUPS_H_ diff --git a/radio/src/gui/212x64/radio_version.cpp b/radio/src/gui/212x64/radio_version.cpp index ed4045ba1..b3fbaca32 100644 --- a/radio/src/gui/212x64/radio_version.cpp +++ b/radio/src/gui/212x64/radio_version.cpp @@ -38,8 +38,8 @@ void menuRadioVersion(event_t event) lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+4*FH+1, "UID\037\033:"); lcdDrawText(5*FW+3, MENU_HEADER_HEIGHT+4*FH+1, id); - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+5*FH+1, STR_EEBACKUP); - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+6*FH+1, STR_FACTORYRESET); + lcdDrawText(INDENT_WIDTH, MENU_HEADER_HEIGHT+5*FH+1, "[ENTER Long] " STR_EEBACKUP); + lcdDrawText(INDENT_WIDTH, MENU_HEADER_HEIGHT+6*FH+1, "[MENU Long] " STR_FACTORYRESET); lcdDrawFilledRect(0, MENU_HEADER_HEIGHT+5*FH, LCD_W, 2*FH+1, SOLID); if (event == EVT_KEY_LONG(KEY_ENTER)) { diff --git a/radio/src/gui/212x64/widgets.cpp b/radio/src/gui/212x64/widgets.cpp index 2e4166f94..2cfd11b0b 100644 --- a/radio/src/gui/212x64/widgets.cpp +++ b/radio/src/gui/212x64/widgets.cpp @@ -98,22 +98,6 @@ void drawVerticalScrollbar(coord_t x, coord_t y, coord_t h, uint16_t offset, uin lcdDrawVerticalLine(x, y + yofs, yhgt, SOLID, FORCE); } -void drawProgressBar(const char * label, int num, int den) -{ - lcdClear(); - if (label) { - lcdDrawTextAlignedLeft(4*FH, label); - } - lcdDrawRect(4, 6*FH+4, LCD_W-8, 7); - if (num > 0 && den > 0) { - int width = ((LCD_W-12)*num)/den; - lcdDrawSolidHorizontalLine(6, 6*FH+6, width, FORCE); - lcdDrawSolidHorizontalLine(6, 6*FH+7, width, FORCE); - lcdDrawSolidHorizontalLine(6, 6*FH+8, width, FORCE); - } - lcdRefresh(); -} - void drawGauge(coord_t x, coord_t y, coord_t w, coord_t h, int32_t val, int32_t max) { lcdDrawRect(x, y, w+1, h); diff --git a/radio/src/gui/480x272/gui.h b/radio/src/gui/480x272/gui.h index 7eac8f04d..38e683b22 100644 --- a/radio/src/gui/480x272/gui.h +++ b/radio/src/gui/480x272/gui.h @@ -62,7 +62,6 @@ #define DATETIME_MIDDLE (LCD_W+DATETIME_SEPARATOR_X+4)/2 #define MENU_TITLE_NEXT_POS (lcdNextPos + 10) -#define MENU_INIT_VPOS -1 #if defined(HELI) && defined(GVARS) && defined(LUA_MODEL_SCRIPTS) #define MENU_ICONS_SPACING 31 diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index ade7ed28d..a3d3d66f4 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -265,7 +265,6 @@ typedef uint16_t FlightModesType; extern int8_t checkIncDec_Ret; // global helper vars -#define EDIT_SELECT_MENU -1 #define EDIT_SELECT_FIELD 0 #define EDIT_MODIFY_FIELD 1 #define EDIT_MODIFY_STRING 2 diff --git a/radio/src/gui/480x272/widgets.cpp b/radio/src/gui/480x272/widgets.cpp index 065017c6f..f726b193b 100644 --- a/radio/src/gui/480x272/widgets.cpp +++ b/radio/src/gui/480x272/widgets.cpp @@ -108,12 +108,12 @@ void drawHorizontalScrollbar(coord_t x, coord_t y, coord_t w, uint16_t offset, u } } -void drawProgressBar(const char * label, int num, int den) +void drawProgressScreen(const char * title, const char * message, int num, int den) { lcdClear(); lcdSetColor(WHITE); - if (label) { - lcdDrawText(MENUS_MARGIN_LEFT, LCD_H-42, label, CUSTOM_COLOR); + if (message) { + lcdDrawText(MENUS_MARGIN_LEFT, LCD_H-42, message, CUSTOM_COLOR); } lcdDrawRect(MENUS_MARGIN_LEFT, LCD_H-22, LCD_W-2*MENUS_MARGIN_LEFT, 15, 1, SOLID, CUSTOM_COLOR); lcdSetColor(RED); diff --git a/radio/src/gui/480x272/widgets.h b/radio/src/gui/480x272/widgets.h index 0e2784421..e8be64672 100644 --- a/radio/src/gui/480x272/widgets.h +++ b/radio/src/gui/480x272/widgets.h @@ -49,7 +49,7 @@ void drawButton(coord_t x, coord_t y, const char * label, LcdFlags attr); void drawCheckBox(coord_t x, coord_t y, uint8_t value, LcdFlags attr); void drawVerticalScrollbar(coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible); void drawHorizontalScrollbar(coord_t x, coord_t y, coord_t w, uint16_t offset, uint16_t count, uint8_t visible); -void drawProgressBar(const char * label, int num, int den); +void drawProgressScreen(const char * title, const char * message, int num, int den); void drawShadow(coord_t x, coord_t y, coord_t w, coord_t h); void drawTrimSquare(coord_t x, coord_t y); void drawHorizontalTrimPosition(coord_t x, coord_t y, int16_t dir); diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index d382b2deb..f0e1881d8 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -20,16 +20,49 @@ #include "opentx.h" -uint8_t popupMenuOffsetType = MENU_OFFSET_INTERNAL; -void (*popupFunc)(event_t event) = NULL; +const char * warningText = NULL; +const char * warningInfoText; +uint8_t warningInfoLength; +uint8_t warningType; +uint8_t warningResult = 0; +uint8_t warningInfoFlags = ZCHAR; + +uint8_t popupMenuOffsetType = MENU_OFFSET_INTERNAL; +void (* popupFunc)(event_t event) = NULL; const char * popupMenuItems[POPUP_MENU_MAX_LINES]; -uint8_t s_menu_item = 0; -uint16_t popupMenuItemsCount = 0; -uint16_t popupMenuOffset = 0; -void (* popupMenuHandler)(const char * result); +uint8_t s_menu_item = 0; +uint16_t popupMenuItemsCount = 0; +uint16_t popupMenuOffset = 0; +void (* popupMenuHandler)(const char * result); const char * popupMenuTitle = nullptr; +void drawMessageBoxBackground(coord_t top, coord_t height) +{ + // white background + lcdDrawFilledRect(MESSAGEBOX_X - 1, top - 1, MESSAGEBOX_W + 2, height + 2, SOLID, ERASE); + + // border + lcdDrawRect(MESSAGEBOX_X, top, MESSAGEBOX_W, height, SOLID, FORCE); +} + +void drawMessageBox(const char * title) +{ + // background + border + drawMessageBoxBackground(MESSAGEBOX_Y, 40); + + // title + lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y, title, WARNING_LINE_LEN); + + // could be a place for a warningInfoText +} + +void showMessageBox(const char * title) +{ + drawMessageBox(title); + lcdRefresh(); +} + const char * runPopupMenu(event_t event) { const char * result = NULL; @@ -175,12 +208,6 @@ void runPopupWarning(event_t event) } } -void showMessageBox(const char * str) -{ - drawMessageBox(str); - lcdRefresh(); -} - void showAlertBox(const char * title, const char * text, const char * action , uint8_t sound) { drawAlertBox(title, text, action); @@ -191,3 +218,22 @@ void showAlertBox(const char * title, const char * text, const char * action , u backlightOn(); checkBacklight(); } + +void drawProgressScreen(const char * title, const char * message, int num, int den) +{ + lcdClear(); + if (title) { + lcdDrawText(LCD_W / 2 - getTextWidth(title) / 2, 2*FH, title); + } + if (message) { + lcdDrawText(4, 5*FH, message); + } + lcdDrawRect(4, 6*FH+4, LCD_W-8, 7); + if (num > 0 && den > 0) { + int width = ((LCD_W-12)*num)/den; + lcdDrawSolidHorizontalLine(6, 6*FH+6, width, FORCE); + lcdDrawSolidHorizontalLine(6, 6*FH+7, width, FORCE); + lcdDrawSolidHorizontalLine(6, 6*FH+8, width, FORCE); + } + lcdRefresh(); +} diff --git a/radio/src/gui/common/stdlcd/popups.h b/radio/src/gui/common/stdlcd/popups.h new file mode 100644 index 000000000..17806561c --- /dev/null +++ b/radio/src/gui/common/stdlcd/popups.h @@ -0,0 +1,56 @@ +/* + * 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 _STDLCD_POPUPS_H_ +#define _STDLCD_POPUPS_H_ + +extern const char * warningText; +extern const char * warningInfoText; +extern uint8_t warningInfoLength; +extern uint8_t warningResult; +extern uint8_t warningType; +extern uint8_t warningInfoFlags; + +extern void (* popupFunc)(event_t event); +extern uint8_t popupMenuOffsetType; + +extern uint16_t popupMenuOffset; +extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; +extern uint16_t popupMenuItemsCount; +extern void (* popupMenuHandler)(const char * result); +extern const char * popupMenuTitle; +extern uint8_t s_menu_item; + +// Message box +void drawMessageBoxBackground(coord_t top, coord_t height); +void drawMessageBox(const char * title); +void showMessageBox(const char * title); + +// Popup menu +const char * runPopupMenu(event_t event); +void runPopupWarning(event_t event); + +// Full screen with an alert +void showAlertBox(const char * title, const char * text, const char * action , uint8_t sound); + +// Full screen with 2 lines and a progress bar +void drawProgressScreen(const char * title, const char * message, int num, int den); + +#endif // _STDLCD_POPUPS_H_ diff --git a/radio/src/io/bootloader_flash.cpp b/radio/src/io/bootloader_flash.cpp index 612fe4e88..7259b2f6a 100644 --- a/radio/src/io/bootloader_flash.cpp +++ b/radio/src/io/bootloader_flash.cpp @@ -60,7 +60,7 @@ void bootloaderFlash(const char * filename) for (int j=0; j<1024; j+=FLASH_PAGESIZE) { flashWrite(CONVERT_UINT_PTR(FIRMWARE_ADDRESS+i+j), (uint32_t *)(buffer+j)); } - drawProgressBar(STR_WRITING, i, BOOTLOADER_SIZE); + drawProgressScreen("Bootloader", STR_WRITING, i, BOOTLOADER_SIZE); #if defined(SIMU) // add an artificial delay and check for simu quit if (SIMU_SLEEP_OR_EXIT_MS(30)) diff --git a/radio/src/io/frsky_device_firmware_update.cpp b/radio/src/io/frsky_device_firmware_update.cpp index 97cfadf5e..99ab6e30c 100644 --- a/radio/src/io/frsky_device_firmware_update.cpp +++ b/radio/src/io/frsky_device_firmware_update.cpp @@ -153,6 +153,11 @@ bool DeviceFirmwareUpdate::waitState(State newState, uint32_t timeout) #if defined(SIMU) UNUSED(state); UNUSED(timeout); + static uint8_t pass = 0; + if (++pass == 10) { + pass = 0; + RTOS_WAIT_MS(1); + } return true; #else watchdogSuspend(timeout / 10); @@ -226,10 +231,10 @@ const char * DeviceFirmwareUpdate::sendPowerOn() return TR("Bottom pin no resp", "Bottom pin not responding"); } else { - return TR("Module pin no resp", "Module pin not responding"); + return TR("Device pin no resp", "Device pin not responding"); } #else - return TR("Not responding", "Module not responding"); + return TR("Not responding", "Device not responding"); #endif } @@ -272,7 +277,7 @@ const char * DeviceFirmwareUpdate::uploadFile(const char *filename) for (uint32_t i=0; i> 2; // 32 bit word offset into buffer @@ -281,7 +286,7 @@ const char * DeviceFirmwareUpdate::uploadFile(const char *filename) state = SPORT_DATA_TRANSFER, sendFrame(); if (i == 0) { - drawProgressBar(STR_WRITING, file.fptr, file.obj.objsize); + drawProgressScreen(getBasename(filename), STR_WRITING, file.fptr, file.obj.objsize); } } @@ -295,11 +300,11 @@ const char * DeviceFirmwareUpdate::uploadFile(const char *filename) const char * DeviceFirmwareUpdate::endTransfer() { if (!waitState(SPORT_DATA_REQ, 2000)) - return "Module refused data"; + return "Device refused data"; startFrame(PRIM_DATA_EOF); sendFrame(); if (!waitState(SPORT_COMPLETE, 2000)) { - return "Module rejected firmware"; + return "Device rejected firmware"; } return nullptr; } @@ -311,6 +316,8 @@ void DeviceFirmwareUpdate::flashFile(const char * filename) uint8_t intPwr = IS_INTERNAL_MODULE_ON(); uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); + drawProgressScreen(getBasename(filename), "Device reset...", 0, 0); + INTERNAL_MODULE_OFF(); EXTERNAL_MODULE_OFF(); SPORT_UPDATE_POWER_OFF(); diff --git a/radio/src/sdcard.cpp b/radio/src/sdcard.cpp index 669a40c58..52886b8e5 100644 --- a/radio/src/sdcard.cpp +++ b/radio/src/sdcard.cpp @@ -194,6 +194,16 @@ int findNextFileIndex(char * filename, uint8_t size, const char * directory) } } +const char * getBasename(const char * path) +{ + for (int8_t i = strlen(path) - 1; i >= 0; i--) { + if (path[i] == '/') { + return &path[i + 1]; + } + } + return path; +} + const char * getFileExtension(const char * filename, uint8_t size, uint8_t extMaxLen, uint8_t *fnlen, uint8_t *extlen) { int len = size; diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index e86063d8e..349b824d8 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -118,6 +118,7 @@ inline const char * SDCARD_ERROR(FRESULT result) // NOTE: 'size' must = 0 or be a valid character position within 'filename' array -- it is NOT validated const char * getFileExtension(const char * filename, uint8_t size=0, uint8_t extMaxLen=0, uint8_t *fnlen=NULL, uint8_t *extlen=NULL); +const char * getBasename(const char * path); // TODO REMOVE THE O9X FOURCC in 2.3 #if defined(PCBX12S) diff --git a/radio/src/storage/eeprom_rlc.cpp b/radio/src/storage/eeprom_rlc.cpp index 0ccb5518a..4eda3f925 100644 --- a/radio/src/storage/eeprom_rlc.cpp +++ b/radio/src/storage/eeprom_rlc.cpp @@ -867,7 +867,7 @@ void eeDeleteModel(uint8_t idx) #if defined(SDCARD) void eepromBackup() { - char filename[60]; + char path[60]; uint8_t buffer[1024]; FIL file; @@ -884,20 +884,20 @@ void eepromBackup() } // prepare the filename... - char * tmp = strAppend(filename, EEPROMS_PATH "/eeprom"); + char * tmp = strAppend(path, EEPROMS_PATH "/eeprom"); #if defined(RTCLOCK) tmp = strAppendDate(tmp, true); #endif strAppend(tmp, EEPROM_EXT); // open the file for writing... - f_open(&file, filename, FA_WRITE | FA_CREATE_ALWAYS); + f_open(&file, path, FA_WRITE | FA_CREATE_ALWAYS); for (int i=0; iSD"," [ENTER Long] Backup EEPROM->SD-Karte") -#define TR_FACTORYRESET TR("[MENU Long] Werksreset"," [MENU Long] Auf Werkseinstellungen") +#define STR_EEBACKUP TR("EEPROM->SD", "Backup EEPROM->SD-Karte") +#define STR_FACTORYRESET TR("Werksreset", "Auf Werkseinstellungen") #define TR_CONFIRMRESET TR("Alles löschen? ","ALLE Modelle+Einst. löschen?") #define TR_TO_MANY_LUA_SCRIPTS "Zu viele Lua-Skripte!" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 2987580a6..a5847f726 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -924,7 +924,7 @@ #define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. module", "Flash external module") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update error", "Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" -#define TR_WRITING TR3("\14Writing...", "\032Writing...", "Writing...") +#define STR_WRITING "Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" #define TR_EXTERNALRF "External RF" @@ -1037,8 +1037,8 @@ #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" -#define TR_EEBACKUP "EEPROM backup" -#define TR_FACTORYRESET "Factory reset" +#define STR_EEBACKUP "EEPROM backup" +#define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET TR("Erase ALL", "Erase ALL models and settings?") #define TR_TO_MANY_LUA_SCRIPTS "Too many Lua scripts!" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index c02976c82..231d43006 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -930,7 +930,7 @@ #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" -#define TR_WRITING "\032Writing..." +#define STR_WRITING "Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Interna RF" #define TR_EXTERNALRF "Externa RF" @@ -1039,8 +1039,8 @@ #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" -#define TR_EEBACKUP "\004[ENTER Long] to backup the EEPROM" -#define TR_FACTORYRESET "\012[MENU Long]: Factory reset" +#define STR_EEBACKUP "Backup the EEPROM" +#define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET "Erase ALL models and settings?" #define TR_TO_MANY_LUA_SCRIPTS "Too many Lua scripts!" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index bd63d19ec..b3226e134 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -922,7 +922,7 @@ #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" -#define TR_WRITING "\032Writing..." +#define TR_WRITING "Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" #define TR_EXTERNALRF "External RF" @@ -1031,8 +1031,8 @@ #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" -#define TR_EEBACKUP "\004[ENTER Long] to backup the EEPROM" -#define TR_FACTORYRESET "\012[MENU Long]: Factory reset" +#define STR_EEBACKUP "Backup the EEPROM" +#define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET "Erase ALL models and settings?" #define TR_TO_MANY_LUA_SCRIPTS "Too many Lua scripts!" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index ec1eba44e..9045b18fd 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1044,19 +1044,18 @@ #define TR_INPUTS "Entrées" #define TR_OUTPUTS "Sorties" #if defined(COLORLCD) -#define TR_EEBACKUP "Sauvegarder l'EEPROM" -#define TR_FACTORYRESET "RAZ d'usine" +#define STR_EEBACKUP "Sauvegarder l'EEPROM" +#define STR_FACTORYRESET "RAZ d'usine" #elif defined(PCBXLITE) -#define TR_EEBACKUP "[ENTER Long]:Sauvegarde" -#define TR_FACTORYRESET "[\300ENTER Long]: RAZ usine" +#define STR_EEBACKUP "Sauvegarde" +#define STR_FACTORYRESET "RAZ usine" #else -#define TR_EEBACKUP TR("[ENTER Long]:Sauvegarde", "\004[ENTER Long]: Sauvegarder l'EEPROM") -#define TR_FACTORYRESET TR("\001[MENU Long]: RAZ d'usine", "\016[MENU Long]: RAZ d'usine") +#define STR_EEBACKUP TR("Sauvegarde", "Sauvegarder l'EEPROM") +#define STR_FACTORYRESET "RAZ d'usine" #endif #define TR_CONFIRMRESET TR("Effacer TOUT?","Effacer TOUS modèles/réglages?") #define TR_TO_MANY_LUA_SCRIPTS "Trop de scripts lua!" - // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nom" #define TR_PHASES_HEADERS_SW "Inter" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 9958a3a34..5b2730408 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1033,8 +1033,8 @@ #define TR_SCRIPT "Script" #define TR_INPUTS "Ingresso" #define TR_OUTPUTS "Uscita" -#define TR_EEBACKUP "\004[ENTER Lungo] per copiare la EEPROM" -#define TR_FACTORYRESET "\012[MENU Lungo]: Inizializza dati" +#define STR_EEBACKUP "Copiare la EEPROM" +#define STR_FACTORYRESET "Inizializza dati" #define TR_CONFIRMRESET "Resettare TUTTI i dati?" #define TR_TO_MANY_LUA_SCRIPTS "Troppi Scripts Lua!" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 3df6734d7..2671ca6fb 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1035,11 +1035,11 @@ #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" #if defined(COLORLCD) -#define TR_EEBACKUP "EEPROM backup" -#define TR_FACTORYRESET "Factory reset" +#define STR_EEBACKUP "EEPROM backup" +#define STR_FACTORYRESET "Factory reset" #else -#define TR_EEBACKUP TR("\001[ENTER Lang]: Backup", "\012[ENTER Lang]: EEPROM backup => SD") -#define TR_FACTORYRESET TR("\001[MENU Lang]: Fact. reset", "\012[MENU Lang]: Factory reset") +#define STR_EEBACKUP TR("Backup", "EEPROM backup => SD") +#define STR_FACTORYRESET TR("Fact. reset", "Factory reset") #endif #define TR_CONFIRMRESET TR("Wis Alles?", "Wis ALLE modellen en instellingen?") diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 5439f35d8..b31b60316 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1034,8 +1034,8 @@ #define TR_SCRIPT "Skrypt" #define TR_INPUTS "Wejścia" #define TR_OUTPUTS "Wyjścia" -#define TR_EEBACKUP "\012[ENTER Długo] Backup EEPROMu" -#define TR_FACTORYRESET "\012[MENU Long]: Ustaw.Fabrycz" +#define STR_EEBACKUP "Backup EEPROMu" +#define STR_FACTORYRESET "Ustaw.Fabrycz" #define TR_CONFIRMRESET "WYkasować wszytkie modele? " #define TR_TO_MANY_LUA_SCRIPTS "Za dużo skryptów Lua!" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 2ed660a3e..6c5b90e30 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -929,7 +929,7 @@ #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" -#define TR_WRITING "\032Writing..." +#define STR_WRITING "Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" #define TR_EXTERNALRF "External RF" @@ -1038,8 +1038,8 @@ #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" -#define TR_EEBACKUP "\004[ENTER Long] to backup the EEPROM" -#define TR_FACTORYRESET "\012[MENU Long]: Factory reset" +#define STR_EEBACKUP "Backup the EEPROM" +#define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET "Erase ALL models and settings?" #define TR_TO_MANY_LUA_SCRIPTS "Too many Lua scripts!" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 7b6d2a81f..8eee8f3f6 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1047,8 +1047,8 @@ #define TR_SCRIPT "Programkod" #define TR_INPUTS "Input" #define TR_OUTPUTS "Outputs" -#define TR_EEBACKUP "\004[ENTER Lång] säkerhetskopiera EEPROM" -#define TR_FACTORYRESET "\012[MENU Long]: Factory reset" +#define TR_EEBACKUP "Säkerhetskopiera EEPROM" +#define TR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET "Erase ALL models and settings?" #define TR_TO_MANY_LUA_SCRIPTS "För många Lua-scripts!" From 686e95a2948d8dbf7c46439dbdabbb3d557a11c3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 25 Mar 2019 20:07:06 +0100 Subject: [PATCH 422/446] Revert external module baudrate configurable --- radio/src/gui/128x64/model_setup.cpp | 11 ----------- radio/src/targets/taranis/extmodule_driver.cpp | 15 +-------------- radio/src/targets/taranis/i2c_driver.cpp | 2 +- 3 files changed, 2 insertions(+), 26 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index c81142904..a9eaef19a 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -122,7 +122,6 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_STATUS, ITEM_MODEL_EXTERNAL_MODULE_SYNCSTATUS, #endif - ITEM_MODEL_EXTERNAL_MODULE_BAUDRATE, // TODO remove this when we have adaptative speed ITEM_MODEL_EXTERNAL_MODULE_CHANNELS, ITEM_MODEL_EXTERNAL_MODULE_NPXX2_BIND, ITEM_MODEL_EXTERNAL_MODULE_PXX2_MODEL_NUM, @@ -483,7 +482,6 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_MODE_ROWS, MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS - IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // TODO remove this when we have adaptative speed EXTERNAL_MODULE_CHANNELS_ROWS, IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, EXTERNAL_MODULE_BIND_ROWS()), // line reused for PPM: PPM settings IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // RxNum @@ -1166,15 +1164,6 @@ void menuModelSetup(event_t event) break; #endif - case ITEM_MODEL_EXTERNAL_MODULE_BAUDRATE: - extern uint32_t externalModuleBaudrate; - lcdDrawTextAlignedLeft(y, INDENT "Baudrate"); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, externalModuleBaudrate, attr | LEFT); - if (attr) { - externalModuleBaudrate = checkIncDec(event, externalModuleBaudrate / 200, 576, 2100) * 200; - } - break; - #if defined(PCBTARANIS) case ITEM_MODEL_INTERNAL_MODULE_CHANNELS: #endif diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 6b8567438..4418a95df 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -154,17 +154,8 @@ void extmoduleInvertedSerialStart(uint32_t baudrate) NVIC_EnableIRQ(EXTMODULE_USART_IRQn); } -// TODO remove this when we have adaptative speed -uint32_t externalModuleBaudrate = 230400; -uint32_t currentExternalModuleBaudrate = 230400; - void extmoduleSendBuffer(const uint8_t * data, uint8_t size) { - // TODO remove this when we have adaptative speed - if (externalModuleBaudrate != currentExternalModuleBaudrate) { - extmodulePxx2Start(); - } - DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(EXTMODULE_USART_DMA_STREAM); DMA_InitStructure.DMA_Channel = EXTMODULE_USART_DMA_CHANNEL; @@ -213,11 +204,7 @@ extern "C" void EXTMODULE_USART_IRQHandler(void) void extmodulePxx2Start() { - // TODO remove this when we have adaptative speed - currentExternalModuleBaudrate = externalModuleBaudrate; - extmoduleInvertedSerialStart(externalModuleBaudrate); - - // extmoduleInvertedSerialStart(EXTMODULE_USART_PXX2_BAUDRATE); + extmoduleInvertedSerialStart(EXTMODULE_USART_PXX2_BAUDRATE); } #else void extmodulePxx2Start() diff --git a/radio/src/targets/taranis/i2c_driver.cpp b/radio/src/targets/taranis/i2c_driver.cpp index 65138b7eb..2620312ba 100644 --- a/radio/src/targets/taranis/i2c_driver.cpp +++ b/radio/src/targets/taranis/i2c_driver.cpp @@ -179,7 +179,7 @@ uint8_t eepromIsTransferComplete() * @param NumByteToWrite : number of bytes to write to the EEPROM. * @retval None */ -bool I2C_EE_PageWrite(uint8_t* pBuffer, uint16_t WriteAddr, uint8_t NumByteToWrite) +bool I2C_EE_PageWrite(uint8_t * pBuffer, uint16_t WriteAddr, uint8_t NumByteToWrite) { if (!I2C_WaitEventCleared(I2C_FLAG_BUSY)) return false; From a70fbbf656ec602710d3b5a7ec429b802b702213 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 26 Mar 2019 09:14:39 +0100 Subject: [PATCH 423/446] Allow saving receiver setting on long enter press --- radio/src/gui/128x64/model_setup.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index a9eaef19a..a972a83a6 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -2092,6 +2092,13 @@ void menuModelReceiverOptions(event_t event) } } + if (event == EVT_KEY_LONG(KEY_ENTER)) { + reusableBuffer.receiverSettings.state = PXX2_SETTINGS_WRITE; + reusableBuffer.receiverSettings.dirty = 2; + reusableBuffer.receiverSettings.timeout = 0; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + if (reusableBuffer.receiverSettings.dirty == 2 && reusableBuffer.receiverSettings.state == PXX2_SETTINGS_OK) { popMenu(); } From e0f28d3493072b753b1af8e94e1df98b9a5e1019 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 26 Mar 2019 10:33:17 +0100 Subject: [PATCH 424/446] Fixes in RADIO / VERSION screen --- radio/src/gui/128x64/radio_version.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 5adde9153..74a846df1 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -100,16 +100,16 @@ void menuRadioModulesVersion(event_t event) TITLE("MODULES / RX VERSION"); if (event == EVT_ENTRY || get_tmr10ms() >= reusableBuffer.hardware.updateTime) { - menuVerticalOffset = 0; + // menuVerticalOffset = 0; memclear(&reusableBuffer.hardware.modules, sizeof(reusableBuffer.hardware.modules)); - if(isModulePXX2(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) { + if (isModulePXX2(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; reusableBuffer.hardware.modules[INTERNAL_MODULE].step = -1; } - if(isModulePXX2(EXTERNAL_MODULE) && IS_EXTERNAL_MODULE_ON()) { + if (isModulePXX2(EXTERNAL_MODULE) && IS_EXTERNAL_MODULE_ON()) { moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; reusableBuffer.hardware.modules[EXTERNAL_MODULE].step = -1; } @@ -120,6 +120,17 @@ void menuRadioModulesVersion(event_t event) coord_t y = (FH + 1) - menuVerticalOffset * FH; for (uint8_t module=0; module= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { if (module == INTERNAL_MODULE) From bdd9017589d5f7f44789cda0062c40544ab224fd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 26 Mar 2019 10:34:57 +0100 Subject: [PATCH 425/446] R9M @ 230400 bauds --- radio/src/pulses/pxx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index cb6d1ecd5..e082e18f0 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -43,7 +43,7 @@ #define INTMODULE_PXX_PERIOD 9/*ms*/ #endif -#define EXTMODULE_USART_PXX2_BAUDRATE 450000 +#define EXTMODULE_USART_PXX2_BAUDRATE 230400 #if defined(PXX_FREQUENCY_HIGH) && (!defined(INTMODULE_USART) || !defined(EXTMODULE_USART)) /* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */ From db316af98d8a46801494e4d1b9eb6dd12c4f7e10 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 26 Mar 2019 13:11:32 +0100 Subject: [PATCH 426/446] PXX2 refactoring + Popups refactoring --- radio/src/gui/128x64/model_custom_scripts.cpp | 2 +- radio/src/gui/128x64/model_display.cpp | 2 +- radio/src/gui/128x64/model_select.cpp | 2 +- radio/src/gui/128x64/model_setup.cpp | 2 +- .../gui/128x64/model_special_functions.cpp | 6 +- radio/src/gui/212x64/model_custom_scripts.cpp | 2 +- radio/src/gui/212x64/model_display.cpp | 2 +- radio/src/gui/212x64/model_select.cpp | 2 +- radio/src/gui/212x64/model_setup.cpp | 2 +- .../gui/212x64/model_special_functions.cpp | 4 +- .../src/gui/480x272/model_custom_scripts.cpp | 2 +- radio/src/gui/480x272/model_setup.cpp | 2 +- .../gui/480x272/model_special_functions.cpp | 4 +- radio/src/gui/480x272/screens_setup.cpp | 2 +- radio/src/gui/common/stdlcd/popups.cpp | 9 +- radio/src/main.cpp | 12 +-- radio/src/pulses/pxx2.cpp | 96 ++++++++++-------- radio/src/pulses/pxx2.h | 8 +- radio/src/targets/taranis/i2c2_driver.cpp | 98 +++++++++++++++++++ 19 files changed, 184 insertions(+), 75 deletions(-) create mode 100644 radio/src/targets/taranis/i2c2_driver.cpp diff --git a/radio/src/gui/128x64/model_custom_scripts.cpp b/radio/src/gui/128x64/model_custom_scripts.cpp index f1063e9a8..4ff56e735 100644 --- a/radio/src/gui/128x64/model_custom_scripts.cpp +++ b/radio/src/gui/128x64/model_custom_scripts.cpp @@ -37,7 +37,7 @@ void onModelCustomScriptMenu(const char *result) POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); } } - else if (result) { + else if (result != STR_EXIT) { // The user choosed a lua file in the list copySelection(sd.file, result, sizeof(sd.file)); memset(sd.inputs, 0, sizeof(sd.inputs)); diff --git a/radio/src/gui/128x64/model_display.cpp b/radio/src/gui/128x64/model_display.cpp index dc740822b..03cd4c094 100644 --- a/radio/src/gui/128x64/model_display.cpp +++ b/radio/src/gui/128x64/model_display.cpp @@ -73,7 +73,7 @@ void onTelemetryScriptFileSelectionMenu(const char *result) POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); } } - else if (result) { + else if (result != STR_EXIT) { // The user choosed a file in the list memcpy(g_model.frsky.screens[screenIndex].script.file, result, sizeof(g_model.frsky.screens[screenIndex].script.file)); storageDirty(EE_MODEL); diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index 479a0b544..8b7aa6b33 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -56,7 +56,7 @@ void onModelSelectMenu(const char * result) SET_WARNING_INFO(modelHeaders[sub].name, sizeof(g_model.header.name), ZCHAR); } #if defined(SDCARD) - else if (result) { + else if (result != STR_EXIT) { // The user choosed a file on SD to restore storageCheck(true); POPUP_WARNING(eeRestoreModel(sub, (char *)result)); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index a972a83a6..e8fbd9643 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -276,7 +276,7 @@ enum MenuModelSetupItems { void onPXX2BindMenu(const char * result) { - if (result) { + if (result != STR_EXIT) { reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex = (result - reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0]) / sizeof(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0]); reusableBuffer.moduleSetup.pxx2.bindStep = BIND_RX_NAME_SELECTED; } diff --git a/radio/src/gui/128x64/model_special_functions.cpp b/radio/src/gui/128x64/model_special_functions.cpp index f266afffa..46f1b5d53 100644 --- a/radio/src/gui/128x64/model_special_functions.cpp +++ b/radio/src/gui/128x64/model_special_functions.cpp @@ -57,12 +57,12 @@ void onCustomFunctionsFileSelectionMenu(const char * result) strcpy(directory, SOUNDS_PATH); strncpy(directory+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2); } - if (!sdListFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(cfn->play.name), NULL)) { + if (!sdListFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(cfn->play.name), nullptr)) { POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); POPUP_MENU_UNSET_BSS_FLAG(); } } - else if (result) { + else if (result != STR_EXIT) { // The user choosed a file in the list memcpy(cfn->play.name, result, sizeof(cfn->play.name)); storageDirty(eeFlags); @@ -96,7 +96,7 @@ void onAdjustGvarSourceLongEnterPress(const char * result) CFN_PARAM(cfn) = 0; storageDirty(EE_MODEL); } - else if (result) { + else if (result != STR_EXIT) { onSourceLongEnterPress(result); } } diff --git a/radio/src/gui/212x64/model_custom_scripts.cpp b/radio/src/gui/212x64/model_custom_scripts.cpp index bd9f81969..c78c06d8e 100644 --- a/radio/src/gui/212x64/model_custom_scripts.cpp +++ b/radio/src/gui/212x64/model_custom_scripts.cpp @@ -29,7 +29,7 @@ void onModelCustomScriptMenu(const char *result) POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); } } - else if (result) { + else if (result != STR_EXIT) { // The user choosed a lua file in the list copySelection(sd.file, result, sizeof(sd.file)); memset(sd.inputs, 0, sizeof(sd.inputs)); diff --git a/radio/src/gui/212x64/model_display.cpp b/radio/src/gui/212x64/model_display.cpp index 72191bfbe..0f17b6b1b 100644 --- a/radio/src/gui/212x64/model_display.cpp +++ b/radio/src/gui/212x64/model_display.cpp @@ -72,7 +72,7 @@ void onTelemetryScriptFileSelectionMenu(const char *result) POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); } } - else if (result) { + else if (result != STR_EXIT) { // The user choosed a file in the list memcpy(g_model.frsky.screens[screenIndex].script.file, result, sizeof(g_model.frsky.screens[screenIndex].script.file)); storageDirty(EE_MODEL); diff --git a/radio/src/gui/212x64/model_select.cpp b/radio/src/gui/212x64/model_select.cpp index d4bf5d37d..758abc31b 100644 --- a/radio/src/gui/212x64/model_select.cpp +++ b/radio/src/gui/212x64/model_select.cpp @@ -55,7 +55,7 @@ void onModelSelectMenu(const char * result) POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); SET_WARNING_INFO(nametmp, sizeof(g_model.header.name), 0); } - else if (result) { + else if (result != STR_EXIT) { // The user choosed a file on SD to restore storageCheck(true); POPUP_WARNING(eeRestoreModel(sub, (char *)result)); diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 1425787ae..ef98e47a2 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -148,7 +148,7 @@ void onModelSetupBitmapMenu(const char * result) POPUP_WARNING(STR_NO_BITMAPS_ON_SD); } } - else if (result) { + else if (result != STR_EXIT) { // The user choosed a bmp file in the list copySelection(g_model.header.bitmap, result, sizeof(g_model.header.bitmap)); memcpy(modelHeaders[g_eeGeneral.currModel].bitmap, g_model.header.bitmap, sizeof(g_model.header.bitmap)); diff --git a/radio/src/gui/212x64/model_special_functions.cpp b/radio/src/gui/212x64/model_special_functions.cpp index 50ffa5869..3bdbfbc74 100644 --- a/radio/src/gui/212x64/model_special_functions.cpp +++ b/radio/src/gui/212x64/model_special_functions.cpp @@ -56,7 +56,7 @@ void onCustomFunctionsFileSelectionMenu(const char * result) POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); } } - else if (result) { + else if (result != STR_EXIT) { // The user choosed a file in the list memcpy(cfn->play.name, result, sizeof(cfn->play.name)); storageDirty(eeFlags); @@ -129,7 +129,7 @@ void onAdjustGvarSourceLongEnterPress(const char * result) CFN_PARAM(cfn) = 0; storageDirty(EE_MODEL); } - else if (result) { + else if (result != STR_EXIT) { onSourceLongEnterPress(result); } } diff --git a/radio/src/gui/480x272/model_custom_scripts.cpp b/radio/src/gui/480x272/model_custom_scripts.cpp index 9a5fba277..96ab0b6ca 100644 --- a/radio/src/gui/480x272/model_custom_scripts.cpp +++ b/radio/src/gui/480x272/model_custom_scripts.cpp @@ -29,7 +29,7 @@ void onModelCustomScriptMenu(const char *result) POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); } } - else if (result) { + else if (result != STR_EXIT) { // The user choosed a lua file in the list copySelection(sd.file, result, sizeof(sd.file)); memset(sd.inputs, 0, sizeof(sd.inputs)); diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index fd9930933..5ac81e2e8 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -151,7 +151,7 @@ void onModelSetupBitmapMenu(const char * result) POPUP_WARNING(STR_NO_BITMAPS_ON_SD); } } - else if (result) { + else if (result != STR_EXIT) { // The user choosed a bmp file in the list copySelection(g_model.header.bitmap, result, sizeof(g_model.header.bitmap)); storageDirty(EE_MODEL); diff --git a/radio/src/gui/480x272/model_special_functions.cpp b/radio/src/gui/480x272/model_special_functions.cpp index 9e9695645..7d4d6c46c 100644 --- a/radio/src/gui/480x272/model_special_functions.cpp +++ b/radio/src/gui/480x272/model_special_functions.cpp @@ -56,7 +56,7 @@ void onCustomFunctionsFileSelectionMenu(const char * result) POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); } } - else if (result) { + else if (result != STR_EXIT) { // The user choosed a file in the list memcpy(cf->play.name, result, sizeof(cf->play.name)); storageDirty(eeFlags); @@ -128,7 +128,7 @@ void onAdjustGvarSourceLongEnterPress(const char * result) CFN_PARAM(cfn) = 0; storageDirty(EE_MODEL); } - else if (result) { + else if (result != STR_EXIT) { onSourceLongEnterPress(result); } } diff --git a/radio/src/gui/480x272/screens_setup.cpp b/radio/src/gui/480x272/screens_setup.cpp index 800e584fb..749bd50c2 100644 --- a/radio/src/gui/480x272/screens_setup.cpp +++ b/radio/src/gui/480x272/screens_setup.cpp @@ -53,7 +53,7 @@ void onZoneOptionFileSelectionMenu(const char * result) POPUP_WARNING(STR_NO_BITMAPS_ON_SD); } } - else if (result) { + else if (result != STR_EXIT) { fileSelectionDone = true; memcpy(fileSelection, result, sizeof(fileSelection)); } diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index f0e1881d8..e4dfe0e5f 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -65,7 +65,7 @@ void showMessageBox(const char * title) const char * runPopupMenu(event_t event) { - const char * result = NULL; + const char * result = nullptr; uint8_t display_count = min(popupMenuItemsCount, MENU_MAX_DISPLAY_LINES); uint8_t y = LCD_H / 2 - (popupMenuTitle ? 0 : 3) - (display_count * FH / 2); @@ -149,7 +149,11 @@ const char * runPopupMenu(event_t event) #endif case EVT_KEY_BREAK(KEY_ENTER): result = popupMenuItems[s_menu_item + (popupMenuOffsetType == MENU_OFFSET_INTERNAL ? popupMenuOffset : 0)]; - // no break + popupMenuItemsCount = 0; + s_menu_item = 0; + popupMenuOffset = 0; + popupMenuTitle = nullptr; + break; #if defined(CASE_EVT_ROTARY_LONG) CASE_EVT_ROTARY_LONG @@ -158,6 +162,7 @@ const char * runPopupMenu(event_t event) #endif case EVT_KEY_BREAK(KEY_EXIT): + result = STR_EXIT; popupMenuItemsCount = 0; s_menu_item = 0; popupMenuOffset = 0; diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 32be237c9..7a088558e 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -400,8 +400,6 @@ void handleGui(event_t event) { } } -bool inPopupMenu = false; - void guiMain(event_t evt) { #if defined(LUA) @@ -446,22 +444,14 @@ void guiMain(event_t evt) else if (popupMenuItemsCount > 0) { // popup menu is active display it on top of normal menus handleGui(0); // suppress events, they are handled by the popup - if (!inPopupMenu) { - TRACE("Popup Menu started"); - inPopupMenu = true; - } const char * result = runPopupMenu(evt); - if (popupMenuItemsCount == 0) { + if (result) { TRACE("popupMenuHandler(%s)", result); popupMenuHandler(result); } } else { // normal menus - if (inPopupMenu) { - TRACE("Popup Menu ended"); - inPopupMenu = false; - } handleGui(evt); } diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 07fe6d96f..1e22e9245 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -36,53 +36,69 @@ uint8_t Pxx2Pulses::addFlag0(uint8_t module) return flag0; } -void Pxx2Pulses::addFlag1(uint8_t module) +void Pxx2Pulses::addFlag1() { uint8_t flag1 = 0; Pxx2Transport::addByte(flag1); } -void Pxx2Pulses::addChannels(uint8_t module, uint8_t sendFailsafe, uint8_t firstChannel) +void Pxx2Pulses::addPulsesValues(uint16_t low, uint16_t high) +{ + Pxx2Transport::addByte(low); // Low byte of channel + Pxx2Transport::addByte(((low >> 8) & 0x0F) | (high << 4)); // 4 bits each from 2 channels + Pxx2Transport::addByte(high >> 4); // High byte of channel +} + +void Pxx2Pulses::addChannels(uint8_t module) { uint16_t pulseValue = 0; uint16_t pulseValueLow = 0; - for (int8_t i=0; i<8; i++) { - uint8_t channel = firstChannel + i; - if (sendFailsafe) { - if (g_model.moduleData[module].failsafeMode == FAILSAFE_HOLD) { + uint8_t channel = g_model.moduleData[module].channelsStart; + uint8_t count = sentModuleChannels(module); + + for (int8_t i = 0; i < count; i++, channel++) { + int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + pulseValue = limit(1, (value * 512 / 682) + 1024, 2046); + if (i & 1) + addPulsesValues(pulseValueLow, pulseValue); + else + pulseValueLow = pulseValue; + } +} + +void Pxx2Pulses::addFailsafe(uint8_t module) +{ + uint16_t pulseValue = 0; + uint16_t pulseValueLow = 0; + + uint8_t channel = g_model.moduleData[module].channelsStart; + uint8_t count = sentModuleChannels(module); + + for (int8_t i = 0; i < count; i++, channel++) { + if (g_model.moduleData[module].failsafeMode == FAILSAFE_HOLD) { + pulseValue = 2047; + } + else if (g_model.moduleData[module].failsafeMode == FAILSAFE_NOPULSES) { + pulseValue = 0; + } + else { + int16_t failsafeValue = g_model.failsafeChannels[channel]; + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { pulseValue = 2047; } - else if (g_model.moduleData[module].failsafeMode == FAILSAFE_NOPULSES) { + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { pulseValue = 0; } else { - int16_t failsafeValue = g_model.failsafeChannels[channel]; - if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { - pulseValue = 2047; - } - else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - pulseValue = 0; - } - else { - failsafeValue += 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; - pulseValue = limit(1, (failsafeValue * 512 / 682) + 1024, 2046); - } + failsafeValue += 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; + pulseValue = limit(1, (failsafeValue * 512 / 682) + 1024, 2046); } } - else { - int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; - pulseValue = limit(1, (value * 512 / 682) + 1024, 2046); - } - - if (i & 1) { - Pxx2Transport::addByte(pulseValueLow); // Low byte of channel - Pxx2Transport::addByte(((pulseValueLow >> 8) & 0x0F) | (pulseValue << 4)); // 4 bits each from 2 channels - Pxx2Transport::addByte(pulseValue >> 4); // High byte of channel - } - else { + if (i & 1) + addPulsesValues(pulseValueLow, pulseValue); + else pulseValueLow = pulseValue; - } } } @@ -90,21 +106,17 @@ void Pxx2Pulses::setupChannelsFrame(uint8_t module) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_CHANNELS); - // FLAG0 + // Flag0 uint8_t flag0 = addFlag0(module); - // FLAG1 - addFlag1(module); + // Flag1 + addFlag1(); - // Channels - uint8_t channelsCount = sentModuleChannels(module); - addChannels(module, flag0 & PXX2_CHANNELS_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart); - if (channelsCount > 8) { - addChannels(module, flag0 & PXX2_CHANNELS_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart + 8); - if (channelsCount > 16) { - addChannels(module, flag0 & PXX2_CHANNELS_FLAG0_FAILSAFE, g_model.moduleData[module].channelsStart + 16); - } - } + // Failsafe / Channels + if (flag0 & PXX2_CHANNELS_FLAG0_FAILSAFE) + addFailsafe(module); + else + addChannels(module); } void Pxx2Pulses::setupTelemetryFrame(uint8_t module) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 31e5f3a36..627233d2f 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -158,9 +158,13 @@ class Pxx2Pulses: public PxxPulses { uint8_t addFlag0(uint8_t module); - void addFlag1(uint8_t module); + void addFlag1(); - void addChannels(uint8_t module, uint8_t sendFailsafe, uint8_t firstChannel); + void addPulsesValues(uint16_t low, uint16_t high); + + void addChannels(uint8_t module); + + void addFailsafe(uint8_t module); void addCrc() { diff --git a/radio/src/targets/taranis/i2c2_driver.cpp b/radio/src/targets/taranis/i2c2_driver.cpp new file mode 100644 index 000000000..fe7f3a2fb --- /dev/null +++ b/radio/src/targets/taranis/i2c2_driver.cpp @@ -0,0 +1,98 @@ +/* + * 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 "board.h" + +void i2c2Init() +{ + I2C_DeInit(I2CX); + + I2C_InitTypeDef I2C_InitStructure; + I2C_InitStructure.I2C_ClockSpeed = I2CX_SPEED; + I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; + I2C_InitStructure.I2C_OwnAddress1 = 0x00; + I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; + I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; + I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; + I2C_Init(I2CX, &I2C_InitStructure); + I2C_Cmd(I2CX, ENABLE); + + GPIO_PinAFConfig(I2CX_SCL_GPIO, I2CX_SCL_GPIO_PinSource, I2CX_GPIO_AF); + GPIO_PinAFConfig(I2CX_SDA_GPIO, I2CX_SDA_GPIO_PinSource, I2CX_GPIO_AF); + + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = I2CX_SCL_GPIO_PIN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(I2CX_SCL_GPIO, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = I2CX_SDA_GPIO_PIN; + GPIO_Init(I2CX_SDA_GPIO, &GPIO_InitStructure); +} + +#define I2C_TIMEOUT_MAX 1000 +bool I2C_WaitEvent(uint32_t event) +{ + uint32_t timeout = I2C_TIMEOUT_MAX; + while (!I2C_CheckEvent(I2CX, event)) { + if ((timeout--) == 0) return false; + } + return true; +} + +bool I2C2_WaitEventCleared(uint32_t event) +{ + uint32_t timeout = I2C_TIMEOUT_MAX; + while (I2C_CheckEvent(I2CX, event)) { + if ((timeout--) == 0) return false; + } + return true; +} + +void setVolume(uint8_t volume) +{ + if (!I2C2_WaitEventCleared(I2C_FLAG_BUSY)) + return; + + I2C_GenerateSTART(I2CX, ENABLE); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) + return; + + I2C_Send7bitAddress(I2C, I2C_ADDRESS_VOLUME, I2C_Direction_Transmitter); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + return; + + I2C_SendData(I2CX, 0); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) + return; + I2C_SendData(I2CX, volume); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) + return; + + I2C_GenerateSTOP(I2CX, ENABLE); +} + +int32_t getVolume() +{ + return -1; // TODO +} +#endif From 46c883b3b8cb59de9dcaa048fb240191444ed66d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 26 Mar 2019 14:28:23 +0100 Subject: [PATCH 427/446] Control added --- radio/src/io/frsky_pxx2.h | 8 +++++++- radio/src/telemetry/frsky_pxx2.cpp | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/radio/src/io/frsky_pxx2.h b/radio/src/io/frsky_pxx2.h index 21d069454..9aec8ab3d 100644 --- a/radio/src/io/frsky_pxx2.h +++ b/radio/src/io/frsky_pxx2.h @@ -42,7 +42,13 @@ class ModuleFifo : public Fifo { uint32_t next = nextIndex(ridx); uint8_t len = fifo[next]; - if (unsigned(len + 4 /* 2 bytes header + 2 bytes CRC */) > size()) { + + if (len > 40) { + clear(); + return false; + } + + if (size() < unsigned(len + 4 /* 2 bytes header + 2 bytes CRC */)) { // frame not fully received return false; } diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 208342561..270a32e1a 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -127,6 +127,8 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_OK; moduleSettings[module].mode = MODULE_MODE_NORMAL; POPUP_INFORMATION(STR_REG_OK); + } else { + TRACE("KO %s %s", &frame[4], reusableBuffer.moduleSetup.pxx2.registerRxName); } } break; From 506fc8039f2c8b64226109db274997087e81f0ca Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 26 Mar 2019 15:48:20 +0100 Subject: [PATCH 428/446] Variant added --- radio/src/opentx.h | 2 ++ radio/src/telemetry/frsky_pxx2.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 76c44777e..3a980cd14 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1193,10 +1193,12 @@ union ReusableBuffer uint8_t modelID; PXX2Version hwVersion; PXX2Version swVersion; + uint8_t variant; struct { uint8_t modelID; PXX2Version hwVersion; PXX2Version swVersion; + uint8_t variant; } receivers[PXX2_MAX_RECEIVERS_PER_MODULE]; } modules[NUM_MODULES]; uint32_t updateTime; diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 270a32e1a..3f543e669 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -54,11 +54,13 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) reusableBuffer.hardware.modules[module].modelID = frame[4]; reusableBuffer.hardware.modules[module].hwVersion.data = *((uint16_t *)&frame[5]); reusableBuffer.hardware.modules[module].swVersion.data = *((uint16_t *)&frame[7]); + reusableBuffer.hardware.modules[module].variant = frame[9]; } else if (index < PXX2_MAX_RECEIVERS_PER_MODULE) { reusableBuffer.hardware.modules[module].receivers[index].modelID = frame[4]; reusableBuffer.hardware.modules[module].receivers[index].hwVersion.data = *((uint16_t *)&frame[5]); reusableBuffer.hardware.modules[module].receivers[index].swVersion.data = *((uint16_t *)&frame[7]); + reusableBuffer.hardware.modules[module].receivers[index].variant = frame[9]; } } From a11dbdf2cb84a1fa7f01a4c575f678033a00e7f3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 26 Mar 2019 16:11:00 +0100 Subject: [PATCH 429/446] Simplification --- radio/src/gui/128x64/radio_version.cpp | 12 ++++++------ radio/src/opentx.h | 10 ++-------- radio/src/pulses/pxx2.h | 17 +++++++++++------ radio/src/telemetry/frsky_pxx2.cpp | 16 ++++------------ 4 files changed, 23 insertions(+), 32 deletions(-) diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 74a846df1..d56256787 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -143,7 +143,7 @@ void menuRadioModulesVersion(event_t event) // Module model if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { lcdDrawText(INDENT_WIDTH, y, "Model"); - uint8_t modelId = reusableBuffer.hardware.modules[module].modelID; + uint8_t modelId = reusableBuffer.hardware.modules[module].information.modelID; if (modelId >= DIM(modulesModels)) modelId = 0; lcdDrawText(12 * FW, y, modulesModels[modelId]); @@ -153,19 +153,19 @@ void menuRadioModulesVersion(event_t event) // Module version if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { lcdDrawText(INDENT_WIDTH, y, "Version"); - if (reusableBuffer.hardware.modules[module].hwVersion.data) { - drawPXX2FullVersion(12 * FW, y, reusableBuffer.hardware.modules[module].hwVersion, reusableBuffer.hardware.modules[module].swVersion); + if (reusableBuffer.hardware.modules[module].information.modelID) { + drawPXX2FullVersion(12 * FW, y, reusableBuffer.hardware.modules[module].information.hwVersion, reusableBuffer.hardware.modules[module].information.swVersion); } } y += FH; for (uint8_t receiver=0; receiver= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { lcdDrawText(INDENT_WIDTH, y, "Receiver"); lcdDrawNumber(lcdLastRightPos + 2, y, receiver + 1); - uint8_t modelId = reusableBuffer.hardware.modules[module].receivers[receiver].modelID; + uint8_t modelId = reusableBuffer.hardware.modules[module].receivers[receiver].information.modelID; if (modelId >= DIM(receiversModels)) modelId = 0; lcdDrawText(12 * FW, y, receiversModels[modelId]); @@ -174,7 +174,7 @@ void menuRadioModulesVersion(event_t event) // Receiver version if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { - drawPXX2FullVersion(12 * FW, y, reusableBuffer.hardware.modules[module].receivers[receiver].hwVersion, reusableBuffer.hardware.modules[module].receivers[receiver].swVersion); + drawPXX2FullVersion(12 * FW, y, reusableBuffer.hardware.modules[module].receivers[receiver].information.hwVersion, reusableBuffer.hardware.modules[module].receivers[receiver].information.swVersion); } y += FH; } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 3a980cd14..cf5beb6ff 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1190,15 +1190,9 @@ union ReusableBuffer struct { int8_t step; uint8_t timeout; - uint8_t modelID; - PXX2Version hwVersion; - PXX2Version swVersion; - uint8_t variant; + PXX2HardwareInformation information; struct { - uint8_t modelID; - PXX2Version hwVersion; - PXX2Version swVersion; - uint8_t variant; + PXX2HardwareInformation information; } receivers[PXX2_MAX_RECEIVERS_PER_MODULE]; } modules[NUM_MODULES]; uint32_t updateTime; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 627233d2f..de1580d8f 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -203,12 +203,17 @@ class Pxx2Pulses: public PxxPulses { union PXX2Version { - uint16_t data; - struct { - uint8_t major; - uint8_t minor:4; - uint8_t revision:4; - }; + uint8_t major; + uint8_t minor:4; + uint8_t revision:4; +}; + +struct PXX2HardwareInformation +{ + uint8_t modelID; + PXX2Version hwVersion; + PXX2Version swVersion; + uint8_t variant; }; #endif diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 3f543e669..49006d909 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -50,18 +50,10 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) } uint8_t index = frame[3]; - if (index == 0xFF) { - reusableBuffer.hardware.modules[module].modelID = frame[4]; - reusableBuffer.hardware.modules[module].hwVersion.data = *((uint16_t *)&frame[5]); - reusableBuffer.hardware.modules[module].swVersion.data = *((uint16_t *)&frame[7]); - reusableBuffer.hardware.modules[module].variant = frame[9]; - } - else if (index < PXX2_MAX_RECEIVERS_PER_MODULE) { - reusableBuffer.hardware.modules[module].receivers[index].modelID = frame[4]; - reusableBuffer.hardware.modules[module].receivers[index].hwVersion.data = *((uint16_t *)&frame[5]); - reusableBuffer.hardware.modules[module].receivers[index].swVersion.data = *((uint16_t *)&frame[7]); - reusableBuffer.hardware.modules[module].receivers[index].variant = frame[9]; - } + if (index == 0xFF) + memcpy(&reusableBuffer.hardware.modules[module].information, &frame[4], sizeof(PXX2HardwareInformation)); + else if (index < PXX2_MAX_RECEIVERS_PER_MODULE) + memcpy(&reusableBuffer.hardware.modules[module].receivers[index].information, &frame[4], sizeof(PXX2HardwareInformation)); } void processModuleSettingsFrame(uint8_t module, uint8_t * frame) From 4f8e7da449f4f1b16186ac94371ad2137ef939a2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 26 Mar 2019 16:49:55 +0100 Subject: [PATCH 430/446] GET_HW_INFO refactoring --- radio/src/gui/128x64/model_setup.cpp | 5 +- radio/src/gui/128x64/radio_version.cpp | 6 +- radio/src/opentx.h | 3 +- radio/src/pulses/pxx2.cpp | 6 +- radio/src/pulses/pxx2.h | 2 + .../common/arm/stm32/lsm6ds3_driver.cpp | 313 ++++++++++++++++++ radio/src/targets/taranis/CMakeLists.txt | 8 + 7 files changed, 335 insertions(+), 8 deletions(-) create mode 100644 radio/src/targets/common/arm/stm32/lsm6ds3_driver.cpp diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index e8fbd9643..026da16ed 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -2092,9 +2092,10 @@ void menuModelReceiverOptions(event_t event) } } - if (event == EVT_KEY_LONG(KEY_ENTER)) { + if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.receiverSettings.dirty) { + killEvents(event); reusableBuffer.receiverSettings.state = PXX2_SETTINGS_WRITE; - reusableBuffer.receiverSettings.dirty = 2; + reusableBuffer.receiverSettings.dirty = 0; reusableBuffer.receiverSettings.timeout = 0; moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index d56256787..559ab6cff 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -106,12 +106,14 @@ void menuRadioModulesVersion(event_t event) if (isModulePXX2(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; - reusableBuffer.hardware.modules[INTERNAL_MODULE].step = -1; + reusableBuffer.hardware.modules[INTERNAL_MODULE].current = PXX2_HW_INFO_TX_ID; + reusableBuffer.hardware.modules[INTERNAL_MODULE].maximum = MAX_RECEIVERS_PER_MODULE - 1; } if (isModulePXX2(EXTERNAL_MODULE) && IS_EXTERNAL_MODULE_ON()) { moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; - reusableBuffer.hardware.modules[EXTERNAL_MODULE].step = -1; + reusableBuffer.hardware.modules[EXTERNAL_MODULE].current = PXX2_HW_INFO_TX_ID; + reusableBuffer.hardware.modules[EXTERNAL_MODULE].maximum = MAX_RECEIVERS_PER_MODULE - 1; } reusableBuffer.hardware.updateTime = get_tmr10ms() + 1000 /* 10s*/; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index cf5beb6ff..afb419228 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1188,7 +1188,8 @@ union ReusableBuffer struct { struct { - int8_t step; + int8_t current; + int8_t maximum; uint8_t timeout; PXX2HardwareInformation information; struct { diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 1e22e9245..066283e34 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -130,12 +130,12 @@ void Pxx2Pulses::setupTelemetryFrame(uint8_t module) void Pxx2Pulses::setupHardwareInfoFrame(uint8_t module) { - if (reusableBuffer.hardware.modules[module].step >= -1 && reusableBuffer.hardware.modules[module].step < PXX2_MAX_RECEIVERS_PER_MODULE) { + if (reusableBuffer.hardware.modules[module].current <= reusableBuffer.hardware.modules[module].maximum) { if (reusableBuffer.hardware.modules[module].timeout == 0) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_HW_INFO); - Pxx2Transport::addByte(reusableBuffer.hardware.modules[module].step); + Pxx2Transport::addByte(reusableBuffer.hardware.modules[module].current); reusableBuffer.hardware.modules[module].timeout = 20; - reusableBuffer.hardware.modules[module].step++; + reusableBuffer.hardware.modules[module].current++; } else { reusableBuffer.hardware.modules[module].timeout--; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index de1580d8f..f41e821b1 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -53,6 +53,8 @@ #define PXX2_TX_SETTINGS_FLAG0_WRITE (1 << 6) #define PXX2_TX_SETTINGS_FLAG1_EXTERNAL_ANTENNA (1 << 3) +#define PXX2_HW_INFO_TX_ID 0xFF + enum PXX2RegisterSteps { REGISTER_START, REGISTER_RX_NAME_RECEIVED, diff --git a/radio/src/targets/common/arm/stm32/lsm6ds3_driver.cpp b/radio/src/targets/common/arm/stm32/lsm6ds3_driver.cpp new file mode 100644 index 000000000..98a5b15d5 --- /dev/null +++ b/radio/src/targets/common/arm/stm32/lsm6ds3_driver.cpp @@ -0,0 +1,313 @@ +/* + * 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" + +//#define ACC_LSB_VALUE 0.000488 // 0.488 mg/LSB +//#define GYRO_LSB_VALUE 0.07 // 70mDPS in 2000 deg/second + +/* COMMON VALUES FOR ACCEL-GYRO SENSORS */ +#define LSM6DS3_WHO_AM_I 0x0f +#define LSM6DS3_WHO_AM_I_DEF 0x69 +#define LSM6DS3_AXIS_EN_MASK 0x38 +#define LSM6DS3_INT1_CTRL_ADDR 0x0d +#define LSM6DS3_INT2_CTRL_ADDR 0x0e +#define LSM6DS3_INT1_FULL 0x20 +#define LSM6DS3_INT1_FTH 0x08 +#define LSM6DS3_MD1_ADDR 0x5e +#define LSM6DS3_ODR_LIST_NUM 5 +#define LSM6DS3_ODR_POWER_OFF_VAL 0x00 +#define LSM6DS3_ODR_26HZ_VAL 0x02 +#define LSM6DS3_ODR_52HZ_VAL 0x03 +#define LSM6DS3_ODR_104HZ_VAL 0x04 +#define LSM6DS3_ODR_208HZ_VAL 0x05 +#define LSM6DS3_ODR_416HZ_VAL 0x06 +#define LSM6DS3_FS_LIST_NUM 4 +#define LSM6DS3_BDU_ADDR 0x12 +#define LSM6DS3_BDU_MASK 0x40 +#define LSM6DS3_EN_BIT 0x01 +#define LSM6DS3_DIS_BIT 0x00 +#define LSM6DS3_FUNC_EN_ADDR 0x19 +#define LSM6DS3_FUNC_EN_MASK 0x04 +#define LSM6DS3_FUNC_CFG_ACCESS_ADDR 0x01 +#define LSM6DS3_FUNC_CFG_ACCESS_MASK 0x01 +#define LSM6DS3_FUNC_CFG_ACCESS_MASK2 0x04 +#define LSM6DS3_FUNC_CFG_REG2_MASK 0x80 +#define LSM6DS3_FUNC_CFG_START1_ADDR 0x62 +#define LSM6DS3_FUNC_CFG_START2_ADDR 0x63 +#define LSM6DS3_SELFTEST_ADDR 0x14 +#define LSM6DS3_SELFTEST_ACCEL_MASK 0x03 +#define LSM6DS3_SELFTEST_GYRO_MASK 0x0c +#define LSM6DS3_SELF_TEST_DISABLED_VAL 0x00 +#define LSM6DS3_SELF_TEST_POS_SIGN_VAL 0x01 +#define LSM6DS3_SELF_TEST_NEG_ACCEL_SIGN_VAL 0x02 +#define LSM6DS3_SELF_TEST_NEG_GYRO_SIGN_VAL 0x03 +#define LSM6DS3_LIR_ADDR 0x58 +#define LSM6DS3_LIR_MASK 0x01 +#define LSM6DS3_TIMER_EN_ADDR 0x58 +#define LSM6DS3_TIMER_EN_MASK 0x80 +#define LSM6DS3_PEDOMETER_EN_ADDR 0x58 +#define LSM6DS3_PEDOMETER_EN_MASK 0x40 +#define LSM6DS3_INT2_ON_INT1_ADDR 0x13 +#define LSM6DS3_INT2_ON_INT1_MASK 0x20 +#define LSM6DS3_MIN_DURATION_MS 1638 +#define LSM6DS3_ROUNDING_ADDR 0x16 +#define LSM6DS3_ROUNDING_MASK 0x04 +#define LSM6DS3_FIFO_MODE_ADDR 0x0a +#define LSM6DS3_FIFO_MODE_MASK 0x07 +#define LSM6DS3_FIFO_MODE_BYPASS 0x00 +#define LSM6DS3_FIFO_MODE_CONTINUOS 0x06 +#define LSM6DS3_FIFO_THRESHOLD_IRQ_MASK 0x08 +#define LSM6DS3_FIFO_ODR_ADDR 0x0a +#define LSM6DS3_FIFO_ODR_MASK 0x78 +#define LSM6DS3_FIFO_ODR_MAX 0x07 +#define LSM6DS3_FIFO_ODR_MAX_HZ 800 +#define LSM6DS3_FIFO_ODR_OFF 0x00 +#define LSM6DS3_FIFO_CTRL3_ADDR 0x08 +#define LSM6DS3_FIFO_ACCEL_DECIMATOR_MASK 0x07 +#define LSM6DS3_FIFO_GYRO_DECIMATOR_MASK 0x38 +#define LSM6DS3_FIFO_CTRL4_ADDR 0x09 +#define LSM6DS3_FIFO_STEP_C_DECIMATOR_MASK 0x38 +#define LSM6DS3_FIFO_THR_L_ADDR 0x06 +#define LSM6DS3_FIFO_THR_H_ADDR 0x07 +#define LSM6DS3_FIFO_THR_H_MASK 0x0f +#define LSM6DS3_FIFO_THR_IRQ_MASK 0x08 +#define LSM6DS3_FIFO_PEDO_E_ADDR 0x07 +#define LSM6DS3_FIFO_PEDO_E_MASK 0x80 +#define LSM6DS3_FIFO_STEP_C_FREQ 25 + +/* CUSTOM VALUES FOR ACCEL SENSOR */ +#define LSM6DS3_ACCEL_ODR_ADDR 0x10 +#define LSM6DS3_ACCEL_ODR_MASK 0xf0 +#define LSM6DS3_ACCEL_FS_ADDR 0x10 +#define LSM6DS3_ACCEL_FS_MASK 0x0c +#define LSM6DS3_ACCEL_FS_2G_VAL 0x00 +#define LSM6DS3_ACCEL_FS_4G_VAL 0x02 +#define LSM6DS3_ACCEL_FS_8G_VAL 0x03 +#define LSM6DS3_ACCEL_FS_16G_VAL 0x01 +#define LSM6DS3_ACCEL_FS_2G_GAIN 61 +#define LSM6DS3_ACCEL_FS_4G_GAIN 122 +#define LSM6DS3_ACCEL_FS_8G_GAIN 244 +#define LSM6DS3_ACCEL_FS_16G_GAIN 488 +#define LSM6DS3_ACCEL_OUT_X_L_ADDR 0x28 +#define LSM6DS3_ACCEL_OUT_Y_L_ADDR 0x2a +#define LSM6DS3_ACCEL_OUT_Z_L_ADDR 0x2c +#define LSM6DS3_ACCEL_AXIS_EN_ADDR 0x18 +#define LSM6DS3_ACCEL_DRDY_IRQ_MASK 0x01 +#define LSM6DS3_ACCEL_STD 1 +#define LSM6DS3_ACCEL_STD_FROM_PD 2 + +/* CUSTOM VALUES FOR GYRO SENSOR */ +#define LSM6DS3_GYRO_ODR_ADDR 0x11 +#define LSM6DS3_GYRO_ODR_MASK 0xf0 +#define LSM6DS3_GYRO_FS_ADDR 0x11 +#define LSM6DS3_GYRO_FS_MASK 0x0c +#define LSM6DS3_GYRO_FS_245_VAL 0x00 +#define LSM6DS3_GYRO_FS_500_VAL 0x01 +#define LSM6DS3_GYRO_FS_1000_VAL 0x02 +#define LSM6DS3_GYRO_FS_2000_VAL 0x03 +#define LSM6DS3_GYRO_FS_245_GAIN 8750 +#define LSM6DS3_GYRO_FS_500_GAIN 17500 +#define LSM6DS3_GYRO_FS_1000_GAIN 35000 +#define LSM6DS3_GYRO_FS_2000_GAIN 70000 +#define LSM6DS3_GYRO_OUT_X_L_ADDR 0x22 +#define LSM6DS3_GYRO_OUT_Y_L_ADDR 0x24 +#define LSM6DS3_GYRO_OUT_Z_L_ADDR 0x26 +#define LSM6DS3_GYRO_AXIS_EN_ADDR 0x19 +#define LSM6DS3_GYRO_DRDY_IRQ_MASK 0x02 +#define LSM6DS3_GYRO_STD 6 +#define LSM6DS3_GYRO_STD_FROM_PD 2 + +#define LSM6DS3_OUT_XYZ_SIZE 8 + +/* CUSTOM VALUES FOR SIGNIFICANT MOTION SENSOR */ +#define LSM6DS3_SIGN_MOTION_EN_ADDR 0x19 +#define LSM6DS3_SIGN_MOTION_EN_MASK 0x01 +#define LSM6DS3_SIGN_MOTION_DRDY_IRQ_MASK 0x40 + +/* CUSTOM VALUES FOR STEP DETECTOR SENSOR */ +#define LSM6DS3_STEP_DETECTOR_DRDY_IRQ_MASK 0x80 + +/* CUSTOM VALUES FOR STEP COUNTER SENSOR */ +#define LSM6DS3_STEP_COUNTER_DRDY_IRQ_MASK 0x80 +#define LSM6DS3_STEP_COUNTER_OUT_L_ADDR 0x4b +#define LSM6DS3_STEP_COUNTER_OUT_SIZE 2 +#define LSM6DS3_STEP_COUNTER_RES_ADDR 0x19 +#define LSM6DS3_STEP_COUNTER_RES_MASK 0x06 +#define LSM6DS3_STEP_COUNTER_RES_ALL_EN 0x03 +#define LSM6DS3_STEP_COUNTER_RES_FUNC_EN 0x02 +#define LSM6DS3_STEP_COUNTER_DURATION_ADDR 0x15 + +/* CUSTOM VALUES FOR TILT SENSOR */ +#define LSM6DS3_TILT_EN_ADDR 0x58 +#define LSM6DS3_TILT_EN_MASK 0x20 +#define LSM6DS3_TILT_DRDY_IRQ_MASK 0x02 + +#define LSM6DS3_ENABLE_AXIS 0x07 +#define LSM6DS3_FIFO_DIFF_L 0x3a +#define LSM6DS3_FIFO_DIFF_MASK 0x0fff +#define LSM6DS3_FIFO_DATA_OUT_L 0x3e +#define LSM6DS3_FIFO_ELEMENT_LEN_BYTE 6 +#define LSM6DS3_FIFO_BYTE_FOR_CHANNEL 2 +#define LSM6DS3_FIFO_DATA_OVR_2REGS 0x4000 +#define LSM6DS3_FIFO_DATA_OVR 0x40 + +#define LSM6DS3_SRC_FUNC_ADDR 0x53 +#define LSM6DS3_FIFO_DATA_AVL_ADDR 0x3b + +#define LSM6DS3_SRC_SIGN_MOTION_DATA_AVL 0x40 +#define LSM6DS3_SRC_STEP_DETECTOR_DATA_AVL 0x10 +#define LSM6DS3_SRC_TILT_DATA_AVL 0x20 +#define LSM6DS3_SRC_STEP_COUNTER_DATA_AVL 0x80 +#define LSM6DS3_FIFO_DATA_AVL 0x80 +#define LSM6DS3_RESET_ADDR 0x12 +#define LSM6DS3_RESET_MASK 0x01 + +#define LSM6DS3_ADDRESS 0xD4 + +static const char configure[][2] = + { + {LSM6DS3_ACCEL_AXIS_EN_ADDR, 0x38}, ///< xyz + {LSM6DS3_ACCEL_ODR_ADDR, (0x3 << 4) | (0x1 << 2) | (0x3 << 0)}, //ODR_52Hz|16G|BW_50Hz + {LSM6DS3_GYRO_AXIS_EN_ADDR, 0x38}, ///< xyz + {LSM6DS3_GYRO_ODR_ADDR, (3 << 4) | (3 << 2) | (0 << 0)}, ///< ODR_52Hz|2000dps| + {LSM6DS3_INT1_CTRL_ADDR, 0x3}, ///< GYRO_READY | ACCL_READY + {LSM6DS3_INT2_CTRL_ADDR, 0x3}, ///< GYRO_READY | ACCL_READY + }; + +volatile int lsm6ds3_state = 1; + +int lsm6ds3Init() +{ + int i; + char cmd[2]; + + I2C_transfer_block i2c_block[2]; + + EXTILine_Config(); + + cmd[0] = LSM6DS3_WHO_AM_I; + + i2c_block[0].addr = LSM6DS3_ADDRESS; + i2c_block[0].rw = I2C_WRITE; + i2c_block[0].stop_mode = I2C_WRITE_BYPASS_STOP; + i2c_block[0].ack_mode = I2C_READ_RESPOND_ACK; + i2c_block[0].len = 1; + i2c_block[0].buf = cmd; + + i2c_block[1].addr = LSM6DS3_ADDRESS; + i2c_block[1].rw = I2C_READ; + i2c_block[1].stop_mode = I2C_WRITE_APPEND_STOP; + i2c_block[1].ack_mode = I2C_READ_RESPOND_ACK; + i2c_block[1].len = 2; + i2c_block[1].buf = cmd; + + i2c_dma_transfer(i2c_block, 2); + + if (cmd[0] != LSM6DS3_WHO_AM_I_DEF) { + return -1; + } + + cmd[0] = 0x12; + cmd[1] = 0x5; + i2c_block[0].addr = LSM6DS3_ADDRESS; + i2c_block[0].rw = I2C_WRITE; + i2c_block[0].stop_mode = I2C_WRITE_APPEND_STOP; + + i2c_block[0].ack_mode = I2C_READ_RESPOND_ACK; + + i2c_block[0].len = 2; + i2c_block[0].buf = cmd; + + i2c_dma_transfer(i2c_block, 1); + + delay_ms(1); + + cmd[0] = 0x12; + cmd[1] = 0x4; + i2c_block[0].addr = LSM6DS3_ADDRESS; + i2c_block[0].rw = I2C_WRITE; + i2c_block[0].stop_mode = I2C_WRITE_APPEND_STOP; + + i2c_block[0].ack_mode = I2C_READ_RESPOND_ACK; + + i2c_block[0].len = 2; + i2c_block[0].buf = cmd; + + i2c_dma_transfer(i2c_block, 1); + + delay_ms(1); + + for (i = 0; i < sizeof(configure) / sizeof(configure[0]); i++) { + i2c_block[0].addr = LSM6DS3_ADDRESS; + i2c_block[0].rw = I2C_WRITE; + i2c_block[0].stop_mode = I2C_WRITE_APPEND_STOP; + + i2c_block[0].ack_mode = I2C_READ_RESPOND_ACK; + + i2c_block[0].len = 2; + i2c_block[0].buf = (char *) configure[i]; + + i2c_dma_transfer(i2c_block, 1); + } + + return 0; +} + +int lsm6ds3Read(void *buffer, int len, OFFSET offset1) +{ + char t_char[10]; + short t_short[7]; + + short *p_short; + I2C_transfer_block i2c_block[2]; + + xSemaphoreTake(lsm6ds3_sema, portMAX_DELAY); + + t_char[0] = LSM6DS3_GYRO_OUT_X_L_ADDR; + + i2c_block[0].addr = LSM6DS3_ADDRESS; + i2c_block[0].rw = I2C_WRITE; + i2c_block[0].stop_mode = I2C_WRITE_BYPASS_STOP; + i2c_block[0].len = 1; + i2c_block[0].buf = t_char; + + i2c_block[1].addr = LSM6DS3_ADDRESS; + i2c_block[1].rw = I2C_READ; + i2c_block[1].stop_mode = I2C_WRITE_APPEND_STOP; + + i2c_block[1].len = len; + i2c_block[1].buf = (char *) t_short; + + i2c_dma_transfer(i2c_block, 2); + + { + p_short = (short *) buffer; + *p_short++ = t_short[0]; + *p_short++ = -t_short[1]; + *p_short++ = t_short[2]; + + *p_short++ = -t_short[3]; + *p_short++ = t_short[4]; + *p_short++ = -t_short[5]; + } + + return len; +} diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index f6aefc9c6..0a6a952eb 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -143,6 +143,14 @@ elseif(PCB STREQUAL XLITES) set(STATUS_LEDS YES) endif() +#if(PCB STREQUAL XLITES) +# add_definitions(-DGYRO) +# set(TARGET_SRC +# ${TARGET_SRC} +# ../common/arm/stm32/lsm6ds3_driver.cpp +# ) +#endif() + if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X3) option(PXX1 "PXX1 protocol support" OFF) option(PXX2 "PXX2 protocol support" ON) From 6e676f09601192c2dcf24a598edbe1d92c1633dd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 26 Mar 2019 17:16:08 +0100 Subject: [PATCH 431/446] GET_HW_INFO request sent before RX options --- radio/src/gui/128x64/model_setup.cpp | 117 +++++++++++-------------- radio/src/gui/128x64/radio_version.cpp | 26 +++--- radio/src/opentx.h | 46 +++++----- radio/src/pulses/pxx2.cpp | 44 +++++----- radio/src/pulses/pxx2.h | 1 + radio/src/telemetry/frsky_pxx2.cpp | 26 +++--- 6 files changed, 127 insertions(+), 133 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 026da16ed..14b8bc4ca 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -111,9 +111,6 @@ enum MenuModelSetupItems { ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_LABEL, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS, ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_LABEL, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_OPTIONS, - ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_BIND_SHARE, #endif ITEM_MODEL_EXTERNAL_MODULE_LABEL, ITEM_MODEL_EXTERNAL_MODULE_MODE, @@ -148,9 +145,6 @@ enum MenuModelSetupItems { ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_LABEL, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS, ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_LABEL, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_OPTIONS, - ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_BIND_SHARE, #if defined(PCBSKY9X) && !defined(REVA) ITEM_MODEL_EXTRA_MODULE_LABEL, ITEM_MODEL_EXTRA_MODULE_CHANNELS, @@ -474,9 +468,6 @@ void menuModelSetup(event_t event) IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 1, 0), // Receiver3 Name + Add/Del buttons IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 2, 0), // Receiver3 Pinmap IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 2, 1), // Receiver3 Bind/Share - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 2, 0), // Receiver4 Name + Add/Del buttons - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 3, 0), // Receiver4 Pinmap - IF_PXX2_RECEIVER_DISPLAYED(INTERNAL_MODULE, 3, 1), // Receiver4 Bind/Share LABEL(ExternalModule), EXTERNAL_MODULE_MODE_ROWS, @@ -502,9 +493,6 @@ void menuModelSetup(event_t event) IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 1, 0), // Receiver3 Name + Add/Del buttons IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 2, 0), // Receiver3 Pinmap IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 2, 1), // Receiver3 Bind/Share - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 2, 0), // Receiver4 Name + Add/Del buttons - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 3, 0), // Receiver4 Pinmap - IF_PXX2_RECEIVER_DISPLAYED(EXTERNAL_MODULE, 3, 1), // Receiver4 Bind/Share TRAINER_ROWS }); @@ -1275,11 +1263,9 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_LABEL: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_LABEL: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_LABEL: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_LABEL: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_LABEL: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_LABEL: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_LABEL: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_LABEL: { uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); @@ -1321,7 +1307,7 @@ void menuModelSetup(event_t event) lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr); if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { g_moduleIdx = CURRENT_MODULE_EDITED(k); - memclear(&reusableBuffer.moduleSettings, sizeof(reusableBuffer.moduleSettings)); + memclear(&reusableBuffer.hardwareAndSettings, sizeof(reusableBuffer.hardwareAndSettings)); pushMenu(menuModelModuleOptions); } break; @@ -1329,19 +1315,17 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_OPTIONS: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_OPTIONS: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_OPTIONS: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_OPTIONS: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_OPTIONS: lcdDrawText(INDENT_WIDTH * 2, y, STR_OPTIONS); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr); if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { g_moduleIdx = CURRENT_MODULE_EDITED(k); uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); uint8_t receiverSlot = g_model.moduleData[g_moduleIdx].pxx2.getReceiverSlot(receiverIdx) - 1; - memclear(&reusableBuffer.receiverSettings, sizeof(reusableBuffer.receiverSettings)); - reusableBuffer.receiverSettings.receiverId = receiverSlot; + memclear(&reusableBuffer.hardwareAndSettings, sizeof(reusableBuffer.hardwareAndSettings)); + reusableBuffer.hardwareAndSettings.receiverSettings.receiverId = receiverSlot; pushMenu(menuModelReceiverOptions); } break; @@ -1349,11 +1333,9 @@ void menuModelSetup(event_t event) case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE: case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE: - case ITEM_MODEL_INTERNAL_MODULE_PXX2_RECEIVER_4_BIND_SHARE: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_1_BIND_SHARE: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_2_BIND_SHARE: case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_3_BIND_SHARE: - case ITEM_MODEL_EXTERNAL_MODULE_PXX2_RECEIVER_4_BIND_SHARE: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); @@ -1961,9 +1943,9 @@ void menuModelFailsafe(event_t event) void onTxOptionsUpdateConfirm(const char * result) { if (result == STR_OK) { - reusableBuffer.moduleSettings.state = PXX2_SETTINGS_WRITE; - reusableBuffer.moduleSettings.dirty = 2; - reusableBuffer.moduleSettings.timeout = 0; + reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_WRITE; + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = 2; + reusableBuffer.hardwareAndSettings.moduleSettings.timeout = 0; moduleSettings[g_moduleIdx].mode = MODULE_MODE_MODULE_SETTINGS; } else { @@ -1984,7 +1966,7 @@ void menuModelModuleOptions(event_t event) if (menuEvent) { moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; - if (reusableBuffer.moduleSettings.dirty) { + if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty) { abortPopMenu(); POPUP_CONFIRMATION("Update TX options?", onTxOptionsUpdateConfirm); } @@ -1993,7 +1975,7 @@ void menuModelModuleOptions(event_t event) } } - if (reusableBuffer.moduleSettings.dirty == 2 && reusableBuffer.moduleSettings.state == PXX2_SETTINGS_OK) { + if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty == 2 && reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { popMenu(); } @@ -2004,13 +1986,13 @@ void menuModelModuleOptions(event_t event) if (event == EVT_ENTRY) { #if defined(SIMU) - reusableBuffer.moduleSettings.state = PXX2_SETTINGS_OK; + reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_OK; #else moduleSettings[g_moduleIdx].mode = MODULE_MODE_MODULE_SETTINGS; #endif } - if (reusableBuffer.moduleSettings.state == PXX2_SETTINGS_OK) { + if (reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { for (uint8_t k=0; k(16, reusableBuffer.receiverSettings.outputsCount); + auto outputsCount = min(16, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount); SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + outputsCount); + if (event == EVT_ENTRY) { +#if defined(SIMU) + reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_OK; + reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount = 8; +#else + // no need to initialize reusableBuffer.hardwareAndSettings.receiverSettings.state to PXX2_HARDWARE_INFO + moduleSettings[g_moduleIdx].mode = MODULE_MODE_GET_HARDWARE_INFO; +#endif + } + + if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_HARDWARE_INFO && moduleSettings[g_moduleIdx].mode == MODULE_MODE_NORMAL) { + reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_READ; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + if (menuEvent) { moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; - if (reusableBuffer.receiverSettings.dirty) { + if (reusableBuffer.hardwareAndSettings.receiverSettings.dirty) { abortPopMenu(); POPUP_CONFIRMATION("Update RX options?", onRxOptionsUpdateConfirm); } @@ -2092,34 +2089,26 @@ void menuModelReceiverOptions(event_t event) } } - if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.receiverSettings.dirty) { + if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.receiverSettings.dirty) { killEvents(event); - reusableBuffer.receiverSettings.state = PXX2_SETTINGS_WRITE; - reusableBuffer.receiverSettings.dirty = 0; - reusableBuffer.receiverSettings.timeout = 0; + reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_WRITE; + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = 0; + reusableBuffer.hardwareAndSettings.receiverSettings.timeout = 0; moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } - if (reusableBuffer.receiverSettings.dirty == 2 && reusableBuffer.receiverSettings.state == PXX2_SETTINGS_OK) { + if (reusableBuffer.hardwareAndSettings.receiverSettings.dirty == 2 && reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { popMenu(); + return; } int8_t sub = menuVerticalPosition; lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); - drawReceiverName(FW * 13, 0, reusableBuffer.receiverSettings.receiverId); + drawReceiverName(FW * 13, 0, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId); lcdInvertLine(0); - if (event == EVT_ENTRY) { -#if defined(SIMU) - reusableBuffer.receiverSettings.state = PXX2_SETTINGS_OK; - reusableBuffer.receiverSettings.outputsCount = 8; -#else - moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; -#endif - } - - if (reusableBuffer.receiverSettings.state == PXX2_SETTINGS_OK) { + if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { for (uint8_t k=0; k= reusableBuffer.hardware.updateTime) { + if (event == EVT_ENTRY || get_tmr10ms() >= reusableBuffer.hardwareAndSettings.updateTime) { // menuVerticalOffset = 0; - memclear(&reusableBuffer.hardware.modules, sizeof(reusableBuffer.hardware.modules)); + memclear(&reusableBuffer.hardwareAndSettings.modules, sizeof(reusableBuffer.hardwareAndSettings.modules)); if (isModulePXX2(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) { moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; - reusableBuffer.hardware.modules[INTERNAL_MODULE].current = PXX2_HW_INFO_TX_ID; - reusableBuffer.hardware.modules[INTERNAL_MODULE].maximum = MAX_RECEIVERS_PER_MODULE - 1; + reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].current = PXX2_HW_INFO_TX_ID; + reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].maximum = MAX_RECEIVERS_PER_MODULE - 1; } if (isModulePXX2(EXTERNAL_MODULE) && IS_EXTERNAL_MODULE_ON()) { moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; - reusableBuffer.hardware.modules[EXTERNAL_MODULE].current = PXX2_HW_INFO_TX_ID; - reusableBuffer.hardware.modules[EXTERNAL_MODULE].maximum = MAX_RECEIVERS_PER_MODULE - 1; + reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].current = PXX2_HW_INFO_TX_ID; + reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].maximum = MAX_RECEIVERS_PER_MODULE - 1; } - reusableBuffer.hardware.updateTime = get_tmr10ms() + 1000 /* 10s*/; + reusableBuffer.hardwareAndSettings.updateTime = get_tmr10ms() + 1000 /* 10s*/; } coord_t y = (FH + 1) - menuVerticalOffset * FH; @@ -145,7 +145,7 @@ void menuRadioModulesVersion(event_t event) // Module model if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { lcdDrawText(INDENT_WIDTH, y, "Model"); - uint8_t modelId = reusableBuffer.hardware.modules[module].information.modelID; + uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[module].information.modelID; if (modelId >= DIM(modulesModels)) modelId = 0; lcdDrawText(12 * FW, y, modulesModels[modelId]); @@ -155,19 +155,19 @@ void menuRadioModulesVersion(event_t event) // Module version if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { lcdDrawText(INDENT_WIDTH, y, "Version"); - if (reusableBuffer.hardware.modules[module].information.modelID) { - drawPXX2FullVersion(12 * FW, y, reusableBuffer.hardware.modules[module].information.hwVersion, reusableBuffer.hardware.modules[module].information.swVersion); + if (reusableBuffer.hardwareAndSettings.modules[module].information.modelID) { + drawPXX2FullVersion(12 * FW, y, reusableBuffer.hardwareAndSettings.modules[module].information.hwVersion, reusableBuffer.hardwareAndSettings.modules[module].information.swVersion); } } y += FH; for (uint8_t receiver=0; receiver= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { lcdDrawText(INDENT_WIDTH, y, "Receiver"); lcdDrawNumber(lcdLastRightPos + 2, y, receiver + 1); - uint8_t modelId = reusableBuffer.hardware.modules[module].receivers[receiver].information.modelID; + uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[module].receivers[receiver].information.modelID; if (modelId >= DIM(receiversModels)) modelId = 0; lcdDrawText(12 * FW, y, receiversModels[modelId]); @@ -176,7 +176,7 @@ void menuRadioModulesVersion(event_t event) // Receiver version if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { - drawPXX2FullVersion(12 * FW, y, reusableBuffer.hardware.modules[module].receivers[receiver].information.hwVersion, reusableBuffer.hardware.modules[module].receivers[receiver].information.swVersion); + drawPXX2FullVersion(12 * FW, y, reusableBuffer.hardwareAndSettings.modules[module].receivers[receiver].information.hwVersion, reusableBuffer.hardwareAndSettings.modules[module].receivers[receiver].information.swVersion); } y += FH; } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index afb419228..acfc457e4 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1139,26 +1139,6 @@ union ReusableBuffer }; } moduleSetup; - struct { - uint8_t state; // 0x00 = READ 0x40 = WRITE - tmr10ms_t timeout; - uint8_t dirty; - uint8_t rfProtocol; - uint8_t externalAntenna; - int8_t txPower; - } moduleSettings; - - struct { - uint8_t state; // 0x00 = READ 0x40 = WRITE - tmr10ms_t timeout; - uint8_t receiverId; - uint8_t dirty; - uint8_t telemetryDisabled; - uint8_t pwmRate; - uint8_t outputsCount; - uint8_t outputsMapping[24]; - } receiverSettings; - // 103 bytes struct { int16_t midVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; @@ -1196,8 +1176,32 @@ union ReusableBuffer PXX2HardwareInformation information; } receivers[PXX2_MAX_RECEIVERS_PER_MODULE]; } modules[NUM_MODULES]; + uint32_t updateTime; - } hardware; + + union { + struct { + uint8_t state; // 0x00 = READ 0x40 = WRITE + tmr10ms_t timeout; + uint8_t dirty; + uint8_t rfProtocol; + uint8_t externalAntenna; + int8_t txPower; + } moduleSettings; + + struct { + uint8_t state; // 0x00 = READ 0x40 = WRITE + tmr10ms_t timeout; + uint8_t receiverId; + uint8_t dirty; + uint8_t telemetryDisabled; + uint8_t pwmRate; + uint8_t outputsCount; + uint8_t outputsMapping[24]; + } receiverSettings; + }; + + } hardwareAndSettings; struct { uint8_t stickMode; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 066283e34..9876d58ab 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -130,15 +130,15 @@ void Pxx2Pulses::setupTelemetryFrame(uint8_t module) void Pxx2Pulses::setupHardwareInfoFrame(uint8_t module) { - if (reusableBuffer.hardware.modules[module].current <= reusableBuffer.hardware.modules[module].maximum) { - if (reusableBuffer.hardware.modules[module].timeout == 0) { + if (reusableBuffer.hardwareAndSettings.modules[module].current <= reusableBuffer.hardwareAndSettings.modules[module].maximum) { + if (reusableBuffer.hardwareAndSettings.modules[module].timeout == 0) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_HW_INFO); - Pxx2Transport::addByte(reusableBuffer.hardware.modules[module].current); - reusableBuffer.hardware.modules[module].timeout = 20; - reusableBuffer.hardware.modules[module].current++; + Pxx2Transport::addByte(reusableBuffer.hardwareAndSettings.modules[module].current); + reusableBuffer.hardwareAndSettings.modules[module].timeout = 20; + reusableBuffer.hardwareAndSettings.modules[module].current++; } else { - reusableBuffer.hardware.modules[module].timeout--; + reusableBuffer.hardwareAndSettings.modules[module].timeout--; setupChannelsFrame(module); } } @@ -169,20 +169,20 @@ void Pxx2Pulses::setupRegisterFrame(uint8_t module) void Pxx2Pulses::setupModuleSettingsFrame(uint8_t module) { - if (get_tmr10ms() > reusableBuffer.moduleSettings.timeout) { + if (get_tmr10ms() > reusableBuffer.hardwareAndSettings.moduleSettings.timeout) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_TX_SETTINGS); uint8_t flag0 = 0; - if (reusableBuffer.moduleSettings.state == PXX2_SETTINGS_WRITE) + if (reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_WRITE) flag0 |= PXX2_TX_SETTINGS_FLAG0_WRITE; Pxx2Transport::addByte(flag0); - if (reusableBuffer.moduleSettings.state == PXX2_SETTINGS_WRITE) { - uint8_t flag1 = reusableBuffer.moduleSettings.rfProtocol << 4; - if (reusableBuffer.moduleSettings.externalAntenna) + if (reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_WRITE) { + uint8_t flag1 = reusableBuffer.hardwareAndSettings.moduleSettings.rfProtocol << 4; + if (reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna) flag1 |= PXX2_TX_SETTINGS_FLAG1_EXTERNAL_ANTENNA; Pxx2Transport::addByte(flag1); - Pxx2Transport::addByte(reusableBuffer.moduleSettings.txPower); + Pxx2Transport::addByte(reusableBuffer.hardwareAndSettings.moduleSettings.txPower); } - reusableBuffer.moduleSettings.timeout = get_tmr10ms() + 200/*next try in 2s*/; + reusableBuffer.hardwareAndSettings.moduleSettings.timeout = get_tmr10ms() + 200/*next try in 2s*/; } else { setupChannelsFrame(module); @@ -191,25 +191,25 @@ void Pxx2Pulses::setupModuleSettingsFrame(uint8_t module) void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) { - if (get_tmr10ms() > reusableBuffer.receiverSettings.timeout) { + if (get_tmr10ms() > reusableBuffer.hardwareAndSettings.receiverSettings.timeout) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_RX_SETTINGS); - uint8_t flag0 = reusableBuffer.receiverSettings.receiverId; - if (reusableBuffer.receiverSettings.state == PXX2_SETTINGS_WRITE) + uint8_t flag0 = reusableBuffer.hardwareAndSettings.receiverSettings.receiverId; + if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_WRITE) flag0 |= PXX2_RX_SETTINGS_FLAG0_WRITE; Pxx2Transport::addByte(flag0); - if (reusableBuffer.receiverSettings.state == PXX2_SETTINGS_WRITE) { + if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_WRITE) { uint8_t flag1 = 0; - if (reusableBuffer.receiverSettings.telemetryDisabled) + if (reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled) flag1 |= PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED; - if (reusableBuffer.receiverSettings.pwmRate) + if (reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate) flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; Pxx2Transport::addByte(flag1); - uint8_t outputsCount = min(24, reusableBuffer.receiverSettings.outputsCount); + uint8_t outputsCount = min(24, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount); for (int i = 0; i < outputsCount; i++) { - Pxx2Transport::addByte(min(23, reusableBuffer.receiverSettings.outputsMapping[i])); + Pxx2Transport::addByte(min(23, reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[i])); } } - reusableBuffer.receiverSettings.timeout = get_tmr10ms() + 200/*next try in 2s*/; + reusableBuffer.hardwareAndSettings.receiverSettings.timeout = get_tmr10ms() + 200/*next try in 2s*/; } else { setupChannelsFrame(module); diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index f41e821b1..be47b43ab 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -70,6 +70,7 @@ enum PXX2BindSteps { }; enum PXX2ReceiverStatus { + PXX2_HARDWARE_INFO, PXX2_SETTINGS_READ, PXX2_SETTINGS_WRITE, PXX2_SETTINGS_OK diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 49006d909..b7e54d887 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -51,9 +51,9 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) uint8_t index = frame[3]; if (index == 0xFF) - memcpy(&reusableBuffer.hardware.modules[module].information, &frame[4], sizeof(PXX2HardwareInformation)); + memcpy(&reusableBuffer.hardwareAndSettings.modules[module].information, &frame[4], sizeof(PXX2HardwareInformation)); else if (index < PXX2_MAX_RECEIVERS_PER_MODULE) - memcpy(&reusableBuffer.hardware.modules[module].receivers[index].information, &frame[4], sizeof(PXX2HardwareInformation)); + memcpy(&reusableBuffer.hardwareAndSettings.modules[module].receivers[index].information, &frame[4], sizeof(PXX2HardwareInformation)); } void processModuleSettingsFrame(uint8_t module, uint8_t * frame) @@ -63,15 +63,15 @@ void processModuleSettingsFrame(uint8_t module, uint8_t * frame) } // Flag1 - reusableBuffer.moduleSettings.txPower = frame[4] >> 4; + reusableBuffer.hardwareAndSettings.moduleSettings.txPower = frame[4] >> 4; if (frame[4] & PXX2_TX_SETTINGS_FLAG1_EXTERNAL_ANTENNA) - reusableBuffer.moduleSettings.externalAntenna = 1; + reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna = 1; // Power - reusableBuffer.moduleSettings.txPower = frame[5]; + reusableBuffer.hardwareAndSettings.moduleSettings.txPower = frame[5]; - reusableBuffer.moduleSettings.state = PXX2_SETTINGS_OK; - reusableBuffer.moduleSettings.timeout = 0; + reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_OK; + reusableBuffer.hardwareAndSettings.moduleSettings.timeout = 0; moduleSettings[module].mode = MODULE_MODE_NORMAL; } @@ -82,19 +82,19 @@ void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) } if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FASTPWM) - reusableBuffer.receiverSettings.pwmRate = 1; + reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = 1; if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED) - reusableBuffer.receiverSettings.telemetryDisabled = 1; + reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled = 1; uint8_t outputsCount = min(16, frame[0] - 4); - reusableBuffer.receiverSettings.outputsCount = outputsCount; + reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount = outputsCount; for (uint8_t pin = 0; pin < outputsCount; pin++) { - reusableBuffer.receiverSettings.outputsMapping[pin] = frame[5 + pin]; + reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin] = frame[5 + pin]; } - reusableBuffer.receiverSettings.state = PXX2_SETTINGS_OK; - reusableBuffer.receiverSettings.timeout = 0; + reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_OK; + reusableBuffer.hardwareAndSettings.receiverSettings.timeout = 0; moduleSettings[module].mode = MODULE_MODE_NORMAL; } From a8a775e63954b5d450a576087e74c547d1037800 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 26 Mar 2019 19:50:50 +0100 Subject: [PATCH 432/446] Gyro support continued --- radio/src/gui/128x64/model_setup.cpp | 6 + .../common/arm/stm32/lsm6ds3_driver.cpp | 184 ++++++++++++------ radio/src/targets/taranis/board.cpp | 5 +- .../src/targets/taranis/extmodule_driver.cpp | 10 +- radio/src/targets/taranis/hal.h | 7 +- radio/src/targets/taranis/i2c2_driver.cpp | 98 ---------- 6 files changed, 142 insertions(+), 168 deletions(-) delete mode 100644 radio/src/targets/taranis/i2c2_driver.cpp diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 14b8bc4ca..3fcacfa28 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -529,6 +529,12 @@ void menuModelSetup(event_t event) if (event == EVT_ENTRY) { reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + + extern void gyroInit(); + gyroInit(); + + + } uint8_t sub = menuVerticalPosition - HEADER_LINE; diff --git a/radio/src/targets/common/arm/stm32/lsm6ds3_driver.cpp b/radio/src/targets/common/arm/stm32/lsm6ds3_driver.cpp index 98a5b15d5..8b8699b41 100644 --- a/radio/src/targets/common/arm/stm32/lsm6ds3_driver.cpp +++ b/radio/src/targets/common/arm/stm32/lsm6ds3_driver.cpp @@ -180,7 +180,8 @@ #define LSM6DS3_RESET_ADDR 0x12 #define LSM6DS3_RESET_MASK 0x01 -#define LSM6DS3_ADDRESS 0xD4 +#define LSM6DS3_ADDRESS 0xD6 +#define LSM6DSLTR_ID 0x6A static const char configure[][2] = { @@ -194,84 +195,143 @@ static const char configure[][2] = volatile int lsm6ds3_state = 1; -int lsm6ds3Init() +static void i2c2Init() { - int i; - char cmd[2]; + I2C_DeInit(I2CX); - I2C_transfer_block i2c_block[2]; + I2C_InitTypeDef I2C_InitStructure; + I2C_InitStructure.I2C_ClockSpeed = I2CX_SPEED; + I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; + I2C_InitStructure.I2C_OwnAddress1 = 0x00; + I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; + I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; + I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; + I2C_Init(I2CX, &I2C_InitStructure); + I2C_Cmd(I2CX, ENABLE); - EXTILine_Config(); + GPIO_PinAFConfig(I2CX_SCL_GPIO, I2CX_SCL_GPIO_PinSource, I2CX_GPIO_AF); + GPIO_PinAFConfig(I2CX_SDA_GPIO, I2CX_SDA_GPIO_PinSource, I2CX_GPIO_AF); - cmd[0] = LSM6DS3_WHO_AM_I; + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = I2CX_SCL_GPIO_PIN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(I2CX_SCL_GPIO, &GPIO_InitStructure); - i2c_block[0].addr = LSM6DS3_ADDRESS; - i2c_block[0].rw = I2C_WRITE; - i2c_block[0].stop_mode = I2C_WRITE_BYPASS_STOP; - i2c_block[0].ack_mode = I2C_READ_RESPOND_ACK; - i2c_block[0].len = 1; - i2c_block[0].buf = cmd; + GPIO_InitStructure.GPIO_Pin = I2CX_SDA_GPIO_PIN; + GPIO_Init(I2CX_SDA_GPIO, &GPIO_InitStructure); +} - i2c_block[1].addr = LSM6DS3_ADDRESS; - i2c_block[1].rw = I2C_READ; - i2c_block[1].stop_mode = I2C_WRITE_APPEND_STOP; - i2c_block[1].ack_mode = I2C_READ_RESPOND_ACK; - i2c_block[1].len = 2; - i2c_block[1].buf = cmd; +#define I2C_TIMEOUT_MAX 10000 +bool I2C2_WaitEvent(uint32_t event) +{ + uint32_t timeout = I2C_TIMEOUT_MAX; + while (!I2C_CheckEvent(I2CX, event)) { + if ((timeout--) == 0) return false; + } + return true; +} - i2c_dma_transfer(i2c_block, 2); +bool I2C2_WaitEventCleared(uint32_t event) +{ + uint32_t timeout = I2C_TIMEOUT_MAX; + while (I2C_CheckEvent(I2CX, event)) { + if ((timeout--) == 0) return false; + } + return true; +} - if (cmd[0] != LSM6DS3_WHO_AM_I_DEF) { +int setGyroRegister(uint8_t address, uint8_t value) +{ + if (!I2C2_WaitEventCleared(I2C_FLAG_BUSY)) return -1; - } - cmd[0] = 0x12; - cmd[1] = 0x5; - i2c_block[0].addr = LSM6DS3_ADDRESS; - i2c_block[0].rw = I2C_WRITE; - i2c_block[0].stop_mode = I2C_WRITE_APPEND_STOP; + I2C_GenerateSTART(I2CX, ENABLE); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) + return -1; - i2c_block[0].ack_mode = I2C_READ_RESPOND_ACK; + I2C_Send7bitAddress(I2CX, LSM6DS3_ADDRESS, I2C_Direction_Transmitter); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + return -1; - i2c_block[0].len = 2; - i2c_block[0].buf = cmd; + I2C_SendData(I2CX, address); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) // TODO TRANSMITTING + return -1; - i2c_dma_transfer(i2c_block, 1); + I2C_SendData(I2CX, value); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) + return -1; - delay_ms(1); - - cmd[0] = 0x12; - cmd[1] = 0x4; - i2c_block[0].addr = LSM6DS3_ADDRESS; - i2c_block[0].rw = I2C_WRITE; - i2c_block[0].stop_mode = I2C_WRITE_APPEND_STOP; - - i2c_block[0].ack_mode = I2C_READ_RESPOND_ACK; - - i2c_block[0].len = 2; - i2c_block[0].buf = cmd; - - i2c_dma_transfer(i2c_block, 1); - - delay_ms(1); - - for (i = 0; i < sizeof(configure) / sizeof(configure[0]); i++) { - i2c_block[0].addr = LSM6DS3_ADDRESS; - i2c_block[0].rw = I2C_WRITE; - i2c_block[0].stop_mode = I2C_WRITE_APPEND_STOP; - - i2c_block[0].ack_mode = I2C_READ_RESPOND_ACK; - - i2c_block[0].len = 2; - i2c_block[0].buf = (char *) configure[i]; - - i2c_dma_transfer(i2c_block, 1); - } + I2C_GenerateSTOP(I2CX, ENABLE); return 0; } -int lsm6ds3Read(void *buffer, int len, OFFSET offset1) +int readGyroRegister(uint8_t address) +{ + if (!I2C2_WaitEventCleared(I2C_FLAG_BUSY)) + return -1; + + I2C_GenerateSTART(I2CX, ENABLE); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) + return -1; + + I2C_Send7bitAddress(I2CX, LSM6DS3_ADDRESS, I2C_Direction_Transmitter); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + return -1; + + I2C_SendData(I2CX, address); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) + return -1; + + I2C_GenerateSTART(I2CX, ENABLE); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) + return -1; + + I2C_Send7bitAddress(I2CX, LSM6DS3_ADDRESS, I2C_Direction_Receiver); + + I2C_AcknowledgeConfig(I2CX, DISABLE); + if (!I2C2_WaitEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)) + return -1; + + uint8_t value = I2C_ReceiveData(I2CX); + + I2C_GenerateSTOP(I2CX, ENABLE); + + return value; +} + +int gyroInit() +{ + i2c2Init(); + + uint8_t id = readGyroRegister(LSM6DS3_WHO_AM_I); + if (id != LSM6DSLTR_ID) { + return -1; + } + + TRACE("OK"); + + setGyroRegister(0x12, 0x05); + delay_ms(1); + setGyroRegister(0x12, 0x04); + delay_ms(1); + + TRACE("OK2"); + + for (uint8_t i = 0; i < DIM(configure); i++) { + setGyroRegister(configure[i][0], configure[i][1]); + } + + TRACE("OK4"); + + return 0; +} + +#if 0 +int gyroRead(void *buffer, int len, OFFSET offset1) { char t_char[10]; short t_short[7]; @@ -311,3 +371,5 @@ int lsm6ds3Read(void *buffer, int len, OFFSET offset1) return len; } + +#endif \ No newline at end of file diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index fd3b88ca1..6a8bfcf5f 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -151,14 +151,15 @@ void boardInit() INTMODULE_RCC_AHB1Periph | EXTMODULE_RCC_AHB1Periph | TELEMETRY_RCC_AHB1Periph | SPORT_UPDATE_RCC_AHB1Periph | SERIAL_RCC_AHB1Periph | TRAINER_RCC_AHB1Periph | - HEARTBEAT_RCC_AHB1Periph | BT_RCC_AHB1Periph, ENABLE); + HEARTBEAT_RCC_AHB1Periph | BT_RCC_AHB1Periph | GYRO_RCC_AHB1Periph, + ENABLE); RCC_APB1PeriphClockCmd(LCD_RCC_APB1Periph | AUDIO_RCC_APB1Periph | ADC_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph | HAPTIC_RCC_APB1Periph | INTERRUPT_xMS_RCC_APB1Periph | TIMER_2MHz_RCC_APB1Periph | I2C_RCC_APB1Periph | SD_RCC_APB1Periph | TRAINER_RCC_APB1Periph | TELEMETRY_RCC_APB1Periph | SERIAL_RCC_APB1Periph | - INTMODULE_RCC_APB1Periph | BT_RCC_APB1Periph, ENABLE); + INTMODULE_RCC_APB1Periph | BT_RCC_APB1Periph | GYRO_RCC_APB1Periph, ENABLE); RCC_APB2PeriphClockCmd(BACKLIGHT_RCC_APB2Periph | ADC_RCC_APB2Periph | HAPTIC_RCC_APB2Periph | INTMODULE_RCC_APB2Periph | diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 4418a95df..fc590e2ba 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -179,8 +179,8 @@ void extmoduleSendBuffer(const uint8_t * data, uint8_t size) } // TODO remove this when we have adaptative speed -uint8_t counter = 0; -#include +//uint8_t counter = 0; +//#include #define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) extern "C" void EXTMODULE_USART_IRQHandler(void) @@ -191,9 +191,9 @@ extern "C" void EXTMODULE_USART_IRQHandler(void) uint8_t data = EXTMODULE_USART->DR; if (status & USART_FLAG_ERRORS) { extmoduleFifo.errors++; - if (!counter++) { - TRACE_NOCRLF("%02X ", (uint8_t)status); - } +// if (!counter++) { +// TRACE_NOCRLF("%02X ", (uint8_t)status); +// } } else { extmoduleFifo.push(data); diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 9b8d9ddf4..6f12e32d7 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1191,8 +1191,8 @@ // Second I2C Bus: IMU #if defined(PCBXLITES) - #define I2CX_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC) - #define I2CX_RCC_APB1Periph RCC_APB1Periph_I2C3 + #define GYRO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC) + #define GYRO_RCC_APB1Periph RCC_APB1Periph_I2C3 #define I2CX I2C3 #define I2CX_SCL_GPIO GPIOA #define I2CX_SCL_GPIO_PIN GPIO_Pin_8 // PA.08 @@ -1202,6 +1202,9 @@ #define I2CX_SCL_GPIO_PinSource GPIO_PinSource8 #define I2CX_SDA_GPIO_PinSource GPIO_PinSource9 #define I2CX_SPEED 400000 +#else + #define GYRO_RCC_AHB1Periph 0 + #define GYRO_RCC_APB1Periph 0 #endif // SD - SPI2 diff --git a/radio/src/targets/taranis/i2c2_driver.cpp b/radio/src/targets/taranis/i2c2_driver.cpp deleted file mode 100644 index fe7f3a2fb..000000000 --- a/radio/src/targets/taranis/i2c2_driver.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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 "board.h" - -void i2c2Init() -{ - I2C_DeInit(I2CX); - - I2C_InitTypeDef I2C_InitStructure; - I2C_InitStructure.I2C_ClockSpeed = I2CX_SPEED; - I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; - I2C_InitStructure.I2C_OwnAddress1 = 0x00; - I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; - I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; - I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; - I2C_Init(I2CX, &I2C_InitStructure); - I2C_Cmd(I2CX, ENABLE); - - GPIO_PinAFConfig(I2CX_SCL_GPIO, I2CX_SCL_GPIO_PinSource, I2CX_GPIO_AF); - GPIO_PinAFConfig(I2CX_SDA_GPIO, I2CX_SDA_GPIO_PinSource, I2CX_GPIO_AF); - - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = I2CX_SCL_GPIO_PIN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(I2CX_SCL_GPIO, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = I2CX_SDA_GPIO_PIN; - GPIO_Init(I2CX_SDA_GPIO, &GPIO_InitStructure); -} - -#define I2C_TIMEOUT_MAX 1000 -bool I2C_WaitEvent(uint32_t event) -{ - uint32_t timeout = I2C_TIMEOUT_MAX; - while (!I2C_CheckEvent(I2CX, event)) { - if ((timeout--) == 0) return false; - } - return true; -} - -bool I2C2_WaitEventCleared(uint32_t event) -{ - uint32_t timeout = I2C_TIMEOUT_MAX; - while (I2C_CheckEvent(I2CX, event)) { - if ((timeout--) == 0) return false; - } - return true; -} - -void setVolume(uint8_t volume) -{ - if (!I2C2_WaitEventCleared(I2C_FLAG_BUSY)) - return; - - I2C_GenerateSTART(I2CX, ENABLE); - if (!I2C2_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) - return; - - I2C_Send7bitAddress(I2C, I2C_ADDRESS_VOLUME, I2C_Direction_Transmitter); - if (!I2C2_WaitEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) - return; - - I2C_SendData(I2CX, 0); - if (!I2C2_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) - return; - I2C_SendData(I2CX, volume); - if (!I2C2_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) - return; - - I2C_GenerateSTOP(I2CX, ENABLE); -} - -int32_t getVolume() -{ - return -1; // TODO -} -#endif From d24b05fe8e3fcf3aff4b7c694a1ccdd2981b6434 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 26 Mar 2019 19:51:41 +0100 Subject: [PATCH 433/446] Gyro support continued --- radio/src/gui/128x64/model_setup.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 3fcacfa28..14b8bc4ca 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -529,12 +529,6 @@ void menuModelSetup(event_t event) if (event == EVT_ENTRY) { reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; - - extern void gyroInit(); - gyroInit(); - - - } uint8_t sub = menuVerticalPosition - HEADER_LINE; From 4248b1fce946e78eb0bcc3b7982180cfe2950485 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Mar 2019 08:56:06 +0100 Subject: [PATCH 434/446] Model Setup file splitted --- radio/src/gui/128x64/menus.h | 3 + radio/src/gui/128x64/model_failsafe.cpp | 138 +++++++ radio/src/gui/128x64/model_module_options.cpp | 121 ++++++ .../src/gui/128x64/model_receiver_options.cpp | 156 ++++++++ radio/src/gui/128x64/model_setup.cpp | 347 ------------------ radio/src/gui/212x64/menus.h | 2 + radio/src/gui/CMakeLists.txt | 3 + 7 files changed, 423 insertions(+), 347 deletions(-) create mode 100644 radio/src/gui/128x64/model_failsafe.cpp create mode 100644 radio/src/gui/128x64/model_module_options.cpp create mode 100644 radio/src/gui/128x64/model_receiver_options.cpp diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index 0f7c64342..26e9af134 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -135,6 +135,9 @@ enum MenuModelIndexes { void menuModelSelect(event_t event); void menuModelSetup(event_t event); +void menuModelFailsafe(event_t event); +void menuModelModuleOptions(event_t event); +void menuModelReceiverOptions(event_t event); void menuModelHeli(event_t event); void menuModelFlightModesAll(event_t event); void menuModelExpoOne(event_t event); diff --git a/radio/src/gui/128x64/model_failsafe.cpp b/radio/src/gui/128x64/model_failsafe.cpp new file mode 100644 index 000000000..905b293f7 --- /dev/null +++ b/radio/src/gui/128x64/model_failsafe.cpp @@ -0,0 +1,138 @@ +/* + * 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 + +extern uint8_t g_moduleIdx; + +void menuModelFailsafe(event_t event) +{ + const uint8_t channelStart = g_model.moduleData[g_moduleIdx].channelsStart; + const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; + uint8_t wbar = LCD_W - FW * 4 - FWNUM * 4; +#if defined(PPM_UNIT_PERCENT_PREC1) + wbar -= 6; +#endif + + if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + event = 0; + + if (menuVerticalPosition < sentModuleChannels(g_moduleIdx)) { + if (s_editMode > 0) { + g_model.failsafeChannels[menuVerticalPosition] = channelOutputs[menuVerticalPosition+channelStart]; + s_editMode = 0; + } + else { + int16_t & failsafe = g_model.failsafeChannels[menuVerticalPosition]; + if (failsafe < FAILSAFE_CHANNEL_HOLD) + failsafe = FAILSAFE_CHANNEL_HOLD; + else if (failsafe == FAILSAFE_CHANNEL_HOLD) + failsafe = FAILSAFE_CHANNEL_NOPULSE; + else + failsafe = 0; + } + } + else { + // "Outputs => Failsafe" menu item + setCustomFailsafe(g_moduleIdx); + } + + storageDirty(EE_MODEL); + AUDIO_WARNING1(); + SEND_FAILSAFE_NOW(g_moduleIdx); + } + + SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx) + 1); + + lcdDrawTextAlignedCenter(0, FAILSAFESET); + lcdInvertLine(0); + + const coord_t x = 1; + coord_t y = FH + 1; + uint8_t line = (menuVerticalPosition >= sentModuleChannels(g_moduleIdx) ? 2 : 0); + uint8_t ch = (menuVerticalPosition >= 8 ? 8 : 0) + line; + + // Channels + for (; line < 8; line++) { + const int32_t channelValue = channelOutputs[ch+channelStart]; + int32_t failsafeValue = g_model.failsafeChannels[ch]; + + // Channel + putsChn(x+1, y, ch+1, SMLSIZE); + + // Value + LcdFlags flags = TINSIZE; + if (menuVerticalPosition == ch) { + flags |= INVERS; + if (s_editMode > 0) { + if (failsafeValue == FAILSAFE_CHANNEL_HOLD || failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + s_editMode = 0; + } + else { + flags |= BLINK; + CHECK_INCDEC_MODELVAR(event, g_model.failsafeChannels[ch], -lim, +lim); + } + } + } + + uint8_t xValue = x+LCD_W-4-wbar; + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { + lcdDrawText(xValue, y, STR_HOLD, RIGHT|flags); + failsafeValue = 0; + } + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + lcdDrawText(xValue, y, STR_NONE, RIGHT|flags); + failsafeValue = 0; + } + else { +#if defined(PPM_UNIT_US) + lcdDrawNumber(xValue, y, PPM_CH_CENTER(ch)+failsafeValue/2, RIGHT|flags); +#elif defined(PPM_UNIT_PERCENT_PREC1) + lcdDrawNumber(xValue, y, calcRESXto1000(failsafeValue), RIGHT|PREC1|flags); +#else + lcdDrawNumber(xValue, y, calcRESXto1000(failsafeValue)/10, RIGHT|flags); +#endif + } + + // Gauge +#if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines + lcdDrawRect(x+LCD_W-3-wbar, y, wbar+1, 6); +#endif + const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar/2 + lim/2) / lim, wbar/2); + const uint8_t lenFailsafe = limit(1, (abs(failsafeValue) * wbar/2 + lim/2) / lim, wbar/2); + const coord_t xChannel = (channelValue>0) ? x+LCD_W-3-wbar/2 : x+LCD_W-2-wbar/2-lenChannel; + const coord_t xFailsafe = (failsafeValue>0) ? x+LCD_W-3-wbar/2 : x+LCD_W-2-wbar/2-lenFailsafe; + lcdDrawHorizontalLine(xChannel, y+1, lenChannel, DOTTED, 0); + lcdDrawHorizontalLine(xChannel, y+2, lenChannel, DOTTED, 0); + lcdDrawSolidHorizontalLine(xFailsafe, y+3, lenFailsafe); + lcdDrawSolidHorizontalLine(xFailsafe, y+4, lenFailsafe); + + y += FH - 1; + + if (++ch >= sentModuleChannels(g_moduleIdx)) + break; + } + + if (menuVerticalPosition >= sentModuleChannels(g_moduleIdx)) { + // Outputs => Failsafe + lcdDrawText(CENTER_OFS, LCD_H - (FH + 1), STR_OUTPUTS2FAILSAFE, INVERS); + } +} diff --git a/radio/src/gui/128x64/model_module_options.cpp b/radio/src/gui/128x64/model_module_options.cpp new file mode 100644 index 000000000..302e77d75 --- /dev/null +++ b/radio/src/gui/128x64/model_module_options.cpp @@ -0,0 +1,121 @@ +/* + * 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 + +#define RECEIVER_OPTIONS_2ND_COLUMN 80 + +extern uint8_t g_moduleIdx; + +void onTxOptionsUpdateConfirm(const char * result) +{ + if (result == STR_OK) { + reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_WRITE; + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = 2; + reusableBuffer.hardwareAndSettings.moduleSettings.timeout = 0; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_MODULE_SETTINGS; + } + else { + popMenu(); + } +} + +enum MenuModelModuleOptionsItems { + ITEM_MODULE_SETTINGS_RF_PROTOCOL, + ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA, + ITEM_MODULE_SETTINGS_POWER, + ITEM_MODULE_SETTINGS_COUNT +}; + +void menuModelModuleOptions(event_t event) +{ + SIMPLE_SUBMENU_NOTITLE(ITEM_MODULE_SETTINGS_COUNT); + + if (menuEvent) { + moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; + if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty) { + abortPopMenu(); + POPUP_CONFIRMATION("Update TX options?", onTxOptionsUpdateConfirm); + } + else { + return; + } + } + + if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty == 2 && reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { + popMenu(); + } + + int8_t sub = menuVerticalPosition; + + lcdDrawTextAlignedLeft(0, "Module options"); + lcdInvertLine(0); + + if (event == EVT_ENTRY) { +#if defined(SIMU) + reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_OK; +#else + moduleSettings[g_moduleIdx].mode = MODULE_MODE_MODULE_SETTINGS; +#endif + } + + if (reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { + for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); + + switch (i) { + case ITEM_MODULE_SETTINGS_RF_PROTOCOL: + lcdDrawText(0, y, "RF Protocol"); + lcdDrawTextAtIndex(RECEIVER_OPTIONS_2ND_COLUMN, y, STR_XJT_PROTOCOLS, reusableBuffer.hardwareAndSettings.moduleSettings.rfProtocol + 1, attr); + if (attr) { + reusableBuffer.hardwareAndSettings.moduleSettings.rfProtocol = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.rfProtocol, RF_PROTO_X16, RF_PROTO_LAST, 0, nullptr); + if (checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = true; + } + } + break; + + case ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA: + reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna = editCheckBox(reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna, RECEIVER_OPTIONS_2ND_COLUMN, y, "Ext. antenna", attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = true; + } + break; + + case ITEM_MODULE_SETTINGS_POWER: + lcdDrawText(0, y, "Power"); + lcdDrawNumber(RECEIVER_OPTIONS_2ND_COLUMN, y, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, attr); + lcdDrawText(lcdNextPos, y, "dBm"); + if (attr) { + reusableBuffer.hardwareAndSettings.moduleSettings.txPower = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, -127, 127); + if (checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = true; + } + } + break; + } + } + } + else { + lcdDrawText(4 * FW, 4 * FH, "Waiting for TX..."); + } +} diff --git a/radio/src/gui/128x64/model_receiver_options.cpp b/radio/src/gui/128x64/model_receiver_options.cpp new file mode 100644 index 000000000..59dcbe47a --- /dev/null +++ b/radio/src/gui/128x64/model_receiver_options.cpp @@ -0,0 +1,156 @@ +/* + * 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 + +#define RECEIVER_OPTIONS_2ND_COLUMN 80 + +extern uint8_t g_moduleIdx; +extern void drawReceiverName(uint8_t x, uint8_t y, uint8_t receiverSlot); + +void onRxOptionsUpdateConfirm(const char * result) +{ + if (result == STR_OK) { + reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_WRITE; + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = 2; + reusableBuffer.hardwareAndSettings.receiverSettings.timeout = 0; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + else { + popMenu(); + } +} + +enum { + ITEM_RECEIVER_TELEMETRY, + ITEM_RECEIVER_PWM_RATE, + ITEM_RECEIVER_PINMAP_FIRST +}; + +void menuModelReceiverOptions(event_t event) +{ + const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; + uint8_t wbar = LCD_W / 2 - 20; + auto outputsCount = min(16, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount); + + SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + outputsCount); + + if (event == EVT_ENTRY) { +#if defined(SIMU) + reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_OK; + reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount = 8; +#else + // no need to initialize reusableBuffer.hardwareAndSettings.receiverSettings.state to PXX2_HARDWARE_INFO + moduleSettings[g_moduleIdx].mode = MODULE_MODE_GET_HARDWARE_INFO; +#endif + } + + if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_HARDWARE_INFO && moduleSettings[g_moduleIdx].mode == MODULE_MODE_NORMAL) { + reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_READ; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + + if (menuEvent) { + moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; + if (reusableBuffer.hardwareAndSettings.receiverSettings.dirty) { + abortPopMenu(); + POPUP_CONFIRMATION("Update RX options?", onRxOptionsUpdateConfirm); + } + else { + return; + } + } + + if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.receiverSettings.dirty) { + killEvents(event); + reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_WRITE; + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = 0; + reusableBuffer.hardwareAndSettings.receiverSettings.timeout = 0; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + + if (reusableBuffer.hardwareAndSettings.receiverSettings.dirty == 2 && reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { + popMenu(); + return; + } + + int8_t sub = menuVerticalPosition; + + lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); + drawReceiverName(FW * 13, 0, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId); + lcdInvertLine(0); + + if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { + for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); + + switch (i) { + case ITEM_RECEIVER_TELEMETRY: + reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled, RECEIVER_OPTIONS_2ND_COLUMN, y, "Telem. disabled", attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true; + } + break; + + case ITEM_RECEIVER_PWM_RATE: + reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, "9ms PWM", attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true; + } + break; + + default: + // Pin + { + uint8_t pin = i - ITEM_RECEIVER_PINMAP_FIRST; + uint8_t channel = reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin]; + int32_t channelValue = channelOutputs[channel]; + lcdDrawText(0, y, "Pin"); + lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); + putsChn(7 * FW, y, channel + 1, attr); + + // Channel + if (attr) { + channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx) - 1); + if (checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin] = channel; + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true; + } + } + + // Bargraph +#if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines + lcdDrawRect(LCD_W - 3 - wbar, y + 1, wbar + 1, 4); +#endif + const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); + const coord_t xChannel = (channelValue > 0) ? LCD_W - 3 - wbar / 2 : LCD_W - 2 - wbar / 2 - lenChannel; + lcdDrawHorizontalLine(xChannel, y + 2, lenChannel, SOLID, 0); + lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); + break; + } + } + } + } + else { + lcdDrawText(4 * FW, 4 * FH, "Waiting for RX..."); + } +} diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 14b8bc4ca..e26dd2cc9 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -38,10 +38,6 @@ void drawReceiverName(uint8_t x, uint8_t y, uint8_t receiverSlot) lcdDrawText(x, y, "---"); } -void menuModelFailsafe(event_t event); -void menuModelModuleOptions(event_t event); -void menuModelReceiverOptions(event_t event); - #if defined(PCBTARANIS) uint8_t getSwitchWarningsCount() { @@ -1822,346 +1818,3 @@ void menuModelSetup(event_t event) } } } - -void menuModelFailsafe(event_t event) -{ - const uint8_t channelStart = g_model.moduleData[g_moduleIdx].channelsStart; - const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; - uint8_t wbar = LCD_W - FW * 4 - FWNUM * 4; -#if defined(PPM_UNIT_PERCENT_PREC1) - wbar -= 6; -#endif - - if (event == EVT_KEY_LONG(KEY_ENTER)) { - killEvents(event); - event = 0; - - if (menuVerticalPosition < sentModuleChannels(g_moduleIdx)) { - if (s_editMode > 0) { - g_model.failsafeChannels[menuVerticalPosition] = channelOutputs[menuVerticalPosition+channelStart]; - s_editMode = 0; - } - else { - int16_t & failsafe = g_model.failsafeChannels[menuVerticalPosition]; - if (failsafe < FAILSAFE_CHANNEL_HOLD) - failsafe = FAILSAFE_CHANNEL_HOLD; - else if (failsafe == FAILSAFE_CHANNEL_HOLD) - failsafe = FAILSAFE_CHANNEL_NOPULSE; - else - failsafe = 0; - } - } - else { - // "Outputs => Failsafe" menu item - setCustomFailsafe(g_moduleIdx); - } - - storageDirty(EE_MODEL); - AUDIO_WARNING1(); - SEND_FAILSAFE_NOW(g_moduleIdx); - } - - SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx) + 1); - - lcdDrawTextAlignedCenter(0, FAILSAFESET); - lcdInvertLine(0); - - const coord_t x = 1; - coord_t y = FH + 1; - uint8_t line = (menuVerticalPosition >= sentModuleChannels(g_moduleIdx) ? 2 : 0); - uint8_t ch = (menuVerticalPosition >= 8 ? 8 : 0) + line; - - // Channels - for (; line < 8; line++) { - const int32_t channelValue = channelOutputs[ch+channelStart]; - int32_t failsafeValue = g_model.failsafeChannels[ch]; - - // Channel - putsChn(x+1, y, ch+1, SMLSIZE); - - // Value - LcdFlags flags = TINSIZE; - if (menuVerticalPosition == ch) { - flags |= INVERS; - if (s_editMode > 0) { - if (failsafeValue == FAILSAFE_CHANNEL_HOLD || failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - s_editMode = 0; - } - else { - flags |= BLINK; - CHECK_INCDEC_MODELVAR(event, g_model.failsafeChannels[ch], -lim, +lim); - } - } - } - - uint8_t xValue = x+LCD_W-4-wbar; - if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { - lcdDrawText(xValue, y, STR_HOLD, RIGHT|flags); - failsafeValue = 0; - } - else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - lcdDrawText(xValue, y, STR_NONE, RIGHT|flags); - failsafeValue = 0; - } - else { -#if defined(PPM_UNIT_US) - lcdDrawNumber(xValue, y, PPM_CH_CENTER(ch)+failsafeValue/2, RIGHT|flags); -#elif defined(PPM_UNIT_PERCENT_PREC1) - lcdDrawNumber(xValue, y, calcRESXto1000(failsafeValue), RIGHT|PREC1|flags); -#else - lcdDrawNumber(xValue, y, calcRESXto1000(failsafeValue)/10, RIGHT|flags); -#endif - } - - // Gauge -#if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines - lcdDrawRect(x+LCD_W-3-wbar, y, wbar+1, 6); -#endif - const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar/2 + lim/2) / lim, wbar/2); - const uint8_t lenFailsafe = limit(1, (abs(failsafeValue) * wbar/2 + lim/2) / lim, wbar/2); - const coord_t xChannel = (channelValue>0) ? x+LCD_W-3-wbar/2 : x+LCD_W-2-wbar/2-lenChannel; - const coord_t xFailsafe = (failsafeValue>0) ? x+LCD_W-3-wbar/2 : x+LCD_W-2-wbar/2-lenFailsafe; - lcdDrawHorizontalLine(xChannel, y+1, lenChannel, DOTTED, 0); - lcdDrawHorizontalLine(xChannel, y+2, lenChannel, DOTTED, 0); - lcdDrawSolidHorizontalLine(xFailsafe, y+3, lenFailsafe); - lcdDrawSolidHorizontalLine(xFailsafe, y+4, lenFailsafe); - - y += FH - 1; - - if (++ch >= sentModuleChannels(g_moduleIdx)) - break; - } - - if (menuVerticalPosition >= sentModuleChannels(g_moduleIdx)) { - // Outputs => Failsafe - lcdDrawText(CENTER_OFS, LCD_H - (FH + 1), STR_OUTPUTS2FAILSAFE, INVERS); - } -} - -#define RECEIVER_OPTIONS_2ND_COLUMN 80 - -void onTxOptionsUpdateConfirm(const char * result) -{ - if (result == STR_OK) { - reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_WRITE; - reusableBuffer.hardwareAndSettings.moduleSettings.dirty = 2; - reusableBuffer.hardwareAndSettings.moduleSettings.timeout = 0; - moduleSettings[g_moduleIdx].mode = MODULE_MODE_MODULE_SETTINGS; - } - else { - popMenu(); - } -} - -enum MenuModelModuleOptionsItems { - ITEM_MODULE_SETTINGS_RF_PROTOCOL, - ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA, - ITEM_MODULE_SETTINGS_POWER, - ITEM_MODULE_SETTINGS_COUNT -}; - -void menuModelModuleOptions(event_t event) -{ - SIMPLE_SUBMENU_NOTITLE(ITEM_MODULE_SETTINGS_COUNT); - - if (menuEvent) { - moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; - if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty) { - abortPopMenu(); - POPUP_CONFIRMATION("Update TX options?", onTxOptionsUpdateConfirm); - } - else { - return; - } - } - - if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty == 2 && reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { - popMenu(); - } - - int8_t sub = menuVerticalPosition; - - lcdDrawTextAlignedLeft(0, "Module options"); - lcdInvertLine(0); - - if (event == EVT_ENTRY) { -#if defined(SIMU) - reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_OK; -#else - moduleSettings[g_moduleIdx].mode = MODULE_MODE_MODULE_SETTINGS; -#endif - } - - if (reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { - for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); - - switch (i) { - case ITEM_MODULE_SETTINGS_RF_PROTOCOL: - lcdDrawText(0, y, "RF Protocol"); - lcdDrawTextAtIndex(RECEIVER_OPTIONS_2ND_COLUMN, y, STR_XJT_PROTOCOLS, reusableBuffer.hardwareAndSettings.moduleSettings.rfProtocol + 1, attr); - if (attr) { - reusableBuffer.hardwareAndSettings.moduleSettings.rfProtocol = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.rfProtocol, RF_PROTO_X16, RF_PROTO_LAST, 0, nullptr); - if (checkIncDec_Ret) { - reusableBuffer.hardwareAndSettings.moduleSettings.dirty = true; - } - } - break; - - case ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA: - reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna = editCheckBox(reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna, RECEIVER_OPTIONS_2ND_COLUMN, y, "Ext. antenna", attr, event); - if (attr && checkIncDec_Ret) { - reusableBuffer.hardwareAndSettings.moduleSettings.dirty = true; - } - break; - - case ITEM_MODULE_SETTINGS_POWER: - lcdDrawText(0, y, "Power"); - lcdDrawNumber(RECEIVER_OPTIONS_2ND_COLUMN, y, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, attr); - lcdDrawText(lcdNextPos, y, "dBm"); - if (attr) { - reusableBuffer.hardwareAndSettings.moduleSettings.txPower = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, -127, 127); - if (checkIncDec_Ret) { - reusableBuffer.hardwareAndSettings.moduleSettings.dirty = true; - } - } - break; - } - } - } - else { - lcdDrawText(4 * FW, 4 * FH, "Waiting for TX..."); - } -} - -void onRxOptionsUpdateConfirm(const char * result) -{ - if (result == STR_OK) { - reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_WRITE; - reusableBuffer.hardwareAndSettings.receiverSettings.dirty = 2; - reusableBuffer.hardwareAndSettings.receiverSettings.timeout = 0; - moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - } - else { - popMenu(); - } -} - -enum { - ITEM_RECEIVER_TELEMETRY, - ITEM_RECEIVER_PWM_RATE, - ITEM_RECEIVER_PINMAP_FIRST -}; - -void menuModelReceiverOptions(event_t event) -{ - const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; - uint8_t wbar = LCD_W / 2 - 20; - auto outputsCount = min(16, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount); - - SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + outputsCount); - - if (event == EVT_ENTRY) { -#if defined(SIMU) - reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_OK; - reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount = 8; -#else - // no need to initialize reusableBuffer.hardwareAndSettings.receiverSettings.state to PXX2_HARDWARE_INFO - moduleSettings[g_moduleIdx].mode = MODULE_MODE_GET_HARDWARE_INFO; -#endif - } - - if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_HARDWARE_INFO && moduleSettings[g_moduleIdx].mode == MODULE_MODE_NORMAL) { - reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_READ; - moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - } - - if (menuEvent) { - moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; - if (reusableBuffer.hardwareAndSettings.receiverSettings.dirty) { - abortPopMenu(); - POPUP_CONFIRMATION("Update RX options?", onRxOptionsUpdateConfirm); - } - else { - return; - } - } - - if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.receiverSettings.dirty) { - killEvents(event); - reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_WRITE; - reusableBuffer.hardwareAndSettings.receiverSettings.dirty = 0; - reusableBuffer.hardwareAndSettings.receiverSettings.timeout = 0; - moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - } - - if (reusableBuffer.hardwareAndSettings.receiverSettings.dirty == 2 && reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { - popMenu(); - return; - } - - int8_t sub = menuVerticalPosition; - - lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); - drawReceiverName(FW * 13, 0, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId); - lcdInvertLine(0); - - if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { - for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); - - switch (i) { - case ITEM_RECEIVER_TELEMETRY: - reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled, RECEIVER_OPTIONS_2ND_COLUMN, y, "Telem. disabled", attr, event); - if (attr && checkIncDec_Ret) { - reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true; - } - break; - - case ITEM_RECEIVER_PWM_RATE: - reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, "9ms PWM", attr, event); - if (attr && checkIncDec_Ret) { - reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true; - } - break; - - default: - // Pin - { - uint8_t pin = i - ITEM_RECEIVER_PINMAP_FIRST; - uint8_t channel = reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin]; - int32_t channelValue = channelOutputs[channel]; - lcdDrawText(0, y, "Pin"); - lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); - putsChn(7 * FW, y, channel + 1, attr); - - // Channel - if (attr) { - channel = checkIncDec(event, channel, 0, sentModuleChannels(g_moduleIdx) - 1); - if (checkIncDec_Ret) { - reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin] = channel; - reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true; - } - } - - // Bargraph - #if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines - lcdDrawRect(LCD_W - 3 - wbar, y + 1, wbar + 1, 4); - #endif - const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); - const coord_t xChannel = (channelValue > 0) ? LCD_W - 3 - wbar / 2 : LCD_W - 2 - wbar / 2 - lenChannel; - lcdDrawHorizontalLine(xChannel, y + 2, lenChannel, SOLID, 0); - lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); - break; - } - } - } - } - else { - lcdDrawText(4 * FW, 4 * FH, "Waiting for RX..."); - } -} diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h index f8ed87b9c..c2338d94f 100644 --- a/radio/src/gui/212x64/menus.h +++ b/radio/src/gui/212x64/menus.h @@ -119,6 +119,8 @@ enum MenuModelIndexes { void menuModelSelect(event_t event); void menuModelSetup(event_t event); void menuModelFailsafe(event_t event); +void menuModelModuleOptions(event_t event); +void menuModelReceiverOptions(event_t event); void menuModelHeli(event_t event); void menuModelFlightModesAll(event_t event); void menuModelExpoOne(event_t event); diff --git a/radio/src/gui/CMakeLists.txt b/radio/src/gui/CMakeLists.txt index 6ec951c20..0dd24c589 100644 --- a/radio/src/gui/CMakeLists.txt +++ b/radio/src/gui/CMakeLists.txt @@ -9,6 +9,9 @@ set(GUI_SRC menu_model.cpp model_select.cpp model_setup.cpp + model_failsafe.cpp + model_module_options.cpp + model_receiver_options.cpp model_logical_switches.cpp model_special_functions.cpp model_telemetry.cpp From f7563bc42116bfa98b9e2300fa3dfc0837769da1 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Mar 2019 09:40:42 +0100 Subject: [PATCH 435/446] Module options --- radio/src/gui/128x64/gui.h | 10 ++-- radio/src/gui/128x64/model_module_options.cpp | 52 +++++++++++++++---- .../src/gui/128x64/model_receiver_options.cpp | 9 ++-- radio/src/gui/128x64/radio_version.cpp | 16 +++++- 4 files changed, 64 insertions(+), 23 deletions(-) diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 2a2d12834..f557fba48 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -171,10 +171,9 @@ void title(const char * s); #if defined(PCBX7) || defined(PCBX3) #define SIMPLE_MENU_NOTITLE(tab, menu, lines_count) \ check_simple(event, menu, tab, DIM(tab), lines_count); -#define SUBMENU_NOTITLE(lines_count, ...) { \ +#define SUBMENU_NOTITLE(lines_count, ...) \ MENU_TAB(__VA_ARGS__); \ - check(event, 0, NULL, 0, mstate_tab, DIM(mstate_tab)-1, lines_count); \ - } + check(event, 0, NULL, 0, mstate_tab, DIM(mstate_tab)-1, lines_count); #define SUBMENU(title, lines_count, ...) \ MENU_TAB(__VA_ARGS__); \ check(event, 0, NULL, 0, mstate_tab, DIM(mstate_tab)-1, lines_count); \ @@ -184,10 +183,9 @@ void title(const char * s); #else #define SIMPLE_MENU_NOTITLE(tab, menu, lines_count) \ check_simple(event, menu, tab, DIM(tab), (lines_count)-1); -#define SUBMENU_NOTITLE(lines_count, ...) { \ +#define SUBMENU_NOTITLE(lines_count, ...) \ MENU_TAB(__VA_ARGS__); \ - check(event, 0, NULL, 0, mstate_tab, DIM(mstate_tab)-1, (lines_count)-1); \ - } + check(event, 0, NULL, 0, mstate_tab, DIM(mstate_tab)-1, (lines_count)-1); #define SUBMENU(title, lines_count, ...) \ MENU_TAB(__VA_ARGS__); \ diff --git a/radio/src/gui/128x64/model_module_options.cpp b/radio/src/gui/128x64/model_module_options.cpp index 302e77d75..c6854a851 100644 --- a/radio/src/gui/128x64/model_module_options.cpp +++ b/radio/src/gui/128x64/model_module_options.cpp @@ -37,16 +37,42 @@ void onTxOptionsUpdateConfirm(const char * result) } } -enum MenuModelModuleOptionsItems { +enum { ITEM_MODULE_SETTINGS_RF_PROTOCOL, ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA, ITEM_MODULE_SETTINGS_POWER, ITEM_MODULE_SETTINGS_COUNT }; +extern uint8_t moduleOptions[]; + +#define IF_MODULE_OPTIONS(option, count) uint8_t((moduleOptions[modelId] & (1 << option)) ? count : HIDDEN_ROW) + void menuModelModuleOptions(event_t event) { - SIMPLE_SUBMENU_NOTITLE(ITEM_MODULE_SETTINGS_COUNT); + uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.modelID; + + SUBMENU_NOTITLE(ITEM_MODULE_SETTINGS_COUNT, { + IF_MODULE_OPTIONS(0, 0), + IF_MODULE_OPTIONS(1, 0), + IF_MODULE_OPTIONS(2, 0), + }); + + if (event == EVT_ENTRY) { +#if defined(SIMU) + reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_OK; +#else + // no need to initialize reusableBuffer.hardwareAndSettings.moduleSettings.state to PXX2_HARDWARE_INFO + reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].current = PXX2_HW_INFO_TX_ID; + reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].maximum = PXX2_HW_INFO_TX_ID; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_GET_HARDWARE_INFO; +#endif + } + + if (reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_HARDWARE_INFO && moduleSettings[g_moduleIdx].mode == MODULE_MODE_NORMAL) { + reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_READ; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_MODULE_SETTINGS; + } if (menuEvent) { moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; @@ -59,27 +85,31 @@ void menuModelModuleOptions(event_t event) } } + if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.moduleSettings.dirty) { + killEvents(event); + reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_WRITE; + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = 0; + reusableBuffer.hardwareAndSettings.moduleSettings.timeout = 0; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_MODULE_SETTINGS; + } + if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty == 2 && reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { popMenu(); } int8_t sub = menuVerticalPosition; - lcdDrawTextAlignedLeft(0, "Module options"); lcdInvertLine(0); - if (event == EVT_ENTRY) { -#if defined(SIMU) - reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_OK; -#else - moduleSettings[g_moduleIdx].mode = MODULE_MODE_MODULE_SETTINGS; -#endif - } - if (reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); switch (i) { diff --git a/radio/src/gui/128x64/model_receiver_options.cpp b/radio/src/gui/128x64/model_receiver_options.cpp index 59dcbe47a..24cddfe01 100644 --- a/radio/src/gui/128x64/model_receiver_options.cpp +++ b/radio/src/gui/128x64/model_receiver_options.cpp @@ -39,9 +39,9 @@ void onRxOptionsUpdateConfirm(const char * result) } enum { - ITEM_RECEIVER_TELEMETRY, - ITEM_RECEIVER_PWM_RATE, - ITEM_RECEIVER_PINMAP_FIRST + ITEM_RECEIVER_TELEMETRY, + ITEM_RECEIVER_PWM_RATE, + ITEM_RECEIVER_PINMAP_FIRST }; void menuModelReceiverOptions(event_t event) @@ -58,6 +58,8 @@ void menuModelReceiverOptions(event_t event) reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount = 8; #else // no need to initialize reusableBuffer.hardwareAndSettings.receiverSettings.state to PXX2_HARDWARE_INFO + reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].current = reusableBuffer.hardwareAndSettings.receiverSettings.receiverId; + reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].maximum = reusableBuffer.hardwareAndSettings.receiverSettings.receiverId; moduleSettings[g_moduleIdx].mode = MODULE_MODE_GET_HARDWARE_INFO; #endif } @@ -92,7 +94,6 @@ void menuModelReceiverOptions(event_t event) } int8_t sub = menuVerticalPosition; - lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); drawReceiverName(FW * 13, 0, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId); lcdInvertLine(0); diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 584a735de..2806c43ae 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -61,6 +61,18 @@ static const char * const modulesModels[] = { "R9MLite-PRO", }; +/* order: RF Protocol, External antenna, Power */ +uint8_t moduleOptions[] = { + 0b00000010, // None + 0b11111011, // XJT + 0b11111011, // IXJT + 0b11111011, // IXJT-PRO + 0b11111011, // IXJT-S + 0b11111100, // R9M + 0b11111100, // R9MLite + 0b11111100, // R9MLite-PRO +}; + static const char * const receiversModels[] = { "---", "X8R", @@ -105,15 +117,15 @@ void menuRadioModulesVersion(event_t event) memclear(&reusableBuffer.hardwareAndSettings.modules, sizeof(reusableBuffer.hardwareAndSettings.modules)); if (isModulePXX2(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) { - moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].current = PXX2_HW_INFO_TX_ID; reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].maximum = MAX_RECEIVERS_PER_MODULE - 1; + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; } if (isModulePXX2(EXTERNAL_MODULE) && IS_EXTERNAL_MODULE_ON()) { - moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].current = PXX2_HW_INFO_TX_ID; reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].maximum = MAX_RECEIVERS_PER_MODULE - 1; + moduleSettings[EXTERNAL_MODULE].mode = MODULE_MODE_GET_HARDWARE_INFO; } reusableBuffer.hardwareAndSettings.updateTime = get_tmr10ms() + 1000 /* 10s*/; From 36c4b528b289e9410a91a53b5048aa6aceb65eae Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Mar 2019 09:52:13 +0100 Subject: [PATCH 436/446] Module options continued --- radio/src/gui/128x64/model_module_options.cpp | 18 +++++++++++++++++- radio/src/gui/128x64/radio_version.cpp | 12 ------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/radio/src/gui/128x64/model_module_options.cpp b/radio/src/gui/128x64/model_module_options.cpp index c6854a851..802ccb7e1 100644 --- a/radio/src/gui/128x64/model_module_options.cpp +++ b/radio/src/gui/128x64/model_module_options.cpp @@ -44,7 +44,17 @@ enum { ITEM_MODULE_SETTINGS_COUNT }; -extern uint8_t moduleOptions[]; +/* order: RF Protocol, External antenna, Power */ +const uint8_t moduleOptions[] = { + 0b00000000, // None + 0b11111011, // XJT + 0b11111011, // IXJT + 0b11111011, // IXJT-PRO + 0b11111011, // IXJT-S + 0b11111100, // R9M + 0b11111100, // R9MLite + 0b11111100, // R9MLite-PRO +}; #define IF_MODULE_OPTIONS(option, count) uint8_t((moduleOptions[modelId] & (1 << option)) ? count : HIDDEN_ROW) @@ -97,6 +107,12 @@ void menuModelModuleOptions(event_t event) popMenu(); } + if (menuVerticalPosition == 0) { + while (mstate_tab[menuVerticalPosition] == HIDDEN_ROW) { + ++menuVerticalPosition; + } + } + int8_t sub = menuVerticalPosition; lcdDrawTextAlignedLeft(0, "Module options"); lcdInvertLine(0); diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 2806c43ae..9383f753b 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -61,18 +61,6 @@ static const char * const modulesModels[] = { "R9MLite-PRO", }; -/* order: RF Protocol, External antenna, Power */ -uint8_t moduleOptions[] = { - 0b00000010, // None - 0b11111011, // XJT - 0b11111011, // IXJT - 0b11111011, // IXJT-PRO - 0b11111011, // IXJT-S - 0b11111100, // R9M - 0b11111100, // R9MLite - 0b11111100, // R9MLite-PRO -}; - static const char * const receiversModels[] = { "---", "X8R", From 3242f16ff34c72ed71b8249d668fe944b759bac5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Mar 2019 09:53:36 +0100 Subject: [PATCH 437/446] Cosmetics --- radio/src/gui/128x64/model_module_options.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_module_options.cpp b/radio/src/gui/128x64/model_module_options.cpp index 802ccb7e1..327f5dd36 100644 --- a/radio/src/gui/128x64/model_module_options.cpp +++ b/radio/src/gui/128x64/model_module_options.cpp @@ -44,7 +44,11 @@ enum { ITEM_MODULE_SETTINGS_COUNT }; -/* order: RF Protocol, External antenna, Power */ +/* Options order: + * - RF Protocol + * - External antenna + * - Power + */ const uint8_t moduleOptions[] = { 0b00000000, // None 0b11111011, // XJT From 0da5c2117abca7bf23d4ba126fa4ecc67252becc Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Mar 2019 09:59:54 +0100 Subject: [PATCH 438/446] Cosmetics --- radio/src/gui/128x64/model_module_options.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/gui/128x64/model_module_options.cpp b/radio/src/gui/128x64/model_module_options.cpp index 327f5dd36..fc0bfebfa 100644 --- a/radio/src/gui/128x64/model_module_options.cpp +++ b/radio/src/gui/128x64/model_module_options.cpp @@ -65,6 +65,7 @@ const uint8_t moduleOptions[] = { void menuModelModuleOptions(event_t event) { uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.modelID; + uint8_t variant = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.variant; SUBMENU_NOTITLE(ITEM_MODULE_SETTINGS_COUNT, { IF_MODULE_OPTIONS(0, 0), From dce77f7c5b0b155b3fd78f6ef5d6555429537211 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Mar 2019 11:00:40 +0100 Subject: [PATCH 439/446] Cosmetics --- radio/src/gui/128x64/model_module_options.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/128x64/model_module_options.cpp b/radio/src/gui/128x64/model_module_options.cpp index fc0bfebfa..da28d556e 100644 --- a/radio/src/gui/128x64/model_module_options.cpp +++ b/radio/src/gui/128x64/model_module_options.cpp @@ -50,7 +50,7 @@ enum { * - Power */ const uint8_t moduleOptions[] = { - 0b00000000, // None + 0b11111111, // None = display all options 0b11111011, // XJT 0b11111011, // IXJT 0b11111011, // IXJT-PRO @@ -112,8 +112,9 @@ void menuModelModuleOptions(event_t event) popMenu(); } - if (menuVerticalPosition == 0) { - while (mstate_tab[menuVerticalPosition] == HIDDEN_ROW) { + if (modelId != 0 && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) { + menuVerticalPosition = 0; + while (menuVerticalPosition < ITEM_MODULE_SETTINGS_COUNT && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) { ++menuVerticalPosition; } } From f48d6548c5287eed1e267aae2368a67b9c2df27b Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 27 Mar 2019 11:35:54 +0100 Subject: [PATCH 440/446] dBm / mW converstion and display --- radio/src/gui/128x64/model_module_options.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_module_options.cpp b/radio/src/gui/128x64/model_module_options.cpp index da28d556e..ffc3b291a 100644 --- a/radio/src/gui/128x64/model_module_options.cpp +++ b/radio/src/gui/128x64/model_module_options.cpp @@ -20,7 +20,7 @@ #include -#define RECEIVER_OPTIONS_2ND_COLUMN 80 +#define RECEIVER_OPTIONS_2ND_COLUMN 60 extern uint8_t g_moduleIdx; @@ -62,6 +62,10 @@ const uint8_t moduleOptions[] = { #define IF_MODULE_OPTIONS(option, count) uint8_t((moduleOptions[modelId] & (1 << option)) ? count : HIDDEN_ROW) +int16_t convertDBMtoMW(int8_t dBm) { + return pow( 10.0, (dBm - 30.0) / 10.0) * 1000; +} + void menuModelModuleOptions(event_t event) { uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.modelID; @@ -156,7 +160,9 @@ void menuModelModuleOptions(event_t event) case ITEM_MODULE_SETTINGS_POWER: lcdDrawText(0, y, "Power"); lcdDrawNumber(RECEIVER_OPTIONS_2ND_COLUMN, y, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, attr); - lcdDrawText(lcdNextPos, y, "dBm"); + lcdDrawText(lcdNextPos, y, "dBm("); + lcdDrawNumber(lcdNextPos, y, convertDBMtoMW(reusableBuffer.hardwareAndSettings.moduleSettings.txPower), 0); + lcdDrawText(lcdNextPos, y, "mW)"); if (attr) { reusableBuffer.hardwareAndSettings.moduleSettings.txPower = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, -127, 127); if (checkIncDec_Ret) { From 649a99084e3856a3671b864611456a572abf68ad Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Mar 2019 12:53:26 +0100 Subject: [PATCH 441/446] Cosmetics --- radio/src/gui/128x64/model_module_options.cpp | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/128x64/model_module_options.cpp b/radio/src/gui/128x64/model_module_options.cpp index ffc3b291a..78abfa28e 100644 --- a/radio/src/gui/128x64/model_module_options.cpp +++ b/radio/src/gui/128x64/model_module_options.cpp @@ -20,7 +20,7 @@ #include -#define RECEIVER_OPTIONS_2ND_COLUMN 60 +#define RECEIVER_OPTIONS_2ND_COLUMN (11*FW) extern uint8_t g_moduleIdx; @@ -62,8 +62,30 @@ const uint8_t moduleOptions[] = { #define IF_MODULE_OPTIONS(option, count) uint8_t((moduleOptions[modelId] & (1 << option)) ? count : HIDDEN_ROW) -int16_t convertDBMtoMW(int8_t dBm) { - return pow( 10.0, (dBm - 30.0) / 10.0) * 1000; +void drawPower(coord_t x, coord_t y, int8_t dBm) +{ + float power_W_PREC1 = pow(10.0, (dBm - 30.0) / 10.0) * 10; + if (dBm >= 30) { + lcdDrawNumber(x, y, power_W_PREC1, PREC1); + lcdDrawText(lcdNextPos, y, "W"); + } + else if (dBm < 10) { + uint16_t power_MW_PREC1 = round(power_W_PREC1 * 1000); + lcdDrawNumber(x, y, power_MW_PREC1, PREC1); + lcdDrawText(lcdNextPos, y, "mW"); + } + else { + uint16_t power_MW = round(power_W_PREC1 * 100); + if (power_MW >= 50) { + power_MW = (power_MW / 5) * 5; + lcdDrawNumber(x, y, power_MW); + lcdDrawText(lcdNextPos, y, "mW"); + } + else { + lcdDrawNumber(x, y, power_MW); + lcdDrawText(lcdNextPos, y, "mW"); + } + } } void menuModelModuleOptions(event_t event) @@ -161,8 +183,8 @@ void menuModelModuleOptions(event_t event) lcdDrawText(0, y, "Power"); lcdDrawNumber(RECEIVER_OPTIONS_2ND_COLUMN, y, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, attr); lcdDrawText(lcdNextPos, y, "dBm("); - lcdDrawNumber(lcdNextPos, y, convertDBMtoMW(reusableBuffer.hardwareAndSettings.moduleSettings.txPower), 0); - lcdDrawText(lcdNextPos, y, "mW)"); + drawPower(lcdNextPos, y, reusableBuffer.hardwareAndSettings.moduleSettings.txPower); + lcdDrawText(lcdNextPos, y, ")"); if (attr) { reusableBuffer.hardwareAndSettings.moduleSettings.txPower = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, -127, 127); if (checkIncDec_Ret) { From ea508d8a269b3c2f31afe5438177131de848a30c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Mar 2019 13:21:54 +0100 Subject: [PATCH 442/446] Compilation fix --- radio/src/gui/128x64/model_module_options.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/gui/128x64/model_module_options.cpp b/radio/src/gui/128x64/model_module_options.cpp index 78abfa28e..10e6e4a1d 100644 --- a/radio/src/gui/128x64/model_module_options.cpp +++ b/radio/src/gui/128x64/model_module_options.cpp @@ -19,6 +19,7 @@ */ #include +#include #define RECEIVER_OPTIONS_2ND_COLUMN (11*FW) From ae35afd5c61b0430170b2790a270b6c7f71cedc8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Mar 2019 13:38:24 +0100 Subject: [PATCH 443/446] Reduce power range --- radio/src/gui/128x64/model_module_options.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_module_options.cpp b/radio/src/gui/128x64/model_module_options.cpp index 10e6e4a1d..3c95fed8b 100644 --- a/radio/src/gui/128x64/model_module_options.cpp +++ b/radio/src/gui/128x64/model_module_options.cpp @@ -187,7 +187,7 @@ void menuModelModuleOptions(event_t event) drawPower(lcdNextPos, y, reusableBuffer.hardwareAndSettings.moduleSettings.txPower); lcdDrawText(lcdNextPos, y, ")"); if (attr) { - reusableBuffer.hardwareAndSettings.moduleSettings.txPower = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, -127, 127); + reusableBuffer.hardwareAndSettings.moduleSettings.txPower = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, 0, 30); if (checkIncDec_Ret) { reusableBuffer.hardwareAndSettings.moduleSettings.dirty = true; } From db6252ee79db37b9807ff4c5f58f4d7c2e4fe703 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Mar 2019 13:44:40 +0100 Subject: [PATCH 444/446] isPowerAvailable prototype --- radio/src/gui/128x64/model_module_options.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_module_options.cpp b/radio/src/gui/128x64/model_module_options.cpp index 3c95fed8b..4efaf71cc 100644 --- a/radio/src/gui/128x64/model_module_options.cpp +++ b/radio/src/gui/128x64/model_module_options.cpp @@ -89,11 +89,24 @@ void drawPower(coord_t x, coord_t y, int8_t dBm) } } -void menuModelModuleOptions(event_t event) +bool isPowerAvailable(int value) { uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.modelID; uint8_t variant = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.variant; + return (value == 10 /* 10 mW */ || + value == 14 /* 25 mW */ || + value == 20 /* 100 mW */ || + value == 23 /* 200 mW */ || + value == 27 /* 500 mW */ || + value == 30 /* 1000 mW */); +} + +void menuModelModuleOptions(event_t event) +{ + uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.modelID; + // uint8_t variant = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.variant; + SUBMENU_NOTITLE(ITEM_MODULE_SETTINGS_COUNT, { IF_MODULE_OPTIONS(0, 0), IF_MODULE_OPTIONS(1, 0), @@ -187,7 +200,7 @@ void menuModelModuleOptions(event_t event) drawPower(lcdNextPos, y, reusableBuffer.hardwareAndSettings.moduleSettings.txPower); lcdDrawText(lcdNextPos, y, ")"); if (attr) { - reusableBuffer.hardwareAndSettings.moduleSettings.txPower = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, 0, 30); + reusableBuffer.hardwareAndSettings.moduleSettings.txPower = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, 0, 30, 0, &isPowerAvailable); if (checkIncDec_Ret) { reusableBuffer.hardwareAndSettings.moduleSettings.dirty = true; } From 0045613efa1df778e9ce538d1fffb9a4a443dbd8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Mar 2019 14:40:32 +0100 Subject: [PATCH 445/446] Compilation fix --- radio/src/gui/128x64/model_module_options.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_module_options.cpp b/radio/src/gui/128x64/model_module_options.cpp index 4efaf71cc..cc2dec0af 100644 --- a/radio/src/gui/128x64/model_module_options.cpp +++ b/radio/src/gui/128x64/model_module_options.cpp @@ -91,8 +91,8 @@ void drawPower(coord_t x, coord_t y, int8_t dBm) bool isPowerAvailable(int value) { - uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.modelID; - uint8_t variant = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.variant; +// uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.modelID; +// uint8_t variant = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.variant; return (value == 10 /* 10 mW */ || value == 14 /* 25 mW */ || From 428c986c915345ad7056d90e17851af9d58927ec Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 Mar 2019 14:46:31 +0100 Subject: [PATCH 446/446] Compilation fixes --- radio/src/gui/128x64/model_failsafe.cpp | 2 +- radio/src/gui/212x64/model_failsafe.cpp | 177 ++++++++++++++++++ radio/src/gui/212x64/model_module_options.cpp | 21 +++ .../src/gui/212x64/model_receiver_options.cpp | 21 +++ radio/src/gui/212x64/model_setup.cpp | 154 --------------- radio/src/gui/480x272/model_failsafe.cpp | 138 ++++++++++++++ .../src/gui/480x272/model_module_options.cpp | 21 +++ .../gui/480x272/model_receiver_options.cpp | 21 +++ radio/src/gui/480x272/model_setup.cpp | 115 ------------ 9 files changed, 400 insertions(+), 270 deletions(-) create mode 100644 radio/src/gui/212x64/model_failsafe.cpp create mode 100644 radio/src/gui/212x64/model_module_options.cpp create mode 100644 radio/src/gui/212x64/model_receiver_options.cpp create mode 100644 radio/src/gui/480x272/model_failsafe.cpp create mode 100644 radio/src/gui/480x272/model_module_options.cpp create mode 100644 radio/src/gui/480x272/model_receiver_options.cpp diff --git a/radio/src/gui/128x64/model_failsafe.cpp b/radio/src/gui/128x64/model_failsafe.cpp index 905b293f7..2896e8c95 100644 --- a/radio/src/gui/128x64/model_failsafe.cpp +++ b/radio/src/gui/128x64/model_failsafe.cpp @@ -93,7 +93,7 @@ void menuModelFailsafe(event_t event) } } - uint8_t xValue = x+LCD_W-4-wbar; + const coord_t xValue = x+LCD_W-4-wbar; if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { lcdDrawText(xValue, y, STR_HOLD, RIGHT|flags); failsafeValue = 0; diff --git a/radio/src/gui/212x64/model_failsafe.cpp b/radio/src/gui/212x64/model_failsafe.cpp new file mode 100644 index 000000000..059e25736 --- /dev/null +++ b/radio/src/gui/212x64/model_failsafe.cpp @@ -0,0 +1,177 @@ +/* + * 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 + +extern uint8_t g_moduleIdx; + +void menuModelFailsafe(event_t event) +{ + static uint8_t maxNameLen = 4; + static int8_t lastModel = g_eeGeneral.currModel; + const coord_t barH = (LCD_H - FH) / 8 - 1; + const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; + const uint8_t channelStart = g_model.moduleData[g_moduleIdx].channelsStart; + uint8_t cols = 1; + uint8_t colW = LCD_W; + + if (lastModel != g_eeGeneral.currModel) { + lastModel = g_eeGeneral.currModel; + maxNameLen = 4; + } + + if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + event = 0; + + if (menuVerticalPosition < sentModuleChannels(g_moduleIdx)) { + if (s_editMode) { + g_model.failsafeChannels[menuVerticalPosition] = channelOutputs[menuVerticalPosition+channelStart]; + s_editMode = 0; + } + else { + int16_t & failsafe = g_model.failsafeChannels[menuVerticalPosition]; + if (failsafe < FAILSAFE_CHANNEL_HOLD) + failsafe = FAILSAFE_CHANNEL_HOLD; + else if (failsafe == FAILSAFE_CHANNEL_HOLD) + failsafe = FAILSAFE_CHANNEL_NOPULSE; + else + failsafe = 0; + } + } + else { + // "Outputs => Failsafe" menu item + setCustomFailsafe(g_moduleIdx); + } + + storageDirty(EE_MODEL); + AUDIO_WARNING1(); + SEND_FAILSAFE_NOW(g_moduleIdx); + } + + SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx) + 1); + SET_SCROLLBAR_X(0); + + if (sentModuleChannels(g_moduleIdx) > 8) { + cols = 2; + colW = LCD_W / cols - 1; + // Column separator + if (menuVerticalPosition >= sentModuleChannels(g_moduleIdx)) { + lcdDrawSolidVerticalLine(colW, FH, LCD_H - (FH*2 + FH/2 + 2)); + } + else { + lcdDrawSolidVerticalLine(colW, FH, LCD_H - FH); + } + } + + lcdDrawTextAlignedCenter(0, FAILSAFESET); + lcdInvertLine(0); + + coord_t x = colW; + for (uint8_t col = 0; col < cols; col++) { + + coord_t y = FH + 1; + uint8_t line = (menuVerticalPosition >= sentModuleChannels(g_moduleIdx) ? 2 : 0); + uint8_t ch = line + col*8; + + for (; line < 8; line++) { + const int32_t channelValue = channelOutputs[ch+channelStart]; + int32_t failsafeValue = g_model.failsafeChannels[8*col+line]; + uint8_t lenLabel = ZLEN(g_model.limitData[ch+channelStart].name); + uint8_t barW = colW - FW * maxNameLen - FWNUM * 3; // default bar width + +#if defined(PPM_UNIT_PERCENT_PREC1) + barW -= FWNUM + 1; +#endif + barW += (barW % 2); + + // Channel name if present, number if not + if (lenLabel > 0) { + if (lenLabel > maxNameLen) + maxNameLen = lenLabel; + lcdDrawSizedText(x - colW, y, g_model.limitData[ch+channelStart].name, sizeof(g_model.limitData[ch+channelStart].name), ZCHAR | SMLSIZE); + } + else { + putsChn(x - colW, y, ch+1, SMLSIZE); + } + + // Value + LcdFlags flags = TINSIZE; + if (menuVerticalPosition == ch) { + flags |= INVERS; + if (s_editMode) { + if (failsafeValue == FAILSAFE_CHANNEL_HOLD || failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + s_editMode = 0; + } + else { + flags |= BLINK; + CHECK_INCDEC_MODELVAR(event, g_model.failsafeChannels[8*col+line], -lim, +lim); + } + } + } + + const coord_t xValue = x - barW; + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { + lcdDrawText(xValue, y, STR_HOLD, RIGHT|flags); + failsafeValue = 0; + } + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + lcdDrawText(xValue, y, STR_NONE, RIGHT|flags); + failsafeValue = 0; + } + else { +#if defined(PPM_UNIT_US) + lcdDrawNumber(xValue, y, PPM_CH_CENTER(ch)+failsafeValue/2, RIGHT|flags); +#elif defined(PPM_UNIT_PERCENT_PREC1) + lcdDrawNumber(xValue, y, calcRESXto1000(failsafeValue), RIGHT|PREC1|flags); +#else + lcdDrawNumber(xValue, y, calcRESXto1000(failsafeValue)/10, RIGHT|flags); +#endif + } + + // Gauge + lcdDrawRect(x - barW, y, barW - 1, barH); + barW = barW / 2 - 1; + const coord_t lenChannel = limit(1, (abs(channelValue) * barW + lim / 2) / lim, barW); + const coord_t lenFailsafe = limit(1, (abs(failsafeValue) * barW + lim / 2) / lim, barW); + const coord_t barX = x - barW - 2; + const coord_t xChannel = (channelValue >= 0) ? barX : barX - lenChannel + 1; + const coord_t xFailsafe = (failsafeValue > 0) ? barX : barX - lenFailsafe + 1; + lcdDrawHorizontalLine(xChannel, y+1, lenChannel, DOTTED, 0); + lcdDrawHorizontalLine(xChannel, y+2, lenChannel, DOTTED, 0); + lcdDrawSolidHorizontalLine(xFailsafe, y+3, lenFailsafe); + lcdDrawSolidHorizontalLine(xFailsafe, y+4, lenFailsafe); + + if (++ch >= sentModuleChannels(g_moduleIdx)) + break; + + y += barH + 1; + + } // channels + + x += colW + 2; + + } // columns + + if (menuVerticalPosition >= sentModuleChannels(g_moduleIdx)) { + // Outputs => Failsafe + lcdDrawText(CENTER_OFS, LCD_H - (FH + 1), STR_OUTPUTS2FAILSAFE, INVERS); + } +} diff --git a/radio/src/gui/212x64/model_module_options.cpp b/radio/src/gui/212x64/model_module_options.cpp new file mode 100644 index 000000000..f72d3594f --- /dev/null +++ b/radio/src/gui/212x64/model_module_options.cpp @@ -0,0 +1,21 @@ +/* + * 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 diff --git a/radio/src/gui/212x64/model_receiver_options.cpp b/radio/src/gui/212x64/model_receiver_options.cpp new file mode 100644 index 000000000..f72d3594f --- /dev/null +++ b/radio/src/gui/212x64/model_receiver_options.cpp @@ -0,0 +1,21 @@ +/* + * 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 diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index ef98e47a2..02626db28 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1258,157 +1258,3 @@ void menuModelSetup(event_t event) } } } - -void menuModelFailsafe(event_t event) -{ - static uint8_t maxNameLen = 4; - static int8_t lastModel = g_eeGeneral.currModel; - const coord_t barH = (LCD_H - FH) / 8 - 1; - const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; - const uint8_t channelStart = g_model.moduleData[g_moduleIdx].channelsStart; - uint8_t cols = 1; - uint8_t colW = LCD_W; - - if (lastModel != g_eeGeneral.currModel) { - lastModel = g_eeGeneral.currModel; - maxNameLen = 4; - } - - if (event == EVT_KEY_LONG(KEY_ENTER)) { - killEvents(event); - event = 0; - - if (menuVerticalPosition < sentModuleChannels(g_moduleIdx)) { - if (s_editMode) { - g_model.failsafeChannels[menuVerticalPosition] = channelOutputs[menuVerticalPosition+channelStart]; - s_editMode = 0; - } - else { - int16_t & failsafe = g_model.failsafeChannels[menuVerticalPosition]; - if (failsafe < FAILSAFE_CHANNEL_HOLD) - failsafe = FAILSAFE_CHANNEL_HOLD; - else if (failsafe == FAILSAFE_CHANNEL_HOLD) - failsafe = FAILSAFE_CHANNEL_NOPULSE; - else - failsafe = 0; - } - } - else { - // "Outputs => Failsafe" menu item - setCustomFailsafe(g_moduleIdx); - } - - storageDirty(EE_MODEL); - AUDIO_WARNING1(); - SEND_FAILSAFE_NOW(g_moduleIdx); - } - - SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx)+1); - SET_SCROLLBAR_X(0); - - if (sentModuleChannels(g_moduleIdx) > 8) { - cols = 2; - colW = LCD_W / cols - 1; - // Column separator - if (menuVerticalPosition >= sentModuleChannels(g_moduleIdx)) { - lcdDrawSolidVerticalLine(colW, FH, LCD_H - (FH*2 + FH/2 + 2)); - } - else { - lcdDrawSolidVerticalLine(colW, FH, LCD_H - FH); - } - } - - lcdDrawTextAlignedCenter(0, FAILSAFESET); - lcdInvertLine(0); - - coord_t x = colW; - for (uint8_t col = 0; col < cols; col++) { - - coord_t y = FH + 1; - uint8_t line = (menuVerticalPosition >= sentModuleChannels(g_moduleIdx) ? 2 : 0); - uint8_t ch = line + col*8; - - for (; line < 8; line++) { - const int32_t channelValue = channelOutputs[ch+channelStart]; - int32_t failsafeValue = g_model.failsafeChannels[8*col+line]; - uint8_t lenLabel = ZLEN(g_model.limitData[ch+channelStart].name); - uint8_t barW = colW - FW * maxNameLen - FWNUM * 3; // default bar width - -#if defined(PPM_UNIT_PERCENT_PREC1) - barW -= FWNUM + 1; -#endif - barW += (barW % 2); - - // Channel name if present, number if not - if (lenLabel > 0) { - if (lenLabel > maxNameLen) - maxNameLen = lenLabel; - lcdDrawSizedText(x - colW, y, g_model.limitData[ch+channelStart].name, sizeof(g_model.limitData[ch+channelStart].name), ZCHAR | SMLSIZE); - } - else { - putsChn(x - colW, y, ch+1, SMLSIZE); - } - - // Value - LcdFlags flags = TINSIZE; - if (menuVerticalPosition == ch) { - flags |= INVERS; - if (s_editMode) { - if (failsafeValue == FAILSAFE_CHANNEL_HOLD || failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - s_editMode = 0; - } - else { - flags |= BLINK; - CHECK_INCDEC_MODELVAR(event, g_model.failsafeChannels[8*col+line], -lim, +lim); - } - } - } - - const coord_t xValue = x - barW; - if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { - lcdDrawText(xValue, y, STR_HOLD, RIGHT|flags); - failsafeValue = 0; - } - else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - lcdDrawText(xValue, y, STR_NONE, RIGHT|flags); - failsafeValue = 0; - } - else { -#if defined(PPM_UNIT_US) - lcdDrawNumber(xValue, y, PPM_CH_CENTER(ch)+failsafeValue/2, RIGHT|flags); -#elif defined(PPM_UNIT_PERCENT_PREC1) - lcdDrawNumber(xValue, y, calcRESXto1000(failsafeValue), RIGHT|PREC1|flags); -#else - lcdDrawNumber(xValue, y, calcRESXto1000(failsafeValue)/10, RIGHT|flags); -#endif - } - - // Gauge - lcdDrawRect(x - barW, y, barW - 1, barH); - barW = barW / 2 - 1; - const coord_t lenChannel = limit(1, (abs(channelValue) * barW + lim / 2) / lim, barW); - const coord_t lenFailsafe = limit(1, (abs(failsafeValue) * barW + lim / 2) / lim, barW); - const coord_t barX = x - barW - 2; - const coord_t xChannel = (channelValue >= 0) ? barX : barX - lenChannel + 1; - const coord_t xFailsafe = (failsafeValue > 0) ? barX : barX - lenFailsafe + 1; - lcdDrawHorizontalLine(xChannel, y+1, lenChannel, DOTTED, 0); - lcdDrawHorizontalLine(xChannel, y+2, lenChannel, DOTTED, 0); - lcdDrawSolidHorizontalLine(xFailsafe, y+3, lenFailsafe); - lcdDrawSolidHorizontalLine(xFailsafe, y+4, lenFailsafe); - - if (++ch >= sentModuleChannels(g_moduleIdx)) - break; - - y += barH + 1; - - } // channels - - x += colW + 2; - - } // columns - - if (menuVerticalPosition >= sentModuleChannels(g_moduleIdx)) { - // Outputs => Failsafe - lcdDrawText(CENTER_OFS, LCD_H - (FH + 1), STR_OUTPUTS2FAILSAFE, INVERS); - } -} diff --git a/radio/src/gui/480x272/model_failsafe.cpp b/radio/src/gui/480x272/model_failsafe.cpp new file mode 100644 index 000000000..bcc04d7a5 --- /dev/null +++ b/radio/src/gui/480x272/model_failsafe.cpp @@ -0,0 +1,138 @@ +/* + * 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 + +extern uint8_t g_moduleIdx; + +bool menuModelFailsafe(event_t event) +{ + uint8_t ch = 0; + const uint8_t channelStart = g_model.moduleData[g_moduleIdx].channelsStart; + const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; + const uint8_t SLIDER_W = 128; + const uint8_t cols = sentModuleChannels(g_moduleIdx) > 8 ? 2 : 1; + + if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + event = 0; + + if (menuVerticalPosition < sentModuleChannels(g_moduleIdx)) { + if (s_editMode) { + g_model.failsafeChannels[menuVerticalPosition] = channelOutputs[menuVerticalPosition+channelStart]; + s_editMode = 0; + } + else { + int16_t & failsafe = g_model.failsafeChannels[menuVerticalPosition]; + if (failsafe < FAILSAFE_CHANNEL_HOLD) + failsafe = FAILSAFE_CHANNEL_HOLD; + else if (failsafe == FAILSAFE_CHANNEL_HOLD) + failsafe = FAILSAFE_CHANNEL_NOPULSE; + else + failsafe = 0; + } + } + else { + // "Outputs => Failsafe" menu item + setCustomFailsafe(g_moduleIdx); + } + + storageDirty(EE_MODEL); + AUDIO_WARNING1(); + SEND_FAILSAFE_NOW(g_moduleIdx); + } + + SIMPLE_SUBMENU_WITH_OPTIONS("FAILSAFE", ICON_STATS_ANALOGS, sentModuleChannels(g_moduleIdx)+1, OPTION_MENU_NO_SCROLLBAR); + drawStringWithIndex(50, 3+FH, "Module", g_moduleIdx+1, MENU_TITLE_COLOR); + + for (uint8_t col=0; col < cols; col++) { + for (uint8_t line=0; line < 8; line++) { + coord_t x = col*(LCD_W/2); + const coord_t y = MENU_CONTENT_TOP - FH + line*(FH+2); + const int32_t channelValue = channelOutputs[ch+channelStart]; + int32_t failsafeValue = g_model.failsafeChannels[8*col+line]; + + // Channel name if present, number if not + if (g_model.limitData[ch+channelStart].name[0] != '\0') { + putsChn(x+MENUS_MARGIN_LEFT, y-3, ch+1, TINSIZE); + lcdDrawSizedText(x+MENUS_MARGIN_LEFT, y+5, g_model.limitData[ch+channelStart].name, sizeof(g_model.limitData[ch+channelStart].name), ZCHAR|SMLSIZE); + } + else { + putsChn(x+MENUS_MARGIN_LEFT, y, ch+1, 0); + } + + // Value + LcdFlags flags = RIGHT; + if (menuVerticalPosition == ch) { + flags |= INVERS; + if (s_editMode) { + if (failsafeValue == FAILSAFE_CHANNEL_HOLD || failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + s_editMode = 0; + } + else { + flags |= BLINK; + CHECK_INCDEC_MODELVAR(event, g_model.failsafeChannels[8*col+line], -lim, +lim); + } + } + } + + x += (LCD_W/2)-4-MENUS_MARGIN_LEFT-SLIDER_W; + + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { + lcdDrawText(x, y+2, "HOLD", flags|SMLSIZE); + failsafeValue = 0; + } + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + lcdDrawText(x, y+2, "NONE", flags|SMLSIZE); + failsafeValue = 0; + } + else { +#if defined(PPM_UNIT_US) + lcdDrawNumber(x, y, PPM_CH_CENTER(ch)+failsafeValue/2, flags); +#elif defined(PPM_UNIT_PERCENT_PREC1) + lcdDrawNumber(x, y, calcRESXto1000(failsafeValue), PREC1|flags); +#else + lcdDrawNumber(x, y, calcRESXto1000(failsafeValue)/10, flags); +#endif + } + + // Gauge + x += 4; + lcdDrawRect(x, y+3, SLIDER_W+1, 12); + const coord_t lenChannel = limit((uint8_t)1, uint8_t((abs(channelValue) * SLIDER_W/2 + lim/2) / lim), uint8_t(SLIDER_W/2)); + const coord_t lenFailsafe = limit((uint8_t)1, uint8_t((abs(failsafeValue) * SLIDER_W/2 + lim/2) / lim), uint8_t(SLIDER_W/2)); + x += SLIDER_W/2; + const coord_t xChannel = (channelValue>0) ? x : x+1-lenChannel; + const coord_t xFailsafe = (failsafeValue>0) ? x : x+1-lenFailsafe; + lcdDrawSolidFilledRect(xChannel, y+4, lenChannel, 5, TEXT_COLOR); + lcdDrawSolidFilledRect(xFailsafe, y+9, lenFailsafe, 5, ALARM_COLOR); + + if (++ch >= sentModuleChannels(g_moduleIdx)) { + + // draw that menu at the bottom center + flags = CENTERED | (menuVerticalPosition == ch ? INVERS : 0); + lcdDrawSizedText(LCD_W/2, MENU_CONTENT_TOP - FH + 8*(FH+2), STR_OUTPUTS2FAILSAFE, 20, flags); + break; + } + } + } + + return true; +} diff --git a/radio/src/gui/480x272/model_module_options.cpp b/radio/src/gui/480x272/model_module_options.cpp new file mode 100644 index 000000000..f72d3594f --- /dev/null +++ b/radio/src/gui/480x272/model_module_options.cpp @@ -0,0 +1,21 @@ +/* + * 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 diff --git a/radio/src/gui/480x272/model_receiver_options.cpp b/radio/src/gui/480x272/model_receiver_options.cpp new file mode 100644 index 000000000..f72d3594f --- /dev/null +++ b/radio/src/gui/480x272/model_receiver_options.cpp @@ -0,0 +1,21 @@ +/* + * 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 diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 5ac81e2e8..1311235ea 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1200,118 +1200,3 @@ bool menuModelSetup(event_t event) return true; } - -bool menuModelFailsafe(event_t event) -{ - uint8_t ch = 0; - const uint8_t channelStart = g_model.moduleData[g_moduleIdx].channelsStart; - const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; - const uint8_t SLIDER_W = 128; - const uint8_t cols = sentModuleChannels(g_moduleIdx) > 8 ? 2 : 1; - - if (event == EVT_KEY_LONG(KEY_ENTER)) { - killEvents(event); - event = 0; - - if (menuVerticalPosition < sentModuleChannels(g_moduleIdx)) { - if (s_editMode) { - g_model.failsafeChannels[menuVerticalPosition] = channelOutputs[menuVerticalPosition+channelStart]; - s_editMode = 0; - } - else { - int16_t & failsafe = g_model.failsafeChannels[menuVerticalPosition]; - if (failsafe < FAILSAFE_CHANNEL_HOLD) - failsafe = FAILSAFE_CHANNEL_HOLD; - else if (failsafe == FAILSAFE_CHANNEL_HOLD) - failsafe = FAILSAFE_CHANNEL_NOPULSE; - else - failsafe = 0; - } - } - else { - // "Outputs => Failsafe" menu item - setCustomFailsafe(g_moduleIdx); - } - - storageDirty(EE_MODEL); - AUDIO_WARNING1(); - SEND_FAILSAFE_NOW(g_moduleIdx); - } - - SIMPLE_SUBMENU_WITH_OPTIONS("FAILSAFE", ICON_STATS_ANALOGS, sentModuleChannels(g_moduleIdx)+1, OPTION_MENU_NO_SCROLLBAR); - drawStringWithIndex(50, 3+FH, "Module", g_moduleIdx+1, MENU_TITLE_COLOR); - - for (uint8_t col=0; col < cols; col++) { - for (uint8_t line=0; line < 8; line++) { - coord_t x = col*(LCD_W/2); - const coord_t y = MENU_CONTENT_TOP - FH + line*(FH+2); - const int32_t channelValue = channelOutputs[ch+channelStart]; - int32_t failsafeValue = g_model.failsafeChannels[8*col+line]; - - // Channel name if present, number if not - if (g_model.limitData[ch+channelStart].name[0] != '\0') { - putsChn(x+MENUS_MARGIN_LEFT, y-3, ch+1, TINSIZE); - lcdDrawSizedText(x+MENUS_MARGIN_LEFT, y+5, g_model.limitData[ch+channelStart].name, sizeof(g_model.limitData[ch+channelStart].name), ZCHAR|SMLSIZE); - } - else { - putsChn(x+MENUS_MARGIN_LEFT, y, ch+1, 0); - } - - // Value - LcdFlags flags = RIGHT; - if (menuVerticalPosition == ch) { - flags |= INVERS; - if (s_editMode) { - if (failsafeValue == FAILSAFE_CHANNEL_HOLD || failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - s_editMode = 0; - } - else { - flags |= BLINK; - CHECK_INCDEC_MODELVAR(event, g_model.failsafeChannels[8*col+line], -lim, +lim); - } - } - } - - x += (LCD_W/2)-4-MENUS_MARGIN_LEFT-SLIDER_W; - - if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { - lcdDrawText(x, y+2, "HOLD", flags|SMLSIZE); - failsafeValue = 0; - } - else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - lcdDrawText(x, y+2, "NONE", flags|SMLSIZE); - failsafeValue = 0; - } - else { -#if defined(PPM_UNIT_US) - lcdDrawNumber(x, y, PPM_CH_CENTER(ch)+failsafeValue/2, flags); -#elif defined(PPM_UNIT_PERCENT_PREC1) - lcdDrawNumber(x, y, calcRESXto1000(failsafeValue), PREC1|flags); -#else - lcdDrawNumber(x, y, calcRESXto1000(failsafeValue)/10, flags); -#endif - } - - // Gauge - x += 4; - lcdDrawRect(x, y+3, SLIDER_W+1, 12); - const coord_t lenChannel = limit((uint8_t)1, uint8_t((abs(channelValue) * SLIDER_W/2 + lim/2) / lim), uint8_t(SLIDER_W/2)); - const coord_t lenFailsafe = limit((uint8_t)1, uint8_t((abs(failsafeValue) * SLIDER_W/2 + lim/2) / lim), uint8_t(SLIDER_W/2)); - x += SLIDER_W/2; - const coord_t xChannel = (channelValue>0) ? x : x+1-lenChannel; - const coord_t xFailsafe = (failsafeValue>0) ? x : x+1-lenFailsafe; - lcdDrawSolidFilledRect(xChannel, y+4, lenChannel, 5, TEXT_COLOR); - lcdDrawSolidFilledRect(xFailsafe, y+9, lenFailsafe, 5, ALARM_COLOR); - - if (++ch >= sentModuleChannels(g_moduleIdx)) { - - // draw that menu at the bottom center - flags = CENTERED | (menuVerticalPosition == ch ? INVERS : 0); - lcdDrawSizedText(LCD_W/2, MENU_CONTENT_TOP - FH + 8*(FH+2), STR_OUTPUTS2FAILSAFE, 20, flags); - break; - } - } - } - - return true; -}