From f9781ca6ff755602248f6fb050432fc81781cf98 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Sun, 17 Jan 2010 05:32:41 +0000
Subject: Fix the Benito project not pulsing the target's /RESET line when DTR
 is de-asserted.

---
 LUFA/ManPages/ChangeLog.txt |  1 +
 Projects/Benito/Benito.c    | 11 +++++++++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 4c8a2f64c..2e4201326 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -37,6 +37,7 @@
   *  - Fixed Class Driver struct interface numbers in the KeyboardMouse and VirtualSerialMouse demos (thanks to Renaud Cerrato)
   *  - Fixed invalid USB controller PLL prescaler values for the ATMEGAxxU2 controllers
   *  - Fixed lack of support for the ATMEGA32U2 in the DFU and CDC class bootloaders
+  *  - Fixed Benito project not resetting the target AVR automatically when programming has completed
   *
   *  \section Sec_ChangeLog091223 Version 091223
   *
diff --git a/Projects/Benito/Benito.c b/Projects/Benito/Benito.c
index 9ced17626..10e2e8fb3 100644
--- a/Projects/Benito/Benito.c
+++ b/Projects/Benito/Benito.c
@@ -48,6 +48,9 @@ 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;
+
 /** 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.
@@ -247,12 +250,16 @@ ISR(USART1_RX_vect, ISR_BLOCK)
  */
 void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
 {
-	/* Check if the DTR line has been asserted - if so, start the target AVR's reset pulse */
-	if (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR)
+	bool CurrentDTRState = CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR);
+
+	/* Check if the DTR line has been de-asserted - if so, start the target AVR's reset pulse */
+	if (PreviousDTRState && !(CurrentDTRState))
 	{
 		LEDs_SetAllLEDs(LEDMASK_BUSY);
 	
 		AVR_RESET_LINE_DDR |= AVR_RESET_LINE_MASK;
 		PulseMSRemaining.ResetPulse = AVR_RESET_PULSE_MS;
 	}
+	
+	PreviousDTRState = CurrentDTRState;
 }
-- 
cgit v1.2.3