mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-10-31 06:01:39 +01:00 
			
		
		
		
	
		
			
	
	
		
			51 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |   pulse.c - wiring pulseIn implementation for esp8266 | ||
|  |   Copyright (c) 2015 Hristo Gochkov. All rights reserved. | ||
|  |   This file is part of the esp8266 core for Arduino environment. | ||
|  |   This library is free software; you can redistribute it and/or | ||
|  |   modify it under the terms of the GNU Lesser General Public | ||
|  |   License as published by the Free Software Foundation; either | ||
|  |   version 2.1 of the License, or (at your option) any later version. | ||
|  |   This library is distributed in the hope that it will be useful, | ||
|  |   but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
|  |   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||
|  |   Lesser General Public License for more details. | ||
|  |   You should have received a copy of the GNU Lesser General Public | ||
|  |   License along with this library; if not, write to the Free Software | ||
|  |   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA | ||
|  | */ | ||
|  | //#include <limits.h>
 | ||
|  | #include "wiring_private.h"
 | ||
|  | #include "pins_arduino.h"
 | ||
|  | 
 | ||
|  | 
 | ||
|  | extern uint32_t xthal_get_ccount(); | ||
|  | 
 | ||
|  | #define WAIT_FOR_PIN_STATE(state) \
 | ||
|  |     while (digitalRead(pin) != (state)) { \ | ||
|  |         if (xthal_get_ccount() - start_cycle_count > timeout_cycles) { \ | ||
|  |             return 0; \ | ||
|  |         } \ | ||
|  |     } | ||
|  | 
 | ||
|  | // max timeout is 27 seconds at 160MHz clock and 54 seconds at 80MHz clock
 | ||
|  | unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) | ||
|  | { | ||
|  |     const uint32_t max_timeout_us = clockCyclesToMicroseconds(UINT_MAX); | ||
|  |     if (timeout > max_timeout_us) { | ||
|  |         timeout = max_timeout_us; | ||
|  |     } | ||
|  |     const uint32_t timeout_cycles = microsecondsToClockCycles(timeout); | ||
|  |     const uint32_t start_cycle_count = xthal_get_ccount(); | ||
|  |     WAIT_FOR_PIN_STATE(!state); | ||
|  |     WAIT_FOR_PIN_STATE(state); | ||
|  |     const uint32_t pulse_start_cycle_count = xthal_get_ccount(); | ||
|  |     WAIT_FOR_PIN_STATE(!state); | ||
|  |     return clockCyclesToMicroseconds(xthal_get_ccount() - pulse_start_cycle_count); | ||
|  | } | ||
|  | 
 | ||
|  | unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout) | ||
|  | { | ||
|  |     return pulseIn(pin, state, timeout); | ||
|  | } |