From 50549081b2f4fdd393dc365c9e17c3edd1b48976 Mon Sep 17 00:00:00 2001 From: Ivan Date: Wed, 18 Jun 2025 20:58:02 +0000 Subject: [PATCH 1/2] Add displayport_msp_use_disarm_delay --- src/main/cli/settings.c | 3 +++ src/main/msp/msp.c | 36 ++++++++++++++++++++++++++++++ src/main/pg/displayport_profiles.c | 3 +++ src/main/pg/displayport_profiles.h | 3 +++ 4 files changed, 45 insertions(+) diff --git a/src/main/cli/settings.c b/src/main/cli/settings.c index 5b5b0c4790..afc4b9b696 100644 --- a/src/main/cli/settings.c +++ b/src/main/cli/settings.c @@ -1742,6 +1742,9 @@ const clivalue_t valueTable[] = { { "displayport_msp_row_adjust", VAR_INT8 | MASTER_VALUE, .config.minmax = { -3, 0 }, PG_DISPLAY_PORT_MSP_CONFIG, offsetof(displayPortProfile_t, rowAdjust) }, { "displayport_msp_fonts", VAR_UINT8 | MASTER_VALUE | MODE_ARRAY, .config.array.length = 4, PG_DISPLAY_PORT_MSP_CONFIG, offsetof(displayPortProfile_t, fontSelection) }, { "displayport_msp_use_device_blink", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_DISPLAY_PORT_MSP_CONFIG, offsetof(displayPortProfile_t, useDeviceBlink) }, +#ifdef USE_MSP_DISPLAYPORT_DISARM_DELAY + { "displayport_msp_use_disarm_delay", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, UINT8_MAX }, PG_DISPLAY_PORT_MSP_CONFIG, offsetof(displayPortProfile_t, useDisarmDelay) }, +#endif #endif // PG_DISPLAY_PORT_MSP_CONFIG diff --git a/src/main/msp/msp.c b/src/main/msp/msp.c index 3087069b9d..71a61ce6ce 100644 --- a/src/main/msp/msp.c +++ b/src/main/msp/msp.c @@ -26,6 +26,7 @@ #include #include +#include "common/time.h" #include "platform.h" #include "blackbox/blackbox.h" @@ -159,6 +160,10 @@ #include "hardware_revision.h" #endif +#ifdef USE_MSP_DISPLAYPORT_DISARM_DELAY +#include "io/displayport_msp.h" +#endif + #include "msp.h" static const char * const flightControllerIdentifier = FC_FIRMWARE_IDENTIFIER; // 4 UPPER CASE alpha numeric characters that identify the flight controller. @@ -1076,6 +1081,34 @@ static bool mspCommonProcessOutCommand(int16_t cmdMSP, sbuf_t *dst, mspPostProce return true; } +#ifdef USE_MSP_DISPLAYPORT_DISARM_DELAY +static void mspDisplayportDelayDisarm(mspDescriptor_t srcDesc, boxBitmask_t *flightModeFlags) +{ + static mspDescriptor_t displayPortMspDescriptor = -1; + static bool displayPortMspArmState = false; + + if (displayPortMspDescriptor == -1) { + mspDescriptor_t tmp = getMspSerialPortDescriptor(displayPortMspGetSerial()); + displayPortMspDescriptor = (tmp != -1) ? tmp : -2; + } + + if (displayPortMspDescriptor == srcDesc) { + bool currentState = bitArrayGet(flightModeFlags, BOXARM); + if (displayPortMspArmState) { + if (!currentState) { + if (cmpTimeUs(micros(), getLastDisarmTimeUs()) < 100000 * displayPortProfileMsp()->useDisarmDelay) { + bitArraySet(flightModeFlags, BOXARM); + } else { + displayPortMspArmState = false; + } + } + } else { + displayPortMspArmState = currentState; + } + } +} +#endif + static bool mspProcessOutCommand(mspDescriptor_t srcDesc, int16_t cmdMSP, sbuf_t *dst) { bool unsupportedCommand = false; @@ -1089,6 +1122,9 @@ static bool mspProcessOutCommand(mspDescriptor_t srcDesc, int16_t cmdMSP, sbuf_t case MSP_STATUS: { boxBitmask_t flightModeFlags; const int flagBits = packFlightModeFlags(&flightModeFlags); +#ifdef USE_MSP_DISPLAYPORT_DISARM_DELAY + mspDisplayportDelayDisarm(srcDesc, &flightModeFlags); +#endif sbufWriteU16(dst, getTaskDeltaTimeUs(TASK_PID)); #ifdef USE_I2C diff --git a/src/main/pg/displayport_profiles.c b/src/main/pg/displayport_profiles.c index 3d275d25ef..03cc9c1e34 100644 --- a/src/main/pg/displayport_profiles.c +++ b/src/main/pg/displayport_profiles.c @@ -37,6 +37,9 @@ void pgResetFn_displayPortProfileMsp(displayPortProfile_t *displayPortProfile) for (uint8_t font = 0; font < DISPLAYPORT_SEVERITY_COUNT; font++) { displayPortProfile->fontSelection[font] = font; } +#ifdef USE_MSP_DISPLAYPORT_DISARM_DELAY + displayPortProfile->useDisarmDelay = 30; +#endif } #endif diff --git a/src/main/pg/displayport_profiles.h b/src/main/pg/displayport_profiles.h index 22a7968c00..fee08f355b 100644 --- a/src/main/pg/displayport_profiles.h +++ b/src/main/pg/displayport_profiles.h @@ -34,6 +34,9 @@ typedef struct displayPortProfile_s { uint8_t fontSelection[DISPLAYPORT_SEVERITY_COUNT]; uint8_t useDeviceBlink; // Use device local blink capability +#ifdef USE_MSP_DISPLAYPORT_DISARM_DELAY + uint8_t useDisarmDelay; +#endif } displayPortProfile_t; PG_DECLARE(displayPortProfile_t, displayPortProfileMsp); From b30f46790ee8f716bb106f78a7e98b15a8b40060 Mon Sep 17 00:00:00 2001 From: Ivan Date: Wed, 18 Jun 2025 22:04:53 +0000 Subject: [PATCH 2/2] Fix review --- src/main/cli/settings.c | 2 +- src/main/msp/msp.c | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/cli/settings.c b/src/main/cli/settings.c index afc4b9b696..ec2955c30a 100644 --- a/src/main/cli/settings.c +++ b/src/main/cli/settings.c @@ -1743,7 +1743,7 @@ const clivalue_t valueTable[] = { { "displayport_msp_fonts", VAR_UINT8 | MASTER_VALUE | MODE_ARRAY, .config.array.length = 4, PG_DISPLAY_PORT_MSP_CONFIG, offsetof(displayPortProfile_t, fontSelection) }, { "displayport_msp_use_device_blink", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_DISPLAY_PORT_MSP_CONFIG, offsetof(displayPortProfile_t, useDeviceBlink) }, #ifdef USE_MSP_DISPLAYPORT_DISARM_DELAY - { "displayport_msp_use_disarm_delay", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, UINT8_MAX }, PG_DISPLAY_PORT_MSP_CONFIG, offsetof(displayPortProfile_t, useDisarmDelay) }, + { "displayport_msp_use_disarm_delay", VAR_UINT8 | MASTER_VALUE, .config.minmaxUnsigned = { 0, UINT8_MAX }, PG_DISPLAY_PORT_MSP_CONFIG, offsetof(displayPortProfile_t, useDisarmDelay) }, #endif #endif diff --git a/src/main/msp/msp.c b/src/main/msp/msp.c index 71a61ce6ce..a8b1118e6e 100644 --- a/src/main/msp/msp.c +++ b/src/main/msp/msp.c @@ -26,7 +26,6 @@ #include #include -#include "common/time.h" #include "platform.h" #include "blackbox/blackbox.h" @@ -1082,21 +1081,25 @@ static bool mspCommonProcessOutCommand(int16_t cmdMSP, sbuf_t *dst, mspPostProce } #ifdef USE_MSP_DISPLAYPORT_DISARM_DELAY + +#define DISARM_DELAY_MULTIPLIER_US 100000 + static void mspDisplayportDelayDisarm(mspDescriptor_t srcDesc, boxBitmask_t *flightModeFlags) { - static mspDescriptor_t displayPortMspDescriptor = -1; + static mspDescriptor_t displayPortMspDescriptor; static bool displayPortMspArmState = false; + static bool descriptorInitialized = false; - if (displayPortMspDescriptor == -1) { - mspDescriptor_t tmp = getMspSerialPortDescriptor(displayPortMspGetSerial()); - displayPortMspDescriptor = (tmp != -1) ? tmp : -2; + if (!descriptorInitialized) { + descriptorInitialized = true; + displayPortMspDescriptor = getMspSerialPortDescriptor(displayPortMspGetSerial()); } if (displayPortMspDescriptor == srcDesc) { bool currentState = bitArrayGet(flightModeFlags, BOXARM); if (displayPortMspArmState) { if (!currentState) { - if (cmpTimeUs(micros(), getLastDisarmTimeUs()) < 100000 * displayPortProfileMsp()->useDisarmDelay) { + if (cmpTimeUs(micros(), getLastDisarmTimeUs()) < DISARM_DELAY_MULTIPLIER_US * displayPortProfileMsp()->useDisarmDelay) { bitArraySet(flightModeFlags, BOXARM); } else { displayPortMspArmState = false;