13.3.1.2. Salut, cameră¶
Clasa openmv.Camera este punctul de intrare Python pentru tot ce poate face pachetul. Fiecare altă pagină din acest tutorial apelează către ea. Cel mai mic program util se conectează, încarcă un script MicroPython și tipărește tot ce scrie scriptul în stdout
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. Câteva observații¶
stop() înainte de exec() nu este opțional. Fără acesta, orice script care rula anterior continuă să scrie în stdout, iar noul exec se luptă cu el pentru controlul canalului stdin.
exec() încarcă șirul scriptului în tamponul stdin al camerei și îl rulează în același interpretor MicroPython cu care comunică IDE-ul. Scriptul importă csi, image, ml și restul suprafeței camerei tratate de capitolele anterioare – singura diferență este că sursa sosește prin USB în loc de la main.py de pe cameră sau din IDE.
13.3.1.2.2. Oprirea scriptului¶
Când programul de pe gazdă dorește să întrerupă scriptul care rulează, apelează stop(). Scriptul primește aceeași întrerupere pe care ar livra-o IDE-ul și iese la prima ocazie. Părăsirea managerului de context (blocul with) închide portul serial, dar nu oprește scriptul – camera continuă să ruleze tot ce a fost încărcat ultima dată până când ceva îl întrerupe.
13.3.1.2.3. Erori și excepții¶
Orice merge prost la nivelul stratului de protocol ridică o excepție openmv.OMVException sau una dintre subclasele sale (TimeoutException, ChecksumException, SequenceException). Încadrarea blocului with în try / except OMVException este cea mai simplă modalitate de a scoate la suprafață un cablu USB deconectat sau o cameră care a încetat să răspundă.
Protocolul reîncearcă intern înainte de a ridica excepția; până când o excepție OMVException ajunge la aplicație, bugetul de reîncercări s-a epuizat, iar legătura este cu adevărat întreruptă. Valorile implicite (max_retry=3, timeout=1.0) funcționează pentru toată lumea – reglează-le la constructor doar dacă o anumită aplicație are nevoie de un comportament diferit.