platform_result_t platform_uart_receive_bytes( platform_uart_driver_t* driver, uint8_t* data_in, uint32_t expected_data_size, uint32_t timeout_ms ) { /*The following is a temporary implemenration of the UART*/ platform_result_t result = PLATFORM_SUCCESS; wiced_assert( "bad argument", ( driver != NULL ) && ( data_in != NULL ) && ( expected_data_size != 0 ) ); if ( driver->rx_buffer != NULL ) { while ( expected_data_size != 0 ) { uint32_t transfer_size = MIN( driver->rx_buffer->size / 2, expected_data_size ); /* Check if ring buffer already contains the required amount of data. */ if ( transfer_size > ring_buffer_used_space( driver->rx_buffer ) ) { wwd_result_t wwd_result; /* Set rx_size and wait in rx_complete semaphore until data reaches rx_size or timeout occurs */ WICED_DISABLE_INTERRUPTS( ); driver->last_receive_result = PLATFORM_SUCCESS; driver->rx_size = transfer_size; WICED_ENABLE_INTERRUPTS( ); wwd_result = host_rtos_get_semaphore( &driver->rx_complete, timeout_ms, WICED_TRUE ); /* Reset rx_size to prevent semaphore being set while nothing waits for the data */ WICED_DISABLE_INTERRUPTS( ); driver->rx_size = 0; WICED_ENABLE_INTERRUPTS( ); if ( wwd_result == WWD_TIMEOUT ) { /* Semaphore timeout. breaks from the while loop */ result = PLATFORM_TIMEOUT; break; } else { /* No timeout. retrieve result */ result = driver->last_receive_result; } } expected_data_size -= transfer_size; // Grab data from the buffer do { uint8_t* available_data; uint32_t bytes_available; ring_buffer_get_data( driver->rx_buffer, &available_data, &bytes_available ); bytes_available = MIN( bytes_available, transfer_size ); memcpy( data_in, available_data, bytes_available ); transfer_size -= bytes_available; data_in = ( (uint8_t*) data_in + bytes_available ); ring_buffer_consume( driver->rx_buffer, bytes_available ); } while ( transfer_size != 0 ); } return result; } else { return result; } }
void NoOS_stop_timing( void ) { WICED_DISABLE_INTERRUPTS(); platform_tick_stop( ); }