测试了数据处理模型的接口函数

This commit is contained in:
jinchao 2025-05-22 10:54:46 +08:00
parent 797ff329f6
commit e98331d16e
13 changed files with 1219 additions and 1527 deletions

View File

@ -5,5 +5,6 @@
<Log Debug="0" Info="1" Error="1" Warning="1"/> <Log Debug="0" Info="1" Error="1" Warning="1"/>
<ModelGroup Name="本体模型组" Freq="120" Priority="99" CPUAff="0"> <ModelGroup Name="本体模型组" Freq="120" Priority="99" CPUAff="0">
<Model Name="ATA04地面操纵模型" ClassName="XNGroundHandling"/> <Model Name="ATA04地面操纵模型" ClassName="XNGroundHandling"/>
<Model Name="ATA04数据处理模型" ClassName="XNATA04DataProcessor"/>
</ModelGroup> </ModelGroup>
</Scenario> </Scenario>

View File

@ -20,7 +20,7 @@ public:
* @brief * @brief
* @param framework: * @param framework:
*/ */
virtual void Initialize(XNFrameworkPtr framework, uint32_t modelID) = 0; virtual void Initialize(XNFrameworkPtr framework, uint32_t modelID, uint32_t DDS_type) = 0;
/** /**
* @brief UDP包 * @brief UDP包
@ -28,6 +28,12 @@ public:
*/ */
XNByteArray getUDPPackage(); XNByteArray getUDPPackage();
/**
* @brief UDP包设置数据
* @param package: UDP包
*/
void setDataByUDPPackage(const XNByteArray &package);
/** /**
* @brief * @brief
* @param varNames: * @param varNames:
@ -305,18 +311,23 @@ protected:
virtual void sendOutData() {} virtual void sendOutData() {}
protected: protected:
struct ByteArrayFunc { struct GetByteArrayFunc {
std::function<XNByteArray(void)> func; std::function<XNByteArray(void)> func;
size_t size; size_t size;
}; };
struct SetByteArrayFunc {
std::function<void(XNByteArray)> func;
size_t size;
};
std::unordered_map<std::string, std::function<std::string()>> getDataFunction; std::unordered_map<std::string, std::function<std::string()>> getDataFunction;
std::unordered_map<std::string, std::function<void(std::string)>> setDataFunction; std::unordered_map<std::string, std::function<void(std::string)>> setDataFunction;
std::vector<ByteArrayFunc> getByteArrayFunction; std::vector<GetByteArrayFunc> getByteArrayFunction;
std::unordered_map<std::string, std::function<void(XNByteArray)>> setByteArrayFunction; std::unordered_map<std::string, SetByteArrayFunc> setByteArrayFunction;
std::mutex mutex; std::mutex mutex;
uint8_t header[5]{}; // 固定大小的头部 uint8_t header[8]{0}; // 固定大小的头部
size_t headerSize = 5; size_t headerSize = 8;
FAST_DDS_MACRO::DataWriter *dataWriter; FAST_DDS_MACRO::DataWriter *dataWriter;
}; };
@ -327,6 +338,6 @@ protected:
}; \ }; \
getByteArrayFunction.push_back( \ getByteArrayFunction.push_back( \
{[this]() { return getByteArray(data.NAME()); }, getTypeSize<decltype(data.NAME())>()}); \ {[this]() { return getByteArray(data.NAME()); }, getTypeSize<decltype(data.NAME())>()}); \
setByteArrayFunction[#NAME] = [this](XNByteArray byteArray) { \ setByteArrayFunction[#NAME] = { \
setByteArray(data.NAME(), byteArray); \ [this](XNByteArray byteArray) { setByteArray(out_data.NAME(), byteArray); }, \
} getTypeSize<decltype(out_data.NAME())>()};

View File

@ -64,6 +64,7 @@ add_library(XNCore SHARED
XNServiceObject_p.h XNServiceObject_p.h
XNServiceObject.cpp XNServiceObject.cpp
XNDDSInterface.h XNDDSInterface.h
XNDDSInterface.cpp
${DDS_XNIDL_SOURCES_CXX} ${DDS_XNIDL_SOURCES_CXX}
) )

View File

@ -11,10 +11,8 @@ XNByteArray XNDDSInterface::getUDPPackage()
size_t currentPos = 0; size_t currentPos = 0;
// 复制头部 // 复制头部
if (headerSize >= 5) { result.append(header, headerSize);
result.append(header, 5); currentPos = headerSize;
currentPos = 5;
}
// 复制数据 // 复制数据
for (auto func : getByteArrayFunction) { for (auto func : getByteArrayFunction) {
@ -27,13 +25,45 @@ XNByteArray XNDDSInterface::getUDPPackage()
} }
// 更新包大小 // 更新包大小
if (currentPos >= 5) { if (currentPos >= 8 && currentPos < MAX_UDP_PACKET_SIZE) {
result[4] = static_cast<uint8_t>(currentPos); result[6] = static_cast<uint8_t>((currentPos >> 8) & 0xFF);
result[7] = static_cast<uint8_t>(currentPos & 0xFF);
} }
return result; return result;
} }
void XNDDSInterface::setDataByUDPPackage(const XNByteArray &package)
{
clearOutData();
if (package.size() < headerSize) {
return;
}
// 获取包大小
uint16_t packageSize = (package[6] << 8) | package[7];
if (packageSize > MAX_UDP_PACKET_SIZE) {
return;
}
size_t currentPos = 8;
// 获取数据
for (auto func : setByteArrayFunction) {
if (currentPos + func.second.size <= packageSize) {
XNByteArray byteArray(func.second.size);
for (size_t i = 0; i < func.second.size; i++) {
byteArray[i] = package[currentPos + i];
}
func.second.func(byteArray);
currentPos += func.second.size;
} else {
break;
}
}
sendOutData();
}
std::unordered_map<std::string, std::string> std::unordered_map<std::string, std::string>
XNDDSInterface::getStringData(std::vector<std::string> varNames) XNDDSInterface::getStringData(std::vector<std::string> varNames)
{ {

View File

@ -20,7 +20,7 @@ public:
* @brief * @brief
* @param framework: * @param framework:
*/ */
virtual void Initialize(XNFrameworkPtr framework, uint32_t modelID) = 0; virtual void Initialize(XNFrameworkPtr framework, uint32_t modelID, uint32_t DDS_type) = 0;
/** /**
* @brief UDP包 * @brief UDP包
@ -28,6 +28,12 @@ public:
*/ */
XNByteArray getUDPPackage(); XNByteArray getUDPPackage();
/**
* @brief UDP包设置数据
* @param package: UDP包
*/
void setDataByUDPPackage(const XNByteArray &package);
/** /**
* @brief * @brief
* @param varNames: * @param varNames:
@ -305,18 +311,23 @@ protected:
virtual void sendOutData() {} virtual void sendOutData() {}
protected: protected:
struct ByteArrayFunc { struct GetByteArrayFunc {
std::function<XNByteArray(void)> func; std::function<XNByteArray(void)> func;
size_t size; size_t size;
}; };
struct SetByteArrayFunc {
std::function<void(XNByteArray)> func;
size_t size;
};
std::unordered_map<std::string, std::function<std::string()>> getDataFunction; std::unordered_map<std::string, std::function<std::string()>> getDataFunction;
std::unordered_map<std::string, std::function<void(std::string)>> setDataFunction; std::unordered_map<std::string, std::function<void(std::string)>> setDataFunction;
std::vector<ByteArrayFunc> getByteArrayFunction; std::vector<GetByteArrayFunc> getByteArrayFunction;
std::unordered_map<std::string, std::function<void(XNByteArray)>> setByteArrayFunction; std::unordered_map<std::string, SetByteArrayFunc> setByteArrayFunction;
std::mutex mutex; std::mutex mutex;
uint8_t header[5]{}; // 固定大小的头部 uint8_t header[8]{0}; // 固定大小的头部
size_t headerSize = 5; size_t headerSize = 8;
FAST_DDS_MACRO::DataWriter *dataWriter; FAST_DDS_MACRO::DataWriter *dataWriter;
}; };
@ -327,6 +338,6 @@ protected:
}; \ }; \
getByteArrayFunction.push_back( \ getByteArrayFunction.push_back( \
{[this]() { return getByteArray(data.NAME()); }, getTypeSize<decltype(data.NAME())>()}); \ {[this]() { return getByteArray(data.NAME()); }, getTypeSize<decltype(data.NAME())>()}); \
setByteArrayFunction[#NAME] = [this](XNByteArray byteArray) { \ setByteArrayFunction[#NAME] = { \
setByteArray(data.NAME(), byteArray); \ [this](XNByteArray byteArray) { setByteArray(out_data.NAME(), byteArray); }, \
} getTypeSize<decltype(out_data.NAME())>()};

View File

@ -2,9 +2,6 @@ cmake_minimum_required(VERSION 3.16)
project(XNATA04DataProcessor LANGUAGES CXX) project(XNATA04DataProcessor LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
@ -18,9 +15,6 @@ endif()
# XNCore_PATH include # XNCore_PATH include
include_directories(${XNCore_PATH}/include) include_directories(${XNCore_PATH}/include)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core)
add_library(XNATA04DataProcessor SHARED add_library(XNATA04DataProcessor SHARED
XNATA04DataProcessor_global.h XNATA04DataProcessor_global.h
XNATA04DataProcessor.cpp XNATA04DataProcessor.cpp
@ -29,7 +23,6 @@ add_library(XNATA04DataProcessor SHARED
) )
target_link_libraries(XNATA04DataProcessor PRIVATE target_link_libraries(XNATA04DataProcessor PRIVATE
Qt${QT_VERSION_MAJOR}::Core
${XNCore_PATH}/lib/libXNCore.so ${XNCore_PATH}/lib/libXNCore.so
${XNCore_PATH}/Models/libXNAerodynamicsInterface.so ${XNCore_PATH}/Models/libXNAerodynamicsInterface.so
${XNCore_PATH}/Models/libXNGroundHandlingInterface.so ${XNCore_PATH}/Models/libXNGroundHandlingInterface.so

File diff suppressed because it is too large Load Diff

View File

@ -1,66 +1,50 @@
#pragma once #pragma once
#include "XNATA04DataProcessor_global.h" #include "XNATA04DataProcessor_global.h"
#include <XNCore/XNModelObject.h> #include <XNCore/XNModelObject.h>
#include "../XNAerodynamics/XNAerodynamicsInterface/XNAerodynamicsPubSubTypes.hpp" // #include "../XNAerodynamics/XNAerodynamicsInterface/XNAerodynamicsPubSubTypes.hpp"
#include "../XNWeightBalance/XNWeightBalanceInterface/XNWeightBalancePubSubTypes.hpp" // #include "../XNWeightBalance/XNWeightBalanceInterface/XNWeightBalancePubSubTypes.hpp"
#include "../XNGroundHandling/XNGroundHandlingInterface/XNGroundHandlingPubSubTypes.hpp"
#include <QVariant>
class XNATA04DataProcessorPrivate; class XNATA04DataProcessorPrivate;
class XNATA04DATAPROCESSOR_EXPORT XNATA04DataProcessor : public XNModelObject class XNATA04DATAPROCESSOR_EXPORT XNATA04DataProcessor : public XNModelObject
{ {
Q_OBJECT XN_METATYPE(XNATA04DataProcessor, XNModelObject)
Q_DISABLE_COPY(XNATA04DataProcessor) XN_DECLARE_PRIVATE(XNATA04DataProcessor)
Q_DECLARE_PRIVATE(XNATA04DataProcessor)
XN_DECLARE_DDS()
public: public:
explicit XNATA04DataProcessor(QObject *parent = nullptr); XNATA04DataProcessor();
virtual ~XNATA04DataProcessor(); virtual ~XNATA04DataProcessor();
protected: protected:
XNATA04DataProcessor(XNATA04DataProcessorPrivate &dd, QObject *parent = nullptr); XNATA04DataProcessor(PrivateType *p);
public slots: public:
virtual void OnInitialize() override; virtual void Initialize() override;
virtual void OnPrepareForExecute() override; virtual void PrepareForExecute() override;
public: public:
virtual void StepUpdate() override; virtual void StepUpdate() override;
private: private:
void OnWbOutput(const XNSim::ATA04::WeightBalance_output &output); // void OnAeroInput(const QVariant &data);
void OnGhOutput(const XNSim::ATA04::GroundHandling_output &output); // void OnWbInput(const QVariant &data);
void OnAeroOutput(const XNSim::ATA04::Aerodynamics_output &output); void OnGhInput(const std::any &data);
void OnAeroHeartbeat(const XNSim::ATA04::Aerodynamics_heartbeat &heartbeat);
void OnWbHeartbeat(const XNSim::ATA04::WeightBalance_heartbeat &heartbeat);
void OnGhHeartbeat(const XNSim::ATA04::GroundHandling_heartbeat &heartbeat);
void OnAeroInput(const QVariant &data);
void OnWbInput(const QVariant &data);
void OnGhInput(const QVariant &data);
void SendUdpData(); void SendUdpData();
void SendAeroOutput(); // void SendAeroOutput();
void SendWbOutput(); // void SendWbOutput();
void SendGhOutput(); void SendGhOutput();
void SendAeroHeartbeat(); // void SendAeroHeartbeat();
void SendWbHeartbeat(); // void SendWbHeartbeat();
void SendGhHeartbeat(); void SendGhHeartbeat();
void SendUdpTestData(); //void SendUdpTestData();
}; };
Q_DECLARE_METATYPE(XNATA04DataProcessor) XNCLASS_PTR_DECLARE(XNATA04DataProcessor)

View File

@ -1,12 +1,10 @@
#ifndef XNATA04DATAPROCESSOR_GLOBAL_H #ifndef XNATA04DATAPROCESSOR_GLOBAL_H
#define XNATA04DATAPROCESSOR_GLOBAL_H #define XNATA04DATAPROCESSOR_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(XNATA04DATAPROCESSOR_LIBRARY) #if defined(XNATA04DATAPROCESSOR_LIBRARY)
# define XNATA04DATAPROCESSOR_EXPORT Q_DECL_EXPORT # define XNATA04DATAPROCESSOR_EXPORT __attribute__((visibility("default")))
#else #else
# define XNATA04DATAPROCESSOR_EXPORT Q_DECL_IMPORT # define XNATA04DATAPROCESSOR_EXPORT __attribute__((visibility("default")))
#endif #endif
#endif // XNATA04DATAPROCESSOR_GLOBAL_H #endif // XNATA04DATAPROCESSOR_GLOBAL_H

View File

@ -1,30 +1,22 @@
#pragma once #pragma once
#include <XNCore/XNModelObject_p.h> #include <XNCore/XNModelObject_p.h>
#include <QMutex> #include "../XNGroundHandling/XNGroundHandlingInterface/XNGroundHandlingInterface.hpp"
class XNATA04DataProcessorPrivate : public XNModelObjectPrivate struct XNATA04DataProcessorPrivate : public XNModelObjectPrivate {
{ // XNSim::C909::ATA04::Aerodynamics_input _aeroInput;
public: // XNSim::C909::ATA04::Aerodynamics_output _aeroOutput;
Q_DECLARE_PUBLIC(XNATA04DataProcessor) // XNSim::C909::ATA04::WeightBalance_input _wbInput;
// XNSim::C909::ATA04::WeightBalance_output _wbOutput;
XNSim::C909::ATA04::GroundHandling_input _ghInput;
XNSim::C909::ATA04::GroundHandling_output _ghOutput;
// XNSim::C909::ATA04::Aerodynamics_heartbeat _aeroHeartbeat;
// XNSim::C909::ATA04::WeightBalance_heartbeat _wbHeartbeat;
XNSim::C909::ATA04::GroundHandling_heartbeat _ghHeartbeat;
XNATA04DataProcessorPrivate(XNATA04DataProcessor *q) : XNModelObjectPrivate(q) {} XNSim::C909::ATA04::GroundHandling_input_Interface _ghInputInterface;
XNSim::C909::ATA04::GroundHandling_output_Interface _ghOutputInterface;
XNSim::ATA04::Aerodynamics_input _aeroInput; XNSim::C909::ATA04::GroundHandling_heartbeat_Interface _ghHeartbeatInterface;
XNSim::ATA04::Aerodynamics_output _aeroOutput; std::mutex _ghOutputMutex;
XNSim::ATA04::WeightBalance_input _wbInput; std::mutex _ghHeartbeatMutex;
XNSim::ATA04::WeightBalance_output _wbOutput; std::mutex _ghInputMutex;
XNSim::ATA04::GroundHandling_input _ghInput;
XNSim::ATA04::GroundHandling_output _ghOutput;
XNSim::ATA04::Aerodynamics_heartbeat _aeroHeartbeat;
XNSim::ATA04::WeightBalance_heartbeat _wbHeartbeat;
XNSim::ATA04::GroundHandling_heartbeat _ghHeartbeat;
QMutex _wbOutputMutex;
QMutex _ghOutputMutex;
QMutex _aeroOutputMutex;
QMutex _aeroHeartbeatMutex;
QMutex _wbHeartbeatMutex;
QMutex _ghHeartbeatMutex;
QMutex _aeroInputMutex;
QMutex _wbInputMutex;
QMutex _ghInputMutex;
}; };

View File

@ -111,9 +111,9 @@ void XNGroundHandling::PrepareForExecute()
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
d->_data.output_ground->l_04_o_gdcomac_vczt_f8[i] = new double[2]; d->_data.output_ground->l_04_o_gdcomac_vczt_f8[i] = new double[2];
} }
d->_inputInterface.Initialize(GetFramework(), GetUniqueId()); d->_inputInterface.Initialize(GetFramework(), GetUniqueId(), 1);
d->_outputInterface.Initialize(GetFramework(), GetUniqueId()); d->_outputInterface.Initialize(GetFramework(), GetUniqueId(), 2);
d->_heartbeatInterface.Initialize(GetFramework(), GetUniqueId()); d->_heartbeatInterface.Initialize(GetFramework(), GetUniqueId(), 2);
} }
void XNGroundHandling::StepUpdate() void XNGroundHandling::StepUpdate()

View File

@ -43,24 +43,46 @@ GroundHandling_input_Interface::GroundHandling_input_Interface()
MAP_DATA_FUNC(l_04_i_gdcomac_theta_deg_f8); MAP_DATA_FUNC(l_04_i_gdcomac_theta_deg_f8);
MAP_DATA_FUNC(l_04_i_gdcomac_psi_deg_f8); MAP_DATA_FUNC(l_04_i_gdcomac_psi_deg_f8);
MAP_DATA_FUNC(l_04_i_gdcomac_resetint_l1); MAP_DATA_FUNC(l_04_i_gdcomac_resetint_l1);
this->header[0] = 0xa6; // XNSim头0xa6
this->header[1] = 0xc0; // 机型头0xc0表示C909
this->header[2] = 0x04; // 章节头0x04表示ATA04
this->header[3] = 0x01; // 模型头0x01表示GroundHandling
this->header[4] = 0x00; // 结构体头0x00表示输入结构体
this->header[5] = 0x00; // 数据方向0x00表示外部输入
this->header[6] = 0x00; // 数据大小
this->header[7] = 0x00; // 数据大小
} }
GroundHandling_input_Interface::~GroundHandling_input_Interface() GroundHandling_input_Interface::~GroundHandling_input_Interface()
{ {
} }
void GroundHandling_input_Interface::Initialize(XNFrameworkPtr framework, uint32_t modelId) void GroundHandling_input_Interface::Initialize(XNFrameworkPtr framework, uint32_t modelId,
uint32_t DDS_type)
{ {
auto ddsManager = framework->GetDDSManager(); auto ddsManager = framework->GetDDSManager();
if (!ddsManager) { if (!ddsManager) {
LOG_ERROR("DDSManager is nullptr"); LOG_ERROR("DDSManager is nullptr");
return; return;
} }
dataWriter = ddsManager->RegisterPublisher<XNSim::C909::ATA04::GroundHandling_inputPubSubType>( if (DDS_type == 0) { // 读取与发送都进行
dataWriter =
ddsManager->RegisterPublisher<XNSim::C909::ATA04::GroundHandling_inputPubSubType>(
"XNSim::C909::ATA04::GroundHandling_input", modelId); "XNSim::C909::ATA04::GroundHandling_input", modelId);
ddsManager->RegisterSubscriber<XNSim::C909::ATA04::GroundHandling_inputPubSubType>( ddsManager->RegisterSubscriber<XNSim::C909::ATA04::GroundHandling_inputPubSubType>(
"XNSim::C909::ATA04::GroundHandling_input", modelId, "XNSim::C909::ATA04::GroundHandling_input", modelId,
std::bind(&GroundHandling_input_Interface::inputDataListener, this, std::placeholders::_1)); std::bind(&GroundHandling_input_Interface::inputDataListener, this,
std::placeholders::_1));
} else if (DDS_type == 1) { // 只读取
ddsManager->RegisterSubscriber<XNSim::C909::ATA04::GroundHandling_inputPubSubType>(
"XNSim::C909::ATA04::GroundHandling_input", modelId,
std::bind(&GroundHandling_input_Interface::inputDataListener, this,
std::placeholders::_1));
} else if (DDS_type == 2) { // 只发送
dataWriter =
ddsManager->RegisterPublisher<XNSim::C909::ATA04::GroundHandling_inputPubSubType>(
"XNSim::C909::ATA04::GroundHandling_input", modelId);
}
} }
void GroundHandling_input_Interface::clearOutData() void GroundHandling_input_Interface::clearOutData()
@ -116,25 +138,46 @@ GroundHandling_output_Interface::GroundHandling_output_Interface()
MAP_DATA_FUNC(l_04_o_gdcomac_wor_par_f8); MAP_DATA_FUNC(l_04_o_gdcomac_wor_par_f8);
MAP_DATA_FUNC(l_04_o_gdcomac_nd_f8); MAP_DATA_FUNC(l_04_o_gdcomac_nd_f8);
MAP_DATA_FUNC(l_04_o_gdcomac_vczt_f8); MAP_DATA_FUNC(l_04_o_gdcomac_vczt_f8);
this->header[0] = 0xa6; // XNSim头0xa6
this->header[1] = 0xc0; // 机型头0xc0表示C909
this->header[2] = 0x04; // 章节头0x04表示ATA04
this->header[3] = 0x01; // 模型头0x01表示GroundHandling
this->header[4] = 0x01; // 结构体头0x01表示输出结构体
this->header[5] = 0x00; // 数据方向0x00表示外部输入
this->header[6] = 0x00; // 数据大小
this->header[7] = 0x00; // 数据大小
} }
GroundHandling_output_Interface::~GroundHandling_output_Interface() GroundHandling_output_Interface::~GroundHandling_output_Interface()
{ {
} }
void GroundHandling_output_Interface::Initialize(XNFrameworkPtr framework, uint32_t modelId) void GroundHandling_output_Interface::Initialize(XNFrameworkPtr framework, uint32_t modelId,
uint32_t DDS_type)
{ {
auto ddsManager = framework->GetDDSManager(); auto ddsManager = framework->GetDDSManager();
if (!ddsManager) { if (!ddsManager) {
LOG_ERROR("DDSManager is nullptr"); LOG_ERROR("DDSManager is nullptr");
return; return;
} }
dataWriter = ddsManager->RegisterPublisher<XNSim::C909::ATA04::GroundHandling_outputPubSubType>( if (DDS_type == 0) { // 读取与发送都进行
dataWriter =
ddsManager->RegisterPublisher<XNSim::C909::ATA04::GroundHandling_outputPubSubType>(
"XNSim::C909::ATA04::GroundHandling_output", modelId); "XNSim::C909::ATA04::GroundHandling_output", modelId);
ddsManager->RegisterSubscriber<XNSim::C909::ATA04::GroundHandling_outputPubSubType>( ddsManager->RegisterSubscriber<XNSim::C909::ATA04::GroundHandling_outputPubSubType>(
"XNSim::C909::ATA04::GroundHandling_output", modelId, "XNSim::C909::ATA04::GroundHandling_output", modelId,
std::bind(&GroundHandling_output_Interface::outputDataListener, this, std::bind(&GroundHandling_output_Interface::outputDataListener, this,
std::placeholders::_1)); std::placeholders::_1));
} else if (DDS_type == 1) { // 只读取
ddsManager->RegisterSubscriber<XNSim::C909::ATA04::GroundHandling_outputPubSubType>(
"XNSim::C909::ATA04::GroundHandling_output", modelId,
std::bind(&GroundHandling_output_Interface::outputDataListener, this,
std::placeholders::_1));
} else if (DDS_type == 2) { // 只发送
dataWriter =
ddsManager->RegisterPublisher<XNSim::C909::ATA04::GroundHandling_outputPubSubType>(
"XNSim::C909::ATA04::GroundHandling_output", modelId);
}
} }
void GroundHandling_output_Interface::clearOutData() void GroundHandling_output_Interface::clearOutData()
@ -156,19 +199,29 @@ void GroundHandling_output_Interface::outputDataListener(
GroundHandling_heartbeat_Interface::GroundHandling_heartbeat_Interface() GroundHandling_heartbeat_Interface::GroundHandling_heartbeat_Interface()
{ {
MAP_DATA_FUNC(groundhandling_model_heartbeat); MAP_DATA_FUNC(groundhandling_model_heartbeat);
this->header[0] = 0xa6; // XNSim头0xa6
this->header[1] = 0xc0; // 机型头0xc0表示C909
this->header[2] = 0x04; // 章节头0x04表示ATA04
this->header[3] = 0x01; // 模型头0x01表示GroundHandling
this->header[4] = 0x02; // 结构体头0x02表示心跳结构体
this->header[5] = 0x00; // 数据方向0x00表示外部输入
this->header[6] = 0x00; // 数据大小
this->header[7] = 0x00; // 数据大小
} }
GroundHandling_heartbeat_Interface::~GroundHandling_heartbeat_Interface() GroundHandling_heartbeat_Interface::~GroundHandling_heartbeat_Interface()
{ {
} }
void GroundHandling_heartbeat_Interface::Initialize(XNFrameworkPtr framework, uint32_t modelId) void GroundHandling_heartbeat_Interface::Initialize(XNFrameworkPtr framework, uint32_t modelId,
uint32_t DDS_type)
{ {
auto ddsManager = framework->GetDDSManager(); auto ddsManager = framework->GetDDSManager();
if (!ddsManager) { if (!ddsManager) {
LOG_ERROR("DDSManager is nullptr"); LOG_ERROR("DDSManager is nullptr");
return; return;
} }
if (DDS_type == 0) { // 读取与发送都进行
dataWriter = dataWriter =
ddsManager->RegisterPublisher<XNSim::C909::ATA04::GroundHandling_heartbeatPubSubType>( ddsManager->RegisterPublisher<XNSim::C909::ATA04::GroundHandling_heartbeatPubSubType>(
"XNSim::C909::ATA04::GroundHandling_heartbeat", modelId); "XNSim::C909::ATA04::GroundHandling_heartbeat", modelId);
@ -176,6 +229,16 @@ void GroundHandling_heartbeat_Interface::Initialize(XNFrameworkPtr framework, ui
"XNSim::C909::ATA04::GroundHandling_heartbeat", modelId, "XNSim::C909::ATA04::GroundHandling_heartbeat", modelId,
std::bind(&GroundHandling_heartbeat_Interface::heartbeatListener, this, std::bind(&GroundHandling_heartbeat_Interface::heartbeatListener, this,
std::placeholders::_1)); std::placeholders::_1));
} else if (DDS_type == 1) { // 只读取
ddsManager->RegisterSubscriber<XNSim::C909::ATA04::GroundHandling_heartbeatPubSubType>(
"XNSim::C909::ATA04::GroundHandling_heartbeat", modelId,
std::bind(&GroundHandling_heartbeat_Interface::heartbeatListener, this,
std::placeholders::_1));
} else if (DDS_type == 2) { // 只发送
dataWriter =
ddsManager->RegisterPublisher<XNSim::C909::ATA04::GroundHandling_heartbeatPubSubType>(
"XNSim::C909::ATA04::GroundHandling_heartbeat", modelId);
}
} }
void GroundHandling_heartbeat_Interface::clearOutData() void GroundHandling_heartbeat_Interface::clearOutData()

View File

@ -10,7 +10,7 @@ public:
GroundHandling_input_Interface(); GroundHandling_input_Interface();
virtual ~GroundHandling_input_Interface(); virtual ~GroundHandling_input_Interface();
virtual void Initialize(XNFrameworkPtr framework, uint32_t modelId) override; virtual void Initialize(XNFrameworkPtr framework, uint32_t modelId, uint32_t DDS_type) override;
virtual void clearOutData() override; virtual void clearOutData() override;
virtual void sendOutData() override; virtual void sendOutData() override;
@ -145,7 +145,7 @@ class GroundHandling_output_Interface final : public XNDDSInterface
public: public:
GroundHandling_output_Interface(); GroundHandling_output_Interface();
virtual ~GroundHandling_output_Interface(); virtual ~GroundHandling_output_Interface();
virtual void Initialize(XNFrameworkPtr framework, uint32_t modelId) override; virtual void Initialize(XNFrameworkPtr framework, uint32_t modelId, uint32_t DDS_type) override;
void outputDataListener(const XNSim::C909::ATA04::GroundHandling_output &output); void outputDataListener(const XNSim::C909::ATA04::GroundHandling_output &output);
virtual void clearOutData() override; virtual void clearOutData() override;
virtual void sendOutData() override; virtual void sendOutData() override;
@ -263,7 +263,7 @@ class GroundHandling_heartbeat_Interface final : public XNDDSInterface
public: public:
GroundHandling_heartbeat_Interface(); GroundHandling_heartbeat_Interface();
virtual ~GroundHandling_heartbeat_Interface(); virtual ~GroundHandling_heartbeat_Interface();
virtual void Initialize(XNFrameworkPtr framework, uint32_t modelId) override; virtual void Initialize(XNFrameworkPtr framework, uint32_t modelId, uint32_t DDS_type) override;
void heartbeatListener(const XNSim::C909::ATA04::GroundHandling_heartbeat &heartbeat); void heartbeatListener(const XNSim::C909::ATA04::GroundHandling_heartbeat &heartbeat);
virtual void clearOutData() override; virtual void clearOutData() override;
virtual void sendOutData() override; virtual void sendOutData() override;