98 lines
3.7 KiB
C#
98 lines
3.7 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Text;
|
|
using AprsSharp.Parsers.Aprs;
|
|
using skyscraper5.Aprs.AprsSharp;
|
|
using skyscraper5.Dvb.DataBroadcasting;
|
|
using skyscraper5.Ietf.Rfc768;
|
|
using skyscraper5.Ietf.Rfc971;
|
|
|
|
namespace skyscraper5.Aprs
|
|
{
|
|
class AprsDecoder
|
|
{
|
|
public AprsDecoder(IAprsMessageReciever receiver)
|
|
{
|
|
this.receiver = receiver;
|
|
}
|
|
|
|
private IAprsMessageReciever receiver;
|
|
|
|
public void OnIpv4PacketArrival(InternetHeader internetHeader, byte[] ipv4Packet)
|
|
{
|
|
UserDatagram userDatagram = new UserDatagram(ipv4Packet);
|
|
MemoryStream ms = new MemoryStream(userDatagram.Payload, false);
|
|
StreamReader sr = new StreamReader(ms, Encoding.ASCII);
|
|
while (!sr.EndOfStream)
|
|
{
|
|
string? readLine = sr.ReadLine();
|
|
Packet packet = null;
|
|
try
|
|
{
|
|
packet = new Packet(readLine);
|
|
}
|
|
catch (ArgumentException e)
|
|
{
|
|
Debug.WriteLine("APRS Message decode failed: " + readLine);
|
|
}
|
|
|
|
if (packet != null)
|
|
ForwardToReceiver(packet);
|
|
}
|
|
sr.Close();
|
|
ms.Close();
|
|
}
|
|
|
|
public void OnIpDatagram(int sourcePid, byte[] payload)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
private void ForwardToReceiver(Packet packet)
|
|
{
|
|
InfoField packetInfoField = packet.InfoField;
|
|
|
|
string name = packetInfoField.GetType().Name;
|
|
switch (name)
|
|
{
|
|
case nameof(PositionInfo):
|
|
PositionInfo pi = (PositionInfo)packetInfoField;
|
|
receiver.OnAprsPosition(packet.Sender, pi.Position.Coordinates, pi.Comment);
|
|
break;
|
|
case nameof(UnimplementedInfoField):
|
|
break;
|
|
case nameof(WeatherInfo):
|
|
WeatherInfo wi = (WeatherInfo)packetInfoField;
|
|
receiver.OnAprsWeatherReport(packet.Sender, wi);
|
|
break;
|
|
case nameof(MessageField):
|
|
MessageField message = (MessageField)packetInfoField;
|
|
receiver.OnAprsChatMessage(packet.Sender, packet.Path[0], message.RawMessage);
|
|
break;
|
|
case nameof(StationCapabilities):
|
|
StationCapabilities stationCapabilities = (StationCapabilities)packetInfoField;
|
|
if (!stationCapabilities.IsIGate)
|
|
return;
|
|
receiver.OnAprsStationCapabilities(packet.Sender, stationCapabilities);
|
|
break;
|
|
case nameof(WeatherReportInfoField):
|
|
WeatherReportInfoField weatherReportInfoField = (WeatherReportInfoField)packetInfoField;
|
|
receiver.OnAprsWeatherReport(packet.Sender, weatherReportInfoField.Wrapped);
|
|
break;
|
|
case nameof(StatusInfo):
|
|
StatusInfo statusInfo = (StatusInfo)packetInfoField;
|
|
receiver.OnAprsPosition(packet.Sender, statusInfo.Position.Coordinates, statusInfo.Comment);
|
|
break;
|
|
case nameof(RawGpsInfoField):
|
|
RawGpsInfoField rawGpsInfoField = (RawGpsInfoField)packetInfoField;
|
|
if (rawGpsInfoField.Parsed != null)
|
|
receiver.OnAprsGpsSentence(packet.Sender, rawGpsInfoField.Parsed);
|
|
break;
|
|
default:
|
|
throw new NotImplementedException(name);
|
|
}
|
|
}
|
|
}
|
|
}
|