openc3 5.18.0 → 5.19.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.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +7 -4
  3. data/bin/cstol_converter +14 -14
  4. data/bin/openc3cli +189 -7
  5. data/data/config/_interfaces.yaml +1 -1
  6. data/data/config/command_modifiers.yaml +55 -0
  7. data/data/config/interface_modifiers.yaml +1 -1
  8. data/data/config/param_item_modifiers.yaml +1 -1
  9. data/data/config/parameter_modifiers.yaml +1 -1
  10. data/data/config/plugins.yaml +6 -2
  11. data/data/config/screen.yaml +2 -2
  12. data/data/config/table_manager.yaml +2 -2
  13. data/data/config/tool.yaml +4 -1
  14. data/data/config/widgets.yaml +3 -3
  15. data/ext/openc3/ext/config_parser/config_parser.c +1 -1
  16. data/ext/openc3/ext/packet/packet.c +1 -1
  17. data/ext/openc3/ext/platform/platform.c +3 -3
  18. data/ext/openc3/ext/structure/structure.c +56 -76
  19. data/lib/openc3/accessors/binary_accessor.rb +4 -4
  20. data/lib/openc3/accessors/form_accessor.rb +2 -2
  21. data/lib/openc3/accessors/http_accessor.rb +1 -1
  22. data/lib/openc3/accessors/json_accessor.rb +6 -4
  23. data/lib/openc3/accessors/template_accessor.rb +6 -9
  24. data/lib/openc3/accessors/xml_accessor.rb +1 -1
  25. data/lib/openc3/api/cmd_api.rb +35 -11
  26. data/lib/openc3/api/limits_api.rb +1 -1
  27. data/lib/openc3/config/config_parser.rb +1 -1
  28. data/lib/openc3/conversions/segmented_polynomial_conversion.rb +7 -7
  29. data/lib/openc3/core_ext/array.rb +5 -5
  30. data/lib/openc3/core_ext/exception.rb +9 -2
  31. data/lib/openc3/core_ext/string.rb +2 -2
  32. data/lib/openc3/interfaces/http_server_interface.rb +1 -0
  33. data/lib/openc3/interfaces/interface.rb +1 -1
  34. data/lib/openc3/interfaces/linc_interface.rb +3 -3
  35. data/lib/openc3/io/json_api.rb +11 -6
  36. data/lib/openc3/io/json_rpc.rb +1 -1
  37. data/lib/openc3/logs/buffered_packet_log_writer.rb +3 -3
  38. data/lib/openc3/logs/log_writer.rb +7 -8
  39. data/lib/openc3/logs/packet_log_writer.rb +7 -7
  40. data/lib/openc3/logs/text_log_writer.rb +4 -4
  41. data/lib/openc3/microservices/decom_microservice.rb +19 -4
  42. data/lib/openc3/microservices/interface_microservice.rb +41 -3
  43. data/lib/openc3/microservices/reaction_microservice.rb +2 -2
  44. data/lib/openc3/microservices/trigger_group_microservice.rb +3 -3
  45. data/lib/openc3/migrations/20240915000000_activity_uuid.rb +28 -0
  46. data/lib/openc3/models/activity_model.rb +109 -80
  47. data/lib/openc3/models/auth_model.rb +31 -2
  48. data/lib/openc3/models/cvt_model.rb +11 -5
  49. data/lib/openc3/models/gem_model.rb +8 -8
  50. data/lib/openc3/models/plugin_model.rb +3 -3
  51. data/lib/openc3/models/reducer_model.rb +2 -2
  52. data/lib/openc3/models/scope_model.rb +1 -1
  53. data/lib/openc3/models/sorted_model.rb +4 -4
  54. data/lib/openc3/models/target_model.rb +3 -3
  55. data/lib/openc3/models/tool_config_model.rb +1 -1
  56. data/lib/openc3/models/tool_model.rb +4 -4
  57. data/lib/openc3/models/widget_model.rb +11 -5
  58. data/lib/openc3/operators/operator.rb +5 -3
  59. data/lib/openc3/packets/command_validator.rb +48 -0
  60. data/lib/openc3/packets/commands.rb +6 -14
  61. data/lib/openc3/packets/packet.rb +31 -15
  62. data/lib/openc3/packets/packet_config.rb +10 -9
  63. data/lib/openc3/packets/parsers/packet_parser.rb +3 -3
  64. data/lib/openc3/packets/structure.rb +21 -13
  65. data/lib/openc3/packets/structure_item.rb +33 -47
  66. data/lib/openc3/packets/telemetry.rb +6 -27
  67. data/lib/openc3/script/api_shared.rb +7 -5
  68. data/lib/openc3/script/calendar.rb +2 -2
  69. data/lib/openc3/script/commands.rb +6 -4
  70. data/lib/openc3/script/metadata.rb +2 -2
  71. data/lib/openc3/script/suite.rb +17 -17
  72. data/lib/openc3/streams/serial_stream.rb +2 -3
  73. data/lib/openc3/streams/stream.rb +2 -2
  74. data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +10 -10
  75. data/lib/openc3/tools/table_manager/table_manager_core.rb +11 -11
  76. data/lib/openc3/tools/table_manager/table_parser.rb +2 -3
  77. data/lib/openc3/topics/command_decom_topic.rb +2 -1
  78. data/lib/openc3/topics/command_topic.rb +3 -3
  79. data/lib/openc3/topics/decom_interface_topic.rb +2 -2
  80. data/lib/openc3/topics/telemetry_decom_topic.rb +1 -1
  81. data/lib/openc3/utilities/authorization.rb +2 -1
  82. data/lib/openc3/utilities/cli_generator.rb +15 -8
  83. data/lib/openc3/utilities/cosmos_rails_formatter.rb +60 -0
  84. data/lib/openc3/utilities/crc.rb +6 -6
  85. data/lib/openc3/utilities/local_mode.rb +2 -1
  86. data/lib/openc3/utilities/logger.rb +44 -34
  87. data/lib/openc3/utilities/metric.rb +1 -2
  88. data/lib/openc3/utilities/quaternion.rb +18 -18
  89. data/lib/openc3/utilities/target_file.rb +4 -4
  90. data/lib/openc3/version.rb +5 -5
  91. data/lib/openc3/win32/win32_main.rb +2 -2
  92. data/templates/tool_angular/package.json +21 -21
  93. data/templates/tool_react/package.json +10 -10
  94. data/templates/tool_svelte/package.json +11 -11
  95. data/templates/tool_svelte/src/services/openc3-api.js +17 -17
  96. data/templates/tool_vue/package.json +9 -9
  97. data/templates/widget/package.json +6 -7
  98. metadata +5 -2
@@ -0,0 +1,60 @@
1
+ require "json"
2
+ require 'openc3/utilities/logger'
3
+ require 'openc3/utilities/authorization'
4
+
5
+ # Use with Rails Semantic Logger
6
+ module OpenC3
7
+ class CosmosRailsFormatter
8
+ include OpenC3::Authorization
9
+
10
+ def call(log, _appender = nil)
11
+ #<SemanticLogger::Log:0x0000ffffa5002b20 @level=:info, @thread_name="puma srv tp 001", @name="MicroservicesController",
12
+ # @time=2024-09-22 18:04:27.955490052 +0000, @tags=[], @named_tags={}, @level_index=2, @message="Completed #traefik",
13
+ # @payload={:controller=>"MicroservicesController", :action=>"traefik", :format=>"HTML", :method=>"GET",
14
+ # :path=>"/openc3-api/traefik", :status=>200, :view_runtime=>0.41, :allocations=>1438, :status_message=>"OK",
15
+ # :exception_object=>#<RuntimeError: death>}, @named_tags={:request_id=>"65446ef0-734e-4488-aa5f-e85b7b573fd8"},
16
+ # @duration=3.2528750002384186, @metric=nil, @metric_amount=nil, @dimensions=nil, @exception=nil, @backtrace=nil>
17
+ message = log.message
18
+ other = {}
19
+ other[:thread_name] = log.thread_name
20
+ other[:duration] = log.duration if log.duration
21
+ named_tags = log.named_tags
22
+ username = nil
23
+ if named_tags
24
+ other[:request_id] = named_tags[:request_id]
25
+ if named_tags[:token]
26
+ begin
27
+ user = user_info(named_tags[:token])
28
+ rescue
29
+ user = {}
30
+ end
31
+ username = user['username']
32
+ # Open Source username (EE has the actual username)
33
+ username ||= 'anonymous'
34
+ end
35
+ end
36
+ username ||= 'anonymous'
37
+ payload = log.payload
38
+ if payload
39
+ other[:path] = payload[:path]
40
+ other[:status] = payload[:status]
41
+ other[:controller] = payload[:controller]
42
+ other[:action] = payload[:action]
43
+ other[:format] = payload[:format]
44
+ other[:method] = payload[:method]
45
+ other[:allocations] = payload[:allocations]
46
+ other[:view_runtime] = payload[:view_runtime]
47
+ if payload[:exception_object]
48
+ other[:exception_message] = payload[:exception_object].message
49
+ other[:exception_class] = payload[:exception_object].class.to_s
50
+ other[:exception_backtrace] = payload[:exception_object].backtrace.as_json
51
+ end
52
+ end
53
+ # This happens for a separate exception log entry which we want to not include the backtrace a second time
54
+ if log.exception
55
+ message = "Exception was raised - #{log.exception.class}:#{log.exception.message}" unless message
56
+ end
57
+ return OpenC3::Logger.build_log_data(log.level.to_s.upcase, message, user: username, type: OpenC3::Logger::LOG, url: nil, other: other).as_json(:allow_nan => true).to_json(:allow_nan => true)
58
+ end
59
+ end
60
+ end
@@ -45,9 +45,9 @@ module OpenC3
45
45
  0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
46
46
  ]
47
47
 
48
- # @return [Integer] The polynomial used when calcuating the CRC
48
+ # @return [Integer] The polynomial used when calculating the CRC
49
49
  attr_reader :poly
50
- # @return [Integer] Seed value used to start the calulation
50
+ # @return [Integer] Seed value used to start the calculation
51
51
  attr_reader :seed
52
52
  # @return [Boolean] Whether the result is XORed with 0xFFFF
53
53
  attr_reader :xor
@@ -221,7 +221,7 @@ module OpenC3
221
221
  # Seed for 8-bit CRC
222
222
  DEFAULT_SEED = 0x00
223
223
 
224
- # Creates a 8 bit CRC algorithm instance. By default it is initialzed to
224
+ # Creates a 8 bit CRC algorithm instance. By default it is initialized to
225
225
  # use the CRC-8-DVB-S2 algorithm.
226
226
  #
227
227
  # @param poly [Integer] Polynomial to use when calculating the CRC
@@ -246,7 +246,7 @@ module OpenC3
246
246
  # Seed for 16-bit CRC
247
247
  DEFAULT_SEED = 0xFFFF
248
248
 
249
- # Creates a 16 bit CRC algorithm instance. By default it is initialzed to
249
+ # Creates a 16 bit CRC algorithm instance. By default it is initialized to
250
250
  # use the CRC-16-CCITT algorithm.
251
251
  #
252
252
  # @param poly [Integer] Polynomial to use when calculating the CRC
@@ -271,7 +271,7 @@ module OpenC3
271
271
  # Default Seed for 32-bit CRC
272
272
  DEFAULT_SEED = 0xFFFFFFFF
273
273
 
274
- # Creates a 32 bit CRC algorithm instance. By default it is initialzed to
274
+ # Creates a 32 bit CRC algorithm instance. By default it is initialized to
275
275
  # use the CRC-32 algorithm.
276
276
  #
277
277
  # @param poly [Integer] Polynomial to use when calculating the CRC
@@ -296,7 +296,7 @@ module OpenC3
296
296
  # Default Seed for 64-bit CRC
297
297
  DEFAULT_SEED = 0xFFFFFFFFFFFFFFFF
298
298
 
299
- # Creates a 64 bit CRC algorithm instance. By default it is initialzed to
299
+ # Creates a 64 bit CRC algorithm instance. By default it is initialized to
300
300
  # use the algorithm.
301
301
  #
302
302
  # @param poly [Integer] Polynomial to use when calculating the CRC
@@ -1,6 +1,6 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2022 OpenC3, Inc.
3
+ # Copyright 2024 OpenC3, Inc.
4
4
  # All Rights Reserved.
5
5
  #
6
6
  # This program is free software; you can modify and/or redistribute it
@@ -31,6 +31,7 @@ module OpenC3
31
31
  'openc3-cosmos-tool-admin',
32
32
  'openc3-cosmos-tool-bucketexplorer',
33
33
  'openc3-cosmos-tool-cmdsender',
34
+ 'openc3-cosmos-tool-cmdhistory',
34
35
  'openc3-cosmos-tool-cmdtlmserver',
35
36
  'openc3-cosmos-tool-dataextractor',
36
37
  'openc3-cosmos-tool-dataviewer',
@@ -97,53 +97,53 @@ module OpenC3
97
97
  # below the method name log level.
98
98
  # @param block [Proc] Block to call which should return a string to append
99
99
  # to the log message
100
- def debug(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, &block)
101
- log_message(DEBUG_LEVEL, message, scope: scope, user: user, type: type, url: url, &block) if @level <= DEBUG
100
+ def debug(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, other: nil, &block)
101
+ log_message(DEBUG_LEVEL, message, scope: scope, user: user, type: type, url: url, other: other, &block) if @level <= DEBUG
102
102
  end
103
103
 
104
104
  # (see #debug)
105
- def info(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, &block)
106
- log_message(INFO_LEVEL, message, scope: scope, user: user, type: type, url: url, &block) if @level <= INFO
105
+ def info(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, other: nil, &block)
106
+ log_message(INFO_LEVEL, message, scope: scope, user: user, type: type, url: url, other: other, &block) if @level <= INFO
107
107
  end
108
108
 
109
109
  # (see #debug)
110
- def warn(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, &block)
111
- log_message(WARN_LEVEL, message, scope: scope, user: user, type: type, url: url, &block) if @level <= WARN
110
+ def warn(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, other: nil, &block)
111
+ log_message(WARN_LEVEL, message, scope: scope, user: user, type: type, url: url, other: other, &block) if @level <= WARN
112
112
  end
113
113
 
114
114
  # (see #debug)
115
- def error(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, &block)
116
- log_message(ERROR_LEVEL, message, scope: scope, user: user, type: type, url: url, &block) if @level <= ERROR
115
+ def error(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, other: nil, &block)
116
+ log_message(ERROR_LEVEL, message, scope: scope, user: user, type: type, url: url, other: other, &block) if @level <= ERROR
117
117
  end
118
118
 
119
119
  # (see #debug)
120
- def fatal(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, &block)
121
- log_message(FATAL_LEVEL, message, scope: scope, user: user, type: type, url: url, &block) if @level <= FATAL
120
+ def fatal(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, other: nil, &block)
121
+ log_message(FATAL_LEVEL, message, scope: scope, user: user, type: type, url: url, other: other, &block) if @level <= FATAL
122
122
  end
123
123
 
124
124
  # (see #debug)
125
- def self.debug(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, &block)
126
- self.instance.debug(message, scope: scope, user: user, type: type, url: url, &block)
125
+ def self.debug(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, other: nil, &block)
126
+ self.instance.debug(message, scope: scope, user: user, type: type, url: url, other: other, &block)
127
127
  end
128
128
 
129
129
  # (see #debug)
130
- def self.info(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, &block)
131
- self.instance.info(message, scope: scope, user: user, type: type, url: url, &block)
130
+ def self.info(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, other: nil, &block)
131
+ self.instance.info(message, scope: scope, user: user, type: type, url: url, other: other, &block)
132
132
  end
133
133
 
134
134
  # (see #debug)
135
- def self.warn(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, &block)
136
- self.instance.warn(message, scope: scope, user: user, type: type, url: url, &block)
135
+ def self.warn(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, other: nil, &block)
136
+ self.instance.warn(message, scope: scope, user: user, type: type, url: url, other: other, &block)
137
137
  end
138
138
 
139
139
  # (see #debug)
140
- def self.error(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, &block)
141
- self.instance.error(message, scope: scope, user: user, type: type, url: url, &block)
140
+ def self.error(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, other: nil, &block)
141
+ self.instance.error(message, scope: scope, user: user, type: type, url: url, other: other, &block)
142
142
  end
143
143
 
144
144
  # (see #debug)
145
- def self.fatal(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, &block)
146
- self.instance.fatal(message, scope: scope, user: user, type: type, url: url, &block)
145
+ def self.fatal(message = nil, scope: @@scope, user: nil, type: LOG, url: nil, other: nil, &block)
146
+ self.instance.fatal(message, scope: scope, user: user, type: type, url: url, other: other, &block)
147
147
  end
148
148
 
149
149
  # @return [Logger] The logger instance
@@ -172,23 +172,33 @@ module OpenC3
172
172
  @@scope = scope
173
173
  end
174
174
 
175
+ def build_log_data(log_level, message, user: nil, type: nil, url: nil, other: nil, &block)
176
+ time = Time.now.utc
177
+ # timestamp iso8601 with 6 decimal places to match the python output format
178
+ data = { time: time.to_nsec_from_epoch, '@timestamp' => time.iso8601(6), level: log_level }
179
+ data[:microservice_name] = @microservice_name if @microservice_name
180
+ data[:detail] = @detail_string if @detail_string
181
+ data[:user] = user if user # EE: If a user is passed, put its name. Don't include user data if no user was passed.
182
+ if block_given?
183
+ message = yield
184
+ end
185
+ data[:container_name] = @container_name
186
+ data[:message] = message if message
187
+ data[:type] = type if type
188
+ data[:url] = url if url
189
+ data = data.merge(other) if other
190
+ return data
191
+ end
192
+
193
+ def self.build_log_data(log_level, message, user: nil, type: nil, url: nil, other: nil)
194
+ self.instance.build_log_data(log_level, message, user: user, type: type, url: url, other: other)
195
+ end
196
+
175
197
  protected
176
198
 
177
- def log_message(log_level, message, scope:, user:, type:, url:)
199
+ def log_message(log_level, message, scope:, user:, type:, url:, other: nil, &block)
178
200
  @@mutex.synchronize do
179
- time = Time.now.utc
180
- # timestamp iso8601 with 6 decimal places to match the python output format
181
- data = { time: time.to_nsec_from_epoch, '@timestamp' => time.iso8601(6), level: log_level }
182
- data[:microservice_name] = @microservice_name if @microservice_name
183
- data[:detail] = @detail_string if @detail_string
184
- data[:user] = user if user # EE: If a user is passed, put its name. Don't include user data if no user was passed.
185
- if block_given?
186
- message = yield
187
- end
188
- data[:container_name] = @container_name
189
- data[:message] = message
190
- data[:type] = type
191
- data[:url] = url if url
201
+ data = build_log_data(log_level, message, user: user, type: type, url: url, other: other, &block)
192
202
  if @stdout
193
203
  case log_level
194
204
  when WARN_LEVEL, ERROR_LEVEL, FATAL_LEVEL
@@ -19,7 +19,6 @@
19
19
  # Note: This file has been completely reimplemented post version 5.3.0
20
20
 
21
21
  require 'openc3/models/metric_model'
22
- require 'thread'
23
22
 
24
23
  module OpenC3
25
24
  class Metric
@@ -77,7 +76,7 @@ module OpenC3
77
76
  end
78
77
 
79
78
  def set_multiple(data)
80
- @mutex.synchonize do
79
+ @mutex.synchronize do
81
80
  @data.merge!(data)
82
81
  end
83
82
  end
@@ -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/core_ext/matrix'
@@ -38,7 +38,7 @@ module OpenC3
38
38
  @data = array.clone
39
39
  elsif array.length == 3 and angle
40
40
  a = 0.5 * angle
41
- s = sin(a) / sqrt(array[0] * array[0] + array[1] * array[1] + array[2] * array[2])
41
+ s = sin(a) / sqrt((array[0] * array[0]) + (array[1] * array[1]) + (array[2] * array[2]))
42
42
  @data = []
43
43
  @data[0] = array[0] * s
44
44
  @data[1] = array[1] * s
@@ -116,7 +116,7 @@ module OpenC3
116
116
  end
117
117
 
118
118
  # @param other [Quaternion] Quaternion to multiply with
119
- # @return [Quaternion] New quaternion resulting from the muliplication
119
+ # @return [Quaternion] New quaternion resulting from the multiplication
120
120
  def *(other)
121
121
  q = Quaternion.new()
122
122
 
@@ -141,7 +141,7 @@ module OpenC3
141
141
 
142
142
  # @return [Quaternion] The normalized version of the current quaternion
143
143
  def normalize
144
- t = @data[0] * @data[0] + @data[1] * @data[1] + @data[2] * @data[2] + @data[3] * @data[3]
144
+ t = (@data[0] * @data[0]) + (@data[1] * @data[1]) + (@data[2] * @data[2]) + (@data[3] * @data[3])
145
145
  if t > 0.0
146
146
  f = 1.0 / sqrt(t)
147
147
  @data[0] *= f
@@ -162,7 +162,7 @@ module OpenC3
162
162
  end
163
163
 
164
164
  def self.arc(f, t)
165
- dot = f[0] * t[0] + f[1] * t[1] + f[2] * t[2]
165
+ dot = (f[0] * t[0]) + (f[1] * t[1]) + (f[2] * t[2])
166
166
  if dot > 0.999999
167
167
  x = 0.0
168
168
  y = 0.0
@@ -170,20 +170,20 @@ module OpenC3
170
170
  w = 1.0
171
171
  elsif dot < -0.999999
172
172
  if (f.z.abs < f.x.abs) && (f.z.abs < f.y.abs)
173
- x = f[0] * f[2] - f[2] * f[1]
174
- y = f[2] * f[0] + f[1] * f[2]
175
- z = -f[1] * f[1] - f[0] * f[0]
173
+ x = (f[0] * f[2]) - (f[2] * f[1])
174
+ y = (f[2] * f[0]) + (f[1] * f[2])
175
+ z = (-f[1] * f[1]) - (f[0] * f[0])
176
176
  elsif f.y.abs < f.x.abs
177
- x = f[1] * f[2] - f[0] * f[1]
178
- y = f[0] * f[0] + f[2] * f[2]
179
- z = -f[2] * f[1] - f[1] * f[0]
177
+ x = (f[1] * f[2]) - (f[0] * f[1])
178
+ y = (f[0] * f[0]) + (f[2] * f[2])
179
+ z = (-f[2] * f[1]) - (f[1] * f[0])
180
180
  else
181
- x = -f[2] * f[2] - f[1] * f[1]
182
- y = f[1] * f[0] - f[0] * f[2]
183
- z = f[0] * f[1] + f[2] * f[0]
181
+ x = (-f[2] * f[2]) - (f[1] * f[1])
182
+ y = (f[1] * f[0]) - (f[0] * f[2])
183
+ z = (f[0] * f[1]) + (f[2] * f[0])
184
184
  end
185
185
 
186
- dot = x * x + y * y + z * z
186
+ dot = (x * x) + (y * y) + (z * z)
187
187
  div = sqrt(dot)
188
188
  x /= div
189
189
  y /= div
@@ -191,9 +191,9 @@ module OpenC3
191
191
  w = 0.0
192
192
  else
193
193
  div = sqrt((dot + 1.0) * 2.0)
194
- x = (f[1] * t[2] - f[2] * t[1]) / div
195
- y = (f[2] * t[0] - f[0] * t[2]) / div
196
- z = (f[0] * t[1] - f[1] * t[0]) / div
194
+ x = ((f[1] * t[2]) - (f[2] * t[1])) / div
195
+ y = ((f[2] * t[0]) - (f[0] * t[2])) / div
196
+ z = ((f[0] * t[1]) - (f[1] * t[0])) / div
197
197
  w = div * 0.5
198
198
  end
199
199
  return Quaternion.new([x, y, z, w])
@@ -64,8 +64,8 @@ module OpenC3
64
64
  end
65
65
 
66
66
  # Concat any remaining modified files (new files not in original target)
67
- result.concat(modified)
68
- result.concat(temp.uniq)
67
+ result = result.merge(modified)
68
+ result = result.merge(temp.uniq)
69
69
  result.sort
70
70
  end
71
71
 
@@ -154,8 +154,8 @@ module OpenC3
154
154
  # protected
155
155
 
156
156
  def self.remote_target_files(bucket_client:, prefix:, include_temp: false, path_matchers: nil)
157
- result = []
158
- temp = []
157
+ result = Set.new
158
+ temp = Set.new
159
159
  resp = bucket_client.list_objects(
160
160
  bucket: ENV['OPENC3_CONFIG_BUCKET'],
161
161
  prefix: prefix,
@@ -1,14 +1,14 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- OPENC3_VERSION = '5.18.0'
3
+ OPENC3_VERSION = '5.19.0'
4
4
  module OpenC3
5
5
  module Version
6
6
  MAJOR = '5'
7
- MINOR = '18'
7
+ MINOR = '19'
8
8
  PATCH = '0'
9
9
  OTHER = ''
10
- BUILD = '15e1526c2ad19e88a87fef40bece0867e65f91e0'
10
+ BUILD = 'af741bca7c2c591e1bceace639d66ac9e6a21ca4'
11
11
  end
12
- VERSION = '5.18.0'
13
- GEM_VERSION = '5.18.0'
12
+ VERSION = '5.19.0'
13
+ GEM_VERSION = '5.19.0'
14
14
  end
@@ -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
@@ -61,7 +61,7 @@ module OpenC3
61
61
  # Convert argument into array of longs
62
62
  args[index], = [arg].pack("p").unpack(POINTER_TYPE)
63
63
  when 'I'
64
- # Handle intergers larger than 2^31 - 1
64
+ # Handle integers larger than 2^31 - 1
65
65
  args[index], = [arg].pack("I").unpack("i")
66
66
  end
67
67
  end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "<%= tool_name %>",
3
- "version": "5.18.0",
3
+ "version": "5.19.0",
4
4
  "scripts": {
5
5
  "ng": "ng",
6
6
  "start": "ng serve",
@@ -12,37 +12,37 @@
12
12
  },
13
13
  "private": true,
14
14
  "dependencies": {
15
- "@angular/animations": "^17.0.8",
16
- "@angular/cdk": "^17.0.4",
17
- "@angular/common": "^17.0.8",
18
- "@angular/compiler": "^17.0.8",
19
- "@angular/core": "^17.0.8",
20
- "@angular/forms": "^17.0.8",
21
- "@angular/material": "17.3.6",
22
- "@angular/platform-browser": "^17.0.8",
23
- "@angular/platform-browser-dynamic": "^17.0.8",
24
- "@angular/router": "^17.0.8",
15
+ "@angular/animations": "^18.2.6",
16
+ "@angular/cdk": "^18.2.6",
17
+ "@angular/common": "^18.2.6",
18
+ "@angular/compiler": "^18.2.6",
19
+ "@angular/core": "^18.2.6",
20
+ "@angular/forms": "^18.2.6",
21
+ "@angular/material": "18.2.6",
22
+ "@angular/platform-browser": "^18.2.6",
23
+ "@angular/platform-browser-dynamic": "^18.2.6",
24
+ "@angular/router": "^18.2.6",
25
25
  "@astrouxds/astro-web-components": "7.22.1",
26
- "@openc3/tool-common": "5.18.0",
26
+ "@openc3/tool-common": "5.19.0",
27
27
  "rxjs": "~7.8.0",
28
28
  "single-spa": "5.9.5",
29
- "single-spa-angular": "^9.0.1",
30
- "tslib": "^2.6.2",
31
- "zone.js": "~0.14.10"
29
+ "single-spa-angular": "^9.2.0",
30
+ "tslib": "^2.7.0",
31
+ "zone.js": "~0.15.0"
32
32
  },
33
33
  "devDependencies": {
34
- "@angular-builders/custom-webpack": "17.0.2",
35
- "@angular-devkit/build-angular": "^17.0.6",
36
- "@angular/cli": "~17.3.6",
37
- "@angular/compiler-cli": "^17.0.6",
34
+ "@angular-builders/custom-webpack": "18.0.0",
35
+ "@angular-devkit/build-angular": "^18.2.6",
36
+ "@angular/cli": "~18.2.6",
37
+ "@angular/compiler-cli": "^18.2.6",
38
38
  "@types/jasmine": "~5.1.4",
39
- "jasmine-core": "~5.2.0",
39
+ "jasmine-core": "~5.3.0",
40
40
  "karma": "~6.4.4",
41
41
  "karma-chrome-launcher": "~3.2.0",
42
42
  "karma-coverage": "~2.2.0",
43
43
  "karma-jasmine": "~5.1.0",
44
44
  "karma-jasmine-html-reporter": "~2.1.0",
45
45
  "style-loader": "^4.0.0",
46
- "typescript": "~5.5.2"
46
+ "typescript": "~5.6.2"
47
47
  }
48
48
  }
@@ -13,9 +13,9 @@
13
13
  "coverage": "cross-env BABEL_ENV=test jest --coverage"
14
14
  },
15
15
  "dependencies": {
16
- "@emotion/react": "^11.11.3",
16
+ "@emotion/react": "^11.13.3",
17
17
  "@emotion/styled": "^11.11.0",
18
- "@mui/material": "^5.16.7",
18
+ "@mui/material": "^6.1.1",
19
19
  "react": "^18.2.0",
20
20
  "react-dom": "^18.2.0",
21
21
  "single-spa-react": "^5.1.4"
@@ -23,14 +23,14 @@
23
23
  "devDependencies": {
24
24
  "@babel/core": "^7.25.2",
25
25
  "@babel/eslint-parser": "^7.25.1",
26
- "@babel/plugin-transform-runtime": "^7.23.7",
27
- "@babel/preset-env": "^7.25.3",
26
+ "@babel/plugin-transform-runtime": "^7.25.4",
27
+ "@babel/preset-env": "^7.25.4",
28
28
  "@babel/preset-react": "^7.23.3",
29
- "@babel/runtime": "^7.25.0",
30
- "@testing-library/jest-dom": "^6.4.8",
31
- "@testing-library/react": "^16.0.0",
29
+ "@babel/runtime": "^7.25.6",
30
+ "@testing-library/jest-dom": "^6.5.0",
31
+ "@testing-library/react": "^16.0.1",
32
32
  "babel-jest": "^29.7.0",
33
- "concurrently": "^8.2.2",
33
+ "concurrently": "^9.0.1",
34
34
  "cross-env": "^7.0.3",
35
35
  "eslint": "^8.56.0",
36
36
  "eslint-config-prettier": "^9.1.0",
@@ -41,10 +41,10 @@
41
41
  "jest-cli": "^29.7.0",
42
42
  "prettier": "^3.1.1",
43
43
  "pretty-quick": "^4.0.0",
44
- "webpack": "^5.89.0",
44
+ "webpack": "^5.95.0",
45
45
  "webpack-cli": "^5.1.4",
46
46
  "webpack-config-single-spa-react": "^4.0.5",
47
- "webpack-dev-server": "^5.0.4",
47
+ "webpack-dev-server": "^5.1.0",
48
48
  "webpack-merge": "^6.0.1"
49
49
  }
50
50
  }
@@ -12,36 +12,36 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@astrouxds/astro-web-components": "7.22.1",
15
- "@openc3/tool-common": "5.18.0",
15
+ "@openc3/tool-common": "5.19.0",
16
16
  "@smui/button": "^7.0.0-beta.16",
17
17
  "@smui/card": "^7.0.0-beta.16",
18
18
  "@smui/list": "^7.0.0-beta.16",
19
19
  "@smui/menu": "^7.0.0-beta.16",
20
- "axios": "1.7.4",
20
+ "axios": "1.7.7",
21
21
  "single-spa-svelte": "^2.1.1",
22
22
  "sirv-cli": "^2.0.2",
23
23
  "svelte-portal": "^2.2.0"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@babel/core": "^7.25.2",
27
- "@babel/preset-env": "^7.25.3",
28
- "@rollup/plugin-commonjs": "^26.0.1",
29
- "@rollup/plugin-node-resolve": "^15.2.3",
30
- "@testing-library/jest-dom": "^6.4.8",
27
+ "@babel/preset-env": "^7.25.4",
28
+ "@rollup/plugin-commonjs": "^28.0.0",
29
+ "@rollup/plugin-node-resolve": "^15.3.0",
30
+ "@testing-library/jest-dom": "^6.5.0",
31
31
  "@testing-library/svelte": "^5.2.1",
32
32
  "babel-jest": "^29.7.0",
33
- "concurrently": "^8.2.2",
33
+ "concurrently": "^9.0.1",
34
34
  "jest": "^29.7.0",
35
- "postcss": "^8.4.41",
35
+ "postcss": "^8.4.47",
36
36
  "prettier": "^3.1.1",
37
- "prettier-plugin-svelte": "^3.1.2",
38
- "rollup": "^4.20.0",
37
+ "prettier-plugin-svelte": "^3.2.7",
38
+ "rollup": "^4.22.4",
39
39
  "rollup-plugin-livereload": "^2.0.5",
40
40
  "rollup-plugin-postcss": "^4.0.2",
41
41
  "rollup-plugin-svelte": "^7.1.6",
42
42
  "rollup-plugin-terser": "^7.0.2",
43
43
  "smui-theme": "^7.0.0-beta.16",
44
- "svelte": "^4.2.8",
44
+ "svelte": "^4.2.19",
45
45
  "svelte-jester": "^5.0.0"
46
46
  }
47
47
  }