public void SendRoundEnd(TerrestrialRoundMessage roundMessage)
        {
            string message = JsonConvert.SerializeObject(roundMessage);

            publish(message, _Channel, "roundEnd");
        }
        public Simulator(string config)
        {
            // Loads configuration
            _Config = JsonConvert.DeserializeObject <Config>(File.ReadAllText(config));

            // Sets starting parameters
            Random rnd        = new Random();
            int    i          = 0;
            int    tag        = 0;
            int    day        = 1440 / _Config.Interval - 1;
            int    timeTofail = Convert.ToInt32(day * _Config.Days * _Config.AddOutliers);
            bool   fail       = false;
            List <TerrestrialObservation>       observations = new List <TerrestrialObservation>();
            Dictionary <string, List <string> > failList     = new Dictionary <string, List <string> >();

            // Documantation for outliers
            foreach (var target in _Config.Targets)
            {
                failList.Add(target.Key, new List <string>());
            }

            Console.WriteLine("Ready to generate " + (day * _Config.Days).ToString() + " Observations");
            Console.ReadLine();

            while (i < day * _Config.Days)
            {
                i++;
                // new message
                TerrestrialRoundMessage message = new TerrestrialRoundMessage
                {
                    DeviceId      = _Config.DeviceId,
                    RoundStartUtc = _Config.StartTime.AddMinutes(i * _Config.Interval),
                    Station       = _Config.Station
                };
                message.RoundId = CalcRoundId(_Config.DeviceId, message.RoundStartUtc, _Config.Station);

                // Send station record
                _MessageSender.SendStationRecord(message);

                // Crating observation message
                foreach (var target in _Config.Targets)
                {
                    // deciding if the new observation is an outlier
                    if (i > timeTofail)
                    {
                        if (failList[target.Key].Count == 0)
                        {
                            if (rnd.NextDouble() > 0.9)
                            {
                                fail = true;
                                failList[target.Key].Add(i.ToString());
                            }
                        }
                        else if (i - Convert.ToInt16(failList[target.Key][failList[target.Key].Count - 1]) > 4) // this prevents that there are 2 outliers too close to another
                        {
                            if (rnd.NextDouble() > 0.9)
                            {
                                fail = true;
                                failList[target.Key].Add(i.ToString());
                            }
                        }
                    }

                    //generating the observation
                    var obs = _DataGenerator.GetTerrestrialObservation(target.Key, _Config, rnd, i, fail);

                    // save observations to the list
                    obs.TimeUtc = message.RoundStartUtc.AddMinutes(tag);
                    observations.Add(obs);
                    TerrestrialObservation face2 = clone(obs);
                    observations.Add(_DataGenerator.FlipFace(face2));

                    // resetting parameters for next loop
                    fail = false;
                    tag++;
                }

                // adding observations to message and sending the message
                message.Observations = observations.ToArray();
                _MessageSender.SendObservationRecord(message);
                message.Observations = null;
                message.RoundEndUtc  = message.RoundStartUtc.AddMinutes(tag + 1);
                _MessageSender.SendRoundEnd(message);

                //Resetting values for next loop
                tag = 0;
                observations.Clear();
            }

            foreach (var target in failList)
            {
                File.WriteAllLines(_Config.FailSavePath + _Config.DeviceId + target.Key + ".csv", (target.Value.ToArray()));
            }
            Console.WriteLine("Finished sending messages");
            Console.ReadLine();
        }
        public void SendObservationRecord(TerrestrialRoundMessage roundMessage)
        {
            string message = JsonConvert.SerializeObject(roundMessage);

            publish(message, _Channel, "observationRecord");
        }