生成很多定时器的bug解决

This commit is contained in:
hm
2020-08-12 22:12:44 +08:00
parent 59b9b98e16
commit dfd6a6e08c
15 changed files with 180 additions and 346 deletions
+6
View File
@@ -0,0 +1,6 @@
#include "Chart.h"
Chart::Chart(QObject *parent) : QObject(parent)
{
}
+16
View File
@@ -0,0 +1,16 @@
#ifndef CHART_H
#define CHART_H
#include <QObject>
class Chart : public QObject
{
Q_OBJECT
public:
explicit Chart(QObject *parent = nullptr);
signals:
};
#endif // CHART_H
+2
View File
@@ -10,9 +10,11 @@ FORMS += \
$$PWD/Scope.ui
HEADERS += \
$$PWD/Chart.h \
$$PWD/Scope.h
SOURCES += \
$$PWD/Chart.cpp \
$$PWD/Scope.cpp
-117
View File
@@ -1,117 +0,0 @@
#include "VirtualScope.h"
VirtualScope::VirtualScope(QWidget *parent) : QWidget(parent)
{
}
VirtualScope::~VirtualScope()
{
}
void VirtualScope::mouseReleaseEvent(QMouseEvent *e)
{
qDebug() << "VirtualScope release" << e;
}
void VirtualScope::mousePressEvent(QMouseEvent *e)
{
qDebug() << "VirtualScope press" << e;
}
void VirtualScope::mouseDoubleClickEvent(QMouseEvent *e)
{
qDebug() << "VirtualScope double clicked" << e;
}
void VirtualScope::wheelEvent(QWheelEvent *e)
{
qDebug() << e;
}
void VirtualScope::paintEvent(QPaintEvent *)
{
//qreal scale = 4000.0;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); /* 使用反锯齿(如果可用) */
painter.setRenderHint(QPainter::TextAntialiasing);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.translate(width() / 2, height() / 2); /* 坐标变换为窗体中心 */
//int side = qMin(width(), height()); /* 这一句决定了这个模块只能是方形 */
//painter.scale(side / scale, side / scale); /* 比例缩放 */
painter.setPen(Qt::NoPen);
drawBackground(&painter);
}
void VirtualScope::drawBackground(QPainter *painter)
{
QPen pen;
QFont font;
float w = width();
float h = height();
//画大黑背景
painter->save();
painter->setBrush(Qt::black);
painter->drawRect(-w/2,-h/2,w,h);
painter->restore();
//画坐标系
painter->save();
//painter->translate(-200,0);
//水平,垂直虚线
pen.setColor(QColor("#FFFFFF"));
pen.setWidthF(1);
painter->setPen(pen);
font.setPointSize(15);
font.setFamily("Arial");//非衬线
painter->setFont(font);
//水平分成8个格,竖直分成10个格
float g_h = (h - 50)/8;
float g_w = (w - 50)/10;
for(int i = -4;i <= 4;i++)
{
painter->drawLine(-(w - 50)/2,g_h * i,(w - 50)/2,g_h * i);
}
//水平分成10条线
for(int i = -5;i <= 5;i++)
{
painter->drawLine(g_w * i,-(h - 50)/2,g_w * i,(h - 50)/2);
painter->drawText(QRect(g_w * i - 100,(h - 50)/2,200,20), Qt::AlignCenter,QString::number(i));
}
painter->restore();
}
-43
View File
@@ -1,43 +0,0 @@
#ifndef VIRTUALSCOPE_H
#define VIRTUALSCOPE_H
#include <QObject>
#include <QWidget>
#include <QMouseEvent>
#include <QPainter>
#include "QDebug"
#include "QPicture"
#include "QtMath"
class VirtualScope : public QWidget
{
Q_OBJECT
public:
explicit VirtualScope(QWidget *parent = nullptr);
~VirtualScope();
signals:
protected:
void mouseReleaseEvent(QMouseEvent *e);
void mousePressEvent(QMouseEvent *e);
void mouseDoubleClickEvent(QMouseEvent *e);
void wheelEvent(QWheelEvent *e);
void paintEvent(QPaintEvent *);
private slots:
void drawBackground(QPainter *painter);
};
#endif // VIRTUALSCOPE_H
+2
View File
@@ -109,6 +109,7 @@ void MenuBarUI::showMessage(const QString &message, int TimeOut)
{
ui->label_Status->setText(message);
//这句:如果小于0,那么不生成定时器,减少内存开支,因为小于0时,定时器永远不会触发
if(TimeOut > 0)
{
if(MessageTimer->isActive())
@@ -124,6 +125,7 @@ void MenuBarUI::showMessage(const QString &message, int TimeOut)
MessageTimer->stop();
}
}
}
void MenuBarUI::clearMessage()
+40 -26
View File
@@ -19,6 +19,8 @@ MainWindow::MainWindow(QWidget *parent)
setFocusPolicy(Qt::StrongFocus);
setAttribute(Qt::WA_AcceptTouchEvents);
tts = new QTextToSpeech(this);
//ui initial
//menubar
@@ -209,44 +211,38 @@ MainWindow::MainWindow(QWidget *parent)
connect(dlink->mavlinknode->Mission,SIGNAL(currentPoint(int)),
map,SLOT(WPSetCurrent(int)),Qt::DirectConnection);
//menuBarUI->showMessage(tr("存在bug,连接界面udp数字输入的.可以超过3个,不合理"));
//==== showmessage=====
connect(copk,SIGNAL(showMessage(QString,int)),this,SLOT(showMessage(QString,int)));
connect(dlink,SIGNAL(showMessage(QString,int)),this,SLOT(showMessage(QString,int)));
connect(map,SIGNAL(showMessage(QString,int)),this,SLOT(showMessage(QString,int)));
qDebug() << "main window start";
//监测ssl,用于网络连接
qDebug()<<"QSslSocket="<<QSslSocket::sslLibraryBuildVersionString();
qDebug() << "OpenSSL支持情况:" << QSslSocket::supportsSsl();
}
//对返回的数据进行处理
void MainWindow::getData(QNetworkReply *reply)
{
//获得返回数据存在字节数组中
QByteArray data=reply->readAll();
//将字节数组转为字符串
QString str=QString::fromUtf8(data);
//将数据展示在textEdit中
qDebug() << str;
}
MainWindow::~MainWindow()
{
if(tts)
{
tts->stop();
delete tts;
tts = nullptr;
}
if(map)
{
map->close();
delete map;
}
copk->deleteLater();
if(copk)
{
copk->close();
delete copk;
}
QCoreApplication::quit();//退出所有窗口
}
@@ -300,9 +296,6 @@ void MainWindow::mousePressEvent(QMouseEvent* event)
Q_UNUSED(event)
}
void MainWindow::keyPressEvent(QKeyEvent *event) //键盘按下事件
{
//qDebug() << event;
@@ -522,6 +515,8 @@ void MainWindow::beep(void)
// 16~20Hz左右 运行频率可能太高
void MainWindow::updateUI()//事件驱动式更新数据
{
static uint32_t custommode_old = 0;
@@ -530,6 +525,21 @@ void MainWindow::updateUI()//事件驱动式更新数据
bool isStateChanged = false;
/*
static int frq_count = 0;
static qint64 frq_time = 0;
frq_count++;
if((QDateTime::currentMSecsSinceEpoch() - frq_time) >= 1000)
{
qDebug() <<frq_time << "running frq is:" << frq_count;
frq_count = 0;
frq_time = QDateTime::currentMSecsSinceEpoch();
}
*/
copk->setAttitude(dlink->mavlinknode->vehicle.attitude.pitch * 57.3,
dlink->mavlinknode->vehicle.attitude.roll * 57.3,
dlink->mavlinknode->vehicle.attitude.yaw * 57.3);
@@ -677,8 +687,8 @@ void MainWindow::updateUI()//事件驱动式更新数据
}
copk->setMode(mode_str);
QTextToSpeech *tts = new QTextToSpeech();
//这里会一直生成一个,导致无法释放
if(isStateChanged == true)
{
tts->say(arm_str);
@@ -687,11 +697,12 @@ void MainWindow::updateUI()//事件驱动式更新数据
if(isCustomChanged == true)
{
mode_str.append(tr("flight mode"));
tts->say(mode_str);
}
map->setUAVPos(dlink->mavlinknode->vehicle.sysid,
dlink->mavlinknode->vehicle.compid,
(double)(dlink->mavlinknode->vehicle.gps_raw_int.lat * 10e-8),
@@ -703,6 +714,8 @@ void MainWindow::updateUI()//事件驱动式更新数据
dlink->mavlinknode->vehicle.attitude.yaw * 57.3);
if(MainIndex == 3)//飞行界面
{
//刷新时间1Hz
@@ -719,6 +732,7 @@ void MainWindow::updateUI()//事件驱动式更新数据
}
}
void MainWindow::TotalDistance(double value)
+2 -1
View File
@@ -88,7 +88,7 @@ private slots:
protected slots:
void getData(QNetworkReply *reply);
protected:
@@ -114,6 +114,7 @@ protected:
QTimer *updateTimer = nullptr;
QTextToSpeech *tts = nullptr;
};
+12 -97
View File
@@ -99,23 +99,23 @@ typedef struct {
typedef struct{
qreal pitch;
qreal roll;
qreal yaw;
qreal pitch = 0;
qreal roll = 0;
qreal yaw = 0;
qreal height;
qreal height = 0;
qreal airspeed_maximun;
qreal airspeed;
qreal airspeed_minimun;
qreal airspeed_maximun = 0;
qreal airspeed = 0;
qreal airspeed_minimun = 0;
qreal heading;//航线方向
qreal position;//侧偏距
qreal altitude;//海拔
qreal heading = 0;//航线方向
qreal position = 0;//侧偏距
qreal altitude = 0;//海拔
qreal verticalspeed;//纵向速度
qreal verticalspeed = 0;//纵向速度
bool isUpdate;
bool isUpdate = false;
}_target;
@@ -211,93 +211,8 @@ private:
QTimer *UpdateTimer = nullptr;
/*
QString m_mode;//显示模式
QString m_GPS;
QString m_MODE;
QString m_STATE;
double m_PitchValue;
double m_RollValue;
double m_YawValue;
double m_CourseValue;
double m_BatteryValue;
double m_GPSAltitudeValue;
double m_PressureAltitudeValue;
int m_Max_Roll;
int m_Min_Roll;
int m_Max_Altitude;
int m_Min_Altitude;
double m_gps_altitude;
double m_pre_altitude;
double m_gps_speed;
double m_air_speed;
QString m_CtrlModeValue;
QString m_AirplaneModeValue;
QString m_CurrentStatusValue;
QString m_LockStatusValue;
QString m_TurningStatusValue;
int m_GPSStatusValue;
int m_GPSStarValue;
float m_Z_SpeedValue;
float m_Z_HightValue;
//float m_X_SpeedValue;
//保护
QString m_ProtectString;
quint8 m_Protect;
//数值的最大最小值
double m_Pitch_MinValue;
double m_Roll_MinValue;
double m_Yaw_MinValue;
double m_CourseMinValue;
double m_Pitch_MaxValue;
double m_Roll_MaxValue;
double m_Yaw_MaxValue;
double m_CourseMaxValue;
double m_BatteryMinValue;
double m_BatteryMaxValue;
/*
QColor m_CentreLineColor;
QColor m_ForeColor;
QColor m_CornerColor;
QColor m_GroundColor;//大地颜色
QColor m_SkyColor;//天空颜色
QColor m_LedColor;
QColor m_CurrentColor;
QColor m_TargetColor;
QColor m_StatusColor;
QColor m_NormalColor;
QColor m_NoticeColor;
QColor m_WarningColor;
QColor m_WColor;
*/
QPoint m_c;
};
+4 -1
View File
@@ -84,7 +84,10 @@ public slots:
void setRunFrq(uint32_t frq);
void start();
void stop();
bool isActive(void)
{
return running_flag;
}
void Parse(mavlink_message_t msg);
+50 -40
View File
@@ -19,7 +19,7 @@ MavLinkNode::MavLinkNode(QObject *parent) : QObject(parent)
initbuff();
//初始化ID
int Current_sysID = 0xF1;
int Current_sysID = 0xFB;
int Current_CompID = MAV_COMP_ID_MISSIONPLANNER;
Mission = new MissionProcess();
@@ -52,22 +52,44 @@ MavLinkNode::MavLinkNode(QObject *parent) : QObject(parent)
connect(Commander,SIGNAL(showMessage(QString,int)),
this,SIGNAL(showMessage(QString,int)),Qt::DirectConnection);
showMessage(tr("解锁才能有航迹,需要修正,示波器显示时间不对"));
}
MavLinkNode::~MavLinkNode()
{
//停止任务
if(Mission)
{
if(Mission->isActive())
{
Mission->stop();
delete Mission;
Mission = nullptr;
}
}
//停止参数
if(Parameter)
{
if(Parameter->isActive())
{
Parameter->stop();
delete Parameter;
Parameter = nullptr;
}
}
if(Commander)
{
if(Commander->isActive())
{
Commander->stop();
delete Commander;
Commander = nullptr;
}
}
if(Nodethread->isRunning())
{
@@ -102,11 +124,20 @@ void MavLinkNode::start()
qDebug() << "MavLinkNode thread start" << running_flag;
//启动子线程
//Mission->start();
//Parameter->start();
//Commander->start();
if(Mission)
{
Mission->start();
}
if(Commander)
{
Commander->start();
}
if(Parameter)
{
Parameter->start();
}
}
else
{
@@ -206,21 +237,14 @@ QByteArray MavLinkNode::readbuff(quint32 src)
{
QByteArray datagram;
//datagram.clear();
switch (src) {
default:
case SourceType::c_sock:
if(client_buff.select == 0)
{
datagram.clear();
datagram.append(client_buff.buff[1]);
//datagram.setRawData(client_buff.buff[1],client_buff.buff[1].size());
//datagram.append(client_buff.buff[1]);
for (QByteArray::const_iterator i = client_buff.buff[1].cbegin(); i != client_buff.buff[1].cend(); ++i)
{
datagram.append(*i);
}
//清除这个未选择的buff
client_buff.buff[1].clear();
//读取完成,可以往这个内存里面写数了
@@ -228,17 +252,11 @@ QByteArray MavLinkNode::readbuff(quint32 src)
}
else if(client_buff.select == 1)
{
datagram.clear();
datagram.append(client_buff.buff[0]);
//datagram.setRawData(client_buff.buff[0],client_buff.buff[0].size());
//datagram.append(client_buff.buff[0]);
for (QByteArray::const_iterator i = client_buff.buff[0].cbegin(); i != client_buff.buff[0].cend(); ++i)
{
datagram.append(*i);
}
//清除这个未选择的buff
client_buff.buff[0].clear();
//读取完成,可以往这个内存里面写数了
client_buff.select = 0;
}
@@ -246,24 +264,18 @@ QByteArray MavLinkNode::readbuff(quint32 src)
case SourceType::s_port:
if(serial_buff.select == 0)
{
//datagram.append(serial_buff.buff[0]);
for (QByteArray::const_iterator i = serial_buff.buff[1].cbegin(); i != serial_buff.buff[1].cend(); ++i)
{
datagram.append(*i);
}
datagram.clear();
datagram.append(serial_buff.buff[1]);
//datagram.setRawData(serial_buff.buff[1],serial_buff.buff[1].size());
//读取完成,可以往这个内存里面写数了
serial_buff.buff[1].clear();
serial_buff.select = 1;
}
else if(serial_buff.select == 1)
{
//datagram.append(serial_buff.buff[0]);
for (QByteArray::const_iterator i = serial_buff.buff[0].cbegin(); i != serial_buff.buff[0].cend(); ++i)
{
datagram.append(*i);
}
datagram.clear();
datagram.append(serial_buff.buff[0]);
//datagram.setRawData(serial_buff.buff[0],serial_buff.buff[0].size());
//读取完成,可以往这个内存里面写数了
serial_buff.buff[0].clear();
serial_buff.select = 0;
@@ -288,20 +300,18 @@ void MavLinkNode::Mavlinkparse(quint32 src,QByteArray datagram)
count++;
/*
if(msg.compid == Current_CompID) //过滤地面站发过来的数据
{
//不能使用这种方法过滤,不正确
//qDebug() << msg.msgid << "msg come from groundstation";
qDebug() << msg.msgid << "msg come from groundstation";
}
*/
//if(msg.compid != Current_CompID) //过滤地面站发过来的数据
if(msg.sysid < 250) //过滤地面站发过来的数据
{
MAVLinkRcv_Handler(msg); //接收完一帧数据并处理
//QThread::sleep(5);
//qDebug() << "msg.sysid" <<msg.sysid << "msg.compid" << msg.compid << "fifo parse:" << count << msg.msgid;
emit recievemsg(msg); //将信息广播出去
}
}
+4 -1
View File
@@ -98,7 +98,10 @@ public slots:
void setRunFrq(uint32_t frq);
void start();
void stop();
bool isActive(void)
{
return running_flag;
}
//缓存对外接口
void setbuff(quint32 src, QByteArray data);
+4
View File
@@ -74,6 +74,10 @@ public slots:
void setRunFrq(uint32_t frq);
void start();
void stop();
bool isActive(void)
{
return running_flag;
}
void Parse(mavlink_message_t msg);
+4 -1
View File
@@ -87,7 +87,10 @@ public slots:
void setRunFrq(uint32_t frq);
void start();
void stop();
bool isActive(void)
{
return running_flag;
}
void Parse(mavlink_message_t msg);
+22 -7
View File
@@ -22,10 +22,10 @@ DLink::DLink(QObject *parent) : QObject(parent)
mavlinknode->start();
/*
connect(this,&DLink::REVMessageTo1,
this,&DLink::SendMessageTo1);
*/
//其他协议节点。。。
}
@@ -55,8 +55,7 @@ int DLink::SendMessageTo(quint8 ch, quint8 *msg, quint16 len)
if (DLink::serialPort)
{
qint64 flag = DLink::serialPort->write((const char *)msg,len);
qDebug() << "serialPort Send Msg";
emit REVMessageTo1(ch,msg,len);
}
return 0;
@@ -66,7 +65,14 @@ int DLink::SendMessageTo(quint8 ch, quint8 *msg, quint16 len)
int DLink::SendMessageTo1(quint8 ch, quint8 *msg, quint16 len)
{
if (DLink::serialPort)
{
qint64 flag = DLink::serialPort->write((const char *)msg,len);
if(flag != -1)
{
qDebug() << "serialPort Send Msg";
}
}
return 0;
}
@@ -268,18 +274,24 @@ void DLink::readPendingDatagramsSerialPort(void)
QByteArray datagram = serialPort->readAll();
mavlinknode->setbuff(SourceType::s_port,datagram);
/*
mavlink_message_t msg;
mavlink_status_t status;
for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i)
{
if(MAVLINK_FRAMING_OK == mavlink_parse_char(3,*i,&msg,&status))
{
//qDebug() << "direct parse:" << count << msg.msgid;
qDebug() << "direct parse:" << count << msg.msgid;
count++;
}
}
*/
/*
QString num;
for (int i = 0; i < datagram.size(); ++i) {
@@ -306,17 +318,20 @@ void DLink::readPendingDatagramsClient(void)
mavlinknode->setbuff(SourceType::c_sock,datagram);
/*
mavlink_message_t msg;
mavlink_status_t status;
for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i)
{
if(MAVLINK_FRAMING_OK == mavlink_parse_char(2,*i,&msg,&status))
{
//qDebug() << "direct parse:" << count << msg.msgid;
qDebug() << "direct parse:" << count << msg.msgid;
count++;
}
}
*/
}