From a383ba31c3f917ce771917128cd2c243953ae3b8 Mon Sep 17 00:00:00 2001 From: sunbeam Date: Wed, 18 Sep 2024 14:49:47 +0800 Subject: [PATCH] OK --- default.aproj | 1 - dlg/诊断子窗口.aardio | 67 ------------------------------------ lib/usb2canfd.aardio | 79 +++++++++++++++++++++++++++++++++++++++---- main.aardio | 19 ++++++++++- user/CanThread.aardio | 45 ++++++++++++++++++++++-- 5 files changed, 132 insertions(+), 79 deletions(-) delete mode 100644 dlg/诊断子窗口.aardio diff --git a/default.aproj b/default.aproj index 8dba383..e9fbd51 100644 --- a/default.aproj +++ b/default.aproj @@ -6,7 +6,6 @@ - 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..ee0556c 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..5a7a74e 100644 --- a/main.aardio +++ b/main.aardio @@ -86,6 +86,14 @@ mainForm.btnFresh.oncommand = function(id,event){ mainForm.btnConnect.oncommand = function(id,event){ var canfd_check = 0x80;//mainForm.checkbox.checked?0x80:0x00; + var devstr = mainForm.cbbDev.selText; + var devhw = string.slice(devstr,9,9); + + if(devhw == 4) + { + //Display(devhw); + canfd_check = 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 @@ -119,6 +127,7 @@ listener.$SetProgress = function(pos){ } listener.$Connected = function(){ + thrdTable.设备连接状态 = 1; mainForm.btnConnect.disabled = true; mainForm.btnFresh.disabled = true; mainForm.cbbDev.disabled = true; @@ -133,12 +142,20 @@ listener.$SendEnd = function(isSuccess){ Display("刷写成功,用时 " + usetime + " S") } } - +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("线程开始运行") loadcodex("\user\CanThread.aardio");//加载线程程序 //在子线程启动消息循环 diff --git a/user/CanThread.aardio b/user/CanThread.aardio index 48642e0..ffad945 100644 --- a/user/CanThread.aardio +++ b/user/CanThread.aardio @@ -79,6 +79,21 @@ FuncLoopMsg = function(msg){ } } +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 +110,19 @@ FuncSendMsg = function(no){ } } +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 +132,7 @@ FuncFreshHw = function(){ } else { FuncDisplay("找到硬件") + thrdTable.设备 = CANHw.GetAvailableHW() } } @@ -196,19 +225,29 @@ FuncStartBoot = function(){ 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; @@ -288,6 +327,6 @@ timer1.onTimer = function(){ } timer1.enable(); -FuncDisplay("正在运行"); +FuncDisplay("CAN线程正在运行");