Example #1
0
        private void SimulationEngine(LaunchMissileEvent eventMessage)
        {
            var deploymentPlatformLocation = eventMessage.DeploymentPlatformLocation;
            var targetLocation             = eventMessage.TargetLocation;

            // Find bearing between deployment platform and target locations
            var bearing = CoordinatesHelper.FindInitialBearing(deploymentPlatformLocation, targetLocation);

            var launchedMissileCurrentStatusEvent = new LaunchedMissileCurrentStatusEvent
            {
                MissileId = eventMessage.MissileId,
                MissileServiceIdentityNumber = eventMessage.MissileServiceIdentityNumber,
                MissileName           = eventMessage.MissileName,
                MissileStatus         = MissileStatus.Launched,
                MissileGpsLocation    = deploymentPlatformLocation,
                InformationPostedDate = DateTime.UtcNow,
                Bearing = bearing
            };

            // Post initial infromation about launched missile
            PostCurrentStatusEvent(launchedMissileCurrentStatusEvent);

            var distance = CoordinatesHelper.GetDistance(deploymentPlatformLocation, targetLocation);

            if (distance <= stepInKm)
            {
                // Post final information about launched missile
                launchedMissileCurrentStatusEvent.SetFinalInfo(targetLocation);
                PostCurrentStatusEvent(launchedMissileCurrentStatusEvent);

                return;
            }

            var currentDistance = 0;
            var maxNotificationsBeforeFinish = (Int32)Math.Floor(distance / stepInKm);

            for (var i = 0; i < maxNotificationsBeforeFinish; i++)
            {
                currentDistance += stepInKm;

                // Double check if current distance is less than total distance
                if (currentDistance >= distance)
                {
                    break;
                }

                // Get current missile GPS coordinates
                var currentMissileGpsLocation =
                    CoordinatesHelper.GetIntermediateLocation(
                        deploymentPlatformLocation, bearing, currentDistance);

                // Post current status information about launched missile
                launchedMissileCurrentStatusEvent.SetIntermediaryInfo(currentMissileGpsLocation);
                PostCurrentStatusEvent(launchedMissileCurrentStatusEvent);
            }

            // Post final information about launched missile
            launchedMissileCurrentStatusEvent.SetFinalInfo(targetLocation);
            PostCurrentStatusEvent(launchedMissileCurrentStatusEvent);
        }
Example #2
0
        public void RunNewSimulation(LaunchMissileEvent eventMessage)
        {
            if (eventMessage == null)
            {
                return;
            }

            Task.Factory.StartNew(() => SimulationEngine(eventMessage));
        }
Example #3
0
        public IActionResult Post([FromBody] Missile missile)
        {
            if (missile?.ServiceIdentityNumber == null)
            {
                return(BadRequest());
            }

            var missileFromDatabase = missileService.Get(missile.ServiceIdentityNumber);

            if (missileFromDatabase == null)
            {
                return(BadRequest());
            }

            var deploymentPlatform = deploymentPlatformService.Get(missileFromDatabase.DeploymentPlatformId);

            if (deploymentPlatform == null)
            {
                return(BadRequest());
            }

            var eventMessage = new LaunchMissileEvent
            {
                MissileId = missileFromDatabase.MissileId,
                MissileServiceIdentityNumber = missile.ServiceIdentityNumber,
                MissileName = missileFromDatabase.Name,
                LaunchDate  = DateTime.UtcNow,
                DeploymentPlatformLocation = deploymentPlatform.Location,
                TargetLocation             = missile.TargetLocation
            };

            // Publish launch missile message
            var launchMissileQueue = configuration
                                     .GetValue <String>("MessageBusSettings:Queues:LaunchCenterQueue");

            messageBus.PublishMessage(launchMissileQueue, eventMessage);

            // Update status of the missile to 'Launched'
            var updateStatus = missileService.Update(missile.ServiceIdentityNumber, MissileStatus.Launched);

            if (updateStatus)
            {
                return(Ok());
            }

            return(BadRequest());
        }