Line data Source code
1 : #pragma once 2 : 3 : #include <AH/Hardware/Hardware-Types.hpp> 4 : #include <AH/Types/FunctionTraits.hpp> 5 : 6 : #include <AH/Arduino-Wrapper.h> // pin functions and constants 7 : #include <AH/STL/type_traits> 8 : 9 : #if defined(BOARD_HAS_PIN_REMAP) && !defined(BOARD_USES_HW_GPIO_NUMBERS) 10 : #error \ 11 : "This library is not compatible with pin remapping. Please disable it by choosing "Tools > Pin Numbering > By GPIO number (legacy)" in the Arduino IDE. See https://github.com/espressif/arduino-esp32/issues/9150 for details" 12 : #endif 13 : 14 : #if defined(ARDUINO_API_VERSION) 15 : 16 : using ArduinoPin_t = pin_size_t; 17 : using PinStatus_t = PinStatus; 18 : using PinMode_t = PinMode; 19 : using BitOrder_t = BitOrder; 20 : 21 : #else // ARDUINO_API_VERSION 22 : 23 : using ArduinoPin_t = 24 : AH::function_traits<decltype(::digitalWrite)>::argument_t<0>; 25 : using PinStatus_t = 26 : AH::function_traits<decltype(::digitalWrite)>::argument_t<1>; 27 : using PinMode_t = AH::function_traits<decltype(::pinMode)>::argument_t<1>; 28 : 29 : #if defined(ARDUINO_ARCH_SAM) || defined(ARDUINO_ARCH_SAMD) 30 : using BitOrder_t = BitOrder; 31 : #else 32 : using BitOrder_t = uint8_t; 33 : #endif 34 : 35 : namespace AH_pin_detail { 36 : constexpr static auto tmp_HIGH = HIGH; 37 : constexpr static auto tmp_LOW = LOW; 38 : constexpr static auto tmp_INPUT = INPUT; 39 : constexpr static auto tmp_OUTPUT = OUTPUT; 40 : constexpr static auto tmp_INPUT_PULLUP = INPUT_PULLUP; 41 : } // namespace AH_pin_detail 42 : #ifdef HIGH 43 : #undef HIGH 44 : #define HIGH HIGH 45 : #endif 46 : #ifdef LOW 47 : #undef LOW 48 : #define LOW LOW 49 : #endif 50 : #ifdef INPUT 51 : #undef INPUT 52 : #define INPUT INPUT 53 : #endif 54 : #ifdef OUTPUT 55 : #undef OUTPUT 56 : #define OUTPUT OUTPUT 57 : #endif 58 : #ifdef INPUT_PULLUP 59 : #undef INPUT_PULLUP 60 : #define INPUT_PULLUP INPUT_PULLUP 61 : #endif 62 : constexpr PinStatus_t HIGH = AH_pin_detail::tmp_HIGH; 63 : constexpr PinStatus_t LOW = AH_pin_detail::tmp_LOW; 64 : constexpr PinMode_t INPUT = AH_pin_detail::tmp_INPUT; 65 : constexpr PinMode_t OUTPUT = AH_pin_detail::tmp_OUTPUT; 66 : constexpr PinMode_t INPUT_PULLUP = AH_pin_detail::tmp_INPUT_PULLUP; 67 : 68 : #endif // ARDUINO_API_VERSION 69 : 70 : BEGIN_AH_NAMESPACE 71 : 72 : template <class T> 73 34 : constexpr ArduinoPin_t arduino_pin_cast(T t) { 74 34 : return static_cast<ArduinoPin_t>(t); 75 : } 76 756 : constexpr ArduinoPin_t arduino_pin_cast(pin_t t) { return t.pin; } 77 : #if (defined(NOT_AN_INTERRUPT) || defined(ARDUINO_API_VERSION)) && \ 78 : !defined(ARDUINO_ARCH_RENESAS) 79 : using not_an_interrupt_t = decltype(NOT_AN_INTERRUPT); 80 : /// Type of interrupt indices (result of digitalPinToInterrupt). 81 : using interrupt_t = 82 : std::conditional<std::is_enum<not_an_interrupt_t>::value, 83 : std::underlying_type<not_an_interrupt_t>, 84 : type_identity<not_an_interrupt_t>>::type::type; 85 : #endif 86 : 87 : END_AH_NAMESPACE