using System; using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows.Input; using DigitalKeyUnitCommands; using InABox.Rpc; using Microsoft.Xaml.Behaviors.Core; using InABox.Core; using System.Timers; using System.Windows.Media; using InABox.WPF; namespace PRSDigitalKeyUnit; public class MainWindowViewModel : INotifyPropertyChanged { private bool _isConnected; public bool Ch1Active { get; set; } public bool Ch2Active { get; set; } public bool Ch3Active { get; set; } public bool Ch4Active { get; set; } public bool Ch5Active { get; set; } public bool Ch6Active { get; set; } public System.Timers.Timer Ch1Timer { get; set; } public System.Timers.Timer Ch2Timer { get; set; } public System.Timers.Timer Ch3Timer { get; set; } public System.Timers.Timer Ch4Timer { get; set; } public System.Timers.Timer Ch5Timer { get; set; } public System.Timers.Timer Ch6Timer { get; set; } public bool IsConnected { get => _isConnected; set { _isConnected = value; ToggleLEDElement(); OnPropertyChanged(nameof(LEDElementVisible)); } } public string LEDElementVisible { get; set; } = "Hidden"; public string Name { get; set; } public string Warning { get; set; } public string Contact { get; set; } public Guid ID { get; set; } private RpcServerPipeTransport Transport; public MainWindowViewModel() { Transport = new RpcServerPipeTransport("uhhhh"); Transport.AddHandler(new ActivateHandler(this)); Transport.AddHandler(new ConfigureHandler(this)); Transport.OnOpen += TransportOnOnOpen; Transport.OnClose += TransportOnOnClose; Transport.Start(); } private void TransportOnOnClose(IRpcTransport transport, RpcTransportCloseArgs e) { IsConnected = false; } private void TransportOnOnOpen(IRpcTransport transport, RpcTransportOpenArgs e) { IsConnected = true; } public void ToggleLEDElement() { if (IsConnected) LEDElementVisible = "Visible"; else LEDElementVisible = "Hidden"; } public void Ch1TimerRanOut(Object source, ElapsedEventArgs e) { Ch1Active = false; } public void Ch2TimerRanOut(Object source, ElapsedEventArgs e) { Ch2Active = false; } public void Ch3TimerRanOut(Object source, ElapsedEventArgs e) { Ch3Active = false; } public void Ch4TimerRanOut(Object source, ElapsedEventArgs e) { Ch4Active = false; } public void Ch5TimerRanOut(Object source, ElapsedEventArgs e) { Ch5Active = false; } public void Ch6TimerRanOut(Object source, ElapsedEventArgs e) { Ch6Active = false; } public event PropertyChangedEventHandler? PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } protected bool SetField(ref T field, T value, [CallerMemberName] string? propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) return false; field = value; OnPropertyChanged(propertyName); return true; } } public class ActivateHandler : RpcCommandHandler { public ActivateHandler(MainWindowViewModel sender) : base(sender) { } protected override ActivateResult Execute(IRpcSession session, ActivateParameters parameters, Logger logger) { long temp = parameters.Relay1; if (temp < 0) Sender.Ch1Active = false; else if (temp == 0) { Sender.Ch1Active = true; Sender.Ch1Timer.Stop(); } else { Sender.Ch1Timer = new System.Timers.Timer(temp); Sender.Ch1Timer.Elapsed += Sender.Ch1TimerRanOut; } temp = parameters.Relay2; if (temp < 0) Sender.Ch2Active = false; else if (temp == 0) { Sender.Ch2Active = true; Sender.Ch2Timer.Stop(); } else { Sender.Ch2Timer = new System.Timers.Timer(temp); Sender.Ch2Timer.Elapsed += Sender.Ch2TimerRanOut; } temp = parameters.Relay3; if (temp < 0) Sender.Ch3Active = false; else if (temp == 0) { Sender.Ch3Active = true; Sender.Ch3Timer.Stop(); } else { Sender.Ch3Timer = new System.Timers.Timer(temp); Sender.Ch3Timer.Elapsed += Sender.Ch3TimerRanOut; } temp = parameters.Relay4; if (temp < 0) Sender.Ch4Active = false; else if (temp == 0) { Sender.Ch4Active = true; Sender.Ch4Timer.Stop(); } else { Sender.Ch4Timer = new System.Timers.Timer(temp); Sender.Ch4Timer.Elapsed += Sender.Ch4TimerRanOut; } temp = parameters.Relay5; if (temp < 0) Sender.Ch5Active = false; else if (temp == 0) { Sender.Ch5Active = true; Sender.Ch5Timer.Stop(); } else { Sender.Ch5Timer = new System.Timers.Timer(temp); Sender.Ch5Timer.Elapsed += Sender.Ch5TimerRanOut; } temp = parameters.Relay6; if (temp < 0) Sender.Ch6Active = false; else if (temp == 0) { Sender.Ch6Active = true; Sender.Ch6Timer.Stop(); } else { Sender.Ch6Timer = new System.Timers.Timer(temp); Sender.Ch6Timer.Elapsed += Sender.Ch6TimerRanOut; } var result = new ActivateResult(); result.Relay1 = parameters.Relay1; result.Relay2 = parameters.Relay2; result.Relay3 = parameters.Relay3; result.Relay4 = parameters.Relay4; result.Relay5 = parameters.Relay5; result.Relay6 = parameters.Relay6; return result; } } public class ConfigureHandler : RpcCommandHandler { public ConfigureHandler(MainWindowViewModel sender) : base(sender) { } protected override ConfigureResult Execute(IRpcSession session, ConfigureParameters parameters, Logger logger) { Sender.Name = parameters.Name; Sender.Contact = parameters.Contact; Sender.Warning = parameters.Warning; Sender.ID = parameters.ID; var result = new ConfigureResult(); result.Name = parameters.Name; return result; } }