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:
@@ -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":
|
||||||
|
|||||||
Reference in New Issue
Block a user