@@ -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 ['message_id' ] in self .diag_dict :
89+ self .diag_dict [response ['message_id' ]].addFrame (response )
90+ else :
91+ self .diag_dict [response ['message_id' ]] = MultiframeDiagnosticMessage (response )
92+ if self ._return_final (response ):
93+ self .responses .append (self .diag_dict [response ['message_id' ]].getResponse ())
94+ self .diag_dict .pop (response ['message_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 .message_id = response ['message_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 .message_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,7 +217,7 @@ 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
0 commit comments