From 1328be60b7c9e1a688dc5d20d42fe16880b7ab61 Mon Sep 17 00:00:00 2001 From: sunbeam Date: Tue, 17 May 2022 16:34:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- default.aproj | 4 ++ main.aardio | 26 +++++---- user/CanThread.aardio | 14 ++++- user/Diag31code.aardio | 21 ++++++- user/Diag34code.aardio | 25 ++++++++ user/Diag36code.aardio | 64 ++++++++++++++++++++ user/Diag37code.aardio | 9 +++ user/DiagBootcode.aardio | 120 +++++++++++++++++++++++++++++++++++++- user/S19Decode.aardio | 122 +++++++++++++++++++++++++++++++++++++++ 9 files changed, 385 insertions(+), 20 deletions(-) create mode 100644 user/Diag34code.aardio create mode 100644 user/Diag36code.aardio create mode 100644 user/Diag37code.aardio create mode 100644 user/S19Decode.aardio diff --git a/default.aproj b/default.aproj index e1b1a89..3145b61 100644 --- a/default.aproj +++ b/default.aproj @@ -15,5 +15,9 @@ + + + + diff --git a/main.aardio b/main.aardio index ea60dac..64dc100 100644 --- a/main.aardio +++ b/main.aardio @@ -3,16 +3,16 @@ import win.ui; mainForm = win.form(text="CAN_Bootloader";right=599;bottom=399;border="dialog frame";max=false) mainForm.add( btnConnect={cls="button";text="连接";left=204;top=64;right=289;bottom=90;z=4}; -btnFlash={cls="button";text="开始刷写";left=152;top=180;right=272;bottom=205;z=10}; +btnFlash={cls="button";text="开始刷写";left=152;top=180;right=272;bottom=205;z=9}; btnFresh={cls="button";text="刷新";left=204;top=28;right=288;bottom=54;z=2}; -btnOpen={cls="button";text="打开文件";left=31;top=180;right=131;bottom=206;z=9}; -btnReadF186={cls="button";text="读取当前会话";left=19;top=293;right=118;bottom=321;z=14}; -btnReadHw={cls="button";text="读取硬件版本号";left=17;top=263;right=116;bottom=291;z=13}; -btnReadSw={cls="button";text="读取软件版本号";left=17;top=233;right=116;bottom=261;z=11}; -btnTest={cls="button";text="测试";left=173;top=355;right=272;bottom=383;z=12}; +btnOpen={cls="button";text="打开文件";left=31;top=180;right=131;bottom=206;z=8}; +btnReadF186={cls="button";text="读取当前会话";left=19;top=293;right=118;bottom=321;z=13}; +btnReadHw={cls="button";text="读取硬件版本号";left=17;top=263;right=116;bottom=291;z=12}; +btnReadSw={cls="button";text="读取软件版本号";left=17;top=233;right=116;bottom=261;z=10}; +btnTest={cls="button";text="测试";left=173;top=355;right=272;bottom=383;z=11}; cbbChannel={cls="combobox";left=58;top=64;right=191;bottom=90;edge=1;items={};mode="dropdown";z=3}; cbbDev={cls="combobox";left=58;top=27;right=191;bottom=53;edge=1;items={};mode="dropdown";z=1}; -edFile={cls="edit";left=27;top=141;right=281;bottom=165;edge=1;readonly=1;z=8}; +edFile={cls="richedit";left=8;top=114;right=288;bottom=170;border=1;disabled=1;edge=1;multiline=1;wrap=1;z=14}; edit={cls="edit";left=296;top=8;right=582;bottom=383;edge=1;multiline=1;z=5}; static={cls="static";text="设备";left=1;top=28;right=61;bottom=52;align="center";center=1;transparent=1;z=6}; static2={cls="static";text="通道";left=1;top=66;right=61;bottom=90;align="center";center=1;transparent=1;z=7} @@ -22,12 +22,10 @@ static2={cls="static";text="通道";left=1;top=66;right=61;bottom=90;align="cent import win; import usb2canfd; - Display = function(str){ mainForm.edit.print(tostring(time()) + " " + str); } - - +mainForm.edFile.wrap = true; CANHw = usb2canfd.USB2CANHW(); var ret = CANHw.LoadDll(); @@ -77,7 +75,9 @@ var listener = thread.command(); listener.$Display = function(str){ Display(str); } - +listener.$ShowPath = function(str){ + mainForm.edFile.text = str; +} //线程函数 var CanThread = function(){ @@ -123,6 +123,10 @@ mainForm.btnFlash.oncommand = function(id,event){ DiagBootReq(); } +mainForm.btnOpen.oncommand = function(id,event){ + ::PostThreadMessage(thrdId,104,0,0)//自定义消息-打开文件 +} + thrdHandle,thrdId = thread.create( CanThread ) diff --git a/user/CanThread.aardio b/user/CanThread.aardio index 2b68a25..384e2f8 100644 --- a/user/CanThread.aardio +++ b/user/CanThread.aardio @@ -17,15 +17,22 @@ FuncLoopMsg = function(msg){ case 100 {//刷新硬件 FuncFreshHw(); } - case 101 { + case 101 {//连接硬件 FuncConnect(msg.wParam,msg.lParam); } - case 102 { + case 102 {//开始boot FuncStartBoot(); } - case 103 { + case 103 {//停止boot FuncStopBoot(); } + case 104 {//打开s19文件 + FuncDisplay("打开文件"); + var ret = FuncOpenS19File(); + if(ret != null){ + thread.command.$ShowPath(ret); + } + } case 110 {//readDID FuncReadDID(msg.wParam); } @@ -84,6 +91,7 @@ loadcodex("\user\Diag27code.aardio"); loadcodex("\user\Diag2Ecode.aardio"); loadcodex("\user\DiagBootcode.aardio"); +loadcodex("\user\S19Decode.aardio"); RespState = 0; FuncDiagPro = function(diagmsg){ diff --git a/user/Diag31code.aardio b/user/Diag31code.aardio index 3c84d48..6ff17cb 100644 --- a/user/Diag31code.aardio +++ b/user/Diag31code.aardio @@ -1,14 +1,29 @@ +FuncReq31EraseFlash = function(addr,len){ + var data = {0xff,0x00,0x44,addr>>24,addr>>16,addr>>8,addr,len>>24,len>>16,len>>8,len}; + FuncReq31(data); +} + //发送 FuncReq31 = function(data){ - if(#data > 6){//多帧 - + if(#data > 5){//多帧 + var txdata = {0x10,2+#data,0x31,0x01,data[1],data[2],data[3],data[4]}; + CANHw.SendMsg(DiagReqID,txdata); + FuncPushPackage(DiagReqID,table.slice(data,5)); } + else { + var txdata = {2+#data,0x31,0x01,0, 0,0,0,0}; + for(i=1;#data;1){ + txdata[5+i] = data[i]; + } + CANHw.SendMsg(DiagReqID,txdata); + } + } //接收 -FuncDiag28Pro = function(data){ +FuncDiag31Pro = function(data){ //console.dumpJson(data); select(data[1]) { case 1 { diff --git a/user/Diag34code.aardio b/user/Diag34code.aardio new file mode 100644 index 0000000..37d3d8b --- /dev/null +++ b/user/Diag34code.aardio @@ -0,0 +1,25 @@ +//发送 +FuncReq34 = function(addr,len){ + var data = {0x44,addr>>24,addr>>16,addr>>8,addr,len>>24,len>>16,len>>8,len}; + var txdata = {0x10,2+#data,0x34,0x00,data[1],data[2],data[3],data[4]}; + CANHw.SendMsg(DiagReqID,txdata); + FuncPushPackage(DiagReqID,table.slice(data,5)); + +} +//接收 +FuncDiag34Pro = function(data){ + //console.dumpJson(data); + select(data[1]) { + case 1 { + FuncDisplay("使能接收,禁能发送") + } + case 2 { + FuncDisplay("28 - TDB02") + } + case 3 { + FuncDisplay("28 - TDB03") + } + else { + } + } +} \ No newline at end of file diff --git a/user/Diag36code.aardio b/user/Diag36code.aardio new file mode 100644 index 0000000..5f9b965 --- /dev/null +++ b/user/Diag36code.aardio @@ -0,0 +1,64 @@ + +// +var blocknum=1; +var flag_sendend = false; +var flag_sending = false; +var alldata = {}; +FuncStartSendBlock = function(data){ + blocknum = 0x01; + flag_sendend = false; + flag_sending = true; + alldata = data; + /* + if(alldata>0x400){ + FuncReq36(blocknum,table.slice(alldata,1,0x400)); + alldata = table.slice(alldata,0x401,) + } + else { + FuncReq36(blocknum,alldata); + alldata = {}; + } + */ +} +FuncStopSendBlock = function(data){ + blocknum = 0x01; + flag_sendend = false; + flag_sending = false; +} +FuncGetSendStatus = function(){ + return flag_sendend; +} +FuncSendNextBlock = function(){ + if(alldata>0x400){ + FuncReq36(blocknum,table.slice(alldata,1,0x400)); + alldata = table.slice(alldata,0x401,) + } + else { + FuncReq36(blocknum,alldata); + alldata = {}; + flag_sendend = true; + } + blocknum += 1; +} + + +//发送 +FuncReq36 = function(num,data){ + len = #data+2; + var txdata = {0x10+(len>>8),len&0xff,0x36,num&0xff,data[1],data[2],data[3],data[4]}; + CANHw.SendMsg(DiagReqID,txdata); + FuncPushPackage(DiagReqID,table.slice(data,5)); + +} +//接收 +FuncDiag36Pro = function(data){ + //console.dumpJson(data); + /* + if(data[1] == blocknum){ + blocknum += 1; + if(flag_sending == true){ + FuncSendNextBlock(); + } + } + */ +} \ No newline at end of file diff --git a/user/Diag37code.aardio b/user/Diag37code.aardio new file mode 100644 index 0000000..debfc9d --- /dev/null +++ b/user/Diag37code.aardio @@ -0,0 +1,9 @@ +//发送 +FuncReq37 = function(){ + var txdata = {0x1,0x37,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA}; + CANHw.SendMsg(DiagReqID,txdata); +} +//接收 +FuncDiag37Pro = function(data){ + +} \ No newline at end of file diff --git a/user/DiagBootcode.aardio b/user/DiagBootcode.aardio index 3d5aff0..cce190e 100644 --- a/user/DiagBootcode.aardio +++ b/user/DiagBootcode.aardio @@ -5,13 +5,13 @@ var bootcount = 0; var sendstate = 0; FuncWait = function(sid){ if(RespState == (sid + 0x40)){//正响应 + //bootcount = 0; return 0; } errsid,errnrc = FuncGetNrc(); FuncClrNrc(); if(errsid == sid){ if(errnrc == 0x78){//等待 - bootcount = 0; return 0xff; } @@ -65,7 +65,88 @@ BCD_Conv = function(num){ return (num/10)*16 + (num%10); } +var sendblockstate = 0; +var alldata = {}; +var blocknum = 1; +FuncSendBlockInit = function(){ + alldata = FuncGetAllData(); + blocknum = 1; + if(alldata != null){ + blocknum = 1; + FuncStartSendBlock(alldata[blocknum].["data"]) + } + +} +var FuncSendBlockApp_sendflag = 0 +FuncSendBlockApp = function(){ + select(sendblockstate) { + case 0{ + if(FuncSendBlockApp_sendflag == 0){ + FuncReq34(alldata[blocknum].["address"],#alldata[blocknum].["data"]); + FuncSendBlockApp_sendflag = 1; + RespState = 0; + bootcount = 0; + } + else { + if(FuncWait(0x34) == 0){ + FuncSendBlockApp_sendflag = 0; + sendblockstate += 1; + } + } + + } + case 1 { + FuncStartSendBlock(alldata[blocknum].["data"]);//初始化 + FuncSendBlockApp_sendflag = 0; + sendblockstate += 1; + } + case 2 { + if(FuncSendBlockApp_sendflag == 0){ + FuncSendNextBlock(); + FuncSendBlockApp_sendflag = 1; + RespState = 0; + bootcount = 0; + } + else { + if(FuncWait(0x36) == 0){ + FuncSendBlockApp_sendflag = 0; + if(FuncGetSendStatus() == true){//所有块发送完成 + sendblockstate += 1; + } + } + } + } + case 3 { + if(FuncSendBlockApp_sendflag == 0){ + FuncReq37(); + FuncSendBlockApp_sendflag = 1; + RespState = 0; + bootcount = 0; + } + else { + if(FuncWait(0x37) == 0){ + FuncSendBlockApp_sendflag = 0; + sendblockstate += 1; + } + } + } + else { + if(blocknum < #alldata){ + blocknum += 1; + sendblockstate = 0; + } + else { + //所有数据发送完成 + return 0; + } + + } + } + return 1; +} + +//boot总流程 FuncBootSeq = function(){ select(bootstate) { case 0 { @@ -161,7 +242,7 @@ FuncBootSeq = function(){ } case 9 { if(sendstate == 0){ - FuncDIDWriteStr(0xf198,"0123456789abcdef1234"); + FuncDIDWriteStr(0xf198,"0123456789abcdef1234");//写入repair_shopcode FuncClearState(); } else { @@ -171,7 +252,7 @@ FuncBootSeq = function(){ } case 10 { - if(sendstate == 0){ + if(sendstate == 0){//写入installation_date var year1 = BCD_Conv(time.now().year/100); var year2 = BCD_Conv(time.now().year%100); var month = BCD_Conv(time.now().month); @@ -185,6 +266,39 @@ FuncBootSeq = function(){ nextstate(ret); } } + case 11 { + if(sendstate == 0){//擦除flash + FuncReq31EraseFlash(0x00FE0000,0x00019FE0);// + FuncClearState(); + + } + else { + var ret = FuncWait(0x31); + nextstate(ret); + } + } + case 12 { + if(sendstate == 0){//发送数据 + FuncSendBlockInit(); + FuncClearState(); + + } + else { + var ret = FuncSendBlockApp(); + nextstate(ret); + } + } + case 13 { + if(sendstate == 0){//发送数据 + FuncSendBlockInit(); + FuncClearState(); + } + else { + var ret = FuncSendBlockApp(); + nextstate(ret); + + } + } else { FuncDisplay("刷写完成") diff --git a/user/S19Decode.aardio b/user/S19Decode.aardio new file mode 100644 index 0000000..220d880 --- /dev/null +++ b/user/S19Decode.aardio @@ -0,0 +1,122 @@ + +var fileinfo = ""; +var FlashData = {}; + +FuncGetAllData = function(){ + return FlashData; +} +FuncGetFileInfo = function(){ + return fileinfo; +} + +FuncOpenS19File = function(path){ + import fsys.dlg; + if(path == null){ + path = fsys.dlg.open('S19文件|*.sx;*.s19;*.srec|所有文件|*.*||',,,winform); + } + + if(io.exist( path )){ + //winform.editPath.text = path; + var readbuf = string.load(path); + + readbuf = string.split(readbuf,'\r\n'); + //console.dumpJson(readbuf); + var block = null; + FlashData = {}; + for(i=1;#readbuf;1){ + if(#readbuf[i] == 0){ + continue; + } + var str = readbuf[i]; + var data = ""; + var addr = 0; + var len = 0; + select(string.slice(str,1,2)) { + case "S0"{ + //S0为文件信息 + var fileinfobuf = string.slice(str,9,-3);//取出文件信息 + fileinfo = "file info:"+string.unhex(fileinfobuf,"")//解码 + fileinfo = string.replace(fileinfo,"\z"," ");//替换空字符 + FuncDisplay(fileinfo)//显示 + continue; + } + case "S1"{ + len = tonumber(string.slice(str,3,4),16) + addr = tonumber(string.slice(str,5,8),16) + data = string.slice(str,9,-3) + } + case "S2"{ + len = tonumber(string.slice(str,3,4),16) + addr = tonumber(string.slice(str,5,10),16) + data = string.slice(str,11,-3) + + } + case "S3"{ + len = tonumber(string.slice(str,3,4),16) + addr = tonumber(string.slice(str,5,12),16) + data = string.slice(str,13,-3) + } + else { + continue; + } + } + if(block == null){ + //空表,第一次进入 + block = {}; + block["address"] = addr; + block["data"] = {}; + } + else { + //非空表 + if(addr == (block["address"]+#block["data"])){ + //连续,无动作 + } + else { + //不同块,新建块 + FlashData[#FlashData+1]={"address" = block["address"];"data" = block["data"];} + block["address"] = addr; + block["data"] = {}; + //不连续,判断是否填充 + /*不填充,所以注释了 + if((addr & 0xfff800) == ((block["address"]+#block["data"])&0xfff800)){ + //同一个块,填充FF + for(i=1;addr - (block["address"]+#block["data"]);1){ + table.push(block["data"],0xff); + } + + } + else { + FlashData[#FlashData+1]={"address" = block["address"];"data" = block["data"];} + block["address"] = addr; + block["data"] = {}; + } + */ + + } + + } + + data = string.unhex(data,"") + for(i=1;#data;1){ + var bytedata = string.unpack(data,i) + table.push(block["data"],bytedata) + } + + + } + + if(block != null){ + table.push(FlashData,block) + //console.dumpTable(block["data"]); + } + + + + } + //blocknum = 1; + + return path; +} + + +