openc3 5.12.0 → 5.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of openc3 might be problematic. Click here for more details.

Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -3
  3. data/bin/openc3cli +21 -18
  4. data/data/config/command_modifiers.yaml +53 -1
  5. data/data/config/graph_settings.yaml +1 -1
  6. data/data/config/item_modifiers.yaml +1 -2
  7. data/data/config/parameter_modifiers.yaml +13 -14
  8. data/data/config/screen.yaml +1 -2
  9. data/data/config/target_config.yaml +2 -6
  10. data/lib/openc3/accessors/accessor.rb +42 -29
  11. data/lib/openc3/accessors/binary_accessor.rb +11 -1
  12. data/lib/openc3/accessors/form_accessor.rb +11 -1
  13. data/lib/openc3/accessors/http_accessor.rb +38 -0
  14. data/lib/openc3/accessors/json_accessor.rb +15 -3
  15. data/lib/openc3/accessors/template_accessor.rb +150 -0
  16. data/lib/openc3/accessors/xml_accessor.rb +11 -1
  17. data/lib/openc3/accessors.rb +1 -0
  18. data/lib/openc3/api/cmd_api.rb +99 -35
  19. data/lib/openc3/api/limits_api.rb +3 -3
  20. data/lib/openc3/api/tlm_api.rb +70 -31
  21. data/lib/openc3/interfaces/interface.rb +9 -7
  22. data/lib/openc3/interfaces/mqtt_interface.rb +11 -9
  23. data/lib/openc3/interfaces/mqtt_stream_interface.rb +78 -0
  24. data/lib/openc3/interfaces/protocols/cmd_response_protocol.rb +116 -0
  25. data/lib/openc3/interfaces/tcpip_client_interface.rb +4 -0
  26. data/lib/openc3/interfaces/tcpip_server_interface.rb +5 -0
  27. data/lib/openc3/interfaces.rb +1 -1
  28. data/lib/openc3/logs/packet_log_reader.rb +2 -2
  29. data/lib/openc3/logs/text_log_writer.rb +3 -2
  30. data/lib/openc3/microservices/decom_microservice.rb +1 -0
  31. data/lib/openc3/microservices/interface_microservice.rb +10 -1
  32. data/lib/openc3/microservices/trigger_group_microservice.rb +2 -1
  33. data/lib/openc3/models/cvt_model.rb +16 -12
  34. data/lib/openc3/models/gem_model.rb +20 -3
  35. data/lib/openc3/models/microservice_model.rb +1 -1
  36. data/lib/openc3/models/plugin_model.rb +43 -5
  37. data/lib/openc3/models/target_model.rb +69 -8
  38. data/lib/openc3/packets/json_packet.rb +46 -15
  39. data/lib/openc3/packets/packet.rb +92 -4
  40. data/lib/openc3/packets/packet_config.rb +27 -2
  41. data/lib/openc3/packets/parsers/xtce_parser.rb +5 -1
  42. data/lib/openc3/script/api_shared.rb +42 -31
  43. data/lib/openc3/script/commands.rb +18 -12
  44. data/lib/openc3/script/limits.rb +1 -1
  45. data/lib/openc3/script/script.rb +6 -12
  46. data/lib/openc3/script/storage.rb +4 -4
  47. data/lib/openc3/script/web_socket_api.rb +2 -2
  48. data/lib/openc3/streams/mqtt_stream.rb +109 -0
  49. data/lib/openc3/streams/tcpip_socket_stream.rb +19 -0
  50. data/lib/openc3/system/system.rb +13 -1
  51. data/lib/openc3/utilities/cli_generator.rb +48 -21
  52. data/lib/openc3/utilities/local_mode.rb +3 -3
  53. data/lib/openc3/utilities/logger.rb +17 -16
  54. data/lib/openc3/utilities/process_manager.rb +1 -1
  55. data/lib/openc3/utilities/store_queued.rb +126 -0
  56. data/lib/openc3/version.rb +5 -5
  57. data/templates/conversion/conversion.py +28 -0
  58. data/templates/conversion/conversion.rb +1 -18
  59. data/templates/limits_response/response.py +37 -0
  60. data/templates/limits_response/response.rb +0 -17
  61. data/templates/microservice/microservices/TEMPLATE/microservice.py +54 -0
  62. data/templates/microservice/microservices/TEMPLATE/microservice.rb +0 -7
  63. data/templates/plugin/.gitignore +1 -0
  64. data/templates/plugin/plugin.gemspec +2 -2
  65. data/templates/target/targets/TARGET/lib/target.py +9 -0
  66. data/templates/target/targets/TARGET/procedures/procedure.py +3 -0
  67. data/templates/target/targets/TARGET/public/README.txt +1 -0
  68. data/templates/tool_angular/package.json +21 -20
  69. data/templates/tool_angular/yarn.lock +2287 -3171
  70. data/templates/tool_react/package.json +15 -15
  71. data/templates/tool_react/yarn.lock +716 -789
  72. data/templates/tool_svelte/package.json +16 -15
  73. data/templates/tool_svelte/src/services/openc3-api.js +17 -22
  74. data/templates/tool_svelte/yarn.lock +715 -620
  75. data/templates/tool_vue/package.json +16 -15
  76. data/templates/tool_vue/yarn.lock +149 -69
  77. data/templates/widget/package.json +15 -14
  78. data/templates/widget/yarn.lock +132 -63
  79. metadata +160 -148
  80. data/lib/openc3/io/openc3_snmp.rb +0 -61
@@ -742,7 +742,7 @@ module OpenC3
742
742
  end
743
743
  end
744
744
 
745
- def update_store(system)
745
+ def update_target_model(system)
746
746
  target = system.targets[@name]
747
747
 
748
748
  # Add in the information from the target and update
@@ -754,10 +754,11 @@ module OpenC3
754
754
  @tlm_unique_id_mode = target.tlm_unique_id_mode
755
755
  @limits_groups = system.limits.groups.keys
756
756
  update()
757
+ end
757
758
 
758
- # Store Packet Definitions
759
- system.telemetry.all.each do |target_name, packets|
760
- Store.del("#{@scope}__openc3tlm__#{target_name}")
759
+ def update_store_telemetry(packet_hash, clear_old: true)
760
+ packet_hash.each do |target_name, packets|
761
+ Store.del("#{@scope}__openc3tlm__#{target_name}") if clear_old
761
762
  packets.each do |packet_name, packet|
762
763
  Logger.info "Configuring tlm packet: #{target_name} #{packet_name}"
763
764
  begin
@@ -773,8 +774,11 @@ module OpenC3
773
774
  CvtModel.set(json_hash, target_name: packet.target_name, packet_name: packet.packet_name, scope: @scope)
774
775
  end
775
776
  end
776
- system.commands.all.each do |target_name, packets|
777
- Store.del("#{@scope}__openc3cmd__#{target_name}")
777
+ end
778
+
779
+ def update_store_commands(packet_hash, clear_old: true)
780
+ packet_hash.each do |target_name, packets|
781
+ Store.del("#{@scope}__openc3cmd__#{target_name}") if clear_old
778
782
  packets.each do |packet_name, packet|
779
783
  Logger.info "Configuring cmd packet: #{target_name} #{packet_name}"
780
784
  begin
@@ -785,7 +789,9 @@ module OpenC3
785
789
  end
786
790
  end
787
791
  end
788
- # Store Limits Groups
792
+ end
793
+
794
+ def update_store_limits_groups(system)
789
795
  system.limits.groups.each do |group, items|
790
796
  begin
791
797
  Store.hset("#{@scope}__limits_groups", group, JSON.generate(items))
@@ -794,23 +800,77 @@ module OpenC3
794
800
  raise err
795
801
  end
796
802
  end
797
- # Merge in Limits Sets
803
+ end
804
+
805
+ def update_store_limits_sets(system)
798
806
  sets = Store.hgetall("#{@scope}__limits_sets")
799
807
  sets ||= {}
800
808
  system.limits.sets.each do |set|
801
809
  sets[set.to_s] = "false" unless sets.key?(set.to_s)
802
810
  end
803
811
  Store.hmset("#{@scope}__limits_sets", *sets)
812
+ end
804
813
 
814
+ def update_store_item_map
805
815
  # Create item_map
806
816
  item_map_key = "#{@scope}__#{@name}__item_to_packet_map"
807
817
  item_map = self.class.build_item_to_packet_map(@name, scope: @scope)
808
818
  Store.set(item_map_key, JSON.generate(item_map, :allow_nan => true))
809
819
  @@item_map_cache[@name] = [Time.now, item_map]
820
+ end
810
821
 
822
+ def update_store(system, clear_old: true)
823
+ update_target_model(system)
824
+ update_store_telemetry(system.telemetry.all, clear_old: clear_old)
825
+ update_store_commands(system.commands.all, clear_old: clear_old)
826
+ update_store_limits_groups(system)
827
+ update_store_limits_sets(system)
828
+ update_store_item_map()
811
829
  return system
812
830
  end
813
831
 
832
+ def dynamic_update(packets, cmd_or_tlm = :TELEMETRY, filename = "dynamic_tlm.txt")
833
+ # Build hash of targets/packets
834
+ packet_hash = {}
835
+ packets.each do |packet|
836
+ target_name = packet.target_name.upcase
837
+ packet_hash[target_name] ||= {}
838
+ packet_name = packet.packet_name.upcase
839
+ packet_hash[target_name][packet_name] = packet
840
+ end
841
+
842
+ # Update Redis
843
+ if cmd_or_tlm == :TELEMETRY
844
+ update_store_telemetry(packet_hash, clear_old: false)
845
+ update_store_item_map()
846
+ else
847
+ update_store_commands(packet_hash, clear_old: false)
848
+ end
849
+
850
+ # Build dynamic file for cmd_tlm
851
+ configs = {}
852
+ packets.each do |packet|
853
+ target_name = packet.target_name.upcase
854
+ configs[target_name] ||= ""
855
+ config = configs[target_name]
856
+ config << packet.to_config(cmd_or_tlm)
857
+ config << "\n"
858
+ end
859
+ configs.each do |target_name, config|
860
+ begin
861
+ bucket_key = "#{@scope}/targets_modified/#{target_name}/cmd_tlm/#{filename}"
862
+ client = Bucket.getClient()
863
+ client.put_object(
864
+ # Use targets_modified to save modifications
865
+ # This keeps the original target clean (read-only)
866
+ bucket: ENV['OPENC3_CONFIG_BUCKET'],
867
+ key: bucket_key,
868
+ body: config
869
+ )
870
+ end
871
+ end
872
+ end
873
+
814
874
  def deploy_commmandlog_microservice(gem_path, variables, topics, instance = nil, parent = nil)
815
875
  microservice_name = "#{@scope}__COMMANDLOG#{instance}__#{@name}"
816
876
  microservice = MicroserviceModel.new(
@@ -990,6 +1050,7 @@ module OpenC3
990
1050
  cmd: ["ruby", "multi_microservice.rb", *@children],
991
1051
  work_dir: '/openc3/lib/openc3/microservices',
992
1052
  plugin: @plugin,
1053
+ needs_dependencies: @needs_dependencies,
993
1054
  scope: @scope
994
1055
  )
995
1056
  microservice.create
@@ -65,66 +65,97 @@ module OpenC3
65
65
  # @param name [String] Name of the item to read - Should already by upcase
66
66
  # @param value_type (see #read_item)
67
67
  def read(name, value_type = :CONVERTED, reduced_type = nil)
68
+ value = nil
69
+ array_index = nil
70
+ if name[-1] == ']'
71
+ open_bracket_index = name.index('[')
72
+ if open_bracket_index
73
+ array_index = name[(open_bracket_index + 1)..-2].to_i
74
+ name = name[0..(open_bracket_index - 1)]
75
+ end
76
+ end
68
77
  if reduced_type
69
78
  raise "Reduced types only support RAW or CONVERTED value types: #{value_type} unsupported" if value_type == :WITH_UNITS or value_type == :FORMATTED
70
79
  if value_type == :CONVERTED
71
80
  case reduced_type
72
81
  when :AVG
73
82
  value = @json_hash["#{name}__CA"]
74
- return value if value
75
83
  when :STDDEV
76
84
  value = @json_hash["#{name}__CS"]
77
- return value if value
78
85
  when :MIN
79
86
  value = @json_hash["#{name}__CN"]
80
- return value if value
81
87
  when :MAX
82
88
  value = @json_hash["#{name}__CX"]
83
- return value if value
89
+ end
90
+ if value
91
+ value = value[array_index] if array_index
92
+ return value
84
93
  end
85
94
  end
86
95
  case reduced_type
87
96
  when :AVG
88
97
  value = @json_hash["#{name}__A"]
89
- return value if value
90
98
  when :STDDEV
91
99
  value = @json_hash["#{name}__S"]
92
- return value if value
93
100
  when :MIN
94
101
  value = @json_hash["#{name}__N"]
95
- return value if value
96
102
  when :MAX
97
103
  value = @json_hash["#{name}__X"]
98
- return value if value
104
+ end
105
+ if value
106
+ value = value[array_index] if array_index
107
+ return value
99
108
  end
100
109
  end
101
110
  if value_type == :WITH_UNITS
102
111
  value = @json_hash["#{name}__U"]
103
- return value if value
112
+ if value
113
+ value = value[array_index] if array_index
114
+ return value
115
+ end
104
116
  end
105
117
  if value_type == :WITH_UNITS or value_type == :FORMATTED
106
118
  value = @json_hash["#{name}__F"]
107
- return value if value
119
+ if value
120
+ value = value[array_index] if array_index
121
+ return value
122
+ end
108
123
 
109
124
  value = @json_hash["#{name}__C"]
110
- return value.to_s if value
125
+ if value
126
+ value = value[array_index] if array_index
127
+ return value.to_s
128
+ end
111
129
 
112
130
  value = @json_hash[name]
113
- return value.to_s if value
131
+ if value
132
+ value = value[array_index] if array_index
133
+ return value.to_s
134
+ end
114
135
 
115
136
  return nil
116
137
  end
117
138
  if value_type == :CONVERTED
118
139
  value = @json_hash["#{name}__C"]
119
- return value if value
140
+ if value
141
+ value = value[array_index] if array_index
142
+ return value
143
+ end
120
144
  end
121
- return @json_hash[name]
145
+ value = @json_hash[name]
146
+ if value
147
+ value = value[array_index] if array_index
148
+ return value
149
+ end
150
+ return nil
122
151
  end
123
152
 
124
153
  def read_with_limits_state(name, value_type = :CONVERTED, reduced_type = nil)
125
154
  value = read(name, value_type, reduced_type)
126
155
  limits_state = @json_hash["#{name}__L"]
127
- limits_state.intern if limits_state
156
+ if limits_state
157
+ limits_state = limits_state.intern
158
+ end
128
159
  return [value, limits_state]
129
160
  end
130
161
 
@@ -89,6 +89,18 @@ module OpenC3
89
89
  # @return [String] Base data for building packet
90
90
  attr_reader :template
91
91
 
92
+ # @return [Array<Target Name, Packet Name>] Related response packet
93
+ attr_accessor :response
94
+
95
+ # @return [Array<Target Name, Packet Name>] Related error response packet
96
+ attr_accessor :error_response
97
+
98
+ # @return [Array<Target Name, Screen Name>] Related telemetry screen
99
+ attr_accessor :screen
100
+
101
+ # @return [Array<Array<Target Name, Packet Name, Item Name>>] Related items
102
+ attr_accessor :related_items
103
+
92
104
  # Valid format types
93
105
  VALUE_TYPES = [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS]
94
106
 
@@ -297,6 +309,10 @@ module OpenC3
297
309
  @config_name
298
310
  end
299
311
 
312
+ def clear_config_name
313
+ @config_name = nil
314
+ end
315
+
300
316
  # (see Structure#buffer=)
301
317
  def buffer=(buffer)
302
318
  synchronize() do
@@ -306,7 +322,6 @@ module OpenC3
306
322
  Logger.instance.error "#{@target_name} #{@packet_name} received with actual packet length of #{buffer.length} but defined length of #{@defined_length}"
307
323
  end
308
324
  @read_conversion_cache.clear if @read_conversion_cache
309
- process()
310
325
  end
311
326
  end
312
327
 
@@ -861,6 +876,33 @@ module OpenC3
861
876
  item.description = 'OpenC3 packet received count'
862
877
  end
863
878
 
879
+ # Reset the packet to just derived items
880
+ def clear_all_non_derived_items
881
+ @defined_length = 0
882
+ @defined_length_bits = 0
883
+ @pos_bit_size = 0
884
+ @neg_bit_size = 0
885
+ @fixed_size = true
886
+ @short_buffer_allowed = false
887
+ @id_items = nil
888
+ @limits_items = nil
889
+ new_items = {}
890
+ new_sorted_items = []
891
+ @items.each do |name, item|
892
+ if item.data_type == :DERIVED
893
+ new_items[name] = item
894
+ end
895
+ end
896
+ @sorted_items.each do |item|
897
+ if item.data_type == :DERIVED
898
+ new_sorted_items << item
899
+ end
900
+ end
901
+ @items = new_items
902
+ @sorted_items = new_sorted_items
903
+ clear_config_name()
904
+ end
905
+
864
906
  # Enable limits on an item by name
865
907
  #
866
908
  # @param name [String] Name of the item to enable limits
@@ -1008,6 +1050,13 @@ module OpenC3
1008
1050
  else
1009
1051
  config << "COMMAND #{@target_name.to_s.quote_if_necessary} #{@packet_name.to_s.quote_if_necessary} #{@default_endianness} \"#{@description}\"\n"
1010
1052
  end
1053
+ if @accessor.class.to_s != 'OpenC3::BinaryAccessor'
1054
+ config << " ACCESSOR #{@accessor.class.to_s} #{@accessor.args.map { |a| a.to_s.quote_if_necessary }.join(" ")}\n"
1055
+ end
1056
+ # TODO: Add TEMPLATE_ENCODED so this can always be done inline regardless of content
1057
+ if @template
1058
+ config << " TEMPLATE '#{@template}'"
1059
+ end
1011
1060
  config << " ALLOW_SHORT\n" if @short_buffer_allowed
1012
1061
  config << " HAZARDOUS #{@hazardous_description.to_s.quote_if_necessary}\n" if @hazardous
1013
1062
  config << " DISABLE_MESSAGES\n" if @messages_disabled
@@ -1025,7 +1074,7 @@ module OpenC3
1025
1074
 
1026
1075
  if @meta
1027
1076
  @meta.each do |key, values|
1028
- config << " META #{key.to_s.quote_if_necessary} #{values.map { |a| a..to_s.quote_if_necessary }.join(" ")}\n"
1077
+ config << " META #{key.to_s.quote_if_necessary} #{values.map { |a| a.to_s.quote_if_necessary }.join(" ")}\n"
1029
1078
  end
1030
1079
  end
1031
1080
 
@@ -1043,6 +1092,20 @@ module OpenC3
1043
1092
  end
1044
1093
  end
1045
1094
 
1095
+ if @response
1096
+ config << " RESPONSE #{@response[0].to_s.quote_if_necessary} #{@response[1].to_s.quote_if_necessary}"
1097
+ end
1098
+ if @error_response
1099
+ config << " ERROR_RESPONSE #{@error_response[0].to_s.quote_if_necessary} #{@error_response[1].to_s.quote_if_necessary}"
1100
+ end
1101
+ if @screen
1102
+ config << " SCREEN #{@screen[0].to_s.quote_if_necessary} #{@screen[1].to_s.quote_if_necessary}"
1103
+ end
1104
+ if @related_items
1105
+ @related_items.each do |target_name, packet_name, item_name|
1106
+ config << " RELATED_ITEM #{target_name.to_s.quote_if_necessary} #{packet_name.to_s.quote_if_necessary} #{item_name.to_s.quote_if_necessary}"
1107
+ end
1108
+ end
1046
1109
  config
1047
1110
  end
1048
1111
 
@@ -1086,6 +1149,18 @@ module OpenC3
1086
1149
  items << item.as_json(*a)
1087
1150
  end
1088
1151
  end
1152
+ if @response
1153
+ config['response'] = @response
1154
+ end
1155
+ if @error_response
1156
+ config['error_response'] = @error_response
1157
+ end
1158
+ if @screen
1159
+ config['screen'] = @screen
1160
+ end
1161
+ if @related_items
1162
+ config['related_items'] = @related_items
1163
+ end
1089
1164
 
1090
1165
  config
1091
1166
  end
@@ -1117,6 +1192,19 @@ module OpenC3
1117
1192
  hash['items'].each do |item|
1118
1193
  packet.define(PacketItem.from_json(item))
1119
1194
  end
1195
+ if hash['response']
1196
+ packet.response = hash['response']
1197
+ end
1198
+ if hash['error_response']
1199
+ packet.error_response = hash['error_response']
1200
+ end
1201
+ if hash['screen']
1202
+ packet.screen = hash['screen']
1203
+ end
1204
+ if hash['related_items']
1205
+ packet.related_items = hash['related_items']
1206
+ end
1207
+
1120
1208
  packet
1121
1209
  end
1122
1210
 
@@ -1144,8 +1232,6 @@ module OpenC3
1144
1232
  json_hash
1145
1233
  end
1146
1234
 
1147
- protected
1148
-
1149
1235
  # Performs packet specific processing on the packet.
1150
1236
  # Intended to only be run once for each packet received
1151
1237
  def process(buffer = @buffer)
@@ -1156,6 +1242,8 @@ module OpenC3
1156
1242
  end
1157
1243
  end
1158
1244
 
1245
+ protected
1246
+
1159
1247
  def handle_limits_states(item, value)
1160
1248
  # Retrieve limits state for the given value
1161
1249
  limits_state = item.state_colors[value]
@@ -119,7 +119,8 @@ module OpenC3
119
119
  # an xtce file to automatically determine the target name.
120
120
  def process_file(filename, process_target_name)
121
121
  # Handle .xtce files
122
- if File.extname(filename).to_s.downcase == ".xtce"
122
+ extension = File.extname(filename).to_s.downcase
123
+ if extension == ".xtce" or extension == ".xml"
123
124
  XtceParser.process(@commands, @telemetry, @warnings, filename, process_target_name)
124
125
  return
125
126
  end
@@ -213,7 +214,8 @@ module OpenC3
213
214
  'PARAMETER', 'ID_ITEM', 'ID_PARAMETER', 'ARRAY_ITEM', 'ARRAY_PARAMETER', 'APPEND_ITEM',\
214
215
  'APPEND_PARAMETER', 'APPEND_ID_ITEM', 'APPEND_ID_PARAMETER', 'APPEND_ARRAY_ITEM',\
215
216
  'APPEND_ARRAY_PARAMETER', 'ALLOW_SHORT', 'HAZARDOUS', 'PROCESSOR', 'META',\
216
- 'DISABLE_MESSAGES', 'HIDDEN', 'DISABLED', 'ACCESSOR', 'TEMPLATE', 'TEMPLATE_FILE'
217
+ 'DISABLE_MESSAGES', 'HIDDEN', 'DISABLED', 'ACCESSOR', 'TEMPLATE', 'TEMPLATE_FILE',\
218
+ 'RESPONSE', 'ERROR_RESPONSE', 'SCREEN', 'RELATED_ITEM'
217
219
  raise parser.error("No current packet for #{keyword}") unless @current_packet
218
220
 
219
221
  process_current_packet(parser, keyword, params)
@@ -459,7 +461,30 @@ module OpenC3
459
461
  rescue Exception => err
460
462
  raise parser.error(err)
461
463
  end
464
+
465
+ when 'RESPONSE'
466
+ usage = "#{keyword} <Target Name> <Packet Name>"
467
+ parser.verify_num_parameters(2, 2, usage)
468
+ @current_packet.response = [params[0].upcase, params[1].upcase]
469
+
470
+ when 'ERROR_RESPONSE'
471
+ usage = "#{keyword} <Target Name> <Packet Name>"
472
+ parser.verify_num_parameters(2, 2, usage)
473
+ @current_packet.error_response = [params[0].upcase, params[1].upcase]
474
+
475
+ when 'SCREEN'
476
+ usage = "#{keyword} <Target Name> <Screen Name>"
477
+ parser.verify_num_parameters(2, 2, usage)
478
+ @current_packet.screen = [params[0].upcase, params[1].upcase]
479
+
480
+ when 'RELATED_ITEM'
481
+ usage = "#{keyword} <Target Name> <Packet Name> <Item Name>"
482
+ parser.verify_num_parameters(3, 3, usage)
483
+ @current_packet.related_items ||= []
484
+ @current_packet.related_items << [params[0].upcase, params[1].upcase, params[2].upcase]
485
+
462
486
  end
487
+
463
488
  end
464
489
 
465
490
  def process_current_item(parser, keyword, params)
@@ -181,7 +181,8 @@ module OpenC3
181
181
  when 'ParameterTypeSet', 'EnumerationList', 'ParameterSet', 'ContainerSet',
182
182
  'EntryList', 'DefaultCalibrator', 'DefaultAlarm', 'RestrictionCriteria',
183
183
  'ComparisonList', 'MetaCommandSet', 'ArgumentTypeSet', 'ArgumentList',
184
- 'ArgumentAssignmentList', 'LocationInContainerInBits', 'ReferenceTime'
184
+ 'ArgumentAssignmentList', 'LocationInContainerInBits', 'ReferenceTime',
185
+ 'AncillaryDataSet', 'AncillaryData'
185
186
  # Do Nothing
186
187
 
187
188
  when 'ErrorDetectCorrect'
@@ -446,6 +447,9 @@ module OpenC3
446
447
  process_ref_entry(element)
447
448
  return false # Already recursed
448
449
 
450
+ when 'ContainerRefEntry'
451
+ xtce_handle_base_container('ContainerRefEntry', element)
452
+
449
453
  when 'BaseContainer'
450
454
  # Handled in SequenceContainer/CommandContainer
451
455