static uint8_t CheckTx(void) { RPHY_PacketDesc packet; uint8_t res = ERR_OK; uint8_t TxDataBuffer[RPHY_BUFFER_SIZE]; if (RMSG_GetTxMsg(TxDataBuffer, sizeof(TxDataBuffer))==ERR_OK) { RF1_StopRxTx(); /* CE low */ TX_POWERUP(); /* set up packet structure */ packet.phyData = &TxDataBuffer[0]; packet.flags = RPHY_BUF_FLAGS(packet.phyData); packet.phySize = sizeof(TxDataBuffer); #if NRF24_DYNAMIC_PAYLOAD packet.rxtx = RPHY_BUF_PAYLOAD_START(packet.phyData); #else packet.rxtx = &RPHY_BUF_SIZE(packet.phyData); /* we transmit the data size too */ #endif if (RADIO_isSniffing) { RPHY_SniffPacket(&packet, TRUE); /* sniff outgoing packet */ } #if NRF24_DYNAMIC_PAYLOAD RF1_TxPayload(packet.rxtx, RPHY_BUF_SIZE(packet.phyData)); /* send data, using dynamic payload size */ #else RF1_TxPayload(packet.rxtx, RPHY_PAYLOAD_SIZE); /* send data, using fixed payload size */ #endif return ERR_OK; } else { return ERR_NOTAVAIL; /* no data to send? */ } return res; }
/* called to check if we have something in the RX queue. If so, we queue it */ static uint8_t CheckRx(void) { uint8_t res = ERR_OK; uint8_t RxDataBuffer[RPHY_BUFFER_SIZE]; uint8_t status; RPHY_PacketDesc packet; bool hasRxData; hasRxData = FALSE; packet.flags = RPHY_PACKET_FLAGS_NONE; packet.phyData = &RxDataBuffer[0]; packet.phySize = sizeof(RxDataBuffer); #if NRF24_DYNAMIC_PAYLOAD packet.rxtx = RPHY_BUF_PAYLOAD_START(packet.phyData); #else packet.rxtx = &RPHY_BUF_SIZE(packet.phyData); /* we transmit the data size too */ #endif status = RF1_GetStatus(); if (status&RF1_STATUS_RX_DR) { /* data received interrupt */ hasRxData = TRUE; #if NRF24_DYNAMIC_PAYLOAD uint8_t payloadSize; (void)RF1_ReadNofRxPayload(&payloadSize); if (payloadSize>32) { /* packet with error? */ RF1_Write(RF1_FLUSH_RX); /* flush old data */ return ERR_FAILED; } else { RF1_RxPayload(packet.rxtx, payloadSize); /* get payload: note that we transmit <size> as payload! */ RPHY_BUF_SIZE(packet.phyData) = payloadSize; } #else RF1_RxPayload(packet.rxtx, RPHY_PAYLOAD_SIZE); /* get payload: note that we transmit <size> as payload! */ #endif RF1_ResetStatusIRQ(RF1_STATUS_RX_DR|RF1_STATUS_TX_DS|RF1_STATUS_MAX_RT); /* make sure we reset all flags. Need to have the pipe number too */ } if (status&RF1_STATUS_TX_DS) { /* data sent interrupt */ RF1_ResetStatusIRQ(RF1_STATUS_TX_DS); /* clear bit */ } if (status&RF1_STATUS_MAX_RT) { /* retry timeout interrupt */ RF1_ResetStatusIRQ(RF1_STATUS_MAX_RT); /* clear bit */ } if (hasRxData) { /* put message into Rx queue */ res = RMSG_QueueRxMsg(packet.phyData, packet.phySize, RPHY_BUF_SIZE(packet.phyData), packet.flags); if (res!=ERR_OK) { if (res==ERR_OVERFLOW) { Err((unsigned char*)"ERR: Rx queue overflow!\r\n"); } else { Err((unsigned char*)"ERR: Rx Queue full?\r\n"); } } } return res; }