You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

102 lines
3.4 KiB

#!/usr/bin/env python3
"""
Outil de diagnostic pour analyser les entrées d'un joystick.
Affiche en temps réel les axes, boutons et chapeau détectés.
"""
import os
import platform
import sys
import pygame
import time
print("=== Infos système ===")
print(f" Python : {sys.version}")
print(f" OS : {platform.system()} {platform.release()}")
# Même comportement que main.py : désactive HIDAPI pour éviter la renumérotation des boutons
os.environ.setdefault("SDL_JOYSTICK_HIDAPI", "0")
print(f" SDL_JOYSTICK_HIDAPI : {os.environ.get('SDL_JOYSTICK_HIDAPI', '(non défini)')}")
def main():
pygame.init()
pygame.joystick.init()
sdl_ver = pygame.get_sdl_version()
print(f" pygame : {pygame.__version__}")
print(f" SDL : {sdl_ver[0]}.{sdl_ver[1]}.{sdl_ver[2]}")
print()
# Petite fenêtre pour capturer les événements
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("Joystick Debug")
clock = pygame.time.Clock()
joysticks = []
for idx in range(pygame.joystick.get_count()):
joy = pygame.joystick.Joystick(idx)
joy.init()
joysticks.append(joy)
print(f"\n=== Joystick {idx}: {joy.get_name()} ===")
try:
print(f" GUID : {joy.get_guid()}")
except AttributeError:
pass
print(f" Boutons: {joy.get_numbuttons()}")
print(f" Axes : {joy.get_numaxes()}")
print(f" Chapeaux: {joy.get_numhats()}")
print(f" Trackballs: {joy.get_numballs()}")
if not joysticks:
print("❌ Aucun joystick détecté!")
pygame.quit()
return
print("\n📋 Monitoring en direct (appuyez sur ESC ou fermez la fenêtre pour quitter)...\n")
axis_values = {}
button_states = {}
hat_states = {}
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
running = False
elif event.type == pygame.JOYBUTTONDOWN:
print(f"🔴 [J{event.joy}] BOUTON DOWN: {event.button}")
elif event.type == pygame.JOYBUTTONUP:
print(f"⚪ [J{event.joy}] BOUTON UP: {event.button}")
elif event.type == pygame.JOYAXISMOTION:
# Afficher seulement si le mouvement est significatif
if abs(event.value) > 0.1:
print(f" [J{event.joy}] AXE {event.axis}: {event.value:.3f}")
elif event.type == pygame.JOYHATMOTION:
print(f"🧭 [J{event.joy}] CHAPEAU: {event.value}")
# État en direct des axes
for idx, joy in enumerate(joysticks):
print("\r", end="")
status = f"[J{idx}] "
for axis_idx in range(min(4, joy.get_numaxes())): # Afficher les 4 premiers axes
val = joy.get_axis(axis_idx)
status += f"AX{axis_idx}:{val:6.3f} "
# État du chapeau
try:
hat_x, hat_y = joy.get_hat(0)
status += f"| CHAPEAU:({hat_x},{hat_y})"
except:
pass
print(status, end="", flush=True)
clock.tick(30) # 30 FPS
pygame.quit()
print("\n✅ Terminé.")
if __name__ == "__main__":
main()