in lib/nxp/component/serial_manager/serial_manager.c [514:618]
static void SerialManager_RxCallback(void *callbackParam,
serial_manager_callback_message_t *message,
serial_manager_status_t status)
{
serial_manager_handle_t *handle;
uint32_t ringBufferLength;
uint32_t primask;
assert(callbackParam);
assert(message);
handle = (serial_manager_handle_t *)callbackParam;
status = kStatus_SerialManager_Notify;
for (uint32_t i = 0; i < message->length; i++)
{
handle->ringBuffer.ringBuffer[handle->ringBuffer.ringHead++] = message->buffer[i];
if (handle->ringBuffer.ringHead >= handle->ringBuffer.ringBufferSize)
{
handle->ringBuffer.ringHead = 0U;
}
if (handle->ringBuffer.ringHead == handle->ringBuffer.ringTail)
{
status = kStatus_SerialManager_RingBufferOverflow;
handle->ringBuffer.ringTail++;
if (handle->ringBuffer.ringTail >= handle->ringBuffer.ringBufferSize)
{
handle->ringBuffer.ringTail = 0U;
}
}
}
ringBufferLength = handle->ringBuffer.ringHead + handle->ringBuffer.ringBufferSize - handle->ringBuffer.ringTail;
ringBufferLength = ringBufferLength % handle->ringBuffer.ringBufferSize;
primask = DisableGlobalIRQ();
if ((NULL != handle->openedReadHandleHead) && (NULL != handle->openedReadHandleHead->transfer.buffer))
{
if (handle->openedReadHandleHead->transfer.length > handle->openedReadHandleHead->transfer.soFar)
{
uint32_t remainLength =
handle->openedReadHandleHead->transfer.length - handle->openedReadHandleHead->transfer.soFar;
for (uint32_t i = 0; i < MIN(ringBufferLength, remainLength); i++)
{
handle->openedReadHandleHead->transfer.buffer[handle->openedReadHandleHead->transfer.soFar] =
handle->ringBuffer.ringBuffer[handle->ringBuffer.ringTail];
handle->ringBuffer.ringTail++;
handle->openedReadHandleHead->transfer.soFar++;
if (handle->ringBuffer.ringTail >= handle->ringBuffer.ringBufferSize)
{
handle->ringBuffer.ringTail = 0U;
}
}
ringBufferLength = ringBufferLength - MIN(ringBufferLength, remainLength);
}
if (handle->openedReadHandleHead->transfer.length > handle->openedReadHandleHead->transfer.soFar)
{
}
else
{
if (kSerialManager_TransmissionBlocking == handle->openedReadHandleHead->transfer.mode)
{
handle->openedReadHandleHead->transfer.buffer = NULL;
}
else
{
handle->openedReadHandleHead->transfer.status = kStatus_SerialManager_Success;
#if defined(OSA_USED)
#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
handle->commontaskMsg.callback = SerialManager_Task;
handle->commontaskMsg.callbackParam = handle;
COMMON_TASK_post_message(&handle->commontaskMsg);
#else
(void)OSA_EventSet((osa_event_handle_t)handle->event, SERIAL_EVENT_DATA_RECEIVED);
#endif
#else
SerialManager_Task(handle);
#endif
}
}
}
if (0U != ringBufferLength)
{
message->buffer = NULL;
message->length = ringBufferLength;
if ((NULL != handle->openedReadHandleHead) && (NULL != handle->openedReadHandleHead->callback))
{
handle->openedReadHandleHead->callback(handle->openedReadHandleHead->callbackParam, message, status);
}
}
ringBufferLength = handle->ringBuffer.ringBufferSize - 1U - ringBufferLength;
if (NULL != handle->openedReadHandleHead)
{
(void)SerialManager_StartReading(handle, handle->openedReadHandleHead, NULL, ringBufferLength);
}
EnableGlobalIRQ(primask);
}