13.3.1.2. שלום מצלמה¶
המחלקה openmv.Camera היא נקודת הכניסה של Python לכל מה שהחבילה יכולה לעשות. כל עמוד אחר במדריך זה קורא אליה. התוכנית השימושית הקטנה ביותר מתחברת, מעלה סקריפט MicroPython, ומדפיסה את כל מה שהסקריפט כותב ל-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. כמה הערות¶
stop() לפני exec() אינו אופציונלי. בלעדיו, כל סקריפט שרץ קודם לכן ממשיך לכתוב ל-stdout, וה-exec החדש נאבק בו על השליטה בערוץ ה-stdin.
exec() מעלה את מחרוזת הסקריפט לחוצץ ה-stdin של המצלמה ומריץ אותה באותו מפרש MicroPython שה-IDE מדבר אליו. הסקריפט מייבא את csi, image, ml, ושאר משטח המצלמה שהפרקים הקודמים כיסו – הדבר היחיד השונה הוא שהמקור מגיע דרך USB במקום מ-main.py במצלמה או מה-IDE.
13.3.1.2.2. עצירת הסקריפט¶
כאשר תוכנית המארח רוצה לקטוע את הסקריפט הרץ, קרא ל-stop(). הסקריפט מקבל את אותה פסיקה שה-IDE היה מספק ויוצא בהזדמנות הבאה. עזיבת מנהל ההקשר (בלוק ה-with) סוגרת את היציאה הטורית אבל אינה עוצרת את הסקריפט – המצלמה ממשיכה להריץ את מה שנטען לאחרונה עד שמשהו קוטע אותו.
13.3.1.2.3. שגיאות וחריגות¶
כל דבר שמשתבש בשכבת הפרוטוקול מעלה openmv.OMVException או אחת מתת-המחלקות שלה (TimeoutException, ChecksumException, SequenceException). עטיפת בלוק ה-with ב-try / except OMVException היא הדרך הפשוטה ביותר לחשוף כבל USB מנותק או מצלמה שהפסיקה להגיב.
הפרוטוקול מנסה שוב פנימית לפני שהוא מעלה חריגה; עד שחריגת OMVException מגיעה ליישום, תקציב הניסיונות החוזרים אזל והקישור באמת שבור. ברירות המחדל (max_retry=3, timeout=1.0) עובדות עבור כולם – כוונן אותן בבנאי רק אם יישום מסוים זקוק להתנהגות שונה.