コード例 #1
0
        public void can_determine_if_the_header_is_a_system_message()
        {
            var header = new LiveMessageHeader();

            header.DriverId = 0;
            Assert.True(header.IsSystemMessage);
            Assert.False(header.IsDriverMessage);
        }
コード例 #2
0
 private Message ReadSetSessionStatusMessage(LiveMessageHeader header)
 {
     ReadAndDecryptBytes(header.DataLength);
     return new SetSessionStatusMessage(LiveData.ToSessionStatus(DecodeLatin1(header.DataLength)));
 }
コード例 #3
0
        private Message ReadSetRemainingSessionTimeMessage(LiveMessageHeader header)
        {
            ReadAndDecryptBytes(header.DataLength);

            var remaining = LiveData.ParseTime(DecodeLatin1(header.DataLength));

            return new CompositeMessage(StopSessionTimeCountdownMessage.Instance,
                new SetRemainingSessionTimeMessage(remaining));
        }
コード例 #4
0
 private Message ReadSetMinRequiredQuallyTimeMessage(LiveMessageHeader header)
 {
     if(header.DataLength == 0)
     {
         return Message.Empty;
     }
     ReadAndDecryptBytes(header.DataLength);
     return new SetMinRequiredQuallyTimeMessage(LiveData.ParseTime(DecodeLatin1(header.DataLength)));
 }
コード例 #5
0
 private Message ReadSetKeyframeMessage(LiveMessageHeader header)
 {
     if(header.DataLength != 2)
     {
         Log.ErrorFormat("invalid keyframe data length: {0}", header.DataLength);
         throw Guard.MessageReader_InvalidMessage();
     }
     ReadBytes(header.DataLength);
     return new SetKeyframeMessage(Buffer[1] << 8 & 0xFF00 | Buffer[0] & 0xFF);
 }
コード例 #6
0
 private static Message ReadSetStreamValidityMessage(LiveMessageHeader header)
 {
     return new SetStreamValidityMessage(header.Colour != 0);
 }
コード例 #7
0
        private Message ReadWeatherMessage(LiveMessageHeader header)
        {
            ReadAndDecryptBytes(header.DataLength);

            var s = DecodeLatin1(header.DataLength);

            switch(header.Colour)
            {
                case 1:
                    return new SetTrackTemperatureMessage(LiveData.ParseDouble(s));
                case 2:
                    return new SetAirTemperatureMessage(LiveData.ParseDouble(s));
                case 3:
                    return new SetIsWetMessage(s[0] == '1');
                case 4:
                    return new SetWindSpeedMessage(LiveData.ParseDouble(s));
                case 5:
                    return new SetHumidityMessage(LiveData.ParseDouble(s));
                case 6:
                    return new SetAtmosphericPressureMessage(LiveData.ParseDouble(s));
                case 7:
                    return ReadSetWindAngleMessage(s);
                default:
                    Log.ErrorFormat("unsupported weather message: {0}", header);
                    throw Guard.LiveMessageReader_UnsupportedWeatherMessage(header);
            }
        }
コード例 #8
0
 private Message ReadSpeedCaptureMessage(LiveMessageHeader header)
 {
     ReadAndDecryptBytes(header.Value);
     var location = Buffer[0] - 1;
     if(location < 0 || location > 3)
     {
         // The fastest lap is also published as an apex speed but we ignore them as they
         // can easily be computed by a model.
         return Message.Empty;
     }
     var speeds = new List<KeyValuePair<string, int>>(6);
     foreach(Match match in Regex.Matches(DecodeLatin1(1, header.Value - 1), "([^\r]+)(?:\r)([^\r]+)(?:\r)?"))
     {
         speeds.Add(new KeyValuePair<string, int>(match.Groups[1].Value, LiveData.ParseInt32(match.Groups[2].Value)));
     }
     return new SpeedCaptureMessage((SpeedCaptureLocation)location, speeds.ToArray());
 }
コード例 #9
0
 private Message ReadSetDriverPositionMessage(LiveMessageHeader header)
 {
     if(header.Value == 0)
     {
         Log.DebugFormat("ignoring clear grid row: {0}", header);
         return Message.Empty;
     }
     return new SetDriverPositionMessage(header.DriverId, header.Value);
 }
コード例 #10
0
 private Message ReadSetCopyrightMessage(LiveMessageHeader header)
 {
     ReadBytes(header.Value);
     return new SetCopyrightMessage(DecodeUtf8(header.Value));
 }
コード例 #11
0
 private Message ReadHistoricalPositionMessage(LiveMessageHeader header)
 {
     // We ignore historical position updates as it should be computed by a model.
     ReadAndDecryptBytes(header.Value);
     return Message.Empty;
 }
コード例 #12
0
        private Message ReadGridColumnMessage(LiveMessageHeader header)
        {
            bool isSetClear = header.DataLength == 0;
            bool isSetValue = header.DataLength > 0 && header.DataLength < 15 && header.MessageType <= 13;
            bool isSetColour = !(isSetClear || isSetValue);

            if(isSetValue)
            {
                return ReadSetGridColumnValueMessage(header);
            }
            if(isSetColour)
            {
                return ReadSetGridColumnColourMessage(header);
            }
            return ReadClearGridColumnValueMessage(header);
        }
コード例 #13
0
 private Message ReadDriverMessage(LiveMessageHeader header)
 {
     if(header.MessageType == 0)
     {
         return ReadSetDriverPositionMessage(header);
     }
     if(header.MessageType <= 13)
     {
         return ReadGridColumnMessage(header);
     }
     if(header.MessageType == 15)
     {
         return ReadHistoricalPositionMessage(header);
     }
     Log.ErrorFormat("unsupported driver message: {0}", header);
     throw Guard.LiveMessageReader_UnsupportedDriverMessage(header);
 }
コード例 #14
0
 private Message ReadAddCommentaryMessage(LiveMessageHeader header)
 {
     ReadAndDecryptBytes(header.Value);
     return new AddCommentaryMessage(DecodeUtf8(2, header.Value - 2));
 }
コード例 #15
0
 private Message ReadSetSessionTypeMessage(LiveMessageHeader header)
 {
     ReadBytes(header.DataLength);
     return new SetSessionTypeMessage(LiveData.ToSessionType(header.Colour), DecodeLatin1(1, header.DataLength - 1));
 }
コード例 #16
0
 private Message ReadSetSystemMessageMessage(LiveMessageHeader header)
 {
     ReadAndDecryptBytes(header.Value);
     return new SetSystemMessageMessage(DecodeUtf8(header.Value));
 }
コード例 #17
0
        private Message ReadSetElapsedSessionTimeMessage(LiveMessageHeader header)
        {
            ReadAndDecryptBytes(2);

            int seconds = Buffer[1] << 8 & 0xFF00 | Buffer[0] & 0xFF | header.Value << 16 & 0xFF0000;

            return new SetElapsedSessionTimeMessage(TimeSpan.FromSeconds(seconds));
        }
コード例 #18
0
 private Message ReadSystemMessage(LiveMessageHeader header)
 {
     switch(header.MessageType)
     {
         case 1:
             return ReadSetSessionTypeMessage(header);
         case 2:
             return ReadSetKeyframeMessage(header);
         case 3:
             return ReadSetStreamValidityMessage(header);
         case 4:
             return ReadAddCommentaryMessage(header);
         case 5:
             return ReadRefrehRateMessage(header);
         case 6:
             return ReadSetSystemMessageMessage(header);
         case 7:
             return ReadSetElapsedSessionTimeMessage(header);
         case 9:
             if(header.DataLength >= 15)
             {
                 return StartSessionTimeCountdownMessage.Instance;
             }
             if(header.Colour > 0)
             {
                 return ReadWeatherMessage(header);
             }
             if(header.DataLength > 0)
             {
                 return ReadSetRemainingSessionTimeMessage(header);
             }
             break;
         case 10:
             return ReadSpeedCaptureMessage(header);
         case 11:
             if(header.Colour == 1)
             {
                 return ReadSetSessionStatusMessage(header);
             }
             if(header.Colour == 4)
             {
                 return ReadSetMinRequiredQuallyTimeMessage(header);
             }
             ReadAndDecryptBytes(header.DataLength);
             Log.DebugFormat("soft-fail on unsupported type 11 system message: {0}, {1}",
                 header, DecodeLatin1(header.DataLength));
             return Message.Empty;
         case 12:
             return ReadSetCopyrightMessage(header);
         default:
             Log.ErrorFormat("unsupported system message: {0}", header);
             throw Guard.LiveMessageReader_UnsupportedSystemMessage(header);
     }
     Log.WarnFormat("soft-fail on unsupported system message: {0}", header);
     return Message.Empty;
 }
コード例 #19
0
 private Message ReadSetGridColumnColourMessage(LiveMessageHeader header)
 {
     return new SetGridColumnColourMessage(
         header.DriverId,
         LiveData.ToGridColumn(header.MessageType, SessionType),
         LiveData.ToGridColumnColour(header.Colour));
 }
コード例 #20
0
        private Message ReadSetGridColumnValueMessage(LiveMessageHeader header)
        {
            ReadAndDecryptBytes(header.DataLength);

            var value = DecodeLatin1(header.DataLength);

            return new SetGridColumnValueMessage(
                header.DriverId,
                LiveData.ToGridColumn(header.MessageType, SessionType),
                LiveData.ToGridColumnColour(header.Colour),
                value);
        }
コード例 #21
0
 private static Message ReadRefrehRateMessage(LiveMessageHeader header)
 {
     return new SetPingIntervalMessage(new TimeSpan(0, 0, header.Value));
 }