/* GPIO MODULE Copyright (C) 2017-2019 by Xose PĂ©rez */ #pragma once #include "settings.h" #include "libs/BasePin.h" #include enum class GpioType : int { None, Hardware, Mcp23s08 }; namespace espurna { namespace gpio { struct Origin { const char* base; uint8_t pin; bool lock; bool result; SourceLocation location; }; struct Mode { int8_t value; }; Mode pin_mode(uint8_t); } // namespace gpio namespace settings { namespace internal { String serialize(GpioType); } // namespace internal } // namespace settings } // namespace espurna class GpioBase { public: virtual const char* id() const = 0; virtual size_t pins() const = 0; virtual bool lock(unsigned char index) const = 0; virtual void lock(unsigned char index, bool value) = 0; virtual bool valid(unsigned char index) const = 0; virtual BasePinPtr pin(unsigned char index) = 0; }; GpioBase* gpioBase(GpioType); GpioBase& hardwareGpio(); void hardwareGpioIgnore(unsigned char gpio); void gpioLockOrigin(espurna::gpio::Origin); void gpioSetup(); inline size_t gpioPins(const GpioBase& base) { return base.pins(); } inline size_t gpioPins() { return gpioPins(hardwareGpio()); } inline bool gpioValid(const GpioBase& base, unsigned char gpio) { return base.valid(gpio); } inline bool gpioValid(unsigned char gpio) { return gpioValid(hardwareGpio(), gpio); } inline bool gpioLock(GpioBase& base, unsigned char pin, bool value, espurna::SourceLocation source_location = espurna::make_source_location()) { if (base.valid(pin)) { const auto old = base.lock(pin); base.lock(pin, value); const auto result = value != old; gpioLockOrigin(espurna::gpio::Origin{ .base = base.id(), .pin = pin, .lock = value, .result = result, .location = trim_source_location(source_location), }); return result; } return false; } inline bool gpioLock(GpioBase& base, unsigned char gpio, espurna::SourceLocation source_location = espurna::make_source_location()) { return gpioLock(base, gpio, true, source_location); } inline bool gpioLock(unsigned char gpio, espurna::SourceLocation source_location = espurna::make_source_location()) { return gpioLock(hardwareGpio(), gpio, source_location); } inline bool gpioUnlock(GpioBase& base, unsigned char gpio, espurna::SourceLocation source_location = espurna::make_source_location()) { return gpioLock(base, gpio, false, source_location); } inline bool gpioUnlock(unsigned char gpio, espurna::SourceLocation source_location = espurna::make_source_location()) { return gpioUnlock(hardwareGpio(), gpio, source_location); } inline bool gpioLocked(const GpioBase& base, unsigned char gpio) { if (base.valid(gpio)) { return base.lock(gpio); } return false; } inline bool gpioLocked(unsigned char gpio) { return gpioLocked(hardwareGpio(), gpio); } BasePinPtr gpioRegister(GpioBase& base, unsigned char gpio, espurna::SourceLocation source_location = espurna::make_source_location()); BasePinPtr gpioRegister(unsigned char gpio, espurna::SourceLocation source_location = espurna::make_source_location());