Skip to content

Commit e5d9da0

Browse files
authored
Merge pull request #1090 from OpenC3/python_cmd
Handle bad string types and rescue AttributeError
2 parents f9be2ea + 05dc1fa commit e5d9da0

File tree

4 files changed

+14
-7
lines changed

4 files changed

+14
-7
lines changed

openc3-cosmos-init/plugins/packages/openc3-cosmos-demo/targets/INST/cmd_tlm/inst_cmds.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ COMMAND <%= target_name %> ASCIICMD BIG_ENDIAN "Enumerated ASCII command"
4040
STATE "ARM LASER" "ARM LASER" HAZARDOUS "Arming the laser poses an eye safety hazard."
4141
STATE "FIRE LASER" "FIRE LASER" HAZARDOUS "WARNING Laser will be fired!"
4242
STATE "NOOP" "NOOP" DISABLE_MESSAGES
43-
APPEND_PARAMETER BINARY 32 STRING 0xDEADBEEF "Binary string"
43+
APPEND_PARAMETER BINARY 32 BLOCK 0xDEADBEEF "Binary string"
4444
APPEND_PARAMETER ASCII 80 STRING "0xDEADBEEF" "ASCII string"
4545
RELATED_ITEM <%= target_name %> HEALTH_STATUS ASCIICMD
4646

openc3-cosmos-init/plugins/packages/openc3-cosmos-demo/targets/INST2/cmd_tlm/inst_cmds.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ COMMAND <%= target_name %> ASCIICMD BIG_ENDIAN "Enumerated ASCII command"
3838
STATE "ARM LASER" "ARM LASER" HAZARDOUS "Arming the laser poses an eye safety hazard."
3939
STATE "FIRE LASER" "FIRE LASER" HAZARDOUS "WARNING Laser will be fired!"
4040
STATE "NOOP" "NOOP" DISABLE_MESSAGES
41-
APPEND_PARAMETER BINARY 32 STRING 0xDEADBEEF "Binary string"
41+
APPEND_PARAMETER BINARY 32 BLOCK 0xDEADBEEF "Binary string"
4242
APPEND_PARAMETER ASCII 80 STRING "0xDEADBEEF" "ASCII string"
4343
RELATED_ITEM <%= target_name %> HEALTH_STATUS ASCIICMD
4444

openc3/python/openc3/accessors/binary_accessor.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -192,11 +192,18 @@ def read(cls, bit_offset, bit_size, data_type, buffer, endianness):
192192

193193
if cls.byte_aligned(bit_offset):
194194
if data_type == "STRING":
195-
buffer = buffer[lower_bound : (upper_bound + 1)]
196195
try:
197-
return buffer[: buffer.index(b"\00")].decode(encoding="utf-8")
198-
except ValueError:
199-
return buffer.decode(encoding="utf-8")
196+
buffer = buffer[lower_bound : (upper_bound + 1)]
197+
try:
198+
return buffer[: buffer.index(b"\00")].decode(
199+
encoding="utf-8"
200+
)
201+
except ValueError:
202+
return buffer.decode(encoding="utf-8")
203+
# If this 'STRING' contains binary buffer.decode will fail
204+
# Instead of blowing up return the original buffer
205+
except UnicodeDecodeError:
206+
return buffer
200207
else: # BLOCK
201208
return buffer[lower_bound : upper_bound + 1]
202209

openc3/python/openc3/microservices/interface_microservice.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ def process_cmd(self, topic, msg_id, msg_hash, redis):
218218
else:
219219
raise RuntimeError(f"Invalid command received:\n{msg_hash}")
220220
command.received_time = datetime.now(timezone.utc)
221-
except RuntimeError as error:
221+
except (AttributeError, RuntimeError) as error:
222222
self.logger.error(f"{self.interface.name}: {msg_hash}")
223223
self.logger.error(f"{self.interface.name}: {repr(error)}")
224224
return repr(error)

0 commit comments

Comments
 (0)