public async Task <AlignedTripData> GetTripDataAligned(Guid deviceId, PrimitiveDataPoints dataPoints, DateTimeOffset?start = null, DateTimeOffset?end = null, string interval = "1m", CancellationToken cancellationToken = default(CancellationToken)) { var data = await GetTripData(deviceId, dataPoints, start, end, interval, cancellationToken); var aligned = new AlignedTripData() { DeviceId = deviceId, Start = start.Value, End = end.Value, PrimitiveDataPoints = dataPoints, AlignedDataPoints = new List <TripDataPoint>() }; if (dataPoints.HasFlag(PrimitiveDataPoints.Voltage)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.Voltage, PrimitiveDataPoints.Voltage); } if (dataPoints.HasFlag(PrimitiveDataPoints.CoolantTemp)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.CoolantTemp, PrimitiveDataPoints.CoolantTemp); } if (dataPoints.HasFlag(PrimitiveDataPoints.EngineLoad)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.EngineLoad, PrimitiveDataPoints.EngineLoad); } if (dataPoints.HasFlag(PrimitiveDataPoints.FuelLevel)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.FuelLevel, PrimitiveDataPoints.FuelLevel); } if (dataPoints.HasFlag(PrimitiveDataPoints.FuelRate)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.FuelRate, PrimitiveDataPoints.FuelRate); } if (dataPoints.HasFlag(PrimitiveDataPoints.IntakeTemp)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.IntakeTemp, PrimitiveDataPoints.IntakeTemp); } if (dataPoints.HasFlag(PrimitiveDataPoints.Position)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.Position, PrimitiveDataPoints.Position); } if (dataPoints.HasFlag(PrimitiveDataPoints.RpiTemperature)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.RpiTemperature, PrimitiveDataPoints.RpiTemperature); } if (dataPoints.HasFlag(PrimitiveDataPoints.Speed)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.Speed, PrimitiveDataPoints.Speed); } if (dataPoints.HasFlag(PrimitiveDataPoints.AccelerometerX)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.AccelerometerX, PrimitiveDataPoints.AccelerometerX); } if (dataPoints.HasFlag(PrimitiveDataPoints.AccelerometerY)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.AccelerometerY, PrimitiveDataPoints.AccelerometerY); } if (dataPoints.HasFlag(PrimitiveDataPoints.AccelerometerZ)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.AccelerometerZ, PrimitiveDataPoints.AccelerometerZ); } if (dataPoints.HasFlag(PrimitiveDataPoints.Altitude)) { aligned.AlignedDataPoints = AlignData(aligned.AlignedDataPoints, data.Altitude, PrimitiveDataPoints.Altitude); } return(aligned); }
private List <TripDataPoint> AlignData(List <TripDataPoint> first, IReadOnlyCollection <StorageDataResponse> second, PrimitiveDataPoints dataPoint) { if (first == null) { first = new List <TripDataPoint>(); } int threshold = 20; foreach (var newPoint in second) { var existing = (from f in first where Math.Abs((f.Timestamp - newPoint.Ts).TotalSeconds) < threshold select f)?.FirstOrDefault(); if (existing == null) { //datapoint isnt there yet, add it existing = new TripDataPoint() { Timestamp = newPoint.Ts }; first.Add(existing); } else { if (dataPoint == PrimitiveDataPoints.CoolantTemp) { existing.CoolantTemp = newPoint.Value; } if (dataPoint == PrimitiveDataPoints.EngineLoad) { existing.EngineLoad = newPoint.Value; } if (dataPoint == PrimitiveDataPoints.FuelLevel) { existing.FuelLevel = newPoint.Value; } if (dataPoint == PrimitiveDataPoints.FuelRate) { existing.FuelRate = newPoint.Value; } if (dataPoint == PrimitiveDataPoints.IntakeTemp) { existing.IntakeTemp = newPoint.Value; } if (dataPoint == PrimitiveDataPoints.Position) { existing.Position = newPoint.Location; } if (dataPoint == PrimitiveDataPoints.RpiTemperature) { existing.RpiTemperature = newPoint.Value; } if (dataPoint == PrimitiveDataPoints.Speed) { existing.Speed = newPoint.Value; } if (dataPoint == PrimitiveDataPoints.Voltage) { existing.Voltage = newPoint.Value; } if (dataPoint == PrimitiveDataPoints.AccelerometerX) { existing.AccelerometerX = newPoint.Value; } if (dataPoint == PrimitiveDataPoints.AccelerometerY) { existing.AccelerometerY = newPoint.Value; } if (dataPoint == PrimitiveDataPoints.AccelerometerZ) { existing.AccelerometerZ = newPoint.Value; } if (dataPoint == PrimitiveDataPoints.Altitude) { existing.Altitude = newPoint.Value; } } } first = PolyFill(first.OrderBy(t => t.Timestamp)); first = PolyFill(first.OrderByDescending(t => t.Timestamp)); return(first); }
public async Task <TripData> GetTripData(Guid deviceId, PrimitiveDataPoints dataPoints, DateTimeOffset?start = null, DateTimeOffset?end = null, string interval = "1m", CancellationToken cancellationToken = default(CancellationToken)) { if (start == null || start >= DateTimeOffset.UtcNow) { start = DateTimeOffset.UtcNow.AddDays(-1); } if (end == null || end >= DateTimeOffset.UtcNow) { end = DateTimeOffset.UtcNow; } var data = new TripData() { Start = start.Value, End = end.Value, DeviceId = deviceId, PrimitiveDataPoints = dataPoints }; if (dataPoints.HasFlag(PrimitiveDataPoints.Position)) { data.Position = await GetPositionData(deviceId, start, end, interval, cancellationToken); } if (dataPoints.HasFlag(PrimitiveDataPoints.CoolantTemp)) { data.CoolantTemp = await GetEngineCoolantTemperatureData(deviceId, start, end, interval, cancellationToken); } if (dataPoints.HasFlag(PrimitiveDataPoints.EngineLoad)) { data.EngineLoad = await GetEngineLoadLevelsData(deviceId, start, end, interval, cancellationToken); } if (dataPoints.HasFlag(PrimitiveDataPoints.FuelLevel)) { data.FuelLevel = await GetFuelLevelData(deviceId, start, end, interval, cancellationToken); } if (dataPoints.HasFlag(PrimitiveDataPoints.FuelRate)) { data.FuelRate = await GetFuelRateData(deviceId, start, end, interval, cancellationToken); } if (dataPoints.HasFlag(PrimitiveDataPoints.IntakeTemp)) { data.IntakeTemp = await GetIntakeTempData(deviceId, start, end, interval, cancellationToken); } if (dataPoints.HasFlag(PrimitiveDataPoints.RpiTemperature)) { data.RpiTemperature = await GetRpiTemperatureData(deviceId, start, end, interval, cancellationToken); } if (dataPoints.HasFlag(PrimitiveDataPoints.Speed)) { data.Speed = await GetSpeedData(deviceId, start, end, interval, cancellationToken); } if (dataPoints.HasFlag(PrimitiveDataPoints.Voltage)) { data.Voltage = await GetVoltageData(deviceId, start, end, interval, cancellationToken); } if (dataPoints.HasFlag(PrimitiveDataPoints.AccelerometerX)) { data.AccelerometerX = await GetAccelerometerXData(deviceId, start, end, interval, cancellationToken); } if (dataPoints.HasFlag(PrimitiveDataPoints.AccelerometerY)) { data.AccelerometerY = await GetAccelerometerYData(deviceId, start, end, interval, cancellationToken); } if (dataPoints.HasFlag(PrimitiveDataPoints.AccelerometerZ)) { data.AccelerometerZ = await GetAccelerometerZData(deviceId, start, end, interval, cancellationToken); } if (dataPoints.HasFlag(PrimitiveDataPoints.Altitude)) { data.Altitude = await GetAltitudeData(deviceId, start, end, interval, cancellationToken); } return(data); }