/// <summary> /// Called when [meter score changed]. /// </summary> /// <param name="meterScoreData">The meter score data.</param> private void OnScoreChanged(GameEvents.ScoreChanged e) { using (ReaderWriterLockMgr lockMgr = new ReaderWriterLockMgr(GameDataLog.Scores.Lock)) { lockMgr.EnterWriteLock(); GameDataLog.Scores.AddScoresRow( DateTime.Now, // Current datetime stamp e.SensorId, // Sensor ID ScoreKeeperService.GameNumber, // Game number ScoreKeeperService.RoundNumber, // Round number StopWatchService.DisplayTime, // Elapsed time ScoreKeeperService[e.SensorId].DisplayName, // Meter Name e.RequiredImpactLevel, // Required impact level e.ImpactLevel, // Actual impact level (int)(e.NewScore - e.OldScore), // Number of points e.NewScore ); } }
/// <summary> /// Writes the database to disk. /// </summary> private void WriteDatabaseToDisk() { if (GameDataLog.HasChanges()) { Logger.Log("Flushing dataset to disk", Category.Info, Priority.None); try { string fileName = Path.Combine(CreateDataDirectory(), GetDataSetFileName()); using (ReaderWriterLockMgr impactLockMgr = new ReaderWriterLockMgr(GameDataLog.Impacts.Lock)) using (ReaderWriterLockMgr scoreLockMgr = new ReaderWriterLockMgr(GameDataLog.Scores.Lock)) { impactLockMgr.EnterWriteLock(); scoreLockMgr.EnterWriteLock(); foreach (var row in GameDataLog.Impacts.Where(row => row.Timestamp.Date != DateTime.Today).ToList()) { GameDataLog.Impacts.RemoveImpactsRow(row); } foreach (var row in GameDataLog.Scores.Where(row => row.Timestamp.Date != DateTime.Today).ToList()) { GameDataLog.Scores.RemoveScoresRow(row); } GameDataLog.AcceptChanges(); GameDataLog.WriteXml(fileName, XmlWriteMode.WriteSchema); } } catch (IOException ex) { Logger.Log(ex.GetBaseException().ToString(), Category.Exception, Priority.High); EventAggregator.GetEvent <ApplicationEvents.NotifyUserEvent>().Publish(new ApplicationEvents.NotifyUserEvent() { Message = "Trying to write game data. " + ex.GetBaseException().Message, Buttons = System.Windows.MessageBoxButton.OK, Image = System.Windows.MessageBoxImage.Error }); } } else { Logger.Log("Skipping flushing of dataset (no changes)", Category.Info, Priority.None); } }
/// <summary> /// Called when [sensor impact]. /// </summary> /// <param name="sensorImpactData">The sensor impact data.</param> private void OnSensorHit(ReceiverEvents.SensorHit e) { if (StopWatchService.IsRunning) { using (ReaderWriterLockMgr lockMgr = new ReaderWriterLockMgr(GameDataLog.Impacts.Lock)) { lockMgr.EnterWriteLock(); GameDataLog.Impacts.AddImpactsRow( DateTime.Now, // Current datetime stamp e.SensorId, // Sensor ID ScoreKeeperService.GameNumber, // Game number ScoreKeeperService.RoundNumber, // Round number StopWatchService.DisplayTime, // Elapsed time ScoreKeeperService[e.SensorId].DisplayName, // Competitor Name e.OperationCode, // Data Source Type ScoreKeeperService[e.SensorId].RequiredImpactLevel, // Required impact level e.ImpactLevel, // Actual impact level e.Panel.ToString() // Sensor panel ); } this.DataWriterTimer.Start(); } }