Skip to content

Commit d2117cf

Browse files
committed
Fix MSP and make timeout dynamic
Add parameters to status bar Use async and await on serial_backend
1 parent 863dd3a commit d2117cf

File tree

6 files changed

+118
-111
lines changed

6 files changed

+118
-111
lines changed

src/js/msp.js

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

53+
MIN_TIMEOUT: 250,
54+
MAX_TIMEOUT: 2000,
55+
timeout: 250,
56+
processed: 0,
57+
5358
last_received_timestamp: null,
5459
listeners: [],
5560

@@ -318,25 +323,28 @@ const MSP = {
318323
if (callback_msp) {
319324
callback_msp();
320325
}
321-
return;
326+
return false;
322327
}
323328

324329
if (code === undefined || !serial.connectionId) {
325-
return;
326-
}
327-
328-
let bufferOut;
329-
if (code <= 254) {
330-
bufferOut = this.encode_message_v1(code, data);
331-
} else {
332-
bufferOut = this.encode_message_v2(code, data);
330+
return false;
333331
}
334332

335-
const obj = {'code': code, 'requestBuffer': bufferOut, 'callback': callback_msp ? callback_msp : false, 'timer': false, 'callbackOnError': doCallbackOnError};
333+
const bufferOut = code <= 254 ? this.encode_message_v1(code, data) : this.encode_message_v2(code, data);
334+
const obj = {
335+
'code': code,
336+
'requestBuffer': bufferOut,
337+
'callback': callback_msp ? callback_msp : false,
338+
'timer': false,
339+
'callbackOnError': doCallbackOnError,
340+
'start': performance.now(),
341+
};
336342

343+
MSP.processed++;
337344
let requestExists = false;
338-
for (const value of MSP.callbacks) {
339-
if (value.code === code) {
345+
346+
for (const instance of MSP.callbacks) {
347+
if (instance.code === code) {
340348
// request already exist, we will just attach
341349
requestExists = true;
342350
break;
@@ -345,18 +353,26 @@ const MSP = {
345353

346354
if (!requestExists) {
347355
obj.timer = setInterval(function () {
348-
console.warn(`MSP: data request timed-out: ${code} ID: ${serial.connectionId} TAB: ${GUI.active_tab}`);
356+
console.warn(`MSP: data request timed-out: ${code} ID: ${serial.connectionId} TAB: ${GUI.active_tab} TIMEOUT: ${MSP.timeout} PROCESSED: ${MSP.processed}`);
357+
serial.send(bufferOut, function (_sendInfo) {
358+
obj.stop = performance.now();
359+
const executionTime = Math.round(obj.stop - obj.start);
360+
MSP.timeout = Math.max(MSP.MIN_TIMEOUT, Math.min(executionTime, MSP.MAX_TIMEOUT));
361+
});
349362

350-
serial.send(bufferOut, false);
351-
}, 1000); // we should be able to define timeout in the future
363+
}, MSP.timeout);
352364
}
353365

354366
MSP.callbacks.push(obj);
355367

356368
// always send messages with data payload (even when there is a message already in the queue)
357369
if (data || !requestExists) {
370+
if (MSP.timeout > MSP.MIN_TIMEOUT) {
371+
MSP.timeout--;
372+
}
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
}
@@ -370,17 +386,18 @@ const MSP = {
370386
/**
371387
* resolves: {command: code, data: data, length: message_length}
372388
*/
373-
promise: function(code, data) {
374-
const self = this;
375-
return new Promise(function(resolve) {
376-
self.send_message(code, data, false, function(_data) {
377-
resolve(_data);
389+
promise: async function(code, data) {
390+
const self = this;
391+
392+
return new Promise(function(resolve) {
393+
self.send_message(code, data, false, function(_data) {
394+
resolve(_data);
395+
});
378396
});
379-
});
380397
},
381398
callbacks_cleanup: function () {
382-
for (let index = 0; index < this.callbacks.length; index++) {
383-
clearInterval(this.callbacks[index].timer);
399+
for (const callback of this.callbacks) {
400+
clearInterval(callback.timer);
384401
}
385402

386403
this.callbacks = [];

src/js/msp/MSPHelper.js

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

150-
TABS.pid_tuning.checkUpdateProfile(false);
151-
152150
sensor_status(FC.CONFIG.activeSensors);
153151
break;
154152
case MSPCodes.MSP_STATUS_EX:
@@ -173,8 +171,6 @@ MspHelper.prototype.process_data = function(dataHandler) {
173171
FC.CONFIG.armingDisableCount = data.readU8(); // Flag count
174172
FC.CONFIG.armingDisableFlags = data.readU32();
175173
}
176-
177-
TABS.pid_tuning.checkUpdateProfile(true);
178174
}
179175

180176
sensor_status(FC.CONFIG.activeSensors);
@@ -274,10 +270,10 @@ MspHelper.prototype.process_data = function(dataHandler) {
274270
FC.ANALOG.mAhdrawn = data.readU16();
275271
FC.ANALOG.rssi = data.readU16(); // 0-1023
276272
FC.ANALOG.amperage = data.read16() / 100; // A
277-
FC.ANALOG.last_received_timestamp = Date.now();
278273
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_41)) {
279274
FC.ANALOG.voltage = data.readU16() / 100;
280275
}
276+
FC.ANALOG.last_received_timestamp = Date.now();
281277
break;
282278
case MSPCodes.MSP_VOLTAGE_METERS:
283279
FC.VOLTAGE_METERS = [];
@@ -727,7 +723,6 @@ MspHelper.prototype.process_data = function(dataHandler) {
727723
}
728724
break;
729725
case MSPCodes.MSP_SET_MOTOR:
730-
console.log('Motor Speeds Updated');
731726
break;
732727
case MSPCodes.MSP_UID:
733728
FC.CONFIG.uid[0] = data.readU32();
@@ -1728,8 +1723,8 @@ MspHelper.prototype.process_data = function(dataHandler) {
17281723
if (self.mspMultipleCache.length > 0) {
17291724

17301725
const partialBuffer = [];
1731-
for (let i = 0; i < self.mspMultipleCache.length; i++) {
1732-
partialBuffer.push8(self.mspMultipleCache[i]);
1726+
for (const instance of self.mspMultipleCache) {
1727+
partialBuffer.push8(instance);
17331728
}
17341729

17351730
MSP.send_message(MSPCodes.MSP_MULTIPLE_MSP, partialBuffer, false, dataHandler.callbacks);
@@ -1746,11 +1741,12 @@ MspHelper.prototype.process_data = function(dataHandler) {
17461741
console.log(`Unknown code detected: ${code}`);
17471742
} else {
17481743
console.log(`FC reports unsupported message error: ${code}`);
1744+
}
17491745

1750-
if (code === MSPCodes.MSP_SET_REBOOT) {
1751-
TABS.onboard_logging.mscRebootFailedCallback();
1752-
}
1746+
if (code === MSPCodes.MSP_SET_REBOOT) {
1747+
TABS.onboard_logging.mscRebootFailedCallback();
17531748
}
1749+
17541750
} else {
17551751
console.warn(`code: ${code} - crc failed`);
17561752
}

src/js/serial_backend.js

Lines changed: 64 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ function connectCli() {
491491
$('#tabs .tab_cli a').click();
492492
}
493493

494-
function onConnect() {
494+
async function onConnect() {
495495
if ($('div#flashbutton a.flash_state').hasClass('active') && $('div#flashbutton a.flash').hasClass('active')) {
496496
$('div#flashbutton a.flash_state').removeClass('active');
497497
$('div#flashbutton a.flash').removeClass('active');
@@ -532,13 +532,12 @@ function onConnect() {
532532

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

535-
MSP.send_message(MSPCodes.MSP_FEATURE_CONFIG, false, false);
535+
await MSP.promise(MSPCodes.MSP_FEATURE_CONFIG);
536536
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_33)) {
537-
MSP.send_message(MSPCodes.MSP_BATTERY_CONFIG, false, false);
537+
await MSP.promise(MSPCodes.MSP_BATTERY_CONFIG);
538538
}
539-
MSP.send_message(MSPCodes.MSP_STATUS_EX, false, false);
540-
MSP.send_message(MSPCodes.MSP_DATAFLASH_SUMMARY, false, false);
541-
539+
await MSP.promise(semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_32) ? MSPCodes.MSP_STATUS_EX : MSPCodes.MSP_STATUS);
540+
await MSP.promise(MSPCodes.MSP_DATAFLASH_SUMMARY);
542541
if (FC.CONFIG.boardType == 0 || FC.CONFIG.boardType == 2) {
543542
startLiveDataRefreshTimer();
544543
}
@@ -686,10 +685,10 @@ function have_sensor(sensors_detected, sensor_code) {
686685

687686
function startLiveDataRefreshTimer() {
688687
// live data refresh
689-
GUI.timeout_add('data_refresh', function () { update_live_status(); }, 100);
688+
GUI.timeout_add('data_refresh', update_live_status, 100);
690689
}
691690

692-
function update_live_status() {
691+
async function update_live_status() {
693692

694693
const statuswrapper = $('#quad-status_wrapper');
695694

@@ -698,75 +697,69 @@ function update_live_status() {
698697
});
699698

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

710-
const active = ((Date.now() - FC.ANALOG.last_received_timestamp) < 300);
722+
if (FC.ANALOG != undefined) {
723+
let nbCells = Math.floor(FC.ANALOG.voltage / FC.BATTERY_CONFIG.vbatmaxcellvoltage) + 1;
711724

712-
for (let i = 0; i < FC.AUX_CONFIG.length; i++) {
713-
if (FC.AUX_CONFIG[i] === 'ARM') {
714-
if (bit_check(FC.CONFIG.mode, i)) {
715-
$(".armedicon").addClass('active');
716-
} else {
717-
$(".armedicon").removeClass('active');
725+
if (FC.ANALOG.voltage == 0) {
726+
nbCells = 1;
718727
}
719-
}
720-
if (FC.AUX_CONFIG[i] === 'FAILSAFE') {
721-
if (bit_check(FC.CONFIG.mode, i)) {
722-
$(".failsafeicon").addClass('active');
728+
729+
const min = FC.BATTERY_CONFIG.vbatmincellvoltage * nbCells;
730+
const max = FC.BATTERY_CONFIG.vbatmaxcellvoltage * nbCells;
731+
const warn = FC.BATTERY_CONFIG.vbatwarningcellvoltage * nbCells;
732+
733+
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
734+
735+
if (FC.ANALOG.voltage < min && FC.ANALOG.voltage > NO_BATTERY_VOLTAGE_MAXIMUM) {
736+
$(".battery-status").addClass('state-empty').removeClass('state-ok').removeClass('state-warning');
737+
$(".battery-status").css({
738+
width: "100%",
739+
});
723740
} else {
724-
$(".failsafeicon").removeClass('active');
741+
$(".battery-status").css({
742+
width: `${((FC.ANALOG.voltage - min) / (max - min) * 100)}%`,
743+
});
744+
745+
if (FC.ANALOG.voltage < warn) {
746+
$(".battery-status").addClass('state-warning').removeClass('state-empty').removeClass('state-ok');
747+
} else {
748+
$(".battery-status").addClass('state-ok').removeClass('state-warning').removeClass('state-empty');
749+
}
725750
}
726751
}
727-
}
728-
729-
if (FC.ANALOG != undefined) {
730-
let nbCells = Math.floor(FC.ANALOG.voltage / FC.BATTERY_CONFIG.vbatmaxcellvoltage) + 1;
731752

732-
if (FC.ANALOG.voltage == 0) {
733-
nbCells = 1;
753+
if (active) {
754+
$(".linkicon").addClass('active');
755+
} else {
756+
$(".linkicon").removeClass('active');
734757
}
735758

736-
const min = FC.BATTERY_CONFIG.vbatmincellvoltage * nbCells;
737-
const max = FC.BATTERY_CONFIG.vbatmaxcellvoltage * nbCells;
738-
const warn = FC.BATTERY_CONFIG.vbatwarningcellvoltage * nbCells;
739-
740-
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
741-
742-
if (FC.ANALOG.voltage < min && FC.ANALOG.voltage > NO_BATTERY_VOLTAGE_MAXIMUM) {
743-
$(".battery-status").addClass('state-empty').removeClass('state-ok').removeClass('state-warning');
744-
$(".battery-status").css({
745-
width: "100%",
746-
});
747-
} else {
748-
$(".battery-status").css({
749-
width: `${((FC.ANALOG.voltage - min) / (max - min) * 100)}%`,
750-
});
751-
752-
if (FC.ANALOG.voltage < warn) {
753-
$(".battery-status").addClass('state-warning').removeClass('state-empty').removeClass('state-ok');
754-
} else {
755-
$(".battery-status").addClass('state-ok').removeClass('state-warning').removeClass('state-empty');
756-
}
757-
}
758-
759+
statuswrapper.show();
760+
GUI.timeout_remove('data_refresh');
761+
startLiveDataRefreshTimer();
759762
}
760-
761-
if (active) {
762-
$(".linkicon").addClass('active');
763-
} else {
764-
$(".linkicon").removeClass('active');
765-
}
766-
767-
statuswrapper.show();
768-
GUI.timeout_remove('data_refresh');
769-
startLiveDataRefreshTimer();
770763
}
771764

772765
function specificByte(num, pos) {
@@ -846,15 +839,14 @@ function reinitializeConnection(originatorTab, callback) {
846839
let attempts = 0;
847840
const reconnect = setInterval(waitforSerial, 100);
848841

849-
function waitforSerial() {
842+
async function waitforSerial() {
850843
if (connectionTimestamp !== previousTimeStamp && CONFIGURATOR.connectionValid) {
851844
console.log(`Serial connection available after ${attempts / 10} seconds`);
852845
clearInterval(reconnect);
853-
MSP.promise(MSPCodes.MSP_STATUS).then(() => {
854-
GUI.log(i18n.getMessage('deviceReady'));
855-
originatorTab.initialize(false, $('#content').scrollTop());
856-
callback?.();
857-
});
846+
await MSP.promise(MSPCodes.MSP_STATUS);
847+
GUI.log(i18n.getMessage('deviceReady'));
848+
originatorTab.initialize(false, $('#content').scrollTop());
849+
callback?.();
858850
} else {
859851
attempts++;
860852
if (attempts > 100) {

src/js/tabs/motors.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -585,9 +585,11 @@ TABS.motors.initialize = async function (callback) {
585585

586586
// Amperage
587587
function power_data_pull() {
588-
motorVoltage.text(i18n.getMessage('motorsVoltageValue', [FC.ANALOG.voltage]));
589-
motorMahDrawingElement.text(i18n.getMessage('motorsADrawingValue', [FC.ANALOG.amperage.toFixed(2)]));
590-
motorMahDrawnElement.text(i18n.getMessage('motorsmAhDrawnValue', [FC.ANALOG.mAhdrawn]));
588+
if (FC.ANALOG.last_received_timestamp) {
589+
motorVoltage.text(i18n.getMessage('motorsVoltageValue', [FC.ANALOG.voltage]));
590+
motorMahDrawingElement.text(i18n.getMessage('motorsADrawingValue', [FC.ANALOG.amperage.toFixed(2)]));
591+
motorMahDrawnElement.text(i18n.getMessage('motorsmAhDrawnValue', [FC.ANALOG.mAhdrawn]));
592+
}
591593
}
592594

593595
GUI.interval_add('motors_power_data_pull_slow', power_data_pull, 250, true); // 4 fps

src/js/tabs/pid_tuning.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1436,6 +1436,7 @@ TABS.pid_tuning.initialize = function (callback) {
14361436
function process_html() {
14371437
TABS.pid_tuning.isHtmlProcessing = true;
14381438
FC.FEATURE_CONFIG.features.generateElements($('.tab-pid_tuning .features'));
1439+
self.checkUpdateProfile(false);
14391440

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

src/main.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,6 @@
396396
:i2c-error="FC.CONFIG.i2cError"
397397
:cycle-time="FC.CONFIG.cycleTime"
398398
:cpu-load="FC.CONFIG.cpuload"
399-
400399
:configurator-version="CONFIGURATOR.getDisplayVersion()"
401400
:firmware-version="FC.CONFIG.flightControllerVersion"
402401
:firmware-id="FC.CONFIG.flightControllerIdentifier"

0 commit comments

Comments
 (0)