综合平台编程器项目的远程存储
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

121 lines
2.9 KiB

  1. #include "offline_simulation_service.h"
  2. #include <utility>
  3. OfflineSimulationService::OfflineSimulationService(
  4. VirtualRegisterRepository &repository,
  5. QObject *parent)
  6. : QObject(parent),
  7. repository_(repository)
  8. {
  9. timer_.setInterval(kDefaultScanIntervalMs);
  10. timer_.setTimerType(Qt::PreciseTimer);
  11. connect(&timer_, &QTimer::timeout,
  12. this, &OfflineSimulationService::handleTimeout);
  13. }
  14. SimulationStartResult OfflineSimulationService::start(
  15. const std::vector<ControlLogic> &logics)
  16. {
  17. if (state_ == SimulationState::Running)
  18. {
  19. return {false, SimulationStartError::AlreadyRunning, {}};
  20. }
  21. std::vector<ControlLogic> snapshot = logics;
  22. const LogicScanResult validation = executor_.validate(snapshot);
  23. if (!validation.succeeded)
  24. {
  25. last_error_ = validation;
  26. return {false, SimulationStartError::InvalidLogic, validation};
  27. }
  28. timer_.stop();
  29. executor_.resetRuntime();
  30. repository_.clear();
  31. logic_snapshot_ = std::move(snapshot);
  32. successful_scan_count_ = 0;
  33. last_error_ = {true, LogicScanError::None, {}, {}, {}, {}};
  34. trace_snapshot_.clear();
  35. state_ = SimulationState::Running;
  36. timer_.start();
  37. emit stateChanged();
  38. return {true, SimulationStartError::None, {true, LogicScanError::None, {}, {}, {}, {}}};
  39. }
  40. void OfflineSimulationService::stop()
  41. {
  42. timer_.stop();
  43. executor_.resetRuntime();
  44. logic_snapshot_.clear();
  45. if (state_ == SimulationState::Stopped)
  46. {
  47. return;
  48. }
  49. state_ = SimulationState::Stopped;
  50. last_error_ = {true, LogicScanError::None, {}, {}, {}, {}};
  51. emit stateChanged();
  52. }
  53. LogicScanResult OfflineSimulationService::executeOnce()
  54. {
  55. if (state_ != SimulationState::Running)
  56. {
  57. return {false,
  58. LogicScanError::InvalidLogic,
  59. "离线仿真尚未运行",
  60. {},
  61. {},
  62. {}};
  63. }
  64. const LogicScanResult result = executor_.executeScan(
  65. logic_snapshot_, repository_, &trace_snapshot_);
  66. if (!result.succeeded)
  67. {
  68. enterFault(result);
  69. return result;
  70. }
  71. ++successful_scan_count_;
  72. emit scanCompleted();
  73. return result;
  74. }
  75. SimulationState OfflineSimulationService::state() const
  76. {
  77. return state_;
  78. }
  79. int OfflineSimulationService::scanIntervalMs() const
  80. {
  81. return timer_.interval();
  82. }
  83. std::uint64_t OfflineSimulationService::successfulScanCount() const
  84. {
  85. return successful_scan_count_;
  86. }
  87. const LogicScanResult &OfflineSimulationService::lastError() const
  88. {
  89. return last_error_;
  90. }
  91. const LogicTraceSnapshot &OfflineSimulationService::traceSnapshot() const
  92. {
  93. return trace_snapshot_;
  94. }
  95. void OfflineSimulationService::handleTimeout()
  96. {
  97. executeOnce();
  98. }
  99. void OfflineSimulationService::enterFault(const LogicScanResult &error)
  100. {
  101. timer_.stop();
  102. executor_.resetRuntime();
  103. last_error_ = error;
  104. state_ = SimulationState::Faulted;
  105. emit stateChanged();
  106. }