mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-16 13:15:03 +00:00
refactoring some methods
add handling for Scheduled Events
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user