#include "offline_simulation_service.h" #include OfflineSimulationService::OfflineSimulationService( VirtualRegisterRepository &repository, QObject *parent) : QObject(parent), repository_(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(); 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::stop() { timer_.stop(); executor_.resetRuntime(); logic_snapshot_.clear(); if (state_ == SimulationState::Stopped) { return; } state_ = SimulationState::Stopped; last_error_ = {true, LogicScanError::None, {}, {}, {}, {}}; emit stateChanged(); } LogicScanResult OfflineSimulationService::executeOnce() { if (state_ != SimulationState::Running) { return {false, LogicScanError::InvalidLogic, "离线仿真尚未运行", {}, {}, {}}; } 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) { timer_.stop(); executor_.resetRuntime(); last_error_ = error; state_ = SimulationState::Faulted; emit stateChanged(); }