feyris-tan ef86554f9a Import
2025-05-12 22:09:16 +02:00

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