public async Task <int?> GetPossiblePositionForCurrentSkier(int raceId) { var current = await GetCurrentSkier(raceId); if (current == null) { return(null); } var lastTimeData = (await _timeDataDao.GetTimeDataForStartList(current.SkierId, current.RaceId)) .OrderByDescending(td => td?.Sensor?.SensorNumber) .First(); var diff = await _statService.GetDifferenceToLeader(lastTimeData); if (diff == null) { return(1); } var ranking = await _statService.GetFinishedSkierRanking(raceId); return(1 + ranking ?.TakeWhile(raceRanking => (raceRanking?.TimeToLeader ?? 0) < diff.Value.TotalMilliseconds) .Count()); }
private async Task <bool> ValidateSensorValue(int sensorNumber, DateTime dateTime) { //minmax check if (sensorNumber < 0 || sensorNumber > _maxSensorNr) { return(false); } var currentSkier = await _activeRaceService.GetCurrentSkier(RaceId); //no current skier if (currentSkier == null) { return(false); } var startTime = await _timeDataDao.GetStartTimeForStartList(currentSkier.SkierId, RaceId); //no startTime if (startTime == null && sensorNumber != 0) { return(false); } var average = await _timeDataDao.GetAverageTimeForSensor(RaceId, sensorNumber) ?? _sensorConfig.SensorAssumptions[sensorNumber]; var timeDataList = (await _timeDataDao .GetTimeDataForStartList(currentSkier.SkierId, currentSkier.RaceId)).ToList(); return(ValidSensorSeries(timeDataList, sensorNumber) switch { SensorSeriesResult.NeedsAverageValidation => IsTimeInBoundAverage( (int)(dateTime - (startTime ?? dateTime)).TotalMilliseconds, average), SensorSeriesResult.SensorAlreadyHasValue => false, SensorSeriesResult.SensorAfterwardsSet => false, _ => false });
public Task <IEnumerable <TimeData> > GetTimeDataForStartList(int raceId, int skierId) => _timeDataDao.GetTimeDataForStartList(skierId, raceId);