var bootstate = 0; var bootcount = 0; var sendstate = 0; var senddataid = 0; var repeat_times = 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; } else { FuncDisplay("刷写错误 步骤" + bootstate); FuncDisplay("Flashing error steps" + bootstate++" "); boottimer.disable(); thread.command.$SendEnd(false); return 1; //负响应 } } if(stopflag == 1){ FuncDisplay("停止"); FuncDisplay("Stop "); boottimer.disable(); thread.command.$SendEnd(false); return 2;//停止命令 } bootcount += 1; if(bootcount >= 400){ FuncDisplay("步骤" + bootstate + "超时 " + tostring(sid,16)); FuncDisplay("Step" + bootstate + " Timeout " + tostring(sid,16)++'\n'); thread.command.$SendEnd(false); boottimer.disable(); return 3;//超时 } if(sid==0x2e && repeat_times < 5 && bootcount > 100){ repeat_times++; bootcount = 0; repeat_times++; sendstate = 0; } return 0xff; } FuncStopBoot = function(){ stopflag = 1; } FuncClearState = function(){ RespState = 0; bootcount = 0; sendstate = 1; } FuncInitBootState = function(id){ bootstate = 0; RespState = 0; bootcount = 0; sendstate = 0; senddataid = id; repeat_times = 0; } BCD_Conv = function(num){ if(num > 99){ return 0; } 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; var sendFlashDriverState = 0; var FuncSendBlockApp_sendflag = 0; FuncSendBlockInit = function(id){ var len = 0; alldata = FuncGetAllData(id); blocknum = 1; if(alldata == null){ FuncDisplay("错误:空数据"); FuncDisplay("Error: Empty data "); alldata_blocknum = 0; sendblockstate = 0xff; return 1; } for(i=1;#alldata;1){ len += math.ceil(#alldata[i]["data"] / 0x400) } alldata_blocknum = len; block_sended = 0; sendblockstate = 0; FuncSendBlockApp_sendflag = 0; return 0; } nextstate = function(val){ if(val == 0){ bootstate += 1; sendstate = 0; block_sended += 1; } } FuncSendBlockApp = function(){ select(sendblockstate) { case 0{ if(FuncSendBlockApp_sendflag == 0){ FuncDisplay("请求下载"); FuncDisplay("Request to download "); 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; FuncDisplay("发送App数据中..."); FuncDisplay("Sending App Data... "); } case 2 { if(FuncSendBlockApp_sendflag == 0){ sleep(20); FuncSendNextBlock(); FuncSendBlockApp_sendflag = 1; block_sended += 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 { FuncDisplay("所有App数据发送完成"); FuncDisplay("All app data has been sent "); return 0; } } } return 1; } FuncSendBlockFlashDriver = function(){ select(sendFlashDriverState) { case 0 { } case 1 { } case 2 { } case 3 { } else { } } } var err_version = 0; var delaycount = 0; //boot总流程 var boottime = 0; FuncBootSeq = function(){ boottime++; select(bootstate) { case 0 { boottime = 1; err_version = 0; nextstate(0); delaycount = 0; if(DiagReqID == 0x720){ FuncDisplay("LeftVibrationFault = " ++ LeftVibrationFault); FuncDisplay("LeftTouchFault = " ++ LeftTouchFault); FuncDisplay("LeftPressSensorFault = " ++ LeftPressSensorFault); FuncDisplay("LeftCommonFault = " ++ LeftCommonFault); } else { FuncDisplay("RightVibrationFault = " ++ RightVibrationFault); FuncDisplay("RightTouchFault = " ++ RightTouchFault); FuncDisplay("RightPressSensorFault = " ++ RightPressSensorFault); FuncDisplay("RightCommonFault = " ++ RightCommonFault); } FuncDisplay('\n'); /* if(sendstate == 0){ //FuncSendBlockInit(0); FuncReadDID(0xF186); FuncClearState(); } else { var ret = FuncWait(0x22); nextstate(ret); } */ } case 1 { //nextstate(0); if(sendstate == 0){ FuncDisplay("读取版本"); FuncDisplay("Read version "); FuncReadDID(0xF195);//读取软件版本 FuncClearState(); } else { //var ret = FuncWait(0x22); //nextstate(0); delaycount++; if(delaycount > 5){ nextstate(0); delaycount = 0; } } } case 2 { if(sendstate == 0){ FuncReadDID(0xF193);//读取硬件版本 FuncClearState(); } else { //var ret = FuncWait(0x22); //nextstate(0); delaycount++; if(delaycount > 5){ nextstate(0); delaycount = 0; } } } case 3 { //FuncDisplay('step3:'); //FuncDisplay(thrdTable.DIDdata); if(thrdTable.DIDdata != null){ if(string.cmp(thrdTable.DIDdata,"SW0302",6) == 0){ err_version = 0; } else { err_version = 1; } } else { err_version = 1; } if(err_version == 1){ FuncDisplay("版本号错误"); FuncDisplay('wrong version \n'); boottimer.disable(); thread.command.$SendEnd(false); } nextstate(0); /* if(sendstate == 0){ FuncDisplay("进入扩展会话"); FuncReq10(false,0x03);//进入扩展会话 FuncClearState(); } else { var ret = FuncWait(0x10); nextstate(0); } */ } case 4 { nextstate(0); /* if(sendstate == 0){ FuncReq85(0x02);//关闭DTC FuncClearState(); } else { var ret = FuncWait(0x85); nextstate(0);//跳过 } */ } case 5 { delaycount++; if(delaycount > 10){ nextstate(0); delaycount = 0; } /* if(sendstate == 0){ FuncReq28(0x01,0x01);//禁止发送 FuncClearState(); } else { var ret = FuncWait(0x28); nextstate(0);//跳过 } */ } case 6 { if(sendstate == 0){ FuncDisplay("进入编程会话"); FuncDisplay("Enter programming session "); FuncReq10(false,0x02);//进入编程会话 FuncClearState(); } else { delaycount++; if(delaycount > 10){ //nextstate(0); //delaycount = 0; var ret = FuncWait(0x10); nextstate(ret); } } } case 7 { if(sendstate == 0){ FuncDisplay("等待解锁"); FuncDisplay("Waiting to unlock "); FuncReq27(0x03);//解密 FuncClearState(); } else { var ret = FuncWait(0x27); nextstate(ret); } } case 8 { if(sendstate == 0){ //FuncReq27(02);//发送key FuncClearState(); } else { //var ret = FuncWait(0x27); var ret = FuncDiag27GetState(); nextstate(ret);// } } case 9 { nextstate(0); /* if(sendstate == 0){ FuncClearState(); FuncDIDWriteStr(0xf198,"Daming ");//写入repair_shopcode } else { //var ret = FuncWait(0x2E); nextstate(0);// } */ } case 10 { nextstate(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); var day = BCD_Conv(time.now().day); FuncReq2E(0XF199,{year1,year2,month,day}) FuncClearState(); //console.log("写入installation_date") } else { //var ret = FuncWait(0x2E); nextstate(0); } */ } case 11 { if(sendstate == 0){//CheckLogicBlock FuncDisplay("擦除APP"); FuncDisplay("Erase APP "); FuncReq31EraseFlash(0x18000,0x20000); FuncClearState(); } else { var ret = FuncWait(0x31); //console.log("ret = " , ret); nextstate(ret); delaycount = 0; } } case 12 { delaycount++; if(delaycount > 10){ nextstate(0);//延时100mS delaycount = 0; } } case 13 { nextstate(0); } case 14 { if(sendstate == 0){//发送数据 //console.log("开始发送App数据 "); FuncSendBlockInit(senddataid); //FuncDisplay("开始发送App数据"); FuncClearState(); } else { var ret = FuncSendBlockApp(); nextstate(ret); } } case 15 { if(sendstate == 0){//CheckLogicBlock FuncDisplay("CRC校验"); FuncDisplay("CRC check "); var crc = FuncGetFlashCRC(senddataid); FuncReq31CheckLogicBlock(crc); FuncClearState(); } else { var ret = FuncWait(0x31); nextstate(ret); } } case 16 { if(sendstate == 0){////Programming Dependencies FuncDisplay("检查标志"); FuncDisplay("Check Mark "); FuncReq31CheckPD(); FuncClearState(); } else { var ret = FuncWait(0x31); nextstate(ret); } } case 17 { if(sendstate == 0){//复位 FuncDisplay("复位"); FuncDisplay("Reset "); FuncClearState(); FuncReq11(0x01); } else { var ret = FuncWait(0x11); nextstate(ret); } } case 18 { if(sendstate == 0){//等待复位完成 delaycount = 0; FuncClearState(); } else { delaycount += 1; if(delaycount > 100){ nextstate(0);//延时1S } } } case 19 { //nextstate(0); if(sendstate == 0){ FuncReq10(false,0x03);//进入扩展会话 FuncClearState(); } else { var ret = FuncWait(0x10); nextstate(ret); } } case 20 { if(sendstate == 0){ FuncDisplay("写入刷写信息"); FuncDisplay("Write flashing information "); FuncClearState(); FuncDIDWriteStr(0xf198,"DM_Reworker ");//写入repair_shopcode LEN=16 } else { var ret = FuncWait(0x2E); nextstate(ret);// } } case 21 { 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); var day = BCD_Conv(time.now().day); FuncReq2E(0XF199,{year1,year2,month,day}) FuncClearState(); //console.log("写入installation_date") } else { var ret = FuncWait(0x2E); nextstate(ret); } //nextstate(0); /* if(sendstate == 0){ FuncReq85(0x01);//开启DTC FuncClearState(); } else { var ret = FuncWait(0x85); nextstate(ret); } */ } case 22 { //nextstate(0); if(sendstate == 0){ FuncReq10(false,0x01);//进入默认会话 FuncClearState(); } else { var ret = FuncWait(0x10); nextstate(0); } } case 23 { if(sendstate == 0){ FuncDisplay("读取版本"); FuncDisplay('Read version\n'); FuncReadDID(0xF195);//读取软件版本 delaycount = 0; FuncClearState(); } else { delaycount++; if(delaycount > 5){ nextstate(0); delaycount = 0; } } } case 24 { if(sendstate == 0){ FuncDisplay("读取软件日期"); FuncDisplay('Read software date \n'); FuncReadDID(0xF18A);//读取软件版本 FuncClearState(); } else { delaycount++; if(delaycount > 5){ nextstate(0); delaycount = 0; } } } else { thread.command.$SendEnd(true); //FuncDisplay("刷写完成,用时 " + boottime/100 + " S") boottimer.disable(); } } if(alldata_blocknum != 0){ thread.command.$SetProgress(block_sended/alldata_blocknum * 100); } }