serial: read buffering
authorTero Marttila <terom@paivola.fi>
Fri, 11 Apr 2014 19:30:41 +0300
changeset 69 ef9fe98ebf72
parent 68 be139319a961
child 70 72175852afd2
serial: read buffering
src/hello-dmx.c
src/serial.c
--- a/src/hello-dmx.c	Fri Apr 11 19:18:15 2014 +0300
+++ b/src/hello-dmx.c	Fri Apr 11 19:30:41 2014 +0300
@@ -298,24 +298,16 @@
         // sleep
         //led_on();
         if (timer_sleep(timeout)) {
-            //c = ' ';
             led_toggle();
-            c = 0;
-
-        } else if ((c = serial_read())) {
-            // got serial data
-            c = input(c);
+        }
 
-        } else {
-            // unknown interrupt
-            c = '?';
+        // input
+        while ((c = serial_read())) {
+            serial_write(input(c));
         }
+
         //led_off();
         
-        if (c)
-            // respond
-            serial_write(c);
-        
         // output
         update();
     }
--- a/src/serial.c	Fri Apr 11 19:18:15 2014 +0300
+++ b/src/serial.c	Fri Apr 11 19:30:41 2014 +0300
@@ -20,7 +20,13 @@
 } serial_chars = SERIAL_CHARS_8;
 
 /** Serial state */
-char serial_rx = 0;
+#define SERIAL_BUF 64
+
+struct serial {
+    char buf[SERIAL_BUF];
+    byte in, out;
+} serial_rx;
+
 char serial_tx = 0;
 
 void serial_enable (char rx, char tx);
@@ -88,7 +94,10 @@
  */
 ISR(USART_RX_vect)
 {
-    serial_rx = UDR0;
+    serial_rx.buf[serial_rx.in++] = UDR0;
+
+    if (serial_rx.in >= SERIAL_BUF)
+        serial_rx.in = 0;
 }
 
 /*
@@ -107,10 +116,13 @@
 
 char serial_read ()
 {
-    char rx = serial_rx;
+    if (serial_rx.out == serial_rx.in)
+        return 0;
 
-    // rx buffer consumed
-    serial_rx = 0;
+    char rx = serial_rx.buf[serial_rx.out++];
+
+    if (serial_rx.out >= SERIAL_BUF)
+        serial_rx.out = 0;
 
     return rx;
 }