diff --git a/photobooth_pygame.py b/photobooth_pygame.py index 81fcd2c..2dfa2b7 100644 --- a/photobooth_pygame.py +++ b/photobooth_pygame.py @@ -91,6 +91,30 @@ THEMES = { }, } +# ── Utilitaire USB ─────────────────────────────────────────────────────────── +def _usb_reset_done(): + """Reset USB des DSLR Canon/Nikon/Sony pour libérer tout claim obsolète.""" + import glob, subprocess as _sp + for dev_path in glob.glob('/sys/bus/usb/devices/[0-9]*-[0-9.]*'): + prod_file = f"{dev_path}/product" + if not os.path.exists(prod_file): + continue + try: + prod = open(prod_file).read().strip() + except: + continue + if not any(b in prod for b in ('Canon', 'Nikon', 'Sony', 'Digital Camera')): + continue + try: + bus = int(open(f"{dev_path}/busnum").read().strip()) + dev = int(open(f"{dev_path}/devnum").read().strip()) + usb_path = f"/dev/bus/usb/{bus:03d}/{dev:03d}" + _sp.run(['sudo', 'usbreset', usb_path], capture_output=True, timeout=5) + print(f"USB reset: {usb_path} ({prod})") + time.sleep(1.2) + except Exception as e: + print(f"USB reset err: {e}") + # ── États ──────────────────────────────────────────────────────────────────── S_ACCUEIL = "accueil" S_MODE = "mode" @@ -528,6 +552,7 @@ class PB: self.sim = "--sim" in sys.argv self.cam = None if not self.sim: + _usb_reset_done() # libère tout claim USB obsolète avant init for i in range(3): try: self.cam = gp.Camera(); self.cam.init() @@ -715,9 +740,10 @@ class PB: def _cam_loop(self): errs = 0 while True: - # En simulation : tentative de connexion automatique toutes les 8s + # En simulation : tentative de connexion automatique toutes les 10s if self.sim: - time.sleep(8) + time.sleep(10) + _usb_reset_done() for _ in range(2): try: c = gp.Camera(); c.init() @@ -727,7 +753,9 @@ class PB: self.cam = c; self.sim = False; self.prev_actif = True print("DSLR détecté automatiquement") break - except: time.sleep(1) + except Exception as e: + print(f"Auto-detect caméra: {e}") + time.sleep(1) continue if self.prev_actif: try: