]> git.tdb.fi Git - model-railway-devices.git/blobdiff - arducontrol/s88.c
Drop the pretense of C89, put declarations where they make sense
[model-railway-devices.git] / arducontrol / s88.c
index 1ce574059fd848082d078e34033efeaa19abdd4d..142455a13ae551e1cb724e1a6b976e231d35e1ba 100644 (file)
 #define DATA PIN7
 #define BIT(x) (1<<(x))
 
-volatile uint8_t s88_read_count = 0;
-uint8_t s88_read_bit = 0;
-volatile uint8_t s88_read_phase = 0;
-uint8_t s88_data = 0;
-RINGBUFFER(s88_buffer, 8);
-uint8_t s88_out_index = 0;
+static volatile uint8_t s88_read_count = 0;
+static uint8_t s88_read_bit = 0;
+static volatile uint8_t s88_read_phase = 0;
+static uint8_t s88_data = 0;
+static RINGBUFFER(s88_buffer, 8);
+static uint8_t s88_out_index = 0;
 
 void s88_init(void)
 {
@@ -28,14 +28,17 @@ void s88_init(void)
 
 void s88_check(void)
 {
-       // Only send one packet per check to avoid blocking
-       if(ringbuffer_fill(s88_buffer)>0)
+       uint8_t count = ringbuffer_fill(s88_buffer);
+       if(count>=4 || (count>0 && !s88_read_count))
        {
-               uint8_t reply[3];
+               uint8_t reply[10];
+
                reply[0] = S88_DATA;
-               reply[1] = s88_out_index++;
-               reply[2] = ringbuffer_pop(s88_buffer);
-               interface_send(reply, sizeof(reply));
+               reply[1] = s88_out_index;
+               for(uint8_t i=0; i<count; ++i)
+                       reply[2+i] = ringbuffer_pop(s88_buffer);
+               interface_send(reply, 2+count);
+               s88_out_index += count;
        }
 }