HONGRI_uds_tools/CAN_Tool/CanDevice/TOSUN/ToSun.cs
liudagui beceab4798 第一次提交:
支持广成CAN,PCAN,同星(要用低版本的TSMaster),TOOMOSS(没有测试过)
2024-11-06 16:52:30 +08:00

447 lines
12 KiB
C#
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.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TSMaster;
namespace Can
{
class ToSunDevice : CanDevice
{
private string Name = "666";
private TCANQueueEvent CanQueueEvent;
private TCANFDQueueEvent CanFdQueueEvent;
public ToSunDevice()
{
this.CanQueueEvent = new TCANQueueEvent(OnCANRxEvent);
this.CanFdQueueEvent = new TCANFDQueueEvent(OnCANFDRxEvent);
}
~ToSunDevice()
{
//释放所有资源
TsMasterApi.finalize_lib_tsmaster();
}
//标准CAN
#region CAN
//CAN初始化
public override string CanInit()
{
//释放所有资源
//TsMasterApi.finalize_lib_tsmaster();
TsMasterApi.initialize_lib_tsmaster(Name);
//创建通道数
if ((TsMasterApi.tsapp_set_can_channel_count(1) == 0)
&& (TsMasterApi.tsapp_set_lin_channel_count(0) == 0)
)
{
}
else
{
return "创建通道失败";
}
TsMasterApi.tsapp_set_lin_channel_count(0);
/*int hardwareNum = 0;
TsMasterApi.tsapp_enumerate_hw_devices(out hardwareNum);
TLIBHWInfo tmpDeviceInfo = new TLIBHWInfo(0);
TsMasterApi.tsapp_get_hw_info_by_index(0, ref tmpDeviceInfo);*/
#if true
//创建通道映射
if (TsMasterApi.tsapp_set_mapping_verbose(Name, TLIBApplicationChannelType.APP_CAN,
APP_CHANNEL.CHN1, "TC1012", TLIBBusToolDeviceType.TS_USB_DEVICE, 12, 0, HARDWARE_CHANNEL.CHN1) == 0) //12
#else
if (TsMasterApi.tsapp_set_mapping_verbose(Name, TLIBApplicationChannelType.APP_CAN,
APP_CHANNEL.CHN1, "TC1011", TLIBBusToolDeviceType.TS_USB_DEVICE, 5, 0, HARDWARE_CHANNEL.CHN1) == 0) //12
#endif
{
}
else
{
return "创建通道映射失败";
}
#if true
//初始化通道参数
if (TsMasterApi.tsapp_configure_baudrate_can((int)APP_CHANNEL.CHN1, 500, false, true) != 0)
{
return "创建通道参数失败";
}
#else
if (TsMasterApi.tsapp_configure_can_regs(APP_CHANNEL.CHN1, 500, 7, 1, 1, 1, 0) != 0)
{
return "创建通道参数失败";
}
//tsapp_configure_can_regs(APP_CHANNEL AIdxChn, float ABaudrateKbps, int ASEG1, int ASEG2, int APrescaler, int ASJW, int A120OhmConnected);
#endif
//连接application连接硬件通道并开启接收FIFO
int ret = TsMasterApi.tsapp_connect();
string connectResult = TsMasterApi.tsapp_get_error_description(ret);
if (0 == ret)
{
TsMasterApi.tsfifo_enable_receive_fifo();
}
else
{
//Log(connectResult);
//Log("Connect Application Failed! Please check the mapping table and whether the Hardware is Ready?!");
return "连接设备失败";
}
TsMasterApi.tsapp_unregister_events_all((IntPtr)0);
//注册接收回调函数在每一次的回调函数vCANQueueEventObj中刷新数据段
/*if (0 == TsMasterApi.tsapp_register_event_can((IntPtr)0, CanQueueEvent))
{
}
else
{
return "创建接受报文事件失败";
}*/
return "OK";
}
//CAN逆初始化
public override string CanDeInit()
{
base.CanDeInit();
TsMasterApi.tsapp_unregister_events_all((IntPtr)0);
if(0 == TsMasterApi.tsapp_disconnect()
)
{
base.CanDeInit();
return "OK";
}
else
{
return "断开连接失败";
}
}
public override string CanReceiveEventEnable()
{
string ret;
//注册接收回调函数在每一次的回调函数vCANQueueEventObj中刷新数据段
if (0 == TsMasterApi.tsapp_register_event_can((IntPtr)0, CanQueueEvent))
{
ret = "OK";
}
else
{
ret = "创建接受报文事件失败";
}
return ret;
}
public override string CanReceiveEventDisable()
{
string ret;
if (0 == TsMasterApi.tsapp_unregister_events_all((IntPtr)0))
{
ret = "OK";
}
else
{
ret = "失能接收事件失败";
}
return ret;
}
public override string CanSetFilter(UInt32 stratId, UInt32 endId)
{
//清除所有过滤器
for (int i = 0; i < 0x7ff; i++)
{
TsMasterApi.tsfifo_delete_can_canfd_pass_filter(APP_CHANNEL.CHN1, (int)i);
}
//设置过滤
for(UInt32 i = stratId; i <= endId; i++)
{
TsMasterApi.tsfifo_add_can_canfd_pass_filter(APP_CHANNEL.CHN1, (int)i, true);
}
return "OK";
}
//CAN发送一帧报文
public override void CanSendMessage(UInt32 id, byte[] data, int len)
{
TLIBCAN msg = new TLIBCAN(0, (int)id, true, false, false, MessagesLenToDlc(len), data);
if (TsMasterApi.tsapp_transmit_can_async(ref msg) == 0)
{
}
else
{
}
}
//CAN从FIFO接收一帧报文
public override bool CanReadMessage(ref UInt32 id, byte[] data, ref int len)
{
TLIBCAN msg;
bool ret = false;
if(true == TsMasterApi.tsfifo_receive_can_message(out msg, 0))
{
id = (UInt32)msg.FIdentifier;
msg.FData.CopyTo(data, 0);
len = MessagesDlcToLen(msg.FDLC);
ret = true;
}
return ret;
}
//CAN接收事件
private void OnCANRxEvent(IntPtr AObj, ref TLIBCAN AData)
{
if (AData.FIsTx)//发送的报文
{
}
else if(false == AData.FIsError)//接受的报文
{
TLIBCAN msg;
while(true == TsMasterApi.tsfifo_receive_can_message(out msg, 0))
{
CanReadEventInvoke((UInt32)AData.FIdentifier, AData.FData, MessagesDlcToLen(AData.FDLC));
}
}
}
#endregion
//CANFD
#region CANFD
//CANFD初始化
public override string CanFdInit()
{
TsMasterApi.initialize_lib_tsmaster(Name);
//创建通道数
if ((TsMasterApi.tsapp_set_can_channel_count(1) == 0)
&& (TsMasterApi.tsapp_set_lin_channel_count(0) == 0)
)
{
}
else
{
return "创建通道失败";
}
//创建通道映射
if (TsMasterApi.tsapp_set_mapping_verbose(Name, TLIBApplicationChannelType.APP_CAN,
APP_CHANNEL.CHN1, "TC1012", TLIBBusToolDeviceType.TS_USB_DEVICE, 12, 0, HARDWARE_CHANNEL.CHN1) == 0)
{
}
else
{
return "创建通道映射失败";
}
//初始化通道参数
#if true
if (TsMasterApi.tsapp_configure_baudrate_canfd((int)APP_CHANNEL.CHN1, 500, 2000, TLIBCANFDControllerType.lfdtISOFDCAN, TLIBCANFDControllerMode.lfdmNormal, true) == 0)
{
}
else
{
return "创建通道参数失败";
}
#else
if (TsMasterApi.tsapp_configure_canfd_regs(APP_CHANNEL.CHN1,
500, 4, 1, 1, 1, //500
2000, 4, 1, 1, 1, //2000
TLIBCANFDControllerType.lfdtISOFDCAN, TLIBCANFDControllerMode.lfdmNormal, 0) != 0)
{
return "创建通道参数失败";
}
#endif
//连接application连接硬件通道并开启接收FIFO
int ret = TsMasterApi.tsapp_connect();
string connectResult = TsMasterApi.tsapp_get_error_description(ret);
if (0 == ret)
{
TsMasterApi.tsfifo_enable_receive_fifo();
}
else
{
return "连接设备失败";
}
TsMasterApi.tsapp_unregister_events_all((IntPtr)0);
return "OK";
}
//CANFD逆初始化
public override string CanFdDeInit()
{
base.CanFdDeInit();
TsMasterApi.tsapp_unregister_events_all((IntPtr)0);
if((0 == TsMasterApi.tsapp_disconnect())
)
{
return "OK";
}
else
{
return "断开连接失败";
}
}
public override string CanFdSetFilter(UInt32 stratId, UInt32 endId)
{
//清除所有过滤器
for (int i = 0; i < 0x7ff; i++)
{
TsMasterApi.tsfifo_delete_can_canfd_pass_filter(APP_CHANNEL.CHN1, (int)i);
}
//设置过滤
for (UInt32 i = stratId; i <= endId; i++)
{
TsMasterApi.tsfifo_add_can_canfd_pass_filter(APP_CHANNEL.CHN1, (int)i, true);
}
return "OK";
}
public override string CanFdReceiveEventEnable()
{
string ret;
//注册接收回调函数在每一次的回调函数vCANQueueEventObj中刷新数据段
if (0 == TsMasterApi.tsapp_register_event_canfd((IntPtr)0, CanFdQueueEvent))
{
ret = "OK";
}
else
{
ret = "创建接受报文事件失败";
}
return ret;
}
public override string CanFdReceiveEventDisable()
{
return this.CanReceiveEventDisable();
}
//CANFD发送一帧报文
public override void CanFdSendMessage(UInt32 id, byte[] data, int len)
{
TLIBCANFD msg = new TLIBCANFD(APP_CHANNEL.CHN1, (int)id, true, false, false, MessagesLenToDlc(len), data, true, true);
if (TsMasterApi.tsapp_transmit_canfd_async(ref msg) == 0)
{
}
else
{
}
}
//CANFD从FIFO接收一帧报文
public override bool CanFdReadMessage(ref UInt32 id, byte[] data, ref int len)
{
TLIBCANFD msg = new TLIBCANFD();
bool ret = false;
if (true == TsMasterApi.tsfifo_receive_canfd_message(ref msg, 0))
{
id = (UInt32)msg.FIdentifier;
msg.FData.CopyTo(data, 0);
len = MessagesDlcToLen(msg.FDLC);
ret = true;
}
return ret;
}
//CANFD接收报文事件
private void OnCANFDRxEvent(IntPtr AObj, ref TLIBCANFD AData)
{
//发送的报文
if (AData.FIsTx)
{
}
else if (false == AData.FIsError)//接受的报文
{
TLIBCANFD msg = new TLIBCANFD();
while (true == TsMasterApi.tsfifo_receive_canfd_message(ref msg, 0))
{
CanReadEventInvoke((UInt32)AData.FIdentifier, AData.FData, MessagesDlcToLen(AData.FDLC));
}
}
}
#endregion
}
}