Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
[fw/altos] / src / ao_packet.c
index 3ce7e9ab24c0bdfc957f690aa0b9c9ad8a5527e4..d52f2a68b89815ee9f89896dbc874e8eed966cc2 100644 (file)
@@ -33,8 +33,9 @@ void
 ao_packet_send(void)
 {
        ao_led_on(AO_LED_RED);
-       ao_config_get();
-       ao_mutex_get(&ao_radio_mutex);
+       ao_radio_get();
+
+       /* If any tx data is pending then copy it into the tx packet */
        if (ao_packet_tx_used && ao_tx_packet.len == 0) {
                memcpy(&ao_tx_packet.d, tx_data, ao_packet_tx_used);
                ao_tx_packet.len = ao_packet_tx_used;
@@ -42,9 +43,7 @@ ao_packet_send(void)
                ao_packet_tx_used = 0;
                ao_wakeup(&tx_data);
        }
-       ao_radio_idle();
        ao_radio_done = 0;
-       RF_CHANNR = ao_config.radio_channel;
        ao_dma_set_transfer(ao_radio_dma,
                            &ao_tx_packet,
                            &RFDXADDR,
@@ -59,7 +58,7 @@ ao_packet_send(void)
        RFST = RFST_STX;
        __critical while (!ao_radio_done)
                ao_sleep(&ao_radio_done);
-       ao_mutex_put(&ao_radio_mutex);
+       ao_radio_put();
        ao_led_off(AO_LED_RED);
 }
 
@@ -68,11 +67,10 @@ ao_packet_recv(void)
 {
        uint8_t dma_done;
 
+#ifdef AO_LED_GREEN
        ao_led_on(AO_LED_GREEN);
-       ao_config_get();
-       ao_mutex_get(&ao_radio_mutex);
-       ao_radio_idle();
-       RF_CHANNR = ao_config.radio_channel;
+#endif
+       ao_radio_get();
        ao_dma_set_transfer(ao_radio_dma,
                            &RFDXADDR,
                            &ao_rx_packet,
@@ -89,8 +87,10 @@ ao_packet_recv(void)
                           if (ao_sleep(&ao_radio_dma_done) != 0)
                                   ao_radio_abort();
        dma_done = ao_radio_dma_done;
-       ao_mutex_put(&ao_radio_mutex);
+       ao_radio_put();
+#ifdef AO_LED_GREEN
        ao_led_off(AO_LED_GREEN);
+#endif
 
        if (dma_done & AO_DMA_DONE) {
                if (!(ao_rx_packet.status & PKT_APPEND_STATUS_1_CRC_OK))
@@ -117,6 +117,11 @@ ao_packet_recv(void)
        return dma_done;
 }
 
+#ifndef PACKET_HAS_MASTER
+#define PACKET_HAS_MASTER 1
+#endif
+
+#if PACKET_HAS_MASTER
 void
 ao_packet_flush(void)
 {
@@ -126,12 +131,15 @@ ao_packet_flush(void)
        if (ao_packet_tx_used && ao_packet_master_sleeping)
                ao_wake_task(&ao_packet_task);
 }
+#endif /* PACKET_HAS_MASTER */
 
 void
 ao_packet_putchar(char c) __reentrant
 {
        while (ao_packet_tx_used == AO_PACKET_MAX && ao_packet_enable) {
+#if PACKET_HAS_MASTER
                ao_packet_flush();
+#endif
                ao_sleep(&tx_data);
        }