Skip to content

Commit 32a9661

Browse files
committed
Fix MSP and make timeout dynamic
1 parent 5b1845f commit 32a9661

File tree

5 files changed

+92
-82
lines changed

5 files changed

+92
-82
lines changed

src/js/msp.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ const MSP = {
5050
packet_error: 0,
5151
unsupported: 0,
5252

53+
MIN_TIMEOUT: 100,
54+
MAX_TIMEOUT: 1000,
55+
timeout: 100,
56+
5357
last_received_timestamp: null,
5458
listeners: [],
5559

@@ -343,20 +347,32 @@ const MSP = {
343347
}
344348
}
345349

346-
if (!requestExists) {
350+
if (requestExists) {
351+
obj.start = performance.now();
352+
obj.timeout = MSP.timeout;
347353
obj.timer = setInterval(function () {
348354
console.warn(`MSP: data request timed-out: ${code} ID: ${serial.connectionId} TAB: ${GUI.active_tab}`);
349355

350-
serial.send(bufferOut, false);
351-
}, 1000); // we should be able to define timeout in the future
356+
serial.send(bufferOut, function (_sendInfo) {
357+
obj.stop = performance.now();
358+
const previousTimeout = obj.timeout;
359+
const newTimeout = Math.round(obj.stop - obj.start);
360+
obj.timeout = Math.max(MSP.MIN_TIMEOUT, Math.min(newTimeout, MSP.MAX_TIMEOUT));
361+
MSP.timeout = obj.timeout;
362+
console.log(`MSP: Setting new MSP timeout: ${obj.timeout} PREVIOUS: ${previousTimeout}`);
363+
});
364+
}, MSP.timeout); // we should be able to define timeout in the future
352365
}
353366

354367
MSP.callbacks.push(obj);
355368

356369
// always send messages with data payload (even when there is a message already in the queue)
357370
if (data || !requestExists) {
371+
if (MSP.timeout > MSP.MIN_TIMEOUT) {
372+
MSP.timeout--;
373+
}
358374
serial.send(bufferOut, function (sendInfo) {
359-
if (sendInfo.bytesSent == bufferOut.byteLength) {
375+
if (sendInfo.bytesSent === bufferOut.byteLength) {
360376
if (callback_sent) {
361377
callback_sent();
362378
}

src/js/msp/MSPHelper.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,6 @@ MspHelper.prototype.process_data = function(dataHandler) {
146146
FC.CONFIG.mode = data.readU32();
147147
FC.CONFIG.profile = data.readU8();
148148

149-
TABS.pid_tuning.checkUpdateProfile(false);
150-
151149
sensor_status(FC.CONFIG.activeSensors);
152150
break;
153151
case MSPCodes.MSP_STATUS_EX:
@@ -172,8 +170,6 @@ MspHelper.prototype.process_data = function(dataHandler) {
172170
FC.CONFIG.armingDisableCount = data.readU8(); // Flag count
173171
FC.CONFIG.armingDisableFlags = data.readU32();
174172
}
175-
176-
TABS.pid_tuning.checkUpdateProfile(true);
177173
}
178174

179175
sensor_status(FC.CONFIG.activeSensors);

src/js/serial_backend.js

Lines changed: 70 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -531,16 +531,16 @@ function onConnect() {
531531

532532
$('#tabs ul.mode-connected').show();
533533

534-
MSP.send_message(MSPCodes.MSP_FEATURE_CONFIG, false, false);
535-
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_33)) {
536-
MSP.send_message(MSPCodes.MSP_BATTERY_CONFIG, false, false);
537-
}
538-
MSP.send_message(MSPCodes.MSP_STATUS_EX, false, false);
539-
MSP.send_message(MSPCodes.MSP_DATAFLASH_SUMMARY, false, false);
540-
541-
if (FC.CONFIG.boardType == 0 || FC.CONFIG.boardType == 2) {
542-
startLiveDataRefreshTimer();
543-
}
534+
Promise.resolve(true)
535+
.then(() => MSP.promise(MSPCodes.MSP_FEATURE_CONFIG))
536+
.then(() => semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_33) ? MSP.promise(MSPCodes.MSP_BATTERY_CONFIG) : true)
537+
.then(() => MSP.promise(semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_32) ? MSPCodes.MSP_STATUS_EX : MSPCodes.MSP_STATUS))
538+
.then(() => MSP.promise(MSPCodes.MSP_DATAFLASH_SUMMARY))
539+
.then(() => {
540+
if (FC.CONFIG.boardType == 0 || FC.CONFIG.boardType == 2) {
541+
startLiveDataRefreshTimer();
542+
}
543+
});
544544
}
545545

546546
const sensorState = $('#sensor-status');
@@ -685,7 +685,7 @@ function have_sensor(sensors_detected, sensor_code) {
685685

686686
function startLiveDataRefreshTimer() {
687687
// live data refresh
688-
GUI.timeout_add('data_refresh', function () { update_live_status(); }, 100);
688+
GUI.timeout_add('data_refresh', update_live_status, 100);
689689
}
690690

691691
function update_live_status() {
@@ -697,75 +697,72 @@ function update_live_status() {
697697
});
698698

699699
if (GUI.active_tab !== 'cli' && GUI.active_tab !== 'presets') {
700-
MSP.send_message(MSPCodes.MSP_BOXNAMES, false, false);
701-
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_32)) {
702-
MSP.send_message(MSPCodes.MSP_STATUS_EX, false, false);
703-
} else {
704-
MSP.send_message(MSPCodes.MSP_STATUS, false, false);
705-
}
706-
MSP.send_message(MSPCodes.MSP_ANALOG, false, false);
707-
}
708-
709-
const active = ((Date.now() - FC.ANALOG.last_received_timestamp) < 300);
710-
711-
for (let i = 0; i < FC.AUX_CONFIG.length; i++) {
712-
if (FC.AUX_CONFIG[i] === 'ARM') {
713-
if (bit_check(FC.CONFIG.mode, i)) {
714-
$(".armedicon").addClass('active');
715-
} else {
716-
$(".armedicon").removeClass('active');
717-
}
718-
}
719-
if (FC.AUX_CONFIG[i] === 'FAILSAFE') {
720-
if (bit_check(FC.CONFIG.mode, i)) {
721-
$(".failsafeicon").addClass('active');
722-
} else {
723-
$(".failsafeicon").removeClass('active');
700+
Promise.resolve(true)
701+
.then(() => MSP.promise(MSPCodes.MSP_BOXNAMES))
702+
.then(() => MSP.promise(semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_32) ? MSPCodes.MSP_STATUS_EX : MSPCodes.MSP_STATUS))
703+
.then(() => MSP.promise(MSPCodes.MSP_ANALOG))
704+
.then(() => {
705+
const active = ((Date.now() - FC.ANALOG.last_received_timestamp) < 300);
706+
707+
for (let i = 0; i < FC.AUX_CONFIG.length; i++) {
708+
if (FC.AUX_CONFIG[i] === 'ARM') {
709+
if (bit_check(FC.CONFIG.mode, i)) {
710+
$(".armedicon").addClass('active');
711+
} else {
712+
$(".armedicon").removeClass('active');
713+
}
714+
}
715+
if (FC.AUX_CONFIG[i] === 'FAILSAFE') {
716+
if (bit_check(FC.CONFIG.mode, i)) {
717+
$(".failsafeicon").addClass('active');
718+
} else {
719+
$(".failsafeicon").removeClass('active');
720+
}
721+
}
724722
}
725-
}
726-
}
727723

728-
if (FC.ANALOG != undefined) {
729-
let nbCells = Math.floor(FC.ANALOG.voltage / FC.BATTERY_CONFIG.vbatmaxcellvoltage) + 1;
724+
if (FC.ANALOG != undefined) {
725+
let nbCells = Math.floor(FC.ANALOG.voltage / FC.BATTERY_CONFIG.vbatmaxcellvoltage) + 1;
730726

731-
if (FC.ANALOG.voltage == 0) {
732-
nbCells = 1;
733-
}
727+
if (FC.ANALOG.voltage == 0) {
728+
nbCells = 1;
729+
}
734730

735-
const min = FC.BATTERY_CONFIG.vbatmincellvoltage * nbCells;
736-
const max = FC.BATTERY_CONFIG.vbatmaxcellvoltage * nbCells;
737-
const warn = FC.BATTERY_CONFIG.vbatwarningcellvoltage * nbCells;
738-
739-
const NO_BATTERY_VOLTAGE_MAXIMUM = 1.8; // Maybe is better to add a call to MSP_BATTERY_STATE but is not available for all versions
740-
741-
if (FC.ANALOG.voltage < min && FC.ANALOG.voltage > NO_BATTERY_VOLTAGE_MAXIMUM) {
742-
$(".battery-status").addClass('state-empty').removeClass('state-ok').removeClass('state-warning');
743-
$(".battery-status").css({
744-
width: "100%",
745-
});
746-
} else {
747-
$(".battery-status").css({
748-
width: `${((FC.ANALOG.voltage - min) / (max - min) * 100)}%`,
749-
});
750-
751-
if (FC.ANALOG.voltage < warn) {
752-
$(".battery-status").addClass('state-warning').removeClass('state-empty').removeClass('state-ok');
753-
} else {
754-
$(".battery-status").addClass('state-ok').removeClass('state-warning').removeClass('state-empty');
755-
}
756-
}
731+
const min = FC.BATTERY_CONFIG.vbatmincellvoltage * nbCells;
732+
const max = FC.BATTERY_CONFIG.vbatmaxcellvoltage * nbCells;
733+
const warn = FC.BATTERY_CONFIG.vbatwarningcellvoltage * nbCells;
734+
735+
const NO_BATTERY_VOLTAGE_MAXIMUM = 1.8; // Maybe is better to add a call to MSP_BATTERY_STATE but is not available for all versions
736+
737+
if (FC.ANALOG.voltage < min && FC.ANALOG.voltage > NO_BATTERY_VOLTAGE_MAXIMUM) {
738+
$(".battery-status").addClass('state-empty').removeClass('state-ok').removeClass('state-warning');
739+
$(".battery-status").css({
740+
width: "100%",
741+
});
742+
} else {
743+
$(".battery-status").css({
744+
width: `${((FC.ANALOG.voltage - min) / (max - min) * 100)}%`,
745+
});
746+
747+
if (FC.ANALOG.voltage < warn) {
748+
$(".battery-status").addClass('state-warning').removeClass('state-empty').removeClass('state-ok');
749+
} else {
750+
$(".battery-status").addClass('state-ok').removeClass('state-warning').removeClass('state-empty');
751+
}
752+
}
753+
}
757754

758-
}
755+
if (active) {
756+
$(".linkicon").addClass('active');
757+
} else {
758+
$(".linkicon").removeClass('active');
759+
}
759760

760-
if (active) {
761-
$(".linkicon").addClass('active');
762-
} else {
763-
$(".linkicon").removeClass('active');
761+
statuswrapper.show();
762+
GUI.timeout_remove('data_refresh');
763+
startLiveDataRefreshTimer();
764+
});
764765
}
765-
766-
statuswrapper.show();
767-
GUI.timeout_remove('data_refresh');
768-
startLiveDataRefreshTimer();
769766
}
770767

771768
function specificByte(num, pos) {

src/js/tabs/motors.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ TABS.motors.initialize = function (callback) {
579579
// Amperage
580580
function power_data_pull() {
581581
motorVoltage.text(i18n.getMessage('motorsVoltageValue', [FC.ANALOG.voltage]));
582-
motorMahDrawingElement.text(i18n.getMessage('motorsADrawingValue', [FC.ANALOG.amperage.toFixed(2)]));
582+
motorMahDrawingElement.text(i18n.getMessage('motorsADrawingValue', [FC.ANALOG.amperage?.toFixed(2)]));
583583
motorMahDrawnElement.text(i18n.getMessage('motorsmAhDrawnValue', [FC.ANALOG.mAhdrawn]));
584584
}
585585

src/js/tabs/pid_tuning.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,6 +1429,7 @@ TABS.pid_tuning.initialize = function (callback) {
14291429
function process_html() {
14301430
TABS.pid_tuning.isHtmlProcessing = true;
14311431
FC.FEATURE_CONFIG.features.generateElements($('.tab-pid_tuning .features'));
1432+
self.checkUpdateProfile(false);
14321433

14331434
if (semver.lt(FC.CONFIG.apiVersion, "1.16.0") || semver.gte(FC.CONFIG.apiVersion, "1.20.0")) {
14341435
$('.tab-pid_tuning .pidTuningSuperexpoRates').hide();

0 commit comments

Comments
 (0)