Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }