串口调通,采用在其他线程的模式

This commit is contained in:
hm
2020-08-17 21:10:24 +08:00
parent 8b4142163a
commit 097b9a7056
19 changed files with 563 additions and 330 deletions
+49 -1
View File
@@ -67,6 +67,8 @@ CommandUI::CommandUI(QWidget *parent) :
btn->setText(info.toObject().find(_TextJsonKey).value().toString());
//btn->setMinimumSize(CMDwidth,CMDheight);
//btn->resize(CMDwidth,CMDheight);
btn->setFixedSize(CMDwidth,CMDheight);
ui->gridLayout_Command->addWidget(btn,
@@ -91,7 +93,28 @@ CommandUI::~CommandUI()
delete ui;
}
void CommandUI::wheelEvent(QWheelEvent *e)
{
QObjectList list = ui->groupBox_Command->children();
foreach (QObject *obj, list) {
QPushButton *btn = qobject_cast<QPushButton *>(obj);
if(btn)
{
qreal width = btn->width();
qreal height = btn->height();
if(e->delta() > 0)
{
btn->resize(width - 1,height - 1);
}
else if(e->delta() < 0)
{
btn->resize(width + 1,height + 1);
}
}
}
}
void CommandUI::loadCommandJson(const QString& jsonFilename)
{
@@ -363,7 +386,32 @@ void CommandUI::commandAccepted(bool flag,uint16_t command,uint8_t result)
}
//专门为航点设计的一个确认窗口
void CommandUI::setCurrent(QVariant value)
{
if(value.toBool() == true)
{
emit SetCurrentPoint(currentSeq);
}
}
void CommandUI::missionConfirm(int seq)
{
currentSeq = seq;
//根据这个comfirm 确定要输入的参数
Confirm *confirmor = new Confirm(this);
confirmor->setGeometry(0,0,this->width(),this->height());
//设置警告界面
confirmor->setNotice(tr("click confirm to set Point %1 as current point").arg(seq));
connect(confirmor,SIGNAL(confirmValue(QVariant)),
this,SLOT(setCurrent(QVariant)));
confirmor->show();
}
+12 -1
View File
@@ -23,6 +23,7 @@
#include "CharInputter.h"
#include "Confirm.h"
#include "QMouseEvent"
#include "mavlink.h"
@@ -45,14 +46,20 @@ public:
explicit CommandUI(QWidget *parent = nullptr);
~CommandUI();
protected:
void wheelEvent(QWheelEvent *e);
public slots:
void commandAccepted(bool flag,uint16_t command,uint8_t result);
void missionConfirm(int seq);
signals:
void SetCurrentPoint(int seq);
void cmd_int(float param1, float param2, float param3, float param4, int x, int y, float z);
void cmd_long( float param1,float param2,float param3,float param4,float param5,float param6,float param7,uint16_t command,uint8_t confirmation);
@@ -63,6 +70,8 @@ private slots:
void setSecondConfirm(QVariant value);
void setCurrent(QVariant value);
protected:
void loadCommandJson(const QString& jsonFilename);
@@ -118,6 +127,8 @@ private:
int currentSeq = 0;
};
#endif // COMMANDUI_H
+68 -32
View File
@@ -8,6 +8,8 @@ Chart::Chart(QChart *chart, QWidget *parent)
chart->legend()->setMarkerShape(QLegend::MarkerShapeCircle);
chart->setTheme(QChart::ChartThemeLight);
//chart->setPlotArea(this->geometry());
QValueAxis *axisX = new QValueAxis();
axisX->setRange(-5, 5);
axisX->setTickCount(11);
@@ -24,12 +26,15 @@ Chart::Chart(QChart *chart, QWidget *parent)
setChart(chart);
//默认不使用,因为使用显卡加速图形会闪
setUseOpenGL(false);
setUseOpenGL(false);
updateTimer = new QTimer(this);
connect(updateTimer,SIGNAL(timeout()),
this,SLOT(timeout()));
updateTimer->start(50);//20hz刷新
if(!updateTimer)
{
updateTimer = new QTimer(this);
connect(updateTimer,SIGNAL(timeout()),
this,SLOT(timeout()));
updateTimer->start(50);//20hz刷新
}
}
@@ -40,6 +45,8 @@ Chart::Chart(QWidget *parent)
chart()->legend()->setMarkerShape(QLegend::MarkerShapeCircle);
chart()->setTheme(QChart::ChartThemeLight);
//chart()->setPlotArea(this->geometry());
QValueAxis *axisX = new QValueAxis();
axisX->setRange(-5, 5);
axisX->setTickCount(11);
@@ -53,12 +60,15 @@ Chart::Chart(QWidget *parent)
chart()->addAxis(axisY, Qt::AlignLeft);
//默认不使用,因为使用显卡加速图形会闪
setUseOpenGL(false);
setUseOpenGL(false);
updateTimer = new QTimer(this);
connect(updateTimer,SIGNAL(timeout()),
this,SLOT(timeout()));
updateTimer->start(50);//20hz刷新
if(!updateTimer)
{
updateTimer = new QTimer(this);
connect(updateTimer,SIGNAL(timeout()),
this,SLOT(timeout()));
updateTimer->start(50);//20hz刷新
}
}
@@ -79,9 +89,23 @@ void Chart::leaveEvent(QEvent *e)
{
isPress = false;
setCursor(Qt::ArrowCursor);
//QChartView::leaveEvent(e);
QChartView::leaveEvent(e);
}
void Chart::hideEvent(QHideEvent *e)
{
qDebug() << e;
}
void Chart::showEvent(QShowEvent *e)
{
qDebug() << e;
}
void Chart::mouseMoveEvent(QMouseEvent *e)
{
const QPoint curPos = e->pos();
@@ -91,14 +115,14 @@ void Chart::mouseMoveEvent(QMouseEvent *e)
lastPoint = curPos;
chart()->scroll(-offset.x(), offset.y());
}
//QChartView::mouseMoveEvent(e);
QChartView::mouseMoveEvent(e);
}
void Chart::mouseReleaseEvent(QMouseEvent *e)
{
isPress = false;
setCursor(Qt::ArrowCursor);
//QChartView::mouseReleaseEvent(e);
QChartView::mouseReleaseEvent(e);
}
void Chart::mousePressEvent(QMouseEvent *e)
@@ -109,13 +133,16 @@ void Chart::mousePressEvent(QMouseEvent *e)
isPress = true;
setCursor(Qt::ClosedHandCursor);
}
//QChartView::mousePressEvent(e);
QChartView::mousePressEvent(e);
}
void Chart::mouseDoubleClickEvent(QMouseEvent *e)
{
qDebug() << "Chart double clicked" << e;
//QChartView::mouseDoubleClickEvent(e);
//双击生成一个标
QChartView::mouseDoubleClickEvent(e);
}
void Chart::wheelEvent(QWheelEvent *e)
@@ -183,17 +210,19 @@ void Chart::wheelEvent(QWheelEvent *e)
}
}
}
//QChartView::wheelEvent(e);
QChartView::wheelEvent(e);
}
void Chart::resizeEvent(QResizeEvent *e)
{
//qDebug() << e;
//Q_UNUSED(e)
chart()->setPos(0,0);
chart()->setGeometry(this->geometry());
//chart()->setPlotArea(this->geometry());
}
void Chart::timeout(void)//100Hz
{
timeseries += 0.01;
@@ -207,16 +236,15 @@ void Chart::chartUpdate(void)
{
//读取新数据,如果没有,那就保持
//滚动显示器
//当到达最大时(0.95),开始滚动
if(isScroll() == true)
{
QValueAxis *axis = dynamic_cast<QValueAxis*>(chart()->axisX());
qreal dwidth = chart()->plotArea().width()/(axis->tickCount() - 1);
if(timeseries > (axis->min() + (axis->max() - axis->min()) * 0.95))
const double Min = axis->min();
const double Max = axis->max();
if(timeseries > (Min + (Max - Min) * 0.95))
{
chart()->scroll(dwidth * 0.01,0);//每次增加0.01
chart()->axisX()->setRange(Min + 0.01,Max + 0.01);
}
}
}
@@ -245,7 +273,7 @@ bool Chart::addSeries(QString name = tr("new"))
QLineSeries *s = new QLineSeries();
s->setColor(ColorMap::Color[ChannelIndex]);
s->setName(name);
s->append(timeseries,0);
//s->append(timeseries,0);
s->setUseOpenGL(isOpenGL);
chart()->addSeries(s);
chart()->setAxisX(chart()->axisX(),s);
@@ -288,7 +316,7 @@ bool Chart::addSeries(QString name = tr("new"), int index = 0)
QLineSeries *s = new QLineSeries();
s->setColor(ColorMap::Color[ChannelIndex]);
s->setName(name);
s->append(timeseries,0);
//s->append(timeseries,0);
s->setUseOpenGL(isOpenGL);
chart()->addSeries(s);
chart()->setAxisX(chart()->axisX(),s);
@@ -325,7 +353,7 @@ bool Chart::addSeries(QString name = tr("new"),QColor color = QColor("#FFFFFF"))
QLineSeries *s = new QLineSeries();
s->setColor(color);
s->setName(name);
s->append(timeseries,0);
//s->append(timeseries,0);
s->setUseOpenGL(isOpenGL);
chart()->addSeries(s);
chart()->setAxisX(chart()->axisX(),s);
@@ -356,20 +384,19 @@ void Chart::setSerieData(QString name,QVariant data)
{
//设置最大值
const double Min = axis->min();
chart()->axisY()->setRange(Min, data.toDouble() * 1.1);
double FreeArea = (data.toDouble() - Min) * 0.1;
chart()->axisY()->setRange(Min, data.toDouble() + FreeArea);
}
else if(data.toDouble() < axis->min())
{
//设置最小值
const double Max = axis->max();
chart()->axisY()->setRange(data.toDouble() * 1.1, Max);
double FreeArea = (Max - data.toDouble()) * 0.1;
chart()->axisY()->setRange(data.toDouble() - FreeArea, Max);
}
}
//获取当前的时间撮
//series->append(timeseries,data.toFloat());
//查找有没有这个名字的序列
bool isContain = false;
QList<QAbstractSeries *> slist = chart()->series();
@@ -392,6 +419,16 @@ void Chart::setSerieData(QString name,QVariant data)
{
ChannelIndex = 0;
}
QList<QAbstractSeries *> slist = chart()->series();
for(QAbstractSeries *serie:slist)
{
QLineSeries *s = qobject_cast<QLineSeries *>(serie);
if(s->name() == name)
{
s->append(timeseries,data.toDouble());
}
}
}
}
@@ -410,7 +447,6 @@ void Chart::removeSerie(QString name)
s->clear();
s->deleteLater();
delete s;
}
}
}
+2
View File
@@ -68,6 +68,8 @@ public:
protected:
void hideEvent(QHideEvent *e);
void showEvent(QShowEvent *e);
void leaveEvent(QEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
+6 -6
View File
@@ -36,27 +36,27 @@ Scope::~Scope()
void Scope::mouseMoveEvent(QMouseEvent *e)
{
//QWidget::mouseMoveEvent(e);
QWidget::mouseMoveEvent(e);
}
void Scope::mouseReleaseEvent(QMouseEvent *e)
{
//QWidget::mouseReleaseEvent(e);
QWidget::mouseReleaseEvent(e);
}
void Scope::mousePressEvent(QMouseEvent *e)
{
//QWidget::mousePressEvent(e);
QWidget::mousePressEvent(e);
}
void Scope::mouseDoubleClickEvent(QMouseEvent *e)
{
//QWidget::mouseDoubleClickEvent(e);
QWidget::mouseDoubleClickEvent(e);
}
void Scope::wheelEvent(QWheelEvent *e)
{
//QWidget::wheelEvent(e);
QWidget::wheelEvent(e);
}
void Scope::resizeEvent(QResizeEvent *e)
@@ -65,7 +65,7 @@ void Scope::resizeEvent(QResizeEvent *e)
{
chartView->setGeometry(ui->frame->geometry());
}
//QWidget::resizeEvent(e);
QWidget::resizeEvent(e);
}
void Scope::on_pushButton_Pause_clicked()
+37 -8
View File
@@ -16,6 +16,7 @@ MainWindow::MainWindow(QWidget *parent)
qmlDir->mkdir("./qml");//如果文件夹不存在就新建
setFocusPolicy(Qt::StrongFocus);
setAttribute(Qt::WA_AcceptTouchEvents);
@@ -205,9 +206,17 @@ MainWindow::MainWindow(QWidget *parent)
connect(dlink->mavlinknode->Mission,SIGNAL(sendItemOK(uint16_t,bool)),
map,SLOT(WPSendItemOK(uint16_t,bool)),Qt::DirectConnection);
//航点确认窗口
connect(map,SIGNAL(setCurrent(int)),
commandUI,SLOT(missionConfirm(int)),Qt::DirectConnection);
connect(commandUI,SIGNAL(SetCurrentPoint(int)),
dlink->mavlinknode->Mission,SLOT(SetCurrentPoint(int)),Qt::DirectConnection);
connect(dlink->mavlinknode->Mission,SIGNAL(currentPoint(int)),
map,SLOT(WPSetCurrent(int)),Qt::DirectConnection);
@@ -237,6 +246,11 @@ MainWindow::~MainWindow()
delete map;
}
if(dlink)
{
//dlink->stopPort();
delete dlink;
}
if(copk)
{
@@ -396,7 +410,7 @@ void MainWindow::keyPressEvent(QKeyEvent *event) //键盘按下事件
{
if(event->modifiers() == Qt::AltModifier)
{
map->DeleteTrail();
}
}
break;
@@ -544,8 +558,8 @@ void MainWindow::updateUI()//事件驱动式更新数据
dlink->mavlinknode->vehicle.attitude.roll * 57.3,
dlink->mavlinknode->vehicle.attitude.yaw * 57.3);
copk->setAltitude(dlink->mavlinknode->vehicle.gps_raw_int.alt * 10e-4 );
copk->setAltitudeTarget(dlink->mavlinknode->vehicle.gps_raw_int.alt * 10e-4
copk->setAltitude(dlink->mavlinknode->vehicle.global_position_int.relative_alt * 10e-4);
copk->setAltitudeTarget(dlink->mavlinknode->vehicle.global_position_int.relative_alt * 10e-4
+dlink->mavlinknode->vehicle.nav_controller_output.alt_error);
copk->setAirSpeed(dlink->mavlinknode->vehicle.vfr_hud.airspeed,2);
@@ -565,6 +579,7 @@ void MainWindow::updateUI()//事件驱动式更新数据
copk->setYawTarget(dlink->mavlinknode->vehicle.nav_controller_output.nav_bearing);
QString gps_str;
gps_str.clear();
@@ -599,6 +614,12 @@ void MainWindow::updateUI()//事件驱动式更新数据
if(state != state_old)
{
isStateChanged = true;
//解锁后清除航迹
if(state == MAV_MODE_FLAG::MAV_MODE_FLAG_SAFETY_ARMED)
{
map->DeleteTrail();
}
}
else
{
@@ -703,11 +724,19 @@ void MainWindow::updateUI()//事件驱动式更新数据
map->setUAVPos(dlink->mavlinknode->vehicle.sysid,
dlink->mavlinknode->vehicle.compid,
(double)(dlink->mavlinknode->vehicle.gps_raw_int.lat * 10e-8),
(double)(dlink->mavlinknode->vehicle.gps_raw_int.lon * 10e-8),
(double)(dlink->mavlinknode->vehicle.gps_raw_int.alt * 10e-4));
//经纬度大于正常值,将舍弃
double lat = (double)(dlink->mavlinknode->vehicle.gps_raw_int.lat * 10e-8);
double lng = (double)(dlink->mavlinknode->vehicle.gps_raw_int.lon * 10e-8);
if(((lat > -90)&&(lat < 90))&&((lng > -180)&&(lng < 180)))
{
map->setUAVPos(dlink->mavlinknode->vehicle.sysid,
dlink->mavlinknode->vehicle.compid,
(double)(dlink->mavlinknode->vehicle.gps_raw_int.lat * 10e-8),
(double)(dlink->mavlinknode->vehicle.gps_raw_int.lon * 10e-8),
(double)(dlink->mavlinknode->vehicle.gps_raw_int.alt * 10e-4));
}
map->setUAVHeading(dlink->mavlinknode->vehicle.sysid,
dlink->mavlinknode->vehicle.compid,
+1 -1
View File
@@ -29,7 +29,7 @@ VS_VERSION_INFO VERSIONINFO
VALUE "FileDescription", "UAV Ground Control System\0"
VALUE "FileVersion", "1.0.0.0\0"
VALUE "ProductVersion", "0.0.0.1\0"
VALUE "LegalCopyright", "Sunny\0"
VALUE "LegalCopyright", "Copyright © 2020 by HM - All Rights Reserved\0"
VALUE "LegalTrademarks", "xxx\0"
VALUE "OriginalFilename", "gcs_nf.exe\0"
VALUE "ProductName", "GCS\0"
+204 -93
View File
@@ -9,6 +9,9 @@
Cockpit::Cockpit(QWidget *parent): QWidget(parent)
{
//载入配置参数
//颜色初始化
m_Color.NormalColor = QColor("#00FF00");
m_Color.NoticeColor = QColor("#FF8C00");
@@ -96,16 +99,42 @@ void Cockpit::UpdateTimeout(void)
}
void Cockpit::mouseMoveEvent(QMouseEvent *e)
{
const QPoint curPos = e->pos();
if (isPress)
{
QPoint offset = curPos - lastPoint;
lastPoint = curPos;
V_pos += 100.0 * offset.y()/height();
H_pos += 100.0 * offset.x()/width();
}
update();
}
void Cockpit::mouseReleaseEvent(QMouseEvent *e)
{
qDebug() << "cockpit release" << e;
isPress = false;
setCursor(Qt::ArrowCursor);
}
void Cockpit::mousePressEvent(QMouseEvent *e)
{
qDebug() << "cockpit press" << e;
if (e->button() == Qt::RightButton)
{
lastPoint = e->pos();
isPress = true;
setCursor(Qt::ClosedHandCursor);
}
else if(e->buttons() == Qt::MiddleButton)
{
Scale = 2100;//默认很大
H_pos = 44.7059;
V_pos = 43.8235;
}
update();
}
void Cockpit::mouseDoubleClickEvent(QMouseEvent *e)
@@ -115,20 +144,81 @@ void Cockpit::mouseDoubleClickEvent(QMouseEvent *e)
void Cockpit::wheelEvent(QWheelEvent *e)
{
Q_UNUSED(e);
//update();
}
/*
void Cockpit::setUseOpenGL(const bool &value)
{
if (value) {
//setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
} else {
//setupViewport(new QWidget());
switch(e->modifiers())
{
case Qt::ControlModifier://垂直移动
{
if(e->delta() > 0)
{
V_pos -= 1;
if(V_pos < 1)
{
V_pos = 1;
}
}
else if(e->delta() < 0)
{
V_pos += 1;
if(V_pos > 100)
{
V_pos = 100;
}
}
}break;
case Qt::ShiftModifier://水平移动
{
if(e->delta() > 0)
{
H_pos -= 1;
if(H_pos < 1)
{
H_pos = 1;
}
}
else if(e->delta() < 0)
{
H_pos += 1;
if(H_pos > 100)
{
H_pos = 100;
}
}
}break;
case Qt::AltModifier://水平移动
{
if(e->delta() > 0)
{
m_State.altitude -= 0.1;
}
else if(e->delta() < 0)
{
m_State.altitude += 0.1;
}
}break;
default://水平移动
{
if(e->delta() > 0)
{
Scale -= 50;
if(Scale < 50)
{
Scale = 50;
}
}
else if(e->delta() < 0)
{
Scale += 50;
}
}
}
//保存配置参数
update();
}
*/
void Cockpit::setPitch(double Pitch)
{
@@ -431,16 +521,14 @@ void Cockpit::setLed(QColor LED)
void Cockpit::paintEvent(QPaintEvent *)
{
qreal scale = 2500.0;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); /* 使用反锯齿(如果可用) */
painter.setRenderHint(QPainter::TextAntialiasing);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.translate(width() / 2, 4* height() / 10); /* 坐标变换为窗体中心 */
painter.translate(width() * H_pos / 100,height() * V_pos / 100); /* 坐标变换为窗体中心 */
int side = qMin(width(), height()); /* 这一句决定了这个模块只能是方形 */
painter.scale(side / scale, side / scale); /* 比例缩放 */
painter.scale(side / Scale, side / Scale); /* 比例缩放 */
painter.setPen(Qt::NoPen);
//全局设置字体
@@ -588,19 +676,19 @@ void Cockpit::drawPitch(QPainter *painter)
painter->save();
QPainterPath path;
//画外面边框
path.moveTo(-4000,-4000);
path.lineTo( 4000,-4000);
path.lineTo( 4000, 4000);
path.lineTo(-4000, 4000);
path.moveTo(-4100,-4100);
path.lineTo( 4100,-4100);
path.lineTo( 4100, 4100);
path.lineTo(-4100, 4100);
//画里面边框
path.addRoundRect(-500,-500,1000,1000,20,20);
//按照规则填充两个边框之间的部分
path.setFillRule(Qt::OddEvenFill);
pen.setColor(Qt::black);
painter->setPen(pen);
painter->fillPath(path,Qt::black);
painter->restore();
}
//画姿态roll
@@ -745,8 +833,8 @@ void Cockpit::drawLeftScale(QPainter *painter)
QFont font;
ePen.setColor(m_Color.CentreLineColor);
ePen.setWidth(8);
font.setPointSize(60);
font.setWeight(QFont::ExtraLight);
font.setPointSize(70);
font.setWeight(QFont::Bold);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
painter->setFont(font);
@@ -835,17 +923,30 @@ void Cockpit::drawLeftScale(QPainter *painter)
ePen.setColor(m_Color.CentreLineColor);
ePen.setWidth(15);
font.setPixelSize(90);
font.setWeight(QFont::ExtraLight);
font.setPixelSize(120);
font.setWeight(QFont::Bold);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
painter->setFont(font);
QString DacadeText = QString::number(qAbs(int(m_State.airspeed/10))); //设置十位以上
QString UnitText = QString::number(qAbs(int(m_State.airspeed)%10)); //设置个位
qreal Unit = m_State.airspeed - int(m_State.airspeed)/10 * 10;
qreal Decimal = m_State.airspeed - int(m_State.airspeed);
QString DacadeText; //设置十位以上
if(Unit > 9.5)
{
DacadeText = QString::number(qAbs(int((m_State.airspeed + 1)/10)));
}
else
{
DacadeText = QString::number(qAbs(int(m_State.airspeed/10)));
}
//显示10位
if((m_State.airspeed < 0)&&(m_State.airspeed > -10))
{
@@ -857,12 +958,8 @@ void Cockpit::drawLeftScale(QPainter *painter)
//qDebug() << DacadeText;
}
qreal Unit = m_State.airspeed - int(m_State.airspeed)/10 * 10;
qreal Decimal = m_State.airspeed - int(m_State.airspeed);
//qDebug() << Unit << Decimal;
//显示个位
int count = 1;
for(int i = -1.5 - Unit;i<(1.5 - Unit);i+=1)
{
@@ -877,7 +974,7 @@ void Cockpit::drawLeftScale(QPainter *painter)
ePen.setColor(m_Color.CentreLineColor);
ePen.setWidth(15);
font.setPixelSize(90);
font.setPixelSize(120);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
@@ -888,7 +985,6 @@ void Cockpit::drawLeftScale(QPainter *painter)
else
painter->translate(150,(i + Unit) * 120 + 60);
//qDebug() << "Unit" << Unit;
//此段程序在未理解之前,请不要随意修改(负数未解决)
switch (count) {
@@ -941,10 +1037,6 @@ void Cockpit::drawLeftScale(QPainter *painter)
}
count++;
painter->restore();
}
@@ -993,12 +1085,13 @@ void Cockpit::drawLeftScale(QPainter *painter)
ePen.setColor(QColor("#FFFFFF"));
ePen.setWidth(8);
font.setPixelSize(60);
font.setPixelSize(120);
font.setWeight(QFont::Bold);
painter->setPen(ePen);
painter->setFont(font);
painter->setBrush(QColor("#000000"));
painter->drawRect(0,600,300,100);
painter->drawRect(0,600,300,150);
QString AS_flag = "I";
@@ -1006,17 +1099,17 @@ void Cockpit::drawLeftScale(QPainter *painter)
switch (m_State.AirspeedFlag) {
default:
case 0:
painter->drawText(QRect(20,600,280,100),Qt::AlignLeft|Qt::AlignVCenter,"IAS " + QString::number(m_State.airspeed,'f',0));
painter->drawText(QRect(20,600,280,150),Qt::AlignLeft|Qt::AlignVCenter,QString::number(m_State.airspeed,'f',0));
AS_flag = "I";
ePen.setColor(m_Color.NoticeColor);
break;
case 1:
painter->drawText(QRect(20,600,280,100),Qt::AlignLeft|Qt::AlignVCenter,"CAS " + QString::number(m_State.airspeed,'f',0));
painter->drawText(QRect(20,600,280,150),Qt::AlignLeft|Qt::AlignVCenter,QString::number(m_State.airspeed,'f',0));
AS_flag = "C";
ePen.setColor(m_Color.NoticeColor);
break;
case 2:
painter->drawText(QRect(20,600,280,100),Qt::AlignLeft|Qt::AlignVCenter,"TAS " + QString::number(m_State.airspeed,'f',0));
painter->drawText(QRect(20,600,280,150),Qt::AlignLeft|Qt::AlignVCenter,QString::number(m_State.airspeed,'f',0));
AS_flag = "T";
ePen.setColor(m_Color.NormalColor);
break;
@@ -1024,7 +1117,7 @@ void Cockpit::drawLeftScale(QPainter *painter)
ePen.setWidth(15);
font.setPixelSize(100);
font.setBold(true);//加粗
font.setWeight(QFont::Bold);
painter->setPen(ePen);
painter->setFont(font);
@@ -1038,8 +1131,10 @@ void Cockpit::drawLeftScale(QPainter *painter)
ePen.setColor(m_Color.TargetColor);
ePen.setWidth(15);
font.setPixelSize(100);
font.setPixelSize(120);
font.setFamily("Arial");//非衬线
font.setWeight(QFont::Bold);
painter->setPen(ePen);
painter->setFont(font);
@@ -1060,8 +1155,8 @@ void Cockpit::drawLeftScale(QPainter *painter)
painter->setPen(ePen);
painter->setFont(font);
painter->drawText(QRect(0,-820,300,120),Qt::AlignLeft|Qt::AlignVCenter,"OL " +QString::number(m_Target.airspeed,'f',0));
painter->drawText(QRect(0,-920,300,120),Qt::AlignLeft|Qt::AlignVCenter,"AOA " +QString::number(m_Target.airspeed,'f',0));
painter->drawText(QRect(0,-820,300,120),Qt::AlignLeft|Qt::AlignVCenter,"OL " +QString::number(m_State.OL,'f',0));
painter->drawText(QRect(0,-920,300,120),Qt::AlignLeft|Qt::AlignVCenter,"AOA " +QString::number(m_State.AOA,'f',0));
painter->restore();//画顶部过载值和迎角结束
@@ -1105,9 +1200,9 @@ void Cockpit::drawRightScale(QPainter *painter)
QFont font;
ePen.setColor(m_Color.CentreLineColor);
ePen.setWidth(10);
font.setPixelSize(60);
font.setPixelSize(90);
font.setWeight(QFont::ExtraLight);
font.setWeight(QFont::Bold);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
@@ -1115,10 +1210,8 @@ void Cockpit::drawRightScale(QPainter *painter)
if((i%100) == 0)
{
painter->drawLine(0,i * h,40,i * h);
painter->drawText(QRect(50,i * h - 30,240,80),Qt::AlignVCenter|Qt::AlignRight, strText);
painter->drawText(QRect(50,i * h - 75,240,150),Qt::AlignVCenter|Qt::AlignRight, strText);
}
else if((i%50) == 0)
{
@@ -1172,14 +1265,14 @@ void Cockpit::drawRightScale(QPainter *painter)
ePen.setColor(m_Color.TargetColor);
ePen.setWidth(15);
font.setPixelSize(100);
font.setWeight(QFont::ExtraLight);
font.setPixelSize(120);
font.setWeight(QFont::Bold);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
painter->setFont(font);
painter->drawText(QRect(0,-720,310,100),Qt::AlignRight|Qt::AlignVCenter,QString::number(m_Target.altitude,'f',0));
painter->drawText(QRect(0,-720,300,120),Qt::AlignRight|Qt::AlignVCenter,QString::number(m_Target.altitude,'f',0));
painter->restore();
@@ -1190,17 +1283,17 @@ void Cockpit::drawRightScale(QPainter *painter)
ePen.setWidth(8);
font.setPixelSize(60);
font.setPixelSize(120);
font.setWeight(QFont::ExtraLight);
font.setWeight(QFont::Bold);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
painter->setFont(font);
painter->setBrush(QColor("#000000"));
painter->drawRect(0,600,300,100);
painter->drawRect(0,600,300,150);
painter->drawText(QRect(20,600,280,100),Qt::AlignLeft|Qt::AlignVCenter,"Hei " + QString::number(m_State.altitude,'f',0));
painter->drawText(QRect(20,600,280,150),Qt::AlignLeft|Qt::AlignVCenter,QString::number(m_State.altitude,'f',0));
painter->restore();
@@ -1230,17 +1323,34 @@ void Cockpit::drawRightScale(QPainter *painter)
ePen.setColor(m_Color.CentreLineColor);
ePen.setWidth(10);
font.setPixelSize(90);
font.setPixelSize(120);
font.setWeight(QFont::Bold);
painter->setPen(ePen);
painter->setFont(font);
qreal Unit = m_State.altitude - int(m_State.altitude)/100 * 100;
//qreal Dacade = qreal(int(m_State.altitude)%100)/10.0;
//qreal Decimal = m_State.altitude - int(m_State.altitude);
QString thousandText = QString::number(qAbs(int(m_State.altitude/1000)));//设置千位以上
QString HundredText = QString::number(qAbs(int(m_State.altitude/100)%10));//设置百位
QString DacadeText = QString::number(int(m_State.altitude/10)); //设置十位
QString UnitText = QString::number(qAbs(int(m_State.altitude)%10)); //设置个位
QString HundredText;//设置百位
//QString DacadeText = QString::number(int(m_State.altitude/10)); //设置十位
//QString UnitText = QString::number(qAbs(int(m_State.altitude)%10)); //设置个位
if(Unit > 99.5)
{
HundredText = QString::number(qAbs(int(m_State.altitude/100)%10) + 1);
}
else
{
HundredText = QString::number(qAbs(int(m_State.altitude/100)%10));
}
//qDebug() << thousandText << HundredText << Unit;
//写千位
if(m_State.altitude >= 0)
@@ -1264,7 +1374,7 @@ void Cockpit::drawRightScale(QPainter *painter)
ePen.setColor(m_Color.CentreLineColor);
ePen.setWidth(10);
font.setPixelSize(90);
font.setPixelSize(120);
painter->setPen(ePen);
painter->setFont(font);
painter->drawText(QRect(160,-50,90,100),Qt::AlignVCenter|Qt::AlignRight, thousandText);
@@ -1280,10 +1390,13 @@ void Cockpit::drawRightScale(QPainter *painter)
ePen.setColor(m_Color.CentreLineColor);
ePen.setWidth(10);
font.setPixelSize(70);
font.setPixelSize(120);
painter->setPen(ePen);
painter->setFont(font);
//写百位
painter->drawText(QRect(0,-50,300,100),Qt::AlignVCenter|Qt::AlignRight, HundredText);
/*
if(int(qAbs(m_State.altitude/100)) > 0)//说明有数
{
painter->drawText(QRect(0,-50,300,100),Qt::AlignVCenter|Qt::AlignRight, HundredText);
@@ -1292,13 +1405,7 @@ void Cockpit::drawRightScale(QPainter *painter)
{
painter->drawText(QRect(0,-50,300,100),Qt::AlignVCenter|Qt::AlignRight, "0");
}
qreal Unit = m_State.altitude - int(m_State.altitude)/100 * 100;
qreal Dacade = qreal(int(m_State.altitude)%100)/10.0;
qreal Decimal = m_State.altitude - int(m_State.altitude);
//float m_Unit =qAbs(Dacade - int(Dacade));
*/
//写十个位
@@ -1336,7 +1443,7 @@ void Cockpit::drawRightScale(QPainter *painter)
ePen.setColor(m_Color.CentreLineColor);
ePen.setWidth(10);
font.setPixelSize(70);
font.setPixelSize(100);
painter->setPen(ePen);
painter->setFont(font);
@@ -1426,8 +1533,8 @@ void Cockpit::drawVRate(QPainter *painter)
ePen.setWidth(8);
ePen.setColor(Qt::white);
font.setPixelSize(50);
font.setWeight(QFont::ExtraLight);
font.setPixelSize(80);
font.setWeight(QFont::Bold);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
@@ -1518,14 +1625,14 @@ void Cockpit::drawVRate(QPainter *painter)
ePen.setWidth(8);
ePen.setColor(m_Color.TargetColor);
font.setPixelSize(50);
font.setWeight(QFont::ExtraLight);
font.setPixelSize(90);
font.setWeight(QFont::Bold);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
painter->setFont(font);
painter->drawText(QRect(-80,-550,120,60),Qt::AlignHCenter|Qt::AlignLeft,QString::number(m_Target.verticalspeed,'f',(qAbs(m_Target.verticalspeed) < 10.0)?(1):(0)));
painter->drawText(QRect(-80,-600,120,150),Qt::AlignHCenter|Qt::AlignLeft,QString::number(m_Target.verticalspeed,'f',(qAbs(m_Target.verticalspeed) < 10.0)?(1):(0)));
painter->restore();//画目标值结束
@@ -1537,14 +1644,14 @@ void Cockpit::drawVRate(QPainter *painter)
ePen.setWidth(8);
ePen.setColor(m_Color.CurrentColor);
font.setPixelSize(50);
font.setWeight(QFont::ExtraLight);
font.setPixelSize(90);
font.setWeight(QFont::Bold);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
painter->setFont(font);
//在下方显示当前值
painter->drawText(QRect(-80,500,120,60),Qt::AlignHCenter|Qt::AlignLeft,QString::number(m_State.verticalspeed,'f',(qAbs(m_State.verticalspeed) < 10.0)?(1):(0)));
painter->drawText(QRect(-80,500,120,150),Qt::AlignHCenter|Qt::AlignLeft,QString::number(m_State.verticalspeed,'f',(qAbs(m_State.verticalspeed) < 10.0)?(1):(0)));
painter->restore();//画当前值结束
@@ -1743,10 +1850,10 @@ void Cockpit::drawYawScale(QPainter *painter)
painter->save();
static const QPointF Rectpoints[4] = {
QPointF(-90,-620),
QPointF( 90,-620),
QPointF( 90, -540),
QPointF(-90, -540),
QPointF(-120,-650),
QPointF( 120,-650),
QPointF( 120, -540),
QPointF(-120, -540),
};
ePen.setWidth(1);
@@ -1756,10 +1863,11 @@ void Cockpit::drawYawScale(QPainter *painter)
painter->drawPolygon(Rectpoints,4);
ePen.setColor(m_Color.CurrentColor);
font.setPixelSize(60);
font.setPixelSize(120);
font.setWeight(QFont::Bold);
painter->setPen(ePen);
painter->setFont(font);
painter->drawText(QRect(-90,-625,180,80),Qt::AlignCenter,QString::number(m_State.yaw,'f',0));
painter->drawText(QRect(-90,-670,180,150),Qt::AlignCenter,QString::number(m_State.yaw,'f',0));
painter->restore();
@@ -1767,6 +1875,7 @@ void Cockpit::drawYawScale(QPainter *painter)
ePen.setWidth(10);
font.setPixelSize(60);
painter->setPen(ePen);
painter->setFont(font);
@@ -1815,9 +1924,12 @@ void Cockpit::drawYawScale(QPainter *painter)
break;
}
font.setPixelSize(120);
font.setWeight(QFont::Bold);
painter->setFont(font);
painter->drawText(QRect(-40,-450,80,80),Qt::AlignVCenter|Qt::AlignHCenter,Flag);
painter->drawText(QRect(-75,-470,150,150),Qt::AlignVCenter|Qt::AlignHCenter,Flag);
painter->restore();
}
else
@@ -1871,6 +1983,7 @@ void Cockpit::drawTopStatuts(QPainter *painter)
ePen.setColor(m_Color.StatusColor);
ePen.setWidth(12);
font.setPixelSize(90);
font.setWeight(QFont::Bold);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
@@ -1878,8 +1991,6 @@ void Cockpit::drawTopStatuts(QPainter *painter)
painter->drawText(QRect(-550,0,365,150),Qt::AlignCenter,m_State.GPS);
painter->drawText(QRect(-185,0,365,150),Qt::AlignCenter,m_State. MODE);
painter->drawText(QRect( 185,0,365,150),Qt::AlignCenter,m_State.STATE);
painter->restore();//画状态结束
+8 -3
View File
@@ -76,7 +76,7 @@ typedef struct {
qreal horizontalspeed = 0;
qreal AOA = 0;
qreal OL = 0;
qreal wp_dist = 0;
@@ -177,7 +177,7 @@ public Q_SLOTS:
protected:
void mouseMoveEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
void mousePressEvent(QMouseEvent *e);
void mouseDoubleClickEvent(QMouseEvent *e);
@@ -211,7 +211,12 @@ private:
QTimer *UpdateTimer = nullptr;
QPoint m_c;
qreal Scale = 2100;//默认很大
qreal H_pos = 44.7059;
qreal V_pos = 43.8235;
QPoint lastPoint;
bool isPress = false;
};
+6 -9
View File
@@ -80,8 +80,7 @@ void commandprocess::process()//线程函数
void commandprocess::setID(int m_sysid,int m_compid)
{
//qDebug() << "command set id";
sysid = (uint8_t)m_sysid;
sysid = (uint8_t)m_sysid;
compid = (uint8_t)m_compid;
}
@@ -146,10 +145,6 @@ void commandprocess::WriteCmd_long(float param1, float param2, float param3, fl
start();//开启线程
}
//这个函数类似中断,专门处理接收到的状态
void commandprocess::Parse(mavlink_message_t msg)
{
@@ -177,11 +172,13 @@ void commandprocess::Parse(mavlink_message_t msg)
if(command_ack.result == MAV_RESULT_ACCEPTED)
{
if(cmd_long.command != command_ack.command)
{
break;
}
status.transmit.isWaitingforACK = false;
emit commandAccepted(true,command_ack.command,command_ack.result);//广播指令反馈
}
else
{
+1 -13
View File
@@ -191,6 +191,7 @@ void MavLinkNode::process()//线程函数
}
//退出线程
Nodethread->quit();
Nodethread->wait();
}
void MavLinkNode::initbuff(void)
@@ -208,7 +209,6 @@ void MavLinkNode::initbuff(void)
void MavLinkNode::setbuff(quint32 src,QByteArray data)
{
//qDebug() << "apend data" << src;
switch (src) {
default:
case SourceType::c_sock:
@@ -296,19 +296,7 @@ void MavLinkNode::Mavlinkparse(quint32 src,QByteArray datagram)
{
if(MAVLINK_FRAMING_OK == mavlink_parse_char(src,*i,&msg,&status))
{
//qDebug() << "fifo parse:" << count << msg.msgid;
count++;
/*
if(msg.compid == Current_CompID) //过滤地面站发过来的数据
{
//不能使用这种方法过滤,不正确
qDebug() << msg.msgid << "msg come from groundstation";
}
*/
if(msg.sysid < 250) //过滤地面站发过来的数据
{
MAVLinkRcv_Handler(msg); //接收完一帧数据并处理
+27 -16
View File
@@ -3,7 +3,7 @@
MissionProcess::MissionProcess(QObject *parent) : QObject(parent)
{
setRunFrq(50);//默认200Hz频率运行
setRunFrq(20);//默认50Hz频率运行
}
@@ -88,7 +88,6 @@ void MissionProcess::process()//线程函数
void MissionProcess::setID(int m_sysid,int m_compid)
{
//qDebug() << "Mission set id";
sysid = (uint8_t)m_sysid;
compid = (uint8_t)m_compid;
}
@@ -100,13 +99,14 @@ void MissionProcess::SendMessage(mavlink_message_t msg)
uint8_t buff[256+20];
uint16_t len = mavlink_msg_to_send_buffer(buff, &msg);
/*
QString num;
for (int i = 0; i < len; ++i) {
num.append(QString::number(buff[i],16).toUpper());
num.append(" ");
}
qDebug() << num;
*/
emit SendMessageTo(0,buff, len);//使用信号和槽
}
@@ -135,7 +135,7 @@ void MissionProcess::SetCurrentPoint(int seq)
{
mission_status.transmit.type = 1;
mission_status.m_Mode = TransmitMode;//发送模式
mission_status.transmit.seq = seq;
mission_status.transmit.seq = seq - 1;
//start();//开启线程
}
@@ -162,7 +162,7 @@ void MissionProcess::transmitPoint(float param1,float param2,float param3,float
item.x = x;
item.y = y;
item.z = z;
item.seq = seq;
item.seq = seq-1;
item.group = group;
item.command = command;
item.target_system = target_system;
@@ -194,10 +194,8 @@ void MissionProcess::transmitPoint(float param1,float param2,float param3,float
<< item.current
<< item.autocontinue
<< item.mission_type;
}
*/
*/
}
@@ -233,7 +231,7 @@ void MissionProcess::Parse(mavlink_message_t msg)
qDebug() << "recieve mission_request_int ";
emit sendItemOK(mission_item_int.seq,true);
mission_item_int.seq++;
mission_item_int.seq ++;
mission_status.transmit.isWaiteforRequest = false;
}break;
case MAVLINK_MSG_ID_MISSION_REQUEST: {
@@ -247,7 +245,7 @@ void MissionProcess::Parse(mavlink_message_t msg)
qDebug() << "recieve mission_request ";
emit sendItemOK(mission_item_int.seq,true);
mission_item_int.seq++;
mission_item_int.seq ++;
mission_status.transmit.isWaiteforRequest = false;
}break;
case MAVLINK_MSG_ID_MISSION_ITEM_INT: {
@@ -299,9 +297,7 @@ void MissionProcess::Parse(mavlink_message_t msg)
}break;
case MAVLINK_MSG_ID_MISSION_CURRENT: {
mavlink_msg_mission_current_decode(&msg,&mission_current);
emit currentPoint(mission_current.seq);
emit currentPoint(mission_current.seq + 1);
}break;
case MAVLINK_MSG_ID_MISSION_SET_CURRENT: {
mavlink_msg_mission_set_current_decode(&msg,&mission_set_current);
@@ -328,7 +324,7 @@ void MissionProcess::ReadStateMachine(void)
{
static uint8_t step = 0;
static uint8_t timeout_count = 0;
static uint32_t time = 0;
static int time = 0;
if(step == 0)
{
@@ -461,7 +457,7 @@ void MissionProcess::WriteStateMachine(void)
if(step == 0)
{
//向其他线程或者自己读取航点的数量
qDebug() << "start send count";
qDebug() << "start send count" << mission_status.transmit.count;
count(mission_status.transmit.count);//发送count
mission_status.transmit.isWaiteforRequest = true;
time = QTime::currentTime().msecsSinceStartOfDay();
@@ -514,6 +510,8 @@ void MissionProcess::WriteStateMachine(void)
qDebug() << "send item time out,abort transmit";
}
time = QTime::currentTime().msecsSinceStartOfDay();
//如果超时了,重新发一次当前航点
qDebug() << "send item time out" << timeout_count;
mission_status.transmit.isWaiteforRequest = false;
@@ -532,11 +530,23 @@ void MissionProcess::WriteStateMachine(void)
i = *items.find(mission_item_int.seq);
item_int(i.param1,i.param2,i.param3,i.param4,
i.x*10,i.y*10,i.z,
i.seq,i.command,i.frame,
i.current,i.autocontinue,i.mission_type);//发送航点
qDebug() << i.param1
<< i.param2
<< i.param3
<< i.param4
<< i.x*10
<< i.y*10
<< i.z
<< i.seq;
/*
item(i.param1,i.param2,i.param3,i.param4,
i.x * 10e-7,i.y * 10e-7,i.z * 10e-4,
@@ -544,7 +554,8 @@ void MissionProcess::WriteStateMachine(void)
i.current,i.autocontinue,i.mission_type);//发送航点
*/
if(mission_item_int.seq < (mission_status.transmit.count - 1))
if(mission_item_int.seq < mission_status.transmit.count)
{
mission_status.transmit.isWaiteforRequest = true;
}
-6
View File
@@ -214,13 +214,10 @@ void ParameterProcess::ReadStateMachine(void)//一整列
qDebug() << "parameter item time out ";
timeout_count = 0;
if(status.recieve.type == _readtype::All)//如果是ALL的情况下,那么再用单独一个一个去请求一次
{
qDebug() << "try One mode";
status.recieve.type =_readtype::One;
status.recieve.isWaitingforValue = true;
time = QTime::currentTime().msecsSinceStartOfDay();
request_read("xxx",0);//读取0
@@ -237,9 +234,7 @@ void ParameterProcess::ReadStateMachine(void)//一整列
{
//qDebug() << "parameter item reccieved";
timeout_count = 0;
time = QTime::currentTime().msecsSinceStartOfDay();
//如果参数count 大于当前index,那么继续等待
if((param_value.param_index+1) < param_value.param_count)
{
@@ -257,7 +252,6 @@ void ParameterProcess::ReadStateMachine(void)//一整列
}
}
}
}
else if(step == 2)//传输结束
{
+107 -108
View File
@@ -8,29 +8,53 @@ DLink::DLink(QObject *parent) : QObject(parent)
{
qDebug() << "Dlink " << QThread::currentThreadId();
QDir *temp = new QDir;
if(!temp->exists("./Tlog"))
{
qDebug() << "make dir tlog";
temp->mkdir("./Tlog");//如果文件夹不存在就新建
}
connect(this,SIGNAL(recieveMessage(quint32,QByteArray)),
this,SLOT(record(quint32,QByteArray)));
//采用插件导入的方式(plugin)
//mavlink协议节点
mavlinknode = new MavLinkNode();//不允许带参数,因为这是单独的线程
connect(mavlinknode,SIGNAL(SendMessageTo(quint8,quint8*,quint16)),
this,SLOT(SendMessageTo(quint8,quint8*,quint16)),Qt::DirectConnection);//采用直连的方式,因为是多线程
//在当前线程运行
connect(mavlinknode,SIGNAL(SendMessageTo(quint8,quint8*,quint16)),
this,SLOT(SendMessageTo(quint8,quint8*,quint16)),Qt::BlockingQueuedConnection);//采用直连的方式,因为是多线程
//在当前线程运行
connect(mavlinknode,SIGNAL(showMessage(QString,int)),
this,SIGNAL(showMessage(QString,int)),Qt::DirectConnection);
//在当前线程运行
connect(this,SIGNAL(recieveMessage(quint32,QByteArray)),
mavlinknode,SLOT(setbuff(quint32,QByteArray)),Qt::DirectConnection);
mavlinknode->start();
connect(this,&DLink::REVMessageTo1,
this,&DLink::SendMessageTo1);
//其他协议节点。。。
}
DLink::~DLink()
{
stopPort();
//查询所有的接口,然后删除
if (mavLogFile)
{
mavLogFile->close();
delete mavLogFile;
mavLogFile = NULL;
}
mavlinknode->stop();
delete mavlinknode;
}
@@ -39,7 +63,12 @@ DLink::~DLink()
int DLink::SendMessageTo(quint8 ch, quint8 *msg, quint16 len)
{
//让这个函数在其他线程运行
QString num;
for (int i = 0; i < len; ++i) {
num.append(QString::number(msg[i],16).toUpper());
num.append(" ");
}
qDebug() << num;
//Q_UNUSED(ch);
//更加ch选择
@@ -47,24 +76,14 @@ int DLink::SendMessageTo(quint8 ch, quint8 *msg, quint16 len)
{
foreach(Node node,clientSockets)
{
DLink::Clientsock->writeDatagram((const char *)msg, len,
node.addr, node.port);
qDebug() << "Client Send Msg";
qint64 flag = DLink::Clientsock->writeDatagram((const char *)msg,len,node.addr, node.port);
if(flag != -1)
{
qDebug() << "Client Send Msg";
}
}
}
if (DLink::serialPort)
{
emit REVMessageTo1(ch,msg,len);
}
return 0;
}
int DLink::SendMessageTo1(quint8 ch, quint8 *msg, quint16 len)
{
if (DLink::serialPort)
{
qint64 flag = DLink::serialPort->write((const char *)msg,len);
@@ -77,12 +96,11 @@ int DLink::SendMessageTo1(quint8 ch, quint8 *msg, quint16 len)
return 0;
}
//这个函数就在本线程内运行
bool DLink::setupPort(const QString port, qint32 baudrate, QSerialPort::Parity parity)
{
qDebug() << port
qWarning() << port
<< baudrate
<< parity;
@@ -106,23 +124,29 @@ bool DLink::setupPort(const QString port, qint32 baudrate, QSerialPort::Parity p
DLink::serialPort->write("serial connet ok",16);
qDebug() << QThread::currentThread();
//mavlinknode->start();//启动之后串口就找不到了
connect(serialPort, SIGNAL(readyRead()), this, SLOT(readPendingDatagramsSerialPort()));
connect(serialPort, SIGNAL(readyRead()), this, SLOT(readPendingDatagramsSerialPort()));//本线程内调用
isSuccess = true;
if (mavLogFile)
{
mavLogFile->close();
delete mavLogFile;
}
QDateTime current = QDateTime::currentDateTime();
mavLogFile = new QFile(QString("./Tlog/%1.tlog").arg(current.toString("yyyyMMddHHmmss")));
mavLogFile->open(QIODevice::WriteOnly);
emit showMessage(tr("Serial Port Open Success"));
qDebug() << "Serial Port Open Success";
qWarning() << "Serial Port Open Success";
}
else
{
isSuccess = false;
emit showMessage(tr("Serial Port Open Fail"));
qDebug() << "Serial Port Open Fail";
qWarning() << "Serial Port Open Fail";
delete serialPort;
serialPort = nullptr;
}
@@ -132,15 +156,24 @@ bool DLink::setupPort(const QString port, qint32 baudrate, QSerialPort::Parity p
bool DLink::statesPort()
{
return (serialPort != nullptr)?(true):(false);
if(serialPort)
{
return (serialPort != nullptr)?(true):(false);
}
}
void DLink::stopPort()
{
emit showMessage(tr("Serial Port close"));
serialPort->close();
delete serialPort;
serialPort = nullptr;
if(serialPort)
{
emit showMessage(tr("Serial Port close"));
if(serialPort->isOpen())
{
serialPort->close();
}
delete serialPort;
serialPort = nullptr;
}
}
void DLink::connectSignal(QVariant m_state,
@@ -170,7 +203,7 @@ void DLink::connectSignal(QVariant m_state,
}
qDebug() << m_Type << m_Param1 << m_Param2.toString().toInt() << parity;
qWarning() << m_Type << m_Param1 << m_Param2.toString().toInt() << parity;
if(setupPort(m_Param1.toString(),m_Param2.toString().toInt(),parity))
{
@@ -196,7 +229,7 @@ void DLink::connectSignal(QVariant m_state,
}
else
{
qDebug() << "disconnect";
qWarning() << "disconnect";
if(m_Type.toString() == "SerialPort")
{
stopPort();
@@ -231,8 +264,6 @@ bool DLink::setupClient(const QHostAddress &local_addr,int local_port,const QHos
if(Clientsock->open(QIODevice::ReadWrite))
//if(Clientsock->joinMulticastGroup(remote_addr))
{
connect(Clientsock, SIGNAL(readyRead()),
this, SLOT(readPendingDatagramsClient()));
@@ -242,18 +273,29 @@ bool DLink::setupClient(const QHostAddress &local_addr,int local_port,const QHos
node.port = remote_port;
clientSockets.append(node);
qDebug() << "UdpSocket open:"
qWarning() << "UdpSocket open:"
<< remote_addr
<< local_port
<< remote_port;
if (mavLogFile)
{
mavLogFile->close();
delete mavLogFile;
}
QDateTime current = QDateTime::currentDateTime();
mavLogFile = new QFile(QString("./Tlog/%1.tlog").arg(current.toString("yyyyMMddHHmmss")));
mavLogFile->open(QIODevice::WriteOnly);
isSuccess = true;
emit showMessage(tr("UdpSocket open"));
}
else
{
isSuccess = false;
qDebug() << "sock not open";
qWarning() << "sock not open";
}
}
else
@@ -269,82 +311,39 @@ bool DLink::setupClient(const QHostAddress &local_addr,int local_port,const QHos
void DLink::readPendingDatagramsSerialPort(void)
{
static int count = 0;
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;
count++;
}
}
*/
/*
QString num;
for (int i = 0; i < datagram.size(); ++i) {
num.append(QString::number((uint8_t)datagram.at(i) & 0xFF,16).toUpper());
num.append(" ");
}
qDebug() << num;
*/
//qDebug() << "port recieve";
emit recieveMessage(SourceType::s_port,datagram);
}
void DLink::readPendingDatagramsClient(void)
{
static int count = 0;
//轮番查询
while (Clientsock->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(Clientsock->pendingDatagramSize());
Clientsock->readDatagram(datagram.data(), datagram.size());
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;
count++;
}
}
*/
emit recieveMessage(SourceType::c_sock,datagram);
}
//qDebug() << "client recieve";
}
//在这里做一个检查缓冲区有没有数,有数据就往上发的一个函数
//dlink底下的所有协议都可以往这个缓存发数据
void DLink::record(quint32 src,QByteArray data)
{
Q_UNUSED(src)
//加时间撮
if (mavLogFile)
{
//使用数据流的方式可能更好
mavLogFile->write((const char *)data, sizeof(data));
}
}
void DLink::replay(quint32 src,QByteArray data)
{
//定时器回放
}
+12 -4
View File
@@ -50,6 +50,7 @@ public:
signals:
void showMessage(const QString &message,int TimeOut = 0);
void recieveMessage(quint32 src,QByteArray data);
void PortConnected(QVariant m_state,
QVariant m_usrName,QVariant m_Type,
@@ -57,8 +58,6 @@ signals:
QVariant m_Param3,QVariant m_Param4,
QVariant m_Param5);
int REVMessageTo1(quint8 ch, quint8 *msg, quint16 len);
public slots:
void connectSignal(QVariant m_state,
@@ -67,15 +66,20 @@ public slots:
QVariant m_Param3,QVariant m_Param4,
QVariant m_Param5);
void readPendingDatagramsSerialPort(void);
void readPendingDatagramsClient(void);
int SendMessageTo(quint8 ch, quint8 *msg, quint16 len);
private slots:
void record(quint32 src,QByteArray data);
void replay(quint32 src,QByteArray data);
int SendMessageTo1(quint8 ch, quint8 *msg, quint16 len);
protected:
@@ -90,6 +94,10 @@ protected:
QList<Node> clientSockets;
QFile *mavLogFile = NULL;
};
Binary file not shown.
Binary file not shown.
+19 -29
View File
@@ -99,34 +99,6 @@ OPMapWidget::OPMapWidget(QWidget *parent, Configuration *config) : QGraphicsView
void OPMapWidget::SetShowDiagnostics(bool const & value)
{
showDiag = value;
/*
if (!showDiag) {
if (diagGraphItem != 0) {
delete diagGraphItem;
diagGraphItem = 0;
}
if (diagTimer != 0) {
delete diagTimer;
diagTimer = 0;
}
if (GPS != 0) {
GPS->DeleteTrail();
delete GPS;
GPS = 0;
}
} else {
diagTimer = new QTimer();
connect(diagTimer, SIGNAL(timeout()), this, SLOT(diagRefresh()));
diagTimer->start(500);
if (GPS == 0) {
GPS = new GPSItem(map, this);
GPS->setParentItem(map);
GPS->setOpacity(overlayOpacity);
setOverlayOpacity(overlayOpacity);
}
}
*/
}
void OPMapWidget::SetUavPic(QString UAVPic)
{
@@ -177,7 +149,7 @@ void OPMapWidget::addUAV(int sysid,int compid)
uavItem->setOpacity(overlayOpacity);
uavItem->setSelect(true);
uavItem->setSelect(false);
}
@@ -264,6 +236,24 @@ void OPMapWidget::setUAVHeading(int sysid,int compid,float Heading)
}
void OPMapWidget::DeleteTrail(void)
{
foreach(QGraphicsItem * i, map->childItems()) {
UAVItem *u = qgraphicsitem_cast<UAVItem *>(i);
if (u) {
if(u->Select())
{
u->DeleteTrail();
}
}
}
}
WayPointLine *OPMapWidget::WPLineCreate(WayPointItem *from, WayPointItem *to, QColor color, bool dashed, int width)
{
if (!from | !to) {
+4
View File
@@ -424,6 +424,10 @@ public:
void setUAVPos(int sysid,int compid,double x,double y,double z);
void setUAVHeading(int sysid,int compid,float Heading);
void DeleteTrail(void);
double TotalDistance(void)
{