diff --git a/.gitignore b/.gitignore index cfdf8cc..47d91c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1,11 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -node_modules -.pnp -.pnp.js - -# testing -coverage - -# production -build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* -*.pyc +.Python +[Bb]in +[Ii]nclude +[Ll]ib +[Ll]ib64 +[Ll]ocal +[Ss]cripts +pyvenv.cfg +.venv +pip-selfcheck.json +node_modules/ \ No newline at end of file diff --git a/MsgPackXBee.ino b/MsgPackXBee.ino new file mode 100644 index 0000000..0b1a6cb --- /dev/null +++ b/MsgPackXBee.ino @@ -0,0 +1,94 @@ +// Solar Car @ UVA | Telemetry +// 23 February 2020 + +#include +#include + +#define rX 7 +#define tX 8 + +SoftwareSerial xbee = SoftwareSerial(rX,tX); + +const int capacity = JSON_OBJECT_SIZE(54); + +StaticJsonDocument telemetryData; + +void changeDoc() { + // Timestamp + telemetryData["t"] = millis(); + + // BMS numbers + telemetryData["ba"] = (float)random(25,30); + telemetryData["bb"] = (float)random(80,100); + telemetryData["bc"] = (float)random(90,100); + telemetryData["bd"] = random(65,70); + telemetryData["be"] = random(55,60); + telemetryData["bf"] = random(80,90); + telemetryData["bg"] = random(50,60); + telemetryData["bh"] = random(60,70); + + // BMS bools + telemetryData["ca"] = false; + telemetryData["cb"] = false; + telemetryData["cc"] = false; + telemetryData["cd"] = false; + telemetryData["ce"] = false; + telemetryData["cf"] = false; + telemetryData["cg"] = false; + telemetryData["ch"] = false; + + // BMS faults + telemetryData["fa"] = false; + telemetryData["fb"] = false; + telemetryData["fc"] = false; + telemetryData["fd"] = false; + telemetryData["fe"] = false; + telemetryData["ff"] = false; + telemetryData["fg"] = false; + telemetryData["fh"] = false; + telemetryData["fi"] = false; + telemetryData["fj"] = false; + telemetryData["fk"] = false; + telemetryData["fl"] = false; + telemetryData["fm"] = false; + telemetryData["fn"] = false; + telemetryData["fo"] = false; + telemetryData["fp"] = false; + telemetryData["fq"] = false; + telemetryData["fr"] = false; + telemetryData["fs"] = false; + telemetryData["ft"] = false; + telemetryData["fu"] = false; + + // KLS status + telemetryData["ka"] = random(100,150); + telemetryData["kb"] = (float)random(50,60); + telemetryData["kc"] = (float)random(80,100); + telemetryData["kd"] = (float)random(50,60); + telemetryData["le"] = random(90,100); + telemetryData["kf"] = random(80,90); + telemetryData["kg"] = false; + telemetryData["kf"] = false; + + //KLS switch + telemetryData["sa"] = false; + telemetryData["sb"] = false; + telemetryData["sc"] = false; + telemetryData["sd"] = false; + telemetryData["se"] = false; + telemetryData["sf"] = false; + telemetryData["sg"] = false; + telemetryData["sh"] = false; +} + +void setup() { + pinMode(rX,INPUT); + pinMode(tX,OUTPUT); + xbee.begin(9600); +} + +void loop() { + changeDoc(); + serializeMsgPack(telemetryData,xbee); + delay(2000); +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..fd4e981 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Telemetry + +To launch application, complete the following: + +- pip install -r requirements.txt +- python main.py +- Go to localhost:5000 + + +You can optionally run this in a virtual environment so your installation versions +don't conflict. diff --git a/__pycache__/data.cpython-37.pyc b/__pycache__/data.cpython-37.pyc new file mode 100644 index 0000000..c7e7899 Binary files /dev/null and b/__pycache__/data.cpython-37.pyc differ diff --git a/__pycache__/data.cpython-38.pyc b/__pycache__/data.cpython-38.pyc new file mode 100644 index 0000000..46b4eea Binary files /dev/null and b/__pycache__/data.cpython-38.pyc differ diff --git a/artificial_serial.sh b/artificial_serial.sh new file mode 100755 index 0000000..8d440f7 --- /dev/null +++ b/artificial_serial.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +touch ttyS10 +touch ttyS11 + + +chmod 666 ttyS10 +chmod 666 ttyS11 + + +#raw means passing of input output almost unfiltered +#pty generates pseudo terminal to let this happen +#-u indicates unidirectional transfer (one is to write into and the other is to read out of) +socat -u -u pty,raw,echo=0,link=ttyS10 pty,raw,echo=0,link=ttyS11 & diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..47d91c1 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,11 @@ +.Python +[Bb]in +[Ii]nclude +[Ll]ib +[Ll]ib64 +[Ll]ocal +[Ss]cripts +pyvenv.cfg +.venv +pip-selfcheck.json +node_modules/ \ No newline at end of file diff --git a/data.py b/data.py new file mode 100644 index 0000000..d90aec6 --- /dev/null +++ b/data.py @@ -0,0 +1,68 @@ +#handle and store data from xbee here +import random +from datetime import datetime +import msgpack +from openpyxl import load_workbook +import serial +import time + + + + +class Info(object): + def __init__(self): + self.workbook = load_workbook(filename="data_label.xlsx") + self.ws = self.workbook.active + self.column = (self.ws['G'])[1:] + self.labels = {} + + #identifies array label and adds value to it appropriately + for i in self.column: + if (i.value not in self.labels) and (i.value is not None): + self.labels[i.value] = 1 + elif (i.value is not None): + self.labels[i.value] += 1 + + + self.mph = random.randint(10,20); + self.rpm = random.randint(10,20), + self.miles = random.randint(10,20); + self.socTime = str(datetime.now().strftime("%H:%M:%S")), + self.socVal = random.randint(10,200); + + + def to_json(self): + + msgpack_data = {} + + for label in self.labels: + num = self.labels[label] + if label == "b" or label == "k": + array_num = [] + for i in range(num): + array_num.append(random.randint(10,20)) + + msgpack_data[label] = array_num + else: + array_bool = [] + for i in range(num): + array_bool.append(random.randint(0,1)) + msgpack_data[label] = array_bool + + return msgpack.packb(msgpack_data, use_bin_type=True) + + + def output(self, port): + ser = serial.Serial(port, 115200, timeout=1) + + while True: + print(type(self.to_json())) + ser.write(self.to_json()) + time.sleep(.2) + print("sent") + + +if __name__ == "__main__": + serial_port = 'ttyS10' + k = Info() + k.output(serial_port) diff --git a/data.txt b/data.txt new file mode 100644 index 0000000..86d5f5f --- /dev/null +++ b/data.txt @@ -0,0 +1,110 @@ +{"mph": 13, "rpm": [20], "miles": 15, "socTime": ["18:34:13"], "socVal": 142} +{"mph": 17, "rpm": [14], "miles": 18, "socTime": ["18:34:15"], "socVal": 34} +{"mph": 15, "rpm": [16], "miles": 10, "socTime": ["18:34:24"], "socVal": 67} +{"mph": 18, "rpm": [11], "miles": 19, "socTime": ["18:34:26"], "socVal": 200} +{"mph": 15, "rpm": [19], "miles": 12, "socTime": ["18:34:26"], "socVal": 58} +{"mph": 20, "rpm": [14], "miles": 16, "socTime": ["18:34:28"], "socVal": 43} +{"mph": 20, "rpm": [11], "miles": 16, "socTime": ["18:34:28"], "socVal": 169} +{"mph": 12, "rpm": [15], "miles": 16, "socTime": ["18:34:30"], "socVal": 172} +{"mph": 16, "rpm": [17], "miles": 20, "socTime": ["18:34:31"], "socVal": 89} +{"mph": 18, "rpm": [17], "miles": 13, "socTime": ["18:34:32"], "socVal": 116} +{"mph": 12, "rpm": [18], "miles": 11, "socTime": ["18:34:33"], "socVal": 146} +{"mph": 15, "rpm": [17], "miles": 12, "socTime": ["18:34:34"], "socVal": 30} +{"mph": 10, "rpm": [13], "miles": 10, "socTime": ["18:34:36"], "socVal": 193} +{"mph": 15, "rpm": [20], "miles": 11, "socTime": ["18:34:36"], "socVal": 136} +{"mph": 17, "rpm": [11], "miles": 12, "socTime": ["18:34:38"], "socVal": 53} +{"mph": 11, "rpm": [18], "miles": 17, "socTime": ["18:34:38"], "socVal": 108} +{"mph": 11, "rpm": [14], "miles": 13, "socTime": ["18:34:40"], "socVal": 74} +{"mph": 13, "rpm": [13], "miles": 10, "socTime": ["18:34:40"], "socVal": 76} +{"mph": 13, "rpm": [10], "miles": 11, "socTime": ["18:34:42"], "socVal": 111} +{"mph": 18, "rpm": [15], "miles": 15, "socTime": ["18:34:43"], "socVal": 100} +{"mph": 15, "rpm": [13], "miles": 10, "socTime": ["18:34:44"], "socVal": 170} +{"mph": 19, "rpm": [19], "miles": 12, "socTime": ["18:34:45"], "socVal": 35} +{"mph": 15, "rpm": [14], "miles": 18, "socTime": ["18:34:46"], "socVal": 81} +{"mph": 11, "rpm": [11], "miles": 15, "socTime": ["18:34:48"], "socVal": 132} +{"mph": 19, "rpm": [17], "miles": 18, "socTime": ["18:34:48"], "socVal": 79} +{"mph": 18, "rpm": [16], "miles": 10, "socTime": ["18:34:50"], "socVal": 114} +{"mph": 14, "rpm": [19], "miles": 17, "socTime": ["18:34:50"], "socVal": 101} +{"mph": 14, "rpm": [10], "miles": 10, "socTime": ["18:34:52"], "socVal": 69} +{"mph": 12, "rpm": [13], "miles": 17, "socTime": ["18:34:53"], "socVal": 180} +{"mph": 13, "rpm": [19], "miles": 11, "socTime": ["18:34:54"], "socVal": 114} +{"mph": 11, "rpm": [12], "miles": 17, "socTime": ["18:34:55"], "socVal": 44} +{"mph": 15, "rpm": [19], "miles": 14, "socTime": ["18:34:56"], "socVal": 72} +{"mph": 14, "rpm": [10], "miles": 12, "socTime": ["18:34:57"], "socVal": 111} +{"mph": 13, "rpm": [14], "miles": 15, "socTime": ["18:34:58"], "socVal": 53} +{"mph": 10, "rpm": [11], "miles": 12, "socTime": ["18:35:00"], "socVal": 150} +{"mph": 18, "rpm": [12], "miles": 12, "socTime": ["18:35:00"], "socVal": 12} +{"mph": 20, "rpm": [12], "miles": 19, "socTime": ["18:35:02"], "socVal": 70} +{"mph": 20, "rpm": [12], "miles": 12, "socTime": ["18:35:02"], "socVal": 178} +{"mph": 14, "rpm": [12], "miles": 16, "socTime": ["18:35:04"], "socVal": 111} +{"mph": 14, "rpm": [11], "miles": 18, "socTime": ["18:35:05"], "socVal": 167} +{"mph": 11, "rpm": [17], "miles": 15, "socTime": ["18:35:06"], "socVal": 57} +{"mph": 16, "rpm": [12], "miles": 13, "socTime": ["18:35:07"], "socVal": 142} +{"mph": 19, "rpm": [12], "miles": 13, "socTime": ["18:35:08"], "socVal": 107} +{"mph": 16, "rpm": [11], "miles": 18, "socTime": ["18:35:09"], "socVal": 52} +{"mph": 10, "rpm": [16], "miles": 16, "socTime": ["18:35:10"], "socVal": 172} +{"mph": 17, "rpm": [17], "miles": 12, "socTime": ["18:35:12"], "socVal": 105} +{"mph": 16, "rpm": [14], "miles": 19, "socTime": ["18:35:12"], "socVal": 77} +{"mph": 18, "rpm": [17], "miles": 12, "socTime": ["18:35:14"], "socVal": 65} +{"mph": 11, "rpm": [10], "miles": 13, "socTime": ["18:35:14"], "socVal": 130} +{"mph": 12, "rpm": [12], "miles": 15, "socTime": ["18:35:17"], "socVal": 160} +{"mph": 12, "rpm": [10], "miles": 13, "socTime": ["18:35:17"], "socVal": 78} +{"mph": 10, "rpm": [14], "miles": 19, "socTime": ["18:35:19"], "socVal": 97} +{"mph": 14, "rpm": [17], "miles": 20, "socTime": ["18:35:19"], "socVal": 93} +{"mph": 16, "rpm": [10], "miles": 19, "socTime": ["18:35:21"], "socVal": 122} +{"mph": 18, "rpm": [10], "miles": 15, "socTime": ["18:35:22"], "socVal": 16} +{"mph": 20, "rpm": [15], "miles": 13, "socTime": ["18:35:23"], "socVal": 59} +{"mph": 12, "rpm": [15], "miles": 20, "socTime": ["18:35:24"], "socVal": 112} +{"mph": 11, "rpm": [18], "miles": 17, "socTime": ["18:35:25"], "socVal": 156} +{"mph": 18, "rpm": [12], "miles": 12, "socTime": ["18:35:26"], "socVal": 161} +{"mph": 15, "rpm": [14], "miles": 16, "socTime": ["18:35:27"], "socVal": 166} +{"mph": 19, "rpm": [12], "miles": 15, "socTime": ["18:35:33"], "socVal": 50} +{"mph": 14, "rpm": [18], "miles": 15, "socTime": ["18:35:33"], "socVal": 96} +{"mph": 19, "rpm": [16], "miles": 12, "socTime": ["18:35:35"], "socVal": 150} +{"mph": 17, "rpm": [20], "miles": 19, "socTime": ["18:35:36"], "socVal": 65} +{"mph": 10, "rpm": [15], "miles": 17, "socTime": ["18:35:37"], "socVal": 42} +{"mph": 10, "rpm": [18], "miles": 12, "socTime": ["18:35:38"], "socVal": 138} +{"mph": 10, "rpm": [10], "miles": 14, "socTime": ["18:35:39"], "socVal": 145} +{"mph": 18, "rpm": [12], "miles": 19, "socTime": ["18:35:40"], "socVal": 132} +{"mph": 18, "rpm": [20], "miles": 13, "socTime": ["18:35:41"], "socVal": 13} +{"mph": 15, "rpm": [10], "miles": 10, "socTime": ["18:35:42"], "socVal": 74} +{"mph": 15, "rpm": [12], "miles": 19, "socTime": ["18:35:43"], "socVal": 37} +{"mph": 16, "rpm": [10], "miles": 14, "socTime": ["18:35:44"], "socVal": 63} +{"mph": 12, "rpm": [14], "miles": 19, "socTime": ["18:35:46"], "socVal": 176} +{"mph": 18, "rpm": [11], "miles": 18, "socTime": ["18:35:46"], "socVal": 116} +{"mph": 18, "rpm": [18], "miles": 16, "socTime": ["18:35:48"], "socVal": 184} +{"mph": 14, "rpm": [16], "miles": 14, "socTime": ["18:35:49"], "socVal": 57} +{"mph": 15, "rpm": [16], "miles": 19, "socTime": ["18:35:50"], "socVal": 189} +{"mph": 14, "rpm": [19], "miles": 11, "socTime": ["18:35:51"], "socVal": 109} +{"mph": 15, "rpm": [19], "miles": 12, "socTime": ["18:35:53"], "socVal": 77} +{"mph": 14, "rpm": [16], "miles": 19, "socTime": ["18:35:53"], "socVal": 66} +{"mph": 14, "rpm": [20], "miles": 11, "socTime": ["18:35:55"], "socVal": 157} +{"mph": 16, "rpm": [11], "miles": 10, "socTime": ["18:35:55"], "socVal": 124} +{"mph": 17, "rpm": [17], "miles": 10, "socTime": ["18:35:57"], "socVal": 25} +{"mph": 11, "rpm": [11], "miles": 15, "socTime": ["18:35:57"], "socVal": 195} +{"mph": 13, "rpm": [18], "miles": 12, "socTime": ["18:35:59"], "socVal": 13} +{"mph": 15, "rpm": [20], "miles": 15, "socTime": ["18:36:00"], "socVal": 156} +{"mph": 14, "rpm": [14], "miles": 18, "socTime": ["18:36:01"], "socVal": 98} +{"mph": 16, "rpm": [12], "miles": 16, "socTime": ["18:36:02"], "socVal": 164} +{"mph": 11, "rpm": [18], "miles": 17, "socTime": ["18:36:03"], "socVal": 196} +{"mph": 20, "rpm": [14], "miles": 14, "socTime": ["18:36:04"], "socVal": 99} +{"mph": 16, "rpm": [20], "miles": 13, "socTime": ["18:36:05"], "socVal": 133} +{"mph": 17, "rpm": [14], "miles": 19, "socTime": ["18:36:07"], "socVal": 175} +{"mph": 18, "rpm": [14], "miles": 17, "socTime": ["18:36:07"], "socVal": 35} +{"mph": 18, "rpm": [17], "miles": 15, "socTime": ["18:36:09"], "socVal": 120} +{"mph": 12, "rpm": [19], "miles": 19, "socTime": ["18:36:09"], "socVal": 72} +{"mph": 12, "rpm": [10], "miles": 18, "socTime": ["18:36:14"], "socVal": 196} +{"mph": 14, "rpm": [14], "miles": 16, "socTime": ["18:36:16"], "socVal": 25} +{"mph": 12, "rpm": [18], "miles": 10, "socTime": ["18:36:18"], "socVal": 84} +{"mph": 10, "rpm": [17], "miles": 12, "socTime": ["18:36:20"], "socVal": 101} +{"mph": 20, "rpm": [10], "miles": 14, "socTime": ["18:36:22"], "socVal": 181} +{"mph": 10, "rpm": [20], "miles": 20, "socTime": ["18:36:25"], "socVal": 80} +{"mph": 16, "rpm": [13], "miles": 19, "socTime": ["18:36:27"], "socVal": 145} +{"mph": 10, "rpm": [12], "miles": 19, "socTime": ["18:36:29"], "socVal": 173} +{"mph": 19, "rpm": [17], "miles": 15, "socTime": ["18:36:31"], "socVal": 131} +{"mph": 15, "rpm": [12], "miles": 12, "socTime": ["18:36:33"], "socVal": 14} +{"mph": 13, "rpm": [16], "miles": 18, "socTime": ["18:36:35"], "socVal": 135} +{"mph": 20, "rpm": [15], "miles": 16, "socTime": ["18:36:38"], "socVal": 155} +{"mph": 16, "rpm": [16], "miles": 20, "socTime": ["18:36:40"], "socVal": 113} +{"mph": 15, "rpm": [12], "miles": 12, "socTime": ["18:36:42"], "socVal": 77} +{"mph": 17, "rpm": [17], "miles": 18, "socTime": ["18:36:44"], "socVal": 14} diff --git a/data_label.xlsx b/data_label.xlsx new file mode 100644 index 0000000..40af1b6 Binary files /dev/null and b/data_label.xlsx differ diff --git a/frontend/src/components/MotorFaults.tsx b/frontend/src/components/MotorFaults.tsx new file mode 100644 index 0000000..53fc8f5 --- /dev/null +++ b/frontend/src/components/MotorFaults.tsx @@ -0,0 +1,123 @@ +import * as React from "react"; +import Alert from "@mui/material/Alert"; +import Stack from "@mui/material/Stack"; + +function overcurrent(over_current: number) { + if (over_current == 1) { + return ( + + + Motor or Battery current is too high + +
+
+ ); + } +} +function hallsensor(hall_sensor: number) { + if (hall_sensor == 1) { + return ( + + + Hall sensor is open/short circuit fault + +
+
+ ); + } + return <>; +} +function motorlocked(motor_locked: number) { + if (motor_locked == 1) { + return ( + + + Motor Locked + +
+
+ ); + } +} +function sensorfault1(sensor_fault1: number) { + if (sensor_fault1 == 1) { + return ( + + + Sensor Fault 1 + +
+
+ ); + } +} +function sensorfault2(sensor_fault2: number) { + if (sensor_fault2 == 1) { + return ( + + + Sensor Fault 2 + +
+
+ ); + } +} +function highvoltage(high_voltage: number) { + if (high_voltage == 1) { + return ( + + + High Battery Voltage + +
+
+ ); + } +} +function controlleroverheat(controller_overheat: number) { + if (controller_overheat == 1) { + return ( + + + Controller Overheat + +
+
+ ); + } +} + +interface Props { + Over_current: number; + Hall_sensor: number; + Motor_locked: number; + Sensor_fault1: number; + Sensor_fault2: number; + High_voltage: number; + Controller_overheat: number; +} + +const MotorFaults: React.FC = ({ + Over_current, + Hall_sensor, + Motor_locked, + Sensor_fault1, + Sensor_fault2, + High_voltage, + Controller_overheat, +}) => { + return ( +
+ {overcurrent(Over_current)} + {hallsensor(Hall_sensor)} + {motorlocked(Motor_locked)} + {sensorfault1(Sensor_fault1)} + {sensorfault2(Sensor_fault2)} + {highvoltage(High_voltage)} + {controlleroverheat(Controller_overheat)} +
+ ); +}; + +export default MotorFaults; diff --git a/frontend/src/pages/InteractivePage.tsx b/frontend/src/pages/InteractivePage.tsx index a4f5b69..9c66cbb 100644 --- a/frontend/src/pages/InteractivePage.tsx +++ b/frontend/src/pages/InteractivePage.tsx @@ -4,6 +4,7 @@ import { useEffect, useState } from "react"; import OnePedalDrive from "../components/OnePedalDrive"; import { io } from "socket.io-client"; import ToggleButtons from "../components/ToggleButtons"; +import MotorFaults from "../components/MotorFaults"; const socket = io("http://localhost:5050"); const MAX_LENGTH = 50; @@ -59,7 +60,9 @@ const InteractivePage = () => { ], }; if (updatedData[name as keyof Data].length > MAX_LENGTH) { - updatedData[name as keyof Data] = updatedData[name as keyof Data].slice(-MAX_LENGTH); + updatedData[name as keyof Data] = updatedData[ + name as keyof Data + ].slice(-MAX_LENGTH); } return updatedData; }); @@ -77,7 +80,9 @@ const InteractivePage = () => { ], }; if (updatedData[name as keyof StringData].length > MAX_LENGTH) { - updatedData[name as keyof StringData] = updatedData[name as keyof StringData].slice(-MAX_LENGTH); + updatedData[name as keyof StringData] = updatedData[ + name as keyof StringData + ].slice(-MAX_LENGTH); } return updatedData; }); @@ -176,19 +181,35 @@ const InteractivePage = () => { }} > { flex: "3 0 0", }} > - + { gap: "16px", }} > - {/* Replace this paper component with motor faults */} - - Motor Faults - + {/* Replace this paper component with fifa chart */} >>>>>> e6399f6 (Updated db storage) + feedback_status = db.Column(db.Integer) + hall_a = db.Column(db.Boolean, default = False) + hall_b = db.Column(db.Boolean, default = False) + hall_c = db.Column(db.Boolean, default = False) + brake = db.Column(db.Boolean, default = False) + backward = db.Column(db.Boolean, default = False) + forward = db.Column(db.Boolean, default = False) + foot = db.Column(db.Boolean, default = False) + boost = db.Column(db.Boolean, default = False) + rpm = db.Column(INTEGER(unsigned=True)) + current_limit_status = db.Column(db.Float) + voltage = db.Column(db.Float) + throttle = db.Column(db.Float) + controller_temp = db.Column(INTEGER(unsigned=True)) + motor_temp = db.Column(INTEGER(unsigned=True)) + timestamp = db.Column(db.DateTime, default = datetime.now) + + + def __repr__(self): + return f"Data:('{self.miles}', '{self.rpm}', '{self.mph}')" + + + +db.create_all() + + +@app.route('/') +def sessions(): + return render_template('index.html') + +@app.route('/battery') +def battery(): + return render_template('battery.html') + +@app.route('/solar') +def solar(): + return render_template('solar.html') + +@app.route('/motor') +def motor(): + return render_template('motor.html') + +@app.route('/faults') +def faults(): + return render_template('faults.html') + +@app.route('/graph') +def graph(): + return render_template('graph.html') + +@socketio.on('dataEvent') +def handle_data(msg): + data_json = data.Info().to_json() + storeData(data_json) + socketio.emit('dataEvent', data_json) + socketio.sleep(2) + + +def storeData(data): + d = KLS(rpm=data['rpm']) + db.session.add(d) + db.session.commit() + + +""" device = XBeeDevice(PORT, BAUD_RATE) + print("Waiting for data... \n") + try: + device.open() + + def data_receive_callback(xbee_message): + data2 = msgpack.unpackb(xbee_message.data, use_list = False, raw = False) + print(data2) + socketio.emit('dataEvent', data2) + + device.add_data_received_callback(data_receive_callback) + + print("Waiting for data...\n") + input() + + finally: + if device is not None and device.is_open(): + device.close() """ + + +if __name__ == '__main__': + device = XBeeDevice(PORT, BAUD_RATE) + socketio.run(app, host='0.0.0.0', port=5000, debug=True) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ef223d9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,231 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@fortawesome/fontawesome-free": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.10.2.tgz", + "integrity": "sha512-9pw+Nsnunl9unstGEHQ+u41wBEQue6XPBsILXtJF/4fNN1L3avJcMF/gGF86rIjeTAgfLjTY9ndm68/X4f4idQ==" + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + }, + "bootstrap": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", + "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "chart.js": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.8.0.tgz", + "integrity": "sha512-Di3wUL4BFvqI5FB5K26aQ+hvWh8wnP9A3DWGvXHVkO13D3DSnaSsdZx29cXlEsYKVkn1E2az+ZYFS4t0zi8x0w==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", + "requires": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^1.9.3" + } + }, + "chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "requires": { + "color-name": "^1.0.0" + } + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + }, + "dependencies": { + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "datatables.net": { + "version": "1.10.19", + "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.19.tgz", + "integrity": "sha512-+ljXcI6Pj3PTGy5pesp3E5Dr3x3AV45EZe0o1r0gKENN2gafBKXodVnk2ypKwl2tTmivjxbkiqoWnipTefyBTA==", + "requires": { + "jquery": ">=1.7" + } + }, + "datatables.net-bs4": { + "version": "1.10.19", + "resolved": "https://registry.npmjs.org/datatables.net-bs4/-/datatables.net-bs4-1.10.19.tgz", + "integrity": "sha512-pgeP17w4aPR7HIxIwuJghfqXULjdg1K6xMUUKDyCERJRSNNK4MRToFfELtIsluLNN555YBK4Kx8nihX5/ZT1Fw==", + "requires": { + "datatables.net": "1.10.19", + "jquery": ">=1.7" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "optional": true + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + }, + "jquery.easing": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jquery.easing/-/jquery.easing-1.4.1.tgz", + "integrity": "sha1-R5gsWDa9dY/UhJSSPEoQHvbpPjs=" + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "picomatch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", + "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==" + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "requires": { + "picomatch": "^2.0.4" + } + }, + "sas": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sas/-/sas-3.0.4.tgz", + "integrity": "sha1-hdukPzWzFNEJuPfNFBIkmZUDUGQ=" + }, + "sass": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.23.3.tgz", + "integrity": "sha512-1DKRZxJMOh4Bme16AbWTyYeJAjTlrvw2+fWshHHaepeJfGq2soFZTnt0YhWit+bohtDu4LdyPoEj6VFD4APHog==", + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "startbootstrap-sb-admin-2": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/startbootstrap-sb-admin-2/-/startbootstrap-sb-admin-2-4.0.7.tgz", + "integrity": "sha512-4MIqbo/Y9Kz/CJ2H/EDHXGLfKuT7tHgmy9+b+SMXK/IwEX06ftJ4/75/IGMFqLazg+VriBJLp1B9dPuHBzaPVw==", + "requires": { + "@fortawesome/fontawesome-free": "5.10.2", + "bootstrap": "4.3.1", + "chart.js": "2.8.0", + "datatables.net-bs4": "1.10.19", + "jquery": "3.4.1", + "jquery.easing": "^1.4.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } + } +} diff --git a/rebase-merge/author-script b/rebase-merge/author-script new file mode 100644 index 0000000..1f7c53d --- /dev/null +++ b/rebase-merge/author-script @@ -0,0 +1,3 @@ +GIT_AUTHOR_NAME='Victor Pham' +GIT_AUTHOR_EMAIL='vbp8vgc@virginia.edu' +GIT_AUTHOR_DATE='@1587597032 -0400' diff --git a/rebase-merge/done b/rebase-merge/done new file mode 100644 index 0000000..e305c03 --- /dev/null +++ b/rebase-merge/done @@ -0,0 +1,34 @@ +pick c2a0a97af929b0ba9b6114af443d7a95245916bf Initial commit +pick 3597b60b3c7558e0c8df827d2c5ef2dc21e17890 Telemetry Website +pick 819bb93651c41e8cdd8929a1526438ee4dc9f3c8 Added requirements.txt +pick 1da413128afd1db252af868312b47b3c790ce0d4 Updated chart to be dynamic +pick 3b720468926b484e84fcc3b5ca0c2415fa030c76 Update battery.html +pick ccd9f12e201a20352951d7166e9bb529da4d49ab modifying documentation +pick db2cbe6e206aed91f18fcde3cd4b24c6f921d7e9 Added solar page +pick 31cb41e53b8da3568558aebbb5c27af43c6b455d Battery page update +pick bf0725e067a1d9bffdf37881887b90cb4071139e Update README.md +pick b85906e4f9ea591284948ee95ccfdc383768efd2 Random number updating +pick 0ede6ad9581a0033218b7d8d98814238a0961b3f Update solar page +pick 84b5743e822045467ad48e2e653dae7e28f750e8 Created object to handle data +pick 1a95499a691db25fc4ec71078b51b7f59c512fac Implemented interactive graph, logging data to file +pick 34ca57439e6e8b88532b189efd16b8efb292471e Small UI update +pick 33fe1eb27021a4010f87ab872299163ecac07b30 Added Xbee receiver code +pick f21ea1ca23500b90228b6249c938327356aab177 battery page update, graph.html, control.html +pick 5d4f325ee856f13537e8af71a8db7cd3c9f45b51 Dygraphs and faults page implementation +pick a46111db0209b850ccf0358fd98a0dfd62bb2dec Updated client.js +pick 964ba9f18c87746ef53f8461323df9c7b08e1453 ArduinoJson MessagePack file +pick f0b2748d7a1732358523faa5688bffc944b145ee Updated battery page +pick a99ee4e83813cbaa4eb32bf78304ac05006710e5 Implemented local storage +pick 208205915f93db33205903d4917d831feeae86b6 faults page update +pick 2086c611a1e5e5cd504b73e51dd67901a1b9dffd Implemented sqlite db +pick 06866a3cc424241c95151ebb5123bf8b1e1ad675 Create db file +pick 0f7c02b8223d04981e996aca26935a0d7a122965 Update requirements.txt +pick 4cf7dc56008ece36adcc92b7f6bd0521bdd48732 BMS Database model +pick 5ab01bd77e5b435461972fc71a7f39c63bf99054 Delete glibc.cpython-37.pyc +pick 2ae4a7fd253f99374a987fe30344f8d07b24f95f KLS model +pick d422fa25657e6a1d0ccf66af7618dc90b174d904 models updated to hold correct value types +pick fc6dc723668969ea9b411e34c94ed5212d4e8efb socat fake serial port server done +pick ab2fcc0079f65a2ac11b652cb23d6ab9e4fe2c38 prob conflicts here +pick 235294a4f21a6b827eb3b00cab42c94d4ffa894a new libraries needed +pick cc501976f817579102bd1dd172e7e9ed191092b8 primary key +pick e6399f6c5db5bd865f0378e4ca1454afc0ee3b5f Updated db storage diff --git a/rebase-merge/drop_redundant_commits b/rebase-merge/drop_redundant_commits new file mode 100644 index 0000000..e69de29 diff --git a/rebase-merge/end b/rebase-merge/end new file mode 100644 index 0000000..c67f579 --- /dev/null +++ b/rebase-merge/end @@ -0,0 +1 @@ +93 diff --git a/rebase-merge/git-rebase-todo b/rebase-merge/git-rebase-todo new file mode 100644 index 0000000..cdc5b31 --- /dev/null +++ b/rebase-merge/git-rebase-todo @@ -0,0 +1,59 @@ +pick b41801b0e4d03068c770c3462f1ad6755a83b4d7 packing unpacking +pick 9e8bdef64256716a2fc7736a0d9176bf06e3ad2c models.py and client.js +pick e97f1e25ea7ccc8b838c8d9ec410fa81a92c55a0 testing fake serial port +pick 9a8d2b6ae498b294213216db35d8782fd66b52cf changes to gitignore +pick 8388df8d892c438e6493ed0705657440ad9d9dae Fixed data_read.py +pick 05b98f189070048b6eb462c1e6b99c92fc09a4a0 Updated main.py to read from serial +pick f3c0d84003c40894c022b8c04e5619a9e50b875a Updated random serial data +pick a49e69f3cf680cb6e0e960e83846df3d41c0c498 fake serial +pick dd568ab18782026cba50341826475f57d1afcfbf Fixed errors +pick 3ed93f461613233919841dd775664ee5d5589c2f Updated client.js +pick 3e59eb3217bc8b29a75f106907ec22b76ab4f5d5 Storing data in db +pick d2d860c76ee2044995f28a6f077de71ef0a6639f Fixed bug preventing loop +pick 09369e9a1945dda7276cda8a56bd069a679994ed Add database file to gitignore +pick 75890ed2b5252a14384db98daa7035479d5df252 Added option to bypass serial +pick 2299e26373b47f116e2c15e9e402994d22d008bc PostgreSQL +pick 03243055154ddaefb16d712fcab1cfb2e9d188d8 Sidebar and Password +pick 9b319728fab26159325f3a2714ab78d6e7cf8da0 Warning System +pick 42363c5ae138a3d9178d68c30ab5edb1f79bb9ab Updated SOC chart +pick 50322d8317362414268e8d4a8d577515d720dfbb Update jQuery version +pick 3dbbcbbd7e8b15fad57332eed74992589b17cf9f Created Layout.html +pick 56bb0fb961bb40b2d3f03c32bbb71cb11243d80a Update main.py +pick 5279658ed31dde3747a8b9748f2b6497248a7db7 Update sidebar.html +pick f16a8103033c5e6853f18d82bbde677c9b2254ba Update layout.html +pick 8e484df76062b5f8b045992e77d4f03c2151c822 Bug fixes +pick 5d83b9e469b77a764df5052de7b598464d853f4d Scrollbar +pick bf69142c39dd77d4825072eacd537f989c98862b Updated UI +pick f719869106ea3000818781f1c28909d1cf171bca Warning System, Battery and Solar chart functionality +pick 21cb1a19c008880553f161ba3599ebf48c5061b7 small battery chart update +pick 219d4486cff70b493234c048a27399f7ae2113e6 admin page setup +pick b458e725e98b22a3b1919fe7328a0bf590add906 useSerial bug +pick 70c19d4d2d0305ba85e06e5651d0879a0544f4bf Storing and loading runs from db +pick 1e12aea63661c91847d7e901694dcc0a4e6a466c Created global runTracker object +pick 507de6c39590fd415582161821d838d7d45acb7c Replace dataEvent with emit_data loop +pick d8b7612b2ea13ed15c8fb093eed74db5fadb0a2b Add bootstrap +pick fb54807aa8dc8f7b061b5419ba83302612a115c7 Reorganize files +pick 8872f410e7bbe130b582c43f4b5a963019304ee3 Update imports +pick d72a37f83a281d63c8bebd1100963fb99661beec Split models, events, routes from main.py +pick b3cfbb93da35835fb79078905139860acfbc2343 Emit and store random data +pick 51564e5cf4db26f35af291b0d4ebc94af741567e Rename runs.py to runtracker.py +pick 195af6306995710563afe77d36f4c609ecc3474a Replace main.py with telemetry.py +pick 48fb0c146bbffcee3851359766217bd7304f5dd3 Remove test.py, serial ports +pick 8e5165cacd1483b0be977062fbf9d1858c8769c8 Add venv/ +pick 78fa0098ae1f57a92f9c7e4618ada62d6015bb8c Update requirements.txt +pick ee925c323ac550a2602547c203f701afabc081e6 Create websocketClient.py +pick 66a7121121f447d1d868f725df41e9361c1d9a9f Use for loops for battery.html, update socketClient.js, and add postgres db changes +pick c7bedf8abf68b1b8433676c37424f9278b7d1c77 11/7 changes +pick 1208a9fd4414032586c4599a49daad8189f592f6 Generating test data works +pick 75d0b1de7918e4977fd339aa474f7bff472a28fd General cleanup and gendata adds to the latest run +pick e9b6a6df49dfbd0aa8582659a3fbbc486f0539e0 Initial commit +pick 98ca08eba4c6db5cbd0f30c511722e1bd945a6b2 Track backend +pick 6501ecceb45fd33925471b8820e4f1b58c1ee68d Add import line that was previously untracked +pick d14239f57a5dd9ab962961fe58ed6099fdb428c1 Fix routing +pick 479f31f81fd6b42554d38684550dd3240578d390 Add BrowserRouter component +pick 457f654847b7f1fd4ad5a74d49b79610fe9596c7 Add unfinished LineChart to prevent error +pick d5223f6f9ef79952162f4b2b017dccc208251d17 Add the ability to use next ports if 5000 is busy +pick f9b6c7a8a09091671243d51bb49deb8676a65d37 Switch to port 5050 for server +pick 246c20cda9e8b8573355add555757f50adec964a Switch to port 5050 for server +pick b6f7c7373f7f233611390ae99eb2057785233b63 merge branch dev +pick aed5bcb9dfa6022c0147ec719a453d065062ca0a Add unfinished LineChart to prevent error diff --git a/rebase-merge/git-rebase-todo.backup b/rebase-merge/git-rebase-todo.backup new file mode 100644 index 0000000..86ab921 --- /dev/null +++ b/rebase-merge/git-rebase-todo.backup @@ -0,0 +1,121 @@ +pick c2a0a97af929b0ba9b6114af443d7a95245916bf Initial commit +pick 3597b60b3c7558e0c8df827d2c5ef2dc21e17890 Telemetry Website +pick 819bb93651c41e8cdd8929a1526438ee4dc9f3c8 Added requirements.txt +pick 1da413128afd1db252af868312b47b3c790ce0d4 Updated chart to be dynamic +pick 3b720468926b484e84fcc3b5ca0c2415fa030c76 Update battery.html +pick ccd9f12e201a20352951d7166e9bb529da4d49ab modifying documentation +pick db2cbe6e206aed91f18fcde3cd4b24c6f921d7e9 Added solar page +pick 31cb41e53b8da3568558aebbb5c27af43c6b455d Battery page update +pick bf0725e067a1d9bffdf37881887b90cb4071139e Update README.md +pick b85906e4f9ea591284948ee95ccfdc383768efd2 Random number updating +pick 0ede6ad9581a0033218b7d8d98814238a0961b3f Update solar page +pick 84b5743e822045467ad48e2e653dae7e28f750e8 Created object to handle data +pick 1a95499a691db25fc4ec71078b51b7f59c512fac Implemented interactive graph, logging data to file +pick 34ca57439e6e8b88532b189efd16b8efb292471e Small UI update +pick 33fe1eb27021a4010f87ab872299163ecac07b30 Added Xbee receiver code +pick f21ea1ca23500b90228b6249c938327356aab177 battery page update, graph.html, control.html +pick 5d4f325ee856f13537e8af71a8db7cd3c9f45b51 Dygraphs and faults page implementation +pick a46111db0209b850ccf0358fd98a0dfd62bb2dec Updated client.js +pick 964ba9f18c87746ef53f8461323df9c7b08e1453 ArduinoJson MessagePack file +pick f0b2748d7a1732358523faa5688bffc944b145ee Updated battery page +pick a99ee4e83813cbaa4eb32bf78304ac05006710e5 Implemented local storage +pick 208205915f93db33205903d4917d831feeae86b6 faults page update +pick 2086c611a1e5e5cd504b73e51dd67901a1b9dffd Implemented sqlite db +pick 06866a3cc424241c95151ebb5123bf8b1e1ad675 Create db file +pick 0f7c02b8223d04981e996aca26935a0d7a122965 Update requirements.txt +pick 4cf7dc56008ece36adcc92b7f6bd0521bdd48732 BMS Database model +pick 5ab01bd77e5b435461972fc71a7f39c63bf99054 Delete glibc.cpython-37.pyc +pick 2ae4a7fd253f99374a987fe30344f8d07b24f95f KLS model +pick d422fa25657e6a1d0ccf66af7618dc90b174d904 models updated to hold correct value types +pick fc6dc723668969ea9b411e34c94ed5212d4e8efb socat fake serial port server done +pick ab2fcc0079f65a2ac11b652cb23d6ab9e4fe2c38 prob conflicts here +pick 235294a4f21a6b827eb3b00cab42c94d4ffa894a new libraries needed +pick cc501976f817579102bd1dd172e7e9ed191092b8 primary key +pick e6399f6c5db5bd865f0378e4ca1454afc0ee3b5f Updated db storage +pick b41801b0e4d03068c770c3462f1ad6755a83b4d7 packing unpacking +pick 9e8bdef64256716a2fc7736a0d9176bf06e3ad2c models.py and client.js +pick e97f1e25ea7ccc8b838c8d9ec410fa81a92c55a0 testing fake serial port +pick 9a8d2b6ae498b294213216db35d8782fd66b52cf changes to gitignore +pick 8388df8d892c438e6493ed0705657440ad9d9dae Fixed data_read.py +pick 05b98f189070048b6eb462c1e6b99c92fc09a4a0 Updated main.py to read from serial +pick f3c0d84003c40894c022b8c04e5619a9e50b875a Updated random serial data +pick a49e69f3cf680cb6e0e960e83846df3d41c0c498 fake serial +pick dd568ab18782026cba50341826475f57d1afcfbf Fixed errors +pick 3ed93f461613233919841dd775664ee5d5589c2f Updated client.js +pick 3e59eb3217bc8b29a75f106907ec22b76ab4f5d5 Storing data in db +pick d2d860c76ee2044995f28a6f077de71ef0a6639f Fixed bug preventing loop +pick 09369e9a1945dda7276cda8a56bd069a679994ed Add database file to gitignore +pick 75890ed2b5252a14384db98daa7035479d5df252 Added option to bypass serial +pick 2299e26373b47f116e2c15e9e402994d22d008bc PostgreSQL +pick 03243055154ddaefb16d712fcab1cfb2e9d188d8 Sidebar and Password +pick 9b319728fab26159325f3a2714ab78d6e7cf8da0 Warning System +pick 42363c5ae138a3d9178d68c30ab5edb1f79bb9ab Updated SOC chart +pick 50322d8317362414268e8d4a8d577515d720dfbb Update jQuery version +pick 3dbbcbbd7e8b15fad57332eed74992589b17cf9f Created Layout.html +pick 56bb0fb961bb40b2d3f03c32bbb71cb11243d80a Update main.py +pick 5279658ed31dde3747a8b9748f2b6497248a7db7 Update sidebar.html +pick f16a8103033c5e6853f18d82bbde677c9b2254ba Update layout.html +pick 8e484df76062b5f8b045992e77d4f03c2151c822 Bug fixes +pick 5d83b9e469b77a764df5052de7b598464d853f4d Scrollbar +pick bf69142c39dd77d4825072eacd537f989c98862b Updated UI +pick f719869106ea3000818781f1c28909d1cf171bca Warning System, Battery and Solar chart functionality +pick 21cb1a19c008880553f161ba3599ebf48c5061b7 small battery chart update +pick 219d4486cff70b493234c048a27399f7ae2113e6 admin page setup +pick b458e725e98b22a3b1919fe7328a0bf590add906 useSerial bug +pick 70c19d4d2d0305ba85e06e5651d0879a0544f4bf Storing and loading runs from db +pick 1e12aea63661c91847d7e901694dcc0a4e6a466c Created global runTracker object +pick 507de6c39590fd415582161821d838d7d45acb7c Replace dataEvent with emit_data loop +pick d8b7612b2ea13ed15c8fb093eed74db5fadb0a2b Add bootstrap +pick fb54807aa8dc8f7b061b5419ba83302612a115c7 Reorganize files +pick 8872f410e7bbe130b582c43f4b5a963019304ee3 Update imports +pick d72a37f83a281d63c8bebd1100963fb99661beec Split models, events, routes from main.py +pick b3cfbb93da35835fb79078905139860acfbc2343 Emit and store random data +pick 51564e5cf4db26f35af291b0d4ebc94af741567e Rename runs.py to runtracker.py +pick 195af6306995710563afe77d36f4c609ecc3474a Replace main.py with telemetry.py +pick 48fb0c146bbffcee3851359766217bd7304f5dd3 Remove test.py, serial ports +pick 8e5165cacd1483b0be977062fbf9d1858c8769c8 Add venv/ +pick 78fa0098ae1f57a92f9c7e4618ada62d6015bb8c Update requirements.txt +pick ee925c323ac550a2602547c203f701afabc081e6 Create websocketClient.py +pick 66a7121121f447d1d868f725df41e9361c1d9a9f Use for loops for battery.html, update socketClient.js, and add postgres db changes +pick c7bedf8abf68b1b8433676c37424f9278b7d1c77 11/7 changes +pick 1208a9fd4414032586c4599a49daad8189f592f6 Generating test data works +pick 75d0b1de7918e4977fd339aa474f7bff472a28fd General cleanup and gendata adds to the latest run +pick e9b6a6df49dfbd0aa8582659a3fbbc486f0539e0 Initial commit +pick 98ca08eba4c6db5cbd0f30c511722e1bd945a6b2 Track backend +pick 6501ecceb45fd33925471b8820e4f1b58c1ee68d Add import line that was previously untracked +pick d14239f57a5dd9ab962961fe58ed6099fdb428c1 Fix routing +pick 479f31f81fd6b42554d38684550dd3240578d390 Add BrowserRouter component +pick 457f654847b7f1fd4ad5a74d49b79610fe9596c7 Add unfinished LineChart to prevent error +pick d5223f6f9ef79952162f4b2b017dccc208251d17 Add the ability to use next ports if 5000 is busy +pick f9b6c7a8a09091671243d51bb49deb8676a65d37 Switch to port 5050 for server +pick 246c20cda9e8b8573355add555757f50adec964a Switch to port 5050 for server +pick b6f7c7373f7f233611390ae99eb2057785233b63 merge branch dev +pick aed5bcb9dfa6022c0147ec719a453d065062ca0a Add unfinished LineChart to prevent error + +# Rebase 2a7dcd3..aed5bcb onto 2a7dcd3 (93 commands) +# +# Commands: +# p, pick = use commit +# r, reword = use commit, but edit the commit message +# e, edit = use commit, but stop for amending +# s, squash = use commit, but meld into previous commit +# f, fixup [-C | -c] = like "squash" but keep only the previous +# commit's log message, unless -C is used, in which case +# keep only this commit's message; -c is same as -C but +# opens the editor +# x, exec = run command (the rest of the line) using shell +# b, break = stop here (continue rebase later with 'git rebase --continue') +# d, drop = remove commit +# l, label