Update: WebSocket模式下MicroPython板卡增加对烧录依赖文件的支持

This commit is contained in:
王立帮
2024-12-03 14:49:11 +08:00
parent 2658b84128
commit 1952871a94
2 changed files with 74 additions and 2 deletions

View File

@@ -1736,13 +1736,16 @@
{ {
"path": "/web-socket/burn-upload.js", "path": "/web-socket/burn-upload.js",
"require": [ "require": [
"path",
"layui", "layui",
"dayjs.duration", "dayjs.duration",
"Mixly.Debug", "Mixly.Debug",
"Mixly.LayerExt", "Mixly.LayerExt",
"Mixly.Msg", "Mixly.Msg",
"Mixly.Env",
"Mixly.Config", "Mixly.Config",
"Mixly.Workspace", "Mixly.Workspace",
"Mixly.MString",
"Mixly.WebSocket.Serial" "Mixly.WebSocket.Serial"
], ],
"provide": [ "provide": [

View File

@@ -1,5 +1,6 @@
goog.loadJs('web', () => { goog.loadJs('web', () => {
goog.require('path');
goog.require('layui'); goog.require('layui');
goog.require('dayjs.duration'); goog.require('dayjs.duration');
goog.require('Mixly.Debug'); goog.require('Mixly.Debug');
@@ -8,6 +9,7 @@ goog.require('Mixly.Msg');
goog.require('Mixly.Env'); goog.require('Mixly.Env');
goog.require('Mixly.Config'); goog.require('Mixly.Config');
goog.require('Mixly.Workspace'); goog.require('Mixly.Workspace');
goog.require('Mixly.MString');
goog.require('Mixly.WebSocket.Serial'); goog.require('Mixly.WebSocket.Serial');
goog.provide('Mixly.WebSocket.BU'); goog.provide('Mixly.WebSocket.BU');
@@ -18,6 +20,7 @@ const {
Msg, Msg,
Env, Env,
Workspace, Workspace,
MString,
WebSocket WebSocket
} = Mixly; } = Mixly;
@@ -193,13 +196,21 @@ class WebSocketBU {
this.#running_ = true; this.#running_ = true;
this.#upload_ = true; this.#upload_ = true;
await this.showProgress(); await this.showProgress();
const importsMap = this.getImportModules(code);
let libraries = {};
for (let key in importsMap) {
const filename = importsMap[key]['__name__'];
const data = goog.get(importsMap[key]['__path__']);
libraries[filename] = data;
}
const config = { const config = {
boardDirPath: `.${Env.boardDirPath}`, boardDirPath: `.${Env.boardDirPath}`,
command: SELECTED_BOARD.upload.command, command: SELECTED_BOARD.upload.command,
libPath: SELECTED_BOARD.upload.libPath,
filePath: SELECTED_BOARD.upload.filePath, filePath: SELECTED_BOARD.upload.filePath,
port, code port, code, libraries
}; };
const mixlySocket = WebSocketBU.getMixlySocket(); const mixlySocket = WebSocketBU.getMixlySocket();
mixlySocket.emit('micropython.upload', config, (response) => { mixlySocket.emit('micropython.upload', config, (response) => {
this.hideProgress(); this.hideProgress();
@@ -217,6 +228,64 @@ class WebSocketBU {
}); });
} }
getImportModulesName(code) {
// 正则表达式: 匹配 import 或 from 导入语句
const importRegex = /(?:import\s+([a-zA-Z0-9_]+)|from\s+([a-zA-Z0-9_]+)\s+import)/g;
let imports = [];
let match;
while ((match = importRegex.exec(code)) !== null) {
if (match[1]) {
imports.push(match[1]); // 'import module'
}
if (match[2]) {
imports.push(match[2]); // 'from module import ...'
}
}
return imports;
}
getImportModules(code) {
let importsMap = {};
const libPath = SELECTED_BOARD.upload.libPath;
for (let i = libPath.length - 1; i >= 0; i--) {
const dirname = MString.tpl(libPath[i], { indexPath: Env.boardDirPath });
const map = goog.getJSON(path.join(dirname, 'map.json'));
if (!(map && map instanceof Object)) {
continue;
}
for (let key in map) {
importsMap[key] = structuredClone(map[key]);
importsMap[key]['__path__'] = path.join(dirname, map[key]['__name__']);
}
}
let usedMap = {};
let currentImports = this.getImportModulesName(code);
while (currentImports.length) {
let temp = [];
for (let moduleName of currentImports) {
let moduleInfo = importsMap[moduleName];
if (!moduleInfo) {
continue;
}
usedMap[moduleName] = moduleInfo;
const moduleImports = moduleInfo['__require__'];
if (!moduleImports) {
continue;
}
for (let name of moduleImports) {
if (usedMap[name] || !importsMap[name] || temp.includes(name)) {
continue;
}
temp.push(name);
}
}
currentImports = temp;
}
return usedMap;
}
async kill() { async kill() {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
const mixlySocket = WebSocketBU.getMixlySocket(); const mixlySocket = WebSocketBU.getMixlySocket();