From 3eec19ff4a6997d8c5e3f4e373db53426795fe4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E7=AB=8B=E5=B8=AE?= <3294713004@qq.com> Date: Mon, 14 Oct 2024 20:24:05 +0800 Subject: [PATCH] =?UTF-8?q?Update:=20Arduino=E4=B8=8B=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E4=BB=A3=E7=A0=81=E4=B8=AD=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E7=9A=84=E4=B8=B2=E5=8F=A3=E6=B3=A2=E7=89=B9=E7=8E=87=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=B8=B2=E5=8F=A3=E7=9B=91=E8=A7=86=E5=99=A8=20(#IAWT?= =?UTF-8?q?ZG)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/modules/mixly-modules/common/serial.js | 12 ++ .../mixly-modules/common/statusbar-serial.js | 30 +++-- .../mixly-modules/electron/arduino-shell.js | 105 ++++++++++-------- .../modules/mixly-modules/electron/serial.js | 12 +- common/modules/mixly-modules/web/serial.js | 4 +- 5 files changed, 98 insertions(+), 65 deletions(-) diff --git a/common/modules/mixly-modules/common/serial.js b/common/modules/mixly-modules/common/serial.js index f6e803ef..a02d89e1 100644 --- a/common/modules/mixly-modules/common/serial.js +++ b/common/modules/mixly-modules/common/serial.js @@ -29,6 +29,10 @@ class Serial { rts: true, dtr: true }; + this.AVAILABEL_BAUDS = [ + 300, 600, 750, 1200, 2400, 4800, 9600, 19200, 31250, 38400, 57600, + 74880, 115200, 230400, 250000, 460800, 500000, 921600, 1000000, 2000000, + ]; this.getSelectedPortName = function () { return Nav.getMain().getPortSelector().val(); @@ -46,6 +50,10 @@ class Serial { }; } + this.portIsLegal = function (port) { + return this.portsName.includes(port); + } + /** * @function 重新渲染串口下拉框 * @param {array} 当前可用的所有串口 @@ -186,6 +194,10 @@ class Serial { } } + baudRateIsLegal(baud) { + return Serial.AVAILABEL_BAUDS.includes(baud); + } + async setBaudRate(baud) { this.#baud_ = baud; } diff --git a/common/modules/mixly-modules/common/statusbar-serial.js b/common/modules/mixly-modules/common/statusbar-serial.js index 2fb7753d..056c127f 100644 --- a/common/modules/mixly-modules/common/statusbar-serial.js +++ b/common/modules/mixly-modules/common/statusbar-serial.js @@ -333,18 +333,7 @@ class StatusBarSerial extends PageBase { const { id } = event.currentTarget.dataset; const { data } = event.params; if (id === 'baud') { - const baud = data.id - 0; - if (!this.isOpened()) { - this.#config_.baud = baud; - return; - } - this.#serial_.setBaudRate(baud) - .then(() => { - this.#config_.baud = baud; - }) - .catch((error) => { - this.#$settingMenu_.filter('[data-id="baud"]').val(data).trigger('change'); - }); + this.setBaudRate(data.id - 0).catch(Debug.error); } else if (id === 'send-with') { if (data.id === 'no') { this.#config_.sendWith = ''; @@ -521,6 +510,23 @@ class StatusBarSerial extends PageBase { this.#chart_.setStatus(isOpened); } + async setBaudRate(baud) { + if (!this.isOpened()) { + this.#config_.baud = baud; + return; + } + if (this.#serial_.baudRateIsLegal(baud)) { + try { + await this.#serial_.setBaudRate(baud); + this.#config_.baud = baud; + } catch (error) { + Debug.error(error); + } + } + this.#$settingMenu_.filter('[data-id="baud"]').val(this.#config_.baud).trigger('change'); + this.startRead(); + } + isOpened() { return this.#opened_; } diff --git a/common/modules/mixly-modules/electron/arduino-shell.js b/common/modules/mixly-modules/electron/arduino-shell.js index ac15690a..cfb38139 100644 --- a/common/modules/mixly-modules/electron/arduino-shell.js +++ b/common/modules/mixly-modules/electron/arduino-shell.js @@ -138,6 +138,9 @@ ArduShell.compile = (doFunc = () => {}) => { const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); statusBarTerminal.setValue(''); mainStatusBarTabs.changeTo("output"); + const mainWorkspace = Workspace.getMain(); + const editor = mainWorkspace.getEditorsManager().getActive(); + const code = editor.getCode(); ArduShell.compiling = true; ArduShell.uploading = false; const boardType = Boards.getSelectedBoardCommandParam(); @@ -164,44 +167,42 @@ ArduShell.compile = (doFunc = () => {}) => { $("#mixly-loader-btn").css('display', 'inline-block'); } }); - setTimeout(() => { - statusBarTerminal.setValue(Msg.Lang['shell.compiling'] + "...\n"); + statusBarTerminal.setValue(Msg.Lang['shell.compiling'] + "...\n"); - let myLibPath = path.join(Env.boardDirPath, "/libraries/myLib/"); - if (fs_plus.isDirectorySync(myLibPath)) - myLibPath += '\",\"'; - else - myLibPath = ''; - const thirdPartyPath = path.join(Env.boardDirPath, 'libraries/ThirdParty'); - if (fs_plus.isDirectorySync(thirdPartyPath)) { - const libList = fs.readdirSync(thirdPartyPath); - for (let libName of libList) { - const libPath = path.join(thirdPartyPath, libName, 'libraries'); - if (!fs_plus.isDirectorySync(libPath)) continue; - myLibPath += libPath + ','; - } + let myLibPath = path.join(Env.boardDirPath, "/libraries/myLib/"); + if (fs_plus.isDirectorySync(myLibPath)) + myLibPath += '\",\"'; + else + myLibPath = ''; + const thirdPartyPath = path.join(Env.boardDirPath, 'libraries/ThirdParty'); + if (fs_plus.isDirectorySync(thirdPartyPath)) { + const libList = fs.readdirSync(thirdPartyPath); + for (let libName of libList) { + const libPath = path.join(thirdPartyPath, libName, 'libraries'); + if (!fs_plus.isDirectorySync(libPath)) continue; + myLibPath += libPath + ','; } - const configPath = path.join(ArduShell.shellPath, '../arduino-cli.json'), - defaultLibPath = path.join(ArduShell.shellPath, '../libraries'), - buildPath = path.join(Env.clientPath, './mixlyBuild'), - buildCachePath = path.join(Env.clientPath, './mixlyBuildCache'), - codePath = path.join(Env.clientPath, './testArduino/testArduino.ino'); - const cmdStr = '\"' - + ArduShell.shellPath - + '\" compile -b ' - + boardType - + ' --config-file \"' - + configPath - + '\" --build-cache-path \"' + buildCachePath + '\" --verbose --libraries \"' - + myLibPath - + defaultLibPath - + '\" --build-path \"' - + buildPath - + '\" \"' - + codePath - + '\" --no-color'; - ArduShell.runCmd(layerNum, 'compile', cmdStr, doFunc); - }, 100); + } + const configPath = path.join(ArduShell.shellPath, '../arduino-cli.json'), + defaultLibPath = path.join(ArduShell.shellPath, '../libraries'), + buildPath = path.join(Env.clientPath, './mixlyBuild'), + buildCachePath = path.join(Env.clientPath, './mixlyBuildCache'), + codePath = path.join(Env.clientPath, './testArduino/testArduino.ino'); + const cmdStr = '\"' + + ArduShell.shellPath + + '\" compile -b ' + + boardType + + ' --config-file \"' + + configPath + + '\" --build-cache-path \"' + buildCachePath + '\" --verbose --libraries \"' + + myLibPath + + defaultLibPath + + '\" --build-path \"' + + buildPath + + '\" \"' + + codePath + + '\" --no-color'; + ArduShell.runCmd(layerNum, 'compile', cmdStr, code, doFunc); } /** @@ -252,6 +253,9 @@ ArduShell.upload = (boardType, port) => { const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); statusBarTerminal.setValue(''); mainStatusBarTabs.changeTo('output'); + const mainWorkspace = Workspace.getMain(); + const editor = mainWorkspace.getEditorsManager().getActive(); + const code = editor.getCode(); const layerNum = layer.open({ type: 1, title: Msg.Lang['shell.uploading'] + "...", @@ -327,14 +331,24 @@ ArduShell.upload = (boardType, port) => { + codePath + '\" --no-color'; } - ArduShell.runCmd(layerNum, 'upload', cmdStr, - function () { - mainStatusBarTabs.add('serial', port); - mainStatusBarTabs.changeTo(port); - const statusBarSerial = mainStatusBarTabs.getStatusBarById(port); - statusBarSerial.open(); + ArduShell.runCmd(layerNum, 'upload', cmdStr, code, () => { + if (!Serial.portIsLegal(port)) { + return; } - ); + mainStatusBarTabs.add('serial', port); + mainStatusBarTabs.changeTo(port); + const statusBarSerial = mainStatusBarTabs.getStatusBarById(port); + statusBarSerial.open() + .then(() => { + const baudRates = code.match(/(?<=Serial.begin[\s]*\([\s]*)[0-9]*(?=[\s]*\))/g); + if (!baudRates.length) { + statusBarSerial.setBaudRate(9600); + } else { + statusBarSerial.setBaudRate(baudRates[0] - 0); + } + }); + + }); } /** @@ -466,12 +480,9 @@ ArduShell.writeLibFiles = (inPath) => { * @param cmd {String} 输入的cmd命令 * @return void */ -ArduShell.runCmd = (layerNum, type, cmd, sucFunc) => { +ArduShell.runCmd = (layerNum, type, cmd, code, sucFunc) => { const { mainStatusBarTabs } = Mixly; const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output'); - const mainWorkspace = Workspace.getMain(); - const editor = mainWorkspace.getEditorsManager().getActive(); - const code = editor.getCode(); const testArduinoDirPath = path.join(Env.clientPath, 'testArduino'); const codePath = path.join(testArduinoDirPath, 'testArduino.ino'); const nowFilePath = Title.getFilePath(); diff --git a/common/modules/mixly-modules/electron/serial.js b/common/modules/mixly-modules/electron/serial.js index aaafac3e..1b1093fa 100644 --- a/common/modules/mixly-modules/electron/serial.js +++ b/common/modules/mixly-modules/electron/serial.js @@ -177,17 +177,19 @@ class ElectronSerial extends Serial { async setBaudRate(baud) { return new Promise((resolve, reject) => { - if (!this.isOpened() || this.getBaudRate() === baud) { + if (!this.isOpened() + || this.getBaudRate() === baud + || !this.baudRateIsLegal(baud)) { resolve(); return; } - this.#serialport_.update({ baudRate: baud - 0 }, (error) => { + this.#serialport_.update({ baudRate: baud }, (error) => { if (error) { reject(error); - } else { - super.setBaudRate(baud); - resolve(); + return; } + super.setBaudRate(baud); + this.setDTRAndRTS(this.getDTR(), this.getRTS()).finally(resolve); }); }); } diff --git a/common/modules/mixly-modules/web/serial.js b/common/modules/mixly-modules/web/serial.js index 4a1acb10..d4f90a3b 100644 --- a/common/modules/mixly-modules/web/serial.js +++ b/common/modules/mixly-modules/web/serial.js @@ -191,7 +191,9 @@ class WebSerial extends Serial { async setBaudRate(baud) { return new Promise((resolve, reject) => { - if (!this.isOpened() || this.getBaudRate() === baud) { + if (!this.isOpened() + || this.getBaudRate() === baud + || !this.baudRateIsLegal(baud)) { resolve(); return; }