import EventEmitter from "node:events";
import { FirmwareValidation } from "./enums.js";
import { Transport } from "./transport.js";
import type { AdapterModel, PortConf } from "./types.js";
import { type XExitStatus, XModemCRC } from "./xmodem.js";
export declare enum BootloaderState {
    /** Not connected to bootloader (i.e. not any of below) */
    NOT_CONNECTED = 0,
    /** Waiting in menu */
    IDLE = 1,
    /** Triggered 'Upload GBL' menu */
    BEGIN_UPLOAD = 2,
    /** Received 'begin upload' */
    UPLOADING = 3,
    /** GBL upload completed */
    UPLOADED = 4,
    /** Triggered 'Run' menu */
    RUNNING = 5,
    /** Triggered 'EBL Info' menu */
    GETTING_INFO = 6,
    /** Received response for 'EBL Info' menu */
    GOT_INFO = 7
}
export declare const enum BootloaderMenu {
    UPLOAD_GBL = 49,
    RUN = 50,
    INFO = 51,
    CLEAR_APP = 254,
    CLEAR_NVM3 = 255
}
export declare const enum BootloaderEvent {
    FAILED = "failed",
    CLOSED = "closed",
    UPLOAD_START = "uploadStart",
    UPLOAD_STOP = "uploadStop",
    UPLOAD_PROGRESS = "uploadProgress"
}
interface GeckoBootloaderEventMap {
    [BootloaderEvent.CLOSED]: [];
    [BootloaderEvent.FAILED]: [];
    [BootloaderEvent.UPLOAD_PROGRESS]: [percent: number];
    [BootloaderEvent.UPLOAD_START]: [];
    [BootloaderEvent.UPLOAD_STOP]: [status: XExitStatus];
}
export declare class GeckoBootloader extends EventEmitter<GeckoBootloaderEventMap> {
    readonly adapterModel?: AdapterModel;
    readonly portConf: PortConf;
    readonly transport: Transport;
    readonly xmodem: XModemCRC;
    private state;
    private waiter;
    constructor(portConf: PortConf, adapterModel?: AdapterModel);
    connect(): Promise<void>;
    navigate(menu: BootloaderMenu, firmware?: Buffer): Promise<boolean>;
    validateFirmware(firmware: Buffer | undefined): Promise<FirmwareValidation>;
    dtrRtsReset(exit: boolean, fail?: boolean): Promise<boolean>;
    baudrateReset(fail?: boolean): Promise<void>;
    private cpcLaunch;
    private ezspLaunch;
    private spinelLaunch;
    private knock;
    private menuGetInfo;
    private menuRun;
    private menuUploadGBL;
    private onTransportData;
    private onTransportFailed;
    private onXModemData;
    private onXModemStart;
    private onXModemStop;
    private readBootloaderInfo;
    private resolveState;
    private waitForState;
}
export {};
