From f8334f98acae0a2db2203eaed60433b2c5411711 Mon Sep 17 00:00:00 2001 From: Arnav Chowdhry <90722645+Arnav7501@users.noreply.github.com> Date: Fri, 23 Jan 2026 14:16:32 -0800 Subject: [PATCH] commit --- gcs-react-app/backend/base.py | 118 ++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/gcs-react-app/backend/base.py b/gcs-react-app/backend/base.py index eedcc7f..df69262 100644 --- a/gcs-react-app/backend/base.py +++ b/gcs-react-app/backend/base.py @@ -146,3 +146,121 @@ def testroute(): return data socketio.run(api, debug=True, port=9999) +import eventlet +#eventlet.monkey_patch() + +from flask import Flask, request +from flask_cors import CORS +from flask_socketio import SocketIO +from threading import Lock +from Serialport import MockSerialport +from serial2num_PORT import serial2num + +from generate_data import generate + +api = Flask(__name__) +api.config['SECRET_KEY'] = 'secret!' +CORS(api, resources={r"/*": {"origins": "http://localhost:3000"}}) # allows requests to /api/ pages from origin localhost:3000 (frontend) +socketio = SocketIO(api, async_mode="eventlet", cors_allowed_origins="*", ping_interval=5, always_connect=True) + +thread_lock = Lock() + +ser = MockSerialport() +state = {"IMU" : [], + "HIGH_G_ACCEL" : [], + "LOW_G_ACCEL" : [], + "GYROSCOPE" : [], + "BAROMETER" : [], + "MAGNETOMETER" : []} + +queue = [] + +# TODO: +# - send graph state to frontend on connect +# - change update_data() to start on backend start, rather than first user connect +# - clean up backend structure (https://hackersandslackers.com/flask-application-factory/) + +# generates randomized data from a serialport every 2 seconds +def update_data(): + global ser, queue + while True: + socketio.sleep(2) + print("updated data!") + generate(ser) + data = serial2num(ser) + for item in data: + queue.insert(0, item) + +# sends any data waiting in the queue to the frontend +def send_data(): + global queue, state + count = 0 + while True: + socketio.sleep(1) + while len(queue) > 0: + count += 1 + print('Sending data...') + packet = queue.pop() + + #send only IMU data (FOR TESTING PURPOUSE) + if (packet[0] == "IMU"): + state[packet[0]].extend(packet[2]) + state[packet[0]][-5:] + print(packet) + socketio.emit(f'send_data_{packet[0]}', + {'label': 'Server generated event', + 'name': packet[0], + 'num': packet[1], + 'data': packet[2], + 'count': count}) + + #send all types of data + state[packet[0]].extend(packet[2]) + state[packet[0]][-5:] + print(packet) + socketio.emit(f'send_data_{packet[0]}', + {'label': 'Server generated event', + 'name': packet[0], + 'num': packet[1], + 'data': packet[2], + 'count': count}) + +def send_state(): + global state + for s in state: + socketio.emit(f'send_data_{s}', + {'label': 'Server generated event', + 'name': s, + 'num': len(state[s]), + 'data': state[s]}) + +# inits threads on first connect and maintains connected_users +@socketio.on("connect") +def connect_msg(): + print(request.sid) + print('Client is connected!') + send_state() + socketio.emit('connected', {'data': f"id: {request.sid} is connected."}) + +# stops send_data thread if no users are connected +@socketio.on("disconnect") +def disconnect_msg(): + print('Client disconnected!') + +@socketio.on("reconnect") +def reconnect_msg(): + print('Client reconnected!') + +# example GET route +@api.route('/api/test') +def testroute(): + data = { + "velocity": 1, + "accel": 2 + } + + return data + +socketio.start_background_task(update_data) +socketio.start_background_task(send_data) +socketio.run(api, debug=True, port=9999)