Class: Cosmos::CcsdsTransferFrames::CcsdsTransferFrameProtocol

Inherits:
Protocol
  • Object
show all
Defined in:
lib/cosmos/ccsds_transfer_frames/ccsds_transfer_frame_protocol.rb

Overview

Given a stream of ccsds transfer frames, extract ccsds space packets based on the first header pointer and packet lengths.

Only read is supported.

Defined Under Namespace

Classes: VirtualChannel

Constant Summary collapse

FRAME_PRIMARY_HEADER_LENGTH =
6
FIRST_HEADER_POINTER_OFFSET =
4
FIRST_HEADER_POINTER_MASK =

last 11 bits

[0b00000111, 0b11111111]
IDLE_FRAME_FIRST_HEADER_POINTER =
0b11111111110
NO_PACKET_START_FIRST_HEADER_POINTER =
0b11111111111
FRAME_VIRTUAL_CHANNEL_BIT_OFFSET =
12
FRAME_VIRTUAL_CHANNEL_BITS =
3
VIRTUAL_CHANNEL_COUNT =
8
FRAME_OPERATIONAL_CONTROL_FIELD_LENGTH =
4
FRAME_ERROR_CONTROL_FIELD_LENGTH =
2
SPACE_PACKET_HEADER_LENGTH =
6
SPACE_PACKET_LENGTH_BIT_OFFSET =
4 * 8
SPACE_PACKET_LENGTH_BITS =
2 * 8
SPACE_PACKET_APID_BITS =
14
SPACE_PACKET_APID_BIT_OFFSET =
2 * 8 - SPACE_PACKET_APID_BITS
IDLE_PACKET_APID =
0b11111111111111

Instance Method Summary collapse

Constructor Details

#initialize(transfer_frame_length, transfer_frame_secondary_header_length, transfer_frame_has_operational_control_field, transfer_frame_has_frame_error_control_field, prefix_packets = false, include_idle_packets = false, allow_empty_data = nil) ⇒ CcsdsTransferFrameProtocol

Returns a new instance of CcsdsTransferFrameProtocol.

Parameters:

  • transfer_frame_length (Integer)

    Length of transfer frame in bytes

  • transfer_frame_secondary_header_length (Integer)

    Length of transfer frame secondary header in bytes

  • transfer_frame_has_operational_control_field (Boolean)

    Flag indicating if the transfer frame operational control field is present or not

  • transfer_frame_has_frame_error_control_field (Boolean)

    Flag indicating if the transfer frame error control field is present or not

  • prefix_packets (Boolean) (defaults to: false)

    Flag indicating if each space packet should be prefixed with the transfer frame headers from the frame where it started.

  • include_idle_packets (Boolean) (defaults to: false)

    Flag indicating if idle packets should be included or discarded.

  • allow_empty_data (true/false/nil) (defaults to: nil)

    See Protocol#initialize



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/cosmos/ccsds_transfer_frames/ccsds_transfer_frame_protocol.rb', line 64

def initialize(
  transfer_frame_length,
  transfer_frame_secondary_header_length,
  transfer_frame_has_operational_control_field,
  transfer_frame_has_frame_error_control_field,
  prefix_packets = false,
  include_idle_packets = false,
  allow_empty_data = nil)
  super(allow_empty_data)

  @frame_length = Integer(transfer_frame_length)

  @frame_headers_length = FRAME_PRIMARY_HEADER_LENGTH + Integer(transfer_frame_secondary_header_length)

  @frame_trailer_length = 0
  has_ocf = ConfigParser.handle_true_false(transfer_frame_has_operational_control_field)
  @frame_trailer_length += FRAME_OPERATIONAL_CONTROL_FIELD_LENGTH if has_ocf
  has_fecf = ConfigParser.handle_true_false(transfer_frame_has_frame_error_control_field)
  @frame_trailer_length += FRAME_ERROR_CONTROL_FIELD_LENGTH if has_fecf

  @frame_data_field_length = @frame_length - @frame_headers_length - @frame_trailer_length

  @packet_prefix_length = 0
  @prefix_packets = ConfigParser.handle_true_false(prefix_packets)
  @packet_prefix_length += @frame_headers_length if @prefix_packets

  @include_idle_packets = ConfigParser.handle_true_false(include_idle_packets)
end

Instance Method Details

#read_data(data) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/cosmos/ccsds_transfer_frames/ccsds_transfer_frame_protocol.rb', line 99

def read_data(data)
  @data << data

  if (@data.length >= @frame_length)
    frame = @data.slice!(0, @frame_length)
    process_frame(frame)
  end

  packet_data = get_packet()

  # Potentially allow blank string to be sent to other protocols if no
  # packet is ready in this one
  if (Symbol === packet_data && packet_data == :STOP && data.length <= 0)
    return super(data)
  end

  return packet_data
end

#resetObject



93
94
95
96
97
# File 'lib/cosmos/ccsds_transfer_frames/ccsds_transfer_frame_protocol.rb', line 93

def reset
  super()
  @data = ''
  @virtual_channels = Array.new(VIRTUAL_CHANNEL_COUNT) { VirtualChannel.new }
end