using CapMachine.Model.CANLIN; using CapMachine.Wpf.CanDrive; using ImTools; using Prism.Ioc; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CapMachine.Wpf.Services { /// /// Can FD驱动服务 /// public class CanFdDriveService : BindableBase { public HighSpeedDataService HighSpeedDataService { get; } /// /// 实例化函数 /// public CanFdDriveService(HighSpeedDataService highSpeedDataService, IContainerProvider containerProvider) { ToomossCanFDDrive = new ToomossCanFD(containerProvider); //高速数据服务 HighSpeedDataService = highSpeedDataService; //ToomossCanFDDrive.StartCanDrive(); } /// /// 当前选中的CanLinConfigPro 程序 /// public CanLinConfigPro SelectedCanLinConfigPro { get; set; } /// /// 图莫斯 CAN Drive /// ToomossCanFDDrive /// public ToomossCanFD ToomossCanFDDrive { get; set; } /// /// Dbc消息集合 /// 包括读取的实时值和数据 /// public ObservableCollection ListCanDbcModel { get; set; } = new ObservableCollection(); /// /// 初始化CAN的配置信息 /// public void InitCanConfig(CanLinConfigPro selectedCanLinConfigPro) { //赋值配置数据 SelectedCanLinConfigPro = selectedCanLinConfigPro; //为DBC实时数据关联配置的名称 foreach (var item in SelectedCanLinConfigPro.CanLinConfigContents) { var FindData = ListCanDbcModel.FindFirst(a => a.SignalName == item.SignalName); if (FindData != null) { FindData.Name = item.Name; } } } /// /// 开始DBC 配置文件 加载 /// /// public ObservableCollection StartDbc(string Path) { ListCanDbcModel = ToomossCanFDDrive.StartDbc(Path); return ListCanDbcModel; } #region 程序驱动CAN /// /// 转速 指令数据 实例 /// private CanCmdData SpeedCanCmdData { get; set; } /// /// 功率限制 指令数据 实例 /// private CanCmdData PwLimitCanCmdData { get; set; } /// /// 使能 指令数据 实例 /// private CanCmdData EnableCanCmdData { get; set; } /// /// PTC使能 指令数据 实例 /// private CanCmdData PTCEnableCanCmdData { get; set; } /// /// PTC功率 指令数据 实例 /// private CanCmdData PTCPwCanCmdData { get; set; } /// /// PTC水流量 指令数据 实例 /// private CanCmdData PTCFlowCanCmdData { get; set; } /// /// PTC水温 指令数据 实例 /// private CanCmdData PTCWaterTempCanCmdData { get; set; } /// /// 要发送的CAN指令数据 /// 在程序配置好后就确定要发送哪些数据 /// public List CmdData { get; set; } = new List(); /// /// 增加发送的指令数据 /// /// public void AddCmdData(CanCmdData SendCanCmdData) { //提取常用的实例数据 switch (SendCanCmdData.ConfigName) { case "转速": SpeedCanCmdData = SendCanCmdData; break; case "功率限制": PwLimitCanCmdData = SendCanCmdData; break; case "使能": EnableCanCmdData = SendCanCmdData; break; case "Anti_Sleep": //SpeedCanCmdData = SendCanCmdData; break; case "PTC使能": PTCEnableCanCmdData = SendCanCmdData; break; case "PTC功率": PTCPwCanCmdData = SendCanCmdData; break; case "PTC水流量": PTCFlowCanCmdData = SendCanCmdData; break; case "PTC水温": PTCWaterTempCanCmdData = SendCanCmdData; break; default: break; } //添加到发送数据集合 CmdData.Add(SendCanCmdData); } /// /// 更新速度信息 /// 默认是启动 /// /// public void UpdateSpeedCmdData(double SpeedData) { if (SpeedCanCmdData != null) { SpeedCanCmdData.SignalCmdValue = SpeedData; } //if (EnableCanCmdData != null) //{ // EnableCanCmdData.SignalCmdValue = 1; //} } /// /// 更新压缩机使能数据 /// /// public void UpdateCapEnableCmdData(bool IsEnable) { if (EnableCanCmdData != null) { EnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0; } } /// /// 更新压缩机的功率限制 /// /// public void UpdateCapPwLimitCmdData(double PwLimit) { if (PwLimitCanCmdData != null) { PwLimitCanCmdData.SignalCmdValue = PwLimit; } } /// /// 更新 PTC使能信号 /// /// public void UpdateCapPTCEnableCmdData(bool IsEnable) { if (PTCEnableCanCmdData != null) { PTCEnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0; } } /// /// 更新 PTC功率 信号 /// /// public void UpdateCapPTCPwCmdData(double PTCPw) { if (PTCPwCanCmdData != null) { PTCPwCanCmdData.SignalCmdValue = PTCPw; } } /// /// 更新 PTC水流量 信号 /// /// public void UpdateCapPTCFlowCmdData(double Flow) { if (PTCFlowCanCmdData != null) { PTCFlowCanCmdData.SignalCmdValue = Flow; } } /// /// 更新 PTC水温 信号 /// /// public void UpdateCapPTCWaterTempCmdData(double WaterTemp) { if (PTCWaterTempCanCmdData != null) { PTCWaterTempCanCmdData.SignalCmdValue = WaterTemp; } } /// /// 发送消息给CAN 驱动 /// public void SendMsgToCanDrive(double SpeedData) { if (ToomossCanFDDrive.OpenState) { if (CmdData.Count > 0) { //更新速度信息 UpdateSpeedCmdData(SpeedData); ToomossCanFDDrive.SendCanMsg(CmdData); } else { System.Windows.MessageBox.Show("未发现配置的数据内容", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand); } } else { System.Windows.MessageBox.Show("未打开CAN通信,无法发送数据", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand); } } /// /// 循环发送数据到CAN /// public void CycleSendMsg() { if (ToomossCanFDDrive.OpenState) { if (ToomossCanFDDrive.IsCycleSend == false) { if (CmdData.Count > 0) { ToomossCanFDDrive.IsCycleSend = true; ToomossCanFDDrive.CmdData = CmdData; //ToomossCanFDDrive.StartCycleSendMsg(); ToomossCanFDDrive.StartPrecisionCycleSendMsg(); } else { System.Windows.MessageBox.Show("未发现配置的数据内容", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand); } } else { ToomossCanFDDrive.IsCycleSend = false; } } } /// ///循环接收数据 /// public void CycleReciveMsg() { if (ToomossCanFDDrive.OpenState) { if (ToomossCanFDDrive.IsCycleRevice == false) { if (ListCanDbcModel.Count > 0) { ToomossCanFDDrive.IsCycleRevice = true; ToomossCanFDDrive.StartCycleReviceCanMsg(); } else { System.Windows.MessageBox.Show("未发现配置的数据内容", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand); } } else { ToomossCanFDDrive.IsCycleRevice = false; } } } /// /// 获取数据值 /// 从DBC中获取数据给数据中心集合 /// /// /// public double GetDbcValueByName(string Name) { if (!ToomossCanFDDrive.IsCycleRevice) return 0; if (ListCanDbcModel.Any(a => a.Name == Name)) { //double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue, out double Result1); return double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue.Split(" ")[0], out double Result) == true ? Result : 0; //return 12.3; } return 0; } /// /// 速度的数据的获取 /// 获取速度数据值 /// 从DBC中获取Speed数据给数据中心集合 /// /// /// public double GetDbcSpeedValueBySpeedName(string Name) { if (!ToomossCanFDDrive.IsCycleRevice) return 0; if (ListCanDbcModel.Any(a => a.Name == Name)) { //double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue, out double Result1); //return double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue.Split(" ")[0], out double Result) == true ? Result : 0; return double.TryParse(ListCanDbcModel.FindFirst(a => a.Name == Name).SignalRtValue.Split(" ")[0], out double Result) == true ? Result : 0; //return 2300; } return 0; } #endregion } }