FeederOutput.xaml.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. using MaterialDesignThemes.Wpf;
  2. using Prism.Commands;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Collections.ObjectModel;
  6. using System.ComponentModel;
  7. using System.Linq;
  8. using System.Runtime.CompilerServices;
  9. using System.Security.Cryptography;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows;
  13. using System.Windows.Controls;
  14. using System.Windows.Data;
  15. using System.Windows.Documents;
  16. using System.Windows.Input;
  17. using System.Windows.Media;
  18. using System.Windows.Media.Imaging;
  19. using System.Windows.Navigation;
  20. using System.Windows.Shapes;
  21. using Team.FFFeederService.Interfaces;
  22. using Team.FFFeederService.Models;
  23. using TouchSocket.Core;
  24. namespace TeamAAS_VP.Controls
  25. {
  26. /// <summary>
  27. /// FeederOutput.xaml 的交互逻辑
  28. /// </summary>
  29. public partial class FeederOutput : UserControl, INotifyPropertyChanged
  30. {
  31. public FeederOutput()
  32. {
  33. InitializeComponent();
  34. this.DataContext = this;
  35. SequenceCollection = new ObservableCollection<string>();
  36. for (var i = 'A'; i < 'Z'; i++)
  37. {
  38. SequenceCollection.Add(i.ToString());
  39. }
  40. SequenceItems = new ObservableCollection<int>();
  41. for (var i = 1; i <= 26; i++)
  42. {
  43. SequenceItems.Add(i);
  44. }
  45. }
  46. #region 属性
  47. public IVoiceCoilMotorFeeder Feeder { get; set; }
  48. private ObservableCollection<string> _SequenceCollection;
  49. /// <summary>
  50. /// 输出振动集
  51. /// </summary>
  52. public ObservableCollection<string> SequenceCollection
  53. {
  54. get { return _SequenceCollection; }
  55. set { SetProperty(ref _SequenceCollection,value); }
  56. }
  57. private int _SelectedSequence=-1;
  58. /// <summary>
  59. /// 当前选择输出
  60. /// </summary>
  61. public int SelectedSequence
  62. {
  63. get { return _SelectedSequence; }
  64. set { SetProperty(ref _SelectedSequence, value); }
  65. }
  66. private HopperFeederParam _CurrentUpperFeederParamDto;
  67. /// <summary>
  68. /// 当前选中的料仓参数
  69. /// </summary>
  70. public HopperFeederParam CurrentUpperFeederParamDto
  71. {
  72. get { return _CurrentUpperFeederParamDto; }
  73. set { SetProperty(ref _CurrentUpperFeederParamDto, value); }
  74. }
  75. private ObservableCollection<int> _SequenceItems;
  76. /// <summary>
  77. /// 输入触发序列集
  78. /// </summary>
  79. public ObservableCollection<int> SequenceItems
  80. {
  81. get { return _SequenceItems; }
  82. set { SetProperty(ref _SequenceItems,value); }
  83. }
  84. private int _InputTriggerId1=-1;
  85. /// <summary>
  86. /// 当前1选中的序列
  87. /// </summary>
  88. public int InputTriggerId1
  89. {
  90. get { return _InputTriggerId1; }
  91. set { SetProperty(ref _InputTriggerId1, value); }
  92. }
  93. private int _InputTriggerId2 = -1;
  94. /// <summary>
  95. /// 当前2选中的序列
  96. /// </summary>
  97. public int InputTriggerId2
  98. {
  99. get { return _InputTriggerId2; }
  100. set { SetProperty(ref _InputTriggerId2, value); }
  101. }
  102. #endregion
  103. #region 命令
  104. private DelegateCommand _SelectSequenceCommand;
  105. public DelegateCommand SelectSequenceCommand =>
  106. _SelectSequenceCommand ?? (_SelectSequenceCommand = new DelegateCommand(ExecuteSelectSequenceCommand));
  107. private DelegateCommand _StopActionCommand;
  108. public DelegateCommand StopActionCommand =>
  109. _StopActionCommand ?? (_StopActionCommand = new DelegateCommand(ExecuteStopActionCommand));
  110. private DelegateCommand _WriteParamCommand;
  111. public DelegateCommand WriteParamCommand =>
  112. _WriteParamCommand ?? (_WriteParamCommand = new DelegateCommand(ExecuteWriteParamCommand));
  113. private DelegateCommand _ExecuteActionCommand;
  114. public DelegateCommand ExecuteActionCommand =>
  115. _ExecuteActionCommand ?? (_ExecuteActionCommand = new DelegateCommand(ExecuteExecuteActionCommand));
  116. private DelegateCommand _SelectInputSequenceCommand1;
  117. public DelegateCommand SelectInputSequenceCommand1 =>
  118. _SelectInputSequenceCommand1 ?? (_SelectInputSequenceCommand1 = new DelegateCommand(ExecuteSelectInputSequenceCommand1));
  119. private DelegateCommand _SelectInputSequenceCommand2;
  120. public DelegateCommand SelectInputSequenceCommand2 =>
  121. _SelectInputSequenceCommand2 ?? (_SelectInputSequenceCommand2 = new DelegateCommand(ExecuteSelectInputSequenceCommand2));
  122. private DelegateCommand _WriteInputCommand;
  123. public DelegateCommand WriteInputCommand =>
  124. _WriteInputCommand ?? (_WriteInputCommand = new DelegateCommand(ExecuteWriteInputCommand));
  125. #endregion
  126. #region 方法
  127. /// <summary>
  128. /// 选中输出时
  129. /// </summary>
  130. async void ExecuteSelectSequenceCommand()
  131. {
  132. if (Feeder == null) return;
  133. if (!Feeder.IsConnected) return;
  134. if (SelectedSequence == -1) return;
  135. var param = await Feeder.GetUpperParamAsync(SelectedSequence);
  136. CurrentUpperFeederParamDto = param;
  137. var index = await Feeder.GetInputTrigger(1);
  138. if (index <= 0 || index > 26)
  139. {
  140. InputTriggerId2 = 1;
  141. }
  142. InputTriggerId1 = index - 1;
  143. index = await Feeder.GetInputTrigger(2);
  144. InputTriggerId2 = index - 1;
  145. }
  146. /// <summary>
  147. /// 选中输入1触发序列时
  148. /// </summary>
  149. async void ExecuteSelectInputSequenceCommand1()
  150. {
  151. if (Feeder == null) return;
  152. if (!Feeder.IsConnected) return;
  153. if (InputTriggerId2 == -1) return;
  154. try
  155. {
  156. var index = await Feeder.GetInputTrigger(1);
  157. if (index <= 0 || index > 26)
  158. {
  159. InputTriggerId1 = 1;
  160. }
  161. else
  162. {
  163. InputTriggerId1 = index - 1;
  164. }
  165. }
  166. catch (Exception)
  167. {
  168. }
  169. }
  170. /// <summary>
  171. /// 选中输入2触发序列时
  172. /// </summary>
  173. async void ExecuteSelectInputSequenceCommand2()
  174. {
  175. if (Feeder == null) return;
  176. if (!Feeder.IsConnected) return;
  177. if (InputTriggerId2 == -1) return;
  178. try
  179. {
  180. var index = await Feeder.GetInputTrigger(2);
  181. if (index <= 0 || index > 26)
  182. {
  183. InputTriggerId2 = 1;
  184. }
  185. else
  186. {
  187. InputTriggerId2 = index - 1;
  188. }
  189. }
  190. catch (Exception)
  191. {
  192. }
  193. }
  194. /// <summary>
  195. /// 执行
  196. /// </summary>
  197. async void ExecuteExecuteActionCommand()
  198. {
  199. if (Feeder == null) return;
  200. if (!Feeder.IsConnected) return;
  201. if (SelectedSequence < 0) return;
  202. try
  203. {
  204. await Feeder.OutputAsync(SelectedSequence + 1, CurrentUpperFeederParamDto.HopperDuration);
  205. }
  206. catch (Exception)
  207. {
  208. }
  209. }
  210. /// <summary>
  211. /// 停止
  212. /// </summary>
  213. async void ExecuteStopActionCommand()
  214. {
  215. if (Feeder == null) return;
  216. if (!Feeder.IsConnected) return;
  217. if (SelectedSequence < 0) return;
  218. try
  219. {
  220. await Feeder.StopOutputAsync();
  221. }
  222. catch (Exception)
  223. {
  224. }
  225. }
  226. /// <summary>
  227. /// 下载参数
  228. /// </summary>
  229. async void ExecuteWriteParamCommand()
  230. {
  231. if (Feeder == null) return;
  232. if (!Feeder.IsConnected) return;
  233. if (SelectedSequence < 0) return;
  234. if (CurrentUpperFeederParamDto == null)
  235. {
  236. return;
  237. }
  238. try
  239. {
  240. await Feeder.WriteOutputParamAsync(SelectedSequence, CurrentUpperFeederParamDto);
  241. }
  242. catch (Exception)
  243. {
  244. }
  245. }
  246. /// <summary>
  247. /// 下载参数
  248. /// </summary>
  249. async void ExecuteWriteInputCommand()
  250. {
  251. if (Feeder == null) return;
  252. if (!Feeder.IsConnected) return;
  253. if (InputTriggerId1 < 0) return;
  254. if (InputTriggerId1 < 2) return;
  255. try
  256. {
  257. await Feeder.SetInputTrigger(1, InputTriggerId1 + 1);
  258. await Feeder.SetInputTrigger(2, InputTriggerId2 + 1);
  259. }
  260. catch (Exception)
  261. {
  262. }
  263. }
  264. #endregion
  265. #region 属性更改通知
  266. /// <summary>
  267. /// Occurs when a property value changes.
  268. /// </summary>
  269. public event PropertyChangedEventHandler PropertyChanged;
  270. /// <summary>
  271. /// Checks if a property already matches a desired value. Sets the property and
  272. /// notifies listeners only when necessary.
  273. /// </summary>
  274. /// <typeparam name="T">Type of the property.</typeparam>
  275. /// <param name="storage">Reference to a property with both getter and setter.</param>
  276. /// <param name="value">Desired value for the property.</param>
  277. /// <param name="propertyName">Name of the property used to notify listeners. This
  278. /// value is optional and can be provided automatically when invoked from compilers that
  279. /// support CallerMemberName.</param>
  280. /// <returns>True if the value was changed, false if the existing value matched the
  281. /// desired value.</returns>
  282. protected virtual bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
  283. {
  284. if (EqualityComparer<T>.Default.Equals(storage, value)) return false;
  285. storage = value;
  286. RaisePropertyChanged(propertyName);
  287. return true;
  288. }
  289. /// <summary>
  290. /// Checks if a property already matches a desired value. Sets the property and
  291. /// notifies listeners only when necessary.
  292. /// </summary>
  293. /// <typeparam name="T">Type of the property.</typeparam>
  294. /// <param name="storage">Reference to a property with both getter and setter.</param>
  295. /// <param name="value">Desired value for the property.</param>
  296. /// <param name="propertyName">Name of the property used to notify listeners. This
  297. /// value is optional and can be provided automatically when invoked from compilers that
  298. /// support CallerMemberName.</param>
  299. /// <param name="onChanged">Action that is called after the property value has been changed.</param>
  300. /// <returns>True if the value was changed, false if the existing value matched the
  301. /// desired value.</returns>
  302. protected virtual bool SetProperty<T>(ref T storage, T value, Action onChanged, [CallerMemberName] string propertyName = null)
  303. {
  304. if (EqualityComparer<T>.Default.Equals(storage, value)) return false;
  305. storage = value;
  306. onChanged?.Invoke();
  307. RaisePropertyChanged(propertyName);
  308. return true;
  309. }
  310. /// <summary>
  311. /// Raises this object's PropertyChanged event.
  312. /// </summary>
  313. /// <param name="propertyName">Name of the property used to notify listeners. This
  314. /// value is optional and can be provided automatically when invoked from compilers
  315. /// that support <see cref="CallerMemberNameAttribute"/>.</param>
  316. protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
  317. {
  318. OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
  319. }
  320. /// <summary>
  321. /// Raises this object's PropertyChanged event.
  322. /// </summary>
  323. /// <param name="args">The PropertyChangedEventArgs</param>
  324. protected virtual void OnPropertyChanged(PropertyChangedEventArgs args)
  325. {
  326. PropertyChanged?.Invoke(this, args);
  327. }
  328. #endregion
  329. }
  330. }