OpcUaCanOpen
CANopen OPC-UA server
stcan.cpp
Go to the documentation of this file.
1 #include "stcan.h"
2 
4 // strcan.cpp: implementation of the STCanScan class.
6 
7 #include <time.h>
8 #include <stdio.h>
9 #include <string.h>
10 #include "gettimeofday.h"
11 
12 bool initLibarary = false;
13 bool STCanScan::inUse[256];
14 tUcanHandle STCanScan::canHandle[256];
15 
16 #ifdef WIN32
17  extern "C" __declspec(dllexport) CCanAccess *getCanbusAccess()
18 #else
20 #endif
21  {
22  CCanAccess *cc;
23  cc = new STCanScan;
24 
25  return cc;
26  }
27 
28 void UnixTimeToFileTime(time_t t, LPFILETIME pft)
29  {
30  // Note that LONGLONG is a 64-bit value
31  LONGLONG ll;
32 
33  ll = Int32x32To64(t, 10000000) + 116444736000000000;
34  pft->dwLowDateTime = (DWORD)ll;
35  pft->dwHighDateTime = ll >> 32;
36  }
37 
38 
40 {
41  return ;
42 }
43 
45 {
46  BYTE Status;
47 // unsigned long timeout = 250;
48  tCanMsgStruct frame;
49 
50  STCanScan *ppcs = reinterpret_cast<STCanScan *>(pCanScan);
51 
52  while ( ppcs->run_can ) {
53  Status = UcanReadCanMsgEx(ppcs->m_UcanHandle,(BYTE *)&ppcs->numChannel,&frame,0);
54  if (Status == USBCAN_SUCCESSFUL) {
55  canMessage cmt;
56  cmt.c_id = frame.m_dwID;
57  cmt.c_dlc = frame.m_bDLC;
58  cmt.c_ff = frame.m_bFF;
59  for (int i = 0; i < 8; i++)
60  cmt.c_data[i] = frame.m_bData[i];
61  gettimeofday(&(cmt.c_time));
62 // cmt.c_time.tv_sec = frame.m_dwTime/1000;
63 // cmt.c_time.tv_usec = (frame.m_dwTime & 1000) * 1000;
64 // cout << ctime((const time_t *)&(cmt.c_time.tv_sec)) << endl;
65  ppcs->canMessageCame(cmt);
66 
67  }
68  else {
69  if (Status == USBCAN_WARN_NODATA) {
70  Sleep(100);
71  }
72  else
73  ppcs->sendErrorCode(Status);
74  }
75  }
76 
77  ExitThread(0);
78  return 0;
79 }
80 
82 {
83  run_can = false;
84  printf("Start Exit ST component\n");
85 
86  DWORD result = WaitForSingleObject(m_hCanScanThread, INFINITE);
87  // deinitialize CAN interface
88  ::UcanDeinitCanEx (m_UcanHandle,(BYTE)numChannel);
89  printf("Finish Exit ST component\n");
90 }
91 
92 bool STCanScan::createBUS(const char *name,const char *parameters)
93 {
94  tUcanHandle oh;
95 
96  unsigned int tseg1 = 0;
97  unsigned int tseg2 = 0;
98  unsigned int sjw = 0;
99  unsigned int noSamp = 0;
100  unsigned int syncmode = 0;
101  long BaudRate = USBCAN_BAUD_125kBit,br;
102  int numPar;
103  BYTE bRet = USBCAN_SUCCESSFUL;
104 
105  tUcanInitCanParam InitParam;
106 
107  const char *na = strstr(name,":");
108  numCanHandle = atoi(na+1);
109 
112 
113  numPar = sscanf(parameters,"%d %d %d %d %d %d",&br,&tseg1,&tseg2,&sjw,&noSamp,&syncmode);
114 
115  /* Set baud rate to 125 Kbits/second. */
116 
117  if (numPar == 1) {
118  switch(br) {
119  case 50000: BaudRate = USBCAN_BAUD_50kBit; break;
120  case 100000: BaudRate = USBCAN_BAUD_100kBit; break;
121  case 125000: BaudRate = USBCAN_BAUD_125kBit; break;
122  case 250000: BaudRate = USBCAN_BAUD_250kBit; break;
123  case 500000: BaudRate = USBCAN_BAUD_500kBit; break;
124  case 1000000: BaudRate = USBCAN_BAUD_1MBit; break;
125  default: BaudRate = br;
126  }
127  }
128  else { if (numPar != 0) BaudRate = br; }
129 
130  // check if USB-CANmodul already is initialized
131  // initialize hardware
132  if (isInUse(numModule)) {
133  oh = getCanHandle(numModule);
134  }
135  else
136  {
137  bRet = ::UcanInitHardwareEx (&oh, numModule, 0,0);
138  if (bRet != USBCAN_SUCCESSFUL) {
139  // fill out initialisation struct
140  ::UcanDeinitHardware (oh);
141  return false;
142  }
143  }
144  InitParam.m_dwSize = sizeof (InitParam); // size of this struct
145  InitParam.m_bMode = kUcanModeNormal; // normal operation mode
146  InitParam.m_bBTR0 = HIBYTE (BaudRate); // baudrate
147  InitParam.m_bBTR1 = LOBYTE (BaudRate);
148  InitParam.m_bOCR = 0x1A; // standard output
149  InitParam.m_dwAMR = USBCAN_AMR_ALL; // receive all CAN messages
150  InitParam.m_dwACR = USBCAN_ACR_ALL;
151  InitParam.m_dwBaudrate = USBCAN_BAUDEX_USE_BTR01;
152  InitParam.m_wNrOfRxBufferEntries = USBCAN_DEFAULT_BUFFER_ENTRIES;
153  InitParam.m_wNrOfTxBufferEntries = USBCAN_DEFAULT_BUFFER_ENTRIES;
154  setInUse(numModule,true);
155  // initialize CAN interface
156  bRet = ::UcanInitCanEx2 (oh,numChannel, &InitParam);
157  if (bRet != USBCAN_SUCCESSFUL)
158  {
159  ::UcanDeinitCanEx (oh,numChannel);
160 // ::UcanDeinitHardware (oh);
161  return false;
162  }
164  m_UcanHandle = oh;
165 
166  m_hCanScanThread = CreateThread(NULL, 0, CanScanControlThread,
167  this, 0, &m_idCanScanThread);
168  if (NULL == m_hCanScanThread) {
169  DebugBreak();
170  return false;
171  }
172 
173  return true;
174 }
175 
176 bool STCanScan::sendErrorCode(long status)
177 {
178  char errMess[120];
179  timeval ftTimeStamp;
180  if (status != bus_status) {
181  gettimeofday(&ftTimeStamp,0);
182  if (!getErrorMessage(status,errMess))
183  canMessageError(status,errMess,ftTimeStamp );
184  bus_status = status;
185  }
186  /*
187  if (status != canOK) {
188  status = canIoCtl(canObjHandler,canIOCTL_CLEAR_ERROR_COUNTERS,NULL,0);
189  return false;
190  }
191  */
192  return true;
193 }
194 
195 bool STCanScan::sendMessage(short cobID, unsigned char len, unsigned char *message)
196 {
197  tCanMsgStruct frame;
198  BYTE Status;
199  unsigned char *buf = message;
200  frame.m_dwID = cobID;
201  frame.m_bDLC = len;
202  frame.m_bFF = 0;
203  int l, l1;
204  l = len;
205  do {
206  if (l > 8) {
207  l1 = 8; l = l - 8;
208  }
209  else l1 = l;
210  frame.m_bDLC = l1;
211  memcpy(frame.m_bData,buf,l1);
212  Status = UcanWriteCanMsgEx(m_UcanHandle,numChannel,&frame,NULL);
213  if (Status != USBCAN_SUCCESSFUL) {
214  break;
215  }
216  buf = buf + l1;
217  }
218  while (l > 8);
219  return sendErrorCode(Status);
220 }
221 
223 {
224  tCanMsgStruct frame;
225  BYTE Status;
226  frame.m_dwID = cobID;
227  frame.m_bDLC = 0;
228  frame.m_bFF = USBCAN_MSG_FF_RTR;
229 
230  Status = UcanWriteCanMsgEx(m_UcanHandle,numChannel,&frame, NULL);
231  return sendErrorCode(Status);
232 }
233 
234 bool STCanScan::getErrorMessage(long error, char message[])
235 {
236  char tmp[300];
237 // canGetErrorText((canStatus)error, tmp, sizeof(tmp));
238 // *message = new char[strlen(tmp)+1];
239  message[0] = 0;
240 // strcpy(*message,tmp);
241  return true;
242 }