#!/usr/bin/env python2 # This file is part of the OpenMV project. # # Copyright (c) 2013-2021 Ibrahim Abdelkader # Copyright (c) 2013-2021 Kwabena W. Agyeman # # This work is licensed under the MIT license, see the file LICENSE for details. # # Openmv module. import struct import sys,time import serial import platform import numpy as np from PIL import Image __serial = None __FB_HDR_SIZE =12 # USB Debug commands __USBDBG_CMD = 48 __USBDBG_FW_VERSION = 0x80 __USBDBG_FRAME_SIZE = 0x81 __USBDBG_FRAME_DUMP = 0x82 __USBDBG_ARCH_STR = 0x83 __USBDBG_SCRIPT_EXEC = 0x05 __USBDBG_SCRIPT_STOP = 0x06 __USBDBG_SCRIPT_SAVE = 0x07 __USBDBG_SCRIPT_RUNNING = 0x87 __USBDBG_TEMPLATE_SAVE = 0x08 __USBDBG_DESCRIPTOR_SAVE= 0x09 __USBDBG_ATTR_READ = 0x8A __USBDBG_ATTR_WRITE = 0x0B __USBDBG_SYS_RESET = 0x0C __USBDBG_SYS_RESET_TO_BL= 0x0E __USBDBG_FB_ENABLE = 0x0D __USBDBG_TX_BUF_LEN = 0x8E __USBDBG_TX_BUF = 0x8F __USBDBG_GET_STATE = 0x93 __USBDBG_STATE_FLAGS_SCRIPT = (1 << 0) __USBDBG_STATE_FLAGS_TEXT = (1 << 1) __USBDBG_STATE_FLAGS_FRAME = (1 << 2) ATTR_CONTRAST =0 ATTR_BRIGHTNESS =1 ATTR_SATURATION =2 ATTR_GAINCEILING=3 __BOOTLDR_START = 0xABCD0001 __BOOTLDR_RESET = 0xABCD0002 __BOOTLDR_ERASE = 0xABCD0004 __BOOTLDR_WRITE = 0xABCD0008 def init(port, baudrate=921600, timeout=0.3): global __serial # open CDC port __serial = serial.Serial(port, baudrate=baudrate, timeout=timeout) def disconnect(): global __serial try: if (__serial): __serial.close() __serial = None except: pass def set_timeout(timeout): __serial.timeout = timeout def fb_size(): # read fb header __serial.write(struct.pack(" 2 else (w * h * size) # read fb data __serial.write(struct.pack(">11)*255.0/31.0).astype(np.uint8) g = (((arr & 0x07E0) >>5) *255.0/63.0).astype(np.uint8) b = (((arr & 0x001F) >>0) *255.0/31.0).astype(np.uint8) buff = np.column_stack((r,g,b)) else: # JPEG try: buff = np.asarray(Image.frombuffer("RGB", (w, h), buff, "jpeg", "RGB", "")) except Exception as e: raise ValueError(f"JPEG decode error (%e)") if (buff.size != (w*h*3)): raise ValueError(f"Unexpected frame size. Expected: {w*h*3} received: {buff.size}") return w, h, buff.reshape((h, w, 3)), text def fb_dump(): size = fb_size() if (not size[0]): # frame not ready return None if (size[2] > 2): #JPEG num_bytes = size[2] else: num_bytes = size[0]*size[1]*size[2] # read fb data __serial.write(struct.pack(">11)*255.0/31.0).astype(np.uint8) g = (((arr & 0x07E0) >>5) *255.0/63.0).astype(np.uint8) b = (((arr & 0x001F) >>0) *255.0/31.0).astype(np.uint8) buff = np.column_stack((r,g,b)) else: # JPEG try: buff = np.asarray(Image.frombuffer("RGB", size[0:2], buff, "jpeg", "RGB", "")) except Exception as e: print ("JPEG decode error (%s)"%(e)) return None if (buff.size != (size[0]*size[1]*3)): return None return (size[0], size[1], buff.reshape((size[1], size[0], 3))) def exec_script(buf): __serial.write(struct.pack("