diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f1c64b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +Thumbs.db +.DS_Store diff --git a/WebControl/MainCLIControl.py b/WebControl/MainCLIControl.py index d0a7460..8ed50cb 100644 --- a/WebControl/MainCLIControl.py +++ b/WebControl/MainCLIControl.py @@ -25,69 +25,71 @@ def run_shell_fct(script): script_name = os.path.basename(script) # Se déplacer vers le répertoire du script et exécuter le script shell return subprocess.Popen(["sudo", "./" + script_name], cwd=script_dir) - -def main(): - python_scripts = [ - "apps/infrared_tracking_objects.py", - "apps/infrared_obstacle_avoidance.py", - "tests/servo_motor.py", - "tests/motor_speed_move.py", - "tests/rfid_read_write_module.py", - "tests/infrared_obstacle_module.py", - "tests/lidar_module.py" - ] - python_fct = [ - "WebControl/main.py" - ] - shell_fct = [ - ] - - # Liste pour stocker les PID des processus en cours d'exécution - running_processes = [] - - all_scripts = python_scripts + python_fct + shell_fct - - display_menu(all_scripts) - choice = input("Votre choix (entrez le numéro du script) : ") - - try: - choice_index = int(choice) - 1 - if choice_index < 0 or choice_index >= len(all_scripts): - raise ValueError() - - selected_script = all_scripts[choice_index] - - # Vérifie si le script est Python ou Shell et l'exécute en conséquence - if selected_script in python_scripts: - process = run_python_script(selected_script) - elif selected_script in python_fct: - process = run_python_fct(selected_script) - elif selected_script in shell_fct: - process = run_shell_fct(selected_script) - - # Ajouter le PID du processus à la liste - running_processes.append(process.pid) - - except (ValueError, IndexError): - print("Choix invalide.") - sys.exit(1) - - # Afficher les PID des processus en cours d'exécution - print("PID des processus en cours d'exécution :") - for pid in running_processes: - print(pid) - - # Attente de l'arrêt du programme - input("Appuyez sur Entrée pour quitter...") - - # Boucle pour terminer tous les processus en cours d'exécution - print("Termination des processus en cours...") - for pid in running_processes: - try: - os.kill(pid, signal.SIGTERM) - print(f"Processus {pid} terminé.") - except ProcessLookupError: - print(f"Le processus {pid} n'existe plus.") + if __name__ == "__main__": - main() + while True: + python_scripts = [ + "apps/scenario_rfid.py", + "apps/rfid_read_write_module.py", + "apps/lidar_speed_move.py", + "apps/infrared_obstacle_avoidance.py", + "tests/servo_motor.py", + "tests/rfid_open_door.py", + "tests/motor_speed_move.py", + "tests/lidar_module.py", + "tests/infrared_obstacle_module.py" + ] + python_fct = [ + # "WebControl/main.py" + ] + shell_fct = [ + # "fixs/reboot.sh" + # "fixs/fix_rfid.sh", + # "fixs/fix_motion.sh", + ] + + # Liste pour stocker les PID des processus en cours d'exécution + running_processes = [] + + all_scripts = python_scripts + python_fct + shell_fct + + display_menu(all_scripts) + choice = input("Votre choix (entrez le numéro du script) : ") + + try: + choice_index = int(choice) - 1 + if choice_index < 0 or choice_index >= len(all_scripts): + raise ValueError() + + selected_script = all_scripts[choice_index] + + # Vérifie si le script est Python ou Shell et l'exécute en conséquence + if selected_script in python_scripts: + process = run_python_script(selected_script) + elif selected_script in python_fct: + process = run_python_fct(selected_script) + elif selected_script in shell_fct: + process = run_shell_fct(selected_script) + + # Ajouter le PID du processus à la liste + running_processes.append(process.pid) + + except (ValueError, IndexError): + print("Choix invalide.") + sys.exit(1) + + # Afficher les PID des processus en cours d'exécution + print("PID des processus en cours d'exécution :") + for pid in running_processes: + print(pid) + # Attente de l'arrêt du programme + input("Appuyez sur Entrée pour quitter...\n") + # Boucle pour terminer tous les processus en cours d'exécution + print("Fermeture des processus en cours...") + for pid in running_processes: + try: + os.kill(pid, signal.SIGTERM) + print(f"Processus {pid} terminé.\n") + except ProcessLookupError: + print(f"Le processus {pid} n'existe plus.") \ No newline at end of file diff --git a/WebControl/NOTE.txt b/WebControl/NOTE.txt index a2325ec..67c47c2 100644 --- a/WebControl/NOTE.txt +++ b/WebControl/NOTE.txt @@ -1,3 +1,12 @@ crontab -e -@reboot sudo /usr/bin/motion -@reboot sh /home/christian/WebControl/webcontrol-launch.sh > /home/christian/WebControl/logs/log.txt 2>&1 \ No newline at end of file + @reboot /usr/bin/motion + @reboot /usr/bin/motion >> /home/christian/WebControl/logs/motionlogs.txt 2>&1 + @reboot sh /home/christian/WebControl/webcontrol-launch.sh >> /home/christian/WebControl/logs/log.txt 2>&1 + + ----------- + +sudo visudo + christian ALL=(ALL) NOPASSWD: /sbin/reboot + christian ALL=(ALL) NOPASSWD: /usr/bin/pkill + christian ALL=NOPASSWD: /usr/bin/python3 /home/christian/WebControl/main.py + christian ALL=NOPASSWD: /usr/bin/motion \ No newline at end of file diff --git a/WebControl/apps/infrared_obstacle_avoidance.py b/WebControl/apps/infrared_obstacle_avoidance.py index bbe68f0..9eab9ff 100644 --- a/WebControl/apps/infrared_obstacle_avoidance.py +++ b/WebControl/apps/infrared_obstacle_avoidance.py @@ -1,38 +1,36 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- import RPi.GPIO as GPIO -import time -import sys +import time, sys sys.path.append('/home/christian/WebControl/modules/') from AlphaBot import AlphaBot - Ab = AlphaBot() -speed = 100 -DR = 16 -DL = 19 -GPIO.setmode(GPIO.BCM) -GPIO.setwarnings(False) -GPIO.setup(DR,GPIO.IN,GPIO.PUD_UP) -GPIO.setup(DL,GPIO.IN,GPIO.PUD_UP) +status = "initialization" +duration = 0.1 +speed = 20 try: - while True: - DR_status = GPIO.input(DR) - DL_status = GPIO.input(DL) - if((DL_status == 1) and (DR_status == 1)): - Ab.forward(speed) - elif((DL_status == 1) and (DR_status == 0)): - Ab.left(speed) - elif((DL_status == 0) and (DR_status == 1)): - Ab.right(speed) - else: - Ab.backward(speed) - time.sleep(0.2) - Ab.left(speed) - time.sleep(0.2) - Ab.stop() - + start_time = time.time() # Enregistrer l'heure de début + while time.time() - start_time < 10: # Boucle pendant 5 seconde + OBSTACLE_PIN_status = GPIO.input(Ab.OBSTACLE_PIN) + if OBSTACLE_PIN_status == 1: + Ab.forward(duration, speed) + status = "operation successful" + else: + Ab.emergencystop() + status = "emergency stop successful" except KeyboardInterrupt: - GPIO.cleanup(); + print("Interruption par l'utilisateur.") + status = "interrupted" +finally: + Ab.cleanup() +# Vérification finale et affichage du statut +if status == "operation successful" or status == "emergency stop successful": + print(f"Le composant fonctionne correctement: {status}.") + fonctionnement_ok = True +else: + print(f"Le composant a rencontré un problème: {status}.") + fonctionnement_ok = False +Ab.enregistrer_resultats(sys.argv[0], fonctionnement_ok, status) diff --git a/WebControl/apps/infrared_tracking_objects.py b/WebControl/apps/infrared_tracking_objects.py deleted file mode 100644 index 223bf1d..0000000 --- a/WebControl/apps/infrared_tracking_objects.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import RPi.GPIO as GPIO -import time -import sys -sys.path.append('/home/christian/WebControl/modules/') -from AlphaBot import AlphaBot - -Ab = AlphaBot() - -DR = 16 -DL = 19 - -GPIO.setmode(GPIO.BCM) -GPIO.setwarnings(False) -GPIO.setup(DR,GPIO.IN,GPIO.PUD_UP) -GPIO.setup(DL,GPIO.IN,GPIO.PUD_UP) -Ab.stop() -speed=100 -try: - while True: - - DR_status = GPIO.input(DR) - DL_status = GPIO.input(DL) - if((DL_status == 0) and (DR_status == 0)): - Ab.forward(speed) - elif((DL_status == 1) and (DR_status == 0)): - Ab.right(speed) - elif((DL_status == 0) and (DR_status == 1)): - Ab.left(speed) - else: - Ab.stop() -except KeyboardInterrupt: - GPIO.cleanup(); - diff --git a/WebControl/apps/itineraire_create.py b/WebControl/apps/itineraire_create.py new file mode 100644 index 0000000..ca6b05f --- /dev/null +++ b/WebControl/apps/itineraire_create.py @@ -0,0 +1,59 @@ +import requests, json, time + +def get_directions(origin, destination, api_key): + url = f"https://maps.googleapis.com/maps/api/directions/json?origin={origin}&destination={destination}&key={api_key}" + response = requests.get(url) + if response.status_code == 200: + directions = response.json() + return directions + else: + return None + +def save_steps_to_file(directions, filename): + if directions and 'routes' in directions and len(directions['routes']) > 0: + steps = [] + for route in directions['routes']: + for leg in route['legs']: + for step in leg['steps']: + steps.append(step) + with open(filename, 'w', encoding='utf-8') as f: + json.dump(steps, f, indent=2, ensure_ascii=False) + +def save_selected_steps_to_file(directions, filename): + selected_steps = [] + if directions and 'routes' in directions and len(directions['routes']) > 0: + for route in directions['routes']: + for leg in route['legs']: + for step in leg['steps']: + selected_step = { + 'distance_value': step['distance']['value'], + 'maneuver': step.get('maneuver', 'maneuver-unspecified') + } + selected_steps.append(selected_step) + with open(filename, 'w', encoding='utf-8') as f: + json.dump(selected_steps, f, indent=2, ensure_ascii=False) + +# Paramètres +origin = "48.8224, 2.2748" # Coordonnées pour Paris (latitude, longitude) +destination = "48.67912602858551, 2.3860270345466024" # Coordonnées pour Lyon (latitude, longitude) +api_key = "AIzaSyD6WRlNBTn27rEoYbIAlxw9U_Nr_iNqLJc" + + +# Obtenir les directions +directions = get_directions(origin, destination, api_key) +print("Préparons ensemble votre itinéraire !") +time.sleep(2) +print("Veuillez saisir l'adresse de départ et l'adresse d'arrivée.") +time.sleep(2) +print("Calcul de l'itinéraire en cours : de Paris à Lyon.") +time.sleep(2) + +# Sauvegarder les étapes complètes dans un fichier JSON +steps_filename = '/home/christian/WebControl/logs/steps.json' +save_steps_to_file(directions, steps_filename) +# print(f"Les étapes complètes de l'itinéraire ont été sauvegardées dans le fichier {steps_filename}") + +# Sauvegarder les étapes sélectionnées dans un fichier JSON +selected_steps_filename = '/home/christian/WebControl/logs/selected_steps.json' +save_selected_steps_to_file(directions, selected_steps_filename) +# print(f"Les étapes sélectionnées de l'itinéraire ont été sauvegardées dans le fichier {selected_steps_filename}") \ No newline at end of file diff --git a/WebControl/apps/itineraire_suivre.py b/WebControl/apps/itineraire_suivre.py new file mode 100644 index 0000000..f6ccec8 --- /dev/null +++ b/WebControl/apps/itineraire_suivre.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import json, time, sys +sys.path.append('/home/christian/WebControl/modules/') +from AlphaBot import AlphaBot +Ab = AlphaBot() +speed = 20 + +# Fonction pour calculer la durée en fonction de la distance +def calculate_duration(distance_value): + # Réglez la vitesse de traitement selon vos besoins + speed_factor = 0.001 # Exemple 0.01/100m:s | 0.001/1km/s + return distance_value * speed_factor + +# Lecture du fichier selected_steps.json et traitement des manoeuvres +def process_selected_steps(filename): + with open(filename, 'r', encoding='utf-8') as f: + selected_steps = json.load(f) + + for step in selected_steps: + maneuver = step['maneuver'] + distance_value = step['distance_value'] + + # Calcul de la durée en fonction de la distance + duration = calculate_duration(distance_value) + + if maneuver == "maneuver-unspecified": + Ab.maneuver_unspecified(duration) + elif maneuver == "turn-slight-left": + Ab.turn_slight_left(duration, speed) + elif maneuver == "turn-sharp-left": + Ab.turn_sharp_left(duration, speed) + elif maneuver == "u-turn-left": + Ab.u_turn_left(duration, speed) + elif maneuver == "turn-left": + Ab.left(duration, speed) + elif maneuver == "turn-slight-right": + Ab.turn_slight_right(duration, speed) + elif maneuver == "turn-sharp-right": + Ab.turn_sharp_right(duration, speed) + elif maneuver == "u-turn-right": + Ab.u_turn_right(duration, speed) + elif maneuver == "turn-right": + Ab.right(duration, speed) + elif maneuver == "straight": + Ab.forward(duration, speed) + elif maneuver == "ramp-left": + Ab.ramp_left(duration, speed) + elif maneuver == "ramp-right": + Ab.ramp_right(duration, speed) + elif maneuver == "merge": + Ab.merge(duration, speed) + elif maneuver == "fork-left": + Ab.fork_left(duration, speed) + elif maneuver == "fork-right": + Ab.fork_right(duration, speed) + elif maneuver == "ferry": + Ab.stop(duration) + elif maneuver == "ferry-train": + Ab.stop(duration) + elif maneuver == "roundabout-left": + Ab.roundabout_left(duration, speed) + elif maneuver == "roundabout-right": + Ab.roundabout_right(duration, speed) + else: + print(f"Manoeuvre inconnue : {maneuver}") + +# Nom du fichier contenant les étapes sélectionnées +selected_steps_filename = '/home/christian/WebControl/logs/selected_steps_short.json' + +# Appel de la fonction pour traiter les étapes sélectionnées +print("Le départ est prévu dans 10 secondes...") +time.sleep(10) +print("Départ imminent !") +process_selected_steps(selected_steps_filename) diff --git a/WebControl/apps/itineraire_suivre_emergency.py b/WebControl/apps/itineraire_suivre_emergency.py new file mode 100644 index 0000000..ed8fb2b --- /dev/null +++ b/WebControl/apps/itineraire_suivre_emergency.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import RPi.GPIO as GPIO +import json, time, sys, threading +from threading import Thread + +sys.path.append('/home/christian/WebControl/modules/') +from AlphaBot import AlphaBot +Ab = AlphaBot() + +base_speed = 20 # Vitesse fixe de 20 +current_step_index = 0 +emergency_stop = False +remaining_duration = 0 +stop_event_obstacle = threading.Event() + + +# Fonction pour calculer la durée en fonction de la distance +def calculate_duration(distance_value): + speed_factor = 0.001 # Exemple 0.01/100m:s | 0.001/1km/s + return distance_value * speed_factor + +# Fonction pour surveiller les obstacles en arrière-plan +def monitor_obstacles(): + global emergency_stop, remaining_duration + while not stop_event_obstacle.is_set(): + DR_status = GPIO.input(Ab.OBSTACLE_PIN) + if DR_status == 0: # Obstacle détecté + Ab.emergencystop() + emergency_stop = True + while GPIO.input(Ab.OBSTACLE_PIN) == 0: # Attendre que l'obstacle soit dégagé + time.sleep(2) + print("Obstacle dégagé. Attente de 2 secondes avant de reprendre.") + emergency_stop = False + +# Fonction pour exécuter une manoeuvre avec arrêt d'urgence possible +def execute_maneuver(maneuver_function, duration, speed=None): + global remaining_duration + start_time = time.time() + while not emergency_stop and (time.time() - start_time) < duration: + time_slice = min(remaining_duration, duration - (time.time() - start_time)) + + # Appel de la fonction manoeuvre avec ou sans vitesse selon le besoin + if speed is not None: + maneuver_function(time_slice, speed) + else: + maneuver_function(time_slice) + + remaining_duration = duration - (time.time() - start_time) + +# Fonction pour traiter les étapes sélectionnées +def process_selected_steps(filename): + global current_step_index, remaining_duration + + with open(filename, 'r', encoding='utf-8') as f: + selected_steps = json.load(f) + + while current_step_index < len(selected_steps): + if emergency_stop: # Si arrêt d'urgence, attendre que l'obstacle soit dégagé + time.sleep(0.1) + continue + + step = selected_steps[current_step_index] + maneuver = step['maneuver'] + distance_value = step['distance_value'] + duration = calculate_duration(distance_value) + remaining_duration = duration # Initialiser la durée restante + + # Appel de la fonction de manoeuvre avec une vitesse fixe de 20 + if maneuver == "maneuver-unspecified": + execute_maneuver(Ab.maneuver_unspecified, duration) + elif maneuver == "turn-slight-left": + execute_maneuver(Ab.turn_slight_left, duration, base_speed) + elif maneuver == "turn-sharp-left": + execute_maneuver(Ab.turn_sharp_left, duration, base_speed) + elif maneuver == "u-turn-left": + execute_maneuver(Ab.u_turn_left, duration, base_speed) + elif maneuver == "turn-left": + execute_maneuver(Ab.left, duration, base_speed) + elif maneuver == "turn-slight-right": + execute_maneuver(Ab.turn_slight_right, duration, base_speed) + elif maneuver == "turn-sharp-right": + execute_maneuver(Ab.turn_sharp_right, duration, base_speed) + elif maneuver == "u-turn-right": + execute_maneuver(Ab.u_turn_right, duration, base_speed) + elif maneuver == "turn-right": + execute_maneuver(Ab.right, duration, base_speed) + elif maneuver == "straight": + execute_maneuver(Ab.forward, duration, base_speed) + elif maneuver == "ramp-left": + execute_maneuver(Ab.ramp_left, duration, base_speed) + elif maneuver == "ramp-right": + execute_maneuver(Ab.ramp_right, duration, base_speed) + elif maneuver == "merge": + execute_maneuver(Ab.merge, duration, base_speed) + elif maneuver == "fork-left": + execute_maneuver(Ab.fork_left, duration, base_speed) + elif maneuver == "fork-right": + execute_maneuver(Ab.fork_right, duration, base_speed) + elif maneuver == "ferry": + execute_maneuver(Ab.stop, duration) + elif maneuver == "ferry-train": + execute_maneuver(Ab.stop, duration) + elif maneuver == "roundabout-left": + execute_maneuver(Ab.roundabout_left, duration, base_speed) + elif maneuver == "roundabout-right": + execute_maneuver(Ab.roundabout_right, duration, base_speed) + else: + print(f"Manoeuvre inconnue : {maneuver}") + + # Incrémenter l'index de l'étape seulement si l'arrêt d'urgence n'a pas été déclenché + if not emergency_stop: + current_step_index += 1 + +# Nom du fichier contenant les étapes sélectionnées +selected_steps_filename = '/home/christian/WebControl/logs/selected_steps_short.json' + +# Démarrer la surveillance des obstacles dans un thread séparé +obstacle_thread = Thread(target=monitor_obstacles) +obstacle_thread.daemon = True +obstacle_thread.start() + +# Attendre avant de démarrer +print("Le départ est prévu dans 10 secondes...") +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.HIGH) +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.LOW) +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.HIGH) +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.LOW) +print("5 secondes...") +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.HIGH) +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.LOW) +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.HIGH) +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.LOW) +time.sleep(1) +print("Départ imminent !") +try: + # Appel de la fonction pour traiter les étapes sélectionnées + process_selected_steps(selected_steps_filename) + status = "scenario successful" +except KeyboardInterrupt: + print("Interruption par l'utilisateur.") + status = "interrupted" +except Exception as e: + print(f"Erreur lors de l'exécution: {e}") + status = "error" +finally: + # Arrêter les threads + Ab.stop_event_obstacle.set() + # Attendre que les threads se terminent + obstacle_thread.join() + print("Fin de la surveillance d'obstacle") + Ab.cleanup() + +# Vérification finale et affichage du statut +if status in ["scenario successful"]: + print("Le scenario fonctionne correctement.") + fonctionnement_ok = True +else: + print(f"Le scenario a rencontré un problème : {status}.") + fonctionnement_ok = False + +Ab.enregistrer_resultats(sys.argv[0], fonctionnement_ok, status) \ No newline at end of file diff --git a/WebControl/apps/itineraire_suivre_emergency_speed.py b/WebControl/apps/itineraire_suivre_emergency_speed.py new file mode 100644 index 0000000..ba6da1a --- /dev/null +++ b/WebControl/apps/itineraire_suivre_emergency_speed.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import RPi.GPIO as GPIO +import json, time, sys +from threading import Thread + +sys.path.append('/home/christian/WebControl/modules/') +from AlphaBot import AlphaBot +Ab = AlphaBot() + +status = "initialization" + +base_speed = 20 # Vitesse fixe de 20 +current_step_index = 0 +emergency_stop = False +remaining_duration = 0 +adjusted_speed = Ab.vitesse_queue.get() + +# Fonction pour calculer la durée en fonction de la distance +def calculate_duration(distance_value): + speed_factor = 0.001 # Exemple 0.01/100m:s | 0.001/1km/s + return distance_value * speed_factor + +def execute_maneuver(maneuver_function, duration): + global remaining_duration + start_time = time.time() + while not emergency_stop and (time.time() - start_time) < duration: + time_slice = min(remaining_duration, duration - (time.time() - start_time)) + + # Lire la vitesse ajustée de la queue si disponible + if not Ab.vitesse_queue.empty(): + adjusted_speed = Ab.vitesse_queue.get() + else: + adjusted_speed = base_speed # Utiliser la vitesse de base si la queue est vide + + # Appel de la fonction manoeuvre avec la vitesse ajustée + maneuver_function(time_slice, adjusted_speed) + + remaining_duration = duration - (time.time() - start_time) + + +# Fonction pour traiter les étapes sélectionnées +def process_selected_steps(filename): + global current_step_index, remaining_duration + + with open(filename, 'r', encoding='utf-8') as f: + selected_steps = json.load(f) + + while current_step_index < len(selected_steps): + if emergency_stop: # Si arrêt d'urgence, attendre que l'obstacle soit dégagé + time.sleep(0.1) + continue + + step = selected_steps[current_step_index] + maneuver = step['maneuver'] + distance_value = step['distance_value'] + duration = calculate_duration(distance_value) + remaining_duration = duration # Initialiser la durée restante + + # Appel de la fonction de manoeuvre avec une vitesse fixe de 20 + if maneuver == "maneuver-unspecified": + execute_maneuver(Ab.maneuver_unspecified, adjusted_speed) + elif maneuver == "turn-slight-left": + execute_maneuver(Ab.turn_slight_left, duration, adjusted_speed) + elif maneuver == "turn-sharp-left": + execute_maneuver(Ab.turn_sharp_left, duration, adjusted_speed) + elif maneuver == "u-turn-left": + execute_maneuver(Ab.u_turn_left, duration, adjusted_speed) + elif maneuver == "turn-left": + execute_maneuver(Ab.left, duration, adjusted_speed) + elif maneuver == "turn-slight-right": + execute_maneuver(Ab.turn_slight_right, duration, adjusted_speed) + elif maneuver == "turn-sharp-right": + execute_maneuver(Ab.turn_sharp_right, duration, adjusted_speed) + elif maneuver == "u-turn-right": + execute_maneuver(Ab.u_turn_right, duration, adjusted_speed) + elif maneuver == "turn-right": + execute_maneuver(Ab.right, duration, adjusted_speed) + elif maneuver == "straight": + execute_maneuver(Ab.forward, duration, adjusted_speed) + elif maneuver == "ramp-left": + execute_maneuver(Ab.ramp_left, duration, adjusted_speed) + elif maneuver == "ramp-right": + execute_maneuver(Ab.ramp_right, duration, adjusted_speed) + elif maneuver == "merge": + execute_maneuver(Ab.merge, duration, adjusted_speed) + elif maneuver == "fork-left": + execute_maneuver(Ab.fork_left, duration, adjusted_speed) + elif maneuver == "fork-right": + execute_maneuver(Ab.fork_right, duration, adjusted_speed) + elif maneuver == "ferry": + execute_maneuver(Ab.stop, duration) + elif maneuver == "ferry-train": + execute_maneuver(Ab.stop, duration) + elif maneuver == "roundabout-left": + execute_maneuver(Ab.roundabout_left, duration, adjusted_speed) + elif maneuver == "roundabout-right": + execute_maneuver(Ab.roundabout_right, duration, adjusted_speed) + else: + print(f"Manoeuvre inconnue : {maneuver}") + + # Incrémenter l'index de l'étape seulement si l'arrêt d'urgence n'a pas été déclenché + if not emergency_stop: + current_step_index += 1 + +# Nom du fichier contenant les étapes sélectionnées +selected_steps_filename = '/home/christian/WebControl/logs/selected_steps_short.json' + +# Démarrer la surveillance des obstacle dans un thread séparé +vitesse_thread = Thread(target=Ab.monitor_vitesse) +vitesse_thread.daemon = True +vitesse_thread.start() +print("Surveillance de la vitesse en cours") + +# Démarrer la surveillance des obstacle dans un thread séparé +obstacle_thread = Thread(target=Ab.monitor_obstacle) +obstacle_thread.daemon = True +obstacle_thread.start() +print("Surveillance d'obstacle en cours") + +# Attendre avant de démarrer +print("Le départ est prévu dans 10 secondes...") +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.HIGH) +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.LOW) +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.HIGH) +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.LOW) +print("5 secondes...") +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.HIGH) +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.LOW) +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.HIGH) +time.sleep(1) +GPIO.output(Ab.RED_LIGHT, GPIO.LOW) +time.sleep(1) +print("Départ imminent !") +try: + # Appel de la fonction pour traiter les étapes sélectionnées + # Appel de la fonction pour traiter les étapes sélectionnées + process_selected_steps(selected_steps_filename) + status = "scenario successful" +except KeyboardInterrupt: + print("Interruption par l'utilisateur.") + status = "interrupted" +except Exception as e: + print(f"Erreur lors de l'exécution: {e}") + status = "error" +finally: + # Arrêter les threads + Ab.stop_event_vitesse.set() + Ab.stop_event_obstacle.set() + # Attendre que les threads se terminent + vitesse_thread.join() + obstacle_thread.join() + print("Fin de surveillance de la vitesse") + print("Fin de la surveillance d'obstacle") + + Ab.LIDAR_MODULE.close() # Fermeture propre du port série + Ab.cleanup() + +# Vérification finale et affichage du statut +if status in ["scenario successful"]: + print("Le scenario fonctionne correctement.") + fonctionnement_ok = True +else: + print(f"Le scenario a rencontré un problème : {status}.") + fonctionnement_ok = False + +Ab.enregistrer_resultats(sys.argv[0], fonctionnement_ok, status) \ No newline at end of file diff --git a/WebControl/apps/lidar_speed_move.py b/WebControl/apps/lidar_speed_move.py new file mode 100644 index 0000000..0888ae2 --- /dev/null +++ b/WebControl/apps/lidar_speed_move.py @@ -0,0 +1,56 @@ +import time +import sys +sys.path.append('/home/christian/WebControl/modules/') +from AlphaBot import AlphaBot +Ab = AlphaBot() + +# Variable de statut pour indiquer le bon fonctionnement +status = "initialization" + +# Durée limite d'exécution en secondes +time_limit = 10 +start_time = time.time() +try: + # Envoi de la commande pour initialiser le capteur + while True: + # Vérification si le temps limite est dépassé + if time.time() - start_time > time_limit: + break + + if Ab.LIDAR_MODULE.in_waiting >= 9: + if b'Y' == Ab.LIDAR_MODULE.read() and b'Y' == Ab.LIDAR_MODULE.read(): + Dist_L = Ab.LIDAR_MODULE.read() + Dist_H = Ab.LIDAR_MODULE.read() + Dist_Total = (Dist_H[0] * 256) + Dist_L[0] + for i in range(0, 5): + Ab.LIDAR_MODULE.read() # Lecture et ignore des octets supplémentaires + print("Distance à l'avant du véhicule:", Dist_Total, "cm") + status = "measurement successful" + + # Ajuster la vitesse en fonction de la distance LIDAR + vitesse_ajustee = Ab.ajuster_vitesse_selon_distance(Dist_Total) + + if vitesse_ajustee > 0: + Ab.forward(0.1, vitesse_ajustee) # Avancer avec la vitesse ajustée + else: + Ab.emergencystop() # S'arrêter si trop proche d'un obstacle + Ab.LIDAR_MODULE.reset_input_buffer() +except KeyboardInterrupt: + print("Interruption par l'utilisateur.") + status = "interrupted" +except Exception as e: + print(f"Erreur lors de l'exécution: {e}") + status = "error" +finally: + Ab.LIDAR_MODULE.close() # Fermeture propre du port série + Ab.cleanup() + +# Vérification finale et affichage du statut +if status in ["measurement successful"]: + print("Le composant fonctionne correctement.") + fonctionnement_ok = True +else: + print(f"Le composant a rencontré un problème: {status}.") + fonctionnement_ok = False + +Ab.enregistrer_resultats(sys.argv[0], fonctionnement_ok, status) diff --git a/WebControl/apps/rfid_read_write_module.py b/WebControl/apps/rfid_read_write_module.py new file mode 100644 index 0000000..7022ac8 --- /dev/null +++ b/WebControl/apps/rfid_read_write_module.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import time +import sys +sys.path.append('/home/christian/WebControl/modules/') +from SimpleMFRC522 import SimpleMFRC522 +RFID_MODULE = SimpleMFRC522() +from AlphaBot import AlphaBot +Ab = AlphaBot() + +try: + # Lecture initiale du tag RFID + print("### Lecture RFID ###") + print("Approchez le tag RFID du capteur:") + print("(ID, Contenu)", RFID_MODULE.read()) + time.sleep(3) + # Écriture sur le tag RFID + data = "TEST RFID " + print("### Écriture RFID ###") + print("Valeur qui sera écrite:", data) + print("Approchez le tag RFID du capteur:") + RFID_MODULE.write(data) + print("Succès de l'écriture sur le tag RFID.") + time.sleep(3) # Attente courte avant de vérifier l'écriture + # Seconde lecture du tag RFID + print("### Lecture RFID ###") + print("Approchez le tag RFID du capteur:") + print("(ID, Contenu)", RFID_MODULE.read()) + time.sleep(3) +except Exception as e: + print(f"Erreur lors de l'écriture RFID: {e}") \ No newline at end of file diff --git a/WebControl/apps/scenario_rfid.py b/WebControl/apps/scenario_rfid.py new file mode 100644 index 0000000..9de1fe4 --- /dev/null +++ b/WebControl/apps/scenario_rfid.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import subprocess, time, sys +sys.path.append('/home/christian/WebControl/modules/') +from SimpleMFRC522 import SimpleMFRC522 +RFID_MODULE = SimpleMFRC522() +from AlphaBot import AlphaBot +Ab = AlphaBot() + +status = "initialization" +try: + while True: + time.sleep(3) + # Ab.set_angle(0) + print("La porte est actuellement fermée.\nVeuillez approcher votre badge RFID du capteur pour accéder au véhicule.") + id_rfid, text_rfid = RFID_MODULE.read() + rfid_content = RFID_MODULE.read() + if text_rfid == "TEST RFID ": + Ab.set_angle(90) + print(f"Bienvenue, {text_rfid.rstrip()} \nJe suis heureux de pouvoir partager un trajet avec vous !") + time.sleep(5) + print("Installez-vous confortablement !") + time.sleep(2) + print("Votre voiture autonome est prête à partir.") + try: + subprocess.run(['python3', 'apps/itineraire_create.py'], check=True) + try: + print("Nous préparons votre trajet en toute sécurité.") + Ab.set_angle(0) + # Changer si nécessaire 'apps/itineraire_suivre.py' en 'apps/itineraire_suivre_emergency.py' + subprocess.run(['python3', 'apps/itineraire_suivre_emergency.py'], check=True) + print("Merci d'avoir utilisé notre service !") + time.sleep(2) + Ab.set_angle(90) + print("Nous espérons que vous avez apprécié votre trajet.") + time.sleep(2) + print("À bientôt avec CARIA !") + status = "scenario successful" + except subprocess.CalledProcessError as e: + print(f"Erreur lors de l'exécution du script step2_suivre_itineraire: {e}") + status = "error" + except subprocess.CalledProcessError as e: + print(f"Erreur lors de l'exécution du script step1_prepare_itineraire: {e}") + status = "error" + elif text_rfid in ["CHRIS "]: + Ab.set_angle(90) + print(f"Bienvenue, {text_rfid.rstrip()}.\nLa porte du véhicule est maintenant ouverte!") + status = "scenario successful" + else: + Ab.set_angle(0) + print("Bonjour, vous n'êtes pas autorisé à entrer dans le véhicule.\nLa porte reste fermée.") + print(rfid_content) + time.sleep(2) + status = "interrupted" +except KeyboardInterrupt: + print("Interruption par l'utilisateur.") + status = "interrupted" +except Exception as e: + print(f"Erreur lors de l'exécution: {e}") + status = "error" +finally: + Ab.PWMSERVO.stop() + Ab.cleanup() + # Vérification finale et affichage du statut + if status == "movement successful": + print("Le scenario fonctionne correctement.") + fonctionnement_ok = True + else: + print(f"Le scenario a rencontré un problème: {status}.") + fonctionnement_ok = False +Ab.enregistrer_resultats(sys.argv[0], fonctionnement_ok, status) diff --git a/WebControl/css/styles.css b/WebControl/css/styles.css index c50a73d..535babd 100644 --- a/WebControl/css/styles.css +++ b/WebControl/css/styles.css @@ -17,7 +17,7 @@ input { .counter { position: relative; bottom: 98px; - left: 0px; + left: 50px; font-size: 48px; text-align: center; color: blue; @@ -47,42 +47,6 @@ input { transition: box-shadow 0.3s; border-radius: 50px; } -.button_fct { - margin: 10px 15px 10px 15px; - width: auto; - height: 50px; - transition: box-shadow 0.3s; - border-radius: 50px; -} -/* Button toogle */ -.button-container { - display: flex; - flex-direction: column; - align-items: flex-start; -} -input[type="checkbox"] { - margin: 10px 15px 10px 15px; - width: 50px; - height: 30px; - -webkit-appearance: none; - appearance: none; - background-color: #ddd; - border-radius: 25px; - position: relative; - cursor: pointer; -} -input[type="checkbox"]:before { - content: ''; - position: absolute; - width: 20px; - height: 20px; - border-radius: 50%; - background-color: white; - top: 50%; - left: 3px; - transform: translateY(-50%); - transition: 0.2s; -} -input[type="checkbox"]:checked:before { - left: calc(100% - 33px); +.form-check-input { + transform: scale(1.5); /* Augmente la taille du bouton */ } \ No newline at end of file diff --git a/WebControl/fixs/fix_motion.sh b/WebControl/fixs/fix_motion.sh new file mode 100644 index 0000000..0751f1f --- /dev/null +++ b/WebControl/fixs/fix_motion.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# Arrêter le processus motion +if ! sudo pkill -f motion; then + echo "Erreur: Impossible d'arrêter le processus motion." + exit 1 +fi +# Attendre quelques secondes pour s'assurer que le processus est bien arrêté +sleep 5 +# Démarrer le processus motion +if ! sudo /usr/bin/motion &; then + echo "Erreur: Impossible de démarrer le processus motion." + exit 1 +fi +# Attendre quelques secondes pour s'assurer que le processus est bien démarré +sleep 5 +echo "Le service motion a été redémarré avec succès. Vous pouvez maintenant vérifier le fonctionnement sur l'interface web." +# Ouvrir l'interface web dans le navigateur par défaut +echo "Pour tester la vidéo, ouvrez le lien suivant dans votre navigateur : http://192.168.253.194:8081/" diff --git a/WebControl/fixs/fix_rfid.sh b/WebControl/fixs/fix_rfid.sh new file mode 100644 index 0000000..5b94153 --- /dev/null +++ b/WebControl/fixs/fix_rfid.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Naviguer vers le répertoire du module MFRC522 +cd modules/MFRC522-python + +# Installer le module MFRC522 +sudo python3 setup.py install + +# Confirmation de l'installation +echo "Installation du module MFRC522 terminée." diff --git a/WebControl/fixs/reboot.sh b/WebControl/fixs/reboot.sh new file mode 100644 index 0000000..42f0179 --- /dev/null +++ b/WebControl/fixs/reboot.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# Afficher un message de confirmation +echo "Le Raspberry Pi va redémarrer maintenant." + +# Redémarrer le Raspberry Pi +sudo reboot diff --git a/WebControl/images/Thumbs.db b/WebControl/images/Thumbs.db index fe5fadf..12e48e3 100644 Binary files a/WebControl/images/Thumbs.db and b/WebControl/images/Thumbs.db differ diff --git a/WebControl/package.txt b/WebControl/install/requirements_server-car.txt similarity index 97% rename from WebControl/package.txt rename to WebControl/install/requirements_server-car.txt index dc3c6a8..ae3289c 100644 --- a/WebControl/package.txt +++ b/WebControl/install/requirements_server-car.txt @@ -31,6 +31,7 @@ ExplorerHAT==0.4.2 Flask==1.1.2 Flask-SocketIO==5.3.6 fourletterphat==0.1.0 +future==1.0.0 gpiozero==1.6.2 greenlet==3.0.3 guizero==1.1.1 @@ -40,6 +41,7 @@ idna==2.10 ipykernel==5.4.3 ipython==7.20.0 ipython_genutils==0.2.0 +iso8601==2.1.0 isort==5.6.4 itsdangerous==1.1.0 jedi==0.18.0 @@ -96,7 +98,7 @@ pyOpenSSL==20.0.1 pyparsing==2.4.7 PyQt5==5.15.2 PyQt5-sip==12.8.1 -pyserial==3.5b0 +pyserial==3.5 pysmbc==1.0.23 python-apt==2.2.1 python-dateutil==2.8.1 @@ -122,6 +124,7 @@ semver==2.10.2 Send2Trash==1.6.0b1 sense-emu==1.2 sense-hat==2.6.0 +serial==0.0.97 simple-websocket==1.0.0 simplejpeg==1.6.4 simplejson==3.17.2 diff --git a/WebControl/js/bootstrap.bundle.min.js b/WebControl/js/bootstrap.bundle.min.js new file mode 100644 index 0000000..fe19d88 --- /dev/null +++ b/WebControl/js/bootstrap.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.0 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=N(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return M(s,{delegateTarget:r}),n.oneOff&&P.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return M(n,{delegateTarget:t}),i.oneOff&&P.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function I(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function N(t){return t=t.replace(y,""),T[t]||t}const P={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))I(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==N(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=M(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function M(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function j(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function F(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const H={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${F(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${F(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=j(t.dataset[n])}return e},getDataAttribute:(t,e)=>j(t.getAttribute(`data-bs-${F(e)}`))};class ${static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?H.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?H.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends ${constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),P.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.0"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;P.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))};class q extends W{static get NAME(){return"alert"}close(){if(P.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),P.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(q,"close"),m(q);const V='[data-bs-toggle="button"]';class K extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=K.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}P.on(document,"click.bs.button.data-api",V,(t=>{t.preventDefault();const e=t.target.closest(V);K.getOrCreateInstance(e).toggle()})),m(K);const Q={endCallback:null,leftCallback:null,rightCallback:null},X={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Y extends ${constructor(t,e){super(),this._element=t,t&&Y.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Q}static get DefaultType(){return X}static get NAME(){return"swipe"}dispose(){P.off(this._element,".bs.swipe")}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(P.on(this._element,"pointerdown.bs.swipe",(t=>this._start(t))),P.on(this._element,"pointerup.bs.swipe",(t=>this._end(t))),this._element.classList.add("pointer-event")):(P.on(this._element,"touchstart.bs.swipe",(t=>this._start(t))),P.on(this._element,"touchmove.bs.swipe",(t=>this._move(t))),P.on(this._element,"touchend.bs.swipe",(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const U="next",G="prev",J="left",Z="right",tt="slid.bs.carousel",et="carousel",it="active",nt={ArrowLeft:Z,ArrowRight:J},st={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class rt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===et&&this.cycle()}static get Default(){return st}static get DefaultType(){return ot}static get NAME(){return"carousel"}next(){this._slide(U)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(G)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?P.one(this._element,tt,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void P.one(this._element,tt,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?U:G;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&P.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(P.on(this._element,"mouseenter.bs.carousel",(()=>this.pause())),P.on(this._element,"mouseleave.bs.carousel",(()=>this._maybeEnableCycle()))),this._config.touch&&Y.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))P.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(J)),rightCallback:()=>this._slide(this._directionToOrder(Z)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new Y(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=nt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(".active",this._indicatorsElement);e.classList.remove(it),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(it),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===U,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>P.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r("slide.bs.carousel").defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(it),i.classList.remove(it,c,l),this._isSliding=!1,r(tt)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(".active.carousel-item",this._element)}_getItems(){return z.find(".carousel-item",this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===J?G:U:t===J?U:G}_orderToDirection(t){return p()?t===G?J:Z:t===G?Z:J}static jQueryInterface(t){return this.each((function(){const e=rt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}P.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(et))return;t.preventDefault();const i=rt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===H.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),P.on(window,"load.bs.carousel.data-api",(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)rt.getOrCreateInstance(e)})),m(rt);const at="show",lt="collapse",ct="collapsing",ht='[data-bs-toggle="collapse"]',dt={parent:null,toggle:!0},ut={parent:"(null|element)",toggle:"boolean"};class ft extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(ht);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return dt}static get DefaultType(){return ut}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>ft.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(P.trigger(this._element,"show.bs.collapse").defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(lt),this._element.classList.add(ct),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ct),this._element.classList.add(lt,at),this._element.style[e]="",P.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(P.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(ct),this._element.classList.remove(lt,at);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ct),this._element.classList.add(lt),P.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(at)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(ht);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(":scope .collapse .collapse",this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=ft.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}P.on(document,"click.bs.collapse.data-api",ht,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))ft.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(ft);var pt="top",mt="bottom",gt="right",_t="left",bt="auto",vt=[pt,mt,gt,_t],yt="start",wt="end",At="clippingParents",Et="viewport",Tt="popper",Ct="reference",Ot=vt.reduce((function(t,e){return t.concat([e+"-"+yt,e+"-"+wt])}),[]),xt=[].concat(vt,[bt]).reduce((function(t,e){return t.concat([e,e+"-"+yt,e+"-"+wt])}),[]),kt="beforeRead",Lt="read",St="afterRead",Dt="beforeMain",It="main",Nt="afterMain",Pt="beforeWrite",Mt="write",jt="afterWrite",Ft=[kt,Lt,St,Dt,It,Nt,Pt,Mt,jt];function Ht(t){return t?(t.nodeName||"").toLowerCase():null}function $t(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function Wt(t){return t instanceof $t(t).Element||t instanceof Element}function Bt(t){return t instanceof $t(t).HTMLElement||t instanceof HTMLElement}function zt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof $t(t).ShadowRoot||t instanceof ShadowRoot)}const Rt={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];Bt(s)&&Ht(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});Bt(n)&&Ht(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function qt(t){return t.split("-")[0]}var Vt=Math.max,Kt=Math.min,Qt=Math.round;function Xt(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Yt(){return!/^((?!chrome|android).)*safari/i.test(Xt())}function Ut(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&Bt(t)&&(s=t.offsetWidth>0&&Qt(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&Qt(n.height)/t.offsetHeight||1);var r=(Wt(t)?$t(t):window).visualViewport,a=!Yt()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Gt(t){var e=Ut(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Jt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&zt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Zt(t){return $t(t).getComputedStyle(t)}function te(t){return["table","td","th"].indexOf(Ht(t))>=0}function ee(t){return((Wt(t)?t.ownerDocument:t.document)||window.document).documentElement}function ie(t){return"html"===Ht(t)?t:t.assignedSlot||t.parentNode||(zt(t)?t.host:null)||ee(t)}function ne(t){return Bt(t)&&"fixed"!==Zt(t).position?t.offsetParent:null}function se(t){for(var e=$t(t),i=ne(t);i&&te(i)&&"static"===Zt(i).position;)i=ne(i);return i&&("html"===Ht(i)||"body"===Ht(i)&&"static"===Zt(i).position)?e:i||function(t){var e=/firefox/i.test(Xt());if(/Trident/i.test(Xt())&&Bt(t)&&"fixed"===Zt(t).position)return null;var i=ie(t);for(zt(i)&&(i=i.host);Bt(i)&&["html","body"].indexOf(Ht(i))<0;){var n=Zt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function oe(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function re(t,e,i){return Vt(t,Kt(e,i))}function ae(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function le(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const ce={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=qt(i.placement),l=oe(a),c=[_t,gt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return ae("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:le(t,vt))}(s.padding,i),d=Gt(o),u="y"===l?pt:_t,f="y"===l?mt:gt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=se(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=re(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Jt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function he(t){return t.split("-")[1]}var de={top:"auto",right:"auto",bottom:"auto",left:"auto"};function ue(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=_t,y=pt,w=window;if(c){var A=se(i),E="clientHeight",T="clientWidth";A===$t(i)&&"static"!==Zt(A=ee(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===pt||(s===_t||s===gt)&&o===wt)&&(y=mt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==_t&&(s!==pt&&s!==mt||o!==wt)||(v=gt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&de),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:Qt(i*s)/s||0,y:Qt(n*s)/s||0}}({x:f,y:m},$t(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const fe={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:qt(e.placement),variation:he(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,ue(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,ue(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var pe={passive:!0};const me={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=$t(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,pe)})),a&&l.addEventListener("resize",i.update,pe),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,pe)})),a&&l.removeEventListener("resize",i.update,pe)}},data:{}};var ge={left:"right",right:"left",bottom:"top",top:"bottom"};function _e(t){return t.replace(/left|right|bottom|top/g,(function(t){return ge[t]}))}var be={start:"end",end:"start"};function ve(t){return t.replace(/start|end/g,(function(t){return be[t]}))}function ye(t){var e=$t(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function we(t){return Ut(ee(t)).left+ye(t).scrollLeft}function Ae(t){var e=Zt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ee(t){return["html","body","#document"].indexOf(Ht(t))>=0?t.ownerDocument.body:Bt(t)&&Ae(t)?t:Ee(ie(t))}function Te(t,e){var i;void 0===e&&(e=[]);var n=Ee(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=$t(n),r=s?[o].concat(o.visualViewport||[],Ae(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Te(ie(r)))}function Ce(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Oe(t,e,i){return e===Et?Ce(function(t,e){var i=$t(t),n=ee(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Yt();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+we(t),y:l}}(t,i)):Wt(e)?function(t,e){var i=Ut(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ce(function(t){var e,i=ee(t),n=ye(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=Vt(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=Vt(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+we(t),l=-n.scrollTop;return"rtl"===Zt(s||i).direction&&(a+=Vt(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(ee(t)))}function xe(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?qt(s):null,r=s?he(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case pt:e={x:a,y:i.y-n.height};break;case mt:e={x:a,y:i.y+i.height};break;case gt:e={x:i.x+i.width,y:l};break;case _t:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?oe(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case yt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case wt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ke(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?At:a,c=i.rootBoundary,h=void 0===c?Et:c,d=i.elementContext,u=void 0===d?Tt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=ae("number"!=typeof g?g:le(g,vt)),b=u===Tt?Ct:Tt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Te(ie(t)),i=["absolute","fixed"].indexOf(Zt(t).position)>=0&&Bt(t)?se(t):t;return Wt(i)?e.filter((function(t){return Wt(t)&&Jt(t,i)&&"body"!==Ht(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=Oe(t,i,n);return e.top=Vt(s.top,e.top),e.right=Kt(s.right,e.right),e.bottom=Kt(s.bottom,e.bottom),e.left=Vt(s.left,e.left),e}),Oe(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(Wt(y)?y:y.contextElement||ee(t.elements.popper),l,h,r),A=Ut(t.elements.reference),E=xe({reference:A,element:v,strategy:"absolute",placement:s}),T=Ce(Object.assign({},v,E)),C=u===Tt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Tt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[gt,mt].indexOf(t)>=0?1:-1,i=[pt,mt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function Le(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?xt:l,h=he(n),d=h?a?Ot:Ot.filter((function(t){return he(t)===h})):vt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ke(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[qt(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const Se={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=qt(g),b=l||(_!==g&&p?function(t){if(qt(t)===bt)return[];var e=_e(t);return[ve(t),e,ve(e)]}(g):[_e(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(qt(i)===bt?Le(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ke(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),I=L?k?gt:_t:k?mt:pt;y[S]>w[S]&&(I=_e(I));var N=_e(I),P=[];if(o&&P.push(D[x]<=0),a&&P.push(D[I]<=0,D[N]<=0),P.every((function(t){return t}))){T=O,E=!1;break}A.set(O,P)}if(E)for(var M=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},j=p?3:1;j>0&&"break"!==M(j);j--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function De(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Ie(t){return[pt,gt,mt,_t].some((function(e){return t[e]>=0}))}const Ne={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ke(e,{elementContext:"reference"}),a=ke(e,{altBoundary:!0}),l=De(r,n),c=De(a,s,o),h=Ie(l),d=Ie(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Pe={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=xt.reduce((function(t,i){return t[i]=function(t,e,i){var n=qt(t),s=[_t,pt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[_t,gt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Me={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=xe({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},je={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ke(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=qt(e.placement),b=he(e.placement),v=!b,y=oe(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?pt:_t,D="y"===y?mt:gt,I="y"===y?"height":"width",N=A[y],P=N+g[S],M=N-g[D],j=f?-T[I]/2:0,F=b===yt?E[I]:T[I],H=b===yt?-T[I]:-E[I],$=e.elements.arrow,W=f&&$?Gt($):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=re(0,E[I],W[I]),V=v?E[I]/2-j-q-z-O.mainAxis:F-q-z-O.mainAxis,K=v?-E[I]/2+j+q+R+O.mainAxis:H+q+R+O.mainAxis,Q=e.elements.arrow&&se(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=N+K-Y,G=re(f?Kt(P,N+V-Y-X):P,N,f?Vt(M,U):M);A[y]=G,k[y]=G-N}if(a){var J,Z="x"===y?pt:_t,tt="x"===y?mt:gt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[pt,_t].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=re(t,e,i);return n>i?i:n}(at,et,lt):re(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function Fe(t,e,i){void 0===i&&(i=!1);var n,s,o=Bt(e),r=Bt(e)&&function(t){var e=t.getBoundingClientRect(),i=Qt(e.width)/t.offsetWidth||1,n=Qt(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=ee(e),l=Ut(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==Ht(e)||Ae(a))&&(c=(n=e)!==$t(n)&&Bt(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ye(n)),Bt(e)?((h=Ut(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=we(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function He(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var $e={placement:"bottom",modifiers:[],strategy:"absolute"};function We(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(H.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Xe,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=ci.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ze);for(const i of e){const e=ci.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Qe,Xe].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Je)?this:z.prev(this,Je)[0]||z.next(this,Je)[0]||z.findOne(Je,t.delegateTarget.parentNode),o=ci.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}P.on(document,Ue,Je,ci.dataApiKeydownHandler),P.on(document,Ue,ti,ci.dataApiKeydownHandler),P.on(document,Ye,ci.clearMenus),P.on(document,"keyup.bs.dropdown.data-api",ci.clearMenus),P.on(document,Ye,Je,(function(t){t.preventDefault(),ci.getOrCreateInstance(this).toggle()})),m(ci);const hi="show",di="mousedown.bs.backdrop",ui={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},fi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class pi extends ${constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return ui}static get DefaultType(){return fi}static get NAME(){return"backdrop"}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(hi),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(hi),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(P.off(this._element,di),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),P.on(t,di,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const mi=".bs.focustrap",gi="backward",_i={autofocus:!0,trapElement:null},bi={autofocus:"boolean",trapElement:"element"};class vi extends ${constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return _i}static get DefaultType(){return bi}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),P.off(document,mi),P.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),P.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,P.off(document,mi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===gi?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?gi:"forward")}}const yi=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",wi=".sticky-top",Ai="padding-right",Ei="margin-right";class Ti{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Ai,(e=>e+t)),this._setElementAttributes(yi,Ai,(e=>e+t)),this._setElementAttributes(wi,Ei,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Ai),this._resetElementAttributes(yi,Ai),this._resetElementAttributes(wi,Ei)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&H.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=H.getDataAttribute(t,e);null!==i?(H.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const Ci=".bs.modal",Oi="hidden.bs.modal",xi="show.bs.modal",ki="modal-open",Li="show",Si="modal-static",Di={backdrop:!0,focus:!0,keyboard:!0},Ii={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ni extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Ti,this._addEventListeners()}static get Default(){return Di}static get DefaultType(){return Ii}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||P.trigger(this._element,xi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(ki),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(P.trigger(this._element,"hide.bs.modal").defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Li),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){P.off(window,Ci),P.off(this._dialog,Ci),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new pi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new vi({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(Li),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,P.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.modal",(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),P.on(window,"resize.bs.modal",(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),P.on(this._element,"mousedown.dismiss.bs.modal",(t=>{P.one(this._element,"click.dismiss.bs.modal",(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(ki),this._resetAdjustments(),this._scrollBar.reset(),P.trigger(this._element,Oi)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(P.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Si)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Si),this._queueCallback((()=>{this._element.classList.remove(Si),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ni.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}P.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),P.one(e,xi,(t=>{t.defaultPrevented||P.one(e,Oi,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&Ni.getInstance(i).hide(),Ni.getOrCreateInstance(e).toggle(this)})),R(Ni),m(Ni);const Pi="show",Mi="showing",ji="hiding",Fi=".offcanvas.show",Hi="hidePrevented.bs.offcanvas",$i="hidden.bs.offcanvas",Wi={backdrop:!0,keyboard:!0,scroll:!1},Bi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class zi extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Wi}static get DefaultType(){return Bi}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||P.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new Ti).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Mi),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Pi),this._element.classList.remove(Mi),P.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(P.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(ji),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Pi,ji),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new Ti).reset(),P.trigger(this._element,$i)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new pi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():P.trigger(this._element,Hi)}:null})}_initializeFocusTrap(){return new vi({trapElement:this._element})}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():P.trigger(this._element,Hi))}))}static jQueryInterface(t){return this.each((function(){const e=zi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}P.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;P.one(e,$i,(()=>{a(this)&&this.focus()}));const i=z.findOne(Fi);i&&i!==e&&zi.getInstance(i).hide(),zi.getOrCreateInstance(e).toggle(this)})),P.on(window,"load.bs.offcanvas.data-api",(()=>{for(const t of z.find(Fi))zi.getOrCreateInstance(t).show()})),P.on(window,"resize.bs.offcanvas",(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&zi.getOrCreateInstance(t).hide()})),R(zi),m(zi);const Ri={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},qi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Vi=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Ki=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!qi.has(i)||Boolean(Vi.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Qi={allowList:Ri,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Xi={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Yi={entry:"(string|element|function|null)",selector:"(string|element)"};class Ui extends ${constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Qi}static get DefaultType(){return Xi}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Yi)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Ki(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Gi=new Set(["sanitize","allowList","sanitizeFn"]),Ji="fade",Zi="show",tn=".modal",en="hide.bs.modal",nn="hover",sn="focus",on={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},rn={allowList:Ri,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},an={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class ln extends W{constructor(t,e){if(void 0===Ve)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return rn}static get DefaultType(){return an}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),P.off(this._element.closest(tn),en,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=P.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),P.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(Zi),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.on(t,"mouseover",h);this._queueCallback((()=>{P.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!P.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(Zi),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),P.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(Ji,Zi),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(Ji),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Ui({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Ji)}_isShown(){return this.tip&&this.tip.classList.contains(Zi)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=on[e.toUpperCase()];return qe(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)P.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===nn?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===nn?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");P.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?sn:nn]=!0,e._enter()})),P.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?sn:nn]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},P.on(this._element.closest(tn),en,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=H.getDataAttributes(this._element);for(const t of Object.keys(e))Gi.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=ln.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(ln);const cn={...ln.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},hn={...ln.DefaultType,content:"(null|string|element|function)"};class dn extends ln{static get Default(){return cn}static get DefaultType(){return hn}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=dn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(dn);const un="click.bs.scrollspy",fn="active",pn="[href]",mn={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},gn={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class _n extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return mn}static get DefaultType(){return gn}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(P.off(this._config.target,un),P.on(this._config.target,un,pn,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(pn,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(fn),this._activateParents(t),P.trigger(this._element,"activate.bs.scrollspy",{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(fn);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,".nav-link, .nav-item > .nav-link, .list-group-item"))t.classList.add(fn)}_clearActiveClass(t){t.classList.remove(fn);const e=z.find("[href].active",t);for(const t of e)t.classList.remove(fn)}static jQueryInterface(t){return this.each((function(){const e=_n.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(window,"load.bs.scrollspy.data-api",(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))_n.getOrCreateInstance(t)})),m(_n);const bn="ArrowLeft",vn="ArrowRight",yn="ArrowUp",wn="ArrowDown",An="active",En="fade",Tn="show",Cn='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',On=`.nav-link:not(.dropdown-toggle), .list-group-item:not(.dropdown-toggle), [role="tab"]:not(.dropdown-toggle), ${Cn}`;class xn extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),P.on(this._element,"keydown.bs.tab",(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?P.trigger(e,"hide.bs.tab",{relatedTarget:t}):null;P.trigger(t,"show.bs.tab",{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(An),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),P.trigger(t,"shown.bs.tab",{relatedTarget:e})):t.classList.add(Tn)}),t,t.classList.contains(En)))}_deactivate(t,e){t&&(t.classList.remove(An),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),P.trigger(t,"hidden.bs.tab",{relatedTarget:e})):t.classList.remove(Tn)}),t,t.classList.contains(En)))}_keydown(t){if(![bn,vn,yn,wn].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=[vn,wn].includes(t.key),i=b(this._getChildren().filter((t=>!l(t))),t.target,e,!0);i&&(i.focus({preventScroll:!0}),xn.getOrCreateInstance(i).show())}_getChildren(){return z.find(On,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",An),n(".dropdown-menu",Tn),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(An)}_getInnerElement(t){return t.matches(On)?t:z.findOne(On,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=xn.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(document,"click.bs.tab",Cn,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||xn.getOrCreateInstance(this).show()})),P.on(window,"load.bs.tab",(()=>{for(const t of z.find('.active[data-bs-toggle="tab"], .active[data-bs-toggle="pill"], .active[data-bs-toggle="list"]'))xn.getOrCreateInstance(t)})),m(xn);const kn="hide",Ln="show",Sn="showing",Dn={animation:"boolean",autohide:"boolean",delay:"number"},In={animation:!0,autohide:!0,delay:5e3};class Nn extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return In}static get DefaultType(){return Dn}static get NAME(){return"toast"}show(){P.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(kn),d(this._element),this._element.classList.add(Ln,Sn),this._queueCallback((()=>{this._element.classList.remove(Sn),P.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(P.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(Sn),this._queueCallback((()=>{this._element.classList.add(kn),this._element.classList.remove(Sn,Ln),P.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Ln),super.dispose()}isShown(){return this._element.classList.contains(Ln)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){P.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),P.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Nn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(Nn),m(Nn),{Alert:q,Button:K,Carousel:rt,Collapse:ft,Dropdown:ci,Modal:Ni,Offcanvas:zi,Popover:dn,ScrollSpy:_n,Tab:xn,Toast:Nn,Tooltip:ln}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/WebControl/js/script.js b/WebControl/js/script.js index f553723..d981f59 100644 --- a/WebControl/js/script.js +++ b/WebControl/js/script.js @@ -1,119 +1,26 @@ - $(function(){ - var isTouchDevice = "ontouchstart" in document.documentElement ? true : false; - var BUTTON_DOWN = isTouchDevice ? "touchstart" : "mousedown"; - var BUTTON_UP = isTouchDevice ? "touchend" : "mouseup"; - - $("input[type='checkbox']").change(function() { - var id = this.id; - if (this.checked) { - $.post("/cmd", id, function(data, status){}); - } else { - $.post("/cmd", "stop", function(data, status){}); - } - }); - - $('input[type="range"]').change(function() { - var speed = this.value; - $.post('/cmd', {speed: speed}); - }); - }); - // Test - $(function() { - $('#servo').change(function() { - var isChecked = $(this).is(':checked'); - var action = isChecked ? 'start' : 'stop'; - $.post('/servo_motor', { action: action }); - }); - }); - $(function() { - $('#motor').change(function() { - var isChecked = $(this).is(':checked'); - var action = isChecked ? 'start' : 'stop'; - $.post('/motor_speed_move', { action: action }); - }); - }); - $(function() { - $('#obstacle').change(function() { - var isChecked = $(this).is(':checked'); - var action = isChecked ? 'start' : 'stop'; - $.post('/infrared_obstacle_module', { action: action }); - }); - }); - $(function () { - $("#lidar").change(function () { - var isChecked = $(this).is(":checked"); - var action = isChecked ? "start" : "stop"; - $.post("/lidar_module", { action: action }); - }); - }); - $(function () { - $("#rfidrw").change(function () { - var isChecked = $(this).is(":checked"); - var action = isChecked ? "start" : "stop"; - $.post("/rfid_read_write_module", { action: action }); - }); - }); - // Fonctionnalité - $(function () { - $("#ITO").change(function () { - var isChecked = $(this).is(":checked"); - var action = isChecked ? "start" : "stop"; - $.post("/infrared_tracking_objects", { action: action }); - }); - }); - $(function () { - $("#IOA").change(function () { - var isChecked = $(this).is(":checked"); - var action = isChecked ? "start" : "stop"; - $.post("/infrared_obstacle_avoidance", { - action: action, - }); - }); - }); + // Fonction pour mettre à jour l'angle de rotation de l'aiguille en fonction de la vitesse function updateRotation(speed) { const minSpeed = 0; // Vitesse minimale en km/h const maxSpeed = 120; // Vitesse maximale en km/h - const maxAngle = 138; // Angle maximal de l'aiguille (correspondant à la vitesse maximale) - - // Limiter la vitesse minimale - speed = Math.max(minSpeed, speed); - // Limiter la vitesse maximale - speed = Math.min(maxSpeed, speed); - - // Calcul de l'angle en fonction de la vitesse - const angle = (speed / maxSpeed) * maxAngle; - - // Mise à jour de l'aiguille avec le nouvel angle - updatePointerRotation(angle); -} - -// Fonction pour mettre à jour l'aiguille avec un nouvel angle -function updatePointerRotation(angle) { const minAngle = -130; // Angle minimal de l'aiguille - const maxAngle = 138; // Angle maximal de l'aiguille - - // Limiter l'angle minimum + const maxAngle = 138; // Angle maximal de l'aiguille (correspondant à la vitesse maximale) + // Limiter la vitesse et angle minimale + speed = Math.max(minSpeed, speed); + // Limiter la vitesse et angle maximale + speed = Math.min(maxSpeed, speed); + // Calcul de l'angle en fonction de la vitesse + var angle = (speed / maxSpeed) * maxAngle; angle = Math.max(minAngle, angle); - // Limiter l'angle maximum angle = Math.min(maxAngle, angle); - + // Mise à jour de l'aiguille avec le nouvel angle // Calculer la rotation en fonction de l'angle et de la direction let rotation = (angle + 112) * 1.923; // Convertir l'angle en rotation (360/242) - // Mise à jour de l'aiguille const pointer = document.getElementById("pointer"); pointer.style.transform = `translateX(-50%) rotate(${rotation}deg)`; } -// Fonction pour mettre à jour le compteur avec la nouvelle valeur de vitesse -function updateCounter(speed) { - const counter = document.getElementById("counter"); - // Ajouter des zéros devant la vitesse si elle est inférieure à 100 - const formattedSpeed = ("000" + speed).slice(-3); - counter.textContent = formattedSpeed; -} - $(function () { var isTouchDevice = "ontouchstart" in document.documentElement ? true : false; var BUTTON_DOWN = isTouchDevice ? "touchstart" : "mousedown"; @@ -131,12 +38,40 @@ $(function () { $("input").change(function () { var speed = this.value; + const counter = document.getElementById("counter"); $("#speed-display").text(speed); // Met à jour l'élément HTML avec l'id 'speed-display' avec la nouvelle valeur updateRotation(speed); // Met à jour l'aiguille avec la nouvelle vitesse - updateCounter(speed); // Met à jour le compteur avec la nouvelle vitesse - $.post("/cmd", { speed: speed }); // Envoie la nouvelle valeur de vitesse au serveur + // Ajouter des zéros devant la vitesse si elle est inférieure à 100 + const formattedSpeed = ("000" + speed).slice(-3); + counter.textContent = formattedSpeed; $.post("/cmd", { speed: speed }); // Envoie la nouvelle valeur de vitesse au serveur }); // Positionner l'aiguille à la valeur 50 lors de l'initialisation - updateRotation(50); + updateRotation(30); }); + +$(function () { + var isTouchDevice = "ontouchstart" in document.documentElement ? true : false; + var BUTTON_DOWN = isTouchDevice ? "touchstart" : "mousedown"; + var BUTTON_UP = isTouchDevice ? "touchend" : "mouseup"; + + $("input[type='checkbox']").change(function () { + var id = this.id; + if (this.checked) { + $.post("/cmd", id, function (data, status) {}); + } else { + $.post("/cmd", "stop", function (data, status) {}); + } + }); + + $('input[type="range"]').change(function () { + var speed = this.value; + $.post("/cmd", { speed: speed }); + }); +}); + +function confirmReboot() { + if (confirm("Êtes-vous sûr de vouloir redémarrer le Raspberry Pi ?")) { + document.getElementById("rebootForm").submit(); + } +} \ No newline at end of file diff --git a/WebControl/js/test_status.js b/WebControl/js/test_status.js new file mode 100644 index 0000000..f53d06e --- /dev/null +++ b/WebControl/js/test_status.js @@ -0,0 +1,21 @@ +$(document).ready(function () { + function updateTestStatus() { + $.getJSON("/test_status", function (data) { + let tableBody = $("#testStatusTable"); + tableBody.empty(); // Vider le tableau avant d'ajouter les nouvelles lignes + + // Parcourir les résultats des tests et ajouter une ligne pour chaque test + $.each(data, function (test, result) { + let status = result ? "Réussi" : "Échoué"; + let row = `${test}${status}`; + tableBody.append(row); + }); + }); + } + + // Mettre à jour l'état des tests toutes les 5 secondes + setInterval(updateTestStatus, 5000); + + // Appel initial pour charger l'état des tests immédiatement + updateTestStatus(); +}); diff --git a/WebControl/logs/log.txt b/WebControl/logs/log.txt index 1c315b1..8f4c9c0 100644 --- a/WebControl/logs/log.txt +++ b/WebControl/logs/log.txt @@ -1,20 +1,2442 @@ -Bottle v0.12.25 server starting up (using WSGIRefServer(ssl_context=))... -Listening on http://192.168.74.194:8000/ +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 13:16:50] "GET / HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:16:51] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:16:51] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:16:51] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:17:21] "GET / HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:17:21] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:17:24] "POST /restartMotion HTTP/1.1" 200 202 +192.168.253.237 - - [02/Sep/2024 13:17:24] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:18:32] "POST /restartMotion HTTP/1.1" 200 202 +192.168.253.237 - - [02/Sep/2024 13:18:36] "GET / HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:18:36] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:28:01] "POST /restartPi HTTP/1.1" 200 108 +192.168.253.237 - - [02/Sep/2024 13:28:02] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 13:31:57] "POST /restartPi HTTP/1.1" 200 108 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 13:33:32] "GET / HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:33:33] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:33:33] "GET /js/script.js HTTP/1.1" 200 3196 +192.168.253.237 - - [02/Sep/2024 13:33:33] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:33:48] "POST /restartMotion HTTP/1.1" 200 202 +192.168.253.237 - - [02/Sep/2024 13:33:48] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:33:52] "POST /restartMotion HTTP/1.1" 200 202 +192.168.253.237 - - [02/Sep/2024 13:38:43] "POST /restartMotion HTTP/1.1" 200 202 +192.168.253.237 - - [02/Sep/2024 13:38:46] "GET /restartMotion HTTP/1.1" 404 735 +192.168.253.237 - - [02/Sep/2024 13:38:54] "GET / HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:38:54] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:38:54] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:38:58] "POST /restartPi HTTP/1.1" 200 108 +192.168.253.237 - - [02/Sep/2024 13:38:58] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 13:39:54] "POST /restartPi HTTP/1.1" 200 136 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 13:42:14] "POST / HTTP/1.1" 405 739 +192.168.253.237 - - [02/Sep/2024 13:42:17] "GET / HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:42:17] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:42:17] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:42:48] "GET / HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:42:48] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:42:48] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:42:56] "GET / HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:42:57] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:43:00] "POST /restartMotion HTTP/1.1" 200 230 +192.168.253.237 - - [02/Sep/2024 13:43:00] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:43:02] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:43:02] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:43:02] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:43:02] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:43:02] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:43:57] "GET / HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:43:57] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 13:43:57] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:44:58] "GET / HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:44:58] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:45:02] "GET /main HTTP/1.1" 404 726 +192.168.253.237 - - [02/Sep/2024 13:45:20] "GET /main HTTP/1.1" 404 726 +192.168.253.237 - - [02/Sep/2024 13:45:23] "GET / HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:45:23] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.237 - - [02/Sep/2024 13:45:23] "GET /css/styles.css HTTP/1.1" 200 1948 +192.168.253.237 - - [02/Sep/2024 13:45:23] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.237 - - [02/Sep/2024 13:45:24] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.237 - - [02/Sep/2024 13:45:24] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.237 - - [02/Sep/2024 13:45:24] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 13:45:24] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.237 - - [02/Sep/2024 13:46:58] "GET / HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:46:58] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:47:03] "POST /restartPi HTTP/1.1" 200 136 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 13:47:31] "POST / HTTP/1.1" 404 726 +192.168.253.237 - - [02/Sep/2024 13:47:35] "GET / HTTP/1.1" 404 726 +192.168.253.237 - - [02/Sep/2024 13:47:39] "GET /main HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:47:39] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:48:38] "GET /main HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:48:38] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:48:42] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 13:48:43] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:48:45] "POST /restartMotion HTTP/1.1" 200 230 +192.168.253.237 - - [02/Sep/2024 13:50:12] "POST / HTTP/1.1" 404 726 +192.168.253.237 - - [02/Sep/2024 13:50:18] "GET / HTTP/1.1" 404 726 +192.168.253.237 - - [02/Sep/2024 13:50:21] "GET /main HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:50:21] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:50:37] "POST /restartPi HTTP/1.1" 200 136 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 13:52:51] "POST / HTTP/1.1" 404 726 +192.168.253.237 - - [02/Sep/2024 13:52:56] "GET /main HTTP/1.1" 200 10788 +192.168.253.237 - - [02/Sep/2024 13:52:56] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:56:06] "GET /main HTTP/1.1" 200 11817 +192.168.253.237 - - [02/Sep/2024 13:56:06] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:56:06] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:56:11] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:56:15] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:56:15] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:56:16] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:56:16] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:56:25] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:56:30] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:56:30] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:56:31] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:56:31] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:56:32] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:56:32] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:56:32] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:56:33] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:56:33] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:56:34] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:56:50] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:56:50] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:57:02] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:57:02] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:57:05] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:57:06] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:57:08] "GET /main HTTP/1.1" 200 11817 +192.168.253.237 - - [02/Sep/2024 13:57:08] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:57:09] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:57:10] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:57:10] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:57:11] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:57:11] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:57:12] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:57:12] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:57:13] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:57:13] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:57:14] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:57:30] "GET /main HTTP/1.1" 200 11817 +192.168.253.237 - - [02/Sep/2024 13:57:30] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 13:57:30] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:57:31] "GET /tests HTTP/1.1" 200 590 +192.168.253.237 - - [02/Sep/2024 13:57:31] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:57:31] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:57:33] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:57:33] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:57:33] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:57:33] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:57:33] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:57:33] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:57:33] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:58:02] "GET /main HTTP/1.1" 200 11823 +192.168.253.237 - - [02/Sep/2024 13:58:02] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:58:03] "GET /validate HTTP/1.1" 200 681 +192.168.253.237 - - [02/Sep/2024 13:58:03] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:58:03] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:58:04] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:58:04] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:58:04] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:58:04] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:58:04] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:58:04] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:58:08] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:58:08] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:58:09] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:58:09] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:58:09] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:58:10] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:58:11] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:58:11] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:58:12] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:58:12] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:58:34] "GET /main HTTP/1.1" 200 11768 +192.168.253.237 - - [02/Sep/2024 13:58:38] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 13:58:39] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:58:40] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:58:41] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 13:58:41] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 13:59:02] "GET /main HTTP/1.1" 200 11945 +192.168.253.237 - - [02/Sep/2024 13:59:02] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 14:01:30] "GET /main HTTP/1.1" 200 12046 +192.168.253.237 - - [02/Sep/2024 14:01:30] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 14:01:34] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 14:01:36] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 14:01:36] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 14:01:37] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 14:01:37] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 14:01:40] "GET /main HTTP/1.1" 200 12046 +192.168.253.237 - - [02/Sep/2024 14:01:41] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.237 - - [02/Sep/2024 14:01:41] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.237 - - [02/Sep/2024 14:01:41] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.237 - - [02/Sep/2024 14:01:41] "GET /css/styles.css HTTP/1.1" 200 1948 +192.168.253.237 - - [02/Sep/2024 14:01:41] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.237 - - [02/Sep/2024 14:01:41] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 14:01:41] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.237 - - [02/Sep/2024 14:01:41] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 14:01:42] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 14:01:43] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 14:01:43] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 14:01:44] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 14:01:44] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 14:01:45] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 14:02:12] "GET /validate HTTP/1.1" 200 681 +192.168.253.237 - - [02/Sep/2024 14:02:18] "GET /main HTTP/1.1" 200 12046 +192.168.253.237 - - [02/Sep/2024 14:02:19] "GET /tests HTTP/1.1" 200 590 +192.168.253.237 - - [02/Sep/2024 14:02:26] "GET /validate HTTP/1.1" 200 681 +[0:motion] [NTC] [ALL] conf_load: Processing thread 0 - config file /etc/motion/motion.conf +[0:motion] [NTC] [ALL] motion_startup: Logging to file (/var/log/motion/motion.log) +192.168.253.237 - - [02/Sep/2024 14:02:54] "POST /restartMotion HTTP/1.1" 200 107 +192.168.253.237 - - [02/Sep/2024 14:03:00] "POST /main HTTP/1.1" 405 743 +192.168.253.237 - - [02/Sep/2024 14:03:08] "GET /main HTTP/1.1" 200 12046 +192.168.253.237 - - [02/Sep/2024 14:03:15] "GET / HTTP/1.1" 404 726 +192.168.253.237 - - [02/Sep/2024 14:03:18] "GET /main HTTP/1.1" 200 12046 +192.168.253.237 - - [02/Sep/2024 14:03:29] "GET /main HTTP/1.1" 200 12046 +192.168.253.237 - - [02/Sep/2024 14:04:06] "GET /main HTTP/1.1" 200 12155 +192.168.253.237 - - [02/Sep/2024 14:04:06] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 14:04:40] "GET /main HTTP/1.1" 200 12155 +192.168.253.237 - - [02/Sep/2024 14:05:22] "GET /main HTTP/1.1" 200 12171 +192.168.253.237 - - [02/Sep/2024 14:05:40] "GET /main HTTP/1.1" 200 12171 +192.168.253.237 - - [02/Sep/2024 14:05:49] "GET /main HTTP/1.1" 200 12171 +192.168.253.237 - - [02/Sep/2024 14:06:05] "GET /validate HTTP/1.1" 200 681 +192.168.253.237 - - [02/Sep/2024 14:08:36] "POST /validate HTTP/1.1" 200 21 +192.168.253.237 - - [02/Sep/2024 14:08:41] "GET /validate HTTP/1.1" 200 679 +192.168.253.237 - - [02/Sep/2024 14:09:16] "POST /validate HTTP/1.1" 200 21 +192.168.253.237 - - [02/Sep/2024 14:09:31] "GET /validate HTTP/1.1" 200 680 +192.168.253.237 - - [02/Sep/2024 14:09:50] "POST /validate HTTP/1.1" 200 21 +192.168.253.237 - - [02/Sep/2024 14:10:11] "POST /validate HTTP/1.1" 200 21 +192.168.253.237 - - [02/Sep/2024 14:10:52] "GET /validate HTTP/1.1" 200 679 +192.168.253.237 - - [02/Sep/2024 14:14:29] "POST /validate HTTP/1.1" 200 21 +192.168.253.237 - - [02/Sep/2024 14:14:48] "POST /validate HTTP/1.1" 200 21 +192.168.253.237 - - [02/Sep/2024 14:15:09] "POST /validate HTTP/1.1" 200 21 +192.168.253.237 - - [02/Sep/2024 14:15:42] "POST /validate HTTP/1.1" 200 21 +192.168.253.237 - - [02/Sep/2024 14:16:41] "POST /validate HTTP/1.1" 200 21 +192.168.253.237 - - [02/Sep/2024 14:17:09] "POST /validate HTTP/1.1" 200 21 +192.168.253.237 - - [02/Sep/2024 14:53:19] "GET / HTTP/1.1" 404 726 +192.168.253.237 - - [02/Sep/2024 14:55:17] "GET / HTTP/1.1" 404 726 +192.168.253.237 - - [02/Sep/2024 14:55:21] "GET /main HTTP/1.1" 200 12171 +192.168.253.237 - - [02/Sep/2024 14:55:21] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.237 - - [02/Sep/2024 14:55:21] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.237 - - [02/Sep/2024 14:55:21] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.237 - - [02/Sep/2024 14:55:22] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.237 - - [02/Sep/2024 14:55:22] "GET /css/styles.css HTTP/1.1" 200 1948 +192.168.253.237 - - [02/Sep/2024 14:55:22] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 14:55:23] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.237 - - [02/Sep/2024 14:55:37] "GET /tests HTTP/1.1" 200 590 +192.168.253.237 - - [02/Sep/2024 14:55:41] "GET /validate HTTP/1.1" 200 679 +192.168.253.237 - - [02/Sep/2024 14:55:54] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 14:55:55] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 14:55:56] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 14:55:57] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 14:55:57] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 14:55:57] "GET /main HTTP/1.1" 200 12171 +192.168.253.237 - - [02/Sep/2024 14:55:57] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 14:57:58] "GET /main HTTP/1.1" 200 11979 +192.168.253.237 - - [02/Sep/2024 14:57:58] "GET /main HTTP/1.1" 200 11979 +192.168.253.237 - - [02/Sep/2024 14:57:59] "GET /tests HTTP/1.1" 200 1785 +192.168.253.237 - - [02/Sep/2024 14:58:00] "GET /validate HTTP/1.1" 200 1874 +192.168.253.237 - - [02/Sep/2024 14:58:04] "GET /tests HTTP/1.1" 200 1785 +192.168.253.237 - - [02/Sep/2024 14:58:05] "GET /main HTTP/1.1" 200 11979 +192.168.253.237 - - [02/Sep/2024 14:58:07] "GET /tests HTTP/1.1" 200 1785 +192.168.253.237 - - [02/Sep/2024 14:58:08] "GET /main HTTP/1.1" 200 11979 +192.168.253.237 - - [02/Sep/2024 14:58:44] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 14:58:44] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 14:58:45] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 14:58:45] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 14:58:46] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 14:58:46] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:43:59] "GET /main HTTP/1.1" 200 11959 +192.168.253.237 - - [02/Sep/2024 15:43:59] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.237 - - [02/Sep/2024 15:43:59] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.237 - - [02/Sep/2024 15:43:59] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.237 - - [02/Sep/2024 15:43:59] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.237 - - [02/Sep/2024 15:43:59] "GET /css/styles.css HTTP/1.1" 200 1948 +192.168.253.237 - - [02/Sep/2024 15:43:59] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 15:44:00] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.237 - - [02/Sep/2024 15:45:24] "GET / HTTP/1.1" 404 726 +192.168.253.237 - - [02/Sep/2024 15:45:32] "GET /main HTTP/1.1" 200 11959 +192.168.253.237 - - [02/Sep/2024 15:48:55] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 15:48:55] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 15:49:00] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 15:49:01] "POST /cmd HTTP/1.1" 200 40 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 15:49:05] "GET /main HTTP/1.1" 200 11964 +192.168.253.237 - - [02/Sep/2024 15:49:30] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:30] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:31] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:31] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:32] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:32] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:33] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:33] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:33] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:33] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:34] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:34] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:35] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:35] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:36] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:36] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 15:49:38] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 15:49:39] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 15:49:41] "GET /main HTTP/1.1" 200 11964 +192.168.253.237 - - [02/Sep/2024 15:49:43] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 15:49:44] "POST /cmd HTTP/1.1" 200 40 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 15:54:36] "GET /validate HTTP/1.1" 200 1876 +192.168.253.237 - - [02/Sep/2024 15:55:14] "GET /main HTTP/1.1" 404 726 +192.168.253.237 - - [02/Sep/2024 15:58:17] "GET /validate HTTP/1.1" 200 1868 +192.168.253.237 - - [02/Sep/2024 15:58:18] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 15:58:18] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 15:58:19] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 15:58:20] "GET /tests HTTP/1.1" 200 1777 +192.168.253.237 - - [02/Sep/2024 15:58:21] "GET /validate HTTP/1.1" 200 1868 +192.168.253.237 - - [02/Sep/2024 15:58:25] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 15:58:31] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 15:59:20] "GET /validate HTTP/1.1" 200 1868 +192.168.253.237 - - [02/Sep/2024 15:59:22] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 15:59:26] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:00:03] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:00:06] "GET /validate HTTP/1.1" 200 1868 +192.168.253.237 - - [02/Sep/2024 16:08:07] "GET /validate HTTP/1.1" 200 1868 +192.168.253.237 - - [02/Sep/2024 16:08:07] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 16:08:12] "GET /tests HTTP/1.1" 200 1777 +192.168.253.237 - - [02/Sep/2024 16:08:14] "GET /validate HTTP/1.1" 200 1868 +192.168.253.237 - - [02/Sep/2024 16:08:16] "GET /tests HTTP/1.1" 200 1777 +192.168.253.237 - - [02/Sep/2024 16:08:18] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:08:19] "GET /validate HTTP/1.1" 200 1868 +192.168.253.237 - - [02/Sep/2024 16:10:44] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:10:45] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.237 - - [02/Sep/2024 16:10:45] "GET /css/styles.css HTTP/1.1" 200 1948 +192.168.253.237 - - [02/Sep/2024 16:10:45] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.237 - - [02/Sep/2024 16:10:45] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.237 - - [02/Sep/2024 16:10:45] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.237 - - [02/Sep/2024 16:10:45] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 16:10:45] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.237 - - [02/Sep/2024 16:10:47] "GET /validate HTTP/1.1" 200 1868 +192.168.253.237 - - [02/Sep/2024 16:10:48] "GET /tests HTTP/1.1" 200 1777 +192.168.253.237 - - [02/Sep/2024 16:10:49] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:11:42] "GET /tests HTTP/1.1" 200 1783 +192.168.253.237 - - [02/Sep/2024 16:11:45] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:11:53] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:12:01] "GET /tests HTTP/1.1" 200 1783 +192.168.253.237 - - [02/Sep/2024 16:12:03] "GET /validate HTTP/1.1" 200 1868 +192.168.253.237 - - [02/Sep/2024 16:12:05] "GET /tests HTTP/1.1" 200 1783 +192.168.253.237 - - [02/Sep/2024 16:12:06] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:12:54] "GET /validate HTTP/1.1" 200 1868 +192.168.253.237 - - [02/Sep/2024 16:12:55] "GET /tests HTTP/1.1" 200 1769 +192.168.253.237 - - [02/Sep/2024 16:12:56] "GET /tests HTTP/1.1" 200 1769 +192.168.253.237 - - [02/Sep/2024 16:12:57] "GET /tests HTTP/1.1" 200 1769 +192.168.253.237 - - [02/Sep/2024 16:13:20] "GET /validate HTTP/1.1" 200 1868 +192.168.253.237 - - [02/Sep/2024 16:13:57] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:16:46] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:16:47] "GET /tests HTTP/1.1" 200 1638 +192.168.253.237 - - [02/Sep/2024 16:16:49] "GET /validate HTTP/1.1" 200 1810 +192.168.253.237 - - [02/Sep/2024 16:16:52] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:16:53] "GET /tests HTTP/1.1" 200 1638 +192.168.253.237 - - [02/Sep/2024 16:16:55] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:16:56] "GET /tests HTTP/1.1" 200 1638 +192.168.253.237 - - [02/Sep/2024 16:16:57] "GET /validate HTTP/1.1" 200 1810 +192.168.253.237 - - [02/Sep/2024 16:17:37] "GET /tests HTTP/1.1" 200 1638 +192.168.253.237 - - [02/Sep/2024 16:17:46] "GET /validate HTTP/1.1" 200 1810 +192.168.253.237 - - [02/Sep/2024 16:17:47] "GET /tests HTTP/1.1" 200 1638 +192.168.253.237 - - [02/Sep/2024 16:17:57] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:18:22] "GET / HTTP/1.1" 200 11956 +192.168.253.237 - - [02/Sep/2024 16:18:23] "GET /validate HTTP/1.1" 200 1847 +192.168.253.237 - - [02/Sep/2024 16:21:30] "GET /tests HTTP/1.1" 200 1632 +192.168.253.237 - - [02/Sep/2024 16:21:31] "GET /access HTTP/1.1" 404 728 +192.168.253.237 - - [02/Sep/2024 16:21:35] "GET /access HTTP/1.1" 404 728 +192.168.253.237 - - [02/Sep/2024 16:21:43] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:21:51] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:23:32] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:23:52] "GET /tests HTTP/1.1" 200 1632 +192.168.253.237 - - [02/Sep/2024 16:23:54] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:24:57] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:25:05] "GET / HTTP/1.1" 200 11950 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 16:27:54] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:27:54] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 16:27:55] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:27:58] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:28:01] "GET /tests HTTP/1.1" 200 1632 +192.168.253.237 - - [02/Sep/2024 16:28:05] "GET /access HTTP/1.1" 200 2304 +192.168.253.237 - - [02/Sep/2024 16:28:14] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:29:03] "GET /tests HTTP/1.1" 200 1632 +192.168.253.237 - - [02/Sep/2024 16:29:03] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:29:03] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:29:07] "GET /access HTTP/1.1" 200 2304 +192.168.253.237 - - [02/Sep/2024 16:29:07] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:29:07] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:29:14] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:29:14] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:29:15] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:03] "GET /access HTTP/1.1" 200 2304 +192.168.253.237 - - [02/Sep/2024 16:30:03] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:03] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:05] "GET /tests HTTP/1.1" 200 1632 +192.168.253.237 - - [02/Sep/2024 16:30:05] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:05] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:08] "GET /access HTTP/1.1" 200 2304 +192.168.253.237 - - [02/Sep/2024 16:30:08] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:09] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:10] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:30:10] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:10] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:23] "GET /access HTTP/1.1" 200 2304 +192.168.253.237 - - [02/Sep/2024 16:30:23] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:23] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:42] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:30:43] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:54] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:30:54] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:30:54] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:31:48] "GET /tests HTTP/1.1" 200 1632 +192.168.253.237 - - [02/Sep/2024 16:31:48] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:31:48] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:31:55] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:31:55] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:31:55] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:32:01] "GET /tests HTTP/1.1" 200 1632 +192.168.253.237 - - [02/Sep/2024 16:32:01] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:32:01] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:32:23] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:32:23] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:32:23] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:32:24] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:32:24] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:32:24] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:32:25] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:32:25] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:32:25] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:32:26] "GET /tests HTTP/1.1" 200 1632 +192.168.253.237 - - [02/Sep/2024 16:32:26] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:32:26] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:33:41] "GET /tests HTTP/1.1" 200 1632 +192.168.253.237 - - [02/Sep/2024 16:33:41] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:33:45] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:33:47] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:33:47] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:33:48] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:33:50] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:33:50] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:33:50] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:33:53] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:33:53] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:34:20] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:34:20] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:34:20] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:34:53] "GET / HTTP/1.1" 200 11950 +192.168.253.237 - - [02/Sep/2024 16:34:53] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:34:53] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:36:45] "GET / HTTP/1.1" 200 13659 +192.168.253.237 - - [02/Sep/2024 16:36:45] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 16:42:33] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 16:42:33] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 16:42:36] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 16:42:36] "POST /cmd HTTP/1.1" 200 56 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1459 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 16:42:42] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 16:42:42] "POST /cmd HTTP/1.1" 200 56 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 16:42:54] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 16:42:54] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 16:52:23] "GET / HTTP/1.1" 200 13659 +192.168.253.237 - - [02/Sep/2024 16:52:24] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 16:52:33] "GET / HTTP/1.1" 200 13342 +192.168.253.237 - - [02/Sep/2024 16:52:45] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:45] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:46] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:46] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:46] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:46] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:47] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:47] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:48] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:48] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:49] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:49] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:50] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:50] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:51] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:52:51] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:53:24] "GET / HTTP/1.1" 200 13342 +192.168.253.237 - - [02/Sep/2024 16:53:26] "POST /cmd HTTP/1.1" 200 46 +192.168.253.237 - - [02/Sep/2024 16:53:27] "POST /cmd HTTP/1.1" 200 40 +[0:motion] [NTC] [ALL] conf_load: Processing thread 0 - config file /etc/motion/motion.conf +[0:motion] [NTC] [ALL] motion_startup: Logging to file (/var/log/motion/motion.log) +192.168.253.237 - - [02/Sep/2024 16:53:28] "POST /restartMotion HTTP/1.1" 200 107 +192.168.253.237 - - [02/Sep/2024 16:53:31] "POST /main HTTP/1.1" 405 743 +192.168.253.237 - - [02/Sep/2024 16:53:34] "GET / HTTP/1.1" 200 13342 +192.168.253.237 - - [02/Sep/2024 16:53:57] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:53:57] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:53:58] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:53:58] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:53:58] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:53:58] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:53:59] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:53:59] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:00] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:00] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:01] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:01] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:02] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:02] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:02] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:02] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:03] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:03] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:03] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:03] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:04] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:04] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:04] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:04] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:05] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:05] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:06] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:06] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:06] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:06] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:06] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:06] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:07] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:07] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:07] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:07] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 16:54:17] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 16:54:18] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 16:54:18] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:54:43] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:55:54] "GET / HTTP/1.1" 200 13342 +192.168.253.237 - - [02/Sep/2024 16:55:56] "POST /cmd HTTP/1.1" 200 46 +[0:motion] [NTC] [ALL] conf_load: Processing thread 0 - config file /etc/motion/motion.conf +[0:motion] [NTC] [ALL] motion_startup: Logging to file (/var/log/motion/motion.log) +192.168.253.237 - - [02/Sep/2024 16:55:57] "POST /restartMotion HTTP/1.1" 200 107 +192.168.253.237 - - [02/Sep/2024 16:55:58] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 16:56:00] "POST /main HTTP/1.1" 405 743 +192.168.253.237 - - [02/Sep/2024 16:56:03] "GET / HTTP/1.1" 200 13342 +192.168.253.237 - - [02/Sep/2024 16:56:11] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:56:39] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:56:55] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 16:56:56] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 16:56:57] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 16:56:57] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 16:56:57] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 16:56:58] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 16:56:59] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 16:56:59] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 16:57:28] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:57:30] "GET / HTTP/1.1" 200 13342 +192.168.253.237 - - [02/Sep/2024 16:57:30] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:57:32] "GET / HTTP/1.1" 200 13342 +192.168.253.237 - - [02/Sep/2024 16:57:32] "GET / HTTP/1.1" 200 13342 +192.168.253.237 - - [02/Sep/2024 16:57:33] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:57:34] "GET /tests HTTP/1.1" 200 1632 +192.168.253.237 - - [02/Sep/2024 16:57:35] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:57:36] "GET / HTTP/1.1" 200 13342 +192.168.253.237 - - [02/Sep/2024 16:57:40] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:57:42] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:59:01] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:59:01] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 16:59:05] "GET / HTTP/1.1" 200 13646 +192.168.253.237 - - [02/Sep/2024 16:59:11] "GET /policy.php HTTP/1.1" 404 732 +192.168.253.237 - - [02/Sep/2024 16:59:33] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:59:40] "GET /access HTTP/1.1" 200 2332 +192.168.253.237 - - [02/Sep/2024 16:59:59] "GET /access HTTP/1.1" 200 2514 +192.168.253.237 - - [02/Sep/2024 17:00:08] "GET / HTTP/1.1" 200 13646 +192.168.253.237 - - [02/Sep/2024 17:00:10] "GET /access HTTP/1.1" 200 2514 +192.168.253.237 - - [02/Sep/2024 17:00:18] "GET /tests HTTP/1.1" 200 1632 +192.168.253.237 - - [02/Sep/2024 17:02:19] "GET /tests HTTP/1.1" 200 1906 +192.168.253.237 - - [02/Sep/2024 17:02:20] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 200 80421 +192.168.253.237 - - [02/Sep/2024 17:02:24] "GET /tests HTTP/1.1" 200 1906 +192.168.253.237 - - [02/Sep/2024 17:02:27] "GET /access HTTP/1.1" 200 2422 +192.168.253.237 - - [02/Sep/2024 17:02:27] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:02:28] "GET / HTTP/1.1" 200 13469 +192.168.253.237 - - [02/Sep/2024 17:02:31] "GET /access HTTP/1.1" 200 2422 +192.168.253.237 - - [02/Sep/2024 17:10:11] "GET /access HTTP/1.1" 200 2765 +192.168.253.237 - - [02/Sep/2024 17:10:11] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:10:11] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:10:13] "GET / HTTP/1.1" 200 13505 +192.168.253.237 - - [02/Sep/2024 17:10:15] "GET /access HTTP/1.1" 200 2765 +192.168.253.237 - - [02/Sep/2024 17:10:16] "GET /tests HTTP/1.1" 200 2224 +192.168.253.237 - - [02/Sep/2024 17:10:23] "GET /access HTTP/1.1" 200 2765 +192.168.253.237 - - [02/Sep/2024 17:10:26] "GET / HTTP/1.1" 200 13505 +192.168.253.237 - - [02/Sep/2024 17:12:18] "GET /tests HTTP/1.1" 200 2224 +192.168.253.237 - - [02/Sep/2024 17:12:18] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:12:18] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:12:19] "GET /access HTTP/1.1" 200 2765 +192.168.253.237 - - [02/Sep/2024 17:12:21] "GET / HTTP/1.1" 200 13505 +192.168.253.237 - - [02/Sep/2024 17:12:38] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 17:12:38] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 17:13:50] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 17:13:51] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 17:13:51] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 17:13:52] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 17:13:52] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 17:13:53] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 17:13:53] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 17:13:54] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 17:14:03] "GET / HTTP/1.1" 200 13505 +192.168.253.237 - - [02/Sep/2024 17:14:03] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:14:55] "GET / HTTP/1.1" 200 13505 +192.168.253.237 - - [02/Sep/2024 17:15:21] "GET /tests HTTP/1.1" 200 2224 +192.168.253.237 - - [02/Sep/2024 17:15:21] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:15:59] "GET /tests HTTP/1.1" 200 2228 +192.168.253.237 - - [02/Sep/2024 17:16:05] "GET /tests HTTP/1.1" 200 2228 +192.168.253.237 - - [02/Sep/2024 17:16:06] "GET /access HTTP/1.1" 200 2765 +192.168.253.237 - - [02/Sep/2024 17:16:07] "GET / HTTP/1.1" 200 13505 +192.168.253.237 - - [02/Sep/2024 17:16:08] "GET /access HTTP/1.1" 200 2765 +192.168.253.237 - - [02/Sep/2024 17:16:15] "GET /tests HTTP/1.1" 200 2228 +192.168.253.237 - - [02/Sep/2024 17:16:17] "GET /access HTTP/1.1" 200 2765 +192.168.253.237 - - [02/Sep/2024 17:18:13] "GET /access HTTP/1.1" 200 2948 +192.168.253.237 - - [02/Sep/2024 17:18:13] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:18:43] "GET /access HTTP/1.1" 200 2851 +192.168.253.237 - - [02/Sep/2024 17:19:03] "GET /access HTTP/1.1" 200 2785 +192.168.253.237 - - [02/Sep/2024 17:19:05] "GET /tests HTTP/1.1" 200 2228 +192.168.253.237 - - [02/Sep/2024 17:19:07] "GET /access HTTP/1.1" 200 2785 +192.168.253.237 - - [02/Sep/2024 17:19:09] "GET / HTTP/1.1" 200 13505 +192.168.253.237 - - [02/Sep/2024 17:19:26] "GET / HTTP/1.1" 200 13509 +192.168.253.237 - - [02/Sep/2024 17:19:30] "GET /tests HTTP/1.1" 200 2228 +192.168.253.237 - - [02/Sep/2024 17:19:48] "GET /tests HTTP/1.1" 200 2228 +192.168.253.237 - - [02/Sep/2024 17:19:52] "GET / HTTP/1.1" 200 13509 +192.168.253.237 - - [02/Sep/2024 17:19:59] "GET / HTTP/1.1" 200 13509 +192.168.253.237 - - [02/Sep/2024 17:19:59] "GET /css/styles.css HTTP/1.1" 200 1948 +192.168.253.237 - - [02/Sep/2024 17:19:59] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.237 - - [02/Sep/2024 17:20:00] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.237 - - [02/Sep/2024 17:20:00] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.237 - - [02/Sep/2024 17:20:00] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.237 - - [02/Sep/2024 17:20:00] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 200 80421 +192.168.253.237 - - [02/Sep/2024 17:20:00] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 17:20:00] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.237 - - [02/Sep/2024 17:20:06] "GET / HTTP/1.1" 200 13509 +192.168.253.237 - - [02/Sep/2024 17:20:15] "GET /tests HTTP/1.1" 200 2228 +192.168.253.237 - - [02/Sep/2024 17:20:16] "GET /tests HTTP/1.1" 200 2228 +192.168.253.237 - - [02/Sep/2024 17:20:19] "GET /access HTTP/1.1" 200 2785 +192.168.253.237 - - [02/Sep/2024 17:20:20] "GET / HTTP/1.1" 200 13509 +192.168.253.237 - - [02/Sep/2024 17:20:35] "GET /access HTTP/1.1" 200 2785 +192.168.253.237 - - [02/Sep/2024 17:20:36] "GET / HTTP/1.1" 200 13509 +192.168.253.237 - - [02/Sep/2024 17:20:36] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:20:37] "GET /access HTTP/1.1" 200 2785 +192.168.253.237 - - [02/Sep/2024 17:22:16] "GET /access HTTP/1.1" 200 2785 +192.168.253.237 - - [02/Sep/2024 17:22:16] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:22:16] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:22:35] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 17:23:05] "GET /tests HTTP/1.1" 200 2228 +192.168.253.237 - - [02/Sep/2024 17:23:07] "GET / HTTP/1.1" 200 13509 +192.168.253.237 - - [02/Sep/2024 17:23:07] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:23:17] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 17:23:24] "GET /access HTTP/1.1" 200 2693 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 17:21:28] "GET / HTTP/1.1" 200 11994 +192.168.253.237 - - [02/Sep/2024 17:21:28] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:21:28] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:21:31] "GET / HTTP/1.1" 200 11994 +192.168.253.237 - - [02/Sep/2024 17:21:31] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:21:31] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:21:37] "GET / HTTP/1.1" 200 11994 +192.168.253.237 - - [02/Sep/2024 17:21:37] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:21:37] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:29:50] "GET / HTTP/1.1" 200 11994 +192.168.253.237 - - [02/Sep/2024 17:29:50] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:29:50] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:31:13] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 17:31:16] "GET /tests HTTP/1.1" 200 2228 +192.168.253.237 - - [02/Sep/2024 17:31:18] "GET / HTTP/1.1" 200 11994 +192.168.253.237 - - [02/Sep/2024 17:32:17] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:32:17] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 17:32:17] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 17:35:41] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 17:35:41] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:35:41] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:36:12] "GET / HTTP/1.1" 200 11994 +192.168.253.237 - - [02/Sep/2024 17:36:13] "GET / HTTP/1.1" 200 11994 +192.168.253.237 - - [02/Sep/2024 17:36:15] "GET / HTTP/1.1" 200 11994 +192.168.253.237 - - [02/Sep/2024 17:37:00] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 17:37:01] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 17:37:03] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 17:37:03] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 17:37:39] "GET / HTTP/1.1" 200 12034 +192.168.253.237 - - [02/Sep/2024 17:37:39] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 17:37:39] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 17:37:50] "GET / HTTP/1.1" 200 12042 +192.168.253.237 - - [02/Sep/2024 17:37:51] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 17:37:51] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 17:38:14] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:14] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:15] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:15] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:15] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:15] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:16] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:16] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:17] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:17] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:17] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:17] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:18] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:18] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 17:38:55] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 17:38:55] "POST /cmd HTTP/1.1" 200 56 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 17:39:35] "GET / HTTP/1.1" 200 12253 +192.168.253.237 - - [02/Sep/2024 17:39:35] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:39:35] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:41:21] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 17:41:21] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 17:42:29] "GET / HTTP/1.1" 200 12574 +192.168.253.237 - - [02/Sep/2024 17:42:29] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:42:29] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:42:29] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 17:42:29] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 17:42:45] "POST /cmd HTTP/1.1" 200 48 +192.168.253.237 - - [02/Sep/2024 17:42:45] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 17:42:48] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 17:42:48] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 17:42:48] "POST /cmd HTTP/1.1" 200 48 +192.168.253.237 - - [02/Sep/2024 17:42:48] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 17:43:04] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 17:43:05] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 17:43:05] "POST /cmd HTTP/1.1" 200 48 +192.168.253.237 - - [02/Sep/2024 17:43:05] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 17:43:06] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 17:43:06] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 17:44:16] "GET / HTTP/1.1" 200 11999 +192.168.253.237 - - [02/Sep/2024 17:44:16] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:44:16] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 17:44:16] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1178 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 17:44:34] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 17:44:34] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 17:44:38] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 17:44:38] "POST /cmd HTTP/1.1" 200 56 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 17:47:09] "GET / HTTP/1.1" 200 12006 +192.168.253.237 - - [02/Sep/2024 17:47:09] "GET /css/styles.css HTTP/1.1" 200 1088 +192.168.253.237 - - [02/Sep/2024 17:47:09] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 17:47:09] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 17:47:37] "GET / HTTP/1.1" 200 12416 +192.168.253.237 - - [02/Sep/2024 17:47:37] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:47:37] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 17:47:37] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 17:47:40] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 17:47:40] "POST /cmd HTTP/1.1" 200 55 +192.168.253.237 - - [02/Sep/2024 17:47:43] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 17:47:43] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 17:49:08] "GET / HTTP/1.1" 200 12449 +192.168.253.237 - - [02/Sep/2024 17:49:08] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:49:08] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:49:08] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 17:49:09] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 17:49:10] "POST /cmd HTTP/1.1" 200 56 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1229 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 17:49:10] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 17:49:16] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 17:49:17] "POST /cmd HTTP/1.1" 200 40 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 17:58:54] "GET / HTTP/1.1" 200 13815 +192.168.253.237 - - [02/Sep/2024 17:58:55] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:58:55] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 17:58:55] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 17:58:55] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:01:05] "GET / HTTP/1.1" 200 13655 +192.168.253.237 - - [02/Sep/2024 18:01:05] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:01:05] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:01:05] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:01:33] "GET / HTTP/1.1" 200 12838 +192.168.253.237 - - [02/Sep/2024 18:01:33] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:01:33] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:03:53] "GET / HTTP/1.1" 200 13095 +192.168.253.237 - - [02/Sep/2024 18:03:53] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:03:53] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:03:53] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:05:27] "GET / HTTP/1.1" 200 13095 +192.168.253.237 - - [02/Sep/2024 18:05:27] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:05:27] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:05:27] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:06:24] "GET / HTTP/1.1" 200 13095 +192.168.253.237 - - [02/Sep/2024 18:06:24] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.237 - - [02/Sep/2024 18:06:24] "GET /css/styles.css HTTP/1.1" 200 1173 +192.168.253.237 - - [02/Sep/2024 18:06:25] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.237 - - [02/Sep/2024 18:06:25] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.237 - - [02/Sep/2024 18:06:25] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.237 - - [02/Sep/2024 18:06:25] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:06:25] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 200 80421 +192.168.253.237 - - [02/Sep/2024 18:06:25] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 18:06:25] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.237 - - [02/Sep/2024 18:06:25] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:07:02] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:07:22] "GET / HTTP/1.1" 200 13115 +192.168.253.237 - - [02/Sep/2024 18:07:22] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:07:22] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:07:22] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:07:35] "GET / HTTP/1.1" 200 13115 +192.168.253.237 - - [02/Sep/2024 18:07:35] "GET /css/styles.css HTTP/1.1" 200 1173 +192.168.253.237 - - [02/Sep/2024 18:07:35] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.237 - - [02/Sep/2024 18:07:35] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.237 - - [02/Sep/2024 18:07:35] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.237 - - [02/Sep/2024 18:07:35] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.237 - - [02/Sep/2024 18:07:35] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:07:36] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 200 80421 +192.168.253.237 - - [02/Sep/2024 18:07:36] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 18:07:36] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.237 - - [02/Sep/2024 18:07:36] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:08:08] "GET / HTTP/1.1" 200 13095 +192.168.253.237 - - [02/Sep/2024 18:08:08] "GET /css/styles.css HTTP/1.1" 200 1171 +192.168.253.237 - - [02/Sep/2024 18:08:08] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:08:08] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:08:26] "GET / HTTP/1.1" 200 13095 +192.168.253.237 - - [02/Sep/2024 18:08:26] "GET /css/styles.css HTTP/1.1" 200 1173 +192.168.253.237 - - [02/Sep/2024 18:08:26] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:08:26] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:08:35] "GET / HTTP/1.1" 200 13095 +192.168.253.237 - - [02/Sep/2024 18:08:35] "GET /css/styles.css HTTP/1.1" 200 1173 +192.168.253.237 - - [02/Sep/2024 18:08:35] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:08:35] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1281 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 18:10:39] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 18:10:39] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 18:10:40] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 18:10:41] "POST /cmd HTTP/1.1" 200 40 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 18:11:27] "POST /cmd HTTP/1.1" 200 56 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1425 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 18:11:27] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 18:11:29] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 18:11:29] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 18:11:29] "POST /cmd HTTP/1.1" 200 56 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1431 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 18:11:29] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 18:11:30] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 18:11:30] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 18:11:30] "POST /cmd HTTP/1.1" 200 56 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1435 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 18:11:30] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 18:11:32] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 18:11:32] "POST /cmd HTTP/1.1" 200 56 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1439 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 18:11:43] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 18:11:43] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 18:11:43] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 18:11:44] "POST /cmd HTTP/1.1" 200 40 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1444 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 18:11:46] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 18:11:46] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 18:11:46] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 18:11:47] "POST /cmd HTTP/1.1" 200 40 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 18:13:15] "GET / HTTP/1.1" 200 13123 +192.168.253.237 - - [02/Sep/2024 18:13:15] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:13:15] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:13:15] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:13:24] "GET / HTTP/1.1" 200 12891 +192.168.253.237 - - [02/Sep/2024 18:13:24] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:13:24] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:13:49] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:14:49] "GET / HTTP/1.1" 200 12931 +192.168.253.237 - - [02/Sep/2024 18:14:49] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:14:49] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:14:49] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:14:49] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:19:35] "POST /cmd HTTP/1.1" 200 56 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1448 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 18:19:35] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 18:19:36] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 18:19:37] "POST /cmd HTTP/1.1" 200 40 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 18:19:58] "GET / HTTP/1.1" 200 12956 +192.168.253.237 - - [02/Sep/2024 18:19:58] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:19:58] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:19:58] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:20:51] "GET / HTTP/1.1" 200 12956 +192.168.253.237 - - [02/Sep/2024 18:20:51] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:20:51] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:21:19] "GET / HTTP/1.1" 200 12956 +192.168.253.237 - - [02/Sep/2024 18:21:19] "GET /css/styles.css HTTP/1.1" 200 1196 +192.168.253.237 - - [02/Sep/2024 18:21:19] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:21:19] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:21:24] "GET / HTTP/1.1" 200 12956 +192.168.253.237 - - [02/Sep/2024 18:21:24] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.237 - - [02/Sep/2024 18:21:25] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.237 - - [02/Sep/2024 18:21:25] "GET /css/styles.css HTTP/1.1" 200 1196 +192.168.253.237 - - [02/Sep/2024 18:21:25] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.237 - - [02/Sep/2024 18:21:25] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.237 - - [02/Sep/2024 18:21:25] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:21:25] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 200 80421 +192.168.253.237 - - [02/Sep/2024 18:21:25] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.237 - - [02/Sep/2024 18:21:25] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 18:21:25] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:22:56] "GET / HTTP/1.1" 200 12956 +192.168.253.237 - - [02/Sep/2024 18:22:56] "GET /css/styles.css HTTP/1.1" 200 1173 +192.168.253.237 - - [02/Sep/2024 18:22:56] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:22:56] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:23:01] "GET / HTTP/1.1" 200 12944 +192.168.253.237 - - [02/Sep/2024 18:23:01] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:23:01] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:23:01] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:23:06] "GET / HTTP/1.1" 200 12944 +192.168.253.237 - - [02/Sep/2024 18:23:06] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:23:06] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:23:06] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:26:44] "GET / HTTP/1.1" 200 12995 +192.168.253.237 - - [02/Sep/2024 18:26:44] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:26:44] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:26:44] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:26:50] "GET / HTTP/1.1" 200 12995 +192.168.253.237 - - [02/Sep/2024 18:26:51] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.237 - - [02/Sep/2024 18:26:51] "GET /css/styles.css HTTP/1.1" 200 1173 +192.168.253.237 - - [02/Sep/2024 18:26:51] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.237 - - [02/Sep/2024 18:26:51] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.237 - - [02/Sep/2024 18:26:51] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.237 - - [02/Sep/2024 18:26:51] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:26:52] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 200 80421 +192.168.253.237 - - [02/Sep/2024 18:26:52] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.237 - - [02/Sep/2024 18:26:52] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 18:26:52] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:29:12] "GET / HTTP/1.1" 200 12995 +192.168.253.237 - - [02/Sep/2024 18:29:12] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:29:12] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:29:12] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:29:18] "GET / HTTP/1.1" 200 13536 +192.168.253.237 - - [02/Sep/2024 18:29:18] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:29:18] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:29:36] "GET / HTTP/1.1" 200 13536 +192.168.253.237 - - [02/Sep/2024 18:29:44] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:29:44] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:33:30] "GET / HTTP/1.1" 200 13452 +192.168.253.237 - - [02/Sep/2024 18:33:30] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:33:35] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:33:35] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:34:18] "GET / HTTP/1.1" 200 13408 +192.168.253.237 - - [02/Sep/2024 18:34:21] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:34:21] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:34:48] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 18:34:48] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:34:48] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:34:48] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:35:10] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:35:10] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:35:56] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:35:56] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:37:03] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 18:37:03] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:37:03] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:37:03] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:37:03] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:38:01] "GET / HTTP/1.1" 200 13433 +192.168.253.237 - - [02/Sep/2024 18:38:02] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:38:02] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:38:11] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 18:38:11] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 18:38:12] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 18:38:12] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 18:38:12] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 18:38:12] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 18:38:13] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 18:38:13] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 18:38:22] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 18:38:22] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:38:22] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:39:11] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 18:39:12] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 18:39:12] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 18:39:12] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:39:12] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:39:12] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:39:13] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 18:39:14] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 18:39:14] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 18:39:14] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:39:14] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:39:14] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:39:15] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 18:39:16] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 18:39:17] "GET /tests HTTP/1.1" 200 2228 +192.168.253.237 - - [02/Sep/2024 18:39:17] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:39:17] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:39:17] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:39:18] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 18:39:19] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 18:39:23] "POST /cmd HTTP/1.1" 200 33 +192.168.253.237 - - [02/Sep/2024 18:39:24] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 18:39:24] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 18:39:24] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:39:24] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 18:39:24] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 18:39:29] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 18:40:14] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 18:40:23] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 18:40:23] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.237 - - [02/Sep/2024 18:40:23] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.237 - - [02/Sep/2024 18:40:24] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.237 - - [02/Sep/2024 18:40:24] "GET /css/styles.css HTTP/1.1" 200 1173 +192.168.253.237 - - [02/Sep/2024 18:40:24] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.237 - - [02/Sep/2024 18:40:24] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 200 80421 +192.168.253.237 - - [02/Sep/2024 18:40:24] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 18:40:24] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.237 - - [02/Sep/2024 18:40:28] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 18:41:11] "GET / HTTP/1.1" 200 13403 +192.168.253.127 - - [02/Sep/2024 18:42:27] "GET / HTTP/1.1" 200 13403 +192.168.253.127 - - [02/Sep/2024 18:42:27] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.127 - - [02/Sep/2024 18:42:27] "GET /css/styles.css HTTP/1.1" 200 1173 +192.168.253.127 - - [02/Sep/2024 18:42:28] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.127 - - [02/Sep/2024 18:42:28] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.127 - - [02/Sep/2024 18:42:28] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.127 - - [02/Sep/2024 18:42:28] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 200 80421 +192.168.253.127 - - [02/Sep/2024 18:42:28] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.127 - - [02/Sep/2024 18:42:28] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.127 - - [02/Sep/2024 18:42:29] "GET /favicon.ico HTTP/1.1" 404 733 +192.168.253.127 - - [02/Sep/2024 18:42:45] "POST /cmd HTTP/1.1" 200 33 +192.168.253.127 - - [02/Sep/2024 18:42:46] "POST /cmd HTTP/1.1" 200 40 +192.168.253.127 - - [02/Sep/2024 18:42:46] "GET / HTTP/1.1" 200 13403 +192.168.253.127 - - [02/Sep/2024 18:42:47] "POST /cmd HTTP/1.1" 200 33 +192.168.253.127 - - [02/Sep/2024 18:42:48] "POST /cmd HTTP/1.1" 200 40 +192.168.253.127 - - [02/Sep/2024 18:42:52] "GET /tests HTTP/1.1" 200 2228 +192.168.253.127 - - [02/Sep/2024 18:42:54] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 18:48:01] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 18:48:01] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:48:19] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 18:51:52] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 18:51:52] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:51:52] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:52:10] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 18:52:10] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:52:10] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 18:52:16] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 18:52:18] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 18:52:59] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 19:00:10] "POST /validate HTTP/1.1" 405 747 +192.168.253.237 - - [02/Sep/2024 19:00:25] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 19:00:25] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 19:00:29] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 19:00:47] "POST /validate HTTP/1.1" 405 747 +192.168.253.237 - - [02/Sep/2024 19:00:59] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 19:01:06] "GET /access HTTP/1.1" 200 2693 +192.168.253.237 - - [02/Sep/2024 19:02:22] "POST /access HTTP/1.1" 200 21 +192.168.253.237 - - [02/Sep/2024 19:02:33] "GET /access HTTP/1.1" 200 2692 +192.168.253.237 - - [02/Sep/2024 19:04:17] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 19:04:17] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 19:04:17] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 19:04:20] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 19:04:21] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:04:22] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 19:04:23] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:04:23] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 19:04:27] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:04:28] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 19:04:30] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:04:31] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 19:04:32] "POST /cmd HTTP/1.1" 200 38 +192.168.253.237 - - [02/Sep/2024 19:04:33] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:04:34] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:04:35] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:04:36] "POST /cmd HTTP/1.1" 200 43 +192.168.253.237 - - [02/Sep/2024 19:04:37] "POST /cmd HTTP/1.1" 200 43 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1508 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 19:04:37] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 19:04:37] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 19:04:39] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:04:39] "POST /cmd HTTP/1.1" 200 56 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 19:04:46] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 19:04:50] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 19:04:51] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:04:59] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 19:05:00] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:05:04] "GET / HTTP/1.1" 200 13403 +192.168.253.237 - - [02/Sep/2024 19:05:08] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 19:05:09] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:05:11] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 19:05:12] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:05:13] "POST /cmd HTTP/1.1" 200 43 +192.168.253.237 - - [02/Sep/2024 19:05:14] "POST /cmd HTTP/1.1" 200 40 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1846 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 19:05:14] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 19:05:14] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 19:05:21] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 19:05:22] "POST /cmd HTTP/1.1" 200 40 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 19:05:39] "POST /cmd HTTP/1.1" 200 46 +192.168.253.237 - - [02/Sep/2024 19:05:40] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:05:40] "POST /restartMotion HTTP/1.1" 200 203 +192.168.253.237 - - [02/Sep/2024 19:21:52] "GET / HTTP/1.1" 200 13404 +192.168.253.237 - - [02/Sep/2024 19:21:52] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 19:21:52] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 19:21:52] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 19:22:47] "GET / HTTP/1.1" 200 13404 +192.168.253.237 - - [02/Sep/2024 19:32:21] "GET / HTTP/1.1" 200 13422 +192.168.253.237 - - [02/Sep/2024 19:32:21] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 19:33:49] "GET / HTTP/1.1" 200 13423 +192.168.253.237 - - [02/Sep/2024 19:35:20] "GET / HTTP/1.1" 200 13451 +192.168.253.237 - - [02/Sep/2024 19:35:41] "GET / HTTP/1.1" 200 13462 +192.168.253.237 - - [02/Sep/2024 19:43:24] "GET / HTTP/1.1" 200 13465 +192.168.253.237 - - [02/Sep/2024 19:43:24] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 19:43:24] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 19:44:54] "POST /cmd HTTP/1.1" 200 42 +192.168.253.237 - - [02/Sep/2024 19:44:55] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 19:44:56] "POST /restartPi HTTP/1.1" 200 109 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 19:48:20] "GET / HTTP/1.1" 200 13479 +192.168.253.237 - - [02/Sep/2024 19:53:02] "GET / HTTP/1.1" 200 13485 +192.168.253.237 - - [02/Sep/2024 19:53:02] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 20:11:27] "GET / HTTP/1.1" 200 13528 +192.168.253.237 - - [02/Sep/2024 20:11:27] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 20:11:27] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 20:11:27] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 20:12:41] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 20:12:42] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:12:42] "GET / HTTP/1.1" 200 13528 +192.168.253.237 - - [02/Sep/2024 20:12:47] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 20:12:48] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:12:48] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 20:12:48] "POST /cmd HTTP/1.1" 200 41 +192.168.253.237 - - [02/Sep/2024 20:12:50] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 20:12:51] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:13:19] "POST /cmd HTTP/1.1" 200 46 +192.168.253.237 - - [02/Sep/2024 20:13:19] "POST /restartMotion HTTP/1.1" 200 203 +192.168.253.237 - - [02/Sep/2024 20:13:20] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:13:34] "GET / HTTP/1.1" 200 13528 +192.168.253.237 - - [02/Sep/2024 20:13:37] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 20:13:38] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:13:39] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 20:13:40] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:13:41] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 20:13:42] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:13:43] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:13:44] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 20:13:45] "POST /cmd HTTP/1.1" 200 38 +192.168.253.237 - - [02/Sep/2024 20:13:46] "POST /cmd HTTP/1.1" 200 38 +192.168.253.237 - - [02/Sep/2024 20:13:47] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:13:48] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:13:49] "POST /cmd HTTP/1.1" 200 43 +192.168.253.237 - - [02/Sep/2024 20:13:50] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:13:50] "GET / HTTP/1.1" 200 13528 +192.168.253.237 - - [02/Sep/2024 20:13:55] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:13:55] "POST /cmd HTTP/1.1" 200 29 +Aucun obstacle détecté +Aucun obstacle détecté +Aucun obstacle détecté +Obstacle détecté +Obstacle détecté +Obstacle détecté +Obstacle détecté +Aucun obstacle détecté +Aucun obstacle détecté +Obstacle détecté +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:14:08] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:14:08] "POST /cmd HTTP/1.1" 200 56 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1828 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:14:09] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 20:14:09] "POST /cmd HTTP/1.1" 200 56 +Distance à l'avant du véhicule: 67 cm +Distance à l'avant du véhicule: 67 cm +Distance à l'avant du véhicule: 67 cm +Distance à l'avant du véhicule: 6 cm +Distance à l'avant du véhicule: 57 cm +Distance à l'avant du véhicule: 39 cm +Distance à l'avant du véhicule: 67 cm +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:14:20] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:14:21] "POST /cmd HTTP/1.1" 200 40 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1832 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:14:22] "POST /cmd HTTP/1.1" 200 25 +192.168.253.237 - - [02/Sep/2024 20:14:22] "POST /cmd HTTP/1.1" 200 56 +Test de vitesse à 20% +Avancer pendant 0.5 secondes à une vitesse de 20 +Arrêt pendant 1 secondes +Reculer pendant 0.5 secondes à une vitesse de 20 +Arrêt pendant 1 secondes +Tourner à guauche pendant 0.5 secondes à une vitesse de 20 +Arrêt pendant 1 secondes +Tourner à droite pendant 0.5 secondes à une vitesse de 20 +Arrêt pendant 1 secondes +Test de vitesse à 50% +Avancer pendant 0.5 secondes à une vitesse de 50 +Arrêt pendant 1 secondes +Reculer pendant 0.5 secondes à une vitesse de 50 +Arrêt pendant 1 secondes +Tourner à guauche pendant 0.5 secondes à une vitesse de 50 +Arrêt pendant 1 secondes +Tourner à droite pendant 0.5 secondes à une vitesse de 50 +Arrêt pendant 1 secondes +Test de vitesse à 80% +Avancer pendant 0.5 secondes à une vitesse de 80 +Arrêt pendant 1 secondes +Reculer pendant 0.5 secondes à une vitesse de 80 +Arrêt pendant 1 secondes +Tourner à guauche pendant 0.5 secondes à une vitesse de 80 +Arrêt pendant 1 secondes +Tourner à droite pendant 0.5 secondes à une vitesse de 80 +Arrêt pendant 1 secondes +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:14:41] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:14:42] "POST /cmd HTTP/1.1" 200 40 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1839 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:14:43] "POST /cmd HTTP/1.1" 200 23 +192.168.253.237 - - [02/Sep/2024 20:14:43] "POST /cmd HTTP/1.1" 200 56 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:14:54] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:14:55] "POST /cmd HTTP/1.1" 200 40 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1844 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:14:56] "POST /cmd HTTP/1.1" 200 29 +192.168.253.237 - - [02/Sep/2024 20:14:56] "POST /cmd HTTP/1.1" 200 56 +Aucun obstacle détecté +Aucun obstacle détecté +Aucun obstacle détecté +Aucun obstacle détecté +Obstacle détecté +Aucun obstacle détecté +Aucun obstacle détecté +Aucun obstacle détecté +Aucun obstacle détecté +Obstacle détecté +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:15:06] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:15:06] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:15:16] "POST /cmd HTTP/1.1" 200 46 +192.168.253.237 - - [02/Sep/2024 20:15:16] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:15:28] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:15:28] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:22:52] "GET / HTTP/1.1" 200 13515 +192.168.253.237 - - [02/Sep/2024 20:22:52] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 20:22:54] "POST /cmd HTTP/1.1" 200 46 +192.168.253.237 - - [02/Sep/2024 20:22:54] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:22:57] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:22:57] "POST /cmd HTTP/1.1" 200 56 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 20:17:32] "GET / HTTP/1.1" 200 13515 +192.168.253.237 - - [02/Sep/2024 20:25:21] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [02/Sep/2024 20:25:22] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:25:23] "POST /cmd HTTP/1.1" 200 38 +192.168.253.237 - - [02/Sep/2024 20:25:24] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:25:25] "POST /cmd HTTP/1.1" 200 43 +192.168.253.237 - - [02/Sep/2024 20:25:26] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:25:28] "POST /cmd HTTP/1.1" 200 43 +192.168.253.237 - - [02/Sep/2024 20:25:29] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:25:37] "POST /cmd HTTP/1.1" 200 57 +192.168.253.237 - - [02/Sep/2024 20:25:37] "POST /cmd HTTP/1.1" 200 56 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 53 cm +Avancer pendant 0.1 secondes à une vitesse de 37.1 +Distance à l'avant du véhicule: 37 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 31 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 32 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 35 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 40 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 45 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 51 cm +Avancer pendant 0.1 secondes à une vitesse de 35.7 +Distance à l'avant du véhicule: 54 cm +Avancer pendant 0.1 secondes à une vitesse de 37.800000000000004 +Distance à l'avant du véhicule: 64 cm +Avancer pendant 0.1 secondes à une vitesse de 44.800000000000004 +Distance à l'avant du véhicule: 56 cm +Avancer pendant 0.1 secondes à une vitesse de 39.2 +Distance à l'avant du véhicule: 47 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 39 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 34 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 31 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 27 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 21 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 17 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 15 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 14 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 16 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 24 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 32 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 39 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 43 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 46 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 51 cm +Avancer pendant 0.1 secondes à une vitesse de 35.7 +Distance à l'avant du véhicule: 57 cm +Avancer pendant 0.1 secondes à une vitesse de 39.9 +Distance à l'avant du véhicule: 63 cm +Avancer pendant 0.1 secondes à une vitesse de 44.1 +Distance à l'avant du véhicule: 70 cm +Avancer pendant 0.1 secondes à une vitesse de 49.0 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 63 cm +Avancer pendant 0.1 secondes à une vitesse de 44.1 +Distance à l'avant du véhicule: 47 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 41 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 56 cm +Avancer pendant 0.1 secondes à une vitesse de 39.2 +Distance à l'avant du véhicule: 31 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 24 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 19 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 18 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 21 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 27 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 66 cm +Avancer pendant 0.1 secondes à une vitesse de 46.2 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 45 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 51 cm +Avancer pendant 0.1 secondes à une vitesse de 35.7 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 65 cm +Avancer pendant 0.1 secondes à une vitesse de 45.5 +Distance à l'avant du véhicule: 37 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 29 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 21 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 17 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 14 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 14 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 12 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 13 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 16 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 24 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 51 cm +Avancer pendant 0.1 secondes à une vitesse de 35.7 +Distance à l'avant du véhicule: 49 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 39 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 41 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 43 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 44 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 38 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 27 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 19 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 16 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 14 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 11 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 12 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 13 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 13 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 13 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 12 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 12 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 14 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 14 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 16 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 19 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 25 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:26:04] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:26:05] "POST /cmd HTTP/1.1" 200 40 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1194 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:26:05] "POST /cmd HTTP/1.1" 200 39 +192.168.253.237 - - [02/Sep/2024 20:26:05] "POST /cmd HTTP/1.1" 200 56 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Arrêt d'urgence ! +Arrêt d'urgence ! +Arrêt d'urgence ! +Arrêt d'urgence ! +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Arrêt d'urgence ! +Arrêt d'urgence ! +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Arrêt d'urgence ! +Arrêt d'urgence ! +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Arrêt d'urgence ! +Arrêt d'urgence ! +Arrêt d'urgence ! +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Nettoyage des GPIO effectué. +Le composant fonctionne correctement: operation successful. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:26:22] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:26:22] "POST /cmd HTTP/1.1" 200 56 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1207 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:26:23] "POST /cmd HTTP/1.1" 200 57 +192.168.253.237 - - [02/Sep/2024 20:26:23] "POST /cmd HTTP/1.1" 200 56 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 39 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 36 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 33 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 26 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 21 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 17 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 15 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 10 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 10 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 9 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 9 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 9 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 9 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 9 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 9 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 9 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 9 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 11 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 17 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 30 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 31 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 19 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 14 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 11 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 11 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 10 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 11 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 14 cm +Arrêt pendant 0.1 secondes +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 69 cm +Avancer pendant 0.1 secondes à une vitesse de 48.3 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:28:06] "GET / HTTP/1.1" 200 13497 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1226 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:28:08] "POST /cmd HTTP/1.1" 200 57 +192.168.253.237 - - [02/Sep/2024 20:28:08] "POST /cmd HTTP/1.1" 200 56 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 30 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 19 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 7 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 10 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 8 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 12 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 60 cm +Avancer pendant 0.1 secondes à une vitesse de 42.0 +Distance à l'avant du véhicule: 41 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 33 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 22 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 14 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 8 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 15 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 35 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 37 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 40 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 42 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 39 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 36 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 31 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 27 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 24 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 19 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 14 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 68 cm +Avancer pendant 0.1 secondes à une vitesse de 47.6 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 67 cm +Avancer pendant 0.1 secondes à une vitesse de 46.900000000000006 +Distance à l'avant du véhicule: 54 cm +Avancer pendant 0.1 secondes à une vitesse de 37.800000000000004 +Distance à l'avant du véhicule: 20 cm +Avancer pendant 0.1 secondes à une vitesse de 20 +Distance à l'avant du véhicule: 15 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 9 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 7 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 8 cm +Arrêt d'urgence ! +Distance à l'avant du véhicule: 8 cm +Arrêt d'urgence ! +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1279 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:28:25] "POST /cmd HTTP/1.1" 200 30 +192.168.253.237 - - [02/Sep/2024 20:28:25] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:28:29] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:28:29] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:28:31] "POST /cmd HTTP/1.1" 200 56 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1303 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:28:31] "POST /cmd HTTP/1.1" 200 36 +Distance à l'avant du véhicule: 68 cm +Distance à l'avant du véhicule: 68 cm +Distance à l'avant du véhicule: 67 cm +Distance à l'avant du véhicule: 67 cm +Distance à l'avant du véhicule: 67 cm +Distance à l'avant du véhicule: 67 cm +Distance à l'avant du véhicule: 68 cm +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +Aucun obstacle détecté +Aucun obstacle détecté +Aucun obstacle détecté +Aucun obstacle détecté +Aucun obstacle détecté +Obstacle détecté +Obstacle détecté +Aucun obstacle détecté +Aucun obstacle détecté +Aucun obstacle détecté +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:28:39] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:28:39] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:29:45] "GET / HTTP/1.1" 200 13474 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1310 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:29:50] "POST /cmd HTTP/1.1" 200 36 +192.168.253.237 - - [02/Sep/2024 20:29:50] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:31:12] "GET / HTTP/1.1" 200 13474 +192.168.253.237 - - [02/Sep/2024 20:31:12] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 20:31:13] "POST /cmd HTTP/1.1" 200 56 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1340 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:31:13] "POST /cmd HTTP/1.1" 200 36 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1383 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:31:23] "POST /cmd HTTP/1.1" 200 30 +192.168.253.237 - - [02/Sep/2024 20:31:23] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:31:28] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:31:28] "POST /cmd HTTP/1.1" 200 56 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1389 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:31:32] "POST /cmd HTTP/1.1" 200 39 +192.168.253.237 - - [02/Sep/2024 20:31:32] "POST /cmd HTTP/1.1" 200 56 +Positionné à 0° +Positionné à 45° +Positionné à 90° +Positionné à 135° +Positionné à 180° +Positionné à 0° +Nettoyage des GPIO effectué. +Le composant fonctionne correctement. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:31:41] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:31:42] "POST /cmd HTTP/1.1" 200 56 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Arrêt d'urgence ! +Arrêt d'urgence ! +Arrêt d'urgence ! +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Arrêt d'urgence ! +Arrêt d'urgence ! +Arrêt d'urgence ! +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Nettoyage des GPIO effectué. +Le composant fonctionne correctement: operation successful. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:31:42] "GET / HTTP/1.1" 200 13485 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1396 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:31:46] "POST /cmd HTTP/1.1" 200 39 +192.168.253.237 - - [02/Sep/2024 20:31:46] "POST /cmd HTTP/1.1" 200 56 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Arrêt d'urgence ! +Arrêt d'urgence ! +Arrêt d'urgence ! +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Arrêt d'urgence ! +Arrêt d'urgence ! +Arrêt d'urgence ! +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Nettoyage des GPIO effectué. +Le composant fonctionne correctement: operation successful. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:32:01] "POST /cmd HTTP/1.1" 200 56 +192.168.253.237 - - [02/Sep/2024 20:32:02] "POST /cmd HTTP/1.1" 200 40 +/usr/lib/python3.9/subprocess.py:1052: ResourceWarning: subprocess 1408 is still running + _warn("subprocess %s is still running" % self.pid, +ResourceWarning: Enable tracemalloc to get the object allocation traceback +192.168.253.237 - - [02/Sep/2024 20:32:03] "POST /cmd HTTP/1.1" 200 39 +192.168.253.237 - - [02/Sep/2024 20:32:03] "POST /cmd HTTP/1.1" 200 56 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Arrêt d'urgence ! +Arrêt d'urgence ! +Arrêt d'urgence ! +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Avancer pendant 0.1 secondes à une vitesse de 20 +Nettoyage des GPIO effectué. +Le composant fonctionne correctement: operation successful. +Résultats enregistrés avec succès. +192.168.253.237 - - [02/Sep/2024 20:32:16] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [02/Sep/2024 20:32:16] "POST /cmd HTTP/1.1" 200 56 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 20:53:59] "GET / HTTP/1.1" 200 13493 +192.168.253.237 - - [02/Sep/2024 20:53:59] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 20:53:59] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 20:53:59] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 20:54:51] "GET / HTTP/1.1" 200 13493 +192.168.253.237 - - [02/Sep/2024 20:54:54] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 20:54:54] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 20:55:19] "GET / HTTP/1.1" 200 13493 +192.168.253.237 - - [02/Sep/2024 20:55:19] "GET /css/styles.css HTTP/1.1" 200 1173 +192.168.253.237 - - [02/Sep/2024 20:55:19] "GET /fonts/SegmentLED.ttf HTTP/1.1" 200 1279304 +192.168.253.237 - - [02/Sep/2024 20:55:20] "GET /css/bootstrap.min.css HTTP/1.1" 200 232803 +192.168.253.237 - - [02/Sep/2024 20:55:20] "GET /images/pointer.png HTTP/1.1" 200 4224 +192.168.253.237 - - [02/Sep/2024 20:55:20] "GET /js/jquery.js HTTP/1.1" 200 96381 +192.168.253.237 - - [02/Sep/2024 20:55:20] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 200 80421 +192.168.253.237 - - [02/Sep/2024 20:55:20] "GET /js/script.js HTTP/1.1" 200 3077 +192.168.253.237 - - [02/Sep/2024 20:55:20] "GET /images/speedometer.png HTTP/1.1" 200 68913 +192.168.253.237 - - [02/Sep/2024 20:55:23] "GET /js/bootstrap.bundle.min.js.map HTTP/1.1" 404 752 +192.168.253.237 - - [02/Sep/2024 20:55:23] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 747 +192.168.253.237 - - [02/Sep/2024 20:57:18] "GET / HTTP/1.1" 200 13501 +192.168.253.237 - - [02/Sep/2024 21:00:42] "GET / HTTP/1.1" 200 13501 +192.168.253.237 - - [02/Sep/2024 21:12:27] "GET / HTTP/1.1" 200 13411 +192.168.253.237 - - [02/Sep/2024 21:12:28] "GET /css/styles.css HTTP/1.1" 304 0 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 22:19:19] "GET / HTTP/1.1" 200 13381 +192.168.253.237 - - [02/Sep/2024 22:19:19] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 22:19:19] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 22:19:19] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 22:19:22] "GET /favicon.ico HTTP/1.1" 404 733 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [02/Sep/2024 23:31:47] "GET / HTTP/1.1" 200 13363 +192.168.253.237 - - [02/Sep/2024 23:31:47] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 23:31:47] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 23:31:47] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [02/Sep/2024 23:31:49] "GET /favicon.ico HTTP/1.1" 404 733 +192.168.253.237 - - [02/Sep/2024 23:31:53] "GET / HTTP/1.1" 200 13363 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +192.168.253.237 - - [03/Sep/2024 01:29:23] "GET / HTTP/1.1" 200 13458 +192.168.253.237 - - [03/Sep/2024 01:29:23] "GET /css/styles.css HTTP/1.1" 304 0 +192.168.253.237 - - [03/Sep/2024 01:29:23] "GET /js/bootstrap.bundle.min.js HTTP/1.1" 304 0 +192.168.253.237 - - [03/Sep/2024 01:29:23] "GET /js/script.js HTTP/1.1" 304 0 +192.168.253.237 - - [03/Sep/2024 01:29:38] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [03/Sep/2024 01:29:39] "POST /cmd HTTP/1.1" 200 40 +192.168.253.237 - - [03/Sep/2024 01:29:40] "POST /cmd HTTP/1.1" 200 31 +192.168.253.237 - - [03/Sep/2024 01:29:41] "POST /cmd HTTP/1.1" 200 40 +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ +Hit Ctrl-C to quit. + +Bottle v0.12.25 server starting up (using WSGIRefServer())... +Listening on http://192.168.253.194:8000/ Hit Ctrl-C to quit. -192.168.74.237 - - [15/May/2024 11:01:16] "GET / HTTP/1.1" 200 4592 -192.168.74.237 - - [15/May/2024 11:01:21] "POST /cmd HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:21] "POST /cmd HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:22] "POST /cmd HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:22] "POST /cmd HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:34] "POST /cmd HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:35] "POST /cmd HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:35] "POST /cmd HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:35] "POST /cmd HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:41] "POST /motor_speed_move HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:41] "POST /cmd HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:41] "POST /cmd HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:45] "POST /cmd HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:45] "POST /motor_speed_move HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:45] "POST /cmd HTTP/1.1" 200 2 -192.168.74.237 - - [15/May/2024 11:01:54] "GET /css/bootstrap.min.css.map HTTP/1.1" 404 746 diff --git a/WebControl/logs/motionlogs.txt b/WebControl/logs/motionlogs.txt new file mode 100644 index 0000000..ec1dc5a Binary files /dev/null and b/WebControl/logs/motionlogs.txt differ diff --git a/WebControl/logs/resultats_tests.json b/WebControl/logs/resultats_tests.json new file mode 100644 index 0000000..959b47e --- /dev/null +++ b/WebControl/logs/resultats_tests.json @@ -0,0 +1,1808 @@ +[ + { + "date": "2024-08-30 17:54:47", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": false, + "status": "error" + }, + { + "date": "2024-08-30 18:00:03", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": false, + "status": "error" + }, + { + "date": "2024-08-30 18:01:46", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-08-30 18:06:57", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-08-30 18:08:02", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-08-30 18:09:58", + "nom": "tests/servo.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-08-30 18:10:08", + "nom": "tests/servo.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-08-30 18:10:42", + "nom": "tests/servo.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-08-30 18:34:30", + "nom": "tests/servo.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-08-30 18:34:36", + "nom": "tests/servo.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-08-30 18:35:12", + "nom": "tests/servo.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-08-30 18:35:19", + "nom": "tests/servo.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:21:15", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 12:29:04", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 12:33:58", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 12:34:10", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:35:01", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:35:16", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:50:10", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:50:26", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:50:52", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:51:09", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:51:18", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:52:07", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:52:24", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:53:06", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:53:17", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:53:27", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:53:38", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:53:48", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:54:14", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:54:25", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:54:36", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:55:04", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:55:15", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:55:33", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:55:42", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:55:52", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:56:21", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:56:36", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:57:16", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:57:26", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 12:57:58", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 13:02:10", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 13:02:22", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 13:03:01", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 13:04:55", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 13:05:07", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 13:05:32", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 13:06:23", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 13:06:43", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 13:07:28", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 13:07:37", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 13:08:22", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 13:08:33", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 14:16:41", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 14:23:01", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 14:27:23", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 14:27:50", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "error" + }, + { + "date": "2024-09-01 14:31:33", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "error" + }, + { + "date": "2024-09-01 14:38:17", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "error" + }, + { + "date": "2024-09-01 14:39:19", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "error" + }, + { + "date": "2024-09-01 14:49:24", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "error" + }, + { + "date": "2024-09-01 14:59:28", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "error" + }, + { + "date": "2024-09-01 15:03:02", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "error" + }, + { + "date": "2024-09-01 15:07:49", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:08:01", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:11:10", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:11:30", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:13:42", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:13:51", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:17:21", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:17:39", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:18:21", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:18:30", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:18:33", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:18:38", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:19:19", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:24:50", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:28:18", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:29:50", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:29:55", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:31:05", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 15:31:39", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 16:06:14", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 16:08:49", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 16:09:05", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 16:10:58", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 16:12:42", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 16:12:56", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 16:13:34", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": true, + "status": "Access successful" + }, + { + "date": "2024-09-01 16:15:31", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": true, + "status": "Access successful" + }, + { + "date": "2024-09-01 16:21:35", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 16:21:40", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": true, + "status": "Access successful" + }, + { + "date": "2024-09-01 16:22:33", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": true, + "status": "Access successful" + }, + { + "date": "2024-09-01 16:28:02", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "test successful" + }, + { + "date": "2024-09-01 16:31:02", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "no obstacle" + }, + { + "date": "2024-09-01 16:31:12", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "obstacle detected" + }, + { + "date": "2024-09-01 17:11:43", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "obstacle detected" + }, + { + "date": "2024-09-01 17:13:06", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "no obstacle" + }, + { + "date": "2024-09-01 17:16:07", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-01 17:16:29", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-01 17:20:12", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-01 18:45:55", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "erreur s\u00e9rie" + }, + { + "date": "2024-09-01 23:20:10", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": false, + "status": "no obstacle detected" + }, + { + "date": "2024-09-01 23:20:47", + "nom": "tests/motor_speed_move.py", + "fonctionnement_ok": true, + "status": "move successful" + }, + { + "date": "2024-09-01 23:21:06", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": true, + "status": "Access successful" + }, + { + "date": "2024-09-01 23:21:24", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-01 23:29:16", + "nom": "tests/motor_speed_move.py", + "fonctionnement_ok": true, + "status": "move successful" + }, + { + "date": "2024-09-01 23:29:42", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-01 23:30:33", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 23:30:38", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": true, + "status": "Access successful" + }, + { + "date": "2024-09-01 23:40:27", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 23:40:49", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "initialization" + }, + { + "date": "2024-09-01 23:41:21", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "initialization" + }, + { + "date": "2024-09-01 23:41:37", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "initialization" + }, + { + "date": "2024-09-01 23:42:31", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-01 23:43:37", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-01 23:43:59", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 00:34:41", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 00:36:15", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 00:38:31", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 00:38:46", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 00:39:04", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 00:39:15", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 00:40:24", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 00:40:52", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 00:43:14", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 00:43:53", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 00:44:05", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 00:55:57", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 01:02:52", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 01:03:33", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 01:03:42", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 01:09:45", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 01:10:05", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 01:10:15", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 01:12:14", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 01:12:54", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 01:13:10", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 01:13:29", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 01:14:10", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 01:14:41", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 01:15:05", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 01:18:49", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 01:54:34", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 01:57:47", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 01:57:58", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 01:58:40", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": true, + "status": "Access successful" + }, + { + "date": "2024-09-02 01:58:48", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "Access denied" + }, + { + "date": "2024-09-02 01:58:59", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": true, + "status": "Access successful" + }, + { + "date": "2024-09-02 02:00:36", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 02:05:57", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 02:06:17", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 02:07:53", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 02:13:54", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 02:18:51", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 09:47:37", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 09:48:04", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 09:51:44", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 09:53:37", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 10:15:00", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 10:15:06", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 10:50:09", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 12:20:43", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 12:21:09", + "nom": "tests/motor_speed_move.py", + "fonctionnement_ok": true, + "status": "move successful" + }, + { + "date": "2024-09-02 12:21:21", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 12:21:32", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "obstacle detected" + }, + { + "date": "2024-09-02 12:26:36", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 15:36:32", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 15:36:47", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 15:37:32", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 15:47:26", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 15:48:29", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 15:48:44", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 15:49:04", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 16:03:47", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 16:04:44", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 16:42:42", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 16:42:52", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 17:39:04", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 17:44:43", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 17:49:19", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 18:10:49", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 18:11:36", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 18:11:38", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 18:11:39", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 18:11:52", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 18:11:55", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 18:19:44", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 19:04:46", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 19:05:24", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 19:16:31", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 19:18:50", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 19:20:15", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 19:21:26", + "nom": "tests/motor_speed_move.py", + "fonctionnement_ok": true, + "status": "move successful" + }, + { + "date": "2024-09-02 19:25:45", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": false, + "status": "no obstacle detected" + }, + { + "date": "2024-09-02 19:30:10", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 19:32:14", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-02 19:33:44", + "nom": "tests/motor_speed_move.py", + "fonctionnement_ok": true, + "status": "move successful" + }, + { + "date": "2024-09-02 19:34:24", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": false, + "status": "no obstacle detected" + }, + { + "date": "2024-09-02 19:35:13", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "no obstacle detected" + }, + { + "date": "2024-09-02 19:35:35", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "obstacle detected" + }, + { + "date": "2024-09-02 19:40:03", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "time limit reached" + }, + { + "date": "2024-09-02 19:44:24", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 19:44:26", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 19:44:38", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "initialization" + }, + { + "date": "2024-09-02 19:47:11", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "operation successful" + }, + { + "date": "2024-09-02 19:47:49", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "emergency stop successful" + }, + { + "date": "2024-09-02 19:48:10", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-02 19:50:45", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "obstacle detected" + }, + { + "date": "2024-09-02 19:51:01", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-02 19:51:26", + "nom": "tests/motor_speed_move.py", + "fonctionnement_ok": true, + "status": "move successful" + }, + { + "date": "2024-09-02 19:51:48", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 19:52:15", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "operation successful" + }, + { + "date": "2024-09-02 19:52:48", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-02 19:55:32", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "operation successful" + }, + { + "date": "2024-09-02 19:56:04", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "operation successful" + }, + { + "date": "2024-09-02 19:57:07", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "operation successful" + }, + { + "date": "2024-09-02 20:06:25", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "operation successful" + }, + { + "date": "2024-09-02 20:07:37", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "operation successful" + }, + { + "date": "2024-09-02 20:08:04", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "emergency stop successful" + }, + { + "date": "2024-09-02 20:14:00", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "obstacle detected" + }, + { + "date": "2024-09-02 20:14:17", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-02 20:14:40", + "nom": "tests/motor_speed_move.py", + "fonctionnement_ok": true, + "status": "move successful" + }, + { + "date": "2024-09-02 20:14:52", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 20:15:02", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "obstacle detected" + }, + { + "date": "2024-09-02 20:25:48", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-02 20:26:15", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "operation successful" + }, + { + "date": "2024-09-02 20:26:33", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-02 20:28:18", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-02 20:28:32", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-02 20:28:36", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "no obstacle detected" + }, + { + "date": "2024-09-02 20:31:32", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 20:31:42", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "operation successful" + }, + { + "date": "2024-09-02 20:31:56", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "operation successful" + }, + { + "date": "2024-09-02 20:32:13", + "nom": "apps/infrared_obstacle_avoidance.py", + "fonctionnement_ok": true, + "status": "operation successful" + }, + { + "date": "2024-09-02 20:46:38", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "no obstacle detected" + }, + { + "date": "2024-09-02 20:51:45", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "obstacle detected" + }, + { + "date": "2024-09-02 20:52:00", + "nom": "tests/infrared_obstacle_module.py", + "fonctionnement_ok": true, + "status": "no obstacle detected" + }, + { + "date": "2024-09-02 20:52:25", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-02 20:52:47", + "nom": "tests/lidar_module.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-02 20:53:50", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 21:01:24", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 21:04:05", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 21:04:26", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 21:04:57", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 21:05:57", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 21:06:12", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 21:07:22", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 21:08:36", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 21:08:47", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 21:08:57", + "nom": "tests/servo_motor.py", + "fonctionnement_ok": true, + "status": "movement successful" + }, + { + "date": "2024-09-02 22:06:38", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 22:16:13", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 22:16:23", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 22:16:44", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 22:17:17", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 22:19:05", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 23:01:49", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": true, + "status": "Access successful" + }, + { + "date": "2024-09-02 23:01:55", + "nom": "tests/rfid_open_door.py", + "fonctionnement_ok": true, + "status": "Access successful" + }, + { + "date": "2024-09-02 23:06:01", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 23:06:33", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 23:22:22", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 23:26:51", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 23:31:19", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 23:39:06", + "nom": "apps/itineraire_suivre_emergency.py", + "fonctionnement_ok": false, + "status": "initialization" + }, + { + "date": "2024-09-02 23:52:54", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 23:53:36", + "nom": "apps/itineraire_suivre_emergency.py", + "fonctionnement_ok": false, + "status": "initialization" + }, + { + "date": "2024-09-02 23:57:20", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-02 23:59:02", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 00:11:24", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "initialization" + }, + { + "date": "2024-09-03 00:11:59", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 00:13:52", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-03 00:24:37", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": true, + "status": "measurement successful" + }, + { + "date": "2024-09-03 00:54:47", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:00:15", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:04:31", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:04:40", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:05:27", + "nom": "apps/itineraire_suivre_emergency.py", + "fonctionnement_ok": false, + "status": "initialization" + }, + { + "date": "2024-09-03 01:15:20", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:16:13", + "nom": "apps/itineraire_suivre_emergency.py", + "fonctionnement_ok": false, + "status": "initialization" + }, + { + "date": "2024-09-03 01:18:10", + "nom": "apps/itineraire_suivre_emergency.py", + "fonctionnement_ok": false, + "status": "initialization" + }, + { + "date": "2024-09-03 01:20:22", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:22:51", + "nom": "apps/itineraire_suivre_emergency.py", + "fonctionnement_ok": true, + "status": "scenario successful" + }, + { + "date": "2024-09-03 01:23:42", + "nom": "apps/itineraire_suivre_emergency.py", + "fonctionnement_ok": true, + "status": "scenario successful" + }, + { + "date": "2024-09-03 01:28:18", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:29:09", + "nom": "apps/itineraire_suivre_emergency.py", + "fonctionnement_ok": true, + "status": "scenario successful" + }, + { + "date": "2024-09-03 01:37:02", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:37:37", + "nom": "apps/itineraire_suivre_emergency.py", + "fonctionnement_ok": false, + "status": "error" + }, + { + "date": "2024-09-03 01:41:54", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:42:14", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:42:25", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:42:45", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:49:06", + "nom": "apps/lidar_speed_move.py", + "fonctionnement_ok": false, + "status": "initialization" + }, + { + "date": "2024-09-03 01:49:39", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:52:08", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:52:16", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:57:18", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 01:57:27", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + }, + { + "date": "2024-09-03 02:00:09", + "nom": "apps/scenario_rfid.py", + "fonctionnement_ok": false, + "status": "interrupted" + } +] \ No newline at end of file diff --git a/WebControl/logs/selected_steps.json b/WebControl/logs/selected_steps.json new file mode 100644 index 0000000..9f9a3a8 --- /dev/null +++ b/WebControl/logs/selected_steps.json @@ -0,0 +1,78 @@ +[ + { + "distance_value": 141, + "maneuver": "maneuver-unspecified" + }, + { + "distance_value": 231, + "maneuver": "turn-sharp-left" + }, + { + "distance_value": 397, + "maneuver": "maneuver-unspecified" + }, + { + "distance_value": 70, + "maneuver": "maneuver-unspecified" + }, + { + "distance_value": 160, + "maneuver": "turn-left" + }, + { + "distance_value": 407, + "maneuver": "turn-right" + }, + { + "distance_value": 424, + "maneuver": "turn-left" + }, + { + "distance_value": 960, + "maneuver": "roundabout-right" + }, + { + "distance_value": 2230, + "maneuver": "ramp-right" + }, + { + "distance_value": 5935, + "maneuver": "fork-right" + }, + { + "distance_value": 4403, + "maneuver": "fork-right" + }, + { + "distance_value": 3099, + "maneuver": "ramp-left" + }, + { + "distance_value": 391, + "maneuver": "keep-left" + }, + { + "distance_value": 1674, + "maneuver": "merge" + }, + { + "distance_value": 829, + "maneuver": "keep-left" + }, + { + "distance_value": 413, + "maneuver": "keep-left" + }, + { + "distance_value": 193, + "maneuver": "merge" + }, + { + "distance_value": 476, + "maneuver": "turn-left" + }, + { + "distance_value": 305, + "maneuver": "turn-right" + } +] \ No newline at end of file diff --git a/WebControl/logs/selected_steps_short.json b/WebControl/logs/selected_steps_short.json new file mode 100644 index 0000000..5be7d23 --- /dev/null +++ b/WebControl/logs/selected_steps_short.json @@ -0,0 +1,22 @@ +[ + { + "distance_value": 197, + "maneuver": "maneuver-unspecified" + }, + { + "distance_value": 1313, + "maneuver": "turn-right" + }, + { + "distance_value": 507, + "maneuver": "ramp-right" + }, + { + "distance_value": 4465, + "maneuver": "merge" + }, + { + "distance_value": 5935, + "maneuver": "fork-right" + } +] \ No newline at end of file diff --git a/WebControl/logs/steps.json b/WebControl/logs/steps.json new file mode 100644 index 0000000..52b75fd --- /dev/null +++ b/WebControl/logs/steps.json @@ -0,0 +1,455 @@ +[ + { + "distance": { + "text": "0.1 km", + "value": 141 + }, + "duration": { + "text": "1 min", + "value": 37 + }, + "end_location": { + "lat": 48.82129579999999, + "lng": 2.2737025 + }, + "html_instructions": "Head southwest on Rue de l'Abbé Grégoire toward Rue de la Glacière", + "polyline": { + "points": "kq~hHsj{LdAxBDHP`@@@JTDHDHDFLXBFJPJP" + }, + "start_location": { + "lat": 48.82214339999999, + "lng": 2.2751386 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.2 km", + "value": 231 + }, + "duration": { + "text": "1 min", + "value": 64 + }, + "end_location": { + "lat": 48.821996, + "lng": 2.276619 + }, + "html_instructions": "Sharp left onto Rue d'Alembert", + "maneuver": "turn-sharp-left", + "polyline": { + "points": "cl~hHsa{L@M@I?K?K?GAIAKAEAKAKIk@AEE_@AECSc@sDMs@GUEMCKCGKSY{@" + }, + "start_location": { + "lat": 48.82129579999999, + "lng": 2.2737025 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.4 km", + "value": 397 + }, + "duration": { + "text": "1 min", + "value": 71 + }, + "end_location": { + "lat": 48.8230712, + "lng": 2.2815447 + }, + "html_instructions": "Continue onto Rue de l'Abbé Derry", + "polyline": { + "points": "op~hH{s{LKFIs@COAM?O@y@@a@?u@CeAAg@AUCq@CSAQCWEYG]ESMg@ACQu@EOWgAa@}BAKCMAECESk@Qa@" + }, + "start_location": { + "lat": 48.821996, + "lng": 2.276619 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "70 m", + "value": 70 + }, + "duration": { + "text": "1 min", + "value": 21 + }, + "end_location": { + "lat": 48.8234637, + "lng": 2.2822848 + }, + "html_instructions": "Continue onto Rue du Chevalier de la Barre", + "polyline": { + "points": "ew~hHsr|LUm@M_@EKM_@CGCC?AAAAACAEE" + }, + "start_location": { + "lat": 48.8230712, + "lng": 2.2815447 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.2 km", + "value": 160 + }, + "duration": { + "text": "1 min", + "value": 41 + }, + "end_location": { + "lat": 48.8248221, + "lng": 2.2819013 + }, + "html_instructions": "Turn left onto Av. du Général de Gaulle/D71", + "maneuver": "turn-left", + "polyline": { + "points": "sy~hHgw|L_@Je@Ja@LQFG@_@HC@EB_@NC@WJIBA@A?A?A?A?A?AAA?AA?AAAACGK" + }, + "start_location": { + "lat": 48.8234637, + "lng": 2.2822848 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.4 km", + "value": 407 + }, + "duration": { + "text": "1 min", + "value": 82 + }, + "end_location": { + "lat": 48.8219346, + "lng": 2.2853073 + }, + "html_instructions": "Turn right onto Bd du Lycée/D50", + "maneuver": "turn-right", + "polyline": { + "points": "cb_iH{t|Lb@g@`DcEpFcHZ_@tAcBVU" + }, + "start_location": { + "lat": 48.8248221, + "lng": 2.2819013 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.4 km", + "value": 424 + }, + "duration": { + "text": "1 min", + "value": 83 + }, + "end_location": { + "lat": 48.8204157, + "lng": 2.2905512 + }, + "html_instructions": "Turn left onto Rue Antoine Fratacci/D50", + "maneuver": "turn-left", + "polyline": { + "points": "ap~hHej}L?EAG?E?A?C?I?G?ALuBD[BYDW@ADU?CVeAh@wBZsAZoAFSJc@Jm@@ELk@@EVgA`@_BFWFWFSJ]" + }, + "start_location": { + "lat": 48.8219346, + "lng": 2.2853073 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "1.0 km", + "value": 960 + }, + "duration": { + "text": "3 mins", + "value": 203 + }, + "end_location": { + "lat": 48.8253839, + "lng": 2.3004907 + }, + "html_instructions": "At the roundabout, take the 4th exit onto Rue Jean Bleuzen/D130", + "maneuver": "roundabout-right", + "polyline": { + "points": "sf~hH}j~L@@@?@?@@@?@?@?@?@?@ABA@A@A@A@A@A@C?A@A?A@A?C?A@A?A?C?A?C?C?AAC?A?CAA?CAA?AACAAACAAA?AA?AA?A?AAC?A?A?A?A@O_@GOGSGOGQe@eAOQi@kAMYO[o@sAEIYk@Wk@Yk@MUEMo@qAO]_@u@Qc@GMM[Sg@EKGSQ_@_@eACGEKIQm@_B?AM[IQ?CGKOc@G[AKAGAEAG_AeCM_@]eA[w@CICIGQIQM_@Si@GSYy@KSKWEICGIMIIIIECEEIAG?" + }, + "start_location": { + "lat": 48.8204157, + "lng": 2.2905512 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "2.2 km", + "value": 2230 + }, + "duration": { + "text": "4 mins", + "value": 219 + }, + "end_location": { + "lat": 48.8192297, + "lng": 2.3292151 + }, + "html_instructions": "Turn right to merge onto Blvd Périphérique", + "maneuver": "ramp-right", + "polyline": { + "points": "se_iHai`MU@VeB@A?A^mCJq@TiBD]Jw@Fs@RsB?ACa@J}@BUPqAJs@VoBFe@@C\\iCNaAJu@Fe@D[PmAHi@Da@DU@GVqBl@mEr@gF\\aCb@eD`@yCb@yCJ{@VgBRwAFe@F]N_ATiAJg@PcAD[Ly@VmBRwAZwBD]Hg@@MRuADUFi@NgANmA@ERuBH_A@MLgA@M@OLy@D_@Jq@Js@?CHo@F_@R{AHm@L}@Hm@Jw@PoAVgBFa@DYR}A?AVeB?CLgAVuBRuAJ{@" + }, + "start_location": { + "lat": 48.8253839, + "lng": 2.3004907 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "5.9 km", + "value": 5935 + }, + "duration": { + "text": "5 mins", + "value": 287 + }, + "end_location": { + "lat": 48.7705456, + "lng": 2.3452899 + }, + "html_instructions": "Keep right at the fork to continue on A6a", + "maneuver": "fork-right", + "polyline": { + "points": "e_~hHs|eMLI@AFa@BGF]@IFa@DQHYJw@Fg@@GBK@M@IFg@LeABYFg@@IDY@M?CHi@BO@I@G@IBIBMDQDMBK@IDMBIBGBGFMDKBGBIDIHODIJQHOLQHOHOPWNWLSLSLSHOBALUDKDGFOFOBGBKJWBKBK@GBI@IFg@L}@H_A@CBY@C?GBIBK@G?A@C@A@C?A@A@A@A@ABCBABCDAJEFCFCDADAFAFAD?B?B?B?B?D?D@D?D@FBH@FBLDh@PVHRFn@TTHTFVHVFTFTFVBVDT@J@P@N?J?L?B?VAFAPAVCTCVGVEDCPETIRIVKRKBCTMVQHGJI@AJIFEDC?ADCHKFIBA@A?A@A@EdBwAnBaBJKNM?AHIHGrAkAJInBeBPOVUVSPQj@e@RQJKFGNMpAiAJIHIROFGROTQPMbAm@~@e@TKZM^O`@Mj@QTGTEVGVE`@G\\E\\ED?RANADAXAx@AxC?dA@l@?T?v@?l@?n@@r@?X?P?T?X?X@VAN?ZATATAPAH?LAPCLCNCTEB?NEr@QBARGRIRI\\MRKFEb@URMRKPMJILKJINKFGDCr@m@HGb@_@f@c@TQTQTQPMVOFELINIl@[TKVKRIXKBAf@Oh@OVE@A^G`@G\\Ep@G^Ah@AL?H?P?N?X@H?L@XBD?`@D`@Dj@JhDh@NBzATH@XDz@N\\Dt@Lf@Dl@DH?J?F@f@?L@^Cb@Ab@C`@EB?ZEh@I\\INCPEJCTG`@ONE~@]PITIlBu@NIz@[f@QlAe@bBo@p@WTIf@ONGf@O`@K`@K\\I@?BAh@KREFATE\\EZEh@If@GTC^CFAb@CLAb@AVCN?H?TAJ?fA?^?P?^@X@f@B^@N@v@Ff@B^B\\BrBL`@BN@n@DVB^BB?|@F|@FL?F@R@F@bAFZ@VBl@D`AFf@DF?d@DJ?x@Df@DF@H?dAFX@B@T@fNz@v@Fn@Df@BJ@N@P@D?RBfAHR@n@FF@z@L" + }, + "start_location": { + "lat": 48.8192297, + "lng": 2.3292151 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "4.4 km", + "value": 4403 + }, + "duration": { + "text": "3 mins", + "value": 193 + }, + "end_location": { + "lat": 48.7348556, + "lng": 2.3655247 + }, + "html_instructions": "Keep right at the fork to continue on A106, follow signs for Aéroport Orly", + "maneuver": "fork-right", + "polyline": { + "points": "}nthHaaiMJX@?HBf@NTFp@X@?`@Pj@V`@Rf@XB@f@VVNXPDBTLTLPJRH\\LVHZH\\Hh@JNBF@P@j@Db@Bl@?@?d@Al@AX?z@AFAJ?d@CNBfEWLCf@GB?TEZGVCREj@Mp@Sn@QTI^Oh@SBAb@Q\\Q\\QVOVMv@e@LKl@c@NKZUf@c@VUPQb@a@DEj@k@hAgAzB{B`B_BjEgE\\]nGkGtAuAPQFGVUPSx@w@hAiAJI\\]JIJK@Ax@w@PSRSt@s@nDmD~B}BXYZYJM|@}@zAyABA^_@VYj@i@`@a@XY\\]ZW~F}FtAsAJKXYJKh@i@TSj@k@FIDCRSBCHITS`@c@FG|@{@v@w@TULKTUXYDCJKNOJKJIZYPONMPOROLKd@[^UDCFEFEBAPKLIZO`@STK\\M^On@Uj@STGbBi@JEPGRGFADCLEh@Q|@Yp@SXKVITGdA]^MXI~@Yz@YNG`@M`@M^Mv@Wl@QDA\\Mx@WVI`@MXKNERG|@YJE|Bu@PEHE@?DA|Bu@lBm@l@O" + }, + "start_location": { + "lat": 48.7705456, + "lng": 2.3452899 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "3.1 km", + "value": 3099 + }, + "duration": { + "text": "5 mins", + "value": 271 + }, + "end_location": { + "lat": 48.7074919, + "lng": 2.3713861 + }, + "html_instructions": "Exit on the left onto N7 toward Évry/Paray-Vieille-Poste/Athis-Mons", + "maneuver": "ramp-left", + "polyline": { + "points": "{omhHo_mMHU@ABCrAe@PIZKvAg@d@S@A`@]l@QbA]`@MXIpBo@\\MVIj@QdA]BAhA]vAe@XKf@OhBk@BAv@SnC{@fBk@RGzBq@vBs@n@Un@Un@Uh@O^MjC{@LEb@O\\INEXI^IHCJCJALCNCLCNAtAMD?FAfHOb@Ab@Ab@AjDIZAZ?vEKvCGbECF?hBGl@CPBRAd@AfAEj@CTAD?zAItCGn@A~@Ch@AD?TC^?~AEnCEfACb@A^?VAZAnAG\\CTARAx@?pAC|@CTAR?z@Cr@A~@Ax@A" + }, + "start_location": { + "lat": 48.7348556, + "lng": 2.3655247 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.4 km", + "value": 391 + }, + "duration": { + "text": "1 min", + "value": 45 + }, + "end_location": { + "lat": 48.7039886, + "lng": 2.3716268 + }, + "html_instructions": "Keep left", + "maneuver": "keep-left", + "polyline": { + "points": "ydhhHednMJGTAbAAlAC~AEl@Al@CxBED?NAZAF?NAtAEd@CJ@" + }, + "start_location": { + "lat": 48.7074919, + "lng": 2.3713861 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "1.7 km", + "value": 1674 + }, + "duration": { + "text": "4 mins", + "value": 258 + }, + "end_location": { + "lat": 48.6890215, + "lng": 2.3710222 + }, + "html_instructions": "Merge onto Av. François Mitterrand/N7
Continue to follow N7
", + "maneuver": "merge", + "polyline": { + "points": "}nghHuenMh@Av@?TARAvBEjBEp@AzAEx@?VAb@AdAEv@AjACh@?^?p@?f@Ax@AbAAJ?RBTBn@J~C^lANz@FbAJr@H|ARp@HB@xBXjAN^D`@FH@`BPx@LxCZp@Db@@F?Z@R@zB@\\ATAx@Ij@K\\G\\GHAh@Kf@MXKVI" + }, + "start_location": { + "lat": 48.7039886, + "lng": 2.3716268 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.8 km", + "value": 829 + }, + "duration": { + "text": "2 mins", + "value": 116 + }, + "end_location": { + "lat": 48.6828291, + "lng": 2.3771681 + }, + "html_instructions": "Keep left to continue on Av. de la Cr de France/N7
Continue to follow N7
", + "maneuver": "keep-left", + "polyline": { + "points": "kqdhH{anMxAm@LG@?\\Sd@UzA{@VOf@c@fAeAjAmAf@g@PSNQp@y@Z_@\\_@`@c@TWj@u@^g@h@q@@?RWd@k@TWl@u@h@q@Za@jAyA`AiAp@y@LQ" + }, + "start_location": { + "lat": 48.6890215, + "lng": 2.3710222 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.4 km", + "value": 413 + }, + "duration": { + "text": "1 min", + "value": 34 + }, + "end_location": { + "lat": 48.6799071, + "lng": 2.3806212 + }, + "html_instructions": "Keep left", + "maneuver": "keep-left", + "polyline": { + "points": "ujchHihoMLWn@y@FIHI\\c@Za@f@m@jAwAZa@Za@rAcBt@_ARUTYf@m@b@i@BELI" + }, + "start_location": { + "lat": 48.6828291, + "lng": 2.3771681 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.2 km", + "value": 193 + }, + "duration": { + "text": "1 min", + "value": 34 + }, + "end_location": { + "lat": 48.6785366, + "lng": 2.3822313 + }, + "html_instructions": "Merge onto Av. du Général de Gaulle/N7", + "maneuver": "merge", + "polyline": { + "points": "mxbhH{}oMzD{ELOfAuA" + }, + "start_location": { + "lat": 48.6799071, + "lng": 2.3806212 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.5 km", + "value": 476 + }, + "duration": { + "text": "2 mins", + "value": 108 + }, + "end_location": { + "lat": 48.68178, + "lng": 2.385035 + }, + "html_instructions": "Turn left onto Rue Carnot", + "maneuver": "turn-left", + "polyline": { + "points": "{obhH}gpMKSQYS[IQCQ?SAOAu@?SAI?CAEEIIYACAACCA?A?A?A?C@EBIFIHURA@C?A?A?AACCQWQQY[IIGEMGGCSKuAi@[MgAc@m@U]KQCQCWCC?GAGAAAAAA??AAACMAE?C?C?E@G?K" + }, + "start_location": { + "lat": 48.6785366, + "lng": 2.3822313 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.3 km", + "value": 305 + }, + "duration": { + "text": "1 min", + "value": 30 + }, + "end_location": { + "lat": 48.67910939999999, + "lng": 2.3859466 + }, + "html_instructions": "Turn right onto Quai de Châtillon/D931
Destination will be on the left
", + "maneuver": "turn-right", + "polyline": { + "points": "cdchHmypMXGr@IBAbBY~A[bAYNERGx@YrAe@HE" + }, + "start_location": { + "lat": 48.68178, + "lng": 2.385035 + }, + "travel_mode": "DRIVING" + } +] \ No newline at end of file diff --git a/WebControl/main.py b/WebControl/main.py index b2ff45e..2e73320 100644 --- a/WebControl/main.py +++ b/WebControl/main.py @@ -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('{{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 # 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('/') +@route('/') def server_static(filename): return static_file(filename, root='./') -@route('/templates/') +@route('/templates/') def server_templates(filename): return static_file(filename, root='./templates/') -@route('/images/') +@route('/images/') def server_images(filename): return static_file(filename, root='./images/') -@route('/fonts/') +@route('/fonts/') def server_fonts(filename): return static_file(filename, root='./fonts/') -@route('/js/') +@route('/js/') def server_js(filename): return static_file(filename, root='./js/') -@route('/css/') +@route('/css/') def server_css(filename): return static_file(filename, root='./css/') -@route('/modules/') +@route('/modules/') def server_modules(filename): return static_file(filename, root='./modules/') -@route('/apps/') +@route('/apps/') def server_apps(filename): return static_file(filename, root='./apps/') -@route('/tests/') +@route('/tests/') 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) diff --git a/WebControl/modules/AlphaBot.py b/WebControl/modules/AlphaBot.py index 8c54932..541352f 100644 --- a/WebControl/modules/AlphaBot.py +++ b/WebControl/modules/AlphaBot.py @@ -1,21 +1,30 @@ +import time,json, os, serial, threading, queue import RPi.GPIO as GPIO -import time -import os +from datetime import datetime class AlphaBot(object): - def __init__(self, in1=12, in2=13, ena=6, in3=20, in4=21, enb=26): - self.IN1 = in1 - self.IN2 = in2 - self.IN3 = in3 - self.IN4 = in4 - self.ENA = ena - self.ENB = enb - # Définition des broches module d'évitement d'obstacles - DAOUT_PIN = 19 - AOUT_PIN = 16 + def __init__(self): + self.LIDAR_MODULE = serial.Serial('/dev/ttyAMA0', 115200, timeout=1) # SERIAL + self.LIDAR_MODULE.write(b'\x42\x57\x02\x00\x00\x00\x01\x06') + self.RED_LIGHT = 17 + self.OBSTACLE_PIN = 16 + self.SERVO_PIN = 27 + self.IN1 = 12 + self.IN2 = 13 + self.ENA = 6 + self.IN3 = 20 + self.IN4 = 21 + self.ENB = 26 + speed = 30 + self.stop_event_obstacle = threading.Event() + self.stop_event_vitesse = threading.Event() + self.vitesse_queue = queue.Queue() GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) + GPIO.setup(self.OBSTACLE_PIN, GPIO.IN, GPIO.PUD_UP) + GPIO.setup(self.SERVO_PIN, GPIO.OUT) + GPIO.setup(self.RED_LIGHT, GPIO.OUT) GPIO.setup(self.IN1, GPIO.OUT) GPIO.setup(self.IN2, GPIO.OUT) GPIO.setup(self.IN3, GPIO.OUT) @@ -24,52 +33,267 @@ class AlphaBot(object): GPIO.setup(self.ENB, GPIO.OUT) self.PWMA = GPIO.PWM(self.ENA, 500) # Utilisation d'une fréquence de 500 Hz pour le PWM self.PWMB = GPIO.PWM(self.ENB, 500) + self.PWMSERVO = GPIO.PWM(self.SERVO_PIN, 50) # Utilisation d'une fréquence de 50 Hz pour le servo self.PWMA.start(0) # Démarre avec un rapport cyclique de 0 (moteurs arrêtés) self.PWMB.start(0) + self.PWMSERVO.start(0) + GPIO.output(self.RED_LIGHT, GPIO.HIGH) - def stop(self): + + def ajuster_vitesse_selon_distance(self, distance, vitesse_max=70, vitesse_min=20): + if distance < 20: # Distance critique, arrêt + vitesse = 0 + elif distance < 50: # Très proche, ralentir + vitesse = vitesse_min + else: # Vitesse normale + vitesse = vitesse_max * (distance / 100) + vitesse = max(vitesse_min, min(vitesse, vitesse_max)) + return vitesse + + def set_angle(self, angle): + if 0 <= angle <= 180: + pulse_width_ms = (angle / 180) * (2 - 1) + 1 + duty_cycle = (pulse_width_ms / 20) * 100 + self.PWMSERVO.ChangeDutyCycle(duty_cycle) + # Calcul du temps nécessaire pour atteindre l'angle donné + movement_time = (angle / 60) * 0.15 # 0.12 sec pour 60 degrés + time.sleep(movement_time) + else: + print("Angle hors de portée. Le rapport cyclique doit être compris entre 2,5 et 12,5.") + + def blink_led(self, blink_duration=0.2): + self.blinking = True + while self.blinking: # Continue tant que blinking est True + GPIO.output(self.RED_LIGHT, GPIO.HIGH) + time.sleep(blink_duration) + GPIO.output(self.RED_LIGHT, GPIO.LOW) + time.sleep(blink_duration) + GPIO.output(self.RED_LIGHT, GPIO.LOW) + + # Fonction pour les manœuvres non spécifiées + def maneuver_unspecified(self, duration): + GPIO.output(self.RED_LIGHT, GPIO.HIGH) + print("Manoeuvre non spécifiée") + time.sleep(duration) + + def stop(self, duration): + GPIO.output(self.RED_LIGHT, GPIO.HIGH) GPIO.output(self.IN1, GPIO.LOW) GPIO.output(self.IN2, GPIO.LOW) GPIO.output(self.IN3, GPIO.LOW) GPIO.output(self.IN4, GPIO.LOW) self.PWMA.ChangeDutyCycle(0) self.PWMB.ChangeDutyCycle(0) - print("Le robot est arreté") - - def forward(self, speed): - GPIO.output(self.IN1, GPIO.HIGH) + print(f"Arrêt durant {duration} secondes") + time.sleep(duration) + GPIO.output(self.RED_LIGHT, GPIO.LOW) + + def emergencystop(self): + # Lancer le clignotement dans un thread séparé + blink_thread = threading.Thread(target=self.blink_led) + blink_thread.start() + GPIO.output(self.IN1, GPIO.LOW) GPIO.output(self.IN2, GPIO.LOW) + GPIO.output(self.IN3, GPIO.LOW) + GPIO.output(self.IN4, GPIO.LOW) + self.PWMA.ChangeDutyCycle(0) + self.PWMB.ChangeDutyCycle(0) + print("Arrêt d'urgence !") + time.sleep(0.1) + # Stopper le clignotement de la LED + self.blinking = False + blink_thread.join() # Attendre que le thread de clignotement se termine + + +# FORWARD MOVE + def forward(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.LOW) + GPIO.output(self.IN2, GPIO.HIGH) GPIO.output(self.IN3, GPIO.HIGH) GPIO.output(self.IN4, GPIO.LOW) self.PWMA.ChangeDutyCycle(speed) self.PWMB.ChangeDutyCycle(speed) + print(f"Avancer durant {duration} secondes à une vitesse de", speed) + time.sleep(duration) - print("Le robot avance avec une vitesse de", speed) + def ramp_left(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.LOW) + GPIO.output(self.IN2, GPIO.HIGH) + GPIO.output(self.IN3, GPIO.HIGH) + GPIO.output(self.IN4, GPIO.LOW) + self.PWMA.ChangeDutyCycle(speed) + self.PWMB.ChangeDutyCycle(speed * 1.5) + print(f"Traitement pour prendre la rampe de gauche durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration) + + def fork_left(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.LOW) + GPIO.output(self.IN2, GPIO.HIGH) + GPIO.output(self.IN3, GPIO.HIGH) + GPIO.output(self.IN4, GPIO.LOW) + self.PWMA.ChangeDutyCycle(speed) + self.PWMB.ChangeDutyCycle(speed * 1.1) + print(f"Traitement pour prendre la fourche de gauche durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration) + + def ramp_right(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.LOW) + GPIO.output(self.IN2, GPIO.HIGH) + GPIO.output(self.IN3, GPIO.HIGH) + GPIO.output(self.IN4, GPIO.LOW) + self.PWMA.ChangeDutyCycle(speed * 1.5) + self.PWMB.ChangeDutyCycle(speed) + print(f"Traitement pour prendre la rampe de droite durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration) - def backward(self, speed): + def fork_right(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.LOW) + GPIO.output(self.IN2, GPIO.HIGH) + GPIO.output(self.IN3, GPIO.HIGH) + GPIO.output(self.IN4, GPIO.LOW) + self.PWMA.ChangeDutyCycle(speed) + self.PWMB.ChangeDutyCycle(speed * 1.1) + print(f"Traitement pour prendre la fourche de droite durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration) + + def merge(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.LOW) + GPIO.output(self.IN2, GPIO.HIGH) + GPIO.output(self.IN3, GPIO.HIGH) + GPIO.output(self.IN4, GPIO.LOW) + self.PWMA.ChangeDutyCycle(speed * 0.8) + self.PWMB.ChangeDutyCycle(speed * 0.8) + print(f"Traitement pour fusionner dans le trafic durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration) +# BACKWARD MOVE + def backward(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.HIGH) + GPIO.output(self.IN2, GPIO.LOW) + GPIO.output(self.IN3, GPIO.LOW) + GPIO.output(self.IN4, GPIO.HIGH) + self.PWMA.ChangeDutyCycle(speed) + self.PWMB.ChangeDutyCycle(speed) + print(f"Reculer durant {duration} secondes à une vitesse de", speed) + time.sleep(duration) + +# LEFT MOVE + def left(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) GPIO.output(self.IN1, GPIO.LOW) GPIO.output(self.IN2, GPIO.HIGH) GPIO.output(self.IN3, GPIO.LOW) GPIO.output(self.IN4, GPIO.HIGH) self.PWMA.ChangeDutyCycle(speed) self.PWMB.ChangeDutyCycle(speed) - print("Le robot recul avec une vitesse de", speed) - - def left(self, speed): - GPIO.output(self.IN1, GPIO.HIGH) - GPIO.output(self.IN2, GPIO.LOW) - GPIO.output(self.IN3, GPIO.LOW) - GPIO.output(self.IN4, GPIO.LOW) - self.PWMA.ChangeDutyCycle(speed) - print("Le robot tourne à guauche avec une vitesse de", speed) - - def right(self, speed): + print(f"Tourner à guauche durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration) + + def turn_slight_left(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) GPIO.output(self.IN1, GPIO.LOW) + GPIO.output(self.IN2, GPIO.HIGH) + GPIO.output(self.IN3, GPIO.LOW) + GPIO.output(self.IN4, GPIO.HIGH) + self.PWMA.ChangeDutyCycle(speed) + self.PWMB.ChangeDutyCycle(speed * 0.1) + print(f"Traitement pour tourner légèrement à gauche durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration) + + def turn_sharp_left(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.LOW) + GPIO.output(self.IN2, GPIO.HIGH) + GPIO.output(self.IN3, GPIO.LOW) + GPIO.output(self.IN4, GPIO.HIGH) + self.PWMA.ChangeDutyCycle(speed) + self.PWMB.ChangeDutyCycle(speed * 1) + print(f"Traitement pour tourner brusquement à gauche durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration) + + def u_turn_left(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.LOW) + GPIO.output(self.IN2, GPIO.HIGH) + GPIO.output(self.IN3, GPIO.LOW) + GPIO.output(self.IN4, GPIO.HIGH) + self.PWMA.ChangeDutyCycle(speed) + self.PWMB.ChangeDutyCycle(speed) + print(f"Traitement pour faire demi-tour à gauche durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration * 2) + + def roundabout_left(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.LOW) + GPIO.output(self.IN2, GPIO.HIGH) + GPIO.output(self.IN3, GPIO.LOW) + GPIO.output(self.IN4, GPIO.HIGH) + self.PWMA.ChangeDutyCycle(speed) + self.PWMB.ChangeDutyCycle(speed * 0.5) + print(f"Traitement pour tourner à gauche au rond-point durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration) + +# RIGHT MOVE + def right(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.HIGH) GPIO.output(self.IN2, GPIO.LOW) GPIO.output(self.IN3, GPIO.HIGH) GPIO.output(self.IN4, GPIO.LOW) + self.PWMA.ChangeDutyCycle(speed) self.PWMB.ChangeDutyCycle(speed) - print("Le robot tourne à droite avec une vitesse de", speed) + print(f"Tourner à droite durant {duration} secondes à une vitesse de", speed) + time.sleep(duration) + + def turn_slight_right(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.HIGH) + GPIO.output(self.IN2, GPIO.LOW) + GPIO.output(self.IN3, GPIO.HIGH) + GPIO.output(self.IN4, GPIO.LOW) + self.PWMA.ChangeDutyCycle(speed * 0.1) + self.PWMB.ChangeDutyCycle(speed) + print(f"Traitement pour tourner légèrement à droite durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration) + + def turn_sharp_right(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.HIGH) + GPIO.output(self.IN2, GPIO.LOW) + GPIO.output(self.IN3, GPIO.HIGH) + GPIO.output(self.IN4, GPIO.LOW) + self.PWMA.ChangeDutyCycle(speed) + self.PWMB.ChangeDutyCycle(speed * 1) + print(f"Traitement pour tourner brusquement à droite durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration) + + def u_turn_right(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.HIGH) + GPIO.output(self.IN2, GPIO.LOW) + GPIO.output(self.IN3, GPIO.HIGH) + GPIO.output(self.IN4, GPIO.LOW) + self.PWMA.ChangeDutyCycle(speed) + self.PWMB.ChangeDutyCycle(speed) + print(f"Traitement pour faire demi-tour à droite durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration * 2) + + def roundabout_right(self, duration, speed): + GPIO.output(self.RED_LIGHT, GPIO.LOW) + GPIO.output(self.IN1, GPIO.HIGH) + GPIO.output(self.IN2, GPIO.LOW) + GPIO.output(self.IN3, GPIO.HIGH) + GPIO.output(self.IN4, GPIO.LOW) + self.PWMA.ChangeDutyCycle(speed * 0.5) + self.PWMB.ChangeDutyCycle(speed) + print(f"Traitement pour tourner à droite au rond-point durant {duration} secondes à une vitesse de", speed,"MPH") + time.sleep(duration) def setPWMA(self, value): """ @@ -94,26 +318,75 @@ class AlphaBot(object): self.PWMA.ChangeDutyCycle(left) self.PWMB.ChangeDutyCycle(right) - def objetrack_ir(self): - os.system('sudo python3 ~/AppControl/Infrared_Tracking_Objects.py') +# Fonction pour surveiller les obstacle en arrière-plan + def monitor_obstacle(self): + global emergency_stop + while not self.stop_event_obstacle.is_set(): + DR_status = GPIO.input(self.OBSTACLE_PIN) + if DR_status == 0: # Obstacle détecté + self.emergencystop() + emergency_stop = True + while GPIO.input(self.OBSTACLE_PIN) == 0: # Attendre que l'obstacle soit dégagé + time.sleep(0.1) + print("Obstacle dégagé. Attente de 5 secondes avant de reprendre.") + emergency_stop = False + time.sleep(0.05) # Pause légère pour éviter la surcharge du CPU - def linetrack_ir(self): - os.system('sudo python3 ~/AppControl/Infrared_Line_Tracking.py') + def monitor_vitesse(self): + try: + while not self.stop_event_vitesse.is_set(): + if self.LIDAR_MODULE.in_waiting >= 9: + if b'Y' == self.LIDAR_MODULE.read() and b'Y' == self.LIDAR_MODULE.read(): + Dist_L = self.LIDAR_MODULE.read() + Dist_H = self.LIDAR_MODULE.read() + Dist_Total = (Dist_H[0] * 256) + Dist_L[0] + for i in range(0, 5): + self.LIDAR_MODULE.read() # Lecture et ignore des octets supplémentaires + print("Distance à l'avant du véhicule:", Dist_Total, "cm") + # Définir les paramètres de vitesse + vitesse_max = 50 # Vitesse maximale en unités (à ajuster) + distance_min = 10 # Distance minimale pour une vitesse de 0 (en cm) + # Ajuster la vitesse en fonction de la distance mesurée + if Dist_Total <= distance_min: + vitesse_ajustee = 0 # Arrêter si trop proche + elif Dist_Total > 100: # Distance maximale où la vitesse est maximale + vitesse_ajustee = vitesse_max + else: + # Calculer la vitesse en fonction de la distance + vitesse_ajustee = int(vitesse_max * (Dist_Total - distance_min) / (100 - distance_min)) + # Mettre la vitesse ajustée dans la queue + self.vitesse_queue.put(vitesse_ajustee) + except Exception as e: + print(f"Erreur lors de la mesure de la vitesse: {e}") + # En cas d'erreur, vous pouvez décider de placer une valeur par défaut dans la queue + self.vitesse_queue.put(None) - def objetavoid_ir(self): - os.system('sudo python3 ~/AppControl/Infrared_Obstacle_Avoidance.py') + def cleanup(self): + GPIO.cleanup() + print("Nettoyage des GPIO effectué.") - def obstacleavoid_ultrason(self): - os.system('sudo python3 ~/AppControl/Ultrasonic_Obstacle_Avoidance.py') - - def move_ultrason(self): - os.system('sudo python3 ~/AppControl/Ultrasonic_Ranging.py') - - def control_ir(self): - os.system('sudo python3 ~/AppControl/Infrared_Remote_Control.py') - - def face_ia(self): - os.system('sudo python3 ~/AppControl/visage_camera_raspberry.py') - - def line_ia(self): - os.system('sudo python3 ~/AppControl/visage_camera_v2_raspberry.py') \ No newline at end of file + def enregistrer_resultats(self, nom_script, fonctionnement_ok, status): + # Préparer les données à enregistrer + nouveau_resultat = { + 'date': datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + 'nom': nom_script, + 'fonctionnement_ok': fonctionnement_ok, + 'status': status + } + # Chemin vers le fichier de logs + fichier_logs = './logs/resultats_tests.json' + # Charger les données existantes si le fichier existe + if os.path.exists(fichier_logs): + with open(fichier_logs, 'r') as f: + try: + resultats = json.load(f) + except json.JSONDecodeError: + resultats = [] + else: + resultats = [] + # Ajouter le nouveau résultat + resultats.append(nouveau_resultat) + # Enregistrer les résultats mis à jour dans le fichier JSON + with open(fichier_logs, 'w') as f: + json.dump(resultats, f, indent=4) + print("Résultats enregistrés avec succès.") \ No newline at end of file diff --git a/WebControl/modules/MFRC522-python.zip b/WebControl/modules/MFRC522-python.zip deleted file mode 100644 index 177364d..0000000 Binary files a/WebControl/modules/MFRC522-python.zip and /dev/null differ diff --git a/WebControl/modules/SimpleMFRC522.py b/WebControl/modules/SimpleMFRC522.py new file mode 100644 index 0000000..06a3d9a --- /dev/null +++ b/WebControl/modules/SimpleMFRC522.py @@ -0,0 +1,89 @@ +# Code by Simon Monk https://github.com/simonmonk/ + +from joyit_mfrc522 import MFRC522 + +class SimpleMFRC522: + + READER = None + + KEY = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF] + BLOCK_ADDRS = [8, 9, 10] + + def __init__(self): + self.READER = MFRC522() + + def read(self): + id, text = self.read_no_block() + while not id: + id, text = self.read_no_block() + return id, text + + def read_id(self): + id = self.read_id_no_block() + while not id: + id = self.read_id_no_block() + return id + + def read_id_no_block(self): + (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL) + if status != self.READER.MI_OK: + return None + (status, uid) = self.READER.MFRC522_Anticoll() + if status != self.READER.MI_OK: + return None + return self.uid_to_num(uid) + + def read_no_block(self): + (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL) + if status != self.READER.MI_OK: + return None, None + (status, uid) = self.READER.MFRC522_Anticoll() + if status != self.READER.MI_OK: + return None, None + id = self.uid_to_num(uid) + self.READER.MFRC522_SelectTag(uid) + status = self.READER.MFRC522_Auth(self.READER.PICC_AUTHENT1A, 11, self.KEY, uid) + data = [] + text_read = '' + if status == self.READER.MI_OK: + for block_num in self.BLOCK_ADDRS: + block = self.READER.MFRC522_Read(block_num) + if block: + data += block + if data: + text_read = ''.join(chr(i) for i in data) + self.READER.MFRC522_StopCrypto1() + return id, text_read + + def write(self, text): + id, text_in = self.write_no_block(text) + while not id: + id, text_in = self.write_no_block(text) + return id, text_in + + def write_no_block(self, text): + (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL) + if status != self.READER.MI_OK: + return None, None + (status, uid) = self.READER.MFRC522_Anticoll() + if status != self.READER.MI_OK: + return None, None + id = self.uid_to_num(uid) + self.READER.MFRC522_SelectTag(uid) + status = self.READER.MFRC522_Auth(self.READER.PICC_AUTHENT1A, 11, self.KEY, uid) + self.READER.MFRC522_Read(11) + if status == self.READER.MI_OK: + data = bytearray() + data.extend(bytearray(text.ljust(len(self.BLOCK_ADDRS) * 16).encode('ascii'))) + i = 0 + for block_num in self.BLOCK_ADDRS: + self.READER.MFRC522_Write(block_num, data[(i*16):(i+1)*16]) + i += 1 + self.READER.MFRC522_StopCrypto1() + return id, text[0:(len(self.BLOCK_ADDRS) * 16)] + + def uid_to_num(self, uid): + n = 0 + for i in range(0, 5): + n = n * 256 + uid[i] + return n diff --git a/WebControl/modules/__pycache__/AlphaBot.cpython-39.pyc b/WebControl/modules/__pycache__/AlphaBot.cpython-39.pyc new file mode 100644 index 0000000..5d5e0f2 Binary files /dev/null and b/WebControl/modules/__pycache__/AlphaBot.cpython-39.pyc differ diff --git a/WebControl/modules/__pycache__/__init__.cpython-39.pyc b/WebControl/modules/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000..b810329 Binary files /dev/null and b/WebControl/modules/__pycache__/__init__.cpython-39.pyc differ diff --git a/WebControl/modules/joyit_mfrc522/MFRC522.py b/WebControl/modules/joyit_mfrc522/MFRC522.py new file mode 100644 index 0000000..7c55fe3 --- /dev/null +++ b/WebControl/modules/joyit_mfrc522/MFRC522.py @@ -0,0 +1,413 @@ +#!/usr/bin/env python3 +# -*- coding: utf8 -*- +# +# Copyright 2014,2018 Mario Gomez +# +# This file is part of MFRC522-Python +# MFRC522-Python is a simple Python implementation for +# the MFRC522 NFC Card Reader for the Raspberry Pi. +# +# MFRC522-Python is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# MFRC522-Python is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with MFRC522-Python. If not, see . +# +from gpiozero import DigitalOutputDevice +import spidev +import signal +import time +import logging + +class MFRC522: + MAX_LEN = 16 + + PCD_IDLE = 0x00 + PCD_AUTHENT = 0x0E + PCD_RECEIVE = 0x08 + PCD_TRANSMIT = 0x04 + PCD_TRANSCEIVE = 0x0C + PCD_RESETPHASE = 0x0F + PCD_CALCCRC = 0x03 + + PICC_REQIDL = 0x26 + PICC_REQALL = 0x52 + PICC_ANTICOLL = 0x93 + PICC_SElECTTAG = 0x93 + PICC_AUTHENT1A = 0x60 + PICC_AUTHENT1B = 0x61 + PICC_READ = 0x30 + PICC_WRITE = 0xA0 + PICC_DECREMENT = 0xC0 + PICC_INCREMENT = 0xC1 + PICC_RESTORE = 0xC2 + PICC_TRANSFER = 0xB0 + PICC_HALT = 0x50 + + MI_OK = 0 + MI_NOTAGERR = 1 + MI_ERR = 2 + + Reserved00 = 0x00 + CommandReg = 0x01 + CommIEnReg = 0x02 + DivlEnReg = 0x03 + CommIrqReg = 0x04 + DivIrqReg = 0x05 + ErrorReg = 0x06 + Status1Reg = 0x07 + Status2Reg = 0x08 + FIFODataReg = 0x09 + FIFOLevelReg = 0x0A + WaterLevelReg = 0x0B + ControlReg = 0x0C + BitFramingReg = 0x0D + CollReg = 0x0E + Reserved01 = 0x0F + + Reserved10 = 0x10 + ModeReg = 0x11 + TxModeReg = 0x12 + RxModeReg = 0x13 + TxControlReg = 0x14 + TxAutoReg = 0x15 + TxSelReg = 0x16 + RxSelReg = 0x17 + RxThresholdReg = 0x18 + DemodReg = 0x19 + Reserved11 = 0x1A + Reserved12 = 0x1B + MifareReg = 0x1C + Reserved13 = 0x1D + Reserved14 = 0x1E + SerialSpeedReg = 0x1F + + Reserved20 = 0x20 + CRCResultRegM = 0x21 + CRCResultRegL = 0x22 + Reserved21 = 0x23 + ModWidthReg = 0x24 + Reserved22 = 0x25 + RFCfgReg = 0x26 + GsNReg = 0x27 + CWGsPReg = 0x28 + ModGsPReg = 0x29 + TModeReg = 0x2A + TPrescalerReg = 0x2B + TReloadRegH = 0x2C + TReloadRegL = 0x2D + TCounterValueRegH = 0x2E + TCounterValueRegL = 0x2F + + Reserved30 = 0x30 + TestSel1Reg = 0x31 + TestSel2Reg = 0x32 + TestPinEnReg = 0x33 + TestPinValueReg = 0x34 + TestBusReg = 0x35 + AutoTestReg = 0x36 + VersionReg = 0x37 + AnalogTestReg = 0x38 + TestDAC1Reg = 0x39 + TestDAC2Reg = 0x3A + TestADCReg = 0x3B + Reserved31 = 0x3C + Reserved32 = 0x3D + Reserved33 = 0x3E + Reserved34 = 0x3F + + serNum = [] + + def __init__(self, bus=0, device=0, spd=1000000, pin_mode=10, pin_rst=-1, debugLevel='WARNING'): + self.spi = spidev.SpiDev() + self.spi.open(bus, device) + self.spi.max_speed_hz = spd + + self.logger = logging.getLogger('mfrc522Logger') + self.logger.addHandler(logging.StreamHandler()) + level = logging.getLevelName(debugLevel) + self.logger.setLevel(level) + + if pin_rst == -1: + pin_rst = 15 + + self._RST = DigitalOutputDevice(pin_rst, initial_value=True) + self.MFRC522_Init() + + def MFRC522_Reset(self): + self.Write_MFRC522(self.CommandReg, self.PCD_RESETPHASE) + + def Write_MFRC522(self, addr, val): + val = self.spi.xfer2([(addr << 1) & 0x7E, val]) + + def Read_MFRC522(self, addr): + val = self.spi.xfer2([((addr << 1) & 0x7E) | 0x80, 0]) + return val[1] + + def Close_MFRC522(self): + self.spi.close() + + def SetBitMask(self, reg, mask): + tmp = self.Read_MFRC522(reg) + self.Write_MFRC522(reg, tmp | mask) + + def ClearBitMask(self, reg, mask): + tmp = self.Read_MFRC522(reg) + self.Write_MFRC522(reg, tmp & (~mask)) + + def AntennaOn(self): + temp = self.Read_MFRC522(self.TxControlReg) + if (~(temp & 0x03)): + self.SetBitMask(self.TxControlReg, 0x03) + + def AntennaOff(self): + self.ClearBitMask(self.TxControlReg, 0x03) + + def MFRC522_ToCard(self, command, sendData): + backData = [] + backLen = 0 + status = self.MI_ERR + irqEn = 0x00 + waitIRq = 0x00 + lastBits = None + n = 0 + + if command == self.PCD_AUTHENT: + irqEn = 0x12 + waitIRq = 0x10 + if command == self.PCD_TRANSCEIVE: + irqEn = 0x77 + waitIRq = 0x30 + + self.Write_MFRC522(self.CommIEnReg, irqEn | 0x80) + self.ClearBitMask(self.CommIrqReg, 0x80) + self.SetBitMask(self.FIFOLevelReg, 0x80) + + self.Write_MFRC522(self.CommandReg, self.PCD_IDLE) + + for i in range(len(sendData)): + self.Write_MFRC522(self.FIFODataReg, sendData[i]) + + self.Write_MFRC522(self.CommandReg, command) + + if command == self.PCD_TRANSCEIVE: + self.SetBitMask(self.BitFramingReg, 0x80) + + i = 2000 + while True: + n = self.Read_MFRC522(self.CommIrqReg) + i -= 1 + if ~((i != 0) and ~(n & 0x01) and ~(n & waitIRq)): + break + + self.ClearBitMask(self.BitFramingReg, 0x80) + + if i != 0: + if (self.Read_MFRC522(self.ErrorReg) & 0x1B) == 0x00: + status = self.MI_OK + + if n & irqEn & 0x01: + status = self.MI_NOTAGERR + + if command == self.PCD_TRANSCEIVE: + n = self.Read_MFRC522(self.FIFOLevelReg) + lastBits = self.Read_MFRC522(self.ControlReg) & 0x07 + if lastBits != 0: + backLen = (n - 1) * 8 + lastBits + else: + backLen = n * 8 + + if n == 0: + n = 1 + if n > self.MAX_LEN: + n = self.MAX_LEN + + for i in range(n): + backData.append(self.Read_MFRC522(self.FIFODataReg)) + else: + status = self.MI_ERR + + return (status, backData, backLen) + + def MFRC522_Request(self, reqMode): + status = None + backBits = None + TagType = [] + + self.Write_MFRC522(self.BitFramingReg, 0x07) + + TagType.append(reqMode) + (status, backData, backBits) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, TagType) + + if ((status != self.MI_OK) | (backBits != 0x10)): + status = self.MI_ERR + + return (status, backBits) + + def MFRC522_Anticoll(self): + backData = [] + serNumCheck = 0 + + serNum = [] + + self.Write_MFRC522(self.BitFramingReg, 0x00) + + serNum.append(self.PICC_ANTICOLL) + serNum.append(0x20) + + (status, backData, backBits) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, serNum) + + if (status == self.MI_OK): + i = 0 + if len(backData) == 5: + for i in range(4): + serNumCheck = serNumCheck ^ backData[i] + if serNumCheck != backData[4]: + status = self.MI_ERR + else: + status = self.MI_ERR + + return (status, backData) + + def CalulateCRC(self, pIndata): + self.ClearBitMask(self.DivIrqReg, 0x04) + self.SetBitMask(self.FIFOLevelReg, 0x80) + + for i in range(len(pIndata)): + self.Write_MFRC522(self.FIFODataReg, pIndata[i]) + + self.Write_MFRC522(self.CommandReg, self.PCD_CALCCRC) + i = 0xFF + while True: + n = self.Read_MFRC522(self.DivIrqReg) + i -= 1 + if not ((i != 0) and not (n & 0x04)): + break + pOutData = [] + pOutData.append(self.Read_MFRC522(self.CRCResultRegL)) + pOutData.append(self.Read_MFRC522(self.CRCResultRegM)) + return pOutData + + def MFRC522_SelectTag(self, serNum): + backData = [] + buf = [] + buf.append(self.PICC_SElECTTAG) + buf.append(0x70) + + for i in range(5): + buf.append(serNum[i]) + + pOut = self.CalulateCRC(buf) + buf.append(pOut[0]) + buf.append(pOut[1]) + (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) + + if (status == self.MI_OK) and (backLen == 0x18): + self.logger.debug("Size: " + str(backData[0])) + return backData[0] + else: + return 0 + + def MFRC522_Auth(self, authMode, BlockAddr, Sectorkey, serNum): + buff = [] + + # First byte should be the authMode (A or B) + buff.append(authMode) + + # Second byte is the trailerBlock (usually 7) + buff.append(BlockAddr) + + # Now we need to append the authKey which usually is 6 bytes of 0xFF + for i in range(len(Sectorkey)): + buff.append(Sectorkey[i]) + + # Next we append the first 4 bytes of the UID + for i in range(4): + buff.append(serNum[i]) + + # Now we start the authentication itself + (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_AUTHENT, buff) + + # Check if an error occurred + if not (status == self.MI_OK): + self.logger.error("AUTH ERROR!!") + if not (self.Read_MFRC522(self.Status2Reg) & 0x08) != 0: + self.logger.error("AUTH ERROR(status2reg & 0x08) != 0") + + # Return the status + return status + + def MFRC522_StopCrypto1(self): + self.ClearBitMask(self.Status2Reg, 0x08) + + def MFRC522_Read(self, blockAddr): + recvData = [] + recvData.append(self.PICC_READ) + recvData.append(blockAddr) + pOut = self.CalulateCRC(recvData) + recvData.append(pOut[0]) + recvData.append(pOut[1]) + (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, recvData) + if not (status == self.MI_OK): + self.logger.error("Error while reading!") + + if len(backData) == 16: + self.logger.debug("Sector " + str(blockAddr) + " " + str(backData)) + return backData + else: + return None + + def MFRC522_Write(self, blockAddr, writeData): + buff = [] + buff.append(self.PICC_WRITE) + buff.append(blockAddr) + crc = self.CalulateCRC(buff) + buff.append(crc[0]) + buff.append(crc[1]) + (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buff) + if not (status == self.MI_OK) or not (backLen == 4) or not ((backData[0] & 0x0F) == 0x0A): + status = self.MI_ERR + + self.logger.debug("%s backdata &0x0F == 0x0A %s" % (backLen, backData[0] & 0x0F)) + if status == self.MI_OK: + buf = [] + for i in range(16): + buf.append(writeData[i]) + + crc = self.CalulateCRC(buf) + buf.append(crc[0]) + buf.append(crc[1]) + (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) + if not (status == self.MI_OK) or not (backLen == 4) or not ((backData[0] & 0x0F) == 0x0A): + self.logger.error("Error while writing") + if status == self.MI_OK: + self.logger.debug("Data written") + + + def MFRC522_DumpClassic1K(self, key, uid): + for i in range(64): + status = self.MFRC522_Auth(self.PICC_AUTHENT1A, i, key, uid) + # Check if authenticated + if status == self.MI_OK: + self.MFRC522_Read(i) + else: + self.logger.error("Authentication error") + + def MFRC522_Init(self): + self.MFRC522_Reset() + + self.Write_MFRC522(self.TModeReg, 0x8D) + self.Write_MFRC522(self.TPrescalerReg, 0x3E) + self.Write_MFRC522(self.TReloadRegL, 30) + self.Write_MFRC522(self.TReloadRegH, 0) + + self.Write_MFRC522(self.TxAutoReg, 0x40) + self.Write_MFRC522(self.ModeReg, 0x3D) + self.AntennaOn() diff --git a/WebControl/modules/joyit_mfrc522/__init__.py b/WebControl/modules/joyit_mfrc522/__init__.py new file mode 100644 index 0000000..f793966 --- /dev/null +++ b/WebControl/modules/joyit_mfrc522/__init__.py @@ -0,0 +1,4 @@ +from .MFRC522 import MFRC522 +from .SimpleMFRC522 import SimpleMFRC522 + +name = "joyit_mfrc522" diff --git a/WebControl/templates/access.html b/WebControl/templates/access.html new file mode 100644 index 0000000..e70088a --- /dev/null +++ b/WebControl/templates/access.html @@ -0,0 +1,57 @@ + + + + Home CARIA1 + + + + + + + + + +
+

Interface d'accès

+
+
+

Dernière validation reçue

+

Nom: {{name}}

+

Confiance: {{confidence}}

+

Status: {{status}}

+
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/WebControl/templates/index.html b/WebControl/templates/index.html index 50623f4..5f63715 100644 --- a/WebControl/templates/index.html +++ b/WebControl/templates/index.html @@ -1,90 +1,194 @@ - admin AUTO1 + Home CARIA1 - + -
-

Interface d'administration

-
-
-
Vitesse de déplacement
-
-
-
- Needle -
-
-
050
- + +
+
+

Interface d'administration

+
+
+
Vitesse de déplacement
+
+
+
+ Needle +
+
+
030
+
-
-
- +
+
+
+
Contrôle des déplacements
+
+
+
+ +
-
- -
-
- -
-
-
- +
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
Caméra
+
+ Camera +
+
+
+
+
+

Test de fonctionnement

+
+
+
Composants
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
-
-
-
Caméra
-
- +
+
+
Fonctionnalités
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
-
-
-

Test de fonctionnement

-
-
-
Composants
-
-
- - - - - +
+
+
Dépannage
+
+
+ +
+
+ +
+
-
-
Fonctionnalités
-
-
- - +
+

Historique des programmes

+ +
+
+ + + + + + + + + + + % for result in results: + + + + + + + % end + +
DateNom du TestFonctionnement OKStatus
{{ result['date'] }}{{ result['nom'] }}{{ 'Oui' if result['fonctionnement_ok'] else 'Non' }}{{ result['status'] }}
+
+
+
+
-
+ diff --git a/WebControl/templates/tests.html b/WebControl/templates/tests.html index 389a83b..7396874 100644 --- a/WebControl/templates/tests.html +++ b/WebControl/templates/tests.html @@ -1,19 +1,48 @@ + Test CARIA1 - CARIA - - + + - -
-

Interface de tests


- -
+ +
+

Interface de tests

+
+
+
+
+
+ + diff --git a/WebControl/tests/infrared_obstacle_module.py b/WebControl/tests/infrared_obstacle_module.py index 29ac6fe..910497a 100644 --- a/WebControl/tests/infrared_obstacle_module.py +++ b/WebControl/tests/infrared_obstacle_module.py @@ -1,26 +1,43 @@ #!/usr/bin/env python3 -# -*- coding:utf-8 -*- +# -*- coding: utf-8 -*- import RPi.GPIO as GPIO -import time +import time, sys +sys.path.append('/home/christian/WebControl/modules/') +from AlphaBot import AlphaBot +Ab = AlphaBot() -ObstaclePin = 16 +status = "initialization" +DURATION_LIMIT = 5 -def setup(): - GPIO.setmode(GPIO.BCM) - GPIO.setup(ObstaclePin, GPIO.IN) - -def loop(): - while True: - if GPIO.input(ObstaclePin) == GPIO.LOW: - print("Obstacle détecté") - else: - print("Aucun obstacle détecté") - time.sleep(0.5) # Attendre un peu entre les lectures pour éviter les faux positifs - - -if __name__ == '__main__': - setup() +try: + start_time = time.time() # Enregistrer l'heure de début try: - loop() - except KeyboardInterrupt: - GPIO.cleanup() + while time.time() - start_time < DURATION_LIMIT: + if GPIO.input(Ab.OBSTACLE_PIN) == GPIO.LOW: + print("Obstacle détecté") + GPIO.output(Ab.RED_LIGHT, GPIO.HIGH) + status = "obstacle detected" + else: + print("Aucun obstacle détecté") + GPIO.output(Ab.RED_LIGHT, GPIO.LOW) + status = "no obstacle detected" + time.sleep(0.5) # Attendre un peu entre les lectures pour éviter les faux positifs + except Exception as e: + print(f"Erreur pendant l'exécution: {e}") + status = "erreur" +except KeyboardInterrupt: + print("Interruption par l'utilisateur.") + status = "interrupted" +finally: + GPIO.output(Ab.RED_LIGHT, GPIO.LOW) + Ab.cleanup() + +# Vérification finale et affichage du statut +if status in ["obstacle detected", "no obstacle detected"]: + print("Le composant fonctionne correctement.") + fonctionnement_ok = True +else: + print(f"Le composant a rencontré un problème: {status}.") + fonctionnement_ok = False + +Ab.enregistrer_resultats(sys.argv[0], fonctionnement_ok, status) \ No newline at end of file diff --git a/WebControl/tests/lidar_module.py b/WebControl/tests/lidar_module.py index d536ff1..5e2cd22 100644 --- a/WebControl/tests/lidar_module.py +++ b/WebControl/tests/lidar_module.py @@ -1,23 +1,50 @@ -import serial import time +import sys +sys.path.append('/home/christian/WebControl/modules/') +from AlphaBot import AlphaBot + +Ab = AlphaBot() + +# Variable de statut pour indiquer le bon fonctionnement +status = "initialization" + +# Durée limite d'exécution en secondes +time_limit = 7 +start_time = time.time() try: - ser = serial.Serial('/dev/ttyAMA0', 115200, timeout=1) - - # Envoi de la commande pour initialiser le capteur - ser.write(b'\x42\x57\x02\x00\x00\x00\x01\x06') - while True: - if ser.in_waiting >= 9: - if b'Y' == ser.read() and b'Y' == ser.read(): - Dist_L = ser.read() - Dist_H = ser.read() + # Vérification si le temps limite est dépassé + if time.time() - start_time > time_limit: + break + + if Ab.LIDAR_MODULE.in_waiting >= 9: + if b'Y' == Ab.LIDAR_MODULE.read() and b'Y' == Ab.LIDAR_MODULE.read(): + Dist_L = Ab.LIDAR_MODULE.read() + Dist_H = Ab.LIDAR_MODULE.read() Dist_Total = (Dist_H[0] * 256) + Dist_L[0] for i in range(0, 5): - ser.read() # Lecture et ignore des octets supplémentaires - print("Distance:", Dist_Total, "cm") -except serial.SerialException as e: - print("Erreur série:", e) + Ab.LIDAR_MODULE.read() # Lecture et ignore des octets supplémentaires + print("Distance à l'avant du véhicule:", Dist_Total, "cm") + status = "measurement successful" + time.sleep(1) + Ab.LIDAR_MODULE.reset_input_buffer() +except KeyboardInterrupt: + print("Interruption par l'utilisateur.") + status = "interrupted" +except Exception as e: + print(f"Erreur lors de l'exécution: {e}") + status = "error" finally: - if 'ser' in locals(): - ser.close() # Fermeture propre du port série + Ab.LIDAR_MODULE.close() # Fermeture propre du port série + Ab.cleanup() + +# Vérification finale et affichage du statut +if status in ["measurement successful"]: + print("Le composant fonctionne correctement.") + fonctionnement_ok = True +else: + print(f"Le composant a rencontré un problème: {status}.") + fonctionnement_ok = False + +Ab.enregistrer_resultats(sys.argv[0], fonctionnement_ok, status) \ No newline at end of file diff --git a/WebControl/tests/motor_speed_move.py b/WebControl/tests/motor_speed_move.py index 0eea39d..2fa108e 100644 --- a/WebControl/tests/motor_speed_move.py +++ b/WebControl/tests/motor_speed_move.py @@ -1,45 +1,46 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import time import sys sys.path.append('/home/christian/WebControl/modules/') from AlphaBot import AlphaBot +Ab = AlphaBot() +# Variable de statut pour indiquer le bon fonctionnement +status = "initialization" # Test de la classe AlphaBot avec différentes vitesses pour les moteurs individuels -def test_alphabot_speed(): - bot = AlphaBot() - try: - while True: # Boucle infinie - for speed in range(20, 101, 40): - print(f"Test de vitesse à {speed}%") - - # Vérifier si speed est une chaîne non vide - if speed != '': - # Test des moteurs en avance - bot.forward(speed) - time.sleep(1) - bot.stop() - time.sleep(0.5) - - # Test des moteurs en arrière - bot.backward(speed) - time.sleep(1) - bot.stop() - time.sleep(0.5) - - # Test du moteur gauche en avant et moteur droit en arrière - bot.left(speed) - time.sleep(1) - bot.stop() - time.sleep(0.5) - - # Test du moteur gauche en arrière et moteur droit en avant - bot.right(speed) - time.sleep(1) - bot.stop() - time.sleep(0.5) - except KeyboardInterrupt: - bot.cleanup() -if __name__ == "__main__": - test_alphabot_speed() +duration = 0.5 +try: + for speed in range(20, 81, 30): + print(f"Test de vitesse à {speed}%") + # Test des moteurs en avance + Ab.forward(duration, speed) + Ab.stop(1) + # Test des moteurs en arrière + Ab.backward(duration, speed) + Ab.stop(1) + # Test du moteur gauche en avant et moteur droit en arrière + Ab.left(duration, speed) + Ab.stop(1) + # Test du moteur gauche en arrière et moteur droit en avant + Ab.right(duration, speed) + Ab.stop(1) + status = "move successful" +except KeyboardInterrupt: + print("Interruption par l'utilisateur.") + status = "interrupted" +except Exception as e: + print(f"Erreur lors du test: {e}") + status = "error" +finally: + Ab.cleanup() + +# Vérification finale et affichage du statut +if status == "move successful": + print("Le composant fonctionne correctement.") + fonctionnement_ok = True +else: + print(f"Le composant a rencontré un problème: {status}.") + fonctionnement_ok = False + +Ab.enregistrer_resultats(sys.argv[0], fonctionnement_ok, status) \ No newline at end of file diff --git a/WebControl/tests/rfid_open_door.py b/WebControl/tests/rfid_open_door.py new file mode 100644 index 0000000..49e53c7 --- /dev/null +++ b/WebControl/tests/rfid_open_door.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import time, sys +sys.path.append('/home/christian/WebControl/modules/') +from SimpleMFRC522 import SimpleMFRC522 +RFID_MODULE = SimpleMFRC522() +from AlphaBot import AlphaBot +Ab = AlphaBot() + +status = "initialization" +fonctionnement_ok = False + +# Lecture initiale du tag RFID +try: + print("La porte est actuellement fermée.\nVeuillez approcher votre badge RFID du capteur pour accéder au véhicule.") + id_rfid, text_rfid = RFID_MODULE.read() + if text_rfid in ["CHRIS "]: + Ab.set_angle(90) + print(f"Salut {text_rfid.rstrip()}, votre accès est validé avec succès.\nLa porte du véhicule est maintenant ouverte!") + status = "Access successful" + elif text_rfid == "TEST RFID ": + Ab.set_angle(90) + print(f"Bienvenue, {text_rfid.rstrip()}.\nLa porte du véhicule est maintenant ouverte!") + status = "Access successful" + else: + print("Bonjour, vous n'êtes pas autorisé à entrer dans le véhicule.\nLa porte reste fermée.") + status = "Access denied" + print(f"(ID, Text)",id_rfid, text_rfid) + time.sleep(2) +except KeyboardInterrupt: + print("Interruption par l'utilisateur.") + status = "interrupted" +except Exception as e: + print(f"Erreur lors de l'exécution: {e}") + status = "error" +finally: + Ab.PWMSERVO.stop() +time.sleep(2) + +# Vérification finale et affichage du statut +if status == "Access successful": + print("Le composant fonctionne correctement.") + fonctionnement_ok = True +else: + print(f"Le composant a rencontré un problème: {status}.") + fonctionnement_ok = False + +Ab.enregistrer_resultats(sys.argv[0], fonctionnement_ok, status) \ No newline at end of file diff --git a/WebControl/tests/rfid_read_write_module.py b/WebControl/tests/rfid_read_write_module.py deleted file mode 100644 index 69d0a40..0000000 --- a/WebControl/tests/rfid_read_write_module.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python - -# Importation des bibliothèques -import time -from gpiozero import LED -from joyit_mfrc522 import SimpleMFRC522 - -# Initialisation de l'objet pour le module RFID -reader = SimpleMFRC522() - -# Fonction pour la lecture du tag RFID -def read_rfid(): - print("### Lecture RFID ###") - print("Approchez le tag RFID du capteur:") - id, text = reader.read() - print("ID:", id) - print("Contenu:", text) - time.sleep(5) - -# Fonction pour l'écriture sur le tag RFID avec gestion des erreurs -def write_rfid(data, max_attempts=3): - print("### Écriture RFID ###") - print("Valeur qui sera écrite:", data) - print("Approchez le tag RFID du capteur:") - try: - reader.write(data) - print("Succès de l'écriture sur le tag RFID.") - time.sleep(3) # Attente courte avant de vérifier l'écriture - except Exception as e: - print(f"Erreur lors de l'écriture RFID: {e}") - time.sleep(3) # Attendre avant de réessayer - -# Lecture initiale du tag RFID -read_rfid() - -# Écriture sur le tag RFID -write_rfid("TEST RFID") - -# Seconde lecture du tag RFID -read_rfid() diff --git a/WebControl/tests/servo_motor.py b/WebControl/tests/servo_motor.py index 0ca90aa..e97ce8c 100644 --- a/WebControl/tests/servo_motor.py +++ b/WebControl/tests/servo_motor.py @@ -1,31 +1,40 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import RPi.GPIO as GPIO -import time +import time,sys +sys.path.append('/home/christian/WebControl/modules/') +from AlphaBot import AlphaBot +Ab = AlphaBot() -# Définir la broche GPIO pour le signal du servo-moteur -SERVO_PIN = 27 +status = "initialization" +try: + Ab.set_angle(0) + print("Positionné à 0°") + time.sleep(2) + Ab.set_angle(90) + print("Positionné à 90°") + time.sleep(2) + Ab.set_angle(180) + print("Positionné à 180°") + time.sleep(2) + Ab.set_angle(0) + print("Positionné à 0°") + status = "movement successful" +except KeyboardInterrupt: + print("Interruption par l'utilisateur.") + status = "interrupted" +except Exception as e: + print(f"Erreur lors de l'exécution: {e}") + status = "error" +finally: + Ab.PWMSERVO.stop() + Ab.cleanup() -def setup(): - GPIO.setmode(GPIO.BCM) - GPIO.setup(SERVO_PIN, GPIO.OUT) +# Vérification finale et affichage du statut +if status == "movement successful": + print("Le composant fonctionne correctement.") + fonctionnement_ok = True +else: + print(f"Le composant a rencontré un problème: {status}.") + fonctionnement_ok = False -def set_angle(angle): - pwm = GPIO.PWM(SERVO_PIN, 50) # Fréquence PWM de 50 Hz - pwm.start(2.5) # Position neutre (angle de 0 degrés) - duty_cycle = angle / 18.0 + 2.5 # Convertir l'angle en devoir (duty cycle) - pwm.ChangeDutyCycle(duty_cycle) - time.sleep(0.5) # Attendre que le servo atteigne la position désirée - pwm.stop() - -if __name__ == '__main__': - try: - setup() - while True: - # Faire tourner le servo-moteur de 0 à 180 degrés avec un pas de 30 degrés - for angle in range(0, 181, 30): - print("Rotation du servo moteur à {} degrés".format(angle)) - set_angle(angle) - time.sleep(1) - except KeyboardInterrupt: - GPIO.cleanup() +Ab.enregistrer_resultats(sys.argv[0], fonctionnement_ok, status) \ No newline at end of file