Update: xpython板卡工具栏添加烧录额外固件选项

This commit is contained in:
王立帮
2024-10-06 23:27:42 +08:00
parent 9fe0abb852
commit 56204fe160
9 changed files with 179 additions and 73 deletions

View File

@@ -507,6 +507,22 @@ class App extends Component {
weight: 1 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({ this.#nav_.register({
icon: 'icon-comment-1', icon: 'icon-comment-1',
id: ['setting', 'feedback'], id: ['setting', 'feedback'],
@@ -519,7 +535,7 @@ class App extends Component {
Url.open(href); Url.open(href);
}, },
scopeType: Nav.Scope.RIGHT, scopeType: Nav.Scope.RIGHT,
weight: 2 weight: 3
}); });
} }

View File

@@ -31,6 +31,7 @@ LayerExt.DEFAULT_CONFIG = {
resize: true, resize: true,
shade: LayerExt.SHADE_ALL, shade: LayerExt.SHADE_ALL,
success: null, success: null,
beforeEnd: null,
end: null, end: null,
cancel: null, cancel: null,
resizing: null, resizing: null,
@@ -122,6 +123,12 @@ LayerExt.open = (toolConfig) => {
if (typeof success === 'function') if (typeof success === 'function')
success(layero, index); success(layero, index);
}, },
beforeEnd: function (layero, index, that) {
const { beforeEnd } = toolConfig;
if (typeof beforeEnd === 'function') {
beforeEnd(layero, index, that);
}
},
end: function () { end: function () {
const { end } = toolConfig; const { end } = toolConfig;
if (typeof end === 'function') { if (typeof end === 'function') {

View File

@@ -1291,6 +1291,7 @@
"Mixly.Msg", "Mixly.Msg",
"Mixly.Workspace", "Mixly.Workspace",
"Mixly.Debug", "Mixly.Debug",
"Mixly.HTMLTemplate",
"Mixly.Electron.Serial" "Mixly.Electron.Serial"
], ],
"provide": [ "provide": [
@@ -1550,6 +1551,7 @@
{ {
"path": "/web/burn-upload.js", "path": "/web/burn-upload.js",
"require": [ "require": [
"path",
"ESPTool", "ESPTool",
"AdafruitESPTool", "AdafruitESPTool",
"CryptoJS", "CryptoJS",
@@ -1562,6 +1564,7 @@
"Mixly.Msg", "Mixly.Msg",
"Mixly.Workspace", "Mixly.Workspace",
"Mixly.Debug", "Mixly.Debug",
"Mixly.HTMLTemplate",
"Mixly.Web.Serial", "Mixly.Web.Serial",
"Mixly.Web.USB", "Mixly.Web.USB",
"Mixly.Web.Ampy" "Mixly.Web.Ampy"

View File

@@ -9,6 +9,7 @@ goog.require('Mixly.MString');
goog.require('Mixly.Msg'); goog.require('Mixly.Msg');
goog.require('Mixly.Workspace'); goog.require('Mixly.Workspace');
goog.require('Mixly.Debug'); goog.require('Mixly.Debug');
goog.require('Mixly.HTMLTemplate');
goog.require('Mixly.Electron.Serial'); goog.require('Mixly.Electron.Serial');
goog.provide('Mixly.Electron.BU'); goog.provide('Mixly.Electron.BU');
@@ -22,7 +23,8 @@ const {
Msg, Msg,
Workspace, Workspace,
Serial, Serial,
Debug Debug,
HTMLTemplate
} = Mixly; } = Mixly;
const { BU } = Electron; const { BU } = Electron;
@@ -46,6 +48,13 @@ BU.burning = false;
BU.shell = null; 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判断磁盘数量并选择对应操作 * @function 根据传入的stdout判断磁盘数量并选择对应操作
* @param type {string} 值为'burn' | 'upload' * @param type {string} 值为'burn' | 'upload'
@@ -595,62 +604,52 @@ BU.runCmd = function (layerNum, type, port, command, sucFunc) {
BU.burnWithSpecialBin = () => { BU.burnWithSpecialBin = () => {
const { mainStatusBarTabs } = Mixly; const { mainStatusBarTabs } = Mixly;
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
const $selector = $('#mixly-selector-type'); const firmwares = SELECTED_BOARD.burn.special;
let oldOption = $('#mixly-selector-type option:selected').val(); let menu = [];
$selector.empty(); for (let firmware of firmwares) {
const firmwareList = SELECTED_BOARD.burn.special;
let firmwareObj = {};
for (let firmware of firmwareList) {
if (!firmware?.name && !firmware?.command) return; if (!firmware?.name && !firmware?.command) return;
firmwareObj[firmware.name] = firmware.command; menu.push({
if (`${firmware.name}` == oldOption) { id: firmware.command,
$selector.append($(`<option value="${firmware.name}" selected>${firmware.name}</option>`)); text: firmware.name
} else { });
$selector.append($(`<option value="${firmware.name}">${firmware.name}</option>`));
} }
} LayerExt.open({
form.render(); title: [Msg.Lang['nav.btn.burn'], '36px'],
area: ['400px', '160px'],
let initBtnClicked = false; max: false,
min: false,
const layerNum = layer.open({ content: BU.FILMWARE_LAYER,
type: 1,
id: "serial-select",
title: "请选择固件:",
area: ['350px', '150px'],
content: $('#mixly-selector-div'),
shade: Mixly.LayerExt.SHADE_ALL, shade: Mixly.LayerExt.SHADE_ALL,
resize: false, resize: false,
closeBtn: 0, success: function (layero, index) {
success: function (layero) { const $select = layero.find('select');
$('#serial-select').css('height', '180px'); $select.select2({
$('#serial-select').css('overflow', 'inherit'); data: menu,
$(".layui-layer-page").css("z-index", "198910151"); minimumResultsForSearch: 50,
$("#mixly-selector-btn1").off("click").click(() => { width: '360px',
layer.close(layerNum); dropdownCssClass: 'mixly-scrollbar'
}); });
$("#mixly-selector-btn2").click(() => { layero.find('button').click((event) => {
layer.close(layerNum); const $target = $(event.currentTarget);
initBtnClicked = true; const type = $target.attr('data-id');
}); const command = $select.val();
}, layer.close(index, () => {
end: function () { if (type !== 'burn') {
$("#mixly-selector-btn1").off("click"); return;
$("#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(''); statusBarTerminal.setValue('');
mainStatusBarTabs.changeTo('output'); mainStatusBarTabs.changeTo('output');
mainStatusBarTabs.show(); mainStatusBarTabs.show();
BU.burning = true; BU.burning = true;
BU.uploading = false; BU.uploading = false;
const port = Serial.getSelectedPortName(); const port = Serial.getSelectedPortName();
BU.burnWithPort(port, firmwareObj[selectedFirmwareName]); BU.burnWithPort(port, command);
} else { });
layer.msg(Msg.Lang['shell.burnCanceled'], { time: 1000 }); });
} },
beforeEnd: function (layero) {
layero.find('select').select2('destroy');
layero.find('button').off();
} }
}); });
} }

View File

@@ -1,5 +1,6 @@
goog.loadJs('web', () => { goog.loadJs('web', () => {
goog.require('path');
goog.require('ESPTool'); goog.require('ESPTool');
goog.require('AdafruitESPTool'); goog.require('AdafruitESPTool');
goog.require('CryptoJS'); goog.require('CryptoJS');
@@ -12,6 +13,7 @@ goog.require('Mixly.Boards');
goog.require('Mixly.Msg'); goog.require('Mixly.Msg');
goog.require('Mixly.Workspace'); goog.require('Mixly.Workspace');
goog.require('Mixly.Debug'); goog.require('Mixly.Debug');
goog.require('Mixly.HTMLTemplate');
goog.require('Mixly.Web.Serial'); goog.require('Mixly.Web.Serial');
goog.require('Mixly.Web.USB'); goog.require('Mixly.Web.USB');
goog.require('Mixly.Web.Ampy'); goog.require('Mixly.Web.Ampy');
@@ -26,7 +28,8 @@ const {
Boards, Boards,
Msg, Msg,
Workspace, Workspace,
Debug Debug,
HTMLTemplate
} = Mixly; } = Mixly;
const { const {
@@ -47,6 +50,13 @@ const {
BU.uploading = false; BU.uploading = false;
BU.burning = 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; const BAUD = goog.platform() === 'darwin' ? 460800 : 921600;
BU.requestPort = () => { BU.requestPort = () => {
@@ -112,10 +122,17 @@ BU.initBurn = () => {
BU.burnByUSB(); BU.burnByUSB();
} else { } else {
const boardKey = Boards.getSelectedBoardKey(); 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) { if (boardKey.indexOf('micropython:esp32s2') !== -1) {
BU.burnWithAdafruitEsptool(); BU.burnWithAdafruitEsptool(web.burn.binFile);
} else { } else {
BU.burnWithEsptool(); BU.burnWithEsptool(web.burn.binFile);
} }
} }
} }
@@ -202,9 +219,7 @@ BU.burnByUSB = () => {
}); });
} }
BU.burnWithEsptool = async () => { BU.burnWithEsptool = async (binFile) => {
const { web } = SELECTED_BOARD;
const { burn } = web;
const { mainStatusBarTabs } = Mixly; const { mainStatusBarTabs } = Mixly;
const portName = Serial.getSelectedPortName(); const portName = Serial.getSelectedPortName();
if (!portName) { if (!portName) {
@@ -251,12 +266,6 @@ BU.burnWithEsptool = async () => {
} }
statusBarTerminal.addValue(Msg.Lang['shell.bin.reading'] + "..."); 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 = []; let firmwarePromise = [];
statusBarTerminal.addValue("\n"); statusBarTerminal.addValue("\n");
for (let i of binFile) { for (let i of binFile) {
@@ -322,9 +331,7 @@ BU.burnWithEsptool = async () => {
}); });
} }
BU.burnWithAdafruitEsptool = async () => { BU.burnWithAdafruitEsptool = async (binFile) => {
const { web } = SELECTED_BOARD;
const { burn } = web;
const { mainStatusBarTabs } = Mixly; const { mainStatusBarTabs } = Mixly;
const portName = Serial.getSelectedPortName(); const portName = Serial.getSelectedPortName();
if (!portName) { if (!portName) {
@@ -369,13 +376,6 @@ BU.burnWithAdafruitEsptool = async () => {
} }
statusBarTerminal.addValue(Msg.Lang['shell.bin.reading'] + "..."); 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 = []; let firmwarePromise = [];
statusBarTerminal.addValue("\n"); statusBarTerminal.addValue("\n");
for (let i of binFile) { 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();
}
});
}
}); });

View File

@@ -284,6 +284,7 @@
"nav.btn.file.exportAs": "Export lib", "nav.btn.file.exportAs": "Export lib",
"nav.btn.setting": "Settings", "nav.btn.setting": "Settings",
"nav.btn.setting.manageLibs": "Manage libs", "nav.btn.setting.manageLibs": "Manage libs",
"nav.btn.setting.firmware": "Firmware",
"nav.btn.setting.feedback": "Feedback", "nav.btn.setting.feedback": "Feedback",
"shell.compiling": "Compiling", "shell.compiling": "Compiling",
"shell.compileFailed": "Compile failed", "shell.compileFailed": "Compile failed",

View File

@@ -284,6 +284,7 @@
"nav.btn.file.exportAs": "导出库", "nav.btn.file.exportAs": "导出库",
"nav.btn.setting": "设置", "nav.btn.setting": "设置",
"nav.btn.setting.manageLibs": "管理库", "nav.btn.setting.manageLibs": "管理库",
"nav.btn.setting.firmware": "固件",
"nav.btn.setting.feedback": "反馈", "nav.btn.setting.feedback": "反馈",
"shell.compiling": "编译中", "shell.compiling": "编译中",
"shell.compileFailed": "编译失败", "shell.compileFailed": "编译失败",

View File

@@ -284,6 +284,7 @@
"nav.btn.file.exportAs": "匯出函式庫", "nav.btn.file.exportAs": "匯出函式庫",
"nav.btn.setting": "設定", "nav.btn.setting": "設定",
"nav.btn.setting.manageLibs": "管理函式庫", "nav.btn.setting.manageLibs": "管理函式庫",
"nav.btn.setting.firmware": "韌體",
"nav.btn.setting.feedback": "回饋", "nav.btn.setting.feedback": "回饋",
"shell.compiling": "編譯中", "shell.compiling": "編譯中",
"shell.compileFailed": "編譯失敗", "shell.compileFailed": "編譯失敗",

View File

@@ -0,0 +1,19 @@
<style>
div[m-id="{{d.mId}}"] > .select2-container {
margin: 20px;
}
div[m-id="{{d.mId}}"] > .layui-btn-container {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
}
</style>
<div m-id="{{d.mId}}" class="page-item">
<select class="type"></select>
<div class="layui-btn-container">
<button type="button" data-id="cancel" class="layui-btn layui-btn-sm self-adaption-btn">{{d.cancel}}</button>
<button type="button" data-id="burn" class="layui-btn layui-btn-sm self-adaption-btn">{{d.burn}}</button>
</div>
</div>