diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b5186b7..fa33177c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,21 @@ All notable version changes will be recorded in this file. *** +### [v3.11.2] update + +**New**: + - `Disassembly View`: Add 'Visualize Jumps' for disassembly code, [more informations](https://interrupt.memfault.com/blog/gnu-binutils#new-feature-visualize-jumps) + - `Language Mode`: Add a setting `EIDE.DisplayLanguage` to choose a language for UI, prompts. + +**Fix**: + - `Memory Layout View`: Error format when user input an integer number. + +**Optimize**: + - `Utility Tools`: Use `start` command to install win32 driver. + - `Promblem Matcher`: Match compiler errors in linker logs. + +*** + ### [v3.11.1] update **New**: diff --git a/package.json b/package.json index d160bdb2..8bac0bbc 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "homepage": "https://em-ide.com", "license": "MIT", "description": "A mcu development environment for 8051/AVR/STM8/Cortex-M/RISC-V", - "version": "3.11.1", + "version": "3.11.2", "preview": false, "engines": { "vscode": "^1.67.0" @@ -180,6 +180,22 @@ { "title": "Embedded IDE", "properties": { + "EIDE.DisplayLanguage": { + "type": "string", + "scope": "resource", + "markdownDescription": "Choose language type for UI, prompt strings", + "default": "auto", + "enum": [ + "auto", + "en-us", + "zh-cn" + ], + "enumDescriptions": [ + "Auto select", + "English", + "Chinese" + ] + }, "EIDE.ExternalTools.IndexUrl": { "type": "string", "scope": "machine", @@ -311,71 +327,6 @@ "markdownDescription": "%settings.cmsispack.repo.url%", "default": "github0null/eide-cmsis-pack/contents/packages" }, - "EIDE.SerialPortMonitor.DefaultPort": { - "type": "string", - "scope": "resource", - "markdownDescription": "%settings.serial.def.port%" - }, - "EIDE.SerialPortMonitor.ShowStatusBar": { - "type": "boolean", - "scope": "resource", - "markdownDescription": "%settings.serial.show.toolbar%", - "default": true - }, - "EIDE.SerialPortMonitor.useUnixLF": { - "type": "boolean", - "scope": "resource", - "markdownDescription": "%settings.serial.use.unix.lf%", - "default": false - }, - "EIDE.SerialPortMonitor.BaudRate": { - "type": "integer", - "scope": "resource", - "markdownDescription": "%settings.serial.baud%", - "default": 115200 - }, - "EIDE.SerialPortMonitor.DataBits": { - "type": "integer", - "scope": "resource", - "markdownDescription": "%settings.serial.data.width%", - "default": 8 - }, - "EIDE.SerialPortMonitor.Parity": { - "type": "integer", - "scope": "resource", - "markdownDescription": "%settings.serial.parity%", - "default": 0, - "enum": [ - 0, - 1, - 2, - 3, - 4 - ], - "enumDescriptions": [ - "None", - "Odd", - "Even", - "Mark", - "Space" - ] - }, - "EIDE.SerialPortMonitor.StopBits": { - "type": "integer", - "scope": "resource", - "markdownDescription": "%settings.serial.stop.bits%", - "default": 1, - "enum": [ - 1, - 2, - 3 - ], - "enumDescriptions": [ - "One", - "Two", - "OnePointFive" - ] - }, "EIDE.IAR.STM8.InstallDirectory": { "type": "string", "scope": "resource", diff --git a/package.nls.json b/package.nls.json index 7f97183f..f3923062 100644 --- a/package.nls.json +++ b/package.nls.json @@ -76,7 +76,7 @@ "eide.project.run.cppcheck": "Cppcheck Project", "eide.project.clear.cppcheck": "Clear Cppcheck Diagnostic Informations", - "eide.package.install": "Install Chip Support Package", + "eide.package.install": "Install CMSIS Chip Package", "eide.package.install.cmsis": "Install CMSIS Header Files", "eide.package.remove": "Uninstall Chip Support Package", "eide.package.select.device": "Choose Device", @@ -161,5 +161,5 @@ "string.eide.open_docs": "Learn More", "string.eide.open_docs.detail": "Click the link will open the home page that may help you learn more about usage.\n[Embedded IDE](https://em-ide.com/)", - "string.eide.project.welcome": "There are no projects in this workspace !\n[Open Project](command:eide.operation.open_project)\n[Create Project](command:eide.operation.new_project)\n[Import Project](command:eide.operation.import_project)" + "string.eide.project.welcome": "There are no projects in this workspace !\n[New Project](command:eide.operation.new_project)\n[Open Project](command:eide.operation.open_project)\n[Import Project](command:eide.operation.import_project)" } \ No newline at end of file diff --git a/package.nls.zh-CN.json b/package.nls.zh-CN.json index 691edcf7..584af732 100644 --- a/package.nls.zh-CN.json +++ b/package.nls.zh-CN.json @@ -69,7 +69,7 @@ "eide.project.run.cppcheck": "使用 Cppcheck 检查项目", "eide.project.clear.cppcheck": "清除 Cppcheck 诊断信息", - "eide.package.install": "安装芯片支持包", + "eide.package.install": "安装 CMSIS 芯片支持包", "eide.package.install.cmsis": "安装 CMSIS 头文件", "eide.package.remove": "卸载芯片支持包", "eide.package.select.device": "选择芯片", @@ -154,5 +154,5 @@ "string.eide.open_docs": "了解更多", "string.eide.open_docs.detail": "点击链接可以打开主页,也许能帮您了解到更多的用法。\n[Embedded IDE](https://em-ide.com/)", - "string.eide.project.welcome": "该工作区中没有任何项目!\n[打开项目](command:eide.operation.open_project)\n[新建项目](command:eide.operation.new_project)\n[导入项目](command:eide.operation.import_project)" + "string.eide.project.welcome": "该工作区中没有任何项目!\n[新建项目](command:eide.operation.new_project)\n[打开项目](command:eide.operation.open_project)\n[导入项目](command:eide.operation.import_project)" } \ No newline at end of file diff --git a/res/html/mem_layout_view/js/app.js b/res/html/mem_layout_view/js/app.js index d5c62e99..f61c2b7b 100644 --- a/res/html/mem_layout_view/js/app.js +++ b/res/html/mem_layout_view/js/app.js @@ -1 +1 @@ -(function(){"use strict";var t={8323:function(t,e,r){var i=r(8935),a=function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{attrs:{id:"app"}},[r("div",{attrs:{id:"header"}},[r("div",{attrs:{id:"header-cont"}},[r("h2",[t._v("Memory Layout")]),r("div",{attrs:{id:"button-cont"}},[r("vscode-button",{attrs:{disabled:!(t.status.ramVerified&&t.status.romVerified)},on:{click:t.onSave}},[t._v("Save")]),r("vscode-button",{attrs:{disabled:!t.status.canReset},on:{click:t.onReset}},[t._v("Reset")])],1)])]),r("div",{staticClass:"container"},[r("div",{staticClass:"left"},[t._m(0),r("div",{attrs:{id:"RAM-Layout"}},[r("div",[r("table",[r("caption",[t._v("On-Chip")]),t._m(1),r("tbody",t._l(t.data.ram["on-chip"],(function(e,i){return r("tr",{key:i},[r("td",[r("vscode-checkbox",{attrs:{id:"iram-"+e.id+"-used","current-checked":e.isDef},on:{change:function(t){e.isDef=t.target.checked}}},[t._v(t._s("IRAM"+e.id))])],1),r("td",[r("vscode-text-field",{attrs:{id:"iram-"+e.id+"-addr",maxlength:t.style["addr_size-text-max-len"],"current-value":e.addr},on:{change:function(t){e.addr=t.target.value}}})],1),r("td",[r("vscode-text-field",{attrs:{id:"iram-"+e.id+"-size",maxlength:t.style["addr_size-text-max-len"],"current-value":e.size},on:{change:function(t){e.size=t.target.value}}})],1),r("td",[r("vscode-checkbox",{attrs:{"current-checked":e.noInit},on:{change:function(t){e.noInit=t.target.checked}}})],1)])})),0)]),r("table",[r("caption",[t._v("Off-Chip")]),t._m(2),r("tbody",t._l(t.data.ram["off-chip"],(function(e,i){return r("tr",{key:i},[r("td",[r("vscode-checkbox",{attrs:{id:"ram-"+e.id+"-used","current-checked":e.isDef},on:{change:function(t){e.isDef=t.target.checked}}},[t._v(t._s("RAM"+e.id))])],1),r("td",[r("vscode-text-field",{attrs:{id:"ram-"+e.id+"-addr",maxlength:t.style["addr_size-text-max-len"],"current-value":e.addr},on:{change:function(t){e.addr=t.target.value}}})],1),r("td",[r("vscode-text-field",{attrs:{id:"ram-"+e.id+"-size",maxlength:t.style["addr_size-text-max-len"],"current-value":e.size},on:{change:function(t){e.size=t.target.value}}})],1),r("td",[r("vscode-checkbox",{attrs:{"current-checked":e.noInit},on:{change:function(t){e.noInit=t.target.checked}}})],1)])})),0)])])]),r("div",[r("p",{staticClass:"code"},[t._v("RAM Total:")]),r("pre",[t._v(t._s(t.status.totalRamSize))])])]),r("div",{staticClass:"right"},[t._m(3),r("div",{attrs:{id:"ROM-Layout"}},[r("div",[r("table",[r("caption",[t._v("On-Chip")]),t._m(4),r("tbody",t._l(t.data.rom["on-chip"],(function(e,i){return r("tr",{key:i},[r("td",[r("vscode-checkbox",{attrs:{id:"irom-"+e.id+"-used","current-checked":e.isDef},on:{change:function(t){e.isDef=t.target.checked}}},[t._v(t._s("IROM"+e.id))])],1),r("td",[r("vscode-text-field",{attrs:{id:"irom-"+e.id+"-addr",maxlength:t.style["addr_size-text-max-len"],"current-value":e.addr},on:{change:function(t){e.addr=t.target.value}}})],1),r("td",[r("vscode-text-field",{attrs:{id:"irom-"+e.id+"-size",maxlength:t.style["addr_size-text-max-len"],"current-value":e.size},on:{change:function(t){e.size=t.target.value}}})],1),r("td",[r("vscode-radio",{attrs:{"current-checked":e.isStartup},on:{change:function(e){e.target.currentChecked&&t.onStartupRomRadioChecked("on-chip",i)}}})],1)])})),0)]),r("table",[r("caption",[t._v("Off-Chip")]),t._m(5),r("tbody",t._l(t.data.rom["off-chip"],(function(e,i){return r("tr",{key:i},[r("td",[r("vscode-checkbox",{attrs:{id:"rom-"+e.id+"-used","current-checked":e.isDef},on:{change:function(t){e.isDef=t.target.checked}}},[t._v(t._s("ROM"+e.id))])],1),r("td",[r("vscode-text-field",{attrs:{id:"rom-"+e.id+"-addr",maxlength:t.style["addr_size-text-max-len"],"current-value":e.addr},on:{change:function(t){e.addr=t.target.value}}})],1),r("td",[r("vscode-text-field",{attrs:{id:"rom-"+e.id+"-size",maxlength:t.style["addr_size-text-max-len"],"current-value":e.size},on:{change:function(t){e.size=t.target.value}}})],1),r("td",[r("vscode-radio",{attrs:{"current-checked":e.isStartup},on:{change:function(e){e.target.currentChecked&&t.onStartupRomRadioChecked("off-chip",i)}}})],1)])})),0)])])]),r("div",[r("p",{staticClass:"code"},[t._v("ROM Total:")]),r("pre",[t._v(t._s(t.status.totalRomSize))])])])])])},n=[function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",[r("h4",[r("strong",[t._v("Read/Write")]),t._v(" Memeory Areas ")])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("thead",[r("tr",[r("th",[t._v("Default")]),r("th",[t._v("Start Address")]),r("th",[t._v("Size")]),r("th",[t._v("NoInit")])])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("thead",[r("tr",[r("th",[t._v("Default")]),r("th",[t._v("Start Address")]),r("th",[t._v("Size")]),r("th",[t._v("NoInit")])])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",[r("h4",[r("strong",[t._v("Read/Only")]),t._v(" Memeory Areas ")])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("thead",[r("tr",[r("th",[t._v("Default")]),r("th",[t._v("Start Address")]),r("th",[t._v("Size")]),r("th",[t._v("Startup")])])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("thead",[r("tr",[r("th",[t._v("Default")]),r("th",[t._v("Start Address")]),r("th",[t._v("Size")]),r("th",[t._v("Startup")])])])}];let o,s={style:{"addr_size-text-max-len":16},status:{canReset:!1,ramVerified:!1,romVerified:!1,totalRamSize:"",totalRomSize:""},data:{ram:{"on-chip":[{id:1,isDef:!0,addr:"",size:"",noInit:!1},{id:2,isDef:!1,addr:"",size:"",noInit:!1}],"off-chip":[{id:1,isDef:!1,addr:"",size:"",noInit:!1},{id:2,isDef:!1,addr:"",size:"",noInit:!1},{id:3,isDef:!1,addr:"",size:"",noInit:!1}]},rom:{"on-chip":[{id:1,isDef:!1,addr:"",size:"",isStartup:!1},{id:2,isDef:!1,addr:"",size:"",isStartup:!1}],"off-chip":[{id:1,isDef:!1,addr:"",size:"",isStartup:!1},{id:2,isDef:!1,addr:"",size:"",isStartup:!1},{id:3,isDef:!1,addr:"",size:"",isStartup:!1}]}}};var d={name:"App",components:{},data(){return s},mounted(){o=this,this.status.ramVerified=this.verifyFormData("ram"),this.status.romVerified=this.verifyFormData("rom")},watch:{"data.ram":{handler:function(){this.status.ramVerified=this.verifyFormData("ram")},deep:!0},"data.rom":{handler:function(){this.status.romVerified=this.verifyFormData("rom")},deep:!0}},methods:{getInstance:function(){return o},reInitData:function(){["on-chip","off-chip"].forEach((t=>{this.data.ram[t].forEach((t=>{t.isDef=!1,t.addr="",t.size="",t.noInit=!1}))})),["on-chip","off-chip"].forEach((t=>{this.data.rom[t].forEach((t=>{t.isDef=!1,t.addr="",t.size="",t.isStartup=!1}))}))},onSave:function(){o.$emit("save")},onReset:function(){o.$emit("reset")},onStartupRomRadioChecked:function(t,e){const r=t;for(const a in this.data.rom[r]){const t=this.data.rom[r][a];a!=e&&t.isStartup&&(t.isStartup=!1)}this.data.rom[r][e].isStartup=!0;const i="on-chip"==t?"off-chip":"on-chip";for(const a of this.data.rom[i])a.isStartup&&(a.isStartup=!1)},verifyFormData:function(t){let e=0,r=0,i=!1;["on-chip","off-chip"].forEach((a=>{this.data[t][a].forEach((n=>{const o="on-chip"==a?`i${t}`:t,s=document.getElementById(`${o}-${n.id}-addr`),d=document.getElementById(`${o}-${n.id}-size`);if(void 0!=n.isStartup){const t=document.getElementById(`${o}-${n.id}-used`);n.isStartup&&!n.isDef?(t.style.borderColor="var(--vscode-inputValidation-errorBorder)",t.style.borderWidth="1px",t.style.borderStyle="dashed",i=!0):t.style.borderStyle="none"}n.isDef||n.isStartup?(r++,/^\s*((?:0x)?[0-9a-f]+|\d+)\s*$/i.test(n.addr)?s.style.borderStyle="none":(s.style.borderColor="var(--vscode-inputValidation-errorBorder)",s.style.borderWidth="1px",s.style.borderStyle="dashed",i=!0),/^\s*(?:0x)?[0-9a-f]+\s*$/i.test(n.size)?(d.style.borderStyle="none",e+=parseInt(n.size.trim(),16)):/^\s*\d+\s*$/i.test(n.size)?(d.style.borderStyle="none",e+=parseInt(n.size.trim())):(d.style.borderColor="var(--vscode-inputValidation-errorBorder)",d.style.borderWidth="1px",d.style.borderStyle="dashed",i=!0)):(s.style.borderStyle="none",d.style.borderStyle="none")}))}));const a=` ${(e/1024).toFixed(1)} KB (${e} Bytes)`;return"ram"==t?this.status.totalRamSize=a:this.status.totalRomSize=a,!i&&r>0}}},c=d,u=r(1001),f=(0,u.Z)(c,a,n,!1,null,null,null),l=f.exports,h=r(9168),m=r.n(h);let v,p;i.Z.config.productionTip=!1,i.Z.use(m(),{iconPack:"material",position:"bottom-right",duration:"1800",keepOnHover:!0});let _=!1,y=l.data();const g=acquireVsCodeApi();window.addEventListener("message",(t=>{if("string"==typeof t.data)switch(t.data){case"eide.mem-layout.status.done":i.Z.toasted.success("Successful !",{icon:"check"});break;case"eide.mem-layout.status.fail":i.Z.toasted.error("Failed !, Please check eide error log.",{icon:"error"});break;default:break}else _?(p=t.data,k(p.CURRENT)):(p=t.data,b(),S(),_=!0)})),document.addEventListener("keydown",(function(t){"s"==t.key.toLowerCase()&&t.ctrlKey&&(t.preventDefault(),x())})),g.postMessage("eide.mem-layout.launched");const z="[eide mem layout view] ";function S(){_||(_=!0,console.log(z+"start init and create page ..."),new i.Z({render:t=>t(l)}).$mount("#app"),v=l.methods.getInstance(),v.$on("save",(()=>x())),v.$on("reset",(()=>k())),console.log(z+"app inited done !"))}function b(){k(p.CURRENT),console.log(`${z}init data: `+JSON.stringify(y.data,void 0,2)),p.DEF&&(y.status.canReset=!0)}function x(){const t={RAM:[],ROM:[]};["on-chip","off-chip"].forEach((e=>{const r="ram",i=("on-chip"==e?`i${r}`:`${r}`).toUpperCase();y.data[r][e].forEach((e=>{const a=""==e.addr.trim()||""==e.size.trim();a||t[r.toUpperCase()].push({tag:i,id:e.id,mem:{startAddr:e.addr.trim(),size:e.size.trim()},isChecked:e.isDef,noInit:e.noInit})}))})),["on-chip","off-chip"].forEach((e=>{const r="rom",i=("on-chip"==e?`i${r}`:`${r}`).toUpperCase();y.data[r][e].forEach((e=>{const a=""==e.addr.trim()||""==e.size.trim();a||t[r.toUpperCase()].push({tag:i,id:e.id,mem:{startAddr:e.addr.trim(),size:e.size.trim()},isChecked:e.isDef,isStartup:e.isStartup})}))})),console.log(`${z}save data: `+JSON.stringify(t,void 0,2)),g.postMessage(t)}function k(t){_&&v.reInitData();const e=t||p.DEF;t||console.log(z+"reset data by default value.");for(const r of e.RAM){const t=y.data.ram["IRAM"==r.tag?"on-chip":"off-chip"][r.id-1];t.isDef=r.isChecked,t.addr=r.mem.startAddr,t.size=r.mem.size,t.noInit=r.noInit}for(const r of e.ROM){const t=y.data.rom["IROM"==r.tag?"on-chip":"off-chip"][r.id-1];t.isDef=r.isChecked,t.addr=r.mem.startAddr,t.size=r.mem.size,t.isStartup=r.isStartup}}}},e={};function r(i){var a=e[i];if(void 0!==a)return a.exports;var n=e[i]={exports:{}};return t[i].call(n.exports,n,n.exports,r),n.exports}r.m=t,function(){var t=[];r.O=function(e,i,a,n){if(!i){var o=1/0;for(u=0;u=n)&&Object.keys(r.O).every((function(t){return r.O[t](i[d])}))?i.splice(d--,1):(s=!1,n0&&t[u-1][2]>n;u--)t[u]=t[u-1];t[u]=[i,a,n]}}(),function(){r.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return r.d(e,{a:e}),e}}(),function(){r.d=function(t,e){for(var i in e)r.o(e,i)&&!r.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})}}(),function(){r.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"===typeof window)return window}}()}(),function(){r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)}}(),function(){var t={143:0};r.O.j=function(e){return 0===t[e]};var e=function(e,i){var a,n,o=i[0],s=i[1],d=i[2],c=0;if(o.some((function(e){return 0!==t[e]}))){for(a in s)r.o(s,a)&&(r.m[a]=s[a]);if(d)var u=d(r)}for(e&&e(i);c{this.data.ram[t].forEach((t=>{t.isDef=!1,t.addr="",t.size="",t.noInit=!1}))})),["on-chip","off-chip"].forEach((t=>{this.data.rom[t].forEach((t=>{t.isDef=!1,t.addr="",t.size="",t.isStartup=!1}))}))},onSave:function(){o.$emit("save")},onReset:function(){o.$emit("reset")},onStartupRomRadioChecked:function(t,e){const r=t;for(const a in this.data.rom[r]){const t=this.data.rom[r][a];a!=e&&t.isStartup&&(t.isStartup=!1)}this.data.rom[r][e].isStartup=!0;const i="on-chip"==t?"off-chip":"on-chip";for(const a of this.data.rom[i])a.isStartup&&(a.isStartup=!1)},verifyFormData:function(t){let e=0,r=0,i=!1;["on-chip","off-chip"].forEach((a=>{this.data[t][a].forEach((n=>{const o="on-chip"==a?`i${t}`:t,s=document.getElementById(`${o}-${n.id}-addr`),d=document.getElementById(`${o}-${n.id}-size`);if(void 0!=n.isStartup){const t=document.getElementById(`${o}-${n.id}-used`);n.isStartup&&!n.isDef?(t.style.borderColor="var(--vscode-inputValidation-errorBorder)",t.style.borderWidth="1px",t.style.borderStyle="dashed",i=!0):t.style.borderStyle="none"}n.isDef||n.isStartup?(r++,/^\s*((?:0x)?[0-9a-f]+|\d+)\s*$/i.test(n.addr)?s.style.borderStyle="none":(s.style.borderColor="var(--vscode-inputValidation-errorBorder)",s.style.borderWidth="1px",s.style.borderStyle="dashed",i=!0),/^\s*0x[0-9a-f]+\s*$/i.test(n.size)?(d.style.borderStyle="none",e+=parseInt(n.size.trim(),16)):/^\s*\d+\s*$/i.test(n.size)?(d.style.borderStyle="none",e+=parseInt(n.size.trim())):(d.style.borderColor="var(--vscode-inputValidation-errorBorder)",d.style.borderWidth="1px",d.style.borderStyle="dashed",i=!0)):(s.style.borderStyle="none",d.style.borderStyle="none")}))}));const a=` ${(e/1024).toFixed(1)} KB (${e} Bytes)`;return"ram"==t?this.status.totalRamSize=a:this.status.totalRomSize=a,!i&&r>0}}},c=d,u=r(1001),f=(0,u.Z)(c,a,n,!1,null,null,null),l=f.exports,h=r(9168),m=r.n(h);let v,p;i.Z.config.productionTip=!1,i.Z.use(m(),{iconPack:"material",position:"bottom-right",duration:"1800",keepOnHover:!0});let _=!1,y=l.data();const g=acquireVsCodeApi();window.addEventListener("message",(t=>{if("string"==typeof t.data)switch(t.data){case"eide.mem-layout.status.done":i.Z.toasted.success("Successful !",{icon:"check"});break;case"eide.mem-layout.status.fail":i.Z.toasted.error("Failed !, Please check eide error log.",{icon:"error"});break;default:break}else _?(p=t.data,k(p.CURRENT)):(p=t.data,b(),S(),_=!0)})),document.addEventListener("keydown",(function(t){"s"==t.key.toLowerCase()&&t.ctrlKey&&(t.preventDefault(),x())})),g.postMessage("eide.mem-layout.launched");const z="[eide mem layout view] ";function S(){_||(_=!0,console.log(z+"start init and create page ..."),new i.Z({render:t=>t(l)}).$mount("#app"),v=l.methods.getInstance(),v.$on("save",(()=>x())),v.$on("reset",(()=>k())),console.log(z+"app inited done !"))}function b(){k(p.CURRENT),console.log(`${z}init data: `+JSON.stringify(y.data,void 0,2)),p.DEF&&(y.status.canReset=!0)}function x(){const t={RAM:[],ROM:[]};["on-chip","off-chip"].forEach((e=>{const r="ram",i=("on-chip"==e?`i${r}`:`${r}`).toUpperCase();y.data[r][e].forEach((e=>{const a=""==e.addr.trim()||""==e.size.trim();a||t[r.toUpperCase()].push({tag:i,id:e.id,mem:{startAddr:e.addr.trim(),size:e.size.trim()},isChecked:e.isDef,noInit:e.noInit})}))})),["on-chip","off-chip"].forEach((e=>{const r="rom",i=("on-chip"==e?`i${r}`:`${r}`).toUpperCase();y.data[r][e].forEach((e=>{const a=""==e.addr.trim()||""==e.size.trim();a||t[r.toUpperCase()].push({tag:i,id:e.id,mem:{startAddr:e.addr.trim(),size:e.size.trim()},isChecked:e.isDef,isStartup:e.isStartup})}))})),console.log(`${z}save data: `+JSON.stringify(t,void 0,2)),g.postMessage(t)}function k(t){_&&v.reInitData();const e=t||p.DEF;t||console.log(z+"reset data by default value.");for(const r of e.RAM){const t=y.data.ram["IRAM"==r.tag?"on-chip":"off-chip"][r.id-1];t.isDef=r.isChecked,t.addr=r.mem.startAddr,t.size=r.mem.size,t.noInit=r.noInit}for(const r of e.ROM){const t=y.data.rom["IROM"==r.tag?"on-chip":"off-chip"][r.id-1];t.isDef=r.isChecked,t.addr=r.mem.startAddr,t.size=r.mem.size,t.isStartup=r.isStartup}}}},e={};function r(i){var a=e[i];if(void 0!==a)return a.exports;var n=e[i]={exports:{}};return t[i].call(n.exports,n,n.exports,r),n.exports}r.m=t,function(){var t=[];r.O=function(e,i,a,n){if(!i){var o=1/0;for(u=0;u=n)&&Object.keys(r.O).every((function(t){return r.O[t](i[d])}))?i.splice(d--,1):(s=!1,n0&&t[u-1][2]>n;u--)t[u]=t[u-1];t[u]=[i,a,n]}}(),function(){r.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return r.d(e,{a:e}),e}}(),function(){r.d=function(t,e){for(var i in e)r.o(e,i)&&!r.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})}}(),function(){r.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"===typeof window)return window}}()}(),function(){r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)}}(),function(){var t={143:0};r.O.j=function(e){return 0===t[e]};var e=function(e,i){var a,n,o=i[0],s=i[1],d=i[2],c=0;if(o.some((function(e){return 0!==t[e]}))){for(a in s)r.o(s,a)&&(r.m[a]=s[a]);if(d)var u=d(r)}for(e&&e(i);c', dasmFile.path]; + // https://interrupt.memfault.com/blog/gnu-binutils#new-feature-visualize-jumps + const binutilsVer = getGccBinutilsVersion(exeFile.dir, toolPrefix, 'objdump'); + if (binutilsVer && compareVersion(binutilsVer, '2.34') > 0) { + cmds = ['--visualize-jumps'].concat(cmds); + } } else if (toolchainName.startsWith('AC')) { // armcc exeFile = File.fromArray([prj.getToolchain().getToolchainDir().path, 'bin', `fromelf${exeSuffix()}`]); @@ -5124,6 +5131,11 @@ export class ProjectExplorer implements CustomConfigurationProvider { exeFile = File.fromArray([activePrj.getToolchain().getToolchainDir().path, 'bin', `${toolPrefix}objdump${exeSuffix()}`]); if (!exeFile.IsFile()) { throw Error(`Not found '${exeFile.name}' !`) } cmds = ['-S', '-l', objPath, '>', tmpFile.path]; + // https://interrupt.memfault.com/blog/gnu-binutils#new-feature-visualize-jumps + const binutilsVer = getGccBinutilsVersion(exeFile.dir, toolPrefix, 'objdump'); + if (binutilsVer && compareVersion(binutilsVer, '2.34') > 0) { + cmds = ['--visualize-jumps'].concat(cmds); + } } else if (toolchainName.startsWith('AC')) { // armcc exeFile = File.fromArray([activePrj.getToolchain().getToolchainDir().path, 'bin', `fromelf${exeSuffix()}`]); diff --git a/src/EIDEProjectModules.ts b/src/EIDEProjectModules.ts index ac9e87f8..b884eee6 100644 --- a/src/EIDEProjectModules.ts +++ b/src/EIDEProjectModules.ts @@ -672,6 +672,14 @@ export abstract class ArmBaseCompileConfigModel this._event.emit('dataChanged'); } + private parseIntNumber(str: string): number { + if (/^\s*0x/i.test(str) || /[a-f]/i.test(str)) { + return parseInt(str.replace('0X', ''), 16); + } else { + return parseInt(str); + } + } + private sortStorage(storageLayout: ARMStorageLayout): ARMStorageLayout { storageLayout.RAM = storageLayout.RAM.sort((a, b): number => { @@ -688,7 +696,7 @@ export abstract class ArmBaseCompileConfigModel return a.id - b.id; } - return parseInt(a.mem.startAddr, 16) < parseInt(b.mem.startAddr, 16) ? -1 : 1; + return this.parseIntNumber(a.mem.startAddr) < this.parseIntNumber(b.mem.startAddr) ? -1 : 1; }); let id = 1; @@ -712,7 +720,7 @@ export abstract class ArmBaseCompileConfigModel return a.id - b.id; } - return parseInt(a.mem.startAddr, 16) < parseInt(b.mem.startAddr, 16) ? -1 : 1; + return this.parseIntNumber(a.mem.startAddr) < this.parseIntNumber(b.mem.startAddr) ? -1 : 1; }); id = 1; diff --git a/src/KeilXmlParser.ts b/src/KeilXmlParser.ts index 9e423c99..0089a17b 100644 --- a/src/KeilXmlParser.ts +++ b/src/KeilXmlParser.ts @@ -778,7 +778,11 @@ class ARMParser extends KeilParser { } // default startUp index: 3 (2^3) - const index = Math.log2(parseInt(info.StupSel)); + let index = Math.log2(parseInt(info.StupSel) || 1); + if (index > 4) { + index = 4; + } + memInfo.ROM[index].isStartup = true; memInfo.RAM[0].noInit = info.NoZi1 !== '0'; diff --git a/src/OperationExplorer.ts b/src/OperationExplorer.ts index 1adba295..b6824721 100644 --- a/src/OperationExplorer.ts +++ b/src/OperationExplorer.ts @@ -211,25 +211,25 @@ export class OperationExplorer { iconPath: vscode.Uri.file(icoPath.path) }); - icoPath = resManager.GetIconByName('Import_16x.svg'); + icoPath = resManager.GetIconByName('OpenFileFromProject_16x.svg'); this.provider.AddData({ - label: view_str$import_project, + label: open_project, command: { - title: view_str$import_project, - command: '_cl.eide.Operation.Import' + title: open_project, + command: '_cl.eide.Operation.Open' }, - tooltip: import_project_hit, + tooltip: open_project_hit, iconPath: vscode.Uri.file(icoPath.path) }); - icoPath = resManager.GetIconByName('OpenFileFromProject_16x.svg'); + icoPath = resManager.GetIconByName('Import_16x.svg'); this.provider.AddData({ - label: open_project, + label: view_str$import_project, command: { - title: open_project, - command: '_cl.eide.Operation.Open' + title: view_str$import_project, + command: '_cl.eide.Operation.Import' }, - tooltip: open_project_hit, + tooltip: import_project_hit, iconPath: vscode.Uri.file(icoPath.path) }); @@ -1541,54 +1541,6 @@ export class OperationExplorer { this.locked = false; } - - async onOpenSerialPortMonitor(port?: string) { - - const resManager = ResManager.GetInstance(); - const option = SettingManager.GetInstance().getPortSerialMonitorOptions(); - - try { - const portName: string | undefined = port || option.defaultPort; - if (!portName) { - return; - } - - const paramList: string[] = [ - '-n', portName, - '-b', option.baudRate.toString(), - '-d', option.dataBits.toString(), - '-p', option.parity.toString(), - '-s', option.stopBits.toString(), - '-l', option.useUnixCRLF ? '1' : '0' - ]; - - let terminal: vscode.Terminal; - const terminalName = portName; - - const cIndex = vscode.window.terminals.findIndex((term) => { return term.name === terminalName; }); - const cmdPath = resManager.getCMDPath(); - - // close exist terminal - if (cIndex !== -1) { vscode.window.terminals[cIndex].dispose(); } - - const opts: vscode.TerminalOptions = { - name: terminalName, - shellPath: cmdPath, - env: process.env - }; - - terminal = vscode.window.createTerminal(opts); - terminal.show(true); - - /* send command */ - const exeName = resManager.getSerialPortExe().noSuffixName; - const cmd = paramList.join(' '); - terminal.sendText(`${exeName} ${cmd}`); - - } catch (error) { - GlobalEvent.emit('error', error); - } - } } interface UtilToolPickItem extends vscode.QuickPickItem { diff --git a/src/ProblemMatcher.ts b/src/ProblemMatcher.ts index 4a00b661..bdf52628 100644 --- a/src/ProblemMatcher.ts +++ b/src/ProblemMatcher.ts @@ -18,24 +18,53 @@ function parseLogLines(file: File): string[] { try { + const fileLines = file.Read().split(/\r\n|\n/); + + // + // cc logs + // let logStarted = false; let logEnd = false; - file.Read().split(/\r\n|\n/).forEach((line, idx) => { + fileLines.forEach((line, idx) => { if (logEnd) return; - if (logStarted) { + if (!logStarted) { + if (line.startsWith('>>> cc')) { + logStarted = true; + } + } else { if (line.startsWith('>>>')) { logEnd = true; } else { ccLogLines.push(line); } - } else { - if (line.startsWith('>>> cc')) { + } + }); + + // + // ld logs + // + logStarted = false; + logEnd = false; + + fileLines.forEach((line, idx) => { + + if (logEnd) + return; + + if (!logStarted) { + if (line.startsWith('>>> ld')) { logStarted = true; } + } else { + if (line.startsWith('>>>')) { + logEnd = true; + } else { + ccLogLines.push(line); + } } }); diff --git a/src/ResInstaller.ts b/src/ResInstaller.ts index 741c53e8..54a8993b 100644 --- a/src/ResInstaller.ts +++ b/src/ResInstaller.ts @@ -453,8 +453,8 @@ export class ResInstaller { if (toolInfo.getDrvInstaller) { let drvExePath = toolInfo.getDrvInstaller(); if (drvExePath) { - drvExePath = outDir.path + File.sep + drvExePath; - utility.runShellCommand(`install driver`, `start "${resourceName}" /MAX "${drvExePath}"`, undefined, true); + const ok = await utility.execInternalCommand(`start "win32 driver: ${resourceName}" ".\\${drvExePath}"`, outDir.path); + GlobalEvent.emit('globalLog.append', `\n=== install win32 driver '${drvExePath}' ${ok ? 'done' : 'failed'} ===\n\n`); } } diff --git a/src/SettingManager.ts b/src/SettingManager.ts index 10b1ae46..8e0bc685 100644 --- a/src/SettingManager.ts +++ b/src/SettingManager.ts @@ -250,38 +250,8 @@ export class SettingManager { } } - //-------------------------- Serialport -------------------------------- - - isShowSerialportStatusbar(): boolean { - return this.getConfiguration().get('SerialPortMonitor.ShowStatusBar') || false; - } - - getPortSerialMonitorOptions(): PortSerialOption { - return { - defaultPort: this.getConfiguration().get('SerialPortMonitor.DefaultPort') || 'null', - baudRate: this.getConfiguration().get('SerialPortMonitor.BaudRate') || 9600, - dataBits: this.getConfiguration().get('SerialPortMonitor.DataBits') || 8, - parity: this.getConfiguration().get('SerialPortMonitor.Parity') || 0, - stopBits: this.getConfiguration().get('SerialPortMonitor.StopBits') || 0, - useUnixCRLF: this.getConfiguration().get('SerialPortMonitor.useUnixLF') || false, - }; - } - - getSerialBaudrate(): number { - return this.getConfiguration().get('SerialPortMonitor.BaudRate') || 115200 - } - - setSerialBaudrate(baudrate: number, global?: boolean) { - const region = global ? vscode.ConfigurationTarget.Global : vscode.ConfigurationTarget.Workspace; - return this.getConfiguration().update('SerialPortMonitor.BaudRate', baudrate, region); - } - //--------------------- Global Option ------------------------ - /* isEnableAutoUpdateEideBinaries(): boolean { - return this.getConfiguration().get('Option.AutoUpdateEideBinaries') || false; - } */ - getForceIncludeList(): string[] { return this.getConfiguration().get('Cpptools.ForceInclude') || []; } diff --git a/src/StringTable.ts b/src/StringTable.ts index 8c36eb37..b572c040 100644 --- a/src/StringTable.ts +++ b/src/StringTable.ts @@ -29,8 +29,25 @@ export enum LanguageIndexs { English } -const langIndex: number = /zh-cn/.test(vscode.env.language) - ? LanguageIndexs.Chinese : LanguageIndexs.English; +let langIndex: number = /zh-cn/.test(vscode.env.language) + ? LanguageIndexs.Chinese + : LanguageIndexs.English; + +try { + const langType = vscode.workspace.getConfiguration('EIDE').get('DisplayLanguage'); + switch (langType) { + case 'zh-cn': + langIndex = LanguageIndexs.Chinese; + break; + case 'en-us': + langIndex = LanguageIndexs.English; + break; + default: + break; + } +} catch (error) { + // nothing todo +} export function getLocalLanguageType(): LanguageIndexs { return langIndex; diff --git a/src/extension.ts b/src/extension.ts index 5624f4b0..d1bd8760 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -125,7 +125,6 @@ export async function activate(context: vscode.ExtensionContext) { subscriptions.push(vscode.commands.registerCommand('_cl.eide.Operation.Import', () => operationExplorer.OnImportProject())); subscriptions.push(vscode.commands.registerCommand('_cl.eide.Operation.SetToolchainPath', () => operationExplorer.OnSetToolchainPath())); subscriptions.push(vscode.commands.registerCommand('_cl.eide.Operation.SetupUtilTools', () => operationExplorer.setupUtilTools())); - subscriptions.push(vscode.commands.registerCommand('_cl.eide.Operation.OpenSerialPortMonitor', (port) => operationExplorer.onOpenSerialPortMonitor(port))); subscriptions.push(vscode.commands.registerCommand('_cl.eide.Operation.openSettings', () => SettingManager.jumpToSettings('@ext:cl.eide'))); // operations user cmds diff --git a/src/utility.ts b/src/utility.ts index 8223a260..6f0091e4 100644 --- a/src/utility.ts +++ b/src/utility.ts @@ -42,6 +42,31 @@ import { ExeCmd } from '../lib/node-utility/Executable'; import { GlobalEvent } from './GlobalEvents'; import { SettingManager } from './SettingManager'; +export function getGccBinutilsVersion(gccBinDirPath: string, toolprefix?: string, toolname?: string): string | undefined { + + // example output: + // GNU objdump (GNU Arm Embedded Toolchain 10-2020-q4-major) 2.35.1.20201028 + // GNU readelf (GNU Tools for Arm Embedded Processors 8-2019-q3-update) 2.32.0.20190703 + + const exeName = toolname || 'objdump'; + + try { + const lines = child_process.execFileSync(`${toolprefix || ''}${exeName}`, ['-v'], { cwd: gccBinDirPath, encoding: 'ascii' }).split(/\r\n|\n/); + for (const line of lines) { + if (line.trim().startsWith(`GNU ${exeName}`)) { + const m = /(\d+\.\d+\.\d+)(?:\.\d+)*$/.exec(line); + if (m && m.length > 1) { + return m[1].trim(); + } + } + } + } catch (error) { + GlobalEvent.emit('msg', ExceptionToMessage(error, 'Hidden')); + } + + return undefined; +} + export function sortPaths(pathList: string[], sep?: string): string[] { let plist: string[][] = pathList.map(p => p.split(/\\|\//));