/// <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();
     }
 }