|
@@ -6,6 +6,14 @@
|
|
|
cancard::cancard()
|
|
|
{
|
|
|
LoadAPI();
|
|
|
+ mpthreadcan = new std::thread(&cancard::threadcan,this);
|
|
|
+}
|
|
|
+
|
|
|
+cancard::~cancard()
|
|
|
+{
|
|
|
+ mbrun = false;
|
|
|
+ mpthreadcan->join();
|
|
|
+
|
|
|
}
|
|
|
|
|
|
void cancard::LoadAPI()
|
|
@@ -29,4 +37,93 @@ void cancard::LoadAPI()
|
|
|
{
|
|
|
std::cout<<" Load ZCAN_OpenDevice API Successfully. "<<std::endl;
|
|
|
}
|
|
|
+
|
|
|
+ ZCAN_CloseDevice =(ZCAN_CloseDeviceFunc)xlib.resolve("ZCAN_CloseDevice");
|
|
|
+ ZCAN_GetDeviceInf =(ZCAN_GetDeviceInfFunc)xlib.resolve("ZCAN_GetDeviceInf");
|
|
|
+ ZCAN_GetDeviceInfoEx =(ZCAN_GetDeviceInfoExFunc)xlib.resolve("ZCAN_GetDeviceInfoEx");
|
|
|
+ ZCAN_IsDeviceOnLine =(ZCAN_IsDeviceOnLineFunc)xlib.resolve("ZCAN_IsDeviceOnLine");
|
|
|
+ ZCAN_InitCAN =(ZCAN_InitCANFunc)xlib.resolve("ZCAN_InitCAN");
|
|
|
+ ZCAN_StartCAN =(ZCAN_StartCANFunc)xlib.resolve("ZCAN_StartCAN");
|
|
|
+ ZCAN_ResetCAN =(ZCAN_ResetCANFunc)xlib.resolve("ZCAN_ResetCAN");
|
|
|
+ ZCAN_ClearBuffer =(ZCAN_ClearBufferFunc)xlib.resolve("ZCAN_ClearBuffer");
|
|
|
+ ZCAN_ReadChannelErrInfo =(ZCAN_ReadChannelErrInfoFunc)xlib.resolve("ZCAN_ReadChannelErrInfo");
|
|
|
+ ZCAN_ReadChannelStatus =(ZCAN_ReadChannelStatusFunc)xlib.resolve("ZCAN_ReadChannelStatus");
|
|
|
+ ZCAN_GetReceiveNum =(ZCAN_GetReceiveNumFunc)xlib.resolve("ZCAN_GetReceiveNum");
|
|
|
+ ZCAN_Transmit =(ZCAN_TransmitFunc)xlib.resolve("ZCAN_Transmit");
|
|
|
+ ZCAN_Receive =(ZCAN_ReceiveFunc)xlib.resolve("ZCAN_Receive");
|
|
|
+ ZCAN_TransmitFD =(ZCAN_TransmitFDFunc)xlib.resolve("ZCAN_TransmitFD");
|
|
|
+ ZCAN_ReceiveFD = (ZCAN_ReceiveFDFunc)xlib.resolve("ZCAN_ReceiveFD");
|
|
|
+ ZCAN_TransmitData =(ZCAN_TransmitDataFunc)xlib.resolve("ZCAN_TransmitData");
|
|
|
+ ZCAN_ReceiveData =(ZCAN_ReceiveDataFunc)xlib.resolve("ZCAN_ReceiveData");
|
|
|
+ ZCAN_SetValue =(ZCAN_SetValueFunc)xlib.resolve("ZCAN_SetValue");
|
|
|
+ ZCAN_GetValue =(ZCAN_GetValueFunc)xlib.resolve("ZCAN_GetValue");
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+bool cancard::SetCanfdBaudrate()
|
|
|
+{
|
|
|
+
|
|
|
+ char path[50] = { 0 };
|
|
|
+ sprintf_s(path, "%d/canfd_abit_baud_rate", channel_index_);
|
|
|
+ char value[10] = { 0 };
|
|
|
+ sprintf_s(value, "%d",500000);
|
|
|
+ int ret_a = ZCAN_SetValue(device_handle_, path, value);
|
|
|
+
|
|
|
+ sprintf_s(path, "%d/canfd_dbit_baud_rate", channel_index_);
|
|
|
+ sprintf_s(value, "%d", 2000000);
|
|
|
+ int ret_d = ZCAN_SetValue(device_handle_, path, value);
|
|
|
+ return 1 == (ret_a&&ret_d);
|
|
|
+}
|
|
|
+
|
|
|
+bool cancard::SetResistanceEnable()
|
|
|
+{
|
|
|
+
|
|
|
+ char path[50] = {0};
|
|
|
+ sprintf_s(path, "%d/initenal_resistance", channel_index_);
|
|
|
+ char value[10] = {0};
|
|
|
+ sprintf_s(value, "%d", 1);
|
|
|
+ return 1 == ZCAN_SetValue(device_handle_, path, value);
|
|
|
+}
|
|
|
+
|
|
|
+void cancard::threadcan()
|
|
|
+{
|
|
|
+ std::cout<<"enter threadcan. "<<std::endl;
|
|
|
+
|
|
|
+ device_handle_ = ZCAN_OpenDevice(ZCAN_PCIE_CANFD_200U, device_index_, 0);
|
|
|
+
|
|
|
+ if (INVALID_DEVICE_HANDLE == device_handle_)
|
|
|
+ {
|
|
|
+ std::cout<<" Open CAN Fail"<<std::endl;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ ZCAN_CHANNEL_INIT_CONFIG config;
|
|
|
+ memset(&config, 0, sizeof(config));
|
|
|
+
|
|
|
+ char path[50] = {0};
|
|
|
+ char value[100] = {0};
|
|
|
+ sprintf_s(path, "%d/canfd_standard", channel_index_);
|
|
|
+ sprintf_s(value, "%d", 0);
|
|
|
+ ZCAN_SetValue(device_handle_, path, value);
|
|
|
+
|
|
|
+ SetCanfdBaudrate();
|
|
|
+
|
|
|
+ config.can_type = TYPE_CANFD;
|
|
|
+ config.canfd.mode = 0;
|
|
|
+ config.canfd.filter = 1;
|
|
|
+ config.canfd.acc_code = 0x00000000;
|
|
|
+ config.canfd.acc_mask = 0xFFFFFFFF;
|
|
|
+
|
|
|
+ channel_handle_ = ZCAN_InitCAN(device_handle_, channel_index_, &config);
|
|
|
+ if (INVALID_CHANNEL_HANDLE == channel_handle_)
|
|
|
+ {
|
|
|
+ std::cout<<" Init CAN Fail."<<std::endl;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ while(mbrun)
|
|
|
+ {
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
|
|
+ }
|
|
|
}
|