OpcUaCanOpen
CANopen OPC-UA server
stcan.cpp
Go to the documentation of this file.
1 // This is the main DLL file.
2 
3 #include "stcan.h"
4 
6 // kvCann.cpp: implementation of the KVCanScan class.
8 //#include "CCanCallback.h"
9 #include <time.h>
10 #include <stdio.h>
11 #include <string.h>
12 
13 
14 #ifdef WIN32
15  extern "C" __declspec(dllexport) CCanAccess *getCanbusAccess()
16 #else
18 #endif
19  {
20  CCanAccess *cc;
21  cc = new STCanScan;
22 
23  return cc;
24  }
25 
26 #include "gettimeofday.h"
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 void PUBLIC UcanCallbackFktEx (tUcanHandle uhp,DWORD bEvent_p, BYTE bC, void* pCanScan)
39 {
40  tCanMsgStruct frame;
41  BYTE ch = bC ? USBCAN_CHANNEL_CH1 : USBCAN_CHANNEL_CH0;
42  UCANRET Status;
43  tStatusStruct pStatus_p;
44  STCanScan * ppcs = (STCanScan *)pCanScan;
45 
46 
47  //----------------------------------------------------------------------------
48  // NOTE:
49  // Do not call functions of USBCAN32.DLL directly from this callback handler.
50  // Use events or windows messages to notify the event to the application.
51  //----------------------------------------------------------------------------
52 
53  // check event
54  switch (bEvent_p)
55  {
56  case USBCAN_EVENT_RECIEVE:
57  {
58  Status = UcanReadCanMsgEx(uhp, &ch, &frame, NULL );
59 
60  if (USBCAN_CHECK_VALID_RXCANMSG (Status))
61  {
62  canMessage cmes;
63  memcpy(&cmes.c_data,&frame.m_bData,8);
64  cmes.c_dlc = frame.m_bDLC;
65  cmes.c_ff = frame.m_bFF;
66  cmes.c_id = frame.m_dwID;
67  cmes.c_time.tv_sec = frame.m_dwTime/1000;
68  cmes.c_time.tv_usec = frame.m_dwTime*1000;
69 
70  ppcs->canMessageCame(cmes);
71  if (USBCAN_CHECK_WARNING (Status))
72  {
73  Status = UcanGetStatusEx (uhp, ch, &pStatus_p);
74  ppcs->sendErrorCode(pStatus_p.m_wCanStatus);
75  }
76  }
77  // No warning? Print error
78  else if (USBCAN_CHECK_WARNING (Status))
79  {
80  Status = UcanGetStatusEx (uhp, ch, &pStatus_p);
81  ppcs->sendErrorCode(pStatus_p.m_wCanStatus);
82  }
83  }
84  break;
85  // unknown event
86  default:
87  break;
88  }
89 }
90 
92 {
93  return ;
94 }
95 
97 {
98  run_can = false;
99 // CloseHandle(m_ReadEvent);
100 // CAN_Uninitialize(canObjHandler);
101 }
102 
103 
104 bool STCanScan::sendMessage(short cobID, unsigned char len, unsigned char *message)
105 {
106  tCanMsgStruct frame;
107  BYTE Status;
108  unsigned char *buf = message;
109  frame.m_dwID = cobID;
110  frame.m_bDLC = len;
111  frame.m_bFF = 0;
112  int l, l1;
113  l = len;
114  do {
115  if (l > 8) {
116  l1 = 8; l = l - 8;
117  }
118  else l1 = l;
119  frame.m_bDLC = l1;
120  memcpy(frame.m_bData,buf,l1);
121  Status = UcanWriteCanMsgEx(m_UcanHandle,numChannel,&frame,NULL);
122  if (Status != USBCAN_SUCCESSFUL) {
123  return sendErrorCode(Status);
124  }
125  buf = buf + l1;
126  }
127  while (l > 8);
128  return sendErrorCode(Status);
129 }
130 
131 bool STCanScan::sendRemoteRequest(short cobID)
132 {
133  tCanMsgStruct frame;
134  BYTE Status;
135  frame.m_dwID = cobID;
136  frame.m_bDLC = 0;
137  frame.m_bFF = USBCAN_MSG_FF_RTR;
138 
139  Status = UcanWriteCanMsgEx(m_UcanHandle,numChannel,&frame, NULL);
140  return sendErrorCode(Status);
141 }
142 
143 bool STCanScan::createBUS(const char *name ,const char *parameters )
144 {
145  busName = strdup(name);
146  if (!configureCanboard(name,parameters))
147  return false;
148  return true;
149 }
150 
151 bool STCanScan::getErrorMessage(long error, char **message)
152 {
153  char tmp[300];
154 
155  CAN_GetErrorText((TPCANStatus)error,0, tmp);
156  *message = new char[strlen(tmp)+1];
157  strcpy(*message,tmp);
158  return true;
159 }
160 
161 bool STCanScan::configureCanboard(const char *name, const char *parameters)
162 {
163  DWORD Status = USBCAN_SUCCESSFUL;
164  tUcanHandle oh;
165  char *com,*strch;
166 
167  unsigned int tseg1 = 0;
168  unsigned int tseg2 = 0;
169  unsigned int sjw = 0;
170  unsigned int noSamp = 0;
171  unsigned int syncmode = 0;
172  long BaudRate = USBCAN_BAUD_125kBit,br;
173  int delta,numPar;
174  BYTE bRet = USBCAN_SUCCESSFUL;
175  BOOL fRet = true;
176  tUcanInitCanParam InitParam;
177 
178 
179  com = strchr(name,':');
180  if (com == NULL) return NULL;
181  delta = com - name;
182  com++;
183 
184  strch = strchr(com,',');
185  if (strch == NULL) {
186  numCanHandle = atoi(com);
187  numChannel = 0;
188  }
189  else {
190  strch++;
191  numModule = atoi(com);
192  numChannel = atoi(strch);
193  }
195 
196  numPar = sscanf(parameters,"%d %d %d %d %d %d",&br,&tseg1,&tseg2,&sjw,&noSamp,&syncmode);
197 
198  if (numPar == 1) {
199  switch(br) {
200  case 50000: BaudRate = USBCAN_BAUD_50kBit; break;
201  case 100000: BaudRate = USBCAN_BAUD_100kBit; break;
202  case 125000: BaudRate = USBCAN_BAUD_125kBit; break;
203  case 250000: BaudRate = USBCAN_BAUD_250kBit; break;
204  case 500000: BaudRate = USBCAN_BAUD_500kBit; break;
205  case 1000000: BaudRate = USBCAN_BAUD_1MBit; break;
206  default: BaudRate = br;
207  }
208  }
209  else { if (numPar != 0) BaudRate = br; }
210 
211  // check if USB-CANmodul already is initialized
212  // initialize hardware
213  if (parrent->isInUse(numCanHandle)) {
214  oh = parrent->getCanHandle(numCanHandle);
215  }
216  else
217  {
218  bRet = ::UcanInitHardwareEx (&oh, numModule, UcanCallbackFktEx,&numModule);
219  if (bRet != USBCAN_SUCCESSFUL) {
220  // fill out initialisation struct
221  ::UcanDeinitHardware (oh);
222  return false;
223  }
224  }
225  InitParam.m_dwSize = sizeof (InitParam); // size of this struct
226  InitParam.m_bMode = kUcanModeNormal; // normal operation mode
227  InitParam.m_bBTR0 = HIBYTE (BaudRate); // baudrate
228  InitParam.m_bBTR1 = LOBYTE (BaudRate);
229  InitParam.m_bOCR = 0x1A; // standard output
230  InitParam.m_dwAMR = USBCAN_AMR_ALL; // receive all CAN messages
231  InitParam.m_dwACR = USBCAN_ACR_ALL;
232  InitParam.m_dwBaudrate = USBCAN_BAUDEX_USE_BTR01;
233  InitParam.m_wNrOfRxBufferEntries = USBCAN_DEFAULT_BUFFER_ENTRIES;
234  InitParam.m_wNrOfTxBufferEntries = USBCAN_DEFAULT_BUFFER_ENTRIES;
235  parrent->setCanHandle(numModule,oh);
236  parrent->setInUse(numModule,true);
237  // initialize CAN interface
238  bRet = ::UcanInitCanEx2 (oh,numChannel, &InitParam);
239  if (bRet != USBCAN_SUCCESSFUL)
240  {
241  ::UcanDeinitCanEx (oh,numChannel);
242 // ::UcanDeinitHardware (oh);
243  return false;
244  }
245  parrent->setCanHandle(numCanHandle,oh);
246  parrent->setInUse(numCanHandle,true);
247  th = oh;
248  return fRet;
249 }
250