cystatus CyBtldrCommRead (uint8* buffer, uint16 size, uint16* count, uint8 timeOut) { int timeoutUs = timeOut * 10000; cystatus status = CYRET_TIMEOUT; *count = 0; while(*count < size && timeoutUs >= 0) { if(UART_SpiUartGetRxBufferSize() > 0) { buffer[(*count)++] = UART_UartGetByte(); // Switch to byte-to-byte timeout and mark as success timeoutUs = 10000; //10mS status = CYRET_SUCCESS; } else { CyDelayUs(10); timeoutUs -= 10; } } return status; }
/******************************************************************************* * Function Name: HandleUartTxTraffic ******************************************************************************** * * Summary: * This function takes data from UART RX buffer and pushes it to the server * as Write Without Response command. * * Parameters: * None. * * Return: * None. * *******************************************************************************/ void HandleUartTxTraffic(void) { uint8 index; uint8 uartTxData[MAX_MTU_SIZE - 3]; uint16 uartTxDataLength; static uint16 uartIdleCount = UART_IDLE_TIMEOUT; CYBLE_API_RESULT_T bleApiResult; CYBLE_GATTC_WRITE_CMD_REQ_T uartTxDataWriteCmd; uartTxDataLength = UART_SpiUartGetRxBufferSize(); #ifdef FLOW_CONTROL if(uartTxDataLength >= (UART_UART_RX_BUFFER_SIZE - (UART_UART_RX_BUFFER_SIZE/2))) { DisableUartRxInt(); } else { EnableUartRxInt(); } #endif if((uartTxDataLength != 0)) { if(uartTxDataLength >= (mtuSize - 3)) { uartIdleCount = UART_IDLE_TIMEOUT; uartTxDataLength = mtuSize - 3; } else { if(--uartIdleCount == 0) { /*uartTxDataLength remains unchanged */; } else { uartTxDataLength = 0; } } if(0 != uartTxDataLength) { uartIdleCount = UART_IDLE_TIMEOUT; for(index = 0; index < uartTxDataLength; index++) { uartTxData[index] = (uint8) UART_UartGetByte(); } uartTxDataWriteCmd.attrHandle = rxCharHandle; uartTxDataWriteCmd.value.len = uartTxDataLength; uartTxDataWriteCmd.value.val = uartTxData; #ifdef FLOW_CONTROL DisableUartRxInt(); #endif do { bleApiResult = CyBle_GattcWriteWithoutResponse(cyBle_connHandle, &uartTxDataWriteCmd); CyBle_ProcessEvents(); } while((CYBLE_ERROR_OK != bleApiResult) && (CYBLE_STATE_CONNECTED == cyBle_state)); } } }