using Prism.Commands; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Data.SqlTypes; using System.Globalization; using System.Linq; using System.Runtime.CompilerServices; using System.Runtime.Remoting.Channels; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Team.FFFeederService.Enums; using Team.FFFeederService.Interfaces; using Team.FFFeederService.Models; using TeamAAS_VP; using TouchSocket.Core; namespace TeamAAS_VP.Controls { /// /// VibrationPara.xaml 的交互逻辑 /// public partial class VibrationPara : UserControl, INotifyPropertyChanged { private bool IsLoading = false; public VibrationPara() { InitializeComponent(); this.DataContext = this; this.Loaded += VibrationPara_Loaded; ProgramCollection.Clear(); for (int i = 1; i <= 26; i++) { ProgramCollection.Add(i); char chn = (char)('A' + i); } } #region 属性 public IVoiceCoilMotorFeeder Feeder { get; set; } private ObservableCollection _ProgramCollection=new ObservableCollection(); /// /// 振动集 /// public ObservableCollection ProgramCollection { get { return _ProgramCollection; } set { SetProperty(ref _ProgramCollection,value); } } private int _SelectProgram=-1; /// /// 当前选择的振动集编号 /// public int SelectProgram { get { return _SelectProgram; } set { SetProperty(ref _SelectProgram, value); } } private int _SelectedShakeMotionIndex=-1; /// /// 当前选择的动作 /// public int SelectedShakeMotionIndex { get { return _SelectedShakeMotionIndex; } set { SetProperty(ref _SelectedShakeMotionIndex, value); } } private double _Duration; /// /// 持续时间 /// public double Duration { get { return _Duration; } set { SetProperty(ref _Duration, value); } } private VoiceMotorParam _Motor1; /// /// 音圈电机1 /// public VoiceMotorParam Motor1 { get { return _Motor1; } set { SetProperty(ref _Motor1, value); } } private VoiceMotorParam _Motor2; /// /// 音圈电机2 /// public VoiceMotorParam Motor2 { get { return _Motor2; } set { SetProperty(ref _Motor2, value); } } private VoiceMotorParam _Motor3; /// /// 音圈电机3 /// public VoiceMotorParam Motor3 { get { return _Motor3; } set { SetProperty(ref _Motor3, value); } } private VoiceMotorParam _Motor4; /// /// 音圈电机4 /// public VoiceMotorParam Motor4 { get { return _Motor4; } set { SetProperty(ref _Motor4, value); } } private bool _IsSyncChanging; /// /// 同步 /// public bool IsSyncChanging { get { return _IsSyncChanging; } set { SetProperty(ref _IsSyncChanging, value); } } private ushort _CurrentAmplitude; /// /// 当前的振幅 /// public ushort CurrentAmplitude { get { return _CurrentAmplitude; } set { SetProperty(ref _CurrentAmplitude, value); } } private ushort _CurrentFrequency; /// /// 当前的频率 /// public ushort CurrentFrequency { get { return _CurrentFrequency; } set { SetProperty(ref _CurrentFrequency, value); } } private ushort _CurrentPhase; /// /// 当前相位 /// public ushort CurrentPhase { get { return _CurrentPhase; } set { _CurrentPhase = value; } } private WaveShape _CurrentWaveShape; /// /// 当前波形 /// public WaveShape CurrentWaveShape { get { return _CurrentWaveShape; } set { _CurrentWaveShape = value; } } #endregion #region 命令 private DelegateCommand _SelectProgramCommand; public DelegateCommand SelectProgramCommand => _SelectProgramCommand ?? (_SelectProgramCommand = new DelegateCommand(ExecuteSelectProgramCommand)); private DelegateCommand _SelectActionCommand; public DelegateCommand SelectActionCommand => _SelectActionCommand ?? (_SelectActionCommand = new DelegateCommand(ExecuteSelectActionCommand)); private DelegateCommand _DurationChangedCommand; public DelegateCommand DurationChangedCommand => _DurationChangedCommand ?? (_DurationChangedCommand = new DelegateCommand(ExecuteDurationChangedCommand)); private DelegateCommand _ExecuteFromSelected; public DelegateCommand ExecuteFromSelected => _ExecuteFromSelected ?? (_ExecuteFromSelected = new DelegateCommand(ExecuteExecuteFromSelected)); private DelegateCommand _ExecuteStopCommand; public DelegateCommand ExecuteStopCommand => _ExecuteStopCommand ?? (_ExecuteStopCommand = new DelegateCommand(ExecuteExecuteStopCommand)); private DelegateCommand _SaveParamCommand; public DelegateCommand SaveParamCommand => _SaveParamCommand ?? (_SaveParamCommand = new DelegateCommand(ExecuteSaveParamCommand)); private DelegateCommand _VoiceMotorParamChangedCommand; public DelegateCommand VoiceMotorParamChangedCommand => _VoiceMotorParamChangedCommand ?? (_VoiceMotorParamChangedCommand = new DelegateCommand(MotorParamChangedCommand)); private DelegateCommand _WaveShapeChangedCommand; public DelegateCommand WaveShapeChangedCommand => _WaveShapeChangedCommand ?? (_WaveShapeChangedCommand = new DelegateCommand(ExecuteWaveShapeChangedCommand)); private DelegateCommand _AmplitudeChangedCommand; public DelegateCommand AmplitudeChangedCommand => _AmplitudeChangedCommand ?? (_AmplitudeChangedCommand = new DelegateCommand(ExecuteAmplitudeChangedCommand)); private DelegateCommand _FrequencyChangedCommand; public DelegateCommand FrequencyChangedCommand => _FrequencyChangedCommand ?? (_FrequencyChangedCommand = new DelegateCommand(ExecuteFrequencyChangedCommand)); #endregion #region 事件 #endregion #region 方法 private async void VibrationPara_Loaded(object sender, RoutedEventArgs e) { if (Feeder == null || !Feeder.IsConnected) return; if (SelectProgram==-1) { try { SelectProgram = 0; IsLoading = true; //选择振动集 await Feeder.SelectShakeParamAsync(1); SelectedShakeMotionIndex = 0; //获取当前动作的4个电机的参数 var paramCollection = await Feeder.GetShakeGroupValueAsync(0); Motor1 = paramCollection.Motor1; Motor2 = paramCollection.Motor2; Motor3 = paramCollection.Motor3; Motor4 = paramCollection.Motor4; Duration = (double)paramCollection.DurationValue; } catch (Exception ex) { LogHelper.WriteLogError("Feeder参数加载时出错!", ex); } IsLoading = false; } } /// /// 选择振动集时触发 /// async void ExecuteSelectProgramCommand() { if (SelectProgram == -1) { return; } if (Feeder == null) { SelectProgram = -1; return; } var id = SelectProgram+1; try { //选择振动集 await Feeder.SelectShakeParamAsync(id); if (SelectedShakeMotionIndex == -1) { SelectedShakeMotionIndex = await Feeder.GetSelectedSequenceAsync() - 1; if (SelectedShakeMotionIndex < 0 || SelectedShakeMotionIndex > 25) { SelectedShakeMotionIndex = 0; } } await Task.Delay(100); var selectedActionId = SelectedShakeMotionIndex; IsLoading = true; //获取当前动作的4个电机的参数 var paramCollection = await Feeder.GetShakeGroupValueAsync(selectedActionId); Motor1 = paramCollection.Motor1; Motor2 = paramCollection.Motor2; Motor3 = paramCollection.Motor3; Motor4 = paramCollection.Motor4; Duration= (double)paramCollection.DurationValue; } catch (Exception ex) { LogHelper.WriteLogError("Feeder选择振动集时触发时出错!", ex); } IsLoading = false; } /// /// 选择动作时触发 /// /// async void ExecuteSelectActionCommand(int? index) { if (SelectedShakeMotionIndex == -1) { return; } if (Feeder == null) { SelectedShakeMotionIndex = -1; return; } if (!Feeder.IsConnected) { SelectedShakeMotionIndex = -1; return; } try { var selectedActionId = SelectedShakeMotionIndex; //获取当前动作的4个电机的参数 IsLoading=true; var paramCollection = await Feeder.GetShakeGroupValueAsync(selectedActionId); Motor1 = paramCollection.Motor1; Motor2 = paramCollection.Motor2; Motor3 = paramCollection.Motor3; Motor4 = paramCollection.Motor4; Duration = (double)paramCollection.DurationValue; } catch (Exception ex) { LogHelper.WriteLogError("Feeder选择动作时触发时出错!", ex); } IsLoading = false; } /// /// 持续时间更改时 /// /// async void ExecuteDurationChangedCommand(double? duration) { try { if (SelectedShakeMotionIndex >= 0 && Feeder != null && Feeder.IsConnected && !IsLoading) { await Feeder.SetShakeParametersAsync(SelectedShakeMotionIndex, 16, ((int)Duration).ToString()); } } catch (Exception ex) { LogHelper.WriteLogError("Feeder持续时间更改时出错!", ex); } } /// /// 执行动作 /// async void ExecuteExecuteFromSelected() { if (SelectedShakeMotionIndex == -1) { return; } if (Feeder == null) { return; } if (!Feeder.IsConnected) { return; } try { //加载平台振动参数 await Feeder.GetShakeParametersAsync(SelectedShakeMotionIndex); //执行平台动作 await Feeder.StartAction(SelectedShakeMotionIndex, (int)Duration); } catch (Exception ex) { LogHelper.WriteLogError("Feeder执行动作时出错!", ex); } } /// /// 停止动作 /// async void ExecuteExecuteStopCommand() { if (Feeder == null) { return; } if (!Feeder.IsConnected) { return; } try { await Feeder.StopAsync(); } catch (Exception ex) { LogHelper.WriteLogError("Feeder停止动作时出错!", ex); } } /// /// 保存参数 /// async void ExecuteSaveParamCommand() { try { if (Motor1 == null || Motor2 == null || Motor3 == null || Motor4 == null) return; var motionId = SelectedShakeMotionIndex; SingleActionParam singleActionParam = new SingleActionParam() { Motor1=Motor1, Motor2=Motor2, Motor3=Motor3, Motor4=Motor4, DurationValue=(int)Duration, }; await Feeder.SetShakeParametersAsync(motionId, singleActionParam); await Feeder.SaveShakeSetAsync(); } catch (Exception ex) { LogHelper.WriteLogError("Feeder保存参数时出错!", ex); } } /// /// 电机参数变更 /// /// async void MotorParamChangedCommand(string param) { try { if (Motor1 == null || Motor2 == null || Motor3 == null || Motor4 == null) return; if (IsSyncChanging) //同步时 { if (IsLoading) return; IsLoading = true; string[] item = param.Split('-'); if (Convert.ToInt16(item[1]) == 1) { //振幅 if (Convert.ToInt16(item[0]) == 1) { CurrentAmplitude = Motor1.Amplitude; Motor2.Amplitude = CurrentAmplitude; Motor3.Amplitude = CurrentAmplitude; Motor4.Amplitude = CurrentAmplitude; } else if (Convert.ToInt16(item[0]) == 2) { CurrentAmplitude = Motor2.Amplitude; Motor1.Amplitude = CurrentAmplitude; Motor3.Amplitude = CurrentAmplitude; Motor4.Amplitude = CurrentAmplitude; } else if (Convert.ToInt16(item[0]) == 3) { CurrentAmplitude = Motor3.Amplitude; Motor1.Amplitude = CurrentAmplitude; Motor2.Amplitude = CurrentAmplitude; Motor4.Amplitude = CurrentAmplitude; } else if (Convert.ToInt16(item[0]) == 4) { CurrentAmplitude = Motor4.Amplitude; Motor2.Amplitude = CurrentAmplitude; Motor3.Amplitude = CurrentAmplitude; Motor1.Amplitude = CurrentAmplitude; } } else if (Convert.ToInt16(item[1]) == 2) { //频率 if (Convert.ToInt16(item[0]) == 1) { CurrentFrequency = Motor1.Frequency; Motor2.Frequency = CurrentFrequency; Motor3.Frequency = CurrentFrequency; Motor4.Frequency = CurrentFrequency; } else if (Convert.ToInt16(item[0]) == 2) { CurrentFrequency = Motor2.Frequency; Motor1.Frequency = CurrentFrequency; Motor3.Frequency = CurrentFrequency; Motor4.Frequency = CurrentFrequency; } else if (Convert.ToInt16(item[0]) == 3) { CurrentFrequency = Motor3.Frequency; Motor2.Frequency = CurrentFrequency; Motor1.Frequency = CurrentFrequency; Motor4.Frequency = CurrentFrequency; } else if (Convert.ToInt16(item[0]) == 4) { CurrentFrequency = Motor4.Frequency; Motor2.Frequency = CurrentFrequency; Motor3.Frequency = CurrentFrequency; Motor1.Frequency = CurrentFrequency; } } IsLoading = false; var motionId = SelectedShakeMotionIndex; SingleActionParam singleActionParam = new SingleActionParam() { Motor1 = Motor1, Motor2 = Motor2, Motor3 = Motor3, Motor4 = Motor4, DurationValue = (int)Duration, }; await Feeder.SetShakeParametersAsync(motionId, singleActionParam); } else //不同步时 { if (SelectedShakeMotionIndex == -1) { return; } if (Feeder == null || !Feeder.IsConnected) { return; } if (IsLoading) return; var motionId = SelectedShakeMotionIndex; string[] item = param.Split('-'); if (Convert.ToInt16(item[1]) == 1) { //振幅 if (Convert.ToInt16(item[0]) == 1) { await Feeder.SetShakeParametersAsync(motionId, 0, Motor1.Amplitude.ToString()); } else if (Convert.ToInt16(item[0]) == 2) { await Feeder.SetShakeParametersAsync(motionId, 4, Motor2.Amplitude.ToString()); } else if (Convert.ToInt16(item[0]) == 3) { await Feeder.SetShakeParametersAsync(motionId, 8, Motor3.Amplitude.ToString()); } else if (Convert.ToInt16(item[0]) == 4) { await Feeder.SetShakeParametersAsync(motionId, 12, Motor4.Amplitude.ToString()); } } else if (Convert.ToInt16(item[1]) == 2) { //频率 if (Convert.ToInt16(item[0]) == 1) { await Feeder.SetShakeParametersAsync(motionId, 1, Motor1.Frequency.ToString()); } else if (Convert.ToInt16(item[0]) == 2) { await Feeder.SetShakeParametersAsync(motionId, 5, Motor2.Frequency.ToString()); } else if (Convert.ToInt16(item[0]) == 3) { await Feeder.SetShakeParametersAsync(motionId, 9, Motor3.Frequency.ToString()); } else if (Convert.ToInt16(item[0]) == 4) { await Feeder.SetShakeParametersAsync(motionId, 13, Motor4.Frequency.ToString()); } } else if (Convert.ToInt16(item[1]) == 3) { //相位 if (Convert.ToInt16(item[0]) == 1) { await Feeder.SetShakeParametersAsync(motionId, 2, Motor1.Phase.ToString()); } else if (Convert.ToInt16(item[0]) == 2) { await Feeder.SetShakeParametersAsync(motionId, 6, Motor2.Phase.ToString()); } else if (Convert.ToInt16(item[0]) == 3) { await Feeder.SetShakeParametersAsync(motionId, 10, Motor3.Phase.ToString()); } else if (Convert.ToInt16(item[0]) == 4) { await Feeder.SetShakeParametersAsync(motionId, 14, Motor4.Phase.ToString()); } } } } catch (Exception ex) { LogHelper.WriteLogError("Feeder电机参数变更时出错!", ex); } } /// /// 电机波形变更 /// /// async void ExecuteWaveShapeChangedCommand(string param) { if (Motor1 == null || Motor2 == null || Motor3 == null || Motor4 == null) return; if (SelectedShakeMotionIndex == -1) { return; } if (Feeder == null || !Feeder.IsConnected) { return; } if (IsLoading) return; IsLoading = true; try { string[] item = param.Split('-'); switch (Convert.ToInt16(item[0])) { case 1: if (Motor1 != null) { Motor1.WaveShape = (WaveShape)(Convert.ToInt16(item[1]) - 1); if (Motor1.WaveShape == WaveShape.None) { Motor1.Amplitude = 0; Motor1.Frequency = 0; Motor1.Phase = 0; } } break; case 2: if (Motor2 != null) { Motor2.WaveShape = (WaveShape)(Convert.ToInt16(item[1]) - 1); if (Motor2.WaveShape == WaveShape.None) { Motor2.Amplitude = 0; Motor2.Frequency = 0; Motor2.Phase = 0; } } break; case 3: if (Motor3 != null) { Motor3.WaveShape = (WaveShape)(Convert.ToInt16(item[1]) - 1); if (Motor3.WaveShape == WaveShape.None) { Motor3.Amplitude = 0; Motor3.Frequency = 0; Motor3.Phase = 0; } } break; case 4: if (Motor4 != null) { Motor4.WaveShape = (WaveShape)(Convert.ToInt16(item[1]) - 1); if (Motor4.WaveShape == WaveShape.None) { Motor4.Amplitude = 0; Motor4.Frequency = 0; Motor4.Phase = 0; } } break; default: break; } var motionId = SelectedShakeMotionIndex; SingleActionParam singleActionParam = new SingleActionParam() { Motor1 = Motor1, Motor2 = Motor2, Motor3 = Motor3, Motor4 = Motor4, DurationValue = (int)Duration, }; await Feeder.SetShakeParametersAsync(motionId, singleActionParam); } catch (Exception ex) { LogHelper.WriteLogError("Feeder电机波形变更时出错!", ex); } IsLoading = false; } /// /// 同步栏振幅更改事件 /// async void ExecuteAmplitudeChangedCommand() { try { if (!IsSyncChanging) return; if (IsLoading) return; if (Motor1 == null || Motor2 == null || Motor3 == null || Motor4 == null) return; IsLoading = true; if (Motor1.WaveShape != WaveShape.None) { Motor1.Amplitude = CurrentAmplitude; } if (Motor2.WaveShape != WaveShape.None) { Motor2.Amplitude = CurrentAmplitude; } if (Motor3.WaveShape != WaveShape.None) { Motor3.Amplitude = CurrentAmplitude; } if (Motor4.WaveShape != WaveShape.None) { Motor4.Amplitude = CurrentAmplitude; } IsLoading = false; var motionId = SelectedShakeMotionIndex; SingleActionParam singleActionParam = new SingleActionParam() { Motor1 = Motor1, Motor2 = Motor2, Motor3 = Motor3, Motor4 = Motor4, DurationValue = (int)Duration, }; await Feeder.SetShakeParametersAsync(motionId, singleActionParam); } catch (Exception ex) { LogHelper.WriteLogError("Feeder同步栏振幅更改事件时出错!", ex); } } /// /// 同步栏频率更改事件 /// async void ExecuteFrequencyChangedCommand() { try { if (!IsSyncChanging) return; if (IsLoading) return; if (Motor1 == null || Motor2 == null || Motor3 == null || Motor4 == null) return; IsLoading = true; if (Motor1.WaveShape != WaveShape.None) { Motor1.Frequency = CurrentFrequency; } if (Motor2.WaveShape != WaveShape.None) { Motor2.Frequency = CurrentFrequency; } if (Motor3.WaveShape != WaveShape.None) { Motor3.Frequency = CurrentFrequency; } if (Motor4.WaveShape != WaveShape.None) { Motor4.Frequency = CurrentFrequency; } IsLoading = false; var motionId = SelectedShakeMotionIndex; SingleActionParam singleActionParam = new SingleActionParam() { Motor1 = Motor1, Motor2 = Motor2, Motor3 = Motor3, Motor4 = Motor4, DurationValue = (int)Duration, }; await Feeder.SetShakeParametersAsync(motionId, singleActionParam); } catch (Exception ex) { LogHelper.WriteLogError("Feeder同步栏频率更改事件时出错!", ex); } } #endregion #region 属性更改通知 /// /// Occurs when a property value changes. /// public event PropertyChangedEventHandler PropertyChanged; /// /// Checks if a property already matches a desired value. Sets the property and /// notifies listeners only when necessary. /// /// Type of the property. /// Reference to a property with both getter and setter. /// Desired value for the property. /// Name of the property used to notify listeners. This /// value is optional and can be provided automatically when invoked from compilers that /// support CallerMemberName. /// True if the value was changed, false if the existing value matched the /// desired value. protected virtual bool SetProperty(ref T storage, T value, [CallerMemberName] string propertyName = null) { if (EqualityComparer.Default.Equals(storage, value)) return false; storage = value; RaisePropertyChanged(propertyName); return true; } /// /// Checks if a property already matches a desired value. Sets the property and /// notifies listeners only when necessary. /// /// Type of the property. /// Reference to a property with both getter and setter. /// Desired value for the property. /// Name of the property used to notify listeners. This /// value is optional and can be provided automatically when invoked from compilers that /// support CallerMemberName. /// Action that is called after the property value has been changed. /// True if the value was changed, false if the existing value matched the /// desired value. protected virtual bool SetProperty(ref T storage, T value, Action onChanged, [CallerMemberName] string propertyName = null) { if (EqualityComparer.Default.Equals(storage, value)) return false; storage = value; onChanged?.Invoke(); RaisePropertyChanged(propertyName); return true; } /// /// Raises this object's PropertyChanged event. /// /// Name of the property used to notify listeners. This /// value is optional and can be provided automatically when invoked from compilers /// that support . protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) { OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); } /// /// Raises this object's PropertyChanged event. /// /// The PropertyChangedEventArgs protected virtual void OnPropertyChanged(PropertyChangedEventArgs args) { PropertyChanged?.Invoke(this, args); } #endregion } }