private StatisticRecord GetRecordForPiece(DataPiece piece) { using (var db = DatabaseUtility.OpenConnection()) { var m = db.GetMapping <StatisticRecord>(); var existingRecord = (StatisticRecord)db.FindWithQuery( m, $"SELECT * FROM {m.TableName} WHERE {nameof(StatisticRecord.TrackId)} = ?", piece.TrackId ); if (existingRecord != null) { Log.Debug("Found existing track in DB, resuming data collection"); return(existingRecord); } else { Log.Debug("Creating new track record in DB"); var r = new StatisticRecord { TrackId = piece.TrackId, Start = piece.StartTimestamp, End = piece.EndTimestamp, LocationStartLatitude = piece.Latitude, LocationStartLongitude = piece.Longitude, LocationEndLatitude = piece.Latitude, LocationEndLongitude = piece.Longitude, Vehicle = piece.Vehicle, Anchorage = piece.Anchorage, NumberOfPeople = piece.NumberOfPeople }; db.Insert(r); return(r); } } }
/// <summary> /// Collects a new piece of data. /// </summary> public void Collect(DataPiece piece) { if (_previous != null) { if (_previous.TrackId == piece.TrackId) { _ppeAccumulator += piece.Ppe; _ppeCount += 1; _ppeBins[PpeMapper.GetBinIndex(piece.Ppe)] += 1; if (piece.Ppe > _ppeMax) { _ppeMax = piece.Ppe; } if (piece.StartTimestamp < _tsStart) { _tsStart = piece.StartTimestamp; } if (piece.EndTimestamp > _tsEnd) { _tsEnd = piece.EndTimestamp; } _elapsed += (piece.EndTimestamp - piece.StartTimestamp); var traveledDistance = GeoHelper.DistanceBetweenPoints( _previous.Latitude, _previous.Longitude, piece.Latitude, piece.Longitude ) * DistanceFactor; _distance += traveledDistance; Log.Debug("Traveled {0:F3}km, count {1} {2:t}-{3:t}", traveledDistance, _ppeCount, _tsStart, _tsEnd); } else { Log.Warning(new ArgumentException(nameof(piece.TrackId)), "Different track ID seen while collecting statistics"); CompleteSession(); } } // Dump data // Generates approximately 42 bytes per measurement (~147 KB/hour) if (_dumpWriter == null) { var dumpStream = FileOperations.AppendFile(FileNaming.GetDataTrackFilepath(piece.TrackId)); _dumpWriter = new StreamWriter(dumpStream); } _dumpWriter.WriteLine( string.Format(CultureInfo.InvariantCulture, "{0},{1:F5},{2:F5},{3:F2}", piece.StartTimestamp.Ticks, piece.Latitude, piece.Longitude, piece.Ppe) ); _previous = piece; Log.Debug("Data piece collected"); }
public void Reset() { _previous = null; _record = null; _ppeAccumulator = 0.0; _ppeCount = 0; if (_dumpWriter != null) { _dumpWriter.Dispose(); _dumpWriter = null; } }
private void HandleEngineComputationCompleted(object sender, EngineComputationEventArgs e) { _sessionInfo.NewMeasurement(e.Result.Ppe); if (_isRecording) { if (_lastMeasurementCollection.HasValue) { if (DateTime.UtcNow - _lastMeasurementCollection.Value > MaximumPause) { Log.Debug("Exceeded maximum interval between recording, restarting"); Stop(); Start(); Log.Event("Recorder.IntervalExceeded"); } } var dataPiece = new DataPiece { TrackId = _sessionInfo.TrackId, StartTimestamp = new DateTime(e.Result.FirstTimestamp, DateTimeKind.Utc), EndTimestamp = new DateTime(e.Result.LastTimestamp, DateTimeKind.Utc), Ppe = e.Result.Ppe, PpeX = e.Result.PpeX, PpeY = e.Result.PpeY, PpeZ = e.Result.PpeZ, Latitude = e.Result.Latitude, Longitude = e.Result.Longitude, Bearing = e.Result.Bearing, Accuracy = e.Result.Accuracy, Vehicle = _sessionInfo.Vehicle, Anchorage = _sessionInfo.Anchorage, NumberOfPeople = _sessionInfo.NumberOfPeople }; if (!Settings.OfflineMode) { _statsCollector.Collect(dataPiece); } OnDataPointRecorded(dataPiece, e.Result); _lastMeasurementCollection = DateTime.UtcNow; } }
public void Reset() { _previous = null; _tsStart = DateTime.MaxValue; _tsEnd = DateTime.MinValue; _ppeMax = double.MinValue; _ppeAccumulator = 0.0; _ppeCount = 0; _ppeBins = new int[PpeMapper.BinCount]; _distance = 0; _elapsed = TimeSpan.Zero; if (_dumpWriter != null) { _dumpWriter.Dispose(); _dumpWriter = null; } }
/// <summary> /// Collects a new piece of data. /// </summary> public void Collect(DataPiece piece) { _data.Enqueue(piece); if (_data.Count >= SerializationBatchSize) { Flush(); } //Remove elements until compliant with maximum size if (_data.Count >= DropSize) { Log.Warning(new DataLossException(), "Dropping data piece because collector is full"); while (_data.Count >= DropSize) { _data.Dequeue(); } } }
public DataPointRecordedEventArgs(DataPiece data, SessionInfo session, Result result) { Data = data; Session = session; ComputationResult = result; }
protected virtual void OnDataPointRecorded(DataPiece data, Result result) { DataPointRecorded?.Invoke(this, new DataPointRecordedEventArgs(data, _sessionInfo, result)); }
/// <summary> /// Collects a new piece of data. /// </summary> public void Collect(DataPiece piece) { if (_record != null && (_record.TrackId != piece.TrackId)) { Log.Warning(new ArgumentException(nameof(piece.TrackId)), "Different track ID seen while collecting statistics"); CompleteSession(); } if (_record == null) { _record = GetRecordForPiece(piece); } // Record set, update _ppeAccumulator += piece.Ppe; _ppeCount += 1; _record.Bins[PpeMapper.GetBinIndex(piece.Ppe)] += 1; if (piece.Ppe > _record.MaxPpe) { _record.MaxPpe = piece.Ppe; } _record.AvgPpe = _ppeAccumulator / _ppeCount; _record.DataPieceCount = (int)_ppeCount; _record.End = piece.EndTimestamp; _record.ElapsedTime += (piece.EndTimestamp - piece.StartTimestamp); _record.LocationEndLatitude = piece.Latitude; _record.LocationEndLongitude = piece.Longitude; if (_previous != null) { var traveledDistance = GeoHelper.DistanceBetweenPoints( _previous.Latitude, _previous.Longitude, piece.Latitude, piece.Longitude ) * DistanceFactor; _record.DistanceTraveled += traveledDistance; Log.Debug("Traveled {0:F3}km, count {1} {2:t}-{3:t}", traveledDistance, _ppeCount, _record.Start, _record.End); } _previous = piece; // Flush every few minutes if (_ppeCount > 0 && (_ppeCount % FlushIntervalSize == 0)) { Flush(); } // Dump data // Generates approximately 89 bytes per measurement (~313 KB/hour) if (_dumpWriter == null) { var outputFilepath = FileNaming.GetDataTrackFilepath(piece.TrackId); Log.Debug("Appending to file {0}", outputFilepath); var dumpStream = FileOperations.AppendFile(outputFilepath); _dumpWriter = new StreamWriter(dumpStream); _dumpWriter.WriteLine("# SRS Track {0:N} {1:u}", piece.TrackId, DateTime.Now); _dumpWriter.WriteLine("# Start,End,Lat,Lng,PPE,PPEx,PPEy,PPEz,Speed,Bearing,Accuracy"); } _dumpWriter.WriteLine( string.Format(CultureInfo.InvariantCulture, "{0},{1},{2:F5},{3:F5},{4:F3},{5:F2},{6:F2},{7:F2},{8:F1},{9:D},{10:D}", piece.StartTimestamp.Ticks, piece.EndTimestamp.Ticks, piece.Latitude, piece.Longitude, piece.Ppe, piece.PpeX, piece.PpeY, piece.PpeZ, piece.Speed, (int)piece.Bearing, piece.Accuracy ) ); Log.Debug("Data piece collected"); }