Use ao_radio_get/ao_radio_put in packet code.
authorKeith Packard <keithp@keithp.com>
Sat, 19 Dec 2009 19:34:16 +0000 (11:34 -0800)
committerKeith Packard <keithp@keithp.com>
Sat, 19 Dec 2009 19:35:35 +0000 (11:35 -0800)
The ao_radio_get function both acquires the mutex *and* configures the
radio channel and frequency. Failing to use this in the packet code
would leave the radio frequency unconfigured.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/ao.h
src/ao_packet.c
src/ao_radio.c

index 39f7bea2d8db8734eb71abfbcb3ab31706687c08..096a4d80baf23b736821337be7e2d4374493a187 100644 (file)
--- a/src/ao.h
+++ b/src/ao.h
@@ -835,6 +835,11 @@ extern __xdata uint8_t ao_radio_mutex;
 void
 ao_radio_general_isr(void) interrupt 16;
 
+void
+ao_radio_get(void);
+
+#define ao_radio_put() ao_mutex_put(&ao_radio_mutex)
+
 void
 ao_radio_set_telemetry(void);
 
index 3ce7e9ab24c0bdfc957f690aa0b9c9ad8a5527e4..98fdcb90388c50803eea8b1ab3c965faa49ea98d 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);
 }
 
@@ -69,10 +68,7 @@ ao_packet_recv(void)
        uint8_t dma_done;
 
        ao_led_on(AO_LED_GREEN);
-       ao_config_get();
-       ao_mutex_get(&ao_radio_mutex);
-       ao_radio_idle();
-       RF_CHANNR = ao_config.radio_channel;
+       ao_radio_get();
        ao_dma_set_transfer(ao_radio_dma,
                            &RFDXADDR,
                            &ao_rx_packet,
@@ -89,7 +85,7 @@ 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();
        ao_led_off(AO_LED_GREEN);
 
        if (dma_done & AO_DMA_DONE) {
index 4dea6dce242934f7dd8f6e7d19b461133db125c8..1a0cf4fa2dee22546c5ea6c75f916cf6b411a584 100644 (file)
@@ -324,7 +324,7 @@ ao_radio_idle(void)
        }
 }
 
-static void
+void
 ao_radio_get(void)
 {
        ao_config_get();
@@ -336,7 +336,6 @@ ao_radio_get(void)
        RF_FREQ0 = (uint8_t) (ao_config.radio_cal);
 }
 
-#define ao_radio_put() ao_mutex_put(&ao_radio_mutex)
 
 void
 ao_radio_send(__xdata struct ao_telemetry *telemetry) __reentrant