Minor documentation enhancements.
[pub/USBasp.git] / Projects / XPLAINBridge / XPLAINBridge.c
index 2835481..0764bb9 100644 (file)
@@ -36,8 +36,8 @@
 
 #include "XPLAINBridge.h"
 
-/* Current firmware mode, making the device behave as either a programmer or a USART bridge */
-bool CurrentFirmwareMode = MODE_PDI_PROGRAMMER;
+/** Current firmware mode, making the device behave as either a programmer or a USART bridge */
+bool CurrentFirmwareMode = MODE_USART_BRIDGE;
 
 /** LUFA CDC Class driver interface configuration and state information. This structure is
  *  passed to all CDC Class driver functions, so that multiple instances of the same class
@@ -120,17 +120,19 @@ void UARTBridge_Task(void)
          return;
 
        /* Read bytes from the USB OUT endpoint into the UART transmit buffer */
-       if (CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface) && !(RingBuffer_IsFull(&USBtoUART_Buffer)))
-         RingBuffer_AtomicInsert(&USBtoUART_Buffer, CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface));
+       int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
+       if (!(ReceivedByte < 0) && !(RingBuffer_IsFull(&USBtoUART_Buffer)))
+         RingBuffer_Insert(&USBtoUART_Buffer, ReceivedByte);
        
-       /* Check if the software UART flush timer has expired */
-       if (TIFR0 & (1 << TOV0))
+       /* Check if the UART receive buffer flush timer has expired or buffer is nearly full */
+       RingBuff_Count_t BufferCount = RingBuffer_GetCount(&UARTtoUSB_Buffer);
+       if ((TIFR0 & (1 << TOV0)) || (BufferCount > 200))
        {
                TIFR0 |= (1 << TOV0);
 
                /* Read bytes from the UART receive buffer into the USB IN endpoint */
-               while (UARTtoUSB_Buffer.Count)
-                 CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&UARTtoUSB_Buffer));
+               while (BufferCount--)
+                 CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&UARTtoUSB_Buffer));
        }
 
        CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
@@ -170,12 +172,12 @@ void SetupHardware(void)
 /** Event handler for the library USB Configuration Changed event. */
 void EVENT_USB_Device_ConfigurationChanged(void)
 {
-       bool EndpointConfigSuccess = true;
+       bool ConfigSuccess = true;
 
        /* Configure the device endpoints according to the selected mode */
        if (CurrentFirmwareMode == MODE_USART_BRIDGE)
        {
-               EndpointConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
+               ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
 
                /* Configure the UART flush timer - run at Fcpu/1024 for maximum interval before overflow */
                TCCR0B = ((1 << CS02) | (1 << CS00));
@@ -183,27 +185,25 @@ void EVENT_USB_Device_ConfigurationChanged(void)
                /* Initialize ring buffers used to hold serial data between USB and software UART interfaces */
                RingBuffer_InitBuffer(&USBtoUART_Buffer);
                RingBuffer_InitBuffer(&UARTtoUSB_Buffer);
+               
+               /* Start the software USART */
+               SoftUART_Init();
        }
        else
        {
-               EndpointConfigSuccess &= Endpoint_ConfigureEndpoint(AVRISP_DATA_OUT_EPNUM, EP_TYPE_BULK,
-                                                                                                   ENDPOINT_DIR_OUT, AVRISP_DATA_EPSIZE,
-                                                                                                   ENDPOINT_BANK_SINGLE);
+               ConfigSuccess &= Endpoint_ConfigureEndpoint(AVRISP_DATA_OUT_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_OUT,
+                                                           AVRISP_DATA_EPSIZE, ENDPOINT_BANK_SINGLE);
 
                #if defined(LIBUSB_DRIVER_COMPAT)
-               EndpointConfigSuccess &= Endpoint_ConfigureEndpoint(AVRISP_DATA_IN_EPNUM, EP_TYPE_BULK,
-                                                                   ENDPOINT_DIR_IN, AVRISP_DATA_EPSIZE,
-                                                                   ENDPOINT_BANK_SINGLE);
+               ConfigSuccess &= Endpoint_ConfigureEndpoint(AVRISP_DATA_IN_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_IN,
+                                                           AVRISP_DATA_EPSIZE, ENDPOINT_BANK_SINGLE);
                #endif
        
                /* Configure the V2 protocol packet handler */
                V2Protocol_Init();
        }
 
-       if (EndpointConfigSuccess)
-         LEDs_SetAllLEDs(LEDMASK_USB_READY);
-       else
-         LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+       LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
 }
 
 /** Event handler for the library USB Unhandled Control Request event. */
@@ -249,7 +249,7 @@ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCI
  */
 uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                                     const uint8_t wIndex,
-                                    void** const DescriptorAddress)
+                                    const void** const DescriptorAddress)
 {
        /* Return the correct descriptors based on the selected mode */
        if (CurrentFirmwareMode == MODE_USART_BRIDGE)