From c30b580a56cc8cfd552af76f0e5b3e6d717721f8 Mon Sep 17 00:00:00 2001
From: jinchao <383321154@qq.com>
Date: Thu, 26 Jun 2025 15:26:26 +0800
Subject: [PATCH] =?UTF-8?q?V0.36.2.250626=5Falpha:=E4=B8=BAXNCore=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0=E4=BA=86=E8=A7=84=E8=8C=83=E7=9A=84=E5=87=BA=E9=94=99?=
=?UTF-8?q?=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Release/database/LogInfo.db | Bin 57344 -> 81920 bytes
Release/database/XNSim.db | Bin 1224704 -> 1224704 bytes
Release/include/XNCore/XNDDSInterface.h | 70 +++++++--------
Release/include/XNCore/XNDDSManager.h | 18 ++--
Release/include/XNCore/XNScenarioManager.h | 30 +++----
XNCore/XNDDSInterface.h | 70 +++++++--------
XNCore/XNDDSManager.cpp | 7 +-
XNCore/XNDDSManager.h | 18 ++--
XNCore/XNEventManager.cpp | 85 +++++++++----------
XNCore/XNFramework.cpp | 40 ++++-----
XNCore/XNModelManager.cpp | 52 ++++++------
XNCore/XNModelObject.cpp | 55 ++++++------
XNCore/XNScenarioManager.cpp | 87 ++++++++++++-------
XNCore/XNScenarioManager.h | 30 +++----
XNCore/XNServiceManager.cpp | 41 +++++----
XNCore/XNServiceObject.cpp | 94 +++++++++++----------
XNCore/XNThread.cpp | 30 ++++---
XNCore/XNThreadManager.cpp | 25 +++---
XNCore/XNTimeManager.cpp | 20 ++---
19 files changed, 393 insertions(+), 379 deletions(-)
diff --git a/Release/database/LogInfo.db b/Release/database/LogInfo.db
index c18f1009f6989306fef6e2740a2586b772619238..429e5e7f37fc34c439495936e3d5e7d9521c9caa 100644
GIT binary patch
literal 81920
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
Z>*30gIGbap;$o-ux^FA>%(2sY{|yX$Om6@H
delta 549
zcmZo@U~M?SJV9Deoq>UY4~m(9wDd$BV|8@~J@1LUydezS+@1{l>imcKLiwb4nRs$|
z%z0<>rg7JBdvd+ydb?RsppH|D+nC`EP$L@PHek3sapHLvpdtMeCq^(CicU7coWpH8`2e?@gimH(suHKCUx=%_Ymg2Xr&3UAaehu&>Lh+KKIitNkA{O^9n|=vB}$N
zGx|Fj7#f%w85kH(K7U7@CDX+vc=Ccfa_rHpVCl(y_YB!no=xBOa{3mKI1A9rmJ=tM
z3P!Vly%qH)w&B!qM^*v*b&`c&a`A}7+$%gl>m>6zM&c3g~
zp34Z-3>2DmUyq65I8aD>^5grmVq8GO+4$Eo0KM{*|0Mrz{Xa1_1_8pgr6yIN=iij?f~&rf
zC5A&%QCv2az?8$y&BZLq2ytCZyW$@vAZ7+)79eH?
mVm2UV2VxE&<^*CcAm#>Q9w6ogVm=_|2V#Nkihl&}Zw3IfT6`z~
delta 138
zcmZp8;MMTJYl1YR{6raNM)}5stqF`v`~}#!wleVT;ZxvM;r_zS%C&W~puj?|_N`Hj
z+qXtB`A=nz=24u^{())X_EjI4a=0f3@U|=dVFF@iAZ7t#Rv=~rVs;?r0Afxc<^p1F
XAm#yLka|8K<_BVd?TUW{?{5YGJ_Izj
diff --git a/Release/include/XNCore/XNDDSInterface.h b/Release/include/XNCore/XNDDSInterface.h
index 1c43e70..bfc6f65 100644
--- a/Release/include/XNCore/XNDDSInterface.h
+++ b/Release/include/XNCore/XNDDSInterface.h
@@ -75,7 +75,7 @@ protected:
}
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 78");
+ "A01161001:T 必须是算术类型或std::array类型");
}
return result;
@@ -109,7 +109,7 @@ protected:
setByteArrayFromStdArray(data.value(), thisArray);
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 112");
+ "A01161002:T 必须是算术类型或std::array类型");
}
}
@@ -132,7 +132,7 @@ protected:
getTypeSize());
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 135");
+ "A01161003:T 必须是算术类型或std::array类型");
}
}
@@ -158,7 +158,7 @@ protected:
setByteArrayFromStdArray(data[i], subArray);
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 160");
+ "A01161004:T 必须是算术类型或std::array类型");
}
}
}
@@ -186,7 +186,7 @@ protected:
}
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 188");
+ "A01161005:T 必须是算术类型或std::array类型");
}
return std::string();
}
@@ -214,6 +214,7 @@ protected:
items.push_back(item);
}
if (items.size() != getArrayWholeSize()) {
+ LOG_WARNING("A01163006:数组大小不一致, 设置数据失败!");
return;
}
T temp;
@@ -221,7 +222,7 @@ protected:
data = temp;
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 220");
+ "A01161007:T 必须是算术类型或std::array类型");
}
}
@@ -249,7 +250,7 @@ protected:
ss << getStringFromStdArray(data[i]);
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 243");
+ "A01161008:T 必须是算术类型或std::array类型");
}
}
return ss.str();
@@ -281,13 +282,11 @@ protected:
// 对于嵌套数组,递归处理
start_pos = setStdArrayFromString(data[i], value, start_pos);
} else {
- static_assert(
- std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 275");
+ static_assert(std::is_arithmetic_v || is_std_array_v,
+ "A01161009:T 必须是算术类型或std::array类型");
}
} catch (const std::exception &e) {
- throw std::runtime_error("无法解析第 " + std::to_string(i)
- + " 个元素: " + e.what());
+ LOG_WARNING("A01163010:无法解析第 %1 个元素: %2", i, e.what());
}
}
return start_pos + N;
@@ -299,10 +298,9 @@ protected:
if (data) {
auto temp = data.value();
if constexpr (std::is_arithmetic_v) {
- static_assert(std::is_arithmetic_v,
- "模板参数T2必须是算术类型,详见XNDDSInterface.cpp:line 293");
+ static_assert(std::is_arithmetic_v, "A01161011:模板参数T2必须是算术类型");
static_assert(std::is_convertible_v,
- "模板参数T1必须可以转换为T2类型,详见XNDDSInterface.cpp:line 295");
+ "A01161012:模板参数T1必须可以转换为T2类型");
model_data = temp;
} else if constexpr (is_std_array_v) {
size_t arraySize = array_size_v;
@@ -320,21 +318,19 @@ protected:
}
} else {
static_assert(std::is_arithmetic_v,
- "模板参数T1是std::"
- "array类型时,它的数组嵌套不能超过两层,详见XNDDSInterfac"
- "e.cpp:line 313");
+ "A01161013:模板参数T1是std::"
+ "array类型时,它的数组嵌套不能超过两层");
}
} else {
- static_assert(
- std::is_arithmetic_v || is_std_array_v,
- "模板参数T1是std::array类型时,它的value_"
- "type必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 320");
+ static_assert(std::is_arithmetic_v
+ || is_std_array_v,
+ "A01161014:模板参数T1是std::array类型时,它的value_"
+ "type必须是算术类型或std::array类型");
}
}
} else {
- static_assert(
- std::is_arithmetic_v || is_std_array_v,
- "模板参数T1必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 326");
+ static_assert(std::is_arithmetic_v || is_std_array_v,
+ "A01161015:模板参数T1必须是算术类型或std::array类型");
}
}
}
@@ -343,10 +339,9 @@ protected:
void assign_value_set(eprosima::fastcdr::optional &data, const T2 &model_data)
{
if constexpr (std::is_arithmetic_v) {
- static_assert(std::is_arithmetic_v,
- "模板参数T2必须是算术类型,详见XNDDSInterface.cpp:line 337");
+ static_assert(std::is_arithmetic_v, "A01161016:模板参数T2必须是算术类型");
static_assert(std::is_convertible_v,
- "模板参数T2必须可以转换为T1类型,详见XNDDSInterface.cpp:line 339");
+ "A01161017:模板参数T2必须可以转换为T1类型");
data = model_data;
} else if constexpr (is_std_array_v) {
T1 temp;
@@ -363,23 +358,20 @@ protected:
temp[i][j] = model_data[i][j];
}
} else {
- static_assert(std::is_arithmetic_v,
- "模板参数T1是std::"
- "array类型时,它的数组嵌套不能超过两层,详见XNDDSInterface."
- "cpp:line 357");
+ static_assert(
+ std::is_arithmetic_v,
+ "A01161018:模板参数T1是std::array类型时,它的数组嵌套不能超过两层");
}
} else {
- static_assert(
- std::is_arithmetic_v || is_std_array_v,
- "模板参数T1是std::array类型时,它的value_"
- "type必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 364");
+ static_assert(std::is_arithmetic_v || is_std_array_v,
+ "A01161019:模板参数T1是std::array类型时,它的value_"
+ "type必须是算术类型或std::array类型");
}
}
data = temp;
} else {
- static_assert(
- std::is_arithmetic_v || is_std_array_v,
- "模板参数T1必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 371");
+ static_assert(std::is_arithmetic_v || is_std_array_v,
+ "A01161020:模板参数T1必须是算术类型或std::array类型");
}
}
diff --git a/Release/include/XNCore/XNDDSManager.h b/Release/include/XNCore/XNDDSManager.h
index 216edbf..b87d9de 100644
--- a/Release/include/XNCore/XNDDSManager.h
+++ b/Release/include/XNCore/XNDDSManager.h
@@ -77,7 +77,7 @@ public:
tmp.topic = d->participant_->create_topic(topicName, typeSupport.get_type_name(),
FAST_DDS_MACRO::TOPIC_QOS_DEFAULT);
if (tmp.topic == nullptr) {
- LOG_ERROR("0x2130 Create Topic %1 Failed!", topicName);
+ LOG_ERROR("C01102001:创建主题 %1 失败!", topicName);
d->topics_.erase(topicName);
return nullptr;
}
@@ -87,7 +87,7 @@ public:
tmp.publishers_[publisherID].publisher =
d->participant_->create_publisher(FAST_DDS_MACRO::PUBLISHER_QOS_DEFAULT, 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;
}
@@ -107,10 +107,11 @@ public:
tmp.publishers_[publisherID].publisher->create_datawriter(tmp.topic, dataWriterQos,
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;
}
- LOG_INFO("0x2133 Create Publisher %1 for Topic %2 Success!", publisherID, topicName);
+ LOG_INFO("D01104004:创建主题 %1 的发布者 %2 的数据写入器成功!", topicName, publisherID);
return tmp.publishers_[publisherID].dataWriter;
}
@@ -128,7 +129,7 @@ public:
tmp.topic = d->participant_->create_topic(topicName, typeSupport.get_type_name(),
FAST_DDS_MACRO::TOPIC_QOS_DEFAULT);
if (tmp.topic == nullptr) {
- LOG_ERROR("0x2130 Create Topic %1 Failed!", topicName);
+ LOG_ERROR("C01102005:创建主题 %1 失败!", topicName);
d->topics_.erase(topicName);
return;
}
@@ -138,7 +139,7 @@ public:
tmp.subscribers_[subscriberID].subscriber =
d->participant_->create_subscriber(FAST_DDS_MACRO::SUBSCRIBER_QOS_DEFAULT, 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;
dataReaderQos.durability().kind = FAST_DDS_MACRO::VOLATILE_DURABILITY_QOS;
@@ -148,8 +149,9 @@ public:
tmp.subscribers_[subscriberID].subscriber->create_datareader(tmp.topic, dataReaderQos,
listener);
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);
}
};
diff --git a/Release/include/XNCore/XNScenarioManager.h b/Release/include/XNCore/XNScenarioManager.h
index b659e78..ea8ea85 100644
--- a/Release/include/XNCore/XNScenarioManager.h
+++ b/Release/include/XNCore/XNScenarioManager.h
@@ -1,7 +1,7 @@
/**
* @file XNScenarioDescriptor.h
* @author jinchao
- * @brief 运行环境描述管理器类头文件
+ * @brief 构型管理器类头文件
* @version 1.0
* @date 2024-11-07
*
@@ -14,8 +14,8 @@
struct XNScenarioManagerPrivate;
/**
- * @brief 运行环境描述管理器类
- * @details 主要负责解析运行环境配置文件来设置系统运行参数。
+ * @brief 构型管理器类
+ * @details 主要负责解析构型配置来设置系统运行参数。
*/
class XNScenarioManager : public XNBaseFrameObject
{
@@ -23,18 +23,18 @@ class XNScenarioManager : public XNBaseFrameObject
XN_DECLARE_PRIVATE(XNScenarioManager)
public:
/**
- * @brief 运行环境描述管理器类默认构造函数
+ * @brief 构型管理器类默认构造函数
*/
XNScenarioManager();
/**
- * @brief 运行环境描述管理器类析构函数
+ * @brief 构型管理器类析构函数
*/
virtual ~XNScenarioManager();
protected:
/**
- * @brief 运行环境描述管理器类带参构造函数
+ * @brief 构型管理器类带参构造函数
* @param p:私有结构体指针
* @details 子类构造时调用此构造函数,传入子类的私有结构体指针
*/
@@ -55,22 +55,22 @@ public:
public:
/**
- * @brief 初始化运行环境描述管理器
+ * @brief 初始化构型管理器
* @return true: 初始化成功
* @return false: 初始化失败
- * @details 运行环境描述管理器的初始化接口函数
+ * @details 构型管理器的初始化接口函数
*/
virtual bool Initialize() override;
/**
* @brief 仿真运行前最后处理
- * @note 运行环境描述管理器在系统运行开始前的准备工作
+ * @note 构型管理器在系统运行开始前的准备工作
*/
virtual bool PrepareForExecute() override;
/**
- * @brief 运行环境配置文件解析
- * @param XmlPath: std::string类型,运行环境配置文件解析路径
+ * @brief 构型配置文件解析
+ * @param XmlPath: std::string类型,构型配置文件解析路径
* @param initialType: uint32_t类型,初始化类型
* @return true: 解析成功
* @return false: 解析失败
@@ -79,16 +79,16 @@ public:
private:
/**
- * @brief 解析运行环境配置文件
- * @param XmlPath: std::string类型,运行环境配置文件解析路径
+ * @brief 解析构型配置文件
+ * @param XmlPath: std::string类型,构型配置文件解析路径
* @return true: 解析成功
* @return false: 解析失败
*/
bool ParseScenarioXml(const std::string &XmlPath);
/**
- * @brief 解析构型配置文件
- * @param ConfigID: std::string类型,构型配置文件在数据库中的ID
+ * @brief 解析数据库构型配置
+ * @param ConfigID: std::string类型,构型配置在数据库中的ID
* @return true: 解析成功
* @return false: 解析失败
*/
diff --git a/XNCore/XNDDSInterface.h b/XNCore/XNDDSInterface.h
index 1c43e70..bfc6f65 100644
--- a/XNCore/XNDDSInterface.h
+++ b/XNCore/XNDDSInterface.h
@@ -75,7 +75,7 @@ protected:
}
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 78");
+ "A01161001:T 必须是算术类型或std::array类型");
}
return result;
@@ -109,7 +109,7 @@ protected:
setByteArrayFromStdArray(data.value(), thisArray);
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 112");
+ "A01161002:T 必须是算术类型或std::array类型");
}
}
@@ -132,7 +132,7 @@ protected:
getTypeSize());
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 135");
+ "A01161003:T 必须是算术类型或std::array类型");
}
}
@@ -158,7 +158,7 @@ protected:
setByteArrayFromStdArray(data[i], subArray);
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 160");
+ "A01161004:T 必须是算术类型或std::array类型");
}
}
}
@@ -186,7 +186,7 @@ protected:
}
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 188");
+ "A01161005:T 必须是算术类型或std::array类型");
}
return std::string();
}
@@ -214,6 +214,7 @@ protected:
items.push_back(item);
}
if (items.size() != getArrayWholeSize()) {
+ LOG_WARNING("A01163006:数组大小不一致, 设置数据失败!");
return;
}
T temp;
@@ -221,7 +222,7 @@ protected:
data = temp;
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 220");
+ "A01161007:T 必须是算术类型或std::array类型");
}
}
@@ -249,7 +250,7 @@ protected:
ss << getStringFromStdArray(data[i]);
} else {
static_assert(std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 243");
+ "A01161008:T 必须是算术类型或std::array类型");
}
}
return ss.str();
@@ -281,13 +282,11 @@ protected:
// 对于嵌套数组,递归处理
start_pos = setStdArrayFromString(data[i], value, start_pos);
} else {
- static_assert(
- std::is_arithmetic_v || is_std_array_v,
- "T 必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 275");
+ static_assert(std::is_arithmetic_v || is_std_array_v,
+ "A01161009:T 必须是算术类型或std::array类型");
}
} catch (const std::exception &e) {
- throw std::runtime_error("无法解析第 " + std::to_string(i)
- + " 个元素: " + e.what());
+ LOG_WARNING("A01163010:无法解析第 %1 个元素: %2", i, e.what());
}
}
return start_pos + N;
@@ -299,10 +298,9 @@ protected:
if (data) {
auto temp = data.value();
if constexpr (std::is_arithmetic_v) {
- static_assert(std::is_arithmetic_v,
- "模板参数T2必须是算术类型,详见XNDDSInterface.cpp:line 293");
+ static_assert(std::is_arithmetic_v, "A01161011:模板参数T2必须是算术类型");
static_assert(std::is_convertible_v,
- "模板参数T1必须可以转换为T2类型,详见XNDDSInterface.cpp:line 295");
+ "A01161012:模板参数T1必须可以转换为T2类型");
model_data = temp;
} else if constexpr (is_std_array_v) {
size_t arraySize = array_size_v;
@@ -320,21 +318,19 @@ protected:
}
} else {
static_assert(std::is_arithmetic_v,
- "模板参数T1是std::"
- "array类型时,它的数组嵌套不能超过两层,详见XNDDSInterfac"
- "e.cpp:line 313");
+ "A01161013:模板参数T1是std::"
+ "array类型时,它的数组嵌套不能超过两层");
}
} else {
- static_assert(
- std::is_arithmetic_v || is_std_array_v,
- "模板参数T1是std::array类型时,它的value_"
- "type必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 320");
+ static_assert(std::is_arithmetic_v
+ || is_std_array_v,
+ "A01161014:模板参数T1是std::array类型时,它的value_"
+ "type必须是算术类型或std::array类型");
}
}
} else {
- static_assert(
- std::is_arithmetic_v || is_std_array_v,
- "模板参数T1必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 326");
+ static_assert(std::is_arithmetic_v || is_std_array_v,
+ "A01161015:模板参数T1必须是算术类型或std::array类型");
}
}
}
@@ -343,10 +339,9 @@ protected:
void assign_value_set(eprosima::fastcdr::optional &data, const T2 &model_data)
{
if constexpr (std::is_arithmetic_v) {
- static_assert(std::is_arithmetic_v,
- "模板参数T2必须是算术类型,详见XNDDSInterface.cpp:line 337");
+ static_assert(std::is_arithmetic_v, "A01161016:模板参数T2必须是算术类型");
static_assert(std::is_convertible_v,
- "模板参数T2必须可以转换为T1类型,详见XNDDSInterface.cpp:line 339");
+ "A01161017:模板参数T2必须可以转换为T1类型");
data = model_data;
} else if constexpr (is_std_array_v) {
T1 temp;
@@ -363,23 +358,20 @@ protected:
temp[i][j] = model_data[i][j];
}
} else {
- static_assert(std::is_arithmetic_v,
- "模板参数T1是std::"
- "array类型时,它的数组嵌套不能超过两层,详见XNDDSInterface."
- "cpp:line 357");
+ static_assert(
+ std::is_arithmetic_v,
+ "A01161018:模板参数T1是std::array类型时,它的数组嵌套不能超过两层");
}
} else {
- static_assert(
- std::is_arithmetic_v || is_std_array_v,
- "模板参数T1是std::array类型时,它的value_"
- "type必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 364");
+ static_assert(std::is_arithmetic_v || is_std_array_v,
+ "A01161019:模板参数T1是std::array类型时,它的value_"
+ "type必须是算术类型或std::array类型");
}
}
data = temp;
} else {
- static_assert(
- std::is_arithmetic_v || is_std_array_v,
- "模板参数T1必须是算术类型或std::array类型,详见XNDDSInterface.cpp:line 371");
+ static_assert(std::is_arithmetic_v || is_std_array_v,
+ "A01161020:模板参数T1必须是算术类型或std::array类型");
}
}
diff --git a/XNCore/XNDDSManager.cpp b/XNCore/XNDDSManager.cpp
index 25ebfcf..2fb0f94 100755
--- a/XNCore/XNDDSManager.cpp
+++ b/XNCore/XNDDSManager.cpp
@@ -20,7 +20,7 @@ bool XNDDSManager::Initialize()
d->_status = XNFrameObjectStatus::Initialized;
d->participant_ = nullptr;
d->topics_.clear();
- LOG_INFO("DDS管理器初始化成功!");
+ LOG_INFO("D01104009:DDS管理器初始化成功!");
return true;
}
@@ -28,7 +28,7 @@ bool XNDDSManager::PrepareForExecute()
{
T_D();
d->_status = XNFrameObjectStatus::Ready;
- LOG_INFO("DDS管理器准备就绪!");
+ LOG_INFO("D01104010:DDS管理器准备就绪!");
return true;
}
@@ -40,6 +40,7 @@ void XNDDSManager::SetDomainID(uint32_t domainID)
d->participant_ = FAST_DDS_MACRO::DomainParticipantFactory::get_instance()->create_participant(
domainID, participantQos);
if (d->participant_ == nullptr) {
- LOG_ERROR("0x2130 DDS管理器创建域参与者失败!");
+ LOG_ERROR("C01102011:DDS管理器创建域参与者失败!");
}
+ LOG_INFO("D01104012:DDS管理器创建域参与者成功!");
}
diff --git a/XNCore/XNDDSManager.h b/XNCore/XNDDSManager.h
index 216edbf..b87d9de 100755
--- a/XNCore/XNDDSManager.h
+++ b/XNCore/XNDDSManager.h
@@ -77,7 +77,7 @@ public:
tmp.topic = d->participant_->create_topic(topicName, typeSupport.get_type_name(),
FAST_DDS_MACRO::TOPIC_QOS_DEFAULT);
if (tmp.topic == nullptr) {
- LOG_ERROR("0x2130 Create Topic %1 Failed!", topicName);
+ LOG_ERROR("C01102001:创建主题 %1 失败!", topicName);
d->topics_.erase(topicName);
return nullptr;
}
@@ -87,7 +87,7 @@ public:
tmp.publishers_[publisherID].publisher =
d->participant_->create_publisher(FAST_DDS_MACRO::PUBLISHER_QOS_DEFAULT, 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;
}
@@ -107,10 +107,11 @@ public:
tmp.publishers_[publisherID].publisher->create_datawriter(tmp.topic, dataWriterQos,
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;
}
- LOG_INFO("0x2133 Create Publisher %1 for Topic %2 Success!", publisherID, topicName);
+ LOG_INFO("D01104004:创建主题 %1 的发布者 %2 的数据写入器成功!", topicName, publisherID);
return tmp.publishers_[publisherID].dataWriter;
}
@@ -128,7 +129,7 @@ public:
tmp.topic = d->participant_->create_topic(topicName, typeSupport.get_type_name(),
FAST_DDS_MACRO::TOPIC_QOS_DEFAULT);
if (tmp.topic == nullptr) {
- LOG_ERROR("0x2130 Create Topic %1 Failed!", topicName);
+ LOG_ERROR("C01102005:创建主题 %1 失败!", topicName);
d->topics_.erase(topicName);
return;
}
@@ -138,7 +139,7 @@ public:
tmp.subscribers_[subscriberID].subscriber =
d->participant_->create_subscriber(FAST_DDS_MACRO::SUBSCRIBER_QOS_DEFAULT, 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;
dataReaderQos.durability().kind = FAST_DDS_MACRO::VOLATILE_DURABILITY_QOS;
@@ -148,8 +149,9 @@ public:
tmp.subscribers_[subscriberID].subscriber->create_datareader(tmp.topic, dataReaderQos,
listener);
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);
}
};
diff --git a/XNCore/XNEventManager.cpp b/XNCore/XNEventManager.cpp
index ff0e258..005ed10 100755
--- a/XNCore/XNEventManager.cpp
+++ b/XNCore/XNEventManager.cpp
@@ -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,
uint32_t objectId, bool async, XNEvent::Priority priority)
{
T_D();
if (eventName.empty() || !callback) {
- LOG_WARNING("Invalid event name or callback!");
+ LOG_WARNING("A01093003:注册的事件名称或回调函数为空,注册失败!");
return -1;
}
@@ -63,9 +89,8 @@ int XNEventManager::RegisterEventHandler(const std::string &eventName, XNEventCa
// 添加反向映射
d->handlerToEvent[handlerId] = eventName;
- LOG_INFO("Registered " + std::string(async ? "async" : "sync") + " event handler for event: "
- + eventName + ", handler ID: " + std::to_string(handlerId) + " (object: "
- + std::to_string(objectId) + ", local: " + std::to_string(d->localIdCounter) + ")");
+ LOG_INFO("D01094004:注册 %1 事件处理器, 事件名称: %2, 处理器ID: %3 (对象ID: %4, 本地ID: %5)",
+ async ? "异步" : "同步", eventName, handlerId, objectId, d->localIdCounter);
return handlerId;
}
@@ -79,7 +104,7 @@ bool XNEventManager::RemoveEventHandler(const std::string &eventName, int handle
if (!eventName.empty()) {
auto it = d->eventHandlers.find(eventName);
if (it == d->eventHandlers.end()) {
- LOG_WARNING("Event " + eventName + " not found!");
+ LOG_WARNING("B01093005:移除事件 %1 时, 事件不存在!", eventName);
return false;
}
@@ -92,8 +117,7 @@ bool XNEventManager::RemoveEventHandler(const std::string &eventName, int handle
if (handlerIt != handlers.end()) {
handlers.erase(handlerIt);
d->handlerToEvent.erase(handlerId);
- LOG_INFO("Removed handler ID " + std::to_string(handlerId)
- + " from event: " + eventName);
+ LOG_INFO("D01094006:移除事件 %1 的处理器ID: %2", eventName, handlerId);
// 如果事件没有处理器了,移除整个事件
if (handlers.empty()) {
@@ -101,8 +125,7 @@ bool XNEventManager::RemoveEventHandler(const std::string &eventName, int handle
}
return true;
}
- LOG_WARNING("Handler ID " + std::to_string(handlerId)
- + " not found in event: " + eventName);
+ LOG_WARNING("B01093007:移除事件 %1 的处理器ID: %2 时, 处理器不存在!", eventName, handlerId);
return false;
}
@@ -119,8 +142,7 @@ bool XNEventManager::RemoveEventHandler(const std::string &eventName, int handle
if (handlerIt != handlers.end()) {
handlers.erase(handlerIt);
d->handlerToEvent.erase(handlerId);
- LOG_INFO("Removed handler ID " + std::to_string(handlerId)
- + " from event: " + eventToRemove);
+ LOG_INFO("D01094008:移除事件 %1 的处理器ID: %2", eventToRemove, handlerId);
// 如果事件没有处理器了,移除整个事件
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;
}
@@ -167,8 +189,8 @@ void XNEventManager::TriggerEvent(const std::string &eventName, const std::any &
handler.callback(eventData);
EventProcessed(eventName, true);
} catch (const std::exception &e) {
- LOG_ERROR("Exception in handler " + std::to_string(handler.GetHandlerId())
- + " for event " + eventName + ": " + e.what());
+ LOG_ERROR("B01092010:事件 %1 的处理器ID: %2 执行时发生异常: %3", eventName,
+ handler.GetHandlerId(), e.what());
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
@@ -227,33 +249,6 @@ void XNEventManager::WaitForAsyncEvents()
T_D();
std::unique_lock lock(d->taskMutex);
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)
@@ -263,7 +258,7 @@ void XNEventManager::SetRTThreadPoolConfig(int maxThreads, int minPriority, int
XNFrameworkPtr framework = GetFramework();
if (!framework) {
- LOG_WARNING("XNFramework is nullptr!");
+ LOG_WARNING("B01093012:主框架指针为空,无法设置实时线程池配置!");
return;
}
@@ -278,10 +273,10 @@ void XNEventManager::SetRTThreadPoolConfig(int maxThreads, int minPriority, int
}
if (lastCpu < 0) {
- LOG_WARNING("No available CPU found in affinity mask, using default CPU 1");
+ LOG_WARNING("B01093013:没有可用的CPU,使用默认CPU 1");
lastCpu = 1;
} else {
- LOG_INFO("RT thread bound to CPU " + std::to_string(lastCpu));
+ LOG_INFO("D01094014:实时事件处理线程绑定到CPU %1", lastCpu);
}
d->rtManager.start(maxThreads, maxPriority, lastCpu);
diff --git a/XNCore/XNFramework.cpp b/XNCore/XNFramework.cpp
index 19a4f6b..664c4ae 100755
--- a/XNCore/XNFramework.cpp
+++ b/XNCore/XNFramework.cpp
@@ -82,7 +82,7 @@ void XNFramework::SetCpuAffinity(uint32_t cpuAffinity)
bool XNFramework::Initialize(uint32_t initialType)
{
T_D();
- LOG_INFO("D01054001:主框架正在初始化...");
+ LOG_INFO("D01054001:主框架正在初始化...");
d->ddsManager->SetFramework(XN_THISPTR);
d->timeManager->SetFramework(XN_THISPTR);
d->threadManager->SetFramework(XN_THISPTR);
@@ -92,47 +92,47 @@ bool XNFramework::Initialize(uint32_t initialType)
d->eventManager->SetFramework(XN_THISPTR);
bool ret = d->eventManager->Initialize();
if (!ret) {
- LOG_ERROR("B01052001:主框架初始化失败!");
+ LOG_ERROR("B01052002:主框架初始化失败!");
return false;
}
ret = d->timeManager->Initialize();
if (!ret) {
- LOG_ERROR("B01052002:主框架初始化失败!");
+ LOG_ERROR("B01052003:主框架初始化失败!");
return false;
}
ret = d->ddsManager->Initialize();
if (!ret) {
- LOG_ERROR("B01052003:主框架初始化失败!");
+ LOG_ERROR("B01052004:主框架初始化失败!");
return false;
}
ret = d->serviceManager->Initialize();
if (!ret) {
- LOG_ERROR("B01052004:主框架初始化失败!");
+ LOG_ERROR("B01052005:主框架初始化失败!");
return false;
}
ret = d->threadManager->Initialize();
if (!ret) {
- LOG_ERROR("B01052005:主框架初始化失败!");
+ LOG_ERROR("B01052006:主框架初始化失败!");
return false;
}
ret = d->modelManager->Initialize();
if (!ret) {
- LOG_ERROR("B01052006:主框架初始化失败!");
+ LOG_ERROR("B01052007:主框架初始化失败!");
return false;
}
ret = d->scenarioManager->Initialize();
if (!ret) {
- LOG_ERROR("B01052007:主框架初始化失败!");
+ LOG_ERROR("B01052008:主框架初始化失败!");
return false;
}
- LOG_INFO("D01054002:主框架初始化成功!");
- LOG_INFO("D01054003:开始解析构型文件 ...");
+ LOG_INFO("D01054009:主框架初始化成功!");
+ LOG_INFO("D01054010:开始解析构型文件 ...");
ret = d->scenarioManager->AnalysisScenarioXml(d->scenarioXml, initialType);
if (!ret) {
- LOG_ERROR("B01052008:主框架解析构型文件失败!");
+ LOG_ERROR("B01052011:主框架解析构型失败!");
return false;
}
- LOG_INFO("D01054004:解析构型文件成功!");
+ LOG_INFO("D01054012:解析构型成功!");
return true;
}
@@ -142,40 +142,40 @@ bool XNFramework::PrepareForExecute()
bool ret = d->eventManager->PrepareForExecute();
if (!ret) {
- LOG_ERROR("XNFramework PrepareForExecute Failed!");
+ LOG_ERROR("B01052013:主框架准备执行失败!");
return false;
}
ret = d->timeManager->PrepareForExecute();
if (!ret) {
- LOG_ERROR("XNFramework PrepareForExecute Failed!");
+ LOG_ERROR("B01052014:主框架准备执行失败!");
return false;
}
ret = d->ddsManager->PrepareForExecute();
if (!ret) {
- LOG_ERROR("XNFramework PrepareForExecute Failed!");
+ LOG_ERROR("B01052015:主框架准备执行失败!");
return false;
}
ret = d->serviceManager->PrepareForExecute();
if (!ret) {
- LOG_ERROR("XNFramework PrepareForExecute Failed!");
+ LOG_ERROR("B01052016:主框架准备执行失败!");
return false;
}
ret = d->threadManager->PrepareForExecute();
if (!ret) {
- LOG_ERROR("XNFramework PrepareForExecute Failed!");
+ LOG_ERROR("B01052017:主框架准备执行失败!");
return false;
}
ret = d->modelManager->PrepareForExecute();
if (!ret) {
- LOG_ERROR("XNFramework PrepareForExecute Failed!");
+ LOG_ERROR("B01052018:主框架准备执行失败!");
return false;
}
ret = d->scenarioManager->PrepareForExecute();
if (!ret) {
- LOG_ERROR("XNFramework PrepareForExecute Failed!");
+ LOG_ERROR("B01052019:主框架准备执行失败!");
return false;
}
- LOG_INFO("XNCore is prepared for execute! Simulation will start soon...");
+ LOG_INFO("D01054020:主框架准备就绪!");
return true;
}
diff --git a/XNCore/XNModelManager.cpp b/XNCore/XNModelManager.cpp
index 93be25d..b75ab92 100755
--- a/XNCore/XNModelManager.cpp
+++ b/XNCore/XNModelManager.cpp
@@ -34,6 +34,14 @@ XNModelManager::XNModelManager(PrivateType *p) : XNBaseFrameObject(p)
d->ModelIDAssigned.resize(10000, false);
}
+bool XNModelManager::Initialize()
+{
+ T_D();
+ LOG_INFO("D01114001:模型管理器初始化成功!");
+ d->_status = XNFrameObjectStatus::Initialized;
+ return true;
+}
+
// 运行前最后准备
bool XNModelManager::PrepareForExecute()
{
@@ -42,15 +50,7 @@ bool XNModelManager::PrepareForExecute()
model.second->PrepareForExecute();
}
d->_status = XNFrameObjectStatus::Ready;
- LOG_INFO("XNModelManager is prepared!");
- return true;
-}
-
-bool XNModelManager::Initialize()
-{
- T_D();
- LOG_INFO("XNModelManager Initialize Success!");
- d->_status = XNFrameObjectStatus::Initialized;
+ LOG_INFO("D01114002:模型管理器准备就绪!");
return true;
}
@@ -69,7 +69,7 @@ void XNModelManager::LoadModel(const std::string &modelPath, const std::string &
if (model) {
uint32_t modelID = RegisterModel();
if (modelID == 0) {
- LOG_WARNING("0x2174 Assign Model ID Failed, Model ID is used up!");
+ LOG_WARNING("B01113003:分配模型ID失败, 模型ID已用完, 模型无法注册!");
dlclose(handle);
return;
}
@@ -112,20 +112,17 @@ void XNModelManager::LoadModel(const std::string &modelPath, const std::string &
}
}
} else {
- LOG_WARNING("0x2173 Model %s Not found in dynamic link library %s!",
- className.c_str(), modelPath.c_str());
+ LOG_WARNING("B01113004:动态链接库 %1 中未找到模型 %2!", modelPath, className);
dlclose(handle);
return;
}
} else {
- LOG_WARNING("0x2177 InitialModel function not found in dynamic link library %s!",
- modelPath.c_str());
+ LOG_WARNING("B01113005:动态链接库 %1 中未找到 %2 函数!", modelPath, initialModelName);
dlclose(handle);
return;
}
} else {
- LOG_WARNING("0x2172 Model %s Dynamic link library loading failed! Error: %s",
- className.c_str(), dlerror());
+ LOG_WARNING("C01113006:动态链接库 %1 加载失败! 错误: %2", modelPath, dlerror());
}
}
@@ -149,29 +146,34 @@ uint32_t XNModelManager::RegisterModel()
XNModelObjectPtr XNModelManager::GetModel(uint32_t modelID)
{
T_D();
- if (d->ModelIDAssigned[modelID - 10000]) {
- auto model = d->ModelMap.find(modelID);
- if (model != d->ModelMap.end()) {
- return model->second;
+ if (modelID >= 10000 && modelID < 20000) {
+ if (d->ModelIDAssigned[modelID - 10000]) {
+ auto model = d->ModelMap.find(modelID);
+ if (model != d->ModelMap.end()) {
+ return model->second;
+ }
+ LOG_WARNING("B01113007:模型ID %1 对应的模型不存在!", modelID);
+ return nullptr;
}
+ LOG_WARNING("B01113008:模型ID %1 未注册!", modelID);
return nullptr;
- } else
+ } else {
+ LOG_WARNING("B01113009:模型ID %1 不合法!", modelID);
return nullptr;
+ }
}
void XNModelManager::RegisterFunction(uint32_t id, XNCallBack fun, uint32_t threadID,
uint32_t freqGroup, uint32_t RunPos, uint32_t RunPriorty)
{
T_D();
- if (d->ModelIDAssigned[id - 10000]) {
+ if (GetModel(id) != nullptr) {
auto framework = GetFramework();
if (framework) {
framework->GetThreadManager()->RegisterFunction(id, fun, threadID, freqGroup, RunPos,
RunPriorty);
}
} else {
- LOG_WARNING(
- "0x2177 Submission of periodic function was rejected, model ID %1 is not registered!",
- id);
+ LOG_WARNING("B01113010:模型ID %1 注册周期性函数失败, 模型不存在!", id);
}
}
\ No newline at end of file
diff --git a/XNCore/XNModelObject.cpp b/XNCore/XNModelObject.cpp
index 1d52e39..71aa287 100755
--- a/XNCore/XNModelObject.cpp
+++ b/XNCore/XNModelObject.cpp
@@ -221,22 +221,21 @@ void XNModelObject::ParseXml()
// 读取配置文件,设置循环执行函数
std::ifstream file(GetXmlPath());
if (!file.is_open()) {
- LOG_WARNING("0x2161 Failed to open the model configuration file: %1!", GetXmlPath());
+ LOG_WARNING("C01143001:模型配置文件 %1 打开失败!", GetXmlPath());
return;
}
tinyxml2::XMLDocument doc;
doc.LoadFile(GetXmlPath().c_str());
tinyxml2::XMLElement *rootNode = doc.FirstChildElement("Model");
if (!rootNode) {
- LOG_WARNING("0x2161 Failed to parse model configuration file: %1!", GetXmlPath());
+ LOG_WARNING("C01143002:模型配置文件 %1 解析失败!", GetXmlPath());
return;
}
// 读取配置文件的模型参数
const char *modelName = rootNode->FirstChildElement("Name")->GetText();
if (!modelName || std::string(modelName) != GetObjectName()) {
- LOG_WARNING("0x2162 The model name in the configuration file of model %1 is not consistent "
- "with the model name in the configuration file of model %2!",
- GetObjectName(), modelName ? modelName : "null");
+ LOG_WARNING("A01143003:模型配置文件 %1 中模型名称不一致, 模型名称: %2, 配置文件中名称: %3!",
+ GetXmlPath(), GetObjectName(), modelName ? modelName : "null");
return;
}
d->_sDescription = rootNode->FirstChildElement("Description")->GetText();
@@ -255,9 +254,8 @@ void XNModelObject::ParseXml()
// 检查运行节点是否是 "x-x" 形式
size_t tmp = funcNode.find('-');
if (tmp == std::string::npos || tmp == 0) {
- LOG_WARNING("0x2162 The value of the run node attribute in the configuration file of model "
- "%1 is not in the x-x format, registration not executed!",
- GetObjectName());
+ LOG_WARNING("A01143004:模型配置文件 %1 中运行节点属性值 %2 不是 x-x 格式!", GetXmlPath(),
+ funcNode);
return;
}
@@ -286,13 +284,10 @@ void XNModelObject::ParseXml()
// 使用标准C++动态库加载
d->_dynamicLib = dlopen(d->_sLibPath.c_str(), RTLD_LAZY);
if (d->_dynamicLib) { // 动态库加载成功
- LOG_INFO("0x2163 Model %1 loaded algorithm dynamic library %2 successfully!",
- GetObjectName(), d->_sLibPath);
+ LOG_INFO("D01144005:模型 %1 加载数据包动态库 %2 成功!", GetObjectName(), d->_sLibPath);
} else {
- LOG_WARNING(
- "0x2160 Model %1 failed to find algorithm dynamic library %2, will not call "
- "algorithm!",
- GetObjectName(), d->_sLibPath);
+ LOG_WARNING("A01143006:模型 %1 加载数据包动态库 %2 失败, 将不调用数据包模型!",
+ GetObjectName(), d->_sLibPath);
d->_dynamicLib = nullptr;
}
}
@@ -320,7 +315,7 @@ void XNModelObject::ParseConfig()
// 获取数据库路径
std::string dbPath = std::getenv("XNCore");
if (dbPath.empty()) {
- LOG_ERROR("0x1015 未设置XNCore环境变量, 引擎将退出!");
+ LOG_ERROR("A01142007:未设置XNCore环境变量, 无法解析模型配置!");
return;
}
dbPath += "/database/XNSim.db";
@@ -328,7 +323,7 @@ void XNModelObject::ParseConfig()
// 打开数据库
sqlite3 *db;
if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) {
- LOG_ERROR("0x1016 打开数据库失败: %1", sqlite3_errmsg(db));
+ LOG_ERROR("C01142008:打开数据库失败: %1", sqlite3_errmsg(db));
return;
}
@@ -337,7 +332,7 @@ void XNModelObject::ParseConfig()
"SELECT * FROM XNModelsVersion WHERE PlaneName = ? AND ClassName = ? AND Version = ?";
sqlite3_stmt *stmt;
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);
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, 3, modelVersion.c_str(), modelVersion.length(), nullptr)
!= SQLITE_OK) {
- LOG_ERROR("0x1018 绑定参数失败: %1", sqlite3_errmsg(db));
+ LOG_ERROR("C01142010:绑定参数失败: %1", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
sqlite3_close(db);
return;
@@ -355,8 +350,8 @@ void XNModelObject::ParseConfig()
// 执行查询
if (sqlite3_step(stmt) != SQLITE_ROW) {
- LOG_ERROR("0x1019 未找到机型为%1,模型名称为%2,版本号%3的记录", planeName.c_str(),
- modelName.c_str(), modelVersion.c_str());
+ LOG_ERROR("A01142011:未找到机型为 %1, 模型名称为 %2, 版本号 %3 的记录", planeName,
+ modelName, modelVersion);
sqlite3_finalize(stmt);
sqlite3_close(db);
return;
@@ -396,9 +391,9 @@ void XNModelObject::ParseConfig()
// 使用标准C++动态库加载
d->_dynamicLib = dlopen(libPath.c_str(), RTLD_LAZY);
if (d->_dynamicLib) { // 动态库加载成功
- LOG_INFO("0x2163 模型 %1 加载数据包模型动态库 %2 成功!", GetObjectName(), libPath);
+ LOG_INFO("D01144012:模型 %1 加载数据包模型动态库 %2 成功!", GetObjectName(), libPath);
} else {
- LOG_WARNING("0x2160 模型 %1 未找到数据包模型动态库 %2, 将不调用数据包模型!",
+ LOG_WARNING("A01143013:模型 %1 加载数据包模型动态库 %2 失败, 将不调用数据包模型!",
GetObjectName(), libPath);
d->_dynamicLib = nullptr;
}
@@ -452,17 +447,21 @@ void XNModelObject::RegisterDDSParticipant()
T_D();
auto framework = GetFramework();
if (framework == nullptr) {
- LOG_WARNING("Failed to get Framework!");
+ LOG_WARNING("B01143014:获取主框架失败!");
return;
}
auto ddsManager = framework->GetDDSManager();
if (ddsManager == nullptr) {
- LOG_WARNING("Failed to get DDSManager!");
+ LOG_WARNING("B01143015:获取DDS管理器失败!");
return;
}
uint32_t MyID = GetUniqueId();
d->_dataWriter = ddsManager->RegisterPublisher(
"XNSim::XNSimStatus::XNModelStatus", MyID);
+ if (d->_dataWriter == nullptr) {
+ LOG_WARNING("B01143016:注册DDS参与者失败!");
+ return;
+ }
}
int XNModelObject::RegisterEventHandler(const std::string &eventName, XNEventCallback callback,
@@ -471,13 +470,13 @@ int XNModelObject::RegisterEventHandler(const std::string &eventName, XNEventCal
// 获取事件管理器
auto framework = GetFramework();
if (framework == nullptr) {
- LOG_WARNING("Failed to get Framework!");
+ LOG_WARNING("B01143017:获取主框架失败!");
return -1;
}
XNEventManagerPtr eventManager = framework->GetEventManager();
if (eventManager == nullptr) {
- LOG_WARNING("Failed to get EventManager!");
+ LOG_WARNING("B01143018:获取事件管理器失败!");
return -1;
}
@@ -491,13 +490,13 @@ void XNModelObject::TriggerEvent(const std::string &eventName, const std::any &e
// 获取事件管理器
auto framework = GetFramework();
if (framework == nullptr) {
- LOG_WARNING("Failed to get Framework!");
+ LOG_WARNING("B01143019:获取主框架失败!");
return;
}
XNEventManagerPtr eventManager = framework->GetEventManager();
if (eventManager == nullptr) {
- LOG_WARNING("Failed to get EventManager!");
+ LOG_WARNING("B01143020:获取事件管理器失败!");
return;
}
diff --git a/XNCore/XNScenarioManager.cpp b/XNCore/XNScenarioManager.cpp
index 1f07ecb..8307724 100755
--- a/XNCore/XNScenarioManager.cpp
+++ b/XNCore/XNScenarioManager.cpp
@@ -1,7 +1,7 @@
/**
* @file XNScenarioManager.cpp
* @author jinchao
- * @brief 运行环境描述管理器类源文件
+ * @brief 构型管理器类源文件
* @version 1.0
* @date 2024-11-07
*
@@ -53,7 +53,7 @@ void XNScenarioManager::SetSimName(const std::string &simName)
bool XNScenarioManager::Initialize()
{
T_D();
- LOG_INFO("XNScenarioManager Initialize Success!");
+ LOG_INFO("D01084001:构型管理器初始化成功!");
d->_status = XNFrameObjectStatus::Initialized;
return true;
}
@@ -62,11 +62,11 @@ bool XNScenarioManager::PrepareForExecute()
{
T_D();
d->_status = XNFrameObjectStatus::Ready;
- LOG_INFO("XNScenarioManager is prepared!");
+ LOG_INFO("D01084002:构型管理器准备就绪!");
return true;
}
-// 运行环境配置文件解析
+// 构型配置文件解析
bool XNScenarioManager::AnalysisScenarioXml(const std::string &XmlPath, uint32_t initialType)
{
T_D();
@@ -77,18 +77,18 @@ bool XNScenarioManager::AnalysisScenarioXml(const std::string &XmlPath, uint32_t
}
}
-// 解析运行环境描述文件
+// 解析构型配置文件
bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath)
{
T_D();
std::ifstream file(XmlPath);
if (!file.is_open()) {
- LOG_ERROR("0x2100 打开运行环境描述文件: %1出错,错误信息: %2", XmlPath, strerror(errno));
+ LOG_ERROR("C01082003:打开构型配置文件 %1 出错, 错误信息: %2", XmlPath, strerror(errno));
return false;
}
tinyxml2::XMLDocument doc;
if (doc.LoadFile(XmlPath.c_str()) != tinyxml2::XML_SUCCESS) {
- LOG_ERROR("0x2100 解析XML文件: %1 失败", XmlPath);
+ LOG_ERROR("C01082004:构型配置文件 %1 的XML解析失败!", XmlPath);
file.close();
return false;
}
@@ -110,6 +110,10 @@ bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath)
GetFramework()->SetServicePath(servicePath);
// 设置域ID
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);
// 读取CPU亲和性
std::string cpuAff = envInfo->Attribute("CPUAffinity");
@@ -126,6 +130,7 @@ bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath)
libName = XNSim::getFileNameWithoutExt(libName);
std::string dynamicLibName = servicePath + "/lib" + libName + ".so." + serviceVersion;
// 加载动态库
+ LOG_INFO("D01084006:正在加载服务 %1", dynamicLibName);
GetFramework()->GetServiceManager()->LoadService(dynamicLibName, libName,
serviceVersion, 0);
service = service->NextSiblingElement("Service");
@@ -142,7 +147,8 @@ bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath)
// 读取模型分组优先级
int modelGroupPriority = XNSim::safe_stoi(modelGroup->Attribute("Priority"));
if (modelGroupPriority > 99 || modelGroupPriority < 0) {
- LOG_ERROR("0x2100 模型分组优先级设置错误,优先级值:%d", modelGroupPriority);
+ LOG_ERROR("A01082007:模型组 %1 优先级设置错误(0~99),优先级值:%2", modelGroupName,
+ modelGroupPriority);
return false;
}
// 读取模型分组CPU亲和性
@@ -152,8 +158,9 @@ bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath)
// 验证CPU亲和性
for (const auto &cpu : modelGroupCPUAffList) {
if (std::find(cpuAffList.begin(), cpuAffList.end(), cpu) == cpuAffList.end()) {
- LOG_ERROR("0x2100 模型分组CPU亲和性设置错误,CPU亲和性值:%s,进程CPU亲和性值:%s",
- cpu.c_str(), cpuAff.c_str());
+ LOG_ERROR(
+ "A01082008:模型组 %1 的CPU亲和性设置错误, CPU亲和性值: %2,进程CPU亲和性值: %3",
+ modelGroupName, cpu.c_str(), cpuAff.c_str());
return false;
}
}
@@ -179,6 +186,7 @@ bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath)
libName = XNSim::getFileNameWithoutExt(libName);
std::string dynamicLibName = modelPath + "/lib" + libName + ".so." + modelVersion;
// 加载动态库
+ LOG_INFO("D01084009:正在加载模型 %1", dynamicLibName);
GetFramework()->GetModelManager()->LoadModel(dynamicLibName, libName, modelVersion,
planeName, 0, threadID);
model = model->NextSiblingElement("Model");
@@ -197,7 +205,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 获取数据库路径
std::string XNCorePath = std::getenv("XNCore");
if (XNCorePath.empty()) {
- LOG_ERROR("0x1015 未设置XNCore环境变量, 引擎将退出!");
+ LOG_ERROR("A01082010:使用数据库构型配置时必须设置XNCore环境变量!");
return false;
}
std::string dbPath = XNCorePath + "/database/XNSim.db";
@@ -205,7 +213,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 打开数据库
sqlite3 *db;
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;
}
@@ -213,7 +221,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
std::string sql = "SELECT * FROM Configuration WHERE ConfID = ?";
sqlite3_stmt *stmt;
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);
return false;
}
@@ -221,7 +229,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 绑定参数
int configIdInt = XNSim::safe_stoi(ConfigID);
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_close(db);
return false;
@@ -229,7 +237,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 执行查询
if (sqlite3_step(stmt) != SQLITE_ROW) {
- LOG_ERROR("0x1019 未找到配置ID为%1的记录", ConfigID);
+ LOG_ERROR("A01082014:未在数据库中找到配置ID为 %1 的记录", ConfigID);
sqlite3_finalize(stmt);
sqlite3_close(db);
return false;
@@ -250,7 +258,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 设置域ID
uint32_t domainID = std::stoul(XNSim::getStringFromSqlite3(stmt, 7));
if (domainID == 0 || domainID > 225) {
- LOG_WARNING("0x1020 域ID设置错误,使用默认域ID: 10");
+ LOG_WARNING("A01083015:DDS通信域ID设置错误, 使用默认域ID: 10");
domainID = 10;
}
GetFramework()->GetDDSManager()->SetDomainID(domainID);
@@ -262,14 +270,16 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
std::string servicesSql = "SELECT * FROM LoadServices WHERE ConfID = ?";
sqlite3_stmt *servicesStmt;
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_close(db);
return false;
}
// 绑定参数
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(stmt);
sqlite3_close(db);
@@ -286,6 +296,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
ClassName = XNSim::getFileNameWithoutExt(ClassName);
std::string dynamicLibName = servicePath + "/lib" + ClassName + ".so." + ServiceVersion;
// 加载动态库
+ LOG_INFO("D01084018:正在加载服务 %1", dynamicLibName);
GetFramework()->GetServiceManager()->LoadService(dynamicLibName, ClassName, ServiceVersion,
1);
}
@@ -295,7 +306,8 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
sqlite3_stmt *modelGroupsStmt;
if (sqlite3_prepare_v2(db, modelGroupsSql.c_str(), -1, &modelGroupsStmt, nullptr)
!= SQLITE_OK) {
- LOG_ERROR("0x1020 准备LoadModelGroups查询语句失败: %1", sqlite3_errmsg(db));
+ LOG_ERROR("C01082019:数据库查询时准备LoadModelGroups表的SQL查询语句失败, 错误信息: %1",
+ sqlite3_errmsg(db));
sqlite3_finalize(servicesStmt);
sqlite3_finalize(stmt);
sqlite3_close(db);
@@ -304,7 +316,8 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 绑定参数
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(servicesStmt);
sqlite3_finalize(stmt);
@@ -315,18 +328,29 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
// 执行查询并处理结果
while (sqlite3_step(modelGroupsStmt) == SQLITE_ROW) {
// 获取模型组信息
- std::string GroupID = XNSim::getStringFromSqlite3(modelGroupsStmt, 1);
- std::string GroupName = XNSim::getStringFromSqlite3(modelGroupsStmt, 2);
- double GroupFreq = std::stod(XNSim::getStringFromSqlite3(modelGroupsStmt, 3));
- uint32_t GroupPriority = XNSim::safe_stoi(XNSim::getStringFromSqlite3(modelGroupsStmt, 4));
- std::string GroupCPUAff = XNSim::getStringFromSqlite3(modelGroupsStmt, 5);
+ std::string GroupID = XNSim::getStringFromSqlite3(modelGroupsStmt, 1);
+ std::string GroupName = XNSim::getStringFromSqlite3(modelGroupsStmt, 2);
+ double GroupFreq = std::stod(XNSim::getStringFromSqlite3(modelGroupsStmt, 3));
+ uint32_t GroupPriority = XNSim::safe_stoi(XNSim::getStringFromSqlite3(modelGroupsStmt, 4));
+ 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 GroupCPUAffList = XNSim::split(GroupCPUAff, ",");
// 验证CPU亲和性
for (const auto &cpu : GroupCPUAffList) {
if (std::find(cpuAffList.begin(), cpuAffList.end(), cpu) == cpuAffList.end()) {
- LOG_ERROR("0x2100 模型分组CPU亲和性设置错误,CPU亲和性值:%s,进程CPU亲和性值:%s",
- cpu.c_str(), cpuAff.c_str());
+ LOG_ERROR(
+ "A01082022:模型组 %1 的CPU亲和性设置错误, CPU亲和性值: %2,进程CPU亲和性值: %3",
+ GroupName, cpu.c_str(), cpuAff.c_str());
sqlite3_finalize(modelGroupsStmt);
sqlite3_finalize(servicesStmt);
sqlite3_finalize(stmt);
@@ -342,7 +366,6 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
ThreadCpuAffinity |= 1 << std::distance(cpuAffList.begin(), it);
}
}
- LOG_INFO("0x1021 添加线程池: %1", GroupName);
// 添加线程池
uint32_t threadID = GetFramework()->GetThreadManager()->AddThreadPool(
GroupName, GroupFreq, GroupPriority, ThreadCpuAffinity);
@@ -351,7 +374,8 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
std::string modelsSql = "SELECT * FROM LoadModels WHERE GroupID = ?";
sqlite3_stmt *modelsStmt = nullptr;
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(servicesStmt);
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) {
- LOG_ERROR("0x1023 绑定LoadModels参数失败: %1", sqlite3_errmsg(db));
+ LOG_ERROR("C01082024:数据库查询时绑定LoadModels表的参数失败, 错误信息: %1",
+ sqlite3_errmsg(db));
sqlite3_finalize(modelsStmt);
sqlite3_finalize(modelGroupsStmt);
sqlite3_finalize(servicesStmt);
@@ -380,7 +405,7 @@ bool XNScenarioManager::ParseConfig(const std::string &ConfigID)
ClassName = XNSim::getFileNameWithoutExt(ClassName);
std::string dynamicLibName = modelPath + "/lib" + ClassName + ".so." + ModelVersion;
// 加载动态库
- LOG_INFO("0x1021 加载模型: %1", dynamicLibName);
+ LOG_INFO("D01084025:正在加载模型 %1", dynamicLibName);
GetFramework()->GetModelManager()->LoadModel(dynamicLibName, ClassName, ModelVersion,
planeName, 1, threadID);
}
diff --git a/XNCore/XNScenarioManager.h b/XNCore/XNScenarioManager.h
index b659e78..ea8ea85 100755
--- a/XNCore/XNScenarioManager.h
+++ b/XNCore/XNScenarioManager.h
@@ -1,7 +1,7 @@
/**
* @file XNScenarioDescriptor.h
* @author jinchao
- * @brief 运行环境描述管理器类头文件
+ * @brief 构型管理器类头文件
* @version 1.0
* @date 2024-11-07
*
@@ -14,8 +14,8 @@
struct XNScenarioManagerPrivate;
/**
- * @brief 运行环境描述管理器类
- * @details 主要负责解析运行环境配置文件来设置系统运行参数。
+ * @brief 构型管理器类
+ * @details 主要负责解析构型配置来设置系统运行参数。
*/
class XNScenarioManager : public XNBaseFrameObject
{
@@ -23,18 +23,18 @@ class XNScenarioManager : public XNBaseFrameObject
XN_DECLARE_PRIVATE(XNScenarioManager)
public:
/**
- * @brief 运行环境描述管理器类默认构造函数
+ * @brief 构型管理器类默认构造函数
*/
XNScenarioManager();
/**
- * @brief 运行环境描述管理器类析构函数
+ * @brief 构型管理器类析构函数
*/
virtual ~XNScenarioManager();
protected:
/**
- * @brief 运行环境描述管理器类带参构造函数
+ * @brief 构型管理器类带参构造函数
* @param p:私有结构体指针
* @details 子类构造时调用此构造函数,传入子类的私有结构体指针
*/
@@ -55,22 +55,22 @@ public:
public:
/**
- * @brief 初始化运行环境描述管理器
+ * @brief 初始化构型管理器
* @return true: 初始化成功
* @return false: 初始化失败
- * @details 运行环境描述管理器的初始化接口函数
+ * @details 构型管理器的初始化接口函数
*/
virtual bool Initialize() override;
/**
* @brief 仿真运行前最后处理
- * @note 运行环境描述管理器在系统运行开始前的准备工作
+ * @note 构型管理器在系统运行开始前的准备工作
*/
virtual bool PrepareForExecute() override;
/**
- * @brief 运行环境配置文件解析
- * @param XmlPath: std::string类型,运行环境配置文件解析路径
+ * @brief 构型配置文件解析
+ * @param XmlPath: std::string类型,构型配置文件解析路径
* @param initialType: uint32_t类型,初始化类型
* @return true: 解析成功
* @return false: 解析失败
@@ -79,16 +79,16 @@ public:
private:
/**
- * @brief 解析运行环境配置文件
- * @param XmlPath: std::string类型,运行环境配置文件解析路径
+ * @brief 解析构型配置文件
+ * @param XmlPath: std::string类型,构型配置文件解析路径
* @return true: 解析成功
* @return false: 解析失败
*/
bool ParseScenarioXml(const std::string &XmlPath);
/**
- * @brief 解析构型配置文件
- * @param ConfigID: std::string类型,构型配置文件在数据库中的ID
+ * @brief 解析数据库构型配置
+ * @param ConfigID: std::string类型,构型配置在数据库中的ID
* @return true: 解析成功
* @return false: 解析失败
*/
diff --git a/XNCore/XNServiceManager.cpp b/XNCore/XNServiceManager.cpp
index cdce8a4..a7968ce 100755
--- a/XNCore/XNServiceManager.cpp
+++ b/XNCore/XNServiceManager.cpp
@@ -21,7 +21,7 @@ XNServiceManager::XNServiceManager(PrivateType *p) : XNBaseFrameObject(p)
bool XNServiceManager::Initialize()
{
T_D();
- LOG_INFO("XNServiceManager Initialize Success!");
+ LOG_INFO("D01124001:服务管理器初始化成功!");
d->_status = XNFrameObjectStatus::Initialized;
return true;
}
@@ -33,7 +33,7 @@ bool XNServiceManager::PrepareForExecute()
service.second->PrepareForExecute();
}
d->_status = XNFrameObjectStatus::Ready;
- LOG_INFO("XNServiceManager is prepared!");
+ LOG_INFO("D01124002:服务管理器准备就绪!");
return true;
}
@@ -52,7 +52,7 @@ void XNServiceManager::LoadService(const std::string &servicePath, const std::st
if (service) {
uint32_t serviceID = RegisterService();
if (serviceID == 0) {
- LOG_WARNING("0x2174 Assign Service ID Failed, Service ID is used up!");
+ LOG_WARNING("B01123003:分配服务ID失败, 服务ID已用完, 服务无法注册!");
dlclose(handle);
return;
}
@@ -65,49 +65,48 @@ void XNServiceManager::LoadService(const std::string &servicePath, const std::st
std::filesystem::path(servicePath).parent_path()
/ (serviceName + "_V" + serviceVersion + ".scfg");
service->SetXmlPath(configPath.string());
- } else if (initialType == 1) {
- LOG_INFO("0x2176 加载服务: %1", serviceName + "," + serviceVersion);
- service->SetXmlPath(serviceName + "," + serviceVersion);
} else {
- LOG_WARNING("0x2175 InitialType Error, InitialType: %d", initialType);
- dlclose(handle);
- return;
+ service->SetXmlPath(serviceName + "," + serviceVersion);
}
// 注册服务到管理器
d->ServiceList[serviceID] = service;
service->SetInitializeType(initialType);
// 初始化服务
- LOG_INFO("0x2176 初始化服务: %1", serviceName);
service->Initialize();
} else {
- LOG_WARNING("0x2173 Service %s Not found in dynamic link library %s!",
- serviceName.c_str(), servicePath.c_str());
+ LOG_WARNING("B01123004:动态链接库 %1 中未找到服务 %2!", servicePath, serviceName);
dlclose(handle);
return;
}
} else {
- LOG_WARNING(
- "0x2177 Service %s Initialization Failed, Function InitialService Not Found!",
- serviceName.c_str());
+ LOG_WARNING("B01123005:动态链接库 %1 中未找到函数 %2!", servicePath,
+ initialServiceName);
dlclose(handle);
return;
}
} else {
- LOG_WARNING("0x2172 Service %s Dynamic link library loading failed! Error: %s",
- serviceName.c_str(), dlerror());
+ LOG_WARNING("C01123006:动态链接库 %1 加载失败! 错误: %2", servicePath, dlerror());
}
}
XNServiceObjectPtr XNServiceManager::GetService(uint32_t serviceID)
{
T_D();
- if (d->ServiceIDAssigned[serviceID - 20000]
- && d->ServiceList.find(serviceID) != d->ServiceList.end()) {
- return d->ServiceList[serviceID];
- } else {
+ if (serviceID >= 20000 && serviceID < 30000) {
+ if (d->ServiceIDAssigned[serviceID - 20000]) {
+ if (d->ServiceList.find(serviceID) != d->ServiceList.end()) {
+ return d->ServiceList[serviceID];
+ } else {
+ LOG_WARNING("B01123007:服务ID %1 对应的模型不存在!", serviceID);
+ return nullptr;
+ }
+ }
+ LOG_WARNING("B01123008:服务ID %1 未注册!", serviceID);
return nullptr;
}
+ LOG_WARNING("B01123009:服务ID %1 不合法!", serviceID);
+ return nullptr;
}
uint32_t XNServiceManager::RegisterService()
diff --git a/XNCore/XNServiceObject.cpp b/XNCore/XNServiceObject.cpp
index c4ba212..5eebb4f 100755
--- a/XNCore/XNServiceObject.cpp
+++ b/XNCore/XNServiceObject.cpp
@@ -89,36 +89,6 @@ void XNServiceObject::SetChangeTime(const XNTimePoint &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)
{
return RegisterEventHandler(eventName, callback, true, XNEvent::Priority::RealTime);
@@ -150,21 +120,20 @@ void XNServiceObject::ParseXml()
T_D();
tinyxml2::XMLDocument doc;
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;
}
tinyxml2::XMLElement *rootNode = doc.RootElement();
if (!rootNode) {
- LOG_WARNING("Invalid XML file format: %1!", GetXmlPath());
+ LOG_WARNING("C01153002:服务配置文件 %1 解析失败!", GetXmlPath());
return;
}
const char *serviceName = rootNode->FirstChildElement("Name")->GetText();
if (serviceName != GetObjectName()) {
- LOG_WARNING("The service name in the configuration file of service %1 is not consistent "
- "with the service name in the configuration file of service %2!",
- GetObjectName(), serviceName);
+ LOG_WARNING("A01153003:服务配置文件 %1 中服务名称不一致, 服务名称: %2, 配置文件中名称: %3!",
+ GetXmlPath(), GetObjectName(), serviceName);
return;
}
@@ -199,7 +168,7 @@ void XNServiceObject::ParseConfig()
// 获取数据库路径
std::string dbPath = std::getenv("XNCore");
if (dbPath.empty()) {
- LOG_ERROR("0x1015 未设置XNCore环境变量, 引擎将退出!");
+ LOG_ERROR("A01152004:未设置XNCore环境变量, 无法解析服务配置!");
return;
}
dbPath += "/database/XNSim.db";
@@ -207,7 +176,7 @@ void XNServiceObject::ParseConfig()
// 打开数据库
sqlite3 *db;
if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) {
- LOG_ERROR("0x1016 打开数据库失败: %1", sqlite3_errmsg(db));
+ LOG_ERROR("C01152005:打开数据库失败: %1", sqlite3_errmsg(db));
return;
}
@@ -215,7 +184,7 @@ void XNServiceObject::ParseConfig()
std::string sql = "SELECT * FROM XNServiceVersion WHERE ClassName = ? AND Version = ?";
sqlite3_stmt *stmt;
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);
return;
}
@@ -224,7 +193,7 @@ void XNServiceObject::ParseConfig()
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)
!= SQLITE_OK) {
- LOG_ERROR("0x1018 绑定参数失败: %1", sqlite3_errmsg(db));
+ LOG_ERROR("C01152007:绑定参数失败: %1", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
sqlite3_close(db);
return;
@@ -232,8 +201,7 @@ void XNServiceObject::ParseConfig()
// 执行查询
if (sqlite3_step(stmt) != SQLITE_ROW) {
- LOG_ERROR("0x1019 未找到服务名称为%1,版本号%2的记录", serviceName.c_str(),
- serviceVersion.c_str());
+ LOG_ERROR("A01152008:未找到服务名称为 %1, 版本号 %2 的记录", serviceName, serviceVersion);
sqlite3_finalize(stmt);
sqlite3_close(db);
return;
@@ -257,7 +225,6 @@ void XNServiceObject::ParseConfig()
for (const auto &cmd : commandList) {
if (cmd.contains("Name") && cmd.contains("Description")
&& cmd.contains("Call")) {
- LOG_INFO("0x1021 服务命令: %1", cmd["Name"].get());
// TODO: 处理服务命令信息
// d->_commandList.emplace_back(
// cmd["Name"].get(),
@@ -268,7 +235,7 @@ void XNServiceObject::ParseConfig()
}
}
} catch (const std::exception &e) {
- LOG_WARNING("0x1020 解析服务命令列表失败: %1", e.what());
+ //LOG_WARNING("解析服务命令列表失败: %1", e.what());
}
}
@@ -278,7 +245,7 @@ void XNServiceObject::ParseConfig()
try {
d->_otherParams = XN_JSON::parse(otherParamsStr);
} 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();
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:获取主框架失败!");
+ }
+}
\ No newline at end of file
diff --git a/XNCore/XNThread.cpp b/XNCore/XNThread.cpp
index 3dc52d2..338d14a 100755
--- a/XNCore/XNThread.cpp
+++ b/XNCore/XNThread.cpp
@@ -54,21 +54,21 @@ bool XNThread::Initialize()
// 初始化线程参数
ret = pthread_attr_init(&(d->attr));
if (ret) {
- LOG_ERROR("0x2210 Thread: %1 Initialize Attribute Failed!", GetObjectName());
+ LOG_ERROR("C01132001:线程 %1 初始化属性失败!", GetObjectName());
return false;
}
// 设置线程栈空间大小
ret = pthread_attr_setstacksize(&(d->attr), PTHREAD_STACK_MIN * 20);
if (ret) {
- LOG_ERROR("0x2211 Thread: %1 Set Stack Space Failed!", GetObjectName());
+ LOG_ERROR("C01132002:线程 %1 设置栈空间失败!", GetObjectName());
return false;
}
// 设置线程调度策略
ret = pthread_attr_setschedpolicy(&(d->attr), SCHED_FIFO);
if (ret) {
- LOG_ERROR("0x2212 Thread: %1 Set Scheduling Policy Failed!", GetObjectName());
+ LOG_ERROR("C01132003:线程 %1 设置调度策略失败!", GetObjectName());
return false;
}
@@ -76,21 +76,21 @@ bool XNThread::Initialize()
d->param.sched_priority = d->_uPriority;
ret = pthread_attr_setschedparam(&(d->attr), &d->param);
if (ret) {
- LOG_ERROR("0x2213 Thread: %1 Set Priority Failed!", GetObjectName());
+ LOG_ERROR("C01132004:线程 %1 设置优先级失败!", GetObjectName());
return false;
}
// 设置调度器继承
ret = pthread_attr_setinheritsched(&(d->attr), PTHREAD_EXPLICIT_SCHED);
if (ret) {
- LOG_ERROR("0x2214 Thread: %1 Set Scheduler Inheritance Failed!", GetObjectName());
+ LOG_ERROR("C01132005:线程 %1 设置调度器继承失败!", GetObjectName());
return false;
}
// 线程创建
ret = pthread_create(&d->thread, &d->attr, ThreadFunction, this);
if (ret) {
- LOG_ERROR("0x2215 Thread: %1 Create Failed!", GetObjectName());
+ LOG_ERROR("C01132006:线程 %1 创建失败!", GetObjectName());
return false;
}
@@ -101,23 +101,23 @@ bool XNThread::Initialize()
XNFrameworkPtr framework = GetFramework();
if (!framework) {
- LOG_WARNING("0x2216 Thread: %1 get Framework Failed!", GetObjectName());
+ LOG_WARNING("B01133007:线程 %1 获取框架指针失败!", GetObjectName());
return true;
}
XNDDSManagerPtr ddsManager = framework->GetDDSManager();
if (!ddsManager) {
- LOG_WARNING("0x2216 Thread: %1 get DDSManager Failed!", GetObjectName());
+ LOG_WARNING("B01133008:线程 %1 获取DDS管理器失败!", GetObjectName());
return true;
}
d->writer = ddsManager->RegisterPublisher(
"XNSim::XNSimStatus::XNThreadStatus", d->_threadID);
if (d->writer == nullptr) {
- LOG_WARNING("0x2217 Thread: %1 get DDS Writer Failed!", GetObjectName());
+ LOG_WARNING("B01133009:线程 %1 获取DDS数据写入器失败!", GetObjectName());
return true;
}
- LOG_INFO("Thread: %1 is prepared!", GetObjectName());
+ LOG_INFO("D01134010:线程 %1 准备就绪!", GetObjectName());
return true;
}
@@ -154,7 +154,7 @@ void XNThread::Start()
}
pthread_cond_signal(&d->_cond);
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;
}
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_mutex_unlock(&d->_mtx);
+ LOG_INFO("D01134013:线程 %1 继续执行!", GetObjectName());
}
// 停止执行
@@ -194,6 +195,7 @@ void XNThread::Stop(bool force)
pthread_cond_signal(&d->_cond);
pthread_mutex_unlock(&d->_mtx);
Join();
+ LOG_INFO("D01134014:线程 %1 强制停止执行!", GetObjectName());
} else {
pthread_mutex_lock(&d->_mtx);
// 设置运行状态
@@ -201,8 +203,8 @@ void XNThread::Stop(bool force)
pthread_cond_signal(&d->_cond);
pthread_mutex_unlock(&d->_mtx);
Join();
+ LOG_INFO("D01134015:线程 %1 正常停止执行!", GetObjectName());
}
- LOG_INFO("Thread: %1 Stop!", GetObjectName());
}
// 加入线程
@@ -323,7 +325,7 @@ bool XNThread::OnSetCPUAffinity()
CPU_SET(i, &mask);
}
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 true;
diff --git a/XNCore/XNThreadManager.cpp b/XNCore/XNThreadManager.cpp
index 0a3d3fa..dbb9b99 100755
--- a/XNCore/XNThreadManager.cpp
+++ b/XNCore/XNThreadManager.cpp
@@ -36,7 +36,7 @@ bool XNThreadManager::Initialize()
d->_eRunStatus = RunStatus::NotStart;
d->threadList.clear();
d->funList.clear();
- LOG_INFO("XNThreadManager Initialize Success!");
+ LOG_INFO("D01074001:线程管理器初始化成功!");
d->_status = XNFrameObjectStatus::Initialized;
return true;
}
@@ -110,10 +110,10 @@ void XNThreadManager::RegisterFunction(uint32_t id, XNCallBack fun, uint32_t thr
d->funList[id].push_back(sFunInfo);
if (d->threadList.find(threadID) != d->threadList.end()) {
d->threadList[threadID]->AddFunction(fun, (FreqLevel)freqGroup, RunPos, RunPriorty);
- LOG_INFO("Model [ %1] register periodic function success! Run node: %2-%3 Priority: %4",
- id, freqGroup, RunPos, RunPriorty);
+ LOG_INFO("D01074005:模型 [ %1 ] 注册周期性函数成功! 运行节点: %2-%3 优先级: %4", id,
+ freqGroup, RunPos, RunPriorty);
} 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) {
// 如果频率分组不是0~5
- LOG_WARNING("0x2170 The submitted function's run frequency group of Model [ %1 ] is not "
- "between 0 and 5, registration failed!",
- id);
+ LOG_WARNING("A01073006:模型 [ %1 ] 的运行频率分组不在0~5之间,注册失败!", id);
return false;
} else if (RunPos > (1 << freqGroup)) {
// 如果运行节点不符合要求
- LOG_WARNING("0x2171 The run node submitted for registration by model [ %1 ] exceeds the "
- "maximum node count for the frequency group, registration failed!",
- id);
+ LOG_WARNING("A01073007:模型 [ %1 ] 的运行节点 %2 超出当前频率分组最大节点数 %3,注册失败!",
+ id, RunPos, (1 << freqGroup));
return false;
}
return true;
@@ -156,16 +153,16 @@ bool XNThreadManager::PrepareForExecute()
}
}
// 所有线程初始化
- LOG_INFO("XNThreadManager is preparing...");
+ LOG_INFO("D01074002:线程管理器正在初始化所有线程...");
for (auto &thread : d->threadList) {
bool bRet = thread.second->Initialize();
if (!bRet) {
- LOG_ERROR("Thread [ %1 ] PrepareForExecute Failed!", thread.first);
+ LOG_ERROR("B01072009:线程 [ %1 ] 初始化失败!", thread.first);
continue;
}
}
d->_status = XNFrameObjectStatus::Ready;
- LOG_INFO("XNThreadManager is prepared!");
+ LOG_INFO("D01074003:线程管理器准备就绪!");
return true;
}
@@ -178,7 +175,7 @@ uint32_t XNThreadManager::AddThreadPool(std::string name, double freq, uint32_t
XNThreadPtr thread = std::make_shared(name, freq, priority, CPUAff);
thread->SetThreadID(AllocateThreadID());
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;
return thread->GetThreadID();
}
diff --git a/XNCore/XNTimeManager.cpp b/XNCore/XNTimeManager.cpp
index d2098c8..98e20d0 100755
--- a/XNCore/XNTimeManager.cpp
+++ b/XNCore/XNTimeManager.cpp
@@ -53,10 +53,10 @@ void XNTimeManager::Start()
{
T_D();
if (d->_eRunStatus == RunStatus::NotStart) {
- LOG_INFO("XNSim Start!");
+ LOG_INFO("D01064003:仿真开始运行!");
d->_eRunStatus = RunStatus::Runing;
} else {
- LOG_WARNING("XNSim Already Start!");
+ LOG_WARNING("A01063007:仿真已经运行,请勿重复运行!");
}
}
@@ -64,10 +64,10 @@ void XNTimeManager::Abort()
{
T_D();
if (d->_eRunStatus != RunStatus::Aborted) {
- LOG_INFO("XNSim Abort!");
+ LOG_INFO("D01064004:仿真终止运行!");
d->_eRunStatus = RunStatus::Aborted;
} else {
- LOG_WARNING("XNSim Already Abort!");
+ LOG_WARNING("A01062008:仿真已经终止运行,请勿重复终止!");
}
}
@@ -75,10 +75,10 @@ void XNTimeManager::Pause()
{
T_D();
if (d->_eRunStatus == RunStatus::Runing) {
- LOG_INFO("XNSim Pause!");
+ LOG_INFO("D01064005:仿真暂停运行!");
d->_eRunStatus = RunStatus::Suspend;
} else {
- LOG_WARNING("XNSim is not in Runing status!");
+ LOG_WARNING("A01062009:仿真不是运行状态,无法暂停!");
}
}
@@ -86,10 +86,10 @@ void XNTimeManager::Continue()
{
T_D();
if (d->_eRunStatus == RunStatus::Suspend) {
- LOG_INFO("XNSim Continue!");
+ LOG_INFO("D01064006:仿真继续运行!");
d->_eRunStatus = RunStatus::Runing;
} else {
- LOG_WARNING("XNSim is not in Pause status!");
+ LOG_WARNING("A01062010:仿真不是暂停状态,无法继续!");
}
}
@@ -146,7 +146,7 @@ bool XNTimeManager::Initialize()
// 仿真时间初始化
d->_SimTime = d->_SimStartTime;
- LOG_INFO("XNTimeManager Initialize Success!");
+ LOG_INFO("D01064001:时间管理器初始化成功!");
d->_status = XNFrameObjectStatus::Initialized;
return true;
}
@@ -155,7 +155,7 @@ bool XNTimeManager::PrepareForExecute()
{
T_D();
d->_status = XNFrameObjectStatus::Ready;
- LOG_INFO("XNTimeManager is prepared!");
+ LOG_INFO("D01064002:时间管理器准备就绪!");
return true;
}