/************************************************************************************************** * @fn macTxAckNotReceivedCallback * * @brief This function is called by the receive logic when transmit is listening * for an ACK but something else is received. It is also called if the * listen-for-ACK timeout is reached. * * @brief * * @param none * * @return none ************************************************************************************************** */ MAC_INTERNAL_API void macTxAckNotReceivedCallback(void) { halIntState_t s; /* only process if listening for an ACK; critical section prevents race condition problems */ HAL_ENTER_CRITICAL_SECTION(s); if (macTxActive == MAC_TX_ACTIVE_LISTEN_FOR_ACK) { macTxActive = MAC_TX_ACTIVE_POST_ACK; MAC_RADIO_TX_CANCEL_ACK_TIMEOUT_CALLBACK(); HAL_EXIT_CRITICAL_SECTION(s); /* a non-ACK was received when expecting an ACK, per spec transmit is over at this point */ txComplete(MAC_NO_ACK); } else { HAL_EXIT_CRITICAL_SECTION(s); } }
/************************************************************************************************** * @fn macTxAckReceivedCallback * * @brief This function is called by the receive logic when an ACK is received and * transmit logic is listening for an ACK. * * @param seqn - sequence number of received ACK * @param pendingFlag - set if pending flag of ACK is set, cleared otherwise * * @return none ************************************************************************************************** */ MAC_INTERNAL_API void macTxAckReceivedCallback(uint8 seqn, uint8 pendingFlag) { halIntState_t s; /* only process if listening for an ACK; critical section prevents race condition problems */ HAL_ENTER_CRITICAL_SECTION(s); if (macTxActive == MAC_TX_ACTIVE_LISTEN_FOR_ACK) { macTxActive = MAC_TX_ACTIVE_POST_ACK; MAC_RADIO_TX_CANCEL_ACK_TIMEOUT_CALLBACK(); HAL_EXIT_CRITICAL_SECTION(s); /* see if the sequence number of received ACK matches sequence number of packet just sent */ if (seqn == txSeqn) { /* * Sequence numbers match so transmit is successful. Return appropriate * status based on the pending flag of the received ACK. */ if (pendingFlag) { txComplete(MAC_ACK_PENDING); } else { txComplete(MAC_SUCCESS); } } else { /* sequence number did not match; per spec, transmit failed at this point */ txComplete(MAC_NO_ACK); } } else { HAL_EXIT_CRITICAL_SECTION(s); } }
/************************************************************************************************** * @fn macTxAckReceived * * @brief Function called by interrupt routine when an ACK is received. * * @param seqn - sequence number of received ACK * @param pendingFlag - set to TRUE if pending flag of ACK is set, FALSE otherwise * * @return none ************************************************************************************************** */ void macTxAckReceived(uint8 seqn, uint8 pendingFlag) { halIntState_t s; /* only process the received ACK if the macTxListenForAck flag is set */ HAL_ENTER_CRITICAL_SECTION(s); if (macTxListenForAck) { macTxListenForAck = FALSE; HAL_EXIT_CRITICAL_SECTION(s); /* cancel the ACK callback */ MAC_RADIO_TX_CANCEL_ACK_TIMEOUT_CALLBACK(); /* see if the sequence number of received ACK matches sequence number of packet just sent */ if (seqn == txSeqn) { /* * Sequence numbers match so transmit is successful. Return appropriate * status based on the pending flag of the received ACK. */ if (pendingFlag) { txComplete(MAC_ACK_PENDING); } else { txComplete(MAC_SUCCESS); } } else { /* sequence number did not match; per spec, transmit failed at this point */ txComplete(MAC_NO_ACK); } } HAL_EXIT_CRITICAL_SECTION(s); }