コード例 #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);
        }
コード例 #2
0
ファイル: MissileStatusHub.cs プロジェクト: kakarotto67/mlmc
        public async Task SendMissileStatusUpdatedMessage(
            LaunchedMissileCurrentStatusEvent missileStatusEvent)
        {
            if (missileStatusEvent == null)
            {
                return;
            }

            // Send message to all connected clients
            await Clients.All.SendAsync(MissileStatusUpdatedMessage, missileStatusEvent);
        }
コード例 #3
0
        private void PostSignalRMessage(LaunchedMissileCurrentStatusEvent eventMessage)
        {
            if (eventMessage == null)
            {
                return;
            }

            using (var client = clientFactory.CreateClient())
            {
                var uri = configuration.GetValue <String>("ApiPath:Mgcc");

                var eventJson = JsonConvert.SerializeObject(eventMessage);

                var contentToPost = new StringContent(eventJson, Encoding.UTF8, "application/json");

                var postResult = client.PostAsync(uri, contentToPost).Result;
            }
        }
コード例 #4
0
        private void PostCurrentStatusEvent(LaunchedMissileCurrentStatusEvent eventMessage)
        {
            if (eventMessage == null)
            {
                return;
            }

            // TODO: Extract delay simulation from this method
            // TODO: Add random delay
            // 1 second delay
            Thread.Sleep(1000);

            // Post SignalR message with current status and GPS coordinates
            // of launched missile so it can be handled on UI map.
            PostSignalRMessage(eventMessage);

            // If this is final event - also post message to Missile Finished Queue of Message Bus
            if (eventMessage.IsFinished)
            {
                PostMissileFinishedEvent(eventMessage);
            }
        }
コード例 #5
0
        /// <summary>
        /// Message produced by this method will be used by Reporting service.
        /// </summary>
        private void PostMissileFinishedEvent(LaunchedMissileCurrentStatusEvent eventMessage)
        {
            if (eventMessage == null || !eventMessage.IsFinished)
            {
                return;
            }

            // Publish missile finished message
            var finishedMissilesQueue = configuration
                                        .GetValue <String>("MessageBusSettings:Queues:FinishedMissilesQueue");
            // TODO: Add more info
            var missileFinishedEvent = new MissileFinishedEvent
            {
                MissileId = eventMessage.MissileId,
                MissileServiceIdentityNumber = eventMessage.MissileServiceIdentityNumber,
                MissileName               = eventMessage.MissileName,
                MissileStatus             = eventMessage.MissileStatus,
                MissileFinishedAtLocation = eventMessage.MissileGpsLocation,
                MissileFinishedAtDate     = eventMessage.InformationPostedDate
            };

            messageBus.PublishMessage(finishedMissilesQueue, missileFinishedEvent);
        }
コード例 #6
0
 public async Task Post([FromBody] LaunchedMissileCurrentStatusEvent eventMessage)
 {
     // Send SignalR message with current missile status
     await hubContext.Clients.All.SendAsync(MissileStatusHub.MissileStatusUpdatedMessage,
                                            eventMessage);
 }