X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/071e02c6b6b4837fa9cf0b6d4c749994e02638d7..666c0fa4c31b2c9f7f02f6d0e09551e24dc4680c:/Projects/USBtoSerial/USBtoSerial.c?ds=sidebyside diff --git a/Projects/USBtoSerial/USBtoSerial.c b/Projects/USBtoSerial/USBtoSerial.c index dd9a133c3..145047cbc 100644 --- a/Projects/USBtoSerial/USBtoSerial.c +++ b/Projects/USBtoSerial/USBtoSerial.c @@ -73,8 +73,8 @@ int main(void) { SetupHardware(); - Buffer_Initialize(&USBtoUSART_Buffer); - Buffer_Initialize(&USARTtoUSB_Buffer); + RingBuffer_InitBuffer(&USBtoUSART_Buffer); + RingBuffer_InitBuffer(&USARTtoUSB_Buffer); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); sei(); @@ -84,19 +84,25 @@ int main(void) /* Read bytes from the USB OUT endpoint into the USART transmit buffer */ for (uint8_t DataBytesRem = CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface); DataBytesRem != 0; DataBytesRem--) { - if (!(BUFF_STATICSIZE - USBtoUSART_Buffer.Elements)) + if (!(BUFFER_SIZE - USBtoUSART_Buffer.Count)) break; - Buffer_StoreElement(&USBtoUSART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface)); + RingBuffer_AtomicInsert(&USBtoUSART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface)); } - /* Read bytes from the USART receive buffer into the USB IN endpoint */ - while (USARTtoUSB_Buffer.Elements) - CDC_Device_SendByte(&VirtualSerial_CDC_Interface, Buffer_GetElement(&USARTtoUSB_Buffer)); + /* Check if the software USART flush timer has expired */ + if (TIFR0 & (1 << TOV0)) + { + TIFR0 |= (1 << TOV0); + + /* Read bytes from the USART receive buffer into the USB IN endpoint */ + while (USARTtoUSB_Buffer.Count) + CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&USARTtoUSB_Buffer)); + } - /* Load bytes from the USART transmit buffer into the USART */ - while (USBtoUSART_Buffer.Elements) - Serial_TxByte(Buffer_GetElement(&USBtoUSART_Buffer)); + /* Load the next byte from the USART transmit buffer into the USART */ + if (USBtoUSART_Buffer.Count) + Serial_TxByte(RingBuffer_AtomicRemove(&USBtoUSART_Buffer)); CDC_Device_USBTask(&VirtualSerial_CDC_Interface); USB_USBTask(); @@ -117,6 +123,9 @@ void SetupHardware(void) Serial_Init(9600, false); LEDs_Init(); USB_Init(); + + /* Start the flush timer so that overflows occur rapidly to push received bytes to the USB interface */ + TCCR0B = (1 << CS02); } /** Event handler for the library USB Connection event. */ @@ -154,7 +163,7 @@ ISR(USART1_RX_vect, ISR_BLOCK) uint8_t ReceivedByte = UDR1; if (USB_DeviceState == DEVICE_STATE_Configured) - Buffer_StoreElement(&USARTtoUSB_Buffer, ReceivedByte); + RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); } /** Event handler for the CDC Class driver Line Encoding Changed event.