13.3.1.2. Hello cam¶
Az openmv.Camera osztály a Python belépési pontja mindenhez, amire a csomag képes. Ennek a tutorialnak minden más oldala ezt hívja. A legkisebb hasznos program csatlakozik, feltölt egy MicroPython szkriptet, és kiírja mindazt, amit a szkript a stdout-ra ír:
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. Néhány megjegyzés¶
A stop() a exec() előtt nem opcionális. Enélkül bármely korábban futó szkript tovább ír a stdout-ra, és az új exec harcol vele a stdin csatorna feletti uralomért.
A exec() feltölti a szkript-karakterláncot a kamera stdin pufferébe, és ugyanabban a MicroPython értelmezőben futtatja, amelyikkel az IDE beszél. A szkript importálja a csi, image, ml modulokat és a kamera többi felületét, amelyeket a korábbi fejezetek tárgyaltak – az egyetlen különbség az, hogy a forrás USB-n keresztül érkezik, nem pedig a kamerán lévő main.py-ból vagy az IDE-ből.
13.3.1.2.2. A szkript leállítása¶
Amikor a gazdaprogram meg akarja szakítani a futó szkriptet, hívd meg a stop() metódust. A szkript ugyanazt a megszakítást kapja meg, amelyet az IDE küldene, és a legközelebbi alkalommal kilép. A kontextuskezelő (a with blokk) elhagyása lezárja a soros portot, de nem állítja le a szkriptet – a kamera tovább futtatja az utoljára betöltött kódot, amíg valami meg nem szakítja.
13.3.1.2.3. Hibák és kivételek¶
Bármi, ami a protokollrétegen rosszul sül el, egy openmv.OMVException kivételt vagy annak valamelyik alosztályát (TimeoutException, ChecksumException, SequenceException) váltja ki. A with blokk try / except OMVException szerkezetbe csomagolása a legegyszerűbb módja egy lecsatlakozott USB-kábel vagy egy válaszolni megszűnt kamera felszínre hozásának.
A protokoll belsőleg újrapróbálkozik, mielőtt kivételt váltana ki; mire egy OMVException eléri az alkalmazást, az újrapróbálkozási keret elfogyott, és a kapcsolat valóban megszakadt. Az alapértelmezések (max_retry=3, timeout=1.0) mindenkinek megfelelnek – csak akkor hangold őket a konstruktornál, ha egy konkrét alkalmazás más viselkedést igényel.