source: pacpussensors/trunk/CanGateway/driver/PeakCanDriverWin.cpp

Last change on this file was 59, checked in by DHERBOMEZ Gérald, 10 years ago

Integration of new modules:

  • GPS NMEA0183 decoder
  • Span CPT Decoder

Update of:

File size: 7.2 KB
Line 
1/********************************************************************
2// created: 2011/02/21 - 10:46
3// filename: PeakCanDriverWin.cpp
4//
5// author: Sergio Rodriguez
6//
7// version: $Id: PeakCanDriverWin.cpp srodrigu $
8//
9// purpose: Implementation of the PeakCanDriverWin class
10//
11*********************************************************************/
12
13
14#include "PeakCanDriverWin.h"
15#include <stdio.h>
16#include <cstring>
17#include <cstdlib>
18#include <iostream>
19
20#define DEFAULT_NODE PCAN_USBBUS1
21#define WAIT_RECEIVING_FRAME_TIMEOUT 1000
22
23/**
24* Constructor which enables to initialize the different attributes of the class with default values.
25*/
26PeakCanDriverWin::PeakCanDriverWin (void)
27{
28 printf("Notice : PEAK CAN Driver used\n");
29 //szDevNode_ = DEFAULT_NODE;
30
31 this->canDeviceHandle_ = DEFAULT_NODE;
32 mode_ = ReadOnly;
33}
34
35/**
36* Constructor which enables to initialize the different attributes of the class with default values.
37*/
38PeakCanDriverWin::PeakCanDriverWin (int channel)
39{
40 printf("Notice : PEAK CAN Driver used\n");
41 //szDevNode_ = DEFAULT_NODE;
42
43 //ATTENCION : Its necessary to create something more generalized
44 this->canDeviceHandle_ = DEFAULT_NODE;
45 this->canBaudrate_ = PCAN_BAUD_500K;
46 mode_ = ReadOnly;
47}
48
49/**
50* Constructor which enables to initialize the different attributes of the class with default values.
51*/
52PeakCanDriverWin::PeakCanDriverWin (int channel, unsigned int bitRate)
53{
54 printf("Notice : PEAK CAN Driver used\n");
55 //szDevNode_ = DEFAULT_NODE;
56
57 //ATTENCION : Its necessary to create something more generalized
58 this->canDeviceHandle_ = DEFAULT_NODE;
59 this->canBaudrate_ = PCAN_BAUD_500K;
60 mode_ = ReadOnly;
61}
62
63/**
64* Constructor which enables to initialize the different attributes of the class with default values.
65*/
66PeakCanDriverWin::PeakCanDriverWin(const char* port, const char* mode)
67{
68 /*szDevNode_ =(char*) malloc(14*sizeof(char));
69 strcpy(szDevNode_,DEFAULT_NODE);*/
70
71 //ATTENCION : Its necessary to create something more generalized
72 this->canDeviceHandle_ = DEFAULT_NODE;
73 this->canBaudrate_ = PCAN_BAUD_500K;
74
75 printf("Notice : PEAK CAN Driver used\n");
76 //strcpy(szDevNode_, port);
77 printf("Driver to be connected at port: %s",szDevNode_);
78
79 if (!strcmp(mode,"ReadOnly")){
80 mode_ = ReadOnly;
81 printf(" in ReadOnly mode\n");
82 }
83 else if (!strcmp(mode,"WriteOnly")){
84 mode_ = WriteOnly;
85 printf(" in WriteOnly mode\n");
86 }
87 else if (!strcmp(mode,"ReadWrite")){
88 mode_ = ReadWrite;
89 printf(" in ReadWrite dual mode\n");
90 }
91 else{
92 mode_= ReadOnly;
93 printf(" in ReadOnly mode since mode was not identified.\n");
94 }
95}
96
97/**
98* Destructor which clean up the different attributs of the class.
99*/
100PeakCanDriverWin::~PeakCanDriverWin (void)
101{
102
103}
104
105/**
106* Member used to initialise the configuration of the CAN Card.
107* @see cleanUpPort (void)
108* @return a Pstatus variable which contain the error code of the function. On success, it return PSUCCESS. On failure, it return Pstatus error code.
109*/
110short PeakCanDriverWin::initPort (void)
111{
112 // Connects a selected PCAN-Basic channel
113 //
114 TPCANStatus stsResult = CAN_Initialize( this->canDeviceHandle_ /* TPCANHandle Channel */,
115 this->canBaudrate_ /* TPCANBaudrate Btr0Btr1 */);
116
117 /*
118 switch(mode_)
119 {
120 case ReadOnly:
121 //canDeviceHandle_ = LINUX_CAN_Open(szDevNode_, O_RDONLY);
122 break;
123 case WriteOnly:
124 canDeviceHandle_ = LINUX_CAN_Open(szDevNode_, O_WRONLY);
125 break;
126 case ReadWrite:
127 canDeviceHandle_ = LINUX_CAN_Open(szDevNode_, O_RDWR);
128 break;
129 default:
130 printf("Error on CAN port operation mode selection.\n");
131 break;
132 }
133 */
134
135 return (stsResult != PCAN_ERROR_OK)?1:PSUCCESS;
136}
137
138/**
139* Member used to clean up the configuration of the CAN Card.
140* @see initPort (void)
141* @return a Pstatus variable which contain the error code of the function. On success, it return PSUCCESS. On failure, it return Pstatus error code.
142*/
143short PeakCanDriverWin::cleanUpPort (void)
144{
145 if(canDeviceHandle_)
146 {
147 printf("Closing CAN Driver..");
148 TPCANStatus stsResult = CAN_Uninitialize(canDeviceHandle_);
149 return (stsResult != PCAN_ERROR_OK)?1:PSUCCESS;
150 }
151 printf("CAN Driver finished.\n");
152 return 1;
153}
154
155
156/**
157* Member which permit to send a frame on the CAN bus and test if the frame is well acknowledged.
158* @param flags a character which contain the flags of the sent frame.
159* @param dlc a character which defined the number of characters of the sent frame.
160* @param data a table of characters with the data of the sent frame.
161* @see receiveFrame (unsigned char * flags, unsigned char * dlc, unsigned char ** data)
162* @return a Pstatus variable which contain the error code of the function. On success, it return PSUCCESS. On failure, it return Pstatus error code.
163*/
164short PeakCanDriverWin::sendFrame (struct CanFrame frame)
165{
166 TPCANMsg msg;
167 msg.MSGTYPE = 0; //normal message
168 //msg.MSGTYPE |= MSGTYPE_EXTENDED; //extended ?
169 msg.ID = frame.id;
170 msg.LEN = frame.dlc;
171 memcpy(msg.DATA, frame.data, frame.dlc);
172 if(CAN_Write(canDeviceHandle_, &msg)) {
173 perror("application: CAN_Write()");
174 return errno;
175 }
176 return PSUCCESS;
177}
178
179
180/**
181* Member which permit to receive of a frame on the CAN bus.
182* @param flags a character pointer which contain the flags of the received frame.
183* @param dlc a character pointer which defined the number of characters of the received frame.
184* @param data a pointer of table of characters with the data of the received frame.
185* @see sendFrame (unsigned char flags, unsigned char dlc, unsigned char * data)
186* @return a Pstatus variable which contain the error code of the function. On success, it return PSUCCESS. On failure, it return Pstatus error code.
187*/
188short PeakCanDriverWin::receiveFrame (struct CanFrame &frame)
189{
190 TPCANMsg message;
191 TPCANStatus status;
192
193 //if ((errno = CAN_Read(canDeviceHandle_, &message)))
194 if ((errno = CAN_Read(canDeviceHandle_, &message, NULL)))
195 {
196 //Timeout:
197 //perror("application: CAN_Read()");
198 return errno;
199 }
200 else
201 {
202 //print_message(&message.Msg);
203 // check if a CAN status is pending
204 if (message.MSGTYPE & PCAN_MESSAGE_STATUS)
205 {
206 status = CAN_GetStatus(canDeviceHandle_);
207 /*if ((int)status < 0)
208 {
209 errno = nGetLastError();
210 perror("application: CAN_Status()");
211 return errno;
212 }
213 else*/
214 printf("application: pending CAN status 0x%04x read.\n", status);
215 }
216 }
217
218 /* Return the flags field, dlc field and data field of the sent frame */
219 //frame.flags = pEvent->tagData.msg.flags;
220 frame.dlc = message.LEN; //ok
221 frame.id = message.ID;
222
223 if( ( frame.dlc > 8 ) || ( frame.dlc < 0 ))
224 frame.dlc = 8;
225 memcpy(frame.data,message.DATA, frame.dlc);
226
227 return PSUCCESS;
228}
229
230
231/**
232* Member which wait the reception of a frame on the CAN bus.
233* @see sendFrame (unsigned char flags, unsigned char dlc, unsigned char * data)
234* @see receiveFrame (unsigned char * flags, unsigned char * dlc, unsigned char ** data)
235*/
236void PeakCanDriverWin::waitReceivingFrame(void)
237{
238
239}
240// print out the contents of a CAN message
241void PeakCanDriverWin::print_message(TPCANMsg *m)
242{
243 int i;
244
245 // print RTR, 11 or 29, CAN-Id and datalength
246 printf("message: %c %c 0x%08x %1d ",
247 (m->MSGTYPE & PCAN_MESSAGE_RTR) ? 'r' : 'm',
248 (m->MSGTYPE & PCAN_MESSAGE_EXTENDED) ? 'e' : 's',
249 m->ID,
250 m->LEN);
251
252 // don't print any telegram contents for remote frames
253 if (!(m->MSGTYPE & PCAN_MESSAGE_RTR))
254 for (i = 0; i < m->LEN; i++)
255 printf("0x%02x ", m->DATA[i]);
256
257 printf("\n");
258}
Note: See TracBrowser for help on using the repository browser.