raspi-pcf8574
Version:
Control each pin of a PCF8574/PCF8574A I2C port expander IC.
140 lines (120 loc) • 4.87 kB
TypeScript
/*
* Node.js PCF8574/PCF8574A
*
* Copyright (c) 2017 Peter Müller <peter@crycode.de> (https://crycode.de)
*
* Node.js module for controlling each pin of a PCF8574/PCF8574A I2C port expander IC.
*/
/**
* Namespace for types for PCF8574
*/
declare namespace PCF8574 {
/**
* A pin number from 0 to 7
* @type {number}
*/
type PinNumber = 0|1|2|3|4|5|6|7;
/**
* Data of an 'input' event
* @type {Object}
*/
type InputData = {
/**
* Nnumber of the pin which triggerd the event
* @type {PinNumber}
*/
pin: PinNumber;
/**
* New value of the pin
* @type {boolean}
*/
value: boolean;
}
}
/**
* The pcf8574 module
*/
declare module 'pcf8574' {
import {EventEmitter} from 'events';
import * as Promise from 'bluebird';
import {I2cBus} from 'i2c-bus';
/**
* Class for handling a PCF8574/PCF8574A IC.
*/
export class PCF8574 extends EventEmitter {
/** Constant for undefined pin direction (unused pin). */
public static readonly DIR_UNDEF;
/** Constant for input pin direction. */
public static readonly DIR_IN;
/** Constant for output pin direction. */
public static readonly DIR_OUT;
/**
* Constructor for a new PCF8574/PCF8574A instance.
* If you use this IC with one or more input pins, you have to call ...
* a) enableInterrupt(gpioPin) to detect interrupts from the IC using a GPIO pin, or
* b) doPoll() frequently enough to detect input changes with manually polling.
* @param {I2cBus} i2cBus Instance of an opened i2c-bus.
* @param {number} address The address of the PCF8574/PCF8574A IC.
* @param {boolean|number} initialState The initial state of the pins of this IC. You can set a bitmask to define each pin seprately, or use true/false for all pins at once.
*/
constructor(i2cBus:I2cBus, address:number, initialState:boolean|number);
/**
* Enable the interrupt detection on the specified GPIO pin.
* You can use one GPIO pin for multiple instances of the PCF8574 class.
* @param {number} gpioPin BCM number of the pin, which will be used for the interrupts from the PCF8574/8574A IC.
*/
public enableInterrupt(gpioPin:number):void;
/**
* Disable the interrupt detection.
* This will unexport the interrupt GPIO, if it is not used by an other instance of this class.
*/
public disableInterrupt():void;
/**
* Manually poll changed inputs from the PCF8574/PCF8574A IC.
* If a change on an input is detected, an "input" Event will be emitted with a data object containing the "pin" and the new "value".
* This have to be called frequently enough if you don't use a GPIO for interrupt detection.
* If you poll again before the last poll was completed, the promise will be rejected with an error.
* @return {Promise}
*/
public doPoll():Promise<{}>;
/**
* Define a pin as an output.
* This marks the pin to be used as an output pin.
* @param {PCF8574.PinNumber} pin The pin number. (0 to 7)
* @param {boolean} inverted true if this pin should be handled inverted (true=low, false=high)
* @param {boolean} initialValue (optional) The initial value of this pin, which will be set immediatly.
* @return {Promise}
*/
public outputPin(pin:PCF8574.PinNumber, inverted:boolean, initialValue?:boolean):Promise<{}>;
/**
* Define a pin as an input.
* This marks the pin for input processing and activates the high level on this pin.
* @param {PCF8574.PinNumber} pin The pin number. (0 to 7)
* @param {boolean} inverted true if this pin should be handled inverted (high=false, low=true)
* @return {Promise}
*/
public inputPin(pin:PCF8574.PinNumber, inverted:boolean):Promise<{}>;
/**
* Set the value of an output pin.
* If no value is given, the pin will be toggled.
* @param {PCF8574.PinNumber} pin The pin number. (0 to 7)
* @param {boolean} value The new value for this pin.
* @return {Promise}
*/
public setPin(pin:number, value?:boolean):Promise<{}>;
/**
* Set the given value to all output pins.
* @param {boolean} value The new value for all output pins.
* @return {Promise}
*/
private setAllPins(value:boolean):Promise<{}>;
/**
* Returns the current value of a pin.
* This returns the last saved value, not the value currently returned by the PCF8574/PCF9574A IC.
* To get the current value call doPoll() first, if you're not using interrupts.
* @param {PCF8574.PinNumber} pin The pin number. (0 to 7)
* @return {boolean} The current value.
*/
public getPinValue(pin:PCF8574.PinNumber):boolean;
}
}