00001
00002
00003 """
00004 ArbotiX Terminal - command line terminal to interact with an ArbotiX
00005 Copyright (c) 2008-2011 Vanadium Labs LLC. All right reserved.
00006
00007 Redistribution and use in source and binary forms, with or without
00008 modification, are permitted provided that the following conditions are met:
00009 * Redistributions of source code must retain the above copyright
00010 notice, this list of conditions and the following disclaimer.
00011 * Redistributions in binary form must reproduce the above copyright
00012 notice, this list of conditions and the following disclaimer in the
00013 documentation and/or other materials provided with the distribution.
00014 * Neither the name of Vanadium Labs LLC nor the names of its
00015 contributors may be used to endorse or promote products derived
00016 from this software without specific prior written permission.
00017
00018 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
00019 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00020 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00021 DISCLAIMED. IN NO EVENT SHALL VANADIUM LABS BE LIABLE FOR ANY DIRECT, INDIRECT,
00022 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00023 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
00024 OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00025 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
00026 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
00027 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00028 """
00029
00030 import roslib; roslib.load_manifest('arbotix_python')
00031 import sys
00032
00033 from arbotix_python.arbotix import ArbotiX
00034 from arbotix_python.ax12 import *
00035
00036
00037 help = ["ArbotiX Terminal V0.1",
00038 "",
00039 "valid commands:",
00040 " ls [i b]- list the servos found on the bus. Optional parameters: i - highest ID to query, b - baudrate to query at.",
00041 " mv id id2 - rename any servo with ID=id, to id2",
00042 " baud b - set baud rate of bus to b",
00043 " get param id - get a parameter value from a servo",
00044 " set param id val - set parameter on servo ID=id to val",
00045 "",
00046 "valid parameters",
00047 " pos - current position of a servo, 0-1023",
00048 " baud - baud rate",
00049 " temp - current temperature, degrees C, READ ONLY"]
00050
00051
00052 class Terminal(ArbotiX):
00053 OKBLUE = '\033[94m'
00054 OKGREEN = '\033[92m'
00055 WARNING = '\033[93m'
00056 FAIL = '\033[91m'
00057 ENDC = '\033[0m'
00058
00059 def __init__(self, port = "/dev/ttyUSB0", baud = 115200):
00060
00061 ArbotiX.__init__(self, port, baud)
00062 print "ArbotiX Terminal --- Version 0.1"
00063 print "Copyright 2011 Vanadium Labs LLC"
00064
00065
00066 while True:
00067 print ">> ",
00068 kmd = raw_input().split(" ")
00069 try:
00070 if kmd[0] == "help":
00071 if len(kmd) > 1:
00072 if kmd[1] == "ls":
00073 print help[3]
00074 elif kmd[1] == "mv":
00075 print help[4]
00076 elif kmd[1] == "baud":
00077 print help[5]
00078 elif kmd[1] == "get":
00079 print help[6]
00080 elif kmd[1] == "set":
00081 print help[7]
00082 else:
00083 print "help: unrecognized command"
00084 else:
00085 for h in help:
00086 print h
00087
00088 elif kmd[0] == "ls":
00089 self._ser.timeout = 0.25
00090 if len(kmd) > 2:
00091 self.write(253, P_BAUD_RATE, [self.convertBaud(int(kmd[1]))])
00092 self.query()
00093 self.query()
00094
00095 elif kmd[0] == "mv":
00096 if self.write( int(kmd[1]), P_ID, [int(kmd[2]),] ) == 0:
00097 print self.OKBLUE+"OK"+self.ENDC
00098
00099 elif kmd[0] == "baud":
00100 self.write(253, P_BAUD_RATE, [self.convertBaud(int(kmd[1]))])
00101 print self.OKBLUE+"OK"+self.ENDC
00102
00103 elif kmd[0] == "set":
00104 if kmd[1] == "baud":
00105 self.write( int(kmd[2]), P_BAUD_RATE, [self.convertBaud(int(kmd[3]))] )
00106 print self.OKBLUE+"OK"+self.ENDC
00107 elif kmd[1] == "pos" or kmd[1] == "position":
00108 self.setPosition( int(kmd[2]), int(kmd[3]) )
00109 print self.OKBLUE+"OK"+self.ENDC
00110
00111 elif kmd[0] == "get":
00112 if kmd[1] == "temp":
00113 value = self.getTemperature(int(kmd[2]))
00114 if value >= 60 or value < 0:
00115 print self.FAIL+str(value)+self.ENDC
00116 elif value > 40:
00117 print self.WARNING+str(value)+self.ENDC
00118 else:
00119 print self.OKGREEN+str(value)+self.ENDC
00120 elif kmd[1] == "pos" or kmd[1] == "position":
00121 value = self.getPosition(int(kmd[2]))
00122 if value >= 0:
00123 print self.OKGREEN+str(value)+self.ENDC
00124 else:
00125 print self.FAIL+str(value)+self.ENDC
00126
00127 except Exception as e:
00128 print "error...", e
00129
00130 def query(self, max_id = 18, baud = 1000000):
00131 k = 0
00132 for i in range(max_id):
00133 if self.getPosition(i+1) != -1:
00134 if k > 8:
00135 k = 0
00136 print ""
00137 print repr(i+1).rjust(4),
00138 k = k + 1
00139 else:
00140 if k > 8:
00141 k = 0
00142 print ""
00143 print "....",
00144 k = k + 1
00145 sys.stdout.flush()
00146 print ""
00147
00148 def convertBaud(self, b):
00149 if b == 500000:
00150 return 3
00151 elif b == 400000:
00152 return 4
00153 elif b == 250000:
00154 return 7
00155 elif b == 200000:
00156 return 9
00157 elif b == 115200:
00158 return 16
00159 elif b == 57600:
00160 return 34
00161 elif b == 19200:
00162 return 103
00163 elif b == 9600:
00164 return 207
00165 else:
00166 return 1
00167
00168
00169 if __name__ == "__main__":
00170 try:
00171 if len(sys.argv) > 2:
00172 t = Terminal(sys.argv[1], int(sys.argv[2]))
00173 elif len(sys.argv) > 1:
00174 t = Terminal(sys.argv[1])
00175 else:
00176 t = Terminal()
00177 except KeyboardInterrupt:
00178 print "\nExiting..."
00179
00180