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); }
private Message ReadSetSessionStatusMessage(LiveMessageHeader header) { ReadAndDecryptBytes(header.DataLength); return new SetSessionStatusMessage(LiveData.ToSessionStatus(DecodeLatin1(header.DataLength))); }
private Message ReadSetRemainingSessionTimeMessage(LiveMessageHeader header) { ReadAndDecryptBytes(header.DataLength); var remaining = LiveData.ParseTime(DecodeLatin1(header.DataLength)); return new CompositeMessage(StopSessionTimeCountdownMessage.Instance, new SetRemainingSessionTimeMessage(remaining)); }
private Message ReadSetMinRequiredQuallyTimeMessage(LiveMessageHeader header) { if(header.DataLength == 0) { return Message.Empty; } ReadAndDecryptBytes(header.DataLength); return new SetMinRequiredQuallyTimeMessage(LiveData.ParseTime(DecodeLatin1(header.DataLength))); }
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); }
private static Message ReadSetStreamValidityMessage(LiveMessageHeader header) { return new SetStreamValidityMessage(header.Colour != 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); } }
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()); }
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); }
private Message ReadSetCopyrightMessage(LiveMessageHeader header) { ReadBytes(header.Value); return new SetCopyrightMessage(DecodeUtf8(header.Value)); }
private Message ReadHistoricalPositionMessage(LiveMessageHeader header) { // We ignore historical position updates as it should be computed by a model. ReadAndDecryptBytes(header.Value); return Message.Empty; }
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); }
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); }
private Message ReadAddCommentaryMessage(LiveMessageHeader header) { ReadAndDecryptBytes(header.Value); return new AddCommentaryMessage(DecodeUtf8(2, header.Value - 2)); }
private Message ReadSetSessionTypeMessage(LiveMessageHeader header) { ReadBytes(header.DataLength); return new SetSessionTypeMessage(LiveData.ToSessionType(header.Colour), DecodeLatin1(1, header.DataLength - 1)); }
private Message ReadSetSystemMessageMessage(LiveMessageHeader header) { ReadAndDecryptBytes(header.Value); return new SetSystemMessageMessage(DecodeUtf8(header.Value)); }
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)); }
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; }
private Message ReadSetGridColumnColourMessage(LiveMessageHeader header) { return new SetGridColumnColourMessage( header.DriverId, LiveData.ToGridColumn(header.MessageType, SessionType), LiveData.ToGridColumnColour(header.Colour)); }
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); }
private static Message ReadRefrehRateMessage(LiveMessageHeader header) { return new SetPingIntervalMessage(new TimeSpan(0, 0, header.Value)); }