13.3.1.2. Hello cam

De openmv.Camera klasse is het Python-toegangspunt voor alles wat het pakket kan doen. Elke andere pagina in deze tutorial roept het aan. Het kleinste nuttige programma maakt verbinding, uploadt een MicroPython-script en drukt af wat het script naar stdout schrijft:

from openmv import Camera

script = """
import time
while True:
    print('hello from the cam')
    time.sleep(1)
"""

with Camera('/dev/ttyACM0') as cam:
    cam.stop()
    cam.exec(script)

    while True:
        if text := cam.read_stdout():
            print(text, end='')

13.3.1.2.1. Enkele opmerkingen

stop() voor exec() is niet optioneel. Zonder dit blijft elk eerder draaiend script naar stdout schrijven, en vecht de nieuwe exec ermee om de controle over het stdin kanaal.

exec() uploadt de scriptstring naar de stdin buffer van de cam en voert het uit in dezelfde MicroPython-interpreter waarmee de IDE praat. Het script importeert csi, image, ml, en de rest van het camoppervlak dat de eerdere hoofdstukken behandelden – het enige verschil is dat de broncode over USB arriveert in plaats van vanuit main.py op de camera of de IDE.

13.3.1.2.2. Het script stoppen

Wanneer het hostprogramma het draaiende script wil onderbreken, roep dan stop() aan. Het script ontvangt dezelfde interrupt die de IDE zou afleveren en stopt bij de eerste gelegenheid. Het verlaten van de contextmanager (het with blok) sluit de seriële poort maar stopt het script niet – de cam blijft draaien wat er als laatste was geladen tot iets het onderbreekt.

13.3.1.2.3. Fouten en uitzonderingen

Alles wat misgaat op de protocollaag veroorzaakt een openmv.OMVException of een van zijn subclasses (TimeoutException, ChecksumException, SequenceException). Het with blok omwikkelen met try / except OMVException is de eenvoudigste manier om een losgekoppelde USB-kabel of een cam die niet meer reageert aan het licht te brengen.

Het protocol probeert intern opnieuw voordat het een uitzondering veroorzaakt; tegen de tijd dat een OMVException de applicatie bereikt, is het herhaalbudget op en is de verbinding daadwerkelijk verbroken. De standaardwaarden (max_retry=3, timeout=1.0) werken voor iedereen – stem ze alleen af bij de constructor als een specifieke applicatie ander gedrag nodig heeft.