From 56204fe16026888aba4bac49767544e68c9efeeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E7=AB=8B=E5=B8=AE?= <3294713004@qq.com> Date: Sun, 6 Oct 2024 23:27:42 +0800 Subject: [PATCH] =?UTF-8?q?Update:=20xpython=E6=9D=BF=E5=8D=A1=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=A0=8F=E6=B7=BB=E5=8A=A0=E7=83=A7=E5=BD=95=E9=A2=9D?= =?UTF-8?q?=E5=A4=96=E5=9B=BA=E4=BB=B6=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/modules/mixly-modules/common/app.js | 18 ++- .../modules/mixly-modules/common/layer-ext.js | 7 ++ common/modules/mixly-modules/deps.json | 3 + .../mixly-modules/electron/burn-upload.js | 99 +++++++++-------- .../modules/mixly-modules/web/burn-upload.js | 103 ++++++++++++++---- common/msg/mixly/en.json | 1 + common/msg/mixly/zh-hans.json | 1 + common/msg/mixly/zh-hant.json | 1 + common/templates/html/filmware-layer.html | 19 ++++ 9 files changed, 179 insertions(+), 73 deletions(-) create mode 100644 common/templates/html/filmware-layer.html diff --git a/common/modules/mixly-modules/common/app.js b/common/modules/mixly-modules/common/app.js index b8fa7927..0922d0b1 100644 --- a/common/modules/mixly-modules/common/app.js +++ b/common/modules/mixly-modules/common/app.js @@ -507,6 +507,22 @@ class App extends Component { weight: 1 }); + this.#nav_.register({ + icon: 'icon-upload-1', + id: ['setting', 'firmware'], + displayText: Msg.Lang['nav.btn.setting.firmware'], + preconditionFn: () => { + if (goog.isElectron) { + return !!BOARD?.burn?.special; + } else { + return !!BOARD?.web?.burn?.special; + } + }, + callback: () => BU.burnWithSpecialBin(), + scopeType: Nav.Scope.RIGHT, + weight: 2 + }); + this.#nav_.register({ icon: 'icon-comment-1', id: ['setting', 'feedback'], @@ -519,7 +535,7 @@ class App extends Component { Url.open(href); }, scopeType: Nav.Scope.RIGHT, - weight: 2 + weight: 3 }); } diff --git a/common/modules/mixly-modules/common/layer-ext.js b/common/modules/mixly-modules/common/layer-ext.js index d2d75e20..241ead08 100644 --- a/common/modules/mixly-modules/common/layer-ext.js +++ b/common/modules/mixly-modules/common/layer-ext.js @@ -31,6 +31,7 @@ LayerExt.DEFAULT_CONFIG = { resize: true, shade: LayerExt.SHADE_ALL, success: null, + beforeEnd: null, end: null, cancel: null, resizing: null, @@ -122,6 +123,12 @@ LayerExt.open = (toolConfig) => { if (typeof success === 'function') success(layero, index); }, + beforeEnd: function (layero, index, that) { + const { beforeEnd } = toolConfig; + if (typeof beforeEnd === 'function') { + beforeEnd(layero, index, that); + } + }, end: function () { const { end } = toolConfig; if (typeof end === 'function') { diff --git a/common/modules/mixly-modules/deps.json b/common/modules/mixly-modules/deps.json index 4bbd0646..75cd666d 100644 --- a/common/modules/mixly-modules/deps.json +++ b/common/modules/mixly-modules/deps.json @@ -1291,6 +1291,7 @@ "Mixly.Msg", "Mixly.Workspace", "Mixly.Debug", + "Mixly.HTMLTemplate", "Mixly.Electron.Serial" ], "provide": [ @@ -1550,6 +1551,7 @@ { "path": "/web/burn-upload.js", "require": [ + "path", "ESPTool", "AdafruitESPTool", "CryptoJS", @@ -1562,6 +1564,7 @@ "Mixly.Msg", "Mixly.Workspace", "Mixly.Debug", + "Mixly.HTMLTemplate", "Mixly.Web.Serial", "Mixly.Web.USB", "Mixly.Web.Ampy" diff --git a/common/modules/mixly-modules/electron/burn-upload.js b/common/modules/mixly-modules/electron/burn-upload.js index 781f8eb6..3a6bd439 100644 --- a/common/modules/mixly-modules/electron/burn-upload.js +++ b/common/modules/mixly-modules/electron/burn-upload.js @@ -9,6 +9,7 @@ goog.require('Mixly.MString'); goog.require('Mixly.Msg'); goog.require('Mixly.Workspace'); goog.require('Mixly.Debug'); +goog.require('Mixly.HTMLTemplate'); goog.require('Mixly.Electron.Serial'); goog.provide('Mixly.Electron.BU'); @@ -22,7 +23,8 @@ const { Msg, Workspace, Serial, - Debug + Debug, + HTMLTemplate } = Mixly; const { BU } = Electron; @@ -46,6 +48,13 @@ BU.burning = false; BU.shell = null; +BU.FILMWARE_LAYER = new HTMLTemplate( + goog.get(path.join(Env.templatePath, 'html/filmware-layer.html')) +).render({ + cancel: Msg.Lang['nav.btn.cancel'], + burn: Msg.Lang['nav.btn.burn'] +}); + /** * @function 根据传入的stdout判断磁盘数量并选择对应操作 * @param type {string} 值为'burn' | 'upload' @@ -595,62 +604,52 @@ BU.runCmd = function (layerNum, type, port, command, sucFunc) { BU.burnWithSpecialBin = () => { const { mainStatusBarTabs } = Mixly; const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); - const $selector = $('#mixly-selector-type'); - let oldOption = $('#mixly-selector-type option:selected').val(); - $selector.empty(); - const firmwareList = SELECTED_BOARD.burn.special; - let firmwareObj = {}; - for (let firmware of firmwareList) { + const firmwares = SELECTED_BOARD.burn.special; + let menu = []; + for (let firmware of firmwares) { if (!firmware?.name && !firmware?.command) return; - firmwareObj[firmware.name] = firmware.command; - if (`${firmware.name}` == oldOption) { - $selector.append($(``)); - } else { - $selector.append($(``)); - } + menu.push({ + id: firmware.command, + text: firmware.name + }); } - form.render(); - - let initBtnClicked = false; - - const layerNum = layer.open({ - type: 1, - id: "serial-select", - title: "请选择固件:", - area: ['350px', '150px'], - content: $('#mixly-selector-div'), + LayerExt.open({ + title: [Msg.Lang['nav.btn.burn'], '36px'], + area: ['400px', '160px'], + max: false, + min: false, + content: BU.FILMWARE_LAYER, shade: Mixly.LayerExt.SHADE_ALL, resize: false, - closeBtn: 0, - success: function (layero) { - $('#serial-select').css('height', '180px'); - $('#serial-select').css('overflow', 'inherit'); - $(".layui-layer-page").css("z-index", "198910151"); - $("#mixly-selector-btn1").off("click").click(() => { - layer.close(layerNum); + success: function (layero, index) { + const $select = layero.find('select'); + $select.select2({ + data: menu, + minimumResultsForSearch: 50, + width: '360px', + dropdownCssClass: 'mixly-scrollbar' }); - $("#mixly-selector-btn2").click(() => { - layer.close(layerNum); - initBtnClicked = true; + layero.find('button').click((event) => { + const $target = $(event.currentTarget); + const type = $target.attr('data-id'); + const command = $select.val(); + layer.close(index, () => { + if (type !== 'burn') { + return; + } + statusBarTerminal.setValue(''); + mainStatusBarTabs.changeTo('output'); + mainStatusBarTabs.show(); + BU.burning = true; + BU.uploading = false; + const port = Serial.getSelectedPortName(); + BU.burnWithPort(port, command); + }); }); }, - end: function () { - $("#mixly-selector-btn1").off("click"); - $("#mixly-selector-btn2").off("click"); - $('#mixly-selector-div').css('display', 'none'); - $(".layui-layer-shade").remove(); - if (initBtnClicked) { - let selectedFirmwareName = $('#mixly-selector-type option:selected').val(); - statusBarTerminal.setValue(''); - mainStatusBarTabs.changeTo('output'); - mainStatusBarTabs.show(); - BU.burning = true; - BU.uploading = false; - const port = Serial.getSelectedPortName(); - BU.burnWithPort(port, firmwareObj[selectedFirmwareName]); - } else { - layer.msg(Msg.Lang['shell.burnCanceled'], { time: 1000 }); - } + beforeEnd: function (layero) { + layero.find('select').select2('destroy'); + layero.find('button').off(); } }); } diff --git a/common/modules/mixly-modules/web/burn-upload.js b/common/modules/mixly-modules/web/burn-upload.js index 570a2c60..d2c5a330 100644 --- a/common/modules/mixly-modules/web/burn-upload.js +++ b/common/modules/mixly-modules/web/burn-upload.js @@ -1,5 +1,6 @@ goog.loadJs('web', () => { +goog.require('path'); goog.require('ESPTool'); goog.require('AdafruitESPTool'); goog.require('CryptoJS'); @@ -12,6 +13,7 @@ goog.require('Mixly.Boards'); goog.require('Mixly.Msg'); goog.require('Mixly.Workspace'); goog.require('Mixly.Debug'); +goog.require('Mixly.HTMLTemplate'); goog.require('Mixly.Web.Serial'); goog.require('Mixly.Web.USB'); goog.require('Mixly.Web.Ampy'); @@ -26,7 +28,8 @@ const { Boards, Msg, Workspace, - Debug + Debug, + HTMLTemplate } = Mixly; const { @@ -47,6 +50,13 @@ const { BU.uploading = false; BU.burning = false; +BU.FILMWARE_LAYER = new HTMLTemplate( + goog.get(path.join(Env.templatePath, 'html/filmware-layer.html')) +).render({ + cancel: Msg.Lang['nav.btn.cancel'], + burn: Msg.Lang['nav.btn.burn'] +}); + const BAUD = goog.platform() === 'darwin' ? 460800 : 921600; BU.requestPort = () => { @@ -112,10 +122,17 @@ BU.initBurn = () => { BU.burnByUSB(); } else { const boardKey = Boards.getSelectedBoardKey(); + const { web } = SELECTED_BOARD; + if (!web?.burn?.binFile) { + return; + } + if (typeof web.burn.binFile !== 'object') { + return; + } if (boardKey.indexOf('micropython:esp32s2') !== -1) { - BU.burnWithAdafruitEsptool(); + BU.burnWithAdafruitEsptool(web.burn.binFile); } else { - BU.burnWithEsptool(); + BU.burnWithEsptool(web.burn.binFile); } } } @@ -202,9 +219,7 @@ BU.burnByUSB = () => { }); } -BU.burnWithEsptool = async () => { - const { web } = SELECTED_BOARD; - const { burn } = web; +BU.burnWithEsptool = async (binFile) => { const { mainStatusBarTabs } = Mixly; const portName = Serial.getSelectedPortName(); if (!portName) { @@ -251,12 +266,6 @@ BU.burnWithEsptool = async () => { } statusBarTerminal.addValue(Msg.Lang['shell.bin.reading'] + "..."); - if (typeof burn.binFile !== 'object') { - statusBarTerminal.addValue(" Failed!\n" + Msg.Lang['shell.bin.readFailed'] + "!\n"); - await transport.disconnect(); - return; - } - const { binFile } = burn; let firmwarePromise = []; statusBarTerminal.addValue("\n"); for (let i of binFile) { @@ -322,9 +331,7 @@ BU.burnWithEsptool = async () => { }); } -BU.burnWithAdafruitEsptool = async () => { - const { web } = SELECTED_BOARD; - const { burn } = web; +BU.burnWithAdafruitEsptool = async (binFile) => { const { mainStatusBarTabs } = Mixly; const portName = Serial.getSelectedPortName(); if (!portName) { @@ -369,13 +376,6 @@ BU.burnWithAdafruitEsptool = async () => { } statusBarTerminal.addValue(Msg.Lang['shell.bin.reading'] + "..."); - if (typeof burn.binFile !== 'object') { - statusBarTerminal.addValue(" Failed!\n" + Msg.Lang['shell.bin.readFailed'] + "!\n"); - await espStub.disconnect(); - await espStub.port.close(); - return; - } - const { binFile } = burn; let firmwarePromise = []; statusBarTerminal.addValue("\n"); for (let i of binFile) { @@ -686,4 +686,63 @@ BU.uploadWithAvrUploader = async (endType, obj, layerType) => { }); } +/** + * @function 特殊固件的烧录 + * @return {void} + **/ +BU.burnWithSpecialBin = () => { + const { mainStatusBarTabs } = Mixly; + const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); + const firmwares = SELECTED_BOARD.web.burn.special; + let menu = []; + let firmwareMap = {}; + for (let firmware of firmwares) { + if (!firmware?.name && !firmware?.binFile) return; + menu.push({ + id: firmware.name, + text: firmware.name + }); + firmwareMap[firmware.name] = firmware.binFile; + } + LayerExt.open({ + title: [Msg.Lang['nav.btn.burn'], '36px'], + area: ['400px', '160px'], + max: false, + min: false, + content: BU.FILMWARE_LAYER, + shade: Mixly.LayerExt.SHADE_ALL, + resize: false, + success: function (layero, index) { + const $select = layero.find('select'); + $select.select2({ + data: menu, + minimumResultsForSearch: 50, + width: '360px', + dropdownCssClass: 'mixly-scrollbar' + }); + layero.find('button').click((event) => { + const $target = $(event.currentTarget); + const type = $target.attr('data-id'); + const binFile = firmwareMap[$select.val()]; + layer.close(index, () => { + if (type !== 'burn') { + return; + } + const boardKey = Boards.getSelectedBoardKey(); + const { web } = SELECTED_BOARD; + if (boardKey.indexOf('micropython:esp32s2') !== -1) { + BU.burnWithAdafruitEsptool(binFile); + } else { + BU.burnWithEsptool(binFile); + } + }); + }); + }, + beforeEnd: function (layero) { + layero.find('select').select2('destroy'); + layero.find('button').off(); + } + }); +} + }); \ No newline at end of file diff --git a/common/msg/mixly/en.json b/common/msg/mixly/en.json index 2a0f351b..6be33e33 100644 --- a/common/msg/mixly/en.json +++ b/common/msg/mixly/en.json @@ -284,6 +284,7 @@ "nav.btn.file.exportAs": "Export lib", "nav.btn.setting": "Settings", "nav.btn.setting.manageLibs": "Manage libs", + "nav.btn.setting.firmware": "Firmware", "nav.btn.setting.feedback": "Feedback", "shell.compiling": "Compiling", "shell.compileFailed": "Compile failed", diff --git a/common/msg/mixly/zh-hans.json b/common/msg/mixly/zh-hans.json index fff89912..95eab850 100644 --- a/common/msg/mixly/zh-hans.json +++ b/common/msg/mixly/zh-hans.json @@ -284,6 +284,7 @@ "nav.btn.file.exportAs": "导出库", "nav.btn.setting": "设置", "nav.btn.setting.manageLibs": "管理库", + "nav.btn.setting.firmware": "固件", "nav.btn.setting.feedback": "反馈", "shell.compiling": "编译中", "shell.compileFailed": "编译失败", diff --git a/common/msg/mixly/zh-hant.json b/common/msg/mixly/zh-hant.json index f24334cb..4402bc94 100644 --- a/common/msg/mixly/zh-hant.json +++ b/common/msg/mixly/zh-hant.json @@ -284,6 +284,7 @@ "nav.btn.file.exportAs": "匯出函式庫", "nav.btn.setting": "設定", "nav.btn.setting.manageLibs": "管理函式庫", + "nav.btn.setting.firmware": "韌體", "nav.btn.setting.feedback": "回饋", "shell.compiling": "編譯中", "shell.compileFailed": "編譯失敗", diff --git a/common/templates/html/filmware-layer.html b/common/templates/html/filmware-layer.html new file mode 100644 index 00000000..bc8fccf7 --- /dev/null +++ b/common/templates/html/filmware-layer.html @@ -0,0 +1,19 @@ + +
+ +
+ + +
+
\ No newline at end of file