Skip to content

Commit e1a2cc8

Browse files
authored
Merge pull request #149 from openxc/multiframe
Added new multiframe code
2 parents 70bf4df + 1116e45 commit e1a2cc8

1 file changed

Lines changed: 45 additions & 3 deletions

File tree

openxc/controllers/base.py

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

92125
class 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

140182
class 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

Comments
 (0)