import EventEmitter from 'eventemitter3';
import { vec2 } from 'linearly';
import { Aperture, BatteryLevel, ConfigName, ConfigType, DriveMode, ExposureComp, ExposureMeteringMode, ExposureMode, FlashMode, FocalLength, FocusMeteringMode, FocusMode, FocusPeaking, FunctionalMode, ImageAspect, ImageQuality, ImageSize, ISO, ManualFocusOption, ShutterSpeed, WhiteBalance } from './configs';
import { TethrObject } from './TethrObject';
export type OperationResultStatus = 'ok' | 'unsupported' | 'invalid parameter' | 'busy' | 'general error';
export type OperationResult<T = void> = T extends void ? {
    status: OperationResultStatus;
    message?: string;
} : {
    status: Exclude<OperationResultStatus, 'ok'>;
    message?: string;
} | {
    status: 'ok';
    value: T;
};
export type ConfigDescOption<T> = {
    type: 'enum';
    values: T[];
} | {
    type: 'range';
    min: T;
    max: T;
    step: T;
};
export type ConfigDesc<T> = {
    value: T | null;
} & ({
    writable: true;
    option: ConfigDescOption<T>;
} | {
    writable: false;
    option?: ConfigDescOption<T>;
});
export interface TakePhotoOption {
    doDownload?: boolean;
}
type EventTypes = {
    [N in ConfigName as `${N}Change`]: ConfigDesc<ConfigType[N]>;
} & {
    change: [name: ConfigName, value: ConfigType[ConfigName]];
    disconnect: void;
    progress: {
        progress: number;
    };
};
type ConfigSetters = {
    [N in ConfigName as `set${Capitalize<N>}`]: (value: ConfigType[N]) => Promise<OperationResult>;
};
type ConfigGetters = {
    [N in ConfigName as `get${Capitalize<N>}`]: () => Promise<ConfigType[N] | null>;
};
type ConfigDescGetters = {
    [N in ConfigName as `get${Capitalize<N>}Desc`]: () => Promise<ConfigDesc<ConfigType[N]>>;
};
export type TethrDeviceType = 'ptpusb' | 'webcam';
export declare abstract class Tethr extends EventEmitter<EventTypes> implements ConfigSetters, ConfigGetters, ConfigDescGetters {
    constructor();
    emit(eventName: keyof EventTypes, ...args: any[]): boolean;
    abstract open(): Promise<void>;
    abstract close(): Promise<void>;
    abstract get opened(): boolean;
    abstract get type(): TethrDeviceType;
    abstract get name(): string;
    setLog(log: boolean): void;
    /**
     * Export all writable configs to a plain object.
     */
    exportConfigs(): Promise<Partial<ConfigType>>;
    /**
     * Apply all writable configs.
     */
    importConfigs(configs: Partial<ConfigType>): Promise<void>;
    get<N extends ConfigName>(name: N): Promise<ConfigType[N] | null>;
    set<N extends ConfigName>(name: N, value: ConfigType[N]): Promise<OperationResult>;
    getDesc<N extends ConfigName>(name: N): Promise<ConfigDesc<ConfigType[N]>>;
    setAperture(value: Aperture): Promise<OperationResult>;
    getAperture(): Promise<Aperture | null>;
    getApertureDesc(): Promise<ConfigDesc<Aperture>>;
    setAutoFocusFrameCenter(value: vec2): Promise<OperationResult>;
    getAutoFocusFrameCenter(): Promise<vec2 | null>;
    getAutoFocusFrameCenterDesc(): Promise<ConfigDesc<vec2>>;
    setAutoFocusFrameSize(value: string): Promise<OperationResult>;
    getAutoFocusFrameSize(): Promise<string | null>;
    getAutoFocusFrameSizeDesc(): Promise<ConfigDesc<string>>;
    setBatteryLevel(value: BatteryLevel): Promise<OperationResult>;
    getBatteryLevel(): Promise<BatteryLevel | null>;
    getBatteryLevelDesc(): Promise<ConfigDesc<BatteryLevel>>;
    setBurstInterval(value: number): Promise<OperationResult>;
    getBurstInterval(): Promise<number | null>;
    getBurstIntervalDesc(): Promise<ConfigDesc<number>>;
    setBurstNumber(value: number): Promise<OperationResult>;
    getBurstNumber(): Promise<number | null>;
    getBurstNumberDesc(): Promise<ConfigDesc<number>>;
    setCanRunAutoFocus(value: boolean): Promise<OperationResult>;
    getCanRunAutoFocus(): Promise<boolean | null>;
    getCanRunAutoFocusDesc(): Promise<ConfigDesc<boolean>>;
    setCanRunManualFocus(value: boolean): Promise<OperationResult>;
    getCanRunManualFocus(): Promise<boolean | null>;
    getCanRunManualFocusDesc(): Promise<ConfigDesc<boolean>>;
    setCanStartLiveview(value: boolean): Promise<OperationResult>;
    getCanStartLiveview(): Promise<boolean | null>;
    getCanStartLiveviewDesc(): Promise<ConfigDesc<boolean>>;
    setCanTakePhoto(value: boolean): Promise<OperationResult>;
    getCanTakePhoto(): Promise<boolean | null>;
    getCanTakePhotoDesc(): Promise<ConfigDesc<boolean>>;
    setCaptureDelay(value: number): Promise<OperationResult>;
    getCaptureDelay(): Promise<number | null>;
    getCaptureDelayDesc(): Promise<ConfigDesc<number>>;
    setColorMode(value: string): Promise<OperationResult>;
    getColorMode(): Promise<string | null>;
    getColorModeDesc(): Promise<ConfigDesc<string>>;
    setColorTemperature(value: number): Promise<OperationResult>;
    getColorTemperature(): Promise<number | null>;
    getColorTemperatureDesc(): Promise<ConfigDesc<number>>;
    setCompressionSetting(value: number): Promise<OperationResult>;
    getCompressionSetting(): Promise<number | null>;
    getCompressionSettingDesc(): Promise<ConfigDesc<number>>;
    setContrast(value: number): Promise<OperationResult>;
    getContrast(): Promise<number | null>;
    getContrastDesc(): Promise<ConfigDesc<number>>;
    setDateTime(value: Date): Promise<OperationResult>;
    getDateTime(): Promise<Date | null>;
    getDateTimeDesc(): Promise<ConfigDesc<Date>>;
    setDestinationToSave(value: string): Promise<OperationResult>;
    getDestinationToSave(): Promise<string | null>;
    getDestinationToSaveDesc(): Promise<ConfigDesc<string>>;
    setDigitalZoom(value: number): Promise<OperationResult>;
    getDigitalZoom(): Promise<number | null>;
    getDigitalZoomDesc(): Promise<ConfigDesc<number>>;
    setDriveMode(value: DriveMode): Promise<OperationResult>;
    getDriveMode(): Promise<DriveMode | null>;
    getDriveModeDesc(): Promise<ConfigDesc<DriveMode>>;
    setExposureComp(value: ExposureComp): Promise<OperationResult>;
    getExposureComp(): Promise<string | null>;
    getExposureCompDesc(): Promise<ConfigDesc<ExposureComp>>;
    setExposureMeteringMode(value: ExposureMeteringMode): Promise<OperationResult>;
    getExposureMeteringMode(): Promise<ExposureMeteringMode | null>;
    getExposureMeteringModeDesc(): Promise<ConfigDesc<ExposureMeteringMode>>;
    setExposureMode(value: ExposureMode): Promise<OperationResult>;
    getExposureMode(): Promise<ExposureMode | null>;
    getExposureModeDesc(): Promise<ConfigDesc<ExposureMode>>;
    setFacingMode(value: string): Promise<OperationResult>;
    getFacingMode(): Promise<string | null>;
    getFacingModeDesc(): Promise<ConfigDesc<string>>;
    setFlashMode(value: FlashMode): Promise<OperationResult>;
    getFlashMode(): Promise<FlashMode | null>;
    getFlashModeDesc(): Promise<ConfigDesc<FlashMode>>;
    setFocalLength(value: FocalLength): Promise<OperationResult>;
    getFocalLength(): Promise<FocalLength | null>;
    getFocalLengthDesc(): Promise<ConfigDesc<FocalLength>>;
    setFocusDistance(value: number): Promise<OperationResult>;
    getFocusDistance(): Promise<number | null>;
    getFocusDistanceDesc(): Promise<ConfigDesc<number>>;
    setFocusMeteringMode(value: FocusMeteringMode): Promise<OperationResult>;
    getFocusMeteringMode(): Promise<FocusMeteringMode | null>;
    getFocusMeteringModeDesc(): Promise<ConfigDesc<FocusMeteringMode>>;
    setFocusMode(value: FocusMode): Promise<OperationResult>;
    getFocusMode(): Promise<FocusMode | null>;
    getFocusModeDesc(): Promise<ConfigDesc<FocusMode>>;
    setFocusPeaking(value: FocusPeaking): Promise<OperationResult>;
    getFocusPeaking(): Promise<FocusPeaking | null>;
    getFocusPeakingDesc(): Promise<ConfigDesc<FocusPeaking>>;
    setFunctionalMode(value: FunctionalMode): Promise<OperationResult>;
    getFunctionalMode(): Promise<FunctionalMode | null>;
    getFunctionalModeDesc(): Promise<ConfigDesc<FunctionalMode>>;
    setImageAspect(value: ImageAspect): Promise<OperationResult>;
    getImageAspect(): Promise<ImageAspect | null>;
    getImageAspectDesc(): Promise<ConfigDesc<ImageAspect>>;
    setImageQuality(value: ImageQuality): Promise<OperationResult>;
    getImageQuality(): Promise<string | null>;
    getImageQualityDesc(): Promise<ConfigDesc<string>>;
    setImageSize(value: ImageSize): Promise<OperationResult>;
    getImageSize(): Promise<string | null>;
    getImageSizeDesc(): Promise<ConfigDesc<ImageSize>>;
    setIso(value: ISO): Promise<OperationResult>;
    getIso(): Promise<ISO | null>;
    getIsoDesc(): Promise<ConfigDesc<ISO>>;
    setLiveview(value: MediaStream): Promise<OperationResult>;
    /**
     * Get the liveview stream when liveview is running. Use {@link getCanStartLiveview} to check if the camera supports this action, and {@link startLiveview} or {@link stopLiveview} to control liveview.
     */
    getLiveview(): Promise<MediaStream | null>;
    getLiveviewDesc(): Promise<ConfigDesc<MediaStream>>;
    setLiveviewMagnifyRatio(value: number): Promise<OperationResult>;
    getLiveviewMagnifyRatio(): Promise<number | null>;
    getLiveviewMagnifyRatioDesc(): Promise<ConfigDesc<number>>;
    setLiveviewSize(value: string): Promise<OperationResult>;
    getLiveviewSize(): Promise<string | null>;
    getLiveviewSizeDesc(): Promise<ConfigDesc<string>>;
    setManualFocusOptions(value: ManualFocusOption[]): Promise<OperationResult>;
    getManualFocusOptions(): Promise<("near:2" | "near:1" | "near:3" | "far:2" | "far:1" | "far:3")[] | null>;
    getManualFocusOptionsDesc(): Promise<ConfigDesc<ManualFocusOption[]>>;
    setManufacturer(value: string): Promise<OperationResult>;
    getManufacturer(): Promise<string | null>;
    getManufacturerDesc(): Promise<ConfigDesc<string>>;
    setModel(value: string): Promise<OperationResult>;
    getModel(): Promise<string | null>;
    getModelDesc(): Promise<ConfigDesc<string>>;
    setSerialNumber(value: string): Promise<OperationResult>;
    getSerialNumber(): Promise<string | null>;
    getSerialNumberDesc(): Promise<ConfigDesc<string>>;
    setSharpness(value: number): Promise<OperationResult>;
    getSharpness(): Promise<number | null>;
    getSharpnessDesc(): Promise<ConfigDesc<number>>;
    setShutterSpeed(value: ShutterSpeed): Promise<OperationResult>;
    getShutterSpeed(): Promise<ShutterSpeed | null>;
    getShutterSpeedDesc(): Promise<ConfigDesc<ShutterSpeed>>;
    setShutterSound(value: number): Promise<OperationResult>;
    getShutterSound(): Promise<number | null>;
    getShutterSoundDesc(): Promise<ConfigDesc<number>>;
    setTimelapseInterval(value: number): Promise<OperationResult>;
    getTimelapseInterval(): Promise<number | null>;
    getTimelapseIntervalDesc(): Promise<ConfigDesc<number>>;
    setTimelapseNumber(value: number): Promise<OperationResult>;
    getTimelapseNumber(): Promise<number | null>;
    getTimelapseNumberDesc(): Promise<ConfigDesc<number>>;
    setWhiteBalance(value: WhiteBalance): Promise<OperationResult>;
    getWhiteBalance(): Promise<WhiteBalance | null>;
    getWhiteBalanceDesc(): Promise<ConfigDesc<WhiteBalance>>;
    /**
     * Runs auto focus. Use {@link getCanRunAutoFocus} to check if the camera supports this action.
     * @category Action
     */
    runAutoFocus(): Promise<OperationResult>;
    /**
     * Runs manual focus. Use {@link getCanRunAutoFocus} to check if the camera supports this action.
     * @category Action
     */
    runManualFocus(option: ManualFocusOption): Promise<OperationResult>;
    /**
     * Takes a photo. Use {@link getCanTakePhoto} to check if the camera supports this action.
     * @category Action
     */
    takePhoto(option?: TakePhotoOption): Promise<OperationResult<TethrObject[]>>;
    /**
     * Starts liveview. Use {@link getCanStartLiveview} to check if the camera supports this action.
     * @category Action
     */
    startLiveview(): Promise<OperationResult<MediaStream>>;
    /**
     * Stops liveview.
     * @category Action
     */
    stopLiveview(): Promise<OperationResult>;
}
export {};
