import EventEmitter from 'events' import SerialPort from 'serialport' import { BoardConfig } from '../board'; import { sleep, serialportPromisify } from '../util'; import { SerialPortAdapter } from '../webserial/adapter' abstract class Uploader extends EventEmitter { protected boardConfig: BoardConfig; constructor(boardConfig: BoardConfig) { super(); this.boardConfig = boardConfig; } protected abstract bootload(port: SerialPort | SerialPortAdapter, hex: Buffer): Promise; public async upload(port: SerialPort | SerialPortAdapter, hex: string | Buffer) { hex = Buffer.from(hex); const baudRate = this.boardConfig.baudRate; const { open, close, update } = serialportPromisify(port) if (!port.isOpen) { await open(); } if (port.baudRate !== baudRate) { console.log('update baudRate', baudRate) await update({ baudRate }) await sleep(250) } console.log('reset...') await this.reset(port); console.log('upload...') await this.bootload(port, hex); if (port.isOpen) { await close(); console.log('close port') } } protected async reset(port: SerialPort | SerialPortAdapter) { const { set } = serialportPromisify(port) await set({ dtr: false, rts: false }) await sleep(250) await set({ dtr: true, rts: false }) await sleep(50) } } export { Uploader }