using CommunityToolkit.Mvvm.ComponentModel; using System.Collections.ObjectModel; using System.Windows; using TcEventLoggerAdsProxyLib; namespace InfineonHMI; public partial class EventData : ObservableObject { [ObservableProperty] public uint id; [ObservableProperty] public string? message; [ObservableProperty] public DateTime raised; [ObservableProperty] public DateTime cleared; [ObservableProperty] public DateTime confirmed; }; public sealed partial class EventsPageVM : ObservableObject { public ObservableCollection CurrentEvents { get; private set; } = []; private readonly object _lock = new(); private readonly TcEventLogger _logger; [ObservableProperty] private EventData? currentEvent; // 599264352000000000 ticks is a date used by beckhoff for events that didnt happen up to this point private const long NoTime = 599264352000000000; public EventsPageVM(TcEventLogger logger) { _logger = logger; _logger.AlarmRaised += SimpleAlarmRaisedEvent; _logger.AlarmCleared += SimpleAlarmClearedEvent; _logger.AlarmConfirmed += SimpleConfirmedAlarmEvent; #if DEBUG #else _logger.Connect("10.103.32.50.1.1"); #endif GetAllActiveEvents(); } private void RebuildCurrentEventsList() { lock (_lock) { CurrentEvents.Clear(); } GetAllActiveEvents(); } private void SimpleConfirmedAlarmEvent(TcAlarm alarm, bool remove) { Application.Current.Dispatcher.BeginInvoke(RebuildCurrentEventsList); } private void SimpleAlarmClearedEvent(TcAlarm alarm, bool remove) { Application.Current.Dispatcher.BeginInvoke(RebuildCurrentEventsList); } private void SimpleAlarmRaisedEvent(TcAlarm alarm) { Application.Current.Dispatcher.BeginInvoke(RebuildCurrentEventsList); } private void GetAllActiveEvents() { EventData eventData; List tempEventList = []; lock (_lock) { foreach (var alarm in _logger.ActiveAlarms) { eventData = new() { Id = alarm.EventId, Message = alarm.GetText(1033), Raised = alarm.TimeRaised, Cleared = alarm.TimeCleared, Confirmed = alarm.TimeConfirmed }; tempEventList.Add(eventData); } IEnumerable _eventQuery = from data in tempEventList orderby data.Raised descending select data; CurrentEvent = _eventQuery.FirstOrDefault(); CurrentEvents = new ObservableCollection(_eventQuery); } } }