feat(core): 优化在线版下ampy和kflash的进度显示
This commit is contained in:
@@ -3,6 +3,7 @@ goog.loadJs('web', () => {
|
||||
goog.require('path');
|
||||
goog.require('Mustache');
|
||||
goog.require('Mixly.Env');
|
||||
goog.require('Mixly.Events');
|
||||
goog.require('Mixly.Msg');
|
||||
goog.require('Mixly.Ampy');
|
||||
goog.require('Mixly.Web');
|
||||
@@ -10,6 +11,7 @@ goog.provide('Mixly.Web.Ampy');
|
||||
|
||||
const {
|
||||
Env,
|
||||
Events,
|
||||
Msg,
|
||||
Ampy,
|
||||
Web
|
||||
@@ -37,6 +39,7 @@ class AmpyExt extends Ampy {
|
||||
#writeBuffer_ = true;
|
||||
#active_ = false;
|
||||
#dataLength_ = 256;
|
||||
#events_ = new Events(['message', 'replaceMessage'])
|
||||
constructor(device, writeBuffer = true, dataLength = 256) {
|
||||
super();
|
||||
this.#device_ = device;
|
||||
@@ -56,6 +59,25 @@ class AmpyExt extends Ampy {
|
||||
});
|
||||
}
|
||||
|
||||
bind(...args) {
|
||||
return this.#events_.bind(...args);
|
||||
}
|
||||
|
||||
message(message) {
|
||||
this.#events_.run('message', message);
|
||||
}
|
||||
|
||||
replaceMessage(lineNumber, message) {
|
||||
this.#events_.run('replaceMessage', lineNumber, message);
|
||||
}
|
||||
|
||||
getProgressMessage(name, percent) {
|
||||
const sended = parseInt(percent * 45);
|
||||
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)}%`;
|
||||
}
|
||||
|
||||
isActive() {
|
||||
return this.#active_;
|
||||
}
|
||||
@@ -235,6 +257,8 @@ class AmpyExt extends Ampy {
|
||||
if (!this.isActive()) {
|
||||
throw new Error(Msg.Lang['ampy.portIsNotOpen']);
|
||||
}
|
||||
this.message(`Writing ${filename}...\n`);
|
||||
this.message(this.getProgressMessage('', 0));
|
||||
await this.exec(`file = open('${filename}', 'wb')`, timeout);
|
||||
let buffer = null;
|
||||
if (data.constructor === String) {
|
||||
@@ -245,8 +269,15 @@ class AmpyExt extends Ampy {
|
||||
buffer = data;
|
||||
}
|
||||
const len = Math.ceil(buffer.length / 64);
|
||||
if (!len) {
|
||||
this.replaceMessage(-1, this.getProgressMessage('', 1));
|
||||
}
|
||||
let sendedLength = 0;
|
||||
for (let i = 0; i < len; i++) {
|
||||
const writeBuffer = buffer.slice(i * 64, Math.min((i + 1) * 64, buffer.length));
|
||||
sendedLength += writeBuffer.length;
|
||||
const percent = sendedLength / buffer.length;
|
||||
this.replaceMessage(-1, this.getProgressMessage('', percent));
|
||||
let writeStr = '';
|
||||
for (let num of writeBuffer) {
|
||||
let numStr = num.toString(16);
|
||||
@@ -258,6 +289,7 @@ class AmpyExt extends Ampy {
|
||||
await this.exec(`file.write(b'${writeStr}')`, timeout);
|
||||
}
|
||||
await this.exec('file.close()', timeout);
|
||||
this.message('\n');
|
||||
}
|
||||
|
||||
async ls(directory = '/', longFormat = true, recursive = false, timeout = 5000) {
|
||||
@@ -387,6 +419,8 @@ class AmpyExt extends Ampy {
|
||||
this.#active_ = false;
|
||||
await this.#device_.dispose();
|
||||
this.#device_ = null;
|
||||
this.#events_.reset();
|
||||
this.#events_ = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user