altos: clean up radio abort paths. Share radio code.
[fw/altos] / src / ao_packet_master.c
index 72bb908a671e4e2f790f1f6492c340627e43468a..3b23ad92c882396f543a169c02053dbe1b7afcd7 100644 (file)
@@ -29,6 +29,8 @@ ao_packet_getchar(void) __critical
                        ao_wake_task(&ao_packet_task);
                ao_usb_flush();
                ao_sleep(&ao_stdin_ready);
+               if (!ao_packet_enable)
+                       break;
        }
        return c;
 }
@@ -75,8 +77,6 @@ ao_packet_master_check_busy(void)
 void
 ao_packet_master(void)
 {
-       uint8_t status;
-
        ao_config_get();
        ao_radio_set_packet();
        ao_tx_packet.addr = ao_serial_number;
@@ -90,8 +90,7 @@ ao_packet_master(void)
                        ao_packet_master_busy();
                ao_packet_master_check_busy();
                ao_alarm(ao_packet_master_delay);
-               status = ao_packet_recv();
-               if (status & AO_DMA_DONE) {
+               if (ao_packet_recv()) {
                        /* if we can transmit data, do so */
                        if (ao_packet_tx_used && ao_tx_packet.len == 0)
                                continue;
@@ -121,12 +120,15 @@ ao_packet_forward(void) __reentrant
                if (c == '\r') c = '\n';
                ao_packet_putchar(c);
        }
+
+       /* Wait for a second if there is any pending data */
+       for (c = 0; (ao_packet_tx_used || ao_tx_packet.len) && c < 10; c++)
+               ao_delay(AO_MS_TO_TICKS(100));
        ao_packet_enable = 0;
-       ao_radio_abort();
        while (ao_packet_echo_task.wchan || ao_packet_task.wchan) {
-               ao_wake_task(&ao_packet_echo_task);
-               ao_wake_task(&ao_packet_task);
-               ao_yield();
+               if (ao_packet_echo_task.wchan)
+                       ao_wake_task(&ao_packet_echo_task);
+               ao_delay(AO_MS_TO_TICKS(10));
        }
 }