/** * \brief Radio RF233 process, infinitely awaits a poll, then checks radio * state and handles received data. */ PROCESS_THREAD(rf233_radio_process, ev, data) { int len; PROCESS_BEGIN(); PRINTF("RF233: started.\r\n"); while(1) { PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL); PRINTF("RF233: polled.\r\n"); if(interrupt_callback_wants_poll) { rf233_interrupt_poll(); } packetbuf_clear(); // packetbuf_set_attr(PACKETBUF_ATTR_TIMESTAMP, last_packet_timestamp); len = rf233_read(packetbuf_dataptr(), PACKETBUF_SIZE); if(len > 0) { packetbuf_set_datalen(len); NETSTACK_RDC.input(); } else { PRINTF("RF233: error while reading: %d\r\n", len); } } PROCESS_END(); }
void interrupt_callback() { volatile uint8_t irq_source; PRINTF("RF233: interrupt handler.\n"); /* handle IRQ source (for what IRQs are enabled, see rf233-config.h) */ irq_source = trx_reg_read(RF233_REG_IRQ_STATUS); PRINTF(" interrupt sources: 0x%x\n", (int)irq_source); if (irq_source & IRQ_PLL_LOCK) { PRINTF("RF233: PLL locked.\n"); radio_pll = true; return; } else if (irq_source == IRQ_RX_START) { PRINTF("RF233: Interrupt receive start.\n"); } else if (irq_source == IRQ_TRX_DONE) { PRINTF("RF233: TRX_DONE handler.\n"); // Completed a transmission if (flag_transmit != 0) { PRINTF("RF233: Interrupt transmit.\n"); flag_transmit = 0; if (!(trx_reg_read(RF233_REG_TRX_STATE) & TRX_STATE_TRAC_STATUS)) { flag_transmit = ack_status = 1; } RF233_COMMAND(TRXCMD_RX_ON); PRINTF("RF233: TX complete, go back to RX with acks on.\n"); radio_tx = true; return; } else { //PRINTF("RF233: Interrupt receive.\n"); packetbuf_clear(); pending_frame = 1; int len = rf233_read(packetbuf_dataptr(), MAX_PACKET_LEN); if (len > 0) { PRINTF("RF233: Received packet and read from device.\n\n"); } else { PRINTF("RF233: Read failed.\n\n"); } radio_rx = true; return; } } }