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;
+}
+
+
+