173 lines
4.0 KiB
C++
Executable File
173 lines
4.0 KiB
C++
Executable File
/**
|
|
* @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"
|
|
#include "XNIDL/XNSimStatusPubSubTypes.hpp"
|
|
|
|
typedef std::shared_ptr<XNThread> XNThreadPtr;
|
|
|
|
XNTimeManager::XNTimeManager(QObject *parent)
|
|
: XNBaseFrameObject(*new XNTimeManagerPrivate(this), parent)
|
|
{
|
|
setUniqueId(2);
|
|
setObjectName("XNTimeManager");
|
|
}
|
|
|
|
XNTimeManager::~XNTimeManager()
|
|
{
|
|
}
|
|
|
|
XNTimeManager::XNTimeManager(XNTimeManagerPrivate &dd, QObject *parent)
|
|
: XNBaseFrameObject(dd, parent)
|
|
{
|
|
}
|
|
|
|
QDateTime XNTimeManager::GetSimTime()
|
|
{
|
|
Q_D(XNTimeManager);
|
|
pthread_mutex_lock(&(d->_mtx));
|
|
QDateTime sSimTime = d->_SimTime;
|
|
pthread_mutex_unlock(&(d->_mtx));
|
|
return sSimTime;
|
|
}
|
|
|
|
void XNTimeManager::OnSetStartTime(const timespec &simTime)
|
|
{
|
|
Q_D(XNTimeManager);
|
|
d->_SimStartTime = QDateTime::fromSecsSinceEpoch(simTime.tv_sec);
|
|
d->_SimStartTime = d->_SimStartTime.addMSecs(simTime.tv_nsec / 1000000.0);
|
|
//d->_TimeManagerThread->OnSetStartTime(simTime);
|
|
//d->_TimeManagerThread->Initialize();
|
|
}
|
|
|
|
void XNTimeManager::OnStart()
|
|
{
|
|
Q_D(XNTimeManager);
|
|
if (d->_eRunStatus == RunStatus::NotStart) {
|
|
LOG_INFO("XNSim Start!");
|
|
d->_eRunStatus = RunStatus::Runing;
|
|
} else {
|
|
LOG_WARNING("XNSim Already Start!");
|
|
}
|
|
}
|
|
|
|
void XNTimeManager::OnAbort()
|
|
{
|
|
Q_D(XNTimeManager);
|
|
if (d->_eRunStatus != RunStatus::Aborted) {
|
|
LOG_INFO("XNSim Abort!");
|
|
d->_eRunStatus = RunStatus::Aborted;
|
|
} else {
|
|
LOG_WARNING("XNSim Already Abort!");
|
|
}
|
|
}
|
|
|
|
void XNTimeManager::OnPause()
|
|
{
|
|
Q_D(XNTimeManager);
|
|
if (d->_eRunStatus == RunStatus::Runing) {
|
|
LOG_INFO("XNSim Pause!");
|
|
d->_eRunStatus = RunStatus::Suspend;
|
|
} else {
|
|
LOG_WARNING("XNSim is not in Runing status!");
|
|
}
|
|
}
|
|
|
|
void XNTimeManager::OnContinue()
|
|
{
|
|
Q_D(XNTimeManager);
|
|
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()
|
|
{
|
|
Q_D(XNTimeManager);
|
|
return d->_eRunStatus;
|
|
}
|
|
|
|
void XNTimeManager::OnSimControl(quint32 objectId, SimControlCmd cmd)
|
|
{
|
|
if (objectId == 0) {
|
|
switch (cmd) {
|
|
case SimControlCmd::Start:
|
|
OnStart();
|
|
break;
|
|
case SimControlCmd::Abort:
|
|
OnAbort();
|
|
break;
|
|
case SimControlCmd::Continue:
|
|
OnContinue();
|
|
break;
|
|
case SimControlCmd::Suspend:
|
|
OnPause();
|
|
break;
|
|
}
|
|
}
|
|
emit SimControl(objectId, cmd);
|
|
}
|
|
|
|
void XNTimeManager::OnInitialize()
|
|
{
|
|
Q_D(XNTimeManager);
|
|
// 初始化锁
|
|
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;
|
|
emit Initialize();
|
|
}
|
|
|
|
void XNTimeManager::OnPrepareForExecute()
|
|
{
|
|
Q_D(XNTimeManager);
|
|
d->_status = XNFrameObjectStatus::Ready;
|
|
LOG_INFO("XNTimeManager is prepared!");
|
|
emit PrepareForExecute();
|
|
}
|
|
|
|
void XNTimeManager::StepExecute()
|
|
{
|
|
Q_D(XNTimeManager);
|
|
// TODO 提交事件
|
|
// 时间推进
|
|
pthread_mutex_lock(&(d->_mtx));
|
|
d->_SimTime = d->_SimTime.addMSecs(BASE_RUN_INTER * 1.0E6);
|
|
pthread_mutex_unlock(&(d->_mtx));
|
|
}
|