using AprsSharp.Parsers.Aprs; using GeoCoordinatePortable; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NmeaParser.Messages; using skyscraper5.Aprs.AprsSharp; using skyscraper5.Skyscraper.Plugins; namespace skyscraper5.Aprs { internal class LX9SESMessageReceiver : IAprsMessageReciever { private readonly LX9SESStorage _storage; public DateTime? currentTime; private PluginLogMessage LogEvent; public LX9SESMessageReceiver(LX9SESStorage storage, PluginLogMessage pluginLogMessage) { this._storage = storage; this.LogEvent = pluginLogMessage; } public void OnAprsPosition(string packetSender, GeoCoordinate positionCoordinates, string? piComment) { if (!currentTime.HasValue) return; if (positionCoordinates.Longitude == 0.0 || positionCoordinates.Latitude == 0.0) return; if (_storage.AprsPosition(currentTime.Value, packetSender, positionCoordinates, piComment)) { LogEvent(String.Format("[{3}] {0} is at {1}, {2}", packetSender, positionCoordinates.Latitude, positionCoordinates.Longitude, "AprsPosition")); } } public void OnAprsWeatherReport(string packetSender, WeatherInfo wi) { if (!currentTime.HasValue) return; string? wiComment = wi.Comment; int indexOf = wi.Comment.IndexOf(' '); wiComment = wiComment.Substring(indexOf + 1); if (wi.Position != null) { if (_storage.AprsPosition(currentTime.Value, packetSender, wi.Position.Coordinates, wiComment)) { LogEvent(String.Format("[{3}] {0} is at {1}, {2}", packetSender, wi.Position.Coordinates.Latitude, wi.Position.Coordinates.Longitude,"AprsPosition")); } } if (_storage.AprsWeatherReport(currentTime.Value, packetSender, wi)) { LogEvent(String.Format("[{2}] {0}, {1}", packetSender, currentTime.Value, "AprsWeather")); } } public void OnAprsChatMessage(string sender, string receiver, string message) { if (!currentTime.HasValue) return; _storage.AprsMessage(sender, currentTime.Value, receiver, message); } public void OnAprsStationCapabilities(string packetSender, StationCapabilities stationCapabilities) { if (!currentTime.HasValue) return; if (_storage.AprsStationCapabilities(packetSender, stationCapabilities)) { LogEvent(String.Format("[{2}] {0} -> {1}", packetSender, stationCapabilities.Encode(), "AprsStationCapabilities")); } } public void OnAprsGpsSentence(string packetSender, NmeaMessage parsed) { if (!currentTime.HasValue) return; GeoCoordinate geoCoordinate; switch (parsed.MessageType) { case "GPRMC": Rmc gprmc = (Rmc)parsed; geoCoordinate = new GeoCoordinate(gprmc.Latitude, gprmc.Longitude); bool conA = _storage.AprsPosition(currentTime.Value, packetSender, geoCoordinate, null); bool conB = _storage.AprsGpsSentence(currentTime.Value, packetSender, gprmc.Course, gprmc.MagneticVariation, gprmc.Speed); if (conA || conB) { LogEvent(String.Format("[{2}] {0}: {1}", packetSender, parsed.ToString(), "AprsGpsSentence")); } break; default: throw new NotImplementedException(parsed.MessageType); } } } }