openc3 5.18.0 → 5.19.0

Sign up to get free protection for your applications and to get access to all the features.
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
  }