UNPKG

rpio-define

Version:

Modern style define GPIO for RaspberryPi.

101 lines (96 loc) 3.6 kB
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;