XNSim/XNCore/XNTimeManager.cpp

171 lines
3.8 KiB
C++
Raw Normal View History

2025-04-28 12:25:20 +08:00
/**
* @file XNTimeManager.cpp
* @author jinchao
* @brief
* @version 1.0
* @date 2024-11-07
*
* @copyright Copyright (c) 2024 XN
*
*/
#include "XNTimeManager.h"
#include "XNTimeManager_p.h"
#include "XNDDSManager.h"
#include "XNThreadManager.h"
2025-05-20 15:39:40 +08:00
#include "XNFramework.h"
2025-04-28 12:25:20 +08:00
#include "XNIDL/XNSimStatusPubSubTypes.hpp"
typedef std::shared_ptr<XNThread> XNThreadPtr;
2025-05-20 15:39:40 +08:00
XNTimeManager::XNTimeManager() : XNBaseFrameObject(new XNTimeManagerPrivate())
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
SetUniqueId(2);
SetObjectName("XNTimeManager");
2025-04-28 12:25:20 +08:00
}
XNTimeManager::~XNTimeManager()
{
}
2025-05-20 15:39:40 +08:00
XNTimeManager::XNTimeManager(PrivateType *p) : XNBaseFrameObject(p)
2025-04-28 12:25:20 +08:00
{
}
2025-05-20 15:39:40 +08:00
std::chrono::system_clock::time_point XNTimeManager::GetSimTime()
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
2025-04-28 12:25:20 +08:00
pthread_mutex_lock(&(d->_mtx));
2025-05-20 15:39:40 +08:00
auto simTime = d->_SimTime;
2025-04-28 12:25:20 +08:00
pthread_mutex_unlock(&(d->_mtx));
2025-05-20 15:39:40 +08:00
return simTime;
2025-04-28 12:25:20 +08:00
}
2025-05-20 15:39:40 +08:00
void XNTimeManager::SetStartTime(const timespec &simTime)
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
// 将timespec转换为chrono::system_clock::time_point
auto duration =
std::chrono::seconds(simTime.tv_sec) + std::chrono::nanoseconds(simTime.tv_nsec);
d->_SimStartTime = std::chrono::system_clock::time_point(duration);
2025-04-28 12:25:20 +08:00
}
2025-05-20 15:39:40 +08:00
void XNTimeManager::Start()
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
2025-04-28 12:25:20 +08:00
if (d->_eRunStatus == RunStatus::NotStart) {
LOG_INFO("XNSim Start!");
d->_eRunStatus = RunStatus::Runing;
} else {
LOG_WARNING("XNSim Already Start!");
}
}
2025-05-20 15:39:40 +08:00
void XNTimeManager::Abort()
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
2025-04-28 12:25:20 +08:00
if (d->_eRunStatus != RunStatus::Aborted) {
LOG_INFO("XNSim Abort!");
d->_eRunStatus = RunStatus::Aborted;
} else {
LOG_WARNING("XNSim Already Abort!");
}
}
2025-05-20 15:39:40 +08:00
void XNTimeManager::Pause()
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
2025-04-28 12:25:20 +08:00
if (d->_eRunStatus == RunStatus::Runing) {
LOG_INFO("XNSim Pause!");
d->_eRunStatus = RunStatus::Suspend;
} else {
LOG_WARNING("XNSim is not in Runing status!");
}
}
2025-05-20 15:39:40 +08:00
void XNTimeManager::Continue()
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
2025-04-28 12:25:20 +08:00
if (d->_eRunStatus == RunStatus::Suspend) {
LOG_INFO("XNSim Continue!");
d->_eRunStatus = RunStatus::Runing;
} else {
LOG_WARNING("XNSim is not in Pause status!");
}
}
RunStatus XNTimeManager::GetStatus()
{
2025-05-20 15:39:40 +08:00
T_D();
2025-04-28 12:25:20 +08:00
return d->_eRunStatus;
}
2025-05-20 15:39:40 +08:00
void XNTimeManager::SimControl(uint32_t objectId, SimControlCmd cmd)
2025-04-28 12:25:20 +08:00
{
if (objectId == 0) {
switch (cmd) {
case SimControlCmd::Start:
2025-05-20 15:39:40 +08:00
Start();
2025-04-28 12:25:20 +08:00
break;
case SimControlCmd::Abort:
2025-05-20 15:39:40 +08:00
Abort();
2025-04-28 12:25:20 +08:00
break;
case SimControlCmd::Continue:
2025-05-20 15:39:40 +08:00
Continue();
2025-04-28 12:25:20 +08:00
break;
case SimControlCmd::Suspend:
2025-05-20 15:39:40 +08:00
Pause();
2025-04-28 12:25:20 +08:00
break;
}
}
}
2025-05-20 15:39:40 +08:00
bool XNTimeManager::Initialize()
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
2025-04-28 12:25:20 +08:00
// 初始化锁
pthread_mutex_init(&(d->_mtx), NULL);
// 时间管理器线程初始化
// XNThreadManager *threadManager = parent()->findChild<XNThreadManager *>("XNThreadManager");
// if (threadManager) {
// double dRunInter = threadManager->GetBaseInter() * 32;
// d->_TimeManagerThread =
// new XNThread(this, "TimeManagerThread", FreqLevel::ThirtyTwothFreq, 10, 0, dRunInter);
// } else {
// d->_status = XNFrameObjectStatus::Unknown;
// LOG_ERROR("XNTimeManager Initialize Failed!");
// return;
// }
// d->_TimeManagerThread->AddFunction(std::bind(&XNTimeManager::StepExecute, this),
// FreqLevel::ThirtyTwothFreq, 0, 90);
// connect(this, &XNTimeManager::SimControl, d->_TimeManagerThread, &XNThread::OnSimControl);
// 运行状态初始化
d->_eRunStatus = RunStatus::NotStart; //d->_TimeManagerThread->GetRunStatus();
// 仿真时间初始化
d->_SimTime = d->_SimStartTime;
LOG_INFO("XNTimeManager Initialize Success!");
d->_status = XNFrameObjectStatus::Initialized;
2025-05-20 15:39:40 +08:00
return true;
2025-04-28 12:25:20 +08:00
}
2025-05-20 15:39:40 +08:00
bool XNTimeManager::PrepareForExecute()
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
2025-04-28 12:25:20 +08:00
d->_status = XNFrameObjectStatus::Ready;
LOG_INFO("XNTimeManager is prepared!");
2025-05-20 15:39:40 +08:00
return true;
2025-04-28 12:25:20 +08:00
}
void XNTimeManager::StepExecute()
{
2025-05-20 15:39:40 +08:00
T_D();
2025-04-28 12:25:20 +08:00
// TODO 提交事件
// 时间推进
pthread_mutex_lock(&(d->_mtx));
2025-05-20 15:39:40 +08:00
d->_SimTime += std::chrono::microseconds(static_cast<int64_t>(BASE_RUN_INTER * 1.0E6));
2025-04-28 12:25:20 +08:00
pthread_mutex_unlock(&(d->_mtx));
}