public static void StartRace(int tournamentID, int raceNum) { IRlmRepository repo = RepositoryManager.GetDefaultRepository(); lock (_lock) { Tournament tournament = repo.LoadTournament(tournamentID); Race race = tournament.RaceData.Where(r => r.RaceNumber == raceNum).Single(); tournament.CurrentRace = raceNum; foreach (LaneAssignment assignment in race.LaneAssignmentData) { assignment.ElapsedTime = 0; assignment.Points = 0; assignment.Position = 0; assignment.ScaleSpeed = 0.0; } race.State = RaceState.Racing; repo.SaveTournament(tournament); } //RacesUpdated?.Invoke(tournamentID, new RacesUpdatedEventArgs(GetRaces(tournamentID))); RaceUpdated?.Invoke(tournamentID, new RaceUpdatedEventArgs(GetCurrentRace(tournamentID))); //NextRacesUpdated?.Invoke(tournamentID, new NextRacesUpdatedEventArgs(GetNextRaces(tournamentID))); RaceMonitor.LaneResultAdded += RaceMonitor_LaneResultAdded; RaceMonitor.Monitor(TournamentManager.ComPort, TournamentManager.BaudRate, tournamentID, raceNum, TournamentManager.Simulate); }
public static void RaceMonitor_LaneResultAdded(LaneResultEventArgs e) { UpdateRaceTime(e.TournamentID, e.RaceNum, e.LaneNum, e.Time); //RacesUpdated?.Invoke(e.TournamentID, new RacesUpdatedEventArgs(GetRaces(e.TournamentID))); RaceUpdated?.Invoke(e.TournamentID, new RaceUpdatedEventArgs(GetCurrentRace(e.TournamentID))); StandingsUpdated?.Invoke(e.TournamentID, new StandingsUpdatedEventArgs(GetStandings(e.TournamentID))); }
public static void StopRace(int tournamentID, int raceNum) { RaceMonitor.Stop(); RaceMonitor.LaneResultAdded -= RaceMonitor_LaneResultAdded; IRlmRepository repo = RepositoryManager.GetDefaultRepository(); lock (_lock) { Tournament tournament = repo.LoadTournament(tournamentID); Race race = tournament.RaceData.Where(r => r.RaceNumber == raceNum).Single(); tournament.CurrentRace = raceNum; race.State = RaceState.Done; repo.SaveTournament(tournament); } //RacesUpdated?.Invoke(tournamentID, new RacesUpdatedEventArgs(GetRaces(tournamentID))); RaceUpdated?.Invoke(tournamentID, new RaceUpdatedEventArgs(GetCurrentRace(tournamentID))); //NextRacesUpdated?.Invoke(tournamentID, new NextRacesUpdatedEventArgs(GetNextRaces(tournamentID))); }
public static IRace UpdateRace(int tournamentID, IRace race) { IRlmRepository repo = RepositoryManager.GetDefaultRepository(); Race updatedRace = null; lock (_lock) { Tournament tournament = repo.LoadTournament(tournamentID); updatedRace = tournament.RaceData.Where(r => r.RaceNumber == race.RaceNumber).Single(); if (updatedRace.LaneAssignmentData.Count != race.LaneAssignments.Count()) { throw new ArgumentException("Races do not have the same number of lane assignments"); } updatedRace.State = race.State; ILaneAssignment[] laneAssignments = race.LaneAssignments.ToArray(); for (int i = 0; i < updatedRace.LaneAssignmentData.Count; i++) { LaneAssignment to = updatedRace.LaneAssignmentData[i]; ILaneAssignment from = laneAssignments[i]; to.ElapsedTime = from.ElapsedTime; to.Points = from.Points; to.Position = from.Position; } repo.SaveTournament(tournament); } //RacesUpdated?.Invoke(tournamentID, new RacesUpdatedEventArgs(GetRaces(tournamentID))); RaceUpdated?.Invoke(tournamentID, new RaceUpdatedEventArgs(updatedRace)); //NextRacesUpdated?.Invoke(tournamentID, new NextRacesUpdatedEventArgs(GetNextRaces(tournamentID))); StandingsUpdated?.Invoke(tournamentID, new StandingsUpdatedEventArgs(GetStandings(tournamentID))); return(updatedRace); }