mirror of
https://github.com/lowobservable/coax.git
synced 2026-03-02 18:14:50 +00:00
Add description to invalid message errors
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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]}')
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user