1
0
Fork 0
mirror of https://github.com/hawkeye-stan/msfs-popout-panel-manager.git synced 2024-11-25 07:10:10 +00:00
msfs-popout-panel-manager/SimconnectAgent/TouchPanel/FlightPlanProvider.cs
2022-08-18 00:12:53 -04:00

129 lines
4.7 KiB
C#

using CoordinateSharp;
using IniParser;
using IniParser.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
namespace MSFSPopoutPanelManager.SimConnectAgent.TouchPanel
{
public class FlightPlanProvider
{
public static string ParseCustomFLT(string filePath)
{
var wayPoints = new List<ATCWaypoint>();
try
{
var parser = new FileIniDataParser();
var data = parser.ReadFile(filePath);
var isActiveFlightPlan = Convert.ToBoolean(data["ATC_Aircraft.0"]["ActiveFlightPlan"]);
var isRequestedFlightPlan = Convert.ToBoolean(data["ATC_Aircraft.0"]["RequestedFlightPlan"]);
PropertyCollection flightPlan;
// If FLT file has both requested and active flight plan set to true, requested flight plan takes precedence
if (isRequestedFlightPlan)
{
flightPlan = data["ATC_RequestedFlightPlan.0"];
}
else if (isActiveFlightPlan)
{
flightPlan = data["ATC_ActiveFlightPlan.0"];
}
else
{
return JsonConvert.SerializeObject(wayPoints);
}
if (flightPlan != null)
{
int i = 0;
Coordinate c;
while (true)
{
var waypointData = flightPlan["waypoint." + i];
if (waypointData == null)
break;
var waypointArr = waypointData.Split(",");
var waypoint = new ATCWaypoint();
waypoint.index = i + 1;
waypoint.type = waypointArr[4].Trim();
waypoint.description = waypointArr[3].Trim();
// exclude unnecessary user waypoints
if (!(waypoint.type == "V" || (waypoint.type == "U" && (waypoint.description == "TIMECLIMB" || waypoint.description == "TIMECRUIS" || waypoint.description == "TIMEDSCNT" || waypoint.description == "TIMEAPPROACH" || waypoint.description == "TIMEVERT"))))
{
waypoint.id = waypoint.type == "U" ? waypoint.description : waypointArr[1].Trim();
// parse "+003000.00" - 3000ft
var alt = Convert.ToInt32(waypointArr[17].Trim());
waypoint.altitude = alt == 0 ? null : alt;
var spd = Convert.ToInt32(waypointArr[16].Trim());
waypoint.maxSpeed = spd == 0 ? null : spd;
Coordinate.TryParse(waypointArr[5].Trim() + " " + waypointArr[6].Trim(), out c);
waypoint.latLong = new double[] { c.Latitude.DecimalDegree, c.Longitude.DecimalDegree };
//waypoint.departureProcedure = String.IsNullOrEmpty(waypointArr[9].Trim()) ? null : waypointArr[9].Trim();
//waypoint.arrivalProcedure = String.IsNullOrEmpty(waypointArr[10].Trim()) ? null : waypointArr[10].Trim();
//waypoint.approachType = String.IsNullOrEmpty(waypointArr[11].Trim()) ? null : waypointArr[11].Trim();
//waypoint.approachRunway = String.IsNullOrEmpty(waypointArr[12].Trim()) ? null : waypointArr[12].Trim();
wayPoints.Add(waypoint);
}
i++;
}
}
return JsonConvert.SerializeObject(new FlightPlan() { waypoints = wayPoints, activeLegIndex = 0 });
}
catch (Exception)
{
return JsonConvert.SerializeObject(wayPoints);
}
}
public class FlightPlan
{
public int activeLegIndex { get; set; }
public List<ATCWaypoint> waypoints { get; set; }
public int dtk { get; set; }
}
public class ATCWaypoint
{
public string id { get; set; }
public string description { get; set; }
public int index { get; set; }
[JsonProperty("type")]
public string type { get; set; }
public double[] latLong { get; set; }
public double[] startLatLong { get; set; }
public int? altitude { get; set; }
public int? maxSpeed { get; set; }
public double? distance { get; set; }
public int? course { get; set; }
public bool isActiveLeg { get; set; }
}
}
}