openc3 5.11.3 → 5.12.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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/bin/openc3cli +26 -12
  4. data/data/config/_id_items.yaml +6 -4
  5. data/data/config/_id_params.yaml +9 -6
  6. data/data/config/_items.yaml +6 -4
  7. data/data/config/_params.yaml +3 -2
  8. data/data/config/interface_modifiers.yaml +1 -1
  9. data/data/config/microservice.yaml +10 -1
  10. data/data/config/plugins.yaml +13 -3
  11. data/data/config/target.yaml +9 -0
  12. data/data/config/target_config.yaml +12 -0
  13. data/data/config/tool.yaml +12 -3
  14. data/lib/openc3/api/api.rb +1 -1
  15. data/lib/openc3/api/cmd_api.rb +24 -24
  16. data/lib/openc3/api/config_api.rb +12 -12
  17. data/lib/openc3/api/limits_api.rb +4 -3
  18. data/lib/openc3/api/settings_api.rb +5 -2
  19. data/lib/openc3/api/tlm_api.rb +7 -10
  20. data/lib/openc3/conversions/unix_time_conversion.rb +8 -6
  21. data/lib/openc3/interfaces/tcpip_server_interface.rb +0 -7
  22. data/lib/openc3/io/json_drb.rb +3 -2
  23. data/lib/openc3/io/json_rpc.rb +6 -6
  24. data/lib/openc3/logs/buffered_packet_log_writer.rb +4 -2
  25. data/lib/openc3/logs/packet_log_writer.rb +22 -7
  26. data/lib/openc3/microservices/cleanup_microservice.rb +8 -1
  27. data/lib/openc3/microservices/decom_microservice.rb +1 -1
  28. data/lib/openc3/microservices/interface_microservice.rb +2 -2
  29. data/lib/openc3/microservices/microservice.rb +5 -2
  30. data/lib/openc3/microservices/reaction_microservice.rb +1 -0
  31. data/lib/openc3/microservices/timeline_microservice.rb +7 -5
  32. data/lib/openc3/migrations/20231022000000_tlm_viewer_config.rb +22 -0
  33. data/lib/openc3/models/activity_model.rb +21 -3
  34. data/lib/openc3/models/cvt_model.rb +2 -1
  35. data/lib/openc3/models/gem_model.rb +4 -1
  36. data/lib/openc3/models/interface_model.rb +11 -5
  37. data/lib/openc3/models/metadata_model.rb +11 -0
  38. data/lib/openc3/models/microservice_model.rb +16 -3
  39. data/lib/openc3/models/model.rb +18 -0
  40. data/lib/openc3/models/note_model.rb +11 -0
  41. data/lib/openc3/models/plugin_model.rb +18 -0
  42. data/lib/openc3/models/python_package_model.rb +104 -0
  43. data/lib/openc3/models/scope_model.rb +2 -0
  44. data/lib/openc3/models/sorted_model.rb +17 -8
  45. data/lib/openc3/models/target_model.rb +53 -18
  46. data/lib/openc3/models/tool_config_model.rb +9 -3
  47. data/lib/openc3/models/tool_model.rb +22 -7
  48. data/lib/openc3/models/widget_model.rb +19 -3
  49. data/lib/openc3/operators/microservice_operator.rb +2 -0
  50. data/lib/openc3/packets/limits.rb +6 -18
  51. data/lib/openc3/packets/packet.rb +1 -0
  52. data/lib/openc3/packets/parsers/format_string_parser.rb +4 -4
  53. data/lib/openc3/packets/parsers/limits_parser.rb +4 -4
  54. data/lib/openc3/packets/parsers/limits_response_parser.rb +5 -5
  55. data/lib/openc3/packets/parsers/processor_parser.rb +4 -4
  56. data/lib/openc3/packets/parsers/state_parser.rb +3 -3
  57. data/lib/openc3/script/api_shared.rb +50 -32
  58. data/lib/openc3/script/calendar.rb +109 -0
  59. data/lib/openc3/script/commands.rb +1 -8
  60. data/lib/openc3/script/{gems.rb → packages.rb} +20 -16
  61. data/lib/openc3/script/script.rb +49 -38
  62. data/lib/openc3/system/system.rb +2 -0
  63. data/lib/openc3/system/target.rb +10 -1
  64. data/lib/openc3/top_level.rb +2 -2
  65. data/lib/openc3/utilities/aws_bucket.rb +3 -2
  66. data/lib/openc3/utilities/bucket_file_cache.rb +1 -1
  67. data/lib/openc3/utilities/local_mode.rb +3 -1
  68. data/lib/openc3/utilities/logger.rb +1 -1
  69. data/lib/openc3/utilities/ruby_lex_utils.rb +0 -8
  70. data/lib/openc3/version.rb +6 -6
  71. data/templates/tool_angular/package.json +14 -14
  72. data/templates/tool_angular/yarn.lock +282 -129
  73. data/templates/tool_react/package.json +11 -11
  74. data/templates/tool_react/yarn.lock +353 -300
  75. data/templates/tool_svelte/package.json +12 -12
  76. data/templates/tool_svelte/src/services/openc3-api.js +16 -60
  77. data/templates/tool_svelte/yarn.lock +338 -212
  78. data/templates/tool_vue/package.json +9 -9
  79. data/templates/tool_vue/yarn.lock +55 -41
  80. data/templates/widget/package.json +10 -10
  81. data/templates/widget/yarn.lock +59 -45
  82. metadata +36 -5
@@ -73,21 +73,21 @@ module OpenC3
73
73
  # @param packet_name [String] The packet name. Must be a defined packet name and not 'LATEST'.
74
74
  # @param item_name [String] The item name
75
75
  def enabled?(target_name, packet_name, item_name)
76
- get_packet(target_name, packet_name).get_item(item_name).limits.enabled
76
+ _get_packet(target_name, packet_name).get_item(item_name).limits.enabled
77
77
  end
78
78
 
79
79
  # Enables limit checking for the specified item
80
80
  #
81
81
  # @param (see #enabled?)
82
82
  def enable(target_name, packet_name, item_name)
83
- get_packet(target_name, packet_name).enable_limits(item_name)
83
+ _get_packet(target_name, packet_name).enable_limits(item_name)
84
84
  end
85
85
 
86
86
  # Disables limit checking for the specified item
87
87
  #
88
88
  # @param (see #enabled?)
89
89
  def disable(target_name, packet_name, item_name)
90
- get_packet(target_name, packet_name).disable_limits(item_name)
90
+ _get_packet(target_name, packet_name).disable_limits(item_name)
91
91
  end
92
92
 
93
93
  # Get the limits for a telemetry item
@@ -98,7 +98,7 @@ module OpenC3
98
98
  # @param limits_set [String or Symbol or nil] Desired Limits set. nil = current limits set
99
99
  # @return [Array<limits_set, persistence, enabled, red_low, yellow_low, red_high, yellow_high, green_low (optional), green_high (optional)] Limits information
100
100
  def get(target_name, packet_name, item_name, limits_set = nil)
101
- limits = get_packet(target_name, packet_name).get_item(item_name).limits
101
+ limits = _get_packet(target_name, packet_name).get_item(item_name).limits
102
102
  if limits.values
103
103
  if limits_set
104
104
  limits_set = limits_set.to_s.upcase.intern
@@ -132,7 +132,7 @@ module OpenC3
132
132
  # @param enabled [Boolean] If limits monitoring is enabled for this item
133
133
  # @return [Array<limits_set, persistence, enabled, red_low, yellow_low, red_high, yellow_high, green_low (optional), green_high (optional)] Limits information
134
134
  def set(target_name, packet_name, item_name, red_low, yellow_low, yellow_high, red_high, green_low = nil, green_high = nil, limits_set = :CUSTOM, persistence = nil, enabled = true)
135
- packet = get_packet(target_name, packet_name)
135
+ packet = _get_packet(target_name, packet_name)
136
136
  item = packet.get_item(item_name)
137
137
  limits = item.limits
138
138
  if limits_set
@@ -172,7 +172,7 @@ module OpenC3
172
172
 
173
173
  protected
174
174
 
175
- def get_packet(target_name, packet_name)
175
+ def _get_packet(target_name, packet_name)
176
176
  raise "LATEST packet not valid" if packet_name.upcase == LATEST_PACKET_NAME
177
177
 
178
178
  packets = @config.telemetry[target_name.to_s.upcase]
@@ -183,17 +183,5 @@ module OpenC3
183
183
 
184
184
  return packet
185
185
  end
186
-
187
- def includes_item?(ignored_items, target_name, packet_name, item_name)
188
- ignored_items.each do |array_target_name, array_packet_name, array_item_name|
189
- if (array_target_name == target_name) &&
190
- (array_packet_name == packet_name) &&
191
- # If the item name is nil we're ignoring an entire packet
192
- (array_item_name == item_name || array_item_name.nil?)
193
- return true
194
- end
195
- end
196
- return false
197
- end
198
186
  end
199
187
  end
@@ -1061,6 +1061,7 @@ module OpenC3
1061
1061
  config['accessor'] = @accessor.class.to_s
1062
1062
  config['accessor_args'] = @accessor.args
1063
1063
  config['template'] = Base64.encode64(@template) if @template
1064
+ config['config_name'] = self.config_name
1064
1065
 
1065
1066
  if @processors
1066
1067
  processors = []
@@ -17,7 +17,7 @@
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
- # This file may also be used under the terms of a commercial license
20
+ # This file may also be used under the terms of a commercial license
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  module OpenC3
@@ -25,9 +25,9 @@ module OpenC3
25
25
  # @param parser [ConfigParser] Configuration parser
26
26
  # @param item [Packet] The current item
27
27
  def self.parse(parser, item)
28
- @parser = FormatStringParser.new(parser)
29
- @parser.verify_parameters()
30
- @parser.create_format_string(item)
28
+ parser = FormatStringParser.new(parser)
29
+ parser.verify_parameters()
30
+ parser.create_format_string(item)
31
31
  end
32
32
 
33
33
  # @param parser [ConfigParser] Configuration parser
@@ -17,7 +17,7 @@
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
- # This file may also be used under the terms of a commercial license
20
+ # This file may also be used under the terms of a commercial license
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  module OpenC3
@@ -31,9 +31,9 @@ module OpenC3
31
31
  def self.parse(parser, packet, cmd_or_tlm, item, warnings)
32
32
  raise parser.error("Items with STATE can't define LIMITS") if item.states
33
33
 
34
- @parser = LimitsParser.new(parser)
35
- @parser.verify_parameters(cmd_or_tlm)
36
- @parser.create_limits(packet, item, warnings)
34
+ parser = LimitsParser.new(parser)
35
+ parser.verify_parameters(cmd_or_tlm)
36
+ parser.create_limits(packet, item, warnings)
37
37
  end
38
38
 
39
39
  def initialize(parser)
@@ -14,10 +14,10 @@
14
14
  # GNU Affero General Public License for more details.
15
15
 
16
16
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
17
+ # All changes Copyright 2023, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
- # This file may also be used under the terms of a commercial license
20
+ # This file may also be used under the terms of a commercial license
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  module OpenC3
@@ -26,9 +26,9 @@ module OpenC3
26
26
  # @param item [Packet] The current item
27
27
  # @param cmd_or_tlm [String] Whether this is a command or telemetry packet
28
28
  def self.parse(parser, item, cmd_or_tlm)
29
- @parser = LimitsResponseParser.new(parser)
30
- @parser.verify_parameters(cmd_or_tlm)
31
- @parser.create_limits_response(item)
29
+ parser = LimitsResponseParser.new(parser)
30
+ parser.verify_parameters(cmd_or_tlm)
31
+ parser.create_limits_response(item)
32
32
  end
33
33
 
34
34
  # @param parser [ConfigParser] Configuration parser
@@ -17,7 +17,7 @@
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
- # This file may also be used under the terms of a commercial license
20
+ # This file may also be used under the terms of a commercial license
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  require 'openc3/processors'
@@ -28,9 +28,9 @@ module OpenC3
28
28
  # @param packet [Packet] The current packet
29
29
  # @param cmd_or_tlm [String] Whether this is a command or telemetry packet
30
30
  def self.parse(parser, packet, cmd_or_tlm)
31
- @parser = ProcessorParser.new(parser)
32
- @parser.verify_parameters(cmd_or_tlm)
33
- @parser.create_processor(packet)
31
+ parser = ProcessorParser.new(parser)
32
+ parser.verify_parameters(cmd_or_tlm)
33
+ parser.create_processor(packet)
34
34
  end
35
35
 
36
36
  # @param parser [ConfigParser] Configuration parser
@@ -34,9 +34,9 @@ module OpenC3
34
34
  raise parser.error("Items with LIMITS can't define STATE") if item.limits.values
35
35
  raise parser.error("Items with UNITS can't define STATE") if item.units
36
36
 
37
- @parser = StateParser.new(parser)
38
- @parser.verify_parameters(cmd_or_tlm)
39
- @parser.create_state(packet, cmd_or_tlm, item, warnings)
37
+ parser = StateParser.new(parser)
38
+ parser.verify_parameters(cmd_or_tlm)
39
+ parser.create_state(packet, cmd_or_tlm, item, warnings)
40
40
  end
41
41
 
42
42
  # @param parser [ConfigParser] Configuration parser
@@ -14,7 +14,7 @@
14
14
  # GNU Affero General Public License for more details.
15
15
 
16
16
  # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
17
+ # All changes Copyright 2023, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
20
  # This file may also be used under the terms of a commercial license
@@ -140,7 +140,7 @@ module OpenC3
140
140
  # Check to see if an expression is true without waiting. If the expression
141
141
  # is not true, the script will pause.
142
142
  def check_expression(exp_to_eval, context = nil, scope: $openc3_scope, token: $openc3_token)
143
- success = openc3_script_wait_implementation_expression(exp_to_eval, 0, DEFAULT_TLM_POLLING_RATE, context, scope: scope, token: token)
143
+ success = _openc3_script_wait_implementation_expression(exp_to_eval, 0, DEFAULT_TLM_POLLING_RATE, context, scope: scope, token: token)
144
144
  if success
145
145
  Logger.info "CHECK: #{exp_to_eval} is TRUE"
146
146
  else
@@ -238,7 +238,7 @@ module OpenC3
238
238
  if value.is_a?(Array)
239
239
  expected_value, tolerance = _array_tolerance_process_args(value.size, expected_value, tolerance, 'wait_tolerance')
240
240
 
241
- success, value = openc3_script_wait_implementation_array_tolerance(value.size, target_name, packet_name, item_name, type, expected_value, tolerance, timeout, polling_rate, scope: scope, token: token)
241
+ success, value = _openc3_script_wait_implementation_array_tolerance(value.size, target_name, packet_name, item_name, type, expected_value, tolerance, timeout, polling_rate, scope: scope, token: token)
242
242
  time = Time.now.sys - start_time
243
243
 
244
244
  message = ""
@@ -259,7 +259,7 @@ module OpenC3
259
259
  Logger.warn message unless quiet
260
260
  end
261
261
  else
262
- success, value = openc3_script_wait_implementation_tolerance(target_name, packet_name, item_name, type, expected_value, tolerance, timeout, polling_rate, scope: scope, token: token)
262
+ success, value = _openc3_script_wait_implementation_tolerance(target_name, packet_name, item_name, type, expected_value, tolerance, timeout, polling_rate, scope: scope, token: token)
263
263
  time = Time.now.sys - start_time
264
264
  range = (expected_value - tolerance)..(expected_value + tolerance)
265
265
  wait_str = "WAIT: #{_upcase(target_name, packet_name, item_name)}"
@@ -281,7 +281,7 @@ module OpenC3
281
281
  # Wait on a custom expression to be true
282
282
  def wait_expression(exp_to_eval, timeout, polling_rate = DEFAULT_TLM_POLLING_RATE, context = nil, quiet: false, scope: $openc3_scope, token: $openc3_token)
283
283
  start_time = Time.now.sys
284
- success = openc3_script_wait_implementation_expression(exp_to_eval, timeout, polling_rate, context, scope: scope, token: token)
284
+ success = _openc3_script_wait_implementation_expression(exp_to_eval, timeout, polling_rate, context, scope: scope, token: token)
285
285
  time_diff = Time.now.sys - start_time
286
286
  if success
287
287
  Logger.info "WAIT: #{exp_to_eval} is TRUE after waiting #{time_diff} seconds" unless quiet
@@ -303,10 +303,13 @@ module OpenC3
303
303
  def wait_check(*args, type: :CONVERTED, scope: $openc3_scope, token: $openc3_token, &block)
304
304
  target_name, packet_name, item_name, comparison_to_eval, timeout, polling_rate = _wait_check_process_args(args)
305
305
  start_time = Time.now.sys
306
- success, value = openc3_script_wait_implementation(target_name, packet_name, item_name, type, comparison_to_eval, timeout, polling_rate, scope: scope, token: token, &block)
306
+ success, value = _openc3_script_wait_implementation_comparison(target_name, packet_name, item_name, type, comparison_to_eval, timeout, polling_rate, scope: scope, token: token, &block)
307
307
  value = "'#{value}'" if value.is_a? String # Show user the check against a quoted string
308
308
  time_diff = Time.now.sys - start_time
309
- check_str = "CHECK: #{_upcase(target_name, packet_name, item_name)} #{comparison_to_eval}"
309
+ check_str = "CHECK: #{_upcase(target_name, packet_name, item_name)}"
310
+ if comparison_to_eval
311
+ check_str += " #{comparison_to_eval}"
312
+ end
310
313
  with_value_str = "with value == #{value} after waiting #{time_diff} seconds"
311
314
  if success
312
315
  Logger.info "#{check_str} success #{with_value_str}"
@@ -344,7 +347,7 @@ module OpenC3
344
347
  if value.is_a?(Array)
345
348
  expected_value, tolerance = _array_tolerance_process_args(value.size, expected_value, tolerance, 'wait_check_tolerance')
346
349
 
347
- success, value = openc3_script_wait_implementation_array_tolerance(value.size, target_name, packet_name, item_name, type, expected_value, tolerance, timeout, polling_rate, scope: scope, token: token, &block)
350
+ success, value = _openc3_script_wait_implementation_array_tolerance(value.size, target_name, packet_name, item_name, type, expected_value, tolerance, timeout, polling_rate, scope: scope, token: token, &block)
348
351
  time_diff = Time.now.sys - start_time
349
352
 
350
353
  message = ""
@@ -369,7 +372,7 @@ module OpenC3
369
372
  end
370
373
  end
371
374
  else
372
- success, value = openc3_script_wait_implementation_tolerance(target_name, packet_name, item_name, type, expected_value, tolerance, timeout, polling_rate, scope: scope, token: token)
375
+ success, value = _openc3_script_wait_implementation_tolerance(target_name, packet_name, item_name, type, expected_value, tolerance, timeout, polling_rate, scope: scope, token: token)
373
376
  time_diff = Time.now.sys - start_time
374
377
  range = (expected_value - tolerance)..(expected_value + tolerance)
375
378
  check_str = "CHECK: #{_upcase(target_name, packet_name, item_name)}"
@@ -400,7 +403,7 @@ module OpenC3
400
403
  context = nil,
401
404
  scope: $openc3_scope, token: $openc3_token, &block)
402
405
  start_time = Time.now.sys
403
- success = openc3_script_wait_implementation_expression(exp_to_eval,
406
+ success = _openc3_script_wait_implementation_expression(exp_to_eval,
404
407
  timeout,
405
408
  polling_rate,
406
409
  context, scope: scope, token: token, &block)
@@ -545,6 +548,10 @@ module OpenC3
545
548
  case args.length
546
549
  when 1
547
550
  target_name, packet_name, item_name, comparison_to_eval = extract_fields_from_check_text(args[0])
551
+ when 3
552
+ target_name = args[0]
553
+ packet_name = args[1]
554
+ item_name = args[2]
548
555
  when 4
549
556
  target_name = args[0]
550
557
  packet_name = args[1]
@@ -554,7 +561,9 @@ module OpenC3
554
561
  # Invalid number of arguments
555
562
  raise "ERROR: Invalid number of arguments (#{args.length}) passed to #{method_name}()"
556
563
  end
557
- raise "Invalid comparison to non-ascii value" unless comparison_to_eval.is_printable?
564
+ if comparison_to_eval and !comparison_to_eval.is_printable?
565
+ raise "ERROR: Invalid comparison to non-ascii value"
566
+ end
558
567
  return [target_name, packet_name, item_name, comparison_to_eval]
559
568
  end
560
569
 
@@ -599,15 +608,15 @@ module OpenC3
599
608
  # If the packet has not been received the initial_count could be nil
600
609
  initial_count = 0 unless initial_count
601
610
  start_time = Time.now.sys
602
- success, value = openc3_script_wait_implementation(target_name,
603
- packet_name,
604
- 'RECEIVED_COUNT',
605
- :CONVERTED,
606
- ">= #{initial_count + num_packets}",
607
- timeout,
608
- polling_rate,
609
- scope: scope,
610
- token: token)
611
+ success, value = _openc3_script_wait_implementation_comparison(target_name,
612
+ packet_name,
613
+ 'RECEIVED_COUNT',
614
+ :CONVERTED,
615
+ ">= #{initial_count + num_packets}",
616
+ timeout,
617
+ polling_rate,
618
+ scope: scope,
619
+ token: token)
611
620
  # If the packet has not been received the value could be nil
612
621
  value = 0 unless value
613
622
  time_diff = Time.now.sys - start_time
@@ -630,7 +639,7 @@ module OpenC3
630
639
 
631
640
  def _execute_wait(target_name, packet_name, item_name, value_type, comparison_to_eval, timeout, polling_rate, quiet: false, scope: $openc3_scope, token: $openc3_token)
632
641
  start_time = Time.now.sys
633
- success, value = openc3_script_wait_implementation(target_name, packet_name, item_name, value_type, comparison_to_eval, timeout, polling_rate, scope: scope, token: token)
642
+ success, value = _openc3_script_wait_implementation_comparison(target_name, packet_name, item_name, value_type, comparison_to_eval, timeout, polling_rate, scope: scope, token: token)
634
643
  value = "'#{value}'" if value.is_a? String # Show user the check against a quoted string
635
644
  time_diff = Time.now.sys - start_time
636
645
  wait_str = "WAIT: #{_upcase(target_name, packet_name, item_name)} #{comparison_to_eval}"
@@ -732,8 +741,9 @@ module OpenC3
732
741
 
733
742
  def _openc3_script_wait_implementation(target_name, packet_name, item_name, value_type, timeout, polling_rate, exp_to_eval, scope: $openc3_scope, token: $openc3_token, &block)
734
743
  end_time = Time.now.sys + timeout
735
- raise "Invalid comparison to non-ascii value" unless exp_to_eval.is_printable?
736
-
744
+ if exp_to_eval and !exp_to_eval.is_printable?
745
+ raise "ERROR: Invalid comparison to non-ascii value"
746
+ end
737
747
  while true
738
748
  work_start = Time.now.sys
739
749
  value = tlm(target_name, packet_name, item_name, type: value_type, scope: scope, token: token)
@@ -762,15 +772,23 @@ module OpenC3
762
772
 
763
773
  if canceled
764
774
  value = tlm(target_name, packet_name, item_name, type: value_type, scope: scope, token: token)
765
- begin
766
- if eval(exp_to_eval)
775
+ if not block.nil?
776
+ if block.call(value)
767
777
  return true, value
768
778
  else
769
779
  return false, value
770
780
  end
771
- # NoMethodError is raised when the tlm() returns nil and we try to eval the expression
772
- rescue NoMethodError
773
- return false, value
781
+ else
782
+ begin
783
+ if eval(exp_to_eval)
784
+ return true, value
785
+ else
786
+ return false, value
787
+ end
788
+ # NoMethodError is raised when the tlm() returns nil and we try to eval the expression
789
+ rescue NoMethodError
790
+ return false, value
791
+ end
774
792
  end
775
793
  end
776
794
  end
@@ -787,7 +805,7 @@ module OpenC3
787
805
  end
788
806
 
789
807
  # Wait for a converted telemetry item to pass a comparison
790
- def openc3_script_wait_implementation(target_name, packet_name, item_name, value_type, comparison_to_eval, timeout, polling_rate = DEFAULT_TLM_POLLING_RATE, scope: $openc3_scope, token: $openc3_token, &block)
808
+ def _openc3_script_wait_implementation_comparison(target_name, packet_name, item_name, value_type, comparison_to_eval, timeout, polling_rate = DEFAULT_TLM_POLLING_RATE, scope: $openc3_scope, token: $openc3_token, &block)
791
809
  if comparison_to_eval
792
810
  exp_to_eval = "value " + comparison_to_eval
793
811
  else
@@ -796,12 +814,12 @@ module OpenC3
796
814
  _openc3_script_wait_implementation(target_name, packet_name, item_name, value_type, timeout, polling_rate, exp_to_eval, scope: scope, token: token, &block)
797
815
  end
798
816
 
799
- def openc3_script_wait_implementation_tolerance(target_name, packet_name, item_name, value_type, expected_value, tolerance, timeout, polling_rate = DEFAULT_TLM_POLLING_RATE, scope: $openc3_scope, token: $openc3_token, &block)
817
+ def _openc3_script_wait_implementation_tolerance(target_name, packet_name, item_name, value_type, expected_value, tolerance, timeout, polling_rate = DEFAULT_TLM_POLLING_RATE, scope: $openc3_scope, token: $openc3_token, &block)
800
818
  exp_to_eval = "((#{expected_value} - #{tolerance})..(#{expected_value} + #{tolerance})).include? value"
801
819
  _openc3_script_wait_implementation(target_name, packet_name, item_name, value_type, timeout, polling_rate, exp_to_eval, scope: scope, token: token, &block)
802
820
  end
803
821
 
804
- def openc3_script_wait_implementation_array_tolerance(array_size, target_name, packet_name, item_name, value_type, expected_value, tolerance, timeout, polling_rate = DEFAULT_TLM_POLLING_RATE, scope: $openc3_scope, token: $openc3_token, &block)
822
+ def _openc3_script_wait_implementation_array_tolerance(array_size, target_name, packet_name, item_name, value_type, expected_value, tolerance, timeout, polling_rate = DEFAULT_TLM_POLLING_RATE, scope: $openc3_scope, token: $openc3_token, &block)
805
823
  statements = []
806
824
  array_size.times { |i| statements << "(((#{expected_value[i]} - #{tolerance[i]})..(#{expected_value[i]} + #{tolerance[i]})).include? value[#{i}])" }
807
825
  exp_to_eval = statements.join(" && ")
@@ -809,7 +827,7 @@ module OpenC3
809
827
  end
810
828
 
811
829
  # Wait on an expression to be true.
812
- def openc3_script_wait_implementation_expression(exp_to_eval, timeout, polling_rate, context, scope: $openc3_scope, token: $openc3_token)
830
+ def _openc3_script_wait_implementation_expression(exp_to_eval, timeout, polling_rate, context, scope: $openc3_scope, token: $openc3_token)
813
831
  end_time = Time.now.sys + timeout
814
832
  raise "Invalid comparison to non-ascii value" unless exp_to_eval.is_printable?
815
833
 
@@ -0,0 +1,109 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2023 OpenC3, Inc.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU Affero General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+
16
+ # This file may also be used under the terms of a commercial license
17
+ # if purchased from OpenC3, Inc.
18
+
19
+ require 'date'
20
+
21
+ module OpenC3
22
+ module Script
23
+
24
+ private
25
+
26
+ def list_timelines(scope: $openc3_scope, token: $openc3_token)
27
+ response = $api_server.request('get', "/openc3-api/timeline", scope: scope)
28
+ return _handle_response(response, 'Failed to list timelines')
29
+ end
30
+
31
+ def create_timeline(name, color: nil, scope: $openc3_scope, token: $openc3_token)
32
+ data = {}
33
+ data['name'] = name
34
+ data['color'] = color if color
35
+ response = $api_server.request('post', "/openc3-api/timeline", data: data, json: true, scope: scope)
36
+ return _handle_response(response, 'Failed to create timeline')
37
+ end
38
+
39
+ def get_timeline(name, scope: $openc3_scope, token: $openc3_token)
40
+ response = $api_server.request('get', "/openc3-api/timeline/#{name}", scope: scope)
41
+ return _handle_response(response, 'Failed to get timeline')
42
+ end
43
+
44
+ def set_timeline_color(name, color, scope: $openc3_scope, token: $openc3_token)
45
+ post_data = {}
46
+ post_data['color'] = color
47
+ response = $api_server.request('post', "/openc3-api/timeline/#{name}/color", data: post_data, json: true, scope: scope)
48
+ return _handle_response(response, 'Failed to set timeline color')
49
+ end
50
+
51
+ def delete_timeline(name, force: false, scope: $openc3_scope, token: $openc3_token)
52
+ url = "/openc3-api/timeline/#{name}"
53
+ if force
54
+ url += "?force=true"
55
+ end
56
+ response = $api_server.request('delete', url, scope: scope)
57
+ return _handle_response(response, 'Failed to delete timeline')
58
+ end
59
+
60
+ def get_timeline_activities(name, start: nil, stop: nil, scope: $openc3_scope, token: $openc3_token)
61
+ url = "/openc3-api/timeline/#{name}/activities"
62
+ if start and stop
63
+ url += "?start=#{start}&stop=#{stop}"
64
+ end
65
+ response = $api_server.request('get', url, scope: scope)
66
+ return _handle_response(response, 'Failed to get timeline activities')
67
+ end
68
+
69
+ def create_timeline_activity(name, kind:, start:, stop:, data: {}, scope: $openc3_scope, token: $openc3_token)
70
+ kind = kind.to_s.downcase()
71
+ kinds = %w(command script reserve)
72
+ unless kinds.include?(kind)
73
+ raise "Unknown kind: #{kind}. Must be one of #{kinds.join(', ')}."
74
+ end
75
+ post_data = {}
76
+ post_data['start'] = start.to_datetime.iso8601
77
+ post_data['stop'] = stop.to_datetime.iso8601
78
+ post_data['kind'] = kind
79
+ post_data['data'] = data
80
+ response = $api_server.request('post', "/openc3-api/timeline/#{name}/activities", data: post_data, json: true, scope: scope)
81
+ return _handle_response(response, 'Failed to create timeline activity')
82
+ end
83
+
84
+ def get_timeline_activity(name, start: nil, scope: $openc3_scope, token: $openc3_token)
85
+ response = $api_server.request('get', "/openc3-api/timeline/#{name}/activity/#{start}", scope: scope)
86
+ return _handle_response(response, 'Failed to get timeline activity')
87
+ end
88
+
89
+ def delete_timeline_activity(name, start, scope: $openc3_scope, token: $openc3_token)
90
+ response = $api_server.request('delete', "/openc3-api/timeline/#{name}/activity/#{start}", scope: scope)
91
+ return _handle_response(response, 'Failed to delete timeline activity')
92
+ end
93
+
94
+ # Helper method to handle the response
95
+ def _handle_response(response, error_message)
96
+ return nil if response.nil?
97
+ if response.status >= 400
98
+ result = JSON.parse(response.body, :allow_nan => true, :create_additions => true)
99
+ raise "#{error_message} due to #{result['message']}"
100
+ end
101
+ # TODO: Not sure why the response body is empty (on delete) but check for that
102
+ if response.body.nil? or response.body.empty?
103
+ return nil
104
+ else
105
+ return JSON.parse(response.body, :allow_nan => true, :create_additions => true)
106
+ end
107
+ end
108
+ end
109
+ end
@@ -173,7 +173,7 @@ module OpenC3
173
173
  # Accepts two different calling styles:
174
174
  # build_command("TGT CMD with PARAM1 val, PARAM2 val")
175
175
  # build_command('TGT','CMD',{'PARAM1'=>val,'PARAM2'=>val})
176
- def build_command(*args, **kwargs)
176
+ def build_command(*args, range_check: true, raw: false, scope: $openc3_scope, **kwargs)
177
177
  extract_string_kwargs_to_args(args, kwargs)
178
178
  $api_server.build_command(*args)
179
179
  end
@@ -188,13 +188,6 @@ module OpenC3
188
188
  $api_server.get_cmd_hazardous(*args)
189
189
  end
190
190
 
191
- # Sends raw data through an interface from a file
192
- def send_raw_file(interface_name, filename, scope: $openc3_scope)
193
- data = nil
194
- File.open(filename, 'rb') { |file| data = file.read }
195
- $api_server.send_raw(interface_name, data, scope: scope)
196
- end
197
-
198
191
  # Returns the time the most recent command was sent
199
192
  def get_cmd_time(target_name = nil, command_name = nil, scope: $openc3_scope)
200
193
  results = $api_server.get_cmd_time(target_name, command_name, scope: scope)
@@ -22,10 +22,10 @@ module OpenC3
22
22
  module Script
23
23
  private
24
24
 
25
- def gem_list(scope: $openc3_scope)
25
+ def package_list(scope: $openc3_scope)
26
26
  response_body = nil
27
27
  begin
28
- endpoint = "/openc3-api/gems?scope=#{scope}"
28
+ endpoint = "/openc3-api/packages?scope=#{scope}"
29
29
  uri = URI.parse($api_server.generate_url + endpoint)
30
30
  auth = $api_server.generate_auth
31
31
 
@@ -41,20 +41,21 @@ module OpenC3
41
41
  end
42
42
  end
43
43
  rescue => error
44
- raise "gem_list failed due to #{error.formatted}\nResponse:\n#{response_body}"
44
+ raise "package_list failed due to #{error.formatted}\nResponse:\n#{response_body}"
45
45
  end
46
46
  end
47
+ alias gem_list package_list
47
48
 
48
- def gem_install(file_path, scope: $openc3_scope)
49
+ def package_install(file_path, scope: $openc3_scope)
49
50
  response_body = nil
50
51
  begin
51
- endpoint = "/openc3-api/gems?scope=#{scope}"
52
+ endpoint = "/openc3-api/packages?scope=#{scope}"
52
53
  uri = URI.parse($api_server.generate_url + endpoint)
53
54
  auth = $api_server.generate_auth
54
55
 
55
56
  File.open(file_path, 'rb') do |file|
56
57
  request = Net::HTTP::Post.new(uri)
57
- form_data = [["gem", file]]
58
+ form_data = [["package", file]]
58
59
  request.set_form(form_data, "multipart/form-data")
59
60
  request['User-Agent'] = JsonDRbObject::USER_AGENT
60
61
  request['Authorization'] = auth.token
@@ -67,14 +68,15 @@ module OpenC3
67
68
  end
68
69
  end
69
70
  rescue => error
70
- raise "gem_install failed due to #{error.formatted}\nResponse:\n#{response_body}"
71
+ raise "package_install failed due to #{error.formatted}\nResponse:\n#{response_body}"
71
72
  end
72
73
  end
74
+ alias gem_install package_install
73
75
 
74
- def gem_uninstall(gem_name, scope: $openc3_scope)
76
+ def package_uninstall(package_name, scope: $openc3_scope)
75
77
  response_body = nil
76
78
  begin
77
- endpoint = "/openc3-api/gems/#{gem_name}?scope=#{scope}"
79
+ endpoint = "/openc3-api/packages/#{package_name}?scope=#{scope}"
78
80
  uri = URI.parse($api_server.generate_url + endpoint)
79
81
  auth = $api_server.generate_auth
80
82
  request = Net::HTTP::Delete.new(uri)
@@ -84,22 +86,24 @@ module OpenC3
84
86
  http.request(request) do |response|
85
87
  response_body = response.body
86
88
  response.value() # Raises an HTTP error if the response is not 2xx (success)
87
- return true
89
+ return response_body.remove_quotes
88
90
  end
89
91
  end
90
92
  rescue => error
91
- raise "gem_uninstall failed due to #{error.formatted}\nResponse:\n#{response_body}"
93
+ raise "package_uninstall failed due to #{error.formatted}\nResponse:\n#{response_body}"
92
94
  end
93
95
  end
96
+ alias package_uninstall package_uninstall
94
97
 
95
- def gem_status(process_name, scope: $openc3_scope)
98
+ def package_status(process_name, scope: $openc3_scope)
96
99
  return plugin_status(process_name, scope: scope)
97
100
  end
101
+ alias gem_status package_status
98
102
 
99
- def gem_download(gem_name, local_file_path, scope: $openc3_scope)
103
+ def package_download(package_name, local_file_path, scope: $openc3_scope)
100
104
  response_body = nil
101
105
  begin
102
- endpoint = "/openc3-api/gems/#{gem_name}/download?scope=#{scope}"
106
+ endpoint = "/openc3-api/packages/#{package_name}/download?scope=#{scope}"
103
107
  uri = URI.parse($api_server.generate_url + endpoint)
104
108
  auth = $api_server.generate_auth
105
109
  request = Net::HTTP::Post.new(uri)
@@ -117,9 +121,9 @@ module OpenC3
117
121
  end
118
122
  end
119
123
  rescue => error
120
- raise "gem_uninstall failed due to #{error.formatted}\nResponse:\n#{response_body}"
124
+ raise "package_download failed due to #{error.formatted}\nResponse:\n#{response_body}"
121
125
  end
122
126
  end
123
-
127
+ alias gem_download package_download
124
128
  end
125
129
  end