00001 __author__ = 'tom1231' 00002 from PyQt4.QtGui import * 00003 from BAL.Interface.DeviceFrame import DeviceFrame, EX_DEV, JOYSTICK 00004 from lxml.etree import SubElement 00005 00006 00007 class JoystickTeleop(DeviceFrame): 00008 def __init__(self, frame, data): 00009 DeviceFrame.__init__(self, EX_DEV, frame, data) 00010 00011 self._maxSpeed = '1' 00012 self._maxSpeedAngular = '0.5' 00013 self._boost = '2' 00014 self._topic = 'diff/command' 00015 self._pubHz = '20' 00016 self._joystickNum = '0' 00017 self._upAndDownAxis = '1' 00018 self._leftAndRightNum = '0' 00019 self._boostButton = '4' 00020 self._driveButton = '5' 00021 self._upAndDownAxisDir = False 00022 self._leftAndRightDir = False 00023 00024 def showDetails(self, items=None): 00025 self.maxSpeed = QLineEdit(self._maxSpeed) 00026 self.maxSpeedAngular = QLineEdit(self._maxSpeedAngular) 00027 self.boost = QLineEdit(self._boost) 00028 self.topic = QLineEdit(self._topic) 00029 self.pubHz = QLineEdit(self._pubHz) 00030 self.joystickNum = QLineEdit(self._joystickNum) 00031 self.upAndDownAxis = QLineEdit(self._upAndDownAxis) 00032 self.leftAndRightNum = QLineEdit(self._leftAndRightNum) 00033 self.boostButton = QLineEdit(self._boostButton) 00034 self.driveButton = QLineEdit(self._driveButton) 00035 self.upAndDownAxisDir = QCheckBox('') 00036 self.leftAndRightDir = QCheckBox('') 00037 00038 self.upAndDownAxisDir.setChecked(self._upAndDownAxisDir) 00039 self.leftAndRightDir.setChecked(self._leftAndRightDir) 00040 00041 self._frame.layout().addRow(QLabel('Publish Hz: '), self.pubHz) 00042 self._frame.layout().addRow(QLabel('Differential drive topic: '), self.topic) 00043 self._frame.layout().addRow(QLabel('Max Speed linear: '), self.maxSpeed) 00044 self._frame.layout().addRow(QLabel('Max Speed angular: '), self.maxSpeedAngular) 00045 self._frame.layout().addRow(QLabel('Scale: '), self.boost) 00046 self._frame.layout().addRow(QLabel('Joystick number: '), self.joystickNum) 00047 self._frame.layout().addRow(QLabel('Up and down axis number: '), self.upAndDownAxis) 00048 self._frame.layout().addRow(QLabel('Left and right axis number: '), self.leftAndRightNum) 00049 self._frame.layout().addRow(QLabel('Scale button number: '), self.boostButton) 00050 self._frame.layout().addRow(QLabel('Enable to drive button number: '), self.driveButton) 00051 self._frame.layout().addRow(QLabel('Reverse up and down axis: '), self.upAndDownAxisDir) 00052 self._frame.layout().addRow(QLabel('Reverse left and right axis: '), self.leftAndRightDir) 00053 00054 def add(self): 00055 if not self.nameIsValid(): 00056 error = QErrorMessage() 00057 error.setWindowTitle("Same name error") 00058 error.showMessage("Name already taken.") 00059 error.exec_() 00060 self._isValid = False 00061 return 00062 00063 self._maxSpeed = str(self.maxSpeed.text()) 00064 self._boost = str(self.boost.text()) 00065 self._topic = str(self.topic.text()) 00066 self._pubHz = str(self.pubHz.text()) 00067 self._maxSpeedAngular = str(self.maxSpeedAngular.text()) 00068 self._joystickNum = str(self.joystickNum.text()) 00069 self._upAndDownAxis = str(self.upAndDownAxis.text()) 00070 self._leftAndRightNum = str(self.leftAndRightNum.text()) 00071 self._boostButton = str(self.boostButton.text()) 00072 self._driveButton = str(self.driveButton.text()) 00073 self._upAndDownAxisDir = self.upAndDownAxisDir.isChecked() 00074 self._leftAndRightDir = self.leftAndRightDir.isChecked() 00075 self._isValid = True 00076 00077 def printDetails(self): 00078 self._frame.layout().addRow(QLabel('Publish Hz: '), QLabel(self._pubHz)) 00079 self._frame.layout().addRow(QLabel('Differential drive topic: '), QLabel(self._topic)) 00080 self._frame.layout().addRow(QLabel('Max Speed linear: '), QLabel(self._maxSpeed)) 00081 self._frame.layout().addRow(QLabel('Max Speed angular: '), QLabel(self._maxSpeedAngular)) 00082 self._frame.layout().addRow(QLabel('Scale: '), QLabel(self._boost)) 00083 self._frame.layout().addRow(QLabel('Joystick number: '), QLabel(self._joystickNum)) 00084 self._frame.layout().addRow(QLabel('Up and down axis number: '), QLabel(self._upAndDownAxis)) 00085 self._frame.layout().addRow(QLabel('Left and right axis number: '), QLabel(self._leftAndRightNum)) 00086 self._frame.layout().addRow(QLabel('Scale button number: '), QLabel(self._boostButton)) 00087 self._frame.layout().addRow(QLabel('Enable to drive button number: '), QLabel(self._driveButton)) 00088 00089 upAndDownDirText = 'Disable' 00090 leftAndRightDirText = 'Disable' 00091 00092 if self._upAndDownAxisDir: upAndDownDirText = 'Enable' 00093 if self._leftAndRightDir: leftAndRightDirText = 'Enable' 00094 00095 self._frame.layout().addRow(QLabel('Reverse up and down axis: '), QLabel(upAndDownDirText)) 00096 self._frame.layout().addRow(QLabel('Reverse left and right axis: '), QLabel(leftAndRightDirText)) 00097 00098 def getName(self): 00099 return 'joystick_teleop' 00100 00101 def toDict(self): 00102 data = dict() 00103 00104 data['type'] = JOYSTICK 00105 data['maxSpeed'] = self._maxSpeed 00106 data['boost'] = self._boost 00107 data['topic'] = self._topic 00108 data['maxSpeedAngular'] = self._maxSpeedAngular 00109 data['pubHz'] = self._pubHz 00110 data['joystickNum'] = self._joystickNum 00111 data['upAndDownAxis'] = self._upAndDownAxis 00112 data['leftAndRightNum'] = self._leftAndRightNum 00113 data['driveButton'] = self._driveButton 00114 data['upAndDownAxisDir'] = self._upAndDownAxisDir 00115 data['leftAndRightDir'] = self._leftAndRightDir 00116 data['boostButton'] = self._boostButton 00117 00118 return data 00119 00120 def fromDict(self, data): 00121 self._maxSpeed = data['maxSpeed'] 00122 self._boost = data['boost'] 00123 self._topic = data['topic'] 00124 00125 if data.has_key('maxSpeedAngular'): 00126 self._maxSpeedAngular = data['maxSpeedAngular'] 00127 if data.has_key('pubHz'): 00128 self._pubHz = data['pubHz'] 00129 if data.has_key('joystickNum'): 00130 self._joystickNum = data['joystickNum'] 00131 if data.has_key('upAndDownAxis'): 00132 self._upAndDownAxis = data['upAndDownAxis'] 00133 if data.has_key('leftAndRightNum'): 00134 self._leftAndRightNum = data['leftAndRightNum'] 00135 if data.has_key('driveButton'): 00136 self._driveButton = data['driveButton'] 00137 if data.has_key('upAndDownAxisDir'): 00138 self._upAndDownAxisDir = data['upAndDownAxisDir'] 00139 if data.has_key('leftAndRightDir'): 00140 self._leftAndRightDir = data['leftAndRightDir'] 00141 if data.has_key('boostButton'): 00142 self._boostButton = data['boostButton'] 00143 00144 def saveToFile(self, parent): 00145 element = SubElement(parent, 'include', { 00146 'file': '$(find ric_base_station)/launch/joystick_teleop.launch' 00147 }) 00148 00149 SubElement(element, 'arg', { 00150 'name': 'maxspeed', 00151 'value': self._maxSpeed 00152 }) 00153 00154 SubElement(element, 'arg', { 00155 'name': 'boost', 00156 'value': self._boost 00157 }) 00158 00159 SubElement(element, 'arg', { 00160 'name': 'topic', 00161 'value': self._topic 00162 }) 00163 00164 SubElement(element, 'arg', { 00165 'name': 'pubHz', 00166 'value': self._pubHz 00167 }) 00168 00169 SubElement(element, 'arg', { 00170 'name': 'maxSpeedAngular', 00171 'value': self._maxSpeedAngular 00172 }) 00173 SubElement(element, 'arg', { 00174 'name': 'LEFT_RIGHT_NUM', 00175 'value': self._leftAndRightNum 00176 }) 00177 SubElement(element, 'arg', { 00178 'name': 'UP_DOWN_NUM', 00179 'value': self._upAndDownAxis 00180 }) 00181 SubElement(element, 'arg', { 00182 'name': 'BOOST_SPEED_BUTTON', 00183 'value': self._boostButton 00184 }) 00185 SubElement(element, 'arg', { 00186 'name': 'ENABLE_BUTTON', 00187 'value': self._driveButton 00188 }) 00189 SubElement(element, 'arg', { 00190 'name': 'JOY_NUM', 00191 'value': self._joystickNum 00192 }) 00193 00194 upAndDownDirValue = '1' 00195 leftAndRightDirValue = '1' 00196 00197 if self._upAndDownAxisDir: upAndDownDirValue = '-1' 00198 if self._leftAndRightDir: leftAndRightDirValue = '-1' 00199 00200 SubElement(element, 'arg', { 00201 'name': 'REV_UP_DOWN', 00202 'value': upAndDownDirValue 00203 }) 00204 SubElement(element, 'arg', { 00205 'name': 'REV_LEFT_RIGHT', 00206 'value': leftAndRightDirValue 00207 })