Can now parse SPT and TMST2 from GSE.
Some checks failed
🚀 Pack skyscraper8 / make-zip (push) Failing after 1m45s

This commit is contained in:
feyris-tan 2025-11-09 22:47:22 +01:00
parent a1125fbb2d
commit 6efec7f07b
11 changed files with 95 additions and 4 deletions

View File

@ -965,6 +965,16 @@ namespace skyscraper5.Data.PostgreSql
throw new NotImplementedException(); throw new NotImplementedException();
} }
public bool TestForTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
{
throw new NotImplementedException();
}
public void InsertTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
{
throw new NotImplementedException();
}
private bool AreArraysEqual(byte[] l, byte[] r) private bool AreArraysEqual(byte[] l, byte[] r)
{ {
if (l.Length != r.Length) if (l.Length != r.Length)

View File

@ -73,6 +73,16 @@ namespace skyscraper8.GS.GSE_BFBS
Context.Rcs2Output.OnSuperframeComposition(gseTableStructure.InteractiveNetworkId, sct); Context.Rcs2Output.OnSuperframeComposition(gseTableStructure.InteractiveNetworkId, sct);
return; return;
case 0xa3:
Spt spt = new Spt(ms);
if (!spt.Valid)
{
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.SptInvalid);
return;
}
Context.Rcs2Output.OnSatellitePosition(gseTableStructure.InteractiveNetworkId, spt);
return;
case 0xa4: case 0xa4:
Cmt cmt = new Cmt(ms); Cmt cmt = new Cmt(ms);
if (!cmt.Valid) if (!cmt.Valid)
@ -109,6 +119,19 @@ namespace skyscraper8.GS.GSE_BFBS
} }
Context.Rcs2Output.OnTerminalBurstTimePlan2(gseTableStructure.InteractiveNetworkId, tbtp2); Context.Rcs2Output.OnTerminalBurstTimePlan2(gseTableStructure.InteractiveNetworkId, tbtp2);
return; return;
case 0xae:
int rmtTransmissionStandard = Context.Rcs2Output.GetRmtTransmissionStandard(gseTableStructure.InteractiveNetworkId);
Tmst2 tmst2 = new Tmst2(ms, rmtTransmissionStandard);
if (!tmst2.Valid)
{
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.Tmst2Invalid);
return;
}
Context.Rcs2Output.OnTransmissionModeSupport2(gseTableStructure.InteractiveNetworkId, tmst2);
return;
case 0xc0:
//User defined, we have no way of knowing what this is.
return;
default: default:
//See en_30154502v010401p.pdf //See en_30154502v010401p.pdf
//page 49 //page 49

View File

@ -36,5 +36,6 @@ namespace skyscraper5.src.InteractionChannel
void OnBroadcastConfiguration(ushort networkId, Bct bct); void OnBroadcastConfiguration(ushort networkId, Bct bct);
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);
} }
} }

View File

@ -9,7 +9,7 @@ using System.Threading.Tasks;
namespace skyscraper5.src.InteractionChannel.Model2 namespace skyscraper5.src.InteractionChannel.Model2
{ {
internal class Tmst2 : Validatable public class Tmst2 : Validatable
{ {
public Tmst2(MemoryStream ms, int transmissionStandard) public Tmst2(MemoryStream ms, int transmissionStandard)
{ {
@ -28,7 +28,7 @@ namespace skyscraper5.src.InteractionChannel.Model2
} }
if (transmissionStandard == 3) if (transmissionStandard == 3)
{ {
throw new NotImplementedException("Transmisison standard 3"); throw new NotImplementedException("Transmisison standard 3 in DVB-RCS2 is not yet supported. If possible, please share a sample of this stream.");
} }
Valid = true; Valid = true;
} }

View File

@ -48,6 +48,11 @@ namespace skyscraper5.src.InteractionChannel
} }
public void OnTransmissionModeSupport2(ushort interactiveNetworkId, Tmst2 tmst2)
{
}
public void OnFrameComposition2(ushort? networkId, Fct2 fct2) public void OnFrameComposition2(ushort? networkId, Fct2 fct2)
{ {

View File

@ -2504,6 +2504,18 @@ namespace skyscraper5.Skyscraper.Scraper
DataStorage.UpdateRcs2Tdt(interactiveNetworkId, tdt.Timestamp); DataStorage.UpdateRcs2Tdt(interactiveNetworkId, tdt.Timestamp);
} }
public void OnTransmissionModeSupport2(ushort interactiveNetworkId, Tmst2 tmst2)
{
foreach (Tmst2.TransmissionMode mode in tmst2.TransmissionModes)
{
if (!DataStorage.TestForTmst2(interactiveNetworkId, mode))
{
LogEvent(SkyscraperContextEvent.TransmissionModeSupport2, String.Format("Network ID #{0}, MODCOD {1}", interactiveNetworkId, mode.Modcod));
DataStorage.InsertTmst2(interactiveNetworkId, mode);
}
}
}
void InteractionChannelHandler.OnTimeslotComposition(ushort interactiveNetworkId, Tct tct) void InteractionChannelHandler.OnTimeslotComposition(ushort interactiveNetworkId, Tct tct)
{ {
throw new NotImplementedException(); throw new NotImplementedException();

View File

@ -91,6 +91,7 @@
BroadcastConfiguration, BroadcastConfiguration,
EthernetLinkLayerDiscovery, EthernetLinkLayerDiscovery,
Rcs2Network, Rcs2Network,
Rcs2TdtTime Rcs2TdtTime,
TransmissionModeSupport2
} }
} }

View File

@ -205,5 +205,7 @@ namespace skyscraper8.Skyscraper.Scraper.Storage
bool TestForRcs2Nit(RcsNit nit); bool TestForRcs2Nit(RcsNit nit);
void InsertRcs2Nit(RcsNit nit); void InsertRcs2Nit(RcsNit nit);
bool UpdateRcs2Tdt(ushort interactiveNetworkId, DateTime tdtTimestamp); bool UpdateRcs2Tdt(ushort interactiveNetworkId, DateTime tdtTimestamp);
bool TestForTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode);
void InsertTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode);
} }
} }

View File

@ -1203,6 +1203,16 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem
throw new NotImplementedException(); throw new NotImplementedException();
} }
public bool TestForTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
{
throw new NotImplementedException();
}
public void InsertTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
{
throw new NotImplementedException();
}
public IEnumerable<Tuple<int, int, ProgramMapping>> SelectAllPmt() public IEnumerable<Tuple<int, int, ProgramMapping>> SelectAllPmt()
{ {
throw new NotImplementedException(); throw new NotImplementedException();

View File

@ -1058,6 +1058,25 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory
return false; return false;
} }
private Dictionary<Tuple<ushort, int>, Tmst2.TransmissionMode> _tmst2;
public bool TestForTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
{
if (_tmst2 == null)
return false;
Tuple<ushort, int> key = new Tuple<ushort, int>(interactiveNetworkId, mode.Modcod);
return _tmst2.ContainsKey(key);
}
public void InsertTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
{
if (_tmst2 == null)
_tmst2 = new Dictionary<Tuple<ushort, int>, Tmst2.TransmissionMode>();
Tuple<ushort, int> key = new Tuple<ushort, int>(interactiveNetworkId, mode.Modcod);
_tmst2.Add(key, mode);
}
public IEnumerable<Tuple<int, int, ProgramMapping>> SelectAllPmt() public IEnumerable<Tuple<int, int, ProgramMapping>> SelectAllPmt()
{ {
for (int x = 0; x < pmtEntries.Length; x++) for (int x = 0; x < pmtEntries.Length; x++)

View File

@ -221,7 +221,15 @@ namespace skyscraper5.src.Skyscraper.Scraper.StreamAutodetection.Contestants
//TODO: put validation logic in here, important! //TODO: put validation logic in here, important!
} }
public void OnFrameComposition2(ushort? networkId, Fct2 fct2) public void OnTransmissionModeSupport2(ushort interactiveNetworkId, Tmst2 tmst2)
{
if (tmst2.TransmissionModes.Length > 0)
{
Score++;
}
}
public void OnFrameComposition2(ushort? networkId, Fct2 fct2)
{ {
if (fct2.FrameTypes.Length > 0) if (fct2.FrameTypes.Length > 0)
{ {