Added periodic flush timer to the Benito project. Alter the serial transmission code...
authorDean Camera <dean@fourwalledcubicle.com>
Sun, 25 Jul 2010 11:59:55 +0000 (11:59 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sun, 25 Jul 2010 11:59:55 +0000 (11:59 +0000)
LUFA/ManPages/ChangeLog.txt
Projects/Benito/Benito.c
Projects/Benito/Benito.txt
Projects/Benito/Descriptors.h
Projects/Benito/makefile

index 423d7af..c4f0f94 100644 (file)
@@ -32,7 +32,7 @@
   *  - Rewrote the implementation of the SwapEndian_16() and SwapEndian_32() functions so that they compile down in most instances to
   *    minimal loads and stores rather than complicated shifts
   *  - The software UART in the XPLAINBridge has been largely altered to try to improve upon its performance and reliability
   *  - Rewrote the implementation of the SwapEndian_16() and SwapEndian_32() functions so that they compile down in most instances to
   *    minimal loads and stores rather than complicated shifts
   *  - The software UART in the XPLAINBridge has been largely altered to try to improve upon its performance and reliability
-  *  - The USBtoSerial project now flushes received data via a flush timer, so that several bytes can be transmitted at once
+  *  - The USBtoSerial and Benito projects now flushes received data via a flush timer, so that several bytes can be transmitted at once
   *  - Removed the automated checking of event names in the demo, project and bootloader makefiles due to inconsistancies between the
   *    behaviour of the command line tools used to perform the check on each platform
   *  - Internal USB driver source files renamed and moved to ease future possible architecture ports
   *  - Removed the automated checking of event names in the demo, project and bootloader makefiles due to inconsistancies between the
   *    behaviour of the command line tools used to perform the check on each platform
   *  - Internal USB driver source files renamed and moved to ease future possible architecture ports
index 32c663c..71b187b 100644 (file)
@@ -51,6 +51,9 @@ volatile struct
 /** Previous state of the virtual DTR control line from the host */
 bool PreviousDTRState = false;
 
 /** Previous state of the virtual DTR control line from the host */
 bool PreviousDTRState = false;
 
+/** Milliseconds remaining until the receive buffer is flushed to the USB host */
+uint8_t FlushPeriodRemaining = RECEIVE_BUFFER_FLUSH_MS;
+
 /** 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
  *  within a device can be differentiated from one another.
 /** 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
  *  within a device can be differentiated from one another.
@@ -89,23 +92,14 @@ int main(void)
        for (;;)
        {
                /* Echo bytes from the host to the target via the hardware USART */
        for (;;)
        {
                /* Echo bytes from the host to the target via the hardware USART */
-               while (CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface) > 0)
+               if (CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface) && (UCSR1A & (1 << UDRE1)))
                {
                {
-                       Serial_TxByte(CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface));
+                       UDR1 = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
 
                        LEDs_TurnOnLEDs(LEDMASK_TX);
                        PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS;                       
                }
                
 
                        LEDs_TurnOnLEDs(LEDMASK_TX);
                        PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS;                       
                }
                
-               /* Echo bytes from the target to the host via the virtual serial port */
-               while (Tx_Buffer.Count)
-               {
-                       CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&Tx_Buffer));
-
-                       LEDs_TurnOnLEDs(LEDMASK_RX);
-                       PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS;
-               }
-               
                /* Check if the millisecond timer has elapsed */
                if (TIFR0 & (1 << OCF0A))
                {
                /* Check if the millisecond timer has elapsed */
                if (TIFR0 & (1 << OCF0A))
                {
@@ -131,6 +125,22 @@ int main(void)
                        if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse))
                          LEDs_TurnOffLEDs(LEDMASK_RX);
 
                        if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse))
                          LEDs_TurnOffLEDs(LEDMASK_RX);
 
+                       /* Check if the receive buffer flush period has expired */
+                       if (!(--FlushPeriodRemaining) || (Tx_Buffer.Count > 200))
+                       {
+                               /* Echo bytes from the target to the host via the virtual serial port */
+                               if (Tx_Buffer.Count)
+                               {
+                                       while (Tx_Buffer.Count)
+                                         CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&Tx_Buffer));
+
+                                       LEDs_TurnOnLEDs(LEDMASK_RX);
+                                       PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS;
+                               }
+                               
+                               FlushPeriodRemaining = RECEIVE_BUFFER_FLUSH_MS;
+                       }
+
                        /* Clear the millisecond timer CTC flag (cleared by writing logic one to the register) */
                        TIFR0 |= (1 << OCF0A);          
                }
                        /* Clear the millisecond timer CTC flag (cleared by writing logic one to the register) */
                        TIFR0 |= (1 << OCF0A);          
                }
@@ -148,7 +158,6 @@ void SetupHardware(void)
        wdt_disable();
 
        /* Hardware Initialization */
        wdt_disable();
 
        /* Hardware Initialization */
-       Serial_Init(9600, false);
        LEDs_Init();
        USB_Init();
 
        LEDs_Init();
        USB_Init();
 
index dc10cad..ab30983 100644 (file)
  *    <td>Makefile LUFA_OPTS</td>
  *    <td>Pulse length in milliseconds for the enumeration LED ping-poning between toggles.</td>
  *   </tr>
  *    <td>Makefile LUFA_OPTS</td>
  *    <td>Pulse length in milliseconds for the enumeration LED ping-poning between toggles.</td>
  *   </tr>
+ *   <tr>
+ *    <td>RECEIVE_BUFFER_FLUSH_MS</td>
+ *    <td>Makefile LUFA_OPTS</td>
+ *    <td>Period between flushings of received data buffer to the attached USB host.</td>
+ *   </tr>
  *  </table>
  */
  *  </table>
  */
index 8012ebd..a670563 100644 (file)
@@ -56,7 +56,7 @@
                #define CDC_NOTIFICATION_EPSIZE        8
 
                /** Size in bytes of the CDC data IN and OUT endpoints. */
                #define CDC_NOTIFICATION_EPSIZE        8
 
                /** Size in bytes of the CDC data IN and OUT endpoints. */
-               #define CDC_TXRX_EPSIZE                16       
+               #define CDC_TXRX_EPSIZE                16
 
        /* Type Defines: */
                /** Type define for the device configuration descriptor structure. This must be defined in the
 
        /* Type Defines: */
                /** Type define for the device configuration descriptor structure. This must be defined in the
index c08f155..3e0311e 100644 (file)
@@ -128,6 +128,7 @@ LUFA_OPTS += -D AVR_RESET_LINE_MASK="(1 << 4)"
 LUFA_OPTS += -D AVR_RESET_PULSE_MS=10
 LUFA_OPTS += -D TX_RX_LED_PULSE_MS=30
 LUFA_OPTS += -D PING_PONG_LED_PULSE_MS=100
 LUFA_OPTS += -D AVR_RESET_PULSE_MS=10
 LUFA_OPTS += -D TX_RX_LED_PULSE_MS=30
 LUFA_OPTS += -D PING_PONG_LED_PULSE_MS=100
+LUFA_OPTS += -D RECEIVE_BUFFER_FLUSH_MS=20
 
 
 # Create the LUFA source path variables by including the LUFA root makefile
 
 
 # Create the LUFA source path variables by including the LUFA root makefile