rpio-define
Version:
Modern style define GPIO for RaspberryPi.
101 lines (96 loc) • 3.6 kB
TypeScript
import rpio from 'rpio';
export { I2CDevice, Bit, Bits } from './i2c';
declare type BasePortDescriptor = {
pin: number;
};
declare type DigitalInDescriptor = BasePortDescriptor & {
type: 'digital' | typeof Boolean;
mode?: 'input' | typeof rpio.INPUT | 'inputpullup';
callback?: (pin: number) => void;
edge?: 'rising' | 'falling' | 'both' | typeof rpio.POLL_HIGH | typeof rpio.POLL_LOW | typeof rpio.POLL_BOTH;
};
declare type DigitalOutDescriptor = BasePortDescriptor & {
type: 'digital' | typeof Boolean;
mode?: 'output' | typeof rpio.OUTPUT | 'outputopendrain';
default?: boolean;
};
declare type DigitalPortDescriptor = DigitalOutDescriptor | DigitalInDescriptor;
/** [pulse value] or [angle and pulse] */
declare type ServoRangeDefine = number | {
angle: number;
pulse: number;
};
declare type ServoPortDescriptor = BasePortDescriptor & {
type: 'servo';
default?: number;
min?: ServoRangeDefine;
max?: ServoRangeDefine;
offset?: number;
};
declare type PWMPortDescriptor = BasePortDescriptor & {
type: 'pwm';
default?: number;
min?: number;
max?: number;
hz?: // 19.2MHz / (2**(0~12))
19200000 | 9600000 | 4800000 | 2400000 | 1200000 | 600000 | 300000 | 150000 | 75000 | 37500 | 18750 | 9375 | 4687.5;
};
declare type CustomDriver = <T>(...args: any[]) => {
type: string;
value: T;
};
declare type CustomDescriptor = <T>(...args: any[]) => {
type: string;
get(): T;
set(value: T): void;
};
export declare type CustomPortDescriptor = CustomDriver | CustomDescriptor;
declare type PortDescritpor = DigitalPortDescriptor | ServoPortDescriptor | PWMPortDescriptor | ReturnType<CustomPortDescriptor>;
declare type PortDescritpors = {
[label: string]: PortDescritpor;
};
export declare const DigitalOutput: (option: Omit<DigitalOutDescriptor, "type"> & {
type?: BooleanConstructor | "digital" | undefined;
}) => DigitalOutDescriptor;
export declare const DigitalInput: (option: Omit<DigitalInDescriptor, "type"> & {
type?: BooleanConstructor | "digital" | undefined;
}) => DigitalInDescriptor;
export declare const Servo: (option: Omit<ServoPortDescriptor, "type"> & {
type?: "servo" | undefined;
}) => ServoPortDescriptor;
export declare const PWM: (option: Omit<PWMPortDescriptor, "type"> & {
type?: "pwm" | undefined;
}) => PWMPortDescriptor;
/** use example
```javascript
import rpio from 'rpio'
import { defineIO, DigitalOutput, Servo } from 'rpio-define'
rpio.init({ mapping: 'gpio' });
const io = defineIO({
led: DigitalOutput({
pin: 16
}),
motor: Servo({
pin: 12,
})
});
io.led = true; // LED on!
setInterval(() => {
io.led = !io.led; // LED blinking
}, 1000);
```
*/
export declare function defineIO<IODescriptor extends PortDescritpors>(descriptors: IODescriptor): { [label in keyof IODescriptor]: IODescriptor[label] extends DigitalPortDescriptor ? boolean : IODescriptor[label] extends ServoPortDescriptor ? number : IODescriptor[label] extends PWMPortDescriptor ? number : IODescriptor[label] extends {
type: string;
value: unknown;
} | {
type: string;
get(): unknown;
set(value: unknown): void;
} ? IODescriptor[label] extends {
get: () => any;
} ? ReturnType<IODescriptor[label]["get"]> : IODescriptor[label] extends {
type: string;
value: unknown;
} ? IODescriptor[label]["value"] : never : never; };
export default defineIO;