This commit is contained in:
sunbeam 2024-12-18 17:09:19 +08:00
commit 4afcdb6bef
27 changed files with 2568 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
.build
dist
/config.ini
/libusb-1.0.dll
/log.txt
/USB2XXX.dll

26
CANThread/CAN_Msg.aardio Normal file
View File

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

278
CANThread/CanThread.aardio Normal file
View File

@ -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("正在运行");

View File

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

View File

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

View File

@ -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("复位成功")
}

View File

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

View File

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

View File

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

View File

@ -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) + "成功");
}

View File

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

View File

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

View File

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

30
default.aproj Normal file
View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<project ver="10" name="RP-01上位机" libEmbed="true" icon="res\icon.ico" ui="win" output="RP-01上位机.exe" CompanyName="大明电子股份有限公司" FileDescription="RP-01上位机" LegalCopyright="Copyright (C) 傅铖博 2022" ProductName="RP-01上位机" InternalName="RP-01上位机" FileVersion="0.0.1" ProductVersion="0.0.1" publishDir="/dist/" dstrip="false" local="false" ignored="false">
<file name="main.aardio" path="main.aardio" comment="main.aardio"/>
<folder name="资源文件" path="res" embed="true" local="false" ignored="false">
<file name="icon.ico" path="res\icon.ico" comment="res\icon.ico"/>
<file name="P417.png" path="res\P417.png" comment="res\P417.png"/>
</folder>
<folder name="窗体文件" path="dlg" comment="目录" embed="true" local="false" ignored="false">
<file name="about.aardio" path="dlg\about.aardio" comment="dlg\about.aardio"/>
<file name="diagnostic.aardio" path="dlg\diagnostic.aardio" comment="dlg\diagnostic.aardio"/>
<file name="msg.aardio" path="dlg\msg.aardio" comment="dlg\msg.aardio"/>
<file name="setting.aardio" path="dlg\setting.aardio" comment="dlg\setting.aardio"/>
<file name="show.aardio" path="dlg\show.aardio" comment="dlg\show.aardio"/>
<file name="switch.aardio" path="dlg\switch.aardio" comment="dlg\switch.aardio"/>
</folder>
<folder name="CANThread" path="CANThread" comment="CANThread" local="false" embed="true" ignored="false">
<file name="CanThread.aardio" path="CANThread\CanThread.aardio" comment="CANThread\CanThread.aardio"/>
<file name="CanThreadStart.aardio" path="CANThread\CanThreadStart.aardio" comment="CANThread\CanThreadStart.aardio"/>
<file name="CAN_Msg.aardio" path="CANThread\CAN_Msg.aardio" comment="CANThread\CAN_Msg.aardio"/>
<file name="Diag10code.aardio" path="CANThread\Diag10code.aardio" comment="CANThread\Diag10code.aardio"/>
<file name="Diag11code.aardio" path="CANThread\Diag11code.aardio" comment="CANThread\Diag11code.aardio"/>
<file name="Diag22code.aardio" path="CANThread\Diag22code.aardio" comment="CANThread\Diag22code.aardio"/>
<file name="Diag27code.aardio" path="CANThread\Diag27code.aardio" comment="CANThread\Diag27code.aardio"/>
<file name="Diag28code.aardio" path="CANThread\Diag28code.aardio" comment="CANThread\Diag28code.aardio"/>
<file name="Diag2Ecode.aardio" path="CANThread\Diag2Ecode.aardio" comment="CANThread\Diag2Ecode.aardio"/>
<file name="Diag7Fcode.aardio" path="CANThread\Diag7Fcode.aardio" comment="CANThread\Diag7Fcode.aardio"/>
<file name="Diag85code.aardio" path="CANThread\Diag85code.aardio" comment="CANThread\Diag85code.aardio"/>
<file name="GeelySecurety.aardio" path="CANThread\GeelySecurety.aardio" comment="CANThread\GeelySecurety.aardio"/>
</folder>
</project>

33
dlg/about.aardio Normal file
View File

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

360
dlg/diagnostic.aardio Normal file
View File

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

108
dlg/msg.aardio Normal file
View File

@ -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<<len) - 1));
}
import win.timer;
MsgProTable = {0x301,0x401,0x402,0x403,0x404,0x405,0x406};
MsgProTimer = win.timer(,100);
MsgProTimer.onTimer = function(){
for(k,v in MsgProTable){
var ret = CT_GetRxMsg(v);
if(ret != null){
MsgPro(v,ret);
}
}
}
var motor_state = {};
motor_state["status"] = 0;
motor_state["hallio"] = 0;
motor_state["loc"] = 0;
motor_state["stop1"] = 0;
motor_state["stop2"] = 0;
msgDebug = {};
for(i=1;4;1){
msgDebug[i] = {};
msgDebug[i]["status"] = 0;// = motor_state;
msgDebug[i]["hallio"] = 0;
msgDebug[i]["loc"] = 0;
msgDebug[i]["stop1"] = 0;
msgDebug[i]["stop2"] = 0;
}
testdata = {};
MsgPro = function(id,data){
if(data == null){
return ;
}
select(id) {
case 0x301 {
msg301_FanState = getbitdata(data[3],0,2);
msg301_HeatState = getbitdata(data[3],2,2);
msg301_test1 = data[4];
msg301_test2 = data[5];
msg301_test3 = data[6];
msg301_test4 = data[7];
msg301_test5 = data[8];
}
case 0x401{
msgDebug[1]["status"] = getbitdata(data[2],0,2);
msgDebug[1]["hallio"] = getbitdata(data[2],2,1);
msgDebug[1]["loc"] = data[3] + (data[4]<<8);
msgDebug[1]["stop1"] = data[5] + (data[6]<<8);
msgDebug[1]["stop2"] = data[7] + (data[8]<<8);
}
case 0x402{
msgDebug[2]["status"] = getbitdata(data[2],0,2);
msgDebug[2]["hallio"] = getbitdata(data[2],2,1);
msgDebug[2]["loc"] = data[3] + (data[4]<<8);
msgDebug[2]["stop1"] = data[5] + (data[6]<<8);
msgDebug[2]["stop2"] = data[7] + (data[8]<<8);
}
case 0x403{
msgDebug[3]["status"] = getbitdata(data[2],0,2);
msgDebug[3]["hallio"] = getbitdata(data[2],2,1);
msgDebug[3]["loc"] = data[3] + (data[4]<<8);
msgDebug[3]["stop1"] = data[5] + (data[6]<<8);
msgDebug[3]["stop2"] = data[7] + (data[8]<<8);
}
case 0x404{
msgDebug[4]["status"] = getbitdata(data[2],0,2);
msgDebug[4]["hallio"] = getbitdata(data[2],2,1);
msgDebug[4]["loc"] = data[3] + (data[4]<<8);
msgDebug[4]["stop1"] = data[5] + (data[6]<<8);
msgDebug[4]["stop2"] = data[7] + (data[8]<<8);
}
else {
}
}
}

127
dlg/setting.aardio Normal file
View File

@ -0,0 +1,127 @@
import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
setting = win.form(text="aardio form";right=984;bottom=589;bgcolor=16777215)
setting.add(
btnConnect={cls="plus";text="连接";left=322;top=176;right=506;bottom=212;bgcolor=11580047;dl=1;dt=1;font=LOGFONT(h=-16;name='FontAwesome');iconStyle={align="left";font=LOGFONT(h=-16;name='FontAwesome');padding={left=20}};iconText='\uF066';notify=1;tabstop=1;z=3};
btnFresh={cls="plus";text="刷新";left=126;top=176;right=310;bottom=212;bgcolor=11580047;dl=1;dt=1;font=LOGFONT(h=-16;name='FontAwesome');iconStyle={align="left";font=LOGFONT(h=-16;name='FontAwesome');padding={left=20}};iconText='\uF021';notify=1;tabstop=1;z=2};
cbbDev={cls="combobox";left=127;top=123;right=376;bottom=149;dl=1;dt=1;edge=1;items={};mode="dropdown";z=5};
plus={cls="plus";text="全屏";left=133;top=316;right=216;bottom=347;align="left";dl=1;dt=1;font=LOGFONT(h=-15);iconStyle={align="left";font=LOGFONT(h=-15;name='FontAwesome')};iconText='\uF0C8 ';notify=1;textPadding={left=24};z=7};
plus5={cls="plus";text="English";left=130;top=264;right=248;bottom=295;align="left";dl=1;dt=1;font=LOGFONT(h=-20;name='FontAwesome');iconStyle={align="left";font=LOGFONT(h=-16;name='FontAwesome');padding={left=5}};iconText='\uF0C8';notify=1;textPadding={left=30};z=1};
static={cls="static";left=128;top=65;right=441;bottom=81;transparent=1;z=6};
static4={cls="static";text="V2.11 20240806";left=745;top=4;right=981;bottom=35;align="right";font=LOGFONT(h=-22);notify=1;transparent=1;z=4}
)
/*}}*/
setting.plus.skin({
color={
active=0xFF00FF00;
default=0xFF000000;
disabled=0xEE666666;
hover=0xFFFF0000
};
checked={
iconText='\uF14A'
}
})
import usb2canfd;
import win.timer
import console;
loadcodex("\dlg\msg.aardio");
loadcodex("\CANThread\CanThreadStart.aardio");
setting.btnConnect.disabled = 1;
setting.btnFresh.oncommand = function(id,event){
setting.cbbDev.clear();//清空下拉框,防止反复刷新叠加
CT_Fresh();
sleep(100);
var ret = CT_GetCANHw();
if(ret != null && #ret > 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;

249
dlg/show.aardio Normal file
View File

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

20
dlg/switch.aardio Normal file
View File

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

17
lib/config.aardio Normal file
View File

@ -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**/

121
lib/style.aardio Normal file
View File

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

489
lib/usb2canfd.aardio Normal file
View File

@ -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**/

66
main.aardio Normal file
View File

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

BIN
res/P417.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 KiB

BIN
res/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

59
配置文件.ini Normal file
View File

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