From 7e7a3f86dd3304a39e69b00f23b83717a3194e95 Mon Sep 17 00:00:00 2001 From: feyris-tan <4116042+feyris-tan@users.noreply.github.com> Date: Sat, 21 Mar 2026 22:38:16 +0100 Subject: [PATCH] Reworked the database handling for TIMs. --- skyscraper8/GS/GSE-BFBS/GseL2SHandler.cs | 4 +- .../InteractionChannelHandler.cs | 15 +- .../InteractionChannelPsiGatherer.cs | 6 +- .../0xa0_NetworkLayerInfoDescriptor.cs | 30 ++- .../0xa1_CorrectionMessageDescriptor.cs | 19 ++ .../0xa2_LoginInitializeDescriptor.cs | 5 + .../Descriptors/0xa3_AcqAssignDescriptor.cs | 5 + .../Descriptors/0xa4_SyncAssignDescriptor.cs | 5 + .../0xa5_EncryptedLoginIdDescriptor.cs | 12 + .../0xa8_SatelliteForwardLinkDescriptor.cs | 2 +- .../0xa9_SatelliteReturnLinkDescriptor.cs | 2 +- .../Descriptors/0xaa_TableUpdateDescriptor.cs | 5 + .../0xab_ContentionControlDescriptor.cs | 22 +- .../0xac_CorrectionControlDescriptor.cs | 30 ++- .../0xad_ForwardInteractionPathDescriptor.cs | 5 + .../0xae_ReturnInteractionPathDescriptor.cs | 5 + .../0xaf_ConnectionControlDescriptor.cs | 5 + ...b1_CorrectionMessageExtensionDescriptor.cs | 5 + .../0xb2_ReturnTransmissionModesDescriptor.cs | 5 + .../0xb3_MeshLogonInitializeDescriptor.cs | 5 + .../0xb5_ImplementationTypeDescriptor.cs | 5 + .../0xb6_LlFecIdentifierDescriptor.cs | 5 + skyscraper8/InteractionChannel/Model/Tim.cs | 130 ++++------ .../_0xb7_FramePayloadFormatDescriptor.cs | 66 ++++- .../_0xb9_LogonResponseDescriptor.cs | 2 +- .../_0xbb_LowerLayerServiceDescriptor.cs | 5 + .../_0xc4_HigherLayersInitializeDescriptor.cs | 5 + .../NullInteractionChannelHandler.cs | 129 +++------- .../TimJsonRepresentation.cs | 89 +++++++ .../Descriptors/UserDefinedDescriptor.cs | 36 ++- skyscraper8/Mpeg2/TsDescriptor.cs | 21 +- .../Skyscraper/Scraper/SkyscraperContext.cs | 173 ++----------- .../Skyscraper/Scraper/Storage/DataStorage.cs | 24 +- .../Storage/Filesystem/FilesystemStorage.cs | 111 +-------- .../InMemory/InMemoryScraperStorage.cs | 230 ++---------------- .../InteractionChannelContestant.cs | 107 ++------ 36 files changed, 539 insertions(+), 791 deletions(-) create mode 100644 skyscraper8/InteractionChannel/TimJsonRepresentation.cs diff --git a/skyscraper8/GS/GSE-BFBS/GseL2SHandler.cs b/skyscraper8/GS/GSE-BFBS/GseL2SHandler.cs index 19b0821..65b6f5d 100644 --- a/skyscraper8/GS/GSE-BFBS/GseL2SHandler.cs +++ b/skyscraper8/GS/GSE-BFBS/GseL2SHandler.cs @@ -152,8 +152,8 @@ namespace skyscraper8.GS.GSE_BFBS { throw new NotImplementedException("Found a TIM-U Table with a 3-byte GSE Label in this stream. This is not supported yet, please share a sample of this stream."); } - - tim.Handle(physicalAddress, gseTableStructure.InteractiveNetworkId, Context.Rcs2Output); + + Context.Rcs2Output.OnTerminalInformationMessage(gseTableStructure.InteractiveNetworkId, physicalAddress, tim); return; case 0xc0: //User defined, we have no way of knowing what this is. diff --git a/skyscraper8/InteractionChannel/InteractionChannelHandler.cs b/skyscraper8/InteractionChannel/InteractionChannelHandler.cs index c5424f1..1f95fbc 100644 --- a/skyscraper8/InteractionChannel/InteractionChannelHandler.cs +++ b/skyscraper8/InteractionChannel/InteractionChannelHandler.cs @@ -25,27 +25,14 @@ namespace skyscraper5.src.InteractionChannel void OnSuperframeComposition(ushort interactiveNetworkId, Sct sct); void OnTerminalBurstTimePlan(ushort interactiveNetworkId, Tbtp tbtp); void OnTimeslotComposition(ushort interactiveNetworkId, Tct tct); - void OnCorrectionMessage(PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmd); - void OnContentionControl(PhysicalAddress macAddress, _0xab_ContentionControlDescriptor ccd); - void OnCorrectionControl(PhysicalAddress macAddress, _0xac_CorrectionControlDescriptor descriptor); - void OnNetworkLayerInfo(PhysicalAddress macAddress, _0xa0_NetworkLayerInfoDescriptor descriptor); void OnTransmissionModeSupport(ushort interactiveNetworkId, Tmst tmst); int GetRmtTransmissionStandard(ushort networkId); - void OnReturnTransmissionMOdes(PhysicalAddress macAddress, _0xb2_ReturnTransmissionModesDescriptor descriptor); - void OnConnectionControl(PhysicalAddress macAddress, _0xaf_ConnectionControlDescriptor descriptor); void OnTerminalBurstTimePlan2(ushort interactiveNetworkId, Tbtp2 tbtp2); void OnFrameComposition2(ushort networkId, Fct2 fct2); void OnBroadcastConfiguration(ushort networkId, Bct bct); void OnRcs2Nit(ushort interactiveNetworkId, RcsNit nit); void OnRcs2Tdt(ushort interactiveNetworkId, Rcs2Tdt tdt); void OnTransmissionModeSupport2(ushort interactiveNetworkId, Tmst2 tmst2); - void OnFramePayloadFormatAnnouncement(ushort networkId, _0xb7_FramePayloadFormatDescriptor descriptor); - void OnCorrectionMessageExtension(PhysicalAddress macAddress, _0xb1_CorrectionMessageExtensionDescriptor descriptor); - void OnControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor); - void OnSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor); - void OnLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor); - void OnHigherLayerInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor descriptor); - void LogonResponseDescriptor(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor); - void OnForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor descriptor); + void OnTerminalInformationMessage(ushort interactiveNetworkId, PhysicalAddress physicalAddress, Tim tim); } } diff --git a/skyscraper8/InteractionChannel/InteractionChannelPsiGatherer.cs b/skyscraper8/InteractionChannel/InteractionChannelPsiGatherer.cs index cc5e5d6..e385dfe 100644 --- a/skyscraper8/InteractionChannel/InteractionChannelPsiGatherer.cs +++ b/skyscraper8/InteractionChannel/InteractionChannelPsiGatherer.cs @@ -280,7 +280,11 @@ namespace skyscraper5.src.InteractionChannel _handler.OnInteractionChannelError(InteractionChannelErrorState.TimInvalid); return; } - tim.Handle(timHeader.MacAddress, NetworkId, Handler); + if (!NetworkId.HasValue) + { + return; + } + _handler.OnTerminalInformationMessage(NetworkId.Value, timHeader.MacAddress, tim); return; case 0xB1: //LL_FEC_parity_data_table throw new NotImplementedException("LL_FEC_parity_data_table"); diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xa0_NetworkLayerInfoDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xa0_NetworkLayerInfoDescriptor.cs index 80c9c07..3788732 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xa0_NetworkLayerInfoDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xa0_NetworkLayerInfoDescriptor.cs @@ -1,4 +1,5 @@ -using skyscraper5.Mpeg2; +using Newtonsoft.Json; +using skyscraper5.Mpeg2; using skyscraper5.Skyscraper.Plugins; using System; using System.Collections.Generic; @@ -12,12 +13,35 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors [TsDescriptor(0xa0,"TIM")] public class _0xa0_NetworkLayerInfoDescriptor : TsDescriptor { - public _0xa0_NetworkLayerInfoDescriptor(byte[] buffer) + [JsonConstructor] + public _0xa0_NetworkLayerInfoDescriptor(byte[] MessageBuffer) { - MessageBuffer = (byte[])buffer.Clone(); + this.MessageBuffer = (byte[])MessageBuffer.Clone(); Valid = true; } public byte[] MessageBuffer { get; } + + public override bool DescriptorEquals(TsDescriptor thatDescriptor) + { + _0xa0_NetworkLayerInfoDescriptor? that = thatDescriptor as _0xa0_NetworkLayerInfoDescriptor; + if (that == null) + return false; + + if (this.MessageBuffer.Length != that.MessageBuffer.Length) + return false; + + for (int i = 0; i < this.MessageBuffer.Length; i++) + { + if (this.MessageBuffer[i] != that.MessageBuffer[i]) + return false; + } + return true; + } + + public override string ToString() + { + return "Network Layer Info"; + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xa1_CorrectionMessageDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xa1_CorrectionMessageDescriptor.cs index e48977c..ad9e48a 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xa1_CorrectionMessageDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xa1_CorrectionMessageDescriptor.cs @@ -15,6 +15,11 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors [TsDescriptor(0xa1, "TIM")] public class _0xa1_CorrectionMessageDescriptor : TsDescriptor, IEquatable<_0xa1_CorrectionMessageDescriptor?> { + public _0xa1_CorrectionMessageDescriptor() + { + + } + public _0xa1_CorrectionMessageDescriptor(byte[] buffer) { MemoryStream ms = new MemoryStream(buffer, false); @@ -105,5 +110,19 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors { return !(left == right); } + + public override bool DescriptorEquals(TsDescriptor thatDescriptor) + { + _0xa1_CorrectionMessageDescriptor that = thatDescriptor as _0xa1_CorrectionMessageDescriptor; + if (that == null) + return false; + + return this.Equals(that); + } + + public override string ToString() + { + return String.Format("Correction for Slot {0}", SlotType); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xa2_LoginInitializeDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xa2_LoginInitializeDescriptor.cs index b5f7508..5043ab4 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xa2_LoginInitializeDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xa2_LoginInitializeDescriptor.cs @@ -93,5 +93,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public uint? RbdcTimeout { get; } public byte ForwardSignallingVPI { get; } public ushort ForwardSignallingVCI { get; } + + public override string ToString() + { + return String.Format("Login Init for Group {0}, Logon {1}", GroupId, LogonId); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xa3_AcqAssignDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xa3_AcqAssignDescriptor.cs index 414002d..136e758 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xa3_AcqAssignDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xa3_AcqAssignDescriptor.cs @@ -34,5 +34,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public int FrameNumber { get; } public int RepeatPeriod { get; } public int SlotNumber { get; } + + public override string ToString() + { + return String.Format("ACQ Assign Slot {0}", SlotNumber); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xa4_SyncAssignDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xa4_SyncAssignDescriptor.cs index 991f6fa..d683764 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xa4_SyncAssignDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xa4_SyncAssignDescriptor.cs @@ -34,5 +34,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public int SyncFrameNumber { get; } public ushort SyncRepeatPeriod { get; } public int SyncSlotNumber { get; } + + public override string ToString() + { + return String.Format("Sync Assign for Slot {0}", SyncSlotNumber); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xa5_EncryptedLoginIdDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xa5_EncryptedLoginIdDescriptor.cs index 74a4b2c..85953a6 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xa5_EncryptedLoginIdDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xa5_EncryptedLoginIdDescriptor.cs @@ -38,5 +38,17 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public ushort IdStartTime { get; } public ushort IdUpdatePeriod { get; } public ushort[] EncryptedLoginId { get; } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("Encrypted Login Ids: "); + foreach(ushort u in EncryptedLoginId) + { + sb.Append(u); + sb.Append(','); + } + return sb.ToString(); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xa8_SatelliteForwardLinkDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xa8_SatelliteForwardLinkDescriptor.cs index 81c182a..f127aba 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xa8_SatelliteForwardLinkDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xa8_SatelliteForwardLinkDescriptor.cs @@ -132,7 +132,7 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public override string ToString() { - return String.Format("{0} kHz,{1}, {2} sym/s", Frequency, Polarization.ToString()[0], SymbolRate); + return String.Format("Forward Link: {0} kHz,{1}, {2} sym/s", Frequency, Polarization.ToString()[0], SymbolRate); } protected bool Equals(_0xa8_SatelliteForwardLinkDescriptor other) diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xa9_SatelliteReturnLinkDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xa9_SatelliteReturnLinkDescriptor.cs index 270c6ad..1ed25ef 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xa9_SatelliteReturnLinkDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xa9_SatelliteReturnLinkDescriptor.cs @@ -41,7 +41,7 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public override string ToString() { - return String.Format("Sat-ID {0}, Beam-ID {1}, Gateway-ID {2}, Superframe-ID {3}, Freq-Offset {4}", SatelliteId, BeamId, GatewayId, SuperframeId, TxFrequencyOffset); + return String.Format("Return Link: Sat-ID {0}, Beam-ID {1}, Gateway-ID {2}, Superframe-ID {3}, Freq-Offset {4}", SatelliteId, BeamId, GatewayId, SuperframeId, TxFrequencyOffset); } protected bool Equals(_0xa9_SatelliteReturnLinkDescriptor other) diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xaa_TableUpdateDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xaa_TableUpdateDescriptor.cs index a0920e8..579ff1e 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xaa_TableUpdateDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xaa_TableUpdateDescriptor.cs @@ -43,5 +43,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public byte TableId { get; internal set; } public int NewVersion { get; internal set; } } + + public override string ToString() + { + return String.Format("{0} table updates.", Updates.Length); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xab_ContentionControlDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xab_ContentionControlDescriptor.cs index 369796f..4ee819c 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xab_ContentionControlDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xab_ContentionControlDescriptor.cs @@ -14,6 +14,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors [TsDescriptor(0xab, "TIM")] public class _0xab_ContentionControlDescriptor : TsDescriptor { + public _0xab_ContentionControlDescriptor() + { + + } public _0xab_ContentionControlDescriptor(byte[] buffer) { MemoryStream ms = new MemoryStream(buffer, false); @@ -24,10 +28,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors Valid = true; } - public byte SuperframeId { get; } - public uint CscResponseTimeout { get; } - public byte CscMaxLosses { get; } - public uint MaxTimeBeforeRetry { get; } + public byte SuperframeId { get; set; } + public uint CscResponseTimeout { get; set; } + public byte CscMaxLosses { get; set; } + public uint MaxTimeBeforeRetry { get; set; } public _0xab_ContentionControlDescriptor(byte superframeId, uint cscResponseTimeout, byte cscMaxLosses, uint maxTimeBeforeRetry) { @@ -45,5 +49,15 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors CscMaxLosses == descriptor.CscMaxLosses && MaxTimeBeforeRetry == descriptor.MaxTimeBeforeRetry; } + + public override bool DescriptorEquals(TsDescriptor thatDescriptor) + { + return Equals(thatDescriptor); + } + + public override string ToString() + { + return String.Format("Contention Control for Superframe {0}", SuperframeId); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xac_CorrectionControlDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xac_CorrectionControlDescriptor.cs index d3e7cba..121ebc6 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xac_CorrectionControlDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xac_CorrectionControlDescriptor.cs @@ -1,4 +1,5 @@ -using skyscraper5.Mpeg2; +using Newtonsoft.Json; +using skyscraper5.Mpeg2; using skyscraper5.Skyscraper; using skyscraper5.Skyscraper.IO; using skyscraper5.Skyscraper.Plugins; @@ -16,6 +17,16 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors [TsDescriptor(0xac,"TIM")] public class _0xac_CorrectionControlDescriptor : TsDescriptor { + [JsonConstructor] + public _0xac_CorrectionControlDescriptor(uint AcqResponseTimeout, uint SyncResponseTimeout, byte AcqMaxLosses, byte SyncMaxLosses) + { + this.AcqResponseTimeout = AcqResponseTimeout; + this.SyncResponseTimeout = SyncResponseTimeout; + this.AcqMaxLosses = AcqMaxLosses; + this.SyncMaxLosses = SyncMaxLosses; + Valid = true; + } + public _0xac_CorrectionControlDescriptor(byte[] buffer) { MemoryStream ms =new MemoryStream(buffer); @@ -31,13 +42,6 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public byte AcqMaxLosses { get; } public byte SyncMaxLosses { get; } - public _0xac_CorrectionControlDescriptor(uint acqResponseTimeout, uint syncResponseTimeout, byte acqMaxLosses, byte syncMaxLosses) - { - AcqResponseTimeout = acqResponseTimeout; - SyncResponseTimeout = syncResponseTimeout; - AcqMaxLosses = acqMaxLosses; - SyncMaxLosses = syncMaxLosses; - } public override bool Equals(object obj) { @@ -47,5 +51,15 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors AcqMaxLosses == descriptor.AcqMaxLosses && SyncMaxLosses == descriptor.SyncMaxLosses; } + + public override bool DescriptorEquals(TsDescriptor thatDescriptor) + { + return Equals(thatDescriptor); + } + + public override string ToString() + { + return "Correction Control"; + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xad_ForwardInteractionPathDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xad_ForwardInteractionPathDescriptor.cs index f8a4347..4453393 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xad_ForwardInteractionPathDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xad_ForwardInteractionPathDescriptor.cs @@ -104,5 +104,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors } public List Paths { get; } + + public override string ToString() + { + return String.Format("{0} Forward Interaction Paths", Paths.Count); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xae_ReturnInteractionPathDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xae_ReturnInteractionPathDescriptor.cs index 0c7526e..78e4ffd 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xae_ReturnInteractionPathDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xae_ReturnInteractionPathDescriptor.cs @@ -110,5 +110,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public byte VPI { get; internal set; } public ushort VCI { get; internal set; } } + + public override string ToString() + { + return String.Format("{0} Return Interaction Paths", RoutingLabels.Length); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xaf_ConnectionControlDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xaf_ConnectionControlDescriptor.cs index 61f0217..099f0e9 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xaf_ConnectionControlDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xaf_ConnectionControlDescriptor.cs @@ -28,5 +28,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public uint CscResponseTimeout { get; } public byte CscMaxLosses { get; } public uint MaxTimeBeforeRetry { get; } + + public override string ToString() + { + return String.Format("Connection Control for Superframe {0}", SuperframeId); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xb1_CorrectionMessageExtensionDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xb1_CorrectionMessageExtensionDescriptor.cs index 45f4cfd..bf92675 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xb1_CorrectionMessageExtensionDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xb1_CorrectionMessageExtensionDescriptor.cs @@ -28,5 +28,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public ushort SuperframeCount { get; } public int FrameNumber { get; } public int SlotNumber { get; } + + public override string ToString() + { + return String.Format("Correction Message Extension for Superframe {0}", SuperframeId); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xb2_ReturnTransmissionModesDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xb2_ReturnTransmissionModesDescriptor.cs index 71ccb4d..cdc3032 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xb2_ReturnTransmissionModesDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xb2_ReturnTransmissionModesDescriptor.cs @@ -70,5 +70,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public bool EsNoThresholdFlag { get; internal set; } public int EsNoThreshold { get; internal set; } } + + public override string ToString() + { + return String.Format("Return Transmission Modes for {0} superframes.", Superframes.Length); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xb3_MeshLogonInitializeDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xb3_MeshLogonInitializeDescriptor.cs index eaf4189..90f0e86 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xb3_MeshLogonInitializeDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xb3_MeshLogonInitializeDescriptor.cs @@ -97,5 +97,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public uint VbdcMax { get; } public uint RbdcMax { get; } public uint RbdcTimeout { get; } + + public override string ToString() + { + return String.Format("Mesh Logon Initalization for Group {0}, Logon {1}", GroupId, LogonId); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xb5_ImplementationTypeDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xb5_ImplementationTypeDescriptor.cs index c8e3f14..f0c2a1b 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xb5_ImplementationTypeDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xb5_ImplementationTypeDescriptor.cs @@ -56,5 +56,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public uint HubTypeId { get; } public uint HubSwId { get; } public byte[] UserOptions { get; } + + public override string ToString() + { + return String.Format("Implementation Type for Hub Type {0}", HubTypeId); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Descriptors/0xb6_LlFecIdentifierDescriptor.cs b/skyscraper8/InteractionChannel/Model/Descriptors/0xb6_LlFecIdentifierDescriptor.cs index 49e135a..a956424 100644 --- a/skyscraper8/InteractionChannel/Model/Descriptors/0xb6_LlFecIdentifierDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model/Descriptors/0xb6_LlFecIdentifierDescriptor.cs @@ -64,5 +64,10 @@ namespace skyscraper5.src.InteractionChannel.Model.Descriptors public int BufferTimeout { get; internal set; } public int Dscp { get; internal set; } } + + public override string ToString() + { + return String.Format("{0} LL-FEC Identifiers", LlFecIdentifiers.Length); + } } } diff --git a/skyscraper8/InteractionChannel/Model/Tim.cs b/skyscraper8/InteractionChannel/Model/Tim.cs index 9c28816..c077252 100644 --- a/skyscraper8/InteractionChannel/Model/Tim.cs +++ b/skyscraper8/InteractionChannel/Model/Tim.cs @@ -12,11 +12,20 @@ using System.Text; using System.Threading.Tasks; using skyscraper8.GSE.GSE; using skyscraper8.InteractionChannel.Model2.Descriptors; +using Ionic.Crc; +using Ionic.Zlib; namespace skyscraper5.src.InteractionChannel.Model { public class Tim : Validatable { + public Tim(bool broadcast, byte status, TsDescriptor[] descs) + { + this.Broadcast = broadcast; + this.Status = status; + this.Descriptors = descs; + } + public Tim(MemoryStream ms, bool broadcast) { Broadcast = broadcast; @@ -268,92 +277,53 @@ namespace skyscraper5.src.InteractionChannel.Model public bool NccReceiveFailure => (Broadcast & ((Status & 0x02) != 0)); public bool SchedulerFailure => (Broadcast & ((Status & 0x01) != 0)); - internal void Handle(PhysicalAddress macAddress, ushort? networkId, InteractionChannelHandler handler) + public override int GetHashCode() { - foreach(TsDescriptor descriptor in Descriptors) + int hash = 17; + hash ^= HashCode.Combine(Broadcast, Status, Descriptors.Length); + foreach (TsDescriptor tsDescriptor in Descriptors) { - if (descriptor == null) - { - continue; - } - if (descriptor is UserDefinedDescriptor) - { - continue; - } - if (!descriptor.Valid) - { - Valid = false; - return; - } - byte id = descriptor.GetDescriptorId(); - switch(id) - { - case 0xa0: - handler.OnNetworkLayerInfo(macAddress, (_0xa0_NetworkLayerInfoDescriptor)descriptor); - break; - case 0xa1: - if (Broadcast) - { - if (networkId.HasValue) - { - handler.OnCorrectionMessage(networkId.Value, ToCmt((_0xa1_CorrectionMessageDescriptor)descriptor)); - } - } - else - { - handler.OnCorrectionMessage(macAddress, ((_0xa1_CorrectionMessageDescriptor)descriptor)); - } - break; - case 0xa4: - handler.OnControlAssignment(macAddress,(_0xa4_SyncAssignDescriptor)descriptor); - break; - case 0xa9: - handler.OnSatelliteReturnLink(macAddress, (_0xa9_SatelliteReturnLinkDescriptor)descriptor); - break; - case 0xab: - handler.OnContentionControl(macAddress, ((_0xab_ContentionControlDescriptor)descriptor)); - break; - case 0xac: - handler.OnCorrectionControl(macAddress, (_0xac_CorrectionControlDescriptor)descriptor); - break; - case 0xad: - handler.OnForwardInteractionPath(macAddress, (_0xad_ForwardInteractionPathDescriptor)descriptor); - break; - case 0xaf: - handler.OnConnectionControl(macAddress, (_0xaf_ConnectionControlDescriptor)descriptor); - break; - case 0xb1: - handler.OnCorrectionMessageExtension(macAddress, (_0xb1_CorrectionMessageExtensionDescriptor)descriptor); - break; - case 0xb2: - handler.OnReturnTransmissionMOdes(macAddress, (_0xb2_ReturnTransmissionModesDescriptor)descriptor); - break; - case 0xb7: - if (networkId.HasValue) - { - handler.OnFramePayloadFormatAnnouncement(networkId.Value, (_0xb7_FramePayloadFormatDescriptor)descriptor); - } - break; - case 0xb9: - handler.LogonResponseDescriptor(macAddress, (_0xb9_LogonResponseDescriptor)descriptor); - break; - case 0xbb: - handler.OnLowerLayerService(macAddress, (_0xbb_LowerLayerServiceDescriptor)descriptor); - break; - case 0xc4: - handler.OnHigherLayerInitalization(macAddress, (_0xc4_HigherLayersInitializeDescriptor)descriptor); - break; - default: - if (id >= 0xe0 && id <= 0xfe) - break; - throw new NotImplementedException(String.Format("TIM Descriptor 0x{0:X2} ({1}) is not fully implemented yet. Please share a sample of this stream.", id, descriptor.GetType().Name)); - } + hash ^= tsDescriptor.GetDescriptorHashCode(); } + return hash; } - private Cmt ToCmt(_0xa1_CorrectionMessageDescriptor descriptor) + public override bool Equals(object? obj) { - throw new NotImplementedException(); + if (obj == null) + return false; + Tim that = obj as Tim; + if (that == null) + return false; + + if (this.Status != that.Status) + return false; + + bool thisHasDescriptors = this.Descriptors != null; + bool thatHasDescriptors = that.Descriptors != null; + if (thisHasDescriptors != thatHasDescriptors) + return false; + + if (this.Descriptors.Length != that.Descriptors.Length) + return false; + + for (int i = 0; i < this.Descriptors.Length; i++) + { + TsDescriptor thisDescriptor = this.Descriptors[i]; + TsDescriptor thatDescriptor = that.Descriptors[i]; + + byte thisDescriptorId = thisDescriptor.GetDescriptorId(); + byte thatDescriptorId = thatDescriptor.GetDescriptorId(); + + if (thisDescriptorId != thatDescriptorId) + return false; + + if (!thisDescriptor.DescriptorEquals(thatDescriptor)) + { + return false; + } + } + return true; } } } diff --git a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xb7_FramePayloadFormatDescriptor.cs b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xb7_FramePayloadFormatDescriptor.cs index cdc2279..511ed15 100644 --- a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xb7_FramePayloadFormatDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xb7_FramePayloadFormatDescriptor.cs @@ -8,6 +8,11 @@ namespace skyscraper8.InteractionChannel.Model2.Descriptors; [TsDescriptor(0xb7,"TIM")] public class _0xb7_FramePayloadFormatDescriptor : TsDescriptor { + public _0xb7_FramePayloadFormatDescriptor() + { + + } + public _0xb7_FramePayloadFormatDescriptor(byte[] buffer) { InBitStream bitstream = new InBitStream(buffer); @@ -48,5 +53,64 @@ public class _0xb7_FramePayloadFormatDescriptor : TsDescriptor public byte ImplicitPpduLabelSize { get; set; } public byte ImplicitPayloadLabelSize { get; set; } public byte Type0AlpduLabelSize { get; set; } - } + + public override bool Equals(object? obj) + { + return obj is TransmissionContext context && + TransmissionContextId == context.TransmissionContextId && + AllowPTypeOmission == context.AllowPTypeOmission && + UseCompressedPType == context.UseCompressedPType && + AllowAlpduCrc == context.AllowAlpduCrc && + AllowAlpduSequenceNumber == context.AllowAlpduSequenceNumber && + UseExplicitPayloadHeaderMap == context.UseExplicitPayloadHeaderMap && + ImplicitProtocolType == context.ImplicitProtocolType && + ImplicitPpduLabelSize == context.ImplicitPpduLabelSize && + ImplicitPayloadLabelSize == context.ImplicitPayloadLabelSize && + Type0AlpduLabelSize == context.Type0AlpduLabelSize; + } + + public override int GetHashCode() + { + HashCode hash = new HashCode(); + hash.Add(TransmissionContextId); + hash.Add(AllowPTypeOmission); + hash.Add(UseCompressedPType); + hash.Add(AllowAlpduCrc); + hash.Add(AllowAlpduSequenceNumber); + hash.Add(UseExplicitPayloadHeaderMap); + hash.Add(ImplicitProtocolType); + hash.Add(ImplicitPpduLabelSize); + hash.Add(ImplicitPayloadLabelSize); + hash.Add(Type0AlpduLabelSize); + return hash.ToHashCode(); + } + } + + public override bool DescriptorEquals(TsDescriptor thatDescriptor) + { + _0xb7_FramePayloadFormatDescriptor that = thatDescriptor as _0xb7_FramePayloadFormatDescriptor; + if (that == null) + return false; + + bool thisHasContexts = this.Contexts != null; + bool thatHasContexts = that.Contexts != null; + + if (thisHasContexts != thatHasContexts) + return false; + + if (this.Contexts.Length != that.Contexts.Length) + return false; + + for (int i = 0; i < this.Contexts.Length; i++) + { + if (!this.Contexts[i].Equals(that.Contexts[i])) + return false; + } + return true; + } + + public override string ToString() + { + return String.Format("{0} Frame Payload Formats", Contexts); + } } diff --git a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xb9_LogonResponseDescriptor.cs b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xb9_LogonResponseDescriptor.cs index c5c5a4b..bf6cc8f 100644 --- a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xb9_LogonResponseDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xb9_LogonResponseDescriptor.cs @@ -79,7 +79,7 @@ namespace skyscraper8.InteractionChannel.Model2.Descriptors public override string ToString() { - return $"{nameof(GroupId)}: {GroupId}, {nameof(LogonId)}: {LogonId}"; + return $"Logon Response for {nameof(GroupId)}: {GroupId}, {nameof(LogonId)}: {LogonId}"; } } } diff --git a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xbb_LowerLayerServiceDescriptor.cs b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xbb_LowerLayerServiceDescriptor.cs index 4b68e8c..02d5780 100644 --- a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xbb_LowerLayerServiceDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xbb_LowerLayerServiceDescriptor.cs @@ -140,5 +140,10 @@ namespace skyscraper8.InteractionChannel.Model2.Descriptors public byte MinIdleBlock { get; set; } public byte[] DefaultsForRaLoadControl { get; set; } } + + public override string ToString() + { + return String.Format("{0} Lower Layer Services", LowerLayerServices.Length); + } } } diff --git a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xc4_HigherLayersInitializeDescriptor.cs b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xc4_HigherLayersInitializeDescriptor.cs index 5bc99a9..39655d5 100644 --- a/skyscraper8/InteractionChannel/Model2/Descriptors/_0xc4_HigherLayersInitializeDescriptor.cs +++ b/skyscraper8/InteractionChannel/Model2/Descriptors/_0xc4_HigherLayersInitializeDescriptor.cs @@ -64,5 +64,10 @@ namespace skyscraper8.InteractionChannel.Model2.Descriptors return HashCode.Combine(Mac24AsString, Ipv4McAddress, OfferStreamIpv4Adress, OfferStreamPort, HigherLayerPepSwitchOff); } } + + public override string ToString() + { + return String.Format("{0} Higher Layer Initalizations", Layer2Interfaces.Length); + } } } diff --git a/skyscraper8/InteractionChannel/NullInteractionChannelHandler.cs b/skyscraper8/InteractionChannel/NullInteractionChannelHandler.cs index c43640b..2e94dec 100644 --- a/skyscraper8/InteractionChannel/NullInteractionChannelHandler.cs +++ b/skyscraper8/InteractionChannel/NullInteractionChannelHandler.cs @@ -21,122 +21,39 @@ namespace skyscraper5.src.InteractionChannel return 0; } - public void OnConnectionControl(PhysicalAddress macAddress, _0xaf_ConnectionControlDescriptor descriptor) - { - } - - public void OnTerminalBurstTimePlan2(ushort interactiveNetworkId, Tbtp2 tbtp2) - { - - } - - public void OnFrameComposition2(ushort networkId, Fct2 fct2) - { - - } - - public void OnBroadcastConfiguration(ushort networkId, Bct bct) - { - } - - public void OnRcs2Nit(ushort interactiveNetworkId, RcsNit nit) - { - - } - - public void OnRcs2Tdt(ushort interactiveNetworkId, Rcs2Tdt tdt) - { - - } - - public void OnTransmissionModeSupport2(ushort interactiveNetworkId, Tmst2 tmst2) - { - - } - - public void OnFramePayloadFormatAnnouncement(ushort networkId, _0xb7_FramePayloadFormatDescriptor descriptor) - { - - } - - public void OnCorrectionMessageExtension(PhysicalAddress macAddress, _0xb1_CorrectionMessageExtensionDescriptor descriptor) - { - - } - - public void OnControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor) - { - - } - - public void OnSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor) - { - - } - - public void OnLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor) - { - - } - - public void OnHigherLayerInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor descriptor) - { - - } - - public void LogonResponseDescriptor(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor) - { - - } - - public void OnForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor descriptor) - { - - } - - public void OnFrameComposition2(ushort? networkId, Fct2 fct2) - { - - } - - public void OnContentionControl(PhysicalAddress macAddress, _0xab_ContentionControlDescriptor ccd) + public void OnBroadcastConfiguration(ushort networkId, Bct bct) { } - public void OnCorrectionControl(PhysicalAddress macAddress, _0xac_CorrectionControlDescriptor descriptor) - { - } - - public void OnNetworkLayerInfo(PhysicalAddress macAddress, _0xa0_NetworkLayerInfoDescriptor descriptor) - { - - } - public void OnCorrectionMessage(ushort interactiveNetworkId, Cmt cmt) { } - public void OnCorrectionMessage(PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmd) - { - } - public void OnFrameComposition(ushort interactiveNetworkId, Fct fct) { } + public void OnFrameComposition2(ushort networkId, Fct2 fct2) + { + } + public void OnInteractionChannelError(InteractionChannelErrorState unexpectedTable) { } - + + public void OnRcs2Nit(ushort interactiveNetworkId, RcsNit nit) + { + } + + public void OnRcs2Tdt(ushort interactiveNetworkId, Rcs2Tdt tdt) + { + } + public void OnRcsMap(Rmt rmt) { } - public void OnReturnTransmissionMOdes(PhysicalAddress macAddress, _0xb2_ReturnTransmissionModesDescriptor descriptor) - { - } - - public void OnSatellitePosition(ushort interactiveNetworkId, Spt spt) + public void OnSatellitePosition(ushort interactiveNetworkId, Spt spt) { } @@ -147,13 +64,25 @@ namespace skyscraper5.src.InteractionChannel public void OnTerminalBurstTimePlan(ushort interactiveNetworkId, Tbtp tbtp) { } - + + public void OnTerminalBurstTimePlan2(ushort interactiveNetworkId, Tbtp2 tbtp2) + { + } + + public void OnTerminalInformationMessage(ushort interactiveNetworkId, PhysicalAddress physicalAddress, Tim tim) + { + } + public void OnTimeslotComposition(ushort interactiveNetworkId, Tct tct) - { + { } public void OnTransmissionModeSupport(ushort interactiveNetworkId, Tmst tmst) { } + + public void OnTransmissionModeSupport2(ushort interactiveNetworkId, Tmst2 tmst2) + { + } } } diff --git a/skyscraper8/InteractionChannel/TimJsonRepresentation.cs b/skyscraper8/InteractionChannel/TimJsonRepresentation.cs new file mode 100644 index 0000000..6228182 --- /dev/null +++ b/skyscraper8/InteractionChannel/TimJsonRepresentation.cs @@ -0,0 +1,89 @@ +using Newtonsoft.Json; +using skyscraper5.Mpeg2; +using skyscraper5.Mpeg2.Descriptors; +using skyscraper5.src.InteractionChannel.Model; +using skyscraper5.src.InteractionChannel.Model.Descriptors; +using skyscraper8.InteractionChannel.Model2.Descriptors; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace skyscraper8.InteractionChannel +{ + public class TimJsonRepresentation + { + public TimJsonRepresentation() { } + + public TimJsonRepresentation(Tim tim) + { + this.Broadcast = tim.Broadcast; + this.Status = tim.Status; + this.DescriptorTypes = new byte[tim.Descriptors.Length]; + this.DescriptorsSerialized = new string[tim.Descriptors.Length]; + for (int i = 0; i < tim.Descriptors.Length; i++) + { + this.DescriptorTypes[i] = tim.Descriptors[i].GetDescriptorId(); + this.DescriptorsSerialized[i] = JsonConvert.SerializeObject(tim.Descriptors[i], Formatting.Indented); + } + } + + public Tim ToTim() + { + TsDescriptor[] descs = new TsDescriptor[this.DescriptorTypes.Length]; + for (int i = 0; i < this.DescriptorTypes.Length; i++) + { + TsDescriptor newChild = null; + switch (this.DescriptorTypes[i]) + { + case 0xa0: + newChild = JsonConvert.DeserializeObject<_0xa0_NetworkLayerInfoDescriptor>(this.DescriptorsSerialized[i]); + break; + case 0xa1: + newChild = JsonConvert.DeserializeObject<_0xa1_CorrectionMessageDescriptor>(this.DescriptorsSerialized[i]); + break; + case 0xab: + newChild = JsonConvert.DeserializeObject<_0xab_ContentionControlDescriptor>(this.DescriptorsSerialized[i]); + break; + case 0xac: + newChild = JsonConvert.DeserializeObject<_0xac_CorrectionControlDescriptor>(this.DescriptorsSerialized[i]); + break; + case 0xb7: + newChild = JsonConvert.DeserializeObject<_0xb7_FramePayloadFormatDescriptor>(this.DescriptorsSerialized[i]); + break; + case 0xe1: + newChild = JsonConvert.DeserializeObject(this.DescriptorsSerialized[i]); + break; + default: + throw new NotImplementedException(String.Format("Don't know how to deserialize TIM descriptor type _0x{0:X2}", this.DescriptorTypes[i])); + } + newChild.Valid = true; + descs[i] = newChild; + } + Tim result = new Tim(Broadcast, Status, descs); + return result; + } + + public bool Broadcast { get; set; } + public byte Status { get; set; } + public byte[] DescriptorTypes { get; set; } + public string[] DescriptorsSerialized { get; set; } + + public static TimJsonRepresentation FromTim(Tim tim) + { + return new TimJsonRepresentation(tim); + } + + public static Tim ConvertJsonToTim(string json) + { + TimJsonRepresentation representation = JsonConvert.DeserializeObject(json); + return representation.ToTim(); + } + + public string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } + } +} diff --git a/skyscraper8/Mpeg2/Descriptors/UserDefinedDescriptor.cs b/skyscraper8/Mpeg2/Descriptors/UserDefinedDescriptor.cs index 0f47281..1b46b55 100644 --- a/skyscraper8/Mpeg2/Descriptors/UserDefinedDescriptor.cs +++ b/skyscraper8/Mpeg2/Descriptors/UserDefinedDescriptor.cs @@ -1,19 +1,43 @@ -namespace skyscraper5.Mpeg2.Descriptors +using Newtonsoft.Json; + +namespace skyscraper5.Mpeg2.Descriptors { public class UserDefinedDescriptor : TsDescriptor { - public byte DescriptorTag { get; } - public byte[] Data { get; } + public byte DescriptorTag { get; set; } + public byte[] Data { get; set; } - public UserDefinedDescriptor(byte descriptorTag, byte[] data) + [JsonConstructor] + public UserDefinedDescriptor(byte DescriptorTag, byte[] data) { - DescriptorTag = descriptorTag; - Data = data; + this.DescriptorTag = DescriptorTag; + this.Data = data; + this.Valid = true; } public override byte GetDescriptorId() { return DescriptorTag; } + + public override bool DescriptorEquals(TsDescriptor thatDescriptor) + { + UserDefinedDescriptor that = thatDescriptor as UserDefinedDescriptor; + if (that == null) + return false; + + if (this.DescriptorTag != that.DescriptorTag) + return false; + + if (this.Data.Length != that.Data.Length) + return false; + + for (int i = 0; i < this.Data.Length; i++) + { + if (this.Data[i] != that.Data[i]) + return false; + } + return true; + } } } diff --git a/skyscraper8/Mpeg2/TsDescriptor.cs b/skyscraper8/Mpeg2/TsDescriptor.cs index 0f1a6e4..ad2f986 100644 --- a/skyscraper8/Mpeg2/TsDescriptor.cs +++ b/skyscraper8/Mpeg2/TsDescriptor.cs @@ -1,4 +1,5 @@ using System; +using System.Configuration; using skyscraper5.Dvb; using skyscraper5.Skyscraper; @@ -35,5 +36,23 @@ namespace skyscraper5.Mpeg2 { throw new NotImplementedException(String.Format("{0} does not implement Serialize()", this.GetType().Name)); } - } + + public virtual int GetDescriptorHashCode() + { + string err = String.Format("{0} does not reveal a custom hash code.", this.GetType().Name); + throw new NotImplementedException(err); + } + + /// + /// Tests if a descriptor is FUNCTIONALLY equivalent with another descriptor. + /// + /// The other TS Descriptor to compare against + /// + /// Is thrown when a descriptor does not implement this method. + public virtual bool DescriptorEquals(TsDescriptor thatDescriptor) + { + string err = String.Format("{0} does not know wheter it is functionally equivalent to {1}.", this.GetType().Name, thatDescriptor.GetType().Name); + throw new NotImplementedException(err); + } + } } diff --git a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs index bd8578f..dcbfd50 100644 --- a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs +++ b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs @@ -2582,148 +2582,6 @@ namespace skyscraper5.Skyscraper.Scraper } } - public void OnFramePayloadFormatAnnouncement(ushort networkId, _0xb7_FramePayloadFormatDescriptor descriptor) - { - foreach (_0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext in descriptor.Contexts) - { - if (!DataStorage.TestForTimFramePayloadFormat(networkId, transmissionContext)) - { - LogEvent(SkyscraperContextEvent.TimFramePayloadFormat,String.Format("Network #{0}, Context ID #{1}",networkId,transmissionContext.TransmissionContextId)); - DataStorage.InsertTimFramePayloadFormat(networkId, transmissionContext); - } - } - } - - public void OnCorrectionMessageExtension(PhysicalAddress macAddress, _0xb1_CorrectionMessageExtensionDescriptor descriptor) - { - if (!DataStorage.TestForTimCorrectionMessageExtension(macAddress)) - { - LogEvent(SkyscraperContextEvent.TimCorrectionExtension, String.Format("For participant {0}", macAddress)); - DataStorage.InsertTimCorrectionMessageExtension(macAddress, descriptor); - } - } - - public void OnControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor) - { - if (!DataStorage.TestForTimControlAssignment(macAddress)) - { - LogEvent(SkyscraperContextEvent.TimControlAssignment, String.Format("For participant {0}", macAddress)); - DataStorage.InsertTimControlAssignment(macAddress, descriptor); - } - } - - public void OnSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor) - { - if (!DataStorage.TestForTimSatelliteReturnLink(macAddress)) - { - LogEvent(SkyscraperContextEvent.TimSatelliteReturnLink, String.Format("For participant {0}: {1}", macAddress, descriptor)); - DataStorage.InsertTimSatelliteReturnLink(macAddress, descriptor); - } - } - - public void OnLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor) - { - if (!DataStorage.TestForLowerLayerService(macAddress)) - { - LogEvent(SkyscraperContextEvent.TimLowerLayerService, String.Format("For participant {0}", macAddress)); - DataStorage.InsertTimLowerLayerService(macAddress, descriptor); - } - } - - public void OnHigherLayerInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor descriptor) - { - foreach (_0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface in descriptor.Layer2Interfaces) - { - if (!DataStorage.TestForHigherLayerServiceInitalization(macAddress, layer2Interface)) - { - LogEvent(SkyscraperContextEvent.TimHigherLayerInitalization, String.Format("For participant {0} -> {1}", macAddress, layer2Interface.Ipv4McAddress)); - DataStorage.InsertHigherLayerServiceInitalization(macAddress, layer2Interface); - } - } - } - - public void LogonResponseDescriptor(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor) - { - if (!DataStorage.TestForTimLogonResponse(macAddress)) - { - LogEvent(SkyscraperContextEvent.TimLogonResponse, String.Format("For participant {0}: {1}", macAddress, descriptor.ToString())); - DataStorage.InsertTimLogonResponse(macAddress, descriptor); - } - } - - public void OnForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor descriptor) - { - foreach (_0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath in descriptor.Paths) - { - if (!DataStorage.TestForTimForwardInteractionPath(macAddress, forwardInteractionPath)) - { - LogEvent(SkyscraperContextEvent.TimForwardInteractionPath, String.Format("For participant {0}: {1}", macAddress, forwardInteractionPath.ToString())); - DataStorage.InsertTimForwardInteractionPath(macAddress, forwardInteractionPath); - } - } - } - - public void OnCorrectionMessage(PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmd) - { - if (!DataStorage.TestForTim(mac)) - { - LogEvent(SkyscraperContextEvent.Tim, String.Format("for participant {0}", mac.ToString())); - DataStorage.CreateTim(mac); - } - if (DataStorage.CorrectTim(mac, cmd)) - { - LogEvent(SkyscraperContextEvent.TimCorrection, String.Format("for participant {0}", mac.ToString())); - } - } - - public void OnContentionControl(PhysicalAddress mac, _0xab_ContentionControlDescriptor ccdNew) - { - if (!DataStorage.TestForTim(mac)) - { - LogEvent(SkyscraperContextEvent.Tim, String.Format("for participant {0}", mac.ToString())); - DataStorage.CreateTim(mac); - } - if (DataStorage.ContentionTim(mac,ccdNew)) - { - LogEvent(SkyscraperContextEvent.TimContentionControl, String.Format("for participant {0}", mac.ToString())); - } - } - - public void OnCorrectionControl(PhysicalAddress mac, _0xac_CorrectionControlDescriptor descriptor) - { - if (!DataStorage.TestForTim(mac)) - { - LogEvent(SkyscraperContextEvent.Tim, String.Format("for participant {0}", mac.ToString())); - DataStorage.CreateTim(mac); - } - if (DataStorage.CorrectionControlTim(mac,descriptor)) - { - LogEvent(SkyscraperContextEvent.TimCorrectionControl, String.Format("for participant {0}", mac.ToString())); - } - } - - private List networkLayerInfos; - public void OnNetworkLayerInfo(PhysicalAddress mac, _0xa0_NetworkLayerInfoDescriptor nlid) - { - if (currentTimeForTim == null) - return; - if (!DataStorage.TestForTim(mac)) - { - LogEvent(SkyscraperContextEvent.Tim, String.Format("for participant {0}", mac.ToString())); - DataStorage.CreateTim(mac); - } - if (DataStorage.NetworkLayerInfoTim(mac,nlid,currentTimeForTim.Value)) - { - if (networkLayerInfos == null) - networkLayerInfos = new List(); - if (!networkLayerInfos.Contains(mac)) - { - LogEvent(SkyscraperContextEvent.TimNetworkLayerInfo, String.Format("for participant {0}", mac.ToString())); - networkLayerInfos.Add(mac); - } - } - } - void InteractionChannelHandler.OnTransmissionModeSupport(ushort interactiveNetworkId, Tmst tmst) { byte[] knownTmst = DataStorage.GetTmst(interactiveNetworkId); @@ -3330,17 +3188,6 @@ namespace skyscraper5.Skyscraper.Scraper return ObjectStorage.NdsSsuTestFile(CurrentNetworkId, CurrentTransportStreamId, pid, tableIdExtension); } - public void OnReturnTransmissionMOdes(PhysicalAddress macAddress, _0xb2_ReturnTransmissionModesDescriptor descriptor) - { - //TODO: Implement this. - } - - public void OnConnectionControl(PhysicalAddress macAddress, _0xaf_ConnectionControlDescriptor descriptor) - { - //TODO: Implement this. - } - - private HashSet lldpFrames; public void OnLldpFrame(LldpFrame frame) { @@ -3569,5 +3416,23 @@ namespace skyscraper5.Skyscraper.Scraper context.OnTotTime(totContainer.UtcTime, totContainer.LocalTimeOffset); } } - } + + public void OnTerminalInformationMessage(ushort interactiveNetworkId, PhysicalAddress physicalAddress, Tim currentTim) + { + Tim lastTim = DataStorage.GetLastTim(interactiveNetworkId, physicalAddress); + + if (currentTim.Equals(lastTim)) + { + return; + } + + DataStorage.UpsertTim(interactiveNetworkId, physicalAddress, currentTim); + + LogEvent(SkyscraperContextEvent.Tim, String.Format("Terminal Information Message for participant {0} on network {1}", physicalAddress, interactiveNetworkId)); + foreach(TsDescriptor ts in currentTim.Descriptors) + { + LogEvent(SkyscraperContextEvent.Tim, String.Format(" -> {0}", ts.ToString())); + } + } + } } diff --git a/skyscraper8/Skyscraper/Scraper/Storage/DataStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/DataStorage.cs index d21bea9..ecf7dfa 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/DataStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/DataStorage.cs @@ -153,12 +153,6 @@ namespace skyscraper8.Skyscraper.Scraper.Storage void InsertFctFrame(ushort interactiveNetworkId, Fct.Frame frame); bool TestForSatellitePosition(ushort interactiveNetworkId, Spt.Satellite satellite); void StoreSatellitePosition(ushort interactiveNetworkId, Spt.Satellite satellite); - void CreateTim(PhysicalAddress mac); - bool TestForTim(PhysicalAddress mac); - bool CorrectTim(PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmd); - bool ContentionTim(PhysicalAddress mac, _0xab_ContentionControlDescriptor ccdNew); - bool CorrectionControlTim(PhysicalAddress mac, _0xac_CorrectionControlDescriptor descriptor); - bool NetworkLayerInfoTim(PhysicalAddress mac, _0xa0_NetworkLayerInfoDescriptor nlid, DateTime timestamp); IEnumerable GetDbBlindscanJobs(); bool TestForSgtList(SgtList list); void InsertSgtList(SgtList list); @@ -210,23 +204,9 @@ namespace skyscraper8.Skyscraper.Scraper.Storage bool UpdateRcs2Tdt(ushort interactiveNetworkId, DateTime tdtTimestamp); bool TestForTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode); void InsertTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode); - bool TestForTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext); - void InsertTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext); - bool TestForTimCorrectionMessageExtension(PhysicalAddress macAddress); - void InsertTimCorrectionMessageExtension(PhysicalAddress macAddress, _0xb1_CorrectionMessageExtensionDescriptor descriptor); - bool TestForTimControlAssignment(PhysicalAddress macAddress); - void InsertTimControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor); - bool TestForTimSatelliteReturnLink(PhysicalAddress macAddress); - void InsertTimSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor); - bool TestForLowerLayerService(PhysicalAddress macAddress); - void InsertTimLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor); - bool TestForHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface); - void InsertHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface); - bool TestForTimLogonResponse(PhysicalAddress macAddress); - void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor); - bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath); - void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath); bool TestForRmt(Rmt rmt); void InsertRmt(Rmt rmt); + Tim GetLastTim(ushort interactiveNetworkId, PhysicalAddress physicalAddress); + void UpsertTim(ushort interactiveNetworkId, PhysicalAddress physicalAddress, Tim currentTim); } } diff --git a/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs index 855d56d..fe1e1b0 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs @@ -1216,87 +1216,6 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem throw new NotImplementedException(); } - public bool TestForTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext) - { - throw new NotImplementedException(); - } - - public void InsertTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext) - { - throw new NotImplementedException(); - } - - public bool TestForTimCorrectionMessageExtension(PhysicalAddress macAddress) - { - throw new NotImplementedException(); - } - - public void InsertTimCorrectionMessageExtension(PhysicalAddress macAddress, - _0xb1_CorrectionMessageExtensionDescriptor descriptor) - { - throw new NotImplementedException(); - } - - public bool TestForTimControlAssignment(PhysicalAddress macAddress) - { - throw new NotImplementedException(); - } - - public void InsertTimControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor) - { - throw new NotImplementedException(); - } - - public bool TestForTimSatelliteReturnLink(PhysicalAddress macAddress) - { - throw new NotImplementedException(); - } - - public void InsertTimSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor) - { - throw new NotImplementedException(); - } - - public bool TestForLowerLayerService(PhysicalAddress macAddress) - { - throw new NotImplementedException(); - } - - public void InsertTimLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor) - { - throw new NotImplementedException(); - } - - public bool TestForHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface) - { - throw new NotImplementedException(); - } - - public void InsertHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface) - { - throw new NotImplementedException(); - } - - public bool TestForTimLogonResponse(PhysicalAddress macAddress) - { - throw new NotImplementedException(); - } - - public void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor) - { - throw new NotImplementedException(); - } - - public bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath) - { - throw new NotImplementedException(); - } - - public void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath) - { - throw new NotImplementedException(); - } - public IEnumerable> SelectAllPmt() { throw new NotImplementedException(); @@ -1524,26 +1443,6 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem throw new NotImplementedException(); } - public bool CorrectTim(PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmd) - { - throw new NotImplementedException(); - } - - public bool ContentionTim(PhysicalAddress mac, _0xab_ContentionControlDescriptor ccdNew) - { - throw new NotImplementedException(); - } - - public bool CorrectionControlTim(PhysicalAddress mac, _0xac_CorrectionControlDescriptor descriptor) - { - throw new NotImplementedException(); - } - - public bool NetworkLayerInfoTim(PhysicalAddress mac, _0xa0_NetworkLayerInfoDescriptor nlid, DateTime timestamped) - { - throw new NotImplementedException(); - } - public IEnumerable GetDbBlindscanJobs() { throw new NotImplementedException(); @@ -2018,5 +1917,15 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem { throw new NotImplementedException(); } + + public Tim GetLastTim(ushort interactiveNetworkId, PhysicalAddress physicalAddress) + { + throw new NotImplementedException(); + } + + public void UpsertTim(ushort interactiveNetworkId, PhysicalAddress physicalAddress, Tim currentTim) + { + throw new NotImplementedException(); + } } } diff --git a/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs index 4a11694..2c1bd55 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs @@ -1078,142 +1078,6 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory _tmst2.Add(key, mode); } - private Dictionary, _0xb7_FramePayloadFormatDescriptor.TransmissionContext> _timFramePayloadFormats; - public bool TestForTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext) - { - if (_timFramePayloadFormats == null) - return false; - - Tuple key = new Tuple(networkId, transmissionContext.TransmissionContextId); - return _timFramePayloadFormats.ContainsKey(key); - } - - public void InsertTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext) - { - if (_timFramePayloadFormats == null) - _timFramePayloadFormats = new Dictionary, _0xb7_FramePayloadFormatDescriptor.TransmissionContext>(); - - Tuple key = new Tuple(networkId, transmissionContext.TransmissionContextId); - _timFramePayloadFormats.Add(key, transmissionContext); - } - - private Dictionary _timCorrectionMessageExtensions; - public bool TestForTimCorrectionMessageExtension(PhysicalAddress macAddress) - { - if (_timCorrectionMessageExtensions == null) - return false; - - return _timCorrectionMessageExtensions.ContainsKey(macAddress); - } - - public void InsertTimCorrectionMessageExtension(PhysicalAddress macAddress, - _0xb1_CorrectionMessageExtensionDescriptor descriptor) - { - if (_timCorrectionMessageExtensions == null) - _timCorrectionMessageExtensions = new Dictionary(); - - _timCorrectionMessageExtensions.Add(macAddress, descriptor); - } - - private Dictionary _timControlAssignments; - public bool TestForTimControlAssignment(PhysicalAddress macAddress) - { - if (_timControlAssignments == null) - return false; - - return _timControlAssignments.ContainsKey(macAddress); - } - - public void InsertTimControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor) - { - if (_timControlAssignments == null) - _timControlAssignments = new Dictionary(); - - _timControlAssignments.Add(macAddress, descriptor); - } - - private Dictionary _timSatelliteReturnLinks; - public bool TestForTimSatelliteReturnLink(PhysicalAddress macAddress) - { - if (_timSatelliteReturnLinks == null) - return false; - - return _timSatelliteReturnLinks.ContainsKey(macAddress); - } - - public void InsertTimSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor) - { - if (_timSatelliteReturnLinks == null) - _timSatelliteReturnLinks = new Dictionary(); - - _timSatelliteReturnLinks.Add(macAddress, descriptor); - } - - private Dictionary _timLowerLayerServiceDescriptors; - public bool TestForLowerLayerService(PhysicalAddress macAddress) - { - if (_timLowerLayerServiceDescriptors == null) - return false; - - return _timLowerLayerServiceDescriptors.ContainsKey(macAddress); - } - - public void InsertTimLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor) - { - if (_timLowerLayerServiceDescriptors == null) - _timLowerLayerServiceDescriptors = new Dictionary(); - - _timLowerLayerServiceDescriptors.Add(macAddress, descriptor); - } - - private HashSet> layer2interfaces; - public bool TestForHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface) - { - if (layer2interfaces == null) - return false; - - return layer2interfaces.Contains(new Tuple(macAddress, layer2Interface)); - } - - public void InsertHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface) - { - layer2interfaces.Add(new Tuple(macAddress, layer2Interface)); - } - - private Dictionary _logonResponseDescriptors; - public bool TestForTimLogonResponse(PhysicalAddress macAddress) - { - if (_logonResponseDescriptors == null) - return false; - - return _logonResponseDescriptors.ContainsKey(macAddress); - } - - public void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor) - { - if (_logonResponseDescriptors == null) - _logonResponseDescriptors = new Dictionary(); - - _logonResponseDescriptors.Add(macAddress, descriptor); - } - - private HashSet> _forwardInteractionPaths; - public bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath) - { - if (_forwardInteractionPaths == null) - return false; - - return _forwardInteractionPaths.Contains(new Tuple(macAddress, forwardInteractionPath)); - } - - public void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath) - { - if (_forwardInteractionPaths == null) - _forwardInteractionPaths = new HashSet>(); - - _forwardInteractionPaths.Add(new Tuple(macAddress, forwardInteractionPath)); - } - public IEnumerable> SelectAllPmt() { for (int x = 0; x < pmtEntries.Length; x++) @@ -1553,78 +1417,6 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory _sptSatellites[interactiveNetworkId].Add(satellite); } - class TimContainer - { - public _0xab_ContentionControlDescriptor ContentionControl { get; set; } - public _0xac_CorrectionControlDescriptor CorrectionControl { get; set; } - public DateTime NetworkLayerInfoTimestamp { get; set; } - public _0xa0_NetworkLayerInfoDescriptor NetworkLayerInfoDescriptor { get; set; } - } - - private Dictionary _timContainers; - - public bool TestForTim(PhysicalAddress mac) - { - if (_timContainers == null) - return false; - - return _timContainers.ContainsKey(mac); - } - - public void CreateTim(PhysicalAddress mac) - { - if (_timContainers == null) - _timContainers = new Dictionary(); - - _timContainers.Add(mac, new TimContainer()); - } - - private HashSet> _timCorrections; - public bool CorrectTim(PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmd) - { - if (_timCorrections == null) - _timCorrections = new HashSet>(); - - Tuple child = new Tuple(mac, cmd); - return _timCorrections.Add(child); - } - - public bool ContentionTim(PhysicalAddress mac, _0xab_ContentionControlDescriptor ccdNew) - { - TimContainer container = _timContainers[mac]; - if (container.ContentionControl == null) - { - container.ContentionControl = ccdNew; - return true; - } - - return false; - } - - public bool CorrectionControlTim(PhysicalAddress mac, _0xac_CorrectionControlDescriptor descriptor) - { - TimContainer container = _timContainers[mac]; - if (container.CorrectionControl == null) - { - container.CorrectionControl = descriptor; - return true; - } - return false; - } - - public bool NetworkLayerInfoTim(PhysicalAddress mac, _0xa0_NetworkLayerInfoDescriptor nlid, - DateTime timestamped) - { - TimContainer container = _timContainers[mac]; - if (container.NetworkLayerInfoTimestamp < timestamped) - { - container.NetworkLayerInfoTimestamp = timestamped; - container.NetworkLayerInfoDescriptor = nlid; - return true; - } - return false; - } - public IEnumerable GetDbBlindscanJobs() { throw new NotImplementedException(); @@ -2113,5 +1905,27 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory rmts = new Rmt[ushort.MaxValue]; rmts[ushort.MaxValue] = rmt; } + + private Dictionary, Tim> tims; + public Tim GetLastTim(ushort interactiveNetworkId, PhysicalAddress physicalAddress) + { + if (tims == null) + return null; + + Tuple key = new Tuple(interactiveNetworkId, physicalAddress); + if (!tims.ContainsKey(key)) + return null; + + return tims[key]; + } + + public void UpsertTim(ushort interactiveNetworkId, PhysicalAddress physicalAddress, Tim currentTim) + { + if (tims == null) + tims = new Dictionary, Tim>(); + + Tuple key = new Tuple(interactiveNetworkId, physicalAddress); + tims[key] = currentTim; + } } } diff --git a/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/InteractionChannelContestant.cs b/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/InteractionChannelContestant.cs index ddff843..5ab3756 100644 --- a/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/InteractionChannelContestant.cs +++ b/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/InteractionChannelContestant.cs @@ -51,16 +51,6 @@ namespace skyscraper5.src.Skyscraper.Scraper.StreamAutodetection.Contestants throw new NotImplementedException(); } - public void OnContentionControl(PhysicalAddress macAddress, _0xab_ContentionControlDescriptor descriptor) - { - Score++; - } - - public void OnCorrectionControl(PhysicalAddress macAddress, _0xac_CorrectionControlDescriptor descriptor) - { - Score++; - } - public void OnCorrectionMessage(ushort interactiveNetworkId, Cmt cmt) { if (cmt.Entries.Length > 0) @@ -69,11 +59,6 @@ namespace skyscraper5.src.Skyscraper.Scraper.StreamAutodetection.Contestants } } - public void OnCorrectionMessage(PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmd) - { - Score++; - } - public void OnFrameComposition(ushort interactiveNetworkId, Fct fct) { if (fct.Frames.Length > 0) @@ -87,11 +72,6 @@ namespace skyscraper5.src.Skyscraper.Scraper.StreamAutodetection.Contestants Score--; } - public void OnNetworkLayerInfo(PhysicalAddress macAddress, _0xa0_NetworkLayerInfoDescriptor descriptor) - { - Score++; - } - public void OnRcsMap(Rmt rmt) { if (rmt.Linkages != null) @@ -175,19 +155,6 @@ namespace skyscraper5.src.Skyscraper.Scraper.StreamAutodetection.Contestants } } - public void OnReturnTransmissionMOdes(PhysicalAddress macAddress, _0xb2_ReturnTransmissionModesDescriptor descriptor) - { - if (descriptor.Superframes.Length > 0) - { - Score++; - } - } - - public void OnConnectionControl(PhysicalAddress macAddress, _0xaf_ConnectionControlDescriptor descriptor) - { - Score++; - } - public void OnTerminalBurstTimePlan2(ushort interactiveNetworkId, Tbtp2 tbtp2) { if (tbtp2.Frames.Length > 0) @@ -230,56 +197,6 @@ namespace skyscraper5.src.Skyscraper.Scraper.StreamAutodetection.Contestants } } - public void OnFramePayloadFormatAnnouncement(ushort networkId, _0xb7_FramePayloadFormatDescriptor descriptor) - { - if (descriptor.Contexts.Length > 0) - Score++; - } - - public void OnCorrectionMessageExtension(PhysicalAddress macAddress, _0xb1_CorrectionMessageExtensionDescriptor descriptor) - { - //TODO: put some sensible validation logic in here. - } - - public void OnControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor) - { - //TODO: put some sensible validation logic in here - } - - public void OnSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor) - { - //TODO: put some sensible validation logic in here - } - - public void OnLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor) - { - if (descriptor.LowerLayerServices.Length > 0) - { - Score++; - } - } - - public void OnHigherLayerInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor descriptor) - { - if (descriptor.Layer2Interfaces.Length > 0) - { - Score++; - } - } - - public void LogonResponseDescriptor(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor) - { - //TODO: put some sensible validation logic in here. - } - - public void OnForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor descriptor) - { - if (descriptor.Paths.Count > 0) - { - Score++; - } - } - public void OnFrameComposition2(ushort? networkId, Fct2 fct2) { if (fct2.FrameTypes.Length > 0) @@ -287,5 +204,29 @@ namespace skyscraper5.src.Skyscraper.Scraper.StreamAutodetection.Contestants Score++; } } + + public void OnTerminalInformationMessage(ushort interactiveNetworkId, PhysicalAddress physicalAddress, Tim tim) + { + foreach(TsDescriptor tsDescriptor in tim.Descriptors) + { + bool valid = false; + try + { + valid = tsDescriptor.Valid; + } + catch (InvalidOperationException ioe) + { + continue; + } + if (!valid) + { + Score--; + } + } + if (tim.Descriptors.Length > 0) + { + Score++; + } + } } }