diff --git a/usr/gtk-ide.py b/usr/gtk-ide.py index 3b706cca1..bf1bd684f 100755 --- a/usr/gtk-ide.py +++ b/usr/gtk-ide.py @@ -232,17 +232,16 @@ class OMVGtk: try: # stop running code - openmv.stop_script(); - except: + openmv.stop_script() + # release OpenMV + openmv.release() + except IOError: pass - - # release OpenMV - openmv.release() - - self.connected = False - self._update_title() - self.connect_button.set_sensitive(True) - map(lambda x:x.set_sensitive(False), self.controls) + finally: + self.connected = False + self._update_title() + self.connect_button.set_sensitive(True) + map(lambda x:x.set_sensitive(False), self.controls) def connect_clicked(self, widget): self.connect() @@ -403,7 +402,7 @@ class OMVGtk: self.statusbar.pop(self.statusbar_ctx) self.statusbar.push(self.statusbar_ctx, rgb) - def _rgb(rgb): + def _rgb(self, rgb): return struct.pack("BBB", ((rgb & 0xF800) >> 11)*255/31, ((rgb & 0x07E0)>>5)*255/63, (rgb & 0x001F)*255/31) def update_drawing(self): @@ -437,11 +436,11 @@ class OMVGtk: # JPEG try: buff = Image.frombuffer("RGB", (w, h), buf, "jpeg", "RGB", "").tostring() - print('fix JPEG return') except Exception as e: print('JPEG decode error (%s)' % e) buff = None else: + print len(buff), w, h, w*h*3 if len(buff) != w*h*3: print('JPEG buff len != w*h*bpp') buff = None @@ -454,8 +453,9 @@ class OMVGtk: if buff: # create pixbuf from np array - self.pixbuf = gtk.gdk.pixbuf_new_from_data(buff, gtk.gdk.COLORSPACE_RGB, False, 8, w, h, w*h*2) + self.pixbuf = gtk.gdk.pixbuf_new_from_data(buff, gtk.gdk.COLORSPACE_RGB, False, 8, w, h, w*3) self.pixbuf = self.pixbuf.scale_simple(w*SCALE, h*SCALE, gtk.gdk.INTERP_BILINEAR) + self.drawingarea.realize() cm = self.drawingarea.window.get_colormap() gc = self.drawingarea.window.new_gc(foreground=cm.alloc_color('#FFFFFF', True, False)) diff --git a/usr/openmv.py b/usr/openmv.py index dff57907f..016592de3 100755 --- a/usr/openmv.py +++ b/usr/openmv.py @@ -53,6 +53,7 @@ FORMAT_GRAY = 3 def init(): global __dev # find USB __device + print('OpenMV Cam init()') try: __dev = usb.core.find(idVendor=__VID, idProduct=__PID) @@ -68,9 +69,9 @@ def init(): # set FB debug alt setting __dev.set_interface_altsetting(__INTERFACE, __ALTSETTING) - except USBError as e: + except Exception as e: pass - print('USB error while searching for OpenMV Cam: %s' % e.message) + print('Error while searching for OpenMV Cam: %s' % e.message) def find(): @@ -78,11 +79,10 @@ def find(): try: dev = usb.core.find(idVendor=__VID, idProduct=__PID) except USBError: - print('OpenMV Cam NOT found') pass + found = False else: if dev: - print('OpenMV Cam found') found = True finally: return found @@ -90,12 +90,13 @@ def find(): def release(): try: - # Release device + # Release device resources, interface, etc. usb.util.dispose_resources(__dev) # reattach kernel driver #__dev.attach_kernel_driver(__INTERFACE) - except USBError: + except USBError as e: + print('error disposing resources %s' % e) pass @@ -109,45 +110,56 @@ def fb_size(): def fb_lock(): try: buf = __dev.ctrl_transfer(0xC1, __USBDBG_FRAME_LOCK, 0, __INTERFACE, 1, __TIMEOUT) - return struct.unpack("B", buf)[0] except USBError: + pass return 0 + else: + return struct.unpack("B", buf)[0] def fb_get(): if fb_lock() == 0: return None - buf = __dev.ctrl_transfer(0xC1, __USBDBG_FRAME_SIZE, 0, __INTERFACE, __FB_HDR_SIZE, __TIMEOUT) - size = struct.unpack("III", buf) - - w = size[0] - h = size[1] - bpp = size[2] - - if bpp > 2: - # bpp is actually image size and data is in JPEG format - num_bytes = bpp - fmt = FORMAT_JPEG + try: + buf = __dev.ctrl_transfer(0xC1, __USBDBG_FRAME_SIZE, 0, __INTERFACE, __FB_HDR_SIZE, __TIMEOUT) + except USBError as e: + pass + return None else: - num_bytes = w * h * bpp - if bpp == 1: - fmt = FORMAT_GRAY - elif bpp == 2: - fmt = FORMAT_RGB565 + size = struct.unpack("III", buf) + + w = size[0] + h = size[1] + bpp = size[2] + + if bpp > 2: + # bpp is actually image size and data is in JPEG format + num_bytes = bpp + fmt = FORMAT_JPEG else: - fmt = None - w = None - h = None + num_bytes = w * h * bpp + if bpp == 1: + fmt = FORMAT_GRAY + elif bpp == 2: + fmt = FORMAT_RGB565 + else: + fmt = None + w = None + h = None - if fmt: - # read fb data - __dev.ctrl_transfer(0xC1, __USBDBG_FRAME_DUMP, num_bytes/4, __INTERFACE, 0, __TIMEOUT) - buff = __dev.read(__IN_EP, num_bytes, __INTERFACE, __TIMEOUT) - else: - buff = None + if fmt: + # read fb data + try: + __dev.ctrl_transfer(0xC1, __USBDBG_FRAME_DUMP, num_bytes/4, __INTERFACE, 0, __TIMEOUT) + except USBError: + pass + else: + buff = __dev.read(__IN_EP, num_bytes, __INTERFACE, __TIMEOUT) + else: + buff = None - return fmt, w, h, buff + return fmt, w, h, buff def fb_update():