eARNETWORK_ERROR ARNETWORK_Receiver_ReturnACK (ARNETWORK_Receiver_t *receiverPtr, int id, uint8_t seq) { /** -- return an acknowledgement -- */ /** local declarations */ eARNETWORK_ERROR error = ARNETWORK_OK; ARNETWORK_IOBuffer_t* ACKIOBufferPtr = receiverPtr->outputBufferPtrMap[ARNETWORK_Manager_IDOutputToIDAck (receiverPtr->networkALManager, id)]; if (ACKIOBufferPtr != NULL) { int isEmpty = ARNETWORK_RingBuffer_IsEmpty(ACKIOBufferPtr->dataDescriptorRBuffer); error = ARNETWORK_IOBuffer_AddData (ACKIOBufferPtr, (uint8_t*) &seq, sizeof(seq), NULL, NULL, 1); if (error == ARNETWORK_OK && isEmpty > 0) { ARNETWORK_Sender_SignalNewData (receiverPtr->senderPtr); } } return error; }
eARNETWORK_ERROR ARNETWORK_Sender_AckReceived (ARNETWORK_Sender_t *senderPtr, int identifier, uint8_t seqNumber) { /** -- Receive an acknowledgment fo a data -- */ /** local declarations */ ARNETWORK_IOBuffer_t *inputBufferPtr = NULL; eARNETWORK_ERROR error = ARNETWORK_OK; inputBufferPtr = senderPtr->inputBufferPtrMap[identifier]; if (inputBufferPtr != NULL) { /** lock the IOBuffer */ error = ARNETWORK_IOBuffer_Lock (inputBufferPtr); if (error == ARNETWORK_OK) { /** * Transmit the acknowledgment to the input buffer. * if the acknowledgment is suiarray the waiting data is popped */ error = ARNETWORK_IOBuffer_AckReceived (inputBufferPtr, seqNumber); /** unlock the IOBuffer */ ARNETWORK_IOBuffer_Unlock (inputBufferPtr); /* Wake up the send thread to update the wait time of buffers */ ARNETWORK_Sender_SignalNewData (senderPtr); } } else { error = ARNETWORK_ERROR_ID_UNKNOWN; } return error; }