using AutoMapper;
using CapMachine.Core;
using CapMachine.Model.CANLIN;
using CapMachine.Wpf.CanDrive;
using CapMachine.Wpf.Dtos;
using CapMachine.Wpf.Services;
using CapMachine.Wpf.Views;
using ImTools;
using Microsoft.Win32;
using Prism.Commands;
using Prism.Events;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using static CapMachine.Wpf.Models.ComEnum;
namespace CapMachine.Wpf.ViewModels
{
///
/// ZLG CAN/CANFD 合并配置 ViewModel(模式切换:单选)。
///
public class ZlgCanDriveConfigViewModel : NavigationViewModel
{
///
/// 构造函数。
///
public ZlgCanDriveConfigViewModel(IDialogService dialogService, IFreeSql freeSql,
IEventAggregator eventAggregator, IRegionManager regionManager, SysRunService sysRunService,
ComActionService comActionService, ILogService logService, LogicRuleService logicRuleService,
ConfigService configService, ZlgCanDriveService zlgCanDriveService, ZlgLinDriveService zlgLinDriveService,
IMapper mapper)
{
DialogService = dialogService;
FreeSql = freeSql;
EventAggregator = eventAggregator;
RegionManager = regionManager;
SysRunService = sysRunService;
ComActionService = comActionService;
LogService = logService;
LogicRuleService = logicRuleService;
ConfigService = configService;
ZlgCanDriveService = zlgCanDriveService;
ZlgLinDriveService = zlgLinDriveService;
Mapper = mapper;
SelectedMode = ZlgCanMode.Can;
ArbBaudRateCbxItems = new ObservableCollection()
{
new CbxItems(){ Key="10000",Text="10 Kbps"},
new CbxItems(){ Key="20000",Text="20 Kbps"},
new CbxItems(){ Key="33000",Text="33 Kbps"},
new CbxItems(){ Key="50000",Text="50 Kbps"},
new CbxItems(){ Key="83000",Text="83 Kbps"},
new CbxItems(){ Key="100000",Text="100 Kbps"},
new CbxItems(){ Key="125000",Text="125 Kbps"},
new CbxItems(){ Key="150000",Text="150 Kbps"},
new CbxItems(){ Key="200000",Text="200 Kbps"},
new CbxItems(){ Key="250000",Text="250 Kbps"},
new CbxItems(){ Key="300000",Text="300 Kbps"},
new CbxItems(){ Key="400000",Text="400 Kbps"},
new CbxItems(){ Key="500000",Text="500 Kbps"},
new CbxItems(){ Key="666000",Text="666 Kbps"},
new CbxItems(){ Key="800000",Text="800 Kbps"},
new CbxItems(){ Key="1000000",Text="1.0 Mbps"},
};
DataBaudRateCbxItems = new ObservableCollection()
{
new CbxItems(){ Key="100000",Text="100 Kbps"},
new CbxItems(){ Key="125000",Text="125 Kbps"},
new CbxItems(){ Key="200000",Text="200 Kbps"},
new CbxItems(){ Key="250000",Text="250 Kbps"},
new CbxItems(){ Key="400000",Text="400 Kbps"},
new CbxItems(){ Key="500000",Text="500 Kbps"},
new CbxItems(){ Key="666000",Text="666 Kbps"},
new CbxItems(){ Key="800000",Text="800 Kbps"},
new CbxItems(){ Key="1000000",Text="1.0 Mbps"},
new CbxItems(){ Key="1500000",Text="1.5 Mbps"},
new CbxItems(){ Key="2000000",Text="2.0 Mbps"},
new CbxItems(){ Key="3000000",Text="3.0 Mbps"},
new CbxItems(){ Key="4000000",Text="4.0 Mbps"},
new CbxItems(){ Key="5000000",Text="5.0 Mbps"},
new CbxItems(){ Key="6700000",Text="6.7 Mbps"},
new CbxItems(){ Key="8000000",Text="8.0 Mbps"},
new CbxItems(){ Key="10000000",Text="10.0 Mbps"},
};
InitWriteRuleCbx();
InitLoadCanConfigPro();
}
private void InitWriteRuleCbx()
{
WriteRuleCbxItems = new ObservableCollection();
foreach (var itemRule in LogicRuleService.LogicRuleDtos)
{
WriteRuleCbxItems.Add(new CbxItems()
{
Key = itemRule.Id.ToString(),
Text = itemRule.Name
});
}
}
private void OpenRwDialog()
{
try
{
if (SelectCanLinConfigPro == null)
{
MessageBox.Show("选中CAN配置名称后再操作", "提示", MessageBoxButton.OK, MessageBoxImage.Hand);
return;
}
var writeClones = new ObservableCollection(
(ListWriteCanLinRWConfigDto ?? new ObservableCollection())
.Select(CloneRwDto));
foreach (var item in writeClones)
{
item.RWInfo = RW.Write;
}
var readClones = new ObservableCollection(
(ListReadCanLinRWConfigDto ?? new ObservableCollection())
.Select(CloneRwDto));
foreach (var item in readClones)
{
item.RWInfo = RW.Read;
}
var candidates = new ObservableCollection();
if (ListCanDbcModel != null)
{
foreach (var sig in ListCanDbcModel)
{
candidates.Add(new DialogZlgCanLinRwConfigViewModel.SignalCandidate
{
MsgName = sig.MsgName,
SignalName = sig.SignalName,
Name = sig.Name,
Desc = sig.SignalDesc,
});
}
}
var pars = new DialogParameters
{
{ "Title", "读写设置" },
{ "CanLinConfigProId", SelectCanLinConfigPro.Id },
{ "IsEditable", IsRwEditable },
{ "WriteConfigs", writeClones },
{ "ReadConfigs", readClones },
{ "SignalCandidates", candidates },
};
DialogService.ShowDialog(nameof(DialogZlgCanLinRwConfigView), pars, r =>
{
if (r.Result == ButtonResult.OK)
{
ReloadCurrentConfigPro();
OpTip = "读写设置已保存";
}
});
}
catch (Exception ex)
{
LogService.Error($"ZLG 打开读写设置弹窗失败:{ex}");
MessageBox.Show(ex.Message, "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private static CanLinRWConfigDto CloneRwDto(CanLinRWConfigDto src)
{
return new CanLinRWConfigDto
{
Id = src.Id,
RWInfo = src.RWInfo,
Name = src.Name,
MsgFrameName = src.MsgFrameName,
SignalName = src.SignalName,
DefautValue = src.DefautValue,
LogicRuleId = src.LogicRuleId,
LogicRuleDto = src.LogicRuleDto,
};
}
///
/// Dialog 服务。
///
public IDialogService DialogService { get; }
///
/// FreeSql。
///
public IFreeSql FreeSql { get; }
///
/// 事件聚合。
///
public IEventAggregator EventAggregator { get; }
///
/// 区域导航。
///
public IRegionManager RegionManager { get; }
///
/// 系统运行服务。
///
public SysRunService SysRunService { get; }
///
/// 通信互斥控制。
///
public ComActionService ComActionService { get; }
///
/// 日志。
///
public ILogService LogService { get; }
///
/// 逻辑规则服务。
///
public LogicRuleService LogicRuleService { get; }
///
/// 配置服务。
///
public ConfigService ConfigService { get; }
///
/// ZLG CAN 服务。
///
public ZlgCanDriveService ZlgCanDriveService { get; }
///
/// ZLG LIN 服务(用于互斥判断)。
///
public ZlgLinDriveService ZlgLinDriveService { get; }
///
/// Mapper。
///
public IMapper Mapper { get; }
private ObservableCollection _arbBaudRateCbxItems = new ObservableCollection();
///
/// 仲裁波特率下拉项(bps)。
///
public ObservableCollection ArbBaudRateCbxItems
{
get { return _arbBaudRateCbxItems; }
set { _arbBaudRateCbxItems = value; RaisePropertyChanged(); }
}
private ObservableCollection _dataBaudRateCbxItems = new ObservableCollection();
///
/// 数据波特率下拉项(bps)。
///
public ObservableCollection DataBaudRateCbxItems
{
get { return _dataBaudRateCbxItems; }
set { _dataBaudRateCbxItems = value; RaisePropertyChanged(); }
}
private List _canLinConfigPros = new List();
private ObservableCollection _writeRuleCbxItems = new ObservableCollection();
public ObservableCollection WriteRuleCbxItems
{
get { return _writeRuleCbxItems; }
set { _writeRuleCbxItems = value; RaisePropertyChanged(); }
}
private ObservableCollection _listWriteCanLinRWConfigDto = new ObservableCollection();
public ObservableCollection ListWriteCanLinRWConfigDto
{
get { return _listWriteCanLinRWConfigDto; }
set { _listWriteCanLinRWConfigDto = value; RaisePropertyChanged(); }
}
private ObservableCollection _listReadCanLinRWConfigDto = new ObservableCollection();
public ObservableCollection ListReadCanLinRWConfigDto
{
get { return _listReadCanLinRWConfigDto; }
set { _listReadCanLinRWConfigDto = value; RaisePropertyChanged(); }
}
private CanLinRWConfigDto? SelectedWriteCanLinRWConfigDto { get; set; }
private CanLinRWConfigDto? SelectedReadCanLinRWConfigDto { get; set; }
private string? _opTip;
///
/// 操作提示(用于 UI 状态展示)。
///
public string? OpTip
{
get { return _opTip; }
set { _opTip = value; RaisePropertyChanged(); }
}
private string? _lastError;
///
/// 最近一次错误信息(用于 UI 状态展示)。
///
public string? LastError
{
get { return _lastError; }
set { _lastError = value; RaisePropertyChanged(); }
}
private bool _isCanConfigProActive;
///
/// 当前配置程序是否已激活(对齐图莫斯 Active 语义)。
/// 激活后禁止切换配置程序。
///
public bool IsCanConfigProActive
{
get { return _isCanConfigProActive; }
set
{
_isCanConfigProActive = value;
RaisePropertyChanged();
RaisePropertyChanged(nameof(IsRwEditable));
}
}
public bool IsRwEditable
{
get { return !IsCanConfigProActive; }
}
private bool _isCANConfigDatagridActive = true;
///
/// 配置程序 DataGrid 是否可操作(与 IsCanConfigProActive 取反)。
///
public bool IsCANConfigDatagridActive
{
get { return _isCANConfigDatagridActive; }
set { _isCANConfigDatagridActive = value; RaisePropertyChanged(); }
}
private ZlgCanMode _selectedMode;
///
/// 模式选择:CAN/CANFD(单选)。
///
public ZlgCanMode SelectedMode
{
get { return _selectedMode; }
set
{
// 打开状态下不允许切换模式,避免驱动状态错乱。
if (ZlgCanDriveService.OpenState && _selectedMode != value)
{
MessageBox.Show("请先关闭 CAN 后再切换 CAN/CANFD 模式", "提示", MessageBoxButton.OK, MessageBoxImage.Hand);
RaisePropertyChanged(nameof(SelectedModeKey));
return;
}
_selectedMode = value;
RaisePropertyChanged();
RaisePropertyChanged(nameof(SelectedModeKey));
RaisePropertyChanged(nameof(IsCanMode));
RaisePropertyChanged(nameof(IsCanFdMode));
RaisePropertyChanged(nameof(DbcPathTitle));
RaisePropertyChanged(nameof(ConnectButtonText));
RaisePropertyChanged(nameof(CloseButtonText));
RaisePropertyChanged(nameof(CurrentDbcPath));
RaisePropertyChanged(nameof(CurrentCycle));
RaisePropertyChanged(nameof(CurrentSchEnable));
RaisePropertyChanged(nameof(CurrentArbBaudRate));
RaisePropertyChanged(nameof(CurrentDataBaudRate));
RaisePropertyChanged(nameof(CurrentISOEnable));
RaisePropertyChanged(nameof(CurrentResEnable));
RaisePropertyChanged(nameof(BaudRateTitle));
RaisePropertyChanged(nameof(DataBaudRateTitle));
ZlgCanDriveService.Mode = value;
// 当用户手动切换 CAN/CANFD 时,如果当前配置缺少对应扩展 DTO,需要先生成默认 DTO,
// 否则界面控件无法编辑(setter 会因 DTO 为空直接 return)。
if (SelectCanLinConfigPro != null)
{
if (value == ZlgCanMode.Can)
{
if (SelectedCANConfigExdDto == null)
{
SelectedCANConfigExdDto = new CANConfigExdDto()
{
Id = 0,
BaudRate = 500000,
DbcPath = string.Empty,
Cycle = 100,
SchEnable = false,
};
}
}
else
{
if (SelectedCANFdConfigExdDto == null)
{
SelectedCANFdConfigExdDto = new CANFdConfigExdDto()
{
Id = 0,
ArbBaudRate = 500000,
DataBaudRate = 2000000,
ISOEnable = true,
ResEnable = false,
DbcPath = string.Empty,
Cycle = 100,
SchEnable = false,
};
}
}
}
// 切换模式后,为避免界面仍显示旧的 DBC 信号列表,清空信号集合。
// 配置程序列表不应随模式切换而过滤/刷新。
ListCanDbcModel = new ObservableCollection();
}
}
private DelegateCommand