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); }
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; }
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); }