diff --git a/include/digio.h b/include/digio.h index 75f249b..38e4d9d 100644 --- a/include/digio.h +++ b/include/digio.h @@ -26,8 +26,11 @@ namespace PinMode { enum PinMode { INPUT_PD, + INPUT_PD_INV, //Logic Inverted INPUT_PU, + INPUT_PU_INV, //Logic Inverted INPUT_FLT, + INPUT_FLT_INV, //Logic Inverted INPUT_AIN, OUTPUT, OUTPUT_OD, @@ -47,16 +50,25 @@ class DigIo * @param[in] port port to use for this pin * @param[in] pin port-pin to use for this pin * @param[in] mode pinmode to use + * @param[in] invert input or not to use */ void Configure(uint32_t port, uint16_t pin, PinMode::PinMode pinMode); + /** * Get pin value * * @param[in] io pin index * @return pin value */ - bool Get() { return gpio_get(_port, _pin) > 0; } + bool Get() + { + if(_invert) + { + return !(gpio_get(_port, _pin) > 0); + } + return gpio_get(_port, _pin) > 0; + } /** * Set pin high @@ -82,6 +94,7 @@ class DigIo private: uint32_t _port; uint16_t _pin; + bool _invert; }; //Configure all digio objects from the given list #define DIG_IO_ENTRY(name, port, pin, mode) DigIo::name.Configure(port, pin, mode); diff --git a/src/digio.cpp b/src/digio.cpp index 399c152..d4f1623 100644 --- a/src/digio.cpp +++ b/src/digio.cpp @@ -35,6 +35,7 @@ void DigIo::Configure(uint32_t port, uint16_t pin, PinMode::PinMode pinMode) _port = port; _pin = pin; + _invert = 0; switch (pinMode) { @@ -42,12 +43,24 @@ void DigIo::Configure(uint32_t port, uint16_t pin, PinMode::PinMode pinMode) case PinMode::INPUT_PD: /* use defaults */ break; + case PinMode::INPUT_PD_INV: + /* use defaults */ + _invert = 1; + break; case PinMode::INPUT_PU: val = DIG_IO_ON; break; + case PinMode::INPUT_PU_INV: + val = DIG_IO_ON; + _invert = 1; + break; case PinMode::INPUT_FLT: cnf = GPIO_CNF_INPUT_FLOAT; break; + case PinMode::INPUT_FLT_INV: + cnf = GPIO_CNF_INPUT_FLOAT; + _invert = 1; + break; case PinMode::INPUT_AIN: cnf = GPIO_CNF_INPUT_ANALOG; break;