feat(device): 实现下位机 JSON 协议(data model 对齐)
按 docs/下位机交互数据模型.md 重构串口协议层: 协议层 - 新增 DeviceMessage 模型,对应 message_id/type/ack/need_ack/data - 新增 JsonProtocolService,4 字节大端长度前缀 + UTF-8 JSON 帧 - 删除原二进制协议(serial_protocol.dart) 服务层 - 新增 DeviceMessageService,集中收发并按 type 分发 - 重写 SerialRunner 为 JsonSerialRunner,使用 create_task/control 消息 数据模型 - DeviceState 增加 doorStatus/lightStatus/taskStatus/lastInfoAt - 新增 DeviceInfoNotifier 订阅 device_info 上行 - 灯光按钮接通 light_control 消息 测试 - 新增 device_protocol_test.dart(14 用例) - 修复 models_test.dart 残留的 Step mixSpeed/blowSpeed 错误
This commit is contained in:
82
lib/features/device/providers/serial_provider.dart
Normal file
82
lib/features/device/providers/serial_provider.dart
Normal file
@@ -0,0 +1,82 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../../../core/database/database_service.dart';
|
||||
import '../models/serial_config.dart';
|
||||
import '../services/device_message_service.dart';
|
||||
import '../services/json_protocol.dart';
|
||||
import '../services/runner_interface.dart';
|
||||
import '../services/serial_port_service.dart';
|
||||
import '../services/serial_runner.dart';
|
||||
|
||||
/// 串口服务单例
|
||||
final serialPortServiceProvider = Provider<SerialPortService>((ref) {
|
||||
final service = SerialPortService();
|
||||
ref.onDispose(service.dispose);
|
||||
return service;
|
||||
});
|
||||
|
||||
/// JSON 协议编解码器(可在调试/真机协议不一致时整体替换)
|
||||
final jsonProtocolProvider = Provider<JsonProtocolService>((ref) {
|
||||
return JsonProtocolService();
|
||||
});
|
||||
|
||||
/// 设备消息分发服务
|
||||
///
|
||||
/// 集中处理 JSON 消息的发送与订阅;下游 Provider 各自订阅感兴趣的类型。
|
||||
final deviceMessageServiceProvider =
|
||||
Provider<DeviceMessageService>((ref) {
|
||||
final serial = ref.watch(serialPortServiceProvider);
|
||||
final protocol = ref.watch(jsonProtocolProvider);
|
||||
final service = DeviceMessageService(serial: serial, protocol: protocol);
|
||||
ref.onDispose(service.dispose);
|
||||
return service;
|
||||
});
|
||||
|
||||
/// 当前串口配置(设置页修改后通过 notifier 写入并持久化)
|
||||
class SerialConfigNotifier extends StateNotifier<SerialConfig> {
|
||||
final SettingsConfigRepository _repo;
|
||||
|
||||
SerialConfigNotifier(this._repo) : super(SerialConfig.defaults) {
|
||||
_load();
|
||||
}
|
||||
|
||||
Future<void> _load() async {
|
||||
state = await _repo.read();
|
||||
}
|
||||
|
||||
/// 修改并持久化
|
||||
Future<void> update(SerialConfig Function(SerialConfig) mutator) async {
|
||||
final next = mutator(state);
|
||||
state = next;
|
||||
await _repo.write(next);
|
||||
}
|
||||
|
||||
/// 重置为默认值
|
||||
Future<void> reset() => update((_) => SerialConfig.defaults);
|
||||
}
|
||||
|
||||
/// 串口配置仓库:把 [SerialConfig] 以 JSON 形式存到 settings 表
|
||||
class SettingsConfigRepository {
|
||||
static const _key = 'serial_config';
|
||||
final DatabaseService _db = DatabaseService.instance;
|
||||
|
||||
Future<SerialConfig> read() async {
|
||||
final raw = await _db.readSetting(_key);
|
||||
return SerialConfig.fromJsonString(raw);
|
||||
}
|
||||
|
||||
Future<void> write(SerialConfig config) async {
|
||||
await _db.writeSetting(_key, config.toJsonString());
|
||||
}
|
||||
}
|
||||
|
||||
final serialConfigProvider =
|
||||
StateNotifierProvider<SerialConfigNotifier, SerialConfig>((ref) {
|
||||
return SerialConfigNotifier(SettingsConfigRepository());
|
||||
});
|
||||
|
||||
/// 运行器实例(基于 JSON 协议与设备消息服务)
|
||||
final runnerProvider = Provider<Runner>((ref) {
|
||||
final msgService = ref.watch(deviceMessageServiceProvider);
|
||||
return JsonSerialRunner(messageService: msgService);
|
||||
});
|
||||
Reference in New Issue
Block a user