瀏覽代碼

add CANFD support.

yuchuli 2 年之前
父節點
當前提交
821ee4af06

+ 38 - 0
src/detection/detection_chassis/decodechassis.cpp

@@ -461,5 +461,43 @@ int ProcShenLanChassis(void *pa, iv::can::canmsg *pmsg)
     }
 
 
+    return 0;
+}
+
+int ProcShenLanCANFDChassis(void *pa, iv::can::canmsg *pmsg)
+{
+    int i;
+    static iv::chassis xchassis;
+    for(i=0;i<pmsg->rawmsg_size();i++)
+    {
+
+        const iv::can::canraw * praw = &(pmsg->rawmsg(i));
+//        unsigned char data[8];
+//        memcpy(data,praw->data().data(),8);
+        if(praw->id() == 0x1CC)
+        {
+            unsigned char byte[64];
+            double vehspeed;
+            if(praw->len() == 64)
+            {
+                memcpy(byte,praw->data().data(),64);
+                unsigned int value;
+                value = byte[12]&0x1F;
+                value = (value<<8) +  static_cast<unsigned int >( byte[13]);
+                vehspeed = static_cast<double>(value) * 0.05625;
+
+                xchassis.set_vel(static_cast<float>(vehspeed));
+                ShareChassis(pa,&xchassis);
+                std::cout<<"veh: "<<xchassis.vel()<<std::endl;
+            }
+            else
+            {
+                std::cout<<" 1CC not 64 bytes. 1CC bytes: "<<praw->len()<<std::endl;
+            }
+        }
+
+    }
+
+
     return 0;
 }

+ 2 - 0
src/detection/detection_chassis/decodechassis.h

@@ -24,4 +24,6 @@ int ProcYUHESENChassis(void * pa, iv::can::canmsg * pmsg);
 
 int ProcShenLanChassis(void * pa, iv::can::canmsg * pmsg);
 
+int ProcShenLanCANFDChassis(void *pa, iv::can::canmsg *pmsg);
+
 #endif // DECODECHASSIS_H

+ 5 - 0
src/detection/detection_chassis/detection_chassis.xml

@@ -0,0 +1,5 @@
+<xml>	
+	<node name="detection_chassis">
+		<param name="vehicletype" value="SHENLAN_CANFD" />
+	</node>
+</xml>

+ 8 - 1
src/detection/detection_chassis/main.cpp

@@ -27,7 +27,7 @@ QTime gTime;
 
 namespace  iv {
 
-enum VehicleTypeDef {GE3,VV7,MIDCAR,PROBLUE,MIDBUS,HAPO,UNKNOWN, YUHESEN,SHENLAN} gVehicleType;  //车辆类型
+enum VehicleTypeDef {GE3,VV7,MIDCAR,PROBLUE,MIDBUS,HAPO,UNKNOWN, YUHESEN,SHENLAN,SHENLAN_CANFD} gVehicleType;  //车辆类型
 
 
 }
@@ -86,6 +86,9 @@ void Listencan0(const char * strdata,const unsigned int nSize,const unsigned int
         break;
     case iv::SHENLAN:
         nRtn = ProcShenLanChassis(gpa,&xmsg);
+    case iv::SHENLAN_CANFD:
+        nRtn = ProcShenLanCANFDChassis(gpa,&xmsg);
+        break;
     default:
         break;
     }
@@ -189,6 +192,10 @@ int main(int argc, char *argv[])
     {
         iv::gVehicleType = iv::SHENLAN;
     }
+   if(strncmp(strvehicletype.data(),"SHENLAN_CANFD",255) == 0)
+    {
+        iv::gVehicleType = iv::SHENLAN_CANFD;
+    }
 
 //iv::gVehicleType = iv::MIDBUS;
 

+ 1 - 1
src/driver/driver_can_nvidia_agx/basecan.h

@@ -13,7 +13,7 @@ class basecan_msg
     bool isExtern;
     bool isRemote;
     unsigned char nLen;
-    unsigned char data[8];
+    unsigned char data[64];
 };
 
 class basecan : public QThread

+ 2 - 2
src/driver/driver_can_nvidia_agx/canctrl.cpp

@@ -194,7 +194,7 @@ void canctrl::sendmsg(int index, iv::can::canmsg xmsg)
         sendmsg.isRemote = x.bremote();
         int nlen = x.len();
 
-        if((nlen < 0) || (nlen > 8))
+        if((nlen < 0) || (nlen > 64))
         {
             nlen = 0;
             mpcan->mivlog->warn("sendmsg nlen err");
@@ -223,7 +223,7 @@ void canctrl::sharecanmsg(void *xpa, basecan_msg * pxmsg,int ncount,int nch)
     {
         iv::can::canraw * praw = xmsg.add_rawmsg();
         praw->set_id(pxmsg[i].id);
-        praw->set_data(pxmsg[i].data,8);
+        if(pxmsg[i].nLen>0) praw->set_data(pxmsg[i].data,pxmsg[i].nLen);
         praw->set_bext(pxmsg[i].isExtern);
         praw->set_bremote(pxmsg[i].isRemote);
         praw->set_rectime(QDateTime::currentMSecsSinceEpoch());

+ 10 - 2
src/driver/driver_can_nvidia_agx/nvcan.cpp

@@ -205,7 +205,7 @@ void nvcan::run()
                 if((frame.can_id&0x40000000)!= 0)msg.isRemote = true;
                 else msg.isRemote = false;
                 msg.nLen = frame.len;
-                if((frame.len<9)&&(frame.len>0))memcpy(msg.data,frame.data,frame.len);
+                if((frame.len<64)&&(frame.len>0))memcpy(msg.data,frame.data,frame.len);
                 if(mMsgRecvBuf[i].size()<BUF_SIZE)
                 {
                     mMsgRecvBuf[i].push_back(msg);
@@ -235,6 +235,7 @@ void nvcan::run()
 
         struct canfd_frame framesend[2500];
 
+
         for(int nch =0;nch<currmax;nch++)
         {
             int nsend = 0;
@@ -266,11 +267,18 @@ void nvcan::run()
             if(nsend > 0)
             {
                 for(i=0;i<nsend;i++)
-                if (write(s[nch], &framesend[i],16) != 16) {
+                {
+                    int nsendbyte = 16;
+                    if(framesend[i].len>8)
+                    {
+                        nsendbyte = CANFD_MTU;
+                    }
+                if (write(s[nch], &framesend[i],nsendbyte) != nsendbyte) {
                     mivlog->error("write error 1");
                     perror("write error 1.");
                     continue;
                 }
+                }
             }
 
         }