From aa67b5b2b4bc74349e9e25ee4e51077efa08bf4a Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Thu, 6 Feb 2014 20:41:04 +0200 Subject: [PATCH] Add OpenMV Python IDE --- usr/openmv-ide.glade | 377 +++++++++++++++++++++++++++++++++++++++++++ usr/openmv-ide.py | 117 ++++++++++++++ 2 files changed, 494 insertions(+) create mode 100644 usr/openmv-ide.glade create mode 100755 usr/openmv-ide.py diff --git a/usr/openmv-ide.glade b/usr/openmv-ide.glade new file mode 100644 index 000000000..62f39ffdb --- /dev/null +++ b/usr/openmv-ide.glade @@ -0,0 +1,377 @@ + + + + + + + + False + OpenMV IDE + 800 + 600 + + + + True + False + + + True + False + + + True + False + False + _File + True + + + True + False + + + gtk-new + True + False + False + True + True + + + + + gtk-open + True + False + False + True + True + + + + + gtk-save + True + False + False + True + True + + + + + gtk-save-as + True + False + False + True + True + + + + + True + False + False + + + + + gtk-quit + True + False + False + True + True + + + + + + + + + True + False + False + _Edit + True + + + True + False + + + gtk-cut + True + False + False + True + True + + + + + gtk-copy + True + False + False + True + True + + + + + gtk-paste + True + False + False + True + True + + + + + gtk-delete + True + False + False + True + True + + + + + + + + + True + False + False + _View + True + + + + + True + False + False + _Help + True + + + True + False + + + gtk-about + True + False + False + True + True + + + + + + + + + False + True + 0 + + + + + True + False + + + True + False + False + toolbutton1 + True + gtk-connect + + + False + True + + + + + True + False + False + toolbutton2 + True + gtk-disconnect + + + False + True + + + + + True + False + False + + + False + True + + + + + True + False + False + toolbutton3 + True + gtk-execute + + + + False + True + + + + + True + False + False + toolbutton4 + True + gtk-stop + + + + False + True + + + + + True + False + False + + + False + True + + + + + True + False + False + toolbutton5 + True + gtk-apply + + + False + True + + + + + False + True + 1 + + + + + True + True + 400 + + + True + True + 400 + + + True + True + 2 + 2 + True + 4 + True + True + True + + + True + True + + + + + True + False + + + True + False + gtk-missing-image + + + False + False + 0 + + + + + + + + False + True + + + + + True + True + + + + + True + True + True + #00000fa0ffff + UTF-8 + True + False + + + True + True + + + + + True + True + 2 + + + + + + diff --git a/usr/openmv-ide.py b/usr/openmv-ide.py new file mode 100755 index 000000000..b7f3e86a7 --- /dev/null +++ b/usr/openmv-ide.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +import sys, os, os.path +import gtk +import gtksourceview2 as gtksourceview +import gio +import pango +import gobject +import vte +import serial +from time import sleep +import usb.core +import usb.util +import numpy as np + +interface = 2; +altsetting= 1; + +def image2pixbuf(buff): + arr = np.fromstring(buff, dtype=np.uint16).newbyteorder('S') + r = (((arr & 0xF800) >>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) + arr = np.column_stack((r, g, b)) + arr = arr.reshape((120, 160, 3)) + return gtk.gdk.pixbuf_new_from_array(arr, gtk.gdk.COLORSPACE_RGB, 8) + +ex_source = '''from openmv import sensor +while (True): + image = sensor.snapshot()''' + +class OMVGtk: + def __init__(self): + #Set the Glade file + self.builder = gtk.Builder() + self.builder.add_from_file("openmv-ide.glade") + + sourceview = self.builder.get_object('gtksourceview') + + self.buffer = gtksourceview.Buffer() + mgr = gtksourceview.style_scheme_manager_get_default() + style_scheme = mgr.get_scheme('classic') + if style_scheme: + self.buffer.set_style_scheme(style_scheme) + lang_manager = gtksourceview.language_manager_get_default() + self.buffer.set_highlight_syntax(True) + self.buffer.set_language(lang_manager.get_language("python")) + self.buffer.set_text(ex_source) + sourceview.set_buffer(self.buffer) + + self.terminal = self.builder.get_object('terminal') + fd = os.open("/dev/ttyACM0", os.O_RDWR) + self.terminal.set_size(80,24) + self.terminal.set_pty(fd) + + self.framebuffer = self.builder.get_object("framebuffer_image") + + # find USB device + self.dev = usb.core.find(idVendor=0x0483, idProduct=0x5740) + if self.dev is None: + raise ValueError('Device not found') + + # detach kernel driver + if self.dev.is_kernel_driver_active(interface): + self.dev.detach_kernel_driver(interface) + + # claim interface + usb.util.claim_interface(self.dev, interface) + + # set FB debug alt setting + self.dev.set_interface_altsetting(interface, altsetting) + + #connect signals + signals = { + "on_execute_clicked" : self.execute_clicked, + "on_stop_clicked" : self.stop_clicked, + "on_top_window_destroy" : self.quit, + } + self.builder.connect_signals(signals) + self.window = self.builder.get_object("top_window") + + def execute_clicked(self, widget): + buf = self.buffer.get_text(self.buffer.get_start_iter(), self.buffer.get_end_iter()) + for l in buf.splitlines(): + if (l.strip()): + sleep(0.1) + self.terminal.feed_child(l+"\r\n") + self.terminal.feed_child("\r\n") + + def stop_clicked(self, widget): + self.terminal.feed_child("\x03") + + def update_fb(self): + img_size = 160*120*2 + # request snapshot + self.dev.ctrl_transfer(0x41, 8, 0, 2, None, 2000) + + # read framebuffer + buf = self.dev.read(0x83, img_size, interface, 5000) + + if len(buf)