commit 4afcdb6bef34a6b1962a45cb859b87d048d374eb Author: sunbeam Date: Wed Dec 18 17:09:19 2024 +0800 初版 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba065fd --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.build +dist +/config.ini +/libusb-1.0.dll +/log.txt +/USB2XXX.dll diff --git a/CANThread/CAN_Msg.aardio b/CANThread/CAN_Msg.aardio new file mode 100644 index 0000000..4859e48 --- /dev/null +++ b/CANThread/CAN_Msg.aardio @@ -0,0 +1,26 @@ +import thread.table; +var thrdTable_TxTable = thread.table("发送数据") +var thrdTable_RxTable = thread.table("接收数据") +var msg_counter_arr = {} + +TxTask = function(){//10ms task + for(k,v in thrdTable_TxTable.each()){ + //console.log("k = " ++ k ++ "; v.id = " ++ v.id); + if(msg_counter_arr[v.id] != null && v.period != 0){ + msg_counter_arr[v.id] += 16; + if(msg_counter_arr[v.id] > v.period){ + msg_counter_arr[v.id] = 0; + CANHw.SendMsg(v.id,v.data); + } + } + else { + msg_counter_arr[v.id] = 0; + } + + } +} + +RxPro = function(id,data){ + thrdTable_RxTable.set(id,data); +} + diff --git a/CANThread/CanThread.aardio b/CANThread/CanThread.aardio new file mode 100644 index 0000000..e351712 --- /dev/null +++ b/CANThread/CanThread.aardio @@ -0,0 +1,278 @@ + +//此文件内容都在CAN线程内 +import usb2canfd; +import thread.command; +import win.timer; +import thread.table; +var thrdTable_CANHW = thread.table("CAN设备") +//初始化CAN句柄对象 +CANHw = usb2canfd.USB2CANHW(); +CANHw.LoadDll(); + +DiagReqID = 0x720;//0x18dadff1; +DiagRespID = 0x620;//0x18daf1df; +DiagGloableID = 0x7DF;//0x18DB33F1; +stopflag = 0; +FuncSetID = function(req,rsp){ + DiagReqID = req; + DiagRespID = rsp; +} + +//注册一个消息钩子函数 +FuncLoopMsg = function(msg){ + select(msg.message) { + case 100 {//刷新硬件 + FuncFreshHw(); + } + case 101 {//连接硬件 + FuncConnect(msg.wParam,msg.lParam); + } + case 102 {//更改ID + FuncSetID(msg.wParam,msg.lParam); + } + case 110 {//readDID + FuncReadDID(msg.wParam); + } + case 111 { + FuncReq10(false,msg.wParam); + } + case 112 { + FuncReq28(msg.wParam); + } + case 113 { + FuncReq85(msg.wParam); + } + case 114 { + FuncReq27(msg.wParam); + } + case 115 { + FuncReq3E(); + } + case 116 { + FuncDIDWriteValue2B(msg.wParam,msg.lParam); + } + case 117 { + FuncDIDWriteValue1B(msg.wParam,msg.lParam); + } + case 118 { + FuncDIDWriteValue4B(msg.wParam,msg.lParam); + } + else { + + } + } +} + + + + +FuncFreshHw = function(){ + var hwnum = CANHw.FlashHw(); + thrdTable_CANHW.clear(); + if(hwnum == 0){ + } + else { + FuncDisplay("找到硬件") + var ret = CANHw.GetAvailableHW(); + for(k,v in ret){ + //console.log(v.name); + thrdTable_CANHW.push(v.name); + } + + } +} + +FuncConnect = function(dev,chn){ + var canfd = (chn&0x80)==0x80?true:false; + var ret = CANHw.OpenDevice(dev,chn&0x7f,canfd); + if(ret == 0){ + FuncDisplay("连接成功"); + //console.log("连接成功"); + CANHw.GetAvailableHW(); + thread.command.$Connected(); + autoval1 = dev; + autoval2 = chn; + } + else { + FuncDisplay("连接失败"); + //console.log("连接失败"); + } +} + +FuncDisplay = function(str){ + thread.command.$Display(str);//"线程" + +} + + +loadcodex("\CANThread\Diag10code.aardio"); +loadcodex("\CANThread\Diag11code.aardio"); +loadcodex("\CANThread\Diag22code.aardio"); +loadcodex("\CANThread\Diag27code.aardio"); +loadcodex("\CANThread\Diag2Ecode.aardio"); +loadcodex("\CANThread\Diag28code.aardio"); +loadcodex("\CANThread\Diag7Fcode.aardio"); +loadcodex("\CANThread\Diag85code.aardio"); + + +FuncReq3E = function(){ + var data = {0x02,0x3E,0x80,0, 0,0,0,0}; + CANHw.SendMsg(DiagReqID,data); +} + + +RespState = 0; + +FuncDiagPro = function(diagmsg){ + //console.log("发送数据"); + thread.command.$LastDiagResp(diagmsg);//发送诊断数据 + select(diagmsg.sid) { + case 0x50 { + FuncDiag10Pro(table.slice(diagmsg.data,1,diagmsg.len)) + } + case 0x62 { + FuncDiag22Pro(table.slice(diagmsg.data,1,diagmsg.len)) + } + case 0x67 { + 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)) + } + case 0xC5 { + FuncDiag85Pro(table.slice(diagmsg.data,1,diagmsg.len)) + } + case 0x7F { + FuncDiag7FPro(table.slice(diagmsg.data,1,diagmsg.len)) + } + case 0x6E { + FuncDiag2EPro(table.slice(diagmsg.data,1,diagmsg.len)) + } + else { + } + } + RespState = diagmsg.sid; +} + + + + + + +var PackNext = 0x21; +var Packdata = {}; +var PackID = 0; +var FuncSendPackage = function(){ + while(#Packdata > 0) + { + sleep(0.3); + 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(2); + CANHw.SendMsg(PackID,data); + + PackNext += 1; + if(PackNext > 0x2f){ + PackNext = 0x20; + } + } + +} +FuncPushPackage = function(ID,data){ + PackNext = 0x21; + Packdata = data; + PackID = ID; +} +diagresp = {}; +RxTask = function(){ + ret = CANHw.GetMsg(); + //console.log("报文=" ++ #ret); + for(i=1;#ret;1){ + //console.log("id = " + tostring(ret[i].id)) + if(ret[i].id & 0x7FFFFFFF == DiagRespID){ + if(ret[i].data[1] == 0x10){//首帧 + var data = {0x30,0x00,0x14,0x00,0,0,0,0}; + CANHw.SendMsg(DiagReqID,data); + diagresp["sid"] = ret[i].data[3]; + diagresp["len"] = ret[i].data[2]-1; + diagresp["data"] = {}; + diagresp["next"] = 0x21; + table.append(diagresp["data"],table.slice(ret[i].data,4)); + } + elseif(ret[i].data[1] <= 0x07){//单帧 + //console.dumpJson() + diagresp["sid"] = ret[i].data[2]; + diagresp["len"] = ret[i].data[1]-1; + diagresp["data"] = table.slice(ret[i].data,3); + FuncDiagPro(diagresp); + } + elseif(ret[i].data[1] >= 0x21 && ret[i].data[1] <= 0x2f){ + if(ret[i].data[1] == diagresp["next"]){//多帧 + diagresp["next"] += 1; + if(diagresp["next"] >= 0x2F){ + diagresp["next"] = 0x20; + } + table.append(diagresp["data"],table.slice(ret[i].data,2)); + if(#diagresp["data"] >= diagresp["len"]){ + FuncDiagPro(diagresp); + } + } + } + elseif(ret[i].data[1] == 0x30){// + FuncSendPackage(); + } + } + else { + //console.varDump(ret[i].id); + //显示报文 + } + RxPro(ret[i].id,ret[i].data); + //console.varDump(ret[i].id); + } +} +//自动重连 +AutoReconnectCount=0; +AutoReconnectTaks = function(){ + AutoReconnectCount += 1; + if(AutoReconnectCount > 100){ + AutoReconnectCount = 0; + var ret,DeviceInfo,str = CANHw.GetNowInfo(); + //console.log("ret = " ++ ret); + //console.dumpJson(DeviceInfo); + //console.log(str); + if(ret == 0){ + FuncConnect(autoval1,autoval2); + } + } + +} + + +loadcodex("\CANThread\CAN_Msg.aardio"); +CT_timer = win.timer(,10); + +CT_timer.onTimer = function(){ + if(CANHw.isConnected() == false){ + return; + } + + RxTask(); + //console.log("发送报文"); + TxTask(); + AutoReconnectTaks(); +} +CT_timer.enable(); +FuncDisplay("正在运行"); + + diff --git a/CANThread/CanThreadStart.aardio b/CANThread/CanThreadStart.aardio new file mode 100644 index 0000000..4987d4b --- /dev/null +++ b/CANThread/CanThreadStart.aardio @@ -0,0 +1,124 @@ +import console; +//console.log("CANTHREAD开始") + +import thread.table; +var thrdTable_CANHW = thread.table("CAN设备",true/*清空*/) +var thrdTable_RxTable = thread.table("接收数据",true/*清空*/) +var thrdTable_TxTable = thread.table("发送数据",true/*清空*/) + +CT_Display = function(str){//显示日志 + if(Display!=null){ + Display(str); + } +} +CT_Fresh = function(){ + ::PostThreadMessage(thrdId,100,0,0)//自定义消息 +} +CT_Connect = function(dev,chn,iscanfd){ + var canfd_check = 0x80;//iscanfd?0x80:0x00;//兼容UTA401 + ::PostThreadMessage(thrdId,101,dev,(chn - 1)|canfd_check);//自定义消息 +} +CT_GetCANHw = function(){ + var canhw = {}; + for( k,v in thrdTable_CANHW.each() ){ + table.push(canhw,v); + } + return canhw; +} + +CT_GetRxMsg = function(id){ + var ret = thrdTable_RxTable.get(id); + return ret; +} + +CT_UpdateCANTxMsg = function(id,period,data){ + var msg = {}; + msg.id = id; + msg.period = period; + msg.data = data; + thrdTable_TxTable.set(id,msg); +} + +CT_Diag10 = function(sid){ + ::PostThreadMessage(thrdId,111,sid,0);//自定义消息,111为10服务,参考CanThread文件FuncLoopMsg函数 +} + +CT_Diag22 = function(did){ + ::PostThreadMessage(thrdId,110,did,0);//参考CanThread文件FuncLoopMsg函数 +} +CT_Diag2EVal4B = function(did,data){ + ::PostThreadMessage(thrdId,118,did,data);//参考CanThread文件FuncLoopMsg函数 +} +CT_Diag2EVal2B = function(did,data){ + ::PostThreadMessage(thrdId,116,did,data);//参考CanThread文件FuncLoopMsg函数 +} +CT_Diag2EVal1B = function(did,data){ + ::PostThreadMessage(thrdId,117,did,data);//参考CanThread文件FuncLoopMsg函数 +} +CT_Diag3E = function(){ + ::PostThreadMessage(thrdId,115,0,0);//参考CanThread文件FuncLoopMsg函数 +} + +CT_SetDiagID = function(req,rsp){ + ::PostThreadMessage(thrdId,102,req,rsp);//参考CanThread文件FuncLoopMsg函数 +} +LastDiagRespData = {}; +CT_GetLastDiagResp = function(){ + var retdata = LastDiagRespData; + LastDiagRespData = {}; + return retdata; +} + + +//初始报文数据 +CT_UpdateCANTxMsg(0x30,200,{0,0,0x40,0, 0,0x08,0,0}); + +//CAN通讯线程 +import thread.command; +var listener = thread.command(); +var flag_connected=0; +listener.$Display = function(str){ + CT_Display(str); +} + +listener.$Connected = function(devs){ + flag_connected = 1; + CAN_Connected_callback(); +} +listener.$LastDiagResp = function(resp){ + //console.log("接收数据"); + LastDiagRespData = resp; + //console.dumpJson(LastDiagRespData); +} + +//线程函数 +var CanThreadFunc = function(){ + //线程函数内部要添加自已的import语句 + import win; + import console; + //需要在线程中查看console时取消下句的注释 + //console.log("线程开始运行") + loadcodex("\CANThread\CanThread.aardio");//加载线程程序 + //在子线程启动消息循环 + win.loopMessage(FuncLoopMsg) +} + + +thrdHandle,thrdId = thread.create( CanThreadFunc ); + + + + + + + + + + + + + + + + + diff --git a/CANThread/Diag10code.aardio b/CANThread/Diag10code.aardio new file mode 100644 index 0000000..a266389 --- /dev/null +++ b/CANThread/Diag10code.aardio @@ -0,0 +1,33 @@ + +//发送 +FuncReq10 = function(Addr,num){ + if(num >= 1 && num <= 3){ + var data = {0x02,0x10,num,0,0,0,0,0}; + if(Addr == true){ + CANHw.SendMsg(DiagGloableID,data); + } + else { + CANHw.SendMsg(DiagReqID,data); + } + + + } + +} +//接收 +FuncDiag10Pro = function(data){ + //console.dumpJson(data); + select(data[1]) { + case 1 { + FuncDisplay("进入默认会话成功") + } + case 2 { + FuncDisplay("进入编程会话成功") + } + case 3 { + FuncDisplay("进入扩展会话成功") + } + else { + } + } +} diff --git a/CANThread/Diag11code.aardio b/CANThread/Diag11code.aardio new file mode 100644 index 0000000..6804389 --- /dev/null +++ b/CANThread/Diag11code.aardio @@ -0,0 +1,9 @@ +//发送 +FuncReq11 = function(num){ + var txdata = {0x2,0x11,num,0x00,0x00,0x00,0x00,0x00}; + CANHw.SendMsg(DiagReqID,txdata); +} +//接收 +FuncDiag11Pro = function(data){ + FuncDisplay("复位成功") +} \ No newline at end of file diff --git a/CANThread/Diag22code.aardio b/CANThread/Diag22code.aardio new file mode 100644 index 0000000..39cd0eb --- /dev/null +++ b/CANThread/Diag22code.aardio @@ -0,0 +1,85 @@ +var diag22state = 0; +//发送 +FuncReadDID = function(did){ + if(CANHw.isConnected() == false){ + return; + } + var data = {0x03,0x22,did>>8,did&0xff,0,0,0,0}; + var ret = CANHw.SendMsg(DiagReqID,data); + diag22state = 1; + //console.log("did = " + tostring(did,16)); + //console.log("ret = " + ret); + //FuncDisplay("did = " + tostring(did,16)); +} + +//接收 +FuncDiag22Pro = function(data){ + //console.log("诊断22服务") + if(#data < 3){ + return; + } + var did = (data[1]<<8) + data[2]; + select(did) { + case 0xF186 { + FuncDisplay("当前会话: " + data[3]); + } + case 0xF193 { + var len = string.len(string.pack(table.slice(data,3)),3); + if(data[3] != 0){ + var str = string.pack(table.slice(data,3,len+3)); + FuncDisplay("硬件版本号:" ++ str); + } + else { + FuncDisplay("硬件版本号未读到"); + } + + + } + case 0xF195 { + var len = string.len(string.pack(table.slice(data,3)),3); + if(data[3] != 0){ + var str = string.pack(table.slice(data,3,len+3)); + FuncDisplay("软件版本号:" ++ str); + } + else { + FuncDisplay("软件版本号未读到"); + } + } + case 0xF198 { + FuncDisplay("repair_shopcode"); + FuncDisplay(string.pack(table.slice(data,3))); + } + case 0xF199 { + FuncDisplay("installation_date"); + FuncDisplay(string.format("%02x%02X%02x%02x",data[3],data[4],data[5],data[6])); + } + case 0xF187 { + FuncDisplay("车辆备用零部件编号"); + FuncDisplay(string.pack(table.slice(data,3))); + + } + case 0xF18A { + FuncDisplay("系统供应商公司名称代码"); + FuncDisplay(string.pack(table.slice(data,3))); + + } + case 0xF197 { + FuncDisplay("ECU系统名称"); + FuncDisplay(string.pack(table.slice(data,3))); + } + case 0xF190 { + FuncDisplay("VIN码"); + FuncDisplay(string.pack(table.slice(data,3))); + } + case 0x7022 { + FuncDisplay("预压值: " + data[3]); + } + else { + FuncDisplay(TableToStr(data)) + //import console; + //console.dumpJson(data); + } + + } + +} \ No newline at end of file diff --git a/CANThread/Diag27code.aardio b/CANThread/Diag27code.aardio new file mode 100644 index 0000000..cfdd80a --- /dev/null +++ b/CANThread/Diag27code.aardio @@ -0,0 +1,77 @@ + +var SecuretySeed = {0,0,0,0,}; +var SecuretyKey = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +var lockstate = 0; +//发送 +FuncReq27 = function(num,key){ + if(num >= 1 && num <= 0x1C){ + if(key == null){ + var data = {0x02,0x27,num,0,0,0,0,0}; + CANHw.SendMsg(DiagReqID,data); + } + else { + if(#key > 4){ + var data = {0x10,0X12,0x27,num,key[1],key[2],key[3],key[4]}; + CANHw.SendMsg(DiagReqID,data); + + FuncPushPackage(DiagReqID,table.slice(key,5)); + } + else { + var data = {0x06,0x27,num,key[1],key[2],key[3],key[4],0x00}; + CANHw.SendMsg(DiagReqID,data); + } + + } + } + else { + FuncDisplay("27长度错误"); + } + +} + +loadcodex("\CANThread\GeelySecurety.aardio"); +//接收 +FuncDiag27Pro = function(data){ + //console.dumpJson(data); + select(data[1]) { + case 1,3,5,7,9,11,0x11 { + var str = "收到种子"; + for(i=1;4;1){ + SecuretySeed[i] = data[i+1]; + str += " " + tostring(SecuretySeed[i],16); + lockstate = 1; + } + FuncDisplay(str) + SecuretyKey = securetyKeyCalc(SecuretySeed,data[1]); + if(#SecuretyKey >= 4){ + FuncReq27(data[1]+1,SecuretyKey); + var str = "计算密钥-"; + for(i=1;4;1){ + str += " " + tostring(SecuretyKey[i],16); + } + FuncDisplay(str); + } + else { + FuncDisplay("计算失败"); + } + + } + case 2,4,6,8,10,12,0x12 { + FuncDisplay("解锁成功"); + lockstate = 2; + } + else { + FuncDisplay("27服务未知子服务"); + } + } +} + +FuncDiag27GetState = function(){ + if(lockstate == 2){ + return 0; + } + else { + return 1; + } + +} diff --git a/CANThread/Diag28code.aardio b/CANThread/Diag28code.aardio new file mode 100644 index 0000000..a5a6d54 --- /dev/null +++ b/CANThread/Diag28code.aardio @@ -0,0 +1,27 @@ + +//发送 +FuncReq28 = function(num1,num2){ + 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("使能接收,禁止发送") + } + case 2 { + FuncDisplay("禁止接收,使能发送") + } + case 3 { + FuncDisplay("禁止接收发送") + } + else { + } + } +} \ No newline at end of file diff --git a/CANThread/Diag2Ecode.aardio b/CANThread/Diag2Ecode.aardio new file mode 100644 index 0000000..7c0b79a --- /dev/null +++ b/CANThread/Diag2Ecode.aardio @@ -0,0 +1,66 @@ + +var diag22state = 0; +//发送 +FuncDIDWriteStr = function(did,str){ + var data = {} + for(i=1;string.len(str);1){ + data[i] = string.unpack(str,i); + } + FuncReq2E(did,data) + return data; +} +FuncDIDWriteValue4B = function(did,data){ + if(CANHw.isConnected() == false){ + return; + } + var txdata = {0x07,0x2E,did>>8,did&0xff,data>>24,data>>16,data>>8,data&0xff}; + CANHw.SendMsg(DiagReqID,txdata); +} +FuncDIDWriteValue2B = function(did,data){ + if(CANHw.isConnected() == false){ + return; + } + var txdata = {0x05,0x2E,did>>8,did&0xff,data>>8,data&0xff,0,0}; + CANHw.SendMsg(DiagReqID,txdata); +} +FuncDIDWriteValue1B = function(did,data){ + if(CANHw.isConnected() == false){ + return; + } + var txdata = {0x04,0x2E,did>>8,did&0xff,data&0xff,0,0,0}; + CANHw.SendMsg(DiagReqID,txdata); +} + + +//FuncDIDWriteStr(0xf198,"0123456789abcdef1234"); + +FuncReq2E = function(did,data){ + if(CANHw.isConnected() == false){ + return; + } + //console.dumpTable(data); + if(#data > 4){ + //多帧 + var txdata = {0x10,3+#data,0x2E,did>>8,did&0xff,data[1],data[2],data[3]}; + CANHw.SendMsg(DiagReqID,txdata); + //等待发送 + FuncPushPackage(DiagReqID,table.slice(data,3)); + } + else { + var txdata = {3+#data,0x2E,did>>8,did&0xff,0,0,0,0}; + for(i=1;#data;1){ + txdata[4+i] = data[i]; + } + CANHw.SendMsg(DiagReqID,txdata); + + } + +} + + +//接收 +FuncDiag2EPro = function(data){ + var did = (data[1]<<8) + data[2]; + FuncDisplay("写入" + tostring(did,16) + "成功"); + +} \ No newline at end of file diff --git a/CANThread/Diag7Fcode.aardio b/CANThread/Diag7Fcode.aardio new file mode 100644 index 0000000..d66878c --- /dev/null +++ b/CANThread/Diag7Fcode.aardio @@ -0,0 +1,46 @@ + +var errSID=0,errNRC=0; +FuncGetNrc = function(){ + return errSID,errNRC; +} +FuncClrNrc = function(){ + //return errSID,errNRC; + errSID = 0; + errNRC = 0; +} +TableToStr = function(data){ + if(data == null){ + return " "; + } + if(#data == 0){ + return " "; + } + var str = "data:" + for(i=1;#data;1){ + str += " " + str += tostring(data[i],16); + } + return str; + +} + +//接收 +FuncDiag7FPro = function(data){ + //console.dumpJson(data); + errSID = data[1]; + errNRC = data[2]; + select(errNRC) { + case 0x78 { + if(errSID != 0x36){ + FuncDisplay("服务正忙") + } + + } + else { + FuncDisplay("SID:" + tostring(errSID,16)) + FuncDisplay("错误 - NRC:" + tostring(errNRC,16)) + FuncDisplay(TableToStr(data)); + } + } + +} \ No newline at end of file diff --git a/CANThread/Diag85code.aardio b/CANThread/Diag85code.aardio new file mode 100644 index 0000000..73f156b --- /dev/null +++ b/CANThread/Diag85code.aardio @@ -0,0 +1,27 @@ + +//发送 +FuncReq85 = function(num){ + if(num >= 1 && num <= 3){ + var data = {0x02,0x85,num,0,0,0,0,0}; + CANHw.SendMsg(DiagGloableID,data); + } + +} +//接收 +FuncDiag85Pro = function(data){ + //console.dumpJson(data); + select(data[1]) { + case 0x01 { + FuncDisplay("DTC开启") + } + case 0x02 { + FuncDisplay("DTC禁能") + } + case 3 { + FuncDisplay("DTC - 01") + } + else { + FuncDisplay("DTC - TDB") + } + } +} \ No newline at end of file diff --git a/CANThread/GeelySecurety.aardio b/CANThread/GeelySecurety.aardio new file mode 100644 index 0000000..4550168 --- /dev/null +++ b/CANThread/GeelySecurety.aardio @@ -0,0 +1,85 @@ + +xorArray = {0xAA,0x50,0x43,0x52} +securetyKeyCalc = function(pucSeed,ucSecurityLevel){ + //SeedSec_t cal,key,seed; + var seed = {0,0,0,0}; + var key = {0,0,0,0}; + var cal = {0,0,0,0}; + var pucKey = {1,2,3,4}; + return pucKey; //跳过 + seed[1]=pucSeed[4]; + seed[2]=pucSeed[3]; + seed[3]=pucSeed[2]; + seed[4]=pucSeed[1]; + select(ucSecurityLevel) { + case 0x01 { + cal[1] = seed[1]^xorArray[1]; + cal[2] = seed[2]^xorArray[2]; + cal[3] = seed[3]^xorArray[3]; + cal[4] = seed[4]^xorArray[4]; + /* + key[3] = ((cal[0]&0x0F)<<4)|( cal[0]&0xF0); + key[2] = ((cal[2]&0x0F)<<4)|((cal[3]&0xF0)>>4); + key[1] = (cal[2]&0xF0)|((cal[1]&0xF0)>>4); + key[0] = ((cal[3]&0x0F)<<4)|( cal[1]&0x0F); + */ + key[4] = ((cal[1]&0x0F)<<4)|( cal[1]&0xF0); + key[3] = ((cal[3]&0x0F)<<4)|((cal[4]&0xF0)>>4); + key[2] = (cal[3]&0xF0)|((cal[2]&0xF0)>>4); + key[1] = ((cal[4]&0x0F)<<4)|( cal[2]&0x0F); + } + case 0x03 { + /* + cal.byte[0] = ((seed.byte[0]&0xF8)>>3)^xorArray[0]; + cal.byte[1] = ((seed.byte[1]&0xF8)>>3)^xorArray[1]; + cal.byte[2] = ((seed.byte[2]&0xF8)>>3)^xorArray[2]; + cal.byte[3] = ((seed.byte[3]&0xF8)>>3)^xorArray[3]; + + key.byte[0] = ((cal.byte[3]&0x07)<<5)|(( cal.byte[0]&0xF8)>>3); + key.byte[1] = ((cal.byte[0]&0x07)<<5)|(cal.byte[2]&0x1F); + key.byte[2] = (cal.byte[1]&0xF8)|((cal.byte[3]&0xE0)>>5); + key.byte[3] = (cal.byte[2]&0xF8)|( cal.byte[1]&0x07); + */ + cal[1] = ((seed[1]&0xF8)>>3)^xorArray[1]; + cal[2] = ((seed[2]&0xF8)>>3)^xorArray[2]; + cal[3] = ((seed[3]&0xF8)>>3)^xorArray[3]; + cal[4] = ((seed[4]&0xF8)>>3)^xorArray[4]; + + key[1] = ((cal[4]&0x07)<<5)|((cal[1]&0xF8)>>3); + key[2] = ((cal[0]&0x07)<<5)|( cal[3]&0x1F); + key[3] = (cal[2]&0xF8)|((cal[4]&0xE0)>>5); + key[4] = (cal[3]&0xF8)|( cal[2]&0x07); + } + case 0x11 { + /* + cal.byte[0] = seed.byte[0]^xorArray[0]; + cal.byte[1] = seed.byte[1]^xorArray[1]; + cal.byte[2] = seed.byte[2]^xorArray[2]; + cal.byte[3] = seed.byte[3]^xorArray[3]; + + key.byte[3] = ((cal.byte[1]&0x03)<<6)|(( cal.byte[0]&0xFC)>>2); + key.byte[2] = ((cal.byte[0]&0x03)<<6)|(cal.byte[3]&0x3F); + key.byte[1] = (cal.byte[3]&0xFC)|((cal.byte[2]&0xC0)>>6); + key.byte[0] = (cal.byte[2]&0xFC)|(cal.byte[1]&0x03); + */ + cal[1] = seed[1]^xorArray[1]; + cal[2] = seed[2]^xorArray[2]; + cal[3] = seed[3]^xorArray[3]; + cal[4] = seed[4]^xorArray[4]; + + key[4] = ((cal[2]&0x03)<<6)|(( cal[1]&0xFC)>>2); + key[3] = ((cal[1]&0x03)<<6)|(cal[4]&0x3F); + key[2] = (cal[4]&0xFC)|((cal[3]&0xC0)>>6); + key[1] = (cal[3]&0xFC)|(cal[2]&0x03); + } + else { + } + } + + pucKey[1]=key[4]; + pucKey[2]=key[3]; + pucKey[3]=key[2]; + pucKey[4]=key[1]; + + return pucKey; +} diff --git a/default.aproj b/default.aproj new file mode 100644 index 0000000..5e9c2f4 --- /dev/null +++ b/default.aproj @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dlg/about.aardio b/dlg/about.aardio new file mode 100644 index 0000000..5ea3061 --- /dev/null +++ b/dlg/about.aardio @@ -0,0 +1,33 @@ +import win.ui; +/*DSG{{*/ +var winform = win.form(text="aardio form";right=499;bottom=399;border="thin";mode="popup";title=false) +winform.add( +button={cls="button";text="确定";left=359;top=346;right=471;bottom=387;z=1}; +static={cls="static";text="Static";left=21;top=17;right=458;bottom=340;transparent=1;z=2} +) +/*}}*/ + +更新履历 = /* +V2.0: 采用新界面 +V2.1: 加入诊断,修复信号界面闪烁问题 +V2.2: 加入全屏,修改标定/诊断逻辑 +V2.3: 标定增加预设配置 +V2.4: 增加DAC周期写入功能 +V2.5: 巡航等按键增加第二路信号显示,增加调试帧开关 +V2.6: 修复右边2个按键信号和基线没显示数值问题 +V2.7: 信号界面增加左右按下状态 +V2.8: 增加显示错误信息 +v2.9: 修复诊断错误信号关联错误;增加读取振动参数;增加自动重连功能 +v2.10: 产品信号改为raw值 +V2.11: 滑条名字改为KEY +*/ + +winform.button.oncommand = function(id,event){ + winform.close(); +} + +winform.static.text = 更新履历; + +winform.show(); +win.loopMessage(); +return winform; \ No newline at end of file diff --git a/dlg/diagnostic.aardio b/dlg/diagnostic.aardio new file mode 100644 index 0000000..8267eb7 --- /dev/null +++ b/dlg/diagnostic.aardio @@ -0,0 +1,360 @@ +import win.ui; +/*DSG{{*/ +var winform = win.form(text="aardio form";right=984;bottom=599;bgcolor=16777215) +winform.add( +btn1001={cls="button";text="默认会话";left=28;top=58;right=115;bottom=88;ah=1;aw=1;z=4}; +btn1003={cls="button";text="扩展会话";left=126;top=58;right=213;bottom=88;ah=1;aw=1;z=5}; +btnConvert={cls="button";text="转换";left=541;top=463;right=619;bottom=493;ah=1;aw=1;z=46}; +btnRead7022={cls="button";text="预压值";left=232;top=212;right=319;bottom=242;ah=1;aw=1;z=54}; +btnRead9002={cls="button";text="读取";left=294;top=409;right=382;bottom=439;z=59}; +btnRead9003={cls="button";text="读取";left=293;top=449;right=381;bottom=479;z=60}; +btnRead9004={cls="button";text="读取";left=294;top=486;right=382;bottom=516;z=61}; +btnReadConfig={cls="button";text="读取配置";left=531;top=545;right=625;bottom=578;z=48}; +btnReadF187={cls="button";text="ECU零件号";left=232;top=255;right=319;bottom=285;ah=1;aw=1;z=18}; +btnReadF18A={cls="button";text="供应商ID";left=35;top=255;right=122;bottom=285;ah=1;aw=1;z=19}; +btnReadF190={cls="button";text="VIN码";left=133;top=255;right=220;bottom=285;ah=1;aw=1;z=20}; +btnReadF193={cls="button";text="硬件版本";left=35;top=298;right=122;bottom=328;ah=1;aw=1;z=22}; +btnReadF195={cls="button";text="软件版本";left=133;top=298;right=222;bottom=328;ah=1;aw=1;z=23}; +btnReadF198={cls="button";text="维修店代码";left=133;top=213;right=220;bottom=243;ah=1;aw=1;z=21}; +btnReadF199={cls="button";text="刷写日期";left=35;top=213;right=122;bottom=243;ah=1;aw=1;z=17}; +btnReadPressTh={cls="button";text="读取";left=420;top=418;right=507;bottom=448;ah=1;aw=1;z=10}; +btnWrite9001={cls="button";text="触发震动";left=42;top=373;right=157;bottom=403;ah=1;aw=1;z=24}; +btnWrite9002={cls="button";text="写入参考电压";left=181;top=411;right=281;bottom=441;ah=1;aw=1;z=27}; +btnWrite9003={cls="button";text="写入增益";left=180;top=449;right=281;bottom=479;ah=1;aw=1;z=28}; +btnWrite9004={cls="button";text="写入周期";left=181;top=487;right=282;bottom=517;ah=1;aw=1;z=51}; +btnWrite9005={cls="button";text="写入波形";left=181;top=528;right=282;bottom=558;ah=1;aw=1;z=57}; +btnWriteA00100={cls="button";text="调试帧关";left=126;top=98;right=213;bottom=128;ah=1;aw=1;z=53}; +btnWriteA00101={cls="button";text="调试帧开";left=27;top=98;right=114;bottom=128;ah=1;aw=1;z=52}; +btnWriteConfig={cls="button";text="写入配置";left=415;top=545;right=510;bottom=570;hide=1;z=49}; +btnWritePressTh={cls="button";text="写入";left=524;top=418;right=611;bottom=448;ah=1;aw=1;z=11}; +button={cls="button";text="震动5次";left=175;top=372;right=282;bottom=402;ah=1;aw=1;z=55}; +cb3E={cls="checkbox";text="3E保持";left=232;top=64;right=306;bottom=86;ah=1;aw=1;bgcolor=16777215;z=6}; +cbbDacRef={cls="combobox";left=42;top=411;right=172;bottom=437;ah=1;aw=1;edge=1;font=LOGFONT(h=-18);items={};mode="dropdown";z=25}; +cbbMotorGain={cls="combobox";left=42;top=449;right=172;bottom=475;ah=1;aw=1;edge=1;font=LOGFONT(h=-18);items={};mode="dropdown";z=26}; +combobox={cls="combobox";left=408;top=508;right=629;bottom=534;edge=1;font=LOGFONT(h=-18);items={};mode="dropdown";z=47}; +edDACPeriod={cls="edit";text="80";left=42;top=487;right=172;bottom=519;ah=1;align="center";aw=1;edge=1;font=LOGFONT(h=-18);num=1;z=50}; +edFactor={cls="edit";text="1.0";left=457;top=464;right=531;bottom=491;ah=1;align="center";aw=1;edge=1;font=LOGFONT(h=-18);z=44}; +edLog={cls="edit";left=649;top=12;right=970;bottom=586;ah=1;autohscroll=false;aw=1;edge=1;font=LOGFONT(h=-18);multiline=1;z=12}; +edPressTh1={cls="edit";text="500";left=531;top=97;right=605;bottom=124;ah=1;align="center";aw=1;edge=1;font=LOGFONT(h=-18);num=1;z=9}; +edPressTh2={cls="edit";text="500";left=531;top=136;right=605;bottom=163;ah=1;align="center";aw=1;edge=1;font=LOGFONT(h=-18);num=1;z=37}; +edPressTh3={cls="edit";text="500";left=531;top=175;right=605;bottom=202;ah=1;align="center";aw=1;edge=1;font=LOGFONT(h=-18);num=1;z=38}; +edPressTh4={cls="edit";text="500";left=531;top=215;right=605;bottom=242;ah=1;align="center";aw=1;edge=1;font=LOGFONT(h=-18);num=1;z=39}; +edPressTh5={cls="edit";text="500";left=531;top=254;right=605;bottom=281;ah=1;align="center";aw=1;edge=1;font=LOGFONT(h=-18);num=1;z=40}; +edPressTh6={cls="edit";text="500";left=531;top=294;right=605;bottom=321;ah=1;align="center";aw=1;edge=1;font=LOGFONT(h=-18);num=1;z=41}; +edPressTh7={cls="edit";text="500";left=531;top=333;right=605;bottom=360;ah=1;align="center";aw=1;edge=1;font=LOGFONT(h=-18);num=1;z=42}; +edPressTh8={cls="edit";text="500";left=531;top=373;right=605;bottom=400;ah=1;align="center";aw=1;edge=1;font=LOGFONT(h=-18);num=1;z=43}; +edWaveID={cls="edit";text="0";left=42;top=528;right=149;bottom=560;ah=1;align="center";aw=1;edge=1;font=LOGFONT(h=-18);multiline=1;num=1;z=56}; +groupbox={cls="groupbox";text="标定";left=398;top=13;right=638;bottom=586;ah=1;aw=1;edge=1;z=1}; +groupbox2={cls="groupbox";text="读取DID";left=20;top=181;right=329;bottom=347;ah=1;aw=1;edge=1;z=3}; +groupbox3={cls="groupbox";text="震动";left=20;top=351;right=390;bottom=580;ah=1;aw=1;edge=1;z=2}; +rbLeft={cls="radiobutton";text="左侧";left=61;top=15;right=115;bottom=35;ah=1;aw=1;bgcolor=16777215;checked=1;group=1;z=7}; +rbPressTh={cls="radiobutton";text="压力";left=440;top=35;right=506;bottom=61;ah=1;aw=1;bgcolor=16777215;checked=1;group=1;z=15}; +rbRight={cls="radiobutton";text="右侧";left=141;top=15;right=195;bottom=35;ah=1;aw=1;bgcolor=16777215;z=8}; +rbTouchTh={cls="radiobutton";text="触摸";left=529;top=35;right=595;bottom=61;ah=1;aw=1;bgcolor=16777215;z=16}; +spin={cls="spin";left=152;top=527;right=172;bottom=558;z=58}; +static={cls="static";text="按键";left=445;top=67;right=500;bottom=96;ah=1;aw=1;font=LOGFONT(h=-18);transparent=1;z=13}; +static10={cls="static";text="OK";left=420;top=371;right=521;bottom=398;center=1;font=LOGFONT(h=-18);transparent=1;z=36}; +static11={cls="static";text="系数";left=411;top=463;right=449;bottom=490;center=1;font=LOGFONT(h=-18);transparent=1;z=45}; +static2={cls="static";text="阈值";left=543;top=68;right=598;bottom=97;ah=1;aw=1;font=LOGFONT(h=-18);notify=1;transparent=1;z=14}; +static3={cls="static";text="恢复/语音";left=420;top=97;right=521;bottom=124;center=1;font=LOGFONT(h=-18);transparent=1;z=29}; +static4={cls="static";text="巡航/菜单";left=420;top=136;right=521;bottom=163;center=1;font=LOGFONT(h=-18);transparent=1;z=30}; +static5={cls="static";text="取消/返回";left=420;top=175;right=521;bottom=202;center=1;font=LOGFONT(h=-18);transparent=1;z=31}; +static6={cls="static";text="上";left=420;top=214;right=521;bottom=238;center=1;font=LOGFONT(h=-18);transparent=1;z=32}; +static7={cls="static";text="下";left=420;top=254;right=521;bottom=281;center=1;font=LOGFONT(h=-18);transparent=1;z=33}; +static8={cls="static";text="左";left=420;top=293;right=521;bottom=320;center=1;font=LOGFONT(h=-18);transparent=1;z=34}; +static9={cls="static";text="右";left=420;top=332;right=521;bottom=359;center=1;font=LOGFONT(h=-18);transparent=1;z=35} +) +/*}}*/ + +LSW_KeyArr = {"恢复","巡航","取消","上","下","左","右","OK"}; +RSW_KeyArr = {"语音","菜单","返回","上","下","左","右","OK"}; +Motor_refArr = {"0x0 1V0","0x1 1V1","0x2 1V2","0x3 1V25","0x4 2V0","0x5 2V2","0x6 2V4","0x7 2V5"}; +Motor_gainArr = {"Level0","Level1","Level2","Level3"} + + +winform.cbbDacRef.clear(); +for(k,v in Motor_refArr){ + winform.cbbDacRef.add(v); +} +winform.cbbDacRef.selIndex = 1; + +winform.cbbMotorGain.clear(); +for(k,v in Motor_gainArr){ + winform.cbbMotorGain.add(v); +} +winform.cbbMotorGain.selIndex = 1; + +import win.timer; + +Diag3E_Timer = win.timer(winform,4000); +Diag3E_Timer.onTimer = function(){ + CT_Diag3E(); +} + +Display = function(str){ + var nowtime = time(); + nowtime.format="%H:%M:%S"; + var side = winform.rbLeft.checked?"(左侧)":"(右侧)"; + winform.edLog.print(tostring(nowtime) ++ " " ++ side ++ str); +} + + + +winform.rbLeft.oncommand = function(id,event){ + CT_SetDiagID(0x720,0x620); +} + +winform.rbRight.oncommand = function(id,event){ + CT_SetDiagID(0x710,0x610); + +} + +winform.btn1001.oncommand = function(id,event){ + CT_Diag10(0x01); +} +winform.btn1003.oncommand = function(id,event){ + CT_Diag10(0x03); +} + +winform.cb3E.oncommand = function(id,event){ + if(winform.cb3E.checked == true){ + Diag3E_Timer.enable(); + } + else { + Diag3E_Timer.disable(); + } + +} +//import console; + + + +winform.btnReadPressTh.oncommand = function(id,event){ + CT_Diag10(0x01); + win.delay(20,1); + var didbase = winform.rbPressTh.checked?0x9020:0x9010; + for(name,ctrl in winform.eachControl("edit","edPressTh\d") ){ + ctrl.text = 0//string.right(name,1); + var did = didbase + tonumber(string.right(name,1)) - 1; + CT_Diag22(did); + win.delay(30,1); + var ret = GetReadThResp(did); + if(ret != 0){ + ctrl.text = ret; + } + } +} + + + +winform.btnWritePressTh.oncommand = function(id,event){ + CT_Diag10(0x03); + win.delay(50,1); + var didbase = winform.rbPressTh.checked?0x9020:0x9010; + for(name,ctrl in winform.eachControl("edit","edPressTh\d") ){ + //ctrl.text = 0//string.right(name,1); + var did = didbase + tonumber(string.right(name,1)) - 1; + var val = tonumber(ctrl.text); + if(val == 0){ + continue; + } + CT_Diag2EVal2B(did,val); + win.delay(50,1); + var ret = GetReadThResp(did); + if(ret != 0){ + ctrl.text = ret; + } + } +} + +winform.btnWrite9001.oncommand = function(id,event){ + CT_Diag10(0x03); + win.delay(20,1); + CT_Diag2EVal1B(0x9001,0x01); +} + +winform.btnWrite9002.oncommand = function(id,event){ + CT_Diag10(0x03); + win.delay(20,1); + var val = winform.cbbDacRef.selIndex - 1; + CT_Diag2EVal1B(0x9002,val); +} + +winform.btnWrite9003.oncommand = function(id,event){ + CT_Diag10(0x03); + win.delay(20,1); + var val = winform.cbbMotorGain.selIndex - 1; + CT_Diag2EVal1B(0x9003,val); +} + +winform.btnReadF199.oncommand = function(id,event){ + CT_Diag10(0x01); + win.delay(20,1); + CT_Diag22(0xF199); +} + +winform.btnReadF198.oncommand = function(id,event){ + CT_Diag10(0x01); + win.delay(20,1); + CT_Diag22(0xF198); +} + +winform.btnReadF18A.oncommand = function(id,event){ + CT_Diag10(0x01); + win.delay(20,1); + CT_Diag22(0xF18A); +} + +winform.btnReadF190.oncommand = function(id,event){ + CT_Diag10(0x01); + win.delay(20,1); + CT_Diag22(0xF190); +} + +winform.btnReadF187.oncommand = function(id,event){ + CT_Diag10(0x01); + win.delay(20,1); + CT_Diag22(0xF187); +} + +winform.btnReadF193.oncommand = function(id,event){ + CT_Diag10(0x01); + win.delay(20,1); + CT_Diag22(0xF193); +} + +winform.btnReadF195.oncommand = function(id,event){ + CT_Diag10(0x01); + win.delay(20,1); + CT_Diag22(0xF195); +} + +winform.btnConvert.oncommand = function(id,event){ + for(name,ctrl in winform.eachControl("edit","edPressTh\d") ){ + var val = tonumber(ctrl.text); + var x = tonumber(winform.edFactor.text); + if(math.isFinite(x) && math.isFinite(val)){ + ctrl.text = math.round(x * val); + } + + } +} +import fsys.ini; +var ini_file = fsys.ini("\配置文件.ini"); +var allconfig = ini_file.readSectionNames(); +for(k,v in allconfig){ + winform.combobox.add(v); +} +winform.combobox.selIndex = 1; +winform.btnReadConfig.oncommand = function(id,event){ + var sec = ini_file.getSection(winform.combobox.selText); + winform.edPressTh1.text = sec.key1; + winform.edPressTh2.text = sec.key2; + winform.edPressTh3.text = sec.key3; + winform.edPressTh4.text = sec.上; + winform.edPressTh5.text = sec.下; + winform.edPressTh6.text = sec.左; + winform.edPressTh7.text = sec.右; + winform.edPressTh8.text = sec.OK; +} + +winform.btnWriteConfig.oncommand = function(id,event){ + var sec = ini_file.getSection("小节名称"); + sec.key1 = 500; + sec.key2 = 500; + sec.key3 = 500; + sec.上 = 500; + sec.下 = 500; + sec.左 = 500; + sec.右 = 500; + sec.OK = 500; + sec.save(); +} + +winform.btnWrite9004.oncommand = function(id,event){ + CT_Diag10(0x03); + win.delay(20,1); + var val = tonumber(winform.edDACPeriod.text); + CT_Diag2EVal1B(0x9004,val); +} + +winform.btnWriteA00101.oncommand = function(id,event){ + CT_Diag10(0x03); + win.delay(20,1); + CT_Diag2EVal1B(0xA001,0x01); +} + +winform.btnWriteA00100.oncommand = function(id,event){ + CT_Diag10(0x03); + win.delay(20,1); + CT_Diag2EVal1B(0xA001,0x00); +} + +winform.btnRead7022.oncommand = function(id,event){ + CT_Diag10(0x01); + win.delay(20,1); + CT_Diag22(0x7022); +} +import win.timer; +timer1s = win.timer(winform,1000); +timer1s.onTimer = function(){ + //win.delay(20,1); + CT_Diag2EVal1B(0x9001,0x01); +} +timer1s.onEnd = function(){ + //Display("5次震动完成") +} + +winform.button.oncommand = function(id,event){ + CT_Diag10(0x03); + win.delay(20,10); + timer1s.enable(1000,5) +} + +winform.btnWrite9005.oncommand = function(id,event){ + CT_Diag10(0x03); + win.delay(20,1); + var val = tonumber(winform.edWaveID.text); + CT_Diag2EVal1B(0x9005,val); +} + +winform.btnRead9002.oncommand = function(id,event){ + var did = 0x9002; + CT_Diag22(did); + win.delay(50,1); + var ret = GetReadThResp(did); + if(ret < 8){ + winform.cbbDacRef.selIndex = ret + 1; + } +} + +winform.btnRead9003.oncommand = function(id,event){ + var did = 0x9003; + CT_Diag22(did); + win.delay(50,1); + var ret = GetReadThResp(did); + if(ret < 4){ + winform.cbbMotorGain.selIndex = ret + 1; + } +} + +winform.btnRead9004.oncommand = function(id,event){ + var did = 0x9004; + CT_Diag22(did); + win.delay(50,1); + var ret = GetReadThResp(did); + if(ret != 0){ + winform.edDACPeriod.text = ret; + } +} + +winform.spin.buddy = winform.edWaveID; +winform.spin.setRange(0,14); //一定要设置数值的上下限 +winform.spin.pos = 0;//设置数值 +winform.spin.inc = 1;//设置每次点击箭头的增减量(步长) + +winform.group(); + +winform.show(); +win.loopMessage(); +return winform; \ No newline at end of file diff --git a/dlg/msg.aardio b/dlg/msg.aardio new file mode 100644 index 0000000..3206c23 --- /dev/null +++ b/dlg/msg.aardio @@ -0,0 +1,108 @@ +import console; + +msg301_test1 = 0; +msg301_test2 = 0; +msg301_test3 = 0; +msg301_test4 = 0; +msg301_test5 = 0; +msg301_FanState = 0; +msg301_HeatState = 0; + + +getbitdata = function(byte,startbit,len){ + return ((byte>>startbit) & ((1< 0){ + for(i=1;#ret;1){ + setting.cbbDev.add(ret[i]); + } + setting.btnConnect.disabled = 0; + } + else { + setting.cbbDev.add("未找到硬件"); + setting.btnConnect.disabled = 1; + } + setting.cbbDev.selIndex = 1 +} + +setting.btnConnect.oncommand = function(id,event){ + CT_Connect(setting.cbbDev.selIndex,1,true); +} + +CAN_Connected_callback = function(){ + setting.cbbDev.disabled = 1 + setting.btnFresh.disabled = 1; + setting.btnConnect.disabled = 1; + MsgProTimer.enable(); +} + +setting.plus5.skin( + background = { + hover = "/res/images/btn-hover.png"; + focus = "/res/images/btn-focus.jpg"; + active = "/res/images/btn-active.png"; + disabled = "/res/images/btn-disabled.png"; + } +) +setting.plus5.oncommand = function(id,event){ + +} +default_cx=0,default_cy=0; +setting.plus.oncommand = function(id,event){ + var Screen_cx,Screen_cy = win.getScreen(); + if(setting.plus.checked){ + var x=0,y=0; + x,y,default_cx,default_cy = mainForm.getPos(); + mainForm.setPos(0,0,Screen_cx,default_cy/default_cx*Screen_cx); + } + else { + mainForm.setPos((Screen_cx-default_cx)/2,(Screen_cy-default_cy)/2,default_cx,default_cy); + } + +} +aboutcounter = 0; +setting.static4.oncommand = function(id,event){ + aboutcounter++; + if(aboutcounter >= 5){ + aboutcounter = 0; + var frmChild = mainForm.loadForm("\dlg\about.aardio"); + frmChild.doModal(mainForm); + } +} +GetReadThResp = function(did){ + var ret = CT_GetLastDiagResp(); + if(ret == null){ + return 0; + } + if(ret.sid == 0x62 && (ret.len >= 3)){ + var getdid = (ret.data[1]<<8) + ret.data[2]; + + if(getdid != did){ + return 0; + } + + if(ret.len == 4){ + var val = (ret.data[3]<<8) + ret.data[4]; + return val; + } + if(ret.len == 3){ + var val = ret.data[3]; + return val; + } + if(ret.len > 4){ + return table.slice(ret.data,3); + } + } + return 0; +} + +setting.show(); +win.loopMessage(); +return setting; \ No newline at end of file diff --git a/dlg/show.aardio b/dlg/show.aardio new file mode 100644 index 0000000..c7e31e7 --- /dev/null +++ b/dlg/show.aardio @@ -0,0 +1,249 @@ +import fonts.fontAwesome; +import win.ui; +import AntdUI; +import console; +/*DSG{{*/ +show = win.form(text="P417上位机";right=984;bottom=602;bgcolor=16777215;border="dialog frame";style=33554432) +show.add( +btn_Fan={cls="AntdUI.button";text="通风";left=81;top=506;right=162;bottom=581;bgcolor=65280;z=38}; +btn_HG_F={cls="AntdUI.button";text="滑轨前";left=25;top=212;right=106;bottom=287;bgcolor=65280;z=5}; +btn_HG_R={cls="AntdUI.button";text="滑轨后";left=317;top=213;right=398;bottom=288;bgcolor=65280;z=6}; +btn_Heat={cls="AntdUI.button";text="加热";left=207;top=508;right=288;bottom=583;bgcolor=65280;z=39}; +btn_KB_F={cls="AntdUI.button";text="靠背前";left=71;top=26;right=152;bottom=101;bgcolor=65280;z=1}; +btn_KB_R={cls="AntdUI.button";text="靠背后";left=257;top=26;right=338;bottom=101;bgcolor=65280;z=2}; +btn_TT_F={cls="AntdUI.button";text="腿托上";left=95;top=127;right=176;bottom=202;bgcolor=65280;z=7}; +btn_TT_R={cls="AntdUI.button";text="腿托下";left=82;top=297;right=163;bottom=372;bgcolor=65280;z=8}; +btn_ZY_D={cls="AntdUI.button";text="座椅下";left=226;top=297;right=307;bottom=372;bgcolor=65280;z=4}; +btn_ZY_U={cls="AntdUI.button";text="座椅上";left=232;top=131;right=313;bottom=206;bgcolor=65280;z=3}; +groupbox={cls="groupbox";text="滑轨电机";left=539;top=190;right=725;bottom=382;clipch=1;edge=1;z=14}; +groupbox2={cls="groupbox";text="靠背电机";left=743;top=193;right=929;bottom=385;edge=1;z=15}; +groupbox3={cls="groupbox";text="前升降电机";left=538;top=391;right=724;bottom=583;edge=1;z=16}; +groupbox4={cls="groupbox";text="后升降电机";left=741;top=390;right=927;bottom=582;edge=1;z=17}; +st_FanState={cls="static";text="Static";left=765;top=28;right=896;bottom=57;center=1;font=LOGFONT(h=-16);transparent=1;z=40}; +st_HeatState={cls="static";text="Static";left=765;top=55;right=896;bottom=84;center=1;font=LOGFONT(h=-16);transparent=1;z=41}; +st_hg_hallio={cls="static";text="Static";left=556;top=246;right=687;bottom=275;center=1;font=LOGFONT(h=-16);z=19}; +st_hg_loc={cls="static";text="Static";left=556;top=275;right=687;bottom=304;center=1;font=LOGFONT(h=-16);z=20}; +st_hg_state={cls="static";text="Static";left=556;top=217;right=687;bottom=246;center=1;font=LOGFONT(h=-16);z=18}; +st_hg_stop1={cls="static";text="Static";left=556;top=304;right=687;bottom=333;center=1;font=LOGFONT(h=-16);z=21}; +st_hg_stop2={cls="static";text="Static";left=556;top=333;right=687;bottom=362;center=1;font=LOGFONT(h=-16);z=22}; +st_kb_hallio={cls="static";text="Static";left=758;top=241;right=889;bottom=270;center=1;font=LOGFONT(h=-16);z=24}; +st_kb_loc={cls="static";text="Static";left=758;top=270;right=889;bottom=299;center=1;font=LOGFONT(h=-16);z=25}; +st_kb_state={cls="static";text="Static";left=758;top=212;right=889;bottom=241;center=1;font=LOGFONT(h=-16);z=23}; +st_kb_stop1={cls="static";text="Static";left=758;top=299;right=889;bottom=328;center=1;font=LOGFONT(h=-16);z=26}; +st_kb_stop2={cls="static";text="Static";left=758;top=328;right=889;bottom=357;center=1;font=LOGFONT(h=-16);z=27}; +st_test1={cls="static";text="Static";left=552;top=34;right=683;bottom=63;center=1;font=LOGFONT(h=-16);transparent=1;z=9}; +st_test2={cls="static";text="Static";left=552;top=64;right=683;bottom=93;center=1;font=LOGFONT(h=-16);transparent=1;z=10}; +st_test3={cls="static";text="Static";left=552;top=94;right=683;bottom=123;center=1;font=LOGFONT(h=-16);transparent=1;z=11}; +st_test4={cls="static";text="Static";left=552;top=124;right=683;bottom=153;center=1;font=LOGFONT(h=-16);transparent=1;z=12}; +st_test5={cls="static";text="Static";left=552;top=154;right=683;bottom=183;center=1;font=LOGFONT(h=-16);transparent=1;z=13}; +st_tt_hallio={cls="static";text="Static";left=561;top=452;right=692;bottom=481;center=1;font=LOGFONT(h=-16);z=29}; +st_tt_loc={cls="static";text="Static";left=561;top=481;right=692;bottom=510;center=1;font=LOGFONT(h=-16);z=30}; +st_tt_state={cls="static";text="Static";left=561;top=423;right=692;bottom=452;center=1;font=LOGFONT(h=-16);z=28}; +st_tt_stop1={cls="static";text="Static";left=561;top=510;right=692;bottom=539;center=1;font=LOGFONT(h=-16);z=31}; +st_tt_stop2={cls="static";text="Static";left=561;top=539;right=692;bottom=568;center=1;font=LOGFONT(h=-16);z=32}; +st_zy_hallio={cls="static";text="Static";left=764;top=448;right=895;bottom=477;center=1;font=LOGFONT(h=-16);z=34}; +st_zy_loc={cls="static";text="Static";left=764;top=477;right=895;bottom=506;center=1;font=LOGFONT(h=-16);z=35}; +st_zy_state={cls="static";text="Static";left=764;top=419;right=895;bottom=448;center=1;font=LOGFONT(h=-16);z=33}; +st_zy_stop1={cls="static";text="Static";left=764;top=506;right=895;bottom=535;center=1;font=LOGFONT(h=-16);z=36}; +st_zy_stop2={cls="static";text="Static";left=764;top=535;right=895;bottom=564;center=1;font=LOGFONT(h=-16);z=37} +) +/*}}*/ + +txdata = {0,0,0,0, 0,0,0,0}; + +//import usb2canfd; +import win.timer +var showtimer = win.timer( show ,50); +showtimer.onTimer = function(){ + CT_UpdateCANTxMsg(0x201,10,txdata); + signaldislay(); +} + +signaldislay = function(){ + show.st_test1.text = msg301_test1*(80.4/12.4)/100; + show.st_test2.text = msg301_test2; + show.st_test3.text = msg301_test3; + show.st_test4.text = msg301_test4; + show.st_test5.text = msg301_test5; + show.st_hg_state.text = msgDebug[1]["status"] + show.st_hg_hallio.text = msgDebug[1]["hallio"] + show.st_hg_loc.text = msgDebug[1]["loc"] + show.st_hg_stop1.text = msgDebug[1]["stop1"] + show.st_hg_stop2.text = msgDebug[1]["stop2"] + + show.st_kb_state.text = msgDebug[2]["status"] + show.st_kb_hallio.text = msgDebug[2]["hallio"] + show.st_kb_loc.text = msgDebug[2]["loc"] + show.st_kb_stop1.text = msgDebug[2]["stop1"] + show.st_kb_stop2.text = msgDebug[2]["stop2"] + + show.st_tt_state.text = msgDebug[3]["status"] + show.st_tt_hallio.text = msgDebug[3]["hallio"] + show.st_tt_loc.text = msgDebug[3]["loc"] + show.st_tt_stop1.text = msgDebug[3]["stop1"] + show.st_tt_stop2.text = msgDebug[3]["stop2"] + + show.st_zy_state.text = msgDebug[4]["status"] + show.st_zy_hallio.text = msgDebug[4]["hallio"] + show.st_zy_loc.text = msgDebug[4]["loc"] + show.st_zy_stop1.text = msgDebug[4]["stop1"] + show.st_zy_stop2.text = msgDebug[4]["stop2"] + show.st_FanState.text = msg301_FanState; + show.st_HeatState.text = msg301_HeatState; +} + + +set_txdataTabBit = function(bitnum,val){ + if(bitnum >= 64){ + return ; + } + if(val > 1){ + return ; + } + var bytenum = math.floor( bitnum / 8 ) + 1; + bitnum = bitnum%8; + + var temp = txdata[bytenum]; + if(val){ + temp = temp | (1 << bitnum); + } + else { + temp = temp & (~(1 << bitnum)); + } + txdata[bytenum] = temp; +} + + +if(mainForm != null){ + CT_UpdateCANTxMsg(0x30,200,txdata); + showtimer.enable(); +} + +//console.log("tet"); + +show.btn_KB_F.wndproc = function(hwnd,message,wParam,lParam){ + + //无返回值则继续调用默认回调函数 + select(message) { + case 0x202/*_WM_LBUTTONUP*/ { + set_txdataTabBit(5,0); + } + case 0x201/*_WM_LBUTTONDOWN*/ { + set_txdataTabBit(5,1) + } + } +} +show.btn_KB_R.wndproc = function(hwnd,message,wParam,lParam){ + + //无返回值则继续调用默认回调函数 + select(message) { + case 0x202/*_WM_LBUTTONUP*/ { + set_txdataTabBit(4,0); + } + case 0x201/*_WM_LBUTTONDOWN*/ { + set_txdataTabBit(4,1) + } + } +} + +show.btn_HG_F.wndproc = function(hwnd,message,wParam,lParam){ + + //无返回值则继续调用默认回调函数 + select(message) { + case 0x202/*_WM_LBUTTONUP*/ { + set_txdataTabBit(7,0); + } + case 0x201/*_WM_LBUTTONDOWN*/ { + set_txdataTabBit(7,1) + } + } +} +show.btn_HG_R.wndproc = function(hwnd,message,wParam,lParam){ + + //无返回值则继续调用默认回调函数 + select(message) { + case 0x202/*_WM_LBUTTONUP*/ { + set_txdataTabBit(6,0); + } + case 0x201/*_WM_LBUTTONDOWN*/ { + set_txdataTabBit(6,1) + } + } +} + +show.btn_ZY_U.wndproc = function(hwnd,message,wParam,lParam){ + + //无返回值则继续调用默认回调函数 + select(message) { + case 0x202/*_WM_LBUTTONUP*/ { + set_txdataTabBit(1,0); + } + case 0x201/*_WM_LBUTTONDOWN*/ { + set_txdataTabBit(1,1) + } + } +} +show.btn_ZY_D.wndproc = function(hwnd,message,wParam,lParam){ + + //无返回值则继续调用默认回调函数 + select(message) { + case 0x202/*_WM_LBUTTONUP*/ { + set_txdataTabBit(0,0); + } + case 0x201/*_WM_LBUTTONDOWN*/ { + set_txdataTabBit(0,1) + } + } +} +show.btn_TT_F.wndproc = function(hwnd,message,wParam,lParam){ + + //无返回值则继续调用默认回调函数 + select(message) { + case 0x202/*_WM_LBUTTONUP*/ { + set_txdataTabBit(3,0); + } + case 0x201/*_WM_LBUTTONDOWN*/ { + set_txdataTabBit(3,1) + } + } +} +show.btn_TT_R.wndproc = function(hwnd,message,wParam,lParam){ + + //无返回值则继续调用默认回调函数 + select(message) { + case 0x202/*_WM_LBUTTONUP*/ { + set_txdataTabBit(2,0); + } + case 0x201/*_WM_LBUTTONDOWN*/ { + set_txdataTabBit(2,1) + } + } +} +show.btn_Fan.wndproc = function(hwnd,message,wParam,lParam){ + + //无返回值则继续调用默认回调函数 + select(message) { + case 0x202/*_WM_LBUTTONUP*/ { + set_txdataTabBit(16,0); + } + case 0x201/*_WM_LBUTTONDOWN*/ { + set_txdataTabBit(16,1) + } + } +} +show.btn_Heat.wndproc = function(hwnd,message,wParam,lParam){ + + //无返回值则继续调用默认回调函数 + select(message) { + case 0x202/*_WM_LBUTTONUP*/ { + set_txdataTabBit(17,0); + } + case 0x201/*_WM_LBUTTONDOWN*/ { + set_txdataTabBit(17,1) + } + } +} + + +show.show(); +return win.loopMessage(); \ No newline at end of file diff --git a/dlg/switch.aardio b/dlg/switch.aardio new file mode 100644 index 0000000..946b603 --- /dev/null +++ b/dlg/switch.aardio @@ -0,0 +1,20 @@ +import win.ui; +import fonts.fontAwesome; +/*DSG{{*/ +var winform = win.form(text="wubiLex - 帮助";right=984;bottom=607;bgcolor=16777215;style=33554432) +winform.add() +/*}}*/ + + +var SignalTimer = win.timer(,50); +SignalTimer.onTimer = function(){ + //SignalDisplay(); +} +SignalTimer.enable(); + + + + +winform.show(); +win.loopMessage(); +return winform; \ No newline at end of file diff --git a/lib/config.aardio b/lib/config.aardio new file mode 100644 index 0000000..5da06a0 --- /dev/null +++ b/lib/config.aardio @@ -0,0 +1,17 @@ +//config 配置文件 +import fsys.config; +config = fsys.config("/config/"); +//config = fsys.config( io.appData("/软件作者/应用程序名/") ); + +//不需要序列化的配置名字前请添加下划线 +namespace config { + __appName = "应用程序名"; + __website = "http://www.aardio.com/"; +} + +/**intellisense(config) +__appName = 应用程序名 +__website = 官方网站 +saveAll() = 写入所有配置到文件 +? = 获取值时指定不以下划线开始的配置表名称,\n返回一个可自动序列化到同名配置文件的表对象。\n如果此对象名以下划线开始,则可以正常读写值不会序列化为配置文件。\n否则不能对此对象直接赋值,只能对配置表对象的成员赋值。\n\n配置表可自动自文件加载,退出线程前自动序列化并存入文件。\n仅序列化以字符串、数值为键的元素,\n仅序列化值为字符串、数值、buffer 以及定义了 _serialize 元方法的成员。\n循环引用的值转换为 null,序列化时忽略成员函数\n!fsys_table. +end intellisense**/ \ No newline at end of file diff --git a/lib/style.aardio b/lib/style.aardio new file mode 100644 index 0000000..23ad42b --- /dev/null +++ b/lib/style.aardio @@ -0,0 +1,121 @@ +//style 外观样式 + +namespace style{ + primaryButton = { + background={ + default=0xFF8FB2B0; + hover=0xFF928BB3; + disabled=0xFFCCCCCC; + } + }; + button = { + background={ + default=0x668FB2B0; + hover=0xFF928BB3; + disabled=0xFFCCCCCC; + } + }; + transButton = { + background={ + default=0; + hover=0xFF928BB3; + disabled=0xFFCCCCCC; + } + }; + checkBox = { + color = { + hover = 0xFFFF0000; + active = 0xFF00FF00; + } + checked = { + color = { + hover = 0xFFFF0000; + active = 0xFF00FF00; + } + text = '\uF14a'/*_FA_CHECK_SQUARE*/ + } + }; + Check ={ + color = { + hover = 0xFFFF0000; + active = 0xFF00FF00; + } + checked = { + iconText = '\uF058'/*_FA_CHECK_CIRCLE*/ + } + }; + link = { + color = { + hover = 0xFFFF0000; + active = 0xFF00FF00; + } + }; + dropdown = { + foreground={ + default = 0xFFFFFFFF; + hover= 0xFF8ADBAF; + }; + checked = { + foreground={ + default = 0xFFDB8A8E; + hover= 0xFF8ADBAF; + }; + } + }; + key = { + foreground={ + default = 0x00FFFFFF; + hover= 0xFF8ADBAF; + }; + }; + + radioMode = { + group = "Mode"; + color={ + default=0xFF000000; + disabled=0xFF6D6D6D; + hover=0xFF87CEFA + }; + checked={ + iconText='\uF046' + } + } + radioColor = { + group = "Color"; + color={ + default=0xFF000000; + disabled=0xFF6D6D6D; + hover=0xFF87CEFA + }; + checked={ + iconText='\uF046' + } + } + radioLight = { + group = "Light"; + color={ + default=0xFF000000; + disabled=0xFF6D6D6D; + hover=0xFF87CEFA + }; + checked={ + iconText='\uF046' + } + } + radioFreq = { + group = "Freq"; + color={ + default=0xFF000000; + disabled=0xFF6D6D6D; + hover=0xFF87CEFA + }; + checked={ + iconText='\uF046' + } + } + plusTip = { + color={ + default=0xFF3C3C3C + } + } +} diff --git a/lib/usb2canfd.aardio b/lib/usb2canfd.aardio new file mode 100644 index 0000000..6420854 --- /dev/null +++ b/lib/usb2canfd.aardio @@ -0,0 +1,489 @@ +/* +*使用说明: +*1.创建CAN设备对象 CANHw = usb2canfd.USB2CANHW(); +*2.加载DLL CANHw.LoadDll(); +*3.扫描设备 hwnum = CANHw.FlashHw(); +*4.获取可用设备 allhw = CANHw.GetAvailableHW(); +*5.打开设备(初始化) CANHw.OpenDevice(设备序号,通道) +*6.通过SendMsg和GetMsg发送和获取报文 +*/ +namespace usb2canfd{ + //参考 http://www.toomoss.com/help/index.htm + + + //初始化CAN的数据类型定义 + class CANFD_INIT_CONFIG{ + ctor( /*输入构造函数所需要的参数*/ ){ + + }; + type=me; + /*对象的所有成员必须用分号分隔*/ + BYTE Mode; //0-正常模式,1-自发自收模式 + BYTE ISOCRCEnable;//0-禁止ISO CRC,1-使能ISO CRC + BYTE RetrySend;//0-禁止重发,1-无限制重发 + BYTE ResEnable;//0-不接入内部120欧终端电阻,1-接入内部120欧终端电阻 + //波特率参数可以用TCANLINPro软件里面的波特率计算工具计算 + //仲裁段波特率参数,波特率=40M/NBT_BRP*(1+NBT_SEG1+NBT_SEG2) + BYTE NBT_BRP; + BYTE NBT_SEG1; + BYTE NBT_SEG2; + BYTE NBT_SJW; + //数据段波特率参数,波特率=40M/DBT_BRP*(1+DBT_SEG1+DBT_SEG2) + BYTE DBT_BRP; + BYTE DBT_SEG1; + BYTE DBT_SEG2; + BYTE DBT_SJW; + BYTE __Res0[8]; + } + + //初始化CAN的数据类型定义 + class CAN_INIT_CONFIG{ + ctor( /*输入构造函数所需要的参数*/ ){ + + }; + type=me; + /*对象的所有成员必须用分号分隔*/ + //CAN波特率 = 100MHz/(CAN_BRP)/(CAN_SJW+CAN_BS1+CAN_BS2) + INT CAN_BRP; //取值范围1~1024 + BYTE CAN_SJW; //取值范围1~4 + BYTE CAN_BS1; //取值范围1~16 + BYTE CAN_BS2; //取值范围1~8 + BYTE CAN_Mode; //CAN工作模式,0-正常模式,1-环回模式,2-静默模式,3-静默环回模式,bit7为1则接入适配器内部终端电阻,否则不接入 + BYTE CAN_ABOM; //自动离线管理,0-禁止,1-使能 + BYTE CAN_NART; //报文重发管理,0-使能报文重传,1-禁止报文重传 + BYTE CAN_RFLM; //FIFO锁定管理,0-新报文覆盖旧报文,1-丢弃新报文 + 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( /*输入构造函数所需要的参数*/ ){ + + }; + type=me; + /*对象的所有成员必须用分号分隔*/ + INT ID; //报文ID。 //| (1<<31);//扩展帧 + BYTE DLC; //数据字节长度,可设置为-0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64 + BYTE Flags; //bit[0]-BRS,bit[1]-ESI,bit[2]-FDF,bit[6..5]-Channel,bit[7]-RXD + BYTE __Res0; //保留 + BYTE __Res1; //保留 + INT TimeStamp; //帧接收或者发送时的时间戳,单位为10us + BYTE Data[64]; //报文的数据。 + } + + //CAN信息帧的数据类型定义 + class CAN_MSG{ + ctor( /*输入构造函数所需要的参数*/ ){ + + }; + type=me; + /*对象的所有成员必须用分号分隔*/ + INT ID; //报文ID。 + INT TimeStamp; //接收到信息帧时的时间标识,从CAN 控制器初始化开始计时。 + BYTE RemoteFlag; //是否是远程帧 + BYTE ExternFlag; //是否是扩展帧 + BYTE DataLen; //数据长度(<=8),即Data 的长度。 + BYTE Data[8]; //报文的数据。 + BYTE __Res; + } + + class CAN_UDS_ADDR{ + ctor( /*输入构造函数所需要的参数*/ ){ + + }; + type=me; + /*对象的所有成员必须用分号分隔*/ + INT ReqID; //请求报文ID。 + INT ResID; //应答报文ID。 + BYTE Flag; //bit[0]-帧类型(0-标准帧,1-扩展帧), + //bit[1]-FDF(0-普通CAN帧,1-CANFD帧), + //bit[2]-BRS(0-CANFD帧不加速,1-CANFD帧加速) + BYTE AddrFormats; //0-normal, 1-extended ,2-mixed + BYTE AddrExt; //当AddrFormats不为normal时,该数据放到CAN数据域第1字节 + BYTE MaxDLC; //每帧最大数据字节数,一般设置为8 + + } + + + class DEVICE_INFO{ + ctor( /*输入构造函数所需要的参数*/ ){ + + }; + type=me; + /*对象的所有成员必须用分号分隔*/ + BYTE FirmwareName[32]; //固件名称字符串 + BYTE BuildDate[32]; //固件编译时间字符串 + INT HardwareVersion; //硬件版本号 + INT FirmwareVersion; //固件版本号 + INT SerialNumber[3]; //适配器序列号 + INT Functions; //适配器当前具备的功能 + } + + + + //调用函数 + class USB2CANHW{ + ctor( /*输入构造函数所需要的参数*/ ){ + + }; + type=me; + /*对象的所有成员必须用分号分隔*/ + + //初始化全局变量 + DllHandle = null; + + + + //加载DLL + LoadDll = function(){ + try{ + DllHandle = ..raw.loadDll("\USB2XXX.dll") + } + catch(err) + { + import win; + DllHandle = null; + win.msgboxTimeout("加载USB2LIN的DLL失败,请检查USB2XXX.dll和libusb-1.0.dll文件","错误",3000,); + } + if(DllHandle == null)return 1; + return 0; + } + + //刷新硬件 + FlashHw = function(){ + + if(DllHandle = null){ + //DLL为空,返回 + AvailableHW = {} + return 0; + } + var arr_temp = {int value[] = { length = 10/*可以使用变量*/ } }//类似动态数组 + HwNum = DllHandle.USB_ScanDevice(arr_temp) + AvailableHW = {} + for(i=1;HwNum;1){ + var devtemp = {}; + devtemp.devnum = i; + devtemp.channel = 1; + devtemp.hLINHW = arr_temp.value[i]; + devtemp.name = "dev-" + i + ":" + tostring(arr_temp.value[i],16); + ..table.push(AvailableHW,devtemp); + } + return HwNum; //返回有效硬件数 + } + + //获取设备信息 + GetDevInfo = function(index){ + if(index > HwNum) + { //如果序号大于最大硬件数 + return 0; + } + DllHandle.USB_OpenDevice(AvailableHW[index].hLINHW); + var DeviceInfo = ..usb2canfd.DEVICE_INFO(); + var funcstr = ..raw.buffer(100); + + var ret = DllHandle.DEV_GetDeviceInfo(AvailableHW[index].hLINHW,DeviceInfo,funcstr); + + return ret,DeviceInfo,funcstr; + } + + //获取设备信息 + GetNowInfo = function(){ + if(Hwconnected == null){ + return 0; + } + //DllHandle.USB_OpenDevice(Hwconnected); + var DeviceInfo = ..usb2canfd.DEVICE_INFO(); + var funcstr = ..raw.buffer(100); + + var ret = DllHandle.DEV_GetDeviceInfo(Hwconnected,DeviceInfo,funcstr); + + return ret,DeviceInfo,funcstr; + } + + //获取有效硬件 + GetAvailableHW = function(){ + 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) + { //如果序号大于最大硬件数 + return 0; + } + var ret = DllHandle.USB_OpenDevice(AvailableHW[index].hLINHW) + canfd = true; + if(canfd == true){ + canconfig = ..usb2canfd.CANFD_INIT_CONFIG(); + + canconfig.Mode = 0; //0-正常模式,1-自发自收模式 + canconfig.ISOCRCEnable = 0;//0-禁止ISO CRC,1-使能ISO CRC + canconfig.RetrySend = 0;//0-禁止重发,1-无限制重发 + canconfig.ResEnable = 1;//0-不接入内部120欧终端电阻,1-接入内部120欧终端电阻 + //波特率参数可以用TCANLINPro软件里面的波特率计算工具计算 + //仲裁段波特率参数,波特率=40M/NBT_BRP*(1+NBT_SEG1+NBT_SEG2) + canconfig.NBT_BRP = 1; //参数来自官方上位机,默认500K + canconfig.NBT_SEG1 = 59; + canconfig.NBT_SEG2 = 20; + canconfig.NBT_SJW = 2; + //数据段波特率参数,波特率=40M/DBT_BRP*(1+DBT_SEG1+DBT_SEG2) + canconfig.DBT_BRP = 2; //参数来自官方上位机,默认500K + canconfig.DBT_SEG1 = 29; + canconfig.DBT_SEG2 = 10; + canconfig.DBT_SJW = 2; + + ret = DllHandle.CANFD_Init(AvailableHW[index].hLINHW,channel,canconfig); + } + else { + canconfig = ..usb2canfd.CAN_INIT_CONFIG(); + + canconfig.CAN_Mode = 0x80;//0-正常模式 1-环回模式 0x80终端电阻 + + canconfig.CAN_ABOM = 0;//禁止自动离线 + canconfig.CAN_NART = 0;//禁止报文重传 + canconfig.CAN_RFLM = 0;//FIFO满之后覆盖旧报文 + canconfig.CAN_TXFP = 1;//发送请求决定发送顺序 + //配置波特率,波特率 = 42M/(BRP*(SJW+BS1+BS2)) + canconfig.CAN_BRP = 4; + canconfig.CAN_BS1 = 15; + canconfig.CAN_BS2 = 5; + canconfig.CAN_SJW = 2; + ret = DllHandle.CAN_Init(AvailableHW[index].hLINHW,channel,canconfig); + //console.log("init ret = " + ret); + this.SetFilter(index); + } + + canfd_connected = canfd; + if(ret == 0){//调用成功 + Hwconnected = AvailableHW[index].hLINHW; + Chconntected = channel; + + } + else { + //Hwconnected = null + Chconntected = null; + } + + return ret; + } + + //关闭设备 + CloseDevice = function(){ + if(Hwconnected == null){ + return; + } + try{ + DllHandle.USB_CloseDevice(Hwconnected); + Hwconnected = null; + } + } + + //是否连接 + isConnected = function(){ + if(Hwconnected == null){ + return false; + } + else { + return true; + } + + } + + + //发送报文 + SendMsg = function(id,data){ + if(Hwconnected == null){//未连接 + return 0; + } + if(#data == 0 || #data>8){//长度不对 + return 0; + } + var ret = 0; + //console.log("发送报文") + if(canfd_connected == true){ + var msg = ..usb2canfd.CANFD_MSG(); + msg.Flags = 0; + if(id <= 0x7ff){ + msg.ID = id; //| (1<<31);//扩展帧 + } + else { + msg.ID = id | (1<<31);//扩展帧 + } + + + msg.DLC = #data; + msg.Data = data; + + //console.dumpJson(msg); + //console.log("Hwconnected = " + Hwconnected); + //console.log("Chconntected = " + Chconntected); + ret = DllHandle.CANFD_SendMsg(Hwconnected,Chconntected,msg,1); + } + else { + var msg = ..usb2canfd.CAN_MSG(); + //msg.Flags = 0; + if(id <= 0x7ff){ + msg.ID = id; //| (1<<31);//扩展帧 + } + else { + msg.ID = id | (1<<31);//扩展帧 + } + msg.ExternFlag = 0; + msg.RemoteFlag = 0; + msg.DataLen = #data; + msg.Data = data; + //console.log("发送报文") + ret = DllHandle.CAN_SendMsg(Hwconnected,Chconntected,msg,1); + //console.log("ret = " + ret); + } + + + return ret; + } + + //从设备缓冲区获取报文 + GetMsg = function(){ + var ret = 0; + var retdata = {}; + if(canfd_connected == true){ + //CANFD + do{ + var msgbuf = ..usb2canfd.CANFD_MSG(); + ret = DllHandle.CANFD_GetMsg(Hwconnected,CANIndex,msgbuf,1); + if(ret == 1){ + var data = {}; + for(i=1;msgbuf.DLC;1){ + data[i] = msgbuf.Data[i]; + } + var msg = {"id"=msgbuf.ID;"data"=data;};// + ..table.push(retdata,msg); + } + }while(ret > 0) + } + else { + //CAN + do{ + //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[1].DataLen;1){ + data[i] = msgbuf[1].Data[i]; + } + var msg = {"id"=msgbuf[1].ID;"data"=data;};// + ..table.push(retdata,msg); + } + }while(ret > 0) + } + + + return retdata; + } + + GetDiag = function(data){ + if(#data<2){ + return 0,1; + } + var UDSAddr = ..usb2canfd.CAN_UDS_ADDR() + UDSAddr.Flag = 1;//使用扩展帧 + UDSAddr.AddrFormats = 0; + UDSAddr.ReqID = 0x18dadff1; + UDSAddr.ResID = 0x18daf1df; + UDSAddr.MaxDLC = 8; + var req_data = ..raw.buffer(#data); + for(i=1;#data;1){ + req_data[i] = data[i]; + } + ret = DllHandle.CAN_UDS_Request(Hwconnected,CANIndex,UDSAddr,req_data,#data); + var res_data = ..raw.buffer(4096); + //sleep(10); + var ret = DllHandle.CAN_UDS_Response(Hwconnected,CANIndex,UDSAddr,res_data,1000); + + 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; + } + + + + + } +} + + +/**intellisense() +usb2canfd = 图莫斯CANFD驱动 +usb2canfd.USB2CANHW = USB2CAN库 +usb2canfd.USB2CANHW() = 创建设备对象\n!usb2canfdUSB2CANHW. +!usb2canfdUSB2CANHW.LoadDll() = 加载DLL +!usb2canfdUSB2CANHW.FlashHw() = 刷新硬件 +!usb2canfdUSB2CANHW.GetDevInfo() = 获取设备信息 +!usb2canfdUSB2CANHW.GetAvailableHW() = 获取有效设备,需要先FlashHw()刷新 +!usb2canfdUSB2CANHW.OpenDevice() = 打开设备 +!usb2canfdUSB2CANHW.CloseDevice() = 关闭设备 +!usb2canfdUSB2CANHW.isConnected() = 是否已连接 +!usb2canfdUSB2CANHW.SendMsg() = 发送报文 +!usb2canfdUSB2CANHW.GetMsg() = 接收报文 +end intellisense**/ + diff --git a/main.aardio b/main.aardio new file mode 100644 index 0000000..67f31b2 --- /dev/null +++ b/main.aardio @@ -0,0 +1,66 @@ +import fonts.fontAwesome; +import win.ui; +/*DSG{{*/ +mainForm = win.form(text="ALV-77B上位机";right=984;bottom=642;bgcolor=16777215;border="none";max=false) +mainForm.add( +caption={cls="bkplus";text="P417-77";left=35;top=12;right=160;bottom=30;color=15780518;dl=1;dt=1;font=LOGFONT(h=-16);z=5}; +custom={cls="custom";text="1";left=-7;top=42;right=978;bottom=645;bgcolor=16777215;db=1;dl=1;dr=1;dt=1;z=1}; +logo={cls="bkplus";text='\uF0E4';left=6;top=9;right=35;bottom=34;color=15780518;dl=1;dt=1;font=LOGFONT(h=-18;name='FontAwesome');z=4}; +navDiag={cls="plus";text="诊断";left=421;top=5;right=541;bottom=40;align="left";color=16777215;dl=1;dt=1;font=LOGFONT(h=-16);iconStyle={align="left";font=LOGFONT(h=-19;name='FontAwesome');padding={left=12;top=4}};iconText='\uF108';notify=1;paddingLeft=1;paddingRight=1;paddingTop=3;textPadding={left=39;bottom=1};x=0.5;y=0.2;z=8}; +navFirst={cls="plus";text="控制";left=180;top=5;right=300;bottom=40;align="left";color=16777215;dl=1;dt=1;font=LOGFONT(h=-16);iconStyle={align="left";font=LOGFONT(h=-19;name='FontAwesome');padding={left=12;top=4}};iconText='\uF00A';notify=1;paddingLeft=1;paddingRight=1;paddingTop=3;textPadding={left=39;bottom=1};x=0.5;y=0.2;z=3}; +navHelp={cls="plus";text="信号";left=300;top=5;right=420;bottom=40;align="left";color=16777215;dl=1;dt=1;font=LOGFONT(h=-16);iconStyle={align="left";font=LOGFONT(h=-19;name='FontAwesome');padding={left=12;top=4}};iconText='\uF012';notify=1;paddingLeft=1;paddingRight=1;paddingTop=3;textPadding={left=39;bottom=1};x=0.5;y=0.2;z=7}; +navSetting={cls="plus";text="设置";left=541;top=5;right=661;bottom=40;align="left";color=16777215;dl=1;dt=1;font=LOGFONT(h=-16);iconStyle={align="left";font=LOGFONT(h=-19;name='FontAwesome');padding={left=12;top=4}};iconText='\uF085';notify=1;paddingLeft=1;paddingRight=1;paddingTop=3;textPadding={left=39;bottom=1};x=0.5;y=0.2;z=6}; +titleBar={cls="bkplus";left=0;top=0;right=985;bottom=41;bgcolor=14977280;dl=1;dr=1;dt=1;z=2} +) +/*}}*/ + +import win.ui.simpleWindow; +win.ui.simpleWindow( mainForm ); + +import win.ui.tabs; +var tbs = win.ui.tabs( + mainForm.navFirst, + mainForm.navSetting, + mainForm.navHelp, + mainForm.navDiag, +); + +tbs.skin({ + foreground={ + active=0xFFFFFFFF; + default=0x00FFFFFF; + hover=0x38FFFFFF + }; + color={ + default=0xFFFFFFFF; + }; + checked={ + foreground={default=0xFFFFFFFF;}; + color={default=0xFF42A875;}; + } +}) + +tbs.loadForm(1,"\dlg\show.aardio" ); +tbs.loadForm(2,"\dlg\switch.aardio" ); +tbs.loadForm(3,"\dlg\diagnostic.aardio"); +tbs.loadForm(4,"\dlg\setting.aardio" ); + +subscribe("语言",function(conf){ + if(conf == "English"){ + mainForm.navFirst.text = "Control" + mainForm.navSetting.text = "setting" + mainForm.navHelp.text = "Signal" + } + else { + mainForm.navFirst.text = "控制" + mainForm.navSetting.text = "设置" + mainForm.navHelp.text = "信号" + } + +} ) + + +tbs.selIndex = 4; +mainForm.show(); + +return win.loopMessage(); \ No newline at end of file diff --git a/res/P417.png b/res/P417.png new file mode 100644 index 0000000..f014ff6 Binary files /dev/null and b/res/P417.png differ diff --git a/res/icon.ico b/res/icon.ico new file mode 100644 index 0000000..dfbb71b Binary files /dev/null and b/res/icon.ico differ diff --git a/配置文件.ini b/配置文件.ini new file mode 100644 index 0000000..7f5ee0e --- /dev/null +++ b/配置文件.ini @@ -0,0 +1,59 @@ +[-ѹ2N] +key1=271 +key2=365 +key3=584 +=223 +=412 +=295 +=315 +OK=330 + +[-ѹ3N] +key1=494 +key2=581 +key3=894 +=370 +=666 +=487 +=496 +OK=488 + +[-ѹ4N] +key1=692 +key2=795 +key3=1106 +=566 +=893 +=695 +=686 +OK=709 + +[Ҳ-ѹ2N] +key1=191 +key2=234 +key3=325 +=154 +=223 +=224 +=163 +OK=188 + +[Ҳ-ѹ3N] +key1=325 +key2=379 +key3=515 +=265 +=359 +=345 +=260 +OK=296 + +[Ҳ-ѹ4N] +key1=424 +key2=552 +key3=652 +=410 +=491 +=490 +=363 +OK=401 \ No newline at end of file