#include "XNAerodynamicsInterface.hpp" #include #include namespace XNSim { namespace ATA04 { Aerodynamics_input_Interface::Aerodynamics_input_Interface() { getDataFunction["l_04_i_aerocomac_alpha_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_alpha_f8()) { return QString::number(input.l_04_i_aerocomac_alpha_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_alpdot_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_alpdot_f8()) { return QString::number(input.l_04_i_aerocomac_alpdot_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_beta_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_beta_f8()) { return QString::number(input.l_04_i_aerocomac_beta_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_press_alt_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_press_alt_f8()) { return QString::number(input.l_04_i_aerocomac_press_alt_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_tas_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_tas_f8()) { return QString::number(input.l_04_i_aerocomac_tas_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_mach_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_mach_f8()) { return QString::number(input.l_04_i_aerocomac_mach_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_nx_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_nx_f8()) { return QString::number(input.l_04_i_aerocomac_nx_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_ny_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_ny_f8()) { return QString::number(input.l_04_i_aerocomac_ny_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_nz_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_nz_f8()) { return QString::number(input.l_04_i_aerocomac_nz_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_p_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_p_f8()) { return QString::number(input.l_04_i_aerocomac_p_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_q_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_q_f8()) { return QString::number(input.l_04_i_aerocomac_q_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_r_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_r_f8()) { return QString::number(input.l_04_i_aerocomac_r_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_qbar_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_qbar_f8()) { return QString::number(input.l_04_i_aerocomac_qbar_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_blcg_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_blcg_f8()) { return QString::number(input.l_04_i_aerocomac_blcg_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_bscg_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_bscg_f8()) { return QString::number(input.l_04_i_aerocomac_bscg_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_wlcg_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_wlcg_f8()) { return QString::number(input.l_04_i_aerocomac_wlcg_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_ail_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_ail_f8()) { QStringList list; for (int i = 0; i < 10; i++) { if (input.l_04_i_aerocomac_ail_f8().value()[i]) { list.append(QString::number(input.l_04_i_aerocomac_ail_f8().value()[i])); } } return list.join(","); } return QString(); }; getDataFunction["l_04_i_aerocomac_elv_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_elv_f8()) { QStringList list; for (int i = 0; i < 4; i++) { if (input.l_04_i_aerocomac_elv_f8().value()[i]) { list.append(QString::number(input.l_04_i_aerocomac_elv_f8().value()[i])); } } return list.join(","); } return QString(); }; getDataFunction["l_04_i_aerocomac_rud_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_rud_f8()) { QStringList list; for (int i = 0; i < 2; i++) { if (input.l_04_i_aerocomac_rud_f8().value()[i]) { list.append(QString::number(input.l_04_i_aerocomac_rud_f8().value()[i])); } } return list.join(","); } return QString(); }; getDataFunction["l_04_i_aerocomac_stab_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_stab_f8()) { return QString::number(input.l_04_i_aerocomac_stab_f8().value()); } return QString(); }; getDataFunction["l_04_i_aerocomac_gear_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_gear_f8()) { QStringList list; for (int i = 0; i < 7; i++) { if (input.l_04_i_aerocomac_gear_f8().value()[i]) { list.append(QString::number(input.l_04_i_aerocomac_gear_f8().value()[i])); } } return list.join(","); } return QString(); }; getDataFunction["l_04_i_aerocomac_flap_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_flap_f8()) { QStringList list; for (int i = 0; i < 10; i++) { if (input.l_04_i_aerocomac_flap_f8().value()[i]) { list.append(QString::number(input.l_04_i_aerocomac_flap_f8().value()[i])); } } return list.join(","); } return QString(); }; getDataFunction["l_04_i_aerocomac_slat_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_slat_f8()) { QStringList list; for (int i = 0; i < 20; i++) { if (input.l_04_i_aerocomac_slat_f8().value()[i]) { list.append(QString::number(input.l_04_i_aerocomac_slat_f8().value()[i])); } } return list.join(","); } return QString(); }; getDataFunction["l_04_i_aerocomac_spl_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_spl_f8()) { QStringList list; for (int i = 0; i < 20; i++) { if (input.l_04_i_aerocomac_spl_f8().value()[i]) { list.append(QString::number(input.l_04_i_aerocomac_spl_f8().value()[i])); } } return list.join(","); } return QString(); }; getDataFunction["l_04_i_aerocomac_tnet_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_tnet_f8()) { QStringList list; for (int i = 0; i < 4; i++) { if (input.l_04_i_aerocomac_tnet_f8().value()[i]) { list.append(QString::number(input.l_04_i_aerocomac_tnet_f8().value()[i])); } } return list.join(","); } return QString(); }; getDataFunction["l_04_i_aerocomac_kice_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_kice_f8()) { QStringList list; for (int i = 0; i < 20; i++) { if (input.l_04_i_aerocomac_kice_f8().value()[i]) { list.append(QString::number(input.l_04_i_aerocomac_kice_f8().value()[i])); } } return list.join(","); } return QString(); }; getDataFunction["l_04_i_aerocomac_alt_agl_f8"] = [this](const QString &varName) { if (input.l_04_i_aerocomac_alt_agl_f8()) { return QString::number(input.l_04_i_aerocomac_alt_agl_f8().value()); } return QString(); }; } Aerodynamics_input_Interface::~Aerodynamics_input_Interface() { } QString Aerodynamics_input_Interface::getData(const QString &varName) { int index1 = -1; int index2 = -1; QString trueVarName = varName; // 检查变量名中是否存在数组标记 if (varName.contains('[')) { // 解析数组索引 int startPos = varName.indexOf('['); int midPos = varName.indexOf("]["); int endPos = varName.lastIndexOf(']'); // 如果是二维数组 (格式: name[index1][index2]) if (midPos != -1) { bool ok1 = false, ok2 = false; index1 = varName.mid(startPos + 1, midPos - startPos - 1).toInt(&ok1); index2 = varName.mid(midPos + 2, endPos - midPos - 2).toInt(&ok2); if (!ok1 || !ok2) { qWarning() << "无法解析数组索引:" << varName; index1 = 0; index2 = 0; } } // 如果是一维数组 (格式: name[index1]) else if (startPos != -1 && endPos != -1) { bool ok = false; index1 = varName.mid(startPos + 1, endPos - startPos - 1).toInt(&ok); if (!ok) { qWarning() << "无法解析数组索引:" << varName; index1 = 0; } } trueVarName = varName.left(startPos); } auto it = getDataFunction.find(trueVarName); if (it == getDataFunction.end()) { return QString(); // 返回空字符串表示未找到 } if (index1 < 0) { QMutexLocker locker(&mutex); return it.value()(trueVarName); } else if (index2 < 0) { QMutexLocker locker(&mutex); QStringList list = it.value()(trueVarName).split(","); if (index1 >= list.size()) { qWarning() << "数组索引超出范围:" << varName; return QString(); } return list[index1]; } else { QMutexLocker locker(&mutex); QStringList list = it.value()(trueVarName).split(","); if (index1 >= list.size()) { qWarning() << "数组索引超出范围:" << varName; return QString(); } QStringList list2 = list[index1].split(" "); if (index2 >= list2.size()) { qWarning() << "数组索引超出范围:" << varName; return QString(); } return list2[index2]; } } void Aerodynamics_input_Interface::inputDataListener(const XNSim::ATA04::Aerodynamics_input &input) { QMutexLocker locker(&mutex); this->input = input; } Aerodynamics_output_Interface::Aerodynamics_output_Interface() { getDataFunction["l_04_o_aerocomac_fxb_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_fxb_f8()) { return QString::number(output.l_04_o_aerocomac_fxb_f8().value()); } return QString(); }; getDataFunction["l_04_o_aerocomac_fyb_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_fyb_f8()) { return QString::number(output.l_04_o_aerocomac_fyb_f8().value()); } return QString(); }; getDataFunction["l_04_o_aerocomac_fzb_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_fzb_f8()) { return QString::number(output.l_04_o_aerocomac_fzb_f8().value()); } return QString(); }; getDataFunction["l_04_o_aerocomac_mxb_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_mxb_f8()) { return QString::number(output.l_04_o_aerocomac_mxb_f8().value()); } return QString(); }; getDataFunction["l_04_o_aerocomac_myb_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_myb_f8()) { return QString::number(output.l_04_o_aerocomac_myb_f8().value()); } return QString(); }; getDataFunction["l_04_o_aerocomac_mzb_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_mzb_f8()) { return QString::number(output.l_04_o_aerocomac_mzb_f8().value()); } return QString(); }; getDataFunction["l_04_o_aerocomac_cls_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_cls_f8()) { return QString::number(output.l_04_o_aerocomac_cls_f8().value()); } return QString(); }; getDataFunction["l_04_o_aerocomac_cl_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_cl_f8()) { return QString::number(output.l_04_o_aerocomac_cl_f8().value()); } return QString(); }; getDataFunction["l_04_o_aerocomac_cd_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_cd_f8()) { return QString::number(output.l_04_o_aerocomac_cd_f8().value()); } return QString(); }; getDataFunction["l_04_o_aerocomac_cm_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_cm_f8()) { return QString::number(output.l_04_o_aerocomac_cm_f8().value()); } return QString(); }; getDataFunction["l_04_o_aerocomac_cr_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_cr_f8()) { return QString::number(output.l_04_o_aerocomac_cr_f8().value()); } return QString(); }; getDataFunction["l_04_o_aerocomac_cy_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_cy_f8()) { return QString::number(output.l_04_o_aerocomac_cy_f8().value()); } return QString(); }; getDataFunction["l_04_o_aerocomac_cn_f8"] = [this](const QString &varName) { if (output.l_04_o_aerocomac_cn_f8()) { return QString::number(output.l_04_o_aerocomac_cn_f8().value()); } return QString(); }; } Aerodynamics_output_Interface::~Aerodynamics_output_Interface() { } QString Aerodynamics_output_Interface::getData(const QString &varName) { int index1 = -1; int index2 = -1; QString trueVarName = varName; // 检查变量名中是否存在数组标记 if (varName.contains('[')) { // 解析数组索引 int startPos = varName.indexOf('['); int midPos = varName.indexOf("]["); int endPos = varName.lastIndexOf(']'); // 如果是二维数组 (格式: name[index1][index2]) if (midPos != -1) { bool ok1 = false, ok2 = false; index1 = varName.mid(startPos + 1, midPos - startPos - 1).toInt(&ok1); index2 = varName.mid(midPos + 2, endPos - midPos - 2).toInt(&ok2); if (!ok1 || !ok2) { qWarning() << "无法解析数组索引:" << varName; index1 = 0; index2 = 0; } } // 如果是一维数组 (格式: name[index1]) else if (startPos != -1 && endPos != -1) { bool ok = false; index1 = varName.mid(startPos + 1, endPos - startPos - 1).toInt(&ok); if (!ok) { qWarning() << "无法解析数组索引:" << varName; index1 = 0; } } trueVarName = varName.left(startPos); } QMutexLocker locker(&mutex); auto it = getDataFunction.find(trueVarName); if (it == getDataFunction.end()) { return QString(); // 返回空字符串表示未找到 } if (index1 < 0) { return it.value()(varName); } else if (index2 < 0) { QStringList list = it.value()(trueVarName).split(","); if (index1 >= list.size()) { qWarning() << "数组索引超出范围:" << varName; return QString(); } return list[index1]; } else { QStringList list = it.value()(trueVarName).split(","); if (index1 >= list.size()) { qWarning() << "数组索引超出范围:" << varName; return QString(); } QStringList list2 = list[index1].split(" "); if (index2 >= list2.size()) { qWarning() << "数组索引超出范围:" << varName; return QString(); } return list2[index2]; } } void Aerodynamics_output_Interface::outputDataListener( const XNSim::ATA04::Aerodynamics_output &output) { QMutexLocker locker(&mutex); this->output = output; } Aerodynamics_heartbeat_Interface::Aerodynamics_heartbeat_Interface() { getDataFunction["aero_model_heartbeat"] = [this](const QString &varName) { return QString::number(heartbeat.aero_model_heartbeat()); }; } Aerodynamics_heartbeat_Interface::~Aerodynamics_heartbeat_Interface() { } QString Aerodynamics_heartbeat_Interface::getData(const QString &varName) { int index1 = -1; int index2 = -1; QString trueVarName = varName; // 检查变量名中是否存在数组标记 if (varName.contains('[')) { // 解析数组索引 int startPos = varName.indexOf('['); int midPos = varName.indexOf("]["); int endPos = varName.lastIndexOf(']'); // 如果是二维数组 (格式: name[index1][index2]) if (midPos != -1) { bool ok1 = false, ok2 = false; index1 = varName.mid(startPos + 1, midPos - startPos - 1).toInt(&ok1); index2 = varName.mid(midPos + 2, endPos - midPos - 2).toInt(&ok2); if (!ok1 || !ok2) { qWarning() << "无法解析数组索引:" << varName; index1 = 0; index2 = 0; } } // 如果是一维数组 (格式: name[index1]) else if (startPos != -1 && endPos != -1) { bool ok = false; index1 = varName.mid(startPos + 1, endPos - startPos - 1).toInt(&ok); if (!ok) { qWarning() << "无法解析数组索引:" << varName; index1 = 0; } } trueVarName = varName.left(startPos); } QMutexLocker locker(&mutex); auto it = getDataFunction.find(trueVarName); if (it == getDataFunction.end()) { return QString(); // 返回空字符串表示未找到 } if (index1 < 0) { return it.value()(varName); } else if (index2 < 0) { QStringList list = it.value()(trueVarName).split(","); if (index1 >= list.size()) { qWarning() << "数组索引超出范围:" << varName; return QString(); } return list[index1]; } else { QStringList list = it.value()(trueVarName).split(","); if (index1 >= list.size()) { qWarning() << "数组索引超出范围:" << varName; return QString(); } QStringList list2 = list[index1].split(" "); if (index2 >= list2.size()) { qWarning() << "数组索引超出范围:" << varName; return QString(); } return list2[index2]; } } void Aerodynamics_heartbeat_Interface::heartbeatListener( const XNSim::ATA04::Aerodynamics_heartbeat &heartbeat) { QMutexLocker locker(&mutex); this->heartbeat = heartbeat; } } // namespace ATA04 } // namespace XNSim