using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using TSMaster; using System.Runtime.InteropServices; using System.IO; namespace TSMasterAPI_CSharp { public partial class frmMain : Form { public frmMain() { InitializeComponent(); } private string FProgramName = "LibTSMasterDemo"; private int vDiagModuleHandle = -1; private void Form1_Load(object sender, EventArgs e) { FProgramName = Path.GetFileNameWithoutExtension(Application.ExecutablePath); //首先获取应用程序名称 tbApplicationName.Text = FProgramName; LoadDefaultState(); //对于无法通过注册表查询TSMaster安装目录的程序,直接调用下面的函数接口设置路径,如果可以查询路径,则不需要 //TsMasterApi.set_libtsmaster_location(@"D:\Program Files (x86)\TOSUN\TSMaster\bin"); //初始化API模块:这是后续调用所有TsMasterApi函数的前提 int ret = TsMasterApi.initialize_lib_tsmaster(FProgramName); //设置需要探测的硬件 TsMasterApi.tsapp_set_vendor_detect_preferences(true, true, true, false, false, false, false); // vCANQueueEventObj += new TCANQueueEvent(OnCANRxEvent); vCANFDQueueEventObj += new TCANFDQueueEvent(OnCANFDRxEvent); vLINQueueEventObj += new TLINQueueEvent(OnLINRxEvent); //注册接收回调函数:在每一次的回调函数vCANQueueEventObj中刷新数据段 if (TsMasterApi.tsapp_register_event_can((IntPtr)0, vCANQueueEventObj) != 0x00) { Log("Register CANRx Failed!"); } cbbQueryType.SelectedIndex = 0; } private void CreateApplicationCANDemo() { //FProgramName:唯一名称,后面的各种映射跟他绑定 //第一步:初始化API模块,如果已经调用,这里则不需要调用 //TsMasterApi.initialize_lib_tsmaster(FProgramName); //第二步:按需设置需要的通道数,比如,这里需要2个CAN通道,0个LIN通道 if (TsMasterApi.tsapp_set_can_channel_count(4) == 0) { Log("Set CAN Channel Count Success!"); } else Log("Set CAN Channel Count Failed!"); if (TsMasterApi.tsapp_set_lin_channel_count(0) == 0) { Log("Set LIN Channel Count Success!"); } else Log("Set LIN Channel Count Failed!"); //第三步:按需创建通道映射: if (TsMasterApi.tsapp_set_mapping_verbose(FProgramName, TLIBApplicationChannelType.APP_CAN, APP_CHANNEL.CHN1, "TC1005", TLIBBusToolDeviceType.TS_TC1005_DEVICE, 0, 0, HARDWARE_CHANNEL.CHN1) == 0) { } if (TsMasterApi.tsapp_set_mapping_verbose(FProgramName, TLIBApplicationChannelType.APP_CAN, APP_CHANNEL.CHN2, "TC1005", TLIBBusToolDeviceType.TS_TC1005_DEVICE, 0, 0, HARDWARE_CHANNEL.CHN2) == 0) { } //把TC1005板卡的硬件通道1映射到驱动的逻辑通道1上面 if (TsMasterApi.tsapp_set_mapping_verbose(FProgramName, TLIBApplicationChannelType.APP_CAN, APP_CHANNEL.CHN3, "TC1005", TLIBBusToolDeviceType.TS_TC1005_DEVICE, 0, 0, HARDWARE_CHANNEL.CHN3) == 0) { Log("Mappings of channel " + (1 + (int)0).ToString() + " has been set"); } //把TC1005板卡的硬件通道2映射到驱动的逻辑通道2上面 if (TsMasterApi.tsapp_set_mapping_verbose(FProgramName, TLIBApplicationChannelType.APP_CAN, APP_CHANNEL.CHN4, "TC1005", TLIBBusToolDeviceType.TS_TC1005_DEVICE, 0, 0, HARDWARE_CHANNEL.CHN4) == 0) { Log("Mappings of channel " + (1 + (int)1).ToString() + " has been set"); } //第四步:初始化通道参数 if (TsMasterApi.tsapp_configure_baudrate_can((int)APP_CHANNEL.CHN1, 500, false, true) == 0) { Log("CAN Channel " + (0 + 1).ToString() + " baudrate has been configured"); } else { Log("CAN Channel " + (0 + 1).ToString() + " baudrate failed"); } if (TsMasterApi.tsapp_configure_baudrate_can((int)APP_CHANNEL.CHN2, 500, false, true) == 0) { Log("CAN Channel " + (1 + 1).ToString() + " baudrate has been configured"); } else { Log("CAN Channel " + (1 + 1).ToString() + " baudrate failed"); } if (TsMasterApi.tsapp_configure_baudrate_can((int)APP_CHANNEL.CHN3, 500, false, true) == 0) { Log("CAN Channel " + (2 + 1).ToString() + " baudrate has been configured"); } else { Log("CAN Channel " + (2 + 1).ToString() + " baudrate failed"); } if (TsMasterApi.tsapp_configure_baudrate_can((int)APP_CHANNEL.CHN4, 500, false, true) == 0) { Log("CAN Channel " + (3 + 1).ToString() + " baudrate has been configured"); } else { Log("CAN Channel " + (3 + 1).ToString() + " baudrate failed"); } //第五步:连接application:连接硬件通道并开启接收FIFO string connectResult = TsMasterApi.tsapp_get_error_description(TsMasterApi.tsapp_connect()); if (connectResult == "OK") { Log("Connect Application Success!"); TsMasterApi.tsfifo_enable_receive_fifo(); Log("Start Receive FIFO!"); //如果不使能内部FIFO,无法使用Receive函数读取内部报文 } else { Log(connectResult); Log("Connect Application Failed! Please check the mapping table and whether the Hardware is Ready?!"); } } private void CreateApplicationLINDemo() { //FProgramName:唯一名称,后面的各种映射跟他绑定 //第一步:初始化API模块,如果已经调用,这里则不需要调用 //TsMasterApi.initialize_lib_tsmaster(FProgramName); //第二步:按需设置需要的通道数,比如,这里需要2个CAN通道,0个LIN通道 if (TsMasterApi.tsapp_set_can_channel_count(0) == 0) { Log("Set CAN Channel Count Success!"); } else Log("Set CAN Channel Count Failed!"); if (TsMasterApi.tsapp_set_lin_channel_count(1) == 0) { Log("Set LIN Channel Count Success!"); } else Log("Set LIN Channel Count Failed!"); //第三步:按需创建通道映射: if (TsMasterApi.tsapp_set_mapping_verbose(FProgramName, TLIBApplicationChannelType.APP_LIN, APP_CHANNEL.CHN1, "TC1026", TLIBBusToolDeviceType.TS_USB_DEVICE, (int)TLIB_TS_Device_Sub_Type.TC1026, 0, HARDWARE_CHANNEL.CHN1) == 0) { } //第四步:初始化通道参数 if (TsMasterApi.tsapp_configure_baudrate_lin((int)APP_CHANNEL.CHN1, (float)19.2 , LIN_PROTOCOL.LIN_PROTOCOL_21) == 0) { Log("LIN Channel " + (0 + 1).ToString() + " baudrate has been configured"); } else { Log("LIN Channel " + (0 + 1).ToString() + " baudrate failed"); } //第五步:连接application:连接硬件通道并开启接收FIFO string connectResult = TsMasterApi.tsapp_get_error_description(TsMasterApi.tsapp_connect()); if ((connectResult == "OK") || (connectResult == "确定")) { Log("Connect Application Success!"); TsMasterApi.tsfifo_enable_receive_fifo(); Log("Start Receive FIFO!"); //如果不使能内部FIFO,无法使用Receive函数读取内部报文 } else { Log(connectResult); Log("Connect Application Failed! Please check the mapping table and whether the Hardware is Ready?!"); } } private void LoadDefaultState() { //Demo Controls //逻辑通道1相关 //通道类型 cbbChannelType1.SelectedIndex = (int)TLIBApplicationChannelType.APP_CAN; //默认通道类型为CAN cbbAppChannelIndex.SelectedIndex = (int)APP_CHANNEL.CHN1; cbbDeviceType1.SelectedIndex = (int)TLIBBusToolDeviceType.TS_TC1005_DEVICE; //默认载入TOSUN TC1005设备 //逻辑通道2相关 cbbHardwareChannel1.SelectedIndex = (int)HARDWARE_CHANNEL.CHN1; //默认选择该硬件设备的物理通道0 ////逻辑通道2 相关 //cbbChannelType2.SelectedIndex = (int)TLIBApplicationChannelType.APP_CAN; //默认通道类型为CAN //cbbDeviceType2.SelectedIndex = (int)TLIBBusToolDeviceType.TS_TC1005_DEVICE; //设备类型:默认载入TOSUN TC1005设备 //cbbHardwareChannel2.SelectedIndex = 1; //默认选择该硬件设备的物理通道1 // cbbAppChannel_CAN.SelectedIndex = 0; cbbAppChannel_CANFD.SelectedIndex = 0; } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { //TsMasterApi.tsapp_set_logger(nil); InternalUnregisterEvents(); TsMasterApi.tsapp_disconnect(); //TsMasterApi.tsdiag_can_delete_all(); TsMasterApi.finalize_lib_tsmaster(); } private static TCANQueueEvent vCANQueueEventObj; private static TCANFDQueueEvent vCANFDQueueEventObj; private static TLINQueueEvent vLINQueueEventObj; private void InternalUnregisterEvents() { TsMasterApi.tsapp_unregister_event_can((IntPtr)0, vCANQueueEventObj); TsMasterApi.tsapp_unregister_event_canfd((IntPtr)0, vCANFDQueueEventObj); TsMasterApi.tsapp_unregister_event_lin((IntPtr)0, vLINQueueEventObj); } private void InternalRegisterEvents() { // register only one of them: CAN or CANFD TsMasterApi.tsapp_register_event_can((IntPtr)0, vCANQueueEventObj); TsMasterApi.tsapp_register_event_canfd((IntPtr)0, vCANFDQueueEventObj); TsMasterApi.tsapp_register_event_lin((IntPtr)0, vLINQueueEventObj); } double testSignalValue = 0; private void OnCANRxEvent(IntPtr AObj, ref TLIBCAN AData) { if (AData.FIsTx) { byte canid = Convert.ToByte(tbAddPeriodCANID.Text, 16); if (AData.FIdentifier == canid) { AData.FData[0]++; AData.FData[1]--; //更新数据还是采用tsapp_add_cyclic_msg_can函数,不新增API if (TsMasterApi.tsapp_add_cyclic_msg_can(ref AData, Convert.ToSingle(tbAddPeriodCANIntervalTime.Text)) == 0) { //避免直接跨线程操作界面控件! } } } if (AData.FIdentifier == 0x123) { if (TsMasterApi.tsdb_get_signal_value_can(ref AData, tBMessageName.Text,tBSignalName.Text, ref testSignalValue) == 0x00) { //ReadData Success } } } private void OnCANFDRxEvent(IntPtr AObj, ref TLIBCANFD AData) { // } private void OnLINRxEvent(IntPtr AObj, ref TLIBLIN AData) { //frm:= TfrmTestLibTSMaster(aobj); //c:= adata ^; //frm.DisplayThreadedEventMessage(c.ToString); } private void button1_Click(object sender, EventArgs e) { TsMasterApi.tsapp_show_channel_mapping_window(); } private void button2_Click(object sender, EventArgs e) { if (cbbWindowName.Text.Trim() == "") { MessageBox.Show("请先选择一个窗体名称!","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning); return; } TsMasterApi.tsapp_show_tsmaster_window(cbbWindowName.Text.Trim(), false); } private void btnGetApplicationList_Click(object sender, EventArgs e) { IntPtr applicationList = new IntPtr(); int ret = TsMasterApi.tsapp_get_application_list(ref applicationList); if (ret == 0) { string appList = Marshal.PtrToStringAnsi(applicationList); tbApplicationList.Text = appList; } } private void btnRegisterRxEvents_Click(object sender, EventArgs e) { InternalRegisterEvents(); } private void btnUnregisterRxEvents_Click(object sender, EventArgs e) { InternalUnregisterEvents(); } /// /// 常见错误:通道映射错误。比如设置了2路CAN,2路LIN。为CAN映射了硬件,但是没有为LIN通道映射硬件通道,就会造成错误! /// 解决办法:如果不用对应的通道,则把对应通道数设置为0 /// /// /// private void btnConnectApplication_Click(object sender, EventArgs e) { if (CheckResultOK(TsMasterApi.tsapp_connect())) { Log("Connect Application Success!"); TsMasterApi.tsfifo_enable_receive_fifo(); TsMasterApi.tsfifo_add_can_canfd_pass_filter(APP_CHANNEL.CHN1, 0x123, false); TsMasterApi.tsfifo_add_can_canfd_pass_filter(APP_CHANNEL.CHN1, 0x124, true); Log("Start Receive FIFO!"); //如果不使能内部FIFO,无法使用Receive函数读取内部报文 // if (TsMasterApi.tsdiag_can_create(ref vDiagModuleHandle, APP_CHANNEL.CHN1, 0, 0, 0x7C0, true, 0x7C8, true, 0x7DF, true) == 0x00) { Log("Start diagnostic module, module handle is :" + vDiagModuleHandle.ToString()); } else { Log("Start diagnostic module failed"); } // } else { Log("Connect Application Failed! Please check the mapping table and whether the Hardware is Ready?!"); } } private void Log(string msg) { if (MM.Lines.Count() > 1000) { MM.Text = ""; } MM.Text += msg + "\r\n"; } private void btnTransmitCANAsync_Click(object sender, EventArgs e) { TLIBCAN canMsg = new TLIBCAN(0, 0x456, true, false, false, 8); if (TsMasterApi.tsapp_transmit_can_async(ref canMsg) == 0) { Log("ASync Send CAN Message Success!"); } else { Log("ASync Send CAN Message Failed"); } } private void btnTransmitCANSync_Click(object sender, EventArgs e) { TLIBCAN canMsg = new TLIBCAN(0, 0x456, true, false, false, 8); if (TsMasterApi.tsapp_transmit_can_sync(ref canMsg, 100) == 0) { Log("Sync Send CAN Message Success!"); } else { Log("Sync Send CAN Message Failed"); } } private void btnTransmitCANFDAsync_Click(object sender, EventArgs e) { TLIBCANFD canMsg = new TLIBCANFD(0, 0x456, true, false, false, 8); if (TsMasterApi.tsapp_transmit_canfd_async(ref canMsg) == 0) { Log("ASync Send CANFD Message Success!"); } else { Log("ASync Send CANFD Message Failed"); } } private void btnTransmitCANFDSync_Click(object sender, EventArgs e) { TLIBCANFD canMsg = new TLIBCANFD(0, 0x456, true, false, false, 8); if (TsMasterApi.tsapp_transmit_canfd_sync(ref canMsg, 200) == 0) { Log("Sync Send CANFD Message Success!"); } else { Log("Sync Send CANFD Message Failed"); } } private void btnDeleteApplication_Click(object sender, EventArgs e) { if (TsMasterApi.tsapp_del_application(tbApplicationName.Text) == 0) { Log("Delete Application Success:" + tbApplicationName.Text); } } private void btnAddApplication_Click(object sender, EventArgs e) { if (TsMasterApi.tsapp_add_application(tbApplicationName.Text) == 0) { Log("Add Application Success:" + tbApplicationName.Text); } } private void btnSetApplicationCANCount_Click(object sender, EventArgs e) { try { int chnCount = Convert.ToInt32(tbCANCount.Text); if (TsMasterApi.tsapp_set_can_channel_count(chnCount) == 0) { Log("Set CAN Channel Count Success!"); } } catch { } } private void btnSetApplicationLINCount_Click(object sender, EventArgs e) { try { int chnCount = Convert.ToInt32(tbLINCount.Text); if (TsMasterApi.tsapp_set_lin_channel_count(chnCount) == 0) { Log("Set LIN Channel Count Success!"); } } catch { } } private void btnGetApplicationCANCount_Click(object sender, EventArgs e) { try { int chnCount = 0; if (TsMasterApi.tsapp_get_can_channel_count(ref chnCount) == 0) { tbGetCANCount.Text = chnCount.ToString(); Log("Set LIN Channel Count Success!"); } } catch { } } private void btnGetApplicationLINCount_Click(object sender, EventArgs e) { try { int chnCount = 0; if (TsMasterApi.tsapp_get_lin_channel_count(ref chnCount) == 0) { tbGetLINCount.Text = chnCount.ToString(); Log("Set LIN Channel Count Success!"); } } catch { } } private void btnDisconnectApplication_Click(object sender, EventArgs e) { if (TsMasterApi.tsapp_disconnect() == 0) { Log("Disconnect Application Success:" + FProgramName); } else { Log("Disconnect Application Failed:" + FProgramName); } } private void btnAddCANPerodicMessage_Click(object sender, EventArgs e) { try { byte canid = Convert.ToByte(tbAddPeriodCANID.Text, 16); TLIBCAN canObj = new TLIBCAN(0, canid, true, false, false, 0); canObj.FDLC = 8; canObj.FData[0] = 0xAA; canObj.FData[1] = 0xBB; Single intervalTime = Convert.ToSingle(tbAddPeriodCANIntervalTime.Text); if (TsMasterApi.tsapp_add_cyclic_msg_can(ref canObj, intervalTime) == 0) { Log("Add Period CAN Message Success!"); } } catch { } } private void btnDeleteCANPeridicMessage_Click(object sender, EventArgs e) { try { byte canid = Convert.ToByte(tbDelPeriodCANID.Text, 16); TLIBCAN canObj = new TLIBCAN(0, canid, true, false, false, 0); if (TsMasterApi.tsapp_delete_cyclic_msg_can(ref canObj) == 0) { Log("Delete Period CAN Message Success!"); } } catch { } } private void btnDeleteAllCANPeriodicMessages_Click(object sender, EventArgs e) { if (TsMasterApi.tsapp_delete_cyclic_msgs() == 0) { Log("Delete All Period CAN Message Success!"); } } private void btnSetApplicationChannel1Mapping_Click(object sender, EventArgs e) { if ((TLIBBusToolDeviceType)cbbDeviceType1.SelectedIndex == TLIBBusToolDeviceType.PEAK_USB_DEVICE) { if (TsMasterApi.tsapp_set_mapping_verbose(tbApplicationName.Text, (TLIBApplicationChannelType)cbbChannelType1.SelectedIndex, (APP_CHANNEL)cbbAppChannelIndex.SelectedIndex, cbbDeviceType1.Text, (TLIBBusToolDeviceType)cbbDeviceType1.SelectedIndex, -1, 0, (HARDWARE_CHANNEL)0x51) == 0) { Log("Mappings of channel " + (1 + (int)0).ToString() + " has been set"); } } else { if (TsMasterApi.tsapp_set_mapping_verbose(tbApplicationName.Text, (TLIBApplicationChannelType)cbbChannelType1.SelectedIndex, (APP_CHANNEL)cbbAppChannelIndex.SelectedIndex, cbbDeviceType1.Text, (TLIBBusToolDeviceType)cbbDeviceType1.SelectedIndex, cbbSubDeviceType1.SelectedIndex, 0, (HARDWARE_CHANNEL)cbbHardwareChannel1.SelectedIndex) == 0) { Log("Mappings of channel " + (1 + (int)0).ToString() + " has been set"); } } } private void button3_Click(object sender, EventArgs e) { string str1 = "character string1"; var strToBytes1 = System.Text.Encoding.UTF8.GetBytes(str1); string str2 = "character string2"; var strToBytes2 = System.Text.Encoding.Default.GetBytes(str2); string str3 = "character string3"; var strToBytes3 = System.Text.Encoding.Unicode.GetBytes(str3); string str4 = "character string4"; var strToBytes4 = System.Text.Encoding.ASCII.GetBytes(str4); } private void cbbDeviceType1_SelectedIndexChanged(object sender, EventArgs e) { SetDeviceSubType((TLIBBusToolDeviceType)cbbDeviceType1.SelectedIndex, cbbSubDeviceType1); } private void SetDeviceSubType(TLIBBusToolDeviceType ADevType, ComboBox ASubTypeCombo) { int j; TLIB_XL_Device_Sub_Type iXL; TLIB_TS_Device_Sub_Type iTS; ASubTypeCombo.Items.Clear(); switch ((TLIBBusToolDeviceType)ADevType) { case TLIBBusToolDeviceType.XL_USB_DEVICE: { for (iXL = TLIB_XL_Device_Sub_Type.XL_NONE; iXL < TLIB_XL_Device_Sub_Type.XL_VN1531; iXL++) { j = (int)(iXL); ASubTypeCombo.Items.Add(TCANHardwareInfo.XL_HWTYPE_NAMES[j]); } // set default ASubTypeCombo.SelectedIndex = 0; // vector virtual can }; break; case TLIBBusToolDeviceType.TS_USB_DEVICE: { for (iTS = TLIB_TS_Device_Sub_Type.TS_UNKNOWN_DEVICE; iTS <= TLIB_TS_Device_Sub_Type.TC1013; iTS++) { j = (int)(iTS); ASubTypeCombo.Items.Add(TCANHardwareInfo.TS_HWTYPE_NAMES[j]); } // set default ASubTypeCombo.SelectedIndex = 3; // TSCAN mini }; break; case TLIBBusToolDeviceType.PEAK_USB_DEVICE: { ASubTypeCombo.Items.Add("Peak"); ASubTypeCombo.SelectedIndex = 0; }; break; case TLIBBusToolDeviceType.BUS_UNKNOWN_TYPE: case TLIBBusToolDeviceType.KVASER_USB_DEVICE: case TLIBBusToolDeviceType.RESERVED_DEVICE: case TLIBBusToolDeviceType.ICS_USB_DEVICE: case TLIBBusToolDeviceType.TS_TCP_DEVICE: case TLIBBusToolDeviceType.TS_TC1005_DEVICE: { ASubTypeCombo.Items.Clear(); ASubTypeCombo.SelectedIndex = -1; ASubTypeCombo.Text = "Default"; } break; } } private void tabPage1_Click(object sender, EventArgs e) { } private void cbbAppChannelIndex_SelectedIndexChanged(object sender, EventArgs e) { btnSetApplicationChannel1Mapping.Text = "Set Application Channel" + (cbbAppChannelIndex.SelectedIndex + 1).ToString() + " Mapping"; btnGetChannelMapping.Text = "Get Application Channel" + (cbbAppChannelIndex.SelectedIndex + 1).ToString() + " Mapping"; btnDeleteChannelMapping.Text = "Delete Application Channel" + (cbbAppChannelIndex.SelectedIndex + 1).ToString() + " Mapping"; } private void btnSetCANBaudrate_Click(object sender, EventArgs e) { int i; Single b; try { i = cbbAppChannel_CAN.SelectedIndex; b = Convert.ToSingle(tBCANBaudrate.Text); if (TsMasterApi.tsapp_configure_baudrate_can(i, b, false, chkCANResistor.Checked) == 0) { Log("CAN Channel " + (i + 1).ToString() + " baudrate has been configured"); } else { Log("CAN Channel " + (i + 1).ToString() + " baudrate failed"); } } catch { } } private void btnSetCANFDBaudrate_Click(object sender, EventArgs e) { int i; Single b, c; try { i = cbbAppChannel_CANFD.SelectedIndex; b = Convert.ToSingle(tBCANFDArbBaudrate.Text); c = Convert.ToSingle(tBCANFDDataBaudrate.Text); if (TsMasterApi.tsapp_configure_baudrate_canfd(i, b, c, TLIBCANFDControllerType.lfdtISOFDCAN, TLIBCANFDControllerMode.lfdmNormal, chkCANResistor.Checked) == 0) { Log("CANFD Channel " + (i + 1).ToString() + " baudrate has been configured"); } else { Log("CANFD Channel " + (i + 1).ToString() + " baudrate failed"); } } catch { } } private int msgcount = 0; private void btnReceiveCANMsgs_Click(object sender, EventArgs e) { TLIBCAN[] canBuffer = new TLIBCAN[100]; int revCnt = 0; revCnt = TsMasterApi.tsfifo_receive_can_message_list(ref canBuffer, 100, APP_CHANNEL.CHN1, READ_TX_RX_DEF.TX_RX_MESSAGES); //如果执行失败,请检查是否通过TsMasterApi.tsapp_enable_receive_fifo();开启了内部Buffer if (revCnt == 0) { //Log("No Message Received!"); return; } msgcount += revCnt; lblCount.Text = msgcount.ToString(); for (int i = 0; i < revCnt; i++) { string msg = "CAN Msg: "; if (canBuffer[i].FIsTx) msg += "Tx "; else msg += "Rx "; msg += canBuffer[i].FIdentifier.ToString("X8"); Log(msg); } } private void button4_Click(object sender, EventArgs e) { TLIBCANFD[] canBuffer = new TLIBCANFD[10]; int revCnt = 0; revCnt = TsMasterApi.tsfifo_receive_canfd_message_list(ref canBuffer, 10, APP_CHANNEL.CHN1, READ_TX_RX_DEF.TX_RX_MESSAGES); //如果执行失败,请检查是否通过TsMasterApi.tsapp_enable_receive_fifo();开启了内部Buffer if (revCnt == 0) { Log("No Message Received!"); return; } for (int i = 0; i < revCnt; i++) { string msg = "CANFD Msg: "; if (canBuffer[i].FIsTx) msg += "Tx "; else msg += "Rx "; msg += canBuffer[i].FIdentifier.ToString("X8"); Log(msg); } } private UInt32 FDBCHandle = 0; private void btnLoadDBCPath_Click(object sender, EventArgs e) { if (CheckResultOK(TsMasterApi.tsdb_unload_can_dbs())) { Log("Unload DBC Success!"); } //Database必须是绝对路径 string dbcPath = tbDBCPath.Text; if (File.Exists(tbDBCPath.Text) == false) { dbcPath = Application.StartupPath + @".\" + tbDBCPath.Text; } if (CheckResultOK(TsMasterApi.tsdb_load_can_db(dbcPath, new APP_CHANNEL[] { APP_CHANNEL.CHN1, APP_CHANNEL.CHN2, APP_CHANNEL.CHN3, APP_CHANNEL.CHN4 }, ref FDBCHandle))) { tBUnloadDBCHandle.Text = FDBCHandle.ToString(); tbDBCQueryHandle.Text = FDBCHandle.ToString(); Log("Load DBC Success!"); } } private Boolean CheckResultOK(int AResultCode) { if (AResultCode == 0) return true; else { Log("Error occured: " + TsMasterApi.tsapp_get_error_description(AResultCode)); return false; } } private void btnUnloadDBC_Click(object sender, EventArgs e) { try { UInt32 ADBCHandle = Convert.ToUInt32(tBUnloadDBCHandle.Text); if (CheckResultOK(TsMasterApi.tsdb_unload_can_db(ADBCHandle))) { Log("Log DBC Success!"); } } catch { MessageBox.Show("DBC Handle is UINT32 data type","Warning",MessageBoxButtons.OK,MessageBoxIcon.Warning); } } private void btnQuery_Click(object sender, EventArgs e) { string retMsg = TsMasterApi.tsdb_get_can_db_info( Convert.ToUInt32(tbDBCQueryHandle.Text), cbbQueryType.SelectedIndex, Convert.ToInt32(tbSubIdx.Text), Convert.ToInt32(tbSubSubIdx.Text) ); if(retMsg != "") { tBQueryResult.Text += retMsg + "\r\n"; Log("Query success"); } else { Log("Database index invalid or parameter invalid"); } // string retMsg1 = ""; unsafe { byte[] Array = new byte[100]; int ArraySize = 100; fixed (byte* pData = &Array[0]) { if (TsMasterApi.tsdb_get_can_db_info_verbose( Convert.ToUInt32(tbDBCQueryHandle.Text), cbbQueryType.SelectedIndex, Convert.ToInt32(tbSubIdx.Text), Convert.ToInt32(tbSubSubIdx.Text), pData, ref ArraySize ) == 0x00) { byte[] newByte = new byte[ArraySize]; for (int k = 0; k < ArraySize; k++) newByte[k] = Array[k]; tBQueryResult.Text += ASCIIEncoding.ASCII.GetString(newByte) + "\r\n"; Log("Query success"); } else { Log("Database index invalid or parameter invalid"); } } } } private void btnReadCANSignalValue_Click(object sender, EventArgs e) { //输入原始的CAN报文,报文名称,信号名称,直接提取出对应的信号名称 if (cbbDBCChannel.SelectedIndex < 0) { Log("Please Select DBC Channel First!"); return; } TLIBCAN canObj = new TLIBCAN((APP_CHANNEL)cbbDBCChannel.SelectedIndex, 0x551, true, false, false, 8); for (int i = 0; i < 8; i++) { canObj.FData[i] = 0xFF; } double sigValue = 0; if (CheckResultOK(TsMasterApi.tsdb_get_signal_value_can(ref canObj, "Wheel_Speed", "FL_Speed", ref sigValue))) { Log("SignalValue is:" + sigValue.ToString()); } } double srcSignalValue = 0.5; private void btnSetCANSignalValue_Click(object sender, EventArgs e) { //输入原始的CAN报文,报文名称,信号名称,直接提取出对应的信号名称 TLIBCAN canObj = new TLIBCAN(0, 0x123, true, false, false, 8); //也可以创建一个全局的CAN报文,每次只修改信号值 srcSignalValue += 1; if (CheckResultOK(TsMasterApi.tsdb_set_signal_value_can(ref canObj, tBMessageName.Text, tBSignalName.Text, srcSignalValue))) { Log("Set SignalValue:" + srcSignalValue.ToString("F2") + " Success!"); } TsMasterApi.tsapp_add_cyclic_msg_can(ref canObj, 10); } private void timer1_Tick(object sender, EventArgs e) { lblSignalValue.Text = testSignalValue.ToString("F2"); } private void timer2_Tick(object sender, EventArgs e) { btnReceiveCANMsgs_Click(null, null); } private void btnGetChannelMapping_Click(object sender, EventArgs e) { TLIBTSMapping m = new TLIBTSMapping(); if (TsMasterApi.tsapp_get_mapping_verbose(FProgramName,(TLIBApplicationChannelType)cbbChannelType1.SelectedIndex, (APP_CHANNEL)cbbAppChannelIndex.SelectedIndex, ref m) == 0) { Log("Get Mapping Success"); MessageBox.Show("HardwareName:" + m.GetHWDeviceName() + "HardwareChannel:" + m.FHWChannelIndex.ToString()); } } private void btnDeleteChannelMapping_Click(object sender, EventArgs e) { if (TsMasterApi.tsapp_del_mapping_verbose(FProgramName, (TLIBApplicationChannelType)cbbChannelType1.SelectedIndex, (APP_CHANNEL)cbbAppChannelIndex.SelectedIndex) == 0) { Log("Delete Mapping Success"); } } private void btnGetAllHardwareInfos_Click(object sender, EventArgs e) { int hardwareNum = 0; TLIBHWInfo tmpDeviceInfo = new TLIBHWInfo(0); string retMessage = TsMasterApi.tsapp_get_error_description(TsMasterApi.tsapp_enumerate_hw_devices(out hardwareNum)); if (retMessage == "OK" || retMessage == "确定") { LogDeviceInformation("Hardware Num:" + hardwareNum.ToString()); } else { Log(retMessage); LogDeviceInformation("Enum hardware Info Failed!"); } for (int i = 0; i < hardwareNum; i++) { if (TsMasterApi.tsapp_get_hw_info_by_index(i, ref tmpDeviceInfo) == 0) { LogDeviceInformation(tmpDeviceInfo.FDeviceInformation); } } } private void btnCreateDemoConfiguration_Click(object sender, EventArgs e) { CreateApplicationCANDemo(); } private void LogDeviceInformation(string AMsg) { tbDeviceInformation.Text += AMsg + "\r\n"; } /// /// tsapp_enumerate_hw_devices函数必须在App未连接状态下才能够执行! /// /// /// private void btnGetDeviceNum_Click(object sender, EventArgs e) { int hardwareNum = 0; TLIBHWInfo tmp = new TLIBHWInfo(0); string retMessage = TsMasterApi.tsapp_get_error_description(TsMasterApi.tsapp_enumerate_hw_devices(out hardwareNum)); if (retMessage == "OK" || retMessage == "确定") { LogDeviceInformation("Hardware Num:" + hardwareNum.ToString()); tBDeviceNumber.Text = hardwareNum.ToString(); cbbDeviceIndex.Items.Clear(); for (int i = 0; i < hardwareNum; i++) { cbbDeviceIndex.Items.Add(i.ToString()); } if (hardwareNum > 0) cbbDeviceIndex.SelectedIndex = 0; } else { LogDeviceInformation(retMessage); } } private void btnGetAppointtedDeviceInfo_Click(object sender, EventArgs e) { if (cbbDeviceIndex.SelectedIndex < 0) { LogDeviceInformation("Please select device Index first!"); return; } TLIBHWInfo tmpDeviceInfo = new TLIBHWInfo(0); if (TsMasterApi.tsapp_get_hw_info_by_index(cbbDeviceIndex.SelectedIndex, ref tmpDeviceInfo) == 0) { LogDeviceInformation(tmpDeviceInfo.FDeviceInformation); } } private void btnStartLogging_Click(object sender, EventArgs e) { if (btnStartLogging.Text == "Start Logging") { TsMasterApi.tsapp_start_logging(@".\TestData" + DateTime.Now.ToString("dd-HH-mm-ss") /*+ ".blf"*/); btnStartLogging.Text = "Stop Logging"; } else { TsMasterApi.tsapp_stop_logging(); btnStartLogging.Text = "Start Logging"; } } private void btnAddReplayEngine_Click(object sender, EventArgs e) { int AReplayIndex = 0; OpenFileDialog openFileObj = new OpenFileDialog(); openFileObj.Filter = "blfFile|*.blf"; openFileObj.FilterIndex = 0; if (openFileObj.ShowDialog() == DialogResult.OK) { string fileName = openFileObj.FileName; TsMasterApi.tslog_stop_online_replays(); int retValue = TsMasterApi.tslog_del_online_replay_configs(); if (retValue != 0) { MessageBox.Show("Error:" + retValue.ToString(), "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } retValue = TsMasterApi.tslog_add_online_replay_config(fileName, ref AReplayIndex); if (retValue != 0) { MessageBox.Show("Error:" + retValue.ToString(),"Warning",MessageBoxButtons.OK,MessageBoxIcon.Warning); return; } retValue = TsMasterApi.tslog_set_online_replay_config(AReplayIndex, "Test", fileName, false, true, TsMasterApi.TLIBOnlineReplayTimingMode.ortImmediately, 0, true, false, "1,0,0,0,0,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32"); //必须32个数字,否则Mapping失败 if (retValue != 0) { MessageBox.Show("Error:" + retValue.ToString(), "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } retValue = TsMasterApi.tslog_start_online_replay(AReplayIndex); if (retValue != 0) { MessageBox.Show("Error:" + retValue.ToString(), "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } Log("Load Blf File Success!"); } } private void btnShowHardwareConfig_Click(object sender, EventArgs e) { TsMasterApi.tsapp_show_tsmaster_window("Hardware", false); } private void btnDeleteFilter_Click(object sender, EventArgs e) { TsMasterApi.tsfifo_delete_can_canfd_pass_filter(APP_CHANNEL.CHN1, 0x128); } private void btnAddFilter_Click(object sender, EventArgs e) { TsMasterApi.tsfifo_add_can_canfd_pass_filter(APP_CHANNEL.CHN1, 0x128,true); } private void button3_Click_1(object sender, EventArgs e) { if (TsMasterApi.tsdiag_can_session_control(vDiagModuleHandle, 0x01) == 0x00) { Log("Session Control success!"); } } private void btnConfigBaudrateRegs_Click(object sender, EventArgs e) { TsMasterApi.tsapp_configure_canfd_regs(APP_CHANNEL.CHN1, 500, 33, 6, 2, 6, 2000, 15, 4, 1, 3, TLIBCANFDControllerType.lfdtISOFDCAN, TLIBCANFDControllerMode.lfdmNormal, 1); } private void button4_Click_1(object sender, EventArgs e) { if (TsMasterApi.tsapp_add_precise_cyclic_message(0x123, 0, 0, 10, 2000) == 0) { Log("Add precise cyclic message success"); } else Log("Add precise cyclic message fail"); if (TsMasterApi.tsapp_add_precise_cyclic_message(0x456, 0, 0, 10, 2000) == 0) { Log("Add precise cyclic message success"); } else Log("Add precise cyclic message fail"); if (TsMasterApi.tsapp_add_precise_cyclic_message(0x789, 0, 0, 10, 2000) == 0) { Log("Add precise cyclic message success"); } else Log("Add precise cyclic message fail"); if (TsMasterApi.tsapp_add_precise_cyclic_message(0x100, 0, 0, 10, 2000) == 0) { Log("Add precise cyclic message success"); } else Log("Add precise cyclic message fail"); } private void button5_Click(object sender, EventArgs e) { if (TsMasterApi.tsapp_delete_precise_cyclic_message(0x123, 0, 0, 2000) == 0) { Log("Delete precise cyclic message success"); } else Log("Delete precise cyclic message fail"); if (TsMasterApi.tsapp_delete_precise_cyclic_message(0x456, 0, 0, 2000) == 0) { Log("Delete precise cyclic message success"); } else Log("Delete precise cyclic message fail"); if (TsMasterApi.tsapp_delete_precise_cyclic_message(0x789, 0, 0, 2000) == 0) { Log("Delete precise cyclic message success"); } else Log("Delete precise cyclic message fail"); if (TsMasterApi.tsapp_delete_precise_cyclic_message(0x100, 0, 0, 2000) == 0) { Log("Delete precise cyclic message success"); } else Log("Delete precise cyclic message fail"); } private void button6_Click(object sender, EventArgs e) { } private void button8_Click(object sender, EventArgs e) { if (cbbLINNodeType.SelectedIndex < -1) { MessageBox.Show("请先选择LIN节点类型","警告",MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } TsMasterApi.tslin_set_node_funtiontype(APP_CHANNEL.CHN1, (TLINNodeType)cbbLINNodeType.SelectedIndex); } private void btnClearScheduleTable_Click(object sender, EventArgs e) { TsMasterApi.tslin_clear_schedule_tables(APP_CHANNEL.CHN1); } private void button7_Click(object sender, EventArgs e) { } private void btnTransmitLIN_Click(object sender, EventArgs e) { TLIBLIN FLIN = new TLIBLIN((byte)APP_CHANNEL.CHN1, 0x3C, 8, true); FLIN.FData[0] = 0x64; //NAD FLIN.FData[1] = 0x02; //Data Length FLIN.FData[2] = 0x10; FLIN.FData[3] = 0x02; //Identifier for (int j = 4; j < 7; j++) { FLIN.FData[j] = 0xFF; } if (TsMasterApi.tsapp_transmit_lin_async( ref FLIN ) == (uint)0) //Means Read Success { } } private void btnReceiveLINMessages_Click(object sender, EventArgs e) { TLIBLIN[] revMsgList = new TLIBLIN[100]; int retNum = TsMasterApi.tsfifo_receive_lin_message_list(ref revMsgList, 100, APP_CHANNEL.CHN1, READ_TX_RX_DEF.TX_RX_MESSAGES); Log("Received:" +retNum.ToString()); } private void btnSessionControl_Click(object sender, EventArgs e) { byte[] datas = new byte[11]; unsafe { datas[0] = 0x34; datas[1] = 0x00; datas[2] = 0x44; datas[3] = 0x08; datas[4] = 0x00; datas[5] = 0xD0; datas[6] = 0x00; datas[7] = 0x00; datas[8] = 0x01; datas[9] = 0x30; datas[10] = 0x00; //TsCANApi.tsfifo_clear_lin_receive_buffers((IntPtr)vTSToolHandle, CHANNEL_INDEX.CHN1); fixed (byte* pData = &datas[0]) { if(TsMasterApi.tstp_lin_master_request(APP_CHANNEL.CHN1, 0x64, pData, 11, 1000) == 0x00) Log("Transmit TP Package Success!"); else Log("Transmit TP Package Failed!"); } } } private void btnSetTPIntervalTime_Click(object sender, EventArgs e) { try { int intervalTime = Convert.ToInt32(tBIntervalTimeMs.Text); if (TsMasterApi.tstp_lin_master_request_intervalms(APP_CHANNEL.CHN1, (byte)intervalTime) == 0x00) Log("Set TP Interval Time Success!"); else Log("Set TP Interval Time Failed!"); } catch { Log("Convert Interval time failed"); } } private void btnCreateEthernetDemo_Click(object sender, EventArgs e) { //FProgramName:唯一名称,后面的各种映射跟他绑定 //第一步:初始化API模块,如果已经调用,这里则不需要调用 //TsMasterApi.initialize_lib_tsmaster(FProgramName); //第二步:按需设置需要的通道数,比如,这里需要2个CAN通道,0个LIN通道 if (TsMasterApi.tsapp_set_can_channel_count(0) == 0) { Log("Set CAN Channel Count Success!"); } else Log("Set CAN Channel Count Failed!"); if (TsMasterApi.tsapp_set_lin_channel_count(0) == 0) { Log("Set LIN Channel Count Success!"); } else Log("Set LIN Channel Count Failed!"); if (TsMasterApi.tsapp_set_ethernet_channel_count(1) == 0) { Log("Set Ethernet Channel Count Success!"); } else Log("Set Ethernet Channel Count Failed!"); //第三步:按需创建通道映射: if (TsMasterApi.tsapp_set_mapping_verbose(FProgramName, TLIBApplicationChannelType.APP_Ethernet, APP_CHANNEL.CHN1, "TE1051", TLIBBusToolDeviceType.TS_USB_DEVICE_EX, (int)TLIB_TS_Device_Sub_Type.TE1051, 0, HARDWARE_CHANNEL.CHN1) == 0) { } //if (TsMasterApi.tsapp_configure_baudrate_can((int)APP_CHANNEL.CHN2, 500, false, true) == 0) //{ // Log("CAN Channel " + (1 + 1).ToString() + " baudrate has been configured"); //} //else //{ // Log("CAN Channel " + (1 + 1).ToString() + " baudrate failed"); //} //第五步:连接application:连接硬件通道并开启接收FIFO string connectResult = TsMasterApi.tsapp_get_error_description(TsMasterApi.tsapp_connect()); if (connectResult == "OK") { Log("Connect Application Success!"); TsMasterApi.tsfifo_enable_receive_fifo(); Log("Start Receive FIFO!"); //如果不使能内部FIFO,无法使用Receive函数读取内部报文 } else { Log(connectResult); Log("Connect Application Failed! Please check the mapping table and whether the Hardware is Ready?!"); } } private void button4_Click_2(object sender, EventArgs e) { unsafe { TLIBEthernetHeader data = new TLIBEthernetHeader(); data.FIdxChn = 0; byte[] FDatas = new byte[1612]; int i = 0; for (i = 0; i < 12; i++) { FDatas[i] = 0xFF; } FDatas[12] = 0x04; FDatas[13] = 0x00; for (i = 0; i < 1024; i++) { FDatas[i + 14] = (byte)i; } data.FEthernetPayloadLength = 1024; fixed (byte* p = &FDatas[0]) { data.FEthernetDataPointer = p; TsMasterApi.tsapp_transmit_ethernet_async(ref data); } } } private void btnEthernetCompressedMode_Click(object sender, EventArgs e) { TsMasterApi.tsapp_ethernet_channel_compress_mode(0, chkEtherCompressedMode.Checked); } } }