diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Routing/IRoutingInputsExtensions.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Routing/IRoutingInputsExtensions.cs
index 0c375825..4beaa37d 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Routing/IRoutingInputsExtensions.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Routing/IRoutingInputsExtensions.cs
@@ -11,12 +11,34 @@ using PepperDash.Core;
namespace PepperDash.Essentials.Core
{
+ public class RouteRequest
+ {
+ public IRoutingSink Destination {get; set;}
+ public IRoutingOutputs Source {get; set;}
+ public eRoutingSignalType SignalType {get; set;}
+
+ public void HandleCooldown(object sender, FeedbackEventArgs args)
+ {
+ var coolingDevice = sender as IWarmingCooling;
+
+ if(args.BoolValue == false)
+ {
+ Destination.ReleaseAndMakeRoute(Source, SignalType);
+
+ if(sender == null) return;
+
+ coolingDevice.IsCoolingDownFeedback.OutputChange -= HandleCooldown;
+ }
+ }
+ }
+
///
/// Extensions added to any IRoutingInputs classes to provide discovery-based routing
/// on those destinations.
///
public static class IRoutingInputsExtensions
{
+ private static Dictionary RouteRequests = new Dictionary();
///
/// Gets any existing RouteDescriptor for a destination, clears it using ReleaseRoute
/// and then attempts a new Route and if sucessful, stores that RouteDescriptor
@@ -24,16 +46,51 @@ namespace PepperDash.Essentials.Core
///
public static void ReleaseAndMakeRoute(this IRoutingSink destination, IRoutingOutputs source, eRoutingSignalType signalType)
{
- destination.ReleaseRoute();
+ var routeRequest = new RouteRequest {
+ Destination = destination,
+ Source = source,
+ SignalType = signalType
+ };
- if (source == null) return;
- var newRoute = destination.GetRouteToSource(source, signalType);
- if (newRoute == null) return;
- RouteDescriptorCollection.DefaultCollection.AddRouteDescriptor(newRoute);
- Debug.Console(2, destination, "Executing full route");
- newRoute.ExecuteRoutes();
+ var coolingDevice = destination as IWarmingCooling;
+
+ RouteRequest existingRouteRequest;
+
+ //We already have a route request for this device, and it's a cooling device and is cooling
+ if (RouteRequests.TryGetValue(destination.Key, out existingRouteRequest) && coolingDevice != null && coolingDevice.IsCoolingDownFeedback.BoolValue == true)
+ {
+ coolingDevice.IsCoolingDownFeedback.OutputChange -= existingRouteRequest.HandleCooldown;
+
+ coolingDevice.IsCoolingDownFeedback.OutputChange += routeRequest.HandleCooldown;
+
+ RouteRequests[destination.Key] = routeRequest;
+ return;
+ }
+
+ //New Request
+ if (coolingDevice != null && coolingDevice.IsCoolingDownFeedback.BoolValue == true)
+ {
+ coolingDevice.IsCoolingDownFeedback.OutputChange += routeRequest.HandleCooldown;
+
+ RouteRequests.Add(destination.Key, routeRequest);
+ return;
+ }
+
+ destination.ReleaseRoute();
+
+ RunRouteRequest(routeRequest);
}
+ public static void RunRouteRequest(RouteRequest request)
+ {
+ if (request.Source == null) return;
+ var newRoute = request.Destination.GetRouteToSource(request.Source, request.SignalType);
+ if (newRoute == null) return;
+ RouteDescriptorCollection.DefaultCollection.AddRouteDescriptor(newRoute);
+ Debug.Console(2, request.Destination, "Executing full route");
+ newRoute.ExecuteRoutes();
+ }
+
///
/// Will release the existing route on the destination, if it is found in
/// RouteDescriptorCollection.DefaultCollection