有bug,会死机,注意协调各个线程之间的通讯

This commit is contained in:
hm
2020-03-10 15:30:38 +08:00
parent 8f94ed1d47
commit 2ab7d435fc
7 changed files with 256 additions and 258 deletions
+178 -178
View File
@@ -1,178 +1,178 @@
#include "mainwindow.h" #include "mainwindow.h"
#include "QPushButton" #include "QPushButton"
#include "QAction" #include "QAction"
#include "QHBoxLayout" #include "QHBoxLayout"
MainWindow::MainWindow(QWidget *parent) MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent) : QMainWindow(parent)
{ {
dlink = new DLink(); dlink = new DLink();
/* /*
connect(dlink->mavlinknode,&MavLinkNode::state_updated, connect(dlink->mavlinknode,&MavLinkNode::state_updated,
this,&MainWindow::updateUI); this,&MainWindow::updateUI);
*/ */
connect(dlink->mavlinknode,SIGNAL(state_updated()), connect(dlink->mavlinknode,SIGNAL(state_updated()),
this,SLOT(updateUI())); this,SLOT(updateUI()));
map = new mapcontrol::OPMapWidget(this); map = new mapcontrol::OPMapWidget(this);
map->SetShowHome(false); map->SetShowHome(false);
map->SetShowCompass(false); map->SetShowCompass(false);
map->SetUseOpenGL(true); map->SetUseOpenGL(true);
//QString maptype = myinifile->ReadIni("FGCS.ini","Map","Type"); //QString maptype = myinifile->ReadIni("FGCS.ini","Map","Type");
map->SetMapType(mapcontrol::Helper::MapTypeFromString("BingSatellite")); map->SetMapType(mapcontrol::Helper::MapTypeFromString("BingSatellite"));
map->setGeometry(0, map->setGeometry(0,
0, 0,
this->width(), this->width(),
this->height()); this->height());
nav = new QNavigationWidget(this); nav = new QNavigationWidget(this);
nav->setGeometry(0,0,50,this->height()); nav->setGeometry(0,0,50,this->height());
nav->setRowHeight(50); nav->setRowHeight(50);
nav->addItem(tr("DRV")); nav->addItem(tr("DRV"));
nav->addItem(tr("MAP")); nav->addItem(tr("MAP"));
nav->addItem(tr("CMD")); nav->addItem(tr("CMD"));
nav->addItem(tr("CHK")); nav->addItem(tr("CHK"));
nav->addItem(tr("WAY")); nav->addItem(tr("WAY"));
nav->addItem(tr("MIS")); nav->addItem(tr("MIS"));
nav->addItem(tr("DAT")); nav->addItem(tr("DAT"));
nav->addItem(tr("REP")); nav->addItem(tr("REP"));
nav->addItem(tr("COM")); nav->addItem(tr("COM"));
connect(nav,SIGNAL(ItemChanged(int)), connect(nav,SIGNAL(ItemChanged(int)),
this,SLOT(onTabIndexChanged(int))); this,SLOT(onTabIndexChanged(int)));
copk = new Cockpit(this); copk = new Cockpit(this);
copk->setGeometry(this->width() - copk->width(),0,300,340); copk->setGeometry(this->width() - copk->width(),0,300,340);
updateTimer = new QTimer(); updateTimer = new QTimer();
connect(updateTimer,&QTimer::timeout, connect(updateTimer,&QTimer::timeout,
this,&MainWindow::updateUI); this,&MainWindow::updateUI);
//updateTimer->start(20); updateTimer->start(200);
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
map->close(); map->close();
delete map; delete map;
copk->deleteLater(); copk->deleteLater();
delete copk; delete copk;
} }
void MainWindow::resizeEvent(QResizeEvent *e) void MainWindow::resizeEvent(QResizeEvent *e)
{ {
Q_UNUSED(e); Q_UNUSED(e);
map->setGeometry(0, map->setGeometry(0,
0, 0,
this->width(), this->width(),
this->height()); this->height());
nav->setGeometry(0,0,nav->width(),this->height()); nav->setGeometry(0,0,nav->width(),this->height());
copk->setGeometry(this->width() - copk->width(),0,copk->width(),copk->height()); copk->setGeometry(this->width() - copk->width(),0,copk->width(),copk->height());
} }
void MainWindow::onTabIndexChanged(const int &index) void MainWindow::onTabIndexChanged(const int &index)
{ {
if(index == 1) if(index == 1)
{ {
dlink_triggered(); dlink_triggered();
} }
else if (index == 2) else if (index == 2)
{ {
client_triggered(); client_triggered();
} }
} }
void MainWindow::dlink_triggered() void MainWindow::dlink_triggered()
{ {
if(dlink->statesPort()) if(dlink->statesPort())
{ {
disconnectdialog dlg(this); disconnectdialog dlg(this);
dlg.setWindowTitle(tr("SerialPort")); dlg.setWindowTitle(tr("SerialPort"));
//dlg.setWindowIcon(ui->action_dlink->icon()); //dlg.setWindowIcon(ui->action_dlink->icon());
int ret = dlg.exec(); int ret = dlg.exec();
if (QDialog::Accepted == ret) if (QDialog::Accepted == ret)
{ {
dlink->stopPort(); dlink->stopPort();
} }
} }
else else
{ {
ConnectDialog dlg(this); ConnectDialog dlg(this);
dlg.setWindowTitle(tr("SerialPort")); dlg.setWindowTitle(tr("SerialPort"));
//dlg.setWindowIcon(ui->action_dlink->icon()); //dlg.setWindowIcon(ui->action_dlink->icon());
dlg.baudrate = 115200; dlg.baudrate = 115200;
dlg.parity = QSerialPort::NoParity; dlg.parity = QSerialPort::NoParity;
int ret = dlg.exec(); int ret = dlg.exec();
if (QDialog::Accepted == ret) if (QDialog::Accepted == ret)
{ {
dlink->setupPort(dlg.port, dlg.baudrate,dlg.parity); dlink->setupPort(dlg.port, dlg.baudrate,dlg.parity);
//qDebug() << "setup serial port"; //qDebug() << "setup serial port";
} }
} }
} }
void MainWindow::client_triggered() void MainWindow::client_triggered()
{ {
ClientLinkDialog dlg(this); ClientLinkDialog dlg(this);
dlg.setWindowTitle(tr("ClientLink")); dlg.setWindowTitle(tr("ClientLink"));
//dlg.setWindowIcon(ui->action_dlink->icon()); //dlg.setWindowIcon(ui->action_dlink->icon());
int ret = dlg.exec(); int ret = dlg.exec();
if (QDialog::Accepted == ret) if (QDialog::Accepted == ret)
{ {
dlink->setupClient(dlg.remote_addr,dlg.remote_port,dlg.local_port); dlink->setupClient(dlg.remote_addr,dlg.remote_port,dlg.local_port);
} }
} }
void MainWindow::updateUI() void MainWindow::updateUI()
{ {
qDebug() << "updateUI"; //qDebug() << "updateUI";
copk->setAttitude(dlink->mavlinknode->vehicle.attitude.pitch * 57.3, copk->setAttitude(dlink->mavlinknode->vehicle.attitude.pitch * 57.3,
dlink->mavlinknode->vehicle.attitude.roll * 57.3, dlink->mavlinknode->vehicle.attitude.roll * 57.3,
dlink->mavlinknode->vehicle.attitude.yaw * 57.3); dlink->mavlinknode->vehicle.attitude.yaw * 57.3);
copk->setAltitude(dlink->mavlinknode->vehicle.gps_raw_int.alt * 10e-3 ); copk->setAltitude(dlink->mavlinknode->vehicle.gps_raw_int.alt * 10e-3 );
copk->setAirSpeed(dlink->mavlinknode->vehicle.airspeed_autocal.vx); copk->setAirSpeed(dlink->mavlinknode->vehicle.airspeed_autocal.vx);
} }
+20 -56
View File
@@ -13,11 +13,11 @@ MavLinkNode::MavLinkNode(QObject *parent) : QObject(parent)
Mission = new MissionProcess(); Mission = new MissionProcess();
Mission->setRunFrq(200); Mission->setRunFrq(200);
Mission->start(); //Mission->start();
Parameterthread = new QThread(); //Parameterthread = new QThread();
} }
@@ -200,52 +200,52 @@ void MavLinkNode::Mavlinkparse(quint32 src,QByteArray datagram)
switch(status.parse_state) switch(status.parse_state)
{ {
case MAVLINK_PARSE_STATE_UNINIT:{ case MAVLINK_PARSE_STATE_UNINIT:{
qDebug() << "MAVLINK_PARSE_STATE_UNINIT"; //qDebug() << "MAVLINK_PARSE_STATE_UNINIT";
}break; }break;
case MAVLINK_PARSE_STATE_IDLE:{ case MAVLINK_PARSE_STATE_IDLE:{
qDebug() << "MAVLINK_PARSE_STATE_IDLE"; //qDebug() << "MAVLINK_PARSE_STATE_IDLE";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_STX:{ case MAVLINK_PARSE_STATE_GOT_STX:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_STX"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_STX";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_LENGTH:{ case MAVLINK_PARSE_STATE_GOT_LENGTH:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_LENGTH"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_LENGTH";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_INCOMPAT_FLAGS:{ case MAVLINK_PARSE_STATE_GOT_INCOMPAT_FLAGS:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_INCOMPAT_FLAGS"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_INCOMPAT_FLAGS";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_COMPAT_FLAGS:{ case MAVLINK_PARSE_STATE_GOT_COMPAT_FLAGS:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_COMPAT_FLAGS"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_COMPAT_FLAGS";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_SEQ:{ case MAVLINK_PARSE_STATE_GOT_SEQ:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_SEQ"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_SEQ";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_SYSID:{ case MAVLINK_PARSE_STATE_GOT_SYSID:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_SYSID"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_SYSID";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_COMPID:{ case MAVLINK_PARSE_STATE_GOT_COMPID:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_COMPID"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_COMPID";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_MSGID1:{ case MAVLINK_PARSE_STATE_GOT_MSGID1:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_MSGID1"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_MSGID1";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_MSGID2:{ case MAVLINK_PARSE_STATE_GOT_MSGID2:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_MSGID2"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_MSGID2";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_MSGID3:{ case MAVLINK_PARSE_STATE_GOT_MSGID3:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_MSGID3"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_MSGID3";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_PAYLOAD:{ case MAVLINK_PARSE_STATE_GOT_PAYLOAD:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_PAYLOAD"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_PAYLOAD";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_CRC1:{ case MAVLINK_PARSE_STATE_GOT_CRC1:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_CRC1"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_CRC1";
}break; }break;
case MAVLINK_PARSE_STATE_GOT_BAD_CRC1:{ case MAVLINK_PARSE_STATE_GOT_BAD_CRC1:{
qDebug() << "MAVLINK_PARSE_STATE_GOT_BAD_CRC1"; //qDebug() << "MAVLINK_PARSE_STATE_GOT_BAD_CRC1";
}break; }break;
case MAVLINK_PARSE_STATE_SIGNATURE_WAIT:{ case MAVLINK_PARSE_STATE_SIGNATURE_WAIT:{
qDebug() << "MAVLINK_PARSE_STATE_SIGNATURE_WAIT"; //qDebug() << "MAVLINK_PARSE_STATE_SIGNATURE_WAIT";
}break; }break;
} }
} }
@@ -286,8 +286,9 @@ void MavLinkNode::MAVLinkRcv_Handler(mavlink_message_t msg)
//case MAVLINK_MSG_ID_MISSION_REQUEST: //case MAVLINK_MSG_ID_MISSION_REQUEST:
case MAVLINK_MSG_ID_MISSION_REQUEST_INT: case MAVLINK_MSG_ID_MISSION_REQUEST_INT:
case MAVLINK_MSG_ID_MISSION_ACK: case MAVLINK_MSG_ID_MISSION_ACK:
MissionParse(msg); Mission->MissionParse(msg);
break; break;
//参数 //参数
case MAVLINK_MSG_ID_PARAM_REQUEST_LIST: case MAVLINK_MSG_ID_PARAM_REQUEST_LIST:
case MAVLINK_MSG_ID_PARAM_REQUEST_READ: case MAVLINK_MSG_ID_PARAM_REQUEST_READ:
@@ -404,43 +405,6 @@ void MavLinkNode::CommandParse(mavlink_message_t msg)
} }
} }
void MavLinkNode::MissionParse(mavlink_message_t msg)
{
switch (msg.msgid) {
//航线部分
case MAVLINK_MSG_ID_MISSION_COUNT: {//飞控发来计数值,然后开始读取
mavlink_msg_mission_count_decode(&msg,&vehicle.mission_count);
//Mavlink_msg_mission_request_int(0);
}break;
case MAVLINK_MSG_ID_MISSION_ITEM: {
mavlink_msg_mission_item_decode(&msg,&vehicle.mission_item);
}break;
case MAVLINK_MSG_ID_MISSION_ITEM_INT: {
mavlink_msg_mission_item_int_decode(&msg,&vehicle.mission_item_int);
//emit mission_recieve_item(vehicle.mission_item_int);
if((vehicle.mission_count.count-1) >= (vehicle.mission_item_int.seq+1))
{
//Mavlink_msg_mission_request_int(vehicle.mission_item_int.seq + 1);
}
else {
//Mavlink_msg_mission_ack();
}
}break;
case MAVLINK_MSG_ID_MISSION_REQUEST: {
mavlink_msg_mission_request_decode(&msg,&vehicle.mission_request);
//emit mission_item_request(vehicle.mission_request.seq);
}break;
case MAVLINK_MSG_ID_MISSION_REQUEST_INT: {
mavlink_msg_mission_request_int_decode(&msg,&vehicle.mission_request_int);
//emit mission_item_request_int(vehicle.mission_request_int.seq);
}break;
}
}
+2 -8
View File
@@ -51,12 +51,6 @@ class MavLinkNode : public QObject
mavlink_vfr_hud_t vfr_hud; mavlink_vfr_hud_t vfr_hud;
mavlink_command_int_t command_int; mavlink_command_int_t command_int;
mavlink_mission_count_t mission_count;
mavlink_mission_item_t mission_item;
mavlink_mission_item_int_t mission_item_int;
mavlink_mission_request_t mission_request;
mavlink_mission_request_int_t mission_request_int;
mavlink_mission_ack_t mission_ack;
mavlink_param_set_t param_set;// mavlink_param_set_t param_set;//
mavlink_param_union_t param_union; mavlink_param_union_t param_union;
@@ -88,7 +82,7 @@ public:
signals: signals:
void state_updated(); void state_updated();
void parameter_updated(); void parameter_updated();
void mission_updated(); //void mission_updated();
public slots: public slots:
//线程对外接口 //线程对外接口
void setRunFrq(uint32_t frq); void setRunFrq(uint32_t frq);
@@ -115,7 +109,7 @@ private slots:
void StatusParse(mavlink_message_t msg); void StatusParse(mavlink_message_t msg);
void ParamParse(mavlink_message_t msg); void ParamParse(mavlink_message_t msg);
void CommandParse(mavlink_message_t msg); void CommandParse(mavlink_message_t msg);
void MissionParse(mavlink_message_t msg); //
protected: protected:
+42 -14
View File
@@ -2,17 +2,9 @@
MissionProcess::MissionProcess(QObject *parent) : QObject(parent) MissionProcess::MissionProcess(QObject *parent) : QObject(parent)
{ {
//mission thread
/*
Missionthread = new QThread();
this->moveToThread(Missionthread);
connect(Missionthread, &QThread::started, this, &MavLinkNode::process);
*/
} }
void MissionProcess::setRunFrq(uint32_t frq) void MissionProcess::setRunFrq(uint32_t frq)
{ {
if((frq != 0)||(frq <= 1000)) if((frq != 0)||(frq <= 1000))
@@ -22,7 +14,6 @@ void MissionProcess::setRunFrq(uint32_t frq)
} }
} }
void MissionProcess::start() void MissionProcess::start()
{ {
if(Missionthread == nullptr) if(Missionthread == nullptr)
@@ -44,7 +35,6 @@ void MissionProcess::start()
} }
} }
void MissionProcess::stop() void MissionProcess::stop()
{ {
if(Missionthread->isRunning()) if(Missionthread->isRunning())
@@ -58,8 +48,6 @@ void MissionProcess::stop()
} }
} }
//这里一直传输和接收航线信息
void MissionProcess::process()//线程函数 void MissionProcess::process()//线程函数
{ {
uint8_t count = 0; uint8_t count = 0;
@@ -67,14 +55,55 @@ void MissionProcess::process()//线程函数
{ {
count ++; count ++;
QThread::msleep(1000/running_frq); QThread::msleep(1000/running_frq);
//状态机
//如果要读取航线,线发送读取指令,然后等待返回,如果返回,那么启动线程进入循环接收
//如果要写入,那么先发,然后等待,如果反馈,那么继续发送,如果不反馈,发送10次,无响应超时
} }
//退出线程 //退出线程
Missionthread->quit(); Missionthread->quit();
Missionthread->deleteLater(); Missionthread->deleteLater();
Missionthread = nullptr; Missionthread = nullptr;
}
void MissionProcess::MissionParse(mavlink_message_t msg)
{
switch (msg.msgid) {
//航线部分
case MAVLINK_MSG_ID_MISSION_COUNT: {//飞控发来计数值,然后开始读取
mavlink_msg_mission_count_decode(&msg,&mission_count);
//Mavlink_msg_mission_request_int(0);
}break;
case MAVLINK_MSG_ID_MISSION_ITEM: {
mavlink_msg_mission_item_decode(&msg,&mission_item);
}break;
case MAVLINK_MSG_ID_MISSION_ITEM_INT: {
mavlink_msg_mission_item_int_decode(&msg,&mission_item_int);
//emit mission_recieve_item(vehicle.mission_item_int);
if((mission_count.count-1) >= (mission_item_int.seq+1))
{
//Mavlink_msg_mission_request_int(vehicle.mission_item_int.seq + 1);
}
else
{
//Mavlink_msg_mission_ack();
}
}break;
case MAVLINK_MSG_ID_MISSION_REQUEST: {
mavlink_msg_mission_request_decode(&msg,&mission_request);
//emit mission_item_request(vehicle.mission_request.seq);
}break;
case MAVLINK_MSG_ID_MISSION_REQUEST_INT: {
mavlink_msg_mission_request_int_decode(&msg,&mission_request_int);
//emit mission_item_request_int(vehicle.mission_request_int.seq);
}break;
}
} }
@@ -84,4 +113,3 @@ void MissionProcess::process()//线程函数
+14 -2
View File
@@ -6,7 +6,7 @@
#include "QDebug" #include "QDebug"
#include "QThread" #include "QThread"
#include "mavlink.h"
#ifdef QtMavlinkNode #ifdef QtMavlinkNode
#include <mavlinknodeglobal.h> #include <mavlinknodeglobal.h>
@@ -15,7 +15,6 @@ class MAVLINKNODESHARED_EXPORT MissionProcess : public QObject {
class MissionProcess : public QObject class MissionProcess : public QObject
{ {
#endif #endif
Q_OBJECT Q_OBJECT
public: public:
explicit MissionProcess(QObject *parent = nullptr); explicit MissionProcess(QObject *parent = nullptr);
@@ -27,6 +26,9 @@ public slots:
void start(); void start();
void stop(); void stop();
void MissionParse(mavlink_message_t msg);
private slots: private slots:
//线程私有接口 //线程私有接口
void process(); void process();
@@ -36,6 +38,16 @@ signals:
private: private:
mavlink_mission_count_t mission_count;
mavlink_mission_item_t mission_item;
mavlink_mission_item_int_t mission_item_int;
mavlink_mission_request_t mission_request;
mavlink_mission_request_int_t mission_request_int;
mavlink_mission_ack_t mission_ack;
bool running_flag = false; bool running_flag = false;
quint32 running_frq = 200;//200Hz quint32 running_frq = 200;//200Hz
QThread *Missionthread = nullptr; QThread *Missionthread = nullptr;
Binary file not shown.
Binary file not shown.