aboutsummaryrefslogtreecommitdiffstats
path: root/Projects
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-07-25 11:59:55 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-07-25 11:59:55 +0000
commit4c9425c0d52fbfe45f6697d9124b022842049af6 (patch)
treed93245e7fd19b451ea6029fb19df962d4fccc0ed /Projects
parent3a79548dc2bfd08f13a387b5533d8598ba0078d7 (diff)
downloadlufa-4c9425c0d52fbfe45f6697d9124b022842049af6.tar.gz
lufa-4c9425c0d52fbfe45f6697d9124b022842049af6.tar.bz2
lufa-4c9425c0d52fbfe45f6697d9124b022842049af6.zip
Added periodic flush timer to the Benito project. Alter the serial transmission code so that sent bytes do not block the remainder of the main program code from running.
Diffstat (limited to 'Projects')
-rw-r--r--Projects/Benito/Benito.c33
-rw-r--r--Projects/Benito/Benito.txt5
-rw-r--r--Projects/Benito/Descriptors.h2
-rw-r--r--Projects/Benito/makefile1
4 files changed, 28 insertions, 13 deletions
diff --git a/Projects/Benito/Benito.c b/Projects/Benito/Benito.c
index 32c663cb6..71b187bfb 100644
--- a/Projects/Benito/Benito.c
+++ b/Projects/Benito/Benito.c
@@ -51,6 +51,9 @@ volatile struct
/** 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.
@@ -89,23 +92,14 @@ int main(void)
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;
}
- /* 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))
{
@@ -131,6 +125,22 @@ int main(void)
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);
}
@@ -148,7 +158,6 @@ void SetupHardware(void)
wdt_disable();
/* Hardware Initialization */
- Serial_Init(9600, false);
LEDs_Init();
USB_Init();
diff --git a/Projects/Benito/Benito.txt b/Projects/Benito/Benito.txt
index dc10cadf6..ab3098392 100644
--- a/Projects/Benito/Benito.txt
+++ b/Projects/Benito/Benito.txt
@@ -96,5 +96,10 @@
* <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>
*/
diff --git a/Projects/Benito/Descriptors.h b/Projects/Benito/Descriptors.h
index 8012ebdde..a670563cf 100644
--- a/Projects/Benito/Descriptors.h
+++ b/Projects/Benito/Descriptors.h
@@ -56,7 +56,7 @@
#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
diff --git a/Projects/Benito/makefile b/Projects/Benito/makefile
index c08f1557f..3e0311e89 100644
--- a/Projects/Benito/makefile
+++ b/Projects/Benito/makefile
@@ -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 RECEIVE_BUFFER_FLUSH_MS=20
# Create the LUFA source path variables by including the LUFA root makefile