1
0
Fork 0
mirror of https://github.com/betaflight/betaflight-configurator.git synced 2025-07-25 17:25:16 +03:00

Merge pull request #281 from mikeller/msp_dataflash_jumbo_frames

Implemented support for MSP jumbo frames, switched dataflash reading to be using jumbo frames.
This commit is contained in:
Michael Keller 2016-09-15 09:29:58 +12:00 committed by GitHub
commit 7753e81415
5 changed files with 83 additions and 22 deletions

View file

@ -10,6 +10,7 @@ var MSP = {
message_buffer: null,
message_buffer_uint8_view: null,
message_checksum: 0,
messageIsJumboFrame: false,
callbacks: [],
packet_error: 0,
@ -17,6 +18,8 @@ var MSP = {
last_received_timestamp: null,
listeners: [],
JUMBO_FRAME_SIZE_LIMIT: 255,
read: function (readInfo) {
var data = new Uint8Array(readInfo.data);
@ -50,13 +53,12 @@ var MSP = {
break;
case 3:
this.message_length_expected = data[i];
if (this.message_length_expected === this.JUMBO_FRAME_SIZE_LIMIT) {
this.messageIsJumboFrame = true;
}
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++;
break;
case 4:
@ -65,13 +67,39 @@ var MSP = {
if (this.message_length_expected > 0) {
// process payload
this.state++;
if (this.messageIsJumboFrame) {
this.state++;
} else {
this.state = this.state + 3;
}
} else {
// no payload
this.state += 2;
this.state += 5;
}
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_checksum ^= data[i];
this.message_length_received++;
@ -80,7 +108,7 @@ var MSP = {
this.state++;
}
break;
case 6:
case 9:
if (this.message_checksum == data[i]) {
// message received, store dataview
this.dataView = new DataView(this.message_buffer, 0, this.message_length_expected);
@ -92,6 +120,7 @@ var MSP = {
// Reset variables
this.message_length_received = 0;
this.state = 0;
this.messageIsJumboFrame = false;
this.notify();
break;
@ -210,4 +239,4 @@ var MSP = {
this.callbacks_cleanup();
}
};
};

View file

@ -446,6 +446,8 @@ MspHelper.prototype.process_data = function(dataHandler) {
'115200',
'230400',
'250000',
'500000',
'1000000'
];
if (semver.lt(CONFIG.apiVersion, "1.6.0")) {
SERIAL_CONFIG.ports = [];
@ -1046,6 +1048,8 @@ MspHelper.prototype.crunch = function(code) {
'115200',
'230400',
'250000',
'500000',
'1000000'
]; //TODO, instead of lookuptable, this should be sent as uint32
var serialPortFunctions = {
'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
* of the returned data to the given callback (or null for the data if an error occured).
*/
MspHelper.prototype.dataflashRead = function(address, onDataCallback) {
MSP.send_message(MSPCodes.MSP_DATAFLASH_READ, [address & 0xFF, (address >> 8) & 0xFF, (address >> 16) & 0xFF, (address >> 24) & 0xFF],
false, function(response) {
MspHelper.prototype.dataflashRead = function(address, blockSize, onDataCallback) {
var outData = [address & 0xFF, (address >> 8) & 0xFF, (address >> 16) & 0xFF, (address >> 24) & 0xFF];
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 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
if (chunkAddress == address) {
/* 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:
*/
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 {
// Report error
onDataCallback(address, null);