From 13f3ac569b1e235608f497840588baec911833a0 Mon Sep 17 00:00:00 2001 From: sorscode Date: Fri, 20 Jan 2017 13:49:17 -0600 Subject: [PATCH] Enable pulseIn() (#140) * Add files via upload enable pulseIn() * Remove optimistic_yield --- cores/esp32/Arduino.h | 6 +++++ cores/esp32/wiring_pulse.c | 50 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 cores/esp32/wiring_pulse.c diff --git a/cores/esp32/Arduino.h b/cores/esp32/Arduino.h index 51315a5d..185383ba 100644 --- a/cores/esp32/Arduino.h +++ b/cores/esp32/Arduino.h @@ -133,6 +133,9 @@ void initArduino(void); void setup(void); void loop(void); +unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); +unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout); + uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); @@ -156,6 +159,9 @@ uint16_t makeWord(byte h, byte l); #define word(...) makeWord(__VA_ARGS__) +unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); +unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); + // WMath prototypes long random(long); #endif /* __cplusplus */ diff --git a/cores/esp32/wiring_pulse.c b/cores/esp32/wiring_pulse.c new file mode 100644 index 00000000..e6326789 --- /dev/null +++ b/cores/esp32/wiring_pulse.c @@ -0,0 +1,50 @@ +/* + 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 +#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); +}