Example #1
0
        private LandingCheck GetPreviousLandingCheck(RocketId currentRocketId, DateTime currentTimestamp)
        {
            LandingCheck previousLandingCheck = null;

            foreach (var(rocketId, landingCheck) in _landingChecks)
            {
                if (IsSameRocket(currentRocketId, rocketId))
                {
                    continue;
                }

                if (IsAfterCurrentCheck(currentTimestamp, landingCheck))
                {
                    continue;
                }

                if (IsOlderThanAlreadyFound(previousLandingCheck, landingCheck))
                {
                    continue;
                }

                previousLandingCheck = landingCheck;
            }

            return(previousLandingCheck);
        }
Example #2
0
        private static bool IsOlderThanAlreadyFound(LandingCheck previousLandingCheck, LandingCheck landingCheck)
        {
            if (previousLandingCheck is null)
            {
                return(false);
            }

            return(landingCheck.Timestamp < previousLandingCheck.Timestamp);
        }
        /// <summary>
        /// Verifies if given landing position is eligible for landing.
        /// </summary>
        /// <param name="rocketId">Rocket identifier.</param>
        /// <param name="position">Potential landing position to check.</param>
        /// <returns></returns>
        public async Task <string> VerifyPosition(RocketId rocketId, LandingPosition position)
        {
            if (IsOutOfPlatform(position))
            {
                return(OutputMessages.OutOfPlatform);
            }

            var landingCheck = new LandingCheck(rocketId, position, _dateTimeProvider.DateTimeUtcNow);

            var landingCheckRequest = new LandingCheckRequest(landingCheck);

            await _landingCheckChannel.WriteAsync(landingCheckRequest);

            var potentialClashPosition = await landingCheckRequest.GetResultAsync();

            return(IsClashWithPrevious(position, potentialClashPosition)
                ? OutputMessages.Clash
                : OutputMessages.OkForLanding);
        }
Example #4
0
 public LandingCheckRequest(LandingCheck landingCheck)
 {
     LandingCheck          = landingCheck;
     _taskCompletionSource = new TaskCompletionSource <LandingPosition>(TaskCreationOptions.None);
 }
Example #5
0
 private static bool IsAfterCurrentCheck(DateTime currentTimestamp, LandingCheck landingCheck)
 {
     return(landingCheck.Timestamp >= currentTimestamp);
 }
Example #6
0
        public LandingPosition GetPotentialClashPosition(LandingCheck landingCheck)
        {
            var previousLandingCheck = GetPreviousLandingCheck(landingCheck.RocketId, landingCheck.Timestamp);

            return(previousLandingCheck?.LandingPosition);
        }
Example #7
0
 public void AddLandingCheck(LandingCheck landingCheck)
 {
     _landingChecks[landingCheck.RocketId] = landingCheck;
 }