using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using TwinCAT.TypeSystem; using Heisig.HMI.AdsManager; namespace HMIToolkit; public sealed partial class HMIControlButtonVM : ObservableObject, IDisposable { private IAdsManager? _adsManager; private readonly string _variableName; // Action triggered when the button is about to be clicked public event EventHandler? ButtonClickedStarted; // Action triggered when the button is done being clicked public event EventHandler? ButtonClickedEnded; // Event when button feedback changed public event EventHandler? FeedbackChanged; // Event when release changed public event EventHandler? ReleaseChanged; [ObservableProperty] private bool xRelease; // 0 = none, 1 = active, 2 = pending, 3 = waring, 4 = error [ObservableProperty] private short iFeedback; public HMIControlButtonVM() { _variableName = string.Empty; XRelease = false; IFeedback = 4; } public HMIControlButtonVM(IAdsManager adsManager, string variableName) { _adsManager = adsManager; _variableName = variableName; _adsManager.Register(_variableName + ".xRelease", XReleaseCahnged); _adsManager.Register(_variableName + ".eFeedback", IFeedbackChanged); } public void Dispose() { _adsManager?.Deregister(_variableName + ".xRelease", XReleaseCahnged); _adsManager?.Deregister(_variableName + ".eFeedback", IFeedbackChanged); } [RelayCommand] private void ButtonClicked() { ButtonClickedStarted?.Invoke(this, EventArgs.Empty); _adsManager?.WriteValue(_variableName + ".xRequest", true); ButtonClickedEnded?.Invoke(this, EventArgs.Empty); } private void XReleaseCahnged(object? sender, ValueChangedEventArgs e) { XRelease = (bool)e.Value; ReleaseChanged?.Invoke(this, EventArgs.Empty); } private void IFeedbackChanged(object? sender, ValueChangedEventArgs e) { IFeedback = (short)e.Value; FeedbackChanged?.Invoke(this, EventArgs.Empty); } }