Browse Source

fix(driver_KS136):pass the test

孙嘉城 3 years ago
parent
commit
9c8e8b68ad

+ 2 - 0
src/driver/driver_ultrasonic_dauxi_KS136A/can_producer_consumer.cpp

@@ -91,6 +91,8 @@ iv::can::canraw CAN_Producer_Consumer::Consume_Element(int timeout)
         consumerLock.unlock();
         freeSpace.release();
     }
+    else
+        xraw.Clear();
 
     return xraw;
 }

+ 7 - 5
src/driver/driver_ultrasonic_dauxi_KS136A/canrecv_consumer.cpp

@@ -53,7 +53,7 @@ void CANRecv_Consumer::run()
 
     while (!QThread::isInterruptionRequested())
     {
-        tempCANRaw.CopyFrom(pBuffer->Consume_Element(1));
+        tempCANRaw.CopyFrom(pBuffer->Consume_Element(1)); // tempCANRaw is unnecessary to clear, Consume_Element may return an empty data
         if(decodeEnableFlag == true)
         {
             if(decodeTimer.elapsed() >= 50)
@@ -101,11 +101,11 @@ void CANRecv_Consumer::run()
             }
             else
             {
-                this->Trans_From_CANRaw(tempCANRaw);
-                if(CAN_ID == setupConfig.sonarCAN_ID && CAN_DLC == 2)
+                if(tempCANRaw.id() == setupConfig.sonarCAN_ID && tempCANRaw.len() == 2)
                 {
+                    this->Trans_From_CANRaw(tempCANRaw);
                     tempDist = (CAN_data[0] << 8) | CAN_data[1];
-                    if(tempDist <= 5720 && tempDist >= 200)
+                    if(tempDist <= 5800 && tempDist >= 135)
                     {
                         decodeEnableFlag = false;
                         objDist[decodeSensorID] = tempDist;
@@ -146,7 +146,7 @@ void CANRecv_Consumer::run()
                             emit Enable_Ask(true,tempSensorID,1);
                         else
                             emit Enable_Ask(true,tempSensorID,0);
-                        std::cout<<"finish decode result:"<<QDateTime::currentMSecsSinceEpoch()<<std::endl;
+//                        std::cout<<"finish decode sensor "<<(int)decodeSensorID<<" result:"<<QDateTime::currentMSecsSinceEpoch()<<std::endl;
                         decodeTimer.restart();
                     }
                 }
@@ -159,6 +159,8 @@ void CANRecv_Consumer::Enable_DecodeResult_Slot(bool enableFlag,uint8_t sensorID
 {
     decodeEnableFlag = enableFlag;
     decodeSensorID = sensorID;
+    if(decodeSensorID == 0)
+        gLastTime = QDateTime::currentMSecsSinceEpoch();
     decodeTimer.restart();
 }
 

+ 0 - 43
src/driver/driver_ultrasonic_dauxi_KS136A/canrecv_producer.cpp

@@ -1,43 +0,0 @@
-#include "canrecv_producer.h"
-
-#include <thread>
-
-#include <iostream>
-#include <string>
-//#include <stdlib.h>
-#include <unistd.h>
-
-#include <net/if.h>
-//#include <sys/ioctl.h>
-#include <sys/socket.h>
-
-#include <linux/can.h>
-#include <linux/can/raw.h>
-
-CANRecv_Producer::CANRecv_Producer(CAN_Producer_Consumer *pBuf)
-{
-    pBuffer = pBuf;
-}
-
-CANRecv_Producer::~CANRecv_Producer()
-{
-    requestInterruption();
-    while(this->isFinished() == false);
-    close(s);
-}
-
-void CANRecv_Producer::run()
-{
-    iv::can::canraw xraw;
-
-    if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
-    {
-        perror("socket");
-    }
-
-    while (!QThread::isInterruptionRequested())
-    {
-        std::cout<<"send consumer time :"<<std::endl;
-        sleep(1);
-    }
-}

+ 0 - 37
src/driver/driver_ultrasonic_dauxi_KS136A/canrecv_producer.h

@@ -1,37 +0,0 @@
-#ifndef CANRECV_PRODUCER_H
-#define CANRECV_PRODUCER_H
-
-#include <QObject>
-#include <QTimer>
-#include <QDateTime>
-#include <QThread>
-
-#include "modulecomm.h"
-
-#include "can_producer_consumer.h"
-#include "decode_cfg.h"
-#include "iv_msgunit.h"
-
-class CANRecv_Producer : public QThread
-{
-    Q_OBJECT
-public:
-    CANRecv_Producer(CAN_Producer_Consumer *pBuf);
-    ~CANRecv_Producer();
-
-protected:
-    void run();
-
-private:
-    CAN_Producer_Consumer *pBuffer;
-
-    uint32_t CAN_ID = 0x000u;
-    uint8_t CAN_IDE = 0;
-    uint8_t CAN_RTR = 0;
-    uint8_t CAN_DLC = 0;
-    uint8_t CAN_data[8] = {0};
-
-    int s; /* can raw socket */
-};
-
-#endif // CANRECV_PRODUCER_H

+ 45 - 40
src/driver/driver_ultrasonic_dauxi_KS136A/cansend_consumer.cpp

@@ -14,6 +14,8 @@
 #include <linux/can.h>
 #include <linux/can/raw.h>
 
+#define USE_SHM_SEND_CAN
+
 extern setupConfig_t setupConfig;
 extern iv::msgunit shmCANSend;
 
@@ -29,47 +31,48 @@ CANSend_Consumer::~CANSend_Consumer()
     close(s);
 }
 
-//void CANSend_Consumer::run()
-//{
-//    uint64_t CANPackageIndex = 0;
-//    uint8_t CANPackageChannel;
-//    iv::can::canmsg xmsg;
-
-//    if(setupConfig.strMemCANSend == "cansend0")
-//        CANPackageChannel = 0;
-//    else
-//        CANPackageChannel = 1;
-
-//    while (!QThread::isInterruptionRequested())
-//    {
-//        pBuffer->Consume_Element_To_CANMsg(xmsg);
-//        if(xmsg.rawmsg_size()>0)
-//        {
-//            //pack
-//            xmsg.set_index(CANPackageIndex);
-//            xmsg.set_channel(CANPackageChannel);
-//            xmsg.set_mstime(QDateTime::currentMSecsSinceEpoch());
-//            //send
-//            int ndatasize = xmsg.ByteSize();
-//            char * strser = new char[ndatasize];
-//            std::shared_ptr<char> pstrser;
-//            pstrser.reset(strser);
-//            if(xmsg.SerializePartialToArray(strser,ndatasize))
-//            {
-//                iv::modulecomm::ModuleSendMsg(shmCANSend.mpa,strser,ndatasize);
-//            }
-//            else
-//            {
-//                std::cout<<"CANSend_Consumer serialize error."<<std::endl;
-//            }
-//            //clear and update index
-//            xmsg.clear_rawmsg();
-//            CANPackageIndex++;
-//            std::cout<<"send consumer time :"<<(QDateTime::currentMSecsSinceEpoch() - gTime_ms)<<std::endl;
-//        }
-//    }
-//}
+#ifdef USE_SHM_SEND_CAN
+void CANSend_Consumer::run()
+{
+    uint64_t CANPackageIndex = 0;
+    uint8_t CANPackageChannel;
+    iv::can::canmsg xmsg;
+
+    if(setupConfig.strMemCANSend == "cansend0")
+        CANPackageChannel = 0;
+    else
+        CANPackageChannel = 1;
 
+    while (!QThread::isInterruptionRequested())
+    {
+        pBuffer->Consume_Element_To_CANMsg(xmsg);
+        if(xmsg.rawmsg_size()>0)
+        {
+            //pack
+            xmsg.set_index(CANPackageIndex);
+            xmsg.set_channel(CANPackageChannel);
+            xmsg.set_mstime(QDateTime::currentMSecsSinceEpoch());
+            //send
+            int ndatasize = xmsg.ByteSize();
+            char * strser = new char[ndatasize];
+            std::shared_ptr<char> pstrser;
+            pstrser.reset(strser);
+            if(xmsg.SerializePartialToArray(strser,ndatasize))
+            {
+                iv::modulecomm::ModuleSendMsg(shmCANSend.mpa,strser,ndatasize);
+            }
+            else
+            {
+                std::cout<<"CANSend_Consumer serialize error."<<std::endl;
+            }
+            //clear and update index
+            xmsg.clear_rawmsg();
+            CANPackageIndex++;
+//            std::cout<<"send a msg:"<<QDateTime::currentMSecsSinceEpoch()<<std::endl;
+        }
+    }
+}
+#else
 void CANSend_Consumer::run()
 {
     iv::can::canraw xraw;
@@ -123,5 +126,7 @@ void CANSend_Consumer::run()
         {
             perror("write");
         }
+//        std::cout<<"send a msg:"<<(int)frame.data[2]<<" time:"<<QDateTime::currentMSecsSinceEpoch()<<std::endl;
     }
 }
+#endif

+ 0 - 2
src/driver/driver_ultrasonic_dauxi_KS136A/driver_ultrasonic_dauxi_KS136A.pro

@@ -23,7 +23,6 @@ SOURCES += \
         ../../include/msgtype/ultrasonic.pb.cc \
         can_producer_consumer.cpp \
         canrecv_consumer.cpp \
-        canrecv_producer.cpp \
         cansend_consumer.cpp \
         cansend_producer.cpp \
         decode_cfg.cpp \
@@ -35,7 +34,6 @@ HEADERS += \
     ../../include/msgtype/ultrasonic.pb.h \
     can_producer_consumer.h \
     canrecv_consumer.h \
-    canrecv_producer.h \
     cansend_consumer.h \
     cansend_producer.h \
     decode_cfg.h \

+ 13 - 10
src/driver/driver_ultrasonic_dauxi_KS136A/main.cpp

@@ -41,8 +41,6 @@ CANSend_Producer* can_send_producer;
 CANSend_Consumer* can_send_consumer;
 CANRecv_Consumer* can_recv_consumer;
 
-uint64_t gTime_ms = QDateTime::currentMSecsSinceEpoch();
-
 void ListenCANMsg(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
 {
     if(nSize<1)
@@ -58,12 +56,14 @@ void ListenCANMsg(const char * strdata,const unsigned int nSize,const unsigned i
         std::cout<<"radar ListenCANMsg parse fail."<<std::endl;
         return;
     }
-
     CANRecv.Produce_Elements_From_CANMsg(xmsg);
-    if(xmsg.rawmsg(0).len() == 2)
-    {
-        std::cout<<"recieve a msg:"<<QDateTime::currentMSecsSinceEpoch()<<std::endl;
-    }
+//    for(int i=0;i<xmsg.rawmsg_size();i++)
+//    {
+//        if(xmsg.rawmsg(i).id() == setupConfig.sonarCAN_ID && xmsg.rawmsg(i).len() == 2)
+//        {
+//            std::cout<<"recieve a sonar msg:"<<QDateTime::currentMSecsSinceEpoch()<<std::endl;
+//        }
+//    }
 }
 
 void ExitFunc()
@@ -116,17 +116,20 @@ int main(int argc, char *argv[])
     shmCANRecv.mnBufferCount = 3;
     shmCANRecv.mpa = iv::modulecomm::RegisterRecv(shmCANRecv.mstrmsgname,ListenCANMsg);
 
-    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
+    std::this_thread::sleep_for(std::chrono::milliseconds(250));
 
     can_send_consumer = new CANSend_Consumer(&CANSend);
     can_send_consumer->start();
-    can_send_producer = new CANSend_Producer(&CANSend);
+    std::this_thread::sleep_for(std::chrono::milliseconds(100));
     can_recv_consumer = new CANRecv_Consumer(&CANRecv);
+    can_send_producer = new CANSend_Producer(&CANSend);
     qRegisterMetaType<uint8_t>("uint8_t");
     QObject::connect(can_send_producer,&CANSend_Producer::Enable_DecodeResult,can_recv_consumer,&CANRecv_Consumer::Enable_DecodeResult_Slot);
     QObject::connect(can_recv_consumer,&CANRecv_Consumer::Enable_Ask,can_send_producer,&CANSend_Producer::Enable_Ask_Slot);
-    can_send_producer->start();
     can_recv_consumer->start();
+    std::this_thread::sleep_for(std::chrono::milliseconds(100));
+    can_send_producer->start();
+
 
     int rtn = a.exec();