mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-15 04:34:56 +00:00
@@ -327,6 +327,7 @@
|
|||||||
<Compile Include="Routing\TieLine.cs" />
|
<Compile Include="Routing\TieLine.cs" />
|
||||||
<Compile Include="Queues\StringResponseProcessor.cs" />
|
<Compile Include="Queues\StringResponseProcessor.cs" />
|
||||||
<Compile Include="Timers\CountdownTimer.cs" />
|
<Compile Include="Timers\CountdownTimer.cs" />
|
||||||
|
<Compile Include="Timers\RetriggerableTimer.cs" />
|
||||||
<Compile Include="Touchpanels\CrestronTouchpanelPropertiesConfig.cs" />
|
<Compile Include="Touchpanels\CrestronTouchpanelPropertiesConfig.cs" />
|
||||||
<Compile Include="Touchpanels\Interfaces.cs" />
|
<Compile Include="Touchpanels\Interfaces.cs" />
|
||||||
<Compile Include="Touchpanels\Keyboards\HabaneroKeyboardController.cs" />
|
<Compile Include="Touchpanels\Keyboards\HabaneroKeyboardController.cs" />
|
||||||
@@ -337,6 +338,7 @@
|
|||||||
<Compile Include="UI PageManagers\SinglePageManager.cs" />
|
<Compile Include="UI PageManagers\SinglePageManager.cs" />
|
||||||
<Compile Include="UI PageManagers\PageManager.cs" />
|
<Compile Include="UI PageManagers\PageManager.cs" />
|
||||||
<Compile Include="UI PageManagers\SetTopBoxTwoPanelPageManager.cs" />
|
<Compile Include="UI PageManagers\SetTopBoxTwoPanelPageManager.cs" />
|
||||||
|
<Compile Include="Utilities\ActionSequence.cs" />
|
||||||
<Compile Include="VideoStatus\VideoStatusOutputs.cs" />
|
<Compile Include="VideoStatus\VideoStatusOutputs.cs" />
|
||||||
<Compile Include="Crestron\CrestronGenericBaseDevice.cs" />
|
<Compile Include="Crestron\CrestronGenericBaseDevice.cs" />
|
||||||
<Compile Include="DeviceControlsParentInterfaces\IPresentationSource.cs" />
|
<Compile Include="DeviceControlsParentInterfaces\IPresentationSource.cs" />
|
||||||
|
|||||||
@@ -0,0 +1,175 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.Timers
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A device that runs a retriggerable timer and can execute actions specified in config
|
||||||
|
/// </summary>
|
||||||
|
[Description("A retriggerable timer device")]
|
||||||
|
public class RetriggerableTimer : EssentialsDevice
|
||||||
|
{
|
||||||
|
private RetriggerableTimerPropertiesConfig _propertiesConfig;
|
||||||
|
|
||||||
|
private CTimer _timer;
|
||||||
|
private long _timerIntervalMs;
|
||||||
|
|
||||||
|
public RetriggerableTimer(string key, DeviceConfig config)
|
||||||
|
: base(key, config.Name)
|
||||||
|
{
|
||||||
|
var props = config.Properties.ToObject<RetriggerableTimerPropertiesConfig>();
|
||||||
|
_propertiesConfig = props;
|
||||||
|
|
||||||
|
if (_propertiesConfig != null)
|
||||||
|
{
|
||||||
|
_timerIntervalMs = _propertiesConfig.TimerIntervalMs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool CustomActivate()
|
||||||
|
{
|
||||||
|
if (_propertiesConfig.StartTimerOnActivation)
|
||||||
|
{
|
||||||
|
StartTimer();
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.CustomActivate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CleanUpTimer()
|
||||||
|
{
|
||||||
|
if (_timer != null)
|
||||||
|
{
|
||||||
|
_timer.Stop();
|
||||||
|
_timer.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
_timer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StartTimer()
|
||||||
|
{
|
||||||
|
CleanUpTimer();
|
||||||
|
|
||||||
|
_timer = new CTimer(TimerElapsedCallback, GetActionFromConfig(eRetriggerableTimerEvents.Elapsed), 0, _timerIntervalMs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StopTimer()
|
||||||
|
{
|
||||||
|
_timer.Stop();
|
||||||
|
|
||||||
|
ExecuteAction(GetActionFromConfig(eRetriggerableTimerEvents.Stopped));
|
||||||
|
}
|
||||||
|
|
||||||
|
private DeviceActionWrapper GetActionFromConfig(eRetriggerableTimerEvents eventType)
|
||||||
|
{
|
||||||
|
var action = _propertiesConfig.Events[eRetriggerableTimerEvents.Elapsed];
|
||||||
|
|
||||||
|
if (action != null)
|
||||||
|
return action;
|
||||||
|
else return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Executes the Elapsed action from confing when the timer elapses
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="o"></param>
|
||||||
|
private void TimerElapsedCallback(object action)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Timer Elapsed. Executing Action");
|
||||||
|
|
||||||
|
if (action == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Timer elapsed but unable to execute action. Action is null.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var devAction = action as DeviceActionWrapper;
|
||||||
|
if (devAction != null)
|
||||||
|
ExecuteAction(devAction);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Unable to cast action as DeviceActionWrapper. Cannot Execute");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ExecuteAction(DeviceActionWrapper action)
|
||||||
|
{
|
||||||
|
if (action == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DeviceJsonApi.DoDeviceAction(action);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Error Executing Action: {0}", e);
|
||||||
|
}
|
||||||
|
//finally // Not sure this is needed
|
||||||
|
//{
|
||||||
|
// _Timer.Reset(0, _TimerIntervalMs);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Configuration Properties for RetriggerableTimer
|
||||||
|
/// </summary>
|
||||||
|
public class RetriggerableTimerPropertiesConfig
|
||||||
|
{
|
||||||
|
[JsonProperty("startTimerOnActivation")]
|
||||||
|
public bool StartTimerOnActivation { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("timerIntervalMs")]
|
||||||
|
public long TimerIntervalMs { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("events")]
|
||||||
|
public Dictionary<eRetriggerableTimerEvents, DeviceActionWrapper> Events { get; set; }
|
||||||
|
|
||||||
|
public RetriggerableTimerPropertiesConfig()
|
||||||
|
{
|
||||||
|
Events = new Dictionary<eRetriggerableTimerEvents, DeviceActionWrapper>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The set of values describing events on the timer
|
||||||
|
/// </summary>
|
||||||
|
public enum eRetriggerableTimerEvents
|
||||||
|
{
|
||||||
|
Elapsed,
|
||||||
|
Stopped,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Factory class
|
||||||
|
/// </summary>
|
||||||
|
public class RetriggerableTimerFactory : EssentialsDeviceFactory<RetriggerableTimer>
|
||||||
|
{
|
||||||
|
public RetriggerableTimerFactory()
|
||||||
|
{
|
||||||
|
TypeNames = new List<string>() { "retriggerabletimer" };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory Attempting to create new RetriggerableTimer Device");
|
||||||
|
|
||||||
|
return new RetriggerableTimer(dc.Key, dc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using Crestron.SimplSharpPro.CrestronThread;
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.Utilities
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A device that executes a sequence of actions with optional delays between actions
|
||||||
|
/// </summary>
|
||||||
|
[Description("A device that exectues a sequence of actions with optional delays between actions")]
|
||||||
|
public class ActionSequence : EssentialsDevice
|
||||||
|
{
|
||||||
|
private ActionSequencePropertiesConfig _propertiesConfig;
|
||||||
|
|
||||||
|
private CrestronQueue<SequencedDeviceActionWrapper> _actionQueue;
|
||||||
|
|
||||||
|
private Thread _worker;
|
||||||
|
|
||||||
|
private bool _allowActionsToExecute;
|
||||||
|
|
||||||
|
public ActionSequence(string key, DeviceConfig config)
|
||||||
|
: base(key, config.Name)
|
||||||
|
{
|
||||||
|
var props = config.Properties.ToObject<ActionSequencePropertiesConfig>();
|
||||||
|
_propertiesConfig = props;
|
||||||
|
|
||||||
|
if (_propertiesConfig != null)
|
||||||
|
{
|
||||||
|
if (_propertiesConfig.ActionSequence.Count > 0)
|
||||||
|
{
|
||||||
|
_actionQueue = new CrestronQueue<SequencedDeviceActionWrapper>(_propertiesConfig.ActionSequence.Count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Starts executing the sequenced actions
|
||||||
|
/// </summary>
|
||||||
|
public void StartSequence()
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Starting Action Sequence");
|
||||||
|
_allowActionsToExecute = true;
|
||||||
|
AddActionsToQueue();
|
||||||
|
_worker = new Thread(ProcessActions, null, Thread.eThreadStartOptions.Running);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Stops executing the sequenced actions
|
||||||
|
/// </summary>
|
||||||
|
public void StopSequence()
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Stopping Action Sequence");
|
||||||
|
_allowActionsToExecute = false;
|
||||||
|
_worker.Abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Populates the queue from the configuration information
|
||||||
|
/// </summary>
|
||||||
|
private void AddActionsToQueue()
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Adding {0} actions to queue", _propertiesConfig.ActionSequence.Count);
|
||||||
|
|
||||||
|
for (int i = 0; i < _propertiesConfig.ActionSequence.Count; i++)
|
||||||
|
{
|
||||||
|
_actionQueue.Enqueue(_propertiesConfig.ActionSequence[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private object ProcessActions(object obj)
|
||||||
|
{
|
||||||
|
while (_allowActionsToExecute && _actionQueue.Count > 0)
|
||||||
|
{
|
||||||
|
SequencedDeviceActionWrapper action = null;
|
||||||
|
|
||||||
|
action = _actionQueue.Dequeue();
|
||||||
|
if (action == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Delay before executing
|
||||||
|
if (action.DelayMs > 0)
|
||||||
|
Thread.Sleep(action.DelayMs);
|
||||||
|
|
||||||
|
ExecuteAction(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ExecuteAction(DeviceActionWrapper action)
|
||||||
|
{
|
||||||
|
if (action == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DeviceJsonApi.DoDeviceAction(action);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Error Executing Action: {0}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Configuration Properties for ActionSequence
|
||||||
|
/// </summary>
|
||||||
|
public class ActionSequencePropertiesConfig
|
||||||
|
{
|
||||||
|
[JsonProperty("actionSequence")]
|
||||||
|
public List<SequencedDeviceActionWrapper> ActionSequence { get; set; }
|
||||||
|
|
||||||
|
public ActionSequencePropertiesConfig()
|
||||||
|
{
|
||||||
|
ActionSequence = new List<SequencedDeviceActionWrapper>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SequencedDeviceActionWrapper : DeviceActionWrapper
|
||||||
|
{
|
||||||
|
[JsonProperty("delayMs")]
|
||||||
|
public int DelayMs { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Factory class
|
||||||
|
/// </summary>
|
||||||
|
public class ActionSequenceFactory : EssentialsDeviceFactory<ActionSequence>
|
||||||
|
{
|
||||||
|
public ActionSequenceFactory()
|
||||||
|
{
|
||||||
|
TypeNames = new List<string>() { "actionsequence" };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory Attempting to create new ActionSequence Device");
|
||||||
|
|
||||||
|
return new ActionSequence(dc.Key, dc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user