23 #include <sys/types.h> 25 #include <sys/socket.h> 26 #include <sys/ioctl.h> 31 #include <linux/can.h> 32 #include <linux/can/raw.h> 33 #include <linux/can/error.h> 36 #include <libsocketcan.h> 42 cout <<
"getCanbusAccess called" << endl;
52 struct can_frame sockmsg;
55 int sock = ppcs->sock;
64 setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,&tv ,
sizeof(
struct timeval));
66 ppcs->clearErrorMessage();
68 while (ppcs->run_can) {
72 nbytes = read(sock, &sockmsg,
sizeof(
struct can_frame));
80 printf (
"Slowed down readout loop for %s ...\n", ppcs->channelName.c_str());
84 ret = can_get_state(ppcs->channelName.c_str(), &state);
86 printf(
"State socket for %s ret=%d state=%d\n", ppcs->channelName.c_str(),ret,state);
88 if ((ret != 0) || (state == CAN_STATE_STOPPED) || (state == CAN_STATE_SLEEPING)) {
89 printf (
"Closing socket for %s ...\n", ppcs->channelName.c_str());
90 if (close(sock) < 0) {
91 perror(
"Socket close error!");
93 printf (
"Socket for %s closed.\n", ppcs->channelName.c_str());
98 printf (
"Opening new socket for %s ...\n", ppcs->channelName.c_str());
102 sock = ppcs->openCanPort();
104 printf (
"Socket for %s open.\n", ppcs->channelName.c_str());
110 if (nbytes <(
int)
sizeof(
struct can_frame)) {
111 cout <<
"read: incomplete CAN frame for " << ppcs->channelName.c_str() << endl;
114 if (sockmsg.can_id & CAN_ERR_FLAG) {
115 ppcs->sendErrorMessage(&sockmsg);
116 errorFlag = sockmsg.can_id;
121 ret = can_get_state(ppcs->channelName.c_str(),&state);
123 ppcs->clearErrorMessage();
128 cmsg.
c_id = sockmsg.can_id;
129 timeErr = ioctl(sock,SIOCGSTAMP,&cmsg.
c_time);
130 cmsg.
c_dlc = sockmsg.can_dlc;
131 memcpy(&cmsg.
c_data[0],&sockmsg.data[0],8);
132 ppcs->canMessageCame(cmsg);
138 if (close(sock) < 0) {
139 perror(
"Socket close error!");
141 else printf (
"Socket for %s closed.\n", ppcs->channelName.c_str());
150 time_t
t =
time(NULL);
151 struct tm *tm = localtime(&
t);
154 pthread_join(m_hCanScanThread,0);
165 com = strchr(
name,
':');
177 return openCanPort();
182 unsigned int tseg1 = 0;
183 unsigned int tseg2 = 0;
184 unsigned int sjw = 0;
185 unsigned int noSamp = 0;
186 unsigned int syncmode = 0;
187 bool paramSpecified =
true;
188 struct sockaddr_can addr;
190 memset ((
char*)&addr, 0,
sizeof addr);
197 if (param.length() > 0) {
198 if (param !=
"Unspecified") {
199 numPar = sscanf(param.c_str(),
"%d %d %d %d %d %d",&br,
200 &tseg1,&tseg2,&sjw,&noSamp,&syncmode);
202 else paramSpecified =
false;
207 if (paramSpecified) {
208 err = can_do_stop(channelName.c_str());
210 perror(
"Cannot stop channel");
213 err = can_set_bitrate(channelName.c_str(),br);
215 perror(
"Cannot set bit rate");
218 err = can_do_start(channelName.c_str());
220 perror(
"Cannot start channel");
225 sock = socket(PF_CAN, SOCK_RAW, CAN_RAW);
228 perror(
"Cannot open the socket");
231 memset(&ifr.ifr_name, 0,
sizeof(ifr.ifr_name));
232 strncpy(ifr.ifr_name, channelName.c_str(), channelName.length());
234 if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
235 perror(
"SIOCGIFINDEX");
239 can_err_mask_t err_mask = 0x1ff;
241 setsockopt(sock, SOL_CAN_RAW, CAN_RAW_ERR_FILTER,
242 &err_mask,
sizeof(err_mask));
244 addr.can_family = AF_CAN;
245 addr.can_ifindex = ifr.ifr_ifindex;
247 if (bind(sock, (
struct sockaddr *)&addr,
sizeof(addr)) < 0) {
253 if (ret = can_get_state(channelName.c_str(), &err))
255 cout <<
"can_get_state() failed with error code " << ret <<
", it was not possible to obtain initial port state";
263 gettimeofday(&now, 0);
264 canMessageError(err,
"Initial port state: error", now);
273 struct can_frame frame;
275 memset ((
char*) &frame, 0,
sizeof(frame));
277 unsigned char *buf = message;
278 frame.can_id = cobID;
289 memcpy(frame.data,buf,l1);
291 nbytes = write(sock, &frame,
sizeof(
struct can_frame));
294 perror(
"while write() on socket");
295 if (errno == ENOBUFS)
297 printf (
"ENOBUFS; waiting a jiffy ...\n");
309 if (nbytes < (
int)
sizeof(
struct can_frame)) {
321 struct can_frame frame;
323 memset ((
char*) &frame, 0,
sizeof(frame));
325 frame.can_id = cobID + CAN_RTR_FLAG ;
328 nbytes = write(sock, &frame,
sizeof(
struct can_frame));
331 perror(
"while write() on socket");
332 if (errno == ENOBUFS)
334 printf (
"ENOBUFS; waiting a jiffy ...\n");
341 if (nbytes < (
int)
sizeof(
struct can_frame))
343 cout <<
"Warning: sendRemoteRequest() sent less bytes than expected" << endl;
357 cout <<
"Create bus " <<
name <<
" " << parameters << endl;
358 if ((sock = configureCanboard(
name,parameters)) < 0) {
361 cout <<
"Create main loop" << endl;
363 pthread_create(&m_hCanScanThread,NULL,&CanScanControlThread,
366 return (!m_idCanScanThread);
376 timeErr = ioctl(sock,SIOCGSTAMP,&c_time);
377 unsigned int errFlag = errFrame->can_id & CAN_ERR_MASK;
379 if (errFlag & CAN_ERR_TX_TIMEOUT)
381 errorMessage =
"TX timeout (by netdevice driver)";
382 canMessageError(errFlag,errorMessage.c_str(),c_time);
386 if ( errFlag & CAN_ERR_LOSTARB )
388 sprintf(mesbuf,
"%s %x",
"Lost arbitration",errFrame->data[0]);
389 errorMessage = mesbuf;
390 canMessageError(errFlag,errorMessage.c_str(),c_time);
394 if ((errFlag & CAN_ERR_CRTL) && (errFrame->data[1] & CAN_ERR_CRTL_RX_OVERFLOW) )
396 errorMessage =
"RX buffer overflow";
397 canMessageError(errFlag,errorMessage.c_str(),c_time);
400 if ((errFlag & CAN_ERR_CRTL) && (errFrame->data[1] & CAN_ERR_CRTL_TX_OVERFLOW) )
402 errorMessage =
"TX buffer overflow";
403 canMessageError(errFlag,errorMessage.c_str(),c_time);
406 if ((errFlag & CAN_ERR_CRTL) && (errFrame->data[1] & CAN_ERR_CRTL_RX_WARNING) )
408 errorMessage =
"reached warning level for RX errors";
409 canMessageError(errFlag,errorMessage.c_str(),c_time);
412 if ((errFlag & CAN_ERR_CRTL) && (errFrame->data[1] & CAN_ERR_CRTL_TX_WARNING) )
414 errorMessage =
"reached warning level for TX errors";
415 canMessageError(errFlag,errorMessage.c_str(),c_time);
418 if ((errFlag & CAN_ERR_CRTL) && (errFrame->data[1] & CAN_ERR_CRTL_RX_PASSIVE) )
420 errorMessage =
"reached error passive status RX";
421 canMessageError(errFlag,errorMessage.c_str(),c_time);
424 if ((errFlag & CAN_ERR_CRTL) && (errFrame->data[1] & CAN_ERR_CRTL_TX_PASSIVE) )
426 errorMessage =
"reached error passive status TX";
427 canMessageError(errFlag,errorMessage.c_str(),c_time);
431 if (errFlag & CAN_ERR_PROT)
433 sprintf(mesbuf,
"%s %x %x",
"protocol violations",errFrame->data[2],errFrame->data[3]);
434 errorMessage = mesbuf;
435 canMessageError(errFlag,errorMessage.c_str(),c_time);
439 if (errFlag & CAN_ERR_TRX)
441 sprintf(mesbuf,
"%s %x",
"transceiver status",errFrame->data[4]);
442 errorMessage = mesbuf;
443 canMessageError(errFlag,errorMessage.c_str(),c_time);
446 if (errFlag & CAN_ERR_ACK)
448 errorMessage =
"received no ACK on transmission";
449 canMessageError(errFlag,errorMessage.c_str(),c_time);
452 if (errFlag & CAN_ERR_BUSOFF)
454 errorMessage =
"bus off";
455 canMessageError(errFlag,errorMessage.c_str(),c_time);
458 if (errFlag & CAN_ERR_BUSERROR)
460 errorMessage =
"bus error (may flood!)";
461 canMessageError(errFlag,errorMessage.c_str(),c_time);
464 if (errFlag & CAN_ERR_RESTARTED)
466 errorMessage =
"controller restarted";
467 canMessageError(errFlag,errorMessage.c_str(),c_time);
474 string errorMessage =
"";
478 timeErr = ioctl(sock,SIOCGSTAMP,&c_time);
480 canMessageError(0,errorMessage.c_str(),c_time);
489 timeErr = ioctl(sock,SIOCGSTAMP,&c_time);
491 canMessageError(-1,mess,c_time);
501 char procFile[] =
"/proc/net/can/rcvlist_all";
503 perror(
"Canbus Read error, Sockect close");
505 timeErr = ioctl(sock,SIOCGSTAMP,&c_time);
507 errorMessage =
"Can Driver error";
509 sendErrorMessage(errorMessage.c_str());
516 ifstream input(procFile);
520 string str((std::istreambuf_iterator<char>(input)), std::istreambuf_iterator<char>());
522 int length = str.length();
524 cout <<
"Reading " << length <<
" characters... " << endl;
527 cout <<
"all characters read successfully." << endl;
528 int sz = str.find(channelName.c_str());
531 cout <<
"Network up..." << endl;
535 cout <<
"No Chennal..." << endl;
539 cout <<
"error: " << errno << endl;
544 cout <<
"No CAN driver..." << endl;