Update UC3 platform driver support to use the bitmasks defined in the header files...
[pub/USBasp.git] / Projects / Benito / Benito.c
index e666c24..2c8f2cd 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
+     Copyright (C) Dean Camera, 2011.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
 #include "Benito.h"
 
 /** Circular buffer to hold data from the serial port before it is sent to the host. */
-RingBuff_t USARTtoUSB_Buffer;
+static RingBuffer_t USARTtoUSB_Buffer;
 
 /** Underlying data buffer for \ref USARTtoUSB_Buffer, where the stored bytes are located. */
-uint8_t    USARTtoUSB_Buffer_Data[128];
+static uint8_t      USARTtoUSB_Buffer_Data[128];
 
 /** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */
 volatile struct
@@ -51,9 +51,6 @@ volatile struct
        uint8_t PingPongLEDPulse; /**< Milliseconds remaining for enumeration Tx/Rx ping-pong LED pulse */
 } PulseMSRemaining;
 
-/** 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;
 
@@ -106,6 +103,9 @@ int main(void)
                /* Check if the millisecond timer has elapsed */
                if (TIFR0 & (1 << OCF0A))
                {
+                       /* Clear flush timer expiry flag */
+                       TIFR0 |= (1 << TOV0);
+
                        /* Check if the reset pulse period has elapsed, if so tristate the target reset line */
                        if (PulseMSRemaining.ResetPulse && !(--PulseMSRemaining.ResetPulse))
                        {
@@ -132,31 +132,29 @@ int main(void)
                        uint16_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer);
                        if (!(--FlushPeriodRemaining) || (BufferCount > 200))
                        {
-                               /* Echo bytes from the target to the host via the virtual serial port */
+                               FlushPeriodRemaining = RECEIVE_BUFFER_FLUSH_MS;
+
+                               /* Start RX LED indicator pulse */
                                if (BufferCount)
                                {
-                                       while (BufferCount--)
-                                       {
-                                               /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */
-                                               if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,
-                                                                                               RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)
-                                               {
-                                                       break;
-                                               }
-
-                                               /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */
-                                               RingBuffer_Remove(&USARTtoUSB_Buffer);
-                                       }
-                       
                                        LEDs_TurnOnLEDs(LEDMASK_RX);
                                        PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS;
                                }
 
-                               FlushPeriodRemaining = RECEIVE_BUFFER_FLUSH_MS;
+                               /* Echo bytes from the target to the host via the virtual serial port */
+                               while (BufferCount--)
+                               {
+                                       /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */
+                                       if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,
+                                                                                       RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)
+                                       {
+                                               break;
+                                       }
+                                       
+                                       /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */
+                                       RingBuffer_Remove(&USARTtoUSB_Buffer);
+                               }
                        }
-
-                       /* Clear the millisecond timer CTC flag (cleared by writing logic one to the register) */
-                       TIFR0 |= (1 << OCF0A);
                }
 
                CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
@@ -285,7 +283,8 @@ ISR(USART1_RX_vect, ISR_BLOCK)
  */
 void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
 {
-       bool CurrentDTRState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR);
+       static bool PreviousDTRState = false;
+       bool        CurrentDTRState  = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR);
 
        /* Check if the DTR line has been asserted - if so, start the target AVR's reset pulse */
        if (!(PreviousDTRState) && CurrentDTRState)