X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/ca007f91f2aa959a738649d35becb54cb1efc8b8..bea72a8412f99b294c00341fa16a8308bcc66f15:/Projects/USBtoSerial/USBtoSerial.c diff --git a/Projects/USBtoSerial/USBtoSerial.c b/Projects/USBtoSerial/USBtoSerial.c index b59a3648f..845c2a51c 100644 --- a/Projects/USBtoSerial/USBtoSerial.c +++ b/Projects/USBtoSerial/USBtoSerial.c @@ -82,27 +82,24 @@ int main(void) for (;;) { /* 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 (RingBuffer_IsFull(&USBtoUSART_Buffer)) - break; - - RingBuffer_AtomicInsert(&USBtoUSART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface)); - } + int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); + if (!(ReceivedByte < 0) && !(RingBuffer_IsFull(&USBtoUSART_Buffer))) + RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); - /* Check if the software USART flush timer has expired */ - if (TIFR0 & (1 << TOV0)) + /* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */ + RingBuff_Count_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer); + if ((TIFR0 & (1 << TOV0)) || (BufferCount > 200)) { 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)); + while (BufferCount--) + CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer)); } /* Load the next byte from the USART transmit buffer into the USART */ - if (USBtoUSART_Buffer.Count) - Serial_TxByte(RingBuffer_AtomicRemove(&USBtoUSART_Buffer)); + if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) + Serial_TxByte(RingBuffer_Remove(&USBtoUSART_Buffer)); CDC_Device_USBTask(&VirtualSerial_CDC_Interface); USB_USBTask(); @@ -142,10 +139,11 @@ void EVENT_USB_Device_Disconnect(void) /** Event handler for the library USB Configuration Changed event. */ void EVENT_USB_Device_ConfigurationChanged(void) { - LEDs_SetAllLEDs(LEDMASK_USB_READY); + bool ConfigSuccess = true; - if (!(CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface))) - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); + + LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); } /** Event handler for the library USB Unhandled Control Request event. */ @@ -200,15 +198,15 @@ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCI } /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ - UCSR1A = 0; UCSR1B = 0; + UCSR1A = 0; UCSR1C = 0; /* Set the new baud rate before configuring the USART */ UBRR1 = SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); /* Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy */ - UCSR1A = (1 << U2X1); - UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); UCSR1C = ConfigMask; + UCSR1A = (1 << U2X1); + UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); }