src/serial.c
changeset 69 ef9fe98ebf72
parent 53 dfe67409fbcd
equal deleted inserted replaced
68:be139319a961 69:ef9fe98ebf72
    18 static enum {
    18 static enum {
    19     SERIAL_CHARS_8      = 0b011,
    19     SERIAL_CHARS_8      = 0b011,
    20 } serial_chars = SERIAL_CHARS_8;
    20 } serial_chars = SERIAL_CHARS_8;
    21 
    21 
    22 /** Serial state */
    22 /** Serial state */
    23 char serial_rx = 0;
    23 #define SERIAL_BUF 64
       
    24 
       
    25 struct serial {
       
    26     char buf[SERIAL_BUF];
       
    27     byte in, out;
       
    28 } serial_rx;
       
    29 
    24 char serial_tx = 0;
    30 char serial_tx = 0;
    25 
    31 
    26 void serial_enable (char rx, char tx);
    32 void serial_enable (char rx, char tx);
    27 
    33 
    28 /*
    34 /*
    86 /*
    92 /*
    87  * Read incoming into buffer.
    93  * Read incoming into buffer.
    88  */
    94  */
    89 ISR(USART_RX_vect)
    95 ISR(USART_RX_vect)
    90 {
    96 {
    91     serial_rx = UDR0;
    97     serial_rx.buf[serial_rx.in++] = UDR0;
       
    98 
       
    99     if (serial_rx.in >= SERIAL_BUF)
       
   100         serial_rx.in = 0;
    92 }
   101 }
    93 
   102 
    94 /*
   103 /*
    95  * Write outgoing buffer.
   104  * Write outgoing buffer.
    96  */
   105  */
   105     serial_enable(1, 0);
   114     serial_enable(1, 0);
   106 }
   115 }
   107 
   116 
   108 char serial_read ()
   117 char serial_read ()
   109 {
   118 {
   110     char rx = serial_rx;
   119     if (serial_rx.out == serial_rx.in)
       
   120         return 0;
   111 
   121 
   112     // rx buffer consumed
   122     char rx = serial_rx.buf[serial_rx.out++];
   113     serial_rx = 0;
   123 
       
   124     if (serial_rx.out >= SERIAL_BUF)
       
   125         serial_rx.out = 0;
   114 
   126 
   115     return rx;
   127     return rx;
   116 }
   128 }
   117 
   129 
   118 void serial_write (char c)
   130 void serial_write (char c)