private Message TranslateSetSectorTimeValue(SetGridColumnValueMessage message, int sectorNumber)
{
var driver = GetDriver(message);
if(message.Value.OrdinalEquals("OUT"))
{
return CreateStatusMessageIfChanged(driver, DriverStatus.Out);
}
if(message.Value.OrdinalEquals("STOP"))
{
return CreateStatusMessageIfChanged(driver, DriverStatus.Stopped);
}
if(driver.IsExpectingPitTimes)
{
return TranslateSetPitTimeValue(message, sectorNumber);
}
if(!driver.IsOnTrack)
{
return null;
}
var newTime = LiveData.ParseTime(message.Value);
var newTimeType = LiveData.ToPostedTimeType(message.Colour);
// As of China-2010 the feed sends value updates to previous columns with completely different
// times and types. We can detect this when we receive an update for the previously completed
// sector. If the sector number is not the one previously completed we process the message
// normally.
if(driver.IsPreviousSectorNumber(sectorNumber))
{
if(driver.GetLastSector(sectorNumber) == null)
{
Log.WarnFormat("received value update to a previous sector but we have no" +
" previous sector times for the driver, cannot translate this message: {0}",
message);
return null;
}
return new ReplaceDriverSectorTimeMessage(driver.Id, sectorNumber,
new PostedTime(newTime, newTimeType, driver.GetLastSector(sectorNumber).LapNumber));
}
return TranslateSetDriverSectorTimeMessage(
new SetDriverSectorTimeMessage(driver.Id, sectorNumber,
new PostedTime(newTime, newTimeType, driver.LapNumber)));
}