diff --git a/tools/pyopenmv_multi.py b/tools/pyopenmv_multi.py new file mode 100644 index 000000000..e5c02b7b3 --- /dev/null +++ b/tools/pyopenmv_multi.py @@ -0,0 +1,276 @@ +#!/usr/bin/env python +# This file is part of the OpenMV project. +# Copyright (c) 2013/2014 Ibrahim Abdelkader +# 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 = [] +__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("