数据解析编写完成

This commit is contained in:
hm
2022-06-15 18:52:14 +08:00
parent 16b55bceb2
commit bd28fe54b9
27 changed files with 1404 additions and 17 deletions
+83
View File
@@ -0,0 +1,83 @@
#include "ECU.h"
#include "ui_ECU.h"
ECU::ECU(QWidget *parent) :
ToolsWidget(parent),
ui(new Ui::ECU)
{
ui->setupUi(this);
QFile file(":/qss/ECU.qss");
file.open(QFile::ReadOnly);
QTextStream filetext(&file);
QString stylesheet = filetext.readAll();
this->setStyleSheet(stylesheet);
file.close();
setWindowTitle(tr("ECU"));
}
ECU::~ECU()
{
delete ui;
}
void ECU::recieveData(const int &id, const QByteArray &data)
{
Parse *parse = new Parse;
connect(this,&ECU::parseData,
parse,&Parse::parseData);
connect(parse,&Parse::INS_Info,
this,&ECU::INS_Info);
connect(parse,&Parse::NAV_Info,
this,&ECU::NAV_Info);
connect(parse,&Parse::EADC_Info,
this,&ECU::EADC_Info);
connect(parse,&Parse::ECU_Info,
this,&ECU::ECU_Info);
connect(parse,&Parse::SSPC_Info,
this,&ECU::SSPC_Info);
QThreadPool::globalInstance()->start(parse);
emit parseData(id,data);
}
void ECU::INS_Info(Parse::_ins info)
{
}
void ECU::NAV_Info(Parse::_nav info)
{
}
void ECU::EADC_Info(Parse::_eadc info)
{
}
void ECU::ECU_Info(Parse::_ecu info)
{
}
void ECU::SSPC_Info(Parse::_sspc info)
{
}
+42
View File
@@ -0,0 +1,42 @@
#ifndef ECU_H
#define ECU_H
#include <QWidget>
#include "ToolsUI/ToolsWidget.h"
#include "Parse.h"
#include "QThreadPool"
namespace Ui {
class ECU;
}
class ECU : public ToolsWidget
{
Q_OBJECT
public:
explicit ECU(QWidget *parent = nullptr);
~ECU();
public slots:
void recieveData(const int &id,const QByteArray &data);
void INS_Info(Parse::_ins info);
void NAV_Info(Parse::_nav info);
void EADC_Info(Parse::_eadc info);
void ECU_Info(Parse::_ecu info);
void SSPC_Info(Parse::_sspc info);
signals:
void parseData(const int &id,const QByteArray &data);
private:
Ui::ECU *ui;
};
#endif // EVTOL_H
+41
View File
@@ -0,0 +1,41 @@
QT += opengl
QT += network
QT += sql
QT += svg
QT += quickwidgets
QT += quick
QT += qml
RESOURCES += \
$$PWD/ECU.qrc
FORMS += \
$$PWD/ECU.ui
HEADERS += \
$$PWD/ECU.h \
$$PWD/Parse.h
SOURCES += \
$$PWD/ECU.cpp \
$$PWD/Parse.cpp
+6
View File
@@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/qss">
<file>ECU.qss</file>
</qresource>
<qresource prefix="/img"/>
</RCC>
+86
View File
@@ -0,0 +1,86 @@
.QFrame {
background-color: #FFFFFF;
}
.QProgressBar::chunk[state="0"]{
background-color: #00FF00;
width: 20px;
}
.QProgressBar::chunk[state="1"]{
background-color: #FF0000;
width: 20px;
}
.QPushButton {
background-color: #FFFFFF /*palegoldenrod*/;
border-width: 2px;
border-color: darkkhaki;
border-style: solid;
border-radius: 5;
padding: 3px;
font: 20px "Arial";
}
.QPushButton:pressed {
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #dadbde, stop: 1 #f6f7fa);
}
.QLabel {
font: 20px "Arial";
}
.QLabel[state="0"] {
border-image:url(:/img/success_rect.png);
}
.QLabel[state="1"] {
border-image:url(:/img/fail_rect.png);
}
.QLabel[state="2"] {
border-image:url(:/img/warning_rect.png);
}
.QLabel[state="3"] {
border-image:url(:/img/rect_gray.png);
}
.QComboBox {
background-color: #FFFFFF;
font: 20px "Arial";
}
.QCheckBox{
font: 20px "Arial";
width: 25px;
height: 25px;
}
.QCheckBox::indicator {
width: 15px;
height: 15px;
}
.QCheckBox::indicator[state="0"] {
image:url(:/img/normal.png);
}
.QCheckBox::indicator[state="1"] {
image:url(:/img/fail.png);
}
+48
View File
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ECU</class>
<widget class="QWidget" name="ECU">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>519</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
</layout>
</widget>
<resources/>
<connections/>
</ui>
+570
View File
@@ -0,0 +1,570 @@
#include "Parse.h"
Parse::Parse(QObject *parent) : QObject(parent)
{
setAutoDelete(true);
qRegisterMetaType<Parse::_eadc>("Parse::_eadc");
qRegisterMetaType<Parse::_ecu>("Parse::_ecu");
qRegisterMetaType<Parse::_sspc>("Parse::_sspc");
}
Parse::~Parse()
{
}
void Parse::run()
{
QElapsedTimer time;
time.start();
qDebug() << "current thread is:" << QThread::currentThread();
while (raw.size() > 0) {
switch (index) {
case 0x00:
{
if(raw.size() >= 18)//0~17
{
union{uint8_t B[4];uint16_t I[2]; int16_t i[2]; uint32_t H; int32_t h;float F;}src;
QByteArray data = raw.mid(0,17);
_ins ins;
int data_count = 0;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
ins.roll_rate = src.i[0] * 400.0/32767;//滚转角速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
ins.yaw_rate = src.i[0] * 400.0/32767;//偏航角速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
ins.pitch_rate = src.i[0] * 400.0/32767;//俯仰角速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
ins.yaw = src.i[0] * 3.1415926/32767;//航向角
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
ins.pitch = src.i[0] * 3.1415926/32767;//俯仰角
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
ins.roll = src.i[0] * 3.1415926/32767;//滚转角
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
ins.ax = src.i[0] * 100.0/32767;//机体纵向加速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
ins.ay = src.i[0] * 100.0/32767;//机体法向加速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
ins.az = src.i[0] * 100.0/32767;//机体侧向加速度
emit INS_Info(ins);
}
if(raw.size() >= 73)//18~72
{
union{uint8_t B[4];uint16_t I[2]; int16_t i[2]; uint32_t H; int32_t h;float F;}src;
QByteArray data = raw.mid(0,17);
_nav nav;
int data_count = 0;
union//
{
quint8 byte;
struct
{
quint8 Satellite:2;
quint8 heading:2;
quint8 ins:2;
quint8 nav:2;
};
}state1;
state1.byte = data[data_count++];
nav.state1.navStatus = state1.nav;//D7D6 导航状态
nav.state1.insStatus = state1.ins;//D5D4 组合状态
nav.state1.headingSrc = state1.heading;//D3D2 航向信号源
nav.state1.Satellite = state1.Satellite;//D1D0 卫星信号源
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
nav.longitude = src.h * M_PI / (0x7FFFFFFF - 1);//位置经度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
nav.latitude = src.h * M_PI / (0x7FFFFFFF - 1);//位置纬度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.altitude = src.i[0] * 12000.0 / (0x7FFF - 1);//组合高度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.worktime = src.I[0];//本状态工作时间
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.Ve = src.i[0] * 400.0 / (0x7FFF - 1);//东向速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.Vn = src.i[0] * 400.0 / (0x7FFF - 1);//北向速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.Vu = src.i[0] * 400.0 / (0x7FFF - 1);//天向速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.Gs = src.i[0] * 400.0 / (0x7FFF - 1);//地速
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.heading = src.i[0] * M_PI / (0x7FFF - 1);//航迹角
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.Ae = src.i[0] * 100.0 / (0x7FFF - 1);//东向加速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.An = src.i[0] * 100.0 / (0x7FFF - 1);//北向加速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.Au = src.i[0] * 100.0 / (0x7FFF - 1);//天向加速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
nav.satellite_longitude = src.h * M_PI / (0x7FFFFFFF - 1);//卫星经度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
nav.satellite_latitude = src.h * M_PI / (0x7FFFFFFF - 1);//卫星纬度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.satellite_altitude = src.i[0] * 12000.0 / (0x7FFF - 1);//卫星高度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.satellite_Ve = src.i[0] * 400.0 / (0x7FFF - 1);//卫星东向速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.satellite_Vn = src.i[0] * 400.0 / (0x7FFF - 1);//卫星北向速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.satellite_Vu = src.i[0] * 400.0 / (0x7FFF - 1);//卫星天向速度
union//
{
quint8 byte;
struct
{
bool communication:1;//通讯状态
bool heading: 1;//双天线航向有效位
bool satellite: 1;//内置卫星数据有效位
bool RTK: 1;//内置差分数据有效位
bool exSatellite: 1;//外置卫星数据有效位
bool exRTK: 1;//外置差分数据有效位
bool altitude: 1;//组合高度有效位
bool ins: 1;//惯导数据有效位
};
}state2;
state2.byte = data[data_count++];
nav.state2.ins = (state2.ins)? (tr("有效")):(tr("无效"));//惯导数据有效位
nav.state2.altitude = (state2.altitude)? (tr("有效")):(tr("无效"));//组合高度有效位
nav.state2.exRTK = (state2.exRTK)? (tr("有效")):(tr("无效"));//外置差分数据有效位
nav.state2.exSatellite = (state2.exSatellite)? (tr("有效")):(tr("无效"));//外置卫星数据有效位
nav.state2.RTK = (state2.RTK)? (tr("有效")):(tr("无效"));//内置差分数据有效位
nav.state2.satellite = (state2.satellite)? (tr("有效")):(tr("无效"));//内置卫星数据有效位
nav.state2.heading = (state2.heading)? (tr("有效")):(tr("无效"));//双天线航向有效位
nav.state2.communication = (state2.communication)?(tr("有效")):(tr("无效"));//通讯状态
union//
{
quint8 byte;
struct
{
bool back0: 1;//
bool back1: 1;//
quint8 altitudeInfo: 2;//D3D2 高度阻尼信号
bool back4: 1;//
bool install: 1;//外部状态偏角有效位
bool das: 1;//大气数据有效位
bool back7: 1;//
};
}state3;
state3.byte = data[data_count++];
nav.state3.back7 = (state3.back7)? (tr("有效")):(tr("无效"));//
nav.state3.das = (state3.das)? (tr("有效")):(tr("无效"));//大气数据有效位
nav.state3.install = (state3.install)? (tr("有效")):(tr("无效"));//外部状态偏角有效位
nav.state3.back4 = (state3.back4)? (tr("有效")):(tr("无效"));//
switch (state3.altitudeInfo) {
case 0x00:
nav.state3.altitudeInfo = tr("");
break;
case 0x01:
nav.state3.altitudeInfo = tr("卫星");
break;
case 0x02:
nav.state3.altitudeInfo = tr("气压");
break;
}
nav.state3.back1 = (state3.back1)? (tr("有效")):(tr("无效"));//
nav.state3.back0 = (state3.back0)? (tr("有效")):(tr("无效"));//
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.year = src.I[0];//UTC年
nav.month = data[data_count++];;//UTC月
nav.day = data[data_count++];;//UTC日
nav.hour = data[data_count++];;//UTC时
nav.minute = data[data_count++];;//UTC分
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
nav.second = src.I[0] * 60.0 / (0xFFFF - 1);//UTC秒
emit NAV_Info(nav);
}
}break;
case 0x01:
{
if(raw.size() >= 74)//0~73
{
union{uint8_t B[4];uint16_t I[2]; int16_t i[2]; uint32_t H; int32_t h;float F;}src;
QByteArray data = raw.mid(0,74);
_eadc eadc;
int data_count = 0;
//加温模式
switch (data[data_count++]) {
case 0x33:
eadc.heatmode = tr("强制加温");
break;
case 0x66:
eadc.heatmode = tr("强制不加温");
break;
case 0x99:
eadc.heatmode = tr("自动加温控制");
break;
}
//加温状态
switch (data[data_count++]) {
case 0x55:
eadc.heatstatus = tr("正在加温");
break;
case 0xAA:
eadc.heatstatus = tr("停止加温");
break;
}
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
eadc.psi = src.H * 1.0/1024;//指示静压
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
eadc.ps = src.H * 1.0/1024;//静压
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
eadc.qci = src.h * 1.0/1024;//指示动压
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
eadc.qc = src.h * 1.0/1024;//真实动压
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
eadc.hp = src.h * 1.0/16;//气压高度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.hpr = src.i[0] * 1.0/16;//升降速度
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.ts = src.i[0] * 1.0/16;//静温
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.tt = src.i[0] * 1.0/16;//总温
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.mi = src.I[0] * 1.0/1024;//马赫数
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.vi = src.I[0] * 1.0/16;//指示空速
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.vt = src.I[0] * 1.0/16;//真空速
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.adr = src.I[0] * 1.0/256;//大气密度比
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.aoai1 = src.i[0] * 1.0/128;//局部攻角1
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.aoai2 = src.i[0] * 1.0/128;//局部攻角2
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.aoat1 = src.i[0] * 1.0/128;//真攻角1
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.aoat2 = src.i[0] * 1.0/128;//真攻角2
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.aosi1 = src.i[0] * 1.0/128;//局部侧滑角1
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.aosi2 = src.i[0] * 1.0/128;//局部侧滑角2
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.aost1 = src.i[0] * 1.0/128;//真侧滑角1
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.aost2 = src.i[0] * 1.0/128;//真侧滑角2
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
quint16 faultword = src.I[0];//故障字
eadc.faultword.ps = (faultword & 0x0001)?(true):(false);//静压传感器故障
eadc.faultword.qc = (faultword & 0x0002)?(true):(false);//动压传感器故障
eadc.faultword.ts = (faultword & 0x0004)?(true):(false);//静温传感器故障
eadc.faultword.aoa1 = (faultword & 0x0008)?(true):(false);//攻角1故障
eadc.faultword.aoa2 = (faultword & 0x0010)?(true):(false);//攻角2故障
eadc.faultword.aos1 = (faultword & 0x0020)?(true):(false);//侧滑角1故障
eadc.faultword.aos2 = (faultword & 0x0040)?(true):(false);//侧滑角2故障
eadc.faultword.heat = (faultword & 0x0080)?(true):(false);//加热故障
eadc.faultword.ex_storage = (faultword & 0x0100)?(true):(false);//外部存储故障
eadc.faultword.aoa_diff = (faultword & 0x0200)?(true):(false);//双余度攻角不跟随故障
eadc.faultword.aos_diff = (faultword & 0x0400)?(true):(false);//双余度侧滑角不跟随故障
eadc.faultword.qc_zero = (faultword & 0x0800)?(true):(false);//动压零位过度修正
eadc.faultword.back1 = (faultword & 0x1000)?(true):(false);
eadc.faultword.back2 = (faultword & 0x2000)?(true):(false);
eadc.faultword.overtemp = (faultword & 0x4000)?(true):(false);//管头过热故障
eadc.faultword.system = (faultword & 0x8000)?(true):(false);//大气数据计算机故障
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
quint32 datavalid = src.H;//数据有效性
eadc.datavalid.psi = (datavalid & 0x00000001)?(true):(false);//指示静压
eadc.datavalid.ps = (datavalid & 0x00000002)?(true):(false);//真实静压
eadc.datavalid.qci = (datavalid & 0x00000004)?(true):(false);//指示动压
eadc.datavalid.qc = (datavalid & 0x00000008)?(true):(false);//真实动压
eadc.datavalid.hp = (datavalid & 0x00000010)?(true):(false);//气压高度
eadc.datavalid.hpr = (datavalid & 0x00000020)?(true):(false);//升降速度
eadc.datavalid.ts = (datavalid & 0x00000040)?(true):(false);//静温
eadc.datavalid.tt = (datavalid & 0x00000080)?(true):(false);//总温
eadc.datavalid.mi = (datavalid & 0x00000100)?(true):(false);//马赫数
eadc.datavalid.vi = (datavalid & 0x00000200)?(true):(false);//指示空速
eadc.datavalid.vt = (datavalid & 0x00000400)?(true):(false);//真空速
eadc.datavalid.adr = (datavalid & 0x00000800)?(true):(false);//大气密度比
eadc.datavalid.aoai1 = (datavalid & 0x00001000)?(true):(false);//局部攻角1
eadc.datavalid.aoai2 = (datavalid & 0x00002000)?(true):(false);//局部攻角2
eadc.datavalid.aoat1 = (datavalid & 0x00004000)?(true):(false);//真攻角1
eadc.datavalid.aoat2 = (datavalid & 0x00008000)?(true):(false);//真攻角2
eadc.datavalid.aosi1 = (datavalid & 0x00010000)?(true):(false);//局部侧滑角1
eadc.datavalid.aosi2 = (datavalid & 0x00020000)?(true):(false);//局部侧滑角2
eadc.datavalid.aost1 = (datavalid & 0x00040000)?(true):(false);//真侧滑角1
eadc.datavalid.aost2 = (datavalid & 0x00080000)?(true):(false);//真侧滑角2
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.coffpress_k0 = src.i[0] * 1.0/256;//压力校准系数K0
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.coffpress_k1 = src.i[0] * 1.0/256;//压力校准系数K1
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.coffpress_k2 = src.i[0] * 1.0/256;//压力校准系数K2
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.coffpress_k3 = src.i[0] * 1.0/256;//压力校准系数K3
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.coffangle_k0 = src.i[0] * 1.0/1024;//攻角侧滑角校准系数K0
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.coffangle_k1 = src.i[0] * 1.0/1024;//攻角侧滑角校准系数K1
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.coffangle_k2 = src.i[0] * 1.0/1024;//攻角侧滑角校准系数K2
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.coffangle_k3 = src.i[0] * 1.0/1024;//攻角侧滑角校准系数K3
emit EADC_Info(eadc);
}
if(raw.size() >= 79)//74~78
{
_ecu ecu;
QByteArray data = raw.mid(74,5);
ecu.rpm = data[0] * 3000.0 / 255;
ecu.t1 = data[1] * 0.6 / 255;
ecu.p2 = (data[2] - 0x84) / 55.0 * (85 + 55) - 55;
ecu.servo_current = data[3] * 150.0 / 255;
switch (data[4]) {
case 0x00:
ecu.states = tr("转速大于600r/min");
break;
case 0xA5:
ecu.states = tr("收到起动指令并且判断出发动机起动正常");
break;
case 0xA1:
ecu.states = tr("收到起动指令后还未判断出发动机起动是否正常");
break;
case 0xAF:
ecu.states = tr("收到起动指令并且判断出发动机起动异常");
break;
case 0xC5:
ecu.states = tr("收到转级指令并且判断出发动机转级正常");
break;
case 0xC1:
ecu.states = tr("收到转级指令后还未判断出发动机转级是否正常");
break;
case 0xCF:
ecu.states = tr("收到转级指令并且发动机转级异常");
break;
case 0xFF:
ecu.states = tr("收到飞控阶段指令");
break;
default:
break;
}
if(ecu.p2 < 0.15)
{
ecu.p2_high = tr("滑油压力过低");
}
else if(ecu.p2 > 0.28)
{
ecu.p2_high = tr("滑油压力过高");
}
else{
ecu.p2_high = tr("滑油压力正常");
}
emit ECU_Info(ecu);
}
if(raw.size() >= 97)//79~98
{
_sspc sspc;
QByteArray data = raw.mid(79,18);
sspc.bus_voltage = data[0];
sspc.battery_voltage = 10 + data[1] * 0.1;
sspc.battery_current = data[2];
sspc.main_voltage = 10 + data[3] * 0.1;
sspc.main_current = data[4];
sspc.current_ch1 = data[5] * 0.2;
sspc.current_ch2 = data[6] * 0.2;
sspc.current_ch3 = data[7] * 0.1;
sspc.current_ch4 = data[8] * 0.1;
sspc.current_ch5 = data[9] * 0.1;
sspc.current_ch6 = data[10] * 0.1;
sspc.current_ch7 = data[11] * 0.1;
sspc.current_ch8 = data[12] * 0.1;
sspc.current_ch9 = data[13] * 0.1;
sspc.current_ch10 = data[14] * 0.1;
sspc.current_ch11 = data[15] * 0.1;
sspc.current_ch12 = data[16] * 0.1;
sspc.current_ch13 = data[17] * 0.1;
emit SSPC_Info(sspc);
}
}break;
}
break;//退出,结束线程
}
qDebug() << "thread finished, time: " << time.elapsed() << "ms";
}
void Parse::parseData(const int &id,const QByteArray &data)
{
index = id;
raw.push_back(data);
}
+228
View File
@@ -0,0 +1,228 @@
#ifndef PARSE_H
#define PARSE_H
#include <QObject>
#include "QRunnable"
#include "QDebug"
#include "QThread"
#include "QElapsedTimer"
#include "QtMath"
class Parse : public QObject, public QRunnable
{
Q_OBJECT
public:
typedef struct
{
qreal roll_rate;//滚转角速度
qreal yaw_rate;//偏航角速度
qreal pitch_rate;//俯仰角速度
qreal yaw;//航向角
qreal pitch;//俯仰角
qreal roll;//滚转角
qreal ax;//机体纵向加速度
qreal ay;//机体法向加速度
qreal az;//机体侧向加速度
}_ins;//1~18
typedef struct
{
struct{
QString navStatus;//D7D6 导航状态
QString insStatus;//D5D4 组合状态
QString headingSrc;//D3D2 航向信号源
QString Satellite;//D1D0 卫星信号源
}state1;//工作状态字
qreal longitude;//位置经度
qreal latitude;//位置纬度
qreal altitude;//组合高度
quint16 worktime;//本状态工作时间
qreal Ve;//东向速度
qreal Vn;//北向速度
qreal Vu;//天向速度
qreal Gs;//地速
qreal heading;//航迹角
qreal Ae;//东向加速度
qreal An;//北向加速度
qreal Au;//天向加速度
qreal satellite_longitude;//卫星经度
qreal satellite_latitude;//卫星纬度
qreal satellite_altitude;//卫星高度
qreal satellite_Ve;//卫星东向速度
qreal satellite_Vn;//卫星北向速度
qreal satellite_Vu;//卫星天向速度
struct
{
QString ins;//惯导数据有效位
QString altitude;//组合高度有效位
QString exRTK;//外置差分数据有效位
QString exSatellite;//外置卫星数据有效位
QString RTK;//内置差分数据有效位
QString satellite;//内置卫星数据有效位
QString heading;//双天线航向有效位
QString communication;//通讯状态
}state2;
struct
{
QString back7;//
QString das;//大气数据有效位
QString install;//外部状态偏角有效位
QString back4;//
QString altitudeInfo;//D3D2 高度阻尼信号
QString back1;//
QString back0;//
}state3;
quint16 year;//UTC年
quint8 month;//UTC月
quint8 day;//UTC日
quint8 hour;//UTC时
quint8 minute;//UTC分
qreal second;//UTC秒
}_nav;//19~73
typedef struct
{
QString heatmode;//加温模式
QString heatstatus;//加温状态
qreal psi;//指示静压
qreal ps;//真实静压
qreal qci;//指示动压
qreal qc;//真实动压
qreal hp;//气压高度
qreal hpr;//升降速度
qreal ts;//静温
qreal tt;//总温
qreal mi;//马赫数
qreal vi;//指示空速
qreal vt;//真空速
qreal adr;//大气密度比
qreal aoai1;//局部攻角1
qreal aoai2;//局部攻角2
qreal aoat1;//真攻角1
qreal aoat2;//真攻角2
qreal aosi1;//局部侧滑角1
qreal aosi2;//局部侧滑角2
qreal aost1;//真侧滑角1
qreal aost2;//真侧滑角2
struct
{
bool ps;//静压传感器故障
bool qc;//动压传感器故障
bool ts;//静温传感器故障
bool aoa1;//攻角1故障
bool aoa2;//攻角2故障
bool aos1;//侧滑角1故障
bool aos2;//侧滑角2故障
bool heat;//加热故障
bool ex_storage;//外部存储故障
bool aoa_diff;//双余度攻角不跟随故障
bool aos_diff;//双余度侧滑角不跟随故障
bool qc_zero;//动压零位过度修正
bool back1;
bool back2;
bool overtemp;//管头过热故障
bool system;//大气数据计算机故障
}faultword;//故障字
struct
{
bool psi;//指示静压
bool ps;//真实静压
bool qci;//指示动压
bool qc;//真实动压
bool hp;//气压高度
bool hpr;//升降速度
bool ts;//静温
bool tt;//总温
bool mi;//马赫数
bool vi;//指示空速
bool vt;//真空速
bool adr;//大气密度比
bool aoai1;//局部攻角1
bool aoai2;//局部攻角2
bool aoat1;//真攻角1
bool aoat2;//真攻角2
bool aosi1;//局部侧滑角1
bool aosi2;//局部侧滑角2
bool aost1;//真侧滑角1
bool aost2;//真侧滑角2
}datavalid;//数据有效性
qreal coffpress_k0;//压力校准系数K0
qreal coffpress_k1;//压力校准系数K1
qreal coffpress_k2;//压力校准系数K2
qreal coffpress_k3;//压力校准系数K3
qreal coffangle_k0;//攻角侧滑角校准系数K0
qreal coffangle_k1;//攻角侧滑角校准系数K1
qreal coffangle_k2;//攻角侧滑角校准系数K2
qreal coffangle_k3;//攻角侧滑角校准系数K3
}_eadc;
typedef struct
{
qreal rpm;//rpm 0~30000
qreal t1;//℃ -60~+90
qreal t5;//℃ 报警大于900
qreal p2;//MPa 报警大于 0.28 或小于 0.15
qreal servo_current;//mA 0~150
QString oil_low;//小于 0.15
QString p2_high;//大于900
QString states;
}_ecu;
typedef struct
{
qreal bus_voltage;//汇流条电压
qreal battery_voltage;//蓄电池电压
qreal battery_current;//蓄电池电流
qreal main_voltage;//主电源电压
qreal main_current;//主电源电流
qreal current_ch1;//燃油泵及流量计 (32A)
qreal current_ch2;//副翼及前起舵机(22A)
qreal current_ch3;//56V电池加温1 (10A)
qreal current_ch4;//28V电池加温(10A)
qreal current_ch5;//智能计算机(2A)
qreal current_ch6;//发动机控制器(2A)
qreal current_ch7;//空速管加温 (2A)
qreal current_ch8;//温度变换器(1A)
qreal current_ch9;//燃油切断阀(1A)
qreal current_ch10;//56V电池加温2 (10A)
qreal current_ch11;//垂直舵机(6A)
qreal current_ch12;//56V并网(5A)
qreal current_ch13;//滑油压力变换器(1A)
}_sspc;
explicit Parse(QObject *parent = nullptr);
~Parse();
void run() override;
public slots:
void parseData(const int &id, const QByteArray &data);
signals:
void INS_Info(Parse::_ins info);
void NAV_Info(Parse::_nav info);
void EADC_Info(Parse::_eadc info);
void ECU_Info(Parse::_ecu info);
void SSPC_Info(Parse::_sspc info);
private:
QByteArray raw;
int index;
};
#endif // PARSE_H
+27
View File
@@ -0,0 +1,27 @@
#include "Template.h"
#include "ui_Template.h"
Template::Template(QWidget *parent) :
ToolsWidget(parent),
ui(new Ui::Template)
{
ui->setupUi(this);
QFile file(":/qss/Template.qss");
file.open(QFile::ReadOnly);
QTextStream filetext(&file);
QString stylesheet = filetext.readAll();
this->setStyleSheet(stylesheet);
file.close();
setWindowTitle(tr("Template"));
}
Template::~Template()
{
delete ui;
}
+26
View File
@@ -0,0 +1,26 @@
#ifndef TEMPLATE_H
#define TEMPLATE_H
#include <QWidget>
#include "ToolsUI/ToolsWidget.h"
namespace Ui {
class Template;
}
class Template : public ToolsWidget
{
Q_OBJECT
public:
explicit Template(QWidget *parent = nullptr);
~Template();
public slots:
private:
Ui::Template *ui;
};
#endif // TEMPLATE_H
+41
View File
@@ -0,0 +1,41 @@
QT += opengl
QT += network
QT += sql
QT += svg
QT += quickwidgets
QT += quick
QT += qml
RESOURCES += \
$$PWD/Template.qrc
FORMS += \
$$PWD/Template.ui
HEADERS += \
$$PWD/Template.h
SOURCES += \
$$PWD/Template.cpp
+6
View File
@@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/qss">
<file>Template.qss</file>
</qresource>
<qresource prefix="/img"/>
</RCC>
+86
View File
@@ -0,0 +1,86 @@
.QFrame {
background-color: #FFFFFF;
}
.QProgressBar::chunk[state="0"]{
background-color: #00FF00;
width: 20px;
}
.QProgressBar::chunk[state="1"]{
background-color: #FF0000;
width: 20px;
}
.QPushButton {
background-color: #FFFFFF /*palegoldenrod*/;
border-width: 2px;
border-color: darkkhaki;
border-style: solid;
border-radius: 5;
padding: 3px;
font: 20px "Arial";
}
.QPushButton:pressed {
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #dadbde, stop: 1 #f6f7fa);
}
.QLabel {
font: 20px "Arial";
}
.QLabel[state="0"] {
border-image:url(:/img/success_rect.png);
}
.QLabel[state="1"] {
border-image:url(:/img/fail_rect.png);
}
.QLabel[state="2"] {
border-image:url(:/img/warning_rect.png);
}
.QLabel[state="3"] {
border-image:url(:/img/rect_gray.png);
}
.QComboBox {
background-color: #FFFFFF;
font: 20px "Arial";
}
.QCheckBox{
font: 20px "Arial";
width: 25px;
height: 25px;
}
.QCheckBox::indicator {
width: 15px;
height: 15px;
}
.QCheckBox::indicator[state="0"] {
image:url(:/img/normal.png);
}
.QCheckBox::indicator[state="1"] {
image:url(:/img/fail.png);
}
+48
View File
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Template</class>
<widget class="QWidget" name="Template">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>519</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
</layout>
</widget>
<resources/>
<connections/>
</ui>
+21 -10
View File
@@ -37,16 +37,23 @@ ToolsUI::ToolsUI(QWidget *parent) :
senser = new Senser();
remotecontrol = new RemoteControl();
ecu = new ECU();
install(index0 ,tr("Inspector"));
install(index1 ,tr("Log"));
install(index2 ,tr("Replay"));
install(index3 ,tr("Terminal"));
install(index4 ,tr("Servos"));
install(command ,tr("CommandBox"));
install(senser ,tr("Senser"));
install(remotecontrol,tr("RC"));
install(ecu ,tr("ECU"));
install(index0, 0,tr("Inspector"));
install(index1, 1,tr("Log"));
install(index2, 2,tr("Replay"));
install(index3, 3,tr("Terminal"));
install(index4, 4,tr("Servos"));
install(command, 7,tr("CommandBox"));
install(senser, 9,tr("Senser"));
install(remotecontrol,9,tr("RC"));
@@ -104,7 +111,7 @@ void ToolsUI::setPushButtonState(QWidget *w,state s)
}
void ToolsUI::install(ToolsWidget *widget,int key, QString name)
void ToolsUI::install(ToolsWidget *widget, QString name)
{
if(!ToolsList.values().contains(widget))
{
@@ -120,13 +127,17 @@ void ToolsUI::install(ToolsWidget *widget,int key, QString name)
connect(btn,&QPushButton::clicked,
this,&ToolsUI::btnClicked);
ui->gridLayout_Indexs->addWidget(btn,ToolsList.size(),1);
ui->gridLayout_Indexs->addWidget(btn,ToolsList.size(),1);
widget->setParent(ui->frame);
widget->setWindowTitle(name);
widget->setIcon(widget->Icon());
widget->hide();
ToolsList.insert(ToolsList.size(),widget);
//接收到信号,每个界面自己解析,获取自己想要的信息
connect(this,&ToolsUI::recieveData,
widget,&ToolsWidget::recieveData);
}
else
{
+7 -1
View File
@@ -19,6 +19,7 @@
#include "ToolsWidget.h"
#include "evtol/evtol.h"
#include "RemoteControl/remotecontrol.h"
#include "ECU/ECU.h"
namespace Ui {
class ToolsUI;
@@ -54,10 +55,13 @@ public:
RemoteControl *remotecontrol = nullptr;
ECU *ecu = nullptr;
private slots:
void install(ToolsWidget *widget, int key, QString name);
void install(ToolsWidget *widget, QString name);
void setPushButtonState(QWidget *w,state s);
void onTabIndexChanged(const int &index);
@@ -70,6 +74,8 @@ private slots:
signals:
void IndexChanged(const int &index);
void recieveData(const int &id,const QByteArray &data);
private:
Ui::ToolsUI *ui;
+2
View File
@@ -19,6 +19,8 @@ include (./Diagram/Diagram.pri)
include (./Senser/Senser.pri)
include (./evtol/evtol.pri)
include (./RemoteControl/RemoteControl.pri)
include (./ECU/ECU.pri)
include(./Template/Template.pri )
INCLUDEPATH += $$PWD/tools_Index0 \
+4
View File
@@ -74,6 +74,10 @@ void ToolsWidget::closeEvent(QCloseEvent *event)
event->ignore();
}
void ToolsWidget::recieveData(int const &id,const QByteArray &data)
{
}
+3
View File
@@ -42,6 +42,9 @@ signals:
public slots:
virtual void recieveData(const int &id, const QByteArray &data);
virtual void setFloat(void);
virtual void setColor(QWidget *w,state s);
virtual void setValue(QLabel *w, QString s);
+1 -1
View File
@@ -71,7 +71,7 @@ QSize GetDesktopSize() {
}
//return QSize(screen_width, screen_height);//最大1366*768
return QSize(1920, 1080);//最大1366*768
return QSize(1080, 720);//最大1366*768
}
void CheckDir(const QString &path) {
+4 -1
View File
@@ -367,6 +367,9 @@ MainWindow::MainWindow(QWidget *parent)
this,&MainWindow::setServoOffset);
//tools -------- dlink
connect(dlink->mavlinknode,SIGNAL(recieveData(int,QByteArray)),
toolsui,SIGNAL(recieveData(int,QByteArray)));
//command ----- dlink
@@ -1445,7 +1448,7 @@ void MainWindow::updateVehicle(MavLinkNode::_vehicle vehicle)//事件驱动式
menuBarUI->setTargetAlt(vehicle.sys_status.load);
qDebug() << "time" << time;
//qDebug() << "time" << time;
uint8_t hour = time / 3600;//得出小时
uint8_t min = (time - hour * 3600)/60;//得出分钟
+15
View File
@@ -984,6 +984,8 @@ void MavLinkNode::StatusParse(mavlink_message_t msg)
emit signal_servo_output_raw(vehicle.servo_output_raw);
}break;
case MAVLINK_MSG_ID_RC_CHANNELS_RAW: {
mavlink_msg_rc_channels_raw_decode(&msg,&vehicle.rc_channels_raw);
@@ -1155,6 +1157,19 @@ void MavLinkNode::StatusParse(mavlink_message_t msg)
}break;
case MAVLINK_MSG_ID_ENCAPSULATED_DATA: {
mavlink_encapsulated_data_t encapsulated_data;
mavlink_msg_encapsulated_data_decode(&msg,&encapsulated_data);
QByteArray data((const char *)encapsulated_data.data);
emit recieveData(encapsulated_data.seqnr,data);
}break;
}
+5
View File
@@ -237,6 +237,11 @@ signals:
void setPos(int sysid,int compid,double x,double y,double z);
void setHeading(int sysid,int compid,double x,double y,double z);
void recieveData(const int &id,const QByteArray &data);
public slots:
//线程对外接口
void CreateCSV(void);
+1 -1
View File
@@ -26,7 +26,7 @@ class AltitudeItem : public QObject, public QGraphicsItem {
Q_OBJECT Q_INTERFACES(QGraphicsItem)
public:
enum { Type = UserType + 5 };
AltitudeItem(MapGraphicItem *map, QColor background = Qt::green);
+1 -1
View File
@@ -19,7 +19,7 @@ class VirtualMargin : public QObject, public QGraphicsItem {
Q_OBJECT Q_INTERFACES(QGraphicsItem)
public:
enum { Type = UserType + 4 };
enum { Type = UserType + 11 };
VirtualMargin(int index,internals::PointLatLng const & coord, int const & altitude, QBrush color, MapGraphicItem *map);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget);
QRectF boundingRect() const;
+1 -1
View File
@@ -25,7 +25,7 @@ class VirtualMarginLine : public QObject, public QGraphicsLineItem {
Q_OBJECT Q_INTERFACES(QGraphicsItem)
public:
enum { Type = UserType + 8 };
enum { Type = UserType + 10 };
VirtualMarginLine(VirtualMargin *from, VirtualMargin *to, MapGraphicItem *map, QColor color = Qt::green, bool dashed = false, int width = 2);
int type() const;
QPainterPath shape() const;