Rose-Hulman Robotics Team

Changeset 424

Show
Ignore:
Timestamp:
02/25/09 16:16:59 (3 years ago)
Author:
mosttw
Message:

Tweaks

Location:
trunk/software/rb
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/software/rb/drive.py

    r422 r424  
    9191                corresponding data. If data is None, it will not be set 
    9292                ''' 
    93                 if lt_data == None: 
     93                if lt_data is None: 
    9494                        l = None 
    9595                else: 
    9696                        l = self.left._send(type,  *lt_data) 
    97                 if rt_data == None: 
     97                if rt_data is None: 
    9898                        r = None 
    9999                else: 
     
    112112                ''' 
    113113                #print "Drive.setspeed: %f, %f" % (left, right) 
    114                 self.left.target  = clip(left,  -1.0, 1.0)*MAX 
    115                 self.right.target = clip(right, -1.0, 1.0)*MAX 
     114                self.left.target  = clip(left,  -1.0, 1.0) * MAX 
     115                self.right.target = clip(right, -1.0, 1.0) * MAX 
    116116 
    117117        def getspeed(self): 
    118                 return (float(self.left._send( "getspeed")*50*60/256) / MAX, 
    119                         float(self.right._send("getspeed")*50*60/256) / MAX) 
     118                return (self.left.current, self.right.current) 
    120119 
    121120        def disable(self):     return self._split("disable", (), ()) 
     
    137136                self._port_name = port 
    138137                self.running    = True 
    139                 self.target     = 0 # Speed the motor coltrollers should be at 
     138                self.target     = 0 # Speed the motor controllers should be at 
     139                self.current    = 0 # Latest reported speed of the motors 
    140140                self._port      = Serial(port, 19200, timeout=.5) 
    141141                sleep(1) 
    142                 #print "wrote: ", self._port.write(chr(14) + chr(0)) 
    143                 #print "read: ", len(self._port.read(4)) 
    144142                self._port_lock = Lock() 
    145143                start_new_thread(self._main, ()) 
     
    150148                        #print "Motor._main: stepping" 
    151149                        cur = self._send("getspeed") 
    152                         if cur != None: 
     150                        if cur is not None: 
    153151                                #print "updating speed, cur=%d target=%d" % (cur, self.target) 
    154152                                #inc = min(0.05*MAX, abs(self.target - cur)) 
     
    158156                                #       self._send("setspeed", cur - inc) 
    159157                                #else: 
     158                                self.current = (cur*50*60 / 256.0) / MAX 
    160159                                self._send("setspeed", self.target) # Ping! 
    161160                        else: 
    162161                                print "Motor._main: timeout getting speed" 
    163                         sleep(.1) 
     162                        sleep(.05) 
    164163                print "Motor._main: exiting" 
    165164                self._send("setspeed", 0) 
     
    167166        def _send(self, type, *t_data): 
    168167                self._port_lock.acquire() 
    169  
    170                 t, r = messages[type] 
    171  
    172                 # Transmit query 
    173                 t_st = struct.pack(t['fmt'], *t_data) 
    174                 #print "Motor(%s)._send: %s (%d) - %d bytes" % \ 
    175                 #       (self._port_name, type, t['op'], len(t_st)) 
    176                 ln = self._port.write(chr(t['op'])) 
    177                 self._port.write(chr(len(t_st))) 
    178                 self._port.write(t_st) 
    179                  
    180                 # Recieve response 
    181                 r_op = self._port.read(1) 
    182                 if len(r_op) != 1: 
    183                         print "Motor._send: Timeout reading `r_type' from motor controller" 
    184                 elif r_op != chr(r['op']): 
    185                         print "Motor._send: Recieved incorrect `r_type' (%d) from motor controller" % ord(r_op) 
    186  
    187                 r_length = self._port.read(1) 
    188                 if len(r_length) != 1: 
    189                         print "Motor._send: Timeout reading `r_length' from motor controller" 
     168                try: 
     169                        t, r = messages[type] 
     170 
     171                        # Transmit query 
     172                        t_st = struct.pack(t['fmt'], *t_data) 
     173                        #print "Motor(%s)._send: %s (%d) - %d bytes" % \ 
     174                        #       (self._port_name, type, t['op'], len(t_st)) 
     175                        ln = self._port.write(chr(t['op'])) 
     176                        self._port.write(chr(len(t_st))) 
     177                        self._port.write(t_st) 
     178                         
     179                        # Recieve response 
     180                        r_op = self._port.read(1) 
     181                        if len(r_op) != 1: 
     182                                print "Motor._send: Timeout reading `r_type' from motor controller" 
     183                        elif r_op != chr(r['op']): 
     184                                print "Motor._send: Recieved incorrect `r_type' (%d) from motor controller" % ord(r_op) 
     185 
     186                        r_length = self._port.read(1) 
     187                        if len(r_length) != 1: 
     188                                print "Motor._send: Timeout reading `r_length' from motor controller" 
     189                                return None 
     190                        r_length = ord(r_length) 
     191                        if r_length != struct.calcsize(r['fmt']): 
     192                                print "Motor._send: Recieved incorrect `r_length' (%d) from motor controller" % r_length 
     193 
     194                        if r_length == 0: 
     195                                return None 
     196 
     197                        r_st = self._port.read(r_length) 
     198                        if len(r_st) != r_length: 
     199                                print "Motor._send: Timeout reading `r_data' from motor controller" 
     200                        r_data = struct.unpack(r['fmt'], r_st) 
     201 
     202                        if len(r_data) == 1: 
     203                                # struct's return format is annoying 
     204                                return r_data[0] 
     205                        return r_data 
     206                finally: 
    190207                        self._port_lock.release() 
    191                         return 
    192                 r_length = ord(r_length) 
    193                 if r_length != struct.calcsize(r['fmt']): 
    194                         print "Motor._send: Recieved incorrect `r_length' (%d) from motor controller" % r_length 
    195  
    196                 if r_length == 0: 
    197                         # No need to recieve/unpack structure 
    198                         self._port_lock.release() 
    199                         return 
    200  
    201                  
    202                 r_st = self._port.read(r_length) 
    203                 if len(r_st) != r_length: 
    204                         print "Motor._send: Timeout reading `r_data' from motor controller" 
    205                 r_data = struct.unpack(r['fmt'], r_st) 
    206  
    207                 if (len(r_data) == 1): 
    208                         # struct's return format is annoying 
    209                         self._port_lock.release() 
    210                         return r_data[0] 
    211  
    212                 self._port_lock.release() 
    213                 return r_data 
    214208 
    215209 
     
    229223                self.left.target = left 
    230224                self.right.target = right 
     225         
     226        def getspeed(self): 
     227                return (self.left.target, self.right.target) 
    231228 
    232229 
     
    234231        def __init__(self, *args, **kwargs): 
    235232                self.target = 0 
     233         
    236234        def _send(type, *t_data): 
    237                 print "sending %s - %s" % (type, repr(t_data)) 
     235                print "FakeMotor sending %s - %s" % (type, repr(t_data)) 
     236         
     237        current = property(lambda s: s.target) 
  • trunk/software/rb/gui/gui.py

    r422 r424  
    99from rb.gui.analog   import AnalogWidget 
    1010 
     11import os.path 
     12 
    1113# Full path to the GUI definition file 
    12 import os.path 
    1314GTKBUILDER_FILE = os.path.join(os.path.dirname(__file__), 'gui.xml') 
    1415 
     
    1920         
    2021        def __init__(self): 
    21                 # TODO: move analog/digital to other files 
    2222                Controller.__init__(self) 
    2323 
     
    6161                # Switch tabs 
    6262                elif event.keyval == gtk.keysyms.Tab: 
    63                         nb.set_current_page(not tab) 
    64  
     63                        nb.set_current_page(not tab) # FIXME: make this robust 
    6564 
    6665                # Set motor speeds 
     
    6867                        lo, ro = self.arrow_keys_map[event.keyval] 
    6968                        self.set_speed(self.drive.left.target+lo, 
    70                                        self.drive.right.target+ro) 
     69                                                        self.drive.right.target+ro) 
    7170 
    7271                # Key not found 
     
    7473                        return False 
    7574 
    76                 # Stop event propigation 
     75                # Stop event propagation 
    7776                return True 
    7877