diff --git a/common/modules/mixly-modules/common/layer.js b/common/modules/mixly-modules/common/layer.js index 6b5cbf4c..c57409c0 100644 --- a/common/modules/mixly-modules/common/layer.js +++ b/common/modules/mixly-modules/common/layer.js @@ -38,7 +38,6 @@ class Layer extends Component { const shadow = Layer.templates.getItem(shadowType); this.setContent($(shadow)); this.#dialog_ = dialog({ - skin: 'min-dialog tips', padding: 0, ...config }); diff --git a/common/modules/mixly-modules/deps.json b/common/modules/mixly-modules/deps.json index cf209c1f..f3e7aa17 100644 --- a/common/modules/mixly-modules/deps.json +++ b/common/modules/mixly-modules/deps.json @@ -1276,6 +1276,8 @@ "Mixly.MString", "Mixly.Workspace", "Mixly.Serial", + "Mixly.LayerProgress", + "Mixly.Debug", "Mixly.Electron.Shell" ], "provide": [ @@ -1296,6 +1298,7 @@ "Mixly.Debug", "Mixly.HTMLTemplate", "Mixly.LayerFirmware", + "Mixly.LayerProgress", "Mixly.Electron.Serial" ], "provide": [ @@ -1574,6 +1577,7 @@ "Mixly.HTMLTemplate", "Mixly.MString", "Mixly.LayerFirmware", + "Mixly.LayerProgress", "Mixly.Web.Serial", "Mixly.Web.Ampy" ], diff --git a/common/modules/mixly-modules/electron/arduino-shell.js b/common/modules/mixly-modules/electron/arduino-shell.js index 2f204f53..78d04ca6 100644 --- a/common/modules/mixly-modules/electron/arduino-shell.js +++ b/common/modules/mixly-modules/electron/arduino-shell.js @@ -14,6 +14,8 @@ goog.require('Mixly.Msg'); goog.require('Mixly.MString'); goog.require('Mixly.Workspace'); goog.require('Mixly.Serial'); +goog.require('Mixly.LayerProgress'); +goog.require('Mixly.Debug'); goog.require('Mixly.Electron.Shell'); goog.provide('Mixly.Electron.ArduShell'); @@ -21,6 +23,7 @@ const { Env, Electron, LayerExt, + Config, Title, Boards, MFile, @@ -29,7 +32,8 @@ const { MString, Workspace, Serial, - Config + LayerProgress, + Debug } = Mixly; const { BOARD, SOFTWARE, USER } = Config; @@ -46,14 +50,29 @@ const { } = Electron; ArduShell.DEFAULT_CONFIG = goog.readJsonSync(path.join(Env.templatePath, 'json/arduino-cli-config.json')); - -ArduShell.binFilePath = ''; - -ArduShell.shellPath = null; - -ArduShell.shell = null; - ArduShell.ERROR_ENCODING = Env.currentPlatform == 'win32' ? 'cp936' : 'utf-8'; +ArduShell.binFilePath = ''; +ArduShell.shellPath = null; +ArduShell.shell = null; +ArduShell.compiling = false; +ArduShell.uploading = false; +ArduShell.killing = false; +ArduShell.progressLayer = new LayerProgress({ + width: 200, + cancelValue: Msg.Lang['nav.btn.stop'], + skin: 'layui-anim layui-anim-scale', + cancel: () => { + if (ArduShell.killing) { + return false; + } + ArduShell.progressLayer.title(`${Msg.Lang['shell.aborting']}...`); + ArduShell.killing = true; + ArduShell.cancel(); + return false; + }, + cancelDisplay: false +}); + ArduShell.updateShellPath = () => { let shellPath = path.join(Env.clientPath, 'arduino-cli'); @@ -143,32 +162,12 @@ ArduShell.compile = (doFunc = () => {}) => { const code = editor.getCode(); ArduShell.compiling = true; ArduShell.uploading = false; + ArduShell.killing = false; const boardType = Boards.getSelectedBoardCommandParam(); mainStatusBarTabs.show(); - const layerNum = layer.open({ - type: 1, - title: Msg.Lang['shell.compiling'] + "...", - content: $('#mixly-loader-div'), - shade: LayerExt.SHADE_NAV, - resize: false, - closeBtn: 0, - success: () => { - $(".layui-layer-page").css("z-index", "198910151"); - $("#mixly-loader-btn").off("click").click(() => { - $("#mixly-loader-btn").css('display', 'none'); - layer.title(Msg.Lang['shell.aborting'] + '...', layerNum); - ArduShell.cancel(); - }); - }, - end: () => { - $('#mixly-loader-div').css('display', 'none'); - $("layui-layer-shade" + layerNum).remove(); - $("#mixly-loader-btn").off("click"); - $("#mixly-loader-btn").css('display', 'inline-block'); - } - }); + ArduShell.progressLayer.title(`${Msg.Lang['shell.compiling']}...`); + ArduShell.progressLayer.show(); statusBarTerminal.setValue(Msg.Lang['shell.compiling'] + "...\n"); - let myLibPath = path.join(Env.boardDirPath, "/libraries/myLib/"); if (fs_plus.isDirectorySync(myLibPath)) myLibPath += '\",\"'; @@ -202,7 +201,7 @@ ArduShell.compile = (doFunc = () => {}) => { + '\" \"' + codePath + '\" --no-color'; - ArduShell.runCmd(layerNum, 'compile', cmdStr, code, doFunc); + ArduShell.runCmd('compile', cmdStr, code, doFunc); } /** @@ -214,6 +213,7 @@ ArduShell.initUpload = () => { const { mainStatusBarTabs } = Mixly; ArduShell.compiling = false; ArduShell.uploading = true; + ArduShell.killing = false; const boardType = Boards.getSelectedBoardCommandParam(); const uploadType = Boards.getSelectedBoardConfigParam('upload_method'); let port = Serial.getSelectedPortName(); @@ -256,28 +256,7 @@ ArduShell.upload = (boardType, port) => { const mainWorkspace = Workspace.getMain(); const editor = mainWorkspace.getEditorsManager().getActive(); const code = editor.getCode(); - const layerNum = layer.open({ - type: 1, - title: Msg.Lang['shell.uploading'] + "...", - content: $('#mixly-loader-div'), - shade: LayerExt.SHADE_NAV, - resize: false, - closeBtn: 0, - success: function () { - $(".layui-layer-page").css("z-index", "198910151"); - $("#mixly-loader-btn").off("click").click(() => { - $("#mixly-loader-btn").css('display', 'none'); - layer.title(Msg.Lang['shell.aborting'] + '...', layerNum); - ArduShell.cancel(); - }); - }, - end: function () { - $('#mixly-loader-div').css('display', 'none'); - $("layui-layer-shade" + layerNum).remove(); - $("#mixly-loader-btn").off("click"); - $("#mixly-loader-btn").css('display', 'inline-block'); - } - }); + ArduShell.progressLayer.title(`${Msg.Lang['shell.uploading']}...`); mainStatusBarTabs.show(); statusBarTerminal.setValue(Msg.Lang['shell.uploading'] + "...\n"); const configPath = path.join(ArduShell.shellPath, '../arduino-cli.json'), @@ -331,7 +310,7 @@ ArduShell.upload = (boardType, port) => { + codePath + '\" --no-color'; } - ArduShell.runCmd(layerNum, 'upload', cmdStr, code, () => { + ArduShell.runCmd('upload', cmdStr, code, () => { if (!Serial.portIsLegal(port)) { return; } @@ -480,7 +459,7 @@ ArduShell.writeLibFiles = (inPath) => { * @param cmd {String} 输入的cmd命令 * @return void */ -ArduShell.runCmd = (layerNum, type, cmd, code, sucFunc) => { +ArduShell.runCmd = (type, cmd, code, sucFunc) => { const { mainStatusBarTabs } = Mixly; const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); const testArduinoDirPath = path.join(Env.clientPath, 'testArduino'); @@ -500,7 +479,7 @@ ArduShell.runCmd = (layerNum, type, cmd, code, sucFunc) => { return ArduShell.shell.exec(cmd); }) .then((info) => { - layer.close(layerNum); + ArduShell.progressLayer.hide(); let message = ''; if (info.code) { message = (type === 'compile' ? Msg.Lang['shell.compileFailed'] : Msg.Lang['shell.uploadFailed']); @@ -513,8 +492,8 @@ ArduShell.runCmd = (layerNum, type, cmd, code, sucFunc) => { layer.msg(message, { time: 1000 }); }) .catch((error) => { - layer.close(layerNum); - console.log(error); + ArduShell.progressLayer.hide(); + Debug.error(error); }) .finally(() => { statusBarTerminal.scrollToBottom(); @@ -530,74 +509,56 @@ ArduShell.writeFile = function (readPath, writePath) { const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); ArduShell.compile(function () { window.setTimeout(function () { - const layerNum = layer.open({ - type: 1, - title: Msg.Lang['shell.saving'] + '...', - content: $('#mixly-loader-div'), - shade: LayerExt.SHADE_ALL, - resize: false, - closeBtn: 0, - success: function () { - $(".layui-layer-page").css("z-index", "198910151"); - $("#mixly-loader-btn").off("click").click(() => { - layer.close(layerNum); - ArduShell.cancel(); - }); - window.setTimeout(function () { - try { - readPath = readPath.replace(/\\/g, "/"); - writePath = writePath.replace(/\\/g, "/"); - } catch (e) { - console.log(e); - } - try { - let writeDirPath = writePath.substring(0, writePath.lastIndexOf(".")); - let writeFileName = writePath.substring(writePath.lastIndexOf("/") + 1, writePath.lastIndexOf(".")); - let writeFileType = writePath.substring(writePath.lastIndexOf(".") + 1); - if (!fs.existsSync(writeDirPath)) { - fs.mkdirSync(writeDirPath); - } - if (fs.existsSync(writePath)) { - fs.unlinkSync(writePath); - } - let readBinFilePath = readPath + "/testArduino.ino." + writeFileType; - let binFileData = fs.readFileSync(readBinFilePath); - fs.writeFileSync(writePath, binFileData); - let binFileType = [ - ".eep", - ".hex", - ".with_bootloader.bin", - ".with_bootloader.hex", - ".bin", - ".elf", - ".map", - ".partitions.bin", - ".bootloader.bin" - ] - for (let i = 0; i < binFileType.length; i++) { - let readFilePath = readPath + "/testArduino.ino" + binFileType[i]; - let writeFilePath = writeDirPath + "/" + writeFileName + binFileType[i]; - if (fs.existsSync(readFilePath)) { - let binData = fs.readFileSync(readFilePath); - fs.writeFileSync(writeFilePath, binData); - } - } - layer.msg(Msg.Lang['shell.saveSucc'], { - time: 1000 - }); - } catch (e) { - console.log(e); - statusBarTerminal.addValue(e + "\n"); - } - layer.close(layerNum); - }, 500); - }, - end: function () { - $('#mixly-loader-div').css('display', 'none'); - $("layui-layer-shade" + layerNum).remove(); - $("#mixly-loader-btn").off("click"); + ArduShell.progressLayer.title(`${Msg.Lang['shell.saving']}...`); + ArduShell.progressLayer.show(); + window.setTimeout(function () { + try { + readPath = readPath.replace(/\\/g, "/"); + writePath = writePath.replace(/\\/g, "/"); + } catch (error) { + Debug.error(error); } - }); + try { + let writeDirPath = writePath.substring(0, writePath.lastIndexOf(".")); + let writeFileName = writePath.substring(writePath.lastIndexOf("/") + 1, writePath.lastIndexOf(".")); + let writeFileType = writePath.substring(writePath.lastIndexOf(".") + 1); + if (!fs.existsSync(writeDirPath)) { + fs.mkdirSync(writeDirPath); + } + if (fs.existsSync(writePath)) { + fs.unlinkSync(writePath); + } + let readBinFilePath = readPath + "/testArduino.ino." + writeFileType; + let binFileData = fs.readFileSync(readBinFilePath); + fs.writeFileSync(writePath, binFileData); + let binFileType = [ + ".eep", + ".hex", + ".with_bootloader.bin", + ".with_bootloader.hex", + ".bin", + ".elf", + ".map", + ".partitions.bin", + ".bootloader.bin" + ] + for (let i = 0; i < binFileType.length; i++) { + let readFilePath = readPath + "/testArduino.ino" + binFileType[i]; + let writeFilePath = writeDirPath + "/" + writeFileName + binFileType[i]; + if (fs.existsSync(readFilePath)) { + let binData = fs.readFileSync(readFilePath); + fs.writeFileSync(writeFilePath, binData); + } + } + layer.msg(Msg.Lang['shell.saveSucc'], { + time: 1000 + }); + } catch (error) { + Debug.error(error); + statusBarTerminal.addValue(e + "\n"); + } + ArduShell.progressLayer.hide(); + }, 500); }, 1000); }); } diff --git a/common/modules/mixly-modules/electron/burn-upload.js b/common/modules/mixly-modules/electron/burn-upload.js index d1810164..f0f567a6 100644 --- a/common/modules/mixly-modules/electron/burn-upload.js +++ b/common/modules/mixly-modules/electron/burn-upload.js @@ -11,6 +11,7 @@ goog.require('Mixly.Workspace'); goog.require('Mixly.Debug'); goog.require('Mixly.HTMLTemplate'); goog.require('Mixly.LayerFirmware'); +goog.require('Mixly.LayerProgress'); goog.require('Mixly.Electron.Serial'); goog.provide('Mixly.Electron.BU'); @@ -26,7 +27,8 @@ const { Serial, Debug, HTMLTemplate, - LayerFirmware + LayerFirmware, + LayerProgress } = Mixly; const { BU } = Electron; @@ -66,6 +68,22 @@ BU.firmwareLayer.bind('burn', (info) => { const port = Serial.getSelectedPortName(); BU.burnWithPort(port, info); }); +BU.killing = false; +BU.progressLayer = new LayerProgress({ + width: 200, + cancelValue: Msg.Lang['nav.btn.stop'], + skin: 'layui-anim layui-anim-scale', + cancel: () => { + if (BU.killing) { + return false; + } + BU.progressLayer.title(`${Msg.Lang['shell.aborting']}...`); + BU.killing = true; + BU.cancel(); + return false; + }, + cancelDisplay: false +}); /** * @function 根据传入的stdout判断磁盘数量并选择对应操作 @@ -173,11 +191,10 @@ BU.checkNumOfDisks = function (type, stdout, startPath) { /** * @function 将文件或文件夹下所有文件拷贝到指定文件夹 * @param type {string} 值为'burn' | 'upload' - * @param layerNum {number} 烧录或上传加载弹窗的编号,用于关闭此弹窗 * @param startPath {string} 需要拷贝的文件或文件夹的路径 * @param desPath {string} 文件的目的路径 **/ -BU.copyFiles = (type, layerNum, startPath, desPath) => { +BU.copyFiles = async (type, startPath, desPath) => { const { mainStatusBarTabs } = Mixly; const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); const { burn, upload } = SELECTED_BOARD; @@ -193,9 +210,9 @@ BU.copyFiles = (type, layerNum, startPath, desPath) => { if (fs_plus.isFileSync(startPath)) { desPath = path.join(desPath, path.basename(startPath)); } - fs_extra.copy(startPath, desPath) - .then(() => { - layer.close(layerNum); + try { + await fs_extra.copy(startPath, desPath); + BU.progressLayer.hide(); const message = (type === 'burn'? Msg.Lang['shell.burnSucc'] : Msg.Lang['shell.uploadSucc']); layer.msg(message, { time: 1000 @@ -210,16 +227,14 @@ BU.copyFiles = (type, layerNum, startPath, desPath) => { const statusBarSerial = mainStatusBarTabs.getStatusBarById(port); statusBarSerial.open(); } - }) - .catch((error) => { - layer.close(layerNum); + } catch (error) { + Debug.error(error); + BU.progressLayer.hide(); statusBarTerminal.setValue(error + '\n'); console.log(error); - }) - .finally(() => { - BU.burning = false; - BU.uploading = false; - }); + } + BU.burning = false; + BU.uploading = false; } /** @@ -231,43 +246,32 @@ BU.copyFiles = (type, layerNum, startPath, desPath) => { BU.initWithDropdownBox = function (type, startPath) { const { mainStatusBarTabs } = Mixly; const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); - const layerNum = layer.open({ - type: 1, - title: (type === 'burn'? Msg.Lang['shell.burning'] : Msg.Lang['shell.uploading']) + '...', - content: $('#mixly-loader-div'), - shade: LayerExt.SHADE_ALL, - resize: false, - closeBtn: 0, - success: function (layero, index) { - $(".layui-layer-page").css("z-index","198910151"); - $("#mixly-loader-btn").off("click").click(() => { - layer.close(index); - BU.cancel(); + const message = (type === 'burn'? Msg.Lang['shell.burning'] : Msg.Lang['shell.uploading']); + BU.progressLayer.title(`${message}...`); + const desPath = $('#mixly-selector-type option:selected').val(); + if (type === 'burn') { + BU.copyFiles(type, startPath, desPath) + .catch((error) => { + BU.progressLayer.hide(); + BU.burning = false; + BU.uploading = false; + statusBarTerminal.setValue(error + '\n'); }); - const desPath = $('#mixly-selector-type option:selected').val(); - if (type === 'burn') { - BU.copyFiles(type, index, startPath, desPath); - } else { - const mainWorkspace = Workspace.getMain(); - const editor = mainWorkspace.getEditorsManager().getActive(); - const code = editor.getCode(); - fs_extra.outputFile(startPath, code) - .then(() => { - BU.copyFiles(type, index, startPath, desPath); - }) - .catch((error) => { - layer.close(index); - BU.burning = false; - BU.uploading = false; - statusBarTerminal.setValue(error + '\n'); - }); - } - }, - end: function () { - $('#mixly-loader-div').css('display', 'none'); - $(`#layui-layer-shade${layerNum}`).remove(); - } - }); + } else { + const mainWorkspace = Workspace.getMain(); + const editor = mainWorkspace.getEditorsManager().getActive(); + const code = editor.getCode(); + fs_extra.outputFile(startPath, code) + .then(() => { + return BU.copyFiles(type, startPath, desPath); + }) + .catch((error) => { + BU.progressLayer.hide(); + BU.burning = false; + BU.uploading = false; + statusBarTerminal.setValue(error + '\n'); + }); + } } /** @@ -506,26 +510,24 @@ BU.searchLibs = function (dirPath, code, libArr) { /** * @function 通过cmd烧录 - * @param layerNum {number} 烧录或上传加载弹窗的编号,用于关闭此弹窗 * @param port {string} 所选择的串口 * @param command {string} 需要执行的指令 * @return {void} */ -BU.burnByCmd = function (layerNum, port, command) { +BU.burnByCmd = function (port, command) { const { mainStatusBarTabs } = Mixly; const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); statusBarTerminal.setValue(Msg.Lang['shell.burning'] + '...\n'); - BU.runCmd(layerNum, 'burn', port, command); + BU.runCmd('burn', port, command); } /** * @function 通过cmd上传 -* @param layerNum {number} 烧录或上传加载弹窗的编号,用于关闭此弹窗 * @param port {string} 所选择的串口 * @param command {string} 需要执行的指令 * @return {void} */ -BU.uploadByCmd = async function (layerNum, port, command) { +BU.uploadByCmd = async function (port, command) { const { mainStatusBarTabs } = Mixly; const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); statusBarTerminal.setValue(Msg.Lang['shell.uploading'] + '...\n'); @@ -539,27 +541,26 @@ BU.uploadByCmd = async function (layerNum, port, command) { BU.copyLib(upload.filePath, ''); } fs_extra.outputFile(upload.filePath, code) - .then(() => { - BU.runCmd(layerNum, 'upload', port, command); - }) - .catch((error) => { - statusBarTerminal.setValue(error.toString() + '\n'); - console.log(error); - layer.close(layerNum); - BU.uploading = false; - }); + .then(() => { + BU.runCmd('upload', port, command); + }) + .catch((error) => { + BU.progressLayer.hide(); + statusBarTerminal.setValue(error.toString() + '\n'); + Debug.error(error); + BU.uploading = false; + }); } /** * @function 运行cmd -* @param layerNum {number} 烧录或上传加载弹窗的编号,用于关闭此弹窗 * @param type {string} 值为 'burn' | 'upload' * @param port {string} 所选择的串口 * @param command {string} 需要执行的指令 * @param sucFunc {function} 指令成功执行后所要执行的操作 * @return {void} */ -BU.runCmd = function (layerNum, type, port, command, sucFunc) { +BU.runCmd = function (type, port, command, sucFunc) { const { mainStatusBarTabs } = Mixly; const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); mainStatusBarTabs.changeTo('output'); @@ -567,7 +568,7 @@ BU.runCmd = function (layerNum, type, port, command, sucFunc) { let nowCommand = MString.tpl(command, { com: port }); BU.shell = child_process.exec(nowCommand, { encoding: 'binary' }, function (error, stdout, stderr) { - layer.close(layerNum); + BU.progressLayer.hide(); BU.burning = false; BU.uploading = false; BU.shell = null; @@ -605,7 +606,7 @@ BU.runCmd = function (layerNum, type, port, command, sucFunc) { statusBarSerial.open().catch(Debug.error); } } - }) + }); BU.shell.stdout.on('data', function (data) { if (BU.uploading || BU.burning) { @@ -656,48 +657,23 @@ BU.operateWithPort = (type, port, command) => { return; } const title = (type === 'burn' ? Msg.Lang['shell.burning'] : Msg.Lang['shell.uploading']) + '...'; - const operate = () => { - const layerNum = layer.open({ - type: 1, - title, - content: $('#mixly-loader-div'), - shade: LayerExt.SHADE_NAV, - resize: false, - closeBtn: 0, - success: function (layero, index) { - $(".layui-layer-page").css("z-index","198910151"); - switch (type) { - case 'burn': - BU.burnByCmd(index, port, command); - break; - case 'upload': - default: - BU.uploadByCmd(index, port, command); - } - $("#mixly-loader-btn").off("click").click(() => { - $("#mixly-loader-btn").css('display', 'none'); - layer.title(Msg.Lang['shell.aborting'] + '...', index); - BU.cancel(type); - }); - }, - end: function () { - $('#mixly-loader-div').css('display', 'none'); - $("layui-layer-shade" + layerNum).remove(); - $("#mixly-loader-btn").off("click"); - $("#mixly-loader-btn").css('display', 'inline-block'); - } - }); - } + BU.progressLayer.title(title); + BU.progressLayer.show(); const { mainStatusBarTabs } = Mixly; const statusBarSerial = mainStatusBarTabs.getStatusBarById(port); + let serialClosePromise = null; if (statusBarSerial) { - statusBarSerial.close() - .finally(() => { - operate(); - }); + serialClosePromise = statusBarSerial.close(); } else { - operate(); + serialClosePromise = Promise.resolve(); } + serialClosePromise.finally(() => { + if (type === 'burn') { + BU.burnByCmd(port, command); + } else { + BU.uploadByCmd(port, command); + } + }); } /** diff --git a/common/modules/mixly-modules/web/burn-upload.js b/common/modules/mixly-modules/web/burn-upload.js index 95d19873..656a8770 100644 --- a/common/modules/mixly-modules/web/burn-upload.js +++ b/common/modules/mixly-modules/web/burn-upload.js @@ -20,6 +20,7 @@ goog.require('Mixly.Debug'); goog.require('Mixly.HTMLTemplate'); goog.require('Mixly.MString'); goog.require('Mixly.LayerFirmware'); +goog.require('Mixly.LayerProgress'); goog.require('Mixly.Web.Serial'); goog.require('Mixly.Web.Ampy'); goog.provide('Mixly.Web.BU'); @@ -36,7 +37,8 @@ const { Debug, HTMLTemplate, MString, - LayerFirmware + LayerFirmware, + LayerProgress } = Mixly; const { @@ -71,6 +73,13 @@ BU.firmwareLayer.bind('burn', (info) => { BU.burnWithEsptool(info, web.burn.erase); } }); +BU.progressLayer = new LayerProgress({ + width: 200, + cancelValue: false, + skin: 'layui-anim layui-anim-scale', + cancel: false, + cancelDisplay: false +}); const BAUD = goog.platform() === 'darwin' ? 460800 : 921600; @@ -132,9 +141,9 @@ const readBinFileAsArrayBuffer = (path, offset) => { }); } -BU.initBurn = () => { +BU.initBurn = async () => { if (['BBC micro:bit', 'Mithon CC'].includes(BOARD.boardType)) { - BU.burnByUSB(); + await BU.burnByUSB(); } else { const { web } = SELECTED_BOARD; const boardKey = Boards.getSelectedBoardKey(); @@ -148,9 +157,9 @@ BU.initBurn = () => { BU.burnWithSpecialBin(); } else { if (boardKey.indexOf('micropython:esp32s2') !== -1) { - BU.burnWithAdafruitEsptool(web.burn.binFile, web.burn.erase); + await BU.burnWithAdafruitEsptool(web.burn.binFile, web.burn.erase); } else { - BU.burnWithEsptool(web.burn.binFile, web.burn.erase); + await BU.burnWithEsptool(web.burn.binFile, web.burn.erase); } } } @@ -214,36 +223,23 @@ BU.burnByUSB = async () => { const rightStr = (new Array(50 - nowProgressLen).fill('-')).join(''); statusBarTerminal.addValue(`[${leftStr}${rightStr}] ${nowPercent}%\n`); }); - layer.open({ - type: 1, - title: `${Msg.Lang['shell.burning']}...`, - content: $('#mixly-loader-div'), - shade: LayerExt.SHADE_NAV, - resize: false, - closeBtn: 0, - success: async (layero, index) => { - $('#mixly-loader-btn').hide(); - try { - await dapLink.flash(buffer); - layer.close(index); - layer.msg(Msg.Lang['shell.burnSucc'], { time: 1000 }); - statusBarTerminal.addValue(`==${Msg.Lang['shell.burnSucc']}==\n`); - } catch (error) { - Debug.error(error); - layer.close(index); - statusBarTerminal.addValue(`==${Msg.Lang['shell.burnFailed']}==\n`); - } finally { - dapLink.removeAllListeners(DAPjs.DAPLink.EVENT_PROGRESS); - await dapLink.disconnect(); - await webUSB.close(); - await port.close(); - } - }, - end: function () { - $('#mixly-loader-btn').css('display', 'inline-block'); - $('#mixly-loader-div').css('display', 'none'); - } - }); + BU.progressLayer.title(`${Msg.Lang['shell.burning']}...`); + BU.progressLayer.show(); + try { + await dapLink.flash(buffer); + BU.progressLayer.hide(); + layer.msg(Msg.Lang['shell.burnSucc'], { time: 1000 }); + statusBarTerminal.addValue(`==${Msg.Lang['shell.burnSucc']}==\n`); + } catch (error) { + Debug.error(error); + BU.progressLayer.hide(); + statusBarTerminal.addValue(`==${Msg.Lang['shell.burnFailed']}==\n`); + } finally { + dapLink.removeAllListeners(DAPjs.DAPLink.EVENT_PROGRESS); + await dapLink.disconnect(); + await webUSB.close(); + await port.close(); + } } BU.burnWithEsptool = async (binFile, erase) => { @@ -274,6 +270,8 @@ BU.burnWithEsptool = async (binFile, erase) => { statusBarTerminal.setValue(Msg.Lang['shell.burning'] + '...\n'); mainStatusBarTabs.show(); mainStatusBarTabs.changeTo('output'); + BU.progressLayer.title(`${Msg.Lang['shell.burning']}...`); + BU.progressLayer.show(); let esploader = null; let transport = null; try { @@ -298,6 +296,7 @@ BU.burnWithEsptool = async (binFile, erase) => { Debug.error(error); statusBarTerminal.addValue(`\n${error.toString()}\n`); await transport.disconnect(); + BU.progressLayer.hide(); return; } @@ -319,6 +318,7 @@ BU.burnWithEsptool = async (binFile, erase) => { statusBarTerminal.addValue("Failed!\n" + Msg.Lang['shell.bin.readFailed'] + "!\n"); statusBarTerminal.addValue("\n" + e + "\n", true); await transport.disconnect(); + BU.progressLayer.hide(); return; } statusBarTerminal.addValue("Done!\n"); @@ -331,39 +331,18 @@ BU.burnWithEsptool = async (binFile, erase) => { compress: true, calculateMD5Hash: (image) => CryptoJS.MD5(CryptoJS.enc.Latin1.parse(image)) }; - layer.open({ - type: 1, - title: Msg.Lang['shell.burning'] + '...', - content: $('#mixly-loader-div'), - shade: LayerExt.SHADE_NAV, - resize: false, - closeBtn: 0, - success: async function (layero, index) { - let cancel = false; - $("#mixly-loader-btn").off().click(async () => { - cancel = true; - try { - await transport.disconnect(); - } catch (error) { - layer.close(index); - Debug.error(error); - } - }); - try { - await esploader.writeFlash(flashOptions); - layer.msg(Msg.Lang['shell.burnSucc'], { time: 1000 }); - statusBarTerminal.addValue(`==${Msg.Lang['shell.burnSucc']}==\n`); - } catch (error) { - Debug.error(error); - statusBarTerminal.addValue(`==${Msg.Lang['shell.burnFailed']}==\n`); - } finally { - layer.close(index); - if (!cancel) { - await transport.disconnect(); - } - } - } - }); + try { + await esploader.writeFlash(flashOptions); + BU.progressLayer.hide(); + layer.msg(Msg.Lang['shell.burnSucc'], { time: 1000 }); + statusBarTerminal.addValue(`==${Msg.Lang['shell.burnSucc']}==\n`); + } catch (error) { + Debug.error(error); + BU.progressLayer.hide(); + statusBarTerminal.addValue(`==${Msg.Lang['shell.burnFailed']}==\n`); + } finally { + await transport.disconnect(); + } } BU.burnWithAdafruitEsptool = async (binFile, erase) => { @@ -394,6 +373,8 @@ BU.burnWithAdafruitEsptool = async (binFile, erase) => { statusBarTerminal.setValue(Msg.Lang['shell.burning'] + '...\n'); mainStatusBarTabs.show(); mainStatusBarTabs.changeTo('output'); + BU.progressLayer.title(`${Msg.Lang['shell.burning']}...`); + BU.progressLayer.show(); let esploader = null; let transport = null; let espStub = null; @@ -416,6 +397,7 @@ BU.burnWithAdafruitEsptool = async (binFile, erase) => { Debug.error(error); statusBarTerminal.addValue(`\n${error.toString()}\n`); await port.close(); + BU.progressLayer.hide(); return; } @@ -438,55 +420,37 @@ BU.burnWithAdafruitEsptool = async (binFile, erase) => { statusBarTerminal.addValue("\n" + e + "\n", true); await espStub.disconnect(); await espStub.port.close(); + BU.progressLayer.hide(); return; } statusBarTerminal.addValue("Done!\n"); BU.burning = true; BU.uploading = false; - const layerNum = layer.open({ - type: 1, - title: Msg.Lang['shell.burning'] + '...', - content: $('#mixly-loader-div'), - shade: LayerExt.SHADE_NAV, - resize: false, - closeBtn: 0, - success: async function (layero, index) { - let cancel = false; - $("#mixly-loader-btn").hide(); - try { - if (erase) { - await espStub.eraseFlash(); - } - for (let file of data) { - await espStub.flashData( - file.data, - (bytesWritten, totalBytes) => { - const percent = Math.floor((bytesWritten / totalBytes) * 100) + '%'; - statusBarTerminal.addValue(`Writing at 0x${(file.address + bytesWritten).toString(16)}... (${percent})\n`); - }, - file.address, true - ); - } - await espStub.disconnect(); - await espStub.port.close(); - cancel = true; - layer.msg(Msg.Lang['shell.burnSucc'], { time: 1000 }); - statusBarTerminal.addValue(`==${Msg.Lang['shell.burnSucc']}==\n`); - } catch (error) { - Debug.error(error); - statusBarTerminal.addValue(`==${Msg.Lang['shell.burnFailed']}==\n`); - } finally { - layer.close(index); - if (!cancel) { - await espStub.disconnect(); - await espStub.port.close(); - } - } - }, - end: function () { - $(`#layui-layer-shade${layerNum}`).remove(); + try { + if (erase) { + await espStub.eraseFlash(); } - }); + for (let file of data) { + await espStub.flashData( + file.data, + (bytesWritten, totalBytes) => { + const percent = Math.floor((bytesWritten / totalBytes) * 100) + '%'; + statusBarTerminal.addValue(`Writing at 0x${(file.address + bytesWritten).toString(16)}... (${percent})\n`); + }, + file.address, true + ); + } + BU.progressLayer.hide(); + layer.msg(Msg.Lang['shell.burnSucc'], { time: 1000 }); + statusBarTerminal.addValue(`==${Msg.Lang['shell.burnSucc']}==\n`); + } catch (error) { + Debug.error(error); + BU.progressLayer.hide(); + statusBarTerminal.addValue(`==${Msg.Lang['shell.burnFailed']}==\n`); + } finally { + await espStub.disconnect(); + await espStub.port.close(); + } } BU.getImportModulesName = (code) => { @@ -562,9 +526,9 @@ BU.initUpload = async () => { } } if (['BBC micro:bit', 'Mithon CC'].includes(BOARD.boardType)) { - BU.uploadByUSB(portName); + await BU.uploadByUSB(portName); } else { - BU.uploadWithAmpy(portName); + await BU.uploadWithAmpy(portName); } } @@ -618,58 +582,42 @@ BU.uploadByUSB = async (portName) => { const data = goog.readFileSync(importsMap[key]['__path__']); FSWrapper.writeFile(filename, data); } - const layerNum = layer.open({ - type: 1, - title: Msg.Lang['shell.uploading'] + '...', - content: $('#mixly-loader-div'), - shade: LayerExt.SHADE_NAV, - resize: false, - closeBtn: 0, - success: async function (layero, index) { - $('#mixly-loader-btn').hide(); - try { - let prevPercent = 0; - await partialFlashing.flashAsync(new BoardId(0x9900), FSWrapper, progress => { - const nowPercent = Math.floor(progress * 100); - if (nowPercent > prevPercent) { - prevPercent = nowPercent; - } else { - return; - } - const nowProgressLen = Math.floor(nowPercent / 2); - const leftStr = new Array(nowProgressLen).fill('=').join(''); - const rightStr = (new Array(50 - nowProgressLen).fill('-')).join(''); - statusBarTerminal.addValue(`[${leftStr}${rightStr}] ${nowPercent}%\n`); - }); - layer.close(index); - layer.msg(Msg.Lang['shell.uploadSucc'], { time: 1000 }); - statusBarTerminal.addValue(`==${Msg.Lang['shell.uploadSucc']}==\n`); - if (!statusBarSerial) { - mainStatusBarTabs.add('serial', portName); - statusBarSerial = mainStatusBarTabs.getStatusBarById(portName); - } - statusBarSerial.setValue(''); - mainStatusBarTabs.changeTo(portName); - await statusBarSerial.open(); - } catch (error) { - await dapWrapper.disconnectAsync(); - layer.close(index); - console.error(error); - statusBarTerminal.addValue(`${error}\n`); - statusBarTerminal.addValue(`==${Msg.Lang['shell.uploadFailed']}==\n`); + BU.progressLayer.title(`${Msg.Lang['shell.uploading']}...`); + BU.progressLayer.show(); + try { + let prevPercent = 0; + await partialFlashing.flashAsync(new BoardId(0x9900), FSWrapper, progress => { + const nowPercent = Math.floor(progress * 100); + if (nowPercent > prevPercent) { + prevPercent = nowPercent; + } else { + return; } - BU.burning = false; - BU.uploading = false; - }, - end: function () { - $('#mixly-loader-btn').css('display', 'inline-block'); - $('#mixly-loader-div').css('display', 'none'); - $(`#layui-layer-shade${layerNum}`).remove(); + const nowProgressLen = Math.floor(nowPercent / 2); + const leftStr = new Array(nowProgressLen).fill('=').join(''); + const rightStr = (new Array(50 - nowProgressLen).fill('-')).join(''); + statusBarTerminal.addValue(`[${leftStr}${rightStr}] ${nowPercent}%\n`); + }); + BU.progressLayer.hide(); + layer.msg(Msg.Lang['shell.uploadSucc'], { time: 1000 }); + statusBarTerminal.addValue(`==${Msg.Lang['shell.uploadSucc']}==\n`); + if (!statusBarSerial) { + mainStatusBarTabs.add('serial', portName); + statusBarSerial = mainStatusBarTabs.getStatusBarById(portName); } - }); + statusBarSerial.setValue(''); + mainStatusBarTabs.changeTo(portName); + await statusBarSerial.open(); + } catch (error) { + await dapWrapper.disconnectAsync(); + Debug.error(error); + BU.progressLayer.hide(); + statusBarTerminal.addValue(`${error}\n`); + statusBarTerminal.addValue(`==${Msg.Lang['shell.uploadFailed']}==\n`); + } } -BU.uploadWithAmpy = (portName) => { +BU.uploadWithAmpy = async (portName) => { const { mainStatusBarTabs } = Mixly; const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); let statusBarSerial = mainStatusBarTabs.getStatusBarById(portName); @@ -681,83 +629,67 @@ BU.uploadWithAmpy = (portName) => { const mainWorkspace = Workspace.getMain(); const editor = mainWorkspace.getEditorsManager().getActive(); const port = Serial.getPort(portName); - const layerNum = layer.open({ - type: 1, - title: Msg.Lang['shell.uploading'] + '...', - content: $('#mixly-loader-div'), - shade: LayerExt.SHADE_NAV, - resize: false, - closeBtn: 0, - success: async function (layero, index) { - $('#mixly-loader-btn').hide(); - const serial = new Serial(portName); - const ampy = new Ampy(serial); - const code = editor.getCode(); - let closePromise = Promise.resolve(); - if (statusBarSerial) { - closePromise = statusBarSerial.close(); - } - try { - /*const importsMap = BU.getImportModules(code); - let libraries = {}; - for (let key in importsMap) { - const filename = importsMap[key]['__name__']; - const data = goog.readFileSync(importsMap[key]['__path__']); - libraries[filename] = { - data, - size: importsMap[key]['__size__'] - }; - }*/ - await closePromise; - await ampy.enter(); - statusBarTerminal.addValue('Writing main.py '); - await ampy.put('main.py', code); - statusBarTerminal.addValue('Done!\n'); - /*const cwd = await ampy.cwd(); - const rootInfo = await ampy.ls(cwd); - let rootMap = {}; - for (let item of rootInfo) { - rootMap[item[0]] = item[1]; - } - if (libraries && libraries instanceof Object) { - for (let key in libraries) { - if (rootMap[`${cwd}/${key}`] !== undefined && rootMap[`${cwd}/${key}`] === libraries[key].size) { - statusBarTerminal.addValue(`Skip ${key}\n`); - continue; - } - statusBarTerminal.addValue(`Writing ${key} `); - await ampy.put(key, libraries[key].data); - statusBarTerminal.addValue('Done!\n'); - } - }*/ - await ampy.exit(); - await ampy.dispose(); - layer.close(index); - layer.msg(Msg.Lang['shell.uploadSucc'], { time: 1000 }); - statusBarTerminal.addValue(`==${Msg.Lang['shell.uploadSucc']}==\n`); - if (!statusBarSerial) { - mainStatusBarTabs.add('serial', portName); - statusBarSerial = mainStatusBarTabs.getStatusBarById(portName); - } - statusBarSerial.setValue(''); - mainStatusBarTabs.changeTo(portName); - await statusBarSerial.open(); - } catch (error) { - ampy.dispose(); - layer.close(index); - Debug.error(error); - statusBarTerminal.addValue(`${error}\n`); - statusBarTerminal.addValue(`==${Msg.Lang['shell.uploadFailed']}==\n`); - } - BU.burning = false; - BU.uploading = false; - }, - end: function () { - $('#mixly-loader-btn').css('display', 'inline-block'); - $('#mixly-loader-div').css('display', 'none'); - $(`#layui-layer-shade${layerNum}`).remove(); + BU.progressLayer.title(`${Msg.Lang['shell.uploading']}...`); + BU.progressLayer.show(); + const serial = new Serial(portName); + const ampy = new Ampy(serial); + const code = editor.getCode(); + let closePromise = Promise.resolve(); + if (statusBarSerial) { + closePromise = statusBarSerial.close(); + } + try { + /*const importsMap = BU.getImportModules(code); + let libraries = {}; + for (let key in importsMap) { + const filename = importsMap[key]['__name__']; + const data = goog.readFileSync(importsMap[key]['__path__']); + libraries[filename] = { + data, + size: importsMap[key]['__size__'] + }; + }*/ + await closePromise; + await ampy.enter(); + statusBarTerminal.addValue('Writing main.py '); + await ampy.put('main.py', code); + statusBarTerminal.addValue('Done!\n'); + /*const cwd = await ampy.cwd(); + const rootInfo = await ampy.ls(cwd); + let rootMap = {}; + for (let item of rootInfo) { + rootMap[item[0]] = item[1]; } - }); + if (libraries && libraries instanceof Object) { + for (let key in libraries) { + if (rootMap[`${cwd}/${key}`] !== undefined && rootMap[`${cwd}/${key}`] === libraries[key].size) { + statusBarTerminal.addValue(`Skip ${key}\n`); + continue; + } + statusBarTerminal.addValue(`Writing ${key} `); + await ampy.put(key, libraries[key].data); + statusBarTerminal.addValue('Done!\n'); + } + }*/ + await ampy.exit(); + await ampy.dispose(); + BU.progressLayer.hide(); + layer.msg(Msg.Lang['shell.uploadSucc'], { time: 1000 }); + statusBarTerminal.addValue(`==${Msg.Lang['shell.uploadSucc']}==\n`); + if (!statusBarSerial) { + mainStatusBarTabs.add('serial', portName); + statusBarSerial = mainStatusBarTabs.getStatusBarById(portName); + } + statusBarSerial.setValue(''); + mainStatusBarTabs.changeTo(portName); + await statusBarSerial.open(); + } catch (error) { + ampy.dispose(); + BU.progressLayer.hide(); + Debug.error(error); + statusBarTerminal.addValue(`${error}\n`); + statusBarTerminal.addValue(`==${Msg.Lang['shell.uploadFailed']}==\n`); + } } function hexToBuf (hex) { diff --git a/common/modules/web-modules/dialog-plus.min.js b/common/modules/web-modules/dialog-plus.min.js index 97e15c0a..dbd7ac99 100644 --- a/common/modules/web-modules/dialog-plus.min.js +++ b/common/modules/web-modules/dialog-plus.min.js @@ -1,5 +1,5 @@ /*! art.dialog@7.0.0 | https://github.com/aui/artDialog */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("jQuery")):"function"==typeof define&&define.amd?define(["jQuery"],e):"object"==typeof exports?exports.dialog=e(require("jQuery")):t.dialog=e(t.jQuery)}(this,function(t){return function(t){function e(r){if(o[r])return o[r].exports;var i=o[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var o={};return e.m=t,e.c=o,e.i=function(t){return t},e.d=function(t,o,r){e.o(t,o)||Object.defineProperty(t,o,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var o=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(o,"a",o),o},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=15)}([function(e,o){e.exports=t},function(t,e,o){var r=o(7);"string"==typeof r&&(r=[[t.i,r,""]]);o(5)(r,{});r.locals&&(t.exports=r.locals)},function(t,e){t.exports={backdropBackground:"#000",backdropOpacity:.7,content:'Loading..',title:"",statusbar:"",button:null,ok:null,cancel:null,okValue:"ok",cancelValue:"cancel",cancelDisplay:!0,width:"",height:"",padding:"",skin:"",quickClose:!1,innerHTML:'