static void Main(string[] args) { FlightContextFactory.OnTakeoff += (sender, e) => { Console.WriteLine($"{DateTime.UtcNow}: {e.Flight.Aircraft} - Took off from {e.Flight.DepartureLocation.X}, {e.Flight.DepartureLocation.Y}"); }; FlightContextFactory.OnLanding += (sender, e) => { Console.WriteLine($"{DateTime.UtcNow}: {e.Flight.Aircraft} - Landed at {e.Flight.ArrivalLocation.X}, {e.Flight.ArrivalLocation.Y}"); }; FlightContextFactory.OnRadarContact += (sender, e) => { var lastPositionUpdate = e.Flight.PositionUpdates.OrderByDescending(q => q.TimeStamp).First(); Console.WriteLine($"{DateTime.UtcNow}: {e.Flight.Aircraft} - Radar contact at {lastPositionUpdate.Latitude}, {lastPositionUpdate.Longitude} @ {lastPositionUpdate.Altitude}ft {lastPositionUpdate.Heading.ToHeadingArrow()}"); }; FlightContextFactory.OnContextDispose += (sender, e) => { Console.WriteLine($"{DateTime.UtcNow}: {e.Context.Flight.Aircraft} - Context disposed"); }; AprsClient = new Listener(new Config() { Callsign = @"7CB0DBG", Password = "******", Uri = "aprs.glidernet.org", UseOgnAdditives = true, Port = 10152 }); AprsClient.PacketReceived += (sender, e) => { if (e.AprsMessage.DataType == Boerman.AprsClient.Enums.DataType.Status) { return; } FlightContextFactory.Process(new Skyhop.FlightAnalysis.Models.PositionUpdate( e.AprsMessage.Callsign, e.AprsMessage.ReceivedDate, e.AprsMessage.Latitude.AbsoluteValue, e.AprsMessage.Longitude.AbsoluteValue, e.AprsMessage.Altitude.FeetAboveSeaLevel, e.AprsMessage.Speed.Knots, e.AprsMessage.Direction.ToDegrees())); }; AprsClient.Open(); Console.WriteLine("Currently checking to see if we can receive some information!"); Console.Read(); }
static void Main(string[] args) { Console.WriteLine("Hello World!"); var ff = new FlightContextFactory(options => { options.NearbyRunwayAccessor = (Point point, double distance) => { return(new[] { new Runway( new Point(4.942108, 51.572418, 49), new Point(4.933319, 51.555660, 49) ), new Runway( new Point(4.950768, 51.565256, 49), new Point(4.911974, 51.569548, 49)) }); }; }); using (var reader = new StreamReader(@"C:\Users\Corstian\Projects\Whaally\Skyhop\EHGR-Sept.csv")) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) using (var writer = new StreamWriter("./experimental-logs-sept-92.csv")) using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture)) { var lines = csv.GetRecords <CsvData>(); var departureCounter = 0; var arrivalCounter = 0; ff.OnTakeoff += (sender, args) => { departureCounter++; }; ff.OnLanding += (sender, args) => { arrivalCounter++; var data = new { args.Flight.Aircraft, args.Flight.DepartureHeading, DepartureX = args.Flight.DepartureLocation?.X, DepartureY = args.Flight.DepartureLocation?.Y, args.Flight.DepartureTime, args.Flight.DepartureInfoFound, args.Flight.LaunchMethod, args.Flight.ArrivalHeading, ArrivalX = args.Flight.ArrivalLocation?.X, ArrivalY = args.Flight.ArrivalLocation?.Y, args.Flight.ArrivalTime, args.Flight.ArrivalInfoFound, }; csvWriter.WriteRecord(data); csvWriter.NextRecord(); csvWriter.Flush(); }; var timestamp = DateTime.Parse("2020-09-05T15:00:01"); ff.Process(lines //.Where(q => q.Timestamp > timestamp) .Select(q => new PositionUpdate(q.Aircraft, q.Timestamp, q.Longitude, q.Latitude, q.Altitude, q.Speed, q.Heading)) .ToList()); Console.WriteLine(departureCounter); Console.WriteLine(arrivalCounter); } }
public void Run() { _logger.LogInformation("Starting AnalyserService"); SubscribeContextFactoryEventHandlers(FlightContextFactory); var builder = new AprsFilterBuilder(); builder.AddFilter(new AprsFilter.Range(46.801111, 8.226667, 250)); // geographical center of switzerland var filter = builder.GetFilter(); var aprsConfig = new Config() { Callsign = @"Speck78", Password = "******", Uri = "aprs.glidernet.org", // glidern1.glidernet.org // aprs.glidernet.org UseOgnAdditives = true, Port = 14580, Filter = filter }; AprsClient = new Listener(aprsConfig); _logger.LogInformation("Created new AprsClient with config: {aprsConfig}", System.Text.Json.JsonSerializer.Serialize(aprsConfig)); AprsClient.PacketReceived += (sender, e) => { try { if (e.AprsMessage.DataType == DataType.Status) { return; } var posUpdate = new Skyhop.FlightAnalysis.Models.PositionUpdate( e.AprsMessage.Callsign, e.AprsMessage.ReceivedDate, e.AprsMessage.Latitude.AbsoluteValue, e.AprsMessage.Longitude.AbsoluteValue, e.AprsMessage.Altitude.FeetAboveSeaLevel, e.AprsMessage.Speed.Knots, e.AprsMessage.Direction.ToDegrees()); try { FlightContextFactory.Process(posUpdate); } catch (Exception exception) { _logger.LogError(exception, "Error: {ExceptionMessage}: Position update: {PositionUpdate}", exception.Message, posUpdate); } } catch (Exception ex) { //ColorConsole.WriteLine($"Error: {ex.Message}: AprsMessage: {e.AprsMessage}", ConsoleColor.Red); _logger.LogError(ex, "Error: {ExceptionMessage}: AprsMessage: {AprsMessage}", ex.Message, e.AprsMessage); } }; AprsClient.Open(); _logger.LogInformation("Opened Aprs Client"); }
static void Main(string[] args) { // On start, execute migrations and retrieve the unfinished flights using (var db = new Database()) { db.Database.Migrate(); var flights = db.Flights.Where(q => !q.Completed).ToList(); FlightContextFactory = new FlightContextFactory(flights); } FlightContextFactory.OnTakeoff += async(sender, e) => { Console.WriteLine($"{DateTime.UtcNow}: {e.Flight.Aircraft} - Took off from {e.Flight.DepartureLocation.X}, {e.Flight.DepartureLocation.Y}"); await StoreModelChange(e.Flight); }; FlightContextFactory.OnLanding += async(sender, e) => { Console.WriteLine($"{DateTime.UtcNow}: {e.Flight.Aircraft} - Landed at {e.Flight.ArrivalLocation.X}, {e.Flight.ArrivalLocation.Y}"); await StoreModelChange(e.Flight); }; FlightContextFactory.OnRadarContact += async(sender, e) => { var lastPositionUpdate = e.Flight.PositionUpdates.OrderByDescending(q => q.TimeStamp).First(); Console.WriteLine($"{DateTime.UtcNow}: {e.Flight.Aircraft} - Radar contact at {lastPositionUpdate.Latitude}, {lastPositionUpdate.Longitude} @ {lastPositionUpdate.Altitude}ft {lastPositionUpdate.Heading.ToHeadingArrow()}"); await StoreModelChange(e.Flight); }; FlightContextFactory.OnCompletedWithErrors += async(sender, e) => { await StoreModelChange(e.Flight); }; AprsClient = new Listener(new Config { Callsign = @"7CB0DBG", Password = "******", Uri = "aprs.glidernet.org", UseOgnAdditives = true, Port = 10152 }); AprsClient.PacketReceived += (sender, e) => { if (e.AprsMessage.DataType == Boerman.AprsClient.Enums.DataType.Status) { return; } if (String.IsNullOrEmpty(e.AprsMessage.Callsign)) { return; } FlightContextFactory.Process(new PositionUpdate( e.AprsMessage.Callsign, e.AprsMessage.ReceivedDate, e.AprsMessage.Latitude.AbsoluteValue, e.AprsMessage.Longitude.AbsoluteValue, e.AprsMessage.Altitude.FeetAboveSeaLevel, e.AprsMessage.Speed.Knots, e.AprsMessage.Direction.ToDegrees())); }; AprsClient.Open(); Console.WriteLine("Currently checking to see if we can receive some information!"); Console.Read(); }