altos: Configure packet size from send/recv parameters.
authorKeith Packard <keithp@keithp.com>
Sun, 20 Mar 2011 06:31:20 +0000 (23:31 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 20 Mar 2011 06:31:20 +0000 (23:31 -0700)
Instead of setting the packet size at configuration time, use the
provided packet size to the send/recv functions to configure the
radio. This eliminates many configuration calls, leaving us with 'RDF'
mode and 'packet' mode, the latter working for telemetry and the
bi-directional link.

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

index 00c395d6437663195721aa9991eacec4b19d2f81..e076831d98ef8fff3f057590d820b8f9c15464b8 100644 (file)
--- a/src/ao.h
+++ b/src/ao.h
@@ -962,18 +962,12 @@ void
 ao_radio_general_isr(void) __interrupt 16;
 
 void
-ao_radio_get(void);
+ao_radio_get(uint8_t len);
 
 #define ao_radio_put() ao_mutex_put(&ao_radio_mutex)
 
 void
-ao_radio_set_fixed_pkt(size_t size);
-
-#define ao_radio_set_telemetry() \
-        ao_radio_set_fixed_pkt(sizeof (struct ao_telemetry))
-
-#define ao_radio_set_packet() \
-        ao_radio_set_fixed_pkt(sizeof (struct ao_packet))
+ao_radio_set_packet(void);
 
 void
 ao_radio_send(__xdata void *data, uint8_t size) __reentrant;
index 5c4ab0ddd3f8b9914e47df9257a978d7bd8091f0..069bc5df4044f9fadb2c1e6e1f6e0a1a2894b0aa 100644 (file)
@@ -75,7 +75,6 @@ void
 ao_packet_master(void)
 {
        ao_config_get();
-       ao_radio_set_packet();
        ao_tx_packet.addr = ao_serial_number;
        ao_tx_packet.len = AO_PACKET_SYN;
        ao_packet_master_time = ao_time();
@@ -99,7 +98,6 @@ ao_packet_master(void)
                        ao_packet_master_sleeping = 0;
                }
        }
-       ao_radio_set_telemetry();
        ao_exit();
 }
 
index e40ddfec4a2ec2917c36e1843bf77e5c7f02c08e..9f14052af406c9293b3fbeeb7a73b92c3fff438c 100644 (file)
@@ -20,7 +20,6 @@
 void
 ao_packet_slave(void)
 {
-       ao_radio_set_packet();
        ao_tx_packet.addr = ao_serial_number;
        ao_tx_packet.len = AO_PACKET_SYN;
        while (ao_packet_enable) {
@@ -51,9 +50,6 @@ ao_packet_slave_stop(void)
                        ao_radio_recv_abort();
                        ao_delay(AO_MS_TO_TICKS(10));
                }
-               ao_radio_get();
-               ao_radio_set_telemetry();
-               ao_radio_put();
        }
 }
 
index d7c00213dfac795e312d29004df08b9278d9a8ad..b5a67b99d025d9801cb5b5a87a2ad61c72511ea6 100644 (file)
@@ -264,12 +264,11 @@ ao_radio_general_isr(void) __interrupt 16
 }
 
 void
-ao_radio_set_fixed_pkt(size_t size)
+ao_radio_set_packet(void)
 {
        uint8_t i;
        for (i = 0; i < sizeof (fixed_pkt_setup); i += 2)
                RF[fixed_pkt_setup[i]] = fixed_pkt_setup[i+1];
-       RF[RF_PKTLEN_OFF] = size;
 }
 
 void
@@ -285,7 +284,7 @@ ao_radio_idle(void)
 }
 
 void
-ao_radio_get(void)
+ao_radio_get(uint8_t len)
 {
        ao_config_get();
        ao_mutex_get(&ao_radio_mutex);
@@ -294,13 +293,14 @@ ao_radio_get(void)
        RF_FREQ2 = (uint8_t) (ao_config.radio_cal >> 16);
        RF_FREQ1 = (uint8_t) (ao_config.radio_cal >> 8);
        RF_FREQ0 = (uint8_t) (ao_config.radio_cal);
+       RF_PKTLEN = len;
 }
 
 
 void
 ao_radio_send(__xdata void *packet, uint8_t size) __reentrant
 {
-       ao_radio_get();
+       ao_radio_get(size);
        ao_radio_done = 0;
        ao_dma_set_transfer(ao_radio_dma,
                            packet,
@@ -323,7 +323,7 @@ uint8_t
 ao_radio_recv(__xdata void *packet, uint8_t size) __reentrant
 {
        ao_radio_abort = 0;
-       ao_radio_get();
+       ao_radio_get(size - 2);
        ao_dma_set_transfer(ao_radio_dma,
                            &RFDXADDR,
                            packet,
@@ -375,12 +375,6 @@ ao_radio_rdf(int ms)
        uint8_t i;
        uint8_t pkt_len;
 
-       ao_radio_abort = 0;
-       ao_radio_get();
-       ao_radio_done = 0;
-       for (i = 0; i < sizeof (rdf_setup); i += 2)
-               RF[rdf_setup[i]] = rdf_setup[i+1];
-
        /*
         * Compute the packet length as follows:
         *
@@ -391,7 +385,12 @@ ao_radio_rdf(int ms)
        if (ms > (255 * 4))
                ms = 255 * 4;
        pkt_len = ms >> 2;
-       RF[RF_PKTLEN_OFF] = pkt_len;
+
+       ao_radio_abort = 0;
+       ao_radio_get(pkt_len);
+       ao_radio_done = 0;
+       for (i = 0; i < sizeof (rdf_setup); i += 2)
+               RF[rdf_setup[i]] = rdf_setup[i+1];
 
        ao_dma_set_transfer(ao_radio_dma,
                            &ao_radio_rdf_value,
@@ -411,7 +410,7 @@ ao_radio_rdf(int ms)
                ao_dma_abort(ao_radio_dma);
                ao_radio_idle();
        }
-       ao_radio_set_telemetry();
+       ao_radio_set_packet();
        ao_radio_put();
 }
 
@@ -438,7 +437,7 @@ ao_radio_test(void)
        if ((mode & 2) && !radio_on) {
                ao_set_monitor(0);
                ao_packet_slave_stop();
-               ao_radio_get();
+               ao_radio_get(0xff);
                RFST = RFST_STX;
                radio_on = 1;
        }
@@ -465,7 +464,7 @@ ao_radio_init(void)
        uint8_t i;
        for (i = 0; i < sizeof (radio_setup); i += 2)
                RF[radio_setup[i]] = radio_setup[i+1];
-       ao_radio_set_telemetry();
+       ao_radio_set_packet();
        ao_radio_dma_done = 1;
        ao_radio_dma = ao_dma_alloc(&ao_radio_dma_done);
        RFIF = 0;