refactoring some methods

add handling for Scheduled Events
This commit is contained in:
Andrew Welker
2020-12-07 11:48:07 -07:00
parent fc5d4f946d
commit 05e2422cb4

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using Crestron.SimplSharp; using Crestron.SimplSharp;
using Crestron.SimplSharp.Scheduler; using Crestron.SimplSharp.Scheduler;
using Newtonsoft.Json.Linq;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Config; using PepperDash.Essentials.Core.Config;
@@ -14,21 +15,35 @@ namespace PepperDash.Essentials
{ {
public class EssentialsTechRoom : EssentialsRoomBase public class EssentialsTechRoom : EssentialsRoomBase
{ {
private readonly Dictionary<string, IRSetTopBoxBase> _tuners; private readonly EssentialsTechRoomConfig _config;
private readonly Dictionary<string, TwoWayDisplayBase> _displays; private readonly Dictionary<string, TwoWayDisplayBase> _displays;
private readonly DevicePresetsModel _tunerPresets; private readonly DevicePresetsModel _tunerPresets;
private readonly Dictionary<string, IRSetTopBoxBase> _tuners;
private readonly EssentialsTechRoomConfig _config;
private ScheduledEventGroup _roomScheduledEventGroup; private ScheduledEventGroup _roomScheduledEventGroup;
public EssentialsTechRoom(DeviceConfig config) : base(config)
{
_config = config.Properties.ToObject<EssentialsTechRoomConfig>();
_tunerPresets = new DevicePresetsModel(String.Format("{0}-presets", config.Key), _config.PresetsFileName);
_tunerPresets.LoadChannels();
_tuners = GetDevices<IRSetTopBoxBase>(_config.Tuners);
_displays = GetDevices<TwoWayDisplayBase>(_config.Displays);
RoomPowerIsOnFeedback = new BoolFeedback(() => RoomPowerIsOn);
SubscribeToDisplayFeedbacks();
CreateOrUpdateScheduledEvents();
}
public DevicePresetsModel TunerPresets public DevicePresetsModel TunerPresets
{ {
get get { return _tunerPresets; }
{
return _tunerPresets;
}
} }
public Dictionary<string, IRSetTopBoxBase> Tuners public Dictionary<string, IRSetTopBoxBase> Tuners
@@ -48,70 +63,104 @@ namespace PepperDash.Essentials
get { return _displays.All(kv => kv.Value.PowerIsOnFeedback.BoolValue); } get { return _displays.All(kv => kv.Value.PowerIsOnFeedback.BoolValue); }
} }
public EssentialsTechRoom(DeviceConfig config) : base(config)
{
_config = config.Properties.ToObject<EssentialsTechRoomConfig>();
_tunerPresets = new DevicePresetsModel(String.Format("{0}-presets", config.Key), _config.PresetsFileName);
_tunerPresets.LoadChannels();
_tuners = GetDevices<IRSetTopBoxBase>(_config.Tuners);
_displays = GetDevices<TwoWayDisplayBase>(_config.Displays);
RoomPowerIsOnFeedback = new BoolFeedback(() => RoomPowerIsOn);
SubscribeToDisplayFeedbacks();
CreateScheduledEvents();
}
private void SubscribeToDisplayFeedbacks() private void SubscribeToDisplayFeedbacks()
{ {
foreach (var display in _displays) foreach (var display in _displays)
{ {
display.Value.PowerIsOnFeedback.OutputChange += (sender, args) => RoomPowerIsOnFeedback.InvokeFireUpdate(); display.Value.PowerIsOnFeedback.OutputChange +=
(sender, args) => RoomPowerIsOnFeedback.InvokeFireUpdate();
} }
} }
private void CreateScheduledEvents() private void CreateOrUpdateScheduledEvents()
{ {
var eventsConfig = _config.RoomScheduledEvents; var eventsConfig = _config.RoomScheduledEvents;
_roomScheduledEventGroup = new ScheduledEventGroup(Key); GetOrCreateScheduleGroup();
_roomScheduledEventGroup.RetrieveAllEvents(); foreach (var eventConfig in eventsConfig)
Scheduler.AddEventGroup(_roomScheduledEventGroup);
foreach (var eventConfig in eventsConfig.ScheduledEvents)
{ {
if (!_roomScheduledEventGroup.ScheduledEvents.ContainsKey(eventConfig.Name)) CreateOrUpdateSingleEvent(eventConfig);
{
SchedulerUtilities.CreateEventFromConfig(eventConfig, _roomScheduledEventGroup);
continue;
}
var roomEvent = _roomScheduledEventGroup.ScheduledEvents[eventConfig.Key];
if (!SchedulerUtilities.CheckEventTimeForMatch(roomEvent, DateTime.Parse(eventConfig.Time)) &&
!SchedulerUtilities.CheckEventRecurrenceForMatch(roomEvent, eventConfig.Days))
{
continue;
}
Debug.Console(1, this, "Existing event does not match new config properties. Deleting exisiting event: '{0}'", roomEvent.Name);
_roomScheduledEventGroup.DeleteEvent(roomEvent);
SchedulerUtilities.CreateEventFromConfig(eventConfig, _roomScheduledEventGroup);
} }
_roomScheduledEventGroup.UserGroupCallBack += HandleScheduledEvent; _roomScheduledEventGroup.UserGroupCallBack += HandleScheduledEvent;
} }
private void GetOrCreateScheduleGroup()
{
if (_roomScheduledEventGroup == null)
{
_roomScheduledEventGroup = Scheduler.GetEventGroup(Key) ?? new ScheduledEventGroup(Key);
Scheduler.AddEventGroup(_roomScheduledEventGroup);
}
_roomScheduledEventGroup.RetrieveAllEvents();
}
private void CreateOrUpdateSingleEvent(ScheduledEventConfig scheduledEvent)
{
if (!_roomScheduledEventGroup.ScheduledEvents.ContainsKey(scheduledEvent.Name))
{
SchedulerUtilities.CreateEventFromConfig(scheduledEvent, _roomScheduledEventGroup);
return;
}
var roomEvent = _roomScheduledEventGroup.ScheduledEvents[scheduledEvent.Key];
if (!SchedulerUtilities.CheckEventTimeForMatch(roomEvent, DateTime.Parse(scheduledEvent.Time)) &&
!SchedulerUtilities.CheckEventRecurrenceForMatch(roomEvent, scheduledEvent.Days))
{
return;
}
Debug.Console(1, this,
"Existing event does not match new config properties. Deleting existing event '{0}' and creating new event from configuration",
roomEvent.Name);
_roomScheduledEventGroup.DeleteEvent(roomEvent);
SchedulerUtilities.CreateEventFromConfig(scheduledEvent, _roomScheduledEventGroup);
}
public void AddOrUpdateScheduledEvent(ScheduledEventConfig scheduledEvent)
{
//update config based on key of scheduleEvent
GetOrCreateScheduleGroup();
var existingEvent = _config.RoomScheduledEvents.FirstOrDefault(e => e.Key == scheduledEvent.Key);
if (existingEvent == null)
{
_config.RoomScheduledEvents.Add(scheduledEvent);
}
//create or update event based on config
CreateOrUpdateSingleEvent(scheduledEvent);
//save config
Config.Properties = JToken.FromObject(_config);
CustomSetConfig(Config);
//Fire Event
OnScheduledEventUpdate();
}
public void OnScheduledEventUpdate()
{
var handler = ScheduledEventsChanged;
if (handler == null)
{
return;
}
handler(this, new ScheduledEventEventArgs {ScheduledEvents = _config.RoomScheduledEvents});
}
public event EventHandler<ScheduledEventEventArgs> ScheduledEventsChanged;
private void HandleScheduledEvent(ScheduledEvent schevent, ScheduledEventCommon.eCallbackReason type) private void HandleScheduledEvent(ScheduledEvent schevent, ScheduledEventCommon.eCallbackReason type)
{ {
var eventConfig = _config.RoomScheduledEvents.ScheduledEvents.FirstOrDefault(e => e.Key == schevent.Name); var eventConfig = _config.RoomScheduledEvents.FirstOrDefault(e => e.Key == schevent.Name);
if (eventConfig == null) if (eventConfig == null)
{ {
@@ -162,13 +211,12 @@ namespace PepperDash.Essentials
} }
catch catch
{ {
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Error getting devices. Check Essentials Configuration"); Debug.Console(0, this, Debug.ErrorLogLevel.Error,
"Error getting devices. Check Essentials Configuration");
return null; return null;
} }
} }
#region Overrides of EssentialsRoomBase #region Overrides of EssentialsRoomBase
protected override Func<bool> IsWarmingFeedbackFunc protected override Func<bool> IsWarmingFeedbackFunc
@@ -213,4 +261,9 @@ namespace PepperDash.Essentials
#endregion #endregion
} }
public class ScheduledEventEventArgs : EventArgs
{
public List<ScheduledEventConfig> ScheduledEvents;
}
} }