can_bootloader/user/CanThread.aardio
2024-09-18 14:49:47 +08:00

333 lines
6.5 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();
}
case 103 {//停止boot
FuncStopBoot();
}
case 104 {//打开s19文件
if(msg.wParam == 0){
FuncDisplay("打开FlashDriver");
var ret = FuncOpenS19File(msg.wParam);
if(ret != null){
thread.command.$ShowFlashDrvPath(ret);
}
}
else {
FuncDisplay("打开烧写文件");
var ret = FuncOpenS19File(msg.wParam);
if(ret != null){
thread.command.$ShowPath(ret);
var crc32 = FuncGetFlashCRC(msg.wParam);
FuncDisplay("CRC = " ++ string.format("%X",crc32));
}
}
}
case 105 {//停止boot
thread.stop(0);
}
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);
}
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)
}
else {
FuncDisplay("读取失败");
}
}
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 {
}
}
}
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("找到硬件")
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("连接失败");
}
}
FuncDisplay = function(str){
thread.command.$Display(str);//"线程" +
}
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(){
FuncInitBootState();
boottimer.enable();
FuncDisplay("开始刷写");
stopflag = 0;
}
var delay = function(w){
while(w){
for(i=1;50000;1)
{
}
w -= 1;
}
}
var PackNext = 0x21;
var Packdata = {};
var PackID = 0;
var FuncSendPackage = function(){
while(#Packdata > 0)
{
//sleep(1);
delay(2);
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();
}
timer1 = win.timer(,1);
diagresp = {}
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 {
//console.varDump(ret[i].id);
//显示报文
}
}
}
timer1.enable();
FuncDisplay("CAN线程正在运行");