Only have the slave return a packet if it received one.
[fw/altos] / src / ao_packet_slave.c
index ba5ad1c1d13e6f0ca2cb4069454cb5fdf66d721e..e03ebdc3a20cd90475ee00ea1610b3a3a6f28260 100644 (file)
 void
 ao_packet_slave(void)
 {
+       uint8_t status;
+
        ao_radio_set_packet();
        ao_tx_packet.addr = ao_serial_number;
        ao_tx_packet.len = AO_PACKET_SYN;
        while (ao_packet_enable) {
-               ao_packet_recv();
-               ao_packet_send();
+               status = ao_packet_recv();
+               if (status & AO_DMA_DONE)
+                       ao_packet_send();
        }
        ao_exit();
 }
@@ -40,13 +43,15 @@ ao_packet_slave_start(void)
 void
 ao_packet_slave_stop(void)
 {
-       ao_packet_enable = 0;
-       ao_radio_abort();
-       while (ao_packet_task.wchan) {
-               ao_wake_task(&ao_packet_task);
-               ao_yield();
+       if (ao_packet_enable) {
+               ao_packet_enable = 0;
+               ao_radio_abort();
+               while (ao_packet_task.wchan) {
+                       ao_wake_task(&ao_packet_task);
+                       ao_yield();
+               }
+               ao_radio_set_telemetry();
        }
-       ao_radio_set_telemetry();
 }
 
 void
@@ -54,5 +59,5 @@ ao_packet_slave_init(void)
 {
        ao_add_stdio(ao_packet_pollchar,
                     ao_packet_putchar,
-                    ao_packet_flush);
+                    NULL);
 }