import * as i2c from 'i2c-bus';
import { type Debugger } from 'debug';
export declare abstract class Module<T extends Record<any, any>> {
    readonly bus: i2c.PromisifiedBus;
    readonly config: T;
    readonly debug: Debugger;
    readonly address: number;
    constructor(busNumber: number | undefined, address: number, config?: Partial<T>);
    /**
     * Initialize the module.
     * Should be implemented by subclasses.
     */
    abstract init(): Promise<void>;
    readInto(buf: Buffer, length: number): Promise<i2c.BytesRead>;
    readByte(adrs: number): Promise<number>;
    readBytes(adrs: number, length: number): Promise<Buffer>;
    write(buf: Buffer): Promise<void>;
    writeByte(adrs: number, value: number): Promise<void>;
    writeBytes(adrs: number, buf: Buffer): Promise<void>;
    readBit(adrs: number, bit: number): Promise<number>;
    bitMask(bit: number, length: number): number;
    /**
     * Write a sequence of bits.  Note, this will do a read to get the existing value, then a write.
     * @param  {number}   adrs     The address of the byte to write.
     * @param  {number}   bit      The nth bit to start at.
     * @param  {number}   length   The number of bits to change.
     * @param  {number}   value    The values to change.
     */
    writeBits(adrs: number, bit: number, length: number, value: number): Promise<void>;
    /**
     * Write one bit.  Note, this will do a read to get the existing value, then a write.
     * @param  {number}   adrs     The address of the byte to write.
     * @param  {number}   bit      The nth bit.
     * @param  {number}   value    The new value, 1 or 0.
     */
    writeBit(adrs: number, bit: number, value: number): Promise<void>;
}
