From 292029ebcd2f9a64122385ae9da93294da470135 Mon Sep 17 00:00:00 2001 From: cTn Date: Mon, 8 Apr 2013 19:09:10 +0200 Subject: [PATCH] extending serial backend (far from finished) --- js/serial_backend.js | 226 +++++++++++++++++++++++++++++++++---------- 1 file changed, 174 insertions(+), 52 deletions(-) diff --git a/js/serial_backend.js b/js/serial_backend.js index 911cc7f8a2..d12d292a29 100644 --- a/js/serial_backend.js +++ b/js/serial_backend.js @@ -1,6 +1,50 @@ var connectionId = -1; var connection_delay = 0; // delay which defines "when" will the configurator request configurator data after connection was established +var MSP_codes = { + MSP_IDENT: 100, + MSP_STATUS: 101, + MSP_RAW_IMU: 102, + MSP_SERVO: 103, + MSP_MOTOR: 104, + MSP_RC: 105, + MSP_RAW_GPS: 106, + MSP_COMP_GPS: 107, + MSP_ATTITUDE: 108, + MSP_ALTITUDE: 109, + MSP_BAT: 110, + MSP_RC_TUNING: 111, + MSP_PID: 112, + MSP_BOX: 113, + MSP_MISC: 114, + MSP_MOTOR_PINS: 115, + MSP_BOXNAMES: 116, + MSP_PIDNAMES: 117, + + MSP_SET_RAW_RC: 200, + MSP_SET_RAW_GPS: 201, + MSP_SET_PID: 202, + MSP_SET_BOX: 203, + MSP_SET_RC_TUNING: 204, + MSP_ACC_CALIBRATION: 205, + MSP_MAG_CALIBRATION: 206, + MSP_SET_MISC: 207, + MSP_RESET_CONF: 208, + MSP_SELECT_SETTING: 210, + + MSP_BIND: 240, + + MSP_EEPROM_WRITE: 250, + + MSP_DEBUGMSG: 253, + MSP_DEBUG: 254 +}; + +var CONFIG = { + version: 0, + multiType: 0 +}; + $(document).ready(function() { port_picker = $('div#port-picker .port select'); baud_picker = $('div#port-picker #baud'); @@ -77,7 +121,9 @@ function onOpen(openInfo) { serial_poll = setInterval(readPoll, 10); // should request some sort of configuration data - send_message(MSP_codes.MSP_ACC_CALIBRATION, 205); + //send_message(MSP_codes.MSP_ACC_CALIBRATION, MSP_codes.MSP_ACC_CALIBRATION); + send_message(MSP_codes.MSP_IDENT, MSP_codes.MSP_IDENT); + //send_message(MSP_codes.MSP_BOXNAMES, MSP_codes.MSP_BOXNAMES); }, connection_delay * 1000); } @@ -105,6 +151,7 @@ var message_length_expected = 0; var message_length_received = 0; var message_buffer; var message_buffer_uint8_view; +var message_checksum = 0; function onCharRead(readInfo) { if (readInfo && readInfo.bytesRead > 0 && readInfo.data) { @@ -136,6 +183,8 @@ function onCharRead(readInfo) { case 3: message_length_expected = data[i]; // data length + message_checksum = data[i]; + // setup arraybuffer message_buffer = new ArrayBuffer(message_length_expected); message_buffer_uint8_view = new Uint8Array(message_buffer); @@ -144,67 +193,38 @@ function onCharRead(readInfo) { break; case 4: message_code = data[i]; // code + message_checksum ^= data[i]; - message_state++; + if (message_length_expected != 0) { // standard message + message_state++; + } else { // MSP_ACC_CALIBRATION, etc... + message_state += 2; + } break; case 5: // data / payload message_buffer_uint8_view[message_length_received] = data[i]; + message_checksum ^= data[i]; message_length_received++; if (message_length_received >= message_length_expected) { - // message received, process - console.log(message_code); - console.log(message_buffer_uint8_view); - - // Reset variables - message_length_received = 0; - message_state = 0; + message_state++; } break; + case 6: // CRC + if (message_checksum == data[i]) { + // process data + process_message(message_code, message_buffer_uint8_view); + } + + // Reset variables + message_length_received = 0; + message_state = 0; + break; } } - } + } } -var MSP_codes = { - MSP_IDENT: 100, - MSP_STATUS: 101, - MSP_RAW_IMU: 102, - MSP_SERVO: 103, - MSP_MOTOR: 104, - MSP_RC: 105, - MSP_RAW_GPS: 106, - MSP_COMP_GPS: 107, - MSP_ATTITUDE: 108, - MSP_ALTITUDE: 109, - MSP_BAT: 110, - MSP_RC_TUNING: 111, - MSP_PID: 112, - MSP_BOX: 113, - MSP_MISC: 114, - MSP_MOTOR_PINS: 115, - MSP_BOXNAMES: 116, - MSP_PIDNAMES: 117, - - MSP_SET_RAW_RC: 200, - MSP_SET_RAW_GPS: 201, - MSP_SET_PID: 202, - MSP_SET_BOX: 203, - MSP_SET_RC_TUNING: 204, - MSP_ACC_CALIBRATION: 205, - MSP_MAG_CALIBRATION: 206, - MSP_SET_MISC: 207, - MSP_RESET_CONF: 208, - MSP_SELECT_SETTING: 210, - - MSP_BIND: 240, - - MSP_EEPROM_WRITE: 250, - - MSP_DEBUGMSG: 253, - MSP_DEBUG: 254 -}; - function send_message(code, data, bytes_n) { if (typeof data === 'array') { // array portion of this code is untested var size = 6 + data.length; @@ -219,11 +239,11 @@ function send_message(code, data, bytes_n) { bufView[3] = data.length; // data length bufView[4] = code; // code - checksum = bufView[3] | bufView[4]; + checksum = bufView[3] ^ bufView[4]; for (var i = 5; i < data.length; i++) { bufView[i] = data[i - 5]; - checksum |= bufView[i]; + checksum ^= bufView[i]; } bufView[5 + data.length] = checksum; @@ -237,10 +257,112 @@ function send_message(code, data, bytes_n) { bufView[3] = bytes_n; // data length bufView[4] = code; // code bufView[5] = data; // data - bufView[6] = bufView[3] | bufView[4] | bufView[5]; // checksum + bufView[6] = bufView[3] ^ bufView[4] ^ bufView[5]; // checksum } chrome.serial.write(connectionId, bufferOut, function(writeInfo) { console.log("Wrote: " + writeInfo.bytesWritten + " bytes"); }); +} + +function process_message(code, data) { + switch (code) { + case MSP_codes.MSP_IDENT: + CONFIG.version = data[0]; + CONFIG.multiType = data[1]; + break; + case MSP_codes.MSP_STATUS: + console.log(data); + break; + case MSP_codes.MSP_RAW_IMU: + console.log(data); + break; + case MSP_codes.MSP_SERVO: + console.log(data); + break; + case MSP_codes.MSP_MOTOR: + console.log(data); + break; + case MSP_codes.MSP_RC: + console.log(data); + break; + case MSP_codes.MSP_RAW_GPS: + console.log(data); + break; + case MSP_codes.MSP_COMP_GPS: + console.log(data); + break; + case MSP_codes.MSP_ATTITUDE: + console.log(data); + break; + case MSP_codes.MSP_ALTITUDE: + console.log(data); + break; + case MSP_codes.MSP_BAT: + console.log(data); + break; + case MSP_codes.MSP_RC_TUNING: + console.log(data); + break; + case MSP_codes.MSP_PID: + console.log(data); + break; + case MSP_codes.MSP_BOX: + console.log(data); + break; + case MSP_codes.MSP_MISC: + console.log(data); + break; + case MSP_codes.MSP_MOTOR_PINS: + console.log(data); + break; + case MSP_codes.MSP_BOXNAMES: + console.log(data); + break; + case MSP_codes.MSP_PIDNAMES: + console.log(data); + break; + case MSP_codes.MSP_SET_RAW_RC: + console.log(data); + break; + case MSP_codes.MSP_SET_RAW_GPS: + console.log(data); + break; + case MSP_codes.MSP_SET_PID: + console.log(data); + break; + case MSP_codes.MSP_SET_BOX: + console.log(data); + break; + case MSP_codes.MSP_SET_RC_TUNING: + console.log(data); + break; + case MSP_codes.MSP_ACC_CALIBRATION: + console.log('Accel calibration finished'); + break; + case MSP_codes.MSP_MAG_CALIBRATION: + console.log('Mag calibration finished'); + break; + case MSP_codes.MSP_SET_MISC: + console.log(data); + break; + case MSP_codes.MSP_RESET_CONF: + console.log(data); + break; + case MSP_codes.MSP_SELECT_SETTING: + console.log(data); + break; + case MSP_codes.MSP_BIND: + console.log(data); + break; + case MSP_codes.MSP_EEPROM_WRITE: + console.log(data); + break; + case MSP_codes.MSP_DEBUGMSG: + console.log(data); + break; + case MSP_codes.MSP_DEBUG: + console.log(data); + break; + } } \ No newline at end of file