@@ -36,6 +36,7 @@ def __init__(self, queue, request, quit_after_first=True):
3636 queue - A multithreading queue that this receiver will pull potential responses from.
3737 request - The request we are trying to match up with a response.
3838 """
39+ self .diag_dict = {}
3940 self .request = request
4041 self .queue = queue
4142 self .responses = []
@@ -82,12 +83,44 @@ def handle_responses(self):
8283 response = self .queue .get (
8384 timeout = self .COMMAND_RESPONSE_TIMEOUT_S )
8485 if self ._response_matches_request (response ):
86+ if type (self ) == DiagnosticResponseReceiver :
87+ if self ._response_is_multiframe (response ):
88+ if response ['id' ] in self .diag_dict :
89+ self .diag_dict [response ['id' ]].addFrame (response )
90+ else :
91+ self .diag_dict [response ['id' ]] = MultiframeDiagnosticMessage (response )
92+ if self ._return_final (response ):
93+ self .responses .append (self .diag_dict [response ['id' ]].getResponse ())
94+ self .diag_dict .pop (response ['id' ])
8595 self .responses .append (response )
8696 if self .quit_after_first :
8797 self .running = False
8898 self .queue .task_done ()
8999 except Empty :
90100 break
101+
102+ class MultiframeDiagnosticMessage :
103+ def __init__ (self , response ):
104+ self .id = response ['id' ] - 16
105+ self .mode = response ['mode' ]
106+ self .bus = response ['bus' ]
107+ self .pid = response ['pid' ]
108+ self .payload = '0x' + response ['payload' ][8 :]
109+
110+ def addFrame (self , response ):
111+ self .payload += response ['payload' ][8 :]
112+
113+ def getResponse (self ):
114+ request = {
115+ 'timestamp' : 0 ,
116+ 'bus' : self .bus ,
117+ 'id' : self .id ,
118+ 'mode' : self .mode ,
119+ 'success' : True ,
120+ 'pid' : self .pid ,
121+ 'payload' : self .payload
122+ }
123+ return request
91124
92125class CommandResponseReceiver (ResponseReceiver ):
93126 """A receiver that matches the 'command' field in responses to the
@@ -104,7 +137,7 @@ class DiagnosticResponseReceiver(ResponseReceiver):
104137 """A receiver that matches the bus, ID, mode and PID from a
105138 diagnostic request to an incoming response.
106139 """
107-
140+
108141 def __init__ (self , queue , request ):
109142 super (DiagnosticResponseReceiver , self ).__init__ (queue , request ,
110143 quit_after_first = False )
@@ -135,7 +168,16 @@ def _response_matches_request(self, response):
135168 return False
136169
137170 return response .get ('mode' , None ) == self .diagnostic_request ['mode' ]
138-
171+
172+ def _response_is_multiframe (self , response ):
173+ if 'frame' in response :
174+ return True
175+ return False
176+
177+ def _return_final (self , response ):
178+ if response ['frame' ] == - 1 :
179+ return True
180+ return False
139181
140182class Controller (object ):
141183 """A Controller is a physical vehicle interface that accepts commands to be
@@ -175,17 +217,17 @@ def complex_request(self, request, wait_for_first_response=True):
175217 if wait_for_first_response :
176218 responses = receiver .wait_for_responses ()
177219 return responses
178-
220+
179221 def _send_complex_request (self , request ):
180222 self .write_bytes (self .streamer .serialize_for_stream (request ))
181223
182224 @classmethod
183- def _build_diagnostic_request (cls , message_id , mode , bus = None , pid = None ,
225+ def _build_diagnostic_request (cls , id , mode , bus = None , pid = None ,
184226 frequency = None , payload = None , decoded_type = None ):
185227 request = {
186228 'command' : "diagnostic_request" ,
187229 'request' : {
188- 'id' : message_id ,
230+ 'id' : id ,
189231 'mode' : mode
190232 }
191233 }
@@ -205,19 +247,19 @@ def _build_diagnostic_request(cls, message_id, mode, bus=None, pid=None,
205247
206248 return request
207249
208- def delete_diagnostic_request (self , message_id , mode , bus = None , pid = None ):
209- request = self ._build_diagnostic_request (message_id , mode , bus , pid )
250+ def delete_diagnostic_request (self , id , mode , bus = None , pid = None ):
251+ request = self ._build_diagnostic_request (id , mode , bus , pid )
210252 request ['action' ] = 'cancel'
211253 return self ._check_command_response_status (request )
212254
213- def create_diagnostic_request (self , message_id , mode , bus = None , pid = None ,
255+ def create_diagnostic_request (self , id , mode , bus = None , pid = None ,
214256 frequency = None , payload = None , wait_for_ack = True ,
215257 wait_for_first_response = False , decoded_type = None ):
216258 """Send a new diagnostic message request to the VI
217259
218260 Required:
219261
220- message_id - The message ID (arbitration ID) for the request.
262+ id - The message ID (arbitration ID) for the request.
221263 mode - the diagnostic mode (or service).
222264
223265 Optional:
@@ -245,7 +287,7 @@ def create_diagnostic_request(self, message_id, mode, bus=None, pid=None,
245287
246288 """
247289
248- request = self ._build_diagnostic_request (message_id , mode , bus , pid ,
290+ request = self ._build_diagnostic_request (id , mode , bus , pid ,
249291 frequency , payload , decoded_type )
250292
251293 diag_response_receiver = None
@@ -411,15 +453,15 @@ def write_translated(self, name, value, event=None):
411453 assert bytes_written == len (message )
412454 return bytes_written
413455
414- def write_raw (self , message_id , data , bus = None , frame_format = None ):
456+ def write_raw (self , id , data , bus = None , frame_format = None ):
415457 """Send a raw write request to the VI.
416458 """
417- if not isinstance (message_id , numbers .Number ):
459+ if not isinstance (id , numbers .Number ):
418460 try :
419- message_id = int (message_id , 0 )
461+ id = int (id , 0 )
420462 except ValueError :
421463 raise ValueError ("ID must be numerical" )
422- data = {'id' : message_id , 'data' : data }
464+ data = {'id' : id , 'data' : data }
423465 if bus is not None :
424466 data ['bus' ] = bus
425467 if frame_format is not None :
0 commit comments