Fix capture multi-pose : supp eosviewfinder (cause principale timeout)

- Retire eosviewfinder=1 avant/apres chaque prise : relancait le liveview
  (4-6s de blocage) → timeout 15s → ch=None → photos=[] → S_ACCUEIL
- Le miroir est deja leve par capture_preview() continu, l'obturateur
  seul se declenche via eosremoterelease=Immediate
- Logs detailles : chaque etape imprime son resultat pour debug
- Apres capture echouee : _prev_thumbs.append(None) pour garder index cohérent
- S_PREV 2.5s → 1.5s (plus reactif entre les poses)
- Apres capture : revient en S_PREV 0.6s pour montrer la vignette
- Print "Séquence terminée N/M photos" pour suivi

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-15 15:22:30 +02:00
parent eb0634fab4
commit 46752bf29b

View File

@@ -784,15 +784,9 @@ class PB:
if self.cam is None: if self.cam is None:
raise RuntimeError("camera None") raise RuntimeError("camera None")
if self.cap_demande: if self.cap_demande:
# Avant la prise : activer le viewfinder EOS (miroir levé, liveview ON) # Le liveview est déjà actif (capture_preview() tourne en continu)
try: # → le miroir est DÉJÀ levé, on déclenche uniquement l'obturateur
cfg_c = self.cam.get_config() print("Capture demandée — déclenchement obturateur...")
vf = cfg_c.get_child_by_name('eosviewfinder')
vf.set_value(1)
self.cam.set_config(cfg_c)
time.sleep(0.2)
except: pass
# Déclenchement obturateur seul via eosremoterelease
triggered = False triggered = False
try: try:
cfg_c = self.cam.get_config() cfg_c = self.cam.get_config()
@@ -800,8 +794,9 @@ class PB:
rl.set_value('Immediate') rl.set_value('Immediate')
self.cam.set_config(cfg_c) self.cam.set_config(cfg_c)
triggered = True triggered = True
except Exception: print("eosremoterelease=Immediate OK")
pass except Exception as ex:
print(f"eosremoterelease indispo ({ex}), trigger_capture fallback")
if not triggered: if not triggered:
self.cam.trigger_capture() self.cam.trigger_capture()
ch = None ch = None
@@ -809,32 +804,25 @@ class PB:
while time.time() < deadline: while time.time() < deadline:
ev_type, ev_data = self.cam.wait_for_event(500) ev_type, ev_data = self.cam.wait_for_event(500)
if ev_type == gp.GP_EVENT_FILE_ADDED: if ev_type == gp.GP_EVENT_FILE_ADDED:
print(f"Fichier reçu : {ev_data.name}")
cf = gp.CameraFile() cf = gp.CameraFile()
self.cam.file_get(ev_data.folder, ev_data.name, gp.GP_FILE_TYPE_NORMAL, cf) self.cam.file_get(ev_data.folder, ev_data.name, gp.GP_FILE_TYPE_NORMAL, cf)
nom = f"photo_{datetime.now().strftime('%Y%m%d_%H%M%S_%f')}.jpg" nom = f"photo_{datetime.now().strftime('%Y%m%d_%H%M%S_%f')}.jpg"
ch = str(PHOTOS_DIR/nom); cf.save(ch); break ch = str(PHOTOS_DIR/nom); cf.save(ch)
# Réinitialise le remote release print(f"Photo sauvegardée : {nom}"); break
elif ev_type == gp.GP_EVENT_TIMEOUT:
pass # normal, on continue d'attendre
if ch is None:
print("AVERTISSEMENT : aucun fichier reçu dans les 15s")
# Réinitialise le remote release sans toucher au viewfinder
try: try:
cfg_c = self.cam.get_config() cfg_c = self.cam.get_config()
rl = cfg_c.get_child_by_name('eosremoterelease') rl = cfg_c.get_child_by_name('eosremoterelease')
rl.set_value('None') rl.set_value('None')
self.cam.set_config(cfg_c) self.cam.set_config(cfg_c)
except: pass except: pass
# Relance le viewfinder et laisse le capteur se stabiliser
try:
cfg_c = self.cam.get_config()
vf = cfg_c.get_child_by_name('eosviewfinder')
vf.set_value(1)
self.cam.set_config(cfg_c)
except: pass
time.sleep(1.0) # stabilisation capteur Canon entre deux prises
# Drainer les événements résiduels
for _ in range(8):
try:
self.cam.wait_for_event(50)
except: break
self.cap_result=ch; self.cap_demande=False; self.cap_done.set() self.cap_result=ch; self.cap_demande=False; self.cap_done.set()
errs = 0; post_capture_grace = 10 errs = 0; post_capture_grace = 8
else: else:
f=self.cam.capture_preview(); data=bytes(f.get_data_and_size()) f=self.cam.capture_preview(); data=bytes(f.get_data_and_size())
surf=pygame.image.load(io.BytesIO(data)) surf=pygame.image.load(io.BytesIO(data))
@@ -907,10 +895,12 @@ class PB:
thumb_h = _PELL_FH if is_pell else 200 # haute résolution en mode pellicule thumb_h = _PELL_FH if is_pell else 200 # haute résolution en mode pellicule
for i in range(nb): for i in range(nb):
self.num_ph=i; self.etat=S_PREV; time.sleep(2.5) self.num_ph=i; self.etat=S_PREV; time.sleep(1.5)
self.etat=S_COMPTE self.etat=S_COMPTE
for c in range(delai,0,-1): self.chiffre=c; time.sleep(1) for c in range(delai,0,-1): self.chiffre=c; time.sleep(1)
print(f"Pose {i+1}/{nb} — déclenchement")
self.etat=S_CAP; ch=self._capturer() self.etat=S_CAP; ch=self._capturer()
print(f"Pose {i+1}/{nb} — résultat : {ch}")
if ch: if ch:
self.photos.append(ch); self.compteur+=1; self._sav_cpt() self.photos.append(ch); self.compteur+=1; self._sav_cpt()
try: try:
@@ -918,7 +908,11 @@ class PB:
self._prev_thumbs.append(pygame.image.fromstring(img.tobytes(), img.size, "RGB")) self._prev_thumbs.append(pygame.image.fromstring(img.tobytes(), img.size, "RGB"))
except: except:
self._prev_thumbs.append(None) self._prev_thumbs.append(None)
time.sleep(0.4) else:
self._prev_thumbs.append(None) # placeholder pour garder l'index cohérent
self.etat=S_PREV # repasse en preview pour montrer la vignette
time.sleep(0.6)
print(f"Séquence terminée — {len(self.photos)}/{nb} photos")
if not self.photos: self.etat=S_ACCUEIL; return if not self.photos: self.etat=S_ACCUEIL; return
self._upload_booth_bg(self.photos) # upload + QR session en arrière-plan self._upload_booth_bg(self.photos) # upload + QR session en arrière-plan
if self.mode=="simple": if self.mode=="simple":