mirror of
https://github.com/oliverschmidt/contiki.git
synced 2024-12-22 10:30:13 +00:00
configurable line buffer size + simplified interrupt handler + overflow check on line buffer
This commit is contained in:
parent
5aab2eb77d
commit
5f71e9914e
@ -28,7 +28,7 @@
|
||||
*
|
||||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
* @(#)$Id: serial-line.c,v 1.2 2009/10/27 16:20:31 fros4943 Exp $
|
||||
* @(#)$Id: serial-line.c,v 1.3 2009/11/02 12:47:06 fros4943 Exp $
|
||||
*/
|
||||
#include "dev/serial-line.h"
|
||||
#include <string.h> /* for memcpy() */
|
||||
@ -56,44 +56,37 @@ PROCESS(serial_line_process, "Serial driver");
|
||||
|
||||
process_event_t serial_line_event_message;
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int
|
||||
serial_line_input_byte(unsigned char c)
|
||||
{
|
||||
static uint8_t overflow = 0; /* Buffer overflow: ignore until END */
|
||||
if (IGNORE_CHAR(c)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!IGNORE_CHAR(c)) {
|
||||
if(!overflow) {
|
||||
/* Add character */
|
||||
if(ringbuf_put(&rxbuf, c) == 0) {
|
||||
/* Buffer overflow: ignore the rest of the line */
|
||||
overflow = 1;
|
||||
process_poll(&serial_line_process);
|
||||
}
|
||||
} else {
|
||||
/* Buffer overflowed:
|
||||
* Only (try to) add terminator characters, otherwise skip */
|
||||
if(c == END && ringbuf_put(&rxbuf, c) != 0) {
|
||||
overflow = 0;
|
||||
} else {
|
||||
process_poll(&serial_line_process);
|
||||
}
|
||||
if(!overflow) {
|
||||
/* Add character */
|
||||
if(ringbuf_put(&rxbuf, c) == 0) {
|
||||
/* Buffer overflow: ignore the rest of the line */
|
||||
overflow = 1;
|
||||
}
|
||||
|
||||
if(c == END && !overflow) {
|
||||
/* Tell process at least one (potentially cropped due to overflow)
|
||||
* line exists in the buffer */
|
||||
process_poll(&serial_line_process);
|
||||
return 1;
|
||||
} else {
|
||||
/* Buffer overflowed:
|
||||
* Only (try to) add terminator characters, otherwise skip */
|
||||
if(c == END && ringbuf_put(&rxbuf, c) != 0) {
|
||||
overflow = 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
/* Wake up consumer process */
|
||||
process_poll(&serial_line_process);
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(serial_line_process, ev, data)
|
||||
{
|
||||
static char buf[128];
|
||||
static char buf[BUFSIZE];
|
||||
static int ptr;
|
||||
|
||||
PROCESS_BEGIN();
|
||||
@ -110,20 +103,22 @@ PROCESS_THREAD(serial_line_process, ev, data)
|
||||
PROCESS_YIELD();
|
||||
} else {
|
||||
if(c != END) {
|
||||
buf[ptr++] = (uint8_t)c;
|
||||
if(ptr < BUFSIZE-1) {
|
||||
buf[ptr++] = (uint8_t)c;
|
||||
} else {
|
||||
/* Ignore character (wait for EOL) */
|
||||
}
|
||||
} else {
|
||||
/* Terminate */
|
||||
buf[ptr++] = (uint8_t)'\0';
|
||||
|
||||
if (ptr > 1) {
|
||||
/* Broadcast event */
|
||||
process_post(PROCESS_BROADCAST, serial_line_event_message, buf);
|
||||
/* Broadcast event */
|
||||
process_post(PROCESS_BROADCAST, serial_line_event_message, buf);
|
||||
|
||||
/* Wait until all processes have handled the serial line event */
|
||||
if(PROCESS_ERR_OK ==
|
||||
process_post(PROCESS_CURRENT(), PROCESS_EVENT_CONTINUE, NULL)) {
|
||||
PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_CONTINUE);
|
||||
}
|
||||
/* Wait until all processes have handled the serial line event */
|
||||
if(PROCESS_ERR_OK ==
|
||||
process_post(PROCESS_CURRENT(), PROCESS_EVENT_CONTINUE, NULL)) {
|
||||
PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_CONTINUE);
|
||||
}
|
||||
ptr = 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user