diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..baaf1ed --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/dist +/.build diff --git a/main.aardio b/main.aardio index 64dc100..26e11c1 100644 --- a/main.aardio +++ b/main.aardio @@ -3,24 +3,35 @@ 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=9}; +btnFlash={cls="button";text="开始刷写";left=147;top=198;right=246;bottom=226;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=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}; +btnOpen={cls="button";text="打开文件";left=32;top=197;right=131;bottom=225;z=8}; +btnReadF186={cls="button";text="读取当前会话";left=32;top=236;right=131;bottom=264;z=13}; +btnReadHw={cls="button";text="读取硬件版本号";left=147;top=276;right=246;bottom=304;z=12}; +btnReadSw={cls="button";text="读取软件版本号";left=32;top=276;right=131;bottom=304;z=10}; +btnTest={cls="button";text="停止";left=147;top=237;right=246;bottom=265;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="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}; +edFile={cls="richedit";left=8;top=131;right=288;bottom=187;border=1;disabled=1;edge=1;multiline=1;wrap=1;z=14}; +edit={cls="edit";left=296;top=8;right=598;bottom=383;autovscroll=false;edge=1;multiline=1;vscroll=1;z=5}; +progress={cls="progress";left=16;top=349;right=279;bottom=377;edge=1;max=100;min=0;z=15}; 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} +static2={cls="static";text="通道";left=1;top=66;right=61;bottom=90;align="center";center=1;transparent=1;z=7}; +static3={cls="static";text="刷写进度";left=17;top=328;right=70;bottom=348;transparent=1;z=16}; +static4={cls="static";text="烧录APP";left=13;top=108;right=85;bottom=132;center=1;transparent=1;z=17}; +static5={cls="static";text="V0.1_20220518";left=452;top=383;right=596;bottom=399;align="right";center=1;transparent=1;z=18} ) /*}}*/ import win; import usb2canfd; +import win.timer; + +var boot_count = 0; +timer_bootcount = win.timer(mainForm,100); +timer_bootcount.onTimer = function(){ + boot_count++; +} Display = function(str){ mainForm.edit.print(tostring(time()) + " " + str); @@ -72,19 +83,40 @@ mainForm.btnConnect.oncommand = function(id,event){ //CAN通讯线程 import thread.command; var listener = thread.command(); +var flag_connected=0; listener.$Display = function(str){ Display(str); } listener.$ShowPath = function(str){ mainForm.edFile.text = str; } +listener.$SetProgress = function(pos){ + if(pos >= 0 && pos <= 100){ + mainForm.progress.pos = pos; + } +} + +listener.$Connected = function(){ + mainForm.btnConnect.disabled = true; + mainForm.btnFresh.disabled = true; + mainForm.cbbDev.disabled = true; + mainForm.cbbChannel.disabled = true; + flag_connected = 1; +} +listener.$SendEnd = function(isSuccess){ + timer_bootcount.disable(); + if(isSuccess == true){ + Display("刷写成功,用时 " + boot_count/10 + " S") + } +} + //线程函数 var CanThread = function(){ //线程函数内部要添加自已的import语句 import win; import console; - console.log("线程开始运行") + //console.log("线程开始运行") loadcodex("\user\CanThread.aardio");//加载线程程序 //在子线程启动消息循环 win.loopMessage(FuncLoopMsg) @@ -120,7 +152,21 @@ mainForm.btnTest.oncommand = function(id,event){ } mainForm.btnFlash.oncommand = function(id,event){ + if(io.exist(mainForm.edFile.text) == null){ + Display("请打开文件"); + return; + } + if(flag_connected == 0){ + Display("请连接设备"); + return; + } + mainForm.edit.text = ""; + Display("开始刷写流程"); + timer_bootcount.enable(); + boot_count = 0; DiagBootReq(); + + } mainForm.btnOpen.oncommand = function(id,event){ diff --git a/user/CanThread.aardio b/user/CanThread.aardio index 633b167..cd10a36 100644 --- a/user/CanThread.aardio +++ b/user/CanThread.aardio @@ -71,6 +71,7 @@ FuncConnect = function(dev,chn){ var ret = CANHw.OpenDevice(dev,chn); if(ret == 0){ FuncDisplay("连接成功"); + thread.command.$Connected(); } else { FuncDisplay("连接失败"); @@ -115,8 +116,13 @@ FuncDiagPro = function(diagmsg){ FuncDiag27Pro(table.slice(diagmsg.data,1,diagmsg.len)) } case 0x74 { + FuncDiag34Pro(table.slice(diagmsg.data,1,diagmsg.len)) + } + case 0x71 { + FuncDiag31Pro(table.slice(diagmsg.data,1,diagmsg.len)) } case 0x76 { + FuncDiag36Pro(table.slice(diagmsg.data,1,diagmsg.len)) } case 0x68 { FuncDiag28Pro(table.slice(diagmsg.data,1,diagmsg.len)) @@ -162,7 +168,7 @@ FuncSendPackage = function(){ data[i+1] = table.remove(Packdata); } CANHw.SendMsg(PackID,data); - sleep(1); + sleep(0.3); PackNext += 1; if(PackNext > 0x2f){ PackNext = 0x20; diff --git a/user/Diag27code.aardio b/user/Diag27code.aardio index 571e950..796032f 100644 --- a/user/Diag27code.aardio +++ b/user/Diag27code.aardio @@ -27,10 +27,10 @@ FuncDiag27Pro = function(data){ //console.dumpJson(data); select(data[1]) { case 1,3,5,7,9,11 { - var str = "收到种子 "; + var str = "收到种子"; for(i=1;4;1){ SecuretySeed[i] = data[i+1]; - str += tostring(SecuretySeed[i],16); + str += " " + tostring(SecuretySeed[i],16); } FuncDisplay(str) SecuretyKey = GenerateKeyEx(SecuretySeed,data[1]); diff --git a/user/Diag28code.aardio b/user/Diag28code.aardio index 453b493..a5a6d54 100644 --- a/user/Diag28code.aardio +++ b/user/Diag28code.aardio @@ -1,24 +1,25 @@ //发送 FuncReq28 = function(num1,num2){ - if(num1 >= 1 && num1 <= 3){ - var data = {0x03,0x28,num1,num2,0,0,0,0}; - var ret = CANHw.SendMsg(DiagGloableID,data); - } + var txdata = {0x03,0x28,num1,num2,0,0,0,0}; + var ret = CANHw.SendMsg(DiagGloableID,txdata); } //接收 FuncDiag28Pro = function(data){ //console.dumpJson(data); select(data[1]) { + case 0 { + FuncDisplay("使能接收发送") + } case 1 { - FuncDisplay("使能接收,禁能发送") + FuncDisplay("使能接收,禁止发送") } case 2 { - FuncDisplay("28 - TDB02") + FuncDisplay("禁止接收,使能发送") } case 3 { - FuncDisplay("28 - TDB03") + FuncDisplay("禁止接收发送") } else { } diff --git a/user/Diag31code.aardio b/user/Diag31code.aardio index d3e9b54..6fd6d75 100644 --- a/user/Diag31code.aardio +++ b/user/Diag31code.aardio @@ -1,5 +1,6 @@ FuncReq31EraseFlash = function(addr,len){ + FuncDisplay("开始擦除数据") var data = {0xff,0x00,0x44,addr>>24,addr>>16,addr>>8,addr,len>>24,len>>16,len>>8,len}; FuncReq31(data); } @@ -36,15 +37,19 @@ FuncReq31 = function(data){ //接收 FuncDiag31Pro = function(data){ //console.dumpJson(data); - select(data[1]) { - case 1 { - FuncDisplay("使能接收,禁能发送") + var rid = (data[2]<<8) + data[3]; + select(rid) { + case 0xFF00 { + FuncDisplay("擦除成功") } - case 2 { - FuncDisplay("28 - TDB02") + case 0x0202 { + FuncDisplay("校验成功") } - case 3 { - FuncDisplay("28 - TDB03") + case 0xFF01 { + FuncDisplay("检查标志成功") + } + case 0xF518 { + FuncDisplay("数字签名错误") } else { } diff --git a/user/Diag36code.aardio b/user/Diag36code.aardio index 4f6b533..848dcd4 100644 --- a/user/Diag36code.aardio +++ b/user/Diag36code.aardio @@ -9,16 +9,6 @@ FuncStartSendBlock = function(data){ 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; @@ -59,7 +49,6 @@ FuncReq36 = function(num,data){ CANHw.SendMsg(DiagReqID,txdata); } - } //接收 FuncDiag36Pro = function(data){ diff --git a/user/Diag85code.aardio b/user/Diag85code.aardio index d9f7940..73f156b 100644 --- a/user/Diag85code.aardio +++ b/user/Diag85code.aardio @@ -12,7 +12,7 @@ FuncDiag85Pro = function(data){ //console.dumpJson(data); select(data[1]) { case 0x01 { - FuncDisplay("DTC - 01") + FuncDisplay("DTC开启") } case 0x02 { FuncDisplay("DTC禁能") diff --git a/user/DiagBootcode.aardio b/user/DiagBootcode.aardio index f722521..ab3ca43 100644 --- a/user/DiagBootcode.aardio +++ b/user/DiagBootcode.aardio @@ -18,6 +18,7 @@ FuncWait = function(sid){ else { FuncDisplay("刷写错误"); boottimer.disable(); + thread.command.$SendEnd(false); return 1; //负响应 } @@ -25,11 +26,13 @@ FuncWait = function(sid){ if(stopflag == 1){ FuncDisplay("停止"); boottimer.disable(); + thread.command.$SendEnd(false); return 2;//停止命令 } bootcount += 1; if(bootcount >= 400){ FuncDisplay("超时 " + tostring(sid,16)); + thread.command.$SendEnd(false); boottimer.disable(); return 3;//超时 } @@ -51,31 +54,40 @@ FuncInitBootState = function(){ } -nextstate = function(val){ - if(val == 0){ - bootstate += 1; - sendstate = 0; - } -} + BCD_Conv = function(num){ if(num > 99){ return 0; } - return (num/10)*16 + (num%10); + var ret = 0; + ret += math.floor(num/10) * 16; + ret += num%10; + return ret; } var sendblockstate = 0; var alldata = {}; var blocknum = 1; +var alldata_blocknum = 0; +var block_sended = 0; FuncSendBlockInit = function(){ + var len = 0; alldata = FuncGetAllData(); blocknum = 1; - if(alldata != null){ - blocknum = 1; - FuncStartSendBlock(alldata[blocknum]["data"]) + for(i=1;#alldata;1){ + len += math.ceil(#alldata[i]["data"] / 0x400) + } + alldata_blocknum = len + 19; + block_sended = 0; + sendblockstate = 0; +} +nextstate = function(val){ + if(val == 0){ + bootstate += 1; + sendstate = 0; + block_sended += 1; } - } var FuncSendBlockApp_sendflag = 0 FuncSendBlockApp = function(){ @@ -104,6 +116,7 @@ FuncSendBlockApp = function(){ if(FuncSendBlockApp_sendflag == 0){ FuncSendNextBlock(); FuncSendBlockApp_sendflag = 1; + block_sended += 1; RespState = 0; bootcount = 0; } @@ -145,20 +158,16 @@ FuncSendBlockApp = function(){ return 1; } - +var delaycount = 0; //boot总流程 +var boottime = 0; FuncBootSeq = function(){ + boottime++; select(bootstate) { case 0 { - //读取当前会话 - /* - var bootdata = FuncGetAllData(); - if(#bootdata < 1){ - FuncDisplay("请打开文件"); - boottimer.disable(); - return 0; - }*/ + boottime = 1; if(sendstate == 0){ + FuncSendBlockInit(); FuncReadDID(0xF186); FuncClearState(); } @@ -267,7 +276,7 @@ FuncBootSeq = function(){ var day = BCD_Conv(time.now().day); FuncReq2E(0XF199,{year1,year2,month,day}) FuncClearState(); - console.log("写入installation_date") + //console.log("写入installation_date") } else { var ret = FuncWait(0x2E); @@ -287,7 +296,8 @@ FuncBootSeq = function(){ } case 12 { if(sendstate == 0){//发送数据 - FuncSendBlockInit(); + //FuncSendBlockInit(); + FuncDisplay("开始发送app数据"); FuncClearState(); } @@ -318,8 +328,8 @@ FuncBootSeq = function(){ } case 15 { if(sendstate == 0){//复位 + FuncClearState(); FuncReq11(0x01); - FuncClearState(); } else { var ret = FuncWait(0x11); @@ -328,6 +338,20 @@ FuncBootSeq = function(){ } case 16 { + if(sendstate == 0){//等待复位完成 + delaycount = 0; + FuncClearState(); + } + else { + delaycount += 1; + if(delaycount > 100){ + nextstate(0);//延时1S + } + + } + } + + case 17 { if(sendstate == 0){ FuncReq10(true,0x03);//进入扩展会话 FuncClearState(); @@ -337,7 +361,7 @@ FuncBootSeq = function(){ nextstate(ret); } } - case 17 { + case 18 { if(sendstate == 0){ FuncReq28(0x00,0x01);//开启发送 FuncClearState(); @@ -347,7 +371,7 @@ FuncBootSeq = function(){ nextstate(ret); } } - case 18 { + case 19 { if(sendstate == 0){ FuncReq85(0x01);//开启DTC FuncClearState(); @@ -357,7 +381,7 @@ FuncBootSeq = function(){ nextstate(ret); } } - case 19 { + case 20 { if(sendstate == 0){ FuncReq10(true,0x01);//进入默认会话 FuncClearState(); @@ -368,8 +392,11 @@ FuncBootSeq = function(){ } } else { - FuncDisplay("刷写完成") + thread.command.$SendEnd(true); + //FuncDisplay("刷写完成,用时 " + boottime/100 + " S") boottimer.disable(); } } + + thread.command.$SetProgress(block_sended/alldata_blocknum * 100); } \ No newline at end of file diff --git a/user/S19Decode.aardio b/user/S19Decode.aardio index 220d880..4cc3031 100644 --- a/user/S19Decode.aardio +++ b/user/S19Decode.aardio @@ -9,6 +9,7 @@ FuncGetFileInfo = function(){ return fileinfo; } + FuncOpenS19File = function(path){ import fsys.dlg; if(path == null){ @@ -73,24 +74,9 @@ FuncOpenS19File = function(path){ } 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"] = {}; - } - */ + FlashData[#FlashData+1]={"address" = block["address"];"data" = block["data"];} + block["address"] = addr; + block["data"] = {}; } @@ -107,11 +93,7 @@ FuncOpenS19File = function(path){ if(block != null){ table.push(FlashData,block) - //console.dumpTable(block["data"]); } - - - } //blocknum = 1;