can_bootloader/user/CanThread.aardio

417 lines
8.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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