Skip to content

Commit 5b4ed83

Browse files
committed
updated logging and gamepad
1 parent 11e21e8 commit 5b4ed83

File tree

3 files changed

+78
-21
lines changed

3 files changed

+78
-21
lines changed

L1/L1_gamepad.py

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,63 @@
11
import pygame
22
import logging
3-
4-
# Configure logging for debugging
5-
logging.basicConfig(level=logging.DEBUG)
3+
import time
64

75
class Gamepad:
8-
def __init__(self):
6+
def __init__(self, retry_interval=1, max_retries=5):
97
pygame.init()
108
pygame.joystick.init()
11-
self.joystick = pygame.joystick.Joystick(0)
12-
self.joystick.init()
9+
self.joystick = None
10+
self.retry_interval = retry_interval
11+
self.max_retries = max_retries
12+
self._initialize_gamepad()
13+
14+
def _initialize_gamepad(self):
15+
"""Initialize gamepad with retry logic"""
16+
for attempt in range(self.max_retries):
17+
try:
18+
if pygame.joystick.get_count() > 0:
19+
self.joystick = pygame.joystick.Joystick(0)
20+
self.joystick.init()
21+
logging.info(f"Gamepad connected: {self.joystick.get_name()}")
22+
return
23+
else:
24+
logging.warning(f"No gamepad detected (attempt {attempt + 1}/{self.max_retries})")
25+
except Exception as e:
26+
logging.error(f"Initialization error: {str(e)}")
27+
28+
time.sleep(self.retry_interval)
29+
30+
raise RuntimeError("Failed to initialize gamepad after multiple attempts")
1331

1432
def get_input(self):
15-
"""
16-
Get input from the gamepad.
17-
"""
33+
"""Get normalized input from gamepad with deadzone handling"""
34+
if not self.joystick:
35+
raise RuntimeError("Gamepad not initialized")
36+
1837
try:
1938
pygame.event.pump()
20-
x_axis = self.joystick.get_axis(0) # Left stick X-axis
21-
y_axis = self.joystick.get_axis(1) # Left stick Y-axis
22-
logging.debug(f"Gamepad input: x_axis={x_axis}, y_axis={y_axis}")
39+
40+
# Add deadzone threshold (adjust as needed)
41+
deadzone = 0.1
42+
43+
# Get axis values with deadzone filtering
44+
x_axis = self._apply_deadzone(self.joystick.get_axis(0), deadzone)
45+
y_axis = self._apply_deadzone(self.joystick.get_axis(1), deadzone)
46+
47+
logging.debug(f"Gamepad input - X: {x_axis:.2f}, Y: {y_axis:.2f}")
2348
return x_axis, y_axis
49+
2450
except Exception as e:
25-
logging.error(f"An error occurred while reading gamepad input: {e}")
26-
raise
51+
logging.error(f"Input error: {str(e)}")
52+
raise
53+
54+
def _apply_deadzone(self, value, threshold):
55+
"""Apply deadzone to axis values"""
56+
if abs(value) < threshold:
57+
return 0.0
58+
return value
59+
60+
def __del__(self):
61+
if self.joystick:
62+
self.joystick.quit()
63+
pygame.quit()

L1/L1_motor.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,31 @@ def __init__(self):
1717
) for pin in MOTOR_PINS
1818
]
1919
logger.info(f"Motors ready on pins: {MOTOR_PINS}")
20+
self._is_emergency_stopped = False
2021

2122
def set_speed(self, speeds):
2223
"""Set speeds between -1.0 (full reverse) and 1.0 (full forward)"""
2324
for motor, speed in zip(self.motors, speeds):
2425
motor.value = max(-1.0, min(1.0, speed))
2526
logger.debug(f"Motor speeds set: {speeds}")
2627

27-
def stop(self):
28-
"""Emergency stop all motors"""
28+
def stop(self, emergency=False):
29+
30+
"""Stop all motors
31+
Args:
32+
emergency: If True, logs as warning (for unexpected stops)
33+
"""
34+
self._is_emergency_stopped = emergency
35+
2936
for motor in self.motors:
3037
motor.value = 0
31-
logger.warning("Motors forcefully stopped")
38+
if emergency:
39+
logger.warning("Motors forcefully stopped")
40+
else:
41+
logger.info("Motors stopped normally")
42+
43+
def status(self):
44+
return {
45+
"emergency_stop": self._is_emergency_stopped,
46+
"speeds": [m.value for m in self.motors]
47+
}

L3/L3_drive_mt.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,12 @@ def start(self):
5555
self.control_thread.start()
5656
logger.info("Drive system started")
5757

58+
# In DriveController:
5859
def stop(self):
59-
"""Stop the drive system"""
60-
self.controller.stop()
61-
self.control_thread.join()
62-
logger.info("Drive system stopped")
60+
self._running = False
61+
self.motor.stop(emergency=False) # Normal expected stop
62+
63+
# In timeout check:
64+
if time.time() - self._last_update > self._command_timeout:
65+
self.motor.stop(emergency=True) # Unexpected stop
66+
time.sleep(0.1)

0 commit comments

Comments
 (0)