diff --git a/BDTest.pro b/BDTest.pro index 728c0df..a7c321c 100644 --- a/BDTest.pro +++ b/BDTest.pro @@ -32,7 +32,8 @@ SOURCES += \ src/cpp/statusTestWin.cpp \ src/cpp/precisionTestWin.cpp \ src/cpp/testThread.cpp \ - src/cpp/rnSignalPainter.cpp + src/cpp/rnSignalPainter.cpp \ + src/cpp/rdSignalPainter.cpp HEADERS += \ src/include/posTestWin.h \ @@ -43,6 +44,7 @@ HEADERS += \ src/include/msgInputWin.h \ src/include/precisionTestWin.h \ src/include/qcustomplot.h \ + src/include/rdSignalPainter.h \ src/include/rnSignalPainter.h \ src/include/serialport.h \ src/include/sqlitedb.h \ @@ -52,6 +54,7 @@ HEADERS += \ src/include/utils.h FORMS += \ + src/ui/rdSignalPainter.ui \ src/ui/rnSignalPainter.ui \ src/ui/precisionTestWin.ui \ src/ui/posTestWin.ui \ diff --git a/src/cpp/mainwindow.cpp b/src/cpp/mainwindow.cpp index 798049c..698e009 100644 --- a/src/cpp/mainwindow.cpp +++ b/src/cpp/mainwindow.cpp @@ -127,6 +127,12 @@ MainWindow::MainWindow(QWidget *parent) connect(this,SIGNAL(recvIidSignal(QString)),ui->statusTestWdg,SLOT(recvIidHandle(QString)),Qt::QueuedConnection); connect(this,SIGNAL(recvIcmSignal(QString)),ui->statusTestWdg,SLOT(recvIcmHandle(QString)),Qt::QueuedConnection); connect(this,SIGNAL(recvPmuSignal(QString)),ui->statusTestWdg,SLOT(recvPmuHandle(QString)),Qt::QueuedConnection); + + //定位检测 + connect(ui->posTestWdg,SIGNAL(writeDataSignal(QByteArray)),this,SIGNAL(writeDataSignal(QByteArray)),Qt::QueuedConnection); + connect(this,SIGNAL(recvBidSignal(QString)),ui->posTestWdg,SLOT(recvBidHandle(QString)),Qt::QueuedConnection); + connect(this,SIGNAL(recvGsvSignal(QString)),ui->posTestWdg,SIGNAL(recvGsvSignal(QString)),Qt::QueuedConnection); + connect(this,SIGNAL(recvGgaSignal(QString)),ui->posTestWdg,SLOT(recvGgaHandle(QString)),Qt::QueuedConnection); } MainWindow::~MainWindow() @@ -177,6 +183,12 @@ void MainWindow::receiverSerialDataHandle(const QByteArray &data) emit recvIcmSignal(cmd); }else if(cmd.startsWith("$BDPMU")){ emit recvPmuSignal(cmd); + }else if(cmd.startsWith("$BDBID")){ + emit recvBidSignal(cmd); + }else if(cmd.startsWith("$BDGSV") || cmd.startsWith("$GPGSV") || cmd.startsWith("$GBGSV")){ + emit recvGsvSignal(cmd); + }else if(cmd.contains(QRegularExpression("^[$][A-Z]{2}GGA"))){ + emit recvGgaSignal(cmd); } } } diff --git a/src/cpp/posTestWin.cpp b/src/cpp/posTestWin.cpp index cedee05..bcd19d0 100644 --- a/src/cpp/posTestWin.cpp +++ b/src/cpp/posTestWin.cpp @@ -1,5 +1,7 @@ #include "posTestWin.h" #include "ui_posTestWin.h" +#include "utils.h" +#include "globalParams.h" #include #include @@ -13,6 +15,8 @@ PosTestWin::PosTestWin(QWidget *parent) ui->gpbRnTest->setVisible(true); ui->gpbRnSignal->setVisible(false); + connect(this,SIGNAL(recvGsvSignal(QString)),ui->rnSignalPainterWdg,SLOT(recvGsvHandle(QString)),Qt::QueuedConnection); + rnModel = new QStandardItemModel(this); rnSelect = new QItemSelectionModel(rnModel); rnModel->setColumnCount(10); @@ -41,7 +45,7 @@ PosTestWin::PosTestWin(QWidget *parent) QFont font = ui->tableViewRn->font(); font.setBold(true); QFont smallFont = font; - smallFont.setPointSize(font.pointSize()-2); + //smallFont.setPointSize(font.pointSize()-2); smallFont.setBold(false); QList aItemList; @@ -79,43 +83,57 @@ PosTestWin::PosTestWin(QWidget *parent) b1cBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); b1cBtn->setFont(smallFont); b1cBtn->setDefault(true); + b1cBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(2,0),b1cBtn); + connect(b1cBtn,SIGNAL(clicked()),this,SLOT(b1cBtn_clicked()),Qt::QueuedConnection); QPushButton *b3cBtn = new QPushButton("B3频点C码定位"); b3cBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); b3cBtn->setFont(smallFont); b3cBtn->setDefault(true); + b3cBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(3,0),b3cBtn); + connect(b3cBtn,SIGNAL(clicked()),this,SLOT(b3cBtn_clicked()),Qt::QueuedConnection); QPushButton *b1b3cBtn = new QPushButton("B1+B3频点C码定位"); b1b3cBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); b1b3cBtn->setFont(smallFont); b1b3cBtn->setDefault(true); + b1b3cBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(4,0),b1b3cBtn); + connect(b1b3cBtn,SIGNAL(clicked()),this,SLOT(b1b3cBtn_clicked()),Qt::QueuedConnection); QPushButton *gpsBtn = new QPushButton("GPS频点C码定位"); gpsBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); gpsBtn->setFont(smallFont); gpsBtn->setDefault(true); + gpsBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(5,0),gpsBtn); + connect(gpsBtn,SIGNAL(clicked()),this,SLOT(gpsBtn_clicked()),Qt::QueuedConnection); QPushButton *b1pBtn = new QPushButton("B1频点P码定位"); b1pBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); b1pBtn->setFont(smallFont); b1pBtn->setDefault(true); + b1pBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(6,0),b1pBtn); + connect(b1pBtn,SIGNAL(clicked()),this,SLOT(b1pBtn_clicked()),Qt::QueuedConnection); QPushButton *b3pBtn = new QPushButton("B3频点P码定位"); b3pBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); b3pBtn->setFont(smallFont); b3pBtn->setDefault(true); + b3pBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(7,0),b3pBtn); + connect(b3pBtn,SIGNAL(clicked()),this,SLOT(b3pBtn_clicked()),Qt::QueuedConnection); QPushButton *compatibleBtn = new QPushButton("兼容定位"); compatibleBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); compatibleBtn->setFont(smallFont); compatibleBtn->setDefault(true); + compatibleBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(8,0),compatibleBtn); + connect(compatibleBtn,SIGNAL(clicked()),this,SLOT(compatibleBtn_clicked()),Qt::QueuedConnection); rnModel->item(0,2)->setText("定位结果"); rnModel->item(0,2)->setFont(font); @@ -156,6 +174,7 @@ PosTestWin::PosTestWin(QWidget *parent) viewB1CBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); viewB1CBtn->setFont(smallFont); viewB1CBtn->setDefault(true); + viewB1CBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(2,10),viewB1CBtn); connect(viewB1CBtn,SIGNAL(clicked()),this,SLOT(view_signal_clicked()),Qt::QueuedConnection); @@ -163,6 +182,7 @@ PosTestWin::PosTestWin(QWidget *parent) viewB3CBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); viewB3CBtn->setFont(smallFont); viewB3CBtn->setDefault(true); + viewB3CBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(3,10),viewB3CBtn); connect(viewB3CBtn,SIGNAL(clicked()),this,SLOT(view_signal_clicked()),Qt::QueuedConnection); @@ -170,6 +190,7 @@ PosTestWin::PosTestWin(QWidget *parent) viewB1B3CBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); viewB1B3CBtn->setFont(smallFont); viewB1B3CBtn->setDefault(true); + viewB1B3CBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(4,10),viewB1B3CBtn); connect(viewB1B3CBtn,SIGNAL(clicked()),this,SLOT(view_signal_clicked()),Qt::QueuedConnection); @@ -177,6 +198,7 @@ PosTestWin::PosTestWin(QWidget *parent) viewGPSBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); viewGPSBtn->setFont(smallFont); viewGPSBtn->setDefault(true); + viewGPSBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(5,10),viewGPSBtn); connect(viewGPSBtn,SIGNAL(clicked()),this,SLOT(view_signal_clicked()),Qt::QueuedConnection); @@ -184,6 +206,7 @@ PosTestWin::PosTestWin(QWidget *parent) viewB1PBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); viewB1PBtn->setFont(smallFont); viewB1PBtn->setDefault(true); + viewB1PBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(6,10),viewB1PBtn); connect(viewB1PBtn,SIGNAL(clicked()),this,SLOT(view_signal_clicked()),Qt::QueuedConnection); @@ -191,6 +214,7 @@ PosTestWin::PosTestWin(QWidget *parent) viewB3PBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); viewB3PBtn->setFont(smallFont); viewB3PBtn->setDefault(true); + viewB3PBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(7,10),viewB3PBtn); connect(viewB3PBtn,SIGNAL(clicked()),this,SLOT(view_signal_clicked()),Qt::QueuedConnection); @@ -198,6 +222,7 @@ PosTestWin::PosTestWin(QWidget *parent) viewCompatibleBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); viewCompatibleBtn->setFont(smallFont); viewCompatibleBtn->setDefault(true); + viewCompatibleBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRn->setIndexWidget(rnModel->index(8,10),viewCompatibleBtn); connect(viewCompatibleBtn,SIGNAL(clicked()),this,SLOT(view_signal_clicked()),Qt::QueuedConnection); @@ -209,24 +234,28 @@ PosTestWin::PosTestWin(QWidget *parent) rdPosBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); rdPosBtn->setFont(font); rdPosBtn->setDefault(true); + rdPosBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRd->setIndexWidget(rdModel->index(2,0),rdPosBtn); QPushButton *rdContinuePosBtn = new QPushButton("RDSS连续定位"); rdContinuePosBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); rdContinuePosBtn->setFont(font); rdContinuePosBtn->setDefault(true); + rdContinuePosBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRd->setIndexWidget(rdModel->index(3,0),rdContinuePosBtn); QPushButton *rdEmergencyPosBtn = new QPushButton("RDSS紧急定位"); rdEmergencyPosBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); rdEmergencyPosBtn->setFont(font); rdEmergencyPosBtn->setDefault(true); + rdEmergencyPosBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRd->setIndexWidget(rdModel->index(4,0),rdEmergencyPosBtn); QPushButton *rdStopContinuePosBtn = new QPushButton("结束RDSS连续定位"); rdStopContinuePosBtn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); rdStopContinuePosBtn->setFont(font); rdStopContinuePosBtn->setDefault(true); + rdStopContinuePosBtn->setCursor(Qt::PointingHandCursor); ui->tableViewRd->setIndexWidget(rdModel->index(5,0),rdStopContinuePosBtn); rdModel->item(0,2)->setText("定位结果"); @@ -251,6 +280,127 @@ PosTestWin::~PosTestWin() delete ui; } +void PosTestWin::recvBidHandle(const QString &cmd) +{ + QStringList paras = extractParaList(cmd); + if(paras.size()==2){ + QString mode = paras[0]; + QString code = paras[1]; + if(mode=="1"){ + globalParams::curRnPosMode = "B3"+code; + }else if(mode=="2"){ + globalParams::curRnPosMode = QString("B1%1+B3%2").arg(code,code); + }else if(mode=="3"){ + globalParams::curRnPosMode = "B1"+code; + }else if(mode=="5"){ + globalParams::curRnPosMode = "L1"+code; + }else if(mode=="8"){ + globalParams::curRnPosMode = QString("B3%1+L1%2").arg(code,code);; + }else{ + globalParams::curRnPosMode = ""; + } + } +} + +void PosTestWin::recvGgaHandle(const QString &cmd) +{ + QStringList paras = extractParaList(cmd); + if(paras.size()<14){ + return; + } + QString time = paras[0]; + bool ok; + QString lat = paras[1]; + double dlat = lat.toDouble(&ok); + QString latitude,longitude,altitude; + if(ok){ + dlat = degreeSecond2degree(dlat); + latitude = QString("%1°").arg(dlat,0,'f',8,QChar('0')); + }else{ + latitude = ""; + } + + QString lon = paras[3]; + double dlon = lon.toDouble(&ok); + if(ok){ + dlon = degreeSecond2degree(dlon); + longitude = QString("%1°").arg(dlon,0,'f',8,QChar('0')); + }else{ + longitude = ""; + } + if(longitude.size()>latitude.size()){ + while (longitude.size()>latitude.size()) { + latitude.append(" "); + } + }else if(longitude.size()=15){ + vdop = paras[14]; + } + + int row = -1; + if(globalParams::curRnPosMode=="B1C"){ + row = 2; + }else if(globalParams::curRnPosMode=="B3C"){ + row = 3; + }else if(globalParams::curRnPosMode=="B1C+B3C"){ + row = 4; + }else if(globalParams::curRnPosMode=="L1C"){ + row = 5; + }else if(globalParams::curRnPosMode=="B1P"){ + row = 6; + }else if(globalParams::curRnPosMode=="B3P"){ + row = 7; + }else if(globalParams::curRnPosMode=="B3C+L1C"){ + row = 8; + } + + if(status.toInt()!=0){ + if(row >=0){ + rnModel->item(row,2)->setText(time); + rnModel->item(row,3)->setText(longitude); + rnModel->item(row,4)->setText(latitude); + rnModel->item(row,5)->setText(altitude); + rnModel->item(row,7)->setText(vdop); + rnModel->item(row,8)->setText(hdop); + rnModel->item(row,9)->setText(satelliteCounts); + } + }else{ + if(row >=0){ + rnModel->item(row,2)->setText(""); + rnModel->item(row,3)->setText(""); + rnModel->item(row,4)->setText(""); + rnModel->item(row,5)->setText(""); + rnModel->item(row,7)->setText(""); + rnModel->item(row,8)->setText(""); + rnModel->item(row,9)->setText(""); + } + } +} + void PosTestWin::on_btnRdTest_clicked() { ui->gpbRdTest->setVisible(true); @@ -273,3 +423,138 @@ void PosTestWin::view_signal_clicked() ui->gpbRnSignal->setVisible(true); } +void PosTestWin::on_btnBack_clicked() +{ + ui->gpbRdTest->setVisible(false); + ui->gpbRnTest->setVisible(true); + ui->gpbRnSignal->setVisible(false); +} + +void PosTestWin::b1cBtn_clicked() +{ + for(int i=2;i<=9;i++){ + rnModel->item(2,i)->setText(""); + } + ui->tableViewRn->selectRow(2); + enableOnlyOneViewBtn(2); + + QString cmd = "$CCMSS,Z,1,B1,C,,,,*16\r\n"; + emit writeDataSignal(cmd.toLatin1()); +} + +void PosTestWin::b3cBtn_clicked() +{ + for(int i=2;i<=9;i++){ + rnModel->item(3,i)->setText(""); + } + ui->tableViewRn->selectRow(3); + enableOnlyOneViewBtn(3); + + QString cmd = "$CCMSS,Z,1,B3,C,,,,*14\r\n"; + emit writeDataSignal(cmd.toLatin1()); +} + +void PosTestWin::b1b3cBtn_clicked() +{ + for(int i=2;i<=9;i++){ + rnModel->item(4,i)->setText(""); + } + ui->tableViewRn->selectRow(4); + enableOnlyOneViewBtn(4); + + QString cmd = "$CCMSS,Z,1,B3,C,B1,C,,*24\r\n"; + emit writeDataSignal(cmd.toLatin1()); +} + +void PosTestWin::gpsBtn_clicked() +{ + for(int i=2;i<=9;i++){ + rnModel->item(5,i)->setText(""); + } + ui->tableViewRn->selectRow(5); + enableOnlyOneViewBtn(5); + + QString cmd = "$CCMSS,Z,1,L1,C,,,,*18\r\n"; + emit writeDataSignal(cmd.toLatin1()); +} + +void PosTestWin::b1pBtn_clicked() +{ + for(int i=2;i<=9;i++){ + rnModel->item(6,i)->setText(""); + } + ui->tableViewRn->selectRow(6); + enableOnlyOneViewBtn(6); + + QString cmd = "$CCMSS,Z,1,B1,P,,,,*05\r\n"; + emit writeDataSignal(cmd.toLatin1()); +} + +void PosTestWin::b3pBtn_clicked() +{ + for(int i=2;i<=9;i++){ + rnModel->item(7,i)->setText(""); + } + ui->tableViewRn->selectRow(7); + enableOnlyOneViewBtn(7); + + QString cmd = "$CCMSS,Z,1,B3,P,,,,*07\r\n"; + emit writeDataSignal(cmd.toLatin1()); +} + +void PosTestWin::compatibleBtn_clicked() +{ + for(int i=2;i<=9;i++){ + rnModel->item(8,i)->setText(""); + } + ui->tableViewRn->selectRow(8); + enableOnlyOneViewBtn(8); + + QString cmd = "$CCMSS,Z,1,B3,C,L1,C,,*2A\r\n"; + emit writeDataSignal(cmd.toLatin1()); +} + +void PosTestWin::enableOnlyOneViewBtn(int row) +{ + QPushButton *viewB1CBtn = qobject_cast(ui->tableViewRn->indexWidget(rnModel->index(2,10))); + QPushButton *viewB3CBtn = qobject_cast(ui->tableViewRn->indexWidget(rnModel->index(3,10))); + QPushButton *viewB1B3CBtn = qobject_cast(ui->tableViewRn->indexWidget(rnModel->index(4,10))); + QPushButton *viewGPSBtn = qobject_cast(ui->tableViewRn->indexWidget(rnModel->index(5,10))); + QPushButton *viewB1PBtn = qobject_cast(ui->tableViewRn->indexWidget(rnModel->index(6,10))); + QPushButton *viewB3PBtn = qobject_cast(ui->tableViewRn->indexWidget(rnModel->index(7,10))); + QPushButton *viewCompatibleBtn = qobject_cast(ui->tableViewRn->indexWidget(rnModel->index(8,10))); + viewB1CBtn->setEnabled(false); + viewB3CBtn->setEnabled(false); + viewB1B3CBtn->setEnabled(false); + viewGPSBtn->setEnabled(false); + viewB1PBtn->setEnabled(false); + viewB3PBtn->setEnabled(false); + viewCompatibleBtn->setEnabled(false); + switch (row) { + case 2: + viewB1CBtn->setEnabled(true); + break; + case 3: + viewB3CBtn->setEnabled(true); + break; + case 4: + viewB1B3CBtn->setEnabled(true); + break; + case 5: + viewGPSBtn->setEnabled(true); + break; + case 6: + viewB1PBtn->setEnabled(true); + break; + case 7: + viewB3PBtn->setEnabled(true); + break; + case 8: + viewCompatibleBtn->setEnabled(true); + break; + default: + break; + } +} + + diff --git a/src/cpp/rdSignalPainter.cpp b/src/cpp/rdSignalPainter.cpp new file mode 100644 index 0000000..e9b11c1 --- /dev/null +++ b/src/cpp/rdSignalPainter.cpp @@ -0,0 +1,14 @@ +#include "rdSignalPainter.h" +#include "ui_rdSignalPainter.h" + +RdSignalPainter::RdSignalPainter(QWidget *parent) + : QWidget(parent) + , ui(new Ui::RdSignalPainter) +{ + ui->setupUi(this); +} + +RdSignalPainter::~RdSignalPainter() +{ + delete ui; +} diff --git a/src/cpp/rnSignalPainter.cpp b/src/cpp/rnSignalPainter.cpp index e35ef1a..e925281 100644 --- a/src/cpp/rnSignalPainter.cpp +++ b/src/cpp/rnSignalPainter.cpp @@ -1,13 +1,20 @@ #include "rnSignalPainter.h" #include "ui_rnSignalPainter.h" #include "globalParams.h" +#include "utils.h" #include +#include RnSignalPainter::RnSignalPainter(QWidget *parent) : QWidget(parent) , ui(new Ui::RnSignalPainter) { ui->setupUi(this); + timerSnrTimeout = new QTimer(this); + timerSnrTimeout->stop(); + timerSnrTimeout->setInterval(2000); + connect(timerSnrTimeout,SIGNAL(timeout()),this,SLOT(timerSnrTimeoutHandle()),Qt::QueuedConnection); + timerSnrTimeout->start(); } RnSignalPainter::~RnSignalPainter() @@ -15,6 +22,62 @@ RnSignalPainter::~RnSignalPainter() delete ui; } +void RnSignalPainter::recvGsvHandle(const QString &cmd) +{ + QString sys; + sys = cmd.mid(1,2); + if(sys=="GB"){ + sys = "BD"; + } + QStringList paras = extractParaList(cmd); + if(paras.size()<3){ + return; + } + + QString feq = ""; + if(paras.size()%4==0){ + feq = paras[paras.size()-1]; + } + + for(int i=0;i<(paras.size()-3)/4;i++){ + QString satNum = paras[3+i*4].trimmed(); + QString cnr = paras[3+i*4+3].trimmed(); + + if(satNum.isEmpty() || cnr.isEmpty()){ + continue; + } + + QPair key(satNum,feq); + if(sys=="GP"){ + gpsSnrMap[key] = cnr; + gpsTimeoutCountMap[key] = 0; + }else if(sys=="BD"){ + bdSnrMap[key] = cnr; + bdsTimeoutCountMap[key] = 0; + } + } + update(); +} + +void RnSignalPainter::timerSnrTimeoutHandle() +{ + for(QPair key:gpsTimeoutCountMap.keys()){ + gpsTimeoutCountMap[key]++; + if(gpsTimeoutCountMap[key]>=2){ + gpsSnrMap.remove(key); + gpsTimeoutCountMap.remove(key); + } + } + for(QPair key:bdsTimeoutCountMap.keys()){ + bdsTimeoutCountMap[key]++; + if(bdsTimeoutCountMap[key]>=2){ + bdSnrMap.remove(key); + bdsTimeoutCountMap.remove(key); + } + } + update(); +} + void RnSignalPainter::paintEvent(QPaintEvent *event) { QPainter painter(this); @@ -25,20 +88,116 @@ void RnSignalPainter::paintEvent(QPaintEvent *event) pen.setColor(Qt::black); pen.setStyle(Qt::SolidLine); painter.setPen(pen); + QBrush brush; + brush.setStyle(Qt::SolidPattern); - int H=this->height(); //绘图区高度 + int H = this->height(); //绘图区高度 + int W = this->width(); QFontMetrics fontMetrics = painter.fontMetrics(); int fontHeight = fontMetrics.height(); int margin = 5; int spacing = 5; - painter.drawText(margin,margin+fontMetrics.ascent(),QString("当前定位模式:%1").arg(globalParams::curRnPosMode)); + QString posMode; + if(globalParams::curRnPosMode=="B3C"){ + posMode = "B3频点C码定位"; + }else if(globalParams::curRnPosMode=="B3P"){ + posMode = "B3频点P码定位"; + }else if(globalParams::curRnPosMode=="B1C+B3C"){ + posMode = "B1+B3频点C码定位"; + }else if(globalParams::curRnPosMode=="B1P+B3P"){ + posMode = "B1+B3频点P码定位"; + }else if(globalParams::curRnPosMode=="B1C"){ + posMode = "B1频点C码定位"; + }else if(globalParams::curRnPosMode=="B1P"){ + posMode = "B1频点P码定位"; + }else if(globalParams::curRnPosMode=="L1C"){ + posMode = "GPS频点C码定位"; + }else if(globalParams::curRnPosMode=="B3C+L1C"){ + posMode = "兼容定位"; + }else{ + posMode = globalParams::curRnPosMode; + } + painter.drawText(margin,margin+fontMetrics.ascent(),QString("当前定位模式:%1").arg(posMode)); + //BD坐标轴 + int yb0 = (H-margin*2)/2-margin-fontMetrics.height(); + QString tmp = "北斗卫星信号"; + int xb0 = margin*2 + fontMetrics.horizontalAdvance(tmp); + int hb = yb0 - margin*2 - fontMetrics.height()*2; + int wb = W - margin*2 - fontMetrics.horizontalAdvance(tmp); + painter.drawText(margin,yb0-hb/2,tmp); + painter.drawLine(xb0,yb0,xb0+wb,yb0); + painter.drawLine(xb0,yb0,xb0,yb0-hb); + //GP坐标轴 + int yg0 = H-margin-fontMetrics.height(); + tmp = "GPS卫星信号"; + int xg0 = xb0; + int hg = hb; + int wg = wb; + painter.drawText(margin,yg0-hg/2,tmp); + painter.drawLine(xg0,yg0,xg0+wg,yg0); + painter.drawLine(xg0,yg0,xg0,yg0-hg); - //坐标轴 + int sw = fontMetrics.horizontalAdvance("00.0"); + //BD信号 + int xb = xb0+margin; + for(const QPair &key:bdSnrMap.keys()){ + double strength = bdSnrMap.value(key).toDouble(); + QString satNum = key.first; + QString feq = key.second; + int red = 255 - feq.toInt(nullptr,16)*10; + QColor color = QColor(red,0,0); + brush.setColor(color); + painter.setBrush(brush); + + xb = xb + margin; + + int w0 = fontMetrics.horizontalAdvance(satNum);//宽度 + painter.drawText(xb+(sw-w0)/2,yb0+fontMetrics.ascent(),satNum); + + //int h = std::min(strength,50.0); + int h = std::min(hb/50.0*strength,hb*1.0); + int y = yb0-h; + QRect rect(xb,y,sw,h); + painter.drawRect(rect); + + QString str = QString("%1").arg(strength,0,'g',3); + int w1 = fontMetrics.horizontalAdvance(str);//宽度 + painter.drawText(xb+(sw-w1)/2,y-margin/2-fontMetrics.descent(),str); + xb = xb + sw; + } + + //GPS信号 + int xg = xb0+margin; + for(const QPair &key:gpsSnrMap.keys()){ + double strength = gpsSnrMap.value(key).toDouble(); + QString satNum = key.first; + QString feq = key.second; + int green = 255 - feq.toInt(nullptr,16)*10; + QColor color = QColor(0,green,0); + brush.setColor(color); + painter.setBrush(brush); + + xg = xg + margin; + + int w0 = fontMetrics.horizontalAdvance(satNum);//宽度 + painter.drawText(xg+(sw-w0)/2,yg0+fontMetrics.ascent(),satNum); + + //int h = std::min(strength,50.0); + int h = std::min(hb/50.0*strength,hg*1.0); + int y = yg0-h; + QRect rect(xg,y,sw,h); + painter.drawRect(rect); + + QString str = QString("%1").arg(strength,0,'g',3); + int w1 = fontMetrics.horizontalAdvance(str);//宽度 + painter.drawText(xg+(sw-w1)/2,y-margin/2-fontMetrics.descent(),str); + xg = xg + sw; + } return QWidget::paintEvent(event); } diff --git a/src/cpp/utils.cpp b/src/cpp/utils.cpp index 90ec4a2..6b9d03b 100644 --- a/src/cpp/utils.cpp +++ b/src/cpp/utils.cpp @@ -92,3 +92,11 @@ QStringList extractParaList(const QString &msg) } return paraList; } + +double degreeSecond2degree(double degreeSecond) +{ + double degree = floor(degreeSecond/100); + double second = degreeSecond - degree*100; + double result = degree + second/60; + return result; +} diff --git a/src/include/mainwindow.h b/src/include/mainwindow.h index 7e2d1a9..98a26c7 100644 --- a/src/include/mainwindow.h +++ b/src/include/mainwindow.h @@ -27,6 +27,9 @@ signals: void recvIidSignal(const QString &cmd); void recvIcmSignal(const QString &cmd); void recvPmuSignal(const QString &cmd); + void recvBidSignal(const QString &cmd); + void recvGsvSignal(const QString &cmd); + void recvGgaSignal(const QString &cmd); private slots: void receiverSerialDataHandle(const QByteArray &data); diff --git a/src/include/posTestWin.h b/src/include/posTestWin.h index 224ff45..e75cd9a 100644 --- a/src/include/posTestWin.h +++ b/src/include/posTestWin.h @@ -17,10 +17,24 @@ public: explicit PosTestWin(QWidget *parent = nullptr); ~PosTestWin(); +signals: + void writeDataSignal(const QByteArray &buf); + void recvGsvSignal(const QString &cmd); + private slots: + void recvBidHandle(const QString &cmd); + void recvGgaHandle(const QString &cmd); void on_btnRdTest_clicked(); void on_btnRnTest_clicked(); + void on_btnBack_clicked(); void view_signal_clicked(); + void b1cBtn_clicked(); + void b3cBtn_clicked(); + void b1b3cBtn_clicked(); + void gpsBtn_clicked(); + void b1pBtn_clicked(); + void b3pBtn_clicked(); + void compatibleBtn_clicked(); private: Ui::PosTestWin *ui; @@ -28,6 +42,7 @@ private: QItemSelectionModel *rnSelect; QStandardItemModel *rdModel; QItemSelectionModel *rdSelect; + void enableOnlyOneViewBtn(int row); }; #endif // POSTESTWIN_H diff --git a/src/include/rdSignalPainter.h b/src/include/rdSignalPainter.h new file mode 100644 index 0000000..eccdc5a --- /dev/null +++ b/src/include/rdSignalPainter.h @@ -0,0 +1,22 @@ +#ifndef RDSIGNALPAINTER_H +#define RDSIGNALPAINTER_H + +#include + +namespace Ui { +class RdSignalPainter; +} + +class RdSignalPainter : public QWidget +{ + Q_OBJECT + +public: + explicit RdSignalPainter(QWidget *parent = nullptr); + ~RdSignalPainter(); + +private: + Ui::RdSignalPainter *ui; +}; + +#endif // RDSIGNALPAINTER_H diff --git a/src/include/rnSignalPainter.h b/src/include/rnSignalPainter.h index 9aea02a..f280882 100644 --- a/src/include/rnSignalPainter.h +++ b/src/include/rnSignalPainter.h @@ -2,6 +2,8 @@ #define RNSIGNALPAINTER_H #include +#include +#include namespace Ui { class RnSignalPainter; @@ -15,11 +17,20 @@ public: explicit RnSignalPainter(QWidget *parent = nullptr); ~RnSignalPainter(); +private slots: + void recvGsvHandle(const QString &cmd); + void timerSnrTimeoutHandle(); + protected: void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; private: Ui::RnSignalPainter *ui; + QTimer *timerSnrTimeout; + QMap,QString> bdSnrMap; + QMap,QString> gpsSnrMap; + QMap,int> gpsTimeoutCountMap; + QMap,int> bdsTimeoutCountMap; }; #endif // RNSIGNALPAINTER_H diff --git a/src/include/utils.h b/src/include/utils.h index 8c33913..7af3a94 100644 --- a/src/include/utils.h +++ b/src/include/utils.h @@ -9,4 +9,6 @@ void base64_decode(const unsigned char *code,int code_len,unsigned char *res,int QStringList extractParaList(const QString &msg); +double degreeSecond2degree(double degreeSecond); + #endif // UTILS_H diff --git a/src/ui/posTestWin.ui b/src/ui/posTestWin.ui index 30b37b5..32784c6 100644 --- a/src/ui/posTestWin.ui +++ b/src/ui/posTestWin.ui @@ -25,6 +25,32 @@ + + + + + + + + 0 + 120 + 215 + + + + + + + 255 + 255 + 255 + + + + + + + QTableView { @@ -81,6 +107,9 @@ + + PointingHandCursor + 自动测试 @@ -104,6 +133,9 @@ + + PointingHandCursor + 保存 @@ -127,6 +159,9 @@ + + PointingHandCursor + RDSS定位测试 @@ -164,7 +199,7 @@ - + 0 @@ -173,6 +208,66 @@ + + + + + 0 + 0 + + + + + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 174 + 20 + + + + + + + + PointingHandCursor + + + 返回 + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + @@ -184,11 +279,11 @@ - - - + + + - + QGroupBox{border:none;} @@ -202,6 +297,9 @@ Qt::Vertical + + QSizePolicy::Expanding + 20 @@ -251,89 +349,82 @@ + + + + + + + + + + + 0 + + + 0 + - - - - - - - 0 - - - 0 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - 自动测试 - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - RNSS定位测试 - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - + - Qt::Vertical + Qt::Horizontal - 20 - 40 + 40 + 20 + + + + + + + + PointingHandCursor + + + 自动测试 + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + PointingHandCursor + + + RNSS定位测试 + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 diff --git a/src/ui/rdSignalPainter.ui b/src/ui/rdSignalPainter.ui new file mode 100644 index 0000000..7d8a4a2 --- /dev/null +++ b/src/ui/rdSignalPainter.ui @@ -0,0 +1,19 @@ + + + RdSignalPainter + + + + 0 + 0 + 400 + 300 + + + + Form + + + + +