コード例 #1
0
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;
    }
}
コード例 #2
0
ファイル: noos.c プロジェクト: humminglab/wiced-project
void NoOS_setup_timing( void )
{
    platform_tick_start( );

    WICED_ENABLE_INTERRUPTS( );
}