417 lines
8.7 KiB
Plaintext
417 lines
8.7 KiB
Plaintext
import usb2canfd;
|
||
import thread.command;
|
||
import win.timer;
|
||
//初始化CAN句柄对象
|
||
CANHw = usb2canfd.USB2CANHW();
|
||
CANHw.LoadDll();
|
||
|
||
DiagReqID = 0x720;//0x18dadff1;
|
||
DiagRespID = 0x620;//0x18daf1df;
|
||
DiagGloableID = 0x7DF;//0x18DB33F1;
|
||
stopflag = 0;
|
||
//注册一个消息钩子函数
|
||
FuncLoopMsg = function(msg){
|
||
select(msg.message) {
|
||
case 100 {//刷新硬件
|
||
FuncFreshHw();
|
||
}
|
||
case 101 {//连接硬件
|
||
//console.log("msg.wParam = " + msg.wParam);
|
||
//console.log("msg.lParam = " + msg.lParam);
|
||
FuncConnect(msg.wParam,msg.lParam);
|
||
}
|
||
case 102 {//开始boot
|
||
FuncStartBoot(msg.wParam);
|
||
}
|
||
case 103 {//停止boot
|
||
FuncStopBoot();
|
||
//FuncGetPowerVal();
|
||
}
|
||
case 104 {//读取电压
|
||
FuncGetPowerVal();
|
||
}
|
||
case 105 {//控制电源
|
||
FuncPowerCtrl(msg.wParam);
|
||
|
||
}
|
||
case 106 {
|
||
FuncSetCANID(msg.wParam,msg.lParam);
|
||
}
|
||
case 107 {
|
||
FuncSendMsg(msg.wParam);
|
||
}
|
||
case 109 {
|
||
win.quitMessage();
|
||
}
|
||
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 {
|
||
FuncReadDeviceVersion(1);
|
||
}
|
||
else {
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
FuncReadDeviceVersion = function(id){
|
||
var ret,DeviceInfo,funcstr = CANHw.GetDevInfo(id);
|
||
if(ret != 0){
|
||
var v1 = (DeviceInfo.FirmwareVersion>>24)&0xff;
|
||
var v2 = (DeviceInfo.FirmwareVersion>>16)&0xff;
|
||
var v3 = DeviceInfo.FirmwareVersion&0xffff;
|
||
FuncDisplay("固件版本"++v1++"."++v2++"."++v3);
|
||
FuncDisplay("Firmware version:"++v1++"."++v2++"."++v3)
|
||
}
|
||
else {
|
||
FuncDisplay("读取失败");
|
||
}
|
||
|
||
}
|
||
var delay_const = 100000;
|
||
DelayTest = function(){
|
||
import time.performance;
|
||
var tk = time.performance.tick();
|
||
for(i=1;1000000;1)
|
||
{
|
||
}
|
||
var tk2 = time.performance.tick();
|
||
tk2 = tk2 - tk;
|
||
delay_const = math.ceil(1000000*(1/tk2));
|
||
FuncDisplay(delay_const);
|
||
//console.log(delay_const);
|
||
}
|
||
|
||
|
||
|
||
FuncSetCANID = function(req,resp){
|
||
DiagReqID = req;
|
||
DiagRespID = resp;
|
||
}
|
||
|
||
FuncSendMsg = function(no){
|
||
select(no) {
|
||
case 1 {
|
||
var data = {0x00,0x00,0x40,0x00, 0x00,0x08,0x00,0x00};
|
||
CANHw.SendMsg(0x30,data);
|
||
}
|
||
else {
|
||
}
|
||
}
|
||
}
|
||
|
||
FuncLoadAPPFile = function(){
|
||
var ret = FuncOpenS19File(1,"\res\P417_SWTL_20240722.S19");
|
||
if(ret != null){
|
||
FuncDisplay("加载左侧烧录文件");
|
||
FuncDisplay("Load the left burning file");
|
||
var crc32 = FuncGetFlashCRC(1);
|
||
FuncDisplay("CRC = " ++ string.format("%X",crc32)++"
|
||
");
|
||
if(string.format("%X",crc32) != "F6570262"){
|
||
FuncDisplay("CRC校验错误,文件已损坏");
|
||
thrdTable["文件加载状态"] = false;
|
||
return ;
|
||
}
|
||
}
|
||
else {
|
||
FuncDisplay("加载左侧文件失败");
|
||
thrdTable["文件加载状态"] = false;
|
||
return ;
|
||
}
|
||
var ret = FuncOpenS19File(2,"\res\P417_SWTR_20240722.S19");
|
||
if(ret != null){
|
||
FuncDisplay("加载右侧烧录文件");
|
||
FuncDisplay("Load the right burning file");
|
||
var crc32 = FuncGetFlashCRC(2);
|
||
FuncDisplay("CRC = " ++ string.format("%X",crc32)++"
|
||
");
|
||
if(string.format("%X",crc32) != "1F3D406C"){
|
||
FuncDisplay("CRC校验错误,文件已损坏");
|
||
thrdTable["文件加载状态"] = false;
|
||
return ;
|
||
}
|
||
}
|
||
else {
|
||
FuncDisplay("加载左侧文件失败");
|
||
thrdTable["文件加载状态"] = false;
|
||
return ;
|
||
}
|
||
thrdTable["文件加载状态"] = true;
|
||
}
|
||
FuncPowerCtrl = function(state){
|
||
var ret = CANHw.SetPower(state);
|
||
return ret;
|
||
}
|
||
|
||
FuncGetPowerVal = function(){
|
||
var ret,buf = CANHw.GetPower();
|
||
var val = (buf[2]<<8) + buf[1];
|
||
//console.dumpJson(buf);
|
||
FuncDisplay("BAT电压"++val++"mV")
|
||
thrdTable["电源电压"] = val;
|
||
}
|
||
|
||
|
||
|
||
FuncFreshHw = function(){
|
||
var hwnum = CANHw.FlashHw();
|
||
if(hwnum == 0){
|
||
//mainForm.cbbDev.text = "未找到硬件"
|
||
}
|
||
else {
|
||
FuncDisplay("找到硬件");
|
||
FuncDisplay("Find hardware
|
||
");
|
||
thrdTable.设备 = CANHw.GetAvailableHW()
|
||
}
|
||
}
|
||
|
||
FuncConnect = function(dev,chn){
|
||
var canfd = (chn&0x80)==0x80?true:false;
|
||
var ret = CANHw.OpenDevice(dev,chn&0x7f,canfd);
|
||
if(ret == 0){
|
||
//FuncDisplay("连接成功");
|
||
thread.command.$Connected();
|
||
}
|
||
else {
|
||
FuncDisplay("连接失败");
|
||
}
|
||
FuncPowerCtrl(1);
|
||
}
|
||
|
||
FuncDisplay = function(str){
|
||
thread.command.$Display(str);//"线程" +
|
||
}
|
||
//console.log("在loadcodex测试")
|
||
//console.log(thrdTable.test)
|
||
|
||
|
||
loadcodex("\user\Diag10code.aardio");
|
||
loadcodex("\user\Diag11code.aardio");
|
||
loadcodex("\user\Diag22code.aardio");
|
||
loadcodex("\user\Diag27code.aardio");
|
||
loadcodex("\user\Diag2Ecode.aardio");
|
||
loadcodex("\user\Diag28code.aardio");
|
||
loadcodex("\user\Diag31code.aardio");
|
||
loadcodex("\user\Diag34code.aardio");
|
||
loadcodex("\user\Diag36code.aardio");
|
||
loadcodex("\user\Diag37code.aardio");
|
||
loadcodex("\user\Diag7Fcode.aardio");
|
||
loadcodex("\user\Diag85code.aardio");
|
||
|
||
loadcodex("\user\DiagBootcode.aardio");
|
||
loadcodex("\user\S19Decode.aardio");
|
||
|
||
|
||
RespState = 0;
|
||
|
||
FuncDiagPro = function(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;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
FuncStartBoot = function(id){
|
||
FuncInitBootState(id);
|
||
boottimer.enable();
|
||
|
||
FuncDisplay("开始刷写");
|
||
FuncDisplay("Start flashing
|
||
");
|
||
|
||
stopflag = 0;
|
||
}
|
||
|
||
var delay = function(w){
|
||
while(w){
|
||
for(i=1;delay_const;1)
|
||
{
|
||
}
|
||
w -= 1;
|
||
}
|
||
}
|
||
|
||
var PackNext = 0x21;
|
||
var Packdata = {};
|
||
var PackID = 0;
|
||
var FuncSendPackage = function(){
|
||
while(#Packdata > 0)
|
||
{
|
||
//sleep(1);
|
||
delay(1);
|
||
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(0.3);
|
||
CANHw.SendMsg(PackID,data);
|
||
|
||
PackNext += 1;
|
||
if(PackNext > 0x2f){
|
||
PackNext = 0x20;
|
||
}
|
||
}
|
||
|
||
}
|
||
FuncPushPackage = function(ID,data){
|
||
PackNext = 0x21;
|
||
Packdata = data;
|
||
PackID = ID;
|
||
}
|
||
|
||
|
||
|
||
boottimer = win.timer(,10);
|
||
boottimer.onTimer = function(){
|
||
if(CANHw.isConnected() == false){
|
||
boottimer.disable();
|
||
return;
|
||
}
|
||
FuncBootSeq();
|
||
}
|
||
|
||
LeftVibrationFault = 0;
|
||
LeftTouchFault = 0;
|
||
LeftPressSensorFault = 0;
|
||
LeftCommonFault = 0;
|
||
|
||
RightVibrationFault = 0;
|
||
RightTouchFault = 0;
|
||
RightPressSensorFault = 0;
|
||
RightCommonFault = 0;
|
||
|
||
timer1 = win.timer(,1);
|
||
diagresp = {}
|
||
|
||
getbitdata = function(byte,startbit,len){
|
||
return ((byte>>startbit) & ((1<<len) - 1));
|
||
}
|
||
|
||
timer1.onTimer = function(){
|
||
if(CANHw.isConnected() == false){
|
||
return;
|
||
}
|
||
ret = CANHw.GetMsg();
|
||
|
||
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 {
|
||
var id = ret[i].id & 0x7FFFFFFF;
|
||
select(id) {
|
||
case 0x34 {
|
||
//console.log("get 0x34");
|
||
LeftVibrationFault = getbitdata(ret[i].data[1],0,2);
|
||
LeftTouchFault = getbitdata(ret[i].data[1],2,2);
|
||
LeftPressSensorFault = getbitdata(ret[i].data[1],4,3);
|
||
LeftCommonFault = getbitdata(ret[i].data[1],7,1);
|
||
}
|
||
case 0x38 {
|
||
RightVibrationFault = getbitdata(ret[i].data[1],0,2);
|
||
RightTouchFault = getbitdata(ret[i].data[1],2,2);
|
||
RightPressSensorFault = getbitdata(ret[i].data[1],4,3);
|
||
RightCommonFault = getbitdata(ret[i].data[1],7,1);
|
||
}
|
||
else {
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
FuncLoadAPPFile();
|
||
timer1.enable();
|
||
FuncDisplay("CAN线程正在运行");
|
||
FuncDisplay("CAN thread is running
|
||
");
|
||
DelayTest();
|
||
|