예제 #1
0
void HAL_USB_USART_Flush_Data(HAL_USB_USART_Serial serial)
{
    if (!HAL_USB_WillPreempt())
        return;
    while(HAL_USB_USART_Is_Connected(serial) && HAL_USB_USART_Available_Data_For_Write(serial) != (usbUsartMap[serial].data->tx_buffer_size - 1));
    // We should also wait for USB_Tx_State to become 0, as hardware might still be busy transmitting data
    while(usbUsartMap[serial].data->tx_state == 1);
}
예제 #2
0
int32_t HAL_USB_USART_Available_Data_For_Write(HAL_USB_USART_Serial serial)
{
    if (HAL_USB_USART_Is_Connected(serial))
    {
        int state = HAL_disable_irq();
        int32_t available = ring_space_avail(usbUsartMap[serial].data->tx_buffer_size,
                                             usbUsartMap[serial].data->tx_buffer_head,
                                             usbUsartMap[serial].data->tx_buffer_tail);
        HAL_enable_irq(state);
        return available;
    }

    return -1;
}
예제 #3
0
int32_t HAL_USB_USART_Send_Data(HAL_USB_USART_Serial serial, uint8_t data)
{
    int32_t ret = -1;
    int32_t available = 0;
    do {
        available = HAL_USB_USART_Available_Data_For_Write(serial);
    }
    while (available < 1 && available != -1 && HAL_USB_WillPreempt());
    // Confirm once again that the Host is connected
    int32_t state = HAL_disable_irq();
    if (HAL_USB_USART_Is_Connected(serial) && available > 0)
    {
        usbUsartMap[serial].data->tx_buffer[usbUsartMap[serial].data->tx_buffer_head] = data;
        usbUsartMap[serial].data->tx_buffer_head = ring_wrap(usbUsartMap[serial].data->tx_buffer_size,
                                                             usbUsartMap[serial].data->tx_buffer_head + 1);
        ret = 1;
    }
    HAL_enable_irq(state);

    return ret;
}
bool USBSerial::isConnected() {
  return HAL_USB_USART_Is_Connected(_serial);
}