- 添加 CodeGraph、Android 和通用 gitignore 配置 - 创建项目元数据文件跟踪 Flutter 项目属性 - 添加 Codex AI 指导文档 AGENTS.md 说明项目架构 - 配置代码分析选项 analysis_options.yaml - 设置 Android 应用清单权限和 Kiosk 模式配置 - 实现中英文国际化支持 AppLocalizations - 配置 GoRouter 应用路由导航 - 创建明亮工业控制风格的主题配置 AppTheme
114 lines
2.6 KiB
Dart
114 lines
2.6 KiB
Dart
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<Step> _steps = [];
|
||
|
||
@override
|
||
void start(Program program, List<Step> 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();
|
||
}
|
||
} |