Skip to content

Commit

Permalink
Fix MSP and make timeout dynamic
Browse files Browse the repository at this point in the history
  • Loading branch information
haslinghuis committed Mar 5, 2022
1 parent 5b1845f commit 7eacc70
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 81 deletions.
46 changes: 42 additions & 4 deletions src/js/msp.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ const MSP = {
packet_error: 0,
unsupported: 0,

MIN_TIMEOUT: 100,
MAX_TIMEOUT: 1000,
timeout: 100,

last_received_timestamp: null,
listeners: [],

Expand Down Expand Up @@ -343,20 +347,54 @@ const MSP = {
}
}

obj.start = performance.now();

function getKeyByValue(object, value) {
return Object.keys(object).find(key => object[key] === value);
}

console.log('--------------------------------');
console.log(`PROCESSING NEW CODE: ${code} ${getKeyByValue(MSPCodes, code)}`);

function getQueue() {
let codes = '';
if (MSP.callbacks.length) {
codes += `QUEUE: ${MSP.callbacks.length} CALLBACKS: `;
for (let i = 0; i < MSP.callbacks.length; i++) {
codes += `${code} `;
codes += `(${getKeyByValue(MSPCodes, MSP.callbacks[i].code)}) `;
}
}

return codes;
}


if (!requestExists) {
obj.timer = setInterval(function () {
console.warn(`MSP: data request timed-out: ${code} ID: ${serial.connectionId} TAB: ${GUI.active_tab}`);
console.warn(`MSP: data request timed-out: ${code} ID: ${serial.connectionId} TAB: ${GUI.active_tab} TIMEOUT: ${MSP.timeout} ${getQueue()}`);

serial.send(bufferOut, false);
}, 1000); // we should be able to define timeout in the future
serial.send(bufferOut, function (_sendInfo) {
obj.stop = performance.now();
// const previousTimeout = MSP.timeout;
const executionTime = Math.round(obj.stop - obj.start);
MSP.timeout = Math.max(MSP.MIN_TIMEOUT, Math.min(executionTime, MSP.MAX_TIMEOUT));
console.log(`SENDING CODE FROM QUEUE: ${code}`);
// console.log(`MSP: QUEUED Sent code ${obj.code} Setting new MSP timeout: ${MSP.timeout} PREVIOUS: ${previousTimeout} ${getQueue()}`);
});
}, MSP.timeout); // we should be able to define timeout in the future
}

MSP.callbacks.push(obj);

// always send messages with data payload (even when there is a message already in the queue)
if (data || !requestExists) {
if (MSP.timeout > MSP.MIN_TIMEOUT) {
MSP.timeout--;
}
serial.send(bufferOut, function (sendInfo) {
if (sendInfo.bytesSent == bufferOut.byteLength) {
console.log(`SENDING CODE DIRECT: ${code}`);
if (sendInfo.bytesSent === bufferOut.byteLength) {
if (callback_sent) {
callback_sent();
}
Expand Down
4 changes: 0 additions & 4 deletions src/js/msp/MSPHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,6 @@ MspHelper.prototype.process_data = function(dataHandler) {
FC.CONFIG.mode = data.readU32();
FC.CONFIG.profile = data.readU8();

TABS.pid_tuning.checkUpdateProfile(false);

sensor_status(FC.CONFIG.activeSensors);
break;
case MSPCodes.MSP_STATUS_EX:
Expand All @@ -172,8 +170,6 @@ MspHelper.prototype.process_data = function(dataHandler) {
FC.CONFIG.armingDisableCount = data.readU8(); // Flag count
FC.CONFIG.armingDisableFlags = data.readU32();
}

TABS.pid_tuning.checkUpdateProfile(true);
}

sensor_status(FC.CONFIG.activeSensors);
Expand Down
143 changes: 70 additions & 73 deletions src/js/serial_backend.js
Original file line number Diff line number Diff line change
Expand Up @@ -531,16 +531,16 @@ function onConnect() {

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

MSP.send_message(MSPCodes.MSP_FEATURE_CONFIG, false, false);
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_33)) {
MSP.send_message(MSPCodes.MSP_BATTERY_CONFIG, false, false);
}
MSP.send_message(MSPCodes.MSP_STATUS_EX, false, false);
MSP.send_message(MSPCodes.MSP_DATAFLASH_SUMMARY, false, false);

if (FC.CONFIG.boardType == 0 || FC.CONFIG.boardType == 2) {
startLiveDataRefreshTimer();
}
Promise.resolve(true)
.then(() => MSP.promise(MSPCodes.MSP_FEATURE_CONFIG))
.then(() => semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_33) ? MSP.promise(MSPCodes.MSP_BATTERY_CONFIG) : true)
.then(() => MSP.promise(semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_32) ? MSPCodes.MSP_STATUS_EX : MSPCodes.MSP_STATUS))
.then(() => MSP.promise(MSPCodes.MSP_DATAFLASH_SUMMARY))
.then(() => {
if (FC.CONFIG.boardType == 0 || FC.CONFIG.boardType == 2) {
startLiveDataRefreshTimer();
}
});
}

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

function startLiveDataRefreshTimer() {
// live data refresh
GUI.timeout_add('data_refresh', function () { update_live_status(); }, 100);
GUI.timeout_add('data_refresh', update_live_status, 100);
}

function update_live_status() {
Expand All @@ -697,75 +697,72 @@ function update_live_status() {
});

if (GUI.active_tab !== 'cli' && GUI.active_tab !== 'presets') {
MSP.send_message(MSPCodes.MSP_BOXNAMES, false, false);
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_32)) {
MSP.send_message(MSPCodes.MSP_STATUS_EX, false, false);
} else {
MSP.send_message(MSPCodes.MSP_STATUS, false, false);
}
MSP.send_message(MSPCodes.MSP_ANALOG, false, false);
}

const active = ((Date.now() - FC.ANALOG.last_received_timestamp) < 300);

for (let i = 0; i < FC.AUX_CONFIG.length; i++) {
if (FC.AUX_CONFIG[i] === 'ARM') {
if (bit_check(FC.CONFIG.mode, i)) {
$(".armedicon").addClass('active');
} else {
$(".armedicon").removeClass('active');
}
}
if (FC.AUX_CONFIG[i] === 'FAILSAFE') {
if (bit_check(FC.CONFIG.mode, i)) {
$(".failsafeicon").addClass('active');
} else {
$(".failsafeicon").removeClass('active');
Promise.resolve(true)
.then(() => MSP.promise(MSPCodes.MSP_BOXNAMES))
.then(() => MSP.promise(semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_32) ? MSPCodes.MSP_STATUS_EX : MSPCodes.MSP_STATUS))
.then(() => MSP.promise(MSPCodes.MSP_ANALOG))
.then(() => {
const active = ((Date.now() - FC.ANALOG.last_received_timestamp) < 300);

for (let i = 0; i < FC.AUX_CONFIG.length; i++) {
if (FC.AUX_CONFIG[i] === 'ARM') {
if (bit_check(FC.CONFIG.mode, i)) {
$(".armedicon").addClass('active');
} else {
$(".armedicon").removeClass('active');
}
}
if (FC.AUX_CONFIG[i] === 'FAILSAFE') {
if (bit_check(FC.CONFIG.mode, i)) {
$(".failsafeicon").addClass('active');
} else {
$(".failsafeicon").removeClass('active');
}
}
}
}
}

if (FC.ANALOG != undefined) {
let nbCells = Math.floor(FC.ANALOG.voltage / FC.BATTERY_CONFIG.vbatmaxcellvoltage) + 1;
if (FC.ANALOG != undefined) {
let nbCells = Math.floor(FC.ANALOG.voltage / FC.BATTERY_CONFIG.vbatmaxcellvoltage) + 1;

if (FC.ANALOG.voltage == 0) {
nbCells = 1;
}
if (FC.ANALOG.voltage == 0) {
nbCells = 1;
}

const min = FC.BATTERY_CONFIG.vbatmincellvoltage * nbCells;
const max = FC.BATTERY_CONFIG.vbatmaxcellvoltage * nbCells;
const warn = FC.BATTERY_CONFIG.vbatwarningcellvoltage * nbCells;

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

if (FC.ANALOG.voltage < min && FC.ANALOG.voltage > NO_BATTERY_VOLTAGE_MAXIMUM) {
$(".battery-status").addClass('state-empty').removeClass('state-ok').removeClass('state-warning');
$(".battery-status").css({
width: "100%",
});
} else {
$(".battery-status").css({
width: `${((FC.ANALOG.voltage - min) / (max - min) * 100)}%`,
});

if (FC.ANALOG.voltage < warn) {
$(".battery-status").addClass('state-warning').removeClass('state-empty').removeClass('state-ok');
} else {
$(".battery-status").addClass('state-ok').removeClass('state-warning').removeClass('state-empty');
}
}
const min = FC.BATTERY_CONFIG.vbatmincellvoltage * nbCells;
const max = FC.BATTERY_CONFIG.vbatmaxcellvoltage * nbCells;
const warn = FC.BATTERY_CONFIG.vbatwarningcellvoltage * nbCells;

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

if (FC.ANALOG.voltage < min && FC.ANALOG.voltage > NO_BATTERY_VOLTAGE_MAXIMUM) {
$(".battery-status").addClass('state-empty').removeClass('state-ok').removeClass('state-warning');
$(".battery-status").css({
width: "100%",
});
} else {
$(".battery-status").css({
width: `${((FC.ANALOG.voltage - min) / (max - min) * 100)}%`,
});

if (FC.ANALOG.voltage < warn) {
$(".battery-status").addClass('state-warning').removeClass('state-empty').removeClass('state-ok');
} else {
$(".battery-status").addClass('state-ok').removeClass('state-warning').removeClass('state-empty');
}
}
}

}
if (active) {
$(".linkicon").addClass('active');
} else {
$(".linkicon").removeClass('active');
}

if (active) {
$(".linkicon").addClass('active');
} else {
$(".linkicon").removeClass('active');
statuswrapper.show();
GUI.timeout_remove('data_refresh');
startLiveDataRefreshTimer();
});
}

statuswrapper.show();
GUI.timeout_remove('data_refresh');
startLiveDataRefreshTimer();
}

function specificByte(num, pos) {
Expand Down
1 change: 1 addition & 0 deletions src/js/tabs/pid_tuning.js
Original file line number Diff line number Diff line change
Expand Up @@ -1429,6 +1429,7 @@ TABS.pid_tuning.initialize = function (callback) {
function process_html() {
TABS.pid_tuning.isHtmlProcessing = true;
FC.FEATURE_CONFIG.features.generateElements($('.tab-pid_tuning .features'));
self.checkUpdateProfile(false);

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

0 comments on commit 7eacc70

Please sign in to comment.