Browse Source

view_ultrasonicradar tool

lijinliang 3 years ago
parent
commit
0459c020de

BIN
src/tool/view_ultrasonicradar/car.png


+ 11 - 0
src/tool/view_ultrasonicradar/main.cpp

@@ -0,0 +1,11 @@
+#include "mainwindow.h"
+#include <QApplication>
+
+int main(int argc, char *argv[])
+{
+    QApplication a(argc, argv);
+    MainWindow w;
+    w.show();
+
+    return a.exec();
+}

+ 128 - 0
src/tool/view_ultrasonicradar/mainwindow.cpp

@@ -0,0 +1,128 @@
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+#include "QResizeEvent"
+#include "iostream"
+
+#include "modulecomm.h"
+MainWindow * gw;
+
+void ListenRadar(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
+{//监听
+
+    //qDebug("Listen!");
+    if(nSize<1)return;
+    iv::ultrasonic::ultrasonic uobj;
+    if(false == uobj.ParseFromArray(strdata,nSize))
+    {
+        std::cout<<"Listenen UltrasonicRadar fail."<<std::endl;
+        return;
+    }
+    //gw->myobj.CopyFrom(uobj);
+    gw->SetRadar(uobj);
+}
+
+void MainWindow::SetRadar(iv::ultrasonic::ultrasonic obj){
+    rmutex.lock();
+    this->myobj.CopyFrom(obj);
+    this->radarview->SetRadar(myobj);
+    rmutex.unlock();
+}
+
+
+/**/
+
+MainWindow::MainWindow(QWidget *parent) :
+    QMainWindow(parent),
+    ui(new Ui::MainWindow)
+{
+    gw=this;
+    ui->setupUi(this);
+
+    qDebug("REGISTER"); //register//重要!
+    mpura = iv::modulecomm::RegisterRecv("ultra",ListenRadar);
+
+    radarview = new RadarView();
+    radarview->start();//现在的它不是线程
+
+    this->CreatView();
+
+    QTimer * xTimer = new QTimer(this);
+    connect(xTimer,SIGNAL(timeout()),this,SLOT(onTimer()));
+    xTimer->start(10);//刷新
+}
+
+MainWindow::~MainWindow()
+{
+    delete ui;
+
+}
+
+void MainWindow::resizeEvent(QResizeEvent *)
+{
+    //qDebug("resize");
+    QSize mainsize = ui->centralWidget->size();
+    this->AdjustPos(mainsize.width(), mainsize.height());
+}
+
+void MainWindow::AdjustPos(int w, int h){
+    //qDebug("resize");
+    int gap = 20;
+    int width = (w - infoview->width - gap)/2;
+    if(width < 0)width = 20;
+    int hgt = (h-20)/2;
+    this->myview->setGeometry(10,10,width*2,hgt*2 );
+    this->infoview->setGeometry(myview->width()+gap,30,
+                    myview->width()+infoview->width+gap, 30+infoview->height);
+
+}
+
+void MainWindow::CreatView(){
+    myview = new MyView(ui->centralWidget);
+    myview->setObjectName(QStringLiteral("graphicsView"));
+    myview->setGeometry(QRect(30, 30, 600, 600));
+    myview->setCacheMode(myview->CacheBackground);
+    scene = new QGraphicsScene;
+    myview->setScene(scene);
+    this->CreateRightView();
+}
+
+
+void MainWindow::CreateRightView(){
+    this->infoview = new RadarInfoView();
+    infoview->setParent(this);
+    infoview->show();
+}
+
+
+void MainWindow::paintEvent(QPaintEvent * e)
+{
+    //qDebug("updated");//update更新的范围
+    this->radarview->start();
+    QImage image = radarview->GetImage();
+    scene->clear();
+    scene->addPixmap(QPixmap::fromImage(image));
+    myview->setScene(scene);
+    myview->show();
+    for(int i = 0; i < NUM_OF_DIRECTIONS; i++){
+        infoview->SetDist(i,radarview->distance[i]);
+    }
+
+}
+
+void MainWindow::onTimer()
+{
+    update();
+}
+
+/*
+         2  3   4  5
+        /o--o---o--o\
+        |			|
+     1 o|			|o 6
+        |			|
+        |			|
+     7 o|			|o 12
+        |			|
+        \o--o---o--o/
+        8	9  10  11
+ */

+ 44 - 0
src/tool/view_ultrasonicradar/mainwindow.h

@@ -0,0 +1,44 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+#include "radarview.h"
+#include "myview.h"
+#include "QGraphicsScene"
+#include "radarinfoview.h"
+
+namespace Ui {
+class MainWindow;
+}
+
+class MainWindow : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    explicit MainWindow(QWidget *parent = nullptr);
+    ~MainWindow();
+    virtual void resizeEvent(QResizeEvent*);
+private:
+    void CreatView();
+    void CreateRightView();
+private slots:
+    void paintEvent(QPaintEvent*);
+    void onTimer();
+private:
+    void AdjustPos(int, int);
+    RadarInfoView *infoview;
+    MyView *myview;
+    RadarView *radarview;
+    QGraphicsScene *scene;
+    void *mpura;//For registering connection
+    QMutex rmutex;
+
+public:
+    void SetRadar(iv::ultrasonic::ultrasonic);
+    iv::ultrasonic::ultrasonic myobj;
+private:
+    Ui::MainWindow *ui;
+};
+
+#endif // MAINWINDOW_H

+ 40 - 0
src/tool/view_ultrasonicradar/mainwindow.ui

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>403</width>
+    <height>331</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralWidget"/>
+  <widget class="QMenuBar" name="menuBar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>403</width>
+     <height>22</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QToolBar" name="mainToolBar">
+   <attribute name="toolBarArea">
+    <enum>TopToolBarArea</enum>
+   </attribute>
+   <attribute name="toolBarBreak">
+    <bool>false</bool>
+   </attribute>
+  </widget>
+  <widget class="QStatusBar" name="statusBar"/>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>

+ 104 - 0
src/tool/view_ultrasonicradar/myview.cpp

@@ -0,0 +1,104 @@
+#include "myview.h"
+#include <QScrollBar>
+#include <iostream>
+#define VIEW_CENTER viewport()->rect().center()
+
+MyView::MyView(QWidget *parent) :
+     QGraphicsView(parent),
+    beishu(1.00000)
+{
+    setDragMode(QGraphicsView::ScrollHandDrag);
+    setMaximumSize(1000,1000);
+}
+
+void MyView::mousePressEvent(QMouseEvent *event)
+{
+//    qDebug("x is %d",event->pos().x());
+    bottonstatus = true;
+    QGraphicsView::mousePressEvent(event);
+}
+void MyView::mouseMoveEvent(QMouseEvent *event)
+{
+    QGraphicsView::mouseMoveEvent(event);
+//    QScrollBar * ps = verticalScrollBar();
+//    std::cout<<" size is "<<ps->size().height()<<" v = "<<ps->value()<<std::endl;
+//    QScrollBar * ps2= horizontalScrollBar();
+//     std::cout<<" size is "<<ps2->size().width()<<" h = "<<ps2->value()<<std::endl;
+}
+void MyView::mouseReleaseEvent(QMouseEvent *event)
+{
+    bottonstatus = false;
+    QGraphicsView::mouseReleaseEvent(event);
+}
+
+// 放大/缩小
+void MyView::wheelEvent(QWheelEvent *event)
+{
+    // 滚轮的滚动量
+    QPoint scrollAmount = event->angleDelta();
+    // 正值表示滚轮远离使用者(放大),负值表示朝向使用者(缩小)
+    scrollAmount.y() > 0 ? zoomIn() : zoomOut();
+}
+
+
+// 放大
+void MyView::zoomIn()
+{
+
+
+    int width,hgt;
+    width = sceneRect().width();
+    hgt = sceneRect().height();
+    QScrollBar * psV = verticalScrollBar();
+    QScrollBar * psH = horizontalScrollBar();
+
+
+    int centery = (psV->value() + psV->size().height()/2)/beishu;
+    int centerx = (psH->value() + psH->size().width()/2)/beishu;
+
+    scale(1.1, 1.1);
+    beishu *= 1.1;
+
+    centerOn(centerx,centery);
+
+}
+
+// 缩小
+void MyView::zoomOut()
+{
+    int width,hgt;
+    width = sceneRect().width();
+    hgt = sceneRect().height();
+    QScrollBar * psV = verticalScrollBar();
+    QScrollBar * psH = horizontalScrollBar();
+
+    int centery = (psV->value() + psV->size().height()/2)/beishu;
+    int centerx = (psH->value() + psH->size().width()/2)/beishu;
+
+    scale(1 / 1.1, 1 / 1.1);
+    beishu /= 1.1;
+
+    centerOn(centerx,centery);
+}
+
+void MyView::mouseDoubleClickEvent(QMouseEvent *event)
+{
+
+    QScrollBar * psV = verticalScrollBar();
+    QScrollBar * psH = horizontalScrollBar();
+
+    int centery = (psV->value() + psV->size().height()/2)/beishu;
+    int centerx = (psH->value() + psH->size().width()/2)/beishu;
+
+
+    int viewx,viewy;
+    if(beishu == 0)return;
+    viewx = centerx +(event->pos().x() - viewport()->rect().center().x())/beishu;
+    viewy = centery +(event->pos().y() - viewport()->rect().center().y())/beishu;
+
+    QPoint viewpoint;
+    viewpoint.setX(viewx);
+    viewpoint.setY(viewy);
+
+//    qDebug("view x is %d view y is %d ",viewx,viewy);
+}

+ 35 - 0
src/tool/view_ultrasonicradar/myview.h

@@ -0,0 +1,35 @@
+#ifndef MYVIEW_H
+#define MYVIEW_H
+
+#include <qtimer.h>
+#include <qpainter.h>
+#include <QGraphicsView>
+#include <QWheelEvent>
+#include <QKeyEvent>
+#include <QPoint>
+#include <QPointF>
+#include <QGraphicsItem>
+#include <QKeyEvent>
+
+class MyView : public QGraphicsView
+{
+    Q_OBJECT
+
+public:
+    explicit MyView(QWidget *parent =0);
+    qreal x, y, beishu;
+protected:
+    void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE;
+    void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+    void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+    void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+    void mouseDoubleClickEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+public Q_SLOTS:
+    void zoomIn();  // 放大
+    void zoomOut();  // 缩小
+private:
+    bool bottonstatus = false;
+    QPoint myview_lastMousePos;
+};
+
+#endif // MYVIEW_H

+ 50 - 0
src/tool/view_ultrasonicradar/radarinfoview.cpp

@@ -0,0 +1,50 @@
+#include "radarinfoview.h"
+#include "QFont"
+RadarInfoView::RadarInfoView()
+{
+    //qDebug("RADARINFO");
+    creat();
+}
+
+void RadarInfoView::creat(){
+    setFixedSize(width,height);
+    //setStyleSheet("background-color:Gray;");//标记一下位置
+
+    StateText.setParent(this);
+    StateText.setText("状态: ");
+    StateText.setFixedSize(width, label_hgt);
+    StateText.setContentsMargins(20,0,0,0);
+    QFont font ("Microsoft Yahei",18, 60);
+    StateText.setFont(font);
+    StateText.setGeometry(0,0,width,label_hgt);
+
+    for(int i = 0; i < NUM_OF_DIRECTIONS; i++){
+        //左边
+        Direc_label[i].setText(Direc[i]);
+        Direc_label[i].setParent(this);
+        Direc_label[i].setFixedSize(Direc_width,label_hgt);//间隔的一像素当分割线
+        Direc_label[i].setGeometry(0,(i+1)*(label_hgt+1),Direc_width,(i+1)+label_hgt);
+        Direc_label[i].setContentsMargins(10,0,0,0);
+        //Direc_label[i].setStyleSheet("background-color:Red;");//标记一下
+        //右边
+        Dists_label[i].setParent(this);
+        Dists_label[i].setText("无");
+        Dists_label[i].setFixedSize(Dists_width,label_hgt);
+        Dists_label[i].setGeometry(Direc_width,(i+1)*(label_hgt+1),
+                                   Direc_width,(i+1)*(label_hgt+1)+label_hgt);
+        //Dists_label[i].setStyleSheet("background-color:Yellow;");//同样标记一下
+        //undr
+        divider[i].setParent(this);
+        divider[i].setFixedSize(Direc_width+Dists_width,1);
+        divider[i].setGeometry(0,(i+1)*(label_hgt+1),Direc_width+Dists_width,(i+1)*(label_hgt+1)+1);
+        divider[i].setStyleSheet("background-color:Gray;");
+    }
+}
+
+void RadarInfoView::SetDist(int index,int newinfo){
+    if(newinfo>=MAX_DISTANCE||newinfo<0){
+        Dists_label[index].setText("无");
+    }else{
+        Dists_label[index].setText(QString::number(newinfo) + " cm");
+    }
+}

+ 32 - 0
src/tool/view_ultrasonicradar/radarinfoview.h

@@ -0,0 +1,32 @@
+#ifndef RADARINFOVIEW_H
+#define RADARINFOVIEW_H
+
+#include <QWidget>
+#include <QString>
+#include <QLabel>
+const static int NUM_OF_DIRECTIONS = 12;
+const static int MAX_DISTANCE = 255;//一个阀值,超过了就是没检测到
+class RadarInfoView:public QWidget
+{
+public:
+    RadarInfoView();
+    void SetDist(int,int);
+    const int width = 180; //Direc_width + Dists_width;
+    const int height = 40*13;//(label_hgt+1)*(NUM_OF_DIRECTIONS+1);
+    QString Direc[NUM_OF_DIRECTIONS]=
+    {"前左侧:","前左角:","前中左:","前中右:","前右角:","前右侧:",
+    "后左侧:","后左角:","后中左:","后中右:","后右角:","后右侧:"};//方位名
+
+private:
+    const int Direc_width = 80;
+    const int Dists_width = 100;
+    const int label_hgt = 39;
+    QLabel StateText;
+    void creat();
+ //    QString Dists[12];//距离->随时间变化的
+    QLabel Direc_label[NUM_OF_DIRECTIONS];
+    QLabel Dists_label[NUM_OF_DIRECTIONS];
+    QLabel divider[NUM_OF_DIRECTIONS];
+};
+
+#endif // RADARINFOVIEW_H

+ 135 - 0
src/tool/view_ultrasonicradar/radarview.cpp

@@ -0,0 +1,135 @@
+#include "radarview.h"
+#include "complex"
+
+#define VIEW_WIDTH 1000
+#define VIEW_HEIGHT 1000
+
+RadarView::RadarView()
+{
+    image = new QImage(VIEW_WIDTH, VIEW_HEIGHT, QImage::Format_RGB32);
+    mimagepaint = new QImage(VIEW_WIDTH, VIEW_HEIGHT, QImage::Format_RGB32);
+    painter = new QPainter(image);
+    painter->end();
+
+}
+
+void RadarView::start(){
+    this->run();
+}
+
+//该类不是QThread的子类
+void RadarView::run()
+{
+    this->paint();
+    mnReadIndex = mnWriteIndex;
+    mbImageUpdate = true;
+
+}
+
+void RadarView::paint(){
+
+    painter->begin(image);
+
+    image->fill(QColor(255, 255, 255));
+    painter->setRenderHint(QPainter::Antialiasing, true);//设置反锯齿模式
+    painter->translate(500,500);
+
+    painter->setPen(Qt::black);
+
+    painter->drawLine(-1000,0,1000,0);//横轴
+    painter->drawLine(5,-1000,5,1000);//竖轴
+
+//    int i;
+//    for(i=-9;i<=9;i++)
+//    {
+//        painter->drawLine(i*50,0,i*50,-5);
+//    }
+
+
+//    painter->rotate(90);
+//    for(i=-9;i<=9;i++)
+//    {
+//        painter->drawLine(i*50,0,i*50,-5);
+//    }
+//    //坐标轴用来定位
+
+//    painter->rotate(-90);//转回来
+    painter->save();
+    QImage car;
+    if(car.load(":/car.png")){
+        //qDebug("loaded pic");
+        painter->drawImage(-75,-140,car.scaled(160,300));
+    }else{
+        qDebug("Load car pic Error");
+    }
+    painter->restore();
+    painter->setPen(QPen(Qt::black,2));
+    painter->setBrush(Qt::red);
+    double x = cos(45);//帮忙定位四个角的
+
+    int xy[4][2]={{-1,-1},{1,-1},{-1,1},{1,1}};//左上、右上、左下、右下分别为负负、正负、负正、正正
+    int loc[3][4]={{3,4,9,10},{1,6,7,12},{2,5,8,11}};//分区,将12个点分成3个分区,每个分区有四个方位
+    //loc[0][*]为分区1的范围,loc[1][*]为分区2, loc[2][*]为分区3
+
+    //3 4 9 10  上下四个范围,分区1
+    for(int i = 0; i<4 ; i++){
+        painter->drawEllipse(20*xy[i][0],(170+distance[loc[0][i]-1])*xy[i][1],10,10);
+        painter->drawText(30*xy[i][0],(170+distance[loc[0][i]-1])*xy[i][1],DisString[loc[0][i]-1]);
+    }
+
+    //1 6 7 12  左右四个范围,分区2
+    for(int i = 0; i<4; i++){
+        painter->drawEllipse((100+distance[loc[1][i]-1])*xy[i][0],40*xy[i][1],10,10);
+        painter->drawText((100+distance[loc[1][i]-1])*xy[i][0],40*xy[i][1],DisString[loc[1][i]-1]);
+    }
+
+    //2 5 8 11  四个角,分区3
+    for(int i = 0; i<4; i++){
+        painter->drawEllipse((80+distance[loc[2][i]-1]*x)*xy[i][0],170*xy[i][1],10,10);
+        painter->drawText((80+distance[loc[2][i]-1]*x)*xy[i][0],170*xy[i][1],DisString[loc[2][i]-1]);
+    }
+
+    painter->end();
+
+    mMutexPaint.lock();
+    *mimagepaint = image->copy();
+    mMutexPaint.unlock();
+
+}
+
+QImage RadarView::GetImage(){
+    mMutexPaint.lock();
+    QImage imagertn = mimagepaint->copy();
+    mMutexPaint.unlock();
+    mbImageUpdate = false;
+    return imagertn;
+}
+
+//修改左边界面上显示的数值,右边栏的数值在radarinfoview.cpp修改
+void RadarView::SetRadar(iv::ultrasonic::ultrasonic myobj){
+    distance[0]=myobj.sigobjdist_flside();
+    distance[1]=myobj.sigobjdist_flcorner();
+    distance[2]=myobj.sigobjdist_flmiddle();
+    distance[3]=myobj.sigobjdist_frmiddle();
+    distance[4]=myobj.sigobjdist_frcorner();
+    distance[5]=myobj.sigobjdist_frside();
+    distance[6]=myobj.sigobjdist_rlside();
+    distance[7]=myobj.sigobjdist_rlcorner();
+    distance[8]=myobj.sigobjdist_rlmiddle();
+    distance[9]=myobj.sigobjdist_rrmiddle();
+    distance[10]=myobj.sigobjdist_rrcorner();
+    distance[11]=myobj.sigobjdist_rrside();
+    for(int i = 0; i < NUM_OF_DIRECTIONS; i++ ){
+        if(distance[i]<MAX_DISTANCE&&distance[i]>=0){
+            DisString[i]=QString::number(distance[i])+"cm";
+        }else{
+            distance[i]=-1;
+            DisString[i]="无";
+        }
+    }
+}
+
+
+
+
+

+ 40 - 0
src/tool/view_ultrasonicradar/radarview.h

@@ -0,0 +1,40 @@
+#ifndef RADARVIEW_H
+#define RADARVIEW_H
+#include "QImage"
+#include "QPainter"
+#include "QMutex"
+#include "QThread"
+#include "QPen"
+#include "radarinfoview.h"
+#include "../../include/msgtype/ultrasonic.pb.h"
+#include "../../include/msgtype/uradar.pb.h"
+
+class RadarView //:QThread
+{
+public:
+    RadarView();
+    QImage GetImage();
+    void start();
+    void SetRadar(iv::ultrasonic::ultrasonic);
+    int distance[12]={0};
+    QString DisString[12];
+private:
+    void run();
+
+    QImage *image;
+    QPainter *painter;
+    QTimer *timer;
+    bool mbImageUpdate = false;
+
+    QMutex mMutex;
+    QMutex mMutexPaint;
+
+    int mnWriteIndex = 0;
+    int mnReadIndex = 1;
+
+private:
+    void paint();
+    QImage * mimagepaint;
+};
+
+#endif // RADARVIEW_H

+ 6 - 0
src/tool/view_ultrasonicradar/res.qrc

@@ -0,0 +1,6 @@
+<RCC>
+    <qresource prefix="/">
+        <file>car.png</file>
+        <file>dir.png</file>
+    </qresource>
+</RCC>

+ 63 - 0
src/tool/view_ultrasonicradar/view_ultrasonicradar.pro

@@ -0,0 +1,63 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2021-05-19T15:47:48
+#
+#-------------------------------------------------
+
+QT       += core gui
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+TARGET = view_ultrasonicradar
+TEMPLATE = app
+
+# The following define makes your compiler emit warnings if you use
+# any feature of Qt which has been marked as deprecated (the exact warnings
+# depend on your compiler). Please consult the documentation of the
+# deprecated API in order to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+QMAKE_LFLAGS += -no-pie
+
+# You can also make your code fail to compile if you use deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
+
+
+SOURCES += \
+        main.cpp \
+        mainwindow.cpp\
+    myview.cpp \
+    radarinfoview.cpp \
+    radarview.cpp \
+    ../../include/msgtype/ultrasonic.pb.cc \
+    ../../include/msgtype/uradar.pb.cc
+
+HEADERS += \
+        mainwindow.h \
+    myview.h \
+    radarinfoview.h \
+    radarview.h \
+    ../../include/msgtype/ultrasonic.pb.h \
+    ../../include/msgtype/uradar.pb.h
+
+FORMS += \
+        mainwindow.ui \
+
+SUBDIRS += \
+    view_ultrasonicradar.pro \
+
+DISTFILES += \
+    view_ultrasonicradar.pro.user \
+
+!include(../../../include/common.pri ) {
+    error( "Couldn't find the common.pri file!" )
+}
+
+!include(../../../include/ivprotobuf.pri ) {
+    error( "Couldn't find the ivprotobuf.pri file!" )
+}
+
+RESOURCES += \
+    res.qrc