13.3.1.2. Hello cam

Клас 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) підходять для всіх — налаштовуйте їх у конструкторі лише якщо конкретному застосунку потрібна інша поведінка.