rpio-define
Version:
Modern style define GPIO for RaspberryPi.
130 lines (128 loc) • 5.9 kB
TypeScript
/** @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 {};