From aed398775a553d72eafc5efbb2dec5bceffeec8a Mon Sep 17 00:00:00 2001 From: Martin <13588957250@163.com> Date: Fri, 16 Aug 2024 11:05:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- default.aproj | 3 +- dlg/诊断子窗口.aardio | 67 -------- lib/usb2canfd.aardio | 79 ++++++++- main.aardio | 358 ++++++++++++++++++--------------------- user/CanThread.aardio | 125 ++++++++++---- user/Diag27code.aardio | 6 +- user/DiagBootcode.aardio | 30 ++-- user/S19Decode.aardio | 11 +- 8 files changed, 355 insertions(+), 324 deletions(-) delete mode 100644 dlg/诊断子窗口.aardio diff --git a/default.aproj b/default.aproj index 8dba383..56e1483 100644 --- a/default.aproj +++ b/default.aproj @@ -3,10 +3,11 @@ + + - diff --git a/dlg/诊断子窗口.aardio b/dlg/诊断子窗口.aardio deleted file mode 100644 index 54a0352..0000000 --- a/dlg/诊断子窗口.aardio +++ /dev/null @@ -1,67 +0,0 @@ -import win.ui; -/*DSG{{*/ -var winform = win.form(text="诊断读取";right=679;bottom=319;border="thin";max=false;mode="popup") -winform.add( -btnDID_1701={cls="button";text="电机当前位置霍尔数";left=36;top=162;right=163;bottom=193;z=5}; -btnDID_1702={cls="button";text="软止点位置霍尔数";left=36;top=203;right=163;bottom=234;z=6}; -btnDID_1706={cls="button";text="软止点学习状态";left=178;top=40;right=305;bottom=71;z=7}; -btnDID_1707={cls="button";text="座椅电机电流";left=178;top=80;right=305;bottom=111;z=8}; -btnDID_1708={cls="button";text="模块输入信号状态";left=178;top=121;right=305;bottom=152;z=9}; -btnDID_1709={cls="button";text="模块输出信号状态";left=178;top=162;right=305;bottom=193;z=11}; -btnDID_170B={cls="button";text="系统供电电压";left=178;top=203;right=305;bottom=234;z=10}; -btnDID_F187={cls="button";text="车辆备用零部件编号";left=36;top=40;right=163;bottom=71;z=2}; -btnDID_F18A={cls="button";text="供应商公司名称代码";left=36;top=80;right=163;bottom=111;z=3}; -btnDID_F197={cls="button";text="ECU 系统名称";left=36;top=121;right=163;bottom=152;z=4}; -groupbox={cls="groupbox";text="DID";left=16;top=12;right=328;bottom=260;edge=1;z=1}; -groupbox2={cls="groupbox";text="DTC";left=343;top=12;right=655;bottom=260;edge=1;z=12} -) -/*}}*/ - -winform.btnDID_F187.oncommand = function(id,event){ - DiagReadDID(0xF187); -} - -winform.btnDID_F18A.oncommand = function(id,event){ - DiagReadDID(0xF18A); -} - -winform.btnDID_F197.oncommand = function(id,event){ - DiagReadDID(0xF197); -} - -winform.btnDID_1701.oncommand = function(id,event){ - DiagReadDID(0x1701); -} - -winform.btnDID_1702.oncommand = function(id,event){ - DiagReadDID(0x1702); -} - -winform.btnDID_1706.oncommand = function(id,event){ - DiagReadDID(0x1706); -} - -winform.btnDID_1707.oncommand = function(id,event){ - DiagReadDID(0x1707); -} - -winform.btnDID_1708.oncommand = function(id,event){ - DiagReadDID(0x1708); -} - -winform.btnDID_1709.oncommand = function(id,event){ - DiagReadDID(0x1709); -} - -winform.btnDID_170B.oncommand = function(id,event){ - DiagReadDID(0x170B); -} - -winform.onClose = function(hwnd,message,wParam,lParam){ - winform.show(false); - return 0; -} - -winform.show(); -win.loopMessage(); -return winform; \ No newline at end of file diff --git a/lib/usb2canfd.aardio b/lib/usb2canfd.aardio index f5db3cf..a5d8758 100644 --- a/lib/usb2canfd.aardio +++ b/lib/usb2canfd.aardio @@ -55,6 +55,25 @@ namespace usb2canfd{ BYTE CAN_TXFP; //发送优先级管理,0-标识符决定,1-发送请求顺序决定 } + class CAN_FILTER_CONFIG{ + ctor( /*输入构造函数所需要的参数*/ ){ + + }; + type=me; + /*对象的所有成员必须用分号分隔*/ + BYTE Enable; //使能该过滤器,1-使能,0-禁止 + BYTE FilterIndex; //过滤器索引号,取值范围为0到13 + BYTE FilterMode; //过滤器模式,0-屏蔽位模式,1-标识符列表模式 + BYTE ExtFrame; //过滤的帧类型标志,为1 代表要过滤的为扩展帧,为0 代表要过滤的为标准帧。 + INT ID_Std_Ext; //验收码ID + INT ID_IDE; //验收码IDE + INT ID_RTR; //验收码RTR + INT MASK_Std_Ext; //屏蔽码ID,该项只有在过滤器模式为屏蔽位模式时有用 + INT MASK_IDE; //屏蔽码IDE,该项只有在过滤器模式为屏蔽位模式时有用 + INT MASK_RTR; //屏蔽码RTR,该项只有在过滤器模式为屏蔽位模式时有用 + } + + //CANfd信息帧的数据类型定义 class CANFD_MSG{ ctor( /*输入构造函数所需要的参数*/ ){ @@ -137,7 +156,7 @@ namespace usb2canfd{ //加载DLL LoadDll = function(){ try{ - DllHandle = ..raw.loadDll("USB2XXX.dll") + DllHandle = ..raw.loadDll("\USB2XXX.dll") } catch(err) { @@ -191,6 +210,30 @@ namespace usb2canfd{ return AvailableHW; } + SetFilter = function(index){ + CANFilter = ..usb2canfd.CAN_FILTER_CONFIG(); + CANFilter.FilterIndex = 0; + CANFilter.Enable = 1; + CANFilter.ExtFrame = 0; //需要过滤接收的帧为标准帧 + CANFilter.FilterMode = 1;//标识符列表模式 + CANFilter.ID_IDE = 0; //接收到的数据帧IDE必须为1,也就是必须为扩展帧数据 + CANFilter.ID_RTR = 0; //接收到的帧类型必须为数据帧 + CANFilter.ID_Std_Ext = 0x620;//接收到的帧ID必须等于CANFilter.ID_Std_Ext设置的值 + var ret = DllHandle.CAN_Filter_Init(AvailableHW[index].hLINHW,0,CANFilter); + + CANFilter.FilterIndex = 1; + CANFilter.ID_Std_Ext = 0x610; + var ret = DllHandle.CAN_Filter_Init(AvailableHW[index].hLINHW,0,CANFilter); + + + for(i=2;13;1){ + CANFilter.FilterIndex = i; + CANFilter.Enable = 0; + DllHandle.CAN_Filter_Init(AvailableHW[index].hLINHW,0,CANFilter); + } + + } + //打开设备,包括初始化通道 OpenDevice = function(index,channel,canfd){ if(index > HwNum) @@ -227,7 +270,7 @@ namespace usb2canfd{ canconfig.CAN_Mode = 0x80;//0-正常模式 1-环回模式 0x80终端电阻 canconfig.CAN_ABOM = 0;//禁止自动离线 - canconfig.CAN_NART = 1;//禁止报文重传 + canconfig.CAN_NART = 0;//禁止报文重传 canconfig.CAN_RFLM = 0;//FIFO满之后覆盖旧报文 canconfig.CAN_TXFP = 1;//发送请求决定发送顺序 //配置波特率,波特率 = 42M/(BRP*(SJW+BS1+BS2)) @@ -237,6 +280,7 @@ namespace usb2canfd{ canconfig.CAN_SJW = 2; ret = DllHandle.CAN_Init(AvailableHW[index].hLINHW,channel,canconfig); //console.log("init ret = " + ret); + this.SetFilter(index); } canfd_connected = canfd; @@ -349,14 +393,22 @@ namespace usb2canfd{ else { //CAN do{ - var msgbuf = ..usb2canfd.CAN_MSG(); - ret = DllHandle.CAN_GetMsgWithSize(Hwconnected,CANIndex,msgbuf,1); + //raw.convertArray(raw.sizeof(..usb2canfd.CAN_MSG()) + var msgbuf = {}; + for(i=1;10;1){ + //msgbuf.push(new ..usb2canfd.CAN_MS()) + var temp = ..usb2canfd.CAN_MSG() + ..table.push(msgbuf,temp); + } + + //var msgbuf = ..raw.toarray(10,"struct",..usb2canfd.CAN_MS); + ret = DllHandle.CAN_GetMsgWithSize(Hwconnected,CANIndex,msgbuf[1],1); if(ret == 1){ var data = {}; - for(i=1;msgbuf.DataLen;1){ - data[i] = msgbuf.Data[i]; + for(i=1;msgbuf[1].DataLen;1){ + data[i] = msgbuf[1].Data[i]; } - var msg = {"id"=msgbuf.ID;"data"=data;};// + var msg = {"id"=msgbuf[1].ID;"data"=data;};// ..table.push(retdata,msg); } }while(ret > 0) @@ -388,6 +440,19 @@ namespace usb2canfd{ return ret,2,res_data; } + SetPower = function(state){ + var ret = DllHandle.LIN_EX_CtrlPowerOut(Hwconnected,state); + return ret; + } + + GetPower = function(){ + var buf = ..raw.buffer(10); + var ret = DllHandle.LIN_EX_GetVbatValue(Hwconnected,buf); + + return ret,buf; + } + + } diff --git a/main.aardio b/main.aardio index 3dd6f1c..aae1657 100644 --- a/main.aardio +++ b/main.aardio @@ -1,33 +1,18 @@ +import fonts.fontAwesome; import win.ui; /*DSG{{*/ mainForm = win.form(text="CAN_Bootloader";right=699;bottom=465;border="dialog frame";max=false) mainForm.add( -btnConnect={cls="button";text="连接";left=204;top=64;right=289;bottom=90;z=4}; -btnDiag1001={cls="button";text="默认会话";left=98;top=229;right=190;bottom=260;z=23}; -btnDiag1002={cls="button";text="boot会话";left=192;top=229;right=284;bottom=260;z=22}; -btnDiag1003={cls="button";text="扩展会话";left=286;top=229;right=378;bottom=260;z=21}; -btnFlash={cls="button";text="开始刷写";left=276;top=368;right=375;bottom=396;z=9}; -btnFresh={cls="button";text="刷新";left=204;top=28;right=288;bottom=54;z=2}; -btnOpen={cls="button";text="打开文件";left=272;top=101;right=371;bottom=129;z=8}; -btnReadF186={cls="button";text="读取当前会话";left=4;top=229;right=96;bottom=260;z=13}; -btnReadF198={cls="button";text="读取F198";left=286;top=261;right=378;bottom=289;z=19}; -btnReadF199={cls="button";text="读取F199";left=192;top=261;right=284;bottom=289;z=20}; -btnReadHw={cls="button";text="硬件版本号";left=98;top=261;right=190;bottom=289;z=12}; -btnReadSw={cls="button";text="软件版本号";left=4;top=261;right=96;bottom=289;z=10}; -btnTest={cls="button";text="停止";left=277;top=400;right=376;bottom=428;z=11}; -button={cls="button";text="点亮";left=6;top=304;right=94;bottom=332;z=26}; -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=131;right=371;bottom=209;border=1;disabled=1;edge=1;multiline=1;wrap=1;z=14}; -edit={cls="edit";left=390;top=19;right=692;bottom=401;autovscroll=false;edge=1;multiline=1;vscroll=1;z=5}; -progress={cls="progress";left=389;top=435;right=689;bottom=463;edge=1;max=100;min=0;z=15}; -radiobutton={cls="radiobutton";text="左板";left=277;top=310;right=365;bottom=329;checked=1;z=24}; -radiobutton2={cls="radiobutton";text="右板";left=277;top=336;right=365;bottom=355;z=25}; -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}; -static3={cls="static";text="刷写进度";left=389;top=408;right=442;bottom=428;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.5_20230401";left=545;top=1;right=689;bottom=17;align="right";center=1;notify=1;transparent=1;z=18} +btnFlashLeft={cls="button";text="左侧刷写";left=30;top=129;right=168;bottom=243;z=2}; +btnFlashRight={cls="button";text="右侧刷写";left=181;top=131;right=319;bottom=245;z=7}; +btnStopBoot={cls="button";text="停止";left=29;top=272;right=319;bottom=346;z=3}; +edit={cls="edit";left=361;top=19;right=692;bottom=401;autovscroll=false;edge=1;multiline=1;vscroll=1;z=1}; +plus={cls="plus";text="等待刷写";left=33;top=380;right=318;bottom=434;bgcolor=12639424;z=10}; +progress={cls="progress";left=361;top=435;right=689;bottom=463;edge=1;max=100;min=0;z=4}; +static={cls="static";text='\uF127';left=43;top=30;right=114;bottom=98;align="center";center=1;color=255;font=LOGFONT(h=-56;name='FontAwesome');transparent=1;z=8}; +static2={cls="static";text="设备未连接,请先连接设备";left=126;top=42;right=326;bottom=91;transparent=1;z=9}; +static3={cls="static";text="刷写进度";left=361;top=410;right=414;bottom=430;transparent=1;z=5}; +static5={cls="static";text="V0.1_20240711";left=545;top=1;right=689;bottom=17;align="right";center=1;notify=1;transparent=1;z=6} ) /*}}*/ @@ -42,15 +27,7 @@ Display = function(str){//显示日志 nowtime.format="%H:%M:%S"; mainForm.edit.print(tostring(nowtime) + " " + str); } -//遍历目录 -//import console; -/* -import fsys.fileInfo; -info = fsys.fileInfo("C:\Users\fcb19\Desktop\dll\libusb-1.0.dll"); -console.log(info.writeTime); -execute("pause") -raw.loadDll("C:\Users\fcb19\Desktop\dll\libusb-1.0.dll"); -*/ + CANHw = usb2canfd.USB2CANHW();//尝试加载CAN dll var ret = CANHw.LoadDll(); if(ret == 0){ @@ -61,42 +38,9 @@ else { } -//初始化界面 -mainForm.cbbChannel.add("通道1"); -mainForm.cbbChannel.add("通道2"); -mainForm.cbbChannel.selIndex = 1 -//刷新按键 -mainForm.btnFresh.oncommand = function(id,event){ - mainForm.cbbDev.clear();//清空下拉框,防止反复刷新叠加 - var hwnum = CANHw.FlashHw();//获取硬件数量 - if(hwnum == 0){ - mainForm.cbbDev.text = "未找到硬件" - } - else { - var allhw = CANHw.GetAvailableHW(); - for(i=1;#allhw;1){ - mainForm.cbbDev.add(allhw[i].name); - } - } - mainForm.cbbDev.selIndex = 1 - ::PostThreadMessage(thrdId,100,0,0)//自定义消息 -} -mainForm.btnConnect.oncommand = function(id,event){ - var canfd_check = 0x80;//mainForm.checkbox.checked?0x80:0x00; - ::PostThreadMessage(thrdId,101,mainForm.cbbDev.selIndex,(mainForm.cbbChannel.selIndex - 1)|canfd_check)//自定义消息 - /* - var ret = CANHw.OpenDevice(mainForm.cbbDev.selIndex,mainForm.cbbChannel.selIndex - 1);//通道为0和1 - if(ret == 0){ - Display("连接成功"); - } - else { - Display("连接失败"); - } - */ -} //CAN通讯线程 import thread.command; @@ -106,11 +50,11 @@ listener.$Display = function(str){ Display(str); } listener.$ShowPath = function(str){ - mainForm.edFile.text = str; + //mainForm.edFile.text = str; } listener.$ShowFlashDrvPath = function(str){ - mainForm.edFile2.text = str; + //mainForm.edFile2.text = str; } listener.$SetProgress = function(pos){ if(pos >= 0 && pos <= 100){ @@ -119,11 +63,8 @@ listener.$SetProgress = function(pos){ } listener.$Connected = function(){ - mainForm.btnConnect.disabled = true; - mainForm.btnFresh.disabled = true; - mainForm.cbbDev.disabled = true; - mainForm.cbbChannel.disabled = true; - flag_connected = 1; + Display("设备连接成功"); + thrdTable.设备连接状态 = 1; } listener.$SendEnd = function(isSuccess){ //timer_bootcount.disable(); @@ -131,161 +72,186 @@ listener.$SendEnd = function(isSuccess){ bootstate = false; if(isSuccess == true){ Display("刷写成功,用时 " + usetime + " S") + mainForm.plus.text = "刷写完成"; + //mainForm.plus.bgcolor = 0x32CD32; + mainForm.plus.background = 0xFF32CD32; } + else { + Display("刷写失败"); + mainForm.plus.text = "刷写失败"; + //mainForm.plus.bgcolor = 0x2200E3; + mainForm.plus.background = 0xFFE30022; + } + } - +import thread.table; +thrdTable = thread.table("多线程共享数据"); +thrdTable.设备连接状态 = 0; +thrdTable.设备 = {}; +thrdTable.test = "123" +thrdTable["文件加载状态"] = false; +thrdTable["电源电压"] = 0; //线程函数 var CanThread = function(){ //线程函数内部要添加自已的import语句 import win; import console; + import thread.table; + thrdTable = thread.table("多线程共享数据"); //console.log("线程开始运行") + //console.log(t_thrdTable.test); loadcodex("\user\CanThread.aardio");//加载线程程序 + //在子线程启动消息循环 win.loopMessage(FuncLoopMsg) } -DiagReadDID = function(did){ - ::PostThreadMessage(thrdId,110,did,0)//自定义消息 -} -var Diag10Req = function(num){ - ::PostThreadMessage(thrdId,111,num,0)//自定义消息 -} -var DiagBootReq = function(){ - ::PostThreadMessage(thrdId,102,0,0)//自定义消息 + +var DiagBootReq = function(id){ + ::PostThreadMessage(thrdId,102,id,0)//自定义消息 + mainForm.plus.text = "刷写中,请勿断开电源或USB连接"; + //mainForm.plus.bgcolor = 0x00CCFF; + mainForm.plus.background = 0xFF00CCFF; } var DiagStopReq = function(){ ::PostThreadMessage(thrdId,103,0,0)//自定义消息 + //mainForm.plus.text = "刷写停止"; + //mainForm.plus.background = 0xFFC0DCC0 } -mainForm.btnReadSw.oncommand = function(id,event){ - DiagReadDID(0xF195); -} - - -mainForm.btnReadHw.oncommand = function(id,event){ - DiagReadDID(0xF193); -} - -mainForm.btnReadF186.oncommand = function(id,event){ - DiagReadDID(0xF186); -} - -mainForm.btnTest.oncommand = function(id,event){ - DiagStopReq(); -} - -mainForm.btnFlash.oncommand = function(id,event){ - if(io.exist(mainForm.edFile.text) == null){ - Display("请打开文件"); - return; - } - if(flag_connected == 0){ - Display("请连接设备"); +//import console; +//console.log("1"); +mainForm.btnFlashLeft.oncommand = function(id,event){ + if(thrdTable.设备连接状态 == 0){ + Display("设备未连接"); return; } if(bootstate == true){ return ; } - import fsys; - var filename = fsys.getFileName(mainForm.edFile.text); - if(mainForm.radiobutton.checked){ - if(string.find(filename,"SWTL") == null){ - Display("请打开正确的文件"); - return; - } + if(thrdTable["文件加载状态"] == false){ + Display("烧录文件加载错误"); + return; } - else { - if(string.find(filename,"SWTR") == null){ - Display("请打开正确的文件"); - return; - } - } - bootstate = true; mainForm.edit.text = ""; + ::PostThreadMessage(thrdId,106,0x720,0x620);//自定义消息 Display("开始刷写流程"); starttime = time.now(); - //timer_bootcount.enable(); - DiagBootReq(); - - + DiagBootReq(1);//左侧 } -mainForm.btnOpen.oncommand = function(id,event){ - ::PostThreadMessage(thrdId,104,1,0)//自定义消息-打开文件 -} - -//程序关闭 -mainForm.onClose = function(hwnd,message,wParam,lParam){ - if(thrdId != null){ - ::PostThreadMessage(thrdId,105,0,0)//自定义消息 - thread.waitClose(thrdHandle); - } - - - //PLinHw.isConnected()///待完善 - //console.print("线程已关闭") - //console.pause() -} - -mainForm.btnReadF198.oncommand = function(id,event){ - DiagReadDID(0xF198); -} - -mainForm.btnReadF199.oncommand = function(id,event){ - DiagReadDID(0xF199); -} - - -//var frmChild = win.loadForm("\dlg\诊断子窗口.aardio"); -//frmChild.show(false); -mainForm.btnDiag1003.oncommand = function(id,event){ - Diag10Req(0x03); -} - -mainForm.btnDiag1002.oncommand = function(id,event){ - Diag10Req(0x02); -} - -mainForm.btnDiag1001.oncommand = function(id,event){ - Diag10Req(0x01); -} -mainForm.text += " " - -mainForm.radiobutton.oncommand = function(id,event){ - if(mainForm.radiobutton.checked){ - ::PostThreadMessage(thrdId,106,0x720,0x620);//自定义消息 - } -} - -mainForm.radiobutton2.oncommand = function(id,event){ - if(mainForm.radiobutton2.checked){ - ::PostThreadMessage(thrdId,106,0x710,0x610);//自定义消息 - } -} - -mainForm.button.oncommand = function(id,event){ - ::PostThreadMessage(thrdId,107,1,0);//自定义消息 -} - -aboutcounter = 0; -mainForm.static5.oncommand = function(id,event){ - aboutcounter++; - if(aboutcounter >= 5){ - aboutcounter = 0; - var frmChild = mainForm.loadForm("\dlg\about.aardio"); - frmChild.doModal(mainForm); - } -} - -mainForm.text += mainForm.static5.text; mainForm.onClose = function(hwnd,message,wParam,lParam){ - //::PostThreadMessage(thrdId,109,0,0);//自定义消息 - //sleep(20); raw.closehandle(thrdHandle) } + + +autoconnect = win.timer(mainForm,100); +var autoconnect_state = 0; +var power_err_count = 0; +autoconnect.onTimer = function(){ + select(autoconnect_state) { + case 0 { + if(thrdTable.设备连接状态 == 0){ + //断开 + mainForm.static.text='\uF127' + mainForm.static2.text = "设备未连接,请先连接设备"; + mainForm.static.color=0xff0; + ::PostThreadMessage(thrdId,100,0,0); + //Display("刷新"); + sleep(20); + if(#thrdTable.设备 > 0){ + Display(thrdTable.设备[1].name); + ::PostThreadMessage(thrdId,101,1,0x00);//连接 0x80 -> CANFD + } + } + else { + + autoconnect_state = 3; + power_err_count = 0; + } + } + case 1 { + ::PostThreadMessage(thrdId,104,0,0); + autoconnect_state = 2; + } + case 2 { + if(thrdTable["电源电压"] < 100){ + ::PostThreadMessage(thrdId,105,1,0); + power_err_count++; + if(power_err_count < 10){ + autoconnect_state = 1; + } + else { + mainForm.static2.text = "电源异常,请检查线路" + autoconnect_state = 4; + } + + } + else { + import console; + console.log(thrdTable["电源电压"]) + autoconnect_state = 3; + } + + } + case 3 { + if(thrdTable["文件加载状态"] == true){ + mainForm.static.color=0xff00; + mainForm.static.text='\uF0C1'; + mainForm.static2.text = "设备已连接,可以开始刷写"; + ::PostThreadMessage(thrdId,115,1,0);//连接 + autoconnect_state = 4; + } + else { + mainForm.static2.text = "文件已损坏,请重新获取烧录上位机"; + autoconnect_state = 4; + mainForm.btnFlashLeft.disabled = true; + mainForm.btnFlashRight.disabled = true; + } + + } + case 4 { + //... + } + else { + } + } + + +} + +mainForm.btnFlashRight.oncommand = function(id,event){ + if(thrdTable.设备连接状态 == 0){ + Display("设备未连接"); + return; + } + if(bootstate == true){ + return ; + } + if(thrdTable["文件加载状态"] == false){ + Display("烧录文件加载错误"); + return; + } + bootstate = true; + mainForm.edit.text = ""; + ::PostThreadMessage(thrdId,106,0x710,0x610);//自定义消息 + Display("开始刷写流程"); + starttime = time.now(); + DiagBootReq(2);//左侧 +} + +mainForm.btnStopBoot.oncommand = function(id,event){ + DiagStopReq(); +} + +autoconnect.enable(); + +//import console; +//console.log("io.exis = ",io.exist("\res\P417_SWTL_20240709.S19")); + + thrdHandle,thrdId = thread.create( CanThread ); mainForm.show(); return win.loopMessage(); \ No newline at end of file diff --git a/user/CanThread.aardio b/user/CanThread.aardio index 48642e0..cb9effc 100644 --- a/user/CanThread.aardio +++ b/user/CanThread.aardio @@ -21,33 +21,18 @@ FuncLoopMsg = function(msg){ FuncConnect(msg.wParam,msg.lParam); } case 102 {//开始boot - FuncStartBoot(); + FuncStartBoot(msg.wParam); } case 103 {//停止boot FuncStopBoot(); + //FuncGetPowerVal(); } - case 104 {//打开s19文件 - if(msg.wParam == 0){ - FuncDisplay("打开FlashDriver"); - var ret = FuncOpenS19File(msg.wParam); - if(ret != null){ - thread.command.$ShowFlashDrvPath(ret); - } - } - else { - FuncDisplay("打开烧写文件"); - var ret = FuncOpenS19File(msg.wParam); - if(ret != null){ - thread.command.$ShowPath(ret); - var crc32 = FuncGetFlashCRC(msg.wParam); - FuncDisplay("CRC = " ++ string.format("%X",crc32)); - } - } - - + case 104 {//读取电压 + FuncGetPowerVal(); } - case 105 {//停止boot - thread.stop(0); + case 105 {//控制电源 + FuncPowerCtrl(msg.wParam); + } case 106 { FuncSetCANID(msg.wParam,msg.lParam); @@ -73,12 +58,30 @@ FuncLoopMsg = function(msg){ case 114 { FuncReq27(msg.wParam); } + case 115 { + FuncReadDeviceVersion(1); + } else { } } } +FuncReadDeviceVersion = function(id){ + var ret,DeviceInfo,funcstr = CANHw.GetDevInfo(id); + if(ret != 0){ + var v1 = (DeviceInfo.FirmwareVersion>>24)&0xff; + var v2 = (DeviceInfo.FirmwareVersion>>16)&0xff; + var v3 = DeviceInfo.FirmwareVersion&0xffff; + FuncDisplay("固件版本"++v1++"."++v2++"."++v3) + } + else { + FuncDisplay("读取失败"); + } + +} + + FuncSetCANID = function(req,resp){ DiagReqID = req; DiagRespID = resp; @@ -95,6 +98,54 @@ FuncSendMsg = function(no){ } } +FuncLoadAPPFile = function(){ + var ret = FuncOpenS19File(1,"\res\P417_SWTL_20240722.S19"); + if(ret != null){ + FuncDisplay("加载左侧烧录文件"); + var crc32 = FuncGetFlashCRC(1); + FuncDisplay("CRC = " ++ string.format("%X",crc32)); + if(string.format("%X",crc32) != "F6570262"){ + FuncDisplay("CRC校验错误,文件已损坏"); + thrdTable["文件加载状态"] = false; + return ; + } + } + else { + FuncDisplay("加载左侧文件失败"); + thrdTable["文件加载状态"] = false; + return ; + } + var ret = FuncOpenS19File(2,"\res\P417_SWTR_20240722.S19"); + if(ret != null){ + FuncDisplay("加载右侧烧录文件"); + var crc32 = FuncGetFlashCRC(2); + FuncDisplay("CRC = " ++ string.format("%X",crc32)); + if(string.format("%X",crc32) != "1F3D406C"){ + FuncDisplay("CRC校验错误,文件已损坏"); + thrdTable["文件加载状态"] = false; + return ; + } + } + else { + FuncDisplay("加载左侧文件失败"); + thrdTable["文件加载状态"] = false; + return ; + } + thrdTable["文件加载状态"] = true; +} +FuncPowerCtrl = function(state){ + var ret = CANHw.SetPower(state); + return ret; +} + +FuncGetPowerVal = function(){ + var ret,buf = CANHw.GetPower(); + var val = (buf[2]<<8) + buf[1]; + //console.dumpJson(buf); + FuncDisplay("BAT电压"++val++"mV") + thrdTable["电源电压"] = val; +} + FuncFreshHw = function(){ @@ -104,6 +155,7 @@ FuncFreshHw = function(){ } else { FuncDisplay("找到硬件") + thrdTable.设备 = CANHw.GetAvailableHW() } } @@ -111,17 +163,20 @@ FuncConnect = function(dev,chn){ var canfd = (chn&0x80)==0x80?true:false; var ret = CANHw.OpenDevice(dev,chn&0x7f,canfd); if(ret == 0){ - FuncDisplay("连接成功"); + //FuncDisplay("连接成功"); thread.command.$Connected(); } else { FuncDisplay("连接失败"); } + FuncPowerCtrl(1); } FuncDisplay = function(str){ thread.command.$Display(str);//"线程" + } +//console.log("在loadcodex测试") +//console.log(thrdTable.test) loadcodex("\user\Diag10code.aardio"); @@ -188,27 +243,37 @@ FuncDiagPro = function(diagmsg){ -FuncStartBoot = function(){ - FuncInitBootState(); +FuncStartBoot = function(id){ + FuncInitBootState(id); boottimer.enable(); FuncDisplay("开始刷写"); stopflag = 0; } +var delay = function(w){ + while(w){ + for(i=1;50000;1) + { + } + w -= 1; + } +} + var PackNext = 0x21; var Packdata = {}; var PackID = 0; var FuncSendPackage = function(){ while(#Packdata > 0) { - sleep(0.3); + //sleep(1); + delay(2); var data = {PackNext,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC}; var max = #Packdata > 7 ? 7 : #Packdata; for(i=1;max;1){ data[i+1] = table.remove(Packdata); } - sleep(1); + //sleep(0.3); CANHw.SendMsg(PackID,data); PackNext += 1; @@ -280,14 +345,16 @@ timer1.onTimer = function(){ } } else { - //console.varDump(ret[i].id); + //console.log(..string.format("%x",ret[i].id)); //显示报文 } } } + +FuncLoadAPPFile(); timer1.enable(); -FuncDisplay("正在运行"); +FuncDisplay("CAN线程正在运行"); diff --git a/user/Diag27code.aardio b/user/Diag27code.aardio index 66360ea..351379e 100644 --- a/user/Diag27code.aardio +++ b/user/Diag27code.aardio @@ -46,10 +46,10 @@ FuncDiag27Pro = function(data){ SecuretyKey = securetyKeyCalc(SecuretySeed,data[1]); if(#SecuretyKey >= 4){ FuncReq27(data[1]+1,SecuretyKey); - var str = "计算密钥-"; - for(i=1;4;1){ + var str = "计算密钥中"; + /*for(i=1;4;1){ str += " " + tostring(SecuretyKey[i],16); - } + }*/ FuncDisplay(str); } else { diff --git a/user/DiagBootcode.aardio b/user/DiagBootcode.aardio index 6fc2c2c..54ebaa0 100644 --- a/user/DiagBootcode.aardio +++ b/user/DiagBootcode.aardio @@ -3,6 +3,7 @@ var bootstate = 0; var bootcount = 0; var sendstate = 0; +var senddataid = 0; FuncWait = function(sid){ if(RespState == (sid + 0x40)){//正响应 //bootcount = 0; @@ -36,6 +37,7 @@ FuncWait = function(sid){ boottimer.disable(); return 3;//超时 } + return 0xff; } FuncStopBoot = function(){ @@ -46,11 +48,12 @@ FuncClearState = function(){ bootcount = 0; sendstate = 1; } -FuncInitBootState = function(){ +FuncInitBootState = function(id){ bootstate = 0; RespState = 0; bootcount = 0; sendstate = 0; + senddataid = id; } @@ -72,6 +75,7 @@ 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); @@ -88,6 +92,7 @@ FuncSendBlockInit = function(id){ alldata_blocknum = len; block_sended = 0; sendblockstate = 0; + FuncSendBlockApp_sendflag = 0; return 0; } nextstate = function(val){ @@ -97,7 +102,7 @@ nextstate = function(val){ block_sended += 1; } } -var FuncSendBlockApp_sendflag = 0 + FuncSendBlockApp = function(){ select(sendblockstate) { case 0{ @@ -363,6 +368,7 @@ FuncBootSeq = function(){ } else { var ret = FuncWait(0x31); + //console.log("ret = " , ret); nextstate(ret); delaycount = 0; } @@ -381,11 +387,13 @@ FuncBootSeq = function(){ case 14 { if(sendstate == 0){//发送数据 - FuncSendBlockInit(1); + //console.log("开始发送App数据 "); + FuncSendBlockInit(senddataid); //FuncDisplay("开始发送App数据"); FuncClearState(); } else { + var ret = FuncSendBlockApp(); nextstate(ret); } @@ -393,7 +401,7 @@ FuncBootSeq = function(){ case 15 { if(sendstate == 0){//CheckLogicBlock FuncDisplay("CRC校验"); - var crc = FuncGetFlashCRC(1); + var crc = FuncGetFlashCRC(senddataid); FuncReq31CheckLogicBlock(crc); FuncClearState(); } @@ -457,24 +465,14 @@ FuncBootSeq = function(){ if(sendstate == 0){ FuncDisplay("写入刷写信息"); FuncClearState(); - FuncDIDWriteStr(0xf198,"DM_Bootloader ");//写入repair_shopcode + FuncDIDWriteStr(0xf198,"DM_Reworker ");//写入repair_shopcode LEN=16 } else { var ret = FuncWait(0x2E); nextstate(ret);// } - //nextstate(0); - /* - if(sendstate == 0){ - FuncReq28(0x00,0x01);//开启发送 - FuncClearState(); - } - else { - var ret = FuncWait(0x28); - nextstate(ret); - } - */ + } case 21 { if(sendstate == 0){//写入installation_date diff --git a/user/S19Decode.aardio b/user/S19Decode.aardio index d410aef..532b33b 100644 --- a/user/S19Decode.aardio +++ b/user/S19Decode.aardio @@ -69,11 +69,8 @@ FuncGetFlashCRC = function(id){ FuncOpenS19File = function(id,path){ import fsys.dlg; - if(path == null){ - path = fsys.dlg.open('S19文件|*.sx;*.s19;*.srec|所有文件|*.*||',,,winform); - } - if(io.exist( path )){ + if(path != null){ //winform.editPath.text = path; var readbuf = string.load(path); @@ -95,7 +92,7 @@ FuncOpenS19File = function(id,path){ var fileinfobuf = string.slice(str,9,-3);//取出文件信息 fileinfo = "file info:"+string.unhex(fileinfobuf,"")//解码 fileinfo = string.replace(fileinfo,"\z"," ");//替换空字符 - FuncDisplay(fileinfo)//显示 + //FuncDisplay(fileinfo)//显示 continue; } case "S1"{ @@ -160,6 +157,10 @@ FuncOpenS19File = function(id,path){ */ AllData[id] = FlashData; } + else { + return null; + } + //blocknum = 1; return path;