XNSim/XNModels/XNATA04DataProcessor/XNATA04DataProcessor.cpp

585 lines
17 KiB
C++
Raw Normal View History

2025-04-28 12:25:20 +08:00
#include "XNATA04DataProcessor.h"
#include "XNATA04DataProcessor_p.h"
#include <XNCore/XNModelManager.h>
#include <XNCore/XNDDSManager.h>
2025-04-29 11:55:56 +08:00
#include <iostream>
2025-04-28 12:25:20 +08:00
XN_MODEL_INITIALIZE(XNATA04DataProcessor)
XNATA04DataProcessor::XNATA04DataProcessor() : XNModelObject(new XNATA04DataProcessorPrivate())
2025-04-28 12:25:20 +08:00
{
}
XNATA04DataProcessor::~XNATA04DataProcessor()
{
}
XNATA04DataProcessor::XNATA04DataProcessor(PrivateType *p) : XNModelObject(p)
2025-04-28 12:25:20 +08:00
{
}
void XNATA04DataProcessor::Initialize()
2025-04-28 12:25:20 +08:00
{
T_D();
XNModelObject::Initialize();
2025-04-28 12:25:20 +08:00
}
void XNATA04DataProcessor::PrepareForExecute()
2025-04-28 12:25:20 +08:00
{
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);
2025-04-28 12:25:20 +08:00
}
void XNATA04DataProcessor::StepUpdate()
{
T_D();
2025-04-28 12:25:20 +08:00
XNModelObject::StepUpdate();
SendUdpData();
//SendUdpTestData();
2025-04-28 12:25:20 +08:00
}
void XNATA04DataProcessor::SendUdpData()
{
T_D();
SendAeroOutput();
SendWbOutput();
2025-04-28 12:25:20 +08:00
SendGhOutput();
SendAeroHeartbeat();
SendWbHeartbeat();
2025-04-28 12:25:20 +08:00
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));
}
2025-04-28 12:25:20 +08:00
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;
}
2025-04-29 11:55:56 +08:00
TriggerRTEvent("SendUDPData", std::any(outputData));
2025-04-28 12:25:20 +08:00
}
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));
}
2025-04-28 12:25:20 +08:00
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;
}
2025-04-28 12:25:20 +08:00
TriggerRTEvent("SendUDPData", std::any(outputData));
2025-04-28 12:25:20 +08:00
}
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)
2025-04-28 12:25:20 +08:00
{
T_D();
XNByteArray inputData = std::any_cast<XNByteArray>(data);
2025-04-29 11:55:56 +08:00
// 检查数据包头
if (inputData[0] != 0xa6) {
LOG_WARNING("接收到不是XNSim的数据包");
2025-04-28 12:25:20 +08:00
return;
}
if (inputData[1] != 0xc0) {
LOG_WARNING("接收到不是C909的数据包");
2025-04-29 11:55:56 +08:00
return;
}
if (inputData[2] != 0x04) {
LOG_WARNING("接收到不是ATA04的数据包");
2025-04-28 12:25:20 +08:00
return;
}
if (inputData[3] != 0x01) {
LOG_WARNING("接收到不是GroundHandling的数据包");
2025-04-29 11:55:56 +08:00
return;
}
if (inputData[4] != 0x00) {
LOG_WARNING("接收到不是输入结构体的数据包!");
2025-04-28 16:41:21 +08:00
return;
}
if (inputData[5] != 0x00) {
LOG_WARNING("接收到不是输入数据包!");
2025-04-28 12:25:20 +08:00
return;
}
size_t size = inputData[6];
size = size << 8 | inputData[7];
if (size != inputData.size()) {
LOG_WARNING("接收到的数据包大小不正确!");
2025-04-28 16:41:21 +08:00
return;
2025-04-28 12:25:20 +08:00
}
d->_ghInputInterface.setDataByUDPPackage(inputData);
2025-04-28 12:25:20 +08:00
}
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));
// }