From eefae1c6366e49572d0d61e6b27a4a344d14062a Mon Sep 17 00:00:00 2001 From: "Muhamed (aider)" <Muhamedalici@hotmail.de> Date: Sun, 18 May 2025 03:53:07 +0200 Subject: [PATCH] feat: Implement REST API for rover to receive commands from mission control --- api.py | 30 ++++++++++++++++++++++++++++++ mission_control.py | 30 +++++++++++++++++++++--------- 2 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 api.py diff --git a/api.py b/api.py new file mode 100644 index 0000000..237f9f8 --- /dev/null +++ b/api.py @@ -0,0 +1,30 @@ +from flask import Flask, request, jsonify +from rover import Rover +from plateau import Plateau + +app = Flask(__name__) + +# Initialisierung des Rovers und des Plateaus +plateau = Plateau(10, 10) # Standardgröße, kann angepasst werden +rover = Rover() +rover.set_plateau_size(plateau.size_x, plateau.size_y) + +@app.route('/drive', methods=['POST']) +def drive_rover(): + """ + Endpunkt zum Steuern des Rovers. + Erwartet ein JSON mit dem Schlüssel "Input", der die Befehlssequenz enthält. + Gibt die erfolgreich ausgeführten Befehle zurück. + """ + data = request.get_json() + + if not data or 'Input' not in data: + return jsonify({'error': 'Ungültige Anfrage. "Input" fehlt.'}), 400 + + commands = data['Input'] + result = rover.drive(commands) + + return jsonify({'executed_commands': result}) + +if __name__ == '__main__': + app.run(debug=True) diff --git a/mission_control.py b/mission_control.py index eae55a1..891e6dc 100644 --- a/mission_control.py +++ b/mission_control.py @@ -28,7 +28,7 @@ class MissionControl: def send_commands(self, cmd: str) -> str: """ - Sendet einen Befehl an den Rover. + Sendet einen Befehl an den Rover über die REST-API. Args: cmd: Der zu sendende Befehl @@ -36,15 +36,27 @@ class MissionControl: Returns: Die erfolgreich ausgeführten Befehle """ - # Synchronisiere die Hindernisse zwischen Mars und Rover - # Der Rover sollte die Hindernisse nicht direkt kennen - # Stattdessen sollte er selbst stoppen, wenn ein Hindernis vorliegt - # Da wir aber keine direkte Verbindung zwischen Rover und Mars haben, - # müssen wir die Hindernisse hier synchronisieren - if hasattr(self.mars, 'plateau') and hasattr(self.mars.plateau, 'obstacles'): - self.rover.obstacles = self.mars.plateau.obstacles + import requests + import json - return self.rover.drive(cmd) + try: + # Synchronisiere die Hindernisse zwischen Mars und Rover + if hasattr(self.mars, 'plateau') and hasattr(self.mars.plateau, 'obstacles'): + self.rover.obstacles = self.mars.plateau.obstacles + + # Sende Befehl über REST-API + response = requests.post('http://localhost:5000/drive', + json={'Input': cmd}, + headers={'Content-Type': 'application/json'}) + + if response.status_code == 200: + result = response.json() + return result['executed_commands'] + else: + return f"Fehler: {response.status_code}, {response.text}" + except Exception as e: + # Fallback: Direkter Aufruf, wenn API nicht erreichbar + return self.rover.drive(cmd) def observe_plateau(self) -> list: """ -- GitLab