V0.1_20220518_OK

This commit is contained in:
sunbeam 2022-05-18 10:43:03 +08:00
parent dce7399998
commit 2a5370e6e8
10 changed files with 146 additions and 88 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/dist
/.build

View File

@ -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){

View File

@ -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;

View File

@ -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]);

View File

@ -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 {
}

View File

@ -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 {
}

View File

@ -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){

View File

@ -12,7 +12,7 @@ FuncDiag85Pro = function(data){
//console.dumpJson(data);
select(data[1]) {
case 0x01 {
FuncDisplay("DTC - 01")
FuncDisplay("DTC开启")
}
case 0x02 {
FuncDisplay("DTC禁能")

View File

@ -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);
}

View File

@ -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;