Rose-Hulman Robotics Team

Changeset 218

Show
Ignore:
Timestamp:
09/28/08 20:51:26 (3 years ago)
Author:
mosttw
Message:

Extremely barebones GTK+ keyboard control

Location:
trunk/software/rb
Files:
2 added
1 removed
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/software/rb/core/event.py

    r200 r218  
    130130                        func(event) 
    131131                except Exception, e: 
    132                         if rbconfig.debug: 
     132                        import rbconfig 
     133                        if getattr(rbconfig, 'debug', False): 
    133134                                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) 
    136137        else: 
    137138                return False 
  • trunk/software/rb/gui/__init__.py

    r200 r218  
    2020__version__ = '0.01' 
    2121 
    22 import pygtk 
    23 pygtk.require("2.0") 
     22import os.path 
    2423 
     24import pygtk; pygtk.require("2.0") 
    2525import gtk 
    2626import gtk.glade 
    27 import gnome.ui 
    2827 
    2928import rbconfig 
     
    3231from rb.motor.command import Motor 
    3332 
    34  
    35 GLADE_FILE = 'rb/gui/gui-gnome.glade' 
    36 ROBOT_NAME = 'RATT' 
     33# Full path to the GUI definition file 
     34GTKBUILDER_FILE = os.path.join(os.path.dirname(__file__), 'barebones-keypad.gtk') 
    3735 
    3836 
     
    4341         
    4442        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') 
    4644         
    4745        lmotor = Motor(rbconfig.left_motor, rbconfig.left_motor_orient) 
    4846        rmotor = Motor(rbconfig.right_motor, rbconfig.right_motor_orient) 
    4947         
    50         gnome.init("robotcontrol", __version__) 
    51         rbgui = RobotGUI(motors) 
     48        kpgui = KeypadGUI(lmotor, rmotor) 
    5249        gtk.main() 
    5350 
    5451 
    55 class RobotGUI(object): 
     52class KeypadGUI(object): 
    5653        ''' 
    57         A GUI for controlling the robot. 
     54        A GUI for simplistic motor control. 
    5855        ''' 
    5956         
     
    6259                self.rmotor = right_motor 
    6360                 
    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) 
    6664                 
    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() 
    7171                 
     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 
    7275                 
    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() 
    8876                log_debug("gui: Done creating window") 
    8977         
    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") 
    10081         
    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 
    10288                self.lmotor.stop() 
    10389                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