diff --git a/python/debugserver.py b/python/debugserver.py new file mode 100644 index 0000000..f9c2261 --- /dev/null +++ b/python/debugserver.py @@ -0,0 +1,63 @@ +from threading import Thread +from flask import Flask, jsonify, send_file +from time import sleep +from dataclasses import dataclass +from datetime import datetime +import serial +import uuid +from collections import deque +import sys +from obus import Message + +app = Flask(__name__) + +server_id = uuid.uuid4() +print("Server ID: ", server_id) + +@dataclass +class SharedData: + messages: deque + last_message_index: int + +# Keep this the same as max_messages on the client! +max_message_cache = 200 +shared_data = SharedData(deque(maxlen=max_message_cache), -1) + + +def serial_reader(serialport, shared_data): + with serial.Serial(serialport, 115200, timeout=0.05) as ser: + while True: + line = ser.read(12) + if not line: + continue + print(line) + if len(line) == 12: + if line == b'BEGIN START\n' or line[0] > 0b111: + continue + sender = (int(line[0]) << 8) + int(line[1]) + size = int(line[2]) + message = line[3:3+size] + received = Message(message, sender, datetime.now()) + shared_data.messages.append(received.serialize()) + shared_data.last_message_index += 1 + print(shared_data.last_message_index) + +@app.route('/') +def index(): + return send_file('static/debugger.html') + +@app.route('//api.json') +def api(last_received): + last_received = int(last_received) + if last_received < shared_data.last_message_index - len(shared_data.messages): + return jsonify({"server_id": server_id, "newest_msg": shared_data.last_message_index, "messages": list(shared_data.messages)}) + else: + return jsonify({"server_id": server_id, "newest_msg": shared_data.last_message_index, "messages": list(shared_data.messages)[len(shared_data.messages) - (shared_data.last_message_index - last_received):]}) + +if __name__ == '__main__': + if len(sys.argv) != 2: + print("Usage: python3 debugserver.py [serial port]") + sys.exit() + thread = Thread(target=serial_reader, args=(sys.argv[1], shared_data, )) + thread.start() + app.run(debug=False, host='0.0.0.0')