-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
247 lines (196 loc) · 6.16 KB
/
app.py
File metadata and controls
247 lines (196 loc) · 6.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
from flask import Flask, render_template, request, redirect, url_for, session, Response, jsonify
from flask_socketio import SocketIO, emit
from image_processing.measure_from_video import MeasureFromVideo
from image_processing.measure_from_camera import MeasureFromCamera
import secrets
import os
# App object
app = Flask(__name__)
app.secret_key = secrets.token_hex(16)
# Socket object
async_mode = None
socketio = SocketIO(app, async_mode=async_mode)
# Image processing object
# measure_from_video = MeasureFromVideo('data/videos_pendule/video_robustness.avi')
measure_from_video = MeasureFromCamera(0)
# Global variables
ip_login = None
ip_save = None
btnState = True
plotReady = False
running = False
# Users known
users = [
{"name": "student", "pwd": "pendule"}
]
# Check if the user is known
def search_user(username, password):
for user in users:
if user['name'] == username and user['pwd'] == password:
return user
return None
# Main web page
@app.route('/')
def index():
print('IP user : ' + request.environ['REMOTE_ADDR'])
print('IP serveur : ' + request.remote_addr)
if 'username' in session:
return redirect(url_for('mesure'))
else:
return redirect(url_for('login'))
# Login web page
@app.route('/login', methods=["POST", "GET"])
def login():
global ip_login
global ip_save
# Check if POST request
if request.method == "POST" :
# Get the username and password that the user has entered
name = request.form.get('username')
pwd = request.form.get('password')
# Check if the username and password are known
user = search_user(name, pwd)
# If user known
if user != None and ip_login == None:
# Save ip of user connected
ip_login = request.remote_addr
ip_save = request.remote_addr
# Add user to the session
session['username'] = user['name']
# Redirect user to mesure web page
return redirect(url_for('mesure'))
else:
# Display user to login web page
return render_template("login.html")
else:
# if user already connected
if 'username' in session:
# Redirect user to mesure web page
return redirect(url_for('mesure'))
# Display user to login web page
return render_template("login.html")
# Logout web page
@app.route('/logout', methods=["POST", "GET"])
def logout():
global ip_login
global ip_save
global btnState
global plotReady
btnState = True
plotReady = False
# Forbidding disconnection by get request
# Another user could disconnect any user connected to a session
if request.method == "GET":
return redirect(url_for('mesure'))
# Remove csv file of data if exists
file = 'mesure.csv'
if(os.path.exists(file) and os.path.isfile(file)):
os.remove(file)
print("file deleted")
else:
print("file not found")
# Clear ip variables
ip_login = None
ip_save = None
# Pop user of session
session.pop('username', None)
return redirect(url_for('login'))
# Mesure web page
@app.route('/mesure', methods=["POST", "GET"])
def mesure():
# Check if a user is connected
if ('username' in session) and (ip_save == request.remote_addr) :
# Display mesure web page
return render_template("mesure.html",sync_mode=socketio.async_mode)
else:
# Redirect user to login web page
return redirect(url_for('login'))
# Get global variables of "app.py"
@app.route('/getValues', methods=['POST'])
def get_Values():
global plotReady
global btnState
global running
return {'_plotReady' : plotReady, '_btnState' : btnState, '_running' : running}
# Get data in csv file
@app.route("/getPlotCSV")
def getPlotCSV():
# Check if a user is connected
if ('username' in session) and (ip_save == request.remote_addr) :
with open("mesure.csv") as fp:
csv = fp.read()
return Response(
csv,
mimetype="text/csv",
headers={"Content-disposition":"attachment; filename=mesure.csv"})
else:
# Redirect user to login web page
return redirect(url_for('login'))
# Get the data from the measure class
@app.route('/data')
def get_data():
# Check if a user is connected
if ('username' in session) and (ip_save == request.remote_addr) :
data = measure_from_video.signal
return jsonify(data)
else:
# Redirect user to login web page
return redirect(url_for('login'))
# Background task
@socketio.on('run', namespace='/backgroundTasks')
def run_lengthy_task(data):
try:
global btnState
global plotReady
global running
btnState = False
plotReady = False
running = True
# Get acquisition time
duration = int(data['duration'])
# Run measures from video
# measure_from_video.run() # To run tests on videos
measure_from_video.run(duration)
btnState = True
plotReady = True
running = False
# Emit done event
emit('task_done', broadcast=True)
except Exception as ex:
print(ex)
# Stop background task
@socketio.on('stop', namespace='/backgroundTasks')
def stop_task():
try:
global btnState
global running
global plotReady
btnState = True
running = False
plotReady = True
# Stop measures from video
measure_from_video.early_stopping()
except Exception as ex:
print(ex)
# Connection of WebSocket
@socketio.on('connect')
def connect():
global ip_login
global ip_save
if ip_save == request.remote_addr :
ip_login = ip_save
print('Client connected')
# Disconnection of WebSocket
@socketio.on('disconnect')
def disconnect():
global ip_login
global ip_save
print('Client disconnected')
if ip_save == request.remote_addr :
ip_login = None
session.pop('username', None)
print('IP disconnected')
print(request.remote_addr)
if __name__ == '__main__':
# app.run(debug=True)
socketio.run(app)