#include "offline_simulation_service.h" #include OfflineSimulationService::OfflineSimulationService( VirtualRegisterRepository &repository, VirtualRegisterRepository *initial_repository, QObject *parent) : QObject(parent), repository_(repository), initial_repository_(initial_repository) { timer_.setInterval(kDefaultScanIntervalMs); timer_.setTimerType(Qt::PreciseTimer); connect(&timer_, &QTimer::timeout, this, &OfflineSimulationService::handleTimeout); } SimulationStartResult OfflineSimulationService::start( const std::vector &logics) { if (state_ == SimulationState::Running) { return {false, SimulationStartError::AlreadyRunning, {}}; } // 仿真期间使用启动时快照,编辑器后续修改不会改变正在扫描的逻辑 std::vector snapshot = logics; const LogicScanResult validation = executor_.validate(snapshot); if (!validation.succeeded) { last_error_ = validation; return {false, SimulationStartError::InvalidLogic, validation}; } // 重启会话时清空沿触发状态和运行值,再装载编辑态确认的初始值 timer_.stop(); executor_.resetRuntime(); repository_.clear(); if (initial_repository_ != nullptr) { repository_.copyFrom(*initial_repository_); } logic_snapshot_ = std::move(snapshot); successful_scan_count_ = 0; last_error_ = {true, LogicScanError::None, {}, {}, {}, {}}; trace_snapshot_.clear(); state_ = SimulationState::Running; timer_.start(); emit stateChanged(); return {true, SimulationStartError::None, {true, LogicScanError::None, {}, {}, {}, {}}}; } void OfflineSimulationService::restoreInitialValues() { repository_.clear(); if (initial_repository_ != nullptr) { repository_.copyFrom(*initial_repository_); } } void OfflineSimulationService::stop() { timer_.stop(); executor_.resetRuntime(); logic_snapshot_.clear(); if (state_ == SimulationState::Stopped) { return; } // 运行结束后丢弃本轮输出,编辑态继续看到下一轮要使用的初始值 restoreInitialValues(); state_ = SimulationState::Stopped; last_error_ = {true, LogicScanError::None, {}, {}, {}, {}}; emit stateChanged(); } LogicScanResult OfflineSimulationService::executeOnce() { if (state_ != SimulationState::Running) { return {false, LogicScanError::InvalidLogic, "离线仿真尚未运行", {}, {}, {}}; } // 执行器负责一轮完整扫描;任何读写错误都会让服务进入 Faulted const LogicScanResult result = executor_.executeScan( logic_snapshot_, repository_, &trace_snapshot_); if (!result.succeeded) { enterFault(result); return result; } ++successful_scan_count_; emit scanCompleted(); return result; } SimulationState OfflineSimulationService::state() const { return state_; } int OfflineSimulationService::scanIntervalMs() const { return timer_.interval(); } std::uint64_t OfflineSimulationService::successfulScanCount() const { return successful_scan_count_; } const LogicScanResult &OfflineSimulationService::lastError() const { return last_error_; } const LogicTraceSnapshot &OfflineSimulationService::traceSnapshot() const { return trace_snapshot_; } void OfflineSimulationService::handleTimeout() { executeOnce(); } void OfflineSimulationService::enterFault(const LogicScanResult &error) { // 故障后停止定时器和运行时状态,保留错误及最后轨迹供 UI 诊断 timer_.stop(); executor_.resetRuntime(); last_error_ = error; state_ = SimulationState::Faulted; emit stateChanged(); }