Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 118 additions & 0 deletions gcs-react-app/backend/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)