Skip to content

Commit 3730ee5

Browse files
committed
Fixed #46: ReferencingInfo state bitsets were not parsed correctly; Parsing exceptions are now caught and logged
1 parent f6473e6 commit 3730ee5

2 files changed

Lines changed: 58 additions & 29 deletions

File tree

‎cri_lib/cri_controller.py‎

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -290,23 +290,30 @@ def _bg_receive_thread(self) -> None:
290290

291291
continue_parsing = True
292292
while continue_parsing:
293-
# check for an end of message
294-
end_idx = message_buffer.find(b"CRIEND")
295-
if end_idx != -1:
296-
start_idx = message_buffer.find(b"CRISTART")
297-
298-
# check if there is a complete message
299-
if start_idx != -1:
300-
message = message_buffer[start_idx : end_idx + 6].decode()
301-
self._parse_message(message)
302-
303-
# check if there is data left in the buffer
304-
if len(message_buffer) > end_idx + 7:
305-
message_buffer = message_buffer[end_idx + 7 :]
293+
try:
294+
# check for an end of message
295+
end_idx = message_buffer.find(b"CRIEND")
296+
if end_idx != -1:
297+
start_idx = message_buffer.find(b"CRISTART")
298+
299+
# check if there is a complete message
300+
if start_idx != -1:
301+
message = message_buffer[start_idx : end_idx + 6].decode()
302+
self._parse_message(message)
303+
304+
# check if there is data left in the buffer
305+
if len(message_buffer) > end_idx + 7:
306+
message_buffer = message_buffer[end_idx + 7 :]
307+
else:
308+
message_buffer.clear()
306309
else:
307-
message_buffer.clear()
308-
else:
309-
continue_parsing = False
310+
continue_parsing = False
311+
except Exception as ex:
312+
logger.error(
313+
"Receive Thread: Failed to parse message, clearing buffer: "
314+
+ str(ex)
315+
)
316+
message_buffer.clear()
310317

311318
def _wait_for_answer(
312319
self,

‎cri_lib/cri_protocol_parser.py‎

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,28 @@
2424
logger = logging.getLogger(__name__)
2525

2626

27+
def to_ReferencingAxisState(cri_value: int) -> ReferencingAxisState:
28+
"""
29+
Parses a referencing state bitset value from CRI into the ReferencingAxisState enum
30+
31+
Parameters
32+
----------
33+
cri_value: referencing state value from CRI, this is an integer encoded bitset
34+
35+
Returns
36+
-------
37+
Parsed ReferencingAxisState value
38+
"""
39+
all_axes_referenced = (cri_value & 0x1) != 0
40+
is_referencing = (cri_value & 0x2) != 0
41+
if is_referencing:
42+
return ReferencingAxisState.REFERENCING
43+
elif all_axes_referenced:
44+
return ReferencingAxisState.REFERENCED
45+
else:
46+
return ReferencingAxisState.NOT_REFERENCED
47+
48+
2749
class CRIProtocolParser:
2850
"""Class handling the parsing of CRI messages to the robot state."""
2951

@@ -674,19 +696,19 @@ def _parse_info(self, parameters: list[str]) -> str | None:
674696
parameters.insert(14, parameters[14][0])
675697

676698
ref_state = ReferencingState(
677-
global_state=ReferencingAxisState(int(parameters[1])),
678-
A1=ReferencingAxisState(int(parameters[3])),
679-
A2=ReferencingAxisState(int(parameters[4])),
680-
A3=ReferencingAxisState(int(parameters[5])),
681-
A4=ReferencingAxisState(int(parameters[6])),
682-
A5=ReferencingAxisState(int(parameters[7])),
683-
A6=ReferencingAxisState(int(parameters[8])),
684-
E1=ReferencingAxisState(int(parameters[9])),
685-
E2=ReferencingAxisState(int(parameters[10])),
686-
E3=ReferencingAxisState(int(parameters[11])),
687-
E4=ReferencingAxisState(int(parameters[12])),
688-
E5=ReferencingAxisState(int(parameters[13])),
689-
E6=ReferencingAxisState(int(parameters[14])),
699+
global_state=to_ReferencingAxisState(int(parameters[1])),
700+
A1=to_ReferencingAxisState(int(parameters[3])),
701+
A2=to_ReferencingAxisState(int(parameters[4])),
702+
A3=to_ReferencingAxisState(int(parameters[5])),
703+
A4=to_ReferencingAxisState(int(parameters[6])),
704+
A5=to_ReferencingAxisState(int(parameters[7])),
705+
A6=to_ReferencingAxisState(int(parameters[8])),
706+
E1=to_ReferencingAxisState(int(parameters[9])),
707+
E2=to_ReferencingAxisState(int(parameters[10])),
708+
E3=to_ReferencingAxisState(int(parameters[11])),
709+
E4=to_ReferencingAxisState(int(parameters[12])),
710+
E5=to_ReferencingAxisState(int(parameters[13])),
711+
E6=to_ReferencingAxisState(int(parameters[14])),
690712
mandatory=bool(parameters[16] == "1"),
691713
ref_prog_enabled=bool(parameters[18] == "1"),
692714
ref_prog_running=bool(parameters[19] == "1"),

0 commit comments

Comments
 (0)