瀏覽代碼

add process gpsimu/chassis

jiaolili 3 年之前
父節點
當前提交
3d89bd123b

+ 197 - 30
src/v2x/CommunicatePlatform/mainwindow.cpp

@@ -1,10 +1,11 @@
 #include "mainwindow.h"
 #include "ui_mainwindow.h"
-
+#include <QtMath>
 MainWindow::MainWindow(QWidget *parent) :
     QMainWindow(parent),
     ui(new Ui::MainWindow)
 {
+    initMemory();
     m_tbox=new Tbox();
     initTboxMemory();
     m_radio=new Radio();
@@ -12,6 +13,7 @@ MainWindow::MainWindow(QWidget *parent) :
     initUi();
     //enableTbox();
     initRadio();
+    initRadioMemory();
     //20211009,jiaolili
     mivlog = new iv::Ivlog("v2x");
     //ShareMem: gps
@@ -21,7 +23,11 @@ MainWindow::MainWindow(QWidget *parent) :
     //ShareMem: ui
     ModuleFun funUI =std::bind(&MainWindow::UpdateUI,this,std::placeholders::_1, \
                                    std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5);
-    mpMemUI = iv::modulecomm::RegisterRecvPlus("hcp2_gpsimu",funUI);
+    mpMemUI = iv::modulecomm::RegisterRecvPlus("hcp2_hmi",funUI);
+    //ShareMem: control
+    ModuleFun funControl =std::bind(&MainWindow::UpdateControl,this,std::placeholders::_1, \
+                                   std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5);
+    mpMemControl = iv::modulecomm::RegisterRecvPlus("hcp2_chassis",funControl);
 }
 
 MainWindow::~MainWindow()
@@ -89,14 +95,43 @@ void MainWindow::disableTbox()
 }
 void MainWindow::initTboxMemory()
 {
-    m_structM.gps_lng=137.0;
-    m_structM.gps_lat=39.0;
-    m_structM.speed=20.0;
-    m_structM.yaw=12.0;
-    m_structM.ele_voltage=90.0;
-    m_structM.error=0x02;
-    m_tbox->setTboxMemmory(m_structM);
-    m_tbox->setTboxConnectEnable(false);
+    setTboxMemoryRaw();
+}
+void MainWindow::setTboxMemoryRaw()
+{
+    Memory tboxM;
+    tboxM.gps_lng=m_structMGpsImu.gps_lng;
+    tboxM.gps_lat=m_structMGpsImu.gps_lat;
+    tboxM.speed=m_structMGpsImu.speed;
+    tboxM.yaw=m_structMGpsImu.yaw;
+    tboxM.ele_voltage=m_structChassisRaw.soc;
+    tboxM.error=getError();
+    m_tbox->setTboxMemmory(tboxM);
+}
+
+void MainWindow::initRadioMemory()
+{
+    m_radio->setGpsImuMemory(m_structMGpsImu);
+    setRadioControlMemory();
+}
+
+void MainWindow::initMemory()
+{
+    m_structChassisRaw.soc=90.0;
+    m_structChassisRaw.battery_error=false;
+    m_structChassisRaw.driver_error=false;
+    m_structChassisRaw.fsteer_code_error=false;
+    m_structChassisRaw.remote_error=false;
+    m_structChassisRaw.rlmotor_error=false;
+    m_structChassisRaw.rrmotor_error=false;
+    m_structChassisRaw.steer_motor_error=false;
+    m_structChassisRaw.swj_error=false;
+    m_structMGpsImu.gps_lat=39.0;
+    m_structMGpsImu.gps_lng=137.0;
+    m_structMGpsImu.speed=20.0;
+    m_structMGpsImu.yaw=12.0;
+    m_structMGpsImu.accx=0.0;
+    m_structMGpsImu.accy=0.0;
 }
 
 void MainWindow::on_pushButton_connect_clicked()
@@ -218,6 +253,7 @@ void MainWindow::on_pushButton_radioConnect_clicked()
 void MainWindow::UpdateGPSIMU(const char * strdata,const unsigned int nSize,const unsigned int index,\
                               const QDateTime * dt,const char * strmemname)
 {
+    bool isSend=false;
     double accX,accY,lat,lon,heading,rtk,ins,vd,ve,vn;
     iv::gps::gpsimu  xgpsimu;
     if(!xgpsimu.ParseFromArray(strdata,nSize))
@@ -225,28 +261,36 @@ void MainWindow::UpdateGPSIMU(const char * strdata,const unsigned int nSize,cons
         mivlog->warn("ADCIntelligentVehicle::UpdateGPSIMU parse error. nSize is %d",nSize);
         return;
     }
-
-    lat = xgpsimu.lat();
-    lon = xgpsimu.lon();
-    heading = xgpsimu.heading();
-
-    rtk = xgpsimu.rtk_state();
-    ins = xgpsimu.ins_state();
-    vd = xgpsimu.vd();    //地向速度,单位(米/秒)
-    ve = xgpsimu.ve();    //东向速度,单位(米/秒)
-    vn = xgpsimu.vn();    //北向速度,单位(米/秒)
-    if(xgpsimu.has_acce_x())
-    {
-        accX = xgpsimu.acce_x();
+    if(xgpsimu.has_lat()) {
+        isSend=true;
+        m_structMGpsImu.gps_lat=xgpsimu.lat();
     }
-    if(xgpsimu.has_acce_y())
-    {
-        accY = xgpsimu.acce_y();
+    if(xgpsimu.has_lon()) {
+        isSend=true;
+        m_structMGpsImu.gps_lng=xgpsimu.lon();
+    }
+    if(xgpsimu.has_heading()) {
+        isSend=true;
+        m_structMGpsImu.yaw=float(xgpsimu.heading());
+    }
+    if((xgpsimu.has_ve())&&(xgpsimu.has_vn())) {
+        isSend = true;
+        ve = xgpsimu.ve();    //东向速度,单位(米/秒)
+        vn = xgpsimu.vn();    //北向速度,单位(米/秒)
+        m_structMGpsImu.speed=float(sqrt(ve*ve+vn*vn))* 3.6;
+    }
+    if(xgpsimu.has_acce_x()) {
+        isSend=true;
+        m_structMGpsImu.accx=float(xgpsimu.acce_x());
+    }
+    if(xgpsimu.has_acce_y()) {
+        isSend=true;
+        m_structMGpsImu.accy = float(xgpsimu.acce_y());
+    }
+    if(isSend) {
+        setTboxMemoryRaw();
+        m_radio->setGpsImuMemory(m_structMGpsImu);
     }
-//     mfAcc = (float)sqrt(pow(accX,2)+pow(accY,2));
-
- //   mfspeed = sqrt(pow(data->vel_E,2)+pow(data->vel_N,2)) * 3.6;  //double pow(double x, double y) 返回 x 的 y 次幂,即 xy。
-    //mistGPS = 0;
 }
 //UI DATA
 void MainWindow::UpdateUI(const char * strdata,const unsigned int nSize,const unsigned int index,\
@@ -340,3 +384,126 @@ void MainWindow::UpdateUI(const char * strdata,const unsigned int nSize,const un
 
 
 }
+
+void MainWindow::UpdateControl(const char *strdata, const unsigned int nSize, const unsigned int index, const QDateTime *dt, const char *strmemname)
+{
+    iv::chassis xcontrol;
+    if(!xcontrol.ParseFromArray(strdata,nSize))
+    {
+        mivlog->warn("ADCIntelligentVehicle::UpdateGPSIMU parse error. nSize is %d",nSize);
+        return;
+    }
+    bool isSend=false;
+
+    if(xcontrol.has_soc()) {
+        isSend=true;
+        float soc = xcontrol.soc();
+        m_structChassisRaw.soc=soc;
+        ui->textEdit->append(QString("Memory control get soc: %1\n").arg(soc));
+    }
+    if(xcontrol.has_driver_error()) {
+        isSend=true;
+        bool error=xcontrol.driver_error();
+        m_structChassisRaw.driver_error=error;
+        if(error) {
+            ui->textEdit->append("Memory control get driver_error true!\n");
+        } else {
+            ui->textEdit->append("Memory control get driver_error false!\n");
+        }
+    }
+    if(xcontrol.has_swj_error()) {
+        isSend=true;
+        bool error = xcontrol.swj_error();
+        m_structChassisRaw.swj_error=error;
+        if(error) {
+            ui->textEdit->append("Memory control get swj_error true!\n");
+        } else {
+            ui->textEdit->append("Memory control get swj_error false!\n");
+        }
+    }
+    if(xcontrol.has_battery_error()) {
+        isSend=true;
+        bool error=xcontrol.battery_error();
+        m_structChassisRaw.battery_error=error;
+        if(error) {
+            ui->textEdit->append("Memory control get battery_error true!\n");
+        } else {
+            ui->textEdit->append("Memory control get battery_error false!\n");
+        }
+    }
+    if(xcontrol.has_remote_error()) {
+        isSend=true;
+        bool error = xcontrol.remote_error();
+        m_structChassisRaw.remote_error=error;
+        if(error) {
+            ui->textEdit->append("Memory control get remote_error true!\n");
+        } else {
+            ui->textEdit->append("Memory control get remote_error false!\n");
+        }
+    }
+    if(xcontrol.has_steer_motor_error()) {
+        isSend  = true;
+        bool error= xcontrol.steer_motor_error();
+        m_structChassisRaw.steer_motor_error=error;
+        if(error) {
+            ui->textEdit->append("Memory control get steer_motor_error true!\n");
+        } else {
+            ui->textEdit->append("Memory control get steer_motor_error false!\n");
+        }
+    }
+    if(xcontrol.has_rrmotor_error()) {
+        isSend = true;
+        bool error=xcontrol.rrmotor_error();
+        m_structChassisRaw.rrmotor_error=error;
+        if(error) {
+            ui->textEdit->append("Memory control get rrmotor_error true!\n");
+        } else {
+            ui->textEdit->append("Memory control get rrmotor_error false!\n");
+        }
+    }
+    if(xcontrol.has_rlmotor_error()) {
+        isSend=true;
+        bool error = xcontrol.rlmotor_error();
+        m_structChassisRaw.rlmotor_error=error;
+        if(error) {
+            ui->textEdit->append("Memory control get rlmotor_error true!\n");
+        } else {
+            ui->textEdit->append("Memory control get rlmotor_error false!\n");
+        }
+
+    }
+    if(xcontrol.has_fsteer_code_error()) {
+        isSend  = true;
+        bool error=xcontrol.fsteer_code_error();
+        m_structChassisRaw.fsteer_code_error=error;
+        if(error) {
+            ui->textEdit->append("Memory control get fsteer_error true!\n");
+        } else {
+            ui->textEdit->append("Memory control get fsteer_error false!\n");
+        }
+    }
+    if(isSend) {
+        setRadioControlMemory();
+        setTboxMemoryRaw();
+    }
+
+}
+void MainWindow::setRadioControlMemory()
+{
+    controlM mcontrol;
+    mcontrol.eleVoltage=m_structChassisRaw.soc;
+    mcontrol.error=getError();
+    m_radio->setControlMemory(mcontrol);
+}
+unsigned char MainWindow::getError()
+{
+    bool error=(m_structChassisRaw.battery_error|m_structChassisRaw.driver_error|
+                    m_structChassisRaw.fsteer_code_error|m_structChassisRaw.remote_error|
+                    m_structChassisRaw.rlmotor_error|m_structChassisRaw.rrmotor_error|
+                    m_structChassisRaw.steer_motor_error|m_structChassisRaw.swj_error);
+    if(error) {
+        return 0x01;
+    } else {
+        return 0x02;
+    }
+}

+ 24 - 1
src/v2x/CommunicatePlatform/mainwindow.h

@@ -3,6 +3,18 @@
 #include "tbox.h"
 #include <QMainWindow>
 #include "radio.h"
+struct chassisRaw
+{
+    float soc;
+    bool driver_error;
+    bool swj_error;
+    bool battery_error;
+    bool remote_error;
+    bool steer_motor_error;
+    bool rrmotor_error;
+    bool rlmotor_error;
+    bool fsteer_code_error;
+};
 namespace Ui {
 class MainWindow;
 }
@@ -19,26 +31,37 @@ private:
     Ui::MainWindow *ui;
     Tbox *m_tbox;
     Radio *m_radio;
-    Memory m_structM;
+
     std::vector<int> m_vectorRandom;
     std::vector<std::string> m_vectorVin;
     //20211009,jiaolili
     void * mpMemGps;
     void * mpMemUI;
+    void * mpMemControl;
     iv::Ivlog *mivlog;
+
+    gpsImuM m_structMGpsImu;
+    chassisRaw m_structChassisRaw;
     ///////////////////////////////
 public:
     void initTboxMemory();
+    void initRadioMemory();
+    void setRadioControlMemory();
+    void setTboxMemoryRaw();
+    void initMemory();
     void enableTbox();
     void disableTbox();
     void initUi();
     void initRadio();
     void getRandomNum();
     void setEnRadio(bool en);
+    unsigned char getError();
     void UpdateGPSIMU(const char * strdata,const unsigned int nSize,const unsigned int index,\
                                   const QDateTime * dt,const char * strmemname);
     void UpdateUI(const char * strdata,const unsigned int nSize,const unsigned int index,\
                                   const QDateTime * dt,const char * strmemname);
+    void UpdateControl(const char * strdata,const unsigned int nSize,const unsigned int index,\
+                                  const QDateTime * dt,const char * strmemname);
 private slots:
     void on_pushButton_connect_clicked();
     void on_pushButton_vinChange_clicked(); 

+ 10 - 0
src/v2x/CommunicatePlatform/radio.cpp

@@ -81,6 +81,16 @@ void Radio::sendProto(iv::v2r::v2r_send radio_protobuf_send)
     }
     delete strser;
 }
+
+void Radio::setControlMemory(controlM m)
+{
+    m_structMControl=m;
+}
+
+void Radio::setGpsImuMemory(gpsImuM m)
+{
+    m_structMGpsImu=m;
+}
 void Radio::outRealtimeTraffic(realtimeTrafficMessage realtimeTraffic)
 {
     if(m_bEnTrafficBroadcast) {

+ 3 - 1
src/v2x/CommunicatePlatform/radio.h

@@ -41,7 +41,7 @@ struct gpsImuM
 };
 struct controlM
 {
-    float eleVoltage;//100%=1.00
+    float eleVoltage;//100%=100.0
     unsigned char error;//0x01 error 0x02 normal
 };
 struct realtimeTrafficMessage
@@ -152,6 +152,8 @@ public:
     void outCongestionIdenti(congestionIdentificationMessage congestionIdenti);
     void setEnConnect(bool en);
     void sendProto(iv::v2r::v2r_send radio_protobuf_send);
+    void setControlMemory(controlM m);
+    void setGpsImuMemory(gpsImuM m);
 private:
     QSerialPort *m_serialPort_Radio;
     bool m_bSerialOpen;

+ 1 - 1
src/v2x/CommunicatePlatform/tbox.h

@@ -40,7 +40,7 @@ struct Memory
     float speed;
     float yaw;
     float ele_voltage;
-    unsigned char error;
+    unsigned char error;//车辆故障状态 0x01:存在故障;0x02:不存在故障;“0xFE”表示异常,“0xFF”表示无效
 };
 class Tbox:public QObject
 {