CARIA.2.2
Update for the final presentation huge change with previous version
This commit is contained in:
@@ -1,155 +1,180 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding:utf-8 -*-
|
||||
from bottle import get,post,run,route,request,template,static_file,TEMPLATE_PATH
|
||||
from bottle import get,redirect,post,run,route,request,response,template,static_file,TEMPLATE_PATH
|
||||
from joyit_mfrc522 import SimpleMFRC522
|
||||
from modules.AlphaBot import AlphaBot
|
||||
import threading, socket, os, sys, time, subprocess, ssl
|
||||
import threading, socket, os, sys, time, subprocess, ssl, json,signal
|
||||
|
||||
|
||||
TEMPLATE_PATH.append('/home/christian/WebControl/')
|
||||
car = AlphaBot()
|
||||
certfile = '/home/christian/WebControl/ssl/cert.pem'
|
||||
keyfile = '/home/christian/WebControl/ssl/key.pem'
|
||||
Ab = AlphaBot()
|
||||
script_process = None
|
||||
speed = 50 # Valeur de vitesse par défaut
|
||||
duration = 1
|
||||
speed = 30
|
||||
# Stocke les dernières données reçues
|
||||
validation_results = {"name": None, "confidence": None}
|
||||
|
||||
@get("/")
|
||||
def index():
|
||||
return template('templates/index')
|
||||
# Chemin vers le fichier JSON
|
||||
json_file_path = '/home/christian/WebControl/logs/resultats_tests.json'
|
||||
|
||||
# Lire le fichier JSON
|
||||
with open(json_file_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
last_15_results = data[-10:][::-1]
|
||||
return template('templates/index', message="", results=last_15_results)
|
||||
|
||||
@get("/tests")
|
||||
def tests():
|
||||
return template("templates/tests")
|
||||
|
||||
# Test programmes
|
||||
@post('/servo_motor')
|
||||
def servo_motor():
|
||||
global script_process # Assurez-vous d'utiliser la variable globale script_process dans cette fonction
|
||||
action = request.forms.get('action')
|
||||
if action == 'start':
|
||||
script_process = subprocess.Popen(['python3', 'tests/servo_motor.py'])
|
||||
elif action == 'stop' and script_process is not None:
|
||||
script_process.terminate() # Arrêter le script si script_process est défini
|
||||
return 'OK'
|
||||
@post('/motor_speed_move')
|
||||
def motor_speed_move():
|
||||
global script_process # Assurez-vous d'utiliser la variable globale script_process dans cette fonction
|
||||
action = request.forms.get('action')
|
||||
if action == 'start':
|
||||
script_process = subprocess.Popen(['python3', 'tests/motor_speed_move.py'])
|
||||
elif action == 'stop' and script_process is not None:
|
||||
script_process.terminate() # Arrêter le script si script_process est défini
|
||||
return 'OK'
|
||||
@post('/infrared_obstacle_module')
|
||||
def infrared_obstacle_module():
|
||||
global script_process # Assurez-vous d'utiliser la variable globale script_process dans cette fonction
|
||||
action = request.forms.get('action')
|
||||
if action == 'start':
|
||||
script_process = subprocess.Popen(['python3', 'tests/infrared_obstacle_module.py'])
|
||||
elif action == 'stop' and script_process is not None:
|
||||
script_process.terminate() # Arrêter le script si script_process est défini
|
||||
return 'OK'
|
||||
@post('/lidar_module')
|
||||
def lidar_module():
|
||||
global script_process # Assurez-vous d'utiliser la variable globale script_process dans cette fonction
|
||||
action = request.forms.get('action')
|
||||
if action == 'start':
|
||||
script_process = subprocess.Popen(['sudo', 'python3', 'tests/lidar_module.py'])
|
||||
elif action == 'stop' and script_process is not None:
|
||||
script_process.terminate() # Arrêter le script si script_process est défini
|
||||
return 'OK'
|
||||
@post('/rfid_read_write_module')
|
||||
def rfid_read_write_module():
|
||||
global script_process # Assurez-vous d'utiliser la variable globale script_process dans cette fonction
|
||||
action = request.forms.get('action')
|
||||
if action == 'start':
|
||||
script_process = subprocess.Popen(['python3', 'tests/rfid_read_write_module.py'])
|
||||
elif action == 'stop' and script_process is not None:
|
||||
script_process.terminate() # Arrêter le script si script_process est défini
|
||||
return 'OK'
|
||||
@get("/access")
|
||||
def show_validation():
|
||||
# Rendre le fichier HTML access.html avec les résultats actuels
|
||||
return template("templates/access",name=validation_results["name"],confidence=validation_results["confidence"],status="Aucune validation reçue" if not validation_results["name"] else "Succès")
|
||||
|
||||
# Fonctionnalité programmes
|
||||
@post('/infrared_tracking_objects')
|
||||
def infrared_tracking_objects():
|
||||
global script_process # Assurez-vous d'utiliser la variable globale script_process dans cette fonction
|
||||
action = request.forms.get('action')
|
||||
if action == 'start':
|
||||
script_process = subprocess.Popen(['python3', 'apps/infrared_tracking_objects.py'])
|
||||
elif action == 'stop' and script_process is not None:
|
||||
script_process.terminate() # Arrêter le script si script_process est défini
|
||||
return 'OK'
|
||||
@post('/infrared_obstacle_avoidance')
|
||||
def infrared_obstacle_avoidance():
|
||||
global script_process # Assurez-vous d'utiliser la variable globale script_process dans cette fonction
|
||||
action = request.forms.get('action')
|
||||
if action == 'start':
|
||||
script_process = subprocess.Popen(['python3', 'apps/infrared_obstacle_avoidance.py'])
|
||||
elif action == 'stop' and script_process is not None:
|
||||
script_process.terminate() # Arrêter le script si script_process est défini
|
||||
return 'OK'
|
||||
@post("/access")
|
||||
def access():
|
||||
global validation_results
|
||||
# Récupère les données de la requête
|
||||
data = request.json
|
||||
name = data.get('name')
|
||||
confidence = data.get('confidence')
|
||||
# Met à jour les résultats
|
||||
validation_results["name"] = name
|
||||
validation_results["confidence"] = confidence
|
||||
# Affiche les résultats dans la console
|
||||
print(f"Validation received: Name: {name}, Confidence: {confidence}")
|
||||
# Répond avec un succès
|
||||
response.status = 200
|
||||
return {"status": "success"}
|
||||
|
||||
@post("/restartPi")
|
||||
def restart_pi():
|
||||
try:
|
||||
# Commande pour redémarrer le Raspberry Pi
|
||||
subprocess.run('sudo reboot', shell=True, check=True)
|
||||
message = "Redémarrage en cours..."
|
||||
except Exception as e:
|
||||
# Gestion des erreurs, retour d'un message d'erreur si la commande échoue
|
||||
message = f"Erreur lors du redémarrage: {str(e)}"
|
||||
# Retourne un message au client
|
||||
return template('<b>{{message}}</b><br><form action="/" method="post"><input type="submit" value="Retour"></form>', message=message)
|
||||
|
||||
@post("/restartMotion")
|
||||
def restart_motion():
|
||||
try:
|
||||
# Arrêter Motion si en cours
|
||||
subprocess.run('sudo pkill -f motion', shell=True, check=True)
|
||||
# Redémarrer Motion
|
||||
subprocess.run('sudo /usr/bin/motion', shell=True, check=True)
|
||||
message = 'Motion redémarré'
|
||||
except subprocess.CalledProcessError as e:
|
||||
# Gestion des erreurs si les commandes échouent
|
||||
message = f"Erreur lors du redémarrage de Motion: {str(e)}"
|
||||
# Retourner un message au client
|
||||
return template('<b>{{message}}</b><br><form action="/" method="post"><input type="submit" value="Retour"></form>', message=message)
|
||||
|
||||
@post("/cmd")
|
||||
def cmd():
|
||||
global speed # Déclarer speed comme variable globale pour pouvoir y accéder dans cette fonction
|
||||
global speed, script_process
|
||||
response.content_type = 'application/json'
|
||||
|
||||
# Lecture du code de commande depuis la requête
|
||||
code = request.body.read().decode()
|
||||
speed_str = request.POST.get('speed')
|
||||
|
||||
# Récupération de la vitesse si elle est présente
|
||||
speed_str = request.forms.get('speed')
|
||||
if speed_str is not None:
|
||||
try:
|
||||
speed = int(speed_str)
|
||||
if 0 <= speed <= 100:
|
||||
car.setPWMA(speed)
|
||||
car.setPWMB(speed)
|
||||
Ab.setPWMA(speed)
|
||||
Ab.setPWMB(speed)
|
||||
print("Vitesse définie à", speed)
|
||||
else:
|
||||
return json.dumps({"error": "La vitesse doit être comprise entre 0 et 100."})
|
||||
except ValueError:
|
||||
print("") # Invalid speed value
|
||||
return json.dumps({"error": "La vitesse doit être un nombre entier."})
|
||||
try:
|
||||
if code == "stop":
|
||||
Ab.stop(duration)
|
||||
message = 'Voiture arrêtée'
|
||||
elif code == "forward":
|
||||
Ab.forward(duration, speed)
|
||||
message = 'Voiture en avant'
|
||||
elif code == "backward":
|
||||
Ab.backward(duration, speed)
|
||||
message = 'Voiture en arrière'
|
||||
elif code == "turnleft":
|
||||
Ab.left(duration, speed)
|
||||
message = 'Voiture tourne à gauche'
|
||||
elif code == "turnright":
|
||||
Ab.right(duration, speed)
|
||||
message = 'Voiture tourne à droite'
|
||||
# TESTS
|
||||
elif code == "testServo":
|
||||
script_process = subprocess.Popen(['python3', 'tests/servo_motor.py'])
|
||||
message = 'Servo moteur OK'
|
||||
elif code == "appRFIDCarDoor":
|
||||
script_process = subprocess.Popen(['python3', 'tests/rfid_open_door.py'])
|
||||
message = 'Module RFID Door OK'
|
||||
elif code == "testRotor":
|
||||
script_process = subprocess.Popen(['python3', 'tests/motor_speed_move.py'])
|
||||
message = 'Moteurs OK'
|
||||
elif code == "testLidar":
|
||||
script_process = subprocess.Popen(['sudo', 'python3', 'tests/lidar_module.py'])
|
||||
message = 'Module Lidar OK'
|
||||
elif code == "testObstacle":
|
||||
script_process = subprocess.Popen(['python3', 'tests/infrared_obstacle_module.py'])
|
||||
message = 'Module IR obstacle OK'
|
||||
#APPS
|
||||
elif code == "appRFID":
|
||||
script_process = subprocess.Popen(['python3', 'apps/rfid_read_write_module.py'])
|
||||
message = 'Lecture et écriture RFID OK'
|
||||
elif code == "appLidarSpeed":
|
||||
script_process = subprocess.Popen(['sudo', 'python3', 'apps/lidar_speed_move.py'])
|
||||
message = 'Régulation de la vitesse par Lidar OK'
|
||||
elif code == "appEmergencyStop":
|
||||
script_process = subprocess.Popen(['python3', 'apps/infrared_obstacle_avoidance.py'])
|
||||
message = 'Emergency STOP par IR OK'
|
||||
else:
|
||||
return json.dumps({"error": f"Commande inconnue ({code})"})
|
||||
except Exception as e:
|
||||
return json.dumps({"error": str(e)})
|
||||
return json.dumps({"message": message})
|
||||
|
||||
if code == "stop":
|
||||
car.stop()
|
||||
elif code == "forward":
|
||||
car.forward(speed)
|
||||
elif code == "backward":
|
||||
car.backward(speed)
|
||||
elif code == "turnleft":
|
||||
car.left(speed)
|
||||
elif code == "turnright":
|
||||
car.right(speed)
|
||||
else:
|
||||
print("") # Unknown command
|
||||
return "OK"
|
||||
|
||||
@route('/<filename>')
|
||||
@route('/<filename:path>')
|
||||
def server_static(filename):
|
||||
return static_file(filename, root='./')
|
||||
@route('/templates/<filename>')
|
||||
@route('/templates/<filename:path>')
|
||||
def server_templates(filename):
|
||||
return static_file(filename, root='./templates/')
|
||||
@route('/images/<filename>')
|
||||
@route('/images/<filename:path>')
|
||||
def server_images(filename):
|
||||
return static_file(filename, root='./images/')
|
||||
@route('/fonts/<filename>')
|
||||
@route('/fonts/<filename:path>')
|
||||
def server_fonts(filename):
|
||||
return static_file(filename, root='./fonts/')
|
||||
@route('/js/<filename>')
|
||||
@route('/js/<filename:path>')
|
||||
def server_js(filename):
|
||||
return static_file(filename, root='./js/')
|
||||
@route('/css/<filename>')
|
||||
@route('/css/<filename:path>')
|
||||
def server_css(filename):
|
||||
return static_file(filename, root='./css/')
|
||||
@route('/modules/<filename>')
|
||||
@route('/modules/<filename:path>')
|
||||
def server_modules(filename):
|
||||
return static_file(filename, root='./modules/')
|
||||
@route('/apps/<filename>')
|
||||
@route('/apps/<filename:path>')
|
||||
def server_apps(filename):
|
||||
return static_file(filename, root='./apps/')
|
||||
@route('/tests/<filename>')
|
||||
@route('/tests/<filename:path>')
|
||||
def server_tests(filename):
|
||||
return static_file(filename, root='./tests/')
|
||||
|
||||
# Chemins vers le certificat SSL et la clé privée
|
||||
certfile = '/home/christian/WebControl/ssl/cert.pem'
|
||||
keyfile = '/home/christian/WebControl/ssl/key.pem'
|
||||
|
||||
# Créez un contexte SSL
|
||||
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
|
||||
ssl_context.load_cert_chain(certfile=certfile, keyfile=keyfile)
|
||||
|
||||
def wait_for_network():
|
||||
while True:
|
||||
try:
|
||||
@@ -159,9 +184,14 @@ def wait_for_network():
|
||||
s.close()
|
||||
return localhost
|
||||
except OSError:
|
||||
print("Le réseau est inaccessible. Réessai dans 5 secondes...")
|
||||
print("Le réseau est inaccessible. Réessayer dans 5 secondes...")
|
||||
time.sleep(5)
|
||||
|
||||
localhost = wait_for_network()
|
||||
|
||||
run(host=localhost, port=8000, server='wsgiref', debug=True, ssl_context=ssl_context)
|
||||
# Créez un contexte SSL
|
||||
# ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
|
||||
# ssl_context.load_cert_chain(certfile=certfile, keyfile=keyfile)
|
||||
# run(host=localhost, port=8000, server='wsgiref', debug=True, ssl_context=ssl_context)
|
||||
|
||||
run(host=localhost, port=8000, server='wsgiref', debug=True)
|
||||
|
||||
Reference in New Issue
Block a user