From 3f0bc801fd08a613c681504f0d1f9374486a2487 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 19 Mar 2011 23:31:20 -0700 Subject: [PATCH] altos: Configure packet size from send/recv parameters. 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 --- src/ao.h | 10 ++-------- src/ao_packet_master.c | 2 -- src/ao_packet_slave.c | 4 ---- src/ao_radio.c | 29 ++++++++++++++--------------- 4 files changed, 16 insertions(+), 29 deletions(-) diff --git a/src/ao.h b/src/ao.h index 00c395d6..e076831d 100644 --- 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; diff --git a/src/ao_packet_master.c b/src/ao_packet_master.c index 5c4ab0dd..069bc5df 100644 --- a/src/ao_packet_master.c +++ b/src/ao_packet_master.c @@ -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(); } diff --git a/src/ao_packet_slave.c b/src/ao_packet_slave.c index e40ddfec..9f14052a 100644 --- a/src/ao_packet_slave.c +++ b/src/ao_packet_slave.c @@ -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(); } } diff --git a/src/ao_radio.c b/src/ao_radio.c index d7c00213..b5a67b99 100644 --- a/src/ao_radio.c +++ b/src/ao_radio.c @@ -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; -- 2.30.2