kopia lustrzana https://github.com/dl2alf/AirScout
509 wiersze
16 KiB
C#
509 wiersze
16 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.ComponentModel;
|
|
using System.Globalization;
|
|
using System.Net;
|
|
using System.IO;
|
|
using SphericalEarth;
|
|
using AirScout.Database.Aircrafts;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace AirScout.Database.Core
|
|
{
|
|
public class PlaneInfo
|
|
{
|
|
public DateTime Time = DateTime.UtcNow;
|
|
public string Call = "";
|
|
public string Reg = "";
|
|
public string Hex = "";
|
|
public double Lat = 0;
|
|
public double Lon = 0;
|
|
public int Alt = 0;
|
|
public int Alt_m = 0;
|
|
public int Track = 0;
|
|
public int Speed = 0;
|
|
public int Squawk = 0;
|
|
public string Radar = "";
|
|
public string Type = "";
|
|
public string Manufacturer = "";
|
|
public string Model = "";
|
|
public string Category = "";
|
|
|
|
public LatLon.GPoint IntPoint = null;
|
|
public double IntQRB = double.MaxValue;
|
|
public double AltDiff = 0;
|
|
public int Potential = 0;
|
|
public double Eps1 = 0;
|
|
public double Eps2 = 0;
|
|
public double Squint = 0;
|
|
public double SignalStrength = double.MinValue;
|
|
|
|
|
|
public PlaneInfo()
|
|
{
|
|
Time = DateTime.UtcNow;
|
|
}
|
|
|
|
public PlaneInfo(DateTime time, string call, string reg, string hex, double lat, double lon, int track, int alt, int speed, int squawk, string radar, string type, string manufacturer, string model, string category)
|
|
{
|
|
Time = time.ToUniversalTime();
|
|
Call = call;
|
|
Reg = reg;
|
|
Hex = hex;
|
|
Lat = lat;
|
|
Lon = lon;
|
|
Track = track;
|
|
Alt = alt;
|
|
Alt_m = (int)((double)Alt / 3.28084);
|
|
Speed = speed;
|
|
Squawk = squawk;
|
|
Radar = radar;
|
|
Type = type;
|
|
Manufacturer = manufacturer;
|
|
Model = model;
|
|
Category = category;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return "PlaneInfo\n" +
|
|
"Hex: " + this.Hex + "\n" +
|
|
"Reg: " + this.Reg + "\n" +
|
|
"Call: " + this.Call + "\n" +
|
|
"Type: " + this.Type + "\n" +
|
|
"Lat: " + this.Lat.ToString("F8") + "\n" +
|
|
"Lon: " + this.Lon.ToString("F8") + "\n" +
|
|
"Alt_m: " + this.Alt_m.ToString() + "\n" +
|
|
"Speed: " + this.Speed.ToString();
|
|
}
|
|
}
|
|
public class PlaneInfoConverter
|
|
{
|
|
|
|
public PlaneInfoConverter()
|
|
{
|
|
}
|
|
|
|
private bool IsHex(string s)
|
|
{
|
|
bool b;
|
|
try
|
|
{
|
|
b = !s.ToCharArray().Any(c => !"0123456789abcdefABCDEF".Contains(c));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
b = false;
|
|
}
|
|
return b;
|
|
}
|
|
|
|
private bool IsInt(string s)
|
|
{
|
|
bool b;
|
|
try
|
|
{
|
|
b = !s.ToCharArray().Any(c => !"0123456789".Contains(c));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
b = false;
|
|
}
|
|
return b;
|
|
}
|
|
|
|
private bool IsDouble(string s)
|
|
{
|
|
bool b;
|
|
try
|
|
{
|
|
// double should contain only following chars
|
|
b = !s.ToCharArray().Any(c => !"+-.,E0123456789".Contains(c));
|
|
// double must contain a decimal separator
|
|
if (b)
|
|
{
|
|
b = s.Contains(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
b = false;
|
|
}
|
|
return b;
|
|
}
|
|
|
|
private bool IsOct(string s)
|
|
{
|
|
bool b;
|
|
try
|
|
{
|
|
b = !s.ToCharArray().Any(c => !"01234567".Contains(c));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
b = false;
|
|
}
|
|
return b;
|
|
}
|
|
|
|
|
|
public DateTime To_UTC(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).Trim();
|
|
// UTC must be a 10 character value
|
|
if (s.Length < 10)
|
|
return DateTime.MinValue;
|
|
// try to convert UNIX time first
|
|
if (IsInt(s))
|
|
{
|
|
try
|
|
{
|
|
// try to convert to UTC timestamp
|
|
long l = System.Convert.ToInt64(s);
|
|
DateTime timestamp = new System.DateTime(1970, 1, 1, 0, 0, 0, 0,DateTimeKind.Utc);
|
|
timestamp = timestamp.AddSeconds(l);
|
|
return timestamp;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
}
|
|
// check for Standard DateTime notation
|
|
try
|
|
{
|
|
// try to convert to UTC timestamp
|
|
DateTime timestamp;
|
|
if (DateTime.TryParse(s, out timestamp))
|
|
return timestamp;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return DateTime.MinValue;
|
|
}
|
|
|
|
public string To_Hex(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).ToUpper().Trim();
|
|
// Hex must be a 6 character value
|
|
if (s.Length != 6)
|
|
return null;
|
|
if (!IsHex(s))
|
|
return null;
|
|
try
|
|
{
|
|
// try to convert to Hex value
|
|
long hex = System.Convert.ToInt64(s, 16);
|
|
// check boundaries
|
|
if ((hex < 0) || (hex > 16777215))
|
|
return null;
|
|
return s;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public string To_Reg(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).ToUpper().Trim();
|
|
if (s.Length < AircraftRegistrationDirectory.Min_Length+1)
|
|
return null;
|
|
if (!s.Contains('-') && !s.StartsWith("N"))
|
|
return null;
|
|
try
|
|
{
|
|
// try to find the registration string in aircraft registration database
|
|
AircraftRegistrationDesignator reg = AircraftRegistrationDirectory.Find(s);
|
|
if (reg != null)
|
|
return s;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public string To_Flight(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).ToUpper().Trim();
|
|
if (s.Length < 3)
|
|
return null;
|
|
string iata = s.Substring(0, 2);
|
|
string flightnumber = s.Substring(2);
|
|
if (!IsInt(flightnumber))
|
|
return null;
|
|
try
|
|
{
|
|
// try to find the string in IATA airline database
|
|
AirlineDesignator airline = AirlineDirectory.FindByIATA(iata);
|
|
if (airline != null)
|
|
return s;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public string To_Type(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).ToUpper().Trim();
|
|
if (s.Length < AircraftTypeDirectory.Min_Length_ICAO)
|
|
return null;
|
|
try
|
|
{
|
|
// try to find the string in aircraft registration database
|
|
AircraftTypeDesignator type = AircraftTypeDirectory.FindByICAO(s);
|
|
if (type != null)
|
|
return s;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public string To_Radar(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).ToUpper().Trim();
|
|
if (s.Length < 3)
|
|
return null;
|
|
try
|
|
{
|
|
// Radars will have a letter in first char and "-" as second char
|
|
if (Char.IsLetter(s[0]) && (s[1] == '-'))
|
|
return s;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public string To_Route(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).ToUpper().Trim();
|
|
// Routes will have a "-" between two IATA airport codes
|
|
if (s.Length < 9)
|
|
return null;
|
|
int index = s.IndexOf('-');
|
|
if ((index < 3) || (index > s.Length-3))
|
|
return null;
|
|
string from = s.Substring(0, index - 1);
|
|
string to = s.Substring(index + 1);
|
|
try
|
|
{
|
|
if (AirportDirectory.FindByICAO(from) == null)
|
|
return null;
|
|
if (AirportDirectory.FindByICAO(to) == null)
|
|
return null;
|
|
return s;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public string To_Call(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).ToUpper().Trim();
|
|
// check length
|
|
if (s.Length < 4)
|
|
return null;
|
|
if (s.Contains('-'))
|
|
return null;
|
|
// check for numeric flight number
|
|
string icao = s.Substring(0, 3);
|
|
try
|
|
{
|
|
// try to find the string in aircraft registration database
|
|
AirlineDesignator airline = AirlineDirectory.FindByICAO(icao);
|
|
if ( airline != null)
|
|
return s;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public int To_Squawk(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).ToUpper().Trim();
|
|
// check length
|
|
if (s.Length != 4)
|
|
return int.MinValue;
|
|
if (!IsOct(s))
|
|
return int.MinValue;
|
|
try
|
|
{
|
|
// check for octal number
|
|
// try to convert to Hex value
|
|
long oct = System.Convert.ToInt64(s, 8);
|
|
// check boundaries
|
|
if ((oct >= 0) && (oct <= 4095))
|
|
return (int)oct;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return int.MinValue;
|
|
}
|
|
|
|
public double To_Lat(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).Trim();
|
|
if (s.Length < 3)
|
|
return double.MinValue;
|
|
// double Lon must contain a decimal separator
|
|
if (s.IndexOf(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) < 0)
|
|
return double.MinValue;
|
|
try
|
|
{
|
|
// try to convert to double
|
|
double d = System.Convert.ToDouble(s);
|
|
// check bounds
|
|
if ((d >= -90.0) && (d <= 90.0))
|
|
return d;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return double.MinValue;
|
|
}
|
|
|
|
|
|
public double To_Lon(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).Trim();
|
|
if (s.Length < 3)
|
|
return double.MinValue;
|
|
// double Lon must contain a decimal separator
|
|
if (s.IndexOf(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) < 0)
|
|
return double.MinValue;
|
|
try
|
|
{
|
|
// try to convert to double
|
|
double d = System.Convert.ToDouble(s);
|
|
// check bounds
|
|
if ((d >= -180.0) && (d <= 180.0))
|
|
return d;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return double.MinValue;
|
|
}
|
|
|
|
|
|
public int To_Alt(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).Trim();
|
|
if (s.Length > 5)
|
|
return int.MinValue;
|
|
if (!IsInt(s))
|
|
return int.MinValue;
|
|
try
|
|
{
|
|
// try to convert to integer
|
|
long alt = System.Convert.ToInt64(s);
|
|
// check bounds
|
|
if ((alt >= 0) && (alt <= 100000))
|
|
return (int)alt;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return int.MinValue;
|
|
}
|
|
|
|
public int To_Track(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).Trim();
|
|
if (s.Length > 3)
|
|
return int.MinValue;
|
|
if (!IsInt(s))
|
|
return int.MinValue;
|
|
try
|
|
{
|
|
// try to convert to integer
|
|
long track = System.Convert.ToInt64(s);
|
|
// check bounds
|
|
if ((track >= 0) && (track < 360))
|
|
return (int)track;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return int.MinValue;
|
|
}
|
|
|
|
public int To_Speed(string s)
|
|
{
|
|
s = s.Replace("\"", String.Empty).Trim();
|
|
if (s.Length > 3)
|
|
return int.MinValue;
|
|
if (!IsInt(s))
|
|
return int.MinValue;
|
|
try
|
|
{
|
|
// try to convert to integer
|
|
long speed = System.Convert.ToInt64(s);
|
|
// check bounds
|
|
if ((speed >= 0) && (speed <= 800))
|
|
return (int)speed;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
|
|
}
|
|
return int.MinValue;
|
|
}
|
|
|
|
public static bool Check(ref PlaneInfo info)
|
|
{
|
|
// checks a PlaneInfo object
|
|
// tries to complete missing info from aircraft database
|
|
// returns TRUE if contains all mandantory data
|
|
if ((info.Time == null) ||
|
|
(info.Time == DateTime.MinValue) ||
|
|
(info.Time == DateTime.MaxValue) ||
|
|
(info.Lat == double.MinValue) ||
|
|
(info.Lat == double.MaxValue) ||
|
|
(info.Lon == double.MinValue) ||
|
|
(info.Lon == double.MaxValue) ||
|
|
(info.Alt == int.MinValue) ||
|
|
(info.Alt == int.MaxValue) ||
|
|
(info.Track == int.MinValue) ||
|
|
(info.Track == int.MaxValue) ||
|
|
(info.Speed == int.MinValue) ||
|
|
(info.Speed == int.MaxValue) ||
|
|
String.IsNullOrEmpty(info.Call)
|
|
)
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
}
|
|
} |