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) подходят всем – настраивайте их в конструкторе, только если конкретному приложению нужно иное поведение.