mirror of
https://github.com/halleysfifthinc/AVCLAN-Mockingboard.git
synced 2026-08-07 01:13:18 +00:00
Improve error messaging/handling
This commit is contained in:
+32
-26
@@ -135,7 +135,7 @@ uint16_t period = 0;
|
|||||||
uint16_t pulsewidth;
|
uint16_t pulsewidth;
|
||||||
|
|
||||||
// answers
|
// answers
|
||||||
uint8_t lancheck_resp[] = {0x00, 0x01, 0x00, 0xFF, 0xFF};
|
uint8_t lancheck_resp[] = {0x00, dev_COMM_CTRL, dev_LAN, 0xFF, 0xFF};
|
||||||
const uint8_t list_functions_resp[] = {0x00, dev_COMM_CTRL, dev_COMM_v1,
|
const uint8_t list_functions_resp[] = {0x00, dev_COMM_CTRL, dev_COMM_v1,
|
||||||
List_Functions_Resp, dev_CD_CHANGER};
|
List_Functions_Resp, dev_CD_CHANGER};
|
||||||
uint8_t ping_resp[] = {0x00, dev_COMM_CTRL, dev_COMM_v1, Ping_Resp, 0xFF, 0x00};
|
uint8_t ping_resp[] = {0x00, dev_COMM_CTRL, dev_COMM_v1, Ping_Resp, 0xFF, 0x00};
|
||||||
@@ -557,14 +557,15 @@ uint8_t AVCLAN_readframe(AVCLAN_frame_t *frame, log_t print) {
|
|||||||
// Error enum is ordered such that a lower numeric value corresponds to more
|
// Error enum is ordered such that a lower numeric value corresponds to more
|
||||||
// successful read
|
// successful read
|
||||||
enum : uint8_t {
|
enum : uint8_t {
|
||||||
|
NO_ERROR = 0x00,
|
||||||
BAD_DATA_PARITY = 0x01,
|
BAD_DATA_PARITY = 0x01,
|
||||||
BAD_LENGTH_RANGE,
|
BAD_LENGTH_RANGE,
|
||||||
BAD_LENGTH_PARITY,
|
BAD_LENGTH_PARITY,
|
||||||
BAD_PERIPHERAL_PARITY,
|
BAD_PERIPHERAL_PARITY,
|
||||||
BAD_CONTROLLER_PARITY,
|
BAD_CONTROLLER_PARITY,
|
||||||
BAD_CONTROL_PARITY,
|
BAD_CONTROL_PARITY,
|
||||||
STARTBIT_LENGTH,
|
STARTBIT_TOO_SHORT,
|
||||||
STARTBIT_TIMEOUT,
|
STARTBIT_TOO_LONG,
|
||||||
} errno;
|
} errno;
|
||||||
union {
|
union {
|
||||||
uint8_t val; // BAD_LENGTH_RANGE: the out-of-range length value
|
uint8_t val; // BAD_LENGTH_RANGE: the out-of-range length value
|
||||||
@@ -577,26 +578,25 @@ uint8_t AVCLAN_readframe(AVCLAN_frame_t *frame, log_t print) {
|
|||||||
|
|
||||||
stopEvent(); // disable timer1 interrupt
|
stopEvent(); // disable timer1 interrupt
|
||||||
|
|
||||||
uint8_t parity = 0;
|
|
||||||
uint8_t tmp = 0;
|
uint8_t tmp = 0;
|
||||||
|
|
||||||
TCB1.CNT = 0;
|
uint16_t startbitlen = TCB1.CNT = 0;
|
||||||
while (!BUS_IS_IDLE) {
|
while (!BUS_IS_IDLE) {
|
||||||
if (TCB1.CNT > (uint16_t)AVCLAN_STARTBIT_LOGIC_0 * 1.2) {
|
startbitlen = TCB1.CNT;
|
||||||
err.errno = STARTBIT_TIMEOUT;
|
if (startbitlen > (uint16_t)AVCLAN_STARTBIT_LOGIC_0 * 1.2) {
|
||||||
|
err.errno = STARTBIT_TOO_LONG;
|
||||||
goto handle_err;
|
goto handle_err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
uint16_t startbitlen = TCB1.CNT;
|
|
||||||
if (startbitlen < (uint16_t)(AVCLAN_STARTBIT_LOGIC_0 * 0.8)) {
|
if (startbitlen < (uint16_t)(AVCLAN_STARTBIT_LOGIC_0 * 0.8)) {
|
||||||
err.errno = STARTBIT_LENGTH;
|
err.errno = STARTBIT_TOO_SHORT;
|
||||||
goto handle_err;
|
goto handle_err;
|
||||||
}
|
}
|
||||||
// Otherwise that was a start bit
|
// Otherwise that was a start bit
|
||||||
|
|
||||||
AVCLAN_readbits(&frame->broadcast, 1);
|
AVCLAN_readbits(&frame->broadcast, 1);
|
||||||
|
|
||||||
parity = AVCLAN_readbits(&frame->controller_addr, 12);
|
uint8_t parity = AVCLAN_readbits(&frame->controller_addr, 12);
|
||||||
AVCLAN_readbits(&tmp, 1);
|
AVCLAN_readbits(&tmp, 1);
|
||||||
if (parity != (tmp &= 1)) {
|
if (parity != (tmp &= 1)) {
|
||||||
err.errno = BAD_CONTROLLER_PARITY;
|
err.errno = BAD_CONTROLLER_PARITY;
|
||||||
@@ -684,8 +684,8 @@ uint8_t AVCLAN_readframe(AVCLAN_frame_t *frame, log_t print) {
|
|||||||
startEvent();
|
startEvent();
|
||||||
RS232_Print("ERR(read): ");
|
RS232_Print("ERR(read): ");
|
||||||
switch (err.errno) {
|
switch (err.errno) {
|
||||||
case STARTBIT_TIMEOUT: break;
|
case STARTBIT_TOO_SHORT: RS232_Print("start bit too short"); break;
|
||||||
case STARTBIT_LENGTH: RS232_Print("bad start bit length"); break;
|
case STARTBIT_TOO_LONG: RS232_Print("start bit too long"); break;
|
||||||
case BAD_CONTROLLER_PARITY:
|
case BAD_CONTROLLER_PARITY:
|
||||||
RS232_Print("reading controller addr.");
|
RS232_Print("reading controller addr.");
|
||||||
goto VERBOSE;
|
goto VERBOSE;
|
||||||
@@ -699,8 +699,8 @@ uint8_t AVCLAN_readframe(AVCLAN_frame_t *frame, log_t print) {
|
|||||||
RS232_PrintHex4(err.val);
|
RS232_PrintHex4(err.val);
|
||||||
break;
|
break;
|
||||||
case BAD_DATA_PARITY: RS232_Print("reading data"); goto VERBOSE;
|
case BAD_DATA_PARITY: RS232_Print("reading data"); goto VERBOSE;
|
||||||
default:
|
case NO_ERROR:
|
||||||
break;
|
__builtin_unreachable();
|
||||||
VERBOSE:
|
VERBOSE:
|
||||||
if (print.verbose) {
|
if (print.verbose) {
|
||||||
RS232_Print("; read 0x");
|
RS232_Print("; read 0x");
|
||||||
@@ -715,7 +715,9 @@ uint8_t AVCLAN_readframe(AVCLAN_frame_t *frame, log_t print) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Only print if some data has been correctly recieved
|
// Only print if some data has been correctly recieved
|
||||||
if (print.print && (err.errno < STARTBIT_LENGTH)) {
|
if (print.print && (err.errno < STARTBIT_TOO_SHORT)) {
|
||||||
|
if (err.errno > BAD_DATA_PARITY)
|
||||||
|
frame->length = 0;
|
||||||
AVCLAN_printframe(frame, print.binary);
|
AVCLAN_printframe(frame, print.binary);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -727,6 +729,7 @@ uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame, log_t print) {
|
|||||||
// Error enum is ordered such that a lower numeric value corresponds to more
|
// Error enum is ordered such that a lower numeric value corresponds to more
|
||||||
// success
|
// success
|
||||||
enum : uint8_t {
|
enum : uint8_t {
|
||||||
|
NO_ERROR = 0x00,
|
||||||
NAK_DATA = 0x01,
|
NAK_DATA = 0x01,
|
||||||
NAK_MESSAGE_LENGTH,
|
NAK_MESSAGE_LENGTH,
|
||||||
NAK_CONTROL,
|
NAK_CONTROL,
|
||||||
@@ -824,29 +827,30 @@ uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame, log_t print) {
|
|||||||
startEvent();
|
startEvent();
|
||||||
RS232_Print("Error");
|
RS232_Print("Error");
|
||||||
switch (err.errno) {
|
switch (err.errno) {
|
||||||
case MUTED: break;
|
case MUTED: RS232_Print(": Device muted"); break;
|
||||||
case BUSY: RS232_Print(": Busy bus\n"); break;
|
case BUSY: RS232_Print(": Busy bus"); break;
|
||||||
case NAK_ADDRESS:
|
case NAK_ADDRESS:
|
||||||
case NAK_CONTROL:
|
case NAK_CONTROL:
|
||||||
case NAK_MESSAGE_LENGTH:
|
case NAK_MESSAGE_LENGTH:
|
||||||
case NAK_DATA:
|
case NAK_DATA:
|
||||||
RS232_Print(" NAK: ");
|
RS232_Print(" NAK: ");
|
||||||
switch (err.errno) {
|
switch (err.errno) {
|
||||||
case NAK_ADDRESS: RS232_Print("address\n"); break;
|
case NAK_ADDRESS: RS232_Print("address"); break;
|
||||||
case NAK_CONTROL: RS232_Print("Control\n"); break;
|
case NAK_CONTROL: RS232_Print("Control"); break;
|
||||||
case NAK_MESSAGE_LENGTH: RS232_Print("Message length\n"); break;
|
case NAK_MESSAGE_LENGTH: RS232_Print("Message length"); break;
|
||||||
case NAK_DATA:
|
case NAK_DATA:
|
||||||
RS232_Print(" data[");
|
RS232_Print(" data[");
|
||||||
RS232_PrintDec(err.val);
|
RS232_PrintDec(err.val);
|
||||||
RS232_Print("]\n");
|
RS232_Print("]");
|
||||||
break;
|
break;
|
||||||
case MUTED: __builtin_unreachable();
|
case NO_ERROR:
|
||||||
|
case MUTED:
|
||||||
case BUSY: __builtin_unreachable();
|
case BUSY: __builtin_unreachable();
|
||||||
default:
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
case NO_ERROR: __builtin_unreachable();
|
||||||
}
|
}
|
||||||
|
RS232_Print("\n");
|
||||||
} else {
|
} else {
|
||||||
startEvent();
|
startEvent();
|
||||||
}
|
}
|
||||||
@@ -860,7 +864,7 @@ uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame, log_t print) {
|
|||||||
response_t AVCLAN_handleframe(const AVCLAN_frame_t *in, AVCLAN_frame_t *out) {
|
response_t AVCLAN_handleframe(const AVCLAN_frame_t *in, AVCLAN_frame_t *out) {
|
||||||
response_t respond = r_Nothing;
|
response_t respond = r_Nothing;
|
||||||
|
|
||||||
if (AVCLAN_ismuted())
|
if (AVCLAN_ismuted() || in->length < 3)
|
||||||
return respond;
|
return respond;
|
||||||
|
|
||||||
out->controller_addr = DEVICE_ADDR;
|
out->controller_addr = DEVICE_ADDR;
|
||||||
@@ -871,7 +875,9 @@ response_t AVCLAN_handleframe(const AVCLAN_frame_t *in, AVCLAN_frame_t *out) {
|
|||||||
const uint8_t b0 = *data++;
|
const uint8_t b0 = *data++;
|
||||||
const uint8_t b1 = *data++;
|
const uint8_t b1 = *data++;
|
||||||
const uint8_t b2 = *data++;
|
const uint8_t b2 = *data++;
|
||||||
const uint8_t b3 = *data++;
|
uint8_t b3;
|
||||||
|
if (in->length > 3) // the shortest known/valid messages are 3 bytes long
|
||||||
|
b3 = *data++;
|
||||||
uint8_t from;
|
uint8_t from;
|
||||||
|
|
||||||
// BROADCAST
|
// BROADCAST
|
||||||
|
|||||||
Reference in New Issue
Block a user