From 57219d5ed7874f9093d0f51bbc63226fc9b79261 Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Tue, 11 Jul 2023 14:30:03 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=8B=A4=EA=B3=BC=EB=A1=9C=EB=B4=87=20?= =?UTF-8?q?=ED=8E=8C=EC=9B=A8=EC=96=B4=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=B2=84=ED=8A=BC=20=EC=B6=94=EA=B0=80=20/=20?= =?UTF-8?q?=ED=8E=8C=EC=9B=A8=EC=96=B4=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EC=95=88=EB=82=B4=EC=B0=BD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/firmwares/DynamixelCsDll.dll | Bin 0 -> 12288 bytes app/firmwares/OpenCM7.0.bin | Bin 0 -> 40841 bytes app/firmwares/opencm7Dfu.exe | Bin 0 -> 9728 bytes app/modules/robotis_openCM70EDU.json | 8 +++ app/src/main/core/serial/flasher.ts | 98 +++++++++++++++++++++++++++ app/src/main/core/serial/scanner.ts | 16 +++++ types/index.d.ts | 11 ++- 7 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 app/firmwares/DynamixelCsDll.dll create mode 100644 app/firmwares/OpenCM7.0.bin create mode 100644 app/firmwares/opencm7Dfu.exe diff --git a/app/firmwares/DynamixelCsDll.dll b/app/firmwares/DynamixelCsDll.dll new file mode 100644 index 0000000000000000000000000000000000000000..0b6423cbbbd6d5b6e65ce711c3095ff9486434d3 GIT binary patch literal 12288 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೸#M;K2q{+@A>LzK3Tv5oOUMw2lMtdSP! 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

-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 literal 0 HcmV?d00001 diff --git a/app/firmwares/opencm7Dfu.exe b/app/firmwares/opencm7Dfu.exe new file mode 100644 index 0000000000000000000000000000000000000000..482f254e2cbe4180e8e47485dae5cab4cee740d1 GIT binary patch literal 9728 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 literal 0 HcmV?d00001 diff --git a/app/modules/robotis_openCM70EDU.json b/app/modules/robotis_openCM70EDU.json index 75cf76871..679fbfdf5 100644 --- a/app/modules/robotis_openCM70EDU.json +++ b/app/modules/robotis_openCM70EDU.json @@ -16,6 +16,14 @@ "win32-x64": "ROBOTIS/ROBOTIS CDC Driver.bat" }, "selectPort" : true, + "firmware": { + "type": "opencm7", + "offset": "0x8004000", + "name": "OpenCM7.0", + "translate" : "실과로봇 펌웨어 업데이트", + "latest_version": 22 + }, + "firmwareBaudRate": 57600, "hardware": { "type": "serial", "control": "slave", diff --git a/app/src/main/core/serial/flasher.ts b/app/src/main/core/serial/flasher.ts index 1bbbcc539..d51e622d3 100644 --- a/app/src/main/core/serial/flasher.ts +++ b/app/src/main/core/serial/flasher.ts @@ -135,6 +135,102 @@ class Flasher { }); } + private _flashOpenCM7( + firmware: IOpenCM7TypeFirmware, + port: string, + options: { + baudRate?: number; + MCUType?: string; + } + ): Promise { + return new Promise((resolve) => { + const cmd = [ + 'opencm7Dfu.exe', + ' opencm7', + ` ${port}`, + ` ${firmware.name}.bin`, + ].join(''); + + logger.info(`OpenCM7.0 board firmware requested.\nparameter is ${cmd}`); + try { + this.flasherProcess = exec( + cmd, + { + cwd: directoryPaths.firmware(), + }, + (...args) => { + resolve(args); + } + ).on('exit', code => { + if (code != null) + { + if (code > 2147483647) + { + code = code - 4294967296; + } + } + console.log('final exit code is', code); + } + ); + } + catch (error) { + + } + }); + } + + checkOpenCM7Version( + port: string, + latest_version: number, + ): Promise { + return new Promise((resolve) => { + const cmd = [ + 'opencm7Dfu.exe', + ' opencm7', + ` ${port}`, + ' version', + ].join(''); + + logger.info(`Read OpenCM7.0 board firmware version.\nparameter is ${cmd}`); + try { + this.flasherProcess = exec( + cmd, + { + cwd: directoryPaths.firmware(), + }, + (...args) => { + resolve(args); + } + ).on('exit', code => { + if (code != null) + { + console.log('code is', code); + if (code > 2147483647) + { + code = code - 4294967296; + } + } + if (code) + { + if (code < latest_version) + { + dialog.showMessageBox({ + type: 'info', + title: `펌웨어 업데이트 안내 (v${latest_version})`, + message: '새로운 펌웨어가 배포되었습니다.\n펌웨어를 업데이트 해주세요.\nNew firmware is available.\nPlease update the firmware.\n' + }); + } + } + console.log('final exit code is', code); + } + ); + } + catch (error) { + + } + }); + } + flash( firmware: IFirmwareInfo, port: string, @@ -149,6 +245,8 @@ class Flasher { return this._flashCopy(firmware as ICopyTypeFirmware); } else if ((firmware as IESP32TypeFirmware).type === 'esp32') { return this._flashESP(firmware as IESP32TypeFirmware, port, options); + } else if ((firmware as IOpenCM7TypeFirmware).type === 'opencm7') { + return this._flashOpenCM7(firmware as IOpenCM7TypeFirmware, port, options); } else { return Promise.reject(new Error()); } diff --git a/app/src/main/core/serial/scanner.ts b/app/src/main/core/serial/scanner.ts index 4851fa931..a4417b4a6 100644 --- a/app/src/main/core/serial/scanner.ts +++ b/app/src/main/core/serial/scanner.ts @@ -6,6 +6,7 @@ import {CloudModeTypes} from '../../../common/constants'; import BaseScanner from '../baseScanner'; import SerialConnector from './connector'; import createLogger from '../../electron/functions/createLogger'; +import Flasher from './flasher'; const logger = createLogger('core/SerialScanner.ts'); @@ -18,6 +19,7 @@ const logger = createLogger('core/SerialScanner.ts'); */ class SerialScanner extends BaseScanner { private isScanning = false; + private flasher = new Flasher(); static get SCAN_INTERVAL_MILLS() { return 1500; @@ -100,6 +102,20 @@ class SerialScanner extends BaseScanner { return; } + + const firmware = this.config.firmware; + + if (firmware) + { + if ((firmware as IOpenCM7TypeFirmware).type === 'opencm7') + { + if (selectedPorts[0] != null) + { + await this.flasher.checkOpenCM7Version(selectedPorts[0], (this.config.firmware as IOpenCM7TypeFirmware).latest_version); + } + } + } + const electedConnector = await electPort(selectedPorts, hardware, this.hwModule, (connector) => { if (this.config && this.config.firmware) { diff --git a/types/index.d.ts b/types/index.d.ts index 34c77bd29..f7da92542 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -29,11 +29,20 @@ declare type IESP32TypeFirmware = { afterDelay?: number; translate?: string; }; +declare type IOpenCM7TypeFirmware = { + type: string; + offset: string; + name: string; + latest_version: number; + afterDelay?: number; + translate?: string; +}; declare type IFirmwareInfo = | string | [{ name: string; translate: string }] | ICopyTypeFirmware - | IESP32TypeFirmware; + | IESP32TypeFirmware + | IOpenCM7TypeFirmware; declare type ICustomButtonInfo = | string | { key: string; translate: string } From dffb9371ebbdbe9ace39a5746f38fa048a2bbacc Mon Sep 17 00:00:00 2001 From: Jason Kim Date: Tue, 18 Jul 2023 17:58:55 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=B5=9C=EC=8B=A0=20=ED=8E=8C=EC=9B=A8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=84=EC=A0=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/robotis_openCM70EDU.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/modules/robotis_openCM70EDU.json b/app/modules/robotis_openCM70EDU.json index 679fbfdf5..0a5a4ae5f 100644 --- a/app/modules/robotis_openCM70EDU.json +++ b/app/modules/robotis_openCM70EDU.json @@ -21,7 +21,7 @@ "offset": "0x8004000", "name": "OpenCM7.0", "translate" : "실과로봇 펌웨어 업데이트", - "latest_version": 22 + "latest_version": 21 }, "firmwareBaudRate": 57600, "hardware": {