/// <summary> // Amber (permissive-clearance) : <startTime>21270</startTime> <minEndTime>21300</minEndTime> // Red (stop-And-Remain) : <startTime>21300</startTime> <minEndTime>21170</minEndTime> // RedAmber (pre-Movement) : <startTime>21170</startTime> <minEndTime>21190</minEndTime> // Green (protected-Movement-Allowed) : <startTime>21190</startTime> <minEndTime>21270</minEndTime> // TODO - Use legal limits? // Regarding the 36002’s This shouldn’t be a problem because there are legal minimums // Red 5 secs, // Amber 2 secs, // Green 7secs, // closing Amber 3 secs. /// </summary> /// <param name="movementState"></param> /// <param name="TimeStamp"></param> /// <returns></returns> public static List <StateTimeMovementEvent> ProjectedMovementEventStates(SPATIntersectionsIntersectionStateMovementState movementState, int crocsTime) { IList <SPATIntersectionsIntersectionStateMovementStateMovementEvent> movementEvents = movementState.statetimespeed; List <StateTimeMovementEvent> stateTimeMovementEvents = new List <StateTimeMovementEvent>(); foreach (SPATIntersectionsIntersectionStateMovementStateMovementEvent moveEvent in movementEvents) { StateTimeMovementEvent stateTimeMovementEvent = new StateTimeMovementEvent { MovementEvent = GetSignalStateByEventState(moveEvent.eventState), MovementTimespan = TimeSpan.FromMilliseconds(0), MinEndTime = moveEvent.timing.minEndTime, SignalGroupId = movementState.signalGroup, }; if (IsCROCSTimeValid(moveEvent.timing.minEndTime)) { var phaseCountdown = moveEvent.timing.minEndTime - crocsTime; TimeSpan timeSpan = TimeSpan.FromSeconds(phaseCountdown / Constants.SPAT_MOVEMENT_EVENT_TIMING_UNIT); stateTimeMovementEvent.MovementTimespan = timeSpan; } stateTimeMovementEvents.Add(stateTimeMovementEvent); } return(stateTimeMovementEvents); }
public static GLOSAResult ProjectedSignalTimingsForLane(MapDataIntersectionsIntersectionGeometryGenericLane lane, SPAT spat, ulong maneuver, int crocsTime) { GLOSAResult crocsResult = new GLOSAResult(); SPATIntersectionsIntersectionStateMovementState state = LocateSignalMovementStateForLane(spat, lane, maneuver); if (state != null) { List <StateTimeMovementEvent> stateTimeMovementEvents = ProjectedMovementEventStates(state, crocsTime); crocsResult.StateTimeMovementEvents = stateTimeMovementEvents; if (IsTimeWithinCurrentMovementSequence(crocsTime, stateTimeMovementEvents) == true) { crocsResult.CurrentStateTimeMovement = FindNextMovementEvent(crocsTime, stateTimeMovementEvents); } else { crocsResult.Errors = GLOSAErrors.UnableToProjectMovementStates; } } else { crocsResult.Errors = GLOSAErrors.UnableToFindProjectedStateForLane; } return(crocsResult); }
public static SPATIntersectionsIntersectionStateMovementState LocateSignalMovementStateForLane(SPAT spat, MapDataIntersectionsIntersectionGeometryGenericLane lane, ulong maneuver) { SPATIntersectionsIntersectionStateMovementState movementState = null; if (lane.connectsTo != null) { var laneConnection = lane.connectsTo.Where(connection => connection.connectingLane.maneuver == maneuver); if (laneConnection.Count() > 0) { byte signalGroup = laneConnection.First().signalGroup; movementState = spat.intersections.IntersectionState.states.Where(state => state.signalGroup == signalGroup).FirstOrDefault(); } } return(movementState); }