Skip to content

Commit c5002d4

Browse files
authored
Merge pull request #101 from CarletonURocketry/eh/logging_refactor
Update logging and error handling
2 parents e7e5125 + 008ee5f commit c5002d4

File tree

4 files changed

+39
-42
lines changed

4 files changed

+39
-42
lines changed

modules/serial/serial_rn2483_radio.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def rn2483_radio_process(
3434
except SerialException:
3535
serial_status.put("rn2483_connected False")
3636
serial_status.put("rn2483_port null")
37-
logger.info("RN2483 Radio: Error communicating with serial device.")
37+
logger.error("RN2483 Radio: Error communicating with serial device.")
3838
time.sleep(3)
3939

4040
# Get transmissions

modules/telemetry/telemetry_utils.py

+24-16
Original file line numberDiff line numberDiff line change
@@ -76,28 +76,36 @@ def parse_radio_block(pkt_version: int, block_header: BlockHeader, hex_block_con
7676
block_bytes: bytes = bytes.fromhex(hex_block_contents)
7777

7878
try:
79-
# TODO Make an interface to support multiple v1/v2/v3 objects
8079
block_subtype = v1db.DataBlockSubtype(block_header.message_subtype)
81-
block_contents = v1db.DataBlock.parse(block_subtype, block_bytes)
82-
block_name = block_subtype.name.lower()
83-
84-
logger.info(str(block_contents))
85-
86-
# TODO fix at some point
87-
# if block == DataBlockSubtype.STATUS:
88-
# self.status.rocket = jsp.RocketData.from_data_block(block)
89-
# return
90-
91-
return ParsedBlock(block_name, block_header, dict(block_contents)) # type: ignore
92-
9380
except ValueError:
94-
logger.error("Invalid data block subtype")
81+
logger.error(f"Invalid data block subtype {block_header.message_subtype}!")
82+
return
9583

84+
try:
85+
# TODO Make an interface to support multiple v1/v2/v3 objects
86+
block_contents = v1db.DataBlock.parse(block_subtype, block_bytes)
9687
except NotImplementedError:
9788
logger.warning(
9889
f"Block parsing for type {block_header.message_type}, with subtype {block_header.message_subtype} not \
9990
implemented!"
10091
)
92+
return
93+
except v1db.DataBlockException as e:
94+
logger.error(e)
95+
logger.error(f"Block header: {block_header}")
96+
logger.error(f"Block contents: {hex_block_contents}")
97+
return
98+
99+
block_name = block_subtype.name.lower()
100+
101+
logger.debug(str(block_contents))
102+
103+
# TODO fix at some point
104+
# if block == DataBlockSubtype.STATUS:
105+
# self.status.rocket = jsp.RocketData.from_data_block(block)
106+
# return
107+
108+
return ParsedBlock(block_name, block_header, dict(block_contents)) # type: ignore
101109

102110

103111
def parse_rn2483_transmission(data: str, config: Config) -> Optional[ParsedTransmission]:
@@ -124,7 +132,7 @@ def parse_rn2483_transmission(data: str, config: Config) -> Optional[ParsedTrans
124132
from_approved_callsign(pkt_hdr, config.approved_callsigns)
125133

126134
if len(pkt_hdr) <= 32: # If this packet nothing more than just the header
127-
logger.info(f"{pkt_hdr}")
135+
logger.debug(f"{pkt_hdr}")
128136

129137
blocks = data[32:] # Remove the packet header
130138

@@ -164,7 +172,7 @@ def from_approved_callsign(pkt_hdr: PacketHeader, approved_callsigns: dict[str,
164172

165173
# Ensure packet is from an approved call sign
166174
if pkt_hdr.callsign in approved_callsigns:
167-
logger.info(f"Incoming packet from {pkt_hdr.callsign} ({approved_callsigns.get(pkt_hdr.callsign)})")
175+
logger.debug(f"Incoming packet from {pkt_hdr.callsign} ({approved_callsigns.get(pkt_hdr.callsign)})")
168176
else:
169177
logger.warning(f"Incoming packet from unauthorized call sign {pkt_hdr.callsign}")
170178
return False

modules/telemetry/v1/data_block.py

+12-14
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,13 @@
88
from modules.misc.converter import metres_to_feet, milli_degrees_to_celsius, pascals_to_psi
99

1010

11-
class BlockException(Exception):
12-
pass
11+
class DataBlockException(Exception):
12+
"""Exception raised when an error occurs while parsing a data block."""
1313

14-
15-
class BlockUnknownException(BlockException):
16-
pass
17-
18-
19-
class DataBlockException(BlockException):
20-
pass
21-
22-
23-
class DataBlockUnknownException(BlockUnknownException):
24-
pass
14+
def __init__(self, subtype_name: str, error: str):
15+
self.subtype_name = subtype_name
16+
self.error = error
17+
super().__init__(f"Error parsing {subtype_name} block: {error}")
2518

2619

2720
class DataBlockSubtype(IntEnum):
@@ -119,7 +112,12 @@ def parse(block_subtype: DataBlockSubtype, payload: bytes) -> DataBlock:
119112
if subtype is None:
120113
raise NotImplementedError
121114

122-
return subtype.from_bytes(payload=payload)
115+
try:
116+
subtype_instance = subtype.from_bytes(payload)
117+
except Exception as e:
118+
raise DataBlockException(subtype.__name__, str(e))
119+
120+
return subtype_instance
123121

124122

125123
class DebugMessageDB(DataBlock):

tests/parsing/test_full_telemetry_parsing.py

+2-11
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def test_radio_block(pkt_version: int, block_header: BlockHeader, hex_block_cont
5858

5959
@pytest.fixture
6060
def not_implemented_datablock_subtype() -> BlockHeader:
61-
return BlockHeader.from_hex("02000600")
61+
return BlockHeader.from_hex("02000a00")
6262

6363

6464
def test_invalid_datablock_subtype(pkt_version: int, hex_block_contents: str):
@@ -72,15 +72,6 @@ def test_invalid_datablock_subtype(pkt_version: int, hex_block_contents: str):
7272
parse_radio_block(pkt_version, BlockHeader.from_hex("02009A00"), hex_block_contents)
7373

7474

75-
def test_not_implemented_error(
76-
pkt_version: int, not_implemented_datablock_subtype: BlockHeader, hex_block_contents: str
77-
) -> None:
78-
"""
79-
test for a subtye that exists but is not implemented
80-
"""
81-
assert parse_radio_block(pkt_version, not_implemented_datablock_subtype, hex_block_contents) is None
82-
83-
8475
config = load_config("config.json")
8576

8677
# Fixtures and tests to ensure that from_approved_callsign works as expected
@@ -110,7 +101,7 @@ def non_approved_callsign() -> PacketHeader:
110101
def test_is_approved_pkt_hdr(
111102
valid_packet_header: PacketHeader, approved_callsigns: dict[str, str], caplog: LogCaptureFixture
112103
) -> None:
113-
caplog.set_level(logging.INFO)
104+
caplog.set_level(logging.DEBUG)
114105
assert from_approved_callsign(valid_packet_header, approved_callsigns)
115106
assert (
116107
f"Incoming packet from {valid_packet_header.callsign} ({approved_callsigns.get(valid_packet_header.callsign)})"

0 commit comments

Comments
 (0)