Mirror of espurna firmware for wireless switches and more
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

146 lines
3.3 KiB

/*
GPIO MODULE
Copyright (C) 2017-2019 by Xose Pérez <xose dot perez at gmail dot com>
*/
#pragma once
#include "settings.h"
#include "libs/BasePin.h"
#include <cstddef>
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());