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 @@