AirScout/ScoutBase/ScoutBase.Data/PlaneInfo.cs

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;
}
}
}