Пример #1
0
        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");
        }
Пример #3
0
        public void Reset()
        {
            _previous       = null;
            _record         = null;
            _ppeAccumulator = 0.0;
            _ppeCount       = 0;

            if (_dumpWriter != null)
            {
                _dumpWriter.Dispose();
                _dumpWriter = null;
            }
        }
Пример #4
0
        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;
            }
        }
Пример #6
0
        /// <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;
 }
Пример #8
0
 protected virtual void OnDataPointRecorded(DataPiece data, Result result)
 {
     DataPointRecorded?.Invoke(this, new DataPointRecordedEventArgs(data, _sessionInfo, result));
 }
Пример #9
0
        /// <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");
        }