UNPKG

rpio-define

Version:

Modern style define GPIO for RaspberryPi.

130 lines (128 loc) 5.9 kB
/** @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 {};