import '../../programs/models/program.dart'; import '../../programs/models/step.dart'; import 'runner_interface.dart'; /// 模拟运行器(用于开发测试) /// 模拟硬件运行过程 class MockRunner implements Runner { @override RunnerStatus status = RunnerStatus.idle; bool _isRunning = false; int _currentStep = 0; int _remainingSeconds = 0; RunnerCallbacks? _callbacks; List _steps = []; @override void start(Program program, List steps, RunnerCallbacks callbacks) { if (steps.isEmpty) { callbacks.onError?.call('No steps to run'); status = RunnerStatus.error; return; } _steps = steps; _callbacks = callbacks; _currentStep = 0; _isRunning = true; status = RunnerStatus.running; // 开始模拟运行 _runSimulation(); } void _runSimulation() { if (!_isRunning || _currentStep >= _steps.length) { _completeRun(); return; } final step = _steps[_currentStep]; // 计算步骤时间(混合时间 + 吸磁时间 + 吹气时间 + 5秒最小) final stepTime = (step.mixTime ?? 0) + (step.magnetTime ?? 0) + (step.blowTime ?? 0) + 5; _remainingSeconds = stepTime.clamp(5, 300); // 模拟倒计时 _simulateStepProgress(stepTime); } void _simulateStepProgress(int totalSeconds) { // 简化模拟:每秒更新进度 int elapsed = 0; while (_isRunning && elapsed < totalSeconds) { elapsed++; final remaining = totalSeconds - elapsed; final progress = elapsed / totalSeconds; _callbacks?.onProgress?.call( _currentStep, remaining, (_currentStep + progress) / _steps.length, _steps[_currentStep].position, ); // 实际实现需要使用 Timer // await Future.delayed(Duration(seconds: 1)); } if (_isRunning) { _currentStep++; _runSimulation(); } } void _completeRun() { status = RunnerStatus.completed; _isRunning = false; _callbacks?.onComplete?.call(); } @override void pause() { if (status == RunnerStatus.running) { _isRunning = false; status = RunnerStatus.paused; } } @override void resume() { if (status == RunnerStatus.paused) { _isRunning = true; status = RunnerStatus.running; // 继续运行 _runSimulation(); } } @override void stop() { _isRunning = false; status = RunnerStatus.idle; _currentStep = 0; _remainingSeconds = 0; } @override RunnerStatus getStatus() => status; @override void dispose() { stop(); } }