1919from serial import SerialException
2020import math
2121import sys
22+ from serial_aggregator import serial_aggregator
2223
2324# Workaround to support Python 2/3
2425if sys .version_info > (3 ,):
4344halfPi = math .pi / 2.0
4445
4546stopSeq = 0x0242f000
46- # stopSeq = 0x40420f00
4747
4848class DobotDriver :
4949 def __init__ (self , comport , rate = 115200 ):
@@ -55,7 +55,15 @@ def __init__(self, comport, rate=115200):
5555
5656 def Open (self , timeout = 0.025 ):
5757 try :
58- self ._port = serial .Serial (self ._comport , baudrate = self ._rate , timeout = timeout , interCharTimeout = 0.1 )
58+ self ._port = serial_aggregator (serial .Serial (self ._comport , baudrate = self ._rate , timeout = timeout , interCharTimeout = 0.1 ))
59+ # self._port = serial.Serial(self._comport, baudrate=self._rate, timeout=timeout, interCharTimeout=0.1)
60+
61+ # s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
62+ # s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
63+ # s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2)
64+ # s.connect(("localhost", 5555))
65+ # self._port = serial2socket(s)
66+
5967 # Have to wait for Arduino initialization to finish, or else it doesn't boot.
6068 time .sleep (2 )
6169 except SerialException as e :
@@ -121,109 +129,44 @@ def _readslong(self):
121129 return (0 ,0 )
122130
123131 def _read1 (self , cmd ):
124- trys = _max_trys
125- while trys :
126- self ._port .flushInput ()
127- self ._sendcommand (cmd )
128- self ._writechecksum ()
129- val1 = self ._readbyte ()
130- if val1 [0 ]:
131- crc = self ._readchecksumword ()
132- if crc [0 ]:
133- if self ._crc & 0xFFFF != crc [1 ]& 0xFFFF :
134- # raise Exception('crc differs', self._crc&0xFFF, crc[1]&0xFFFF)
135- return (0 ,0 )
136- return (1 ,val1 [1 ])
137- trys -= 1
138- # raise Exception("couldn't get response in time for", _max_trys, 'times')
139- return (0 ,0 )
132+ return self ._read (cmd , [self ._readbyte ])
140133
141134 def _read22 (self , cmd ):
142- trys = _max_trys
143- while trys :
144- self ._port .flushInput ()
145- self ._sendcommand (cmd )
146- self ._writechecksum ()
147- val1 = self ._readword ()
148- if val1 [0 ]:
149- val2 = self ._readword ()
150- if val2 [0 ]:
151- crc = self ._readchecksumword ()
152- if crc [0 ]:
153- if self ._crc & 0xFFFF != crc [1 ]& 0xFFFF :
154- # raise Exception('crc differs', self._crc&0xFFF, crc[1]&0xFFFF)
155- return (0 ,0 ,0 )
156- return (1 ,val1 [1 ],val2 [1 ])
157- trys -= 1
158- # raise Exception("couldn't get response in time for", _max_trys, 'times')
159- return (0 ,0 ,0 )
160-
161- def _read4 (self , cmd ):
162- trys = _max_trys
163- while trys :
164- self ._port .flushInput ()
165- self ._sendcommand (cmd )
166- val1 = self ._readlong ()
167- if val1 [0 ]:
168- crc = self ._readchecksumword ()
169- if crc [0 ]:
170- if self ._crc & 0xFFFF != crc [1 ]& 0xFFFF :
171- return (0 ,0 )
172- return (1 ,val1 [1 ])
173- trys -= 1
174- return (0 ,0 )
135+ return self ._read (cmd , [self ._readword ,
136+ self ._readword ])
175137
176138 def _read4 (self , cmd ):
177- trys = _max_trys
178- while trys :
179- self ._port .flushInput ()
180- self ._sendcommand (cmd )
181- val1 = self ._readlong ()
182- if val1 [0 ]:
183- crc = self ._readchecksumword ()
184- if crc [0 ]:
185- if self ._crc & 0xFFFF != crc [1 ]& 0xFFFF :
186- return (0 ,0 )
187- return (1 ,val1 [1 ])
188- trys -= 1
189- return (0 ,0 )
139+ return self ._read (cmd , [self ._readlong ])
190140
191- def _read4_1 (self , cmd ):
192- trys = _max_trys
193- while trys :
194- self ._port .flushInput ()
195- self ._sendcommand (cmd )
196- val1 = self ._readslong ()
197- if val1 [0 ]:
198- val2 = self ._readbyte ()
199- if val2 [0 ]:
200- crc = self ._readchecksumword ()
201- if crc [0 ]:
202- if self ._crc & 0xFFFF != crc [1 ]& 0xFFFF :
203- return (0 ,0 )
204- return (1 ,val1 [1 ],val2 [1 ])
205- trys -= 1
206- return (0 ,0 )
141+ def _read41 (self , cmd ):
142+ return self ._read (cmd , [self ._readslong ,
143+ self ._readbyte ])
207144
208145 def _reads444 (self , cmd ):
146+ return self ._read (cmd , [self ._readslong ,
147+ self ._readslong ,
148+ self ._readslong ])
149+
150+ def _read (self , cmd , read_commands = list ()):
209151 trys = _max_trys
210152 while trys :
211- self ._port .flushInput ()
212153 self ._sendcommand (cmd )
213154 self ._writechecksum ()
214- val1 = self ._readslong ()
215- if val1 [0 ]:
216- val2 = self ._readslong ()
217- if val2 [0 ]:
218- val3 = self ._readslong ()
219- if val3 [0 ]:
220- crc = self ._readchecksumword ()
221- if crc [0 ]:
222- if self ._crc & 0xFFFF != crc [1 ]& 0xFFFF :
223- return (0 ,0 ,0 ,0 )
224- return (1 ,val1 [1 ],val2 [1 ],val3 [1 ])
155+ self ._port .send ()
156+
157+ ret = [1 ]
158+ for c in read_commands :
159+ val = c ()
160+ if not val [0 ]:
161+ return [0 ] * (len (read_commands ) + 1 )
162+ ret .append (val [1 ])
163+
164+ crc = self ._readchecksumword ()
165+ if crc [0 ]:
166+ if self ._crc & 0xFFFF == crc [1 ]& 0xFFFF :
167+ return tuple (ret )
225168 trys -= 1
226- return ( 0 , 0 , 0 , 0 )
169+ return [ 0 ] * ( len ( read_commands ) + 1 )
227170
228171 def _writebyte (self , val ):
229172 self ._crc_update (val & 0xFF )
@@ -242,7 +185,6 @@ def _writelong(self, val):
242185 def _writechecksum (self ):
243186 self ._port .write (bytearray ([(self ._crc >> 8 )& 0xFF ]))
244187 self ._port .write (bytearray ([self ._crc & 0xFF ]))
245- self ._port .flush ()
246188
247189 def _sendcommand (self , command ):
248190 self ._crc_clear ()
@@ -257,6 +199,7 @@ def _write(self, cmd, write_commands=list()):
257199 c [0 ](c [1 ])
258200
259201 self ._writechecksum ()
202+ self ._port .send ()
260203 crc = self ._readchecksumword ()
261204 if crc [0 ]:
262205 if self ._crc & 0xFFFF == crc [1 ]& 0xFFFF :
@@ -293,13 +236,13 @@ def _write444(self, cmd, val1, val2, val3):
293236 def _write_read (self , cmd , write_commands ):
294237 tries = _max_trys
295238 while tries :
296- self ._port .flushInput ()
297239 self ._sendcommand (cmd )
298240
299241 for c in write_commands :
300242 c [0 ](c [1 ])
301243
302244 self ._writechecksum ()
245+ self ._port .send ()
303246 ret = self ._readbyte ()
304247 if ret [0 ]:
305248 crc = self ._readchecksumword ()
@@ -582,7 +525,6 @@ def reset(self):
582525# self._lock.acquire()
583526 i = 0
584527 while i < 5 :
585- self ._port .flushInput ()
586528 self ._port .read (1 )
587529 i += 1
588530 self ._crc_clear ()
0 commit comments