#!/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 with support for multiple cams. import struct import sys,time import serial import platform import numpy as np from PIL import Image __serial = [] __port = [] __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_FB_ENABLE = 0x0D __USBDBG_TX_BUF_LEN = 0x8E __USBDBG_TX_BUF = 0x8F 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 global __port # open CDC port __serial.append(serial.Serial(port, baudrate=baudrate, timeout=timeout)) __port.append(port) def disconnect(port): global __serial global __port try: idx = __port.index(port) __serial[idx].close() __serial.pop(idx) __port.pop(idx) except: pass def set_timeout(port, timeout): try: idx = __port.index(port) __serial[idx].timeout = timeout except: pass def fb_size(port): # read fb header try: idx = __port.index(port) __serial[idx].write(struct.pack(" 2): #JPEG num_bytes = size[2] else: num_bytes = size[0]*size[1]*size[2] # read fb data __serial[idx].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))) except: return None def exec_script(port, buf): try: idx = __port.index(port) __serial[idx].write(struct.pack("