diff --git a/locales/en/messages.json b/locales/en/messages.json index 0a64e20143..6aba7f6475 100755 --- a/locales/en/messages.json +++ b/locales/en/messages.json @@ -6786,8 +6786,12 @@ "message": "Bidirectional DShot (requires supported ESC firmware)", "description": "Feature for the ESC/Motor" }, + "configurationDshotEdt": { + "message": "Built-in sensors", + "description": "ESC/Motor feature" + }, "configurationDshotBidirHelp": { - "message": "Sends ESC data to the FC via DShot telemetry. Required by RPM Filtering and dynamic idle.

Note: Requires a compatible ESC with appropriate firmware, eg JESC, Jazzmac, BLHeli-32.", + "message": "Sends ESC data to the FC via DShot telemetry. Required by RPM Filtering and dynamic idle.

Note: Requires a compatible ESC with appropriate firmware, eg Bluejay, AM32, JESC, Jazzmac, BLHeli-32.", "description": "Description of the Bidirectional DShot feature of the ESC/Motor" }, "configurationGyroSyncDenom": { diff --git a/src/js/VirtualFC.js b/src/js/VirtualFC.js index 05d0ecdab1..1e36cf4497 100644 --- a/src/js/VirtualFC.js +++ b/src/js/VirtualFC.js @@ -52,6 +52,7 @@ const VirtualFC = { motor_count: 4, motor_poles: 14, use_dshot_telemetry: true, + use_dshot_edt: true, use_esc_sensor: false, }; diff --git a/src/js/data_storage.js b/src/js/data_storage.js index efb37b3498..d56b4a8f11 100644 --- a/src/js/data_storage.js +++ b/src/js/data_storage.js @@ -1,4 +1,5 @@ export const API_VERSION_1_39 = '1.39.0'; +export const API_VERSION_1_42 = '1.42.0'; export const API_VERSION_1_44 = '1.44.0'; export const API_VERSION_1_45 = '1.45.0'; export const API_VERSION_1_46 = '1.46.0'; diff --git a/src/js/debug.js b/src/js/debug.js index d38c545c75..3a34cf0c43 100644 --- a/src/js/debug.js +++ b/src/js/debug.js @@ -98,6 +98,13 @@ const DEBUG = { {text: "S_TERM"}, {text: "SPA"}, {text: "TASK"}, + {text: "DSHOT_STATUS_N_TEMPERATURE"}, + {text: "DSHOT_STATUS_N_VOLTAGE"}, + {text: "DSHOT_STATUS_N_CURRENT"}, + {text: "DSHOT_STATUS_N_DEBUG1"}, + {text: "DSHOT_STATUS_N_DEBUG2"}, + {text: "DSHOT_STATUS_N_STRESS_LVL"}, + {text: "DSHOT_STATUS_N_ERPM_FRACTION_18"}, ], fieldNames: { diff --git a/src/js/fc.js b/src/js/fc.js index c14636d99c..e2c2fb7607 100644 --- a/src/js/fc.js +++ b/src/js/fc.js @@ -397,6 +397,7 @@ const FC = { motor_count: 0, motor_poles: 0, use_dshot_telemetry: false, + use_dshot_edt: false, use_esc_sensor: false, }; diff --git a/src/js/msp/MSPHelper.js b/src/js/msp/MSPHelper.js index 26267dcc4a..fa59f99aa7 100644 --- a/src/js/msp/MSPHelper.js +++ b/src/js/msp/MSPHelper.js @@ -8,7 +8,7 @@ import semver from 'semver'; import vtxDeviceStatusFactory from "../utils/VtxDeviceStatus/VtxDeviceStatusFactory"; import MSP from "../msp"; import MSPCodes from "./MSPCodes"; -import { API_VERSION_1_45, API_VERSION_1_46, API_VERSION_1_47 } from '../data_storage'; +import { API_VERSION_1_42, API_VERSION_1_45, API_VERSION_1_46, API_VERSION_1_47 } from '../data_storage'; import EscProtocols from "../utils/EscProtocols"; import huffmanDecodeBuf from "../huffman"; import { defaultHuffmanTree, defaultHuffmanLenIndex } from "../default_huffman_tree"; @@ -493,10 +493,17 @@ MspHelper.prototype.process_data = function(dataHandler) { FC.MOTOR_CONFIG.minthrottle = data.readU16(); // 0-2000 FC.MOTOR_CONFIG.maxthrottle = data.readU16(); // 0-2000 FC.MOTOR_CONFIG.mincommand = data.readU16(); // 0-2000 - FC.MOTOR_CONFIG.motor_count = data.readU8(); - FC.MOTOR_CONFIG.motor_poles = data.readU8(); - FC.MOTOR_CONFIG.use_dshot_telemetry = data.readU8() != 0; - FC.MOTOR_CONFIG.use_esc_sensor = data.readU8() != 0; + + if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_42)) { + FC.MOTOR_CONFIG.motor_count = data.readU8(); + FC.MOTOR_CONFIG.motor_poles = data.readU8(); + FC.MOTOR_CONFIG.use_dshot_telemetry = data.readU8() != 0; + FC.MOTOR_CONFIG.use_esc_sensor = data.readU8() != 0; + } + + if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_47)) { + FC.MOTOR_CONFIG.use_dshot_edt = data.readU8() != 0; + } break; case MSPCodes.MSP_COMPASS_CONFIG: FC.COMPASS_CONFIG.mag_declination = data.read16() / 10; @@ -1816,9 +1823,14 @@ MspHelper.prototype.crunch = function(code, modifierCode = undefined) { .push16(FC.MOTOR_CONFIG.maxthrottle) .push16(FC.MOTOR_CONFIG.mincommand); - // Introduced in 1.42 - buffer.push8(FC.MOTOR_CONFIG.motor_poles); - buffer.push8(FC.MOTOR_CONFIG.use_dshot_telemetry ? 1 : 0); + if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_42)) { + buffer.push8(FC.MOTOR_CONFIG.motor_poles); + buffer.push8(FC.MOTOR_CONFIG.use_dshot_telemetry ? 1 : 0); + } + + if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_47)) { + buffer.push8(FC.MOTOR_CONFIG.use_dshot_edt ? 1 : 0); + } break; case MSPCodes.MSP_SET_GPS_CONFIG: buffer.push8(FC.GPS_CONFIG.provider) diff --git a/src/js/tabs/motors.js b/src/js/tabs/motors.js index a479ff3d5b..3d47daeac9 100644 --- a/src/js/tabs/motors.js +++ b/src/js/tabs/motors.js @@ -12,14 +12,17 @@ import FC from "../fc"; import MSP from "../msp"; import { mixerList } from "../model"; import MSPCodes from "../msp/MSPCodes"; +import { API_VERSION_1_46, API_VERSION_1_47 } from "../data_storage"; import EscProtocols from "../utils/EscProtocols"; import { updateTabList } from "../utils/updateTabList"; import { isInt, getMixerImageSrc } from "../utils/common"; import * as d3 from 'd3'; import $ from 'jquery'; +import semver from 'semver'; const motors = { previousDshotBidir: null, + previousDshotEdt: null, previousFilterDynQ: null, previousFilterDynCount: null, analyticsChanges: {}, @@ -275,6 +278,7 @@ motors.initialize = async function (callback) { feature12: FC.FEATURE_CONFIG.features.isEnabled('3D'), feature27: FC.FEATURE_CONFIG.features.isEnabled('ESC_SENSOR'), dshotBidir: FC.MOTOR_CONFIG.use_dshot_telemetry, + dshotEdt: FC.MOTOR_CONFIG.use_dshot_edt, motorPoles: FC.MOTOR_CONFIG.motor_poles, digitalIdlePercent: FC.PID_ADVANCED_CONFIG.digitalIdlePercent, idleMinRpm: FC.ADVANCED_TUNING.idleMinRpm, @@ -695,6 +699,7 @@ motors.initialize = async function (callback) { dshotBidirElement.prop('checked', FC.MOTOR_CONFIG.use_dshot_telemetry).trigger("change"); self.previousDshotBidir = FC.MOTOR_CONFIG.use_dshot_telemetry; + self.previousDshotEdt = FC.MOTOR_CONFIG.use_dshot_edt; self.previousFilterDynQ = FC.FILTER_CONFIG.dyn_notch_q; self.previousFilterDynCount = FC.FILTER_CONFIG.dyn_notch_count; @@ -704,6 +709,13 @@ motors.initialize = async function (callback) { self.analyticsChanges['BidirectionalDshot'] = newValue; FC.MOTOR_CONFIG.use_dshot_telemetry = value; + if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_47) && !value) { + FC.MOTOR_CONFIG.use_dshot_edt = value; + + const dshotEdtElement = $('input[id="dshotEdt"]'); + dshotEdtElement.prop('checked', FC.MOTOR_CONFIG.use_dshot_edt).trigger("change"); + } + const rpmFilterIsDisabled = FC.FILTER_CONFIG.gyro_rpm_notch_harmonics === 0; FC.FILTER_CONFIG.dyn_notch_count = self.previousFilterDynCount; FC.FILTER_CONFIG.dyn_notch_q = self.previousFilterDynQ; @@ -733,6 +745,21 @@ motors.initialize = async function (callback) { FC.FILTER_CONFIG.dyn_notch_count = self.previousFilterDynCount; FC.FILTER_CONFIG.dyn_notch_q = self.previousFilterDynQ; } + + if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_46)) { + const dshotEdtElement = $('input[id="dshotEdt"]'); + + dshotEdtElement.prop('checked', FC.MOTOR_CONFIG.use_dshot_edt).trigger("change"); + dshotEdtElement.on("change", function () { + const value = dshotEdtElement.is(':checked'); + const newValue = (value !== FC.MOTOR_CONFIG.use_dshot_edt) ? 'On' : 'Off'; + + self.analyticsChanges['DshotEdt'] = newValue; + FC.MOTOR_CONFIG.use_dshot_edt = value; + }); + } + + $('input[name="motorPoles"]').val(FC.MOTOR_CONFIG.motor_poles); }); $('input[name="motorPoles"]').val(FC.MOTOR_CONFIG.motor_poles); @@ -768,7 +795,10 @@ motors.initialize = async function (callback) { $('div.digitalIdlePercent').hide(); } - $('.escSensor').toggle(protocolConfigured && digitalProtocol); + $('.escSensor').toggle( + protocolConfigured && digitalProtocol && ( + semver.lt(FC.CONFIG.apiVersion, API_VERSION_1_46) || + semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_47) && !FC.MOTOR_CONFIG.use_dshot_edt)); $('div.checkboxDshotBidir').toggle(protocolConfigured && digitalProtocol); $('div.motorPoles').toggle(protocolConfigured && rpmFeaturesVisible); @@ -776,6 +806,12 @@ motors.initialize = async function (callback) { $('.escMotorStop').toggle(protocolConfigured); $('#escProtocolDisabled').toggle(!protocolConfigured); + $('.checkboxDshotEdt').toggle( + semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_47) && + protocolConfigured && + digitalProtocol && + dshotBidirElement.is(':checked') && + !$("input[name='ESC_SENSOR']").is(':checked')); //trigger change unsyncedPWMSwitch to show/hide Motor PWM freq input unsyncedPWMSwitchElement.trigger("change"); @@ -797,6 +833,10 @@ motors.initialize = async function (callback) { //trigger change dshotBidir and ESC_SENSOR to show/hide Motor Poles tab dshotBidirElement.change(updateVisibility).trigger("change"); + if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_47)) { + const dshotEdtElement = $('input[id="dshotEdt"]'); + dshotEdtElement.change(updateVisibility).trigger("change"); + } $("input[name='ESC_SENSOR']").on("change", updateVisibility).trigger("change"); // fill throttle diff --git a/src/tabs/motors.html b/src/tabs/motors.html index 0257a89f52..c6d39063bd 100644 --- a/src/tabs/motors.html +++ b/src/tabs/motors.html @@ -88,8 +88,14 @@
+ +
+
+
+
+ +
-