import { BusInterface } from "async-i2c-bus";
export declare const A0: number;
export declare const A1: number;
export declare const A2: number;
export declare const A3: number;
export declare const A4: number;
export declare const A5: number;
export declare const A6: number;
export declare const A7: number;
export declare const B0: number;
export declare const B1: number;
export declare const B2: number;
export declare const B3: number;
export declare const B4: number;
export declare const B5: number;
export declare const B6: number;
export declare const B7: number;
/** Direction of the I/O pins */
export declare enum Direction {
    /** Output pin */
    OUT = 0,
    /** Input pin without pull-up */
    IN = 1,
    /** Input pin with pull-up */
    IN_UP = 2
}
/** Interupt mode */
export declare enum InteruptMode {
    /** No interupt (used to reset) */
    INT_None = 0,
    /** Interupt when not one */
    INT_One = 1,
    /** Interupt when not zero */
    INT_Zero = 2,
    /** Interupt on change */
    INT_Change = 3
}
/** An interupt definition */
export interface InteruptDefinition {
    /** Pin number */
    pin: number;
    /** Interupt mode of the pin */
    mode: InteruptMode;
    /** Callback if any */
    callback?: (val: number) => void;
}
/** Interupt handler to use as an abstract type */
export interface InteruptHandler {
    /** Map from pin number to callback */
    [pin: number]: (val: number) => void;
}
/** Pin value */
export declare enum Level {
    /** Low or 0 */
    LOW = 0,
    /** High or 1 */
    HIGH = 1
}
/** Options for the MCP23017 object */
export interface IMCP23017Options {
    /** Address of the chip on the I2C bus */
    address?: number;
    /** Use of the interleaved (default) or separate bank mode */
    separate?: boolean;
}
export declare const IOCON_INTPOL: number;
export declare const IOCON_ODR: number;
export declare const IOCON_HAEN: number;
export declare const IOCON_DISSLW: number;
export declare const IOCON_SEQOP: number;
export declare const IOCON_MIRROR: number;
export declare const IOCON_BANK: number;
/** Options for the driver */
export interface Options {
    /** Address of the MCP (0x20 if not provided) */
    address?: number;
    /** Should the two banks be seaparate or interleaved (default false) */
    separate?: boolean;
}
/** This class drives a single MCP23017 GPIO extender */
export declare class MCP23017 {
    private device;
    private separate;
    private bank;
    private cache;
    /** Constructor.
     *
     * @param bus an instance of i2c bus. May be closed at this point
     * @param options options for the driver.
     */
    constructor(bus: BusInterface, options?: Options);
    /** Initialize the class
     *
     *  Must be called with an open bus
     */
    init(): Promise<void>;
    /** Reads the configuration byte of the chip
     * @return the value of the configuration as a byte in a promise.
     */
    readConfigByte(): Promise<number>;
    /** Change the way register banks are organize.
     * @param separate set to true for registers organized as two
     *        independent banks and false for interleaved (default)
     * @return a promisse fullfilled when the operation is performed.
     */
    setSeparate(separate: boolean): Promise<void>;
    /** Sets the direction of a set of GPI/O pins and eventually pull-up status.
     * @param pins: the set of pins (number used as a bit set)
     * @param direction: the direction of the pin (can be IN OUT or IN_UP)
     * @return a promisse fullfilled when the operation is performed.
     */
    setDirection(pins: number, direction: Direction): Promise<void>;
    /** Set the polarity of the output (ie XOR with it)
     * @param polarity of each pin as a bit array
     */
    setPolarity(pins: number): Promise<void>;
    /** Reads the GPIO
     * @return the value of the GPIO Pin in a promise.
     */
    read(): Promise<number>;
    /** Modify the GPIO
     * @param set: bits to set as a bit field
     * @param unset: bits to set as a bit field
     */
    write(set: number, unset: number): Promise<void>;
    /** Register changes to the interupt handling
     * @param intDefs: a list of interupt handling description that
     *        will be (dis)activated
     * @param handler: an optional interupt handler that was in place
     * @return the new interupt handler.
     */
    register(intDefs: InteruptDefinition[], handler?: InteruptHandler): Promise<InteruptHandler>;
    /** Handle interupts received.
     * @param handler: an interupt handler built during the registration.
     */
    handle(handler: InteruptHandler): Promise<void>;
    private readCache;
    private initCache;
    private readBuffer;
    private writeByte;
    private writeWord;
    private writeBanks;
    private readBanks;
}
