size_t USBSerial::write(uint8_t byte) { if (HAL_USB_USART_Available_Data_For_Write(_serial) > 0 || _blocking) { HAL_USB_USART_Send_Data(_serial, byte); return 1; } return 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); }
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; }
int USBSerial::availableForWrite() { return HAL_USB_USART_Available_Data_For_Write(_serial); }