using CapMachine.Model.CANLIN; using CapMachine.Wpf.LinDrive; 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 { /// /// Lin驱动服务 /// public class LinDriveService : BindableBase { public HighSpeedDataService HighSpeedDataService { get; } /// /// 实例化函数 /// public LinDriveService(HighSpeedDataService highSpeedDataService, IContainerProvider containerProvider) { ToomossLinDrive = new ToomossLin(containerProvider); //高速数据服务 HighSpeedDataService = highSpeedDataService; //ToomossLinDrive.StartLinDrive(); } /// /// 当前选中的CanLinConfigPro 程序 /// public CanLinConfigPro SelectedCanLinConfigPro { get; set; } /// /// 图莫斯 CAN Drive /// ToomossLinDrive /// public ToomossLin ToomossLinDrive { get; set; } /// /// Ldf消息集合 /// 包括读取的实时值和数据 /// public ObservableCollection ListLinLdfModel { get; set; } = new ObservableCollection(); /// /// 初始化CAN的配置信息 /// public void InitLinConfig(CanLinConfigPro selectedLinLinConfigPro) { //赋值配置数据 SelectedCanLinConfigPro = selectedLinLinConfigPro; //为DBC实时数据关联配置的名称 foreach (var item in SelectedCanLinConfigPro.CanLinConfigContents) { var FindData = ListLinLdfModel.FindFirst(a => a.SignalName == item.SignalName); if (FindData != null) { FindData.Name = item.Name; } } } /// /// 开始DBC 配置文件 加载 /// /// public ObservableCollection StartLdf(string Path) { ListLinLdfModel = ToomossLinDrive.StartLdf(Path); return ListLinLdfModel; } #region 程序驱动CAN private int _AutoSpeedSv; /// /// 转速SV /// public int AutoSpeedSv { get { return _AutoSpeedSv; } set { _AutoSpeedSv = value; RaisePropertyChanged(); } } /// /// 转速 指令数据 实例 /// private LinCmdData SpeedLinCmdData { get; set; } /// /// 功率限制 指令数据 实例 /// private LinCmdData PwLimitLinCmdData { get; set; } /// /// 使能 指令数据 实例 /// private LinCmdData EnableLinCmdData { get; set; } /// /// 要发送的CAN指令数据 /// 在程序配置好后就确定要发送哪些数据 /// public List CmdData { get; set; } = new List(); /// /// 增加发送的指令数据 /// /// public void AddCmdData(LinCmdData SendLinCmdData) { //提取常用的实例数据 switch (SendLinCmdData.ConfigName) { case "转速": SpeedLinCmdData = SendLinCmdData; break; case "功率限制": PwLimitLinCmdData = SendLinCmdData; break; case "使能": EnableLinCmdData = SendLinCmdData; break; case "Anti_Sleep": //SpeedLinCmdData = SendLinCmdData; break; default: break; } //添加到发送数据集合 CmdData.Add(SendLinCmdData); } /// /// 更新速度信息 /// 默认是启动 /// /// public void UpdateSpeedCmdData(double SpeedData) { if (SpeedLinCmdData != null) { AutoSpeedSv = (int)SpeedData; SpeedLinCmdData.SignalCmdValue = SpeedData; } //if (EnableLinCmdData != null) //{ // EnableLinCmdData.SignalCmdValue = 1; //} } /// /// 更新压缩机使能数据 /// /// public void UpdateCapEnableCmdData(bool IsEnable) { if (!ToomossLinDrive.IsCycleSend) return; if (EnableLinCmdData != null) { EnableLinCmdData.SignalCmdValue = IsEnable ? 1 : 0; } } /// /// 更新压缩机使能数据 手动时的赋值数据 /// /// public void UpdateCapEnableCmdDataByHand(bool IsEnable) { if (EnableLinCmdData != null) { EnableLinCmdData.SignalCmdValue = IsEnable ? 1 : 0; //Console.WriteLine("压缩机使能:" + IsEnable); } } /// /// 发送消息给CAN 驱动 /// public void SendMsgToLinDrive(double SpeedData) { if (ToomossLinDrive.OpenState) { if (CmdData.Count > 0) { //更新速度信息 UpdateSpeedCmdData(SpeedData); //ToomossLinDrive.SendLinMsg(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 (ToomossLinDrive.OpenState) { if (ToomossLinDrive.IsCycleSend == false) { if (CmdData.Count > 0) { ToomossLinDrive.IsCycleSend = true; ToomossLinDrive.CmdData = CmdData; ToomossLinDrive.StartCycleSendMsg(); } else { System.Windows.MessageBox.Show("未发现配置的数据内容", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand); } } else { ToomossLinDrive.IsCycleSend = false; } } } /// ///循环接收数据 /// public void CycleReciveMsg() { if (ToomossLinDrive.OpenState) { if (ToomossLinDrive.IsCycleRevice == false) { if (ListLinLdfModel.Count > 0) { ToomossLinDrive.IsCycleRevice = true; ToomossLinDrive.StartCycleReviceMsg(); } else { System.Windows.MessageBox.Show("未发现配置的数据内容", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand); } } else { ToomossLinDrive.IsCycleRevice = false; } } } /// /// 获取数据值 /// 从DBC中获取数据给数据中心集合 /// /// /// public double GetLdfValueByName(string Name) { if (!ToomossLinDrive.IsCycleRevice) return 0; if (ListLinLdfModel.Any(a => a.Name == Name)) { //double.TryParse(ListLinLdfModel.FindFirst(a => a.Name == Name).SignalRtValue, out double Result1); return double.TryParse(ListLinLdfModel.FindFirst(a => a.Name == Name).SignalRtValue.Split(" ")[0], out double Result) == true ? Result : 0; } return 0; } /// /// 速度的数据的获取 /// 获取速度数据值 /// 从DBC中获取Speed数据给数据中心集合 /// /// /// public double GetLdfSpeedValueBySpeedName(string Name) { if (!ToomossLinDrive.IsCycleRevice) return 0; if (ListLinLdfModel.Any(a => a.Name == Name)) { //double.TryParse(ListLinLdfModel.FindFirst(a => a.Name == Name).SignalRtValue, out double Result1); return double.TryParse(ListLinLdfModel.FindFirst(a => a.Name == Name).SignalRtValue.Split(" ")[0], out double Result) == true ? Result : 0; } return 0; } #endregion } }