using System; using System.Collections.Generic; using Crestron.SimplSharp; using PepperDash.Core; using Serilog.Events; namespace PepperDash.Essentials.Devices.Common.Codec { /// /// Represents a CodecScheduleAwareness /// public class CodecScheduleAwareness { List _meetings; /// /// Event that is raised when a meeting event changes /// public event EventHandler MeetingEventChange; /// /// Event that is raised when the meetings list has changed /// public event EventHandler MeetingsListHasChanged; private int _meetingWarningMinutes = 5; //private Meeting _previousChangedMeeting; //private eMeetingEventChangeType _previousChangeType = eMeetingEventChangeType.Unknown; /// /// Gets or sets the number of minutes before a meeting to issue a warning /// public int MeetingWarningMinutes { get { return _meetingWarningMinutes; } set { _meetingWarningMinutes = value; } } /// /// Setter triggers MeetingsListHasChanged event /// public List Meetings { get { return _meetings; } set { _meetings = value; MeetingsListHasChanged?.Invoke(this, new EventArgs()); } } private readonly CTimer _scheduleChecker; /// /// Initializes a new instance of the CodecScheduleAwareness class with default poll time /// public CodecScheduleAwareness() { Meetings = new List(); _scheduleChecker = new CTimer(CheckSchedule, null, 1000, 1000); } /// /// Initializes a new instance of the CodecScheduleAwareness class with specified poll time /// /// The poll time in milliseconds for checking schedule changes public CodecScheduleAwareness(long pollTime) { Meetings = new List(); _scheduleChecker = new CTimer(CheckSchedule, null, pollTime, pollTime); } /// /// Helper method to fire MeetingEventChange. Should only fire once for each changeType on each meeting /// /// /// private void OnMeetingChange(eMeetingEventChangeType changeType, Meeting meeting) { Debug.LogMessage(LogEventLevel.Verbose, "*****************OnMeetingChange. id: {0} changeType: {1}**********************", meeting.Id, changeType); if (changeType != (changeType & meeting.NotifiedChangeTypes)) { // Add this change type to the NotifiedChangeTypes meeting.NotifiedChangeTypes |= changeType; MeetingEventChange?.Invoke(this, new MeetingEventArgs() { ChangeType = changeType, Meeting = meeting }); } else { Debug.LogMessage(LogEventLevel.Verbose, "Meeting: {0} already notified of changeType: {1}", meeting.Id, changeType); } } /// /// Checks the schedule to see if any MeetingEventChange updates should be fired /// /// private void CheckSchedule(object o) { // Iterate the meeting list and check if any meeting need to do anything const double meetingTimeEpsilon = 0.05; foreach (var m in Meetings) { var changeType = eMeetingEventChangeType.Unknown; if (eMeetingEventChangeType.MeetingStartWarning != (m.NotifiedChangeTypes & eMeetingEventChangeType.MeetingStartWarning) && m.TimeToMeetingStart.TotalMinutes <= m.MeetingWarningMinutes.TotalMinutes && m.TimeToMeetingStart.Seconds > 0) // Meeting is about to start { Debug.LogMessage(LogEventLevel.Verbose, "********************* MeetingStartWarning. TotalMinutes: {0} Seconds: {1}", m.TimeToMeetingStart.TotalMinutes, m.TimeToMeetingStart.Seconds); changeType = eMeetingEventChangeType.MeetingStartWarning; } else if (eMeetingEventChangeType.MeetingStart != (m.NotifiedChangeTypes & eMeetingEventChangeType.MeetingStart) && Math.Abs(m.TimeToMeetingStart.TotalMinutes) < meetingTimeEpsilon) // Meeting Start { Debug.LogMessage(LogEventLevel.Verbose, "********************* MeetingStart"); changeType = eMeetingEventChangeType.MeetingStart; } else if (eMeetingEventChangeType.MeetingEndWarning != (m.NotifiedChangeTypes & eMeetingEventChangeType.MeetingEndWarning) && m.TimeToMeetingEnd.TotalMinutes <= m.MeetingWarningMinutes.TotalMinutes && m.TimeToMeetingEnd.Seconds > 0) // Meeting is about to end { Debug.LogMessage(LogEventLevel.Verbose, "********************* MeetingEndWarning. TotalMinutes: {0} Seconds: {1}", m.TimeToMeetingEnd.TotalMinutes, m.TimeToMeetingEnd.Seconds); changeType = eMeetingEventChangeType.MeetingEndWarning; } else if (eMeetingEventChangeType.MeetingEnd != (m.NotifiedChangeTypes & eMeetingEventChangeType.MeetingEnd) && Math.Abs(m.TimeToMeetingEnd.TotalMinutes) < meetingTimeEpsilon) // Meeting has ended { Debug.LogMessage(LogEventLevel.Verbose, "********************* MeetingEnd"); changeType = eMeetingEventChangeType.MeetingEnd; } if (changeType != eMeetingEventChangeType.Unknown) { OnMeetingChange(changeType, m); } } } } }