VibrationPara.xaml.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  1. using Prism.Commands;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Collections.ObjectModel;
  5. using System.ComponentModel;
  6. using System.Data.SqlTypes;
  7. using System.Globalization;
  8. using System.Linq;
  9. using System.Runtime.CompilerServices;
  10. using System.Runtime.Remoting.Channels;
  11. using System.Security.Cryptography;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using System.Windows;
  15. using System.Windows.Controls;
  16. using System.Windows.Data;
  17. using System.Windows.Documents;
  18. using System.Windows.Input;
  19. using System.Windows.Media;
  20. using System.Windows.Media.Imaging;
  21. using System.Windows.Navigation;
  22. using System.Windows.Shapes;
  23. using Team.FFFeederService.Enums;
  24. using Team.FFFeederService.Interfaces;
  25. using Team.FFFeederService.Models;
  26. using TeamAAS_VP;
  27. using TouchSocket.Core;
  28. namespace TeamAAS_VP.Controls
  29. {
  30. /// <summary>
  31. /// VibrationPara.xaml 的交互逻辑
  32. /// </summary>
  33. public partial class VibrationPara : UserControl, INotifyPropertyChanged
  34. {
  35. private bool IsLoading = false;
  36. public VibrationPara()
  37. {
  38. InitializeComponent();
  39. this.DataContext = this;
  40. this.Loaded += VibrationPara_Loaded;
  41. ProgramCollection.Clear();
  42. for (int i = 1; i <= 26; i++)
  43. {
  44. ProgramCollection.Add(i);
  45. char chn = (char)('A' + i);
  46. }
  47. }
  48. #region 属性
  49. public IVoiceCoilMotorFeeder Feeder { get; set; }
  50. private ObservableCollection<int> _ProgramCollection=new ObservableCollection<int>();
  51. /// <summary>
  52. /// 振动集
  53. /// </summary>
  54. public ObservableCollection<int> ProgramCollection
  55. {
  56. get { return _ProgramCollection; }
  57. set { SetProperty(ref _ProgramCollection,value); }
  58. }
  59. private int _SelectProgram=-1;
  60. /// <summary>
  61. /// 当前选择的振动集编号
  62. /// </summary>
  63. public int SelectProgram
  64. {
  65. get { return _SelectProgram; }
  66. set { SetProperty(ref _SelectProgram, value); }
  67. }
  68. private int _SelectedShakeMotionIndex=-1;
  69. /// <summary>
  70. /// 当前选择的动作
  71. /// </summary>
  72. public int SelectedShakeMotionIndex
  73. {
  74. get { return _SelectedShakeMotionIndex; }
  75. set { SetProperty(ref _SelectedShakeMotionIndex, value); }
  76. }
  77. private double _Duration;
  78. /// <summary>
  79. /// 持续时间
  80. /// </summary>
  81. public double Duration
  82. {
  83. get { return _Duration; }
  84. set { SetProperty(ref _Duration, value); }
  85. }
  86. private VoiceMotorParam _Motor1;
  87. /// <summary>
  88. /// 音圈电机1
  89. /// </summary>
  90. public VoiceMotorParam Motor1
  91. {
  92. get { return _Motor1; }
  93. set { SetProperty(ref _Motor1, value); }
  94. }
  95. private VoiceMotorParam _Motor2;
  96. /// <summary>
  97. /// 音圈电机2
  98. /// </summary>
  99. public VoiceMotorParam Motor2
  100. {
  101. get { return _Motor2; }
  102. set { SetProperty(ref _Motor2, value); }
  103. }
  104. private VoiceMotorParam _Motor3;
  105. /// <summary>
  106. /// 音圈电机3
  107. /// </summary>
  108. public VoiceMotorParam Motor3
  109. {
  110. get { return _Motor3; }
  111. set { SetProperty(ref _Motor3, value); }
  112. }
  113. private VoiceMotorParam _Motor4;
  114. /// <summary>
  115. /// 音圈电机4
  116. /// </summary>
  117. public VoiceMotorParam Motor4
  118. {
  119. get { return _Motor4; }
  120. set { SetProperty(ref _Motor4, value); }
  121. }
  122. private bool _IsSyncChanging;
  123. /// <summary>
  124. /// 同步
  125. /// </summary>
  126. public bool IsSyncChanging
  127. {
  128. get { return _IsSyncChanging; }
  129. set { SetProperty(ref _IsSyncChanging, value); }
  130. }
  131. private ushort _CurrentAmplitude;
  132. /// <summary>
  133. /// 当前的振幅
  134. /// </summary>
  135. public ushort CurrentAmplitude
  136. {
  137. get { return _CurrentAmplitude; }
  138. set { SetProperty(ref _CurrentAmplitude, value); }
  139. }
  140. private ushort _CurrentFrequency;
  141. /// <summary>
  142. /// 当前的频率
  143. /// </summary>
  144. public ushort CurrentFrequency
  145. {
  146. get { return _CurrentFrequency; }
  147. set { SetProperty(ref _CurrentFrequency, value); }
  148. }
  149. private ushort _CurrentPhase;
  150. /// <summary>
  151. /// 当前相位
  152. /// </summary>
  153. public ushort CurrentPhase
  154. {
  155. get { return _CurrentPhase; }
  156. set { _CurrentPhase = value; }
  157. }
  158. private WaveShape _CurrentWaveShape;
  159. /// <summary>
  160. /// 当前波形
  161. /// </summary>
  162. public WaveShape CurrentWaveShape
  163. {
  164. get { return _CurrentWaveShape; }
  165. set { _CurrentWaveShape = value; }
  166. }
  167. #endregion
  168. #region 命令
  169. private DelegateCommand _SelectProgramCommand;
  170. public DelegateCommand SelectProgramCommand =>
  171. _SelectProgramCommand ?? (_SelectProgramCommand = new DelegateCommand(ExecuteSelectProgramCommand));
  172. private DelegateCommand<int?> _SelectActionCommand;
  173. public DelegateCommand<int?> SelectActionCommand =>
  174. _SelectActionCommand ?? (_SelectActionCommand = new DelegateCommand<int?>(ExecuteSelectActionCommand));
  175. private DelegateCommand<double?> _DurationChangedCommand;
  176. public DelegateCommand<double?> DurationChangedCommand =>
  177. _DurationChangedCommand ?? (_DurationChangedCommand = new DelegateCommand<double?>(ExecuteDurationChangedCommand));
  178. private DelegateCommand _ExecuteFromSelected;
  179. public DelegateCommand ExecuteFromSelected =>
  180. _ExecuteFromSelected ?? (_ExecuteFromSelected = new DelegateCommand(ExecuteExecuteFromSelected));
  181. private DelegateCommand _ExecuteStopCommand;
  182. public DelegateCommand ExecuteStopCommand =>
  183. _ExecuteStopCommand ?? (_ExecuteStopCommand = new DelegateCommand(ExecuteExecuteStopCommand));
  184. private DelegateCommand _SaveParamCommand;
  185. public DelegateCommand SaveParamCommand =>
  186. _SaveParamCommand ?? (_SaveParamCommand = new DelegateCommand(ExecuteSaveParamCommand));
  187. private DelegateCommand<string> _VoiceMotorParamChangedCommand;
  188. public DelegateCommand<string> VoiceMotorParamChangedCommand =>
  189. _VoiceMotorParamChangedCommand ?? (_VoiceMotorParamChangedCommand = new DelegateCommand<string>(MotorParamChangedCommand));
  190. private DelegateCommand<string> _WaveShapeChangedCommand;
  191. public DelegateCommand<string> WaveShapeChangedCommand =>
  192. _WaveShapeChangedCommand ?? (_WaveShapeChangedCommand = new DelegateCommand<string>(ExecuteWaveShapeChangedCommand));
  193. private DelegateCommand _AmplitudeChangedCommand;
  194. public DelegateCommand AmplitudeChangedCommand =>
  195. _AmplitudeChangedCommand ?? (_AmplitudeChangedCommand = new DelegateCommand(ExecuteAmplitudeChangedCommand));
  196. private DelegateCommand _FrequencyChangedCommand;
  197. public DelegateCommand FrequencyChangedCommand =>
  198. _FrequencyChangedCommand ?? (_FrequencyChangedCommand = new DelegateCommand(ExecuteFrequencyChangedCommand));
  199. #endregion
  200. #region 事件
  201. #endregion
  202. #region 方法
  203. private async void VibrationPara_Loaded(object sender, RoutedEventArgs e)
  204. {
  205. if (Feeder == null || !Feeder.IsConnected) return;
  206. if (SelectProgram==-1)
  207. {
  208. try
  209. {
  210. SelectProgram = 0;
  211. IsLoading = true;
  212. //选择振动集
  213. await Feeder.SelectShakeParamAsync(1);
  214. SelectedShakeMotionIndex = 0;
  215. //获取当前动作的4个电机的参数
  216. var paramCollection = await Feeder.GetShakeGroupValueAsync(0);
  217. Motor1 = paramCollection.Motor1;
  218. Motor2 = paramCollection.Motor2;
  219. Motor3 = paramCollection.Motor3;
  220. Motor4 = paramCollection.Motor4;
  221. Duration = (double)paramCollection.DurationValue;
  222. }
  223. catch (Exception ex)
  224. {
  225. LogHelper.WriteLogError("Feeder参数加载时出错!", ex);
  226. }
  227. IsLoading = false;
  228. }
  229. }
  230. /// <summary>
  231. /// 选择振动集时触发
  232. /// </summary>
  233. async void ExecuteSelectProgramCommand()
  234. {
  235. if (SelectProgram == -1)
  236. {
  237. return;
  238. }
  239. if (Feeder == null)
  240. {
  241. SelectProgram = -1;
  242. return;
  243. }
  244. var id = SelectProgram+1;
  245. try
  246. {
  247. //选择振动集
  248. await Feeder.SelectShakeParamAsync(id);
  249. if (SelectedShakeMotionIndex == -1)
  250. {
  251. SelectedShakeMotionIndex = await Feeder.GetSelectedSequenceAsync() - 1;
  252. if (SelectedShakeMotionIndex < 0 || SelectedShakeMotionIndex > 25)
  253. {
  254. SelectedShakeMotionIndex = 0;
  255. }
  256. }
  257. await Task.Delay(100);
  258. var selectedActionId = SelectedShakeMotionIndex;
  259. IsLoading = true;
  260. //获取当前动作的4个电机的参数
  261. var paramCollection = await Feeder.GetShakeGroupValueAsync(selectedActionId);
  262. Motor1 = paramCollection.Motor1;
  263. Motor2 = paramCollection.Motor2;
  264. Motor3 = paramCollection.Motor3;
  265. Motor4 = paramCollection.Motor4;
  266. Duration= (double)paramCollection.DurationValue;
  267. }
  268. catch (Exception ex)
  269. {
  270. LogHelper.WriteLogError("Feeder选择振动集时触发时出错!", ex);
  271. }
  272. IsLoading = false;
  273. }
  274. /// <summary>
  275. /// 选择动作时触发
  276. /// </summary>
  277. /// <param name="index"></param>
  278. async void ExecuteSelectActionCommand(int? index)
  279. {
  280. if (SelectedShakeMotionIndex == -1)
  281. {
  282. return;
  283. }
  284. if (Feeder == null)
  285. {
  286. SelectedShakeMotionIndex = -1;
  287. return;
  288. }
  289. if (!Feeder.IsConnected)
  290. {
  291. SelectedShakeMotionIndex = -1;
  292. return;
  293. }
  294. try
  295. {
  296. var selectedActionId = SelectedShakeMotionIndex;
  297. //获取当前动作的4个电机的参数
  298. IsLoading=true;
  299. var paramCollection = await Feeder.GetShakeGroupValueAsync(selectedActionId);
  300. Motor1 = paramCollection.Motor1;
  301. Motor2 = paramCollection.Motor2;
  302. Motor3 = paramCollection.Motor3;
  303. Motor4 = paramCollection.Motor4;
  304. Duration = (double)paramCollection.DurationValue;
  305. }
  306. catch (Exception ex)
  307. {
  308. LogHelper.WriteLogError("Feeder选择动作时触发时出错!", ex);
  309. }
  310. IsLoading = false;
  311. }
  312. /// <summary>
  313. /// 持续时间更改时
  314. /// </summary>
  315. /// <param name="duration"></param>
  316. async void ExecuteDurationChangedCommand(double? duration)
  317. {
  318. try
  319. {
  320. if (SelectedShakeMotionIndex >= 0 && Feeder != null && Feeder.IsConnected && !IsLoading)
  321. {
  322. await Feeder.SetShakeParametersAsync(SelectedShakeMotionIndex, 16, ((int)Duration).ToString());
  323. }
  324. }
  325. catch (Exception ex)
  326. {
  327. LogHelper.WriteLogError("Feeder持续时间更改时出错!", ex);
  328. }
  329. }
  330. /// <summary>
  331. /// 执行动作
  332. /// </summary>
  333. async void ExecuteExecuteFromSelected()
  334. {
  335. if (SelectedShakeMotionIndex == -1)
  336. {
  337. return;
  338. }
  339. if (Feeder == null)
  340. {
  341. return;
  342. }
  343. if (!Feeder.IsConnected)
  344. {
  345. return;
  346. }
  347. try
  348. {
  349. //加载平台振动参数
  350. await Feeder.GetShakeParametersAsync(SelectedShakeMotionIndex);
  351. //执行平台动作
  352. await Feeder.StartAction(SelectedShakeMotionIndex, (int)Duration);
  353. }
  354. catch (Exception ex)
  355. {
  356. LogHelper.WriteLogError("Feeder执行动作时出错!", ex);
  357. }
  358. }
  359. /// <summary>
  360. /// 停止动作
  361. /// </summary>
  362. async void ExecuteExecuteStopCommand()
  363. {
  364. if (Feeder == null)
  365. {
  366. return;
  367. }
  368. if (!Feeder.IsConnected)
  369. {
  370. return;
  371. }
  372. try
  373. {
  374. await Feeder.StopAsync();
  375. }
  376. catch (Exception ex)
  377. {
  378. LogHelper.WriteLogError("Feeder停止动作时出错!", ex);
  379. }
  380. }
  381. /// <summary>
  382. /// 保存参数
  383. /// </summary>
  384. async void ExecuteSaveParamCommand()
  385. {
  386. try
  387. {
  388. if (Motor1 == null || Motor2 == null || Motor3 == null || Motor4 == null) return;
  389. var motionId = SelectedShakeMotionIndex;
  390. SingleActionParam singleActionParam = new SingleActionParam()
  391. {
  392. Motor1=Motor1,
  393. Motor2=Motor2,
  394. Motor3=Motor3,
  395. Motor4=Motor4,
  396. DurationValue=(int)Duration,
  397. };
  398. await Feeder.SetShakeParametersAsync(motionId, singleActionParam);
  399. await Feeder.SaveShakeSetAsync();
  400. }
  401. catch (Exception ex)
  402. {
  403. LogHelper.WriteLogError("Feeder保存参数时出错!", ex);
  404. }
  405. }
  406. /// <summary>
  407. /// 电机参数变更
  408. /// </summary>
  409. /// <param name="param"></param>
  410. async void MotorParamChangedCommand(string param)
  411. {
  412. try
  413. {
  414. if (Motor1 == null || Motor2 == null || Motor3 == null || Motor4 == null) return;
  415. if (IsSyncChanging) //同步时
  416. {
  417. if (IsLoading)
  418. return;
  419. IsLoading = true;
  420. string[] item = param.Split('-');
  421. if (Convert.ToInt16(item[1]) == 1)
  422. {
  423. //振幅
  424. if (Convert.ToInt16(item[0]) == 1)
  425. {
  426. CurrentAmplitude = Motor1.Amplitude;
  427. Motor2.Amplitude = CurrentAmplitude;
  428. Motor3.Amplitude = CurrentAmplitude;
  429. Motor4.Amplitude = CurrentAmplitude;
  430. }
  431. else if (Convert.ToInt16(item[0]) == 2)
  432. {
  433. CurrentAmplitude = Motor2.Amplitude;
  434. Motor1.Amplitude = CurrentAmplitude;
  435. Motor3.Amplitude = CurrentAmplitude;
  436. Motor4.Amplitude = CurrentAmplitude;
  437. }
  438. else if (Convert.ToInt16(item[0]) == 3)
  439. {
  440. CurrentAmplitude = Motor3.Amplitude;
  441. Motor1.Amplitude = CurrentAmplitude;
  442. Motor2.Amplitude = CurrentAmplitude;
  443. Motor4.Amplitude = CurrentAmplitude;
  444. }
  445. else if (Convert.ToInt16(item[0]) == 4)
  446. {
  447. CurrentAmplitude = Motor4.Amplitude;
  448. Motor2.Amplitude = CurrentAmplitude;
  449. Motor3.Amplitude = CurrentAmplitude;
  450. Motor1.Amplitude = CurrentAmplitude;
  451. }
  452. }
  453. else if (Convert.ToInt16(item[1]) == 2)
  454. {
  455. //频率
  456. if (Convert.ToInt16(item[0]) == 1)
  457. {
  458. CurrentFrequency = Motor1.Frequency;
  459. Motor2.Frequency = CurrentFrequency;
  460. Motor3.Frequency = CurrentFrequency;
  461. Motor4.Frequency = CurrentFrequency;
  462. }
  463. else if (Convert.ToInt16(item[0]) == 2)
  464. {
  465. CurrentFrequency = Motor2.Frequency;
  466. Motor1.Frequency = CurrentFrequency;
  467. Motor3.Frequency = CurrentFrequency;
  468. Motor4.Frequency = CurrentFrequency;
  469. }
  470. else if (Convert.ToInt16(item[0]) == 3)
  471. {
  472. CurrentFrequency = Motor3.Frequency;
  473. Motor2.Frequency = CurrentFrequency;
  474. Motor1.Frequency = CurrentFrequency;
  475. Motor4.Frequency = CurrentFrequency;
  476. }
  477. else if (Convert.ToInt16(item[0]) == 4)
  478. {
  479. CurrentFrequency = Motor4.Frequency;
  480. Motor2.Frequency = CurrentFrequency;
  481. Motor3.Frequency = CurrentFrequency;
  482. Motor1.Frequency = CurrentFrequency;
  483. }
  484. }
  485. IsLoading = false;
  486. var motionId = SelectedShakeMotionIndex;
  487. SingleActionParam singleActionParam = new SingleActionParam()
  488. {
  489. Motor1 = Motor1,
  490. Motor2 = Motor2,
  491. Motor3 = Motor3,
  492. Motor4 = Motor4,
  493. DurationValue = (int)Duration,
  494. };
  495. await Feeder.SetShakeParametersAsync(motionId, singleActionParam);
  496. }
  497. else //不同步时
  498. {
  499. if (SelectedShakeMotionIndex == -1)
  500. {
  501. return;
  502. }
  503. if (Feeder == null || !Feeder.IsConnected)
  504. {
  505. return;
  506. }
  507. if (IsLoading)
  508. return;
  509. var motionId = SelectedShakeMotionIndex;
  510. string[] item = param.Split('-');
  511. if (Convert.ToInt16(item[1]) == 1)
  512. {
  513. //振幅
  514. if (Convert.ToInt16(item[0]) == 1)
  515. {
  516. await Feeder.SetShakeParametersAsync(motionId, 0, Motor1.Amplitude.ToString());
  517. }
  518. else if (Convert.ToInt16(item[0]) == 2)
  519. {
  520. await Feeder.SetShakeParametersAsync(motionId, 4, Motor2.Amplitude.ToString());
  521. }
  522. else if (Convert.ToInt16(item[0]) == 3)
  523. {
  524. await Feeder.SetShakeParametersAsync(motionId, 8, Motor3.Amplitude.ToString());
  525. }
  526. else if (Convert.ToInt16(item[0]) == 4)
  527. {
  528. await Feeder.SetShakeParametersAsync(motionId, 12, Motor4.Amplitude.ToString());
  529. }
  530. }
  531. else if (Convert.ToInt16(item[1]) == 2)
  532. {
  533. //频率
  534. if (Convert.ToInt16(item[0]) == 1)
  535. {
  536. await Feeder.SetShakeParametersAsync(motionId, 1, Motor1.Frequency.ToString());
  537. }
  538. else if (Convert.ToInt16(item[0]) == 2)
  539. {
  540. await Feeder.SetShakeParametersAsync(motionId, 5, Motor2.Frequency.ToString());
  541. }
  542. else if (Convert.ToInt16(item[0]) == 3)
  543. {
  544. await Feeder.SetShakeParametersAsync(motionId, 9, Motor3.Frequency.ToString());
  545. }
  546. else if (Convert.ToInt16(item[0]) == 4)
  547. {
  548. await Feeder.SetShakeParametersAsync(motionId, 13, Motor4.Frequency.ToString());
  549. }
  550. }
  551. else if (Convert.ToInt16(item[1]) == 3)
  552. {
  553. //相位
  554. if (Convert.ToInt16(item[0]) == 1)
  555. {
  556. await Feeder.SetShakeParametersAsync(motionId, 2, Motor1.Phase.ToString());
  557. }
  558. else if (Convert.ToInt16(item[0]) == 2)
  559. {
  560. await Feeder.SetShakeParametersAsync(motionId, 6, Motor2.Phase.ToString());
  561. }
  562. else if (Convert.ToInt16(item[0]) == 3)
  563. {
  564. await Feeder.SetShakeParametersAsync(motionId, 10, Motor3.Phase.ToString());
  565. }
  566. else if (Convert.ToInt16(item[0]) == 4)
  567. {
  568. await Feeder.SetShakeParametersAsync(motionId, 14, Motor4.Phase.ToString());
  569. }
  570. }
  571. }
  572. }
  573. catch (Exception ex)
  574. {
  575. LogHelper.WriteLogError("Feeder电机参数变更时出错!", ex);
  576. }
  577. }
  578. /// <summary>
  579. /// 电机波形变更
  580. /// </summary>
  581. /// <param name="param"></param>
  582. async void ExecuteWaveShapeChangedCommand(string param)
  583. {
  584. if (Motor1 == null || Motor2 == null || Motor3 == null || Motor4 == null) return;
  585. if (SelectedShakeMotionIndex == -1)
  586. {
  587. return;
  588. }
  589. if (Feeder == null || !Feeder.IsConnected)
  590. {
  591. return;
  592. }
  593. if (IsLoading)
  594. return;
  595. IsLoading = true;
  596. try
  597. {
  598. string[] item = param.Split('-');
  599. switch (Convert.ToInt16(item[0]))
  600. {
  601. case 1:
  602. if (Motor1 != null)
  603. {
  604. Motor1.WaveShape = (WaveShape)(Convert.ToInt16(item[1]) - 1);
  605. if (Motor1.WaveShape == WaveShape.None)
  606. {
  607. Motor1.Amplitude = 0;
  608. Motor1.Frequency = 0;
  609. Motor1.Phase = 0;
  610. }
  611. }
  612. break;
  613. case 2:
  614. if (Motor2 != null)
  615. {
  616. Motor2.WaveShape = (WaveShape)(Convert.ToInt16(item[1]) - 1);
  617. if (Motor2.WaveShape == WaveShape.None)
  618. {
  619. Motor2.Amplitude = 0;
  620. Motor2.Frequency = 0;
  621. Motor2.Phase = 0;
  622. }
  623. }
  624. break;
  625. case 3:
  626. if (Motor3 != null)
  627. {
  628. Motor3.WaveShape = (WaveShape)(Convert.ToInt16(item[1]) - 1);
  629. if (Motor3.WaveShape == WaveShape.None)
  630. {
  631. Motor3.Amplitude = 0;
  632. Motor3.Frequency = 0;
  633. Motor3.Phase = 0;
  634. }
  635. }
  636. break;
  637. case 4:
  638. if (Motor4 != null)
  639. {
  640. Motor4.WaveShape = (WaveShape)(Convert.ToInt16(item[1]) - 1);
  641. if (Motor4.WaveShape == WaveShape.None)
  642. {
  643. Motor4.Amplitude = 0;
  644. Motor4.Frequency = 0;
  645. Motor4.Phase = 0;
  646. }
  647. }
  648. break;
  649. default:
  650. break;
  651. }
  652. var motionId = SelectedShakeMotionIndex;
  653. SingleActionParam singleActionParam = new SingleActionParam()
  654. {
  655. Motor1 = Motor1,
  656. Motor2 = Motor2,
  657. Motor3 = Motor3,
  658. Motor4 = Motor4,
  659. DurationValue = (int)Duration,
  660. };
  661. await Feeder.SetShakeParametersAsync(motionId, singleActionParam);
  662. }
  663. catch (Exception ex)
  664. {
  665. LogHelper.WriteLogError("Feeder电机波形变更时出错!", ex);
  666. }
  667. IsLoading = false;
  668. }
  669. /// <summary>
  670. /// 同步栏振幅更改事件
  671. /// </summary>
  672. async void ExecuteAmplitudeChangedCommand()
  673. {
  674. try
  675. {
  676. if (!IsSyncChanging) return;
  677. if (IsLoading) return;
  678. if (Motor1 == null || Motor2 == null || Motor3 == null || Motor4 == null) return;
  679. IsLoading = true;
  680. if (Motor1.WaveShape != WaveShape.None)
  681. {
  682. Motor1.Amplitude = CurrentAmplitude;
  683. }
  684. if (Motor2.WaveShape != WaveShape.None)
  685. {
  686. Motor2.Amplitude = CurrentAmplitude;
  687. }
  688. if (Motor3.WaveShape != WaveShape.None)
  689. {
  690. Motor3.Amplitude = CurrentAmplitude;
  691. }
  692. if (Motor4.WaveShape != WaveShape.None)
  693. {
  694. Motor4.Amplitude = CurrentAmplitude;
  695. }
  696. IsLoading = false;
  697. var motionId = SelectedShakeMotionIndex;
  698. SingleActionParam singleActionParam = new SingleActionParam()
  699. {
  700. Motor1 = Motor1,
  701. Motor2 = Motor2,
  702. Motor3 = Motor3,
  703. Motor4 = Motor4,
  704. DurationValue = (int)Duration,
  705. };
  706. await Feeder.SetShakeParametersAsync(motionId, singleActionParam);
  707. }
  708. catch (Exception ex)
  709. {
  710. LogHelper.WriteLogError("Feeder同步栏振幅更改事件时出错!", ex);
  711. }
  712. }
  713. /// <summary>
  714. /// 同步栏频率更改事件
  715. /// </summary>
  716. async void ExecuteFrequencyChangedCommand()
  717. {
  718. try
  719. {
  720. if (!IsSyncChanging) return;
  721. if (IsLoading) return;
  722. if (Motor1 == null || Motor2 == null || Motor3 == null || Motor4 == null) return;
  723. IsLoading = true;
  724. if (Motor1.WaveShape != WaveShape.None)
  725. {
  726. Motor1.Frequency = CurrentFrequency;
  727. }
  728. if (Motor2.WaveShape != WaveShape.None)
  729. {
  730. Motor2.Frequency = CurrentFrequency;
  731. }
  732. if (Motor3.WaveShape != WaveShape.None)
  733. {
  734. Motor3.Frequency = CurrentFrequency;
  735. }
  736. if (Motor4.WaveShape != WaveShape.None)
  737. {
  738. Motor4.Frequency = CurrentFrequency;
  739. }
  740. IsLoading = false;
  741. var motionId = SelectedShakeMotionIndex;
  742. SingleActionParam singleActionParam = new SingleActionParam()
  743. {
  744. Motor1 = Motor1,
  745. Motor2 = Motor2,
  746. Motor3 = Motor3,
  747. Motor4 = Motor4,
  748. DurationValue = (int)Duration,
  749. };
  750. await Feeder.SetShakeParametersAsync(motionId, singleActionParam);
  751. }
  752. catch (Exception ex)
  753. {
  754. LogHelper.WriteLogError("Feeder同步栏频率更改事件时出错!", ex);
  755. }
  756. }
  757. #endregion
  758. #region 属性更改通知
  759. /// <summary>
  760. /// Occurs when a property value changes.
  761. /// </summary>
  762. public event PropertyChangedEventHandler PropertyChanged;
  763. /// <summary>
  764. /// Checks if a property already matches a desired value. Sets the property and
  765. /// notifies listeners only when necessary.
  766. /// </summary>
  767. /// <typeparam name="T">Type of the property.</typeparam>
  768. /// <param name="storage">Reference to a property with both getter and setter.</param>
  769. /// <param name="value">Desired value for the property.</param>
  770. /// <param name="propertyName">Name of the property used to notify listeners. This
  771. /// value is optional and can be provided automatically when invoked from compilers that
  772. /// support CallerMemberName.</param>
  773. /// <returns>True if the value was changed, false if the existing value matched the
  774. /// desired value.</returns>
  775. protected virtual bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
  776. {
  777. if (EqualityComparer<T>.Default.Equals(storage, value)) return false;
  778. storage = value;
  779. RaisePropertyChanged(propertyName);
  780. return true;
  781. }
  782. /// <summary>
  783. /// Checks if a property already matches a desired value. Sets the property and
  784. /// notifies listeners only when necessary.
  785. /// </summary>
  786. /// <typeparam name="T">Type of the property.</typeparam>
  787. /// <param name="storage">Reference to a property with both getter and setter.</param>
  788. /// <param name="value">Desired value for the property.</param>
  789. /// <param name="propertyName">Name of the property used to notify listeners. This
  790. /// value is optional and can be provided automatically when invoked from compilers that
  791. /// support CallerMemberName.</param>
  792. /// <param name="onChanged">Action that is called after the property value has been changed.</param>
  793. /// <returns>True if the value was changed, false if the existing value matched the
  794. /// desired value.</returns>
  795. protected virtual bool SetProperty<T>(ref T storage, T value, Action onChanged, [CallerMemberName] string propertyName = null)
  796. {
  797. if (EqualityComparer<T>.Default.Equals(storage, value)) return false;
  798. storage = value;
  799. onChanged?.Invoke();
  800. RaisePropertyChanged(propertyName);
  801. return true;
  802. }
  803. /// <summary>
  804. /// Raises this object's PropertyChanged event.
  805. /// </summary>
  806. /// <param name="propertyName">Name of the property used to notify listeners. This
  807. /// value is optional and can be provided automatically when invoked from compilers
  808. /// that support <see cref="CallerMemberNameAttribute"/>.</param>
  809. protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
  810. {
  811. OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
  812. }
  813. /// <summary>
  814. /// Raises this object's PropertyChanged event.
  815. /// </summary>
  816. /// <param name="args">The PropertyChangedEventArgs</param>
  817. protected virtual void OnPropertyChanged(PropertyChangedEventArgs args)
  818. {
  819. PropertyChanged?.Invoke(this, args);
  820. }
  821. #endregion
  822. }
  823. }