Browse Source

fix set speed bug

Tuan Nguyen 1 year ago
parent
commit
b42a6fa2fb
2 changed files with 9 additions and 4 deletions
  1. 2 2
      dune_weaver_flask/app.py
  2. 7 2
      dune_weaver_flask/modules/serial/serial_manager.py

+ 2 - 2
dune_weaver_flask/app.py

@@ -125,7 +125,7 @@ def stop_execution():
 @app.route('/send_home', methods=['POST'])
 @app.route('/send_home', methods=['POST'])
 def send_home():
 def send_home():
     try:
     try:
-        serial_manager.send_command("HOME")
+        serial_manager.send_command("HOME", ack="HOMED")
         return jsonify({'success': True})
         return jsonify({'success': True})
     except Exception as e:
     except Exception as e:
         logger.error(f"Failed to send home command: {str(e)}")
         logger.error(f"Failed to send home command: {str(e)}")
@@ -393,7 +393,7 @@ def set_speed():
             logger.warning(f"Invalid speed value received: {speed}")
             logger.warning(f"Invalid speed value received: {speed}")
             return jsonify({"success": False, "error": "Invalid speed value"}), 400
             return jsonify({"success": False, "error": "Invalid speed value"}), 400
 
 
-        serial_manager.send_command(f"SET_SPEED {speed}")
+        serial_manager.send_command(f"SET_SPEED {speed}", ack="SPEED_SET")
         return jsonify({"success": True, "speed": speed})
         return jsonify({"success": True, "speed": speed})
     except Exception as e:
     except Exception as e:
         logger.error(f"Failed to set speed: {str(e)}")
         logger.error(f"Failed to set speed: {str(e)}")

+ 7 - 2
dune_weaver_flask/modules/serial/serial_manager.py

@@ -91,19 +91,24 @@ def send_coordinate_batch(coordinates):
         ser.write(batch_str.encode())
         ser.write(batch_str.encode())
         logger.debug(f"Sent coordinate batch: {batch_str.strip()}")
         logger.debug(f"Sent coordinate batch: {batch_str.strip()}")
 
 
-def send_command(command):
+def send_command(command, ack=None):
     """Send a single command to the Arduino."""
     """Send a single command to the Arduino."""
+    timeout = 10  # Timeout in seconds
+    start_time = time.time()
     with serial_lock:
     with serial_lock:
         ser.write(f"{command}\n".encode())
         ser.write(f"{command}\n".encode())
         logger.debug(f"Sent command: {command}")
         logger.debug(f"Sent command: {command}")
 
 
         # Wait for "R" acknowledgment from Arduino
         # Wait for "R" acknowledgment from Arduino
         while True:
         while True:
+            if time.time() - start_time > timeout:
+                logger.error(f"Timeout: No acknowledgment received within {timeout} seconds")
+                break  # Exit loop after timeout
             with serial_lock:
             with serial_lock:
                 if ser.in_waiting > 0:
                 if ser.in_waiting > 0:
                     response = ser.readline().decode().strip()
                     response = ser.readline().decode().strip()
                     logger.debug(f"Arduino response: {response}")
                     logger.debug(f"Arduino response: {response}")
-                    if response == "R":
+                    if response == ack:
                         logger.debug("Command execution completed")
                         logger.debug("Command execution completed")
                         break
                         break