V0.1_20220518_OK
This commit is contained in:
parent
dce7399998
commit
2a5370e6e8
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
/dist
|
||||
/.build
|
66
main.aardio
66
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){
|
||||
|
@ -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;
|
||||
|
@ -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]);
|
||||
|
@ -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 {
|
||||
}
|
||||
|
@ -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 {
|
||||
}
|
||||
|
@ -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){
|
||||
|
@ -12,7 +12,7 @@ FuncDiag85Pro = function(data){
|
||||
//console.dumpJson(data);
|
||||
select(data[1]) {
|
||||
case 0x01 {
|
||||
FuncDisplay("DTC - 01")
|
||||
FuncDisplay("DTC开启")
|
||||
}
|
||||
case 0x02 {
|
||||
FuncDisplay("DTC禁能")
|
||||
|
@ -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);
|
||||
}
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user