Patches for passing RCS2 data to the UI.
Some checks failed
🚀 Pack skyscraper8 / make-zip (push) Failing after 1m36s

This commit is contained in:
feyris-tan 2026-03-22 21:52:14 +01:00
parent 1938cb169c
commit a7b89f2fac
13 changed files with 210 additions and 20 deletions

View File

@ -33,6 +33,6 @@ namespace skyscraper5.src.InteractionChannel
void OnRcs2Nit(ushort interactiveNetworkId, RcsNit nit); void OnRcs2Nit(ushort interactiveNetworkId, RcsNit nit);
void OnRcs2Tdt(ushort interactiveNetworkId, Rcs2Tdt tdt); void OnRcs2Tdt(ushort interactiveNetworkId, Rcs2Tdt tdt);
void OnTransmissionModeSupport2(ushort interactiveNetworkId, Tmst2 tmst2); void OnTransmissionModeSupport2(ushort interactiveNetworkId, Tmst2 tmst2);
void OnTerminalInformationMessage(ushort interactiveNetworkId, PhysicalAddress physicalAddress, Tim tim); void OnTerminalInformationMessage(ushort? interactiveNetworkId, PhysicalAddress physicalAddress, Tim tim);
} }
} }

View File

@ -280,11 +280,8 @@ namespace skyscraper5.src.InteractionChannel
_handler.OnInteractionChannelError(InteractionChannelErrorState.TimInvalid); _handler.OnInteractionChannelError(InteractionChannelErrorState.TimInvalid);
return; return;
} }
if (!NetworkId.HasValue)
{ _handler.OnTerminalInformationMessage(NetworkId, timHeader.MacAddress, tim);
return;
}
_handler.OnTerminalInformationMessage(NetworkId.Value, timHeader.MacAddress, tim);
return; return;
case 0xB1: //LL_FEC_parity_data_table case 0xB1: //LL_FEC_parity_data_table
throw new NotImplementedException("LL_FEC_parity_data_table"); throw new NotImplementedException("LL_FEC_parity_data_table");

View File

@ -30,6 +30,27 @@ namespace skyscraper5.src.InteractionChannel.Model
public Satellite[] Satellites { get; } public Satellite[] Satellites { get; }
public class Satellite public class Satellite
{ {
public Satellite()
{
}
public Satellite(byte id, uint x, uint y, uint z)
{
Id = id;
X = x;
Y = y;
Z = z;
}
public Satellite(Satellite copy)
{
Id = copy.Id;
X = copy.X;
Y = copy.Y;
Z = copy.Z;
}
public byte Id { get; internal set; } public byte Id { get; internal set; }
public uint X { get; internal set; } public uint X { get; internal set; }
public uint Y { get; internal set; } public uint Y { get; internal set; }

View File

@ -111,6 +111,6 @@ public class _0xb7_FramePayloadFormatDescriptor : TsDescriptor
public override string ToString() public override string ToString()
{ {
return String.Format("{0} Frame Payload Formats", Contexts); return String.Format("{0} Frame Payload Formats", Contexts.Length);
} }
} }

View File

@ -69,7 +69,7 @@ namespace skyscraper5.src.InteractionChannel
{ {
} }
public void OnTerminalInformationMessage(ushort interactiveNetworkId, PhysicalAddress physicalAddress, Tim tim) public void OnTerminalInformationMessage(ushort? interactiveNetworkId, PhysicalAddress physicalAddress, Tim tim)
{ {
} }

View File

@ -39,5 +39,10 @@ namespace skyscraper5.Mpeg2.Descriptors
} }
return true; return true;
} }
public override string ToString()
{
return String.Format("Unknown user defined descriptor: 0x{0:X2} ({1} bytes long)", DescriptorTag, Data.Length);
}
} }
} }

View File

@ -275,6 +275,10 @@ namespace skyscraper5.Mpeg2.Psi.Model
case 0xb1: case 0xb1:
case 0xb2: case 0xb2:
continue; continue;
case 0xe4:
case 0xc0:
//User defined, but should be okay.
continue;
default: default:
return false; return false;
} }

View File

@ -2,7 +2,6 @@
"profiles": { "profiles": {
"skyscraper8": { "skyscraper8": {
"commandName": "Project", "commandName": "Project",
"commandLineArgs": "\"C:\\devel\\skyscraper8-testsuite\\cosmo_dsmcc.ts\"",
"remoteDebugEnabled": false "remoteDebugEnabled": false
}, },
"Container (Dockerfile)": { "Container (Dockerfile)": {

View File

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper8.Skyscraper.Math
{
public static class Geodesy
{
const double a = 6378137.0; // WGS84 semi-major axis
const double f = 1.0 / 298.257223563; // WGS84 flattening
const double e2 = 2 * f - f * f; // WGS84eccentricity squared
public static SpatialReferenceWithHeight EcefToLla(double X, double Y, double Z)
{
// Longitude is straightforward
double lon = System.Math.Atan2(Y, X);
// Distance from Z-axis
double p = System.Math.Sqrt(X * X + Y * Y);
// Initial latitude estimate
double lat = System.Math.Atan2(Z, p * (1 - e2));
// Iterate to improve latitude
for (int i = 0; i < 10; i++)
{
double sinLat = System.Math.Sin(lat);
double N = a / System.Math.Sqrt(1 - e2 * sinLat * sinLat);
lat = System.Math.Atan2(Z + e2 * N * sinLat, p);
}
// Compute height
double sinLatFinal = System.Math.Sin(lat);
double Nfinal = a / System.Math.Sqrt(1 - e2 * sinLatFinal * sinLatFinal);
double h = p / System.Math.Cos(lat) - Nfinal;
// Convert radians → degrees
double latDeg = lat * 180.0 / System.Math.PI;
double lonDeg = lon * 180.0 / System.Math.PI;
SpatialReferenceWithHeight spatialReferenceWithHeight = new SpatialReferenceWithHeight(latDeg, lonDeg, h);
return spatialReferenceWithHeight;
}
}
}

View File

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper8.Skyscraper.Math
{
public struct SpatialReferenceWithHeight
{
public SpatialReferenceWithHeight(double latitude, double longitude, double height)
{
Latitude = latitude;
Longitude = longitude;
Height = height;
}
public double Latitude { get; set; }
public double Longitude { get; set; }
public double Height { get; set; }
public override bool Equals(object? obj)
{
return obj is SpatialReferenceWithHeight height &&
Latitude == height.Latitude &&
Longitude == height.Longitude &&
Height == height.Height;
}
public override int GetHashCode()
{
return HashCode.Combine(Latitude, Longitude, Height);
}
}
}

View File

@ -18,6 +18,7 @@ using skyscraper5.Skyscraper.Equipment;
using skyscraper5.Skyscraper.IO.CrazycatStreamReader; using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.Skyscraper.Net; using skyscraper5.Skyscraper.Net;
using skyscraper5.src.InteractionChannel.Model; using skyscraper5.src.InteractionChannel.Model;
using skyscraper5.src.InteractionChannel.Model2;
using skyscraper5.src.Skyscraper.FrequencyListGenerator; using skyscraper5.src.Skyscraper.FrequencyListGenerator;
using skyscraper5.T2MI.Packets; using skyscraper5.T2MI.Packets;
using skyscraper5.Teletext.Wss; using skyscraper5.Teletext.Wss;
@ -27,6 +28,8 @@ using skyscraper8.DvbSis;
using skyscraper8.GSE; using skyscraper8.GSE;
using skyscraper8.GSE.GSE; using skyscraper8.GSE.GSE;
using skyscraper8.Ietf.FLUTE; using skyscraper8.Ietf.FLUTE;
using skyscraper8.InteractionChannel.Model;
using skyscraper8.InteractionChannel.Model2;
using skyscraper8.Ses; using skyscraper8.Ses;
using skyscraper8.Skyscraper.Drawing; using skyscraper8.Skyscraper.Drawing;
using skyscraper8.Skyscraper.FrequencyListGenerator; using skyscraper8.Skyscraper.FrequencyListGenerator;
@ -233,5 +236,16 @@ namespace skyscraper5.Skyscraper.Scraper
void OnDvbSisNit(int sourcePid, SisNitContainer nitContainer); void OnDvbSisNit(int sourcePid, SisNitContainer nitContainer);
void OnDvbSisTdt(int sourcePid, DateTime? utcTime); void OnDvbSisTdt(int sourcePid, DateTime? utcTime);
void OnRcs2Rmt(Rmt rmt); void OnRcs2Rmt(Rmt rmt);
void OnRcs2Tmst(ushort networkId, Tmst tmst);
void OnRcs2Tmst2(ushort interactiveNetworkId, Tmst2 tmst2);
void OnRcs2Tdt(ushort interactiveNetworkId, Rcs2Tdt tdt);
void OnRcs2Nit(ushort interactiveNetworkId, RcsNit nit);
void OnRcs2Bct(ushort networkId, Bct bct);
void OnRcs2Fct2(ushort networkId, Fct2 fct2);
void OnRcs2Tbtp2(ushort interactiveNetworkId, Tbtp2 tbtp2);
void OnRcs2Tct(ushort interactiveNetworkId, Tct tct);
void OnRcs2Tbtp(ushort interactiveNetworkId, Tbtp tbtp);
void OnRcs2Sct(ushort interactiveNetworkId, Sct sct);
void OnRcs2Spt(ushort interactiveNetworkId, Spt spt);
} }
} }

View File

@ -2389,6 +2389,8 @@ namespace skyscraper5.Skyscraper.Scraper
void InteractionChannelHandler.OnCorrectionMessage(ushort interactiveNetworkId, Cmt cmt) void InteractionChannelHandler.OnCorrectionMessage(ushort interactiveNetworkId, Cmt cmt)
{ {
SetLikelyNetwork(interactiveNetworkId);
foreach (Cmt.CmtEntry entry in cmt.Entries) foreach (Cmt.CmtEntry entry in cmt.Entries)
{ {
if (!DataStorage.TestForCmtEntry(interactiveNetworkId,entry)) if (!DataStorage.TestForCmtEntry(interactiveNetworkId,entry))
@ -2401,6 +2403,8 @@ namespace skyscraper5.Skyscraper.Scraper
void InteractionChannelHandler.OnFrameComposition(ushort interactiveNetworkId, Fct fct) void InteractionChannelHandler.OnFrameComposition(ushort interactiveNetworkId, Fct fct)
{ {
SetLikelyNetwork(interactiveNetworkId);
foreach (Fct.Frame frame in fct.Frames) foreach (Fct.Frame frame in fct.Frames)
{ {
if (!DataStorage.TestForFrameComposition(interactiveNetworkId,frame)) if (!DataStorage.TestForFrameComposition(interactiveNetworkId,frame))
@ -2428,8 +2432,16 @@ namespace skyscraper5.Skyscraper.Scraper
public void OnRcsMap(Rmt rmt) public void OnRcsMap(Rmt rmt)
{ {
if (rmt.Linkages != null)
{
if (rmt.Linkages.Count > 0)
{
SetLikelyNetwork(rmt.Linkages[0].InteractiveNetworkId);
}
}
UiJunction?.EnableUiFeature(SkyscraperUiFeature.RcsAnalysis); UiJunction?.EnableUiFeature(SkyscraperUiFeature.RcsAnalysis);
UiJunction?.OnRcs2Rmt(rmt); UiJunction?.OnRcs2Rmt(rmt);
if (!DataStorage.TestForRmt(rmt)) if (!DataStorage.TestForRmt(rmt))
{ {
DataStorage.InsertRmt(rmt); DataStorage.InsertRmt(rmt);
@ -2473,6 +2485,9 @@ namespace skyscraper5.Skyscraper.Scraper
public void OnSatellitePosition(ushort interactiveNetworkId, Spt spt) public void OnSatellitePosition(ushort interactiveNetworkId, Spt spt)
{ {
SetLikelyNetwork(interactiveNetworkId);
UiJunction?.OnRcs2Spt(interactiveNetworkId, spt);
foreach (Spt.Satellite satellite in spt.Satellites) foreach (Spt.Satellite satellite in spt.Satellites)
{ {
if (!DataStorage.TestForSatellitePosition(interactiveNetworkId,satellite)) if (!DataStorage.TestForSatellitePosition(interactiveNetworkId,satellite))
@ -2485,6 +2500,9 @@ namespace skyscraper5.Skyscraper.Scraper
void InteractionChannelHandler.OnSuperframeComposition(ushort interactiveNetworkId, Sct sct) void InteractionChannelHandler.OnSuperframeComposition(ushort interactiveNetworkId, Sct sct)
{ {
SetLikelyNetwork(interactiveNetworkId);
UiJunction?.OnRcs2Sct(interactiveNetworkId, sct);
foreach (Sct.Superframe superframe in sct.Superframes) foreach (Sct.Superframe superframe in sct.Superframes)
{ {
if (!DataStorage.TestForSuperframeComposition(interactiveNetworkId,superframe)) if (!DataStorage.TestForSuperframeComposition(interactiveNetworkId,superframe))
@ -2497,6 +2515,9 @@ namespace skyscraper5.Skyscraper.Scraper
void InteractionChannelHandler.OnTerminalBurstTimePlan(ushort interactiveNetworkId, Tbtp tbtp) void InteractionChannelHandler.OnTerminalBurstTimePlan(ushort interactiveNetworkId, Tbtp tbtp)
{ {
SetLikelyNetwork(interactiveNetworkId);
UiJunction?.OnRcs2Tbtp(interactiveNetworkId, tbtp);
foreach (Tbtp.TbtpFrame frame in tbtp.Frames) foreach (Tbtp.TbtpFrame frame in tbtp.Frames)
{ {
foreach (Tbtp.TbtpFrame.BtpEntity btp in frame.BTP) foreach (Tbtp.TbtpFrame.BtpEntity btp in frame.BTP)
@ -2512,11 +2533,17 @@ namespace skyscraper5.Skyscraper.Scraper
public void OnTimeslotComposition(ushort interactiveNetworkId, Tct tct) public void OnTimeslotComposition(ushort interactiveNetworkId, Tct tct)
{ {
SetLikelyNetwork(interactiveNetworkId);
UiJunction?.OnRcs2Tct(interactiveNetworkId, tct);
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void OnTerminalBurstTimePlan2(ushort interactiveNetworkId, Tbtp2 tbtp2) public void OnTerminalBurstTimePlan2(ushort interactiveNetworkId, Tbtp2 tbtp2)
{ {
SetLikelyNetwork(interactiveNetworkId);
UiJunction?.OnRcs2Tbtp2(interactiveNetworkId, tbtp2);
foreach (Tbtp2.Frame frame in tbtp2.Frames) foreach (Tbtp2.Frame frame in tbtp2.Frames)
{ {
for (int assignmentOrdinal = 0; assignmentOrdinal < frame.Assignments.Length; assignmentOrdinal++) for (int assignmentOrdinal = 0; assignmentOrdinal < frame.Assignments.Length; assignmentOrdinal++)
@ -2533,6 +2560,9 @@ namespace skyscraper5.Skyscraper.Scraper
public void OnFrameComposition2(ushort networkId, Fct2 fct2) public void OnFrameComposition2(ushort networkId, Fct2 fct2)
{ {
SetLikelyNetwork(networkId);
UiJunction?.OnRcs2Fct2(networkId, fct2);
foreach (Fct2.Frame frame in fct2.FrameTypes) foreach (Fct2.Frame frame in fct2.FrameTypes)
{ {
if (!DataStorage.TestForFrameComposition2(networkId, frame)) if (!DataStorage.TestForFrameComposition2(networkId, frame))
@ -2545,6 +2575,9 @@ namespace skyscraper5.Skyscraper.Scraper
public void OnBroadcastConfiguration(ushort networkId, Bct bct) public void OnBroadcastConfiguration(ushort networkId, Bct bct)
{ {
SetLikelyNetwork(networkId);
UiJunction?.OnRcs2Bct(networkId, bct);
foreach (Bct.BroadcastConfiguration txType in bct.TxTypes) foreach (Bct.BroadcastConfiguration txType in bct.TxTypes)
{ {
if (!DataStorage.TestForBroadcastConfiguration(networkId, txType.TxType)) if (!DataStorage.TestForBroadcastConfiguration(networkId, txType.TxType))
@ -2557,6 +2590,9 @@ namespace skyscraper5.Skyscraper.Scraper
public void OnRcs2Nit(ushort interactiveNetworkId, RcsNit nit) public void OnRcs2Nit(ushort interactiveNetworkId, RcsNit nit)
{ {
SetLikelyNetwork(interactiveNetworkId);
UiJunction?.OnRcs2Nit(interactiveNetworkId, nit);
if (!DataStorage.TestForRcs2Nit(nit)) if (!DataStorage.TestForRcs2Nit(nit))
{ {
LogEvent(SkyscraperContextEvent.Rcs2Network, String.Format("Network ID #{0}, ({1}) on {2}", nit.OriginalNetworkId, nit.NetworkName, nit.SatelliteDeliverySystem.ToString())); LogEvent(SkyscraperContextEvent.Rcs2Network, String.Format("Network ID #{0}, ({1}) on {2}", nit.OriginalNetworkId, nit.NetworkName, nit.SatelliteDeliverySystem.ToString()));
@ -2568,10 +2604,15 @@ namespace skyscraper5.Skyscraper.Scraper
{ {
LogEvent(SkyscraperContextEvent.Rcs2TdtTime, String.Format("Network ID #{0}, {1}", interactiveNetworkId, tdt.Timestamp)); LogEvent(SkyscraperContextEvent.Rcs2TdtTime, String.Format("Network ID #{0}, {1}", interactiveNetworkId, tdt.Timestamp));
DataStorage.UpdateRcs2Tdt(interactiveNetworkId, tdt.Timestamp); DataStorage.UpdateRcs2Tdt(interactiveNetworkId, tdt.Timestamp);
SetLikelyNetwork(interactiveNetworkId);
UiJunction?.OnRcs2Tdt(interactiveNetworkId, tdt);
} }
public void OnTransmissionModeSupport2(ushort interactiveNetworkId, Tmst2 tmst2) public void OnTransmissionModeSupport2(ushort interactiveNetworkId, Tmst2 tmst2)
{ {
SetLikelyNetwork(interactiveNetworkId);
UiJunction?.OnRcs2Tmst2(interactiveNetworkId, tmst2);
foreach (Tmst2.TransmissionMode mode in tmst2.TransmissionModes) foreach (Tmst2.TransmissionMode mode in tmst2.TransmissionModes)
{ {
if (!DataStorage.TestForTmst2(interactiveNetworkId, mode)) if (!DataStorage.TestForTmst2(interactiveNetworkId, mode))
@ -2584,6 +2625,9 @@ namespace skyscraper5.Skyscraper.Scraper
void InteractionChannelHandler.OnTransmissionModeSupport(ushort interactiveNetworkId, Tmst tmst) void InteractionChannelHandler.OnTransmissionModeSupport(ushort interactiveNetworkId, Tmst tmst)
{ {
SetLikelyNetwork(interactiveNetworkId);
UiJunction?.OnRcs2Tmst(interactiveNetworkId, tmst);
byte[] knownTmst = DataStorage.GetTmst(interactiveNetworkId); byte[] knownTmst = DataStorage.GetTmst(interactiveNetworkId);
if (knownTmst == null) if (knownTmst == null)
{ {
@ -3417,16 +3461,40 @@ namespace skyscraper5.Skyscraper.Scraper
} }
} }
public void OnTerminalInformationMessage(ushort interactiveNetworkId, PhysicalAddress physicalAddress, Tim currentTim) private ushort lastKnownInteractiveNetworkId;
private int networkIdChanges;
private void SetLikelyNetwork(ushort interactiveNetworkId)
{ {
Tim lastTim = DataStorage.GetLastTim(interactiveNetworkId, physicalAddress); if (lastKnownInteractiveNetworkId != interactiveNetworkId)
{
lastKnownInteractiveNetworkId = interactiveNetworkId;
networkIdChanges++;
}
}
public void OnTerminalInformationMessage(ushort? interactiveNetworkId, PhysicalAddress physicalAddress, Tim currentTim)
{
if (!interactiveNetworkId.HasValue)
{
if (networkIdChanges != 1)
return;
interactiveNetworkId = lastKnownInteractiveNetworkId;
}
else
{
SetLikelyNetwork(interactiveNetworkId.Value);
}
Tim lastTim = DataStorage.GetLastTim(interactiveNetworkId.Value, physicalAddress);
if (currentTim.Equals(lastTim)) if (currentTim.Equals(lastTim))
{ {
return; return;
} }
DataStorage.UpsertTim(interactiveNetworkId, physicalAddress, currentTim); DataStorage.UpsertTim(interactiveNetworkId.Value, physicalAddress, currentTim);
LogEvent(SkyscraperContextEvent.Tim, String.Format("Terminal Information Message for participant {0} on network {1}", physicalAddress, interactiveNetworkId)); LogEvent(SkyscraperContextEvent.Tim, String.Format("Terminal Information Message for participant {0} on network {1}", physicalAddress, interactiveNetworkId));
foreach(TsDescriptor ts in currentTim.Descriptors) foreach(TsDescriptor ts in currentTim.Descriptors)

View File

@ -205,7 +205,7 @@ namespace skyscraper5.src.Skyscraper.Scraper.StreamAutodetection.Contestants
} }
} }
public void OnTerminalInformationMessage(ushort interactiveNetworkId, PhysicalAddress physicalAddress, Tim tim) public void OnTerminalInformationMessage(ushort? interactiveNetworkId, PhysicalAddress physicalAddress, Tim tim)
{ {
foreach(TsDescriptor tsDescriptor in tim.Descriptors) foreach(TsDescriptor tsDescriptor in tim.Descriptors)
{ {