VibrationPara.xaml.cs 32 KB

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