// Copyright (C)2018-2023, Philip Munts dba Munts Technologies. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. namespace IO.Devices.PCA8574 { /// /// Encapsulates PCA8574 (and similar) I2C GPIO Expanders. /// public class Device { private readonly IO.Interfaces.I2C.Device dev; private byte latch; private byte[] buf = { 0 }; /// /// The number of available GPIO pins per chip. /// public const int MAX_PINS = 8; /// /// Constructor for a PCA8574 (or similar) GPIO Expander. /// /// I2C bus controller. /// I2C slave address. /// Initial output states. public Device(IO.Interfaces.I2C.Bus bus, int addr, byte states = 0xFF) { this.dev = new IO.Interfaces.I2C.Device(bus, addr); this.Write(states); } /// /// Return actual state of the GPIO pins. /// /// Pin states (MSB = GPIO7). public byte Read() { this.dev.Read(buf, 1); return buf[0]; } /// /// Write all GPIO pins. /// /// Data to write to pins (MSB = GPIO7). public void Write(byte data) { this.buf[0] = data; this.dev.Write(buf, 1); this.latch = data; } /// /// This read-only property returns the last value written to the /// output latch. /// public byte Latch { get { return this.latch; } } } }