openmv/usr/openmv-ide.py
2014-03-07 22:11:49 +02:00

187 lines
6.0 KiB
Python
Executable File

#!/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
import openmv
from os.path import expanduser
ex_source =\
'''import sensor, imlib
while (True):
image = sensor.snapshot()
'''
def rgb2hsv(r, g, b):
r, g, b = r/255.0, g/255.0, b/255.0
mx = max(r, g, b)
mn = min(r, g, b)
df = mx-mn
if mx == mn:
h = 0
elif mx == r:
h = (60 * ((g-b)/df) + 360) % 360
elif mx == g:
h = (60 * ((b-r)/df) + 120) % 360
elif mx == b:
h = (60 * ((r-g)/df) + 240) % 360
if mx == 0:
s = 0
else:
s = df/mx
v = mx
return int(h), int(s*100), int(v*100)
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)
self.buffer.connect("changed", self.text_changed)
sourceview.set_buffer(self.buffer)
self.terminal = self.builder.get_object('terminal')
self.fd = os.open("/dev/ttyACM0", os.O_RDWR)
self.terminal.set_size(80,24)
self.terminal.set_pty(self.fd)
self.framebuffer = self.builder.get_object("framebuffer_image")
# status bar stuff
self.statusbar = self.builder.get_object("statusbar")
self.statusbar_ctx = self.statusbar.get_context_id("default")
#save toolbutton
self.save_button = self.builder.get_object('save_file_toolbutton')
self.save_button.set_sensitive(False)
#connect signals
signals = {
"on_top_window_destroy" : self.quit,
"on_execute_clicked" : self.execute_clicked,
"on_stop_clicked" : self.stop_clicked,
"on_motion_notify" : self.motion_notify,
"on_button_press" : self.button_pressed,
"on_open_file" : self.open_file,
"on_save_file" : self.save_file,
"on_save_file_as" : self.save_file_as,
}
self.builder.connect_signals(signals)
self.window = self.builder.get_object("top_window")
self.file_path = None
# init openmv
openmv.init()
def execute_clicked(self, widget):
buf = self.buffer.get_text(self.buffer.get_start_iter(), self.buffer.get_end_iter())
# interrupt any running code
openmv.stop_script()
sleep(0.1)
# exec script
openmv.exec_script(buf)
def stop_clicked(self, widget):
openmv.stop_script();
def motion_notify(self, widget, event):
x = int(event.x)
y = int(event.y)
pixbuf = self.framebuffer.get_pixbuf()
if x < pixbuf.get_width() and y < pixbuf.get_height():
pixel = pixbuf.get_pixels_array()[y][x]
rgb = "(%d, %d, %d)" %(pixel[0], pixel[1], pixel[2])
self.statusbar.pop(self.statusbar_ctx)
self.statusbar.push(self.statusbar_ctx, rgb)
def button_pressed(self, widget, event):
x = int(event.x)
y = int(event.y)
pixbuf = self.framebuffer.get_pixbuf()
if x < pixbuf.get_width() and y < pixbuf.get_height():
pixel = pixbuf.get_pixels_array()[y][x]
print (pixel[0], pixel[1], pixel[2])
def update_fb(self):
# read framebuffer
fb = openmv.dump_fb()
# convert to RGB888 and blit
pixbuf = gtk.gdk.pixbuf_new_from_array(fb[2].reshape((fb[1], fb[0], 3)), gtk.gdk.COLORSPACE_RGB, 8)
self.framebuffer.set_from_pixbuf(pixbuf)
gobject.idle_add(omvgtk.update_fb);
def open_file(self, widget):
dialog = gtk.FileChooserDialog(title=None,action=gtk.FILE_CHOOSER_ACTION_OPEN,
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)
dialog.set_current_folder("./examples/")
filter = gtk.FileFilter()
filter.set_name("python")
filter.add_pattern("*.py")
dialog.add_filter(filter)
if dialog.run() == gtk.RESPONSE_OK:
with open(dialog.get_filename(), "r") as file:
self.buffer.set_text(file.read())
self.file_path=dialog.get_filename()
self.save_button.set_sensitive(False)
dialog.destroy()
def save_file(self, widget):
with open(self.file_path, "w") as file:
file.write(self.buffer.get_text(self.buffer.get_start_iter(), self.buffer.get_end_iter()))
def save_file_as(self, widget):
dialog = gtk.FileChooserDialog(title=None,action=gtk.FILE_CHOOSER_ACTION_SAVE,
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)
dialog.set_current_folder("./examples/")
filter = gtk.FileFilter()
filter.set_name("python")
filter.add_pattern("*.py")
dialog.add_filter(filter)
if dialog.run() == gtk.RESPONSE_OK:
with open(dialog.get_filename(), "w") as file:
file.write(self.buffer.get_text(self.buffer.get_start_iter(), self.buffer.get_end_iter()))
dialog.destroy()
def text_changed(self, widget):
self.save_button.set_sensitive(True)
def quit(self, widget):
os.close(self.fd)
openmv.release()
sys.exit(0)
if __name__ == "__main__":
omvgtk = OMVGtk()
omvgtk.window.show_all()
gobject.idle_add(omvgtk.update_fb);
gtk.main()