static int _serial_handle_byte(serial_t *serial, char c) { switch (serial->state) { case WAIT_FRAMESTART: if (c == LINE_FRAME_DELIMITER) { TRACE("frame start"); serial->state = IN_FRAME; serial->frametype = 0; serial->framebytes = 0; } break; case IN_FRAME: if (c == LINE_ESC_CHAR) { TRACE("i esc"); serial->state = IN_ESCAPE; } else if (c == LINE_FRAME_DELIMITER) { if (!serial->framebytes) { TRACE("i del unexp"); } else { TRACE("i del"); serial->state = WAIT_FRAMESTART; return serial->framebytes; } } else { _handle_char(serial, c); } break; case IN_ESCAPE: if (c == (LINE_FRAME_DELIMITER ^ 0x20)) { _handle_char(serial, LINE_FRAME_DELIMITER); } else if (c == (LINE_ESC_CHAR ^ 0x20)) { _handle_char(serial, LINE_ESC_CHAR); } else if (c == (LINE_FRAME_TYPE_TEXT ^ 0x20)) { TRACE("esc txt"); serial->frametype = LINE_FRAME_TYPE_TEXT; } else if (c == (LINE_FRAME_TYPE_HELLO ^ 0x20)) { TRACE("esc hello"); serial->frametype = LINE_FRAME_TYPE_HELLO; } else if (c == (LINE_FRAME_TYPE_HELLO_REPLY ^ 0x20)) { TRACE("esc hello_reply"); serial->frametype = LINE_FRAME_TYPE_HELLO_REPLY; } else if (c == LINE_FRAME_DELIMITER) { TRACE("esc -del"); } serial->state = IN_FRAME; break; } return 0; }
static void ethos_isr(void *arg, uint8_t c) { ethos_t *dev = (ethos_t *) arg; switch (dev->state) { case WAIT_FRAMESTART: if (c == ETHOS_FRAME_DELIMITER) { _reset_state(dev); dev->state = IN_FRAME; } break; case IN_FRAME: if (c == ETHOS_ESC_CHAR) { dev->state = IN_ESCAPE; } else if (c == ETHOS_FRAME_DELIMITER) { if (dev->framesize) { _end_of_frame(dev); } } else { _handle_char(dev, c); } break; case IN_ESCAPE: switch (c) { case (ETHOS_FRAME_DELIMITER ^ 0x20): _handle_char(dev, ETHOS_FRAME_DELIMITER); break; case (ETHOS_ESC_CHAR ^ 0x20): _handle_char(dev, ETHOS_ESC_CHAR); break; case (ETHOS_FRAME_TYPE_TEXT ^ 0x20): dev->frametype = ETHOS_FRAME_TYPE_TEXT; break; case (ETHOS_FRAME_TYPE_HELLO ^ 0x20): dev->frametype = ETHOS_FRAME_TYPE_HELLO; break; case (ETHOS_FRAME_TYPE_HELLO_REPLY ^ 0x20): dev->frametype = ETHOS_FRAME_TYPE_HELLO_REPLY; break; } dev->state = IN_FRAME; break; } }