public void LoadFlightReport(string debriefer, string loggerFile, bool noDisplay = false) { Trace.WriteLine("Loading " + loggerFile, "ENGINE"); Reset(); Report = FlightReport.Load(debriefer, loggerFile, Settings); if (Report.OriginalTrack.Length > 0) { if (!noDisplay) { Display(); } RaisePropertyChanged("Log"); RaisePropertyChanged("Report"); RaisePropertyChanged("Results"); RaisePropertyChanged("Penalties"); } else { Report = null; throw new InvalidOperationException("No valid points in track"); } }
//factory public static FlightReport Load(string debriefer, string filePath, FlightSettings settings) { FlightReport report = null; var ext = Path.GetExtension(filePath).ToLower(); if (ext == SerializedFileExtension) { //deserialize report report = ObjectSerializer <FlightReport> .Load(filePath, serializationFormat); report.Debriefer = debriefer; report.DoTrackCleanUp(); } else { var logFile = LoggerFile.Load(filePath, settings.UtcOffset, settings.AltitudeCorrectionsFileName); //check pilot id var pilotId = logFile.PilotId; if (pilotId == 0) { //try to get the pilot Id from filename //The file name must contain a P or p followed with pilot number (1 to 3 digits) //examples: f001_p021_l0.trk, Flight01P001.trk, 20120530AM_p01.trk, 0530AMP02_1.trk var pattern = @"P(\d{1,3})"; var input = Path.GetFileName(filePath); var matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase); if (matches.Count == 1) { pilotId = int.Parse(matches[0].Groups[1].Value); } if (pilotId == 0) { throw new Exception( "The pilot id is not present in the track log file and it could not be inferred from the file name.\n" + "The file name must contain a P or p followed with pilot number (1 to 3 digits)\n" + "examples: f001_p021_l0.trk, Flight01P001.trk, 20120530AM_p01.trk, 0530AMP02_1.trk" ); } } //Convert geographical coordinates to AX coordinates var tracklog = logFile.GetTrackLog(); var track = new AXPoint[tracklog.Length]; Parallel.For(0, track.Length, i => { track[i] = settings.FromGeoToAXPoint(tracklog[i], logFile.IsAltitudeBarometric); }); var markers = new ObservableCollection <AXWaypoint>(); foreach (var m in logFile.GetMarkers()) { markers.Add(settings.FromGeoToAXWaypoint(m, logFile.IsAltitudeBarometric)); } var declarations = new ObservableCollection <GoalDeclaration>(); foreach (var d in logFile.GetGoalDeclarations()) { declarations.Add(d); } //Make new report report = new FlightReport(settings) { Debriefer = debriefer, IsDirty = true, LogFile = logFile, SignatureStatus = logFile.SignatureStatus, pilotId = pilotId, //don't use PilotId on constructor! LoggerModel = logFile.LoggerModel, LoggerSerialNumber = logFile.LoggerSerialNumber, OriginalTrack = track, Markers = markers, DeclaredGoals = declarations, Notes = new ObservableCollection <string>() }; switch (logFile.SignatureStatus) { case SignatureStatus.NotSigned: report.Notes.Add("The log file is not signed"); break; case SignatureStatus.Genuine: report.Notes.Add("The log file has a valid signature"); break; case SignatureStatus.Counterfeit: report.Notes.Add("*** THE LOG FILE HAS AN INVALID SIGNATURE! ***"); break; } report.DoTrackCleanUp(); report.DetectTakeOffAndLanding(); } return(report); }