MainWindowViewModel.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. using System;
  2. using System.ComponentModel;
  3. using System.Runtime.CompilerServices;
  4. using System.Windows.Input;
  5. using DigitalKeyUnitCommands;
  6. using InABox.Rpc;
  7. using Microsoft.Xaml.Behaviors.Core;
  8. using InABox.Core;
  9. using System.Timers;
  10. using System.Windows.Media;
  11. using InABox.WPF;
  12. namespace PRSDigitalKeyUnit;
  13. public class MainWindowViewModel : INotifyPropertyChanged
  14. {
  15. private bool _isConnected;
  16. public bool Ch1Active { get; set; }
  17. public bool Ch2Active { get; set; }
  18. public bool Ch3Active { get; set; }
  19. public bool Ch4Active { get; set; }
  20. public bool Ch5Active { get; set; }
  21. public bool Ch6Active { get; set; }
  22. public System.Timers.Timer Ch1Timer { get; set; }
  23. public System.Timers.Timer Ch2Timer { get; set; }
  24. public System.Timers.Timer Ch3Timer { get; set; }
  25. public System.Timers.Timer Ch4Timer { get; set; }
  26. public System.Timers.Timer Ch5Timer { get; set; }
  27. public System.Timers.Timer Ch6Timer { get; set; }
  28. public bool IsConnected
  29. {
  30. get => _isConnected;
  31. set
  32. {
  33. _isConnected = value;
  34. ToggleLEDElement();
  35. OnPropertyChanged(nameof(LEDElementVisible));
  36. }
  37. }
  38. public string LEDElementVisible { get; set; } = "Hidden";
  39. public string Name { get; set; }
  40. public string Warning { get; set; }
  41. public string Contact { get; set; }
  42. public Guid ID { get; set; }
  43. private RpcServerPipeTransport Transport;
  44. public MainWindowViewModel()
  45. {
  46. Transport = new RpcServerPipeTransport("uhhhh");
  47. Transport.AddHandler<MainWindowViewModel, ActivateCommand, ActivateParameters, ActivateResult>(new ActivateHandler(this));
  48. Transport.AddHandler<MainWindowViewModel, ConfigureCommand, ConfigureParameters, ConfigureResult>(new ConfigureHandler(this));
  49. Transport.OnOpen += TransportOnOnOpen;
  50. Transport.OnClose += TransportOnOnClose;
  51. Transport.Start();
  52. }
  53. private void TransportOnOnClose(IRpcTransport transport, RpcTransportCloseArgs e)
  54. {
  55. IsConnected = false;
  56. }
  57. private void TransportOnOnOpen(IRpcTransport transport, RpcTransportOpenArgs e)
  58. {
  59. IsConnected = true;
  60. }
  61. public void ToggleLEDElement()
  62. {
  63. if (IsConnected) LEDElementVisible = "Visible";
  64. else LEDElementVisible = "Hidden";
  65. }
  66. public void Ch1TimerRanOut(Object source, ElapsedEventArgs e) { Ch1Active = false; }
  67. public void Ch2TimerRanOut(Object source, ElapsedEventArgs e) { Ch2Active = false; }
  68. public void Ch3TimerRanOut(Object source, ElapsedEventArgs e) { Ch3Active = false; }
  69. public void Ch4TimerRanOut(Object source, ElapsedEventArgs e) { Ch4Active = false; }
  70. public void Ch5TimerRanOut(Object source, ElapsedEventArgs e) { Ch5Active = false; }
  71. public void Ch6TimerRanOut(Object source, ElapsedEventArgs e) { Ch6Active = false; }
  72. public event PropertyChangedEventHandler? PropertyChanged;
  73. protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
  74. {
  75. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  76. }
  77. protected bool SetField<T>(ref T field, T value, [CallerMemberName] string? propertyName = null)
  78. {
  79. if (EqualityComparer<T>.Default.Equals(field, value)) return false;
  80. field = value;
  81. OnPropertyChanged(propertyName);
  82. return true;
  83. }
  84. }
  85. public class ActivateHandler : RpcCommandHandler<MainWindowViewModel, ActivateCommand, ActivateParameters, ActivateResult>
  86. {
  87. public ActivateHandler(MainWindowViewModel sender) : base(sender)
  88. {
  89. }
  90. protected override ActivateResult Execute(IRpcSession session, ActivateParameters parameters, Logger logger)
  91. {
  92. long temp = parameters.Relay1;
  93. if (temp < 0) Sender.Ch1Active = false;
  94. else if (temp == 0)
  95. {
  96. Sender.Ch1Active = true;
  97. Sender.Ch1Timer.Stop();
  98. }
  99. else
  100. {
  101. Sender.Ch1Timer = new System.Timers.Timer(temp);
  102. Sender.Ch1Timer.Elapsed += Sender.Ch1TimerRanOut;
  103. }
  104. temp = parameters.Relay2;
  105. if (temp < 0) Sender.Ch2Active = false;
  106. else if (temp == 0)
  107. {
  108. Sender.Ch2Active = true;
  109. Sender.Ch2Timer.Stop();
  110. }
  111. else
  112. {
  113. Sender.Ch2Timer = new System.Timers.Timer(temp);
  114. Sender.Ch2Timer.Elapsed += Sender.Ch2TimerRanOut;
  115. }
  116. temp = parameters.Relay3;
  117. if (temp < 0) Sender.Ch3Active = false;
  118. else if (temp == 0)
  119. {
  120. Sender.Ch3Active = true;
  121. Sender.Ch3Timer.Stop();
  122. }
  123. else
  124. {
  125. Sender.Ch3Timer = new System.Timers.Timer(temp);
  126. Sender.Ch3Timer.Elapsed += Sender.Ch3TimerRanOut;
  127. }
  128. temp = parameters.Relay4;
  129. if (temp < 0) Sender.Ch4Active = false;
  130. else if (temp == 0)
  131. {
  132. Sender.Ch4Active = true;
  133. Sender.Ch4Timer.Stop();
  134. }
  135. else
  136. {
  137. Sender.Ch4Timer = new System.Timers.Timer(temp);
  138. Sender.Ch4Timer.Elapsed += Sender.Ch4TimerRanOut;
  139. }
  140. temp = parameters.Relay5;
  141. if (temp < 0) Sender.Ch5Active = false;
  142. else if (temp == 0)
  143. {
  144. Sender.Ch5Active = true;
  145. Sender.Ch5Timer.Stop();
  146. }
  147. else
  148. {
  149. Sender.Ch5Timer = new System.Timers.Timer(temp);
  150. Sender.Ch5Timer.Elapsed += Sender.Ch5TimerRanOut;
  151. }
  152. temp = parameters.Relay6;
  153. if (temp < 0) Sender.Ch6Active = false;
  154. else if (temp == 0)
  155. {
  156. Sender.Ch6Active = true;
  157. Sender.Ch6Timer.Stop();
  158. }
  159. else
  160. {
  161. Sender.Ch6Timer = new System.Timers.Timer(temp);
  162. Sender.Ch6Timer.Elapsed += Sender.Ch6TimerRanOut;
  163. }
  164. var result = new ActivateResult();
  165. result.Relay1 = parameters.Relay1;
  166. result.Relay2 = parameters.Relay2;
  167. result.Relay3 = parameters.Relay3;
  168. result.Relay4 = parameters.Relay4;
  169. result.Relay5 = parameters.Relay5;
  170. result.Relay6 = parameters.Relay6;
  171. return result;
  172. }
  173. }
  174. public class ConfigureHandler : RpcCommandHandler<MainWindowViewModel, ConfigureCommand, ConfigureParameters, ConfigureResult>
  175. {
  176. public ConfigureHandler(MainWindowViewModel sender) : base(sender)
  177. {
  178. }
  179. protected override ConfigureResult Execute(IRpcSession session, ConfigureParameters parameters, Logger logger)
  180. {
  181. Sender.Name = parameters.Name;
  182. Sender.Contact = parameters.Contact;
  183. Sender.Warning = parameters.Warning;
  184. Sender.ID = parameters.ID;
  185. var result = new ConfigureResult();
  186. result.Name = parameters.Name;
  187. return result;
  188. }
  189. }