using AutoMapper;
using CapMachine.Core;
using CapMachine.Model.CANLIN;
using CapMachine.Wpf.CanDrive;
using CapMachine.Wpf.Dtos;
using CapMachine.Wpf.Services;
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.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;
InitLoadCanConfigPro();
}
///
/// 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 List _canLinConfigPros = new List();
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 ZlgCanMode _selectedMode;
///
/// 模式选择:CAN/CANFD(单选)。
///
public ZlgCanMode SelectedMode
{
get { return _selectedMode; }
set
{
_selectedMode = value;
RaisePropertyChanged();
RaisePropertyChanged(nameof(DbcPathTitle));
RaisePropertyChanged(nameof(SelectedModeKey));
RaisePropertyChanged(nameof(CurrentDbcPath));
RaisePropertyChanged(nameof(CurrentCycle));
RaisePropertyChanged(nameof(CurrentSchEnable));
RaisePropertyChanged(nameof(CanBaudRate));
RaisePropertyChanged(nameof(CanFdArbBaudRate));
RaisePropertyChanged(nameof(CanFdDataBaudRate));
RaisePropertyChanged(nameof(ConnectButtonText));
ZlgCanDriveService.Mode = value;
InitLoadCanConfigPro();
}
}
///
/// 连接按钮文字(对齐 Toomoss 风格)。
///
public string ConnectButtonText
{
get { return SelectedMode == ZlgCanMode.Can ? "连接CAN" : "连接CANFD"; }
}
///
/// 绑定用:模式 Key(Can/CanFd)。
///
public string SelectedModeKey
{
get { return SelectedMode == ZlgCanMode.Can ? "Can" : "CanFd"; }
set
{
if (string.Equals(value, "Can", StringComparison.OrdinalIgnoreCase))
{
SelectedMode = ZlgCanMode.Can;
return;
}
if (string.Equals(value, "CanFd", StringComparison.OrdinalIgnoreCase) || string.Equals(value, "CanFD", StringComparison.OrdinalIgnoreCase))
{
SelectedMode = ZlgCanMode.CanFd;
return;
}
}
}
///
/// DBC 路径标题。
///
public string DbcPathTitle
{
get { return SelectedMode == ZlgCanMode.Can ? "CAN DBC 文件路径:" : "CANFD DBC 文件路径:"; }
}
private ObservableCollection? _listCanLinConfigPro;
///
/// 配置程序集合。
///
public ObservableCollection? ListCanLinConfigPro
{
get { return _listCanLinConfigPro; }
set { _listCanLinConfigPro = value; RaisePropertyChanged(); }
}
///
/// 选中的配置程序。
///
public CanLinConfigPro? SelectCanLinConfigPro { get; set; }
private ObservableCollection? _listCanDbcModel;
///
/// DBC 信号集合。
///
public ObservableCollection? ListCanDbcModel
{
get { return _listCanDbcModel; }
set { _listCanDbcModel = value; RaisePropertyChanged(); }
}
///
/// 当前选中的 DBC 信号。
///
public CanDbcModel? SelectedCanDbcModel { get; set; }
private CANConfigExdDto? _selectedCANConfigExdDto;
///
/// CAN 配置 DTO。
///
public CANConfigExdDto? SelectedCANConfigExdDto
{
get { return _selectedCANConfigExdDto; }
set { _selectedCANConfigExdDto = value; RaisePropertyChanged(); }
}
private CANFdConfigExdDto? _selectedCANFdConfigExdDto;
///
/// CANFD 配置 DTO。
///
public CANFdConfigExdDto? SelectedCANFdConfigExdDto
{
get { return _selectedCANFdConfigExdDto; }
set { _selectedCANFdConfigExdDto = value; RaisePropertyChanged(); }
}
private void InitLoadCanConfigPro()
{
var info = SelectedMode == ZlgCanMode.Can ? CANLIN.CAN : CANLIN.CANFD;
_canLinConfigPros = FreeSql.Select()
.Where(a => a.CANLINInfo == info)
.Include(a => a.CANConfigExd)
.Include(a => a.CANFdConfigExd)
.IncludeMany(a => a.CanLinConfigContents, then => then.Include(b => b.LogicRule))
.ToList();
ListCanLinConfigPro = new ObservableCollection(_canLinConfigPros);
}
private void SyncSelectedConfig()
{
if (SelectCanLinConfigPro == null)
{
return;
}
if (SelectedMode == ZlgCanMode.Can)
{
SelectedCANConfigExdDto = Mapper.Map(SelectCanLinConfigPro.CANConfigExd);
SelectedCANFdConfigExdDto = null;
}
else
{
SelectedCANFdConfigExdDto = Mapper.Map(SelectCanLinConfigPro.CANFdConfigExd);
SelectedCANConfigExdDto = null;
}
RaisePropertyChanged(nameof(CurrentDbcPath));
RaisePropertyChanged(nameof(CurrentCycle));
RaisePropertyChanged(nameof(CurrentSchEnable));
RaisePropertyChanged(nameof(CanBaudRate));
RaisePropertyChanged(nameof(CanFdArbBaudRate));
RaisePropertyChanged(nameof(CanFdDataBaudRate));
}
///
/// 当前 DBC 路径(随模式切换映射到对应 DTO)。
///
public string? CurrentDbcPath
{
get
{
return SelectedMode == ZlgCanMode.Can
? SelectedCANConfigExdDto?.DbcPath
: SelectedCANFdConfigExdDto?.DbcPath;
}
set
{
if (SelectedMode == ZlgCanMode.Can)
{
if (SelectedCANConfigExdDto == null) return;
SelectedCANConfigExdDto.DbcPath = value;
}
else
{
if (SelectedCANFdConfigExdDto == null) return;
SelectedCANFdConfigExdDto.DbcPath = value;
}
RaisePropertyChanged();
}
}
///
/// 当前周期(随模式切换映射到对应 DTO)。
///
public int CurrentCycle
{
get
{
return SelectedMode == ZlgCanMode.Can
? (SelectedCANConfigExdDto?.Cycle ?? 0)
: (SelectedCANFdConfigExdDto?.Cycle ?? 0);
}
set
{
if (SelectedMode == ZlgCanMode.Can)
{
if (SelectedCANConfigExdDto == null) return;
SelectedCANConfigExdDto.Cycle = value;
}
else
{
if (SelectedCANFdConfigExdDto == null) return;
SelectedCANFdConfigExdDto.Cycle = value;
}
RaisePropertyChanged();
}
}
///
/// 当前调度使能(随模式切换映射到对应 DTO)。
///
public bool CurrentSchEnable
{
get
{
return SelectedMode == ZlgCanMode.Can
? (SelectedCANConfigExdDto?.SchEnable ?? false)
: (SelectedCANFdConfigExdDto?.SchEnable ?? false);
}
set
{
if (SelectedMode == ZlgCanMode.Can)
{
if (SelectedCANConfigExdDto == null) return;
SelectedCANConfigExdDto.SchEnable = value;
}
else
{
if (SelectedCANFdConfigExdDto == null) return;
SelectedCANFdConfigExdDto.SchEnable = value;
}
RaisePropertyChanged();
}
}
///
/// CAN 波特率。
///
public int CanBaudRate
{
get { return SelectedCANConfigExdDto?.BaudRate ?? 0; }
set
{
if (SelectedCANConfigExdDto == null) return;
SelectedCANConfigExdDto.BaudRate = value;
RaisePropertyChanged();
}
}
///
/// CANFD 仲裁波特率。
///
public int CanFdArbBaudRate
{
get { return SelectedCANFdConfigExdDto?.ArbBaudRate ?? 0; }
set
{
if (SelectedCANFdConfigExdDto == null) return;
SelectedCANFdConfigExdDto.ArbBaudRate = value;
RaisePropertyChanged();
}
}
///
/// CANFD 数据波特率。
///
public int CanFdDataBaudRate
{
get { return SelectedCANFdConfigExdDto?.DataBaudRate ?? 0; }
set
{
if (SelectedCANFdConfigExdDto == null) return;
SelectedCANFdConfigExdDto.DataBaudRate = value;
RaisePropertyChanged();
}
}
private void MatchSeletedAndCanDbcModel()
{
if (ListCanDbcModel == null || ListCanDbcModel.Count == 0) return;
if (SelectCanLinConfigPro?.CanLinConfigContents == null || SelectCanLinConfigPro.CanLinConfigContents.Count == 0) return;
foreach (var itemCanDbcModel in ListCanDbcModel)
{
var findData = SelectCanLinConfigPro.CanLinConfigContents.FindFirst(a => a.SignalName == itemCanDbcModel.SignalName);
if (findData != null)
{
switch (findData.RWInfo)
{
case RW.Write:
itemCanDbcModel.IsSeletedInfo = 1;
break;
case RW.Read:
itemCanDbcModel.IsSeletedInfo = 2;
break;
default:
itemCanDbcModel.IsSeletedInfo = 0;
break;
}
}
else
{
itemCanDbcModel.IsSeletedInfo = 0;
}
}
}
private DelegateCommand