public void BaseStationMessageTranslator_Translate_Only_Translate_Status_Codes_For_Status_Messages()
 {
     foreach (BaseStationMessageType messageType in Enum.GetValues(typeof(BaseStationMessageType)))
     {
         if (messageType == BaseStationMessageType.Unknown)
         {
             continue;
         }
         foreach (BaseStationStatusCode statusCode in Enum.GetValues(typeof(BaseStationStatusCode)))
         {
             if (statusCode == BaseStationStatusCode.None)
             {
                 continue;
             }
             string text = String.Format("{0},1,5,2056,7404F2,11267,2008/11/28,23:48:18.611,2008/11/28,23:53:19.161,{1},,,,,,,,,,,",
                                         BaseStationMessageHelper.ConvertToString(messageType),
                                         BaseStationMessageHelper.ConvertToString(statusCode));
             string             errorText = String.Format("{0} and {1}", messageType, statusCode);
             BaseStationMessage message   = _Implementation.Translate(text, 123);
             if (messageType == BaseStationMessageType.StatusChange)
             {
                 Assert.AreEqual(statusCode, message.StatusCode, errorText);
             }
             else
             {
                 Assert.AreEqual(BaseStationMessageHelper.ConvertToString(statusCode), message.Callsign, errorText);
             }
         }
     }
 }
 public void BaseStationMessageTranslator_Translate_Ignores_TransmissionType_For_All_NonTransmission_Messages()
 {
     foreach (BaseStationMessageType messageType in Enum.GetValues(typeof(BaseStationMessageType)))
     {
         if (messageType == BaseStationMessageType.Unknown)
         {
             continue;
         }
         foreach (BaseStationTransmissionType transmissionType in Enum.GetValues(typeof(BaseStationTransmissionType)))
         {
             if (transmissionType == BaseStationTransmissionType.None)
             {
                 continue;
             }
             string text = String.Format("{0},{1},5,2056,7404F2,11267,2008/11/28,23:48:18.611,2008/11/28,23:53:19.161,,,,,,,,,,,,",
                                         BaseStationMessageHelper.ConvertToString(messageType),
                                         BaseStationMessageHelper.ConvertToString(transmissionType));
             string             errorText = String.Format("{0} and {1}", messageType, transmissionType);
             BaseStationMessage message   = _Implementation.Translate(text, 123);
             if (messageType == BaseStationMessageType.Transmission)
             {
                 Assert.AreEqual(transmissionType, message.TransmissionType, errorText);
             }
             else
             {
                 Assert.AreEqual(BaseStationTransmissionType.None, message.TransmissionType, errorText);
             }
         }
     }
 }
Beispiel #3
0
        public void BaseStationMessageHelper_ConvertToBaseStationTransmissionType_Converts_Text_Correctly()
        {
            foreach (BaseStationTransmissionType transmissionType in Enum.GetValues(typeof(BaseStationTransmissionType)))
            {
                string text = null;
                switch (transmissionType)
                {
                case BaseStationTransmissionType.AirbornePosition:              text = "3"; break;

                case BaseStationTransmissionType.AirborneVelocity:              text = "4"; break;

                case BaseStationTransmissionType.AirToAir:                      text = "7"; break;

                case BaseStationTransmissionType.AllCallReply:                  text = "8"; break;

                case BaseStationTransmissionType.IdentificationAndCategory:     text = "1"; break;

                case BaseStationTransmissionType.None:                          continue;

                case BaseStationTransmissionType.SurfacePosition:               text = "2"; break;

                case BaseStationTransmissionType.SurveillanceAlt:               text = "5"; break;

                case BaseStationTransmissionType.SurveillanceId:                text = "6"; break;

                default:                                                        throw new NotImplementedException();
                }
                Assert.AreEqual(transmissionType, BaseStationMessageHelper.ConvertToBaseStationTransmissionType(text), transmissionType.ToString());
            }
        }
Beispiel #4
0
 public void BaseStationMessageHelper_ConvertToBaseStationMessageType_Converts_Unknown_Text_Correctly()
 {
     foreach (string text in new string[] { null, "", "HHH", " MSG", "ID " })
     {
         Assert.AreEqual(BaseStationMessageType.Unknown, BaseStationMessageHelper.ConvertToBaseStationMessageType(text));
     }
 }
Beispiel #5
0
        public void BaseStationMessageHelperTests_ConvertToString_BaseStationMessageType_Converts_All_Types_Correctly()
        {
            foreach (BaseStationMessageType messageType in Enum.GetValues(typeof(BaseStationMessageType)))
            {
                string text = BaseStationMessageHelper.ConvertToString(messageType);
                switch (messageType)
                {
                case BaseStationMessageType.NewAircraft:        Assert.AreEqual("AIR", text); break;

                case BaseStationMessageType.NewIdentifier:      Assert.AreEqual("ID", text); break;

                case BaseStationMessageType.StatusChange:       Assert.AreEqual("STA", text); break;

                case BaseStationMessageType.Transmission:       Assert.AreEqual("MSG", text); break;

                case BaseStationMessageType.Unknown:            Assert.AreEqual("", text); break;

                case BaseStationMessageType.UserClicked:        Assert.AreEqual("SEL", text); break;

                case BaseStationMessageType.UserDoubleClicked:  Assert.AreEqual("CLK", text); break;

                default:                                        throw new NotImplementedException();
                }
            }
        }
Beispiel #6
0
        public void BaseStationMessageHelperTests_ConvertToString_BaseStationTransmissionType_Converts_All_Types_Correctly()
        {
            foreach (BaseStationTransmissionType transmissionType in Enum.GetValues(typeof(BaseStationTransmissionType)))
            {
                string text = BaseStationMessageHelper.ConvertToString(transmissionType);
                switch (transmissionType)
                {
                case BaseStationTransmissionType.AirbornePosition:              Assert.AreEqual("3", text); break;

                case BaseStationTransmissionType.AirborneVelocity:              Assert.AreEqual("4", text); break;

                case BaseStationTransmissionType.AirToAir:                      Assert.AreEqual("7", text); break;

                case BaseStationTransmissionType.AllCallReply:                  Assert.AreEqual("8", text); break;

                case BaseStationTransmissionType.IdentificationAndCategory:     Assert.AreEqual("1", text); break;

                case BaseStationTransmissionType.None:                          Assert.AreEqual("", text); break;

                case BaseStationTransmissionType.SurfacePosition:               Assert.AreEqual("2", text); break;

                case BaseStationTransmissionType.SurveillanceAlt:               Assert.AreEqual("5", text); break;

                case BaseStationTransmissionType.SurveillanceId:                Assert.AreEqual("6", text); break;

                default:                                                        throw new NotImplementedException();
                }
            }
        }
Beispiel #7
0
        public void BaseStationMessageHelper_ConvertToBaseStationMessageType_Converts_Text_Correctly()
        {
            foreach (BaseStationMessageType messageType in Enum.GetValues(typeof(BaseStationMessageType)))
            {
                string text = null;
                switch (messageType)
                {
                case BaseStationMessageType.NewAircraft:        text = "AIR"; break;

                case BaseStationMessageType.NewIdentifier:      text = "ID"; break;

                case BaseStationMessageType.StatusChange:       text = "STA"; break;

                case BaseStationMessageType.Transmission:       text = "MSG"; break;

                case BaseStationMessageType.Unknown:            continue;

                case BaseStationMessageType.UserClicked:        text = "SEL"; break;

                case BaseStationMessageType.UserDoubleClicked:  text = "CLK"; break;

                default:                                        throw new NotImplementedException();
                }
                Assert.AreEqual(messageType, BaseStationMessageHelper.ConvertToBaseStationMessageType(text), messageType.ToString());
            }
        }
Beispiel #8
0
 public void BaseStationMessageHelper_ConvertToBaseStationStatusCode_Converts_Unknown_Text_Correctly()
 {
     foreach (string text in new string[] { null, "", "ad", " OK", "SL " })
     {
         Assert.AreEqual(BaseStationStatusCode.None, BaseStationMessageHelper.ConvertToBaseStationStatusCode(text));
     }
 }
Beispiel #9
0
 public void BaseStationMessageHelper_ConvertToBaseStationTransmissionType_Converts_Unknown_Text_Correctly()
 {
     foreach (string text in new string[] { null, "", "0", "9", "10", "AA" })
     {
         Assert.AreEqual(BaseStationTransmissionType.None, BaseStationMessageHelper.ConvertToBaseStationTransmissionType(text));
     }
 }
 public void BaseStationMessageTranslator_Translate_Parses_Transmission_Types_Correctly()
 {
     foreach(BaseStationTransmissionType transmissionType in Enum.GetValues(typeof(BaseStationTransmissionType))) {
         if(transmissionType == BaseStationTransmissionType.None) continue;
         string typeText = BaseStationMessageHelper.ConvertToString(transmissionType);
         BaseStationMessage message = _Implementation.Translate(String.Format("MSG,{0},5,2056,7404F2,11267,2008/11/28,23:48:18.611,2008/11/28,23:53:19.161,,,,,,,,,,,,", typeText));
         Assert.AreEqual(transmissionType, message.TransmissionType, transmissionType.ToString());
     }
 }
 public void BaseStationMessageTranslator_Translate_Parses_Message_Types_Correctly()
 {
     foreach(BaseStationMessageType messageType in Enum.GetValues(typeof(BaseStationMessageType))) {
         if(messageType == BaseStationMessageType.Unknown) continue;
         string messageTypeText = BaseStationMessageHelper.ConvertToString(messageType);
         string text = String.Format("{0},1,5,2056,7404F2,11267,2008/11/28,23:48:18.611,2008/11/28,23:53:19.161,,,,,,,,,,,,", messageTypeText);
         BaseStationMessage message = _Implementation.Translate(text);
         Assert.AreEqual(messageType, message.MessageType, messageType.ToString());
     }
 }
        public void BaseStationMessageHelper_ConvertToBaseStationMessageType_Converts_Mlat_Message_Types_Correctly()
        {
            var isMlat = false;

            var messageType = BaseStationMessageHelper.ConvertToBaseStationMessageType("MLAT", ref isMlat);

            Assert.AreEqual(BaseStationMessageType.Transmission, messageType);
            Assert.IsTrue(isMlat);

            isMlat      = false;
            messageType = BaseStationMessageHelper.ConvertToBaseStationMessageType("MSG", ref isMlat);
            Assert.AreEqual(BaseStationMessageType.Transmission, messageType);
            Assert.IsFalse(isMlat);         // Actually this is untouched, but it's definitely not true
        }
Beispiel #13
0
        public void BaseStationMessageHelperTests_ConvertToString_BaseStationStatusCode_Converts_All_Types_Correctly()
        {
            foreach (BaseStationStatusCode statusCode in Enum.GetValues(typeof(BaseStationStatusCode)))
            {
                string text = BaseStationMessageHelper.ConvertToString(statusCode);
                switch (statusCode)
                {
                case BaseStationStatusCode.Delete:          Assert.AreEqual("AD", text); break;

                case BaseStationStatusCode.None:            Assert.AreEqual("", text); break;

                case BaseStationStatusCode.OK:              Assert.AreEqual("OK", text); break;

                case BaseStationStatusCode.PositionLost:    Assert.AreEqual("PL", text); break;

                case BaseStationStatusCode.Remove:          Assert.AreEqual("RM", text); break;

                case BaseStationStatusCode.SignalLost:      Assert.AreEqual("SL", text); break;

                default:                                    throw new NotImplementedException();
                }
            }
        }
Beispiel #14
0
        public void BaseStationMessageHelper_ConvertToBaseStationStatusCode_Converts_Text_Correctly()
        {
            foreach (BaseStationStatusCode statusCode in Enum.GetValues(typeof(BaseStationStatusCode)))
            {
                string text = null;
                switch (statusCode)
                {
                case BaseStationStatusCode.Delete:          text = "AD"; break;

                case BaseStationStatusCode.None:            continue;

                case BaseStationStatusCode.OK:              text = "OK"; break;

                case BaseStationStatusCode.PositionLost:    text = "PL"; break;

                case BaseStationStatusCode.Remove:          text = "RM"; break;

                case BaseStationStatusCode.SignalLost:      text = "SL"; break;

                default:                                    throw new NotImplementedException();
                }
                Assert.AreEqual(statusCode, BaseStationMessageHelper.ConvertToBaseStationStatusCode(text), statusCode.ToString());
            }
        }
        /// <summary>
        /// See interface docs.
        /// </summary>
        /// <param name="text"></param>
        /// <param name="signalLevel"></param>
        /// <returns></returns>
        public BaseStationMessage Translate(string text, int?signalLevel)
        {
            var result = new BaseStationMessage()
            {
                SignalLevel = signalLevel
            };

            if (!String.IsNullOrEmpty(text))
            {
                var      isMlat = false;
                string[] parts  = text.Split(',');
                for (int c = 0; c < parts.Length; c++)
                {
                    string chunk = parts[c];
                    try {
                        if (!String.IsNullOrEmpty(chunk))
                        {
                            switch (c)
                            {
                            case 0:     result.MessageType = BaseStationMessageHelper.ConvertToBaseStationMessageType(chunk, ref isMlat); break;

                            case 1:     result.TransmissionType = result.MessageType == BaseStationMessageType.Transmission ? BaseStationMessageHelper.ConvertToBaseStationTransmissionType(chunk) : BaseStationTransmissionType.None; break;

                            case 2:     result.SessionId = ParseInt(chunk); break;

                            case 3:     result.AircraftId = ParseInt(chunk); break;

                            case 4:     result.Icao24 = chunk == null ? null : chunk.ToUpperInvariant(); break;

                            case 5:     result.FlightId = ParseInt(chunk); break;

                            case 6:     result.MessageGenerated = ParseDate(chunk); break;

                            case 7:     result.MessageGenerated = ParseTime(result.MessageGenerated, chunk); break;

                            case 8:     result.MessageLogged = ParseDate(chunk); break;

                            case 9:     result.MessageLogged = ParseTime(result.MessageLogged, chunk); break;

                            case 10:    if (result.MessageType == BaseStationMessageType.StatusChange)
                                {
                                    result.StatusCode = BaseStationMessageHelper.ConvertToBaseStationStatusCode(chunk);
                                }
                                else
                                {
                                    result.Callsign = chunk.Replace("@", "").Trim();
                                } break;

                            case 11:    result.Altitude = ParseInt(chunk); break;

                            case 12:    result.GroundSpeed = ParseFloat(chunk); break;

                            case 13:    result.Track = ParseFloat(chunk); break;

                            case 14:    result.Latitude = ParseDouble(chunk); break;

                            case 15:    result.Longitude = ParseDouble(chunk); break;

                            case 16:    result.VerticalRate = ParseInt(chunk); break;

                            case 17:    result.Squawk = ParseInt(chunk); if (result.Squawk == 0)
                                {
                                    result.Squawk = null;
                                }
                                break;

                            case 18:    result.SquawkHasChanged = ParseBool(chunk); break;

                            case 19:    result.Emergency = ParseBool(chunk); break;

                            case 20:    result.IdentActive = ParseBool(chunk); break;

                            case 21:    result.OnGround = ParseBool(chunk); break;
                            }
                        }
                    } catch (Exception ex) {
                        Debug.WriteLine(String.Format("BaseStationMessageTranslator.Translate caught exception: {0}", ex.ToString()));

                        // I would prefer to pass ex as the inner exception to this. However Microsoft's Application.ThreadException unhandled exception handler
                        // strips off all outer exceptions and only shows the bottom-most exception - i.e., in our case, the exception from a Parse method. This
                        // is not useful in isolation, we need to know what was being translated, the context in which the exception was thrown. So I have ended
                        // up with this, which is not very nice but shows enough information in the unhandled exception handler to allow diagnosis of the problem.
                        throw new BaseStationTranslatorException($"{ex.Message} while translating \"{chunk}\" (chunk {c}) in \"{text}\"");
                    }
                }

                result.IsMlat = isMlat;
            }

            return(result);
        }
 public void BaseStationMessageTranslator_Translate_Parses_Status_Codes_Correctly()
 {
     foreach (BaseStationStatusCode statusCode in Enum.GetValues(typeof(BaseStationStatusCode)))
     {
         if (statusCode == BaseStationStatusCode.None)
         {
             continue;
         }
         string             text    = String.Format("STA,1,5,2056,7404F2,11267,2008/11/28,23:48:18.611,2008/11/28,23:53:19.161,{0},,,,,,,,,,,", BaseStationMessageHelper.ConvertToString(statusCode));
         BaseStationMessage message = _Implementation.Translate(text, 123);
         Assert.AreEqual(statusCode, message.StatusCode, statusCode.ToString());
     }
 }