@@ -16,7 +16,7 @@ type PrimaryHeader struct {
1616 MCFrameCount uint8 // 8 bits (16-23) - Master Channel Frame Count
1717 VCFrameCount uint8 // 8 bits (24-31) - Virtual Channel Frame Count
1818 FSHFlag bool // 1 bit (32) - Frame Secondary Header Flag
19- SyncFlag bool // 1 bit (33) - Synchronization Flag (Always 0 for TM)
19+ SyncFlag bool // 1 bit (33) - Synchronization Flag
2020 PacketOrderFlag bool // 1 bit (34) - Packet Order Flag
2121 SegmentLengthID uint8 // 2 bits (35-36) - Segment Length Identifier
2222 FirstHeaderPtr uint16 // 11 bits (37-47) - First Header Pointer
@@ -78,48 +78,53 @@ func (h *PrimaryHeader) Decode(data []byte) (*PrimaryHeader, error) {
7878 }
7979
8080 // Extract fields
81- version := (data [0 ] >> 6 ) & 0x03
82- scid := (uint16 (data [0 ]& 0x3F ) << 4 ) | uint16 (data [1 ]>> 4 )
83- vcid := (data [1 ] >> 1 ) & 0x07
84- ocfFlag := (data [1 ] & 1 ) != 0
85- mcfc := data [2 ]
86- vcfc := data [3 ]
87- flags := data [4 ]
88- fshFlag := (flags & (1 << 7 )) != 0
89- syncFlag := (flags & (1 << 6 )) != 0
90- packetOrderFlag := (flags & (1 << 5 )) != 0
91- segmentLengthID := (flags >> 3 ) & 0x03
92- firstHeaderPtr := (uint16 (flags & 0x07 ) << 8 ) | uint16 (data [5 ])
93-
94- return & PrimaryHeader {
95- VersionNumber : version ,
96- SpacecraftID : scid ,
97- VirtualChannelID : vcid ,
98- OCFFlag : ocfFlag ,
99- MCFrameCount : mcfc ,
100- VCFrameCount : vcfc ,
101- FSHFlag : fshFlag ,
102- SyncFlag : syncFlag ,
103- PacketOrderFlag : packetOrderFlag ,
104- SegmentLengthID : segmentLengthID ,
105- FirstHeaderPtr : firstHeaderPtr ,
106- }, nil
81+ header := & PrimaryHeader {
82+ VersionNumber : (data [0 ] >> 6 ) & 0x03 ,
83+ SpacecraftID : (uint16 (data [0 ]& 0x3F ) << 4 ) | uint16 (data [1 ]>> 4 ),
84+ VirtualChannelID : (data [1 ] >> 1 ) & 0x07 ,
85+ OCFFlag : (data [1 ] & 1 ) != 0 ,
86+ MCFrameCount : data [2 ],
87+ VCFrameCount : data [3 ],
88+ FSHFlag : (data [4 ] & (1 << 7 )) != 0 ,
89+ SyncFlag : (data [4 ] & (1 << 6 )) != 0 ,
90+ PacketOrderFlag : (data [4 ] & (1 << 5 )) != 0 ,
91+ SegmentLengthID : (data [4 ] >> 3 ) & 0x03 ,
92+ FirstHeaderPtr : (uint16 (data [4 ]& 0x07 ) << 8 ) | uint16 (data [5 ]),
93+ }
94+
95+ if err := header .Validate (); err != nil {
96+ return nil , err
97+ }
98+
99+ return header , nil
107100}
108101
109102// Validate checks if the header values are within valid ranges.
110103func (h * PrimaryHeader ) Validate () error {
111104 if h .VersionNumber > 0b11 {
112105 return errors .New ("invalid VersionNumber: must be in range 0-3 (2 bits)" )
113106 }
107+ if h .VersionNumber != 0 {
108+ return errors .New ("invalid VersionNumber: must be 0 for TM Transfer Frame" )
109+ }
114110 if h .SpacecraftID > 0x03FF {
115111 return errors .New ("invalid SpacecraftID: must be in range 0-1023 (10 bits)" )
116112 }
117113 if h .VirtualChannelID > 0x07 {
118114 return errors .New ("invalid VirtualChannelID: must be in range 0-7 (3 bits)" )
119115 }
116+ if ! h .SyncFlag && h .PacketOrderFlag {
117+ return errors .New ("invalid PacketOrderFlag: must be 0 when SyncFlag is 0" )
118+ }
119+ if ! h .SyncFlag && h .SegmentLengthID != 0b11 {
120+ return errors .New ("invalid SegmentLengthID: must be 3 (0b11) when SyncFlag is 0" )
121+ }
120122 if h .SegmentLengthID > 0x03 {
121123 return errors .New ("invalid SegmentLengthID: must be in range 0-3 (2 bits)" )
122124 }
125+ if h .SyncFlag && h .FirstHeaderPtr != 0xFFFF {
126+ return errors .New ("invalid FirstHeaderPtr: must be 0xFFFF when SyncFlag is 1" )
127+ }
123128 return nil
124129}
125130
0 commit comments