协同dlink和mavlink

This commit is contained in:
hm
2020-02-26 23:28:44 +08:00
parent 9502eecea5
commit 2e379ee660
9 changed files with 166 additions and 60 deletions
+51 -24
View File
@@ -14,6 +14,10 @@ MainWindow::MainWindow(QWidget *parent)
//ui->maintoolBar->addAction(ui->action); //ui->maintoolBar->addAction(ui->action);
dlink = new DLink();
nav = new QNavigationWidget(this); nav = new QNavigationWidget(this);
copk = new Cockpit(this); copk = new Cockpit(this);
@@ -25,17 +29,29 @@ MainWindow::MainWindow(QWidget *parent)
nav->setRowHeight(50); nav->setRowHeight(50);
nav->addItem(tr("设备")); nav->addItem(tr("DRV"));
nav->addItem(tr("地图")); nav->addItem(tr("MAP"));
nav->addItem(tr("指令")); nav->addItem(tr("CMD"));
nav->addItem(tr("检查")); nav->addItem(tr("CHK"));
nav->addItem(tr("航线")); nav->addItem(tr("WAY"));
nav->addItem(tr("任务")); nav->addItem(tr("MIS"));
nav->addItem(tr("数据")); nav->addItem(tr("DAT"));
nav->addItem(tr("回放")); nav->addItem(tr("REP"));
nav->addItem(tr("关于")); nav->addItem(tr("COM"));
/*
connect(nav,SIGNAL(currentItemChanged(const int &index)),
this,SLOT(onTabIndexChanged(const int &index)));
*/
connect(nav,SIGNAL(ItemChanged(int)),
this,SLOT(onTabIndexChanged(int)));
//connect(nav,&QNavigationWidget::currentItemChanged,
// this,&MainWindow::onTabIndexChanged);
node = new MavLinkNode();
//node->start(); //node->start();
qDebug() << "mainwindow " << QThread::currentThreadId(); qDebug() << "mainwindow " << QThread::currentThreadId();
@@ -89,7 +105,17 @@ void MainWindow::resizeEvent(QResizeEvent *e)
} }
void MainWindow::onTabIndexChanged(const int &index)
{
if(index == 1)
{
dlink_triggered();
}
else if (index == 2)
{
client_triggered();
}
}
void MainWindow::dlink_triggered() void MainWindow::dlink_triggered()
@@ -105,9 +131,6 @@ void MainWindow::dlink_triggered()
if (QDialog::Accepted == ret) if (QDialog::Accepted == ret)
{ {
dlink->stopPort(); dlink->stopPort();
// statusBar()->showMessage(tr("SerialPort Disconnect"));
} }
} }
else else
@@ -123,22 +146,26 @@ void MainWindow::dlink_triggered()
if (QDialog::Accepted == ret) if (QDialog::Accepted == ret)
{ {
dlink->setupPort(dlg.port, dlg.baudrate,dlg.parity); dlink->setupPort(dlg.port, dlg.baudrate,dlg.parity);
//statusBar()->showMessage(tr("SerialPort Connected:") + dlg.port + tr(",") + QString::number(dlg.baudrate));
node->start();
}
else
{
node->stop();
} }
} }
} }
void MainWindow::client_triggered()
{
ClientLinkDialog dlg(this);
dlg.setWindowTitle(tr("ClientLink"));
//dlg.setWindowIcon(ui->action_dlink->icon());
int ret = dlg.exec();
if (QDialog::Accepted == ret)
{
dlink->setupClient(dlg.remote_addr,dlg.remote_port,dlg.local_port);
}
}
+7 -3
View File
@@ -17,7 +17,7 @@
#include "opmapwidget.h" #include "opmapwidget.h"
#include "Cockpit.h" #include "Cockpit.h"
#include "dlink.h" #include "dlink.h"
#include "clientlinkdialog.h"
#include "mavlinknode.h" #include "mavlinknode.h"
#pragma execution_character_set("utf-8") #pragma execution_character_set("utf-8")
@@ -38,15 +38,19 @@ public:
public slots: public slots:
void dlink_triggered(); void dlink_triggered();
void client_triggered();
protected: protected:
void resizeEvent(QResizeEvent * e); void resizeEvent(QResizeEvent * e);
private slots:
void onTabIndexChanged(const int &index);
protected: protected:
Cockpit *copk; Cockpit *copk;
MavLinkNode *node;
QNavigationWidget *nav; QNavigationWidget *nav;
mapcontrol::OPMapWidget *map; mapcontrol::OPMapWidget *map;
+13 -5
View File
@@ -2,9 +2,7 @@
MavLinkNode::MavLinkNode(QObject *parent) : QObject(parent) MavLinkNode::MavLinkNode(QObject *parent) : QObject(parent)
{ {
running_flag = false; running_flag = false;
Nodethread = new QThread(); Nodethread = new QThread();
this->moveToThread(Nodethread); this->moveToThread(Nodethread);
@@ -25,6 +23,16 @@ MavLinkNode::~MavLinkNode()
} }
} }
void MavLinkNode::setRunFrq(uint32_t frq)
{
if((frq != 0)||(frq <= 1000))
{
running_frq = frq;
qDebug() << "set running frquency:" <<frq <<"Hz";
}
}
void MavLinkNode::start() void MavLinkNode::start()
{ {
if(!Nodethread->isRunning()) if(!Nodethread->isRunning())
@@ -61,17 +69,17 @@ void MavLinkNode::process()//线程函数
uint8_t count = 0; uint8_t count = 0;
while (running_flag) { while (running_flag) {
//qDebug() << "Process " << QThread::currentThreadId(); //qDebug() << "mavlink Process " << QThread::currentThreadId();
count ++; count ++;
//qDebug() << "run " << count << "ms"; //qDebug() << "run " << count << "ms";
QThread::msleep(20);//50Hz QThread::msleep(1000/running_frq);//50Hz
} }
//退出线程 //退出线程
Nodethread->quit(); Nodethread->quit();
} }
void MavLinkNode::setbuff(QByteArray data) void MavLinkNode::setbuff(uint32_t src,QByteArray data)
{ {
if(buff_select == 1) if(buff_select == 1)
{ {
+3 -2
View File
@@ -21,8 +21,8 @@ public:
explicit MavLinkNode(QObject *parent = nullptr); explicit MavLinkNode(QObject *parent = nullptr);
~MavLinkNode(); ~MavLinkNode();
void setRunFrq(uint32_t frq);
//void start();
signals: signals:
@@ -35,11 +35,12 @@ public slots:
//对外的填充数据的接口 //对外的填充数据的接口
void setbuff(QByteArray data); void setbuff(uint32_t src, QByteArray data);
protected: protected:
bool running_flag = false; bool running_flag = false;
quint32 running_frq = 10;//10Hz
QThread *Nodethread; QThread *Nodethread;
+68 -22
View File
@@ -7,11 +7,16 @@
DLink::DLink(QObject *parent) : QObject(parent) DLink::DLink(QObject *parent) : QObject(parent)
{ {
qDebug() << "Dlink " << QThread::currentThreadId();
mavlinknode = new MavLinkNode();
} }
DLink::~DLink() DLink::~DLink()
{ {
mavlinknode->stop();
delete mavlinknode;
} }
@@ -20,8 +25,11 @@ int DLink::SendMessageTo(uint8_t, uint8_t *msg, uint16_t len)
//mavlinknode::bytes_num_out += len; //mavlinknode::bytes_num_out += len;
if (DLink::Clientsock) if (DLink::Clientsock)
{ {
DLink::Clientsock->writeDatagram((const char *)msg, len, foreach(Node node,clientSockets)
DLink::clientSockets.last().addr, DLink::clientSockets.last().port); {
DLink::Clientsock->writeDatagram((const char *)msg, len,
node.addr, node.port);
}
} }
if (DLink::serialPort) if (DLink::serialPort)
@@ -41,7 +49,7 @@ void DLink::setupPort(const QString port, qint32 baudrate, QSerialPort::Parity p
serialPort->close(); serialPort->close();
delete serialPort; delete serialPort;
} }
serialPort = new QSerialPort(port, this); serialPort = new QSerialPort(port,this);
if (serialPort->open(QIODevice::ReadWrite)) if (serialPort->open(QIODevice::ReadWrite))
{ {
@@ -50,7 +58,11 @@ void DLink::setupPort(const QString port, qint32 baudrate, QSerialPort::Parity p
serialPort->setDataBits(QSerialPort::Data8); serialPort->setDataBits(QSerialPort::Data8);
serialPort->setStopBits(QSerialPort::OneStop); serialPort->setStopBits(QSerialPort::OneStop);
connect(serialPort, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams())); mavlinknode->start();
connect(serialPort, SIGNAL(readyRead()), this, SLOT(readPendingDatagramsSerialPort()));
qDebug() << "Serial Port Open Success";
} }
else else
{ {
@@ -74,8 +86,7 @@ void DLink::stopPort()
void DLink::setupClient(const QHostAddress &remote_addr, int remote_port, int local_port) void DLink::setupClient(const QHostAddress &remote_addr, int remote_port, int local_port)
{ {
Clientsock = new QUdpSocket(this); Clientsock = new QUdpSocket(this);
if (Clientsock->bind(QHostAddress::Any, local_port)) if (Clientsock->bind(QHostAddress::Any, local_port))
{ {
@@ -87,11 +98,40 @@ void DLink::setupClient(const QHostAddress &remote_addr, int remote_port, int lo
node.sock = Clientsock; node.sock = Clientsock;
node.addr = remote_addr; node.addr = remote_addr;
node.port = remote_port; node.port = remote_port;
clientSockets.append(node); clientSockets.append(node);
qDebug() << "sock open:" qDebug() << "UdpSocket open:"
<< remote_addr << remote_addr
<< local_port << local_port
<< remote_port; << remote_port;
mavlinknode->start();
//想办法只让这个UDP打开一次
/*
foreach(Node nodex,clientSockets)
{
qDebug() << "in";
//如果不存在就添加进去
if((nodex.sock == node.sock)&&
(nodex.addr == node.addr)&&
(nodex.port == node.port))
{
continue;
}
else {
clientSockets.append(node);
qDebug() << "sock open:"
<< remote_addr
<< local_port
<< remote_port;
}
}
*/
} }
else else
{ {
@@ -112,40 +152,35 @@ void DLink::readPendingDatagramsSerialPort(void)
{ {
QByteArray datagram = serialPort->readAll(); QByteArray datagram = serialPort->readAll();
//static mavlink_message_t msg; mavlinknode->setbuff(SourceType::s_port,datagram);
//static mavlink_status_t status;
uint8_t ret = '\0';
SendMessageTo(ret,(uint8_t *)datagram.data(),datagram.size());
/*
for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i) for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i)
{ {
/*
ret = mavlink_parse_char(MAVLINK_COMM_0,*i,&msg,&status); ret = mavlink_parse_char(MAVLINK_COMM_0,*i,&msg,&status);
if(MAVLINK_FRAMING_OK == ret) if(MAVLINK_FRAMING_OK == ret)
{ {
MAVLinkRcv_Handler(msg); //接收完一帧数据并处理 MAVLinkRcv_Handler(msg); //接收完一帧数据并处理
} }
*/
} }
*/
} }
void DLink::readPendingDatagramsClient(void) void DLink::readPendingDatagramsClient(void)
{ {
//轮番查询
while (Clientsock->hasPendingDatagrams()) { while (Clientsock->hasPendingDatagrams()) {
QByteArray datagram; QByteArray datagram;
datagram.resize(Clientsock->pendingDatagramSize()); datagram.resize(Clientsock->pendingDatagramSize());
Clientsock->readDatagram(datagram.data(), datagram.size()); Clientsock->readDatagram(datagram.data(), datagram.size());
mavlinknode->setbuff(SourceType::c_sock,datagram);
//SendMessageTo(ret,(uint8_t *)datagram.data(),datagram.size()); //SendMessageTo(ret,(uint8_t *)datagram.data(),datagram.size());
//qDebug() << "Client Read All" << datagram;
/* /*
for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i) for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i)
{ {
@@ -159,3 +194,14 @@ void DLink::readPendingDatagramsClient(void)
} }
} }
+10
View File
@@ -6,6 +6,7 @@
#include <QHostAddress> #include <QHostAddress>
#include <QUdpSocket> #include <QUdpSocket>
#include "QDebug" #include "QDebug"
#include "mavlinknode.h"
//#include "mavlink/ardupilotmega/mavlink.h" //#include "mavlink/ardupilotmega/mavlink.h"
@@ -91,6 +92,7 @@ signals:
public slots: public slots:
void readPendingDatagramsSerialPort(void); void readPendingDatagramsSerialPort(void);
void readPendingDatagramsClient(void); void readPendingDatagramsClient(void);
@@ -99,6 +101,12 @@ public slots:
private: private:
enum SourceType{
s_port = 0,
c_sock = 1
};
QSerialPort *serialPort = nullptr; QSerialPort *serialPort = nullptr;
QUdpSocket *Clientsock = nullptr; QUdpSocket *Clientsock = nullptr;
@@ -106,6 +114,8 @@ private:
QList<Node> clientSockets; QList<Node> clientSockets;
MavLinkNode *mavlinknode = nullptr;
+8 -1
View File
@@ -3,7 +3,7 @@ QT += serialport
QT += network QT += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
TARGET = Dlink TARGET = Dlink
TEMPLATE = lib TEMPLATE = lib
@@ -16,6 +16,7 @@ CONFIG += plugin \
# The following define makes your compiler emit warnings if you use # The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings # any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the # depend on your compiler). Please consult the documentation of the
@@ -35,6 +36,12 @@ HEADERS += \
SOURCES += \ SOURCES += \
$$PWD/dlink.cpp $$PWD/dlink.cpp
#加入第三方库
INCLUDEPATH += $$PWD/../thirdpart/include
LIBS += -L$$PWD/../thirdpart/lib -lMavLinkNode
DESTDIR = $$PWD/../thirdpart/lib DESTDIR = $$PWD/../thirdpart/lib
+1 -1
View File
@@ -257,7 +257,7 @@ void QNavigationWidget::mousePressEvent(QMouseEvent *e)
{ {
currentIndex = e->y() / rowHeight; currentIndex = e->y() / rowHeight;
emit currentItemChanged(currentIndex); emit ItemChanged(currentIndex);
update(); update();
} }
+5 -2
View File
@@ -30,6 +30,10 @@ public:
int Index(void); int Index(void);
signals:
void ItemChanged(const int &index);
protected: protected:
void paintEvent(QPaintEvent *); void paintEvent(QPaintEvent *);
void mouseMoveEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *);
@@ -57,8 +61,7 @@ private:
bool isHidden = false; bool isHidden = false;
signals:
void currentItemChanged(const int &index);
}; };
#endif #endif