Skip to content
This repository has been archived by the owner on Jul 4, 2023. It is now read-only.

Commit

Permalink
allow to set "maintenance" / "malfunction" for accessory, i.e. will n…
Browse files Browse the repository at this point in the history
…ot be used in AutoMode : closes #79
  • Loading branch information
Christian Benjamin Ries committed Apr 5, 2021
1 parent b2ab394 commit 02b0298
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 3 deletions.
17 changes: 14 additions & 3 deletions railessentials/AutoMode/AutoMode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,10 @@ private NextRouteInformation CheckForRoutesAndAssign()
// has already a destination
if (!string.IsNullOrEmpty(itOccBlock.FinalBlock)) continue;

//
// the most interesting call is `GetNextRoute(..)` which
// is responsible for selecting the best next journey path
//
var nextRoute = GetNextRoute(itOccBlock, out var locomotiveObjectId);
if (nextRoute == null) continue;

Expand Down Expand Up @@ -649,7 +653,7 @@ public Route.Route GetNextRoute(
if (locData == null) return null;

//
// NOTE check of the OCC has waiting long enough for a new start
// NOTE check if the OCC has waited long enough for a new start
//
var lastReachedTime = occBlock.ReachedTime;
var allowedMinimumTime = lastReachedTime.AddSeconds(occBlock.SecondsToWait);
Expand Down Expand Up @@ -843,13 +847,20 @@ public Route.Route GetNextRoute(
SaveOccAndPromote();

#endregion (4)

}
var routesFromFiltered = routesFrom.FilterBy(locDataEcos, locData, _metadata.FeedbacksData);
var routesFromNotOccupied = routesFromFiltered.FilterNotOccupiedOrLocked(_metadata.Occ);
if (routesFromNotOccupied.Count == 0) return null;

var routesNoCross = routesFromNotOccupied.FilterNoCrossingOccupied(_routeList);
//
// filter routes if any accessory is in "maintenance" mode
//
var routesNoMaintenance = routesFromNotOccupied.FilterSwitchesMaintenance(_metadata.Metamodel);

//
// filter all routes which cross occupied routes
//
var routesNoCross = routesNoMaintenance.FilterNoCrossingOccupied(_routeList);
if (routesNoCross.Count == 0)
{
//
Expand Down
45 changes: 45 additions & 0 deletions railessentials/Route/RouterListExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
using System;
using System.Collections.Generic;
using ecoslib.Entities;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using railessentials.Feedbacks;
using railessentials.Plan;

namespace railessentials.Route
{
Expand Down Expand Up @@ -159,5 +162,47 @@ public static bool Contains(this RouteList routeList, Route route)
}
return false;
}

public static RouteList FilterSwitchesMaintenance(
this RouteList routeList,
JObject metamodel
)
{
if (routeList == null) return routeList;
if (routeList.Count == 0) return routeList;

var planField = metamodel?["planField"] as JObject;
if (planField == null) return routeList;

var res = new RouteList();

foreach (var it in routeList)
{
if (it == null) continue;

var addToResult = true;

foreach(var itSwitch in it.Switches)
{
if (itSwitch == null) continue;
var key = $"{itSwitch.x}x{itSwitch.y}";
if(planField[key] != null)
{
var itemObj = JsonConvert.DeserializeObject<PlanItem>(planField[key].ToString());
if (itemObj == null) continue;
if(itemObj.IsMaintenance)
{
addToResult = false;
break;
}
}
}

if(addToResult)
res.Add(it);
}

return res;
}
}
}

0 comments on commit 02b0298

Please sign in to comment.