Changeset 218
- Timestamp:
- 09/28/08 20:51:26 (3 years ago)
- Location:
- trunk/software/rb
- Files:
-
- 2 added
- 1 removed
- 2 modified
-
core/event.py (modified) (1 diff)
-
gui/__init__.py (modified) (4 diffs)
-
gui/barebones-keypad.glade (added)
-
gui/barebones-keypad.gtk (added)
-
gui/gui-gnome.glade (deleted)
Legend:
- Unmodified
- Added
- Removed
-
trunk/software/rb/core/event.py
r200 r218 130 130 func(event) 131 131 except Exception, e: 132 if rbconfig.debug: 132 import rbconfig 133 if getattr(rbconfig, 'debug', False): 133 134 raise e # For debugging 134 log_error("Callback function %r for %r threw an error: %r" %135 (func, event, e), callback=func, event=event)135 #~ log_error("Callback function %r for %r threw an error: %r" % 136 #~ (func, event, e), callback=func, event=event) 136 137 else: 137 138 return False -
trunk/software/rb/gui/__init__.py
r200 r218 20 20 __version__ = '0.01' 21 21 22 import pygtk 23 pygtk.require("2.0") 22 import os.path 24 23 24 import pygtk; pygtk.require("2.0") 25 25 import gtk 26 26 import gtk.glade 27 import gnome.ui28 27 29 28 import rbconfig … … 32 31 from rb.motor.command import Motor 33 32 34 35 GLADE_FILE = 'rb/gui/gui-gnome.glade' 36 ROBOT_NAME = 'RATT' 33 # Full path to the GUI definition file 34 GTKBUILDER_FILE = os.path.join(os.path.dirname(__file__), 'barebones-keypad.gtk') 37 35 38 36 … … 43 41 44 42 require('rb.motor.motor_controller.serial_motor_controller', '/dev/ttyS0') 45 require('rb.motor. utils.motor_command_relay')43 require('rb.motor.command.motor_command_relay') 46 44 47 45 lmotor = Motor(rbconfig.left_motor, rbconfig.left_motor_orient) 48 46 rmotor = Motor(rbconfig.right_motor, rbconfig.right_motor_orient) 49 47 50 gnome.init("robotcontrol", __version__) 51 rbgui = RobotGUI(motors) 48 kpgui = KeypadGUI(lmotor, rmotor) 52 49 gtk.main() 53 50 54 51 55 class RobotGUI(object):52 class KeypadGUI(object): 56 53 ''' 57 A GUI for controlling the robot.54 A GUI for simplistic motor control. 58 55 ''' 59 56 … … 62 59 self.rmotor = right_motor 63 60 64 self.tree = gtk.glade.XML(GLADE_FILE) 65 self.window = self.tree.get_widget("robotcontroller") 61 builder = gtk.Builder() 62 builder.add_from_file(GTKBUILDER_FILE) 63 builder.connect_signals(self) 66 64 67 self.lslider = self.tree.get_widget("left_motor") 68 self.rslider = self.tree.get_widget("right_motor") 69 #self.lspeed = self.lslider.get_value() 70 #self.rspeed = self.rslider.get_value() 65 self.window = builder.get_object('window') 66 self.buttons = map(builder.get_object, [ 67 "stopbutton", "forwardbutton", "reversebutton", 68 "leftbutton", "rightbutton" 69 ]) 70 self.window.show() 71 71 72 # Whether the toggle state of the set of buttons is currently being updated 73 # Used to distinguish between user-activated toggling and that performed by `toggle_only()`. 74 self.updating_set = False 72 75 73 connections = {74 'on_rbwindow_destroy': gtk.main_quit,75 'on_forward_button_activate': lambda: self.set_speeds(255, 255),76 'on_stop_button_activate': self.stop,77 'on_backward_button_activate': lambda: self.set_speeds(-255, -255),78 'on_left_forward_activate': lambda: self.set_speeds(left=255),79 'on_right_forward_activate': lambda: self.set_speeds(right=255),80 'on_left_backward_activate': lambda: self.set_speeds(left=-255),81 'on_right_backward_activate': lambda: self.set_speeds(right=-255),82 }83 self.tree.signal_autoconnect(connections)84 85 self.set_speeds(0, 0)86 87 self.window.show()88 76 log_debug("gui: Done creating window") 89 77 90 def set_speeds(self, left=None, right=None): 91 if left is not None: 92 log_info("gui: Setting left motor speed to %s" % left) 93 self.lslider.set_value(left) 94 self.lmotor.to_speed(left) 95 96 if right is not None: 97 log_info("gui: Setting right motor speed to %s" % right) 98 self.rslider.set_value(right) 99 self.rmotor.to_speed(right) 78 def on_window_destroy(self, widget, data=None): 79 gtk.main_quit() 80 log_debug("gui: Window closed") 100 81 101 def stop(self): 82 ## 83 # Handlers for the button set 84 85 def on_stopbutton_toggled(self, widget, data=None): 86 if not self.toggle_only(widget): 87 return 102 88 self.lmotor.stop() 103 89 self.rmotor.stop() 104 90 91 def on_forwardbutton_toggled(self, widget, data=None): 92 if not self.toggle_only(widget): 93 return 94 self.lmotor.forward() 95 self.rmotor.forward() 96 97 def on_reversebutton_toggled(self, widget, data=None): 98 if not self.toggle_only(widget): 99 return 100 self.lmotor.backward() 101 self.rmotor.backward() 102 103 def on_leftbutton_toggled(self, widget, data=None): 104 if not self.toggle_only(widget): 105 return 106 self.lmotor.backward() 107 self.rmotor.forward() 108 109 def on_rightbutton_toggled(self, widget, data=None): 110 if not self.toggle_only(widget): 111 return 112 self.lmotor.forward() 113 self.rmotor.backward() 114 self.toggle_only(widget) 115 116 def toggle_only(self, active_button): 117 ''' 118 Ensure that only `active_button` is active. Return ``False`` if it isn't, else ``True``. 119 ''' 120 if self.updating_set: 121 return False 122 if not active_button.get_active(): 123 # You can't disable the active button by hitting it again. Re-enable it. 124 active_button.set_active(True) 125 return False 126 self.updating_set = True 127 try: 128 for b in self.buttons: 129 if b != active_button and b.get_active(): 130 b.set_active(False) 131 finally: 132 self.updating_set = False 133 return True

