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); }
public void RunNewSimulation(LaunchMissileEvent eventMessage) { if (eventMessage == null) { return; } Task.Factory.StartNew(() => SimulationEngine(eventMessage)); }
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()); }