mirror of
https://github.com/betaflight/betaflight-configurator.git
synced 2025-07-16 12:55:14 +03:00
Implemented support for MSP jumbo frames, switched dataflash reading to be using jumbo frames.
This commit is contained in:
parent
e61ef7bb93
commit
ca772a0896
6 changed files with 84 additions and 22 deletions
47
js/msp.js
47
js/msp.js
|
@ -10,6 +10,7 @@ var MSP = {
|
||||||
message_buffer: null,
|
message_buffer: null,
|
||||||
message_buffer_uint8_view: null,
|
message_buffer_uint8_view: null,
|
||||||
message_checksum: 0,
|
message_checksum: 0,
|
||||||
|
messageIsJumboFrame: false,
|
||||||
|
|
||||||
callbacks: [],
|
callbacks: [],
|
||||||
packet_error: 0,
|
packet_error: 0,
|
||||||
|
@ -17,6 +18,8 @@ var MSP = {
|
||||||
|
|
||||||
last_received_timestamp: null,
|
last_received_timestamp: null,
|
||||||
listeners: [],
|
listeners: [],
|
||||||
|
|
||||||
|
JUMBO_FRAME_SIZE_LIMIT: 255,
|
||||||
|
|
||||||
read: function (readInfo) {
|
read: function (readInfo) {
|
||||||
var data = new Uint8Array(readInfo.data);
|
var data = new Uint8Array(readInfo.data);
|
||||||
|
@ -50,13 +53,12 @@ var MSP = {
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
this.message_length_expected = data[i];
|
this.message_length_expected = data[i];
|
||||||
|
if (this.message_length_expected === this.JUMBO_FRAME_SIZE_LIMIT) {
|
||||||
|
this.messageIsJumboFrame = true;
|
||||||
|
}
|
||||||
|
|
||||||
this.message_checksum = data[i];
|
this.message_checksum = data[i];
|
||||||
|
|
||||||
// setup arraybuffer
|
|
||||||
this.message_buffer = new ArrayBuffer(this.message_length_expected);
|
|
||||||
this.message_buffer_uint8_view = new Uint8Array(this.message_buffer);
|
|
||||||
|
|
||||||
this.state++;
|
this.state++;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
|
@ -65,13 +67,39 @@ var MSP = {
|
||||||
|
|
||||||
if (this.message_length_expected > 0) {
|
if (this.message_length_expected > 0) {
|
||||||
// process payload
|
// process payload
|
||||||
this.state++;
|
if (this.messageIsJumboFrame) {
|
||||||
|
this.state++;
|
||||||
|
} else {
|
||||||
|
this.state = this.state + 3;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// no payload
|
// no payload
|
||||||
this.state += 2;
|
this.state += 5;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 5: // payload
|
case 5:
|
||||||
|
this.message_length_expected = data[i];
|
||||||
|
|
||||||
|
this.message_checksum ^= data[i];
|
||||||
|
|
||||||
|
this.state++;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
this.message_length_expected = this.message_length_expected + 256 * data[i];
|
||||||
|
|
||||||
|
this.message_checksum ^= data[i];
|
||||||
|
|
||||||
|
this.state++;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
// setup arraybuffer
|
||||||
|
this.message_buffer = new ArrayBuffer(this.message_length_expected);
|
||||||
|
this.message_buffer_uint8_view = new Uint8Array(this.message_buffer);
|
||||||
|
|
||||||
|
this.state++;
|
||||||
|
case 8: // payload
|
||||||
this.message_buffer_uint8_view[this.message_length_received] = data[i];
|
this.message_buffer_uint8_view[this.message_length_received] = data[i];
|
||||||
this.message_checksum ^= data[i];
|
this.message_checksum ^= data[i];
|
||||||
this.message_length_received++;
|
this.message_length_received++;
|
||||||
|
@ -80,7 +108,7 @@ var MSP = {
|
||||||
this.state++;
|
this.state++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 9:
|
||||||
if (this.message_checksum == data[i]) {
|
if (this.message_checksum == data[i]) {
|
||||||
// message received, store dataview
|
// message received, store dataview
|
||||||
this.dataView = new DataView(this.message_buffer, 0, this.message_length_expected);
|
this.dataView = new DataView(this.message_buffer, 0, this.message_length_expected);
|
||||||
|
@ -92,6 +120,7 @@ var MSP = {
|
||||||
// Reset variables
|
// Reset variables
|
||||||
this.message_length_received = 0;
|
this.message_length_received = 0;
|
||||||
this.state = 0;
|
this.state = 0;
|
||||||
|
this.messageIsJumboFrame = false;
|
||||||
this.notify();
|
this.notify();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -210,4 +239,4 @@ var MSP = {
|
||||||
|
|
||||||
this.callbacks_cleanup();
|
this.callbacks_cleanup();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -446,6 +446,8 @@ MspHelper.prototype.process_data = function(dataHandler) {
|
||||||
'115200',
|
'115200',
|
||||||
'230400',
|
'230400',
|
||||||
'250000',
|
'250000',
|
||||||
|
'500000',
|
||||||
|
'1000000'
|
||||||
];
|
];
|
||||||
if (semver.lt(CONFIG.apiVersion, "1.6.0")) {
|
if (semver.lt(CONFIG.apiVersion, "1.6.0")) {
|
||||||
SERIAL_CONFIG.ports = [];
|
SERIAL_CONFIG.ports = [];
|
||||||
|
@ -1046,6 +1048,8 @@ MspHelper.prototype.crunch = function(code) {
|
||||||
'115200',
|
'115200',
|
||||||
'230400',
|
'230400',
|
||||||
'250000',
|
'250000',
|
||||||
|
'500000',
|
||||||
|
'1000000'
|
||||||
]; //TODO, instead of lookuptable, this should be sent as uint32
|
]; //TODO, instead of lookuptable, this should be sent as uint32
|
||||||
var serialPortFunctions = {
|
var serialPortFunctions = {
|
||||||
'MSP': 0,
|
'MSP': 0,
|
||||||
|
@ -1205,17 +1209,29 @@ MspHelper.prototype.setRawRx = function(channels) {
|
||||||
* Send a request to read a block of data from the dataflash at the given address and pass that address and a dataview
|
* Send a request to read a block of data from the dataflash at the given address and pass that address and a dataview
|
||||||
* of the returned data to the given callback (or null for the data if an error occured).
|
* of the returned data to the given callback (or null for the data if an error occured).
|
||||||
*/
|
*/
|
||||||
MspHelper.prototype.dataflashRead = function(address, onDataCallback) {
|
MspHelper.prototype.dataflashRead = function(address, blockSize, onDataCallback) {
|
||||||
MSP.send_message(MSPCodes.MSP_DATAFLASH_READ, [address & 0xFF, (address >> 8) & 0xFF, (address >> 16) & 0xFF, (address >> 24) & 0xFF],
|
var outData = [address & 0xFF, (address >> 8) & 0xFF, (address >> 16) & 0xFF, (address >> 24) & 0xFF];
|
||||||
false, function(response) {
|
|
||||||
|
if (semver.gte(CONFIG.flightControllerVersion, "3.1.0")) {
|
||||||
|
outData = outData.concat([blockSize & 0xFF, (blockSize >> 8) & 0xFF]);
|
||||||
|
}
|
||||||
|
|
||||||
|
MSP.send_message(MSPCodes.MSP_DATAFLASH_READ, outData, false, function(response) {
|
||||||
var chunkAddress = response.data.readU32();
|
var chunkAddress = response.data.readU32();
|
||||||
|
|
||||||
|
var headerSize = 4;
|
||||||
|
var dataSize = response.data.buffer.byteLength - headerSize;
|
||||||
|
if (semver.gte(CONFIG.flightControllerVersion, "3.1.0")) {
|
||||||
|
headerSize = headerSize + 2;
|
||||||
|
dataSize = response.data.readU16();
|
||||||
|
}
|
||||||
|
|
||||||
// Verify that the address of the memory returned matches what the caller asked for
|
// Verify that the address of the memory returned matches what the caller asked for
|
||||||
if (chunkAddress == address) {
|
if (chunkAddress == address) {
|
||||||
/* Strip that address off the front of the reply and deliver it separately so the caller doesn't have to
|
/* Strip that address off the front of the reply and deliver it separately so the caller doesn't have to
|
||||||
* figure out the reply format:
|
* figure out the reply format:
|
||||||
*/
|
*/
|
||||||
onDataCallback(address, new DataView(response.data.buffer, response.data.byteOffset + 4, response.data.buffer.byteLength - 4));
|
onDataCallback(address, new DataView(response.data.buffer, response.data.byteOffset + headerSize, dataSize));
|
||||||
} else {
|
} else {
|
||||||
// Report error
|
// Report error
|
||||||
onDataCallback(address, null);
|
onDataCallback(address, null);
|
||||||
|
|
|
@ -116,6 +116,9 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="dropdown dropdown-dark">
|
<div class="dropdown dropdown-dark">
|
||||||
<select class="dropdown-select" id="baud" title="Baud Rate">
|
<select class="dropdown-select" id="baud" title="Baud Rate">
|
||||||
|
<option value="1000000">1000000</option>
|
||||||
|
<option value="500000">500000</option>
|
||||||
|
<option value="250000">250000</option>
|
||||||
<option value="115200" selected="selected">115200</option>
|
<option value="115200" selected="selected">115200</option>
|
||||||
<option value="57600">57600</option>
|
<option value="57600">57600</option>
|
||||||
<option value="38400">38400</option>
|
<option value="38400">38400</option>
|
||||||
|
|
|
@ -117,6 +117,7 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
chrome.storage.local.get('selected_board', function (result) {
|
chrome.storage.local.get('selected_board', function (result) {
|
||||||
if (result.selected_board) {
|
if (result.selected_board) {
|
||||||
$('select[name="board"]').val(result.selected_board);
|
$('select[name="board"]').val(result.selected_board);
|
||||||
|
$('select[name="board"]').trigger("change");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,7 +4,8 @@ var
|
||||||
sdcardTimer;
|
sdcardTimer;
|
||||||
|
|
||||||
TABS.onboard_logging = {
|
TABS.onboard_logging = {
|
||||||
available: false
|
available: false,
|
||||||
|
BLOCK_SIZE: 4096
|
||||||
};
|
};
|
||||||
TABS.onboard_logging.initialize = function (callback) {
|
TABS.onboard_logging.initialize = function (callback) {
|
||||||
var
|
var
|
||||||
|
@ -313,7 +314,12 @@ TABS.onboard_logging.initialize = function (callback) {
|
||||||
$(".dataflash-saving")[0].close();
|
$(".dataflash-saving")[0].close();
|
||||||
}
|
}
|
||||||
|
|
||||||
function mark_saving_dialog_done() {
|
function mark_saving_dialog_done(startTime, totalBytes) {
|
||||||
|
var totalTime = (new Date().getTime() - startTime) / 1000;
|
||||||
|
console.log('Received ' + totalBytes + ' bytes in ' + totalTime.toFixed(2) + 's ('
|
||||||
|
+ (totalBytes / totalTime / 1024).toFixed(2) + 'kB / s) with block size ' + self.BLOCK_SIZE + '.');
|
||||||
|
|
||||||
|
|
||||||
$(".dataflash-saving").addClass("done");
|
$(".dataflash-saving").addClass("done");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -356,26 +362,27 @@ TABS.onboard_logging.initialize = function (callback) {
|
||||||
if (saveCancelled) {
|
if (saveCancelled) {
|
||||||
dismiss_saving_dialog();
|
dismiss_saving_dialog();
|
||||||
} else {
|
} else {
|
||||||
mark_saving_dialog_done();
|
mark_saving_dialog_done(startTime, nextAddress);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mspHelper.dataflashRead(nextAddress, onChunkRead);
|
mspHelper.dataflashRead(nextAddress, self.BLOCK_SIZE, onChunkRead);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
fileWriter.write(blob);
|
fileWriter.write(blob);
|
||||||
} else {
|
} else {
|
||||||
// A zero-byte block indicates end-of-file, so we're done
|
// A zero-byte block indicates end-of-file, so we're done
|
||||||
mark_saving_dialog_done();
|
mark_saving_dialog_done(startTime, nextAddress);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// There was an error with the received block (address didn't match the one we asked for), retry
|
// There was an error with the received block (address didn't match the one we asked for), retry
|
||||||
mspHelper.dataflashRead(nextAddress, onChunkRead);
|
mspHelper.dataflashRead(nextAddress, self.BLOCK_SIZE, onChunkRead);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var startTime = new Date().getTime();
|
||||||
// Fetch the initial block
|
// Fetch the initial block
|
||||||
mspHelper.dataflashRead(nextAddress, onChunkRead);
|
mspHelper.dataflashRead(nextAddress, self.BLOCK_SIZE, onChunkRead);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,9 +39,15 @@ TABS.ports.initialize = function (callback, scrollPosition) {
|
||||||
'19200',
|
'19200',
|
||||||
'38400',
|
'38400',
|
||||||
'57600',
|
'57600',
|
||||||
'115200'
|
'115200',
|
||||||
|
'230400',
|
||||||
|
'250000'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
if (semver.gte(CONFIG.flightControllerVersion, "3.1.0")) {
|
||||||
|
mspBaudRates = mspBaudRates.concat(['500000', '1000000']);
|
||||||
|
}
|
||||||
|
|
||||||
var gpsBaudRates = [
|
var gpsBaudRates = [
|
||||||
'9600',
|
'9600',
|
||||||
'19200',
|
'19200',
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue