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驱动服务 /// public class CanDriveService : BindableBase { public HighSpeedDataService HighSpeedDataService { get; } /// /// 实例化函数 /// public CanDriveService(HighSpeedDataService highSpeedDataService, IContainerProvider containerProvider) { ToomossCanDrive = new ToomossCan(containerProvider); //高速数据服务 HighSpeedDataService = highSpeedDataService; //ToomossCanDrive.StartCanDrive(); } /// /// 当前选中的CanLinConfigPro 程序 /// public CanLinConfigPro SelectedCanLinConfigPro { get; set; } /// /// 图莫斯 CAN Drive /// ToomossCanDrive /// public ToomossCan ToomossCanDrive { 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 = ToomossCanDrive.StartDbc(Path); return ListCanDbcModel; } #region 程序驱动CAN /// /// 转速 指令数据 实例 /// private CanCmdData SpeedCanCmdData { get; set; } /// /// 功率限制 指令数据 实例 /// private CanCmdData PwLimitCanCmdData { get; set; } /// /// 使能 指令数据 实例 /// private CanCmdData EnableCanCmdData { 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; default: break; } //添加到发送数据集合 CmdData.Add(SendCanCmdData); } /// /// 更新速度信息 /// 默认是启动 /// /// public void UpdateSpeedCmdData(double SpeedData) { if (SpeedCanCmdData != null) { SpeedCanCmdData.SignalCmdValue = SpeedData; } if (EnableCanCmdData!=null) { EnableCanCmdData.SignalCmdValue = 1; } } /// /// 发送消息给CAN 驱动 /// public void SendMsgToCanDrive(double SpeedData) { if (ToomossCanDrive.OpenState) { if (CmdData.Count > 0) { //更新速度信息 UpdateSpeedCmdData(SpeedData); ToomossCanDrive.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 (ToomossCanDrive.OpenState) { if (ToomossCanDrive.IsCycleSend == false) { if (CmdData.Count > 0) { ToomossCanDrive.IsCycleSend = true; ToomossCanDrive.CmdData = CmdData; ToomossCanDrive.StartCycleSendMsg(); } else { System.Windows.MessageBox.Show("未发现配置的数据内容", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand); } } else { ToomossCanDrive.IsCycleSend = false; } } } /// ///循环接收数据 /// public void CycleReciveMsg() { if (ToomossCanDrive.OpenState) { if (ToomossCanDrive.IsCycleRevice == false) { if (ListCanDbcModel.Count > 0) { ToomossCanDrive.IsCycleRevice = true; ToomossCanDrive.StartCycleReviceCanMsg(); } else { System.Windows.MessageBox.Show("未发现配置的数据内容", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand); } } else { ToomossCanDrive.IsCycleRevice = false; } } } #endregion } }