Files
gcs-nf/App/ToolsUI/Parse.cpp
T
2022-07-29 01:43:16 +08:00

1685 lines
64 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "Parse.h"
Parse::Parse(QObject *parent) : QObject(parent)
{
setAutoDelete(true);
qRegisterMetaType<Parse::_ins>("Parse::_ins");
qRegisterMetaType<Parse::_nav>("Parse::_nav");
qRegisterMetaType<Parse::_eadc>("Parse::_eadc");
qRegisterMetaType<Parse::_ecu>("Parse::_ecu");
qRegisterMetaType<Parse::_sspc>("Parse::_sspc");
qRegisterMetaType<Parse::_gear>("Parse::_gear");
qRegisterMetaType<Parse::_actuator>("Parse::_actuator");
qRegisterMetaType<Parse::_actuator1>("Parse::_actuator1");
qRegisterMetaType<Parse::_actuator2>("Parse::_actuator2");
qRegisterMetaType<Parse::_imu>("Parse::_imu");
qRegisterMetaType<Parse::_euler>("Parse::_euler");
qRegisterMetaType<Parse::_vel>("Parse::_vel");
qRegisterMetaType<Parse::_pos>("Parse::_pos");
}
Parse::~Parse()
{
}
void Parse::run()
{
QElapsedTimer time;
time.start();
//qDebug() << "current thread is:" << QThread::currentThread();
while (raw.size() > 0) {
//qDebug() << "size" <<raw.size();
switch (index) {
case 0x00:
{
if(raw.size() >= 18)//0~17 INS
{
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);
_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] * M_PI/32767 * 57.29;//航向角
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
ins.pitch = src.i[0] * M_PI/32767 * 57.29;//俯仰角
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
ins.roll = src.i[0] * M_PI/32767 * 57.29;//滚转角
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;//机体侧向加速度
/*
qDebug() << ins.roll_rate
<< ins.yaw_rate
<< ins.pitch_rate
<< ins.yaw
<< ins.pitch
<< ins.roll
<< ins.ax
<< ins.ay
<< ins.az;
*/
emit INS_Info(ins);
}
if(raw.size() >= 73)//18~72 NAV
{
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(18);
_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++];
//D7D6 导航状态
switch (state1.nav) {
case 0x01:
nav.state1.navStatus = tr("准备");
break;
case 0x02:
nav.state1.navStatus = tr("对准");
break;
case 0x03:
nav.state1.navStatus = tr("导航");
break;
}
//D5D4 组合状态
switch (state1.ins) {
case 0x00:
nav.state1.insStatus = tr("纯惯导");
break;
case 0x01:
nav.state1.insStatus = tr("惯性/卫星组合");
break;
case 0x02:
nav.state1.insStatus = tr("惯性/差分卫星组合");
break;
case 0x03:
nav.state1.insStatus = tr("预留");
break;
}
//D3D2 航向信号源
switch (state1.heading) {
case 0x00:
nav.state1.headingSrc = tr("未使用外部航向");
break;
case 0x01:
nav.state1.headingSrc = tr("使用双天线航向");
break;
case 0x02:
nav.state1.headingSrc = tr("使用磁航向");
break;
}
//D1D0 卫星信号源
switch (state1.Satellite) {
case 0x01:
nav.state1.Satellite = tr("未使用卫星");
break;
case 0x02:
nav.state1.Satellite = tr("使用内部卫星");
break;
case 0x03:
nav.state1.Satellite = 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++];
nav.longitude = src.h * M_PI / (0x7FFFFFFF - 1) * 57.29;//位置经度
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) * 57.29;//位置纬度
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) * 57.29;//航迹角
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) * 57.29;//卫星经度
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) * 57.29;//卫星纬度
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;//惯导数据有效位
nav.state2.altitude = state2.altitude;//组合高度有效位
nav.state2.exRTK = state2.exRTK;//外置差分数据有效位
nav.state2.exSatellite = state2.exSatellite;//外置卫星数据有效位
nav.state2.RTK = state2.RTK;//内置差分数据有效位
nav.state2.satellite = state2.satellite;//内置卫星数据有效位
nav.state2.heading = state2.heading;//双天线航向有效位
nav.state2.communication = state2.communication;//通讯状态
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;//
nav.state3.das = state3.das;//大气数据有效位
nav.state3.install = state3.install;//外部状态偏角有效位
nav.state3.back4 = state3.back4;//
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;//
nav.state3.back0 = state3.back0;//
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);
}
if(raw.size() >= 115)//73~114 GEAR
{
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(73);
_gear group;
int data_count = 0;
int swidx = 0;
group.SW[swidx++] = (((uint8_t)data[0] & 0x80) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[0] & 0x40) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[0] & 0x20) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[0] & 0x10) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[0] & 0x08) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[0] & 0x04) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[0] & 0x02) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[0] & 0x01) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[1] & 0x80) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[1] & 0x40) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[1] & 0x20) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[1] & 0x10) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[1] & 0x08) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[1] & 0x04) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[1] & 0x02) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[1] & 0x01) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[2] & 0x80) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[2] & 0x40) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[2] & 0x20) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[2] & 0x10) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[2] & 0x08) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[2] & 0x04) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[2] & 0x02) > 0)?(true):(false);
group.SW[swidx++] = (((uint8_t)data[2] & 0x01) > 0)?(true):(false);
data_count = 3;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.LeftPressure = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.RightPressure = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.AirPressure = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.LeftWheel = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.RightWheel = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.rpm3 = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.rpm4 = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.fuel = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.cpu_load = src.I[0];
swidx = 0;
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x80) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x40) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x20) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x10) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x08) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x04) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x02) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x01) > 0)?(true):(false);
data_count++;
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x80) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x40) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x20) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x10) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x08) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x04) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x02) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x01) > 0)?(true):(false);
data_count++;
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x80) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x40) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x20) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x10) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x08) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x04) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x02) > 0)?(true):(false);
group.DO[swidx++] = (((uint8_t)data[data_count] & 0x01) > 0)?(true):(false);
data_count++;
group.cmd = (data[data_count++])?(true):(false);
group.status = data[data_count++];
emit gear_Info(group);
}
if(raw.size() >= 127)//115~126 ACT
{
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(110);
_actuator group;
int data_count = 0;
//qDebug() << "index 0:" << data.size() << data;
group.type = data[data_count++];
group.id = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.wheel = src.i[0] * 60.0 / 0x7FF;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.left_trans = src.i[0] * 55.0 / 0x7FF;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.right_trans = src.i[0] * 55.0 / 0x7FF;
group.status = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.current = src.i[0] * 0.1;
group.temp = data[data_count++];
emit actuator_info(group);
}
if(raw.size() >= 141)//127~140 ACT1
{
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(122);
_actuator1 group;
int data_count = 0;
group.type = data[data_count++];
group.id = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.left_ail = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.right_ail = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.left_rud = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.right_rud = src.i[0];
group.status = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.current = src.i[0];
group.temp = data[data_count++];
emit actuator1_info(group);
}
if(raw.size() >= 155)//141~154 ACT2
{
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(136);
_actuator2 group;
int data_count = 0;
group.type = data[data_count++];
group.id = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.left_ele = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.right_ele = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.left_brake = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.right_brake = src.i[0];
group.status = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.current = src.i[0];
group.temp = data[data_count++];
emit actuator2_info(group);
}
if(raw.size() >= 213)//155~212 IMU
{
union{uint8_t B[4];uint16_t I[2]; int16_t i[2]; uint32_t H; int32_t h;float F;}src;
union//
{
quint16 byte;
struct
{
bool com_ok:1;//0
bool status_bit:1;
bool accel_x_bit:1;
bool accel_y_bit:1;
bool accel_z_bit:1;
bool gyro_x_bit:1;
bool gyro_y_bit:1;
bool gyro_z_bit:1;
bool accel_in_range:1;
bool gyro_in_range:1;//9
};
}status;
QByteArray data = raw.mid(150);
_imu group;
int data_count = 0;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.time_stamp = src.H;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
status.byte = src.I[0];
group.status.com_ok = status.com_ok;//0
group.status.status_bit = status.status_bit;
group.status.accel_x_bit = status.accel_x_bit;
group.status.accel_y_bit = status.accel_y_bit;
group.status.accel_z_bit = status.accel_z_bit;
group.status.gyro_x_bit = status.gyro_x_bit;
group.status.gyro_y_bit = status.gyro_y_bit;
group.status.gyro_z_bit = status.gyro_z_bit;
group.status.accel_in_range = status.accel_in_range;
group.status.gyro_in_range = status.gyro_in_range;//9
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.accel_x = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.accel_y = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.accel_z = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.gyro_x = src.F * 57.29;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.gyro_y = src.F * 57.29;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.gyro_z = src.F * 57.29;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.temp = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.delta_vel_x = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.delta_vel_y = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.delta_vel_z = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.delta_angle_x = src.F * 57.29;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.delta_angle_y = src.F * 57.29;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.delta_angle_z = src.F * 57.29;
emit imu_info(group);
}
if(raw.size() >= 245)//213~244 EULER
{
union{uint8_t B[4];uint16_t I[2]; int16_t i[2]; uint32_t H; int32_t h;float F;}src;
union//
{
quint32 byte;
struct
{
quint8 solutionMode:4;//0-3
bool attitude_valid:1;//4
bool heading_valid:1;//5
bool velocity_valid:1;//6
bool position_valid:1;//7
bool vert_ref_used:1;//8
bool mag_ref_used:1;//9
bool gps1_vel_used:1;//10
bool gps1_pos_used:1;//11
bool none1:1;
bool gps1_hdt_used:1;//13
bool gps2_vel_used:1;//14
bool gps2_pos_used:1;//15
bool none2:1;
bool gps2_hdt_used:1;//17
bool odo_used:1;//18
bool dvl_bt_used:1;//19
bool dvl_wt_used:1;//20
quint8 none3:3;
bool usel_used:1;//24
bool air_data_used:1;//25
bool zupt_used:1;//26
bool align_valid:1;//27
bool depth_used:1;//28
};
}status;
QByteArray data = raw.mid(208);
_euler group;
int data_count = 0;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.time_stamp = src.H;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.roll = src.F * 57.29;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.pitch = src.F * 57.29;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.yaw = src.F * 57.29;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.roll_acc = src.F * 57.29;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.pitch_acc = src.F * 57.29;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.yaw_acc = src.F * 57.29;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
status.byte = src.H;
switch (status.solutionMode& 0x07) {
case 0:
group.solution.solutionMode = tr("UNINITIALIZED");
break;
case 1:
group.solution.solutionMode = tr("VERTICAL_GYRO");
break;
case 2:
group.solution.solutionMode = tr("AHRS");
break;
case 3:
group.solution.solutionMode = tr("NAV_VELOCITY");
break;
case 4:
group.solution.solutionMode = tr("NAV_POSTION");
break;
}
group.solution.attitude_valid = status.attitude_valid;
group.solution.heading_valid = status.heading_valid;
group.solution.velocity_valid = status.velocity_valid;
group.solution.position_valid = status.position_valid;
group.solution.vert_ref_used = status.vert_ref_used;
group.solution.mag_ref_used = status.mag_ref_used;
group.solution.gps1_vel_used = status.gps1_vel_used;
group.solution.gps1_pos_used = status.gps1_pos_used;
group.solution.gps1_hdt_used = status.gps1_hdt_used;
group.solution.gps2_vel_used = status.gps2_vel_used;
group.solution.gps2_pos_used = status.gps2_pos_used;
group.solution.gps2_hdt_used = status.gps2_hdt_used;
group.solution.odo_used = status.odo_used;
group.solution.dvl_bt_used = status.dvl_bt_used;
group.solution.dvl_wt_used = status.dvl_wt_used;
group.solution.usel_used = status.usel_used;
group.solution.air_data_used = status.air_data_used;
group.solution.zupt_used = status.zupt_used;
group.solution.align_valid = status.align_valid;
group.solution.depth_used = status.depth_used;
emit euler_info(group);
}
if(raw.size() >= 253)//245~252 zero
{
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(240);
_euler group;
int data_count = 0;
}
}break;
case 0x01:
{
if(raw.size() >= 74)//0~73 EADC
{
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);
_eadc eadc;
int data_count = 0;
//加温模式
switch ((uint8_t)data[data_count++]) {
case 0x33:
eadc.heatmode = tr("强制加温");
break;
case 0x66:
eadc.heatmode = tr("强制不加温");
break;
case 0x99:
eadc.heatmode = tr("自动加温控制");
break;
}
//加温状态
//qDebug() << QString::number(data[data_count],16).toUpper();
switch ((uint8_t)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 * 1000.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 * 1000.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 * 1000.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 * 1000.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/57.6;//指示空速
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
eadc.vt = src.I[0] * 1.0/57.6;//真空速
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() >= 83)//74~82 ECU
{
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(74);
_ecu group;
int data_count = 0;
group.rpm_c = data[0] * (29500.0*0.39) / 255 + 17995;
src.B[0] = data[1];
src.B[1] = data[2];
group.rpm = src.I[0] * 30000.0 / 65535;
src.B[0] = data[3];
src.B[1] = data[4];
group.rpm_t = src.I[0] * 30000.0 / 65535;
group.t1 = ((quint8)data[5] - 0x84) * (85.0 + 55.0)/85.0 - 55;
group.p2 = data[6] * 0.6 / 255;
group.servo_current = data[7] * 150.0 / 255;
//qDebug() << QString::number((quint8)data[5],16) << group.t1;
switch ((uint8_t)data[8]) {
case 0x00:
group.states = tr("转速大于600r/min,未收到转速指令");
break;
case 0xA0:
group.states = tr("转速大于600r/min,转速未到达设定值");
break;
case 0xA1:
group.states = tr("收到转速指令,转速未到达设定值");
break;
case 0xA4:
group.states = tr("转速大于600r/min,并且判断出发动机起动正常");
break;
case 0xA5:
group.states = tr("收到起动指令并且判断出发动机起动正常");
break;
case 0xAE:
group.states = tr("未收到启动指令且判断出发动机启动异常");
break;
case 0xAF:
group.states = tr("收到起动指令并且判断出发动机起动异常");
break;
case 0xA6:
group.states = tr("飞行阶段受最小物理转速22650rpm,限制未达到指令合折转速");
break;
case 0xA7:
group.states = tr("飞行阶段受最小物理转速29000rpm,限制未达到指令合折转速");
break;
case 0xC5:
group.states = tr("收到降落A指令,判断出发动机降落A阶段正常");
break;
case 0xC6:
group.states = tr("在降落A阶段,受最小物理转速18000rpm限制未达到指令合折转速");
break;
case 0xD5:
group.states = tr("收到降落B指令,判断出发动机降落B阶段正常");
break;
case 0xD6:
group.states = tr("在降落B阶段,受最小物理转速20650rpm限制未达到指令合折转速");
break;
case 0xD7:
group.states = tr("在降落B阶段,受最大物理转速29000rpm限制未达到指令合折转速");
break;
case 0xE1:
group.states = tr("在飞行和降落阶段发动机物理转速小于14000rpm,判定为发动机异常停车");
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(group);
}
if(raw.size() >= 101)//83~100 SSPC
{
_sspc sspc;
QByteArray data = raw.mid(83);
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);
}
if(raw.size() >= 113)//101~112 ACT
{
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(101);
//QByteArray data = raw.mid(110);
_actuator group;
int data_count = 0;
//qDebug() << "index 1:" << data.size() << data;
group.type = data[data_count++];
group.id = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.wheel = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.left_trans = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.right_trans = src.i[0];
group.status = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.current = src.i[0];
group.temp = data[data_count++];
emit actuator_info(group);
}
if(raw.size() >= 127)//113~126 ACT1
{
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(113);
_actuator1 group;
int data_count = 0;
group.type = data[data_count++];
group.id = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.left_ail = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.right_ail = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.left_rud = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.right_rud = src.i[0];
group.status = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.current = src.i[0];
group.temp = data[data_count++];
emit actuator1_info(group);
}
if(raw.size() >= 141)//127~140 ACT2
{
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(127);
_actuator2 group;
int data_count = 0;
group.type = data[data_count++];
group.id = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.left_ele = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.right_ele = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.left_brake = src.i[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.right_brake = src.i[0];
group.status = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.current = src.i[0];
group.temp = data[data_count++];
emit actuator2_info(group);
}
if(raw.size() >= 185)//141~184 GPS_VEL
{
union{uint8_t B[4];uint16_t I[2]; int16_t i[2]; uint32_t H; int32_t h;float F;}src;
union//
{
quint32 byte;
struct
{
quint8 stats:6;
quint8 type:6;
quint32 none1:20;
};
}status;
QByteArray data = raw.mid(141);
_vel group;
int data_count = 0;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.time_stamp = src.H;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
status.byte = src.H;
switch (status.stats& 0x03) {
case 0:
group.status.vel_status = tr("SOL_COMPUTED");
break;
case 1:
group.status.vel_status = tr("INSUFFICIENT_OBS");
break;
case 2:
group.status.vel_status = tr("INTERNAL_ERROR");
break;
case 3:
group.status.vel_status = tr("LIMIT");
break;
default:
group.status.vel_status = tr("undefined status");
}
group.status.status_value = status.stats;
switch (status.type& 0x03) {
case 0:
group.status.vel_type = tr("NO_SOLUTION");
break;
case 1:
group.status.vel_type = tr("UNKNOWN_TYPE");
break;
case 2:
group.status.vel_type = tr("DOPPLER");
break;
case 3:
group.status.vel_type = tr("DIFFERENTIAL");
break;
default:
group.status.vel_type = tr("undefined status");
}
group.status.type_value = status.type;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.tow = src.H;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.vel_n = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.vel_e = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.vel_d = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.vel_acc_n = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.vel_acc_e = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.vel_acc_d = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.course = src.F;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.course_acc = src.F;
emit vel_info(group);
}
if(raw.size() >= 242)//185~241 GPS_POS
{
union{uint8_t B[8];uint16_t I[4]; int16_t i[4]; uint32_t H[2]; int32_t h[2];float F[2];double D;}src;
union//
{
quint32 byte;
struct
{
quint8 stats:6;
quint8 type:6;
quint8 GPS_L1:1;
quint8 GPS_L2:1;
quint8 GPS_L5:1;
quint8 GLO_L1:1;
quint8 GLO_L2:1;
quint8 GLO_L3:1;
quint8 GLA_E1:1;
quint8 GLA_E5A:1;
quint8 GLA_E5B:1;
quint8 GLA_E5ALT:1;
quint8 GLA_E6:1;
quint8 BDS_B1:1;
quint8 BDS_B2:1;
quint8 BDS_B3:1;
quint8 NONE:6;
};
}status;
QByteArray data = raw.mid(185);
_pos group;
int data_count = 0;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.time_stamp = src.H[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
status.byte = src.H[0];
switch (status.stats& 0x03) {
case 0:
group.status.pos_status = tr("SOL_COMPUTED");
break;
case 1:
group.status.pos_status = tr("INSUFFICIENT_OBS");
break;
case 2:
group.status.pos_status = tr("INTERNAL_ERROR");
break;
case 3:
group.status.pos_status = tr("HEIGHT_LIMIT");
break;
default:
group.status.pos_status = tr("undefined status");
}
group.status.status_value = status.stats;
switch ((quint8)status.type& 0x0F) {
case 0:
group.status.pos_type = tr("NO_SOLUTION");
break;
case 1:
group.status.pos_type = tr("PUNKNOWN_TYPE");
break;
case 2:
group.status.pos_type = tr("SINGLE");
break;
case 3:
group.status.pos_type = tr("PSRDIFF");
break;
case 4:
group.status.pos_type = tr("SBAS");
break;
case 5:
group.status.pos_type = tr("OMNISTAR");
break;
case 6:
group.status.pos_type = tr("RTK_FLOAT");
break;
case 7:
group.status.pos_type = tr("RTK_INT");
break;
case 8:
group.status.pos_type = tr("PPP_FLOAT");
break;
case 9:
group.status.pos_type = tr("PPP_INT");
break;
case 10:
group.status.pos_type = tr("FIXED");
break;
default:
group.status.pos_type = tr("undefined status");
}
group.status.type_value = status.type;
group.status.gps_l1_used = status.GPS_L1;
group.status.gps_l2_used = status.GPS_L2;
group.status.gps_l5_used = status.GPS_L5;
group.status.glo_l1_used = status.GLO_L1;
group.status.glo_l2_used = status.GLO_L2;
group.status.glo_l3_used = status.GLO_L3;
group.status.gal_e1_used = status.GLA_E1;
group.status.gal_e5a_used = status.GLA_E5A;
group.status.gal_e5b_used = status.GLA_E5B;
group.status.gal_e5alt_used = status.GLA_E5ALT;
group.status.gal_e6_used = status.GLA_E6;
group.status.bds_b1_used = status.BDS_B1;
group.status.bds_b2_used = status.BDS_B2;
group.status.bds_b3_used = status.BDS_B3;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.tow = src.H[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
src.B[4] = data[data_count++];
src.B[5] = data[data_count++];
src.B[6] = data[data_count++];
src.B[7] = data[data_count++];
group.lat = src.D;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
src.B[4] = data[data_count++];
src.B[5] = data[data_count++];
src.B[6] = data[data_count++];
src.B[7] = data[data_count++];
group.lng = src.D;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
src.B[4] = data[data_count++];
src.B[5] = data[data_count++];
src.B[6] = data[data_count++];
src.B[7] = data[data_count++];
group.alt = src.D;
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.undulation = src.F[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.pos_acc_lat = src.F[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.pos_acc_lng = src.F[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
src.B[2] = data[data_count++];
src.B[3] = data[data_count++];
group.pos_acc_alt = src.F[0];
group.num_sv_used = data[data_count++];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.base_station_id = src.I[0];
src.B[0] = data[data_count++];
src.B[1] = data[data_count++];
group.diff_age = src.I[0];
emit pos_info(group);
}
if(raw.size() >= 253)//242~252 zero
{
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(242);
_euler group;
int data_count = 0;
//qDebug() << data.size() << data;
}
}break;
}
break;//退出,结束线程
}
//qDebug() << "thread finished, time: " << time.elapsed() << "ms";
}
void Parse::parseData(const int id, const QByteArray data)
{
index = id;
//raw.push_back(data);
raw = data;
/*
QString str;
QString str3 = data.toHex().data();//以十六进制显示
str3 = str3.toUpper ();//转换为大写
for(int i = 0;i<str3.length ();i+=2)//填加空格
{
QString st = str3.mid (i,2);
str += st;
str += " ";
}
qDebug() << "id" << id << ":" << str;
*/
}