This repository has been archived on 2022-11-03. You can view files and clone it, but cannot push or open issues or pull requests.
DevOpsOpenHack/support/simulator/DeviceSim/Controllers/EFTripController.cs
2022-11-03 16:41:13 -04:00

253 lines
8.7 KiB
C#

using DeviceSim.DataObjects.Models;
using DeviceSim.Helpers;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using System.Threading.Tasks;
namespace DeviceSim.Controllers
{
public class EFTripController : BaseTripController
{
#region Variables
private Trips CurrentTrip;
//private mydrivingDBContext ctx;
//private List<TripPointSource> tripInfo;
//private List<Poisource> tripPOIsource;
#endregion
#region Constructor
//Create Trips from Data in the Database
public EFTripController(DBConnectionInfo dBConnectionInfo):base(dBConnectionInfo)
{
}
#endregion
#region Public Methods
public async Task CreateTrip()
{
//1 - Initialize Trip
CurrentTrip = new Trips()
{
RecordedTimeStamp = DateTime.UtcNow,
Name = $"Trip {DateTime.Now}",
Id = Guid.NewGuid().ToString(),
UserId = "Hacker 1"
};
CreateTripPoints();
//TODO : Do proper Distance Calculation and Add a method to determine Rating
CurrentTrip.EndTimeStamp = CurrentTrip.TripPoints.Last<TripPoints>().RecordedTimeStamp;
CurrentTrip.Rating = 90;
//TODO : DO BingMaps Call to determine distance
CurrentTrip.Distance = 5.95;
//Get Trip POIs and Update Trip Summary Information
CreateTripPois();
//Update Driver Profile with Trip Data
UpdateUserProfile();
//Add trips to DB Instance
await Ctx.Trips.AddAsync(CurrentTrip);
}
public async Task<bool> SaveChangesAsync()
{
try
{
await Ctx.SaveChangesAsync();
Ctx.Dispose();
return true;
}
catch (Exception)
{
return false;
}
}
#endregion
#region Private Methods
//private void GetSampleTrip()
//{
// Random r = new Random();
// //Get Sample Trip Names
// List<string> tripNames = ctx.TripPointSource.Select(p => p.Name).Distinct().ToList();
// //Choose Random Trip
// var tName = tripNames.ElementAt(r.Next(0, tripNames.Count));
// //Get Source TripPoints for Random Trip
// tripInfo = ctx.TripPointSource.Where(p => p.Name == tName).ToList();
// //Get Source POIs for Random Trip
// tripPOIsource = ctx.Poisource.Where(p => p.TripId == (tripInfo.FirstOrDefault().Name)).ToList();
// //Console.WriteLine($"Sample Trip Selected: {tName}");
//}
private void CreateTripPois()
{
List<Pois> poiList = Ctx.Pois.Where(p => p.TripId == CurrentTrip.Id).ToList<Pois>();
//Generate POIs from Source
foreach (var sPOI in TripPOIsource)
{
poiList.Add(new Pois
{
Id = Convert.ToString(Guid.NewGuid()), //New Guid
TripId = CurrentTrip.Id, //Current Trips Id
Latitude = sPOI.Latitude,
Longitude = sPOI.Longitude,
Poitype = sPOI.Poitype,
RecordedTimeStamp = DateTime.Now.ToLongTimeString()
});
}
//Add POI's to Database Context
Ctx.Pois.AddRangeAsync(poiList);
CurrentTrip.HardStops = poiList.Where(p => p.Poitype == 2).Count();
CurrentTrip.HardAccelerations = poiList.Where(p => p.Poitype == 1).Count();
}
private void UpdateUserProfile()
{
try
{
UserProfiles up = Ctx.UserProfiles
.Where(user => user.UserId == CurrentTrip.UserId)
.SingleOrDefault();
up.TotalTrips++;
up.TotalDistance += CurrentTrip.Distance;
up.HardStops += CurrentTrip.HardStops;
up.HardAccelerations += CurrentTrip.HardAccelerations;
}
catch (Exception ex)
{
Console.WriteLine($"Unable to Update User Profile. Ensure that the Trip UserProfile Matches with records in the database for Hacker 1, for more information see: {ex.Message}.");
}
}
private void CreateTripPoints()
{
try
{
foreach (var tps in TripPointSourceInfo)
{
TripPoints _tripPoint = new TripPoints()
{
TripId = CurrentTrip.Id,
Id = Guid.NewGuid().ToString(),
Latitude = Convert.ToDouble(tps.Lat),
Longitude = Convert.ToDouble(tps.Lon),
Speed = Convert.ToDouble(tps.Speed),
RecordedTimeStamp = Convert.ToDateTime(tps.Recordedtimestamp),
Sequence = Convert.ToInt32(tps.Sequence),
Rpm = Convert.ToDouble(tps.Enginerpm),
ShortTermFuelBank = Convert.ToDouble(tps.Shorttermfuelbank),
LongTermFuelBank = Convert.ToDouble(tps.Longtermfuelbank),
ThrottlePosition = Convert.ToDouble(tps.Throttleposition),
RelativeThrottlePosition = Convert.ToDouble(tps.Relativethrottleposition),
Runtime = Convert.ToDouble(tps.Runtime),
DistanceWithMalfunctionLight = Convert.ToDouble(tps.Distancewithmil),
EngineLoad = Convert.ToDouble(tps.Engineload),
MassFlowRate = Convert.ToDouble(tps.Mafflowrate),
EngineFuelRate = Convert.ToDouble(tps.Enginefuelrate)
};
CurrentTrip.TripPoints.Add(_tripPoint);
}
//Update Time Stamps to current date and times before sending to IOT Hub
UpdateTripPointTimeStamps(CurrentTrip);
}
catch (Exception ex)
{
Console.WriteLine($"Could not create/update Trip Points. For more detail see: {ex.Message}.");
}
}
private void UpdateTripPointTimeStamps(Trips trip)
{
try
{
//Sort Trip Points By Sequence Number
CurrentTrip.TripPoints = CurrentTrip.TripPoints.OrderBy(p => p.Sequence).ToList();
List<timeInfo> timeToAdd = new List<timeInfo>();
System.TimeSpan tDiff;
//Create a Variable to Track the Time Range as it Changes
System.DateTime runningTime = CurrentTrip.RecordedTimeStamp;
//Calculate the Difference in time between Each Sequence Item
for (int currentTripPoint = (CurrentTrip.TripPoints.Count - 1); currentTripPoint > -1; currentTripPoint--)
{
if (currentTripPoint > 0)
{
tDiff = CurrentTrip.TripPoints.ElementAt(currentTripPoint).RecordedTimeStamp
- CurrentTrip.TripPoints.ElementAt(currentTripPoint - 1).RecordedTimeStamp;
timeToAdd.Add(new timeInfo() { evtSeq = CurrentTrip.TripPoints.ElementAt(currentTripPoint).Sequence, tSpan = tDiff });
}
}
//Sort List in order to Add time to Trip Points
timeToAdd = timeToAdd.OrderBy(s => s.evtSeq).ToList();
//Update Trip Points
for (int currentTripPoint = 1, timeToAddCollIdx = 0; currentTripPoint < CurrentTrip.TripPoints.Count; currentTripPoint++, timeToAddCollIdx++)
{
runningTime = runningTime.Add(timeToAdd[timeToAddCollIdx].tSpan);
CurrentTrip.TripPoints.ElementAt(currentTripPoint).RecordedTimeStamp = runningTime;
}
// Update Initial Trip Point
CurrentTrip.TripPoints.ElementAt(0).RecordedTimeStamp = CurrentTrip.RecordedTimeStamp;
}
catch (Exception ex)
{
Console.WriteLine($"Could not update Trip Time Stamps from Samples. for more info see:{ex.Message}.");
}
}
#endregion
}
public struct timeInfo
{
public int evtSeq;
public TimeSpan tSpan;
}
}