#if PACKET_HAS_MASTER
__xdata uint8_t ao_packet_master_sleeping;
-__xdata uint8_t ao_packet_last_rssi;
#endif
void
}
uint8_t
-ao_packet_recv(void)
+ao_packet_recv(uint16_t timeout)
{
uint8_t dma_done;
#ifdef AO_LED_GREEN
ao_led_on(AO_LED_GREEN);
#endif
- dma_done = ao_radio_recv(&ao_rx_packet, sizeof (struct ao_packet_recv));
+ dma_done = ao_radio_recv(&ao_rx_packet, sizeof (struct ao_packet_recv), timeout);
#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 & AO_RADIO_STATUS_CRC_OK))
+ if (!(ao_rx_packet.status & AO_RADIO_STATUS_CRC_OK)) {
+ printf("bad crc addr %d len %d seq %d ack %d callsign %8.8s\n",
+ ao_rx_packet.packet.addr,
+ ao_rx_packet.packet.len,
+ ao_rx_packet.packet.seq,
+ ao_rx_packet.packet.ack,
+ ao_rx_packet.packet.callsign);
+ flush();
return 0;
+ }
-#if PACKET_HAS_MASTER
- ao_packet_last_rssi = ao_rx_packet.rssi;
-#endif
/* Accept packets with matching call signs, or any packet if
* our callsign hasn't been configured
*/
if (ao_xmemcmp(ao_rx_packet.packet.callsign,
ao_config.callsign,
AO_MAX_CALLSIGN) != 0 &&
- ao_xmemcmp(ao_config.callsign, CODE_TO_XDATA("N0CALL"), 7) != 0)
+ ao_xmemcmp(ao_config.callsign, CODE_TO_XDATA("N0CALL"), 7) != 0) {
+ printf ("bad call\n"); flush();
return 0;
+ }
/* SYN packets carry no data */
if (ao_rx_packet.packet.len == AO_PACKET_SYN) {
tx_data[ao_packet_tx_used++] = c;
}
+/* May be called with interrupts blocked */
int
-ao_packet_pollchar(void)
+_ao_packet_pollchar(void)
{
- /* No need to block interrupts, all variables here
- * are only manipulated in task context
- */
if (!ao_packet_enable)
return AO_READ_AGAIN;