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;
