Method: OpenC3::Structure#define

Defined in:
lib/openc3/packets/structure.rb

#define(item) ⇒ StrutureItem

Adds the given item to the items hash. It also resizes the buffer to accomodate the new item.

Parameters:

Returns:

  • (StrutureItem)

    The struture item defined



217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
# File 'lib/openc3/packets/structure.rb', line 217

def define(item)
  # Handle Overwriting Existing Item
  if @items[item.name]
    item_index = nil
    @sorted_items.each_with_index do |sorted_item, index|
      if sorted_item.name == item.name
        item_index = index
        break
      end
    end
    @sorted_items.delete_at(item_index) if item_index < @sorted_items.length
  end

  # Add to Sorted Items
  unless @sorted_items.empty?
    last_item = @sorted_items[-1]
    @sorted_items << item
    # If the current item or last item have a negative offset then we have
    # to re-sort. We also re-sort if the current item is less than the last
    # item because we are inserting.
    if last_item.bit_offset <= 0 or item.bit_offset <= 0 or item.bit_offset < last_item.bit_offset
      @sorted_items = @sorted_items.sort
    end
  else
    @sorted_items << item
  end

  # Add to the overall hash of defined items
  @items[item.name] = item
  # Update fixed size knowledge
  @fixed_size = false if (item.data_type != :DERIVED and item.bit_size <= 0) or (item.array_size and item.array_size <= 0)

  # Recalculate the overall defined length of the structure
  update_needed = false
  if item.bit_offset >= 0
    if item.bit_size > 0
      if item.array_size
        if item.array_size >= 0
          item_defined_length_bits = item.bit_offset + item.array_size
        else
          item_defined_length_bits = item.bit_offset
        end
      else
        item_defined_length_bits = item.bit_offset + item.bit_size
      end
      if item_defined_length_bits > @pos_bit_size
        @pos_bit_size = item_defined_length_bits
        update_needed = true
      end
    else
      if item.bit_offset > @pos_bit_size
        @pos_bit_size = item.bit_offset
        update_needed = true
      end
    end
  else
    if item.bit_offset.abs > @neg_bit_size
      @neg_bit_size = item.bit_offset.abs
      update_needed = true
    end
  end
  if update_needed
    @defined_length_bits = @pos_bit_size + @neg_bit_size
    @defined_length = @defined_length_bits / 8
    @defined_length += 1 if @defined_length_bits % 8 != 0
  end

  # Resize the buffer if necessary
  resize_buffer() if @buffer

  return item
end