diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2cba70f --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# C++ objects and libs + +*.slo +*.lo +*.o +*.a +*.la +*.lai +*.so +*.dll +*.dylib + +# Qt-es + +/.qmake.cache +/.qmake.stash +*.pro.user +*.pro.user.* +*.qbs.user +*.qbs.user.* +*.moc +moc_*.cpp +moc_*.h +qrc_*.cpp +ui_*.h +Makefile* +*build-* + +# QtCreator + +*.autosave + +# QtCtreator Qml +*.qmlproject.user +*.qmlproject.user.* + +# QtCtreator CMake +CMakeLists.txt.user* \ No newline at end of file diff --git a/Radar.pro b/Radar.pro index 855e84b..1e55e2e 100644 --- a/Radar.pro +++ b/Radar.pro @@ -28,12 +28,14 @@ SOURCES += \ main.cpp \ radar.cpp \ serialcontroller.cpp \ - serialwidget.cpp + serialwidget.cpp \ + waveform.cpp HEADERS += \ radar.h \ serialcontroller.h \ - serialwidget.h + serialwidget.h \ + waveform.h # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin diff --git a/Radar.pro.user b/Radar.pro.user index f22807d..0a313ae 100644 --- a/Radar.pro.user +++ b/Radar.pro.user @@ -1,10 +1,10 @@ - + EnvironmentId - {2c3e6c03-a454-4a53-bc1b-c224563b9344} + {63343ee6-89a1-40cf-a082-b77d22c0828e} ProjectExplorer.Project.ActiveTarget @@ -323,273 +323,9 @@ 1 - - ProjectExplorer.Project.Target.1 - - Desktop Qt 5.11.2 GCC 64bit_static - Desktop Qt 5.11.2 GCC 64bit_static - {e0a85e13-9414-41c1-b1e3-1b96941c2dc8} - 2 - 0 - 0 - - /home/cmy/Projects/build-Radar-Desktop_Qt_5_11_2_GCC_64bit_static-Debug - - - true - qmake - - QtProjectManager.QMakeBuildStep - true - - false - false - false - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Debug - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 2 - true - - - /home/cmy/Projects/build-Radar-Desktop_Qt_5_11_2_GCC_64bit_static-Release - - - true - qmake - - QtProjectManager.QMakeBuildStep - false - - false - false - true - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - Release - Qt4ProjectManager.Qt4BuildConfiguration - 0 - true - - - /home/cmy/Projects/build-Radar-Desktop_Qt_5_11_2_GCC_64bit_static-Profile - - - true - qmake - - QtProjectManager.QMakeBuildStep - true - - false - true - true - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Profile - Profile - Qt4ProjectManager.Qt4BuildConfiguration - 0 - true - - 3 - - - 0 - 部署 - - ProjectExplorer.BuildSteps.Deploy - - 1 - Deploy Configuration - - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - Radar - - Qt4ProjectManager.Qt4RunConfiguration:/home/cmy/Projects/Radar/Radar.pro - true - - Radar.pro - - - 3768 - false - true - false - false - true - - 1 - - ProjectExplorer.Project.TargetCount - 2 + 1 ProjectExplorer.Project.Updater.FileVersion diff --git a/main.cpp b/main.cpp index f12c6f4..d91a576 100644 --- a/main.cpp +++ b/main.cpp @@ -8,12 +8,12 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); - Radar r; +// Radar r; SerialWidget sw; - QObject::connect(&sw, &SerialWidget::deliverPos, &r, &Radar::getPos); - r.show(); +// QObject::connect(&sw, &SerialWidget::deliverPos, &r, &Radar::getPos); +// r.show(); sw.show(); return a.exec(); diff --git a/radar.cpp b/radar.cpp index f088a7e..3c80b41 100644 --- a/radar.cpp +++ b/radar.cpp @@ -3,29 +3,31 @@ Radar::Radar(QWidget *parent) : QWidget(parent) { - setWindowTitle(tr("Radar")); setAutoFillBackground(true); setPalette(QPalette(Qt::black)); - lefttop = 20; - interval = 150; - scanAngle = 358; + lefttop = 50; + interval = 200; + scanAngle = 40; + + soundSpeed = 340; lastAngle = 0; lastDistant = 0; // test - currentAngle = 180; - isClock = true; - Point p; - p.angle = 45; - p.dis = 20; + currentAngle = 0; + isClock = false; + + baseDiameter = 800; + + setWindowTitle(tr("Radar")); + resize(baseDiameter+2*lefttop, baseDiameter/2+2*lefttop); - baseRadius = 500; connect(&scanTimer,&QTimer::timeout, this, [this](){ - currentAngle++; - this->update(); + // currentAngle++; + // this->update(); }); scanTimer.start(1); } @@ -34,53 +36,89 @@ void Radar::paintEvent(QPaintEvent *) { // radar background QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing, true); - painter.setPen(QPen(Qt::green,1)); - painter.drawLine(lefttop, lefttop + baseRadius/2,lefttop + baseRadius,lefttop + baseRadius/2); - painter.drawLine(lefttop + baseRadius/2,lefttop, lefttop + baseRadius/2,lefttop + baseRadius); + painter.setRenderHint(QPainter::Antialiasing, true); + painter.setPen(QPen(Qt::darkGreen,1)); for(int i=0;i<5;++i){ - painter.drawArc(lefttop+i*interval/2,lefttop+i*interval/2,baseRadius-i*interval,baseRadius-i*interval,0,360*16); + painter.drawArc(lefttop+i*interval/2,lefttop+i*interval/2,baseDiameter-i*interval,baseDiameter-i*interval,0,180*16); + painter.drawText(lefttop + baseDiameter - i* interval/2, lefttop+ baseDiameter/2, QString::number(MAX_DIS - i*double(interval)/baseDiameter*MAX_DIS)); } // scan area - QConicalGradient conicalGradient(lefttop+baseRadius/2, lefttop+baseRadius/2, currentAngle); + QConicalGradient conicalGradient(lefttop+baseDiameter/2, lefttop+baseDiameter/2, currentAngle); + // conicalGradient.setStops(currentAngle+scanAngle); + conicalGradient.setAngle(currentAngle-scanAngle-1); + if(isClock){ - conicalGradient.setAngle(currentAngle-scanAngle-1); - conicalGradient.setColorAt(0, QColor(0,0,0,120)); - conicalGradient.setColorAt((scanAngle)/360.0, QColor(0,255,0,120)); - painter.setPen(QPen(QColor(0,0,0,0),1)); - painter.setBrush(QBrush(conicalGradient)); - painter.drawPie(lefttop,lefttop,baseRadius,baseRadius,(currentAngle-scanAngle)*16,scanAngle*16); - } else{ - conicalGradient.setColorAt(0, QColor(0,255,0,120)); + conicalGradient.setAngle(currentAngle); + conicalGradient.setColorAt(0, QColor(0,230,0,120)); conicalGradient.setColorAt(scanAngle/360.0, QColor(0,0,0,120)); painter.setPen(QPen(QColor(0,0,0,0),1)); painter.setBrush(QBrush(conicalGradient)); - painter.drawPie(lefttop,lefttop,baseRadius,baseRadius,currentAngle*16,scanAngle*16); + painter.drawPie(lefttop,lefttop,baseDiameter,baseDiameter,(currentAngle)*16,scanAngle*16); + } else{ + conicalGradient.setColorAt(0, QColor(0,0,0,120)); + conicalGradient.setColorAt(scanAngle/360.0, QColor(0,230,0,120)); + painter.setPen(QPen(QColor(0,0,0,0),1)); + painter.setBrush(QBrush(conicalGradient)); + painter.drawPie(lefttop,lefttop,baseDiameter,baseDiameter,(currentAngle-scanAngle)*16,scanAngle*16); } -// painter.drawRect(250,250,20,20); + // painter.drawRect(250,250,20,20); // draw target - painter.setPen(QPen(Qt::red)); - painter.setBrush(QBrush(Qt::red)); + painter.setPen(QPen(Qt::green)); + painter.setBrush(QBrush(Qt::green)); for(int i = 0; i < 256; i++) { double angle = i; double dis = distances[i]; -// qDebug()< #include #include -#include +#include parent #include #include #include - class Radar : public QWidget { Q_OBJECT @@ -16,12 +15,14 @@ public: explicit Radar(QWidget *parent = nullptr); void paintEvent(QPaintEvent *); private: - struct Point{ - double angle; - double dis; - }; + + inline double convertDis(int dis); + int mst; int distances[256] = {0}; + int MAX_DIS = 100; + + double soundSpeed; QTimer scanTimer; int lefttop; @@ -31,7 +32,7 @@ private: int currentAngle, lastAngle; int currentDistant, lastDistant; bool isClock; - int baseRadius; + int baseDiameter; @@ -40,6 +41,7 @@ signals: public slots: void getPos(int ang, int dis); + void setSoundSpeed(double speed); }; #endif // RADAR_H diff --git a/serialcontroller.cpp b/serialcontroller.cpp index 55bb5d3..30501bd 100644 --- a/serialcontroller.cpp +++ b/serialcontroller.cpp @@ -6,6 +6,7 @@ SerialController::SerialController(QObject *parent) : QObject(parent) serial = new QSerialPort(this); connect(serial, SIGNAL(readyRead()), this,SLOT(handleRecv())); + // QList SerialList = QSerialPortInfo::availablePorts(); // if(SerialList.size()!=0){ // openSerial(SerialList[0].portName()); @@ -109,3 +110,13 @@ void SerialController::controlDTR(bool set) { serial->setDataTerminalReady(set); } + +void SerialController::writeData(QString content) +{ + if (serial->isWritable()) + { + qint64 result = serial->write(content.toLocal8Bit().data()); +// if (result == -1); +// else; + } +} diff --git a/serialcontroller.h b/serialcontroller.h index a4b5c5d..f9b045f 100644 --- a/serialcontroller.h +++ b/serialcontroller.h @@ -22,6 +22,7 @@ private: int testWise; + signals: void sendPos(int angle, int dis); void openSuccess(); @@ -37,6 +38,7 @@ public slots: void getParity(QString parity); void contrloRTS(bool set); void controlDTR(bool set); + void writeData(QString content); }; #endif // SERIALCONTROLLER_H diff --git a/serialwidget.cpp b/serialwidget.cpp index c12a29f..57c6482 100644 --- a/serialwidget.cpp +++ b/serialwidget.cpp @@ -5,24 +5,32 @@ SerialWidget::SerialWidget(QWidget *parent) : QWidget(parent) setWindowTitle(tr("Control panel")); + radar = new Radar(); + radar->show(); + connect(this, &SerialWidget::deliverPos, radar, &Radar::getPos); + + wave = new Waveform(); + wave->show(); + connect(this, &SerialWidget::deliverPos, wave, &Waveform::getPos); + serialController = new SerialController; serialController->moveToThread(&SerialThr); SerialThr.start(); - BaudrateList << "115200"; -// BaudrateList << "256000" -// << "230400" -// << "128000" -// << "115200" -// << "76800" -// << "57600" -// << "43000" -// << "38400" -// << "19200" -// << "14400" -// << "9600" -// << "4800" -// << "2400" -// << "1200"; + // BaudrateList << "115200"; + BaudrateList << "256000" + << "230400" + << "128000" + << "115200" + << "76800" + << "57600" + << "43000" + << "38400" + << "19200" + << "14400" + << "9600" + << "4800" + << "2400" + << "1200"; StopbitsList << "1" << "1.5" << "2"; @@ -36,7 +44,7 @@ SerialWidget::SerialWidget(QWidget *parent) : QWidget(parent) COMBox = new QComboBox(); BaudrateBox = new QComboBox(); BaudrateBox->addItems(BaudrateList); - // BaudrateBox->setCurrentIndex(settings.value("Baud rate", 0).toInt()); + BaudrateBox->setCurrentIndex(3); StopbitsBox = new QComboBox(); StopbitsBox->addItems(StopbitsList); // StopbitsBox->setCurrentIndex(settings.value("Stop bits", 0).toInt()); @@ -53,8 +61,19 @@ SerialWidget::SerialWidget(QWidget *parent) : QWidget(parent) DatabitsLabel = new QLabel(tr("数据位")); ParityLabel = new QLabel(tr("校验位")); + //LineEdit + QDoubleValidator *validator = new QDoubleValidator(0, 100, 2, this); + + sendArea = new QLineEdit(this); + sendArea->setValidator(validator); + sendArea->setText(tr("0")); + //按钮 OpenButton = new QPushButton(tr("打开串口")); + calibrationButton = new QPushButton(tr("Calibrate Mode")); + calibrationButton->setDisabled(true); + //校准 + connect(calibrationButton, &QPushButton::clicked, this, &SerialWidget::Calibrate); //checkbox RTSBox = new QCheckBox(tr("RTS")); @@ -82,7 +101,7 @@ SerialWidget::SerialWidget(QWidget *parent) : QWidget(parent) connect(OpenButton, &QPushButton::clicked, this, &SerialWidget::OpenSerial); connect(this, &SerialWidget::requestClose, serialController, &SerialController::closeSerial); - + connect(this, &SerialWidget::sendData, serialController,&SerialController::writeData); //初始化布局 @@ -97,6 +116,8 @@ SerialWidget::SerialWidget(QWidget *parent) : QWidget(parent) leftLlayout->addRow(DatabitsLabel, DatabitsBox); leftLlayout->addRow(ParityLabel, ParityBox); leftLlayout->addRow(COMLabel, COMBox); + leftLlayout->addRow(sendArea); + leftLlayout->addRow(calibrationButton); leftLlayout->addRow(OpenButton); leftLlayout->setAlignment(OpenButton, Qt::AlignVCenter); leftLlayout->setMargin(30); @@ -149,6 +170,8 @@ SerialWidget::SerialWidget(QWidget *parent) : QWidget(parent) connect(this, &SerialWidget::changeRTS, serialController, &SerialController::contrloRTS); connect(this, &SerialWidget::changeDTR, serialController, &SerialController::controlDTR); + connect(this, &SerialWidget::sendSoundSpeed, radar, &Radar::setSoundSpeed); + connect(this, &SerialWidget::sendSoundSpeed, wave, &Waveform::setSoundSpeed); } @@ -197,7 +220,8 @@ void SerialWidget::CheckSerials() SerialWidget::~SerialWidget() { - SerialThr.exit(); + SerialThr.terminate(); + radar->close(); } @@ -217,10 +241,12 @@ void SerialWidget::serialNotOpened() void SerialWidget::serialClosed() { - + isOpened = false; + //相应控件可用性做出改变(setDisabled) + ACtionAttachToSerial(false); } -void SerialWidget::getRecv(double ang, double dis) +void SerialWidget::getRecv(int ang, int dis) { emit deliverPos(ang, dis); } @@ -241,6 +267,18 @@ void SerialWidget::CloseSerial() } +void SerialWidget::Calibrate() +{ + if(calibrationButton->text()==tr("Calibrate Mode")){ + emit sendData(tr("S")); + calibrationButton->setText(tr("Confirm")); + } else{ + emit sendData(tr("R")); + calibrationButton->setText(tr("Calibrate Mode")); + emit sendSoundSpeed(sendArea->text().toDouble()); + } +} + void SerialWidget::ACtionAttachToSerial(bool set) { //根据串口开关状态决定一些控件的可用性 @@ -251,6 +289,7 @@ void SerialWidget::ACtionAttachToSerial(bool set) //SendButton->setDisabled(false); disconnect(OpenButton, &QPushButton::clicked, this, &SerialWidget::OpenSerial); connect(OpenButton, &QPushButton::clicked, this, &SerialWidget::CloseSerial); + calibrationButton->setDisabled(false); } else { @@ -259,5 +298,6 @@ void SerialWidget::ACtionAttachToSerial(bool set) //SendButton->setDisabled(true); disconnect(OpenButton, &QPushButton::clicked, this, &SerialWidget::CloseSerial); connect(OpenButton, &QPushButton::clicked, this, &SerialWidget::OpenSerial); + calibrationButton->setDisabled(true); } } diff --git a/serialwidget.h b/serialwidget.h index 1767929..7e268e3 100644 --- a/serialwidget.h +++ b/serialwidget.h @@ -14,7 +14,10 @@ #include #include #include +#include #include "serialcontroller.h" +#include "radar.h" +#include "waveform.h" class SerialWidget : public QWidget { @@ -33,19 +36,21 @@ signals: void setStopBits(QString stopbits); void setDataBits(QString databits); void setParity(QString parity); - // void sendData(QString content); + void sendData(QString content); void changeRTS(bool set); void changeDTR(bool set); void deliverPos(int ang,int dis); + void sendSoundSpeed(double s); public slots: void serialOpened(); //串口打开成功 void serialNotOpened(); //串口打开失败 void serialClosed(); //串口关闭 - void getRecv(double ang,double dis); //串口接受数据 + void getRecv(int ang, int dis); //串口接受数据 void OpenSerial(); void CloseSerial(); + void Calibrate(); // void ClearRecv(); // void ClearSend(); // void detNewLine(int state); //处理发送新行 @@ -62,12 +67,12 @@ private: QStringList COMList, PortNameList, DescList; QLabel *COMLabel, *BaudrateLabel, *StopbitsLabel, *DatabitsLabel, *ParityLabel; QCheckBox *RTSBox, *DTRBox; - // QGridLayout *centralLayout; QVBoxLayout *cvlayout; QHBoxLayout *bottomLayout; QFormLayout *leftLlayout; + QLineEdit *sendArea; // QTextEdit *RecvArea, *SendArea; - QPushButton *OpenButton, *SendButton; + QPushButton *OpenButton, *SendButton, *calibrationButton; QTimer *CheckTimer; SerialController *serialController; QThread SerialThr; @@ -77,6 +82,9 @@ private: bool isRecvHex = false; bool isOpened = false; + Radar *radar; + Waveform *wave; + // QString HexStringToString(QString hexstr); //解码16进制字符串 void ACtionAttachToSerial(bool set); }; diff --git a/waveform.cpp b/waveform.cpp new file mode 100644 index 0000000..3ef1ef9 --- /dev/null +++ b/waveform.cpp @@ -0,0 +1,70 @@ +#include "waveform.h" + +Waveform::Waveform(QWidget *parent) : QWidget(parent) +{ + top = 100; + left = 100; + soundSpeed = 340; + + resize(2*left + 180*3, 2*top+MAX_DIS); + setAutoFillBackground(true); + setPalette(QPalette(Qt::lightGray)); +} + +void Waveform::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing, true); + painter.setPen(QPen(Qt::black,1)); + + //horizon + painter.drawLine(left, top+MAX_DIS, left+180 * 3, top + MAX_DIS); + //ver + painter.drawLine(left, top, left, top+MAX_DIS); + + // draw target + painter.setPen(QPen(Qt::black)); + painter.setBrush(QBrush(Qt::black)); + for(int i = 0; i < 256; i++) + { + if(distances[i]!=0){ + double angle = i; + double dis = distances[i]; + // qDebug()< +#include +#include +#include +class Waveform : public QWidget +{ + Q_OBJECT +private: + inline double convertDis(int dis); + int distances[256] = {0}; + int top; + int left; + int mst; + + int MAX_DIS = 400; +public: + explicit Waveform(QWidget *parent = nullptr); + void paintEvent(QPaintEvent *); + + int currentAngle, lastAngle; + double soundSpeed; + + + +signals: + +public slots: + void getPos(int ang, int dis); + void setSoundSpeed(double speed); +}; + +#endif // WAVEFORM_H