///
import { ESP_ROM_BAUD, Logger } from "./const";
import { ESPLoader } from "./esp_loader";
export type { Logger } from "./const";
export { ESPLoader } from "./esp_loader";
export {
CHIP_FAMILY_ESP32,
CHIP_FAMILY_ESP32S2,
CHIP_FAMILY_ESP32S3,
CHIP_FAMILY_ESP8266,
CHIP_FAMILY_ESP32C2,
CHIP_FAMILY_ESP32C3,
CHIP_FAMILY_ESP32C5,
CHIP_FAMILY_ESP32C6,
CHIP_FAMILY_ESP32C61,
CHIP_FAMILY_ESP32H2,
CHIP_FAMILY_ESP32H4,
CHIP_FAMILY_ESP32H21,
CHIP_FAMILY_ESP32P4,
CHIP_FAMILY_ESP32S31,
// Command constants
ESP_FLASH_BEGIN,
ESP_FLASH_DATA,
ESP_FLASH_END,
ESP_MEM_BEGIN,
ESP_MEM_END,
ESP_MEM_DATA,
ESP_SYNC,
ESP_WRITE_REG,
ESP_READ_REG,
ESP_ERASE_FLASH,
ESP_ERASE_REGION,
ESP_READ_FLASH,
ESP_SPI_SET_PARAMS,
ESP_SPI_ATTACH,
ESP_CHANGE_BAUDRATE,
ESP_SPI_FLASH_MD5,
ESP_GET_SECURITY_INFO,
ESP_CHECKSUM_MAGIC,
ESP_FLASH_DEFL_BEGIN,
ESP_FLASH_DEFL_DATA,
ESP_FLASH_DEFL_END,
ROM_INVALID_RECV_MSG,
// Block size constants
USB_RAM_BLOCK,
ESP_RAM_BLOCK,
// Timeout constants
DEFAULT_TIMEOUT,
CHIP_ERASE_TIMEOUT,
MAX_TIMEOUT,
SYNC_TIMEOUT,
ERASE_REGION_TIMEOUT_PER_MB,
MEM_END_ROM_TIMEOUT,
FLASH_READ_TIMEOUT,
} from "./const";
export const connect = async (logger: Logger) => {
// - Request a port and open a connection.
// Try to use requestSerialPort if available (supports WebUSB for Android)
let port: SerialPort;
const customRequestPort = (
globalThis as { requestSerialPort?: () => Promise }
).requestSerialPort;
if (typeof customRequestPort === "function") {
port = await customRequestPort();
} else {
// Check if Web Serial API is available
if (!navigator.serial) {
throw new Error(
"Web Serial API is not supported in this browser. " +
"Please use Chrome, Edge, or Opera on desktop, or Chrome on Android. " +
"Note: The page must be served over HTTPS or localhost.",
);
}
port = await navigator.serial.requestPort();
}
// Only open if not already open (requestSerialPort may return an opened port)
if (!port.readable || !port.writable) {
await port.open({ baudRate: ESP_ROM_BAUD });
}
return new ESPLoader(port, logger);
};
export const connectWithPort = async (port: SerialPort, logger: Logger) => {
// Connect using an already opened port (useful for WebUSB wrapper)
if (!port) {
throw new Error("Port is required");
}
// Check if port is already open, if not open it
if (!port.readable || !port.writable) {
await port.open({ baudRate: ESP_ROM_BAUD });
}
return new ESPLoader(port, logger);
};
// Export utility functions for use in UI code
export { toHex, sleep, hexFormatter, formatMacAddr } from "./util";