mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-01-31 13:25:00 +00:00
Compare commits
14 Commits
1.6.9-alph
...
1.6.10-alp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
57ebd2b608 | ||
|
|
695ff5487f | ||
|
|
66cd39c013 | ||
|
|
91eec8c258 | ||
|
|
d2c308c009 | ||
|
|
a4a99f4a9b | ||
|
|
eb114b4a95 | ||
|
|
01ddf1721c | ||
|
|
1ee87c0499 | ||
|
|
f8ae6264f7 | ||
|
|
3e56859943 | ||
|
|
7e8f216afb | ||
|
|
b09c151738 | ||
|
|
56cf54a644 |
@@ -17,7 +17,7 @@ namespace PepperDash.Essentials.Room.Config
|
||||
[JsonProperty("techPin")]
|
||||
public string TechPin;
|
||||
|
||||
[JsonProperty("presetFileName")]
|
||||
[JsonProperty("presetsFileName")]
|
||||
public string PresetsFileName;
|
||||
|
||||
[JsonProperty("scheduledEvents")]
|
||||
|
||||
@@ -3,9 +3,12 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharp.Scheduler;
|
||||
using Crestron.SimplSharpPro.DeviceSupport;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.Core.Bridges;
|
||||
using PepperDash.Essentials.Core.Config;
|
||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||
using PepperDash.Essentials.Core.Presets;
|
||||
@@ -14,7 +17,7 @@ using PepperDash.Essentials.Room.Config;
|
||||
|
||||
namespace PepperDash.Essentials
|
||||
{
|
||||
public class EssentialsTechRoom : EssentialsRoomBase, ITvPresetsProvider
|
||||
public class EssentialsTechRoom : EssentialsRoomBase, ITvPresetsProvider, IBridgeAdvanced, IRunDirectRouteAction
|
||||
{
|
||||
private readonly EssentialsTechRoomConfig _config;
|
||||
private readonly Dictionary<string, TwoWayDisplayBase> _displays;
|
||||
@@ -22,30 +25,36 @@ namespace PepperDash.Essentials
|
||||
private readonly DevicePresetsModel _tunerPresets;
|
||||
private readonly Dictionary<string, IRSetTopBoxBase> _tuners;
|
||||
|
||||
private Dictionary<string, string> _currentPresets;
|
||||
private ScheduledEventGroup _roomScheduledEventGroup;
|
||||
|
||||
private GenericSource DummySource = new GenericSource("$off", "Dummy Source");
|
||||
|
||||
public EssentialsTechRoom(DeviceConfig config) : base(config)
|
||||
{
|
||||
_config = config.Properties.ToObject<EssentialsTechRoomConfig>();
|
||||
|
||||
_tunerPresets = new DevicePresetsModel(String.Format("{0}-presets", config.Key), _config.PresetsFileName);
|
||||
|
||||
_tunerPresets.LoadChannels();
|
||||
_tunerPresets.SetFileName(_config.PresetsFileName);
|
||||
|
||||
_tunerPresets.PresetRecalled += TunerPresetsOnPresetRecalled;
|
||||
|
||||
_tuners = GetDevices<IRSetTopBoxBase>(_config.Tuners);
|
||||
_displays = GetDevices<TwoWayDisplayBase>(_config.Displays);
|
||||
|
||||
RoomPowerIsOnFeedback = new BoolFeedback(() => RoomPowerIsOn);
|
||||
|
||||
SetUpTunerPresetsFeedback();
|
||||
|
||||
SubscribeToDisplayFeedbacks();
|
||||
|
||||
CreateOrUpdateScheduledEvents();
|
||||
|
||||
DeviceManager.AddDevice(DummySource);
|
||||
}
|
||||
|
||||
public DevicePresetsModel TvPresets
|
||||
{
|
||||
get { return _tunerPresets; }
|
||||
}
|
||||
public Dictionary<string, StringFeedback> CurrentPresetsFeedbacks { get; private set; }
|
||||
|
||||
public Dictionary<string, IRSetTopBoxBase> Tuners
|
||||
{
|
||||
@@ -64,6 +73,43 @@ namespace PepperDash.Essentials
|
||||
get { return _displays.All(kv => kv.Value.PowerIsOnFeedback.BoolValue); }
|
||||
}
|
||||
|
||||
#region ITvPresetsProvider Members
|
||||
|
||||
public DevicePresetsModel TvPresets
|
||||
{
|
||||
get { return _tunerPresets; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void TunerPresetsOnPresetRecalled(ISetTopBoxNumericKeypad device, string channel)
|
||||
{
|
||||
if (!_currentPresets.ContainsKey(device.Key))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_currentPresets[device.Key] = channel;
|
||||
|
||||
if (!CurrentPresetsFeedbacks.ContainsKey(device.Key))
|
||||
{
|
||||
CurrentPresetsFeedbacks[device.Key].FireUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
private void SetUpTunerPresetsFeedback()
|
||||
{
|
||||
_currentPresets = new Dictionary<string, string>();
|
||||
CurrentPresetsFeedbacks = new Dictionary<string, StringFeedback>();
|
||||
|
||||
foreach (var setTopBox in _tuners)
|
||||
{
|
||||
var tuner = setTopBox.Value;
|
||||
_currentPresets.Add(tuner.Key, String.Empty);
|
||||
CurrentPresetsFeedbacks.Add(tuner.Key, new StringFeedback(() => _currentPresets[tuner.Key]));
|
||||
}
|
||||
}
|
||||
|
||||
private void SubscribeToDisplayFeedbacks()
|
||||
{
|
||||
foreach (var display in _displays)
|
||||
@@ -128,12 +174,16 @@ namespace PepperDash.Essentials
|
||||
{
|
||||
//update config based on key of scheduleEvent
|
||||
GetOrCreateScheduleGroup();
|
||||
var existingEvent = _config.ScheduledEvents.FirstOrDefault(e => e.Key == scheduledEvent.Key);
|
||||
var existingEventIndex = _config.ScheduledEvents.FindIndex((e) => e.Key == scheduledEvent.Key);
|
||||
|
||||
if (existingEvent == null)
|
||||
if (existingEventIndex < 0)
|
||||
{
|
||||
_config.ScheduledEvents.Add(scheduledEvent);
|
||||
}
|
||||
else
|
||||
{
|
||||
_config.ScheduledEvents[existingEventIndex] = scheduledEvent;
|
||||
}
|
||||
|
||||
//create or update event based on config
|
||||
CreateOrUpdateSingleEvent(scheduledEvent);
|
||||
@@ -145,6 +195,11 @@ namespace PepperDash.Essentials
|
||||
OnScheduledEventUpdate();
|
||||
}
|
||||
|
||||
public List<ScheduledEventConfig> GetScheduledEvents()
|
||||
{
|
||||
return _config.ScheduledEvents ?? new List<ScheduledEventConfig>();
|
||||
}
|
||||
|
||||
private void OnScheduledEventUpdate()
|
||||
{
|
||||
var handler = ScheduledEventsChanged;
|
||||
@@ -190,7 +245,7 @@ namespace PepperDash.Essentials
|
||||
{
|
||||
foreach (var display in _displays)
|
||||
{
|
||||
display.Value.PowerOn();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -239,17 +294,14 @@ namespace PepperDash.Essentials
|
||||
|
||||
protected override void EndShutdown()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void SetDefaultLevels()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void PowerOnToDefaultOrLastSource()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override bool RunDefaultPresentRoute()
|
||||
@@ -259,9 +311,118 @@ namespace PepperDash.Essentials
|
||||
|
||||
public override void RoomVacatedForTimeoutPeriod(object o)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Implementation of IBridgeAdvanced
|
||||
|
||||
public void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
||||
{
|
||||
|
||||
var joinMap = new EssentialsTechRoomJoinMap(joinStart);
|
||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||
|
||||
if (!String.IsNullOrEmpty(joinMapSerialized))
|
||||
{
|
||||
joinMap = JsonConvert.DeserializeObject<EssentialsTechRoomJoinMap>(joinMapSerialized);
|
||||
}
|
||||
|
||||
if (bridge != null)
|
||||
{
|
||||
bridge.AddJoinMap(Key, joinMap);
|
||||
}
|
||||
uint i;
|
||||
if (_config.IsPrimary)
|
||||
{
|
||||
i = 0;
|
||||
foreach (var feedback in CurrentPresetsFeedbacks)
|
||||
{
|
||||
feedback.Value.LinkInputSig(trilist.StringInput[(uint) (joinMap.CurrentPreset.JoinNumber + i)]);
|
||||
i++;
|
||||
}
|
||||
|
||||
trilist.OnlineStatusChange += (device, args) =>
|
||||
{
|
||||
if (!args.DeviceOnLine)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var feedback in CurrentPresetsFeedbacks)
|
||||
{
|
||||
feedback.Value.FireUpdate();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
i = 0;
|
||||
foreach (var setTopBox in _tuners)
|
||||
{
|
||||
var tuner = setTopBox;
|
||||
|
||||
trilist.SetStringSigAction(joinMap.CurrentPreset.JoinNumber + i, s => _tunerPresets.Dial(s, tuner.Value));
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private class EssentialsTechRoomJoinMap : JoinMapBaseAdvanced
|
||||
{
|
||||
[JoinName("currentPreset")]
|
||||
public JoinDataComplete CurrentPreset = new JoinDataComplete(new JoinData {JoinNumber = 1, JoinSpan = 16},
|
||||
new JoinMetadata {Description = "Current Tuner Preset", JoinType = eJoinType.Serial});
|
||||
|
||||
public EssentialsTechRoomJoinMap(uint joinStart) : base(joinStart, typeof(EssentialsTechRoomJoinMap))
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
#region IRunDirectRouteAction Members
|
||||
|
||||
private void RunDirectRoute(IRoutingOutputs source, IRoutingSink dest)
|
||||
{
|
||||
if (dest == null)
|
||||
{
|
||||
Debug.Console(1, this, "Cannot route, unknown destination '{0}'", dest.Key);
|
||||
return;
|
||||
}
|
||||
|
||||
if (source.Key.Equals("$off", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
dest.ReleaseRoute();
|
||||
if (dest is IHasPowerControl)
|
||||
(dest as IHasPowerControl).PowerOff();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (source == null)
|
||||
{
|
||||
Debug.Console(1, this, "Cannot route unknown source '{0}' to {1}", source.Key, dest.Key);
|
||||
return;
|
||||
}
|
||||
dest.ReleaseAndMakeRoute(source, eRoutingSignalType.Video);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Attempts to route directly between a source and destination
|
||||
/// </summary>
|
||||
/// <param name="sourceKey"></param>
|
||||
/// <param name="destinationKey"></param>
|
||||
public void RunDirectRoute(string sourceKey, string destinationKey)
|
||||
{
|
||||
IRoutingSink dest = null;
|
||||
|
||||
dest = DeviceManager.GetDeviceForKey(destinationKey) as IRoutingSink;
|
||||
|
||||
var source = DeviceManager.GetDeviceForKey(sourceKey) as IRoutingOutputs;
|
||||
|
||||
RunDirectRoute(source, dest);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
||||
@@ -99,12 +99,19 @@ namespace PepperDash.Essentials.Core.Bridges
|
||||
Eisc.SigChange += Eisc_SigChange;
|
||||
|
||||
AddPostActivationAction(LinkDevices);
|
||||
AddPostActivationAction(LinkRooms);
|
||||
}
|
||||
|
||||
private void LinkDevices()
|
||||
{
|
||||
Debug.Console(1, this, "Linking Devices...");
|
||||
|
||||
if (PropertiesConfig.Devices == null)
|
||||
{
|
||||
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "No devices linked to this bridge");
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var d in PropertiesConfig.Devices)
|
||||
{
|
||||
var device = DeviceManager.GetDeviceForKey(d.DeviceKey);
|
||||
@@ -152,10 +159,16 @@ namespace PepperDash.Essentials.Core.Bridges
|
||||
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "EISC registration successful");
|
||||
}
|
||||
|
||||
public void LinkToRooms()
|
||||
public void LinkRooms()
|
||||
{
|
||||
Debug.Console(1, this, "Linking Rooms...");
|
||||
|
||||
if (PropertiesConfig.Rooms == null)
|
||||
{
|
||||
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "No rooms linked to this bridge.");
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var room in PropertiesConfig.Rooms)
|
||||
{
|
||||
var rm = DeviceManager.GetDeviceForKey(room.RoomKey) as IBridgeAdvanced;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using Crestron.SimplSharpPro.DeviceSupport;
|
||||
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.Core.SmartObjects;
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace PepperDash.Essentials.Core
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public interface INumericKeypad
|
||||
public interface INumericKeypad:IKeyed
|
||||
{
|
||||
void Digit0(bool pressRelease);
|
||||
void Digit1(bool pressRelease);
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharp.Reflection;
|
||||
using Crestron.SimplSharp.Scheduler;
|
||||
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core.Fusion;
|
||||
using PepperDash.Essentials.Room.Config;
|
||||
using Activator = System.Activator;
|
||||
|
||||
namespace PepperDash.Essentials.Core
|
||||
{
|
||||
@@ -170,7 +174,24 @@ namespace PepperDash.Essentials.Core
|
||||
|
||||
var eventTime = DateTime.Parse(config.Time);
|
||||
|
||||
if (DateTime.Now > eventTime) eventTime = eventTime.AddDays(1);
|
||||
if (DateTime.Now > eventTime)
|
||||
{
|
||||
eventTime = eventTime.AddDays(1);
|
||||
}
|
||||
|
||||
Debug.Console(2, "[Scheduler] Current Date day of week: {0} recurrence days: {1}", eventTime.DayOfWeek,
|
||||
config.Days);
|
||||
|
||||
var dayOfWeekConverted = ConvertDayOfWeek(eventTime);
|
||||
|
||||
Debug.Console(1, "[Scheduler] eventTime Day: {0}", dayOfWeekConverted);
|
||||
|
||||
while (!dayOfWeekConverted.IsFlagSet(config.Days))
|
||||
{
|
||||
eventTime = eventTime.AddDays(1);
|
||||
|
||||
dayOfWeekConverted = ConvertDayOfWeek(eventTime);
|
||||
}
|
||||
|
||||
scheduledEvent.DateAndTime.SetAbsoluteEventTime(eventTime);
|
||||
|
||||
@@ -185,5 +206,28 @@ namespace PepperDash.Essentials.Core
|
||||
scheduledEvent.Disable();
|
||||
}
|
||||
}
|
||||
|
||||
private static ScheduledEventCommon.eWeekDays ConvertDayOfWeek(DateTime eventTime)
|
||||
{
|
||||
return (ScheduledEventCommon.eWeekDays) Enum.Parse(typeof(ScheduledEventCommon.eWeekDays), eventTime.DayOfWeek.ToString(), true);
|
||||
}
|
||||
|
||||
private static bool IsFlagSet<T>(this T value, T flag) where T : struct
|
||||
{
|
||||
CheckIsEnum<T>(true);
|
||||
|
||||
var lValue = Convert.ToInt64(value);
|
||||
var lFlag = Convert.ToInt64(flag);
|
||||
|
||||
return (lValue & lFlag) != 0;
|
||||
}
|
||||
|
||||
private static void CheckIsEnum<T>(bool withFlags)
|
||||
{
|
||||
if (!typeof(T).IsEnum)
|
||||
throw new ArgumentException(string.Format("Type '{0}' is not an enum", typeof(T).FullName));
|
||||
if (withFlags && !Attribute.IsDefined(typeof(T), typeof(FlagsAttribute)))
|
||||
throw new ArgumentException(string.Format("Type '{0}' doesn't have the 'Flags' attribute", typeof(T).FullName));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ using Newtonsoft.Json;
|
||||
using PepperDash.Core;
|
||||
|
||||
//using SSMono.IO;
|
||||
using PepperDash.Core.WebApi.Presets;
|
||||
|
||||
namespace PepperDash.Essentials.Core.Presets
|
||||
{
|
||||
@@ -15,9 +16,15 @@ namespace PepperDash.Essentials.Core.Presets
|
||||
/// </summary>
|
||||
public class DevicePresetsModel : Device
|
||||
{
|
||||
private CCriticalSection _fileOps = new CCriticalSection();
|
||||
public delegate void PresetRecalledCallback(ISetTopBoxNumericKeypad device, string channel);
|
||||
|
||||
public delegate void PresetsSavedCallback(List<PresetChannel> presets);
|
||||
|
||||
private readonly CCriticalSection _fileOps = new CCriticalSection();
|
||||
private readonly bool _initSuccess;
|
||||
|
||||
private readonly ISetTopBoxNumericKeypad _setTopBox;
|
||||
|
||||
/// <summary>
|
||||
/// The methods on the STB device to call when dialing
|
||||
/// </summary>
|
||||
@@ -32,6 +39,8 @@ namespace PepperDash.Essentials.Core.Presets
|
||||
{
|
||||
try
|
||||
{
|
||||
_setTopBox = setTopBox;
|
||||
|
||||
// Grab the digit functions from the device
|
||||
// If any fail, the whole thing fails peacefully
|
||||
_dialFunctions = new Dictionary<char, Action<bool>>(10)
|
||||
@@ -76,6 +85,9 @@ namespace PepperDash.Essentials.Core.Presets
|
||||
_initSuccess = true;
|
||||
}
|
||||
|
||||
public event PresetRecalledCallback PresetRecalled;
|
||||
public event PresetsSavedCallback PresetsSaved;
|
||||
|
||||
public int PulseTime { get; set; }
|
||||
public int DigitSpacingMs { get; set; }
|
||||
public bool PresetsAreLoaded { get; private set; }
|
||||
@@ -97,6 +109,8 @@ namespace PepperDash.Essentials.Core.Presets
|
||||
public void SetFileName(string path)
|
||||
{
|
||||
_filePath = ListPathPrefix + path;
|
||||
|
||||
Debug.Console(2, this, "Setting presets file path to {0}", _filePath);
|
||||
LoadChannels();
|
||||
}
|
||||
|
||||
@@ -105,6 +119,8 @@ namespace PepperDash.Essentials.Core.Presets
|
||||
try
|
||||
{
|
||||
_fileOps.Enter();
|
||||
|
||||
Debug.Console(2, this, "Loading presets from {0}", _filePath);
|
||||
PresetsAreLoaded = false;
|
||||
try
|
||||
{
|
||||
@@ -172,6 +188,10 @@ namespace PepperDash.Essentials.Core.Presets
|
||||
}
|
||||
_dialIsRunning = false;
|
||||
});
|
||||
|
||||
if (_setTopBox == null) return;
|
||||
|
||||
OnPresetRecalled(_setTopBox, chanNum);
|
||||
}
|
||||
|
||||
public void Dial(int presetNum, ISetTopBoxNumericKeypad setTopBox)
|
||||
@@ -201,9 +221,23 @@ namespace PepperDash.Essentials.Core.Presets
|
||||
|
||||
_enterFunction = setTopBox.KeypadEnter;
|
||||
|
||||
OnPresetRecalled(setTopBox, chanNum);
|
||||
|
||||
Dial(chanNum);
|
||||
}
|
||||
|
||||
private void OnPresetRecalled(ISetTopBoxNumericKeypad setTopBox, string channel)
|
||||
{
|
||||
var handler = PresetRecalled;
|
||||
|
||||
if (handler == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
handler(setTopBox, channel);
|
||||
}
|
||||
|
||||
public void UpdatePreset(int index, PresetChannel preset)
|
||||
{
|
||||
if (index >= PresetsList.Count)
|
||||
@@ -214,6 +248,17 @@ namespace PepperDash.Essentials.Core.Presets
|
||||
PresetsList[index] = preset;
|
||||
|
||||
SavePresets();
|
||||
|
||||
OnPresetsSaved();
|
||||
}
|
||||
|
||||
public void UpdatePresets(List<PresetChannel> presets)
|
||||
{
|
||||
PresetsList = presets;
|
||||
|
||||
SavePresets();
|
||||
|
||||
OnPresetsSaved();
|
||||
}
|
||||
|
||||
private void SavePresets()
|
||||
@@ -227,6 +272,8 @@ namespace PepperDash.Essentials.Core.Presets
|
||||
{
|
||||
file.Write(json, Encoding.UTF8);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -235,6 +282,15 @@ namespace PepperDash.Essentials.Core.Presets
|
||||
|
||||
}
|
||||
|
||||
private void OnPresetsSaved()
|
||||
{
|
||||
var handler = PresetsSaved;
|
||||
|
||||
if (handler == null) return;
|
||||
|
||||
handler(PresetsList);
|
||||
}
|
||||
|
||||
private void Pulse(Action<bool> act)
|
||||
{
|
||||
act(true);
|
||||
|
||||
@@ -10,19 +10,22 @@ namespace PepperDash.Essentials.Core.Presets
|
||||
public class PresetChannel
|
||||
{
|
||||
|
||||
[JsonProperty(Required = Required.Always)]
|
||||
[JsonProperty(Required = Required.Always,PropertyName = "name")]
|
||||
public string Name { get; set; }
|
||||
[JsonProperty(Required = Required.Always)]
|
||||
|
||||
[JsonProperty(Required = Required.Always, PropertyName = "iconUrl")]
|
||||
public string IconUrl { get; set; }
|
||||
[JsonProperty(Required = Required.Always)]
|
||||
|
||||
[JsonProperty(Required = Required.Always, PropertyName = "channel")]
|
||||
public string Channel { get; set; }
|
||||
}
|
||||
|
||||
public class PresetsList
|
||||
{
|
||||
[JsonProperty(Required=Required.Always)]
|
||||
[JsonProperty(Required=Required.Always,PropertyName = "name")]
|
||||
public string Name { get; set; }
|
||||
[JsonProperty(Required = Required.Always)]
|
||||
|
||||
[JsonProperty(Required = Required.Always, PropertyName = "channels")]
|
||||
public List<PresetChannel> Channels { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using Crestron.SimplSharp.Scheduler;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Converters;
|
||||
using PepperDash.Essentials.Core;
|
||||
|
||||
namespace PepperDash.Essentials.Room.Config
|
||||
|
||||
@@ -41,6 +41,14 @@ namespace PepperDash.Essentials.Core
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Simplified routing direct from source to destination
|
||||
/// </summary>
|
||||
public interface IRunDirectRouteAction
|
||||
{
|
||||
void RunDirectRoute(string sourceKey, string destinationKey);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// For rooms that default presentation only routing
|
||||
/// </summary>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user