From e3f6f41fdbdfcddaa06ad8a75895285dfda99836 Mon Sep 17 00:00:00 2001 From: anschrammh Date: Tue, 23 Apr 2019 07:59:05 +0200 Subject: [PATCH] Added PCF8574 driver lib --- src/libs/PCF8574/PCF8574.cpp | 57 ++++++++++++++++++--- src/libs/PCF8574/PCF8574.h | 8 ++- src/libs/PCF8574/{ => examples}/PCF8574.ino | 0 src/libs/PCF8574/keywords.txt | 27 ++++++++++ 4 files changed, 83 insertions(+), 9 deletions(-) rename src/libs/PCF8574/{ => examples}/PCF8574.ino (100%) create mode 100644 src/libs/PCF8574/keywords.txt diff --git a/src/libs/PCF8574/PCF8574.cpp b/src/libs/PCF8574/PCF8574.cpp index a7fa49f..d211033 100644 --- a/src/libs/PCF8574/PCF8574.cpp +++ b/src/libs/PCF8574/PCF8574.cpp @@ -1,26 +1,32 @@ #include "PCF8574.h" -PCF8574::PCF8574(uint8_t address, TwoWire &twc) : _twc(twc),_address(address),_pinConfig(0b11111111) +PCF8574::PCF8574(uint8_t address, TwoWire &twc) : _twc(twc), _address(address), _pinConfig(0b11111111), _pddr(0b00000000) //Inputs by default { } -void PCF8574::begin() +boolean PCF8574::begin() { _twc.begin(); _twc.beginTransmission(_address); _twc.write(_pinConfig); - _twc.endTransmission(); + return _twc.endTransmission() == 0; } void PCF8574::pinMode(Pin pin, boolean mode) { - uint8_t mask = mode ? ~pin : pin; //0 INPUT - 1 OUTPUT + uint8_t mask = mode ? pin : pin; //0 INPUT - 1 OUTPUT - if(mode) - _pinConfig = _pinConfig & mask; - else + if(mode)//OUTPUT + { _pinConfig = _pinConfig | mask; + _pddr = _pddr | pin; + } + else + { + _pinConfig = _pinConfig | mask; + _pddr = _pddr & ~pin; + } _pinConfig = _pinConfig | mask; _twc.beginTransmission(_address); @@ -30,6 +36,10 @@ void PCF8574::pinMode(Pin pin, boolean mode) void PCF8574::digitalWrite(Pin pin, boolean mode) { + //We first check that the pin is an output + if((_pddr & pin) == 0) + return; + uint8_t mask = mode ? pin : ~pin; //0 LOW, 1 HIGH if(mode) _pinConfig = _pinConfig | mask; @@ -48,3 +58,36 @@ boolean PCF8574::digitalRead(Pin pin) while(_twc.available())reg = _twc.read(); return (reg & pin) == 0 ? 0 : 1; } + +void PCF8574::digitalReadAll(boolean array[]) +{ + uint8_t reg = 0b00000000; + _twc.requestFrom((uint8_t)_address,(uint8_t)1,(uint8_t)true); + while(_twc.available())reg = _twc.read(); + + array[0] = (reg & P0) == 0 ? 0 : 1; + array[1] = (reg & P1) == 0 ? 0 : 1; + array[2] = (reg & P2) == 0 ? 0 : 1; + array[3] = (reg & P3) == 0 ? 0 : 1; + array[4] = (reg & P4) == 0 ? 0 : 1; + array[5] = (reg & P5) == 0 ? 0 : 1; + array[6] = (reg & P6) == 0 ? 0 : 1; + array[7] = (reg & P7) == 0 ? 0 : 1; +} + +boolean PCF8574::getPinMode(Pin pin) +{ + return _pddr & pin == 0 ? INPUT : OUTPUT; +} + +void PCF8574::getPinModeAll(boolean array[]) +{ + array[0] = (_pddr & P0) == 0 ? INPUT : OUTPUT; + array[1] = (_pddr & P1) == 0 ? INPUT : OUTPUT; + array[2] = (_pddr & P2) == 0 ? INPUT : OUTPUT; + array[3] = (_pddr & P3) == 0 ? INPUT : OUTPUT; + array[4] = (_pddr & P4) == 0 ? INPUT : OUTPUT; + array[5] = (_pddr & P5) == 0 ? INPUT : OUTPUT; + array[6] = (_pddr & P6) == 0 ? INPUT : OUTPUT; + array[7] = (_pddr & P7) == 0 ? INPUT : OUTPUT; +} diff --git a/src/libs/PCF8574/PCF8574.h b/src/libs/PCF8574/PCF8574.h index cf227f5..ae0ce41 100644 --- a/src/libs/PCF8574/PCF8574.h +++ b/src/libs/PCF8574/PCF8574.h @@ -15,15 +15,19 @@ class PCF8574 enum Pin{P0 = 1, P1 = 2, P2 = 4, P3 = 8, P4 = 16, P5 = 32, P6 = 64, P7 = 128}; PCF8574(uint8_t address, TwoWire &twc = Wire); - void begin(); + boolean begin(); void pinMode(Pin pin, boolean mode = INPUT); void digitalWrite(Pin pin, boolean mode); boolean digitalRead(Pin pin); + void digitalReadAll(boolean array[]); + boolean getPinMode(Pin pin); + void getPinModeAll(boolean array[]); private: TwoWire &_twc; uint8_t _address; uint8_t _pinConfig; + uint8_t _pddr; protected: }; -#endif +#endif //PCF8574_H diff --git a/src/libs/PCF8574/PCF8574.ino b/src/libs/PCF8574/examples/PCF8574.ino similarity index 100% rename from src/libs/PCF8574/PCF8574.ino rename to src/libs/PCF8574/examples/PCF8574.ino diff --git a/src/libs/PCF8574/keywords.txt b/src/libs/PCF8574/keywords.txt new file mode 100644 index 0000000..af697b7 --- /dev/null +++ b/src/libs/PCF8574/keywords.txt @@ -0,0 +1,27 @@ +####################################### +# Syntax Coloring Map For RTC +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +PCF8574 KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + + +####################################### +# Constants (LITERAL1) +####################################### + +P0 LITERAL1 +P1 LITERAL1 +P2 LITERAL1 +P3 LITERAL1 +P4 LITERAL1 +P5 LITERAL1 +P6 LITERAL1 +P7 LITERAL1