From d5f8526ae6c0ba9f14cc24f23786a3fbe34be9ca Mon Sep 17 00:00:00 2001 From: kedeng Date: Fri, 11 Jul 2025 12:18:52 +0800 Subject: [PATCH 1/5] Add user option to force DSHOT EDT decoding always on --- src/main/cli/settings.c | 1 + src/main/drivers/dshot.c | 3 +++ src/main/pg/motor.c | 7 ++++++- src/main/pg/motor.h | 6 ++++++ src/test/unit/pg_unittest.cc | 1 + 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/cli/settings.c b/src/main/cli/settings.c index 9e6c0ddbf2..950960367d 100644 --- a/src/main/cli/settings.c +++ b/src/main/cli/settings.c @@ -956,6 +956,7 @@ const clivalue_t valueTable[] = { #ifdef USE_DSHOT_TELEMETRY { PARAM_NAME_DSHOT_BIDIR, VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotTelemetry) }, { "dshot_edt", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotEdt) }, + { "dshot_edt_always_decode", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotEdtAlwaysDecode) }, #endif #ifdef USE_DSHOT_BITBANG { "dshot_bitbang", VAR_UINT8 | HARDWARE_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON_AUTO }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotBitbang) }, diff --git a/src/main/drivers/dshot.c b/src/main/drivers/dshot.c index b0585e094f..2d141edf43 100644 --- a/src/main/drivers/dshot.c +++ b/src/main/drivers/dshot.c @@ -150,6 +150,7 @@ FAST_DATA_ZERO_INIT static float minMotorFrequencyHz; FAST_DATA_ZERO_INIT static float erpmToHz; FAST_DATA_ZERO_INIT static float dshotRpmAverage; FAST_DATA_ZERO_INIT static float dshotRpm[MAX_SUPPORTED_MOTORS]; +FAST_DATA_ZERO_INIT static dshotEdtAlwaysDecode_e edtAlwaysDecode; // Lookup table for extended telemetry type decoding // Only contains extended telemetry types, eRPM is handled by conditional logic @@ -180,6 +181,7 @@ void initDshotTelemetry(const timeUs_t looptimeUs) // erpmToHz is used by bidir dshot and ESC telemetry erpmToHz = ERPM_PER_LSB / SECONDS_PER_MINUTE / (motorConfig()->motorPoleCount / 2.0f); + edtAlwaysDecode = motorConfig()->dev.useDshotEdtAlwaysDecode == DSHOT_EDT_ALWAYS_DECODE_ON; #ifdef USE_RPM_FILTER if (motorConfig()->dev.useDshotTelemetry) { @@ -214,6 +216,7 @@ static void dshot_decode_telemetry_value(uint8_t motorIndex, uint32_t *pDecoded, { uint16_t value = dshotTelemetryState.motorState[motorIndex].rawValue; bool isEdtEnabled = (dshotTelemetryState.motorState[motorIndex].telemetryTypes & DSHOT_EXTENDED_TELEMETRY_MASK) != 0; + isEdtEnabled |= edtAlwaysDecode; // https://github.com/bird-sanctuary/extended-dshot-telemetry // Extract telemetry type field and check for eRPM conditions in one operation diff --git a/src/main/pg/motor.c b/src/main/pg/motor.c index b9c65a69f8..5f6682cb77 100644 --- a/src/main/pg/motor.c +++ b/src/main/pg/motor.c @@ -47,7 +47,11 @@ #define DEFAULT_DSHOT_TELEMETRY DSHOT_TELEMETRY_OFF #endif -PG_REGISTER_WITH_RESET_FN(motorConfig_t, motorConfig, PG_MOTOR_CONFIG, 3); +#if !defined(DEFAULT_DSHOT_EDT_ALWAYS_DECODE) +#define DEFAULT_DSHOT_EDT_ALWAYS_DECODE DSHOT_EDT_ALWAYS_DECODE_OFF +#endif + +PG_REGISTER_WITH_RESET_FN(motorConfig_t, motorConfig, PG_MOTOR_CONFIG, 4); void pgResetFn_motorConfig(motorConfig_t *motorConfig) { @@ -112,6 +116,7 @@ void pgResetFn_motorConfig(motorConfig_t *motorConfig) #ifdef USE_DSHOT_TELEMETRY motorConfig->dev.useDshotTelemetry = DEFAULT_DSHOT_TELEMETRY; + motorConfig->dev.useDshotEdtAlwaysDecode = DEFAULT_DSHOT_EDT_ALWAYS_DECODE; #endif #ifdef USE_DSHOT_BITBANG diff --git a/src/main/pg/motor.h b/src/main/pg/motor.h index 1b8564862a..d4adc82a18 100644 --- a/src/main/pg/motor.h +++ b/src/main/pg/motor.h @@ -57,6 +57,11 @@ typedef enum { DSHOT_TELEMETRY_ON, } dshotTelemetry_e; +typedef enum { + DSHOT_EDT_ALWAYS_DECODE_OFF, + DSHOT_EDT_ALWAYS_DECODE_ON, +} dshotEdtAlwaysDecode_e; + typedef struct motorDevConfig_s { uint16_t motorPwmRate; // The update rate of motor outputs (50-498Hz) uint8_t motorProtocol; // Pwm Protocol @@ -65,6 +70,7 @@ typedef struct motorDevConfig_s { uint8_t useBurstDshot; uint8_t useDshotTelemetry; uint8_t useDshotEdt; + uint8_t useDshotEdtAlwaysDecode; ioTag_t ioTags[MAX_SUPPORTED_MOTORS]; uint8_t motorTransportProtocol; uint8_t useDshotBitbang; diff --git a/src/test/unit/pg_unittest.cc b/src/test/unit/pg_unittest.cc index 8d0fd935db..866e9d0485 100644 --- a/src/test/unit/pg_unittest.cc +++ b/src/test/unit/pg_unittest.cc @@ -43,6 +43,7 @@ PG_RESET_TEMPLATE(motorConfig_t, motorConfig, .useBurstDshot = 0, .useDshotTelemetry = 0, .useDshotEdt = 0, + .useDshotEdtAlwaysDecode = 0, .ioTags = {IO_TAG_NONE, IO_TAG_NONE, IO_TAG_NONE, IO_TAG_NONE}, .motorTransportProtocol = 0, .useDshotBitbang = 0, From b5b3de1cb1d81093fa1f9cf8fb9c4368feb4d624 Mon Sep 17 00:00:00 2001 From: kedeng Date: Fri, 11 Jul 2025 12:38:39 +0800 Subject: [PATCH 2/5] Improve dshot_edt_always_decode condition checking logic --- src/main/drivers/dshot.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/drivers/dshot.c b/src/main/drivers/dshot.c index 2d141edf43..c3647098c7 100644 --- a/src/main/drivers/dshot.c +++ b/src/main/drivers/dshot.c @@ -181,7 +181,7 @@ void initDshotTelemetry(const timeUs_t looptimeUs) // erpmToHz is used by bidir dshot and ESC telemetry erpmToHz = ERPM_PER_LSB / SECONDS_PER_MINUTE / (motorConfig()->motorPoleCount / 2.0f); - edtAlwaysDecode = motorConfig()->dev.useDshotEdtAlwaysDecode == DSHOT_EDT_ALWAYS_DECODE_ON; + edtAlwaysDecode = motorConfig()->dev.useDshotEdtAlwaysDecode; #ifdef USE_RPM_FILTER if (motorConfig()->dev.useDshotTelemetry) { @@ -216,7 +216,7 @@ static void dshot_decode_telemetry_value(uint8_t motorIndex, uint32_t *pDecoded, { uint16_t value = dshotTelemetryState.motorState[motorIndex].rawValue; bool isEdtEnabled = (dshotTelemetryState.motorState[motorIndex].telemetryTypes & DSHOT_EXTENDED_TELEMETRY_MASK) != 0; - isEdtEnabled |= edtAlwaysDecode; + isEdtEnabled = isEdtEnabled || (edtAlwaysDecode == DSHOT_EDT_ALWAYS_DECODE_ON); // https://github.com/bird-sanctuary/extended-dshot-telemetry // Extract telemetry type field and check for eRPM conditions in one operation From f9966d1eee9153d737c95b182003c30f8b19e514 Mon Sep 17 00:00:00 2001 From: kedeng Date: Fri, 11 Jul 2025 19:12:14 +0800 Subject: [PATCH 3/5] Remove unnecessary enum for dshot_edt_always_decode option --- src/main/drivers/dshot.c | 5 ++--- src/main/pg/motor.c | 2 +- src/main/pg/motor.h | 5 ----- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/drivers/dshot.c b/src/main/drivers/dshot.c index c3647098c7..3c50dbaba5 100644 --- a/src/main/drivers/dshot.c +++ b/src/main/drivers/dshot.c @@ -150,7 +150,7 @@ FAST_DATA_ZERO_INIT static float minMotorFrequencyHz; FAST_DATA_ZERO_INIT static float erpmToHz; FAST_DATA_ZERO_INIT static float dshotRpmAverage; FAST_DATA_ZERO_INIT static float dshotRpm[MAX_SUPPORTED_MOTORS]; -FAST_DATA_ZERO_INIT static dshotEdtAlwaysDecode_e edtAlwaysDecode; +FAST_DATA_ZERO_INIT static bool edtAlwaysDecode; // Lookup table for extended telemetry type decoding // Only contains extended telemetry types, eRPM is handled by conditional logic @@ -215,8 +215,7 @@ static uint32_t dshot_decode_eRPM_telemetry_value(uint16_t value) static void dshot_decode_telemetry_value(uint8_t motorIndex, uint32_t *pDecoded, dshotTelemetryType_t *pType) { uint16_t value = dshotTelemetryState.motorState[motorIndex].rawValue; - bool isEdtEnabled = (dshotTelemetryState.motorState[motorIndex].telemetryTypes & DSHOT_EXTENDED_TELEMETRY_MASK) != 0; - isEdtEnabled = isEdtEnabled || (edtAlwaysDecode == DSHOT_EDT_ALWAYS_DECODE_ON); + bool isEdtEnabled = edtAlwaysDecode || (dshotTelemetryState.motorState[motorIndex].telemetryTypes & DSHOT_EXTENDED_TELEMETRY_MASK) != 0; // https://github.com/bird-sanctuary/extended-dshot-telemetry // Extract telemetry type field and check for eRPM conditions in one operation diff --git a/src/main/pg/motor.c b/src/main/pg/motor.c index 5f6682cb77..c34fe2e560 100644 --- a/src/main/pg/motor.c +++ b/src/main/pg/motor.c @@ -48,7 +48,7 @@ #endif #if !defined(DEFAULT_DSHOT_EDT_ALWAYS_DECODE) -#define DEFAULT_DSHOT_EDT_ALWAYS_DECODE DSHOT_EDT_ALWAYS_DECODE_OFF +#define DEFAULT_DSHOT_EDT_ALWAYS_DECODE false #endif PG_REGISTER_WITH_RESET_FN(motorConfig_t, motorConfig, PG_MOTOR_CONFIG, 4); diff --git a/src/main/pg/motor.h b/src/main/pg/motor.h index d4adc82a18..6161f43833 100644 --- a/src/main/pg/motor.h +++ b/src/main/pg/motor.h @@ -57,11 +57,6 @@ typedef enum { DSHOT_TELEMETRY_ON, } dshotTelemetry_e; -typedef enum { - DSHOT_EDT_ALWAYS_DECODE_OFF, - DSHOT_EDT_ALWAYS_DECODE_ON, -} dshotEdtAlwaysDecode_e; - typedef struct motorDevConfig_s { uint16_t motorPwmRate; // The update rate of motor outputs (50-498Hz) uint8_t motorProtocol; // Pwm Protocol From 3ce7f7a1e0f6d98cd4bd1cd6f20bbe89f154015e Mon Sep 17 00:00:00 2001 From: kedeng Date: Fri, 11 Jul 2025 20:27:48 +0800 Subject: [PATCH 4/5] add FORCE option to dshot_edt, remove dshot_edt_always_decode --- src/main/cli/settings.c | 12 ++++++++++-- src/main/cli/settings.h | 3 +++ src/main/drivers/dshot.c | 2 +- src/main/pg/motor.c | 6 +++--- src/main/pg/motor.h | 7 ++++++- src/test/unit/pg_unittest.cc | 1 - 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/cli/settings.c b/src/main/cli/settings.c index 950960367d..259c162f65 100644 --- a/src/main/cli/settings.c +++ b/src/main/cli/settings.c @@ -223,6 +223,12 @@ const char * const lookupTableOffOn[] = { "OFF", "ON" }; +#ifdef USE_DSHOT_TELEMETRY +static const char * const lookupTableDshotEdt[] = { + "OFF", "ON", "FORCE" +}; +#endif + static const char * const lookupTableCrashRecovery[] = { "OFF", "ON" ,"BEEP", "DISARM" }; @@ -643,6 +649,9 @@ const lookupTableEntry_t lookupTables[] = { #endif LOOKUP_TABLE_ENTRY(debugModeNames), LOOKUP_TABLE_ENTRY(lookupTablePwmProtocol), +#ifdef USE_DSHOT_TELEMETRY + LOOKUP_TABLE_ENTRY(lookupTableDshotEdt), +#endif LOOKUP_TABLE_ENTRY(lookupTableLowpassType), LOOKUP_TABLE_ENTRY(lookupTableDtermLowpassType), LOOKUP_TABLE_ENTRY(lookupTableFailsafe), @@ -955,8 +964,7 @@ const clivalue_t valueTable[] = { #endif #ifdef USE_DSHOT_TELEMETRY { PARAM_NAME_DSHOT_BIDIR, VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotTelemetry) }, - { "dshot_edt", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotEdt) }, - { "dshot_edt_always_decode", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotEdtAlwaysDecode) }, + { "dshot_edt", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_DSHOT_EDT }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotEdt) }, #endif #ifdef USE_DSHOT_BITBANG { "dshot_bitbang", VAR_UINT8 | HARDWARE_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON_AUTO }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotBitbang) }, diff --git a/src/main/cli/settings.h b/src/main/cli/settings.h index 8c79b54aa2..763643e4ed 100644 --- a/src/main/cli/settings.h +++ b/src/main/cli/settings.h @@ -64,6 +64,9 @@ typedef enum { #endif TABLE_DEBUG, TABLE_MOTOR_PWM_PROTOCOL, +#ifdef USE_DSHOT_TELEMETRY + TABLE_DSHOT_EDT, +#endif TABLE_GYRO_LPF_TYPE, TABLE_DTERM_LPF_TYPE, TABLE_FAILSAFE, diff --git a/src/main/drivers/dshot.c b/src/main/drivers/dshot.c index 3c50dbaba5..29c7cfd3ee 100644 --- a/src/main/drivers/dshot.c +++ b/src/main/drivers/dshot.c @@ -181,7 +181,7 @@ void initDshotTelemetry(const timeUs_t looptimeUs) // erpmToHz is used by bidir dshot and ESC telemetry erpmToHz = ERPM_PER_LSB / SECONDS_PER_MINUTE / (motorConfig()->motorPoleCount / 2.0f); - edtAlwaysDecode = motorConfig()->dev.useDshotEdtAlwaysDecode; + edtAlwaysDecode = (motorConfig()->dev.useDshotEdt == DSHOT_EDT_FORCE); #ifdef USE_RPM_FILTER if (motorConfig()->dev.useDshotTelemetry) { diff --git a/src/main/pg/motor.c b/src/main/pg/motor.c index c34fe2e560..78771ca2ad 100644 --- a/src/main/pg/motor.c +++ b/src/main/pg/motor.c @@ -47,8 +47,8 @@ #define DEFAULT_DSHOT_TELEMETRY DSHOT_TELEMETRY_OFF #endif -#if !defined(DEFAULT_DSHOT_EDT_ALWAYS_DECODE) -#define DEFAULT_DSHOT_EDT_ALWAYS_DECODE false +#if !defined(DEFAULT_DSHOT_EDT) +#define DEFAULT_DSHOT_EDT DSHOT_EDT_OFF #endif PG_REGISTER_WITH_RESET_FN(motorConfig_t, motorConfig, PG_MOTOR_CONFIG, 4); @@ -116,7 +116,7 @@ void pgResetFn_motorConfig(motorConfig_t *motorConfig) #ifdef USE_DSHOT_TELEMETRY motorConfig->dev.useDshotTelemetry = DEFAULT_DSHOT_TELEMETRY; - motorConfig->dev.useDshotEdtAlwaysDecode = DEFAULT_DSHOT_EDT_ALWAYS_DECODE; + motorConfig->dev.useDshotEdt = DEFAULT_DSHOT_EDT; #endif #ifdef USE_DSHOT_BITBANG diff --git a/src/main/pg/motor.h b/src/main/pg/motor.h index 6161f43833..b9af4ebaa9 100644 --- a/src/main/pg/motor.h +++ b/src/main/pg/motor.h @@ -57,6 +57,12 @@ typedef enum { DSHOT_TELEMETRY_ON, } dshotTelemetry_e; +typedef enum { + DSHOT_EDT_OFF = 0, + DSHOT_EDT_ON = 1, + DSHOT_EDT_FORCE = 2, +} dshotEdt_e; + typedef struct motorDevConfig_s { uint16_t motorPwmRate; // The update rate of motor outputs (50-498Hz) uint8_t motorProtocol; // Pwm Protocol @@ -65,7 +71,6 @@ typedef struct motorDevConfig_s { uint8_t useBurstDshot; uint8_t useDshotTelemetry; uint8_t useDshotEdt; - uint8_t useDshotEdtAlwaysDecode; ioTag_t ioTags[MAX_SUPPORTED_MOTORS]; uint8_t motorTransportProtocol; uint8_t useDshotBitbang; diff --git a/src/test/unit/pg_unittest.cc b/src/test/unit/pg_unittest.cc index 866e9d0485..8d0fd935db 100644 --- a/src/test/unit/pg_unittest.cc +++ b/src/test/unit/pg_unittest.cc @@ -43,7 +43,6 @@ PG_RESET_TEMPLATE(motorConfig_t, motorConfig, .useBurstDshot = 0, .useDshotTelemetry = 0, .useDshotEdt = 0, - .useDshotEdtAlwaysDecode = 0, .ioTags = {IO_TAG_NONE, IO_TAG_NONE, IO_TAG_NONE, IO_TAG_NONE}, .motorTransportProtocol = 0, .useDshotBitbang = 0, From ae6fcbf374c7f297efd95acd15eb270b403de888 Mon Sep 17 00:00:00 2001 From: kedeng Date: Sat, 12 Jul 2025 11:03:09 +0800 Subject: [PATCH 5/5] Reverted unneeded version number updates --- src/main/drivers/dshot.c | 2 +- src/main/pg/motor.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/drivers/dshot.c b/src/main/drivers/dshot.c index 29c7cfd3ee..d635510aa3 100644 --- a/src/main/drivers/dshot.c +++ b/src/main/drivers/dshot.c @@ -181,7 +181,7 @@ void initDshotTelemetry(const timeUs_t looptimeUs) // erpmToHz is used by bidir dshot and ESC telemetry erpmToHz = ERPM_PER_LSB / SECONDS_PER_MINUTE / (motorConfig()->motorPoleCount / 2.0f); - edtAlwaysDecode = (motorConfig()->dev.useDshotEdt == DSHOT_EDT_FORCE); + edtAlwaysDecode = motorConfig()->dev.useDshotEdt == DSHOT_EDT_FORCE; #ifdef USE_RPM_FILTER if (motorConfig()->dev.useDshotTelemetry) { diff --git a/src/main/pg/motor.c b/src/main/pg/motor.c index 78771ca2ad..5b7437c97e 100644 --- a/src/main/pg/motor.c +++ b/src/main/pg/motor.c @@ -51,7 +51,7 @@ #define DEFAULT_DSHOT_EDT DSHOT_EDT_OFF #endif -PG_REGISTER_WITH_RESET_FN(motorConfig_t, motorConfig, PG_MOTOR_CONFIG, 4); +PG_REGISTER_WITH_RESET_FN(motorConfig_t, motorConfig, PG_MOTOR_CONFIG, 3); void pgResetFn_motorConfig(motorConfig_t *motorConfig) {