XNSim/XNModels/XNATA04DataProcessor/XNATA04DataProcessor.cpp

585 lines
17 KiB
C++
Executable File
Raw Permalink 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 "XNATA04DataProcessor.h"
#include "XNATA04DataProcessor_p.h"
#include <XNCore/XNModelManager.h>
#include <XNCore/XNDDSManager.h>
#include <iostream>
XN_MODEL_INITIALIZE(XNATA04DataProcessor)
XNATA04DataProcessor::XNATA04DataProcessor() : XNModelObject(new XNATA04DataProcessorPrivate())
{
}
XNATA04DataProcessor::~XNATA04DataProcessor()
{
}
XNATA04DataProcessor::XNATA04DataProcessor(PrivateType *p) : XNModelObject(p)
{
}
void XNATA04DataProcessor::Initialize()
{
T_D();
XNModelObject::Initialize();
}
void XNATA04DataProcessor::PrepareForExecute()
{
T_D();
XNModelObject::PrepareForExecute();
RegisterRTEventHandler("C909::ATA04::AeroInput", std::bind(&XNATA04DataProcessor::OnAeroInput,
this, std::placeholders::_1));
RegisterRTEventHandler("C909::ATA04::WbInput", std::bind(&XNATA04DataProcessor::OnWbInput, this,
std::placeholders::_1));
RegisterRTEventHandler("C909::ATA04::GhInput", std::bind(&XNATA04DataProcessor::OnGhInput, this,
std::placeholders::_1));
d->_aeroInputInterface.Initialize(GetFramework(), GetUniqueId(), 2);
d->_aeroOutputInterface.Initialize(GetFramework(), GetUniqueId(), 1);
d->_aeroHeartbeatInterface.Initialize(GetFramework(), GetUniqueId(), 1);
d->_wbInputInterface.Initialize(GetFramework(), GetUniqueId(), 2);
d->_wbOutputInterface.Initialize(GetFramework(), GetUniqueId(), 1);
d->_wbHeartbeatInterface.Initialize(GetFramework(), GetUniqueId(), 1);
d->_ghInputInterface.Initialize(GetFramework(), GetUniqueId(), 2);
d->_ghOutputInterface.Initialize(GetFramework(), GetUniqueId(), 1);
d->_ghHeartbeatInterface.Initialize(GetFramework(), GetUniqueId(), 1);
}
void XNATA04DataProcessor::StepUpdate()
{
T_D();
XNModelObject::StepUpdate();
SendUdpData();
//SendUdpTestData();
}
void XNATA04DataProcessor::SendUdpData()
{
T_D();
SendAeroOutput();
SendWbOutput();
SendGhOutput();
SendAeroHeartbeat();
SendWbHeartbeat();
SendGhHeartbeat();
}
void XNATA04DataProcessor::SendAeroOutput()
{
T_D();
XNByteArray outputData = d->_aeroOutputInterface.getUDPPackage();
//填写数据头
outputData[0] = 0xa6; //XNSim
outputData[1] = 0xc0; //C909
outputData[2] = 0x04; //ATA04
outputData[3] = 0x00; //Aerodynamics
outputData[4] = 0x01; //Output
outputData[5] = 0x01; //向外部发送
int dataSize = (int)outputData[6] << 8 | (int)outputData[7];
if (dataSize != outputData.size()) {
LOG_WARNING("气动输出数据包大小错误不向UDP发送dataSize:%1 outputData.size():%2",
dataSize, outputData.size());
return;
}
TriggerRTEvent("SendUDPData", std::any(outputData));
}
void XNATA04DataProcessor::SendGhOutput()
{
T_D();
XNByteArray outputData = d->_ghOutputInterface.getUDPPackage();
//填写数据头
outputData[0] = 0xa6; //XNSim
outputData[1] = 0xc0; //C909
outputData[2] = 0x04; //ATA04
outputData[3] = 0x01; //GroundHandling
outputData[4] = 0x01; //Output
outputData[5] = 0x01; //向外部发送
int dataSize = (long)outputData[6] << 8 | (long)outputData[7];
if (dataSize != outputData.size()) {
LOG_WARNING("地操输出数据包大小错误不向UDP发送dataSize:%1 outputData.size():%2",
dataSize, outputData.size());
return;
}
TriggerRTEvent("SendUDPData", std::any(outputData));
}
void XNATA04DataProcessor::SendWbOutput()
{
T_D();
XNByteArray outputData = d->_wbOutputInterface.getUDPPackage();
//填写数据头
outputData[0] = 0xa6; //XNSim
outputData[1] = 0xc0; //C909
outputData[2] = 0x04; //ATA04
outputData[3] = 0x02; //WeightBalance
outputData[4] = 0x01; //Output
outputData[5] = 0x01; //向外部发送
int dataSize = (long)outputData[6] << 8 | (long)outputData[7];
if (dataSize != outputData.size()) {
LOG_WARNING("质量输出数据包大小错误不向UDP发送dataSize:%1 outputData.size():%2",
dataSize, outputData.size());
return;
}
TriggerRTEvent("SendUDPData", std::any(outputData));
}
void XNATA04DataProcessor::SendAeroHeartbeat()
{
T_D();
XNByteArray outputData = d->_aeroHeartbeatInterface.getUDPPackage();
//填写数据头
outputData[0] = 0xa6; //XNSim
outputData[1] = 0xc0; //C909
outputData[2] = 0x04; //ATA04
outputData[3] = 0x00; //Aerodynamics
outputData[4] = 0x02; //Heartbeat
outputData[5] = 0x01; //向外部发送
int dataSize = (long)outputData[6] << 8 | (long)outputData[7];
if (dataSize != outputData.size()) {
LOG_WARNING("气动心跳数据包大小错误不向UDP发送dataSize:%1 outputData.size():%2",
dataSize, outputData.size());
return;
}
TriggerRTEvent("SendUDPData", std::any(outputData));
}
void XNATA04DataProcessor::SendGhHeartbeat()
{
T_D();
XNByteArray outputData = d->_ghHeartbeatInterface.getUDPPackage();
//填写数据头
outputData[0] = 0xa6; //XNSim
outputData[1] = 0xc0; //C909
outputData[2] = 0x04; //ATA04
outputData[3] = 0x01; //GroundHandling
outputData[4] = 0x02; //Heartbeat
outputData[5] = 0x01; //向外部发送
int dataSize = (long)outputData[6] << 8 | (long)outputData[7];
if (dataSize != outputData.size()) {
LOG_WARNING("地操心跳数据包大小错误不向UDP发送dataSize:%1 outputData.size():%2",
dataSize, outputData.size());
return;
}
TriggerRTEvent("SendUDPData", std::any(outputData));
}
void XNATA04DataProcessor::SendWbHeartbeat()
{
T_D();
XNByteArray outputData = d->_wbHeartbeatInterface.getUDPPackage();
//填写数据头
outputData[0] = 0xa6; //XNSim
outputData[1] = 0xc0; //C909
outputData[2] = 0x04; //ATA04
outputData[3] = 0x02; //WeightBalance
outputData[4] = 0x02; //Heartbeat
outputData[5] = 0x01; //向外部发送
int dataSize = (long)outputData[6] << 8 | (long)outputData[7];
if (dataSize != outputData.size()) {
LOG_WARNING("质量心跳数据包大小错误不向UDP发送dataSize:%1 outputData.size():%2",
dataSize, outputData.size());
return;
}
TriggerRTEvent("SendUDPData", std::any(outputData));
}
void XNATA04DataProcessor::OnGhInput(const std::any &data)
{
T_D();
XNByteArray inputData = std::any_cast<XNByteArray>(data);
// 检查数据包头
if (inputData[0] != 0xa6) {
LOG_WARNING("接收到不是XNSim的数据包");
return;
}
if (inputData[1] != 0xc0) {
LOG_WARNING("接收到不是C909的数据包");
return;
}
if (inputData[2] != 0x04) {
LOG_WARNING("接收到不是ATA04的数据包");
return;
}
if (inputData[3] != 0x01) {
LOG_WARNING("接收到不是GroundHandling的数据包");
return;
}
if (inputData[4] != 0x00) {
LOG_WARNING("接收到不是输入结构体的数据包!");
return;
}
if (inputData[5] != 0x00) {
LOG_WARNING("接收到不是输入数据包!");
return;
}
size_t size = inputData[6];
size = size << 8 | inputData[7];
if (size != inputData.size()) {
LOG_WARNING("接收到的数据包大小不正确!");
return;
}
d->_ghInputInterface.setDataByUDPPackage(inputData);
}
void XNATA04DataProcessor::OnAeroInput(const std::any &data)
{
T_D();
XNByteArray inputData = std::any_cast<XNByteArray>(data);
// 检查数据包头
if (inputData[0] != 0xa6) {
LOG_WARNING("接收到不是XNSim的数据包");
return;
}
if (inputData[1] != 0xc0) {
LOG_WARNING("接收到不是C909的数据包");
return;
}
if (inputData[2] != 0x04) {
LOG_WARNING("接收到不是ATA04的数据包");
return;
}
if (inputData[3] != 0x00) {
LOG_WARNING("接收到不是Aerodynamics的数据包");
return;
}
if (inputData[4] != 0x00) {
LOG_WARNING("接收到不是输入结构体的数据包!");
return;
}
if (inputData[5] != 0x00) {
LOG_WARNING("接收到不是输入数据包!");
return;
}
size_t size = inputData[6];
size = size << 8 | inputData[7];
if (size != inputData.size()) {
LOG_WARNING("接收到的数据包大小不正确!");
return;
}
d->_aeroInputInterface.setDataByUDPPackage(inputData);
}
void XNATA04DataProcessor::OnWbInput(const std::any &data)
{
T_D();
XNByteArray inputData = std::any_cast<XNByteArray>(data);
// 检查数据包头
if (inputData[0] != 0xa6) {
LOG_WARNING("接收到不是XNSim的数据包");
return;
}
if (inputData[1] != 0xc0) {
LOG_WARNING("接收到不是C909的数据包");
return;
}
if (inputData[2] != 0x04) {
LOG_WARNING("接收到不是ATA04的数据包");
return;
}
if (inputData[3] != 0x02) {
LOG_WARNING("接收到不是WeightBalance的数据包");
return;
}
if (inputData[4] != 0x00) {
LOG_WARNING("接收到不是输入结构体的数据包!");
return;
}
if (inputData[5] != 0x00) {
LOG_WARNING("接收到不是输入数据包!");
return;
}
size_t size = inputData[6];
size = size << 8 | inputData[7];
if (size != inputData.size()) {
LOG_WARNING("接收到的数据包大小不正确!");
return;
}
d->_wbInputInterface.setDataByUDPPackage(inputData);
}
// void XNATA04DataProcessor::SendUdpTestData()
// {
// Q_D(XNATA04DataProcessor);
// // 创建气动输入(AeroInput)数据包
// QByteArray aeroData;
// QDataStream aeroStream(&aeroData, QIODevice::WriteOnly);
// aeroStream.setByteOrder(QDataStream::LittleEndian);
// aeroStream.setVersion(QDataStream::Qt_6_0);
// // 气动输入数据包头 (0x0b=从外部输入, 0x04=ATA04, 0x00=气动模型, 0x00=输入数据)
// quint8 aeroHeader[6] = {0x0b, 0x04, 0x00, 0x00, 0x00, 0x00}; // 最后两个字节用于大小
// aeroStream << aeroHeader[0] << aeroHeader[1] << aeroHeader[2] << aeroHeader[3] << aeroHeader[4]
// << aeroHeader[5];
// // 气动数据字段
// aeroStream << (double)-2.0; // alpha
// aeroStream << (double)0.0; // alpdot
// aeroStream << (double)0.0; // beta
// aeroStream << (double)10000.0; // press_alt
// aeroStream << (double)360.0; // tas
// aeroStream << (double)0.3; // mach
// aeroStream << (double)0.0; // nx
// aeroStream << (double)0.0; // ny
// aeroStream << (double)1.0; // nz
// aeroStream << (double)0.0; // p
// aeroStream << (double)0.0; // q
// aeroStream << (double)0.0; // r
// aeroStream << (double)110.0; // qbar
// aeroStream << (double)0.0; // blcg
// aeroStream << (double)650.0; // bscg
// aeroStream << (double)7.0; // wlcg
// aeroStream << (double)-2.0; // stab
// // ail_f8 数组需要10个double
// for (int i = 0; i < 10; i++) {
// aeroStream << (double)0.0;
// }
// // elv_f8 数组需要4个double
// for (int i = 0; i < 4; i++) {
// aeroStream << (double)0.0;
// }
// // rud_f8 数组需要2个double
// for (int i = 0; i < 2; i++) {
// aeroStream << (double)0.0;
// }
// // gear_f8 数组需要7个double
// for (int i = 0; i < 7; i++) {
// aeroStream << (double)1.0;
// }
// // flap_f8 数组需要10个double
// for (int i = 0; i < 10; i++) {
// aeroStream << (double)41.5;
// }
// // slat_f8 数组需要20个double
// for (int i = 0; i < 20; i++) {
// aeroStream << (double)20.855;
// }
// // spl_f8 数组需要20个double
// for (int i = 0; i < 20; i++) {
// aeroStream << (double)0.0;
// }
// // tnet_f8 数组需要4个double
// for (int i = 0; i < 4; i++) {
// aeroStream << (double)8000.0;
// }
// // kice_f8 数组需要20个double
// for (int i = 0; i < 20; i++) {
// aeroStream << (double)0.0;
// }
// // alt_agl
// aeroStream << (double)2500.0;
// // 更新数据包大小(使用两个字节)
// quint16 size = aeroData.size();
// aeroData[4] = (size >> 8) & 0xFF; // 高字节
// aeroData[5] = size & 0xFF; // 低字节
// // 创建地面操作输入(GhInput)数据包
// QByteArray ghData;
// QDataStream ghStream(&ghData, QIODevice::WriteOnly);
// ghStream.setByteOrder(QDataStream::LittleEndian);
// ghStream.setVersion(QDataStream::Qt_6_0);
// // 地面操作输入数据包头 (0x0b=从外部输入, 0x04=ATA04, 0x01=地面操作模型, 0x00=输入数据)
// quint8 ghHeader[6] = {0x0b, 0x04, 0x01, 0x00, 0x00, 0x00}; // 最后两个字节用于大小
// ghStream << ghHeader[0] << ghHeader[1] << ghHeader[2] << ghHeader[3] << ghHeader[4]
// << ghHeader[5];
// // 地面操作数据字段
// ghStream << (quint8)0; // frz_l1
// ghStream << (quint8)0; // chocks_l1
// ghStream << (double)8.0; // alt_agl_f8
// ghStream << (quint8)0; // frzflt_l1
// ghStream << (double)0.0; // p_f8
// ghStream << (double)0.0; // q_f8
// ghStream << (double)0.0; // r_f8
// ghStream << (double)50.0; // ug_f8
// ghStream << (double)0.0; // vg_f8
// ghStream << (double)0.0; // wg_f8
// ghStream << (double)0.0; // blcg_f8
// ghStream << (double)649.3; // bscg_f8
// ghStream << (double)10.0; // wlcg_f8
// ghStream << (quint8)0; // pb_active_l1
// ghStream << (double)0.0; // pb_towforce_f8
// // brake_torq_f8 数组 3x2
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 2; j++) {
// ghStream << (double)0.0;
// }
// }
// // gear_f8 数组需要3个double
// for (int i = 0; i < 3; i++) {
// ghStream << (double)1.0;
// }
// // gsteer_f8 数组需要10个double
// for (int i = 0; i < 10; i++) {
// ghStream << (double)0.0;
// }
// // tire_pres_f8 数组 3x2
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 2; j++) {
// if (i == 0) {
// ghStream << (double)98.0; // 98 kpa的胎压
// } else {
// ghStream << (double)140.0; // 140 kpa的胎压
// }
// }
// }
// // 4个double数组
// for (int i = 0; i < 4; i++) {
// ghStream << (double)0.0;
// }
// ghStream << (quint8)0; // onjax_l1
// // contdep_f8 数组需要7个double
// ghStream << (double)1.0;
// for (int i = 1; i < 7; i++) {
// ghStream << (double)0.0;
// }
// ghStream << (double)0.0; // thetag_f8
// ghStream << (double)0.0; // phig_f8
// ghStream << (qint32)0; // rwyrgh_i2
// ghStream << (double)0.0; // rwyhdg_f8
// ghStream << (quint8)0; // reset_braketemp_l1
// ghStream << (quint8)0; // reset_tirepress_l1
// ghStream << (double)16.0; // temp_c_f8
// // brake_temp_f8 数组 3x2
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 2; j++) {
// ghStream << (double)16.0; // 16度的刹车温度
// }
// }
// // tire_tburst_l1 数组 3x2
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 2; j++) {
// ghStream << (char)0;
// }
// }
// // tire_tflat_l1 数组 3x2
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 2; j++) {
// ghStream << (char)0;
// }
// }
// ghStream << (quint8)0; // brk_reset_tpres_l1
// // rcon_ci_f8 数组需要14个double
// ghStream << (double)1.0;
// for (int i = 1; i < 14; i++) {
// ghStream << (double)0.0;
// }
// ghStream << (qint32)2; // gsteer_state_i4
// ghStream << (quint8)1; // trim_active_l1
// ghStream << (double)0.0; // phi_deg_f8
// ghStream << (double)0.0; // theta_deg_f8
// ghStream << (double)0.0; // psi_deg_f8
// ghStream << (quint8)1; // resetint_l1
// // 更新数据包大小(使用两个字节)
// size = ghData.size();
// ghData[4] = (size >> 8) & 0xFF; // 高字节
// ghData[5] = size & 0xFF; // 低字节
// // 创建重量平衡输入(WbInput)数据包
// QByteArray wbData;
// QDataStream wbStream(&wbData, QIODevice::WriteOnly);
// wbStream.setByteOrder(QDataStream::LittleEndian);
// wbStream.setVersion(QDataStream::Qt_6_0);
// // 重量平衡输入数据包头 (0x0b=从外部输入, 0x04=ATA04, 0x02=重量平衡模型, 0x00=输入数据)
// quint8 wbHeader[6] = {0x0b, 0x04, 0x02, 0x00, 0x00, 0x00}; // 最后两个字节用于大小
// wbStream << wbHeader[0] << wbHeader[1] << wbHeader[2] << wbHeader[3] << wbHeader[4]
// << wbHeader[5];
// // 重量平衡数据字段
// wbStream << (double)0.0; // theta_deg_f8
// wbStream << (double)0.0; // phi_deg_f8
// wbStream << (double)0.0; // psi_deg_f8
// wbStream << (quint8)0; // gear_mode_l1
// wbStream << (double)82574.0; // acset_gw_f8 (60000kg飞机重量)
// wbStream << (double)0.1215; // acset_cg_f8 (25%MAC重心位置)
// // acset_tankfuel_f4 数组需要20个float
// for (int i = 0; i < 20; i++) {
// wbStream << (double)(i < 2 ? 4541.0 : 0.0); // 前2个油箱各4541kg
// }
// wbStream << (double)9082.0; // acset_totfuel_f8 (总油量9082kg)
// wbStream << (double)73492.0; // acset_zfw_f8 (零油重73492kg)
// wbStream << (double)0.12; // acset_zfwcg_f8 (零油重重心24%MAC)
// // eng_efsep_l1 数组需要4个char
// for (int i = 0; i < 4; i++) {
// wbStream << (char)0;
// }
// // fuel_f8 数组需要20个double
// for (int i = 0; i < 20; i++) {
// wbStream << (double)(i < 2 ? 4541.0 : 0.0); // 前2个油箱各4541kg
// }
// wbStream << (double)1.0; // gear_avg_f8
// // kice_f8 数组需要20个double
// for (int i = 0; i < 20; i++) {
// wbStream << (double)0.0;
// }
// wbStream << (quint8)1; // bycglim_l1
// wbStream << (quint8)1; // bygwlim_l1
// wbStream << (quint8)0; // frz_l1
// wbStream << (quint8)0; // zcgfrz_l1
// wbStream << (quint8)0; // zcgfrz_grfx_l1
// wbStream << (quint8)0; // ycgfrz_l1
// wbStream << (quint8)0; // inertfrz_l1
// wbStream << (double)80000.0; // potreq_gw_f8
// wbStream << (double)0.2; // potreq_gwcg_f8
// // 更新数据包大小(使用两个字节)
// size = wbData.size();
// wbData[4] = (size >> 8) & 0xFF; // 高字节
// wbData[5] = size & 0xFF; // 低字节
// // 发送测试数据包
// TriggerRTEvent("SendTestUDPData", QVariant::fromValue(aeroData));
// TriggerRTEvent("SendTestUDPData", QVariant::fromValue(ghData));
// TriggerRTEvent("SendTestUDPData", QVariant::fromValue(wbData));
// }