2025-04-28 12:25:20 +08:00

272 lines
12 KiB
C++
Executable File

#include "XNWeightBalance.h"
#include "XNWeightBalance_p.h"
#include <XNCore/XNModelManager.h>
#include <XNCore/XNDDSManager.h>
#include <QMutexLocker>
XN_DLL_INITIALIZE(XNWeightBalance)
XN_REGISTER_PARTICIPANT_BEGIN(XNWeightBalance)
XN_PUBLISHTOPIC(XNSim::ATA04::WeightBalance_output)
XN_PUBLISHTOPIC(XNSim::ATA04::WeightBalance_heartbeat)
XN_SUBSCRIBETOPIC(XNSim::ATA04::WeightBalance_input, &XNWeightBalance::OnInput)
XN_REGISTER_PARTICIPANT_END(XNWeightBalance)
XNWeightBalance::XNWeightBalance(QObject *parent)
: XNModelObject(*new XNWeightBalancePrivate(this), parent)
{
}
XNWeightBalance::~XNWeightBalance()
{
Q_D(XNWeightBalance);
// 释放输入数组内存
if (d->_data.input_weight) {
delete[] d->_data.input_weight->l_04_i_wbcomac_acset_tankfuel_f4;
delete[] d->_data.input_weight->l_04_i_wbcomac_eng_efsep_l1;
delete[] d->_data.input_weight->l_04_i_wbcomac_fuel_f8;
delete[] d->_data.input_weight->l_04_i_wbcomac_kice_f8;
delete d->_data.input_weight;
}
// 释放输出数组内存
if (d->_data.output_weight) {
delete[] d->_data.output_weight->l_04_o_wbcomac_fuel_cmd_f8;
delete[] d->_data.output_weight->l_04_o_wbcomac_ice_eng_f8;
delete d->_data.output_weight;
}
}
XNWeightBalance::XNWeightBalance(XNWeightBalancePrivate &dd, QObject *parent)
: XNModelObject(dd, parent)
{
}
void XNWeightBalance::OnInitialize()
{
Q_D(XNWeightBalance);
XNModelObject::OnInitialize();
if (d->_dynamicLib) {
d->_fun = reinterpret_cast<FunctionType>(
d->_dynamicLib->resolve("_Z28SACSCWeightBalanceEntryPointP20ComacDataStructure_S"));
if (!d->_fun) {
LOG_WARNING("Failed to resolve function SACSCWeightBalanceEntryPoint");
}
}
//add other initial code here
}
void XNWeightBalance::OnPrepareForExecute()
{
Q_D(XNWeightBalance);
XNModelObject::OnPrepareForExecute();
//add your initial data code here
d->_data.input_weight = new input_weight_S();
d->_data.input_weight->l_04_i_wbcomac_acset_tankfuel_f4 = new float[20];
d->_data.input_weight->l_04_i_wbcomac_eng_efsep_l1 = new unsigned char[4];
d->_data.input_weight->l_04_i_wbcomac_fuel_f8 = new double[20];
d->_data.input_weight->l_04_i_wbcomac_kice_f8 = new double[20];
d->_data.output_weight = new output_weight_S();
d->_data.output_weight->l_04_o_wbcomac_fuel_cmd_f8 = new double[20];
d->_data.output_weight->l_04_o_wbcomac_ice_eng_f8 = new double[4];
}
void XNWeightBalance::StepUpdate()
{
Q_D(XNWeightBalance);
XNModelObject::StepUpdate();
if (d->_fun) {
QMutexLocker locker(&d->_mutex);
d->_fun(&d->_data);
}
OnOutput();
}
void XNWeightBalance::OnInput(const XNSim::ATA04::WeightBalance_input &input)
{
Q_D(XNWeightBalance);
QMutexLocker locker(&d->_mutex);
if (input.l_04_i_wbcomac_theta_deg_f8()) {
d->_data.input_weight->l_04_i_wbcomac_theta_deg_f8 =
input.l_04_i_wbcomac_theta_deg_f8().value();
}
if (input.l_04_i_wbcomac_gear_mode_l1()) {
d->_data.input_weight->l_04_i_wbcomac_gear_mode_l1 =
input.l_04_i_wbcomac_gear_mode_l1().value();
}
if (input.l_04_i_wbcomac_acset_gw_f8()) {
d->_data.input_weight->l_04_i_wbcomac_acset_gw_f8 =
input.l_04_i_wbcomac_acset_gw_f8().value();
}
if (input.l_04_i_wbcomac_acset_cg_f8()) {
d->_data.input_weight->l_04_i_wbcomac_acset_cg_f8 =
input.l_04_i_wbcomac_acset_cg_f8().value();
}
if (input.l_04_i_wbcomac_acset_tankfuel_f4()) {
for (int i = 0; i < 20; i++) {
d->_data.input_weight->l_04_i_wbcomac_acset_tankfuel_f4[i] =
input.l_04_i_wbcomac_acset_tankfuel_f4().value()[i];
}
}
if (input.l_04_i_wbcomac_acset_totfuel_f8()) {
d->_data.input_weight->l_04_i_wbcomac_acset_totfuel_f8 =
input.l_04_i_wbcomac_acset_totfuel_f8().value();
}
if (input.l_04_i_wbcomac_acset_zfw_f8()) {
d->_data.input_weight->l_04_i_wbcomac_acset_zfw_f8 =
input.l_04_i_wbcomac_acset_zfw_f8().value();
}
if (input.l_04_i_wbcomac_acset_zfwcg_f8()) {
d->_data.input_weight->l_04_i_wbcomac_acset_zfwcg_f8 =
input.l_04_i_wbcomac_acset_zfwcg_f8().value();
}
if (input.l_04_i_wbcomac_eng_efsep_l1()) {
for (int i = 0; i < 4; i++) {
d->_data.input_weight->l_04_i_wbcomac_eng_efsep_l1[i] =
input.l_04_i_wbcomac_eng_efsep_l1().value()[i];
}
}
if (input.l_04_i_wbcomac_fuel_f8()) {
for (int i = 0; i < 20; i++) {
d->_data.input_weight->l_04_i_wbcomac_fuel_f8[i] =
input.l_04_i_wbcomac_fuel_f8().value()[i];
}
}
if (input.l_04_i_wbcomac_gear_avg_f8()) {
d->_data.input_weight->l_04_i_wbcomac_gear_avg_f8 =
input.l_04_i_wbcomac_gear_avg_f8().value();
}
if (input.l_04_i_wbcomac_kice_f8()) {
for (int i = 0; i < 20; i++) {
d->_data.input_weight->l_04_i_wbcomac_kice_f8[i] =
input.l_04_i_wbcomac_kice_f8().value()[i];
}
}
if (input.l_04_i_wbcomac_bycglim_l1()) {
d->_data.input_weight->l_04_i_wbcomac_bycglim_l1 =
input.l_04_i_wbcomac_bycglim_l1().value();
}
if (input.l_04_i_wbcomac_bygwlim_l1()) {
d->_data.input_weight->l_04_i_wbcomac_bygwlim_l1 =
input.l_04_i_wbcomac_bygwlim_l1().value();
}
if (input.l_04_i_wbcomac_frz_l1()) {
d->_data.input_weight->l_04_i_wbcomac_frz_l1 = input.l_04_i_wbcomac_frz_l1().value();
}
if (input.l_04_i_wbcomac_zcgfrz_l1()) {
d->_data.input_weight->l_04_i_wbcomac_zcgfrz_l1 = input.l_04_i_wbcomac_zcgfrz_l1().value();
}
if (input.l_04_i_wbcomac_zcgfrz_grfx_l1()) {
d->_data.input_weight->l_04_i_wbcomac_zcgfrz_grfx_l1 =
input.l_04_i_wbcomac_zcgfrz_grfx_l1().value();
}
if (input.l_04_i_wbcomac_ycgfrz_l1()) {
d->_data.input_weight->l_04_i_wbcomac_ycgfrz_l1 = input.l_04_i_wbcomac_ycgfrz_l1().value();
}
if (input.l_04_i_wbcomac_inertfrz_l1()) {
d->_data.input_weight->l_04_i_wbcomac_inertfrz_l1 =
input.l_04_i_wbcomac_inertfrz_l1().value();
}
if (input.l_04_i_wbcomac_potreq_gw_f8()) {
d->_data.input_weight->l_04_i_wbcomac_potreq_gw_f8 =
input.l_04_i_wbcomac_potreq_gw_f8().value();
}
if (input.l_04_i_wbcomac_potreq_gwcg_f8()) {
d->_data.input_weight->l_04_i_wbcomac_potreq_gwcg_f8 =
input.l_04_i_wbcomac_potreq_gwcg_f8().value();
}
if (input.l_04_i_wbcomac_phi_deg_f8()) {
d->_data.input_weight->l_04_i_wbcomac_phi_deg_f8 =
input.l_04_i_wbcomac_phi_deg_f8().value();
}
if (input.l_04_i_wbcomac_psi_deg_f8()) {
d->_data.input_weight->l_04_i_wbcomac_psi_deg_f8 =
input.l_04_i_wbcomac_psi_deg_f8().value();
}
}
void XNWeightBalance::OnOutput()
{
Q_D(XNWeightBalance);
QMutexLocker locker(&d->_mutex);
//DDS心跳
XNSim::ATA04::WeightBalance_heartbeat heartbeat;
heartbeat.weightbody_model_heartbeat(d->_data.weightbody_model_heartbeat);
d->_dataWriters["XNSim::ATA04::WeightBalance_heartbeat"]->write(&heartbeat);
//DDS数据发布
XNSim::ATA04::WeightBalance_output output;
output.l_04_o_wbcomac_gw_f4(d->_data.output_weight->l_04_o_wbcomac_gw_f4);
output.l_04_o_wbcomac_cg_f4(d->_data.output_weight->l_04_o_wbcomac_cg_f4);
output.l_04_o_wbcomac_xcg_f8(d->_data.output_weight->l_04_o_wbcomac_xcg_f8);
output.l_04_o_wbcomac_blcg_f8(d->_data.output_weight->l_04_o_wbcomac_blcg_f8);
output.l_04_o_wbcomac_bscg_f8(d->_data.output_weight->l_04_o_wbcomac_bscg_f8);
output.l_04_o_wbcomac_wlcg_f8(d->_data.output_weight->l_04_o_wbcomac_wlcg_f8);
output.l_04_o_wbcomac_ixx_f8(d->_data.output_weight->l_04_o_wbcomac_ixx_f8);
output.l_04_o_wbcomac_iyy_f8(d->_data.output_weight->l_04_o_wbcomac_iyy_f8);
output.l_04_o_wbcomac_izz_f8(d->_data.output_weight->l_04_o_wbcomac_izz_f8);
output.l_04_o_wbcomac_ixy_f8(d->_data.output_weight->l_04_o_wbcomac_ixy_f8);
output.l_04_o_wbcomac_ixz_f8(d->_data.output_weight->l_04_o_wbcomac_ixz_f8);
output.l_04_o_wbcomac_iyz_f8(d->_data.output_weight->l_04_o_wbcomac_iyz_f8);
output.l_04_o_wbcomac_zfw_f4(d->_data.output_weight->l_04_o_wbcomac_zfw_f4);
output.l_04_o_wbcomac_zfwcg_f4(d->_data.output_weight->l_04_o_wbcomac_zfwcg_f4);
output.l_04_o_wbcomac_zfw_blcg_f4(d->_data.output_weight->l_04_o_wbcomac_zfw_blcg_f4);
output.l_04_o_wbcomac_zfw_wlcg_f4(d->_data.output_weight->l_04_o_wbcomac_zfw_wlcg_f4);
std::array<double, 20> l_04_o_wbcomac_fuel_cmd_f8;
for (int i = 0; i < 3; i++) {
l_04_o_wbcomac_fuel_cmd_f8[i] = d->_data.output_weight->l_04_o_wbcomac_fuel_cmd_f8[i];
}
output.l_04_o_wbcomac_fuel_cmd_f8(l_04_o_wbcomac_fuel_cmd_f8);
output.l_04_o_wbcomac_fuel_mode_i4(d->_data.output_weight->l_04_o_wbcomac_fuel_mode_i4);
output.l_04_o_wbcomac_fuel_ixx_f8(d->_data.output_weight->l_04_o_wbcomac_fuel_ixx_f8);
output.l_04_o_wbcomac_fuel_ixy_f8(d->_data.output_weight->l_04_o_wbcomac_fuel_ixy_f8);
output.l_04_o_wbcomac_fuel_ixz_f8(d->_data.output_weight->l_04_o_wbcomac_fuel_ixz_f8);
output.l_04_o_wbcomac_fuel_iyy_f8(d->_data.output_weight->l_04_o_wbcomac_fuel_iyy_f8);
output.l_04_o_wbcomac_fuel_iyz_f8(d->_data.output_weight->l_04_o_wbcomac_fuel_iyz_f8);
output.l_04_o_wbcomac_fuel_izz_f8(d->_data.output_weight->l_04_o_wbcomac_fuel_izz_f8);
output.l_04_o_wbcomac_l_wt_fuel_f8(d->_data.output_weight->l_04_o_wbcomac_l_wt_fuel_f8);
output.l_04_o_wbcomac_ice_airframe_total_f8(
d->_data.output_weight->l_04_o_wbcomac_ice_airframe_total_f8);
std::array<double, 4> l_04_o_wbcomac_ice_eng_f8;
for (int i = 0; i < 2; i++) {
l_04_o_wbcomac_ice_eng_f8[i] = d->_data.output_weight->l_04_o_wbcomac_ice_eng_f8[i];
}
output.l_04_o_wbcomac_ice_eng_f8(l_04_o_wbcomac_ice_eng_f8);
output.l_04_o_wbcomac_ice_eng_total_f8(d->_data.output_weight->l_04_o_wbcomac_ice_eng_total_f8);
output.l_04_o_wbcomac_ice_fuselage_f8(d->_data.output_weight->l_04_o_wbcomac_ice_fuselage_f8);
output.l_04_o_wbcomac_ice_stab_left_f8(d->_data.output_weight->l_04_o_wbcomac_ice_stab_left_f8);
output.l_04_o_wbcomac_ice_stab_right_f8(
d->_data.output_weight->l_04_o_wbcomac_ice_stab_right_f8);
output.l_04_o_wbcomac_ice_stab_total_f8(
d->_data.output_weight->l_04_o_wbcomac_ice_stab_total_f8);
output.l_04_o_wbcomac_ice_total_f8(d->_data.output_weight->l_04_o_wbcomac_ice_total_f8);
output.l_04_o_wbcomac_ice_total_frac_f8(
d->_data.output_weight->l_04_o_wbcomac_ice_total_frac_f8);
output.l_04_o_wbcomac_ice_vert_tail_f8(d->_data.output_weight->l_04_o_wbcomac_ice_vert_tail_f8);
output.l_04_o_wbcomac_ice_wing_left_f8(d->_data.output_weight->l_04_o_wbcomac_ice_wing_left_f8);
output.l_04_o_wbcomac_ice_wing_right_f8(
d->_data.output_weight->l_04_o_wbcomac_ice_wing_right_f8);
output.l_04_o_wbcomac_ice_wing_total_f8(
d->_data.output_weight->l_04_o_wbcomac_ice_wing_total_f8);
output.l_04_o_wbcomac_frz_l1(d->_data.output_weight->l_04_o_wbcomac_frz_l1);
output.l_04_o_wbcomac_zcgfrz_l1(d->_data.output_weight->l_04_o_wbcomac_zcgfrz_l1);
output.l_04_o_wbcomac_zcgfrz_grfx_l1(d->_data.output_weight->l_04_o_wbcomac_zcgfrz_grfx_l1);
output.l_04_o_wbcomac_ycgfrz_l1(d->_data.output_weight->l_04_o_wbcomac_ycgfrz_l1);
output.l_04_o_wbcomac_inertfrz_l1(d->_data.output_weight->l_04_o_wbcomac_inertfrz_l1);
output.l_04_o_wbcomac_init_l1(d->_data.output_weight->l_04_o_wbcomac_init_l1);
output.l_04_o_wbcomac_min_gw_f4(d->_data.output_weight->l_04_o_wbcomac_min_gw_f4);
output.l_04_o_wbcomac_max_gw_f4(d->_data.output_weight->l_04_o_wbcomac_max_gw_f4);
output.l_04_o_wbcomac_min_cg_f4(d->_data.output_weight->l_04_o_wbcomac_min_cg_f4);
output.l_04_o_wbcomac_max_cg_f4(d->_data.output_weight->l_04_o_wbcomac_max_cg_f4);
output.l_04_o_wbcomac_min_zfw_f4(d->_data.output_weight->l_04_o_wbcomac_min_zfw_f4);
output.l_04_o_wbcomac_max_zfw_f4(d->_data.output_weight->l_04_o_wbcomac_max_zfw_f4);
output.l_04_o_wbcomac_min_zfwcg_f4(d->_data.output_weight->l_04_o_wbcomac_min_zfwcg_f4);
output.l_04_o_wbcomac_max_zfwcg_f4(d->_data.output_weight->l_04_o_wbcomac_max_zfwcg_f4);
output.l_04_o_wbcomac_potmin_gw_f8(d->_data.output_weight->l_04_o_wbcomac_potmin_gw_f8);
output.l_04_o_wbcomac_potmax_gw_f8(d->_data.output_weight->l_04_o_wbcomac_potmax_gw_f8);
output.l_04_o_wbcomac_potmin_gwcg_f8(d->_data.output_weight->l_04_o_wbcomac_potmin_gwcg_f8);
output.l_04_o_wbcomac_potmax_gwcg_f8(d->_data.output_weight->l_04_o_wbcomac_potmax_gwcg_f8);
d->_dataWriters["XNSim::ATA04::WeightBalance_output"]->write(&output);
}