using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace LFP_Manager.Function { // 1. The type of the ZLGCAN series interface card information. public struct VCI_BOARD_INFO { public UInt16 hw_Version; public UInt16 fw_Version; public UInt16 dr_Version; public UInt16 in_Version; public UInt16 irq_Num; public byte can_Num; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public byte[] str_Serial_Num; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] public byte[] str_hw_Type; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] Reserved; } // 2. Define the data type of the CAN message frame. unsafe public struct VCI_CAN_OBJ //Use unsafe code { public uint ID; public uint TimeStamp; public byte TimeFlag; public byte SendType; public byte RemoteFlag; //Whether it is a remore frame public byte ExternFlag; //Whether it is a extended frame public byte DataLen; public fixed byte Data[8]; public fixed byte Reserved[3]; } //2. Define the data type of the CAN message frame. //public struct VCI_CAN_OBJ //{ // public UInt32 ID; // public UInt32 TimeStamp; // public byte TimeFlag; // public byte SendType; // public byte RemoteFlag;//Whether it is a remore frame // public byte ExternFlag;//Whether it is a extended frame // public byte DataLen; // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] // public byte[] Data; // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] // public byte[] Reserved; // public void Init() // { // Data = new byte[8]; // Reserved = new byte[3]; // } //} // 3. Define the data type of the CAN controller status. public struct VCI_CAN_STATUS { public byte ErrInterrupt; public byte regMode; public byte regStatus; public byte regALCapture; public byte regECCapture; public byte regEWLimit; public byte regRECounter; public byte regTECounter; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] Reserved; } // 4. Define the data type of the error message. public struct VCI_ERR_INFO { public UInt32 ErrCode; public byte Passive_ErrData1; public byte Passive_ErrData2; public byte Passive_ErrData3; public byte ArLost_ErrData; } // 5. Define the data type for initializing CAN public struct VCI_INIT_CONFIG { public UInt32 AccCode; public UInt32 AccMask; public UInt32 Reserved; public byte Filter; public byte Timing0; public byte Timing1; public byte Mode; } public struct CHGDESIPANDPORT { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public byte[] szpwd; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public byte[] szdesip; public Int32 desport; public void Init() { szpwd = new byte[10]; szdesip = new byte[20]; } } ///////// new add struct for filter ///////// //typedef struct _VCI_FILTER_RECORD{ // DWORD ExtFrame; //Whether it is an extended frame // DWORD Start; // DWORD End; //}VCI_FILTER_RECORD,*PVCI_FILTER_RECORD; public struct VCI_FILTER_RECORD { public UInt32 ExtFrame; public UInt32 Start; public UInt32 End; } class csExtCANControlFunction { [DllImport("controlcan.dll")] static extern UInt32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved); [DllImport("controlcan.dll")] static extern UInt32 VCI_CloseDevice(UInt32 DeviceType, UInt32 DeviceInd); [DllImport("controlcan.dll")] static extern UInt32 VCI_InitCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_INIT_CONFIG pInitConfig); [DllImport("controlcan.dll")] static extern UInt32 VCI_ReadBoardInfo(UInt32 DeviceType, UInt32 DeviceInd, ref VCI_BOARD_INFO pInfo); [DllImport("controlcan.dll")] static extern UInt32 VCI_ReadErrInfo(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_ERR_INFO pErrInfo); [DllImport("controlcan.dll")] static extern UInt32 VCI_ReadCANStatus(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_STATUS pCANStatus); [DllImport("controlcan.dll")] static extern UInt32 VCI_GetReference(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, UInt32 RefType, ref byte pData); [DllImport("controlcan.dll")] static extern UInt32 VCI_SetReference(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, UInt32 RefType, ref byte pData); //unsafe static extern UInt32 VCI_SetReference(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, UInt32 RefType, byte* pData); [DllImport("controlcan.dll")] static extern UInt32 VCI_GetReceiveNum(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd); [DllImport("controlcan.dll")] static extern UInt32 VCI_ClearBuffer(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd); [DllImport("controlcan.dll")] static extern UInt32 VCI_StartCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd); [DllImport("controlcan.dll")] static extern UInt32 VCI_ResetCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd); [DllImport("controlcan.dll")] static extern UInt32 VCI_Transmit(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pSend, UInt32 Len); //[DllImport("controlcan.dll")] //static extern UInt32 VCI_Receive(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pReceive, UInt32 Len, Int32 WaitTime); [DllImport("controlcan.dll", CharSet = CharSet.Ansi)] static extern UInt32 VCI_Receive(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, IntPtr pReceive, UInt32 Len, Int32 WaitTime); } }