Explorar o código

change driver_can_nvidia_agx. change fault info.

yuchuli %!s(int64=3) %!d(string=hai) anos
pai
achega
a608f5d937

+ 9 - 6
src/driver/driver_can_nvidia_agx/canctrl.cpp

@@ -59,6 +59,7 @@ void canctrl::run()
     int nOldTime = xTime.elapsed();
     int i;
 
+
     while(!isInterruptionRequested())
     {
         if(mbCANOpen)
@@ -75,6 +76,7 @@ void canctrl::run()
                 sharecanmsg(mparecv1,xmsg,nRec2,1);
             }
 
+
             nSend1 = 0;
             nSend2 = 0;
 
@@ -122,7 +124,7 @@ void canctrl::run()
                 exit(-1);
             }
         }
-        mpcan->mfault->SetFaultState(0, 0, "ok");
+//        mpcan->mfault->SetFaultState(0, 0, "ok");
     }
 
 }
@@ -137,7 +139,7 @@ void canctrl::sendmsg(int index, iv::can::canmsg xmsg)
 {
     if((index <0)||(index > 1))
     {
-        mpcan->mfault->SetFaultState(1, 0, "sendmsg index error");
+ //       mpcan->mfault->SetFaultState(1, 0, "sendmsg index error");
         mpcan->mivlog->error("sendmsg index err");
         std::cout<<"canctrl::sendmsg index error"<<std::endl;
         return;
@@ -179,8 +181,9 @@ void canctrl::sendmsg(int index, iv::can::canmsg xmsg)
         if((nlen < 0) || (nlen > 8))
         {
             nlen = 0;
-            mpcan->mivlog->error("sendmsg nlen err");
-            mpcan->mfault->SetFaultState(1, 0, "sendmsg nlen err");
+            mpcan->mivlog->warn("sendmsg nlen err");
+            continue;
+ //           mpcan->mfault->SetFaultState(1, 0, "sendmsg nlen err");
         }
         sendmsg.nLen = nlen;
         if(sendmsg.nLen > 0)
@@ -224,8 +227,8 @@ void canctrl::sharecanmsg(void *xpa, basecan_msg * pxmsg,int ncount,int nch)
     }
     else
     {
-        mpcan->mivlog->error("canctrl::sharecanmsg serialize error");
-        mpcan->mfault->SetFaultState(1, 0, "sharecanmsg serialize error");
+        mpcan->mivlog->warn("canctrl::sharecanmsg serialize error");
+//        mpcan->mfault->SetFaultState(1, 0, "sharecanmsg serialize error");
     }
     delete strdata;
 }

+ 33 - 0
src/driver/driver_can_nvidia_agx/nvcan.cpp

@@ -22,6 +22,8 @@
 #include <linux/can.h>
 #include <linux/can/raw.h>
 
+#include <QDateTime>
+
 #include <iostream>
 
 /* for hardware timestamps - since Linux 2.6.30 */
@@ -60,6 +62,9 @@ nvcan::nvcan()
     mivlog = new iv::Ivlog("can_agx");
 
 
+    mfault->SetFaultState(0,0,"Prepare Initialize.");
+
+
 }
 
 void nvcan::run()
@@ -79,11 +84,14 @@ void nvcan::run()
     struct ifreq ifr;
     struct timeval tv, last_tv;
     struct timeval timeout_config = { 0, 0 }, *timeout_current = 0;
+
+    mfault->SetFaultState(0,0,"Initializing.");
     
     for(i=0;i<currmax;i++)
     {
         s[i] = socket(PF_CAN, SOCK_RAW, CAN_RAW);
         if (s[i] < 0) {
+            mfault->SetFaultState(2,1,"Create Socket Error.");
             emit SIG_CANOPENSTATE(false,-1,"Create Socket Error");
             return;
         }
@@ -94,12 +102,14 @@ void nvcan::run()
         strncpy(ifr.ifr_name, CANNAME[i].data(), 5);
 
         if (ioctl(s[i], SIOCGIFINDEX, &ifr) < 0) {
+            mfault->SetFaultState(2,2,"SIOCGIFINDEX.");
             emit SIG_CANOPENSTATE(false,-2,"SIOCGIFINDEX");
             return;
         }
         addr.can_ifindex = ifr.ifr_ifindex;
 
         if (bind(s[i], (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+            mfault->SetFaultState(2,3,"bind error.");
             emit SIG_CANOPENSTATE(false,-3,"bind error");
             return;
         }
@@ -107,6 +117,7 @@ void nvcan::run()
 
     mbCANOpen = true;
     mivlog->verbose("open can succesfully.");
+    mfault->SetFaultState(0,0,"CAN OK.");
     emit SIG_CANOPENSTATE(true,0,"open can card successfully");
 
     iov.iov_base = &frame;
@@ -115,6 +126,9 @@ void nvcan::run()
     msg.msg_iovlen = 1;
     msg.msg_control = &ctrlmsg;
 
+    qint64 nLastRecv = QDateTime::currentMSecsSinceEpoch();
+    int nRecvState = 0; // 0 Have Data  1 No Data;
+
     while((!QThread::isInterruptionRequested())&&(mbCANOpen))
     {
         FD_ZERO(&rdfs);
@@ -130,6 +144,7 @@ void nvcan::run()
         ret = select(s[currmax-1]+1, &rdfs, NULL, NULL, timeout_current);
         if (ret < 0) {
             emit SIG_CANOPENSTATE(false,-4,"select error");
+            mfault->SetFaultState(2,4,"select error.");
             mbCANOpen = false;
             continue;
         }
@@ -138,6 +153,7 @@ void nvcan::run()
 
             if (FD_ISSET(s[i], &rdfs)) {
 
+                nLastRecv = QDateTime::currentMSecsSinceEpoch();
                 /* these settings may be modified by recvmsg() */
                 iov.iov_len = sizeof(frame);
                 msg.msg_namelen = sizeof(addr);
@@ -190,6 +206,23 @@ void nvcan::run()
             }
         }
 
+        if((QDateTime::currentMSecsSinceEpoch() - nLastRecv)> 1000)
+        {
+            if(nRecvState == 0)
+            {
+                nRecvState = -1;
+                mfault->SetFaultState(0,1,"More than 1 second not receive data.");
+            }
+        }
+        else
+        {
+            if(nRecvState == -1)
+            {
+                nRecvState = 0;
+                mfault->SetFaultState(0,0,"CAN OK.");
+            }
+        }
+
         struct canfd_frame framesend[2500];
 
         for(int nch =0;nch<currmax;nch++)