feat(core): 优化在线版下ampy和kflash的进度显示

This commit is contained in:
王立帮
2025-11-02 19:18:11 +08:00
parent e82a2bd791
commit 535abbc8e1
5 changed files with 131 additions and 34 deletions

View File

@@ -100,7 +100,7 @@ class MAIXLoader {
#port_ = null;
#readedBuffer_ = [];
#events_ = new Events('message');
#events_ = new Events(['message', 'replaceMessage']);
constructor(port) {
this.#port_ = port;
@@ -117,6 +117,10 @@ class MAIXLoader {
this.#events_.run('message', message);
}
replaceMessage(lineNumber, message) {
this.#events_.run('replaceMessage', lineNumber, message);
}
async write(packet) {
let handlePacket = [];
@@ -251,9 +255,9 @@ class MAIXLoader {
getProgressMessage(name, percent) {
const sended = parseInt(percent * 45);
const left = Array(sended).fill('=').join('');
const right = Array(45 - sended).fill('-').join('');
return `${name}: |${left}${right}| ${(percent * 100).toFixed(1)}%\n\n`;
const left = percent === 0 ? '' : Array(sended).fill('=').join('');
const right = percent === 100 ? '' : Array(45 - sended).fill('-').join('');
return `${name}: |${left}${right}| ${(percent * 100).toFixed(1)}%`;
}
async flashDataFrame(data, address = 0x80000000) {
@@ -261,6 +265,7 @@ class MAIXLoader {
const dataLength = data.length;
let sendedLength = 0;
const len = Math.ceil(dataLength / this.DATAFRAME_SIZE);
this.message('\n');
for (let i = 0; i < len; i++) {
let start = i * this.DATAFRAME_SIZE;
let end = Math.min(start + this.DATAFRAME_SIZE, dataLength);
@@ -286,12 +291,18 @@ class MAIXLoader {
await this.write(packet);
if (await this.recvDebug()) {
sendedLength += chunk.length;
this.message(this.getProgressMessage('Downloading ISP', sendedLength / dataLength));
const message = this.getProgressMessage('Downloading ISP', sendedLength / dataLength);
if (i > 0) {
this.replaceMessage(-1, message);
} else {
this.message(message);
}
address += this.DATAFRAME_SIZE;
break;
}
}
}
this.message('\n\n');
}
async installFlashBootloader(data) {
@@ -390,7 +401,7 @@ class MAIXLoader {
}
async flashFirmware(firmware, aesKey = null, address = 0, sha256Prefix = true, filename = '') {
this.message(`[INFO] Writing ${filename} into ${this.formatHex(address)}\n\n`);
this.message(`[INFO] Writing ${filename} into ${this.formatHex(address)}\n`);
let firmwareBin = Array.from(new Uint8Array(firmware));
if (sha256Prefix) {
const aesCipherFlag = 0x00;
@@ -432,18 +443,25 @@ class MAIXLoader {
await this.write(packet);
if (await this.recvDebug()) {
sendedLength += chunkLength;
this.message(this.getProgressMessage('Programming BIN', sendedLength / dataLength));
const message = this.getProgressMessage('Programming BIN', sendedLength / dataLength);
if (i > 0) {
this.replaceMessage(-1, message);
} else {
this.message(`\n${message}`);
}
address += this.ISP_FLASH_DATA_FRAME_SIZE;
break;
}
}
}
this.message('\n\n');
}
dispose() {
this.#port_ = null;
this.#events_.reset();
this.#events_ = null;
this.#readedBuffer_ = null;
}
}
@@ -451,10 +469,13 @@ class KFlash {
#port_ = null;
#loader_ = null;
constructor(port, messageCallback) {
constructor(port) {
this.#port_ = port;
this.#loader_ = new MAIXLoader(port);
this.#loader_.bind('message', messageCallback);
}
bind(...args) {
return this.#loader_.bind(...args);
}
async enter() {
@@ -462,7 +483,7 @@ class KFlash {
}
async write(firmware, address = 0x0, sha256Prefix = true, filename = '') {
this.#loader_.message('[INFO] Trying to Enter the ISP Mode...\n');
this.#loader_.message('[INFO] Trying to Enter the ISP Mode...');
let retryCount = 0;
while (true) {
try {
@@ -500,6 +521,7 @@ class KFlash {
dispose() {
this.#loader_.dispose();
this.#loader_ = null;
this.#port_ = null;
}
}