- ao_config_get();
- ao_mutex_get(&ao_radio_mutex);
- ao_radio_idle();
- RF_CHANNR = ao_config.radio_channel;
- ao_dma_set_transfer(ao_radio_dma,
- &RFDXADDR,
- &rx_packet,
- sizeof (struct ao_packet_recv),
- DMA_CFG0_WORDSIZE_8 |
- DMA_CFG0_TMODE_SINGLE |
- DMA_CFG0_TRIGGER_RADIO,
- DMA_CFG1_SRCINC_0 |
- DMA_CFG1_DESTINC_1 |
- DMA_CFG1_PRIORITY_HIGH);
- ao_dma_start(ao_radio_dma);
- RFST = RFST_SRX;
- __critical while (!ao_radio_dma_done)
- if (ao_sleep(&ao_radio_dma_done) != 0) {
- printf("recv timeout\n"); flush();
- ao_radio_abort();
- }
- dma_done = ao_radio_dma_done;
- ao_mutex_put(&ao_radio_mutex);
-
- if (dma_done & AO_DMA_DONE) {
- printf ("rssi %d status %x\n", rx_packet.rssi, rx_packet.status); flush();
- if (!(rx_packet.status & PKT_APPEND_STATUS_1_CRC_OK)) {
- printf ("bad crc\n"); flush();
-// return AO_DMA_ABORTED;
- }
- if (rx_packet.packet.len) {
- if (rx_packet.packet.seq == rx_seq + 1 && rx_used == rx_len)
- {
- memcpy(rx_data, rx_packet.packet.d, rx_packet.packet.len);
- rx_used = 0;
- rx_len = rx_packet.packet.len;
- rx_seq = rx_packet.packet.seq;
- tx_packet.ack = rx_seq;
- ao_wakeup(&rx_data);
- }
- }
- if (rx_packet.packet.ack == tx_packet.seq) {
- tx_packet.len = 0;
- ao_wakeup(&tx_packet);
+#ifdef AO_LED_GREEN
+ ao_led_on(AO_LED_GREEN);
+#endif
+ dma_done = ao_radio_recv(&ao_rx_packet, sizeof (struct ao_packet_recv));
+#ifdef AO_LED_GREEN
+ ao_led_off(AO_LED_GREEN);
+#endif
+
+ /* Check to see if we got a valid packet */
+ if (!dma_done)
+ return 0;
+ if (!(ao_rx_packet.status & PKT_APPEND_STATUS_1_CRC_OK))
+ return 0;
+
+ /* SYN packets carry no data */
+ if (ao_rx_packet.packet.len == AO_PACKET_SYN) {
+ rx_seq = ao_rx_packet.packet.seq;
+ ao_tx_packet.seq = ao_rx_packet.packet.ack;
+ ao_tx_packet.ack = rx_seq;
+ } else if (ao_rx_packet.packet.len) {
+
+ /* Check for incoming data at the next sequence and
+ * for an empty data buffer
+ */
+ if (ao_rx_packet.packet.seq == (uint8_t) (rx_seq + (uint8_t) 1) &&
+ ao_packet_rx_used == ao_packet_rx_len) {
+
+ /* Copy data to the receive data buffer and set up the
+ * offsets
+ */
+ memcpy(rx_data, ao_rx_packet.packet.d, ao_rx_packet.packet.len);
+ ao_packet_rx_used = 0;
+ ao_packet_rx_len = ao_rx_packet.packet.len;
+
+ /* Mark the sequence that we've received to
+ * let the sender know when we return a packet
+ */
+ rx_seq = ao_rx_packet.packet.seq;
+ ao_tx_packet.ack = rx_seq;
+
+ /* Poke anyone looking for received data */
+ ao_wakeup(&ao_stdin_ready);