Skip to content

Commit 6390bba

Browse files
vkreschHabedank Clemens
authored andcommitted
Fix message iteration by index and range (#429)
* Replace osi message iteration * Fix int subtraction and remove file closing Signed-off-by: Viktor Kreschenski <viktor.kreschenski@altran.com> Signed-off-by: Habedank Clemens <qxs2704@europe.bmw.corp>
1 parent 86b3dad commit 6390bba

File tree

1 file changed

+23
-22
lines changed

1 file changed

+23
-22
lines changed

format/OSITrace.py

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def __init__(self, path=None, type_name="SensorView"):
4444
self.type_name = type_name
4545
self.timestep_count = 0
4646
self.retrieved_scenario_size = 0
47+
self._int_length = len(struct.pack("<L", 0))
4748

4849
def from_file(self, path, type_name="SensorView", max_index=-1, format_type=None):
4950
"""Import a scenario from a file"""
@@ -161,19 +162,18 @@ def get_messages_in_index_range(self, begin, end):
161162
"""
162163
Yield an iterator over messages of indexes between begin and end included.
163164
"""
165+
self.scenario_file.seek(self.message_offsets[begin])
166+
abs_first_offset = self.message_offsets[begin]
167+
abs_last_offset = self.message_offsets[end] \
168+
if end < len(self.message_offsets) \
169+
else self.retrieved_scenario_size
164170

165-
if self.format_type == "separated":
166-
self.scenario_file.seek(self.message_offsets[begin])
167-
abs_first_offset = self.message_offsets[begin]
168-
abs_last_offset = self.message_offsets[end] \
169-
if end < len(self.message_offsets) \
170-
else self.retrieved_scenario_size
171-
172-
rel_message_offsets = [
173-
abs_message_offset - abs_first_offset
174-
for abs_message_offset in self.message_offsets[begin:end]
175-
]
171+
rel_message_offsets = [
172+
abs_message_offset - abs_first_offset
173+
for abs_message_offset in self.message_offsets[begin:end]
174+
]
176175

176+
if self.format_type == "separated":
177177
message_sequence_len = abs_last_offset - \
178178
abs_first_offset - SEPARATOR_LENGTH
179179
serialized_messages_extract = self.scenario_file.read(
@@ -190,25 +190,26 @@ def get_messages_in_index_range(self, begin, end):
190190
yield message
191191

192192
elif self.format_type is None:
193-
self.scenario_file.seek(0)
194-
serialized_message = self.scenario_file.read()
195-
INT_LENGTH = len(struct.pack("<L", 0))
196-
message_length = 0
193+
message_sequence_len = abs_last_offset - abs_first_offset
194+
serialized_messages_extract = self.scenario_file.read(message_sequence_len)
195+
196+
for rel_index, rel_message_offset in enumerate(rel_message_offsets):
197+
rel_begin = rel_message_offset + self._int_length
198+
rel_end = (
199+
rel_message_offsets[rel_index + 1]
200+
if rel_index + 1 < len(rel_message_offsets)
201+
else message_sequence_len
202+
)
197203

198-
i = 0
199-
while i < len(serialized_message):
200204
message = MESSAGES_TYPE[self.type_name]()
201-
message_length = struct.unpack("<L", serialized_message[i:INT_LENGTH+i])[0]
202-
message.ParseFromString(serialized_message[i+INT_LENGTH:i+INT_LENGTH+message_length])
203-
i += message_length + INT_LENGTH
205+
serialized_message = serialized_messages_extract[rel_begin:rel_end]
206+
message.ParseFromString(serialized_message)
204207
yield message
205208

206209
else:
207210
self.scenario_file.close()
208211
raise Exception(f"The defined format {self.format_type} does not exist.")
209212

210-
self.scenario_file.close()
211-
212213
def make_readable(self, name, interval=None, index=None):
213214
self.scenario_file.seek(0)
214215
serialized_message = self.scenario_file.read()

0 commit comments

Comments
 (0)