From eb9c51d43c451b3e48725d04af519d8a6c36107b Mon Sep 17 00:00:00 2001
From: "David A. Mellis" <d.mellis@arduino.cc>
Date: Mon, 22 Nov 2010 23:33:59 -0500
Subject: pulseIn() now times out while measuring the pulse, not just while
 waiting for it to start.

---
 cores/arduino/wiring_pulse.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

(limited to 'cores/arduino')

diff --git a/cores/arduino/wiring_pulse.c b/cores/arduino/wiring_pulse.c
index 8f232f1..0d96886 100755
--- a/cores/arduino/wiring_pulse.c
+++ b/cores/arduino/wiring_pulse.c
@@ -55,12 +55,15 @@ unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout)
 			return 0;
 	
 	// wait for the pulse to stop
-	while ((*portInputRegister(port) & bit) == stateMask)
+	while ((*portInputRegister(port) & bit) == stateMask) {
+		if (numloops++ == maxloops)
+			return 0;
 		width++;
+	}
 
 	// convert the reading to microseconds. The loop has been determined
-	// to be 10 clock cycles long and have about 16 clocks between the edge
+	// to be 20 clock cycles long and have about 16 clocks between the edge
 	// and the start of the loop. There will be some error introduced by
 	// the interrupt handlers.
-	return clockCyclesToMicroseconds(width * 10 + 16); 
+	return clockCyclesToMicroseconds(width * 21 + 16); 
 }
-- 
cgit v1.2.3-18-g5258