openc3 5.0.8 → 5.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/bin/openc3cli +128 -95
  3. data/data/config/_id_items.yaml +2 -1
  4. data/data/config/_id_params.yaml +2 -1
  5. data/data/config/_items.yaml +2 -1
  6. data/data/config/_params.yaml +2 -1
  7. data/data/config/command_modifiers.yaml +30 -0
  8. data/data/config/item_modifiers.yaml +10 -0
  9. data/data/config/microservice.yaml +12 -0
  10. data/data/config/param_item_modifiers.yaml +10 -0
  11. data/data/config/plugins.yaml +0 -9
  12. data/data/config/telemetry_modifiers.yaml +10 -0
  13. data/data/config/widgets.yaml +49 -73
  14. data/ext/openc3/ext/packet/packet.c +20 -2
  15. data/ext/openc3/ext/structure/structure.c +12 -17
  16. data/lib/openc3/accessors/accessor.rb +71 -0
  17. data/lib/openc3/accessors/binary_accessor.rb +1226 -0
  18. data/lib/openc3/accessors/cbor_accessor.rb +83 -0
  19. data/lib/openc3/accessors/html_accessor.rb +28 -0
  20. data/lib/openc3/accessors/json_accessor.rb +131 -0
  21. data/lib/openc3/accessors/xml_accessor.rb +67 -0
  22. data/lib/openc3/accessors.rb +23 -0
  23. data/lib/openc3/api/cmd_api.rb +5 -2
  24. data/lib/openc3/api/interface_api.rb +15 -0
  25. data/lib/openc3/api/limits_api.rb +3 -3
  26. data/lib/openc3/config/config_parser.rb +10 -4
  27. data/lib/openc3/core_ext/file.rb +5 -0
  28. data/lib/openc3/core_ext/tempfile.rb +20 -0
  29. data/lib/openc3/io/json_rpc.rb +3 -3
  30. data/lib/openc3/microservices/cleanup_microservice.rb +7 -5
  31. data/lib/openc3/models/cvt_model.rb +1 -10
  32. data/lib/openc3/models/interface_model.rb +41 -0
  33. data/lib/openc3/models/microservice_model.rb +33 -1
  34. data/lib/openc3/models/plugin_model.rb +1 -1
  35. data/lib/openc3/models/target_model.rb +85 -68
  36. data/lib/openc3/packets/binary_accessor.rb +2 -1207
  37. data/lib/openc3/packets/packet.rb +106 -6
  38. data/lib/openc3/packets/packet_config.rb +30 -7
  39. data/lib/openc3/packets/parsers/limits_response_parser.rb +1 -3
  40. data/lib/openc3/packets/parsers/processor_parser.rb +1 -2
  41. data/lib/openc3/packets/parsers/xtce_parser.rb +68 -3
  42. data/lib/openc3/packets/structure.rb +39 -14
  43. data/lib/openc3/packets/structure_item.rb +15 -1
  44. data/lib/openc3/script/storage.rb +19 -1
  45. data/lib/openc3/utilities/local_mode.rb +521 -0
  46. data/lib/openc3/utilities/simulated_target.rb +3 -2
  47. data/lib/openc3/utilities/target_file.rb +146 -0
  48. data/lib/openc3/version.rb +5 -5
  49. data/lib/openc3.rb +1 -0
  50. metadata +45 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3a1e753382bf9c7d98b63dad72fed1aa08e3a234ce140327d0bbf07ed2a913dd
4
- data.tar.gz: 4b61da453f0fc1c75b7ec5df06516970b1a0d3325425e15f550322a505e90883
3
+ metadata.gz: e37b2aa61abbfe13cc757b9b154bcb2147c1743cbade962b0d6cbea83ae9eed3
4
+ data.tar.gz: 123104220cc22dc2d48a492a0986228bd01789e15b7e52e6fea9a880b31fc89b
5
5
  SHA512:
6
- metadata.gz: 3cfaad4b9103a68a6608d48513f1e1161df68325bfb0684d9dac6aebcc47af0e4c2a3225692dff08b7d28aa96ce33a3b7812928e0191620bffb08686fbe511d6
7
- data.tar.gz: a385b3d5ac4524c8919adf9cc1050793c1ce5e30fb62c679a711b79f7523d3908301de23cfd97d426ec0c58ce1815d16047807802afb8530cbb1faf91392a444
6
+ metadata.gz: fa546888f0e71f7cd4aca771d41012e3ce34cd5c5c5a801d0d0344b199073bbeb6e8b9622243d4d2a82cf67ddcfb6a869f189964a493106915ebefd32e3daa1c
7
+ data.tar.gz: 5632e8f84d341f00af0d49bbc048102cd66a53b50f5760d98783557ec462443705a0541f4a53eac59b2d5ee1db9c3e1e1a3ce9d6bc96fc0fcec829f05fc5567b
data/bin/openc3cli CHANGED
@@ -21,9 +21,11 @@
21
21
  # This file will handle OpenC3 tasks such as instantiating a new project
22
22
 
23
23
  require 'openc3'
24
+ require 'openc3/utilities/local_mode'
24
25
  require 'openc3/utilities/s3'
25
26
  require 'openc3/models/scope_model'
26
27
  require 'openc3/models/plugin_model'
28
+ require 'openc3/models/gem_model'
27
29
  require 'openc3/packets/packet_config'
28
30
  require 'openc3/bridge/bridge'
29
31
  require 'ostruct'
@@ -35,6 +37,7 @@ require 'json'
35
37
  require 'redis'
36
38
  require 'psych'
37
39
  require 'erb'
40
+ require 'pp'
38
41
 
39
42
  $redis_url = "redis://#{ENV['OPENC3_REDIS_HOSTNAME']}:#{ENV['OPENC3_REDIS_PORT']}"
40
43
 
@@ -313,18 +316,30 @@ ensure
313
316
  exit(result)
314
317
  end
315
318
 
316
- def update_plugin(plugin_file_path, plugin_name, variables: nil, plugin_txt_lines: nil, scope:)
319
+ def update_plugin(plugin_file_path, plugin_name, variables: nil, plugin_txt_lines: nil, scope:, existing_plugin_name:)
317
320
  new_gem = File.basename(plugin_file_path)
318
- old_gem = plugin_name.split("__")[0]
319
- puts "Updating existing plugin: #{plugin_name} with #{File.basename(plugin_file_path)}"
320
- plugin_model = OpenC3::PluginModel.get_model(name: plugin_name, scope: scope)
321
+ old_gem = existing_plugin_name.split("__")[0]
322
+ puts "Updating existing plugin: #{existing_plugin_name} with #{File.basename(plugin_file_path)}"
323
+ plugin_model = OpenC3::PluginModel.get_model(name: existing_plugin_name, scope: scope)
321
324
  begin
322
325
  # Only update if something has changed
323
- if (new_gem != old_gem) or (variables != plugin_model.variables) or (plugin_txt_lines != plugin_model.plugin_txt_lines)
326
+ if (new_gem != old_gem) or (variables and variables != plugin_model.variables) or (plugin_txt_lines and plugin_txt_lines != plugin_model.plugin_txt_lines)
327
+ puts "Gem version change detected - New: #{new_gem}, Old: #{old_gem}" if new_gem != old_gem
328
+ if variables and variables != plugin_model.variables
329
+ pp_variables = ""
330
+ PP.pp(variables, pp_variables)
331
+ pp_plugin_model_variables = ""
332
+ PP.pp(plugin_model.variables, pp_plugin_model_variables)
333
+ puts "Variables change detected\nNew:\n#{pp_variables}\nOld:\n#{pp_plugin_model_variables}"
334
+ end
335
+ puts "plugin.txt change detected\nNew:\n#{plugin_txt_lines.join("\n")}\n\nOld:\n#{plugin_model.plugin_txt_lines.join("\n")}\n" if plugin_txt_lines and plugin_txt_lines != plugin_model.plugin_txt_lines
324
336
  variables = plugin_model.variables unless variables
325
337
  plugin_model.destroy
338
+
326
339
  plugin_hash = OpenC3::PluginModel.install_phase1(plugin_file_path, existing_variables: variables, existing_plugin_txt_lines: plugin_txt_lines, process_existing: true, scope: scope)
327
- OpenC3::PluginModel.install_phase2(plugin_hash, scope: scope)
340
+ puts "Updating plugin: #{plugin_file_path}\n#{plugin_hash}"
341
+ plugin_hash = OpenC3::PluginModel.install_phase2(plugin_hash, scope: scope)
342
+ OpenC3::LocalMode.update_local_plugin(plugin_file_path, plugin_hash, old_plugin_name: plugin_name, scope: scope)
328
343
  else
329
344
  puts "No changes detected - Exiting without change"
330
345
  end
@@ -354,6 +369,7 @@ def load_plugin(plugin_file_path, scope:, plugin_hash_file: nil)
354
369
  # Only create the scope if it doesn't already exist
355
370
  unless OpenC3::ScopeModel.names.include?(scope)
356
371
  begin
372
+ puts "Creating scope: #{scope}"
357
373
  scope_model = OpenC3::ScopeModel.new(name: scope, scope: scope)
358
374
  scope_model.create
359
375
  scope_model.deploy(".", {})
@@ -381,7 +397,9 @@ def load_plugin(plugin_file_path, scope:, plugin_hash_file: nil)
381
397
  found = true
382
398
  # Upgrade if version changed else do nothing
383
399
  if file_full_name != full_name
384
- update_plugin(plugin_file_path, plugin_name, scope: scope)
400
+ update_plugin(plugin_file_path, plugin_name, scope: scope, existing_plugin_name: plugin_name)
401
+ else
402
+ puts "No version change detected for: #{plugin_name}"
385
403
  end
386
404
  end
387
405
  end
@@ -394,16 +412,24 @@ def load_plugin(plugin_file_path, scope:, plugin_hash_file: nil)
394
412
  existing_plugin_hash = OpenC3::PluginModel.get(name: plugin_hash['name'], scope: scope)
395
413
 
396
414
  # Existing plugin hash will be present if plugin is being edited or upgraded
397
- # If editing, gem name will match existing hash name
398
- # If upgrading, gem name will not match the existing hash name
415
+ # However, a missing existing could also be that a plugin was updated in local mode directly from across installations
416
+ # changing the plugin name without really meaning to create a new instance of the plugin
417
+ # ie.
418
+ # User on machine 1 checks in a changed plugin_instance.json with a different name - There is still only one plugin desired and committed
419
+ # User on machine 2 starts up with the new configuration, OpenC3::PluginModel.get will return nil because the exact name is different
420
+ # In this case, the plugin should be updated without installing a second instance. analyze_local_mode figures this out.
421
+ unless existing_plugin_hash
422
+ existing_plugin_hash = OpenC3::LocalMode.analyze_local_mode(plugin_name: plugin_hash['name'], scope: scope)
423
+ end
399
424
 
400
425
  if existing_plugin_hash
401
426
  # Upgrade or Edit
402
- update_plugin(plugin_file_path, plugin_hash['name'], variables: plugin_hash['variables'], plugin_txt_lines: plugin_hash['plugin_txt_lines'], scope: scope)
427
+ update_plugin(plugin_file_path, plugin_hash['name'], variables: plugin_hash['variables'], plugin_txt_lines: plugin_hash['plugin_txt_lines'], scope: scope, existing_plugin_name: existing_plugin_hash['name'])
403
428
  else
404
429
  # New Install
405
430
  puts "Loading new plugin: #{plugin_file_path}\n#{plugin_hash}"
406
- OpenC3::PluginModel.install_phase2(plugin_hash, scope: scope)
431
+ plugin_hash = OpenC3::PluginModel.install_phase2(plugin_hash, scope: scope)
432
+ OpenC3::LocalMode.update_local_plugin(plugin_file_path, plugin_hash, scope: scope)
407
433
  end
408
434
  rescue => err
409
435
  abort("Error installing plugin: #{scope}: #{plugin_file_path}: #{err.formatted}")
@@ -414,6 +440,7 @@ def unload_plugin(plugin_name, scope:)
414
440
  scope ||= 'DEFAULT'
415
441
  begin
416
442
  OpenC3::PluginModel.new(name: plugin_name, scope: scope).destroy
443
+ OpenC3::LocalMode.remove_local_plugin(plugin_name, scope: scope)
417
444
  OpenC3::Logger.info("PluginModel destroyed: #{plugin_name}", scope: scope)
418
445
  rescue => err
419
446
  abort("Error uninstalling plugin: #{scope}: #{plugin_name}: #{err.formatted}")
@@ -450,113 +477,119 @@ def get_redis_keys
450
477
  puts "Packets Defs: #{keys.select { |item| item[/^tlm__/] }}"
451
478
  end
452
479
 
453
- if not ARGV[0].nil? # argument(s) given
480
+ if __FILE__ == $0
481
+ if not ARGV[0].nil? # argument(s) given
454
482
 
455
- # Handle each task
456
- case ARGV[0].downcase
483
+ # Handle each task
484
+ case ARGV[0].downcase
457
485
 
458
- when 'rake'
459
- puts `rake #{ARGV[1..-1].join(' ')}`
486
+ when 'rake'
487
+ puts `rake #{ARGV[1..-1].join(' ')}`
460
488
 
461
- when 'validate'
462
- validate_plugin(ARGV[1], scope: ARGV[2], variables_file: ARGV[3])
489
+ when 'validate'
490
+ validate_plugin(ARGV[1], scope: ARGV[2], variables_file: ARGV[3])
463
491
 
464
- when 'load'
465
- load_plugin(ARGV[1], scope: ARGV[2], plugin_hash_file: ARGV[3])
492
+ when 'load'
493
+ load_plugin(ARGV[1], scope: ARGV[2], plugin_hash_file: ARGV[3])
466
494
 
467
- when 'unload'
468
- unload_plugin(ARGV[1], scope: ARGV[2])
495
+ when 'unload'
496
+ unload_plugin(ARGV[1], scope: ARGV[2])
469
497
 
470
- when 'geminstall'
471
- gem_install(ARGV[1])
498
+ when 'geminstall'
499
+ gem_install(ARGV[1])
472
500
 
473
- when 'generate'
474
- generate(ARGV[1..-1])
501
+ when 'generate'
502
+ generate(ARGV[1..-1])
475
503
 
476
- when 'migrate'
477
- migrate(ARGV[1..-1])
504
+ when 'migrate'
505
+ migrate(ARGV[1..-1])
478
506
 
479
- when 'rubysloc'
480
- puts `ruby /openc3/bin/rubysloc #{ARGV[1..-1].join(' ')}`
507
+ when 'rubysloc'
508
+ puts `ruby /openc3/bin/rubysloc #{ARGV[1..-1].join(' ')}`
481
509
 
482
- when 'cstol_converter'
483
- puts `ruby /openc3/bin/cstol_converter #{ARGV[1..-1].join(' ')}`
510
+ when 'cstol_converter'
511
+ puts `ruby /openc3/bin/cstol_converter #{ARGV[1..-1].join(' ')}`
484
512
 
485
- when 'xtce_converter'
486
- xtce_converter(ARGV[1..-1])
513
+ when 'xtce_converter'
514
+ xtce_converter(ARGV[1..-1])
487
515
 
488
- when 'bridge'
489
- ENV['OPENC3_NO_STORE'] = '1'
490
- filename = ARGV[1]
491
- filename = 'bridge.txt' unless filename
492
- bridge = OpenC3::Bridge.new(filename)
493
- begin
494
- while true
495
- sleep(1)
516
+ when 'bridge'
517
+ ENV['OPENC3_NO_STORE'] = '1'
518
+ filename = ARGV[1]
519
+ filename = 'bridge.txt' unless filename
520
+ bridge = OpenC3::Bridge.new(filename)
521
+ begin
522
+ while true
523
+ sleep(1)
524
+ end
525
+ rescue Interrupt
526
+ exit(0)
496
527
  end
497
- rescue Interrupt
498
- exit(0)
499
- end
500
528
 
501
- when 'bridgesetup'
502
- ENV['OPENC3_NO_STORE'] = '1'
503
- filename = ARGV[1]
504
- filename = 'bridge.txt' unless filename
505
- unless File.exist?(filename)
506
- OpenC3::BridgeConfig.generate_default(filename)
507
- end
508
-
509
- when 'help'
510
- print_usage()
529
+ when 'bridgesetup'
530
+ ENV['OPENC3_NO_STORE'] = '1'
531
+ filename = ARGV[1]
532
+ filename = 'bridge.txt' unless filename
533
+ unless File.exist?(filename)
534
+ OpenC3::BridgeConfig.generate_default(filename)
535
+ end
511
536
 
512
- when 'redis'
513
- case (ARGV[1])
514
- when 'keys'
515
- get_redis_keys()
516
- when 'hget'
517
- redis = Redis.new(url: $redis_url, username: ENV['OPENC3_REDIS_USERNAME'], password: ENV['OPENC3_REDIS_PASSWORD'])
518
- puts JSON.parse(redis.hget(ARGV[2], ARGV[3]), :allow_nan => true, :create_additions => true)
519
- else
520
- puts "Unknown redis task: #{ARGV[1]}\n"
521
- puts "Valid redis tasks: keys, hget"
522
- end
537
+ when 'help'
538
+ print_usage()
539
+
540
+ when 'redis'
541
+ case (ARGV[1])
542
+ when 'keys'
543
+ get_redis_keys()
544
+ when 'hget'
545
+ redis = Redis.new(url: $redis_url, username: ENV['OPENC3_REDIS_USERNAME'], password: ENV['OPENC3_REDIS_PASSWORD'])
546
+ puts JSON.parse(redis.hget(ARGV[2], ARGV[3]), :allow_nan => true, :create_additions => true)
547
+ else
548
+ puts "Unknown redis task: #{ARGV[1]}\n"
549
+ puts "Valid redis tasks: keys, hget"
550
+ end
523
551
 
524
- when 'removebase'
525
- # Used to remove tool base to better support enterprise upgrade
526
- scopes = OpenC3::ScopeModel.all
527
- scopes.each do |scope_name, scope|
528
- plugins = OpenC3::PluginModel.all(scope: scope_name)
529
- plugins.each do |plugin_name, plugin|
530
- if plugin["name"] =~ /tool-base/ and plugin["name"] !~ /enterprise/
531
- unload_plugin(plugin_name, scope: scope_name)
532
- end
533
- if plugin["name"] =~ /tool-admin/ and plugin["name"] !~ /enterprise/
534
- unload_plugin(plugin_name, scope: scope_name)
552
+ when 'removebase'
553
+ # Used to remove tool base to better support enterprise upgrade
554
+ scopes = OpenC3::ScopeModel.all
555
+ scopes.each do |scope_name, scope|
556
+ plugins = OpenC3::PluginModel.all(scope: scope_name)
557
+ plugins.each do |plugin_name, plugin|
558
+ if plugin["name"] =~ /tool-base/ and plugin["name"] !~ /enterprise/
559
+ unload_plugin(plugin_name, scope: scope_name)
560
+ end
561
+ if plugin["name"] =~ /tool-admin/ and plugin["name"] !~ /enterprise/
562
+ unload_plugin(plugin_name, scope: scope_name)
563
+ end
535
564
  end
536
565
  end
537
- end
538
566
 
539
- when 'removeenterprise'
540
- # Used to remove enterprise plugins to better support downgrade
541
- scopes = OpenC3::ScopeModel.all
542
- scopes.each do |scope_name, scope|
543
- plugins = OpenC3::PluginModel.all(scope: scope_name)
544
- plugins.each do |plugin_name, plugin|
545
- if plugin["name"] =~ /enterprise/
546
- unload_plugin(plugin_name, scope: scope_name)
567
+ when 'removeenterprise'
568
+ # Used to remove enterprise plugins to better support downgrade
569
+ scopes = OpenC3::ScopeModel.all
570
+ scopes.each do |scope_name, scope|
571
+ plugins = OpenC3::PluginModel.all(scope: scope_name)
572
+ plugins.each do |plugin_name, plugin|
573
+ if plugin["name"] =~ /enterprise/
574
+ unload_plugin(plugin_name, scope: scope_name)
575
+ end
547
576
  end
548
577
  end
549
- end
550
578
 
551
- when 'destroyscope'
552
- scope = OpenC3::ScopeModel.get_model(name: ARGV[1])
553
- scope.destroy
579
+ when 'destroyscope'
580
+ scope = OpenC3::ScopeModel.get_model(name: ARGV[1])
581
+ scope.destroy
582
+
583
+ when 'localinit'
584
+ OpenC3::LocalMode.local_init()
554
585
 
555
- else # Unknown task
586
+ else # Unknown task
587
+ print_usage()
588
+ abort("Unknown task: #{ARGV[0]}")
589
+ end
590
+
591
+ else # No arguments given
556
592
  print_usage()
557
- abort("Unknown task: #{ARGV[0]}")
558
593
  end
559
594
 
560
- else # No arguments given
561
- print_usage()
562
- end
595
+ end
@@ -20,5 +20,6 @@
20
20
  values: "['\"].*['\"]"
21
21
  - name: Endianness
22
22
  required: false
23
- description: Indicates if the item is to be interpreted in Big Endian or Little Endian format
23
+ description: Indicates if the item is to be interpreted in Big Endian or Little Endian format.
24
+ See guide on <a href="https://openc3.com/docs/v5/little-endian-bitfields">Little Endian Bitfields</a>.
24
25
  values: <%= %w(BIG_ENDIAN LITTLE_ENDIAN) %>
@@ -31,7 +31,8 @@
31
31
  values: "['\"].*['\"]"
32
32
  - name: Endianness
33
33
  required: false
34
- description: Indicates if the data in this command is to be sent in Big Endian or Little Endian format
34
+ description: Indicates if the data in this command is to be sent in Big Endian or Little Endian format.
35
+ See guide on <a href="https://openc3.com/docs/v5/little-endian-bitfields">Little Endian Bitfields</a>.
35
36
  values: <%= %w(BIG_ENDIAN LITTLE_ENDIAN) %>
36
37
  UINT:
37
38
  parameters: *params
@@ -16,5 +16,6 @@
16
16
  values: "['\"].*['\"]"
17
17
  - name: Endianness
18
18
  required: false
19
- description: Indicates if the item is to be interpreted in Big Endian or Little Endian format
19
+ description: Indicates if the item is to be interpreted in Big Endian or Little Endian format.
20
+ See guide on <a href="https://openc3.com/docs/v5/little-endian-bitfields">Little Endian Bitfields</a>.
20
21
  values: <%= %w(BIG_ENDIAN LITTLE_ENDIAN) %>
@@ -32,7 +32,8 @@
32
32
  values: '[''"].*[''"]'
33
33
  - name: Endianness
34
34
  required: false
35
- description: Indicates if the data in this command is to be sent in Big Endian or Little Endian format
35
+ description: Indicates if the data in this command is to be sent in Big Endian or Little Endian format.
36
+ See guide on <a href="https://openc3.com/docs/v5/little-endian-bitfields">Little Endian Bitfields</a>.
36
37
  values: <%= %w(BIG_ENDIAN LITTLE_ENDIAN) %>
37
38
  UINT:
38
39
  parameters: *params
@@ -158,3 +158,33 @@ HAZARDOUS:
158
158
  required: false
159
159
  description: Description for why the command is hazardous which must be enclosed with quotes
160
160
  values: "['\"].*['\"]"
161
+ ACCESSOR:
162
+ summary: Defines the class used to read and write raw values from the packet
163
+ description: Defines the class that is used too read raw values from the packet. Defaults to BinaryAccessor.
164
+ Provided accessors also include JsonAccessor, CborAccessor, HtmlAccessor, and XmlAccessor.
165
+ parameters:
166
+ - name: Accessor Class Name
167
+ required: true
168
+ description: The name of the accessor class
169
+ values: .+
170
+ since: 5.0.10
171
+ TEMPLATE:
172
+ summary: Defines a template string used to initialize the command before default values are filled in
173
+ description: Generally the template string is formatted in JSON or HTML and then values are filled in with
174
+ command parameters. Must be UTF-8 encoded.
175
+ parameters:
176
+ - name: Template
177
+ required: true
178
+ description: The template string which should be enclosed in quotes
179
+ values: "['\"].*['\"]"
180
+ since: 5.0.10
181
+ TEMPLATE_FILE:
182
+ summary: Defines a template file used to initialize the command before default values are filled in
183
+ description: Generally the template file is formatted in JSON or HTML and then values are filled in with
184
+ command parameters. Can be binary or UTF-8.
185
+ parameters:
186
+ - name: Template File Path
187
+ required: true
188
+ description: The relative path to the template file. Filename should generally start with an underscore.
189
+ values: .+
190
+ since: 5.0.10
@@ -219,3 +219,13 @@ LIMITS_RESPONSE:
219
219
  description: Variable length number of options that will be passed to the
220
220
  class constructor
221
221
  values: .+
222
+ KEY:
223
+ summary: Defines the key used to access this raw value in the packet.
224
+ description: Keys are often JsonPath or XPath strings
225
+ example: KEY $.book.title
226
+ parameters:
227
+ - name: Key string
228
+ required: true
229
+ description: The key to access this item
230
+ values: .+
231
+ since: 5.0.10
@@ -32,6 +32,18 @@ MICROSERVICE:
32
32
  required: true
33
33
  description: Working directory to run the microservice CMD in. Can be a path relative to the microservice folder in the plugin, or an absolute path in the container the microservice runs in.
34
34
  values: .+
35
+ PORT:
36
+ summary: Open port for the microservice
37
+ description: Kubernetes needs a Service to be applied to open a port so this is required for Kubernetes support
38
+ parameters:
39
+ - name: Number
40
+ required: true
41
+ description: Port number
42
+ values: \d+
43
+ - name: Protocol
44
+ required: false
45
+ description: Port protocol. Default is TCP.
46
+ values: .+
35
47
  TOPIC:
36
48
  summary: Associate a Redis topic
37
49
  description: Redis topic to associate with this microservice. Standard OpenC3 microservices such as decom_microservice use this information to know what packet streams to subscribe to. The TOPIC keyword can be used as many times as necessary to associate all needed topics.
@@ -50,3 +50,13 @@ OVERLAP:
50
50
  If an item's bit offset overlaps another item, OpenC3 issues a warning. This keyword explicitly
51
51
  allows an item to overlap another and supresses the warning message.
52
52
  since: 4.4.1
53
+ KEY:
54
+ summary: Defines the key used to access this raw value in the packet.
55
+ description: Keys are often JsonPath or XPath strings
56
+ example: KEY $.book.title
57
+ parameters:
58
+ - name: Key string
59
+ required: true
60
+ description: The key to access this item
61
+ values: .+
62
+ since: 5.0.10
@@ -38,15 +38,6 @@ INTERFACE:
38
38
  documentation for more details.
39
39
  ROUTER:
40
40
  modifiers:
41
- ROUTE:
42
- summary: Map an interface to a router
43
- description: Once an interface has been mapped to a router, all its received telemetry
44
- will be sent out through the router.
45
- parameters:
46
- - name: Interface
47
- required: true
48
- description: Name of the interface
49
- values: .+
50
41
  <%= MetaConfigParser.load('interface_modifiers.yaml').to_meta_config_yaml(4) %>
51
42
  summary: Create router to receive commands and output telemetry packets from one or more interfaces
52
43
  description: Creates an router which receives command packets from
@@ -157,3 +157,13 @@ HIDDEN:
157
157
  It also hides this telemetry from appearing in the Script Runner popup helper
158
158
  when writing scripts. The telemetry still exists in the system and can received
159
159
  and checked by scripts.
160
+ ACCESSOR:
161
+ summary: Defines the class used to read and write raw values from the packet
162
+ description: Defines the class that is used too read raw values from the packet. Defaults to BinaryAccessor.
163
+ Provided accessors also include JsonAccessor, CborAccessor, HtmlAccessor, and XmlAccessor.
164
+ parameters:
165
+ - name: Accessor Class Name
166
+ required: true
167
+ description: The name of the accessor class
168
+ values: .+
169
+ since: 5.0.10