协同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);
dlink = new DLink();
nav = new QNavigationWidget(this);
copk = new Cockpit(this);
@@ -25,17 +29,29 @@ MainWindow::MainWindow(QWidget *parent)
nav->setRowHeight(50);
nav->addItem(tr("设备"));
nav->addItem(tr("地图"));
nav->addItem(tr("指令"));
nav->addItem(tr("检查"));
nav->addItem(tr("航线"));
nav->addItem(tr("任务"));
nav->addItem(tr("数据"));
nav->addItem(tr("回放"));
nav->addItem(tr("关于"));
nav->addItem(tr("DRV"));
nav->addItem(tr("MAP"));
nav->addItem(tr("CMD"));
nav->addItem(tr("CHK"));
nav->addItem(tr("WAY"));
nav->addItem(tr("MIS"));
nav->addItem(tr("DAT"));
nav->addItem(tr("REP"));
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();
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()
@@ -105,9 +131,6 @@ void MainWindow::dlink_triggered()
if (QDialog::Accepted == ret)
{
dlink->stopPort();
// statusBar()->showMessage(tr("SerialPort Disconnect"));
}
}
else
@@ -123,22 +146,26 @@ void MainWindow::dlink_triggered()
if (QDialog::Accepted == ret)
{
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 "Cockpit.h"
#include "dlink.h"
#include "clientlinkdialog.h"
#include "mavlinknode.h"
#pragma execution_character_set("utf-8")
@@ -38,15 +38,19 @@ public:
public slots:
void dlink_triggered();
void client_triggered();
protected:
void resizeEvent(QResizeEvent * e);
private slots:
void onTabIndexChanged(const int &index);
protected:
Cockpit *copk;
MavLinkNode *node;
QNavigationWidget *nav;
mapcontrol::OPMapWidget *map;
+13 -5
View File
@@ -2,9 +2,7 @@
MavLinkNode::MavLinkNode(QObject *parent) : QObject(parent)
{
running_flag = false;
Nodethread = new QThread();
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()
{
if(!Nodethread->isRunning())
@@ -61,17 +69,17 @@ void MavLinkNode::process()//线程函数
uint8_t count = 0;
while (running_flag) {
//qDebug() << "Process " << QThread::currentThreadId();
//qDebug() << "mavlink Process " << QThread::currentThreadId();
count ++;
//qDebug() << "run " << count << "ms";
QThread::msleep(20);//50Hz
QThread::msleep(1000/running_frq);//50Hz
}
//退出线程
Nodethread->quit();
}
void MavLinkNode::setbuff(QByteArray data)
void MavLinkNode::setbuff(uint32_t src,QByteArray data)
{
if(buff_select == 1)
{
+3 -2
View File
@@ -21,8 +21,8 @@ public:
explicit MavLinkNode(QObject *parent = nullptr);
~MavLinkNode();
void setRunFrq(uint32_t frq);
//void start();
signals:
@@ -35,11 +35,12 @@ public slots:
//对外的填充数据的接口
void setbuff(QByteArray data);
void setbuff(uint32_t src, QByteArray data);
protected:
bool running_flag = false;
quint32 running_frq = 10;//10Hz
QThread *Nodethread;
+68 -22
View File
@@ -7,11 +7,16 @@
DLink::DLink(QObject *parent) : QObject(parent)
{
qDebug() << "Dlink " << QThread::currentThreadId();
mavlinknode = new MavLinkNode();
}
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;
if (DLink::Clientsock)
{
DLink::Clientsock->writeDatagram((const char *)msg, len,
DLink::clientSockets.last().addr, DLink::clientSockets.last().port);
foreach(Node node,clientSockets)
{
DLink::Clientsock->writeDatagram((const char *)msg, len,
node.addr, node.port);
}
}
if (DLink::serialPort)
@@ -41,7 +49,7 @@ void DLink::setupPort(const QString port, qint32 baudrate, QSerialPort::Parity p
serialPort->close();
delete serialPort;
}
serialPort = new QSerialPort(port, this);
serialPort = new QSerialPort(port,this);
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->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
{
@@ -74,8 +86,7 @@ void DLink::stopPort()
void DLink::setupClient(const QHostAddress &remote_addr, int remote_port, int local_port)
{
{
Clientsock = new QUdpSocket(this);
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.addr = remote_addr;
node.port = remote_port;
clientSockets.append(node);
qDebug() << "sock open:"
qDebug() << "UdpSocket open:"
<< remote_addr
<< local_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
{
@@ -112,40 +152,35 @@ void DLink::readPendingDatagramsSerialPort(void)
{
QByteArray datagram = serialPort->readAll();
//static mavlink_message_t msg;
//static mavlink_status_t status;
uint8_t ret = '\0';
SendMessageTo(ret,(uint8_t *)datagram.data(),datagram.size());
mavlinknode->setbuff(SourceType::s_port,datagram);
/*
for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i)
{
/*
ret = mavlink_parse_char(MAVLINK_COMM_0,*i,&msg,&status);
if(MAVLINK_FRAMING_OK == ret)
{
MAVLinkRcv_Handler(msg); //接收完一帧数据并处理
}
*/
}
*/
}
void DLink::readPendingDatagramsClient(void)
{
//轮番查询
while (Clientsock->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(Clientsock->pendingDatagramSize());
Clientsock->readDatagram(datagram.data(), datagram.size());
mavlinknode->setbuff(SourceType::c_sock,datagram);
//SendMessageTo(ret,(uint8_t *)datagram.data(),datagram.size());
//qDebug() << "Client Read All" << datagram;
/*
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 <QUdpSocket>
#include "QDebug"
#include "mavlinknode.h"
//#include "mavlink/ardupilotmega/mavlink.h"
@@ -91,6 +92,7 @@ signals:
public slots:
void readPendingDatagramsSerialPort(void);
void readPendingDatagramsClient(void);
@@ -99,6 +101,12 @@ public slots:
private:
enum SourceType{
s_port = 0,
c_sock = 1
};
QSerialPort *serialPort = nullptr;
QUdpSocket *Clientsock = nullptr;
@@ -106,6 +114,8 @@ private:
QList<Node> clientSockets;
MavLinkNode *mavlinknode = nullptr;
+8 -1
View File
@@ -3,7 +3,7 @@ QT += serialport
QT += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
TARGET = Dlink
TEMPLATE = lib
@@ -16,6 +16,7 @@ CONFIG += plugin \
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
@@ -35,6 +36,12 @@ HEADERS += \
SOURCES += \
$$PWD/dlink.cpp
#加入第三方库
INCLUDEPATH += $$PWD/../thirdpart/include
LIBS += -L$$PWD/../thirdpart/lib -lMavLinkNode
DESTDIR = $$PWD/../thirdpart/lib
+1 -1
View File
@@ -257,7 +257,7 @@ void QNavigationWidget::mousePressEvent(QMouseEvent *e)
{
currentIndex = e->y() / rowHeight;
emit currentItemChanged(currentIndex);
emit ItemChanged(currentIndex);
update();
}
+5 -2
View File
@@ -30,6 +30,10 @@ public:
int Index(void);
signals:
void ItemChanged(const int &index);
protected:
void paintEvent(QPaintEvent *);
void mouseMoveEvent(QMouseEvent *);
@@ -57,8 +61,7 @@ private:
bool isHidden = false;
signals:
void currentItemChanged(const int &index);
};
#endif