初版
This commit is contained in:
commit
4afcdb6bef
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
.build
|
||||
dist
|
||||
/config.ini
|
||||
/libusb-1.0.dll
|
||||
/log.txt
|
||||
/USB2XXX.dll
|
26
CANThread/CAN_Msg.aardio
Normal file
26
CANThread/CAN_Msg.aardio
Normal 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
278
CANThread/CanThread.aardio
Normal 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("正在运行");
|
||||
|
||||
|
124
CANThread/CanThreadStart.aardio
Normal file
124
CANThread/CanThreadStart.aardio
Normal 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 );
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
33
CANThread/Diag10code.aardio
Normal file
33
CANThread/Diag10code.aardio
Normal 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 {
|
||||
}
|
||||
}
|
||||
}
|
9
CANThread/Diag11code.aardio
Normal file
9
CANThread/Diag11code.aardio
Normal 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("复位成功")
|
||||
}
|
85
CANThread/Diag22code.aardio
Normal file
85
CANThread/Diag22code.aardio
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
77
CANThread/Diag27code.aardio
Normal file
77
CANThread/Diag27code.aardio
Normal 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;
|
||||
}
|
||||
|
||||
}
|
27
CANThread/Diag28code.aardio
Normal file
27
CANThread/Diag28code.aardio
Normal 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 {
|
||||
}
|
||||
}
|
||||
}
|
66
CANThread/Diag2Ecode.aardio
Normal file
66
CANThread/Diag2Ecode.aardio
Normal 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) + "成功");
|
||||
|
||||
}
|
46
CANThread/Diag7Fcode.aardio
Normal file
46
CANThread/Diag7Fcode.aardio
Normal 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));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
27
CANThread/Diag85code.aardio
Normal file
27
CANThread/Diag85code.aardio
Normal 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")
|
||||
}
|
||||
}
|
||||
}
|
85
CANThread/GeelySecurety.aardio
Normal file
85
CANThread/GeelySecurety.aardio
Normal 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
30
default.aproj
Normal 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
33
dlg/about.aardio
Normal 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
360
dlg/diagnostic.aardio
Normal 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
108
dlg/msg.aardio
Normal 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
127
dlg/setting.aardio
Normal 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
249
dlg/show.aardio
Normal 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
20
dlg/switch.aardio
Normal 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
17
lib/config.aardio
Normal 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
121
lib/style.aardio
Normal 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
489
lib/usb2canfd.aardio
Normal 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
66
main.aardio
Normal 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
BIN
res/P417.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 433 KiB |
BIN
res/icon.ico
Normal file
BIN
res/icon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
59
配置文件.ini
Normal file
59
配置文件.ini
Normal 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
|
Loading…
x
Reference in New Issue
Block a user