/** * @file gpioPort.hpp * @author Gustice * @brief GPIO-Port classes * @details C++ Wrapper for GPIO port * * @copyright Copyright (c) 2024 */ #pragma once #include "driver/gpio.h" #include "portBase.hpp" /** * @brief Digital-Port BaseClass */ class GpioPort : public PortBase { public: enum PullResistor { Floating = 0, PullUp, PullDown, }; enum Logic { Normal = 0, // Normal logic Inverted, // Inverted logic -> Set low on active state }; enum Interrupt { PositiveEdge = gpio_int_type_t::GPIO_INTR_POSEDGE, NegativeEdge = gpio_int_type_t::GPIO_INTR_NEGEDGE, AnyEdge = gpio_int_type_t::GPIO_INTR_ANYEDGE }; GpioPort(gpio_num_t port); ~GpioPort(); uint64_t GetReserved(void) { return _reservedPorts; } protected: const gpio_num_t _port; private: static uint64_t _reservedPorts; }; /** * @brief Input-Port * @details Provides abstract reading functionality */ class InputPort : public GpioPort { public: InputPort(gpio_num_t port, GpioPort::PullResistor resistor = PullResistor::Floating); void setLogic(GpioPort::Logic logic) { _logic = logic; } ~InputPort() = default; bool read(void); private: GpioPort::Logic _logic = GpioPort::Logic::Normal; }; /** * @brief Output-Port * @details Provides abstract setting functionality */ class OutputPort : public GpioPort { public: OutputPort(gpio_num_t port, GpioPort::Logic mode = Logic::Normal); ~OutputPort(){}; void write(int active); private: const GpioPort::Logic _mode = Normal; }; /** * @brief Interrupt-Port */ class TriggeredInput : public InputPort { public: TriggeredInput(gpio_num_t port, GpioPort::PullResistor resistor = GpioPort::PullResistor::Floating, TriggeredInput::Interrupt edge = TriggeredInput::Interrupt::AnyEdge); ~TriggeredInput(){}; void RegisterIsr(gpio_isr_t pIsrHandle); private: static bool _isrServiceInitiated; };