From b4d85045779b4e8cb6c0461690ad7d9702d98b14 Mon Sep 17 00:00:00 2001 From: WismyYao Date: Tue, 22 Sep 2020 23:44:54 +0800 Subject: [PATCH] Wismy/fport2 (#7956) Add Fport2 option RX6R/RX4R/G-RX8/G-RX6/RXSR OTA support --- radio/src/gui/480x272/model_receiver_options.cpp | 10 ++++++++++ .../src/gui/common/stdlcd/model_receiver_options.cpp | 9 +++++++++ radio/src/pulses/pulses.h | 1 + radio/src/pulses/pxx2.cpp | 2 ++ radio/src/pulses/pxx2.h | 12 +++++++----- radio/src/telemetry/frsky_pxx2.cpp | 3 +++ 6 files changed, 32 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/480x272/model_receiver_options.cpp b/radio/src/gui/480x272/model_receiver_options.cpp index 90db6f7e3..38e46728c 100644 --- a/radio/src/gui/480x272/model_receiver_options.cpp +++ b/radio/src/gui/480x272/model_receiver_options.cpp @@ -48,6 +48,7 @@ enum { ITEM_RECEIVER_SETTINGS_TELEMETRY, ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW, ITEM_RECEIVER_SETTINGS_SPORT_FPORT, + ITEM_RECEIVER_SETTINGS_FPORT2, ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1, ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2, ITEM_RECEIVER_SETTINGS_PINMAP_FIRST @@ -82,6 +83,7 @@ bool menuModelReceiverOptions(event_t event) isModuleR9MAccess(g_moduleIdx) && receiverVariant == PXX2_VARIANT_EU && reusableBuffer.hardwareAndSettings.moduleSettings.txPower > 14 /*25mW*/ ? READONLY_ROW : (uint8_t)0, // Telemetry IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_TELEMETRY_25MW, 0), IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT, 0), + IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT2, 0), uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), 0 // channels ... @@ -177,6 +179,14 @@ bool menuModelReceiverOptions(event_t event) } break; + case ITEM_RECEIVER_SETTINGS_FPORT2: + lcdDrawText(MENUS_MARGIN_LEFT, y, "F.Port2"); + reusableBuffer.hardwareAndSettings.receiverSettings.fport2 = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.fport2, RECEIVER_OPTIONS_2ND_COLUMN, y, attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; + } + break; + case ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1: lcdDrawText(LCD_W/2, y+1, STR_MORE_OPTIONS_AVAILABLE, SMLSIZE|CENTERED); break; diff --git a/radio/src/gui/common/stdlcd/model_receiver_options.cpp b/radio/src/gui/common/stdlcd/model_receiver_options.cpp index 6ce66ee29..de3547b75 100644 --- a/radio/src/gui/common/stdlcd/model_receiver_options.cpp +++ b/radio/src/gui/common/stdlcd/model_receiver_options.cpp @@ -48,6 +48,7 @@ enum { ITEM_RECEIVER_SETTINGS_TELEMETRY, ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW, ITEM_RECEIVER_SETTINGS_SPORT_FPORT, + ITEM_RECEIVER_SETTINGS_FPORT2, ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1, ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2, ITEM_RECEIVER_SETTINGS_PINMAP_FIRST @@ -82,6 +83,7 @@ void menuModelReceiverOptions(event_t event) isModuleR9MAccess(g_moduleIdx) && receiverVariant == PXX2_VARIANT_EU && reusableBuffer.hardwareAndSettings.moduleSettings.txPower > 14 /*25mW*/ ? READONLY_ROW : (uint8_t)0, // Telemetry IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_TELEMETRY_25MW, 0), IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT, 0), + IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT2, 0), uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), 0 // channels ... @@ -171,6 +173,13 @@ void menuModelReceiverOptions(event_t event) } break; + case ITEM_RECEIVER_SETTINGS_FPORT2: + reusableBuffer.hardwareAndSettings.receiverSettings.fport2 = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.fport2, RECEIVER_OPTIONS_2ND_COLUMN, y, "F.Port2", attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; + } + break; + case ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1: lcdDrawText(LCD_W/2, y+1, STR_MORE_OPTIONS_AVAILABLE, SMLSIZE|CENTERED); break; diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 5bff463f6..84ecee015 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -111,6 +111,7 @@ class ReceiverSettings { uint8_t pwmRate; uint8_t fport; uint8_t enablePwmCh5Ch6; + uint8_t fport2; uint8_t outputsCount; uint8_t outputsMapping[24]; }; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 944be8a3a..e396db4bb 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -227,6 +227,8 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) flag1 |= PXX2_RX_SETTINGS_FLAG1_TELEMETRY_25MW; if (reusableBuffer.hardwareAndSettings.receiverSettings.enablePwmCh5Ch6) flag1 |= PXX2_RX_SETTINGS_FLAG1_ENABLE_PWM_CH5_CH6; + if (reusableBuffer.hardwareAndSettings.receiverSettings.fport2) + flag1 |= PXX2_RX_SETTINGS_FLAG1_FPORT2; Pxx2Transport::addByte(flag1); uint8_t outputsCount = min(24, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount); for (int i = 0; i < outputsCount; i++) { diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 2fa64dcad..d6b3402fe 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -55,6 +55,7 @@ #define PXX2_RX_SETTINGS_FLAG1_FPORT (1 << 3) #define PXX2_RX_SETTINGS_FLAG1_TELEMETRY_25MW (1 << 2) #define PXX2_RX_SETTINGS_FLAG1_ENABLE_PWM_CH5_CH6 (1 << 1) +#define PXX2_RX_SETTINGS_FLAG1_FPORT2 (1 << 0) #define PXX2_TX_SETTINGS_FLAG0_WRITE (1 << 6) #define PXX2_TX_SETTINGS_FLAG1_EXTERNAL_ANTENNA (1 << 3) @@ -220,16 +221,16 @@ static const uint8_t PXX2ReceiverOptions[] = { 0b11111110, // X8R 0b11111110, // RX8R 0b11111110, // RX8R-PRO - 0b11111110, // RX6R - 0b11111110, // RX4R - 0b11111110, // G-RX8 - 0b11111110, // G-RX6 + 0b11111111, // RX6R + 0b11111111, // RX4R + 0b11111111, // G-RX8 + 0b11111111, // G-RX6 0b11111110, // X6R 0b11111110, // X4R 0b11111110, // X4R-SB 0b11111110, // XSR 0b11111110, // XSR-M - 0b11111110, // RXSR + 0b11111111, // RXSR 0b11111110, // S6R 0b11111110, // S8R 0b11111110, // XM @@ -266,6 +267,7 @@ enum ReceiverCapabilities { RECEIVER_CAPABILITY_FPORT, RECEIVER_CAPABILITY_TELEMETRY_25MW, RECEIVER_CAPABILITY_ENABLE_PWM_CH5_CH6, + RECEIVER_CAPABILITY_FPORT2, RECEIVER_CAPABILITY_COUNT }; diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 8ed11be1c..dd8d63106 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -92,6 +92,9 @@ void processReceiverSettingsFrame(uint8_t module, const uint8_t * frame) if (frame[4] & PXX2_RX_SETTINGS_FLAG1_ENABLE_PWM_CH5_CH6) destination->enablePwmCh5Ch6 = 1; + if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FPORT2) + destination->fport2 = 1; + uint8_t outputsCount = min(16, frame[0] - 4); destination->outputsCount = outputsCount; for (uint8_t pin = 0; pin < outputsCount; pin++) {