1 | /********************************************************************
|
---|
2 | // created: 2011/02/21 - 10:46
|
---|
3 | // filename: igepCanDriver.cpp
|
---|
4 | //
|
---|
5 | // author: Sergio Rodriguez
|
---|
6 | //
|
---|
7 | // version: $Id: igepCanDriver.cpp srodrigu $
|
---|
8 | //
|
---|
9 | // purpose: Implementation of the igepCanDriver class
|
---|
10 | //
|
---|
11 | *********************************************************************/
|
---|
12 |
|
---|
13 | #include <iostream>
|
---|
14 |
|
---|
15 | #include "igepCanDriver.h"
|
---|
16 | #include <stdio.h>
|
---|
17 | #include <cstring>
|
---|
18 | #include <cstdlib>
|
---|
19 | #include <iostream>
|
---|
20 | #include <unistd.h>
|
---|
21 | #include <string.h>
|
---|
22 |
|
---|
23 | #include <net/if.h>
|
---|
24 | #include <sys/types.h>
|
---|
25 | #include <sys/socket.h>
|
---|
26 | #include <sys/ioctl.h>
|
---|
27 |
|
---|
28 | #include <linux/can.h>
|
---|
29 | #include <linux/can/raw.h>
|
---|
30 | #define DEFAULT_NODE "/dev/pcanusb0"
|
---|
31 | #define WAIT_RECEIVING_FRAME_TIMEOUT 1000
|
---|
32 |
|
---|
33 | /**
|
---|
34 | * Constructor which enables to initialize the different attributes of the class with default values.
|
---|
35 | */
|
---|
36 | igepCanDriver::igepCanDriver (void)
|
---|
37 | {
|
---|
38 | printf("Notice : IGEP CAN Driver used\n");
|
---|
39 | //szDevNode_ = DEFAULT_NODE;
|
---|
40 | mode_ = ReadOnly;
|
---|
41 | }
|
---|
42 |
|
---|
43 | /**
|
---|
44 | * Constructor which enables to initialize the different attributes of the class with default values.
|
---|
45 | */
|
---|
46 | igepCanDriver::igepCanDriver (int channel)
|
---|
47 | {
|
---|
48 | printf("Notice : IGEP CAN Driver used\n");
|
---|
49 | //szDevNode_ = DEFAULT_NODE;
|
---|
50 | mode_ = ReadOnly;
|
---|
51 | }
|
---|
52 |
|
---|
53 | /**
|
---|
54 | * Constructor which enables to initialize the different attributes of the class with default values.
|
---|
55 | */
|
---|
56 | igepCanDriver::igepCanDriver (int channel, unsigned int bitRate)
|
---|
57 | {
|
---|
58 | printf("Notice : IGEP CAN Driver used\n");
|
---|
59 | //szDevNode_ = DEFAULT_NODE;
|
---|
60 | mode_ = ReadOnly;
|
---|
61 | }
|
---|
62 |
|
---|
63 | /**
|
---|
64 | * Constructor which enables to initialize the different attributes of the class with default values.
|
---|
65 | */
|
---|
66 | igepCanDriver::igepCanDriver(const char* port, const char* mode)
|
---|
67 | {
|
---|
68 | szDevNode_ =(char*) malloc(14*sizeof(char));
|
---|
69 | strcpy(szDevNode_,DEFAULT_NODE);
|
---|
70 |
|
---|
71 | printf("Notice : IGEP CAN Driver used\n");
|
---|
72 | //strcpy(szDevNode_, port);
|
---|
73 | // printf("Driver to be connected at port: %s",szDevNode_);
|
---|
74 |
|
---|
75 | }
|
---|
76 |
|
---|
77 | /**
|
---|
78 | * Destructor which clean up the different attributs of the class.
|
---|
79 | */
|
---|
80 | igepCanDriver::~igepCanDriver (void)
|
---|
81 | {
|
---|
82 |
|
---|
83 | }
|
---|
84 |
|
---|
85 | /**
|
---|
86 | * Member used to initialise the configuration of the CAN Card.
|
---|
87 | * @see cleanUpPort (void)
|
---|
88 | * @return a Pstatus variable which contain the error code of the function. On success, it return PSUCCESS. On failure, it return Pstatus error code.
|
---|
89 | */
|
---|
90 | short igepCanDriver::initPort (void)
|
---|
91 | {
|
---|
92 | int nbytes;
|
---|
93 | struct sockaddr_can addr;
|
---|
94 | struct ifreq ifr;
|
---|
95 |
|
---|
96 | char ifname[] = "can0";
|
---|
97 |
|
---|
98 | if((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
|
---|
99 | {
|
---|
100 | perror("Error while opening socket");
|
---|
101 | return 1;
|
---|
102 | }
|
---|
103 |
|
---|
104 | strcpy(ifr.ifr_name, ifname);
|
---|
105 | ioctl(s, SIOCGIFINDEX, &ifr);
|
---|
106 |
|
---|
107 | addr.can_family = AF_CAN;
|
---|
108 | addr.can_ifindex = ifr.ifr_ifindex;
|
---|
109 |
|
---|
110 |
|
---|
111 | if(bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
---|
112 | {
|
---|
113 | perror("Error in socket bind");
|
---|
114 | return 1;
|
---|
115 | }
|
---|
116 |
|
---|
117 | return PSUCCESS;
|
---|
118 | }
|
---|
119 |
|
---|
120 | /**
|
---|
121 | * Member used to clean up the configuration of the CAN Card.
|
---|
122 | * @see initPort (void)
|
---|
123 | * @return a Pstatus variable which contain the error code of the function. On success, it return PSUCCESS. On failure, it return Pstatus error code.
|
---|
124 | */
|
---|
125 | short igepCanDriver::cleanUpPort (void)
|
---|
126 | {
|
---|
127 | if(canDeviceHandle_)
|
---|
128 | {
|
---|
129 | printf("Closing CAN Driver..");
|
---|
130 | close(s);
|
---|
131 | // CAN_Close(canDeviceHandle_);
|
---|
132 | return PSUCCESS;
|
---|
133 | }
|
---|
134 | printf("CAN Driver finished.\n");
|
---|
135 | return 1;
|
---|
136 | }
|
---|
137 |
|
---|
138 |
|
---|
139 | /**
|
---|
140 | * Member which permit to send a frame on the CAN bus and test if the frame is well acknowledged.
|
---|
141 | * @param flags a character which contain the flags of the sent frame.
|
---|
142 | * @param dlc a character which defined the number of characters of the sent frame.
|
---|
143 | * @param data a table of characters with the data of the sent frame.
|
---|
144 | * @see receiveFrame (unsigned char * flags, unsigned char * dlc, unsigned char ** data)
|
---|
145 | * @return a Pstatus variable which contain the error code of the function. On success, it return PSUCCESS. On failure, it return Pstatus error code.
|
---|
146 | */
|
---|
147 | short igepCanDriver::sendFrame (struct CanFrame frame)
|
---|
148 | {
|
---|
149 | can_frame message;
|
---|
150 | message.can_dlc = frame.dlc;
|
---|
151 | message.can_id = frame.id;
|
---|
152 | memcpy(message.data,frame.data, frame.dlc);
|
---|
153 |
|
---|
154 | write(s, &message, sizeof(struct can_frame));
|
---|
155 | return PSUCCESS;
|
---|
156 | }
|
---|
157 |
|
---|
158 |
|
---|
159 | /**
|
---|
160 | * Member which permit to receive of a frame on the CAN bus.
|
---|
161 | * @param flags a character pointer which contain the flags of the received frame.
|
---|
162 | * @param dlc a character pointer which defined the number of characters of the received frame.
|
---|
163 | * @param data a pointer of table of characters with the data of the received frame.
|
---|
164 | * @see sendFrame (unsigned char flags, unsigned char dlc, unsigned char * data)
|
---|
165 | * @return a Pstatus variable which contain the error code of the function. On success, it return PSUCCESS. On failure, it return Pstatus error code.
|
---|
166 | */
|
---|
167 | short igepCanDriver::receiveFrame (struct CanFrame &frame)
|
---|
168 | {
|
---|
169 | can_frame message;
|
---|
170 |
|
---|
171 | if ((read(s, &message, sizeof(struct can_frame))) < 0)
|
---|
172 | {
|
---|
173 | perror("application: CAN_Read()");
|
---|
174 | std::cout << "ERREUR" << std::endl;
|
---|
175 | std::flush(std::cout);
|
---|
176 | return 1;
|
---|
177 | }
|
---|
178 | else
|
---|
179 | {
|
---|
180 | // std::cout << "id : " << message.can_id << " dlc : " << message.can_dlc << " message : " << message.data << std::endl;
|
---|
181 | std::flush(std::cout);
|
---|
182 | frame.dlc = message.can_dlc; //ok
|
---|
183 | frame.id = message.can_id;
|
---|
184 | if( ( frame.dlc > 8 ) || ( frame.dlc < 0 ))
|
---|
185 | frame.dlc = 8;
|
---|
186 | memcpy(frame.data,message.data, frame.dlc);
|
---|
187 | return PSUCCESS;
|
---|
188 |
|
---|
189 | }
|
---|
190 |
|
---|
191 |
|
---|
192 | }
|
---|
193 |
|
---|
194 |
|
---|
195 | /**
|
---|
196 | * Member which wait the reception of a frame on the CAN bus.
|
---|
197 | * @see sendFrame (unsigned char flags, unsigned char dlc, unsigned char * data)
|
---|
198 | * @see receiveFrame (unsigned char * flags, unsigned char * dlc, unsigned char ** data)
|
---|
199 | */
|
---|
200 | void igepCanDriver::waitReceivingFrame(void)
|
---|
201 | {
|
---|
202 |
|
---|
203 | }
|
---|
204 | // print out the contents of a CAN message
|
---|
205 | void igepCanDriver::print_message(TPCANMsg *m)
|
---|
206 | {
|
---|
207 | int i;
|
---|
208 |
|
---|
209 | // print RTR, 11 or 29, CAN-Id and datalength
|
---|
210 | printf("message: %c %c 0x%08x %1d ",
|
---|
211 | (m->MSGTYPE & MSGTYPE_RTR) ? 'r' : 'm',
|
---|
212 | (m->MSGTYPE & MSGTYPE_EXTENDED) ? 'e' : 's',
|
---|
213 | m->ID,
|
---|
214 | m->LEN);
|
---|
215 |
|
---|
216 | // don't print any telegram contents for remote frames
|
---|
217 | if (!(m->MSGTYPE & MSGTYPE_RTR))
|
---|
218 | for (i = 0; i < m->LEN; i++)
|
---|
219 | printf("0x%02x ", m->DATA[i]);
|
---|
220 |
|
---|
221 | printf("\n");
|
---|
222 | }
|
---|