#!/usr/bin/python
# -*- coding:utf-8 -*-
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, json,signal
TEMPLATE_PATH.append('/home/christian/WebControl/')
certfile = '/home/christian/WebControl/ssl/cert.pem'
keyfile = '/home/christian/WebControl/ssl/key.pem'
Ab = AlphaBot()
script_process = None
duration = 1
speed = 30
# Stocke les dernières données reçues
validation_results = {"name": None, "confidence": None}
@get("/")
def 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")
@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")
@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('{{message}}
', 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('{{message}}
', message=message)
@post("/cmd")
def cmd():
global speed, script_process
response.content_type = 'application/json'
# Lecture du code de commande depuis la requête
code = request.body.read().decode()
# 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:
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:
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})
@route('/')
def server_static(filename):
return static_file(filename, root='./')
@route('/templates/')
def server_templates(filename):
return static_file(filename, root='./templates/')
@route('/images/')
def server_images(filename):
return static_file(filename, root='./images/')
@route('/fonts/')
def server_fonts(filename):
return static_file(filename, root='./fonts/')
@route('/js/')
def server_js(filename):
return static_file(filename, root='./js/')
@route('/css/')
def server_css(filename):
return static_file(filename, root='./css/')
@route('/modules/')
def server_modules(filename):
return static_file(filename, root='./modules/')
@route('/apps/')
def server_apps(filename):
return static_file(filename, root='./apps/')
@route('/tests/')
def server_tests(filename):
return static_file(filename, root='./tests/')
def wait_for_network():
while True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
localhost = s.getsockname()[0]
s.close()
return localhost
except OSError:
print("Le réseau est inaccessible. Réessayer dans 5 secondes...")
time.sleep(5)
localhost = wait_for_network()
# 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)