diff --git a/interface1/firmware/src/main.cpp b/interface1/firmware/src/main.cpp index 260db2a..5d025b7 100644 --- a/interface1/firmware/src/main.cpp +++ b/interface1/firmware/src/main.cpp @@ -64,11 +64,18 @@ void sendMessage(uint8_t *buffer, int bufferCount) Serial.flush(); } -void sendErrorMessage(uint8_t code) +void sendErrorMessage(uint8_t code, const char *description) { - uint8_t message[] = { 0x02, code }; + uint8_t message[2 + 62 + 1] = { 0x02, code }; + int count = 2; - sendMessage(message, 2); + if (description != NULL) { + strncpy((char *) (message + 2), description, 62); + + count += strlen(description); + } + + sendMessage(message, count); } #define COMMAND_RESET 0x01 @@ -86,7 +93,7 @@ void handleResetCommand(uint8_t *buffer, int bufferCount) void handleTransmitReceiveCommand(uint8_t *buffer, int bufferCount) { if (bufferCount < 6) { - sendErrorMessage(ERROR_INVALID_MESSAGE); + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_TXRX_BUFFER_COUNT_6"); return; } @@ -100,7 +107,7 @@ void handleTransmitReceiveCommand(uint8_t *buffer, int bufferCount) uint16_t receiveTimeout = (buffer[bufferCount - 2] << 8) | buffer[bufferCount - 1]; if (transmitBufferCount < 1) { - sendErrorMessage(ERROR_INVALID_MESSAGE); + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_TXRX_TX_BUFFER_COUNT_1"); return; } @@ -127,7 +134,7 @@ void handleTransmitReceiveCommand(uint8_t *buffer, int bufferCount) bufferCount = CoaxTransceiver::transmitReceive(transmitBuffer, transmitBufferCount, receiveBuffer, receiveBufferSize, receiveTimeout); if (bufferCount < 0) { - sendErrorMessage(100 + ((-1) * bufferCount)); + sendErrorMessage(100 + ((-1) * bufferCount), NULL); return; } @@ -142,7 +149,7 @@ void handleTransmitReceiveCommand(uint8_t *buffer, int bufferCount) void handleMessage(uint8_t *buffer, int bufferCount) { if (bufferCount < 1) { - sendErrorMessage(ERROR_INVALID_MESSAGE); + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_MESSAGE_BUFFER_COUNT_1"); return; } @@ -153,21 +160,21 @@ void handleMessage(uint8_t *buffer, int bufferCount) } else if (command == COMMAND_TRANSMIT_RECEIVE) { handleTransmitReceiveCommand(buffer + 1, bufferCount - 1); } else { - sendErrorMessage(ERROR_UNKNOWN_COMMAND); + sendErrorMessage(ERROR_UNKNOWN_COMMAND, NULL); } } void handleFrame(uint8_t *buffer, int bufferCount) { if (bufferCount < 4) { - sendErrorMessage(ERROR_INVALID_MESSAGE); + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_FRAME_BUFFER_COUNT_4"); return; } int count = (buffer[0] << 8) | buffer[1]; if (bufferCount - 4 != count) { - sendErrorMessage(ERROR_INVALID_MESSAGE); + sendErrorMessage(ERROR_INVALID_MESSAGE, "HANDLE_FRAME_BUFFER_COUNT_MISMATCH"); return; } diff --git a/pycoax/coax/serial_interface.py b/pycoax/coax/serial_interface.py index b632507..e6fb501 100644 --- a/pycoax/coax/serial_interface.py +++ b/pycoax/coax/serial_interface.py @@ -162,7 +162,18 @@ def _convert_error(message): return InterfaceError(f'Invalid error response: {message}') if message[1] in ERROR_MAP: - return ERROR_MAP[message[1]] + error = ERROR_MAP[message[1]] + + # Append description if included. + if len(message) > 2: + description = message[2:].decode('ascii') + + if error.args: + error.args = (f'{error.args[0]}: {description}', *error.args[1:]) + else: + error.args = (description,) + + return error return InterfaceError(f'Unknown error: {message[1]}') diff --git a/pycoax/tests/test_serial_interface.py b/pycoax/tests/test_serial_interface.py index 56ded69..dbb7a87 100644 --- a/pycoax/tests/test_serial_interface.py +++ b/pycoax/tests/test_serial_interface.py @@ -53,6 +53,14 @@ class SerialInterfaceResetTestCase(unittest.TestCase): with self.assertRaisesRegex(InterfaceError, 'Invalid request message'): self.interface.reset() + def test_error_with_description_is_handled_correctly(self): + # Arrange + self.interface._read_message = Mock(return_value=bytes.fromhex('02 01 45 72 72 6f 72 20 64 65 73 63 72 69 70 74 69 6f 6e')) + + # Act and assert + with self.assertRaisesRegex(InterfaceError, 'Invalid request message: Error description'): + self.interface.reset() + # TODO... class SerialInterfaceReadMessageTestCase(unittest.TestCase):