From 5410c1293f99f570f238709a52081a485d7c4f4e Mon Sep 17 00:00:00 2001 From: Ryan Boland Date: Tue, 5 Jul 2016 17:09:31 -0400 Subject: [PATCH] upgrade js packages; add flight data monitoring --- .gitignore | 1 + src/battery_monitor.cpp | 1 + src/flight_controller.h | 4 ++-- src/serial_commands.cpp | 13 +++++++++++++ ui/app/components/MotorChart.jsx | 4 ++-- ui/app/components/Toolbar.jsx | 2 +- ui/app/components/TuningTab.jsx | 31 ++++++++++++++++++++++++------- ui/app/index.js | 1 + ui/app/serial/SerialReader.js | 15 ++++++++++++++- ui/app/serial/serialCodes.js | 1 + ui/app/serial/serialManager.js | 4 +++- ui/app/serial/struct.js | 2 +- ui/app/serial/structLayouts.js | 7 +++++++ ui/app/stores/ConfigStore.js | 4 ++-- ui/app/stores/TuningTabStore.js | 6 ++++++ ui/app/styles/app.scss | 6 ++++++ ui/package.js | 1 - ui/package.json | 12 ++++++------ 18 files changed, 91 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index 18fbd11..dd28955 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ node_modules dist ui_js/.gitignore .hgignore +npm-debug.log diff --git a/src/battery_monitor.cpp b/src/battery_monitor.cpp index 27e61e3..0ff0741 100644 --- a/src/battery_monitor.cpp +++ b/src/battery_monitor.cpp @@ -20,6 +20,7 @@ void battery_monitor_update() { battery_monitor_battery_voltage = battery_monitor_pin_voltage / (BATTERY_R2_VAL / (BATTERY_R1_VAL + BATTERY_R2_VAL)); if (battery_monitor_battery_voltage < 9.0) { // no battery connected + battery_monitor_battery_voltage = 0; noTone(BATTERY_ALERT_BUZZER_PIN); buzzer_on = false; diff --git a/src/flight_controller.h b/src/flight_controller.h index 750f72e..0030ab9 100644 --- a/src/flight_controller.h +++ b/src/flight_controller.h @@ -3,10 +3,10 @@ #define RATE 0 #define STABILIZE 1 -#define ARMED 1 #define UNARMED 0 +#define ARMED 1 -#define ANGLE_SAFETY_STOP false +#define ANGLE_SAFETY_STOP true #define SAFE_ANGLE 60.0 void fc_init(); diff --git a/src/serial_commands.cpp b/src/serial_commands.cpp index 6f430e0..8bdd158 100644 --- a/src/serial_commands.cpp +++ b/src/serial_commands.cpp @@ -8,6 +8,7 @@ #define REQUEST_RC 3 #define REQUEST_MOTORS 4 #define REQUEST_RATE_PIDS 5 +#define REQUEST_FLIGHT_DATA 6 #define SET_CONFIG 101 @@ -22,6 +23,7 @@ #include "flight_controller.h" #include "motors.h" #include "utils.h" +#include "battery_monitor.h" #include void read_serial_data(uint8_t data); @@ -262,6 +264,17 @@ void process_serial_data() { break; } + case REQUEST_FLIGHT_DATA: + packet_head(REQUEST_FLIGHT_DATA, 10); + + output_uint8(fc_armed()); + output_uint8(fc_mode()); + output_uint32(imu_value_process_dt); + output_float32(battery_monitor_battery_voltage); + + packet_tail(); + break; + case SET_CONFIG: if (data_received_length == sizeof(CONFIG)) { diff --git a/ui/app/components/MotorChart.jsx b/ui/app/components/MotorChart.jsx index d4ca047..40e47bd 100644 --- a/ui/app/components/MotorChart.jsx +++ b/ui/app/components/MotorChart.jsx @@ -2,13 +2,13 @@ import _ from 'lodash' import React from 'react' import ReactDOM from 'react-dom' import { observer } from 'mobx-react' -import { toJSON } from 'mobx' +import { toJS } from 'mobx' @observer class MotorChart extends React.Component { render() { - const data = toJSON(this.props.data) + const data = toJS(this.props.data) const motorPositions = ['fr', 'bl', 'fl', 'br'] return ( diff --git a/ui/app/components/Toolbar.jsx b/ui/app/components/Toolbar.jsx index efcb1a3..c1d099e 100644 --- a/ui/app/components/Toolbar.jsx +++ b/ui/app/components/Toolbar.jsx @@ -16,7 +16,7 @@ class Toolbar extends React.Component { render() { return (
-
    +
      {metaStore.tabData.map((tab, i) => { return (
    • diff --git a/ui/app/components/TuningTab.jsx b/ui/app/components/TuningTab.jsx index 374b0b9..f01fd12 100644 --- a/ui/app/components/TuningTab.jsx +++ b/ui/app/components/TuningTab.jsx @@ -8,16 +8,20 @@ import serial from '../serial/serialManager' @observer class TuningTab extends React.Component { componentDidMount() { - this.intervalID = setInterval(this.fetchData, 50) - } + this.intervalIDs = [ + setInterval(() => { + serial.send(tuningTabStore.graph1.requestCode(), null, tuningTabStore.graph1.addSample) + serial.send(serial.codes.REQUEST_MOTORS, null, tuningTabStore.addMotorChartSample) + }, 50), - componentWillUnmount() { - clearInterval(this.intervalID) + setInterval(() => { + serial.send(serial.codes.REQUEST_FLIGHT_DATA, null, tuningTabStore.updateFlightControllerData) + }, 200), + ] } - fetchData = () => { - serial.send(tuningTabStore.graph1.requestCode(), null, tuningTabStore.graph1.addSample) - serial.send(serial.codes.REQUEST_MOTORS, null, tuningTabStore.addMotorChartSample) + componentWillUnmount() { + this.intervalIDs.forEach((id) => clearInterval(id)) } render() { @@ -25,6 +29,19 @@ class TuningTab extends React.Component {
      +
      + Mode: {tuningTabStore.flightData.mode} +
      + {tuningTabStore.flightData.armed} +
      + Battery: {tuningTabStore.flightData.batteryVoltage.toFixed(2)}v +
      + Loop Time: {tuningTabStore.flightData.loopTime}μs +
      + orientation, + calibration, + reboot, + test ping
      ) } diff --git a/ui/app/index.js b/ui/app/index.js index 9ee5175..659c497 100644 --- a/ui/app/index.js +++ b/ui/app/index.js @@ -2,6 +2,7 @@ import 'babel-polyfill' import React from 'react' import ReactDOM from 'react-dom' import App from './components/app' +// import { useStrict } from 'mobx' import './styles/app.scss' diff --git a/ui/app/serial/SerialReader.js b/ui/app/serial/SerialReader.js index 79a4b62..11944ed 100644 --- a/ui/app/serial/SerialReader.js +++ b/ui/app/serial/SerialReader.js @@ -82,6 +82,10 @@ class SerialReader { case serialCodes.REQUEST_RATE_PIDS: response = parseStruct(this.dataBuffer, structLayouts.ratePidData); break; + case serialCodes.REQUEST_FLIGHT_DATA: + response = parseStruct(this.dataBuffer, structLayouts.flightData); + response = this.interpretFlightData(response) + break; case serialCodes.INFO_SUCCESS: console.log("controller responded with success!"); break; @@ -89,7 +93,7 @@ class SerialReader { console.log("controller responded with failure"); break; default: - console.log(`unknown code ${this.code}`); + console.log(`unhandled code ${this.code}`); } this.dataReceived(this.code, response); @@ -113,6 +117,15 @@ class SerialReader { return; console.log(text); } + + interpretFlightData(response) { + const FLIGHT_MODES = [ "rate", "stabilize" ] + const FLIGHT_ARMED_STATUS = [ "unarmed", "armed" ] + + response.armed = FLIGHT_ARMED_STATUS[response.armed] + response.mode = FLIGHT_MODES[response.mode] + return response + } } export default SerialReader; diff --git a/ui/app/serial/serialCodes.js b/ui/app/serial/serialCodes.js index a07ceba..500df22 100644 --- a/ui/app/serial/serialCodes.js +++ b/ui/app/serial/serialCodes.js @@ -6,6 +6,7 @@ export const REQUEST_GYRO_ACC = 2 export const REQUEST_RC = 3 export const REQUEST_MOTORS = 4 export const REQUEST_RATE_PIDS = 5 +export const REQUEST_FLIGHT_DATA = 6 export const SET_CONFIG = 101 diff --git a/ui/app/serial/serialManager.js b/ui/app/serial/serialManager.js index 8800850..9855c6c 100644 --- a/ui/app/serial/serialManager.js +++ b/ui/app/serial/serialManager.js @@ -20,6 +20,7 @@ class SerialManager { serialCodes.REQUEST_RC, serialCodes.REQUEST_MOTORS, serialCodes.REQUEST_RATE_PIDS, + serialCodes.REQUEST_FLIGHT_DATA, ] constructor() { @@ -106,7 +107,8 @@ class SerialManager { } _isDefaultDevice(device) { - return device.match(/usbmodem/) + //return device.match(/usbmodem/) + return device.match(/SLAB_USB/) } _findDefaultDevice(devices) { diff --git a/ui/app/serial/struct.js b/ui/app/serial/struct.js index bc65272..0c0a5a3 100644 --- a/ui/app/serial/struct.js +++ b/ui/app/serial/struct.js @@ -7,7 +7,7 @@ const dataTypes = { int16: { type: 'Int16', byteSize: 2 }, uint16: { type: 'Uint16', byteSize: 2 }, int32: { type: 'Int32', byteSize: 4 }, - // I uint32 + uint32: { type: 'Uint32', byteSize: 4 }, // q int64 // Q uint64 f32: { type: 'Float32', byteSize: 4 }, diff --git a/ui/app/serial/structLayouts.js b/ui/app/serial/structLayouts.js index 97f4c23..10b6bb3 100644 --- a/ui/app/serial/structLayouts.js +++ b/ui/app/serial/structLayouts.js @@ -16,6 +16,13 @@ export const gyroAcc = [ [ "accelMaxValue", "f32" ] ] +export const flightData = [ + [ "armed", "uint8" ], + [ "mode", "uint8" ], + [ "loopTime", "uint32" ], + [ "batteryVoltage", "f32" ], +] + export const motorData = [ [ "m1", "uint16" ], [ "m2", "uint16" ], diff --git a/ui/app/stores/ConfigStore.js b/ui/app/stores/ConfigStore.js index 26a8e5a..9b89016 100644 --- a/ui/app/stores/ConfigStore.js +++ b/ui/app/stores/ConfigStore.js @@ -1,4 +1,4 @@ -import { observable, toJSON } from 'mobx' +import { observable, toJS } from 'mobx' import serial from '../serial/serialManager' import * as structLayouts from "../serial/structLayouts" import { buildStruct } from '../serial/struct' @@ -14,7 +14,7 @@ export default class ConfigStore { } plainData = () => { - return toJSON(this.data) + return toJS(this.data) } fetchConfig = () => { diff --git a/ui/app/stores/TuningTabStore.js b/ui/app/stores/TuningTabStore.js index 73bdd60..8106e35 100644 --- a/ui/app/stores/TuningTabStore.js +++ b/ui/app/stores/TuningTabStore.js @@ -4,9 +4,11 @@ import { LineGraphStore } from './LineGraphStore' export default class TuningTabStore { @observable motorChartValues = { m1: 0, m2: 0, m3: 0, m4: 0 } + @observable flightData = {} constructor() { this.graph1 = new LineGraphStore() + this.flightData = { batteryVoltage: 0.0 } } addMotorChartSample = (sample) => { @@ -22,4 +24,8 @@ export default class TuningTabStore { this.motorChartValues[key] = value }) } + + updateFlightControllerData = (data) => { + this.flightData = data + } } diff --git a/ui/app/styles/app.scss b/ui/app/styles/app.scss index ebd056c..4cf6e5c 100644 --- a/ui/app/styles/app.scss +++ b/ui/app/styles/app.scss @@ -27,6 +27,12 @@ button:focus { .nav { padding-left: 20px; padding-top: 12px; + + border-top: 2px solid $brand-primary; + + &.connected { + border-top-color: $brand-success; + } } } diff --git a/ui/package.js b/ui/package.js index aaa82d5..4baf893 100644 --- a/ui/package.js +++ b/ui/package.js @@ -14,7 +14,6 @@ const appName = argv.name || argv.n || pkg.productName; const shouldUseAsar = argv.asar || argv.a || false; const shouldBuildAll = argv.all || false; - const DEFAULT_OPTS = { dir: './', name: appName, diff --git a/ui/package.json b/ui/package.json index 2e071ce..232fdbd 100644 --- a/ui/package.json +++ b/ui/package.json @@ -32,7 +32,7 @@ "babel-polyfill": "^6.3.14", "babel-preset-es2015": "^6.3.13", "babel-preset-react": "^6.3.13", - "babel-preset-react-hmre": "^1.0.1", + "babel-preset-react-hmre": "^1.1.1", "chromedriver": "^2.19.0", "cross-env": "^1.0.7", "css-loader": "^0.23.1", @@ -49,7 +49,7 @@ "minimist": "^1.2.0", "node-libs-browser": ">= 0.4.0 <=0.6.0", "node-sass": "^3.4.2", - "react-addons-test-utils": "^0.14.2", + "react-addons-test-utils": "^15.2.0", "sass-loader": "^3.1.2", "selenium-webdriver": "^2.48.2", "sinon": "^1.17.2", @@ -67,11 +67,11 @@ "electron-debug": "^0.5.1", "font-awesome": "^4.4.0", "lodash": "^4.5.0", - "mobx": "^2.0.0", - "mobx-react": "^3.0.0", + "mobx": "^2.3.3", + "mobx-react": "^3.4.0", "moment": "^2.11.2", - "react": "^0.14.2", - "react-dom": "^0.14.2", + "react": "^15.2.0", + "react-dom": "^15.2.0", "serialport": "^2.0.6" }, "devEngines": {