using CapMachine.Model.CANLIN; using CapMachine.Wpf.LinDrive; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; namespace CapMachine.Wpf.Services { /// /// ZLG LIN 驱动服务(共享设备句柄)。 /// public sealed class ZlgLinDriveService : BindableBase { private readonly ILogService _log; private readonly ZlgCanDriveService _zlgCanDriveService; /// /// 当前选中的配置程序(沿用原有 FreeSql 模型)。 /// public CanLinConfigPro? SelectedCanLinConfigPro { get; set; } private bool _openState; /// /// LIN 打开状态。 /// public bool OpenState { get { return _openState; } private set { _openState = value; RaisePropertyChanged(); } } private bool _ldfParserState; /// /// LDF 解析状态(ZLG LIN 暂未接入 LDF,固定为 false)。 /// public bool LdfParserState { get { return _ldfParserState; } private set { _ldfParserState = value; RaisePropertyChanged(); } } /// /// LDF 消息集合(UI 绑定),ZLG LIN 暂未接入 LDF,默认空。 /// public ObservableCollection ListLinLdfModel { get; private set; } = new ObservableCollection(); /// /// 是否启用调度发送(与 UI 的调度表使能语义对齐)。 /// public bool SchEnable { get { return _zlgCanDriveService.Driver.SchEnable; } set { _zlgCanDriveService.Driver.SchEnable = value; RaisePropertyChanged(); } } /// /// 是否启用事件驱动发送。 /// public bool IsCycleSend { get { return _zlgCanDriveService.Driver.IsCycleSend; } set { _zlgCanDriveService.Driver.IsCycleSend = value; RaisePropertyChanged(); } } /// /// 构造。 /// /// 共享 CAN 服务。 /// 日志服务。 public ZlgLinDriveService(ZlgCanDriveService zlgCanDriveService, ILogService logService) { _zlgCanDriveService = zlgCanDriveService; _log = logService; _zlgCanDriveService.Driver.LinFrameReceived += frame => { // 未来接入 LDF 后在这里做 Sync/Decode;当前仅保留事件链路,不做假解析。 }; } /// /// 初始化 LIN 配置信息(目前仅缓存)。 /// /// 选中的配置。 public void InitLinConfig(CanLinConfigPro selectedLinConfigPro) { SelectedCanLinConfigPro = selectedLinConfigPro; } /// /// 打开 LIN(共享设备句柄)。 /// /// 设备索引。 /// 波特率。 /// 是否主节点。 public void StartLinDrive(uint deviceIndex, uint baudRate, bool isMaster) { if (OpenState) { return; } try { // 先确保设备打开(不影响 CAN 后续 Init) _zlgCanDriveService.Driver.OpenDevice(deviceIndex); // 初始化 LIN 通道 _zlgCanDriveService.Driver.OpenAndInitLin(0, new CanDrive.ZlgCan.ZlgLinChannelOptions { BaudRate = baudRate, IsMaster = isMaster, MaxLength = 8, ChecksumMode = 3 }); // 统一由 CAN 服务侧启动接收线程(设备级 merge 接收可以同时收 CAN/LIN) if (!_zlgCanDriveService.Driver.IsReceiving) { _zlgCanDriveService.Driver.StartReceiveLoop(mergeReceive: true, bufferFrames: 200); } OpenState = true; LdfParserState = false; } catch (Exception ex) { _log.Error($"ZLG LIN 打开失败:{ex.Message}"); OpenState = false; throw; } } /// /// 关闭 LIN(共享设备句柄下,当前实现以 CloseDevice 为准:关闭将同时关闭 CAN/LIN)。 /// public void CloseDevice() { // ZLG 的通道句柄都在 Driver 内部;当前 Close 会关闭所有通道,保持与旧系统“同一时刻只有一种驱动工作”的原则一致。 _zlgCanDriveService.CloseDevice(); OpenState = false; LdfParserState = false; } /// /// 加载 LDF(ZLG LIN 暂未接入 LDF 解析 DLL,因此此处明确失败,不返回模拟数据)。 /// /// LDF 路径。 public ObservableCollection StartLdf(string path) { _log.Warn("ZLG LIN 当前版本未接入 LDF 解析(项目内仅存在 USB2XXX.dll 的 LDFParser)。"); throw new NotSupportedException("ZLG LIN 暂未支持 LDF 解析,请后续提供/确认 ZLG 的 LDF DLL 接口(如 zldf.dll)后再接入。"); } } }