using CompressorXN_Common;
using System;
using System.Text;
using USB2XXX;
namespace CompressorXN_Communication.TuMos
{
public class BaseTMS
{
private static USB_DEVICE.DEVICE_INFO DevInfo = new USB_DEVICE.DEVICE_INFO();
private static Int32[] DevHandles = new Int32[20];
protected static int DevHandle = 0;
protected static Byte WriteCANIndex = 0;
protected static Byte ReadCANIndex = 0;
protected static Byte CANIndex = 0;
private static bool state;
private static Int32 DevNum = 0;
private static USB2CANFD.CANFD_MSG[] CanMsgBuffer = new USB2CANFD.CANFD_MSG[10240];
///
/// 打开设备
///
///
public static (bool isOk, string msg) OpenDevice()
{
//扫描查找设备
DevNum = USB_DEVICE.USB_ScanDevice(DevHandles);
if (DevNum <= 0)
{
return (false, $"无设备连接!");
}
else
{
Console.WriteLine("Have {0} device connected!", DevNum);
}
DevHandle = DevHandles[0];
//打开设备
state = USB_DEVICE.USB_OpenDevice(DevHandle);
if (!state)
{
return (false, $"打开设备异常:state={state}!");
}
else
{
Console.WriteLine("Open device success!");
}
//获取固件信息
StringBuilder FuncStr = new StringBuilder(256);
state = USB_DEVICE.DEV_GetDeviceInfo(DevHandle, ref DevInfo, FuncStr);
if (!state)
{
return (false, $"获取设备信息异常:state={state}!");
}
else
{
Console.WriteLine($"{DateTime.Now}>>>>Firmware Info:");
Console.WriteLine(" Name:" + Encoding.Default.GetString(DevInfo.FirmwareName));
Console.WriteLine(" Build Date:" + Encoding.Default.GetString(DevInfo.BuildDate));
Console.WriteLine(" Firmware Version:v{0}.{1}.{2}", (DevInfo.FirmwareVersion >> 24) & 0xFF, (DevInfo.FirmwareVersion >> 16) & 0xFF, DevInfo.FirmwareVersion & 0xFFFF);
Console.WriteLine(" Hardware Version:v{0}.{1}.{2}", (DevInfo.HardwareVersion >> 24) & 0xFF, (DevInfo.HardwareVersion >> 16) & 0xFF, DevInfo.HardwareVersion & 0xFFFF);
Console.WriteLine(" Functions:" + DevInfo.Functions.ToString("X8"));
Console.WriteLine(" Functions String:" + FuncStr);
}
GlobalVar.DevHandle = DevHandle;
return (true, "连接成功");
}
///
/// 初始化CAN
///
///
public static void CanInit(uint bps)
{
USB2CAN.CAN_INIT_CONFIG CANConfig = new USB2CAN.CAN_INIT_CONFIG();
//波特率
var ret = USB2CAN.CAN_GetCANSpeedArg(DevHandle, ref CANConfig, bps);
if (ret != USB2CAN.CAN_SUCCESS)
{
Console.WriteLine("Get CAN Speed failed!");
return;
}
else
{
Console.WriteLine("Get CAN Speed Success!");
}
//初始化配置CAN
CANConfig.CAN_Mode = 0x80;//正常模式
CANConfig.CAN_ABOM = 0;//禁止自动离线
CANConfig.CAN_NART = 1;//禁止报文重传
CANConfig.CAN_RFLM = 0;//FIFO满之后覆盖旧报文
CANConfig.CAN_TXFP = 1;//发送请求决定发送顺序
ret = USB2CAN.CAN_Init(DevHandle, WriteCANIndex, ref CANConfig);
if (ret != USB2CAN.CAN_SUCCESS)
{
Console.WriteLine("Config Send CAN failed!");
return;
}
else
{
Console.WriteLine("Config Send CAN Success!");
}
//配置过滤器,接收所有数据
//int[] pIdList = new int[1] { Convert.ToInt32(GlobalVar.agreementMsgVM.ReciveId, 16) };
//byte idListLen = 1;
//ret = USB2CAN.CAN_FilterList_Init(DevHandle, ReadCANIndex, pIdList, idListLen);
//if (ret != USB2CAN.CAN_SUCCESS)
//{
// Console.WriteLine("Config CAN Filter failed!");
// return;
//}
//else
//{
// Console.WriteLine("Config CAN Filter Success!");
//}
//启动CAN接收数据
ret = USB2CAN.CAN_StartGetMsg(GlobalVar.DevHandle, GlobalVar.ReadCANIndex);
if (ret != USB2CAN.CAN_SUCCESS)
{
Console.WriteLine("Start CAN failed!");
return;
}
else
{
Console.WriteLine("Start CAN Success!");
}
}
///
/// CANFD初始化
///
/// 仲裁段波特率
/// 数据段波特率
public static void CANFDInit(uint bpsNBT, uint bpsDBT)
{
USB2CANFD.CANFD_INIT_CONFIG CANFDConfig = new USB2CANFD.CANFD_INIT_CONFIG();
/*
CANFDConfig.Mode = 1; //0-正常模式,1-自发自收模式
CANFDConfig.RetrySend = 1; //使能自动重传
CANFDConfig.ISOCRCEnable = 1;//使能ISOCRC
CANFDConfig.ResEnable = 1; //使能内部终端电阻(若总线上没有终端电阻,则必须使能终端电阻才能正常传输数据)
//波特率参数可以用TCANLINPro软件里面的波特率计算工具计算
//仲裁段波特率参数,波特率=40M/NBT_BRP*(1+NBT_SEG1+NBT_SEG2)
CANFDConfig.NBT_BRP = 1;
CANFDConfig.NBT_SEG1 = 63;
CANFDConfig.NBT_SEG2 = 16;
CANFDConfig.NBT_SJW = 16;
//数据域波特率参数,波特率=40M/DBT_BRP*(1+DBT_SEG1+DBT_SEG2)
CANFDConfig.DBT_BRP = 1;
CANFDConfig.DBT_SEG1 = 15;
CANFDConfig.DBT_SEG2 = 4;
CANFDConfig.DBT_SJW = 4;
* */
//填充初始化参数
var ret = USB2CANFD.CANFD_GetCANSpeedArg(DevHandle, ref CANFDConfig, bpsNBT, bpsDBT);
if (ret != USB2CANFD.CANFD_SUCCESS)
{
Console.WriteLine("Get CANFD Speed failed!");
return;
}
else
{
Console.WriteLine("Get CANFD Speed Success!");
}
CANFDConfig.ISOCRCEnable = 1;//使能ISOCRC
ret = USB2CANFD.CANFD_Init(DevHandle, CANIndex, ref CANFDConfig);
if (ret != USB2CANFD.CANFD_SUCCESS)
{
Console.WriteLine("Config CANFD failed!");
return;
}
else
{
Console.WriteLine("Config CANFD Success!");
}
//配置过滤器,若不配置过滤器,默认是接收所有数据
//USB2CANFD.CANFD_FILTER_CONFIG CANFDFilter = new USB2CANFD.CANFD_FILTER_CONFIG();
//CANFDFilter.Index = 0;//取值范围为:0~31
//CANFDFilter.Enable = 1;
////配置为只接收扩展帧数据
//CANFDFilter.ID_Accept = 0x80000000;
//CANFDFilter.ID_Mask = 0x80000000;
//ret = USB2CANFD.CANFD_SetFilter(DevHandle, CANIndex, ref CANFDFilter, 1);
//if (ret != USB2CANFD.CANFD_SUCCESS)
//{
// Console.WriteLine("Config filter failed!");
// return;
//}
//else
//{
// Console.WriteLine("Config filter success!");
//}
//启动CAN数据接收
ret = USB2CANFD.CANFD_StartGetMsg(DevHandle, CANIndex);
if (ret != USB2CANFD.CANFD_SUCCESS)
{
Console.WriteLine("Start receive CANFD failed!");
return;
}
else
{
Console.WriteLine("Start receive CANFD Success!");
}
}
}
}