Example #1
0
 def __init__(self):     
   self.save_file = False
   self.screen_sink = None
   self.screen_set_xid = False
   
   try:
       self.app = hildon.Program.get_instance()    
   except:
       self.app = hildon.Program()

   try:
       gtk.set_application_name("C3 Prototype v0.3")
   except:
       pass

   # This is the brilliant GTK+ Glade builder that lets me keep the entire UI
   # code in a .glade (xml) file to be loaded dynamically.
   builder = gtk.Builder()
   builder.add_from_file("sensor.glade") 

   # Get variables to each of the ui widgets we will need to work with
   self.window = builder.get_object("windowMain")
   self.sensor1Data = builder.get_object("labelSensor1Data")
   self.sensor2Data = builder.get_object("labelSensor2Data")
   self.labelCounterData = builder.get_object("labelCounterData")
   self.labelDebugData = builder.get_object("labelDebugData")
   self.labelLatData = builder.get_object("labelLatData")
   self.labelLonData = builder.get_object("labelLonData")
   self.labelDatetime = builder.get_object("labelDatetime")
   self.screen = builder.get_object("screen")
   self.buttonReport = builder.get_object("buttonReport")
   
   self.screen.set_size_request(640, 350)
   self.screen.add_events(gtk.gdk.BUTTON_PRESS_MASK)
   self.screen.connect("expose-event", self.expose_cb, self.screen_sink)
   #self.screen.connect("button_press_event", self.on_report_click)


   # Create the belt object to handle data communication
   self.belt = BeltConnection()

   # Initialize tracking variables
   self.sensor1 = 0
   self.sensor2 = 0
   
   self.counter = 0

   # Connect signals exposed in the glade file to local functions
   signals = { "on_windowMain_destroy_event" : self.on_window_destroy,
               "on_windowMain_delete_event" : self.on_window_delete, 
               "on_buttonBtConnect_clicked" : self.on_connect_click,
               "on_buttonGpsConnect_clicked" : self.on_GpsConnect_click,
               "on_buttonReport_clicked": self.on_report_click
               }
   builder.connect_signals(signals)
   
   if has_location:
       self.control = location.GPSDControl.get_default()
       
       self.device = location.GPSDevice()
       self.control.set_properties(preferred_method=location.METHOD_USER_SELECTED,
                              preferred_interval=location.INTERVAL_DEFAULT)
        
       self.control.connect("error-verbose", self.on_error, self)
       self.device.connect("changed", self.on_changed, self.control)
       self.control.connect("gpsd-stopped", self.on_stop, self)
       
   self.pipeline = gst.Pipeline("c3_camera_pipeline")
   self.labelDebugData.set_text("try")
   self.create_pipeline()
Example #2
0
class HapticGuideUI:
 # A thread lock, in case needed
 lock = threading.Lock()
 # A frequency of the loop call (in milliseconds)
 TIMEOUT = 500

 def on_window_destroy(self, widget, data=None):
   self.belt.disconnect()
   gtk.main_quit()

 def on_window_delete(self, widget, data=None):
   self.belt.disconnect()
   gtk.main_quit()
   return False

 def on_connect_click(self, widget, data=None):
   self.labelDebugData.set_text("BT Connecting...")
   if self.belt.isConnected == False:
     #self.belt.connect()
     gobject.idle_add(self.belt.connect)
     
     
 def on_GpsConnect_click(self, widget, data=None): 
   self.labelDebugData.set_text("GPS Connecting...") 
   gobject.idle_add(self.start_location, self.control)
   self.labelDebugData.set_text("GPS Connected") 
   
 def on_report_click(self, dummy1, dummy2=None):
    self.labelDebugData.set_text("Clicked")
    self.save_file = True
    return True



 def loop(self):
   # Get latest heading update from belt manager and display update if different from prev
   self.sensor1 = self.belt.sensors[0]
   self.sensor2 = self.belt.sensors[1]
   
   self.sensor1Data.set_text('%d' %(self.sensor1))  
   self.sensor2Data.set_text('%d' %(self.sensor2))
   self.labelCounterData.set_text('%d' %(self.counter))
   
   self.counter+=1
   return True

 def __init__(self):     
   self.save_file = False
   self.screen_sink = None
   self.screen_set_xid = False
   
   try:
       self.app = hildon.Program.get_instance()    
   except:
       self.app = hildon.Program()

   try:
       gtk.set_application_name("C3 Prototype v0.3")
   except:
       pass

   # This is the brilliant GTK+ Glade builder that lets me keep the entire UI
   # code in a .glade (xml) file to be loaded dynamically.
   builder = gtk.Builder()
   builder.add_from_file("sensor.glade") 

   # Get variables to each of the ui widgets we will need to work with
   self.window = builder.get_object("windowMain")
   self.sensor1Data = builder.get_object("labelSensor1Data")
   self.sensor2Data = builder.get_object("labelSensor2Data")
   self.labelCounterData = builder.get_object("labelCounterData")
   self.labelDebugData = builder.get_object("labelDebugData")
   self.labelLatData = builder.get_object("labelLatData")
   self.labelLonData = builder.get_object("labelLonData")
   self.labelDatetime = builder.get_object("labelDatetime")
   self.screen = builder.get_object("screen")
   self.buttonReport = builder.get_object("buttonReport")
   
   self.screen.set_size_request(640, 350)
   self.screen.add_events(gtk.gdk.BUTTON_PRESS_MASK)
   self.screen.connect("expose-event", self.expose_cb, self.screen_sink)
   #self.screen.connect("button_press_event", self.on_report_click)


   # Create the belt object to handle data communication
   self.belt = BeltConnection()

   # Initialize tracking variables
   self.sensor1 = 0
   self.sensor2 = 0
   
   self.counter = 0

   # Connect signals exposed in the glade file to local functions
   signals = { "on_windowMain_destroy_event" : self.on_window_destroy,
               "on_windowMain_delete_event" : self.on_window_delete, 
               "on_buttonBtConnect_clicked" : self.on_connect_click,
               "on_buttonGpsConnect_clicked" : self.on_GpsConnect_click,
               "on_buttonReport_clicked": self.on_report_click
               }
   builder.connect_signals(signals)
   
   if has_location:
       self.control = location.GPSDControl.get_default()
       
       self.device = location.GPSDevice()
       self.control.set_properties(preferred_method=location.METHOD_USER_SELECTED,
                              preferred_interval=location.INTERVAL_DEFAULT)
        
       self.control.connect("error-verbose", self.on_error, self)
       self.device.connect("changed", self.on_changed, self.control)
       self.control.connect("gpsd-stopped", self.on_stop, self)
       
   self.pipeline = gst.Pipeline("c3_camera_pipeline")
   self.labelDebugData.set_text("try")
   self.create_pipeline()

 def expose_cb(self, dummy1, dummy2, dummy3):
    #self.labelDebugData.set_text("Expose event")
    print dummy1
    print dummy1.has_screen()
    print dir(dummy1.get_screen().get_display())
    #self.buffer_cb(self.pad, dummy1.get_screen())
    self.screen_sink.set_xwindow_id(dummy1.window.xid)
    self.screen_set_xid = True
    
 def buffer_cb(self, pad, buffer):
    self.labelDebugData.set_text("buffer_cb")
    if self.save_file:
        self.labelDebugData.set_text("buffer callback")
        self.pipeline.add(self.image_sink)
        self.image_queue.link(self.image_sink)
#        width = 640
#        height = 480
#
#        size = 3 * width * height 
#
#        if buffer.size < size:
#            data = buffer.data + chr(0) * (size-buffer.size)
#        else:
#            data = buffer.data
#
#        self.labelDebugData.set_text("saving buffer")
#        pb = gtk.gdk.pixbuf_new_from_data(data, gtk.gdk.COLORSPACE_RGB, False, 8, width, height, width * 3)
#        pb.save("/home/user/MyDocs/test.jpg", "jpeg", {"quality":"100"})

#        pb2 = pb.scale_simple(120,90,gtk.gdk.INTERP_NEAREST)
#
#        self.labelDebugData.set_text("saving buffer again")
#        pb2.save("/home/user/text_thumbnail.jpg", "jpeg", {"quality":"60"})

        #thumb.clear()
        #thumb.set_from_file("test.jpg")
        #print thumb

        self.save_file = False

    return True

 def on_message(self,bus,message):
    t = message.type
    if t == gst.MESSAGE_EOS:
        self.image_queue.unlink(self.image_sink)
        self.pipeline.remove(self.image_sink)
        self.labelDebugData.set_text("image captured, pipe cut")
    elif t == gst.MESSAGE_ERROR:
        err, debug = message.parse_error()
        print "Error: %s" % err, debug
        self.image_queue.unlink(self.image_sink)
        self.pipeline.remove(self.image_sink)

 def create_pipeline(self):
    self.labelDebugData.set_text("start pipeline")
    src = gst.element_factory_make("v4l2camsrc", "src") 
    src.set_property ("device", "/dev/video0")
    #check dev for video call if this doesn't work
    #src.set_property ("always-copy", True)
    #src.set_property ("width", 640)
    #src.set_property ("height", 480)
    #src.set_property ("framerate", 30)
    #src = gst.element_factory_make("v4l2camsrc", "src")
    self.pipeline.add(src)
    self.bus = self.pipeline.get_bus()
    self.bus.add_signal_watch()
    self.bus.connect("message", self.on_message)
        
    screen_csp = gst.element_factory_make("ffmpegcolorspace", "screen_csp")
    self.pipeline.add(screen_csp)
    
    screen_caps = gst.element_factory_make("capsfilter", "screen_caps")
    # Alternate caps to run outside Internet Tablet (e.g. in a PC with webcam)
    screen_caps.set_property('caps', gst.caps_from_string("video/x-raw-yuv,width=640,height=480"))
    #screen_caps.set_property('caps', gst.caps_from_string("video/x-raw-yuv,width=640,height=480,bpp=24,depth=24,framerate=30/1"))
    
    self.pipeline.add(screen_caps)
    
    
    image_csp = gst.element_factory_make("ffmpegcolorspace", "image_csp")
    self.pipeline.add(image_csp)
    
    self.image_caps = gst.element_factory_make("capsfilter", "image_caps")
    # Alternate caps to run outside Internet Tablet (e.g. in a PC with webcam)
    self.image_caps.set_property('caps', gst.caps_from_string("video/x-raw-yuv,width=640,height=480"))
    self.pipeline.add(self.image_caps)
    
    
    self.tee = gst.element_factory_make("tee", "tee")
    self.pipeline.add(self.tee)
    
    screen_queue = gst.element_factory_make("queue", "screen_queue")
    self.pipeline.add(screen_queue)
    
    self.screen_sink = gst.element_factory_make("xvimagesink", "screen_sink")
    self.pipeline.add(self.screen_sink)
    
    self.image_encode = gst.element_factory_make("jpegenc", "image_encode")
    self.pipeline.add(self.image_encode)
    
    self.image_queue = gst.element_factory_make("queue", "image_queue")
    self.pipeline.add(self.image_queue)
    
    self.image_sink = gst.element_factory_make("filesink", "image_sink")
    self.image_sink.set_property("location","/home/user/MyDocs/test.jpg")
    #self.pipeline.add(image_sink)
    
    self.pad = self.image_sink.get_pad('sink')
    self.pad.add_buffer_probe(self.buffer_cb)
    
    gst.element_link_many(src, self.tee, screen_caps, screen_csp, screen_queue, self.screen_sink)
    #gst.element_link_many(src, screen_caps, tee, screen_queue, sink)
    gst.element_link_many(self.tee, self.image_caps, image_csp, self.image_queue)
    
    self.window.show_all()
    
    self.pipeline.set_state(gst.STATE_PLAYING)
    
    self.labelDebugData.set_text("end pipeline")
   


 def on_error(self, control, error, data):
    print "location error: %d... quitting" % error
    self.labelDebugData.set_text("location error: %d... quitting" % error)
    self.belt.disconnect()
    gtk.main_quit()

 def on_changed(self, device, data):
    if not device:
        return
    if device.fix:
        if device.fix[1] & location.GPS_DEVICE_LATLONG_SET:
            #print "lat = %f, long = %f" % device.fix[4:6]
            #print device.fix
            self.labelLatData.set_text("%f" % device.fix[4])
            self.labelLonData.set_text("%f" % device.fix[5])
            self.labelDatetime.set_text("%s" % device.fix[2])

 def on_stop(self,control, data):
    print "quitting"
    self.labelDebugData.set_text("quitting..")
    self.belt.disconnect()
    gtk.main_quit()

 def start_location(self, data):
    data.start()
    return False

  

 def show(self):
   self.window.show_all()
   # Add a recurring timeout call so we can continuously update headingsq
   gobject.timeout_add(self.TIMEOUT, self.loop)