/** @license original source: https://github.com/ros2jsguy/mpu6050-motion-data/blob/081986/src/rpio-i2c-helper.ts */
/// <reference types="node" />
declare const I2C_SUCCESS = 0;
declare type I2C_RESULT = typeof I2C_SUCCESS;
declare type BitPos = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
declare type BitLength = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
declare type ZeroTo<To extends number, Result extends unknown[] = []> = Result['length'] extends To ? Result[number] : ZeroTo<To, [...Result, Result['length']]>;
declare type Pow2<To extends number, Result extends unknown[] = [unknown], Counter extends unknown[] = []> = Counter['length'] extends To ? Result["length"] : Pow2<To, [...Result, ...Result], [...Counter, unknown]>;
export declare type Bits<Length extends BitLength> = ZeroTo<Pow2<Length>>;
export declare type Bit = Bits<1>;
export declare type Byte = Bits<8>;
declare type AvailableLength<Position extends BitPos> = Position extends 0 ? 1 : Position extends 1 ? 1 | 2 : Position extends 2 ? 1 | 2 | 3 : Position extends 3 ? 1 | 2 | 3 | 4 : Position extends 4 ? 1 | 2 | 3 | 4 | 5 : Position extends 5 ? 1 | 2 | 3 | 4 | 5 | 6 : Position extends 6 ? 1 | 2 | 3 | 4 | 5 | 6 | 7 : Position extends 7 ? BitLength : never;
/**
This class copy from @ros2jsguy mpu6050-motion-data: https://github.com/ros2jsguy/mpu6050-motion-data/blob/0819863463db455c88a37b94c9280dba9a5118b2/src/rpio-i2c-helper.ts
(* but not compatible.)

usage.
```typescript
    enum Register1 {
       INT_STATUS   = 0x3A,
       ACCEL_XOUT_H = 0x3B,
       TEMP_OUT_H   = 0x41,
       GYRO_XOUT_H  = 0x43,
    }
    const mpu6050 = new I2CDevice<Register1>({
       deviceAddr: 0x68
    })
    mpu6050.readBit(Register1.ACCEL_XOUT_H, 1)
    mpu6050.readBit(Register1.ACCEL_XOUT_H + 2, 1) // allow unknown address
```
or
```typescript
  const Register2 = Object.freeze({
       INT_STATUS   : 0x3A,
       ACCEL_XOUT_H : 0x3B,
       TEMP_OUT_H   : 0x41,
       GYRO_XOUT_H  : 0x43,
  } as const)
  type ValueOf<T extends Object> = T[keyof T]
  const mpu9050 = new I2CDevice<ValueOf<typeof Register2>>({
       deviceAddr: 0x68
  })
  mpu9050.readBit(Register2.ACCEL_XOUT_H, 1)
  mpu9050.readBit(Register2.ACCEL_XOUT_H + 2, 1) // disallow unknown address
```
 */
export declare class I2CDevice<Register extends number> {
    /** I2C slave device address */
    private deviceAddr;
    /** I2C baudRate */
    private baudRate;
    /** data sent to device */
    private regBuffer;
    /** data received from device */
    private dataBuffer;
    private regView;
    private dataView;
    constructor({ deviceAddr, baudRate, regBufferSize, dataBufferSize }: {
        deviceAddr: number;
        baudRate?: number;
        regBufferSize?: number;
        dataBufferSize?: number;
    });
    shutdown(): void;
    /** Read a single bit from an 8-bit device register.
     * @param regAddr Register regAddr to read from
     * @param bitNum Bit position to read (0-7)
     * @returns Status bit value
     */
    readBit(regAddr: Register, bitNum: BitPos): Bit;
    /** Read multiple bits from an 8-bit device register.
     * @param regAddr Register regAddr to read from
     * @param bitStart First bit position to read (0-7)
     * @param length Number of bits to read (not more than 8)
     * @returns The bits read
     */
    readBits<Position extends BitPos, Length extends AvailableLength<Position>>(regAddr: Register, bitStart: Position, length: Length): Bits<Length>;
    /** Read single byte from an 8-bit device register.
     * @param regAddr Register regAddr to read from
     * @returns The byte read.
     */
    readByte(regAddr: Register): Byte;
    /** Read multiple bytes from an 8-bit device register.
     * @param regAddr First register regAddr to read from
     * @param length Number of bytes to read
     * @returns Buffer containing the read bytes
     */
    readBytes(regAddr: Register, byteCnt: number): Buffer;
    /** Read single word from a 16-bit device register.
     * @param regAddr Register regAddr to read from
     * @return The 16-bit word read.
     */
    readWord(regAddr: Register): number;
    /**
     * Write a single bit in an 8-bit device register.
     * @param regAddr Register regAddr to write to
     * @param bitNum Bit position to write (0-7)
     * @param data New bit value to write
     * @returns Status of operation (0 = success)
     */
    writeBit(regAddr: Register, bitNum: BitPos, data: Bit): I2C_RESULT;
    /** Write multiple bits in an 8-bit device register.
     * @param regAddr Register regAddr to write to
     * @param bitStart First bit position to write (0-7)
     * @param length Number of bits to write (not more than 8)
     * @param bits Right-aligned value to write
     * @returns Status of operation (0 = success)
     */
    writeBits<Position extends BitPos, Length extends AvailableLength<Position>>(regAddr: Register, bitStart: Position, length: Length, bits: Bits<Length>): I2C_RESULT;
    /** Write single byte to an 8-bit device register.
     * @param regAddr Register address to write to
     * @param data New byte value to write
     * @returns Status of operation (0 = success)
     */
    writeByte(regAddr: Register, data: Byte): I2C_RESULT;
    /** Write multiple bytes to an 8-bit device register.
     * @param regAddr First register address to write to
     * @param data Buffer to copy new data from
     * @returns Status of operation (0 = success)
     */
    writeBytes(regAddr: Register, data: Buffer | number[]): I2C_RESULT;
    /** Write 2 byte number to a 16-bit device register.
     * @param regAddr First register address to write to
     * @param data Data to copy
     * @returns Status of operation (0 = success)
     */
    writeWord(regAddr: Register, data: number): I2C_RESULT;
}
export {};
