openc3 5.8.1 → 5.9.1

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.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/ext/openc3/ext/crc/crc.c +1 -1
  3. data/lib/openc3/api/cmd_api.rb +1 -1
  4. data/lib/openc3/api/limits_api.rb +4 -20
  5. data/lib/openc3/api/target_api.rb +11 -8
  6. data/lib/openc3/api/tlm_api.rb +29 -38
  7. data/lib/openc3/microservices/decom_microservice.rb +10 -2
  8. data/lib/openc3/microservices/reaction_microservice.rb +152 -81
  9. data/lib/openc3/microservices/timeline_microservice.rb +1 -1
  10. data/lib/openc3/microservices/trigger_group_microservice.rb +188 -118
  11. data/lib/openc3/migrations/20230615000000_autonomic.rb +86 -0
  12. data/lib/openc3/models/activity_model.rb +2 -4
  13. data/lib/openc3/models/auth_model.rb +18 -6
  14. data/lib/openc3/models/cvt_model.rb +113 -50
  15. data/lib/openc3/models/microservice_model.rb +6 -2
  16. data/lib/openc3/models/model.rb +1 -3
  17. data/lib/openc3/models/reaction_model.rb +124 -119
  18. data/lib/openc3/models/scope_model.rb +15 -3
  19. data/lib/openc3/models/target_model.rb +43 -1
  20. data/lib/openc3/models/timeline_model.rb +1 -3
  21. data/lib/openc3/models/trigger_group_model.rb +16 -50
  22. data/lib/openc3/models/trigger_model.rb +86 -123
  23. data/lib/openc3/packets/json_packet.rb +2 -3
  24. data/lib/openc3/script/commands.rb +10 -0
  25. data/lib/openc3/script/script.rb +1 -0
  26. data/lib/openc3/top_level.rb +0 -12
  27. data/lib/openc3/utilities/authorization.rb +1 -1
  28. data/lib/openc3/utilities/bucket_require.rb +5 -1
  29. data/lib/openc3/utilities/bucket_utilities.rb +4 -1
  30. data/lib/openc3/utilities/cli_generator.rb +56 -4
  31. data/lib/openc3/utilities/local_mode.rb +1 -1
  32. data/lib/openc3/utilities/ruby_lex_utils.rb +4 -0
  33. data/lib/openc3/version.rb +5 -5
  34. data/templates/plugin/README.md +54 -4
  35. data/templates/plugin/Rakefile +31 -3
  36. data/templates/tool_angular/.editorconfig +16 -0
  37. data/templates/tool_angular/.gitignore +44 -0
  38. data/templates/tool_angular/.vscode/extensions.json +4 -0
  39. data/templates/tool_angular/.vscode/launch.json +20 -0
  40. data/templates/tool_angular/.vscode/tasks.json +42 -0
  41. data/templates/tool_angular/angular.json +111 -0
  42. data/templates/tool_angular/extra-webpack.config.js +8 -0
  43. data/templates/tool_angular/package.json +47 -0
  44. data/templates/tool_angular/src/app/app-routing.module.ts +15 -0
  45. data/templates/tool_angular/src/app/app.component.html +31 -0
  46. data/templates/tool_angular/src/app/app.component.scss +26 -0
  47. data/templates/tool_angular/src/app/app.component.spec.ts +29 -0
  48. data/templates/tool_angular/src/app/app.component.ts +51 -0
  49. data/templates/tool_angular/src/app/app.module.ts +30 -0
  50. data/templates/tool_angular/src/app/custom-overlay-container.ts +17 -0
  51. data/templates/tool_angular/src/app/empty-route/empty-route.component.ts +7 -0
  52. data/templates/tool_angular/src/app/openc3-api.d.ts +1 -0
  53. data/templates/tool_angular/src/assets/.gitkeep +0 -0
  54. data/templates/tool_angular/src/environments/environment.prod.ts +3 -0
  55. data/templates/tool_angular/src/environments/environment.ts +16 -0
  56. data/templates/tool_angular/src/favicon.ico +0 -0
  57. data/templates/tool_angular/src/index.html +13 -0
  58. data/templates/tool_angular/src/main.single-spa.ts +40 -0
  59. data/templates/tool_angular/src/single-spa/asset-url.ts +12 -0
  60. data/templates/tool_angular/src/single-spa/single-spa-props.ts +8 -0
  61. data/templates/tool_angular/src/styles.scss +1 -0
  62. data/templates/tool_angular/tsconfig.app.json +13 -0
  63. data/templates/tool_angular/tsconfig.json +33 -0
  64. data/templates/tool_angular/tsconfig.spec.json +14 -0
  65. data/templates/tool_angular/yarn.lock +8080 -0
  66. data/templates/tool_react/.eslintrc +7 -0
  67. data/templates/tool_react/.gitignore +72 -0
  68. data/templates/tool_react/.prettierignore +8 -0
  69. data/templates/tool_react/babel.config.json +29 -0
  70. data/templates/tool_react/jest.config.js +12 -0
  71. data/templates/tool_react/package.json +53 -0
  72. data/templates/tool_react/src/openc3-tool_name.js +24 -0
  73. data/templates/tool_react/src/root.component.js +88 -0
  74. data/templates/tool_react/src/root.component.test.js +9 -0
  75. data/templates/tool_react/webpack.config.js +27 -0
  76. data/templates/tool_react/yarn.lock +6854 -0
  77. data/templates/tool_svelte/.gitignore +72 -0
  78. data/templates/tool_svelte/.prettierignore +8 -0
  79. data/templates/tool_svelte/babel.config.js +12 -0
  80. data/templates/tool_svelte/build/smui.css +5 -0
  81. data/templates/tool_svelte/jest.config.js +9 -0
  82. data/templates/tool_svelte/package.json +46 -0
  83. data/templates/tool_svelte/rollup.config.js +72 -0
  84. data/templates/tool_svelte/src/App.svelte +42 -0
  85. data/templates/tool_svelte/src/App.test.js +9 -0
  86. data/templates/tool_svelte/src/services/api.js +92 -0
  87. data/templates/tool_svelte/src/services/axios.js +85 -0
  88. data/templates/tool_svelte/src/services/cable.js +65 -0
  89. data/templates/tool_svelte/src/services/config-parser.js +199 -0
  90. data/templates/tool_svelte/src/services/openc3-api.js +647 -0
  91. data/templates/tool_svelte/src/theme/_smui-theme.scss +25 -0
  92. data/templates/tool_svelte/src/tool_name.js +17 -0
  93. data/templates/tool_svelte/yarn.lock +5052 -0
  94. data/templates/tool_vue/.browserslistrc +16 -0
  95. data/templates/tool_vue/.env.standalone +1 -0
  96. data/templates/tool_vue/.eslintrc.js +43 -0
  97. data/templates/tool_vue/.gitignore +2 -0
  98. data/templates/tool_vue/.nycrc +3 -0
  99. data/templates/tool_vue/.prettierrc.js +5 -0
  100. data/templates/tool_vue/babel.config.json +11 -0
  101. data/templates/tool_vue/jsconfig.json +6 -0
  102. data/templates/tool_vue/package.json +52 -0
  103. data/templates/tool_vue/src/App.vue +15 -0
  104. data/templates/tool_vue/src/main.js +38 -0
  105. data/templates/tool_vue/src/router.js +29 -0
  106. data/templates/tool_vue/src/tools/tool_name/tool_name.vue +63 -0
  107. data/templates/tool_vue/vue.config.js +30 -0
  108. data/templates/tool_vue/yarn.lock +9145 -0
  109. data/templates/widget/package.json +9 -9
  110. data/templates/widget/yarn.lock +77 -73
  111. metadata +76 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f6639b1c8a8f8b4902a85d6bdf1f23800aefd25b61b333c661c25236058e9595
4
- data.tar.gz: e2b037827217d57a34a126189895afc3ff2c62e9758cc326f1cf24be08e1b791
3
+ metadata.gz: c24a28732bfd8c275b65639cd566b4823d78b70b43781bf14a82e114397e7677
4
+ data.tar.gz: a8567e57ec8008d505e7f6a30cd3462e435988a46729908fbc17775f2b92e976
5
5
  SHA512:
6
- metadata.gz: 6d2b3412ed3db8cdee1772416419737fc895d54145f58c087168c8b8c17649ab155cc36c4563a6bb826852c02ae0f89ac0972f101e28db04fa2cdc9163799732
7
- data.tar.gz: 39eacdb1118b721017fb84359426576ced5f08be342972a46429797b22e2f6ad46db4999171a03dc310dbb8c41e09d3bbbc8dc86145f807dfa50bfa0ffbacaf3
6
+ metadata.gz: dc287a9895e3ae60c6332389d0b7926bb84aa04d7d65e51c936ba65f66640b179b0baefdcec232d7775a70f2e95d88557faf5e960663c4c28840428e7cb52904
7
+ data.tar.gz: 578c1f1fe45512344390492e9aa15d7af851bb81e608fbc874189dcc73bc998c472e62d449c114fb300fc58bb0d9cc269cc3dfbcbb31aaaf76c9003abd63c8e7
@@ -410,7 +410,7 @@ static VALUE crc64_calculate(int argc, VALUE *argv, VALUE self)
410
410
  /*
411
411
  * Initialize methods for Crc
412
412
  */
413
- void Init_crc()
413
+ void Init_crc(void)
414
414
  {
415
415
  id_ivar_seed = rb_intern("@seed");
416
416
  id_ivar_xor = rb_intern("@xor");
@@ -393,7 +393,7 @@ module OpenC3
393
393
  # Check if any of the parameters have DISABLE_MESSAGES
394
394
  cmd_params.each do |key, value|
395
395
  item = packet['items'].find { |item| item['name'] == key.to_s }
396
- if item['states'] && item['states'][value] && item['states'][value]["messages_disabled"]
396
+ if item && item['states'] && item['states'][value] && item['states'][value]["messages_disabled"]
397
397
  log_message = false
398
398
  end
399
399
  end
@@ -373,26 +373,10 @@ module OpenC3
373
373
  # @param item_name [String] item name
374
374
  # @param scope [String] scope
375
375
  # @return Hash The requested item based on the packet name
376
- def _get_item(target_name, packet_name, item_name, scope:)
377
- requested_item = nil
378
- if packet_name == 'LATEST'
379
- latest = -1
380
- TargetModel.packets(target_name, scope: scope).each do |packet|
381
- item = packet['items'].find { |item| item['name'] == item_name }
382
- if item
383
- hash = CvtModel.get(target_name: target_name, packet_name: packet['packet_name'], scope: scope)
384
- if hash['PACKET_TIMESECONDS'] && hash['PACKET_TIMESECONDS'] > latest
385
- latest = hash['PACKET_TIMESECONDS']
386
- requested_item = item
387
- end
388
- end
389
- end
390
- raise "Item '#{target_name} LATEST #{item_name}' does not exist" if latest == -1
391
- else
392
- # Determine if this item exists, it will raise appropriate errors if not
393
- requested_item = TargetModel.packet_item(target_name, packet_name, item_name, scope: scope)
394
- end
395
- return requested_item
376
+ def _get_item(target_name, packet_name, item_name, cache_timeout: 0.1, scope:)
377
+ # Determine if this item exists, it will raise appropriate errors if not
378
+ packet_name = CvtModel.determine_latest_packet_for_item(target_name, item_name, cache_timeout: cache_timeout, scope: $openc3_scope) if packet_name == 'LATEST'
379
+ return TargetModel.packet_item(target_name, packet_name, item_name, scope: scope)
396
380
  end
397
381
  end
398
382
  end
@@ -26,19 +26,22 @@ module OpenC3
26
26
  module Api
27
27
  WHITELIST ||= []
28
28
  WHITELIST.concat([
29
- 'get_target_list',
30
- 'get_target',
31
- 'get_target_interfaces',
32
- 'get_all_target_info', # DEPRECATED
33
- ])
29
+ 'get_target_names',
30
+ 'get_target_list', # DEPRECATED
31
+ 'get_target',
32
+ 'get_target_interfaces',
33
+ 'get_all_target_info', # DEPRECATED
34
+ ])
34
35
 
35
36
  # Returns the list of all target names
36
37
  #
37
38
  # @return [Array<String>] All target names
38
- def get_target_list(scope: $openc3_scope, token: $openc3_token)
39
+ def get_target_names(scope: $openc3_scope, token: $openc3_token)
39
40
  authorize(permission: 'tlm', scope: scope, token: token)
40
41
  TargetModel.names(scope: scope)
41
42
  end
43
+ # get_target_list is DEPRECATED
44
+ alias get_target_list get_target_names
42
45
 
43
46
  # Gets the full target hash
44
47
  #
@@ -57,7 +60,7 @@ module OpenC3
57
60
  authorize(permission: 'system', scope: scope, token: token)
58
61
  info = []
59
62
  interfaces = InterfaceModel.all(scope: scope)
60
- get_target_list(scope: scope, token: token).each do |target_name|
63
+ get_target_names(scope: scope, token: token).each do |target_name|
61
64
  interface_names = []
62
65
  interfaces.each do |name, interface|
63
66
  if interface['target_names'].include? target_name
@@ -76,7 +79,7 @@ module OpenC3
76
79
  def get_all_target_info(scope: $openc3_scope, token: $openc3_token)
77
80
  authorize(permission: 'system', scope: scope, token: token)
78
81
  info = []
79
- get_target_list(scope: scope, token: token).each do |target_name|
82
+ get_target_names(scope: scope, token: token).each do |target_name|
80
83
  cmd_cnt = 0
81
84
  packets = TargetModel.packets(target_name, type: :CMD, scope: scope)
82
85
  packets.each do |packet|
@@ -66,30 +66,30 @@ module OpenC3
66
66
  # @param args [String|Array<String>] See the description for calling style
67
67
  # @param type [Symbol] Telemetry type, :RAW, :CONVERTED (default), :FORMATTED, or :WITH_UNITS
68
68
  # @return [Object] The telemetry value formatted as requested
69
- def tlm(*args, type: :CONVERTED, scope: $openc3_scope, token: $openc3_token)
70
- target_name, packet_name, item_name = tlm_process_args(args, 'tlm', scope: scope)
69
+ def tlm(*args, type: :CONVERTED, cache_timeout: 0.1, scope: $openc3_scope, token: $openc3_token)
70
+ target_name, packet_name, item_name = tlm_process_args(args, 'tlm', cache_timeout: cache_timeout, scope: scope)
71
71
  authorize(permission: 'tlm', target_name: target_name, packet_name: packet_name, scope: scope, token: token)
72
- CvtModel.get_item(target_name, packet_name, item_name, type: type.intern, scope: scope)
72
+ CvtModel.get_item(target_name, packet_name, item_name, type: type.intern, cache_timeout: cache_timeout, scope: scope)
73
73
  end
74
74
 
75
75
  # @deprecated Use tlm with type: :RAW
76
- def tlm_raw(*args, scope: $openc3_scope, token: $openc3_token)
77
- tlm(*args, type: :RAW, scope: scope, token: token)
76
+ def tlm_raw(*args, cache_timeout: 0.1, scope: $openc3_scope, token: $openc3_token)
77
+ tlm(*args, type: :RAW, cache_timeout: cache_timeout, scope: scope, token: token)
78
78
  end
79
79
 
80
80
  # @deprecated Use tlm with type: :FORMATTED
81
- def tlm_formatted(*args, scope: $openc3_scope, token: $openc3_token)
82
- tlm(*args, type: :FORMATTED, scope: scope, token: token)
81
+ def tlm_formatted(*args, cache_timeout: 0.1, scope: $openc3_scope, token: $openc3_token)
82
+ tlm(*args, type: :FORMATTED, cache_timeout: cache_timeout, scope: scope, token: token)
83
83
  end
84
84
 
85
85
  # @deprecated Use tlm with type: :WITH_UNITS
86
- def tlm_with_units(*args, scope: $openc3_scope, token: $openc3_token)
87
- tlm(*args, type: :WITH_UNITS, scope: scope, token: token)
86
+ def tlm_with_units(*args, cache_timeout: 0.1, scope: $openc3_scope, token: $openc3_token)
87
+ tlm(*args, type: :WITH_UNITS, cache_timeout: cache_timeout, scope: scope, token: token)
88
88
  end
89
89
 
90
90
  # @deprecated Use tlm with type:
91
- def tlm_variable(*args, scope: $openc3_scope, token: $openc3_token)
92
- tlm(*args[0..-2], type: args[-1].intern, scope: scope, token: token)
91
+ def tlm_variable(*args, cache_timeout: 0.1, scope: $openc3_scope, token: $openc3_token)
92
+ tlm(*args[0..-2], type: args[-1].intern, cache_timeout: cache_timeout, scope: scope, token: token)
93
93
  end
94
94
 
95
95
  # Set a telemetry item in the current value table.
@@ -227,7 +227,7 @@ module OpenC3
227
227
  # @return [Array<String, Object, Symbol|nil>] Returns an Array consisting
228
228
  # of [item name, item value, item limits state] where the item limits
229
229
  # state can be one of {OpenC3::Limits::LIMITS_STATES}
230
- def get_tlm_packet(target_name, packet_name, stale_time: 30, type: :CONVERTED, scope: $openc3_scope, token: $openc3_token)
230
+ def get_tlm_packet(target_name, packet_name, stale_time: 30, type: :CONVERTED, cache_timeout: 0.1, scope: $openc3_scope, token: $openc3_token)
231
231
  target_name = target_name.upcase
232
232
  packet_name = packet_name.upcase
233
233
  authorize(permission: 'tlm', target_name: target_name, packet_name: packet_name, scope: scope, token: token)
@@ -235,8 +235,8 @@ module OpenC3
235
235
  t = _validate_tlm_type(type)
236
236
  raise ArgumentError, "Unknown type '#{type}' for #{target_name} #{packet_name}" if t.nil?
237
237
  items = packet['items'].map { | item | item['name'].upcase }
238
- cvt_items = items.map { | item | "#{target_name}__#{packet_name}__#{item}__#{type}" }
239
- current_values = CvtModel.get_tlm_values(cvt_items, stale_time: stale_time, scope: scope)
238
+ cvt_items = items.map { | item | [target_name, packet_name, item, type] }
239
+ current_values = CvtModel.get_tlm_values(cvt_items, stale_time: stale_time, cache_timeout: cache_timeout, scope: scope)
240
240
  items.zip(current_values).map { | item , values | [item, values[0], values[1]]}
241
241
  end
242
242
 
@@ -250,25 +250,26 @@ module OpenC3
250
250
  # @return [Array<Object, Symbol>]
251
251
  # Array consisting of the item value and limits state
252
252
  # given as symbols such as :RED, :YELLOW, :STALE
253
- def get_tlm_values(items, stale_time: 30, scope: $openc3_scope, token: $openc3_token)
253
+ def get_tlm_values(items, stale_time: 30, cache_timeout: 0.1, scope: $openc3_scope, token: $openc3_token)
254
254
  if !items.is_a?(Array) || !items[0].is_a?(String)
255
255
  raise ArgumentError, "items must be array of strings: ['TGT__PKT__ITEM__TYPE', ...]"
256
256
  end
257
+ packets = []
258
+ cvt_items = []
257
259
  items.each_with_index do |item, index|
258
- target_name, packet_name, item_name, value_type = item.split('__')
260
+ item_upcase = item.to_s.upcase
261
+ target_name, packet_name, item_name, value_type = item_upcase.split('__')
259
262
  raise ArgumentError, "items must be formatted as TGT__PKT__ITEM__TYPE" if target_name.nil? || packet_name.nil? || item_name.nil? || value_type.nil?
260
- target_name = target_name.upcase
261
- packet_name = packet_name.upcase
262
- item_name = item_name.upcase
263
- value_type = value_type.upcase
264
- if packet_name == 'LATEST'
265
- _, packet_name, _ = tlm_process_args([target_name, packet_name, item_name], 'get_tlm_values', scope: scope) # Figure out which packet is LATEST
266
- end
263
+ packet_name = CvtModel.determine_latest_packet_for_item(target_name, item_name, cache_timeout: cache_timeout, scope: scope) if packet_name == 'LATEST'
267
264
  # Change packet_name in case of LATEST and ensure upcase
268
- items[index] = "#{target_name}__#{packet_name}__#{item_name}__#{value_type}"
265
+ cvt_items[index] = [target_name, packet_name, item_name, value_type]
266
+ packets << [target_name, packet_name]
267
+ end
268
+ packets.uniq!
269
+ packets.each do |target_name, packet_name|
269
270
  authorize(permission: 'tlm', target_name: target_name, packet_name: packet_name, scope: scope, token: token)
270
271
  end
271
- CvtModel.get_tlm_values(items, stale_time: stale_time, scope: scope)
272
+ CvtModel.get_tlm_values(cvt_items, stale_time: stale_time, cache_timeout: cache_timeout, scope: scope)
272
273
  end
273
274
 
274
275
  # Returns an array of all the telemetry packet hashes
@@ -429,7 +430,7 @@ module OpenC3
429
430
  return nil
430
431
  end
431
432
 
432
- def tlm_process_args(args, method_name, scope: $openc3_scope, token: $openc3_token)
433
+ def tlm_process_args(args, method_name, cache_timeout: 0.1, scope: $openc3_scope, token: $openc3_token)
433
434
  case args.length
434
435
  when 1
435
436
  target_name, packet_name, item_name = extract_fields_from_tlm_text(args[0])
@@ -444,19 +445,9 @@ module OpenC3
444
445
  target_name = target_name.upcase
445
446
  packet_name = packet_name.upcase
446
447
  item_name = item_name.upcase
448
+
447
449
  if packet_name == 'LATEST'
448
- latest = -1
449
- TargetModel.packets(target_name, scope: scope).each do |packet|
450
- item = packet['items'].find { |item| item['name'] == item_name }
451
- if item
452
- hash = CvtModel.get(target_name: target_name, packet_name: packet['packet_name'], scope: scope)
453
- if hash['PACKET_TIMESECONDS'] && hash['PACKET_TIMESECONDS'] > latest
454
- latest = hash['PACKET_TIMESECONDS']
455
- packet_name = packet['packet_name']
456
- end
457
- end
458
- end
459
- raise "Item '#{target_name} LATEST #{item_name}' does not exist" if latest == -1
450
+ packet_name = CvtModel.determine_latest_packet_for_item(target_name, item_name, cache_timeout: cache_timeout, scope: scope)
460
451
  else
461
452
  # Determine if this item exists, it will raise appropriate errors if not
462
453
  TargetModel.packet_item(target_name, packet_name, item_name, scope: scope)
@@ -124,14 +124,22 @@ module OpenC3
124
124
  when :BLUE, :GREEN, :GREEN_LOW, :GREEN_HIGH
125
125
  @logger.info message
126
126
  when :YELLOW, :YELLOW_LOW, :YELLOW_HIGH
127
+ notification = NotificationModel.new(
128
+ time: time_nsec,
129
+ severity: "caution",
130
+ url: "/tools/limitsmonitor",
131
+ title: "#{packet.target_name} #{packet.packet_name} #{item.name} #{item.limits.state}",
132
+ body: "#{item.name} is #{item.limits.state}"
133
+ )
134
+ NotificationsTopic.write_notification(notification.as_json(:allow_nan => true), scope: @scope)
127
135
  @logger.warn message
128
136
  when :RED, :RED_LOW, :RED_HIGH
129
137
  notification = NotificationModel.new(
130
138
  time: time_nsec,
131
139
  severity: "critical",
132
140
  url: "/tools/limitsmonitor",
133
- title: "#{packet.target_name} #{packet.packet_name} #{item.name} out of limits",
134
- body: "Item went into #{item.limits.state} limit status."
141
+ title: "#{packet.target_name} #{packet.packet_name} #{item.name} #{item.limits.state}",
142
+ body: "#{item.name} is #{item.limits.state}"
135
143
  )
136
144
  NotificationsTopic.write_notification(notification.as_json(:allow_nan => true), scope: @scope)
137
145
  @logger.error message