diff --git a/scripts/camera_service.py b/scripts/camera_service.py index b335e5e..707d6e0 100644 --- a/scripts/camera_service.py +++ b/scripts/camera_service.py @@ -169,6 +169,12 @@ def create_app(folder: Path | str | None = None, sorgente = aperte.get(nome) if sorgente is None: sorgente = open_source(nome, None, config=_config()) + # TieVision-Core#341 / #89: free-run, serve la scena di adesso, non il frame vecchio in coda + if hasattr(sorgente, "solo_ultimo_frame"): + try: + sorgente.solo_ultimo_frame() + except Exception as e: # noqa: BLE001 - producer senza il nodo: si apre lo stesso + _log.warning("frame piu' recente non impostabile su %s: %s", nome, e) _carica_settaggi(nome, sorgente) # #87: predefiniti salvati, se ci sono with lock: aperte[nome] = sorgente diff --git a/scripts/tests/test_camera_acquisizione.py b/scripts/tests/test_camera_acquisizione.py index 30bd57b..87ec951 100644 --- a/scripts/tests/test_camera_acquisizione.py +++ b/scripts/tests/test_camera_acquisizione.py @@ -278,6 +278,40 @@ def test_settaggi_rotti_non_bloccano_l_apertura(cartella, tmp_path, monkeypatch) assert c.get("/camera/parametri", params={"source": SORGENTE}).status_code == 200 +def test_apertura_chiede_il_frame_piu_recente(cartella, tmp_path, monkeypatch): + # #89: solo_ultimo_frame() una volta sola all'apertura, non a ogni richiesta + class ConUltimoFrame(Finta): + chiamate = 0 + + def solo_ultimo_frame(self, attivo=True): + self.chiamate += 1 + + finta = ConUltimoFrame() + with _client(cartella, tmp_path / "cfg", monkeypatch, finta) as c: + for _ in range(3): + assert c.get("/camera/parametri", params={"source": SORGENTE}).status_code == 200 + assert finta.chiamate == 1 + + +def test_frame_piu_recente_non_impostabile_non_blocca_l_apertura(cartella, tmp_path, monkeypatch, caplog): + # #89: producer senza il nodo -> avviso nel log, apertura riuscita + class SenzaNodo(Finta): + def solo_ultimo_frame(self, attivo=True): + raise CameraStateError("questo producer non espone StreamBufferHandlingMode") + + with caplog.at_level("WARNING"): + with _client(cartella, tmp_path / "cfg", monkeypatch, SenzaNodo()) as c: + assert c.get("/camera/parametri", params={"source": SORGENTE}).status_code == 200 + assert "frame piu' recente non impostabile" in caplog.text + + +def test_sorgente_senza_solo_ultimo_frame_si_apre(cartella, tmp_path, monkeypatch): + # #89: FolderCamera e simili non hanno il metodo: nessun errore + assert not hasattr(Finta(), "solo_ultimo_frame") + with _client(cartella, tmp_path / "cfg", monkeypatch, Finta()) as c: + assert c.get("/camera/parametri", params={"source": SORGENTE}).status_code == 200 + + # ---- pagina def test_acquisizione_alias_della_pagina(client): diff --git a/vendor/visionsuite b/vendor/visionsuite index 7d57ff1..06b549a 160000 --- a/vendor/visionsuite +++ b/vendor/visionsuite @@ -1 +1 @@ -Subproject commit 7d57ff1bbba39f84b63ac8839d3dd3ef270a9200 +Subproject commit 06b549a25d0bff7504a0e8bbbd233fd5fc05652a