V0.36.2.250626_alpha:为XNCore添加了规范的出错信息

This commit is contained in:
jinchao 2025-06-26 15:26:26 +08:00
parent 261cc444d6
commit c30b580a56
19 changed files with 393 additions and 379 deletions

Binary file not shown.

Binary file not shown.

View File

@ -75,7 +75,7 @@ protected:
} }
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 78"); "A01161001:T 必须是算术类型或std::array类型");
} }
return result; return result;
@ -109,7 +109,7 @@ protected:
setByteArrayFromStdArray(data.value(), thisArray); setByteArrayFromStdArray(data.value(), thisArray);
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 112"); "A01161002:T 必须是算术类型或std::array类型");
} }
} }
@ -132,7 +132,7 @@ protected:
getTypeSize<T>()); getTypeSize<T>());
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 135"); "A01161003:T 必须是算术类型或std::array类型");
} }
} }
@ -158,7 +158,7 @@ protected:
setByteArrayFromStdArray(data[i], subArray); setByteArrayFromStdArray(data[i], subArray);
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 160"); "A01161004:T 必须是算术类型或std::array类型");
} }
} }
} }
@ -186,7 +186,7 @@ protected:
} }
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 188"); "A01161005:T 必须是算术类型或std::array类型");
} }
return std::string(); return std::string();
} }
@ -214,6 +214,7 @@ protected:
items.push_back(item); items.push_back(item);
} }
if (items.size() != getArrayWholeSize<T>()) { if (items.size() != getArrayWholeSize<T>()) {
LOG_WARNING("A01163006:数组大小不一致, 设置数据失败!");
return; return;
} }
T temp; T temp;
@ -221,7 +222,7 @@ protected:
data = temp; data = temp;
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 220"); "A01161007:T 必须是算术类型或std::array类型");
} }
} }
@ -249,7 +250,7 @@ protected:
ss << getStringFromStdArray(data[i]); ss << getStringFromStdArray(data[i]);
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 243"); "A01161008:T 必须是算术类型或std::array类型");
} }
} }
return ss.str(); return ss.str();
@ -281,13 +282,11 @@ protected:
// 对于嵌套数组,递归处理 // 对于嵌套数组,递归处理
start_pos = setStdArrayFromString(data[i], value, start_pos); start_pos = setStdArrayFromString(data[i], value, start_pos);
} else { } else {
static_assert( static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
std::is_arithmetic_v<T> || is_std_array_v<T>, "A01161009:T 必须是算术类型或std::array类型");
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 275");
} }
} catch (const std::exception &e) { } catch (const std::exception &e) {
throw std::runtime_error("无法解析第 " + std::to_string(i) LOG_WARNING("A01163010:无法解析第 %1 个元素: %2", i, e.what());
+ " 个元素: " + e.what());
} }
} }
return start_pos + N; return start_pos + N;
@ -299,10 +298,9 @@ protected:
if (data) { if (data) {
auto temp = data.value(); auto temp = data.value();
if constexpr (std::is_arithmetic_v<T1>) { if constexpr (std::is_arithmetic_v<T1>) {
static_assert(std::is_arithmetic_v<T2>, static_assert(std::is_arithmetic_v<T2>, "A01161011:模板参数T2必须是算术类型");
"模板参数T2必须是算术类型详见XNDDSInterface.cppline 293");
static_assert(std::is_convertible_v<T1, T2>, static_assert(std::is_convertible_v<T1, T2>,
"模板参数T1必须可以转换为T2类型详见XNDDSInterface.cppline 295"); "A01161012:模板参数T1必须可以转换为T2类型");
model_data = temp; model_data = temp;
} else if constexpr (is_std_array_v<T1>) { } else if constexpr (is_std_array_v<T1>) {
size_t arraySize = array_size_v<T1>; size_t arraySize = array_size_v<T1>;
@ -320,21 +318,19 @@ protected:
} }
} else { } else {
static_assert(std::is_arithmetic_v<sub_array_type>, static_assert(std::is_arithmetic_v<sub_array_type>,
"模板参数T1是std::" "A01161013:模板参数T1是std::"
"array类型时它的数组嵌套不能超过两层详见XNDDSInterfac" "array类型时它的数组嵌套不能超过两层");
"e.cppline 313");
} }
} else { } else {
static_assert( static_assert(std::is_arithmetic_v<array_type>
std::is_arithmetic_v<array_type> || is_std_array_v<array_type>, || is_std_array_v<array_type>,
"模板参数T1是std::array类型时它的value_" "A01161014:模板参数T1是std::array类型时它的value_"
"type必须是算术类型或std::array类型详见XNDDSInterface.cppline 320"); "type必须是算术类型或std::array类型");
} }
} }
} else { } else {
static_assert( static_assert(std::is_arithmetic_v<T1> || is_std_array_v<T1>,
std::is_arithmetic_v<T1> || is_std_array_v<T1>, "A01161015:模板参数T1必须是算术类型或std::array类型");
"模板参数T1必须是算术类型或std::array类型详见XNDDSInterface.cppline 326");
} }
} }
} }
@ -343,10 +339,9 @@ protected:
void assign_value_set(eprosima::fastcdr::optional<T1> &data, const T2 &model_data) void assign_value_set(eprosima::fastcdr::optional<T1> &data, const T2 &model_data)
{ {
if constexpr (std::is_arithmetic_v<T1>) { if constexpr (std::is_arithmetic_v<T1>) {
static_assert(std::is_arithmetic_v<T2>, static_assert(std::is_arithmetic_v<T2>, "A01161016:模板参数T2必须是算术类型");
"模板参数T2必须是算术类型详见XNDDSInterface.cppline 337");
static_assert(std::is_convertible_v<T2, T1>, static_assert(std::is_convertible_v<T2, T1>,
"模板参数T2必须可以转换为T1类型详见XNDDSInterface.cppline 339"); "A01161017:模板参数T2必须可以转换为T1类型");
data = model_data; data = model_data;
} else if constexpr (is_std_array_v<T1>) { } else if constexpr (is_std_array_v<T1>) {
T1 temp; T1 temp;
@ -363,23 +358,20 @@ protected:
temp[i][j] = model_data[i][j]; temp[i][j] = model_data[i][j];
} }
} else { } else {
static_assert(std::is_arithmetic_v<sub_array_type>, static_assert(
"模板参数T1是std::" std::is_arithmetic_v<sub_array_type>,
"array类型时它的数组嵌套不能超过两层详见XNDDSInterface." "A01161018:模板参数T1是std::array类型时它的数组嵌套不能超过两层");
"cppline 357");
} }
} else { } else {
static_assert( static_assert(std::is_arithmetic_v<array_type> || is_std_array_v<array_type>,
std::is_arithmetic_v<array_type> || is_std_array_v<array_type>, "A01161019:模板参数T1是std::array类型时它的value_"
"模板参数T1是std::array类型时它的value_" "type必须是算术类型或std::array类型");
"type必须是算术类型或std::array类型详见XNDDSInterface.cppline 364");
} }
} }
data = temp; data = temp;
} else { } else {
static_assert( static_assert(std::is_arithmetic_v<T1> || is_std_array_v<T1>,
std::is_arithmetic_v<T1> || is_std_array_v<T1>, "A01161020:模板参数T1必须是算术类型或std::array类型");
"模板参数T1必须是算术类型或std::array类型详见XNDDSInterface.cppline 371");
} }
} }

View File

@ -77,7 +77,7 @@ public:
tmp.topic = d->participant_->create_topic(topicName, typeSupport.get_type_name(), tmp.topic = d->participant_->create_topic(topicName, typeSupport.get_type_name(),
FAST_DDS_MACRO::TOPIC_QOS_DEFAULT); FAST_DDS_MACRO::TOPIC_QOS_DEFAULT);
if (tmp.topic == nullptr) { if (tmp.topic == nullptr) {
LOG_ERROR("0x2130 Create Topic %1 Failed!", topicName); LOG_ERROR("C01102001:创建主题 %1 失败!", topicName);
d->topics_.erase(topicName); d->topics_.erase(topicName);
return nullptr; return nullptr;
} }
@ -87,7 +87,7 @@ public:
tmp.publishers_[publisherID].publisher = tmp.publishers_[publisherID].publisher =
d->participant_->create_publisher(FAST_DDS_MACRO::PUBLISHER_QOS_DEFAULT, nullptr); d->participant_->create_publisher(FAST_DDS_MACRO::PUBLISHER_QOS_DEFAULT, nullptr);
if (tmp.publishers_[publisherID].publisher == nullptr) { if (tmp.publishers_[publisherID].publisher == nullptr) {
LOG_ERROR("0x2131 Create Publisher %1 for Topic %2 Failed!", publisherID, topicName); LOG_ERROR("C01102002:创建主题 %1 的发布者 %2 失败!", topicName, publisherID);
return nullptr; return nullptr;
} }
@ -107,10 +107,11 @@ public:
tmp.publishers_[publisherID].publisher->create_datawriter(tmp.topic, dataWriterQos, tmp.publishers_[publisherID].publisher->create_datawriter(tmp.topic, dataWriterQos,
nullptr); nullptr);
if (tmp.publishers_[publisherID].dataWriter == nullptr) { if (tmp.publishers_[publisherID].dataWriter == nullptr) {
LOG_ERROR("0x2132 Create DataWriter %1 for Topic %2 Failed!", publisherID, topicName); LOG_ERROR("C01102003:创建主题 %1 的发布者 %2 的数据写入器失败!", topicName,
publisherID);
return nullptr; return nullptr;
} }
LOG_INFO("0x2133 Create Publisher %1 for Topic %2 Success!", publisherID, topicName); LOG_INFO("D01104004:创建主题 %1 的发布者 %2 的数据写入器成功!", topicName, publisherID);
return tmp.publishers_[publisherID].dataWriter; return tmp.publishers_[publisherID].dataWriter;
} }
@ -128,7 +129,7 @@ public:
tmp.topic = d->participant_->create_topic(topicName, typeSupport.get_type_name(), tmp.topic = d->participant_->create_topic(topicName, typeSupport.get_type_name(),
FAST_DDS_MACRO::TOPIC_QOS_DEFAULT); FAST_DDS_MACRO::TOPIC_QOS_DEFAULT);
if (tmp.topic == nullptr) { if (tmp.topic == nullptr) {
LOG_ERROR("0x2130 Create Topic %1 Failed!", topicName); LOG_ERROR("C01102005:创建主题 %1 失败!", topicName);
d->topics_.erase(topicName); d->topics_.erase(topicName);
return; return;
} }
@ -138,7 +139,7 @@ public:
tmp.subscribers_[subscriberID].subscriber = tmp.subscribers_[subscriberID].subscriber =
d->participant_->create_subscriber(FAST_DDS_MACRO::SUBSCRIBER_QOS_DEFAULT, nullptr); d->participant_->create_subscriber(FAST_DDS_MACRO::SUBSCRIBER_QOS_DEFAULT, nullptr);
if (tmp.subscribers_[subscriberID].subscriber == nullptr) { if (tmp.subscribers_[subscriberID].subscriber == nullptr) {
LOG_ERROR("0x2135 Create Subscriber %1 for Topic %2 Failed!", subscriberID, topicName); LOG_ERROR("C01102006:创建主题 %1 的订阅者 %2 失败!", topicName, subscriberID);
} }
FAST_DDS_MACRO::DataReaderQos dataReaderQos; FAST_DDS_MACRO::DataReaderQos dataReaderQos;
dataReaderQos.durability().kind = FAST_DDS_MACRO::VOLATILE_DURABILITY_QOS; dataReaderQos.durability().kind = FAST_DDS_MACRO::VOLATILE_DURABILITY_QOS;
@ -148,8 +149,9 @@ public:
tmp.subscribers_[subscriberID].subscriber->create_datareader(tmp.topic, dataReaderQos, tmp.subscribers_[subscriberID].subscriber->create_datareader(tmp.topic, dataReaderQos,
listener); listener);
if (tmp.subscribers_[subscriberID].dataReader == nullptr) { if (tmp.subscribers_[subscriberID].dataReader == nullptr) {
LOG_ERROR("0x2136 Create DataReader %1 for Topic %2 Failed!", subscriberID, topicName); LOG_ERROR("C01102007:创建主题 %1 的订阅者 %2 的数据读取器失败!", topicName,
subscriberID);
} }
LOG_INFO("0x2137 Create Subscriber %1 for Topic %2 Success!", subscriberID, topicName); LOG_INFO("D01104008:创建主题 %1 的订阅者 %2 的数据读取器成功!", topicName, subscriberID);
} }
}; };

View File

@ -1,7 +1,7 @@
/** /**
* @file XNScenarioDescriptor.h * @file XNScenarioDescriptor.h
* @author jinchao * @author jinchao
* @brief * @brief
* @version 1.0 * @version 1.0
* @date 2024-11-07 * @date 2024-11-07
* *
@ -14,8 +14,8 @@
struct XNScenarioManagerPrivate; struct XNScenarioManagerPrivate;
/** /**
* @brief * @brief
* @details * @details
*/ */
class XNScenarioManager : public XNBaseFrameObject class XNScenarioManager : public XNBaseFrameObject
{ {
@ -23,18 +23,18 @@ class XNScenarioManager : public XNBaseFrameObject
XN_DECLARE_PRIVATE(XNScenarioManager) XN_DECLARE_PRIVATE(XNScenarioManager)
public: public:
/** /**
* @brief * @brief
*/ */
XNScenarioManager(); XNScenarioManager();
/** /**
* @brief * @brief
*/ */
virtual ~XNScenarioManager(); virtual ~XNScenarioManager();
protected: protected:
/** /**
* @brief * @brief
* @param p: * @param p:
* @details * @details
*/ */
@ -55,22 +55,22 @@ public:
public: public:
/** /**
* @brief * @brief
* @return true: * @return true:
* @return false: * @return false:
* @details * @details
*/ */
virtual bool Initialize() override; virtual bool Initialize() override;
/** /**
* @brief 仿 * @brief 仿
* @note * @note
*/ */
virtual bool PrepareForExecute() override; virtual bool PrepareForExecute() override;
/** /**
* @brief * @brief
* @param XmlPath: std::string类型 * @param XmlPath: std::string类型
* @param initialType: uint32_t类型 * @param initialType: uint32_t类型
* @return true: * @return true:
* @return false: * @return false:
@ -79,16 +79,16 @@ public:
private: private:
/** /**
* @brief * @brief
* @param XmlPath: std::string类型 * @param XmlPath: std::string类型
* @return true: * @return true:
* @return false: * @return false:
*/ */
bool ParseScenarioXml(const std::string &XmlPath); bool ParseScenarioXml(const std::string &XmlPath);
/** /**
* @brief * @brief
* @param ConfigID: std::string类型ID * @param ConfigID: std::string类型ID
* @return true: * @return true:
* @return false: * @return false:
*/ */

View File

@ -75,7 +75,7 @@ protected:
} }
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 78"); "A01161001:T 必须是算术类型或std::array类型");
} }
return result; return result;
@ -109,7 +109,7 @@ protected:
setByteArrayFromStdArray(data.value(), thisArray); setByteArrayFromStdArray(data.value(), thisArray);
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 112"); "A01161002:T 必须是算术类型或std::array类型");
} }
} }
@ -132,7 +132,7 @@ protected:
getTypeSize<T>()); getTypeSize<T>());
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 135"); "A01161003:T 必须是算术类型或std::array类型");
} }
} }
@ -158,7 +158,7 @@ protected:
setByteArrayFromStdArray(data[i], subArray); setByteArrayFromStdArray(data[i], subArray);
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 160"); "A01161004:T 必须是算术类型或std::array类型");
} }
} }
} }
@ -186,7 +186,7 @@ protected:
} }
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 188"); "A01161005:T 必须是算术类型或std::array类型");
} }
return std::string(); return std::string();
} }
@ -214,6 +214,7 @@ protected:
items.push_back(item); items.push_back(item);
} }
if (items.size() != getArrayWholeSize<T>()) { if (items.size() != getArrayWholeSize<T>()) {
LOG_WARNING("A01163006:数组大小不一致, 设置数据失败!");
return; return;
} }
T temp; T temp;
@ -221,7 +222,7 @@ protected:
data = temp; data = temp;
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 220"); "A01161007:T 必须是算术类型或std::array类型");
} }
} }
@ -249,7 +250,7 @@ protected:
ss << getStringFromStdArray(data[i]); ss << getStringFromStdArray(data[i]);
} else { } else {
static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>, static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 243"); "A01161008:T 必须是算术类型或std::array类型");
} }
} }
return ss.str(); return ss.str();
@ -281,13 +282,11 @@ protected:
// 对于嵌套数组,递归处理 // 对于嵌套数组,递归处理
start_pos = setStdArrayFromString(data[i], value, start_pos); start_pos = setStdArrayFromString(data[i], value, start_pos);
} else { } else {
static_assert( static_assert(std::is_arithmetic_v<T> || is_std_array_v<T>,
std::is_arithmetic_v<T> || is_std_array_v<T>, "A01161009:T 必须是算术类型或std::array类型");
"T 必须是算术类型或std::array类型详见XNDDSInterface.cppline 275");
} }
} catch (const std::exception &e) { } catch (const std::exception &e) {
throw std::runtime_error("无法解析第 " + std::to_string(i) LOG_WARNING("A01163010:无法解析第 %1 个元素: %2", i, e.what());
+ " 个元素: " + e.what());
} }
} }
return start_pos + N; return start_pos + N;
@ -299,10 +298,9 @@ protected:
if (data) { if (data) {
auto temp = data.value(); auto temp = data.value();
if constexpr (std::is_arithmetic_v<T1>) { if constexpr (std::is_arithmetic_v<T1>) {
static_assert(std::is_arithmetic_v<T2>, static_assert(std::is_arithmetic_v<T2>, "A01161011:模板参数T2必须是算术类型");
"模板参数T2必须是算术类型详见XNDDSInterface.cppline 293");
static_assert(std::is_convertible_v<T1, T2>, static_assert(std::is_convertible_v<T1, T2>,
"模板参数T1必须可以转换为T2类型详见XNDDSInterface.cppline 295"); "A01161012:模板参数T1必须可以转换为T2类型");
model_data = temp; model_data = temp;
} else if constexpr (is_std_array_v<T1>) { } else if constexpr (is_std_array_v<T1>) {
size_t arraySize = array_size_v<T1>; size_t arraySize = array_size_v<T1>;
@ -320,21 +318,19 @@ protected:
} }
} else { } else {
static_assert(std::is_arithmetic_v<sub_array_type>, static_assert(std::is_arithmetic_v<sub_array_type>,
"模板参数T1是std::" "A01161013:模板参数T1是std::"
"array类型时它的数组嵌套不能超过两层详见XNDDSInterfac" "array类型时它的数组嵌套不能超过两层");
"e.cppline 313");
} }
} else { } else {
static_assert( static_assert(std::is_arithmetic_v<array_type>
std::is_arithmetic_v<array_type> || is_std_array_v<array_type>, || is_std_array_v<array_type>,
"模板参数T1是std::array类型时它的value_" "A01161014:模板参数T1是std::array类型时它的value_"
"type必须是算术类型或std::array类型详见XNDDSInterface.cppline 320"); "type必须是算术类型或std::array类型");
} }
} }
} else { } else {
static_assert( static_assert(std::is_arithmetic_v<T1> || is_std_array_v<T1>,
std::is_arithmetic_v<T1> || is_std_array_v<T1>, "A01161015:模板参数T1必须是算术类型或std::array类型");
"模板参数T1必须是算术类型或std::array类型详见XNDDSInterface.cppline 326");
} }
} }
} }
@ -343,10 +339,9 @@ protected:
void assign_value_set(eprosima::fastcdr::optional<T1> &data, const T2 &model_data) void assign_value_set(eprosima::fastcdr::optional<T1> &data, const T2 &model_data)
{ {
if constexpr (std::is_arithmetic_v<T1>) { if constexpr (std::is_arithmetic_v<T1>) {
static_assert(std::is_arithmetic_v<T2>, static_assert(std::is_arithmetic_v<T2>, "A01161016:模板参数T2必须是算术类型");
"模板参数T2必须是算术类型详见XNDDSInterface.cppline 337");
static_assert(std::is_convertible_v<T2, T1>, static_assert(std::is_convertible_v<T2, T1>,
"模板参数T2必须可以转换为T1类型详见XNDDSInterface.cppline 339"); "A01161017:模板参数T2必须可以转换为T1类型");
data = model_data; data = model_data;
} else if constexpr (is_std_array_v<T1>) { } else if constexpr (is_std_array_v<T1>) {
T1 temp; T1 temp;
@ -363,23 +358,20 @@ protected:
temp[i][j] = model_data[i][j]; temp[i][j] = model_data[i][j];
} }
} else { } else {
static_assert(std::is_arithmetic_v<sub_array_type>, static_assert(
"模板参数T1是std::" std::is_arithmetic_v<sub_array_type>,
"array类型时它的数组嵌套不能超过两层详见XNDDSInterface." "A01161018:模板参数T1是std::array类型时它的数组嵌套不能超过两层");
"cppline 357");
} }
} else { } else {
static_assert( static_assert(std::is_arithmetic_v<array_type> || is_std_array_v<array_type>,
std::is_arithmetic_v<array_type> || is_std_array_v<array_type>, "A01161019:模板参数T1是std::array类型时它的value_"
"模板参数T1是std::array类型时它的value_" "type必须是算术类型或std::array类型");
"type必须是算术类型或std::array类型详见XNDDSInterface.cppline 364");
} }
} }
data = temp; data = temp;
} else { } else {
static_assert( static_assert(std::is_arithmetic_v<T1> || is_std_array_v<T1>,
std::is_arithmetic_v<T1> || is_std_array_v<T1>, "A01161020:模板参数T1必须是算术类型或std::array类型");
"模板参数T1必须是算术类型或std::array类型详见XNDDSInterface.cppline 371");
} }
} }

View File

@ -20,7 +20,7 @@ bool XNDDSManager::Initialize()
d->_status = XNFrameObjectStatus::Initialized; d->_status = XNFrameObjectStatus::Initialized;
d->participant_ = nullptr; d->participant_ = nullptr;
d->topics_.clear(); d->topics_.clear();
LOG_INFO("DDS管理器初始化成功!"); LOG_INFO("D01104009:DDS管理器初始化成功!");
return true; return true;
} }
@ -28,7 +28,7 @@ bool XNDDSManager::PrepareForExecute()
{ {
T_D(); T_D();
d->_status = XNFrameObjectStatus::Ready; d->_status = XNFrameObjectStatus::Ready;
LOG_INFO("DDS管理器准备就绪!"); LOG_INFO("D01104010:DDS管理器准备就绪!");
return true; return true;
} }
@ -40,6 +40,7 @@ void XNDDSManager::SetDomainID(uint32_t domainID)
d->participant_ = FAST_DDS_MACRO::DomainParticipantFactory::get_instance()->create_participant( d->participant_ = FAST_DDS_MACRO::DomainParticipantFactory::get_instance()->create_participant(
domainID, participantQos); domainID, participantQos);
if (d->participant_ == nullptr) { if (d->participant_ == nullptr) {
LOG_ERROR("0x2130 DDS管理器创建域参与者失败!"); LOG_ERROR("C01102011:DDS管理器创建域参与者失败!");
} }
LOG_INFO("D01104012:DDS管理器创建域参与者成功!");
} }

View File

@ -77,7 +77,7 @@ public:
tmp.topic = d->participant_->create_topic(topicName, typeSupport.get_type_name(), tmp.topic = d->participant_->create_topic(topicName, typeSupport.get_type_name(),
FAST_DDS_MACRO::TOPIC_QOS_DEFAULT); FAST_DDS_MACRO::TOPIC_QOS_DEFAULT);
if (tmp.topic == nullptr) { if (tmp.topic == nullptr) {
LOG_ERROR("0x2130 Create Topic %1 Failed!", topicName); LOG_ERROR("C01102001:创建主题 %1 失败!", topicName);
d->topics_.erase(topicName); d->topics_.erase(topicName);
return nullptr; return nullptr;
} }
@ -87,7 +87,7 @@ public:
tmp.publishers_[publisherID].publisher = tmp.publishers_[publisherID].publisher =
d->participant_->create_publisher(FAST_DDS_MACRO::PUBLISHER_QOS_DEFAULT, nullptr); d->participant_->create_publisher(FAST_DDS_MACRO::PUBLISHER_QOS_DEFAULT, nullptr);
if (tmp.publishers_[publisherID].publisher == nullptr) { if (tmp.publishers_[publisherID].publisher == nullptr) {
LOG_ERROR("0x2131 Create Publisher %1 for Topic %2 Failed!", publisherID, topicName); LOG_ERROR("C01102002:创建主题 %1 的发布者 %2 失败!", topicName, publisherID);
return nullptr; return nullptr;
} }
@ -107,10 +107,11 @@ public:
tmp.publishers_[publisherID].publisher->create_datawriter(tmp.topic, dataWriterQos, tmp.publishers_[publisherID].publisher->create_datawriter(tmp.topic, dataWriterQos,
nullptr); nullptr);
if (tmp.publishers_[publisherID].dataWriter == nullptr) { if (tmp.publishers_[publisherID].dataWriter == nullptr) {
LOG_ERROR("0x2132 Create DataWriter %1 for Topic %2 Failed!", publisherID, topicName); LOG_ERROR("C01102003:创建主题 %1 的发布者 %2 的数据写入器失败!", topicName,
publisherID);
return nullptr; return nullptr;
} }
LOG_INFO("0x2133 Create Publisher %1 for Topic %2 Success!", publisherID, topicName); LOG_INFO("D01104004:创建主题 %1 的发布者 %2 的数据写入器成功!", topicName, publisherID);
return tmp.publishers_[publisherID].dataWriter; return tmp.publishers_[publisherID].dataWriter;
} }
@ -128,7 +129,7 @@ public:
tmp.topic = d->participant_->create_topic(topicName, typeSupport.get_type_name(), tmp.topic = d->participant_->create_topic(topicName, typeSupport.get_type_name(),
FAST_DDS_MACRO::TOPIC_QOS_DEFAULT); FAST_DDS_MACRO::TOPIC_QOS_DEFAULT);
if (tmp.topic == nullptr) { if (tmp.topic == nullptr) {
LOG_ERROR("0x2130 Create Topic %1 Failed!", topicName); LOG_ERROR("C01102005:创建主题 %1 失败!", topicName);
d->topics_.erase(topicName); d->topics_.erase(topicName);
return; return;
} }
@ -138,7 +139,7 @@ public:
tmp.subscribers_[subscriberID].subscriber = tmp.subscribers_[subscriberID].subscriber =
d->participant_->create_subscriber(FAST_DDS_MACRO::SUBSCRIBER_QOS_DEFAULT, nullptr); d->participant_->create_subscriber(FAST_DDS_MACRO::SUBSCRIBER_QOS_DEFAULT, nullptr);
if (tmp.subscribers_[subscriberID].subscriber == nullptr) { if (tmp.subscribers_[subscriberID].subscriber == nullptr) {
LOG_ERROR("0x2135 Create Subscriber %1 for Topic %2 Failed!", subscriberID, topicName); LOG_ERROR("C01102006:创建主题 %1 的订阅者 %2 失败!", topicName, subscriberID);
} }
FAST_DDS_MACRO::DataReaderQos dataReaderQos; FAST_DDS_MACRO::DataReaderQos dataReaderQos;
dataReaderQos.durability().kind = FAST_DDS_MACRO::VOLATILE_DURABILITY_QOS; dataReaderQos.durability().kind = FAST_DDS_MACRO::VOLATILE_DURABILITY_QOS;
@ -148,8 +149,9 @@ public:
tmp.subscribers_[subscriberID].subscriber->create_datareader(tmp.topic, dataReaderQos, tmp.subscribers_[subscriberID].subscriber->create_datareader(tmp.topic, dataReaderQos,
listener); listener);
if (tmp.subscribers_[subscriberID].dataReader == nullptr) { if (tmp.subscribers_[subscriberID].dataReader == nullptr) {
LOG_ERROR("0x2136 Create DataReader %1 for Topic %2 Failed!", subscriberID, topicName); LOG_ERROR("C01102007:创建主题 %1 的订阅者 %2 的数据读取器失败!", topicName,
subscriberID);
} }
LOG_INFO("0x2137 Create Subscriber %1 for Topic %2 Success!", subscriberID, topicName); LOG_INFO("D01104008:创建主题 %1 的订阅者 %2 的数据读取器成功!", topicName, subscriberID);
} }
}; };

View File

@ -31,13 +31,39 @@ XNEventManager::XNEventManager(PrivateType *p) : XNBaseFrameObject(p)
{ {
} }
// 初始化事件管理器
bool XNEventManager::Initialize()
{
T_D();
// 配置普通线程池
SetMaxThreadCount(std::thread::hardware_concurrency());
// 配置实时线程池
SetRTThreadPoolConfig(2, // 最大线程数
sched_get_priority_min(SCHED_FIFO), // 最小优先级
sched_get_priority_max(SCHED_FIFO)); // 最大优先级
LOG_INFO("D01094001:事件管理器初始化成功!");
d->_status = XNFrameObjectStatus::Initialized;
return true;
}
// 准备执行
bool XNEventManager::PrepareForExecute()
{
T_D();
d->_status = XNFrameObjectStatus::Ready;
LOG_INFO("D01094002:事件管理器准备就绪!");
return true;
}
// 修改注册事件处理器的实现 // 修改注册事件处理器的实现
int XNEventManager::RegisterEventHandler(const std::string &eventName, XNEventCallback callback, int XNEventManager::RegisterEventHandler(const std::string &eventName, XNEventCallback callback,
uint32_t objectId, bool async, XNEvent::Priority priority) uint32_t objectId, bool async, XNEvent::Priority priority)
{ {
T_D(); T_D();
if (eventName.empty() || !callback) { if (eventName.empty() || !callback) {
LOG_WARNING("Invalid event name or callback!"); LOG_WARNING("A01093003:注册的事件名称或回调函数为空,注册失败!");
return -1; return -1;
} }
@ -63,9 +89,8 @@ int XNEventManager::RegisterEventHandler(const std::string &eventName, XNEventCa
// 添加反向映射 // 添加反向映射
d->handlerToEvent[handlerId] = eventName; d->handlerToEvent[handlerId] = eventName;
LOG_INFO("Registered " + std::string(async ? "async" : "sync") + " event handler for event: " LOG_INFO("D01094004:注册 %1 事件处理器, 事件名称: %2, 处理器ID: %3 (对象ID: %4, 本地ID: %5)",
+ eventName + ", handler ID: " + std::to_string(handlerId) + " (object: " async ? "异步" : "同步", eventName, handlerId, objectId, d->localIdCounter);
+ std::to_string(objectId) + ", local: " + std::to_string(d->localIdCounter) + ")");
return handlerId; return handlerId;
} }
@ -79,7 +104,7 @@ bool XNEventManager::RemoveEventHandler(const std::string &eventName, int handle
if (!eventName.empty()) { if (!eventName.empty()) {
auto it = d->eventHandlers.find(eventName); auto it = d->eventHandlers.find(eventName);
if (it == d->eventHandlers.end()) { if (it == d->eventHandlers.end()) {
LOG_WARNING("Event " + eventName + " not found!"); LOG_WARNING("B01093005:移除事件 %1 时, 事件不存在!", eventName);
return false; return false;
} }
@ -92,8 +117,7 @@ bool XNEventManager::RemoveEventHandler(const std::string &eventName, int handle
if (handlerIt != handlers.end()) { if (handlerIt != handlers.end()) {
handlers.erase(handlerIt); handlers.erase(handlerIt);
d->handlerToEvent.erase(handlerId); d->handlerToEvent.erase(handlerId);
LOG_INFO("Removed handler ID " + std::to_string(handlerId) LOG_INFO("D01094006:移除事件 %1 的处理器ID: %2", eventName, handlerId);
+ " from event: " + eventName);
// 如果事件没有处理器了,移除整个事件 // 如果事件没有处理器了,移除整个事件
if (handlers.empty()) { if (handlers.empty()) {
@ -101,8 +125,7 @@ bool XNEventManager::RemoveEventHandler(const std::string &eventName, int handle
} }
return true; return true;
} }
LOG_WARNING("Handler ID " + std::to_string(handlerId) LOG_WARNING("B01093007:移除事件 %1 的处理器ID: %2 时, 处理器不存在!", eventName, handlerId);
+ " not found in event: " + eventName);
return false; return false;
} }
@ -119,8 +142,7 @@ bool XNEventManager::RemoveEventHandler(const std::string &eventName, int handle
if (handlerIt != handlers.end()) { if (handlerIt != handlers.end()) {
handlers.erase(handlerIt); handlers.erase(handlerIt);
d->handlerToEvent.erase(handlerId); d->handlerToEvent.erase(handlerId);
LOG_INFO("Removed handler ID " + std::to_string(handlerId) LOG_INFO("D01094008:移除事件 %1 的处理器ID: %2", eventToRemove, handlerId);
+ " from event: " + eventToRemove);
// 如果事件没有处理器了,移除整个事件 // 如果事件没有处理器了,移除整个事件
if (handlers.empty()) { if (handlers.empty()) {
@ -130,7 +152,7 @@ bool XNEventManager::RemoveEventHandler(const std::string &eventName, int handle
} }
} }
LOG_WARNING("Handler ID " + std::to_string(handlerId) + " not found!"); LOG_WARNING("B01093009:移除处理器ID: %1 时, 处理器不存在!", handlerId);
return false; return false;
} }
@ -167,8 +189,8 @@ void XNEventManager::TriggerEvent(const std::string &eventName, const std::any &
handler.callback(eventData); handler.callback(eventData);
EventProcessed(eventName, true); EventProcessed(eventName, true);
} catch (const std::exception &e) { } catch (const std::exception &e) {
LOG_ERROR("Exception in handler " + std::to_string(handler.GetHandlerId()) LOG_ERROR("B01092010:事件 %1 的处理器ID: %2 执行时发生异常: %3", eventName,
+ " for event " + eventName + ": " + e.what()); handler.GetHandlerId(), e.what());
EventProcessed(eventName, false); EventProcessed(eventName, false);
} }
} }
@ -212,7 +234,7 @@ void XNEventManager::SetMaxThreadCount(int count)
} }
}); });
} }
LOG_INFO("Set thread pool max thread count to " + std::to_string(count)); LOG_INFO("D01094011:设置事件处理线程池最大线程数为 %1", count);
} }
int XNEventManager::GetMaxThreadCount() const int XNEventManager::GetMaxThreadCount() const
@ -227,33 +249,6 @@ void XNEventManager::WaitForAsyncEvents()
T_D(); T_D();
std::unique_lock<std::mutex> lock(d->taskMutex); std::unique_lock<std::mutex> lock(d->taskMutex);
d->taskCond.wait(lock, [this, d] { return d->taskQueue.empty(); }); d->taskCond.wait(lock, [this, d] { return d->taskQueue.empty(); });
LOG_INFO("All async events have been processed");
}
// 初始化事件管理器
bool XNEventManager::Initialize()
{
T_D();
// 配置普通线程池
SetMaxThreadCount(std::thread::hardware_concurrency());
// 配置实时线程池
SetRTThreadPoolConfig(2, // 最大线程数
sched_get_priority_min(SCHED_FIFO), // 最小优先级
sched_get_priority_max(SCHED_FIFO)); // 最大优先级
LOG_INFO("XNEventManager Initialize Success!");
d->_status = XNFrameObjectStatus::Initialized;
return true;
}
// 准备执行
bool XNEventManager::PrepareForExecute()
{
T_D();
d->_status = XNFrameObjectStatus::Ready;
LOG_INFO("XNEventManager is prepared!");
return true;
} }
void XNEventManager::SetRTThreadPoolConfig(int maxThreads, int minPriority, int maxPriority) void XNEventManager::SetRTThreadPoolConfig(int maxThreads, int minPriority, int maxPriority)
@ -263,7 +258,7 @@ void XNEventManager::SetRTThreadPoolConfig(int maxThreads, int minPriority, int
XNFrameworkPtr framework = GetFramework(); XNFrameworkPtr framework = GetFramework();
if (!framework) { if (!framework) {
LOG_WARNING("XNFramework is nullptr!"); LOG_WARNING("B01093012:主框架指针为空,无法设置实时线程池配置!");
return; return;
} }
@ -278,10 +273,10 @@ void XNEventManager::SetRTThreadPoolConfig(int maxThreads, int minPriority, int
} }
if (lastCpu < 0) { if (lastCpu < 0) {
LOG_WARNING("No available CPU found in affinity mask, using default CPU 1"); LOG_WARNING("B01093013:没有可用的CPU使用默认CPU 1");
lastCpu = 1; lastCpu = 1;
} else { } else {
LOG_INFO("RT thread bound to CPU " + std::to_string(lastCpu)); LOG_INFO("D01094014:实时事件处理线程绑定到CPU %1", lastCpu);
} }
d->rtManager.start(maxThreads, maxPriority, lastCpu); d->rtManager.start(maxThreads, maxPriority, lastCpu);

View File

@ -82,7 +82,7 @@ void XNFramework::SetCpuAffinity(uint32_t cpuAffinity)
bool XNFramework::Initialize(uint32_t initialType) bool XNFramework::Initialize(uint32_t initialType)
{ {
T_D(); T_D();
LOG_INFO("D01054001主框架正在初始化..."); LOG_INFO("D01054001:主框架正在初始化...");
d->ddsManager->SetFramework(XN_THISPTR); d->ddsManager->SetFramework(XN_THISPTR);
d->timeManager->SetFramework(XN_THISPTR); d->timeManager->SetFramework(XN_THISPTR);
d->threadManager->SetFramework(XN_THISPTR); d->threadManager->SetFramework(XN_THISPTR);
@ -92,47 +92,47 @@ bool XNFramework::Initialize(uint32_t initialType)
d->eventManager->SetFramework(XN_THISPTR); d->eventManager->SetFramework(XN_THISPTR);
bool ret = d->eventManager->Initialize(); bool ret = d->eventManager->Initialize();
if (!ret) { if (!ret) {
LOG_ERROR("B01052001主框架初始化失败!"); LOG_ERROR("B01052002:主框架初始化失败!");
return false; return false;
} }
ret = d->timeManager->Initialize(); ret = d->timeManager->Initialize();
if (!ret) { if (!ret) {
LOG_ERROR("B01052002主框架初始化失败!"); LOG_ERROR("B01052003:主框架初始化失败!");
return false; return false;
} }
ret = d->ddsManager->Initialize(); ret = d->ddsManager->Initialize();
if (!ret) { if (!ret) {
LOG_ERROR("B01052003主框架初始化失败!"); LOG_ERROR("B01052004:主框架初始化失败!");
return false; return false;
} }
ret = d->serviceManager->Initialize(); ret = d->serviceManager->Initialize();
if (!ret) { if (!ret) {
LOG_ERROR("B01052004主框架初始化失败!"); LOG_ERROR("B01052005:主框架初始化失败!");
return false; return false;
} }
ret = d->threadManager->Initialize(); ret = d->threadManager->Initialize();
if (!ret) { if (!ret) {
LOG_ERROR("B01052005主框架初始化失败!"); LOG_ERROR("B01052006:主框架初始化失败!");
return false; return false;
} }
ret = d->modelManager->Initialize(); ret = d->modelManager->Initialize();
if (!ret) { if (!ret) {
LOG_ERROR("B01052006主框架初始化失败!"); LOG_ERROR("B01052007:主框架初始化失败!");
return false; return false;
} }
ret = d->scenarioManager->Initialize(); ret = d->scenarioManager->Initialize();
if (!ret) { if (!ret) {
LOG_ERROR("B01052007主框架初始化失败!"); LOG_ERROR("B01052008:主框架初始化失败!");
return false; return false;
} }
LOG_INFO("D01054002主框架初始化成功!"); LOG_INFO("D01054009:主框架初始化成功!");
LOG_INFO("D01054003开始解析构型文件 ..."); LOG_INFO("D01054010:开始解析构型文件 ...");
ret = d->scenarioManager->AnalysisScenarioXml(d->scenarioXml, initialType); ret = d->scenarioManager->AnalysisScenarioXml(d->scenarioXml, initialType);
if (!ret) { if (!ret) {
LOG_ERROR("B01052008主框架解析构型文件失败!"); LOG_ERROR("B01052011:主框架解析构型失败!");
return false; return false;
} }
LOG_INFO("D01054004解析构型文件成功!"); LOG_INFO("D01054012:解析构型成功!");
return true; return true;
} }
@ -142,40 +142,40 @@ bool XNFramework::PrepareForExecute()
bool ret = d->eventManager->PrepareForExecute(); bool ret = d->eventManager->PrepareForExecute();
if (!ret) { if (!ret) {
LOG_ERROR("XNFramework PrepareForExecute Failed!"); LOG_ERROR("B01052013:主框架准备执行失败!");
return false; return false;
} }
ret = d->timeManager->PrepareForExecute(); ret = d->timeManager->PrepareForExecute();
if (!ret) { if (!ret) {
LOG_ERROR("XNFramework PrepareForExecute Failed!"); LOG_ERROR("B01052014:主框架准备执行失败!");
return false; return false;
} }
ret = d->ddsManager->PrepareForExecute(); ret = d->ddsManager->PrepareForExecute();
if (!ret) { if (!ret) {
LOG_ERROR("XNFramework PrepareForExecute Failed!"); LOG_ERROR("B01052015:主框架准备执行失败!");
return false; return false;
} }
ret = d->serviceManager->PrepareForExecute(); ret = d->serviceManager->PrepareForExecute();
if (!ret) { if (!ret) {
LOG_ERROR("XNFramework PrepareForExecute Failed!"); LOG_ERROR("B01052016:主框架准备执行失败!");
return false; return false;
} }
ret = d->threadManager->PrepareForExecute(); ret = d->threadManager->PrepareForExecute();
if (!ret) { if (!ret) {
LOG_ERROR("XNFramework PrepareForExecute Failed!"); LOG_ERROR("B01052017:主框架准备执行失败!");
return false; return false;
} }
ret = d->modelManager->PrepareForExecute(); ret = d->modelManager->PrepareForExecute();
if (!ret) { if (!ret) {
LOG_ERROR("XNFramework PrepareForExecute Failed!"); LOG_ERROR("B01052018:主框架准备执行失败!");
return false; return false;
} }
ret = d->scenarioManager->PrepareForExecute(); ret = d->scenarioManager->PrepareForExecute();
if (!ret) { if (!ret) {
LOG_ERROR("XNFramework PrepareForExecute Failed!"); LOG_ERROR("B01052019:主框架准备执行失败!");
return false; return false;
} }
LOG_INFO("XNCore is prepared for execute! Simulation will start soon..."); LOG_INFO("D01054020:主框架准备就绪!");
return true; return true;
} }

View File

@ -34,6 +34,14 @@ XNModelManager::XNModelManager(PrivateType *p) : XNBaseFrameObject(p)
d->ModelIDAssigned.resize(10000, false); d->ModelIDAssigned.resize(10000, false);
} }
bool XNModelManager::Initialize()
{
T_D();
LOG_INFO("D01114001:模型管理器初始化成功!");
d->_status = XNFrameObjectStatus::Initialized;
return true;
}
// 运行前最后准备 // 运行前最后准备
bool XNModelManager::PrepareForExecute() bool XNModelManager::PrepareForExecute()
{ {
@ -42,15 +50,7 @@ bool XNModelManager::PrepareForExecute()
model.second->PrepareForExecute(); model.second->PrepareForExecute();
} }
d->_status = XNFrameObjectStatus::Ready; d->_status = XNFrameObjectStatus::Ready;
LOG_INFO("XNModelManager is prepared!"); LOG_INFO("D01114002:模型管理器准备就绪!");
return true;
}
bool XNModelManager::Initialize()
{
T_D();
LOG_INFO("XNModelManager Initialize Success!");
d->_status = XNFrameObjectStatus::Initialized;
return true; return true;
} }
@ -69,7 +69,7 @@ void XNModelManager::LoadModel(const std::string &modelPath, const std::string &
if (model) { if (model) {
uint32_t modelID = RegisterModel(); uint32_t modelID = RegisterModel();
if (modelID == 0) { if (modelID == 0) {
LOG_WARNING("0x2174 Assign Model ID Failed, Model ID is used up!"); LOG_WARNING("B01113003:分配模型ID失败, 模型ID已用完, 模型无法注册!");
dlclose(handle); dlclose(handle);
return; return;
} }
@ -112,20 +112,17 @@ void XNModelManager::LoadModel(const std::string &modelPath, const std::string &
} }
} }
} else { } else {
LOG_WARNING("0x2173 Model %s Not found in dynamic link library %s!", LOG_WARNING("B01113004:动态链接库 %1 中未找到模型 %2!", modelPath, className);
className.c_str(), modelPath.c_str());
dlclose(handle); dlclose(handle);
return; return;
} }
} else { } else {
LOG_WARNING("0x2177 InitialModel function not found in dynamic link library %s!", LOG_WARNING("B01113005:动态链接库 %1 中未找到 %2 函数!", modelPath, initialModelName);
modelPath.c_str());
dlclose(handle); dlclose(handle);
return; return;
} }
} else { } else {
LOG_WARNING("0x2172 Model %s Dynamic link library loading failed! Error: %s", LOG_WARNING("C01113006:动态链接库 %1 加载失败! 错误: %2", modelPath, dlerror());
className.c_str(), dlerror());
} }
} }
@ -149,29 +146,34 @@ uint32_t XNModelManager::RegisterModel()
XNModelObjectPtr XNModelManager::GetModel(uint32_t modelID) XNModelObjectPtr XNModelManager::GetModel(uint32_t modelID)
{ {
T_D(); T_D();
if (d->ModelIDAssigned[modelID - 10000]) { if (modelID >= 10000 && modelID < 20000) {
auto model = d->ModelMap.find(modelID); if (d->ModelIDAssigned[modelID - 10000]) {
if (model != d->ModelMap.end()) { auto model = d->ModelMap.find(modelID);
return model->second; if (model != d->ModelMap.end()) {
return model->second;
}
LOG_WARNING("B01113007:模型ID %1 对应的模型不存在!", modelID);
return nullptr;
} }
LOG_WARNING("B01113008:模型ID %1 未注册!", modelID);
return nullptr; return nullptr;
} else } else {
LOG_WARNING("B01113009:模型ID %1 不合法!", modelID);
return nullptr; return nullptr;
}
} }
void XNModelManager::RegisterFunction(uint32_t id, XNCallBack fun, uint32_t threadID, void XNModelManager::RegisterFunction(uint32_t id, XNCallBack fun, uint32_t threadID,
uint32_t freqGroup, uint32_t RunPos, uint32_t RunPriorty) uint32_t freqGroup, uint32_t RunPos, uint32_t RunPriorty)
{ {
T_D(); T_D();
if (d->ModelIDAssigned[id - 10000]) { if (GetModel(id) != nullptr) {
auto framework = GetFramework(); auto framework = GetFramework();
if (framework) { if (framework) {
framework->GetThreadManager()->RegisterFunction(id, fun, threadID, freqGroup, RunPos, framework->GetThreadManager()->RegisterFunction(id, fun, threadID, freqGroup, RunPos,
RunPriorty); RunPriorty);
} }
} else { } else {
LOG_WARNING( LOG_WARNING("B01113010:模型ID %1 注册周期性函数失败, 模型不存在!", id);
"0x2177 Submission of periodic function was rejected, model ID %1 is not registered!",
id);
} }
} }

View File

@ -221,22 +221,21 @@ void XNModelObject::ParseXml()
// 读取配置文件,设置循环执行函数 // 读取配置文件,设置循环执行函数
std::ifstream file(GetXmlPath()); std::ifstream file(GetXmlPath());
if (!file.is_open()) { if (!file.is_open()) {
LOG_WARNING("0x2161 Failed to open the model configuration file: %1!", GetXmlPath()); LOG_WARNING("C01143001:模型配置文件 %1 打开失败!", GetXmlPath());
return; return;
} }
tinyxml2::XMLDocument doc; tinyxml2::XMLDocument doc;
doc.LoadFile(GetXmlPath().c_str()); doc.LoadFile(GetXmlPath().c_str());
tinyxml2::XMLElement *rootNode = doc.FirstChildElement("Model"); tinyxml2::XMLElement *rootNode = doc.FirstChildElement("Model");
if (!rootNode) { if (!rootNode) {
LOG_WARNING("0x2161 Failed to parse model configuration file: %1!", GetXmlPath()); LOG_WARNING("C01143002:模型配置文件 %1 解析失败!", GetXmlPath());
return; return;
} }
// 读取配置文件的模型参数 // 读取配置文件的模型参数
const char *modelName = rootNode->FirstChildElement("Name")->GetText(); const char *modelName = rootNode->FirstChildElement("Name")->GetText();
if (!modelName || std::string(modelName) != GetObjectName()) { if (!modelName || std::string(modelName) != GetObjectName()) {
LOG_WARNING("0x2162 The model name in the configuration file of model %1 is not consistent " LOG_WARNING("A01143003:模型配置文件 %1 中模型名称不一致, 模型名称: %2, 配置文件中名称: %3!",
"with the model name in the configuration file of model %2!", GetXmlPath(), GetObjectName(), modelName ? modelName : "null");
GetObjectName(), modelName ? modelName : "null");
return; return;
} }
d->_sDescription = rootNode->FirstChildElement("Description")->GetText(); d->_sDescription = rootNode->FirstChildElement("Description")->GetText();
@ -255,9 +254,8 @@ void XNModelObject::ParseXml()
// 检查运行节点是否是 "x-x" 形式 // 检查运行节点是否是 "x-x" 形式
size_t tmp = funcNode.find('-'); size_t tmp = funcNode.find('-');
if (tmp == std::string::npos || tmp == 0) { if (tmp == std::string::npos || tmp == 0) {
LOG_WARNING("0x2162 The value of the run node attribute in the configuration file of model " LOG_WARNING("A01143004:模型配置文件 %1 中运行节点属性值 %2 不是 x-x 格式!", GetXmlPath(),
"%1 is not in the x-x format, registration not executed!", funcNode);
GetObjectName());
return; return;
} }
@ -286,13 +284,10 @@ void XNModelObject::ParseXml()
// 使用标准C++动态库加载 // 使用标准C++动态库加载
d->_dynamicLib = dlopen(d->_sLibPath.c_str(), RTLD_LAZY); d->_dynamicLib = dlopen(d->_sLibPath.c_str(), RTLD_LAZY);
if (d->_dynamicLib) { // 动态库加载成功 if (d->_dynamicLib) { // 动态库加载成功
LOG_INFO("0x2163 Model %1 loaded algorithm dynamic library %2 successfully!", LOG_INFO("D01144005:模型 %1 加载数据包动态库 %2 成功!", GetObjectName(), d->_sLibPath);
GetObjectName(), d->_sLibPath);
} else { } else {
LOG_WARNING( LOG_WARNING("A01143006:模型 %1 加载数据包动态库 %2 失败, 将不调用数据包模型!",
"0x2160 Model %1 failed to find algorithm dynamic library %2, will not call " GetObjectName(), d->_sLibPath);
"algorithm!",
GetObjectName(), d->_sLibPath);
d->_dynamicLib = nullptr; d->_dynamicLib = nullptr;
} }
} }
@ -320,7 +315,7 @@ void XNModelObject::ParseConfig()
// 获取数据库路径 // 获取数据库路径
std::string dbPath = std::getenv("XNCore"); std::string dbPath = std::getenv("XNCore");
if (dbPath.empty()) { if (dbPath.empty()) {
LOG_ERROR("0x1015 未设置XNCore环境变量, 引擎将退出!"); LOG_ERROR("A01142007:未设置XNCore环境变量, 无法解析模型配置!");
return; return;
} }
dbPath += "/database/XNSim.db"; dbPath += "/database/XNSim.db";
@ -328,7 +323,7 @@ void XNModelObject::ParseConfig()
// 打开数据库 // 打开数据库
sqlite3 *db; sqlite3 *db;
if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) { if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) {
LOG_ERROR("0x1016 打开数据库失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01142008:打开数据库失败: %1", sqlite3_errmsg(db));
return; return;
} }
@ -337,7 +332,7 @@ void XNModelObject::ParseConfig()
"SELECT * FROM XNModelsVersion WHERE PlaneName = ? AND ClassName = ? AND Version = ?"; "SELECT * FROM XNModelsVersion WHERE PlaneName = ? AND ClassName = ? AND Version = ?";
sqlite3_stmt *stmt; sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { if (sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) {
LOG_ERROR("0x1017 准备SQL语句失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01142009:准备SQL语句失败: %1", sqlite3_errmsg(db));
sqlite3_close(db); sqlite3_close(db);
return; return;
} }
@ -347,7 +342,7 @@ void XNModelObject::ParseConfig()
|| sqlite3_bind_text(stmt, 2, modelName.c_str(), modelName.length(), nullptr) != SQLITE_OK || sqlite3_bind_text(stmt, 2, modelName.c_str(), modelName.length(), nullptr) != SQLITE_OK
|| sqlite3_bind_text(stmt, 3, modelVersion.c_str(), modelVersion.length(), nullptr) || sqlite3_bind_text(stmt, 3, modelVersion.c_str(), modelVersion.length(), nullptr)
!= SQLITE_OK) { != SQLITE_OK) {
LOG_ERROR("0x1018 绑定参数失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01142010:绑定参数失败: %1", sqlite3_errmsg(db));
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
sqlite3_close(db); sqlite3_close(db);
return; return;
@ -355,8 +350,8 @@ void XNModelObject::ParseConfig()
// 执行查询 // 执行查询
if (sqlite3_step(stmt) != SQLITE_ROW) { if (sqlite3_step(stmt) != SQLITE_ROW) {
LOG_ERROR("0x1019 未找到机型为%1,模型名称为%2,版本号%3的记录", planeName.c_str(), LOG_ERROR("A01142011:未找到机型为 %1, 模型名称为 %2, 版本号 %3 的记录", planeName,
modelName.c_str(), modelVersion.c_str()); modelName, modelVersion);
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
sqlite3_close(db); sqlite3_close(db);
return; return;
@ -396,9 +391,9 @@ void XNModelObject::ParseConfig()
// 使用标准C++动态库加载 // 使用标准C++动态库加载
d->_dynamicLib = dlopen(libPath.c_str(), RTLD_LAZY); d->_dynamicLib = dlopen(libPath.c_str(), RTLD_LAZY);
if (d->_dynamicLib) { // 动态库加载成功 if (d->_dynamicLib) { // 动态库加载成功
LOG_INFO("0x2163 模型 %1 加载数据包模型动态库 %2 成功!", GetObjectName(), libPath); LOG_INFO("D01144012:模型 %1 加载数据包模型动态库 %2 成功!", GetObjectName(), libPath);
} else { } else {
LOG_WARNING("0x2160 模型 %1 未找到数据包模型动态库 %2, 将不调用数据包模型!", LOG_WARNING("A01143013:模型 %1 加载数据包模型动态库 %2 失败, 将不调用数据包模型!",
GetObjectName(), libPath); GetObjectName(), libPath);
d->_dynamicLib = nullptr; d->_dynamicLib = nullptr;
} }
@ -452,17 +447,21 @@ void XNModelObject::RegisterDDSParticipant()
T_D(); T_D();
auto framework = GetFramework(); auto framework = GetFramework();
if (framework == nullptr) { if (framework == nullptr) {
LOG_WARNING("Failed to get Framework!"); LOG_WARNING("B01143014:获取主框架失败!");
return; return;
} }
auto ddsManager = framework->GetDDSManager(); auto ddsManager = framework->GetDDSManager();
if (ddsManager == nullptr) { if (ddsManager == nullptr) {
LOG_WARNING("Failed to get DDSManager!"); LOG_WARNING("B01143015:获取DDS管理器失败!");
return; return;
} }
uint32_t MyID = GetUniqueId(); uint32_t MyID = GetUniqueId();
d->_dataWriter = ddsManager->RegisterPublisher<XNSim::XNSimStatus::XNModelStatusPubSubType>( d->_dataWriter = ddsManager->RegisterPublisher<XNSim::XNSimStatus::XNModelStatusPubSubType>(
"XNSim::XNSimStatus::XNModelStatus", MyID); "XNSim::XNSimStatus::XNModelStatus", MyID);
if (d->_dataWriter == nullptr) {
LOG_WARNING("B01143016:注册DDS参与者失败!");
return;
}
} }
int XNModelObject::RegisterEventHandler(const std::string &eventName, XNEventCallback callback, int XNModelObject::RegisterEventHandler(const std::string &eventName, XNEventCallback callback,
@ -471,13 +470,13 @@ int XNModelObject::RegisterEventHandler(const std::string &eventName, XNEventCal
// 获取事件管理器 // 获取事件管理器
auto framework = GetFramework(); auto framework = GetFramework();
if (framework == nullptr) { if (framework == nullptr) {
LOG_WARNING("Failed to get Framework!"); LOG_WARNING("B01143017:获取主框架失败!");
return -1; return -1;
} }
XNEventManagerPtr eventManager = framework->GetEventManager(); XNEventManagerPtr eventManager = framework->GetEventManager();
if (eventManager == nullptr) { if (eventManager == nullptr) {
LOG_WARNING("Failed to get EventManager!"); LOG_WARNING("B01143018:获取事件管理器失败!");
return -1; return -1;
} }
@ -491,13 +490,13 @@ void XNModelObject::TriggerEvent(const std::string &eventName, const std::any &e
// 获取事件管理器 // 获取事件管理器
auto framework = GetFramework(); auto framework = GetFramework();
if (framework == nullptr) { if (framework == nullptr) {
LOG_WARNING("Failed to get Framework!"); LOG_WARNING("B01143019:获取主框架失败!");
return; return;
} }
XNEventManagerPtr eventManager = framework->GetEventManager(); XNEventManagerPtr eventManager = framework->GetEventManager();
if (eventManager == nullptr) { if (eventManager == nullptr) {
LOG_WARNING("Failed to get EventManager!"); LOG_WARNING("B01143020:获取事件管理器失败!");
return; return;
} }

View File

@ -1,7 +1,7 @@
/** /**
* @file XNScenarioManager.cpp * @file XNScenarioManager.cpp
* @author jinchao * @author jinchao
* @brief * @brief
* @version 1.0 * @version 1.0
* @date 2024-11-07 * @date 2024-11-07
* *
@ -53,7 +53,7 @@ void XNScenarioManager::SetSimName(const std::string &simName)
bool XNScenarioManager::Initialize() bool XNScenarioManager::Initialize()
{ {
T_D(); T_D();
LOG_INFO("XNScenarioManager Initialize Success!"); LOG_INFO("D01084001:构型管理器初始化成功!");
d->_status = XNFrameObjectStatus::Initialized; d->_status = XNFrameObjectStatus::Initialized;
return true; return true;
} }
@ -62,11 +62,11 @@ bool XNScenarioManager::PrepareForExecute()
{ {
T_D(); T_D();
d->_status = XNFrameObjectStatus::Ready; d->_status = XNFrameObjectStatus::Ready;
LOG_INFO("XNScenarioManager is prepared!"); LOG_INFO("D01084002:构型管理器准备就绪!");
return true; return true;
} }
// 运行环境配置文件解析 // 构型配置文件解析
bool XNScenarioManager::AnalysisScenarioXml(const std::string &XmlPath, uint32_t initialType) bool XNScenarioManager::AnalysisScenarioXml(const std::string &XmlPath, uint32_t initialType)
{ {
T_D(); T_D();
@ -77,18 +77,18 @@ bool XNScenarioManager::AnalysisScenarioXml(const std::string &XmlPath, uint32_t
} }
} }
// 解析运行环境描述文件 // 解析构型配置文件
bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath) bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath)
{ {
T_D(); T_D();
std::ifstream file(XmlPath); std::ifstream file(XmlPath);
if (!file.is_open()) { if (!file.is_open()) {
LOG_ERROR("0x2100 打开运行环境描述文件: %1出错错误信息 %2", XmlPath, strerror(errno)); LOG_ERROR("C01082003:打开构型配置文件 %1 出错, 错误信息: %2", XmlPath, strerror(errno));
return false; return false;
} }
tinyxml2::XMLDocument doc; tinyxml2::XMLDocument doc;
if (doc.LoadFile(XmlPath.c_str()) != tinyxml2::XML_SUCCESS) { if (doc.LoadFile(XmlPath.c_str()) != tinyxml2::XML_SUCCESS) {
LOG_ERROR("0x2100 解析XML文件: %1 失败", XmlPath); LOG_ERROR("C01082004:构型配置文件 %1 的XML解析失败!", XmlPath);
file.close(); file.close();
return false; return false;
} }
@ -110,6 +110,10 @@ bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath)
GetFramework()->SetServicePath(servicePath); GetFramework()->SetServicePath(servicePath);
// 设置域ID // 设置域ID
uint32_t domainID = std::stoul(envInfo->Attribute("DomainID")); uint32_t domainID = std::stoul(envInfo->Attribute("DomainID"));
if (domainID == 0 || domainID > 225) {
LOG_WARNING("A01083005:DDS通信域ID设置错误, 使用默认域ID: 10");
domainID = 10;
}
GetFramework()->GetDDSManager()->SetDomainID(domainID); GetFramework()->GetDDSManager()->SetDomainID(domainID);
// 读取CPU亲和性 // 读取CPU亲和性
std::string cpuAff = envInfo->Attribute("CPUAffinity"); std::string cpuAff = envInfo->Attribute("CPUAffinity");
@ -126,6 +130,7 @@ bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath)
libName = XNSim::getFileNameWithoutExt(libName); libName = XNSim::getFileNameWithoutExt(libName);
std::string dynamicLibName = servicePath + "/lib" + libName + ".so." + serviceVersion; std::string dynamicLibName = servicePath + "/lib" + libName + ".so." + serviceVersion;
// 加载动态库 // 加载动态库
LOG_INFO("D01084006:正在加载服务 %1", dynamicLibName);
GetFramework()->GetServiceManager()->LoadService(dynamicLibName, libName, GetFramework()->GetServiceManager()->LoadService(dynamicLibName, libName,
serviceVersion, 0); serviceVersion, 0);
service = service->NextSiblingElement("Service"); service = service->NextSiblingElement("Service");
@ -142,7 +147,8 @@ bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath)
// 读取模型分组优先级 // 读取模型分组优先级
int modelGroupPriority = XNSim::safe_stoi(modelGroup->Attribute("Priority")); int modelGroupPriority = XNSim::safe_stoi(modelGroup->Attribute("Priority"));
if (modelGroupPriority > 99 || modelGroupPriority < 0) { if (modelGroupPriority > 99 || modelGroupPriority < 0) {
LOG_ERROR("0x2100 模型分组优先级设置错误,优先级值:%d", modelGroupPriority); LOG_ERROR("A01082007:模型组 %1 优先级设置错误(0~99),优先级值:%2", modelGroupName,
modelGroupPriority);
return false; return false;
} }
// 读取模型分组CPU亲和性 // 读取模型分组CPU亲和性
@ -152,8 +158,9 @@ bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath)
// 验证CPU亲和性 // 验证CPU亲和性
for (const auto &cpu : modelGroupCPUAffList) { for (const auto &cpu : modelGroupCPUAffList) {
if (std::find(cpuAffList.begin(), cpuAffList.end(), cpu) == cpuAffList.end()) { if (std::find(cpuAffList.begin(), cpuAffList.end(), cpu) == cpuAffList.end()) {
LOG_ERROR("0x2100 模型分组CPU亲和性设置错误CPU亲和性值%s,进程CPU亲和性值%s", LOG_ERROR(
cpu.c_str(), cpuAff.c_str()); "A01082008:模型组 %1 的CPU亲和性设置错误, CPU亲和性值: %2,进程CPU亲和性值: %3",
modelGroupName, cpu.c_str(), cpuAff.c_str());
return false; return false;
} }
} }
@ -179,6 +186,7 @@ bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath)
libName = XNSim::getFileNameWithoutExt(libName); libName = XNSim::getFileNameWithoutExt(libName);
std::string dynamicLibName = modelPath + "/lib" + libName + ".so." + modelVersion; std::string dynamicLibName = modelPath + "/lib" + libName + ".so." + modelVersion;
// 加载动态库 // 加载动态库
LOG_INFO("D01084009:正在加载模型 %1", dynamicLibName);
GetFramework()->GetModelManager()->LoadModel(dynamicLibName, libName, modelVersion, GetFramework()->GetModelManager()->LoadModel(dynamicLibName, libName, modelVersion,
planeName, 0, threadID); planeName, 0, threadID);
model = model->NextSiblingElement("Model"); model = model->NextSiblingElement("Model");
@ -197,7 +205,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 获取数据库路径 // 获取数据库路径
std::string XNCorePath = std::getenv("XNCore"); std::string XNCorePath = std::getenv("XNCore");
if (XNCorePath.empty()) { if (XNCorePath.empty()) {
LOG_ERROR("0x1015 未设置XNCore环境变量, 引擎将退出!"); LOG_ERROR("A01082010:使用数据库构型配置时必须设置XNCore环境变量!");
return false; return false;
} }
std::string dbPath = XNCorePath + "/database/XNSim.db"; std::string dbPath = XNCorePath + "/database/XNSim.db";
@ -205,7 +213,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 打开数据库 // 打开数据库
sqlite3 *db; sqlite3 *db;
if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) { if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) {
LOG_ERROR("0x1016 打开数据库失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01082011:打开数据库 %1 失败, 错误信息: %2", dbPath, sqlite3_errmsg(db));
return false; return false;
} }
@ -213,7 +221,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
std::string sql = "SELECT * FROM Configuration WHERE ConfID = ?"; std::string sql = "SELECT * FROM Configuration WHERE ConfID = ?";
sqlite3_stmt *stmt; sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { if (sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) {
LOG_ERROR("0x1017 准备SQL语句失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01082012:数据库查询时准备SQL语句失败, 错误信息: %1", sqlite3_errmsg(db));
sqlite3_close(db); sqlite3_close(db);
return false; return false;
} }
@ -221,7 +229,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 绑定参数 // 绑定参数
int configIdInt = XNSim::safe_stoi(ConfigID); int configIdInt = XNSim::safe_stoi(ConfigID);
if (sqlite3_bind_int(stmt, 1, configIdInt) != SQLITE_OK) { if (sqlite3_bind_int(stmt, 1, configIdInt) != SQLITE_OK) {
LOG_ERROR("0x1018 绑定参数失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01082013:数据库查询时绑定参数失败, 错误信息: %1", sqlite3_errmsg(db));
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
sqlite3_close(db); sqlite3_close(db);
return false; return false;
@ -229,7 +237,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 执行查询 // 执行查询
if (sqlite3_step(stmt) != SQLITE_ROW) { if (sqlite3_step(stmt) != SQLITE_ROW) {
LOG_ERROR("0x1019 未找到配置ID为%1的记录", ConfigID); LOG_ERROR("A01082014:未在数据库中找到配置ID为 %1 的记录", ConfigID);
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
sqlite3_close(db); sqlite3_close(db);
return false; return false;
@ -250,7 +258,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 设置域ID // 设置域ID
uint32_t domainID = std::stoul(XNSim::getStringFromSqlite3(stmt, 7)); uint32_t domainID = std::stoul(XNSim::getStringFromSqlite3(stmt, 7));
if (domainID == 0 || domainID > 225) { if (domainID == 0 || domainID > 225) {
LOG_WARNING("0x1020 域ID设置错误使用默认域ID: 10"); LOG_WARNING("A01083015:DDS通信域ID设置错误, 使用默认域ID: 10");
domainID = 10; domainID = 10;
} }
GetFramework()->GetDDSManager()->SetDomainID(domainID); GetFramework()->GetDDSManager()->SetDomainID(domainID);
@ -262,14 +270,16 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
std::string servicesSql = "SELECT * FROM LoadServices WHERE ConfID = ?"; std::string servicesSql = "SELECT * FROM LoadServices WHERE ConfID = ?";
sqlite3_stmt *servicesStmt; sqlite3_stmt *servicesStmt;
if (sqlite3_prepare_v2(db, servicesSql.c_str(), -1, &servicesStmt, nullptr) != SQLITE_OK) { if (sqlite3_prepare_v2(db, servicesSql.c_str(), -1, &servicesStmt, nullptr) != SQLITE_OK) {
LOG_ERROR("0x1020 准备LoadServices查询语句失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01082016:数据库查询时准备LoadServices表的SQL查询语句失败, 错误信息: %1",
sqlite3_errmsg(db));
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
sqlite3_close(db); sqlite3_close(db);
return false; return false;
} }
// 绑定参数 // 绑定参数
if (sqlite3_bind_int(servicesStmt, 1, configIdInt) != SQLITE_OK) { if (sqlite3_bind_int(servicesStmt, 1, configIdInt) != SQLITE_OK) {
LOG_ERROR("0x1021 绑定LoadServices参数失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01082017:数据库查询时绑定LoadServices表的参数失败, 错误信息: %1",
sqlite3_errmsg(db));
sqlite3_finalize(servicesStmt); sqlite3_finalize(servicesStmt);
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
sqlite3_close(db); sqlite3_close(db);
@ -286,6 +296,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
ClassName = XNSim::getFileNameWithoutExt(ClassName); ClassName = XNSim::getFileNameWithoutExt(ClassName);
std::string dynamicLibName = servicePath + "/lib" + ClassName + ".so." + ServiceVersion; std::string dynamicLibName = servicePath + "/lib" + ClassName + ".so." + ServiceVersion;
// 加载动态库 // 加载动态库
LOG_INFO("D01084018:正在加载服务 %1", dynamicLibName);
GetFramework()->GetServiceManager()->LoadService(dynamicLibName, ClassName, ServiceVersion, GetFramework()->GetServiceManager()->LoadService(dynamicLibName, ClassName, ServiceVersion,
1); 1);
} }
@ -295,7 +306,8 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
sqlite3_stmt *modelGroupsStmt; sqlite3_stmt *modelGroupsStmt;
if (sqlite3_prepare_v2(db, modelGroupsSql.c_str(), -1, &modelGroupsStmt, nullptr) if (sqlite3_prepare_v2(db, modelGroupsSql.c_str(), -1, &modelGroupsStmt, nullptr)
!= SQLITE_OK) { != SQLITE_OK) {
LOG_ERROR("0x1020 准备LoadModelGroups查询语句失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01082019:数据库查询时准备LoadModelGroups表的SQL查询语句失败, 错误信息: %1",
sqlite3_errmsg(db));
sqlite3_finalize(servicesStmt); sqlite3_finalize(servicesStmt);
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
sqlite3_close(db); sqlite3_close(db);
@ -304,7 +316,8 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 绑定参数 // 绑定参数
if (sqlite3_bind_int(modelGroupsStmt, 1, configIdInt) != SQLITE_OK) { if (sqlite3_bind_int(modelGroupsStmt, 1, configIdInt) != SQLITE_OK) {
LOG_ERROR("0x1021 绑定LoadModelGroups参数失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01082020:数据库查询时绑定LoadModelGroups表的参数失败, 错误信息: %1",
sqlite3_errmsg(db));
sqlite3_finalize(modelGroupsStmt); sqlite3_finalize(modelGroupsStmt);
sqlite3_finalize(servicesStmt); sqlite3_finalize(servicesStmt);
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
@ -315,18 +328,29 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 执行查询并处理结果 // 执行查询并处理结果
while (sqlite3_step(modelGroupsStmt) == SQLITE_ROW) { while (sqlite3_step(modelGroupsStmt) == SQLITE_ROW) {
// 获取模型组信息 // 获取模型组信息
std::string GroupID = XNSim::getStringFromSqlite3(modelGroupsStmt, 1); std::string GroupID = XNSim::getStringFromSqlite3(modelGroupsStmt, 1);
std::string GroupName = XNSim::getStringFromSqlite3(modelGroupsStmt, 2); std::string GroupName = XNSim::getStringFromSqlite3(modelGroupsStmt, 2);
double GroupFreq = std::stod(XNSim::getStringFromSqlite3(modelGroupsStmt, 3)); double GroupFreq = std::stod(XNSim::getStringFromSqlite3(modelGroupsStmt, 3));
uint32_t GroupPriority = XNSim::safe_stoi(XNSim::getStringFromSqlite3(modelGroupsStmt, 4)); uint32_t GroupPriority = XNSim::safe_stoi(XNSim::getStringFromSqlite3(modelGroupsStmt, 4));
std::string GroupCPUAff = XNSim::getStringFromSqlite3(modelGroupsStmt, 5); if (GroupPriority > 99 || GroupPriority < 0) {
LOG_ERROR("A01082021:模型组 %1 优先级设置错误(0~99),优先级值:%2", GroupName,
GroupPriority);
sqlite3_finalize(modelGroupsStmt);
sqlite3_finalize(servicesStmt);
sqlite3_finalize(stmt);
sqlite3_close(db);
return false;
}
std::string GroupCPUAff = XNSim::getStringFromSqlite3(modelGroupsStmt, 5);
std::vector<std::string> GroupCPUAffList = XNSim::split(GroupCPUAff, ","); std::vector<std::string> GroupCPUAffList = XNSim::split(GroupCPUAff, ",");
// 验证CPU亲和性 // 验证CPU亲和性
for (const auto &cpu : GroupCPUAffList) { for (const auto &cpu : GroupCPUAffList) {
if (std::find(cpuAffList.begin(), cpuAffList.end(), cpu) == cpuAffList.end()) { if (std::find(cpuAffList.begin(), cpuAffList.end(), cpu) == cpuAffList.end()) {
LOG_ERROR("0x2100 模型分组CPU亲和性设置错误CPU亲和性值%s,进程CPU亲和性值%s", LOG_ERROR(
cpu.c_str(), cpuAff.c_str()); "A01082022:模型组 %1 的CPU亲和性设置错误, CPU亲和性值: %2,进程CPU亲和性值: %3",
GroupName, cpu.c_str(), cpuAff.c_str());
sqlite3_finalize(modelGroupsStmt); sqlite3_finalize(modelGroupsStmt);
sqlite3_finalize(servicesStmt); sqlite3_finalize(servicesStmt);
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
@ -342,7 +366,6 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
ThreadCpuAffinity |= 1 << std::distance(cpuAffList.begin(), it); ThreadCpuAffinity |= 1 << std::distance(cpuAffList.begin(), it);
} }
} }
LOG_INFO("0x1021 添加线程池: %1", GroupName);
// 添加线程池 // 添加线程池
uint32_t threadID = GetFramework()->GetThreadManager()->AddThreadPool( uint32_t threadID = GetFramework()->GetThreadManager()->AddThreadPool(
GroupName, GroupFreq, GroupPriority, ThreadCpuAffinity); GroupName, GroupFreq, GroupPriority, ThreadCpuAffinity);
@ -351,7 +374,8 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
std::string modelsSql = "SELECT * FROM LoadModels WHERE GroupID = ?"; std::string modelsSql = "SELECT * FROM LoadModels WHERE GroupID = ?";
sqlite3_stmt *modelsStmt = nullptr; sqlite3_stmt *modelsStmt = nullptr;
if (sqlite3_prepare_v2(db, modelsSql.c_str(), -1, &modelsStmt, nullptr) != SQLITE_OK) { if (sqlite3_prepare_v2(db, modelsSql.c_str(), -1, &modelsStmt, nullptr) != SQLITE_OK) {
LOG_ERROR("0x1022 准备LoadModels查询语句失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01082023:数据库查询时准备LoadModels表的SQL查询语句失败, 错误信息: %1",
sqlite3_errmsg(db));
sqlite3_finalize(modelGroupsStmt); sqlite3_finalize(modelGroupsStmt);
sqlite3_finalize(servicesStmt); sqlite3_finalize(servicesStmt);
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
@ -361,7 +385,8 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 绑定参数 // 绑定参数
if (sqlite3_bind_int(modelsStmt, 1, XNSim::safe_stoi(GroupID)) != SQLITE_OK) { if (sqlite3_bind_int(modelsStmt, 1, XNSim::safe_stoi(GroupID)) != SQLITE_OK) {
LOG_ERROR("0x1023 绑定LoadModels参数失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01082024:数据库查询时绑定LoadModels表的参数失败, 错误信息: %1",
sqlite3_errmsg(db));
sqlite3_finalize(modelsStmt); sqlite3_finalize(modelsStmt);
sqlite3_finalize(modelGroupsStmt); sqlite3_finalize(modelGroupsStmt);
sqlite3_finalize(servicesStmt); sqlite3_finalize(servicesStmt);
@ -380,7 +405,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
ClassName = XNSim::getFileNameWithoutExt(ClassName); ClassName = XNSim::getFileNameWithoutExt(ClassName);
std::string dynamicLibName = modelPath + "/lib" + ClassName + ".so." + ModelVersion; std::string dynamicLibName = modelPath + "/lib" + ClassName + ".so." + ModelVersion;
// 加载动态库 // 加载动态库
LOG_INFO("0x1021 加载模型: %1", dynamicLibName); LOG_INFO("D01084025:正在加载模型 %1", dynamicLibName);
GetFramework()->GetModelManager()->LoadModel(dynamicLibName, ClassName, ModelVersion, GetFramework()->GetModelManager()->LoadModel(dynamicLibName, ClassName, ModelVersion,
planeName, 1, threadID); planeName, 1, threadID);
} }

View File

@ -1,7 +1,7 @@
/** /**
* @file XNScenarioDescriptor.h * @file XNScenarioDescriptor.h
* @author jinchao * @author jinchao
* @brief * @brief
* @version 1.0 * @version 1.0
* @date 2024-11-07 * @date 2024-11-07
* *
@ -14,8 +14,8 @@
struct XNScenarioManagerPrivate; struct XNScenarioManagerPrivate;
/** /**
* @brief * @brief
* @details * @details
*/ */
class XNScenarioManager : public XNBaseFrameObject class XNScenarioManager : public XNBaseFrameObject
{ {
@ -23,18 +23,18 @@ class XNScenarioManager : public XNBaseFrameObject
XN_DECLARE_PRIVATE(XNScenarioManager) XN_DECLARE_PRIVATE(XNScenarioManager)
public: public:
/** /**
* @brief * @brief
*/ */
XNScenarioManager(); XNScenarioManager();
/** /**
* @brief * @brief
*/ */
virtual ~XNScenarioManager(); virtual ~XNScenarioManager();
protected: protected:
/** /**
* @brief * @brief
* @param p: * @param p:
* @details * @details
*/ */
@ -55,22 +55,22 @@ public:
public: public:
/** /**
* @brief * @brief
* @return true: * @return true:
* @return false: * @return false:
* @details * @details
*/ */
virtual bool Initialize() override; virtual bool Initialize() override;
/** /**
* @brief 仿 * @brief 仿
* @note * @note
*/ */
virtual bool PrepareForExecute() override; virtual bool PrepareForExecute() override;
/** /**
* @brief * @brief
* @param XmlPath: std::string类型 * @param XmlPath: std::string类型
* @param initialType: uint32_t类型 * @param initialType: uint32_t类型
* @return true: * @return true:
* @return false: * @return false:
@ -79,16 +79,16 @@ public:
private: private:
/** /**
* @brief * @brief
* @param XmlPath: std::string类型 * @param XmlPath: std::string类型
* @return true: * @return true:
* @return false: * @return false:
*/ */
bool ParseScenarioXml(const std::string &XmlPath); bool ParseScenarioXml(const std::string &XmlPath);
/** /**
* @brief * @brief
* @param ConfigID: std::string类型ID * @param ConfigID: std::string类型ID
* @return true: * @return true:
* @return false: * @return false:
*/ */

View File

@ -21,7 +21,7 @@ XNServiceManager::XNServiceManager(PrivateType *p) : XNBaseFrameObject(p)
bool XNServiceManager::Initialize() bool XNServiceManager::Initialize()
{ {
T_D(); T_D();
LOG_INFO("XNServiceManager Initialize Success!"); LOG_INFO("D01124001:服务管理器初始化成功!");
d->_status = XNFrameObjectStatus::Initialized; d->_status = XNFrameObjectStatus::Initialized;
return true; return true;
} }
@ -33,7 +33,7 @@ bool XNServiceManager::PrepareForExecute()
service.second->PrepareForExecute(); service.second->PrepareForExecute();
} }
d->_status = XNFrameObjectStatus::Ready; d->_status = XNFrameObjectStatus::Ready;
LOG_INFO("XNServiceManager is prepared!"); LOG_INFO("D01124002:服务管理器准备就绪!");
return true; return true;
} }
@ -52,7 +52,7 @@ void XNServiceManager::LoadService(const std::string &servicePath, const std::st
if (service) { if (service) {
uint32_t serviceID = RegisterService(); uint32_t serviceID = RegisterService();
if (serviceID == 0) { if (serviceID == 0) {
LOG_WARNING("0x2174 Assign Service ID Failed, Service ID is used up!"); LOG_WARNING("B01123003:分配服务ID失败, 服务ID已用完, 服务无法注册!");
dlclose(handle); dlclose(handle);
return; return;
} }
@ -65,49 +65,48 @@ void XNServiceManager::LoadService(const std::string &servicePath, const std::st
std::filesystem::path(servicePath).parent_path() std::filesystem::path(servicePath).parent_path()
/ (serviceName + "_V" + serviceVersion + ".scfg"); / (serviceName + "_V" + serviceVersion + ".scfg");
service->SetXmlPath(configPath.string()); service->SetXmlPath(configPath.string());
} else if (initialType == 1) {
LOG_INFO("0x2176 加载服务: %1", serviceName + "," + serviceVersion);
service->SetXmlPath(serviceName + "," + serviceVersion);
} else { } else {
LOG_WARNING("0x2175 InitialType Error, InitialType: %d", initialType); service->SetXmlPath(serviceName + "," + serviceVersion);
dlclose(handle);
return;
} }
// 注册服务到管理器 // 注册服务到管理器
d->ServiceList[serviceID] = service; d->ServiceList[serviceID] = service;
service->SetInitializeType(initialType); service->SetInitializeType(initialType);
// 初始化服务 // 初始化服务
LOG_INFO("0x2176 初始化服务: %1", serviceName);
service->Initialize(); service->Initialize();
} else { } else {
LOG_WARNING("0x2173 Service %s Not found in dynamic link library %s!", LOG_WARNING("B01123004:动态链接库 %1 中未找到服务 %2!", servicePath, serviceName);
serviceName.c_str(), servicePath.c_str());
dlclose(handle); dlclose(handle);
return; return;
} }
} else { } else {
LOG_WARNING( LOG_WARNING("B01123005:动态链接库 %1 中未找到函数 %2!", servicePath,
"0x2177 Service %s Initialization Failed, Function InitialService Not Found!", initialServiceName);
serviceName.c_str());
dlclose(handle); dlclose(handle);
return; return;
} }
} else { } else {
LOG_WARNING("0x2172 Service %s Dynamic link library loading failed! Error: %s", LOG_WARNING("C01123006:动态链接库 %1 加载失败! 错误: %2", servicePath, dlerror());
serviceName.c_str(), dlerror());
} }
} }
XNServiceObjectPtr XNServiceManager::GetService(uint32_t serviceID) XNServiceObjectPtr XNServiceManager::GetService(uint32_t serviceID)
{ {
T_D(); T_D();
if (d->ServiceIDAssigned[serviceID - 20000] if (serviceID >= 20000 && serviceID < 30000) {
&& d->ServiceList.find(serviceID) != d->ServiceList.end()) { if (d->ServiceIDAssigned[serviceID - 20000]) {
return d->ServiceList[serviceID]; if (d->ServiceList.find(serviceID) != d->ServiceList.end()) {
} else { return d->ServiceList[serviceID];
} else {
LOG_WARNING("B01123007:服务ID %1 对应的模型不存在!", serviceID);
return nullptr;
}
}
LOG_WARNING("B01123008:服务ID %1 未注册!", serviceID);
return nullptr; return nullptr;
} }
LOG_WARNING("B01123009:服务ID %1 不合法!", serviceID);
return nullptr;
} }
uint32_t XNServiceManager::RegisterService() uint32_t XNServiceManager::RegisterService()

View File

@ -89,36 +89,6 @@ void XNServiceObject::SetChangeTime(const XNTimePoint &cTime)
d->_cChangeTime = cTime; d->_cChangeTime = cTime;
} }
int XNServiceObject::RegisterEventHandler(const std::string &eventName, XNEventCallback callback,
bool async, XNEvent::Priority priority)
{
// 注册事件处理器
T_D();
auto framework = GetFramework();
if (framework) {
auto eventManager = framework->GetEventManager();
if (eventManager) {
return eventManager->RegisterEventHandler(eventName, callback, GetUniqueId(), async,
priority);
}
}
return -1;
}
void XNServiceObject::TriggerEvent(const std::string &eventName, const std::any &eventData,
bool forceAsync, XNEvent::Priority priority)
{
// 触发事件
T_D();
auto framework = GetFramework();
if (framework) {
auto eventManager = framework->GetEventManager();
if (eventManager) {
eventManager->TriggerEvent(eventName, eventData, forceAsync, priority);
}
}
}
int XNServiceObject::RegisterRTEventHandler(const std::string &eventName, XNEventCallback callback) int XNServiceObject::RegisterRTEventHandler(const std::string &eventName, XNEventCallback callback)
{ {
return RegisterEventHandler(eventName, callback, true, XNEvent::Priority::RealTime); return RegisterEventHandler(eventName, callback, true, XNEvent::Priority::RealTime);
@ -150,21 +120,20 @@ void XNServiceObject::ParseXml()
T_D(); T_D();
tinyxml2::XMLDocument doc; tinyxml2::XMLDocument doc;
if (doc.LoadFile(GetXmlPath().c_str()) != tinyxml2::XML_SUCCESS) { if (doc.LoadFile(GetXmlPath().c_str()) != tinyxml2::XML_SUCCESS) {
LOG_WARNING("Failed to open the service configuration file: %1!", GetXmlPath()); LOG_WARNING("C01153001:服务配置文件 %1 打开失败!", GetXmlPath());
return; return;
} }
tinyxml2::XMLElement *rootNode = doc.RootElement(); tinyxml2::XMLElement *rootNode = doc.RootElement();
if (!rootNode) { if (!rootNode) {
LOG_WARNING("Invalid XML file format: %1!", GetXmlPath()); LOG_WARNING("C01153002:服务配置文件 %1 解析失败!", GetXmlPath());
return; return;
} }
const char *serviceName = rootNode->FirstChildElement("Name")->GetText(); const char *serviceName = rootNode->FirstChildElement("Name")->GetText();
if (serviceName != GetObjectName()) { if (serviceName != GetObjectName()) {
LOG_WARNING("The service name in the configuration file of service %1 is not consistent " LOG_WARNING("A01153003:服务配置文件 %1 中服务名称不一致, 服务名称: %2, 配置文件中名称: %3!",
"with the service name in the configuration file of service %2!", GetXmlPath(), GetObjectName(), serviceName);
GetObjectName(), serviceName);
return; return;
} }
@ -199,7 +168,7 @@ void XNServiceObject::ParseConfig()
// 获取数据库路径 // 获取数据库路径
std::string dbPath = std::getenv("XNCore"); std::string dbPath = std::getenv("XNCore");
if (dbPath.empty()) { if (dbPath.empty()) {
LOG_ERROR("0x1015 未设置XNCore环境变量, 引擎将退出!"); LOG_ERROR("A01152004:未设置XNCore环境变量, 无法解析服务配置!");
return; return;
} }
dbPath += "/database/XNSim.db"; dbPath += "/database/XNSim.db";
@ -207,7 +176,7 @@ void XNServiceObject::ParseConfig()
// 打开数据库 // 打开数据库
sqlite3 *db; sqlite3 *db;
if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) { if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) {
LOG_ERROR("0x1016 打开数据库失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01152005:打开数据库失败: %1", sqlite3_errmsg(db));
return; return;
} }
@ -215,7 +184,7 @@ void XNServiceObject::ParseConfig()
std::string sql = "SELECT * FROM XNServiceVersion WHERE ClassName = ? AND Version = ?"; std::string sql = "SELECT * FROM XNServiceVersion WHERE ClassName = ? AND Version = ?";
sqlite3_stmt *stmt; sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { if (sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) {
LOG_ERROR("0x1017 准备SQL语句失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01152006:准备SQL语句失败: %1", sqlite3_errmsg(db));
sqlite3_close(db); sqlite3_close(db);
return; return;
} }
@ -224,7 +193,7 @@ void XNServiceObject::ParseConfig()
if (sqlite3_bind_text(stmt, 1, serviceName.c_str(), serviceName.length(), nullptr) != SQLITE_OK if (sqlite3_bind_text(stmt, 1, serviceName.c_str(), serviceName.length(), nullptr) != SQLITE_OK
|| sqlite3_bind_text(stmt, 2, serviceVersion.c_str(), serviceVersion.length(), nullptr) || sqlite3_bind_text(stmt, 2, serviceVersion.c_str(), serviceVersion.length(), nullptr)
!= SQLITE_OK) { != SQLITE_OK) {
LOG_ERROR("0x1018 绑定参数失败: %1", sqlite3_errmsg(db)); LOG_ERROR("C01152007:绑定参数失败: %1", sqlite3_errmsg(db));
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
sqlite3_close(db); sqlite3_close(db);
return; return;
@ -232,8 +201,7 @@ void XNServiceObject::ParseConfig()
// 执行查询 // 执行查询
if (sqlite3_step(stmt) != SQLITE_ROW) { if (sqlite3_step(stmt) != SQLITE_ROW) {
LOG_ERROR("0x1019 未找到服务名称为%1,版本号%2的记录", serviceName.c_str(), LOG_ERROR("A01152008:未找到服务名称为 %1, 版本号 %2 的记录", serviceName, serviceVersion);
serviceVersion.c_str());
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
sqlite3_close(db); sqlite3_close(db);
return; return;
@ -257,7 +225,6 @@ void XNServiceObject::ParseConfig()
for (const auto &cmd : commandList) { for (const auto &cmd : commandList) {
if (cmd.contains("Name") && cmd.contains("Description") if (cmd.contains("Name") && cmd.contains("Description")
&& cmd.contains("Call")) { && cmd.contains("Call")) {
LOG_INFO("0x1021 服务命令: %1", cmd["Name"].get<std::string>());
// TODO: 处理服务命令信息 // TODO: 处理服务命令信息
// d->_commandList.emplace_back( // d->_commandList.emplace_back(
// cmd["Name"].get<std::string>(), // cmd["Name"].get<std::string>(),
@ -268,7 +235,7 @@ void XNServiceObject::ParseConfig()
} }
} }
} catch (const std::exception &e) { } catch (const std::exception &e) {
LOG_WARNING("0x1020 解析服务命令列表失败: %1", e.what()); //LOG_WARNING("解析服务命令列表失败: %1", e.what());
} }
} }
@ -278,7 +245,7 @@ void XNServiceObject::ParseConfig()
try { try {
d->_otherParams = XN_JSON::parse(otherParamsStr); d->_otherParams = XN_JSON::parse(otherParamsStr);
} catch (const std::exception &e) { } catch (const std::exception &e) {
LOG_WARNING("0x1020 解析其他参数失败: %1", e.what()); LOG_WARNING("C01152009:解析其他参数失败: %1", e.what());
} }
} }
@ -310,3 +277,42 @@ void XNServiceObject::SetFramework(XNFrameworkPtr framework)
T_D(); T_D();
d->pFramework = framework; d->pFramework = framework;
} }
int XNServiceObject::RegisterEventHandler(const std::string &eventName, XNEventCallback callback,
bool async, XNEvent::Priority priority)
{
// 注册事件处理器
T_D();
auto framework = GetFramework();
if (framework) {
auto eventManager = framework->GetEventManager();
if (eventManager) {
return eventManager->RegisterEventHandler(eventName, callback, GetUniqueId(), async,
priority);
} else {
LOG_WARNING("B01153011:获取事件管理器失败!");
}
} else {
LOG_WARNING("B01153010:获取主框架失败!");
}
return -1;
}
void XNServiceObject::TriggerEvent(const std::string &eventName, const std::any &eventData,
bool forceAsync, XNEvent::Priority priority)
{
// 触发事件
T_D();
auto framework = GetFramework();
if (framework) {
auto eventManager = framework->GetEventManager();
if (eventManager) {
eventManager->TriggerEvent(eventName, eventData, forceAsync, priority);
} else {
LOG_WARNING("B01153013:获取事件管理器失败!");
}
} else {
LOG_WARNING("B01153012:获取主框架失败!");
}
}

View File

@ -54,21 +54,21 @@ bool XNThread::Initialize()
// 初始化线程参数 // 初始化线程参数
ret = pthread_attr_init(&(d->attr)); ret = pthread_attr_init(&(d->attr));
if (ret) { if (ret) {
LOG_ERROR("0x2210 Thread: %1 Initialize Attribute Failed!", GetObjectName()); LOG_ERROR("C01132001:线程 %1 初始化属性失败!", GetObjectName());
return false; return false;
} }
// 设置线程栈空间大小 // 设置线程栈空间大小
ret = pthread_attr_setstacksize(&(d->attr), PTHREAD_STACK_MIN * 20); ret = pthread_attr_setstacksize(&(d->attr), PTHREAD_STACK_MIN * 20);
if (ret) { if (ret) {
LOG_ERROR("0x2211 Thread: %1 Set Stack Space Failed!", GetObjectName()); LOG_ERROR("C01132002:线程 %1 设置栈空间失败!", GetObjectName());
return false; return false;
} }
// 设置线程调度策略 // 设置线程调度策略
ret = pthread_attr_setschedpolicy(&(d->attr), SCHED_FIFO); ret = pthread_attr_setschedpolicy(&(d->attr), SCHED_FIFO);
if (ret) { if (ret) {
LOG_ERROR("0x2212 Thread: %1 Set Scheduling Policy Failed!", GetObjectName()); LOG_ERROR("C01132003:线程 %1 设置调度策略失败!", GetObjectName());
return false; return false;
} }
@ -76,21 +76,21 @@ bool XNThread::Initialize()
d->param.sched_priority = d->_uPriority; d->param.sched_priority = d->_uPriority;
ret = pthread_attr_setschedparam(&(d->attr), &d->param); ret = pthread_attr_setschedparam(&(d->attr), &d->param);
if (ret) { if (ret) {
LOG_ERROR("0x2213 Thread: %1 Set Priority Failed!", GetObjectName()); LOG_ERROR("C01132004:线程 %1 设置优先级失败!", GetObjectName());
return false; return false;
} }
// 设置调度器继承 // 设置调度器继承
ret = pthread_attr_setinheritsched(&(d->attr), PTHREAD_EXPLICIT_SCHED); ret = pthread_attr_setinheritsched(&(d->attr), PTHREAD_EXPLICIT_SCHED);
if (ret) { if (ret) {
LOG_ERROR("0x2214 Thread: %1 Set Scheduler Inheritance Failed!", GetObjectName()); LOG_ERROR("C01132005:线程 %1 设置调度器继承失败!", GetObjectName());
return false; return false;
} }
// 线程创建 // 线程创建
ret = pthread_create(&d->thread, &d->attr, ThreadFunction, this); ret = pthread_create(&d->thread, &d->attr, ThreadFunction, this);
if (ret) { if (ret) {
LOG_ERROR("0x2215 Thread: %1 Create Failed!", GetObjectName()); LOG_ERROR("C01132006:线程 %1 创建失败!", GetObjectName());
return false; return false;
} }
@ -101,23 +101,23 @@ bool XNThread::Initialize()
XNFrameworkPtr framework = GetFramework(); XNFrameworkPtr framework = GetFramework();
if (!framework) { if (!framework) {
LOG_WARNING("0x2216 Thread: %1 get Framework Failed!", GetObjectName()); LOG_WARNING("B01133007:线程 %1 获取框架指针失败!", GetObjectName());
return true; return true;
} }
XNDDSManagerPtr ddsManager = framework->GetDDSManager(); XNDDSManagerPtr ddsManager = framework->GetDDSManager();
if (!ddsManager) { if (!ddsManager) {
LOG_WARNING("0x2216 Thread: %1 get DDSManager Failed!", GetObjectName()); LOG_WARNING("B01133008:线程 %1 获取DDS管理器失败!", GetObjectName());
return true; return true;
} }
d->writer = ddsManager->RegisterPublisher<XNSim::XNSimStatus::XNThreadStatusPubSubType>( d->writer = ddsManager->RegisterPublisher<XNSim::XNSimStatus::XNThreadStatusPubSubType>(
"XNSim::XNSimStatus::XNThreadStatus", d->_threadID); "XNSim::XNSimStatus::XNThreadStatus", d->_threadID);
if (d->writer == nullptr) { if (d->writer == nullptr) {
LOG_WARNING("0x2217 Thread: %1 get DDS Writer Failed!", GetObjectName()); LOG_WARNING("B01133009:线程 %1 获取DDS数据写入器失败!", GetObjectName());
return true; return true;
} }
LOG_INFO("Thread: %1 is prepared!", GetObjectName()); LOG_INFO("D01134010:线程 %1 准备就绪!", GetObjectName());
return true; return true;
} }
@ -154,7 +154,7 @@ void XNThread::Start()
} }
pthread_cond_signal(&d->_cond); pthread_cond_signal(&d->_cond);
pthread_mutex_unlock(&d->_mtx); pthread_mutex_unlock(&d->_mtx);
LOG_INFO("Thread: %1 Start!", GetObjectName()); LOG_INFO("D01134011:线程 %1 开始执行!", GetObjectName());
} }
// 暂停执行 // 暂停执行
@ -167,7 +167,7 @@ void XNThread::Pause()
d->_eRunStatus = RunStatus::Suspend; d->_eRunStatus = RunStatus::Suspend;
} }
pthread_mutex_unlock(&d->_mtx); pthread_mutex_unlock(&d->_mtx);
LOG_INFO("Thread: %1 Pause!", GetObjectName()); LOG_INFO("D01134012:线程 %1 暂停执行!", GetObjectName());
} }
// 继续执行 // 继续执行
@ -181,6 +181,7 @@ void XNThread::Continue()
} }
pthread_cond_signal(&d->_cond); pthread_cond_signal(&d->_cond);
pthread_mutex_unlock(&d->_mtx); pthread_mutex_unlock(&d->_mtx);
LOG_INFO("D01134013:线程 %1 继续执行!", GetObjectName());
} }
// 停止执行 // 停止执行
@ -194,6 +195,7 @@ void XNThread::Stop(bool force)
pthread_cond_signal(&d->_cond); pthread_cond_signal(&d->_cond);
pthread_mutex_unlock(&d->_mtx); pthread_mutex_unlock(&d->_mtx);
Join(); Join();
LOG_INFO("D01134014:线程 %1 强制停止执行!", GetObjectName());
} else { } else {
pthread_mutex_lock(&d->_mtx); pthread_mutex_lock(&d->_mtx);
// 设置运行状态 // 设置运行状态
@ -201,8 +203,8 @@ void XNThread::Stop(bool force)
pthread_cond_signal(&d->_cond); pthread_cond_signal(&d->_cond);
pthread_mutex_unlock(&d->_mtx); pthread_mutex_unlock(&d->_mtx);
Join(); Join();
LOG_INFO("D01134015:线程 %1 正常停止执行!", GetObjectName());
} }
LOG_INFO("Thread: %1 Stop!", GetObjectName());
} }
// 加入线程 // 加入线程
@ -323,7 +325,7 @@ bool XNThread::OnSetCPUAffinity()
CPU_SET(i, &mask); CPU_SET(i, &mask);
} }
if (pthread_setaffinity_np(d->thread, sizeof(mask), &mask) == -1) { if (pthread_setaffinity_np(d->thread, sizeof(mask), &mask) == -1) {
LOG_WARNING("0x2216 线程: %1 设置CPU亲和性失败!", GetObjectName()); LOG_WARNING("C01133017:线程 %1 设置CPU亲和性失败!", GetObjectName());
return false; return false;
} }
return true; return true;

View File

@ -36,7 +36,7 @@ bool XNThreadManager::Initialize()
d->_eRunStatus = RunStatus::NotStart; d->_eRunStatus = RunStatus::NotStart;
d->threadList.clear(); d->threadList.clear();
d->funList.clear(); d->funList.clear();
LOG_INFO("XNThreadManager Initialize Success!"); LOG_INFO("D01074001:线程管理器初始化成功!");
d->_status = XNFrameObjectStatus::Initialized; d->_status = XNFrameObjectStatus::Initialized;
return true; return true;
} }
@ -110,10 +110,10 @@ void XNThreadManager::RegisterFunction(uint32_t id, XNCallBack fun, uint32_t thr
d->funList[id].push_back(sFunInfo); d->funList[id].push_back(sFunInfo);
if (d->threadList.find(threadID) != d->threadList.end()) { if (d->threadList.find(threadID) != d->threadList.end()) {
d->threadList[threadID]->AddFunction(fun, (FreqLevel)freqGroup, RunPos, RunPriorty); d->threadList[threadID]->AddFunction(fun, (FreqLevel)freqGroup, RunPos, RunPriorty);
LOG_INFO("Model [ %1] register periodic function success! Run node: %2-%3 Priority: %4", LOG_INFO("D01074005:模型 [ %1 ] 注册周期性函数成功! 运行节点: %2-%3 优先级: %4", id,
id, freqGroup, RunPos, RunPriorty); freqGroup, RunPos, RunPriorty);
} else { } else {
LOG_ERROR("0x2172 The thread [ %1 ] does not exist, registration failed!", threadID); LOG_ERROR("B01072008:线程 [ %1 ] 不存在,模型 [ %2 ] 注册周期性函数失败!", threadID, id);
} }
} }
} }
@ -124,15 +124,12 @@ bool XNThreadManager::IsFunParamRight(uint32_t id, uint32_t freqGroup, uint32_t
// 检查提交的函数是否符合规定 // 检查提交的函数是否符合规定
if (freqGroup < 0 || freqGroup > 5) { if (freqGroup < 0 || freqGroup > 5) {
// 如果频率分组不是05 // 如果频率分组不是05
LOG_WARNING("0x2170 The submitted function's run frequency group of Model [ %1 ] is not " LOG_WARNING("A01073006:模型 [ %1 ] 的运行频率分组不在0~5之间,注册失败!", id);
"between 0 and 5, registration failed!",
id);
return false; return false;
} else if (RunPos > (1 << freqGroup)) { } else if (RunPos > (1 << freqGroup)) {
// 如果运行节点不符合要求 // 如果运行节点不符合要求
LOG_WARNING("0x2171 The run node submitted for registration by model [ %1 ] exceeds the " LOG_WARNING("A01073007:模型 [ %1 ] 的运行节点 %2 超出当前频率分组最大节点数 %3,注册失败!",
"maximum node count for the frequency group, registration failed!", id, RunPos, (1 << freqGroup));
id);
return false; return false;
} }
return true; return true;
@ -156,16 +153,16 @@ bool XNThreadManager::PrepareForExecute()
} }
} }
// 所有线程初始化 // 所有线程初始化
LOG_INFO("XNThreadManager is preparing..."); LOG_INFO("D01074002:线程管理器正在初始化所有线程...");
for (auto &thread : d->threadList) { for (auto &thread : d->threadList) {
bool bRet = thread.second->Initialize(); bool bRet = thread.second->Initialize();
if (!bRet) { if (!bRet) {
LOG_ERROR("Thread [ %1 ] PrepareForExecute Failed!", thread.first); LOG_ERROR("B01072009:线程 [ %1 ] 初始化失败!", thread.first);
continue; continue;
} }
} }
d->_status = XNFrameObjectStatus::Ready; d->_status = XNFrameObjectStatus::Ready;
LOG_INFO("XNThreadManager is prepared!"); LOG_INFO("D01074003:线程管理器准备就绪!");
return true; return true;
} }
@ -178,7 +175,7 @@ uint32_t XNThreadManager::AddThreadPool(std::string name, double freq, uint32_t
XNThreadPtr thread = std::make_shared<XNThread>(name, freq, priority, CPUAff); XNThreadPtr thread = std::make_shared<XNThread>(name, freq, priority, CPUAff);
thread->SetThreadID(AllocateThreadID()); thread->SetThreadID(AllocateThreadID());
thread->SetFramework(GetFramework()); thread->SetFramework(GetFramework());
LOG_INFO("Add Thread Success, Frequency: %1 Hz, Interval: %2 ns.", freq, 1.0e9 / freq); LOG_INFO("D01074004:添加线程成功,运行频率: %1 Hz,运行间隔: %2 ns.", freq, 1.0e9 / freq);
d->threadList[thread->GetThreadID()] = thread; d->threadList[thread->GetThreadID()] = thread;
return thread->GetThreadID(); return thread->GetThreadID();
} }

View File

@ -53,10 +53,10 @@ void XNTimeManager::Start()
{ {
T_D(); T_D();
if (d->_eRunStatus == RunStatus::NotStart) { if (d->_eRunStatus == RunStatus::NotStart) {
LOG_INFO("XNSim Start!"); LOG_INFO("D01064003:仿真开始运行!");
d->_eRunStatus = RunStatus::Runing; d->_eRunStatus = RunStatus::Runing;
} else { } else {
LOG_WARNING("XNSim Already Start!"); LOG_WARNING("A01063007:仿真已经运行,请勿重复运行!");
} }
} }
@ -64,10 +64,10 @@ void XNTimeManager::Abort()
{ {
T_D(); T_D();
if (d->_eRunStatus != RunStatus::Aborted) { if (d->_eRunStatus != RunStatus::Aborted) {
LOG_INFO("XNSim Abort!"); LOG_INFO("D01064004:仿真终止运行!");
d->_eRunStatus = RunStatus::Aborted; d->_eRunStatus = RunStatus::Aborted;
} else { } else {
LOG_WARNING("XNSim Already Abort!"); LOG_WARNING("A01062008:仿真已经终止运行,请勿重复终止!");
} }
} }
@ -75,10 +75,10 @@ void XNTimeManager::Pause()
{ {
T_D(); T_D();
if (d->_eRunStatus == RunStatus::Runing) { if (d->_eRunStatus == RunStatus::Runing) {
LOG_INFO("XNSim Pause!"); LOG_INFO("D01064005:仿真暂停运行!");
d->_eRunStatus = RunStatus::Suspend; d->_eRunStatus = RunStatus::Suspend;
} else { } else {
LOG_WARNING("XNSim is not in Runing status!"); LOG_WARNING("A01062009:仿真不是运行状态,无法暂停!");
} }
} }
@ -86,10 +86,10 @@ void XNTimeManager::Continue()
{ {
T_D(); T_D();
if (d->_eRunStatus == RunStatus::Suspend) { if (d->_eRunStatus == RunStatus::Suspend) {
LOG_INFO("XNSim Continue!"); LOG_INFO("D01064006:仿真继续运行!");
d->_eRunStatus = RunStatus::Runing; d->_eRunStatus = RunStatus::Runing;
} else { } else {
LOG_WARNING("XNSim is not in Pause status!"); LOG_WARNING("A01062010:仿真不是暂停状态,无法继续!");
} }
} }
@ -146,7 +146,7 @@ bool XNTimeManager::Initialize()
// 仿真时间初始化 // 仿真时间初始化
d->_SimTime = d->_SimStartTime; d->_SimTime = d->_SimStartTime;
LOG_INFO("XNTimeManager Initialize Success!"); LOG_INFO("D01064001:时间管理器初始化成功!");
d->_status = XNFrameObjectStatus::Initialized; d->_status = XNFrameObjectStatus::Initialized;
return true; return true;
} }
@ -155,7 +155,7 @@ bool XNTimeManager::PrepareForExecute()
{ {
T_D(); T_D();
d->_status = XNFrameObjectStatus::Ready; d->_status = XNFrameObjectStatus::Ready;
LOG_INFO("XNTimeManager is prepared!"); LOG_INFO("D01064002:时间管理器准备就绪!");
return true; return true;
} }