openc3 6.4.1 → 6.4.2

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 (31) hide show
  1. checksums.yaml +4 -4
  2. data/data/config/conversions.yaml +273 -0
  3. data/data/config/item_modifiers.yaml +7 -70
  4. data/data/config/parameter_modifiers.yaml +9 -69
  5. data/lib/openc3/api/api.rb +1 -1
  6. data/lib/openc3/conversions/unix_time_conversion.rb +2 -2
  7. data/lib/openc3/conversions/unix_time_formatted_conversion.rb +3 -3
  8. data/lib/openc3/conversions/unix_time_seconds_conversion.rb +3 -3
  9. data/lib/openc3/core_ext/time.rb +2 -9
  10. data/lib/openc3/microservices/cleanup_microservice.rb +2 -2
  11. data/lib/openc3/microservices/decom_microservice.rb +2 -2
  12. data/lib/openc3/microservices/interface_microservice.rb +3 -3
  13. data/lib/openc3/microservices/log_microservice.rb +4 -2
  14. data/lib/openc3/microservices/multi_microservice.rb +2 -2
  15. data/lib/openc3/microservices/periodic_microservice.rb +2 -2
  16. data/lib/openc3/microservices/reducer_microservice.rb +2 -2
  17. data/lib/openc3/microservices/router_microservice.rb +2 -2
  18. data/lib/openc3/microservices/scope_cleanup_microservice.rb +2 -2
  19. data/lib/openc3/microservices/text_log_microservice.rb +19 -6
  20. data/lib/openc3/models/script_status_model.rb +22 -4
  21. data/lib/openc3/models/target_model.rb +26 -4
  22. data/lib/openc3/packets/packet_config.rb +1 -1
  23. data/lib/openc3/script/autonomic.rb +359 -0
  24. data/lib/openc3/script/script.rb +1 -0
  25. data/lib/openc3/version.rb +5 -5
  26. data/templates/tool_angular/package.json +2 -2
  27. data/templates/tool_react/package.json +1 -1
  28. data/templates/tool_svelte/package.json +1 -1
  29. data/templates/tool_vue/package.json +3 -3
  30. data/templates/widget/package.json +2 -2
  31. metadata +3 -1
@@ -635,6 +635,6 @@ end
635
635
 
636
636
  if __FILE__ == $0
637
637
  OpenC3::ReducerMicroservice.run
638
- ThreadManager.instance.shutdown
639
- ThreadManager.instance.join
638
+ OpenC3::ThreadManager.instance.shutdown
639
+ OpenC3::ThreadManager.instance.join
640
640
  end
@@ -88,6 +88,6 @@ end
88
88
 
89
89
  if __FILE__ == $0
90
90
  OpenC3::RouterMicroservice.run
91
- ThreadManager.instance.shutdown
92
- ThreadManager.instance.join
91
+ OpenC3::ThreadManager.instance.shutdown
92
+ OpenC3::ThreadManager.instance.join
93
93
  end
@@ -40,6 +40,6 @@ end
40
40
 
41
41
  if __FILE__ == $0
42
42
  OpenC3::ScopeCleanupMicroservice.run
43
- ThreadManager.instance.shutdown
44
- ThreadManager.instance.join
43
+ OpenC3::ThreadManager.instance.shutdown
44
+ OpenC3::ThreadManager.instance.join
45
45
  end
@@ -43,6 +43,7 @@ module OpenC3
43
43
  @cycle_time = 600 unless @cycle_time # 10 minutes
44
44
  @cycle_size = 50_000_000 unless @cycle_size # ~50 MB
45
45
 
46
+ @tlws = {}
46
47
  @error_count = 0
47
48
  @metric.set(name: 'text_log_total', value: @count, type: 'counter')
48
49
  @metric.set(name: 'text_error_total', value: @error_count, type: 'counter')
@@ -50,15 +51,27 @@ module OpenC3
50
51
 
51
52
  def run
52
53
  setup_tlws()
54
+
55
+ individual_topics = []
56
+ @topics.each do |topic|
57
+ individual_topics << [topic]
58
+ end
59
+
53
60
  while true
54
61
  break if @cancel_thread
55
62
 
56
- Topic.read_topics(@topics) do |topic, msg_id, msg_hash, redis|
63
+ # Read each topic separately to support multiple redis shards
64
+ # This is needed with Redis cluster because the topics will likely be on different shards and we don't use {} in the topic names
65
+ individual_topics.each do |individual_topic|
57
66
  break if @cancel_thread
67
+ # 500ms timeout - To support completing within 1 second with two topics (DEFAULT and NOSCOPE)
68
+ Topic.read_topics(individual_topic, nil, 500) do |topic, msg_id, msg_hash, redis|
69
+ break if @cancel_thread
58
70
 
59
- log_data(topic, msg_id, msg_hash, redis)
60
- @count += 1
61
- @metric.set(name: 'text_log_total', value: @count, type: 'counter')
71
+ log_data(topic, msg_id, msg_hash, redis)
72
+ @count += 1
73
+ @metric.set(name: 'text_log_total', value: @count, type: 'counter')
74
+ end
62
75
  end
63
76
  end
64
77
  end
@@ -104,6 +117,6 @@ end
104
117
 
105
118
  if __FILE__ == $0
106
119
  OpenC3::TextLogMicroservice.run
107
- ThreadManager.instance.shutdown
108
- ThreadManager.instance.join
120
+ OpenC3::ThreadManager.instance.shutdown
121
+ OpenC3::ThreadManager.instance.join
109
122
  end
@@ -69,9 +69,18 @@ module OpenC3
69
69
  if type == "running"
70
70
  keys = self.store.zrevrange("#{RUNNING_PRIMARY_KEY}__#{scope}__LIST", offset.to_i, offset.to_i + limit.to_i - 1)
71
71
  return [] if keys.empty?
72
- result = self.store.redis_pool.pipelined do
72
+ result = []
73
+ if $openc3_redis_cluster
74
+ # No pipelining for cluster mode
75
+ # because it requires using the same shard for all keys
73
76
  keys.each do |key|
74
- self.store.hget("#{RUNNING_PRIMARY_KEY}__#{scope}", key)
77
+ result << self.store.hget("#{RUNNING_PRIMARY_KEY}__#{scope}", key)
78
+ end
79
+ else
80
+ result = self.store.redis_pool.pipelined do
81
+ keys.each do |key|
82
+ self.store.hget("#{RUNNING_PRIMARY_KEY}__#{scope}", key)
83
+ end
75
84
  end
76
85
  end
77
86
  result = result.map do |r|
@@ -85,9 +94,18 @@ module OpenC3
85
94
  else
86
95
  keys = self.store.zrevrange("#{COMPLETED_PRIMARY_KEY}__#{scope}__LIST", offset.to_i, offset.to_i + limit.to_i - 1)
87
96
  return [] if keys.empty?
88
- result = self.store.redis_pool.pipelined do
97
+ result = []
98
+ if $openc3_redis_cluster
99
+ # No pipelining for cluster mode
100
+ # because it requires using the same shard for all keys
89
101
  keys.each do |key|
90
- self.store.hget("#{COMPLETED_PRIMARY_KEY}__#{scope}", key)
102
+ result << self.store.hget("#{COMPLETED_PRIMARY_KEY}__#{scope}", key)
103
+ end
104
+ else
105
+ result = self.store.redis_pool.pipelined do
106
+ keys.each do |key|
107
+ self.store.hget("#{COMPLETED_PRIMARY_KEY}__#{scope}", key)
108
+ end
91
109
  end
92
110
  end
93
111
  result = result.map do |r|
@@ -1300,11 +1300,22 @@ module OpenC3
1300
1300
  end
1301
1301
 
1302
1302
  def self.get_telemetry_counts(target_packets, scope:)
1303
- result = Store.redis_pool.pipelined do
1303
+ result = []
1304
+ if $openc3_redis_cluster
1305
+ # No pipelining for cluster mode
1306
+ # because it requires using the same shard for all keys
1304
1307
  target_packets.each do |target_name, packet_name|
1305
1308
  target_name = target_name.upcase
1306
1309
  packet_name = packet_name.upcase
1307
- Store.hget("#{scope}__TELEMETRYCNTS__{#{target_name}}", packet_name)
1310
+ result << Store.hget("#{scope}__TELEMETRYCNTS__{#{target_name}}", packet_name)
1311
+ end
1312
+ else
1313
+ result = Store.redis_pool.pipelined do
1314
+ target_packets.each do |target_name, packet_name|
1315
+ target_name = target_name.upcase
1316
+ packet_name = packet_name.upcase
1317
+ Store.hget("#{scope}__TELEMETRYCNTS__{#{target_name}}", packet_name)
1318
+ end
1308
1319
  end
1309
1320
  end
1310
1321
  counts = []
@@ -1351,11 +1362,22 @@ module OpenC3
1351
1362
  end
1352
1363
 
1353
1364
  def self.get_command_counts(target_packets, scope:)
1354
- result = Store.redis_pool.pipelined do
1365
+ result = []
1366
+ if $openc3_redis_cluster
1367
+ # No pipelining for cluster mode
1368
+ # because it requires using the same shard for all keys
1355
1369
  target_packets.each do |target_name, packet_name|
1356
1370
  target_name = target_name.upcase
1357
1371
  packet_name = packet_name.upcase
1358
- Store.hget("#{scope}__COMMANDCNTS__{#{target_name}}", packet_name)
1372
+ result << Store.hget("#{scope}__COMMANDCNTS__{#{target_name}}", packet_name)
1373
+ end
1374
+ else
1375
+ result = Store.redis_pool.pipelined do
1376
+ target_packets.each do |target_name, packet_name|
1377
+ target_name = target_name.upcase
1378
+ packet_name = packet_name.upcase
1379
+ Store.hget("#{scope}__COMMANDCNTS__{#{target_name}}", packet_name)
1380
+ end
1359
1381
  end
1360
1382
  end
1361
1383
  counts = []
@@ -662,7 +662,7 @@ module OpenC3
662
662
  @converted_bit_size = nil
663
663
  if params[0]
664
664
  @converted_type = params[0].upcase.intern
665
- raise parser.error("Invalid converted_type: #{@converted_type}.") unless [:INT, :UINT, :FLOAT, :STRING, :BLOCK, :RUBY_TIME].include? @converted_type
665
+ raise parser.error("Invalid converted_type: #{@converted_type}.") unless [:INT, :UINT, :FLOAT, :STRING, :BLOCK, :TIME].include? @converted_type
666
666
  end
667
667
  @converted_bit_size = Integer(params[1]) if params[1]
668
668
  if @converted_type.nil? or @converted_bit_size.nil?
@@ -0,0 +1,359 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2025 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
+ module OpenC3
20
+ module Script
21
+ private
22
+
23
+ # Group Methods
24
+ def autonomic_group_list(scope: $openc3_scope)
25
+ begin
26
+ endpoint = "/openc3-api/autonomic/group"
27
+ response = $api_server.request('get', endpoint, scope: scope)
28
+ if response.nil? || response.status != 200
29
+ raise "Unexpected response to autonomic_group_list: #{response.inspect}"
30
+ end
31
+ return JSON.parse(response.body)
32
+ rescue => error
33
+ raise "autonomic_group_list failed due to #{error.formatted}"
34
+ end
35
+ end
36
+
37
+ def autonomic_group_create(name, scope: $openc3_scope)
38
+ begin
39
+ endpoint = "/openc3-api/autonomic/group"
40
+ response = $api_server.request('post', endpoint, data: { name: name }, json: true, scope: scope)
41
+ if response.nil? || response.status != 201
42
+ if response
43
+ parsed = JSON.parse(response.body)
44
+ raise "autonomic_group_create error: #{parsed['message']}"
45
+ else
46
+ raise "autonomic_group_create failed"
47
+ end
48
+ end
49
+ return JSON.parse(response.body)
50
+ rescue => error
51
+ raise "autonomic_group_create failed due to #{error.formatted}"
52
+ end
53
+ end
54
+
55
+ def autonomic_group_show(name, scope: $openc3_scope)
56
+ begin
57
+ endpoint = "/openc3-api/autonomic/group/#{name}"
58
+ response = $api_server.request('get', endpoint, scope: scope)
59
+ if response.nil? || response.status != 200
60
+ raise "Unexpected response to autonomic_group_show: #{response.inspect}"
61
+ end
62
+ return JSON.parse(response.body)
63
+ rescue => error
64
+ raise "autonomic_group_show failed due to #{error.formatted}"
65
+ end
66
+ end
67
+
68
+ def autonomic_group_destroy(name, scope: $openc3_scope)
69
+ begin
70
+ endpoint = "/openc3-api/autonomic/group/#{name}"
71
+ response = $api_server.request('delete', endpoint, scope: scope)
72
+ if response.nil? || response.status != 200
73
+ if response
74
+ parsed = JSON.parse(response.body)
75
+ raise "autonomic_group_destroy error: #{parsed['error']}"
76
+ else
77
+ raise "autonomic_group_destroy failed"
78
+ end
79
+ end
80
+ return
81
+ rescue => error
82
+ raise "autonomic_group_destroy failed due to #{error.formatted}"
83
+ end
84
+ end
85
+
86
+ # Trigger Methods
87
+ def autonomic_trigger_list(group: 'DEFAULT', scope: $openc3_scope)
88
+ begin
89
+ endpoint = "/openc3-api/autonomic/#{group}/trigger"
90
+ response = $api_server.request('get', endpoint, scope: scope)
91
+ if response.nil? || response.status != 200
92
+ raise "Unexpected response to autonomic_trigger_list: #{response.inspect}"
93
+ end
94
+ return JSON.parse(response.body)
95
+ rescue => error
96
+ raise "autonomic_trigger_list failed due to #{error.formatted}"
97
+ end
98
+ end
99
+
100
+ def autonomic_trigger_create(left:, operator:, right:, group: 'DEFAULT', scope: $openc3_scope)
101
+ begin
102
+ endpoint = "/openc3-api/autonomic/#{group}/trigger"
103
+ config = {
104
+ 'group' => group,
105
+ 'left' => left,
106
+ 'operator' => operator,
107
+ 'right' => right
108
+ }
109
+ response = $api_server.request('post', endpoint, data: config, json: true, scope: scope)
110
+ if response.nil? || response.status != 201
111
+ if response
112
+ parsed = JSON.parse(response.body)
113
+ raise "autonomic_trigger_create error: #{parsed['error']}"
114
+ else
115
+ raise "autonomic_trigger_create failed"
116
+ end
117
+ end
118
+ return JSON.parse(response.body)
119
+ rescue => error
120
+ raise "autonomic_trigger_create failed due to #{error.formatted}"
121
+ end
122
+ end
123
+
124
+ def autonomic_trigger_show(name, group: 'DEFAULT', scope: $openc3_scope)
125
+ begin
126
+ endpoint = "/openc3-api/autonomic/#{group}/trigger/#{name}"
127
+ response = $api_server.request('get', endpoint, scope: scope)
128
+ if response.nil? || response.status != 200
129
+ raise "Unexpected response to autonomic_trigger_show: #{response.inspect}"
130
+ end
131
+ return JSON.parse(response.body)
132
+ rescue => error
133
+ raise "autonomic_trigger_show failed due to #{error.formatted}"
134
+ end
135
+ end
136
+
137
+ def autonomic_trigger_enable(name, group: 'DEFAULT', scope: $openc3_scope)
138
+ begin
139
+ endpoint = "/openc3-api/autonomic/#{group}/trigger/#{name}/enable"
140
+ response = $api_server.request('post', endpoint, json: true, scope: scope)
141
+ if response.nil? || response.status != 200
142
+ if response
143
+ parsed = JSON.parse(response.body)
144
+ raise "autonomic_trigger_enable error: #{parsed['error']}"
145
+ else
146
+ raise "autonomic_trigger_enable failed"
147
+ end
148
+ end
149
+ return
150
+ rescue => error
151
+ raise "autonomic_trigger_enable failed due to #{error.formatted}"
152
+ end
153
+ end
154
+
155
+ def autonomic_trigger_disable(name, group: 'DEFAULT', scope: $openc3_scope)
156
+ begin
157
+ endpoint = "/openc3-api/autonomic/#{group}/trigger/#{name}/disable"
158
+ response = $api_server.request('post', endpoint, json: true, scope: scope)
159
+ if response.nil? || response.status != 200
160
+ if response
161
+ parsed = JSON.parse(response.body)
162
+ raise "autonomic_trigger_disable error: #{parsed['error']}"
163
+ else
164
+ raise "autonomic_trigger_disable failed"
165
+ end
166
+ end
167
+ return
168
+ rescue => error
169
+ raise "autonomic_trigger_disable failed due to #{error.formatted}"
170
+ end
171
+ end
172
+
173
+ def autonomic_trigger_update(name, group: 'DEFAULT', left: nil, operator: nil, right: nil, scope: $openc3_scope)
174
+ begin
175
+ endpoint = "/openc3-api/autonomic/#{group}/trigger/#{name}"
176
+ config = {}
177
+ config['left'] = left if left
178
+ config['operator'] = operator if operator
179
+ config['right'] = right if right
180
+ response = $api_server.request('put', endpoint, data: config, json: true, scope: scope)
181
+ if response.nil? || response.status != 200
182
+ if response
183
+ parsed = JSON.parse(response.body)
184
+ raise "autonomic_trigger_update error: #{parsed['error']}"
185
+ else
186
+ raise "autonomic_trigger_update failed"
187
+ end
188
+ end
189
+ return JSON.parse(response.body)
190
+ rescue => error
191
+ raise "autonomic_trigger_update failed due to #{error.formatted}"
192
+ end
193
+ end
194
+
195
+ def autonomic_trigger_destroy(name, group: 'DEFAULT', scope: $openc3_scope)
196
+ begin
197
+ endpoint = "/openc3-api/autonomic/#{group}/trigger/#{name}"
198
+ response = $api_server.request('delete', endpoint, scope: scope)
199
+ if response.nil? || response.status != 200
200
+ if response
201
+ parsed = JSON.parse(response.body)
202
+ raise "autonomic_trigger_destroy error: #{parsed['error']}"
203
+ else
204
+ raise "autonomic_trigger_destroy failed"
205
+ end
206
+ end
207
+ return
208
+ rescue => error
209
+ raise "autonomic_trigger_destroy failed due to #{error.formatted}"
210
+ end
211
+ end
212
+
213
+ # Reaction Methods
214
+ def autonomic_reaction_list(scope: $openc3_scope)
215
+ begin
216
+ endpoint = "/openc3-api/autonomic/reaction"
217
+ response = $api_server.request('get', endpoint, scope: scope)
218
+ if response.nil? || response.status != 200
219
+ raise "Unexpected response to autonomic_reaction_list: #{response.inspect}"
220
+ end
221
+ return JSON.parse(response.body)
222
+ rescue => error
223
+ raise "autonomic_reaction_list failed due to #{error.formatted}"
224
+ end
225
+ end
226
+
227
+ def autonomic_reaction_create(triggers:, actions:, trigger_level: 'EDGE', snooze: 0, scope: $openc3_scope)
228
+ begin
229
+ endpoint = "/openc3-api/autonomic/reaction"
230
+ config = {
231
+ 'triggers' => triggers,
232
+ 'actions' => actions,
233
+ 'trigger_level' => trigger_level,
234
+ 'snooze' => snooze,
235
+ }
236
+ response = $api_server.request('post', endpoint, data: config, json: true, scope: scope)
237
+ if response.nil? || response.status != 201
238
+ if response
239
+ parsed = JSON.parse(response.body)
240
+ raise "autonomic_reaction_create error: #{parsed['error']}"
241
+ else
242
+ raise "autonomic_reaction_create failed"
243
+ end
244
+ end
245
+ return JSON.parse(response.body)
246
+ rescue => error
247
+ raise "autonomic_reaction_create failed due to #{error.formatted}"
248
+ end
249
+ end
250
+
251
+ def autonomic_reaction_show(name, scope: $openc3_scope)
252
+ begin
253
+ endpoint = "/openc3-api/autonomic/reaction/#{name}"
254
+ response = $api_server.request('get', endpoint, scope: scope)
255
+ if response.nil? || response.status != 200
256
+ raise "Unexpected response to autonomic_reaction_show: #{response.inspect}"
257
+ end
258
+ return JSON.parse(response.body)
259
+ rescue => error
260
+ raise "autonomic_reaction_show failed due to #{error.formatted}"
261
+ end
262
+ end
263
+
264
+ def autonomic_reaction_enable(name, scope: $openc3_scope)
265
+ begin
266
+ endpoint = "/openc3-api/autonomic/reaction/#{name}/enable"
267
+ response = $api_server.request('post', endpoint, json: true, scope: scope)
268
+ if response.nil? || response.status != 200
269
+ if response
270
+ parsed = JSON.parse(response.body)
271
+ raise "autonomic_reaction_enable error: #{parsed['error']}"
272
+ else
273
+ raise "autonomic_reaction_enable failed"
274
+ end
275
+ end
276
+ return
277
+ rescue => error
278
+ raise "autonomic_reaction_enable failed due to #{error.formatted}"
279
+ end
280
+ end
281
+
282
+ def autonomic_reaction_disable(name, scope: $openc3_scope)
283
+ begin
284
+ endpoint = "/openc3-api/autonomic/reaction/#{name}/disable"
285
+ response = $api_server.request('post', endpoint, json: true, scope: scope)
286
+ if response.nil? || response.status != 200
287
+ if response
288
+ parsed = JSON.parse(response.body)
289
+ raise "autonomic_reaction_disable error: #{parsed['error']}"
290
+ else
291
+ raise "autonomic_reaction_disable failed"
292
+ end
293
+ end
294
+ return
295
+ rescue => error
296
+ raise "autonomic_reaction_disable failed due to #{error.formatted}"
297
+ end
298
+ end
299
+
300
+ def autonomic_reaction_execute(name, scope: $openc3_scope)
301
+ begin
302
+ endpoint = "/openc3-api/autonomic/reaction/#{name}/execute"
303
+ response = $api_server.request('post', endpoint, json: true, scope: scope)
304
+ if response.nil? || response.status != 200
305
+ if response
306
+ parsed = JSON.parse(response.body)
307
+ raise "autonomic_reaction_execute error: #{parsed['error']}"
308
+ else
309
+ raise "autonomic_reaction_execute failed"
310
+ end
311
+ end
312
+ return
313
+ rescue => error
314
+ raise "autonomic_reaction_execute failed due to #{error.formatted}"
315
+ end
316
+ end
317
+
318
+ def autonomic_reaction_update(name, triggers: nil, actions: nil, trigger_level: nil, snooze: nil, scope: $openc3_scope)
319
+ begin
320
+ endpoint = "/openc3-api/autonomic/reaction/#{name}"
321
+ config = {}
322
+ config['triggers'] = triggers if triggers
323
+ config['actions'] = actions if actions
324
+ config['trigger_level'] = trigger_level if trigger_level
325
+ config['snooze'] = snooze if snooze
326
+ response = $api_server.request('put', endpoint, data: config, json: true, scope: scope)
327
+ if response.nil? || response.status != 200
328
+ if response
329
+ parsed = JSON.parse(response.body)
330
+ raise "autonomic_reaction_update error: #{parsed['error']}"
331
+ else
332
+ raise "autonomic_reaction_update failed"
333
+ end
334
+ end
335
+ return JSON.parse(response.body)
336
+ rescue => error
337
+ raise "autonomic_reaction_update failed due to #{error.formatted}"
338
+ end
339
+ end
340
+
341
+ def autonomic_reaction_destroy(name, scope: $openc3_scope)
342
+ begin
343
+ endpoint = "/openc3-api/autonomic/reaction/#{name}"
344
+ response = $api_server.request('delete', endpoint, scope: scope)
345
+ if response.nil? || response.status != 200
346
+ if response
347
+ parsed = JSON.parse(response.body)
348
+ raise "autonomic_reaction_destroy error: #{parsed['error']}"
349
+ else
350
+ raise "autonomic_reaction_destroy failed"
351
+ end
352
+ end
353
+ return
354
+ rescue => error
355
+ raise "autonomic_reaction_destroy failed due to #{error.formatted}"
356
+ end
357
+ end
358
+ end
359
+ end
@@ -24,6 +24,7 @@ require 'openc3'
24
24
  require 'openc3/api/api'
25
25
  require 'openc3/io/json_drb_object'
26
26
  require 'openc3/script/api_shared'
27
+ require 'openc3/script/autonomic'
27
28
  require 'openc3/script/calendar'
28
29
  require 'openc3/script/commands'
29
30
  require 'openc3/script/critical_cmd'
@@ -1,14 +1,14 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- OPENC3_VERSION = '6.4.1'
3
+ OPENC3_VERSION = '6.4.2'
4
4
  module OpenC3
5
5
  module Version
6
6
  MAJOR = '6'
7
7
  MINOR = '4'
8
- PATCH = '1'
8
+ PATCH = '2'
9
9
  OTHER = ''
10
- BUILD = '09f13531376ee0c7651a2eea12c702318b57a7aa'
10
+ BUILD = '8b7b7389663bce219219fe1b42679119a63331f1'
11
11
  end
12
- VERSION = '6.4.1'
13
- GEM_VERSION = '6.4.1'
12
+ VERSION = '6.4.2'
13
+ GEM_VERSION = '6.4.2'
14
14
  end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "<%= tool_name %>",
3
- "version": "6.4.1",
3
+ "version": "6.4.2",
4
4
  "scripts": {
5
5
  "ng": "ng",
6
6
  "start": "ng serve",
@@ -23,7 +23,7 @@
23
23
  "@angular/platform-browser-dynamic": "^18.2.6",
24
24
  "@angular/router": "^18.2.6",
25
25
  "@astrouxds/astro-web-components": "^7.24.0",
26
- "@openc3/js-common": "6.4.1",
26
+ "@openc3/js-common": "6.4.2",
27
27
  "rxjs": "~7.8.0",
28
28
  "single-spa": "^5.9.5",
29
29
  "single-spa-angular": "^9.2.0",
@@ -16,7 +16,7 @@
16
16
  "@emotion/react": "^11.13.3",
17
17
  "@emotion/styled": "^11.11.0",
18
18
  "@mui/material": "^6.1.1",
19
- "@openc3/js-common": "6.4.1",
19
+ "@openc3/js-common": "6.4.2",
20
20
  "react": "^18.2.0",
21
21
  "react-dom": "^18.2.0",
22
22
  "single-spa-react": "^5.1.4"
@@ -12,7 +12,7 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@astrouxds/astro-web-components": "^7.24.0",
15
- "@openc3/js-common": "6.4.1",
15
+ "@openc3/js-common": "6.4.2",
16
16
  "@smui/button": "^7.0.0",
17
17
  "@smui/common": "^7.0.0",
18
18
  "@smui/card": "^7.0.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "<%= tool_name %>",
3
- "version": "6.4.1",
3
+ "version": "6.4.2",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "scripts": {
@@ -11,8 +11,8 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "@astrouxds/astro-web-components": "^7.24.0",
14
- "@openc3/js-common": "6.4.1",
15
- "@openc3/vue-common": "6.4.1",
14
+ "@openc3/js-common": "6.4.2",
15
+ "@openc3/vue-common": "6.4.2",
16
16
  "axios": "^1.7.7",
17
17
  "date-fns": "^4.1.0",
18
18
  "lodash": "^4.17.21",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "<%= widget_name %>",
3
- "version": "6.4.1",
3
+ "version": "6.4.2",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "scripts": {
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "dependencies": {
10
10
  "@astrouxds/astro-web-components": "^7.24.0",
11
- "@openc3/vue-common": "6.4.1",
11
+ "@openc3/vue-common": "6.4.2",
12
12
  "vuetify": "^3.7.1"
13
13
  },
14
14
  "devDependencies": {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openc3
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.4.1
4
+ version: 6.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Melton
@@ -816,6 +816,7 @@ files:
816
816
  - data/config/command.yaml
817
817
  - data/config/command_modifiers.yaml
818
818
  - data/config/command_telemetry.yaml
819
+ - data/config/conversions.yaml
819
820
  - data/config/graph_settings.yaml
820
821
  - data/config/interface_modifiers.yaml
821
822
  - data/config/item_modifiers.yaml
@@ -1075,6 +1076,7 @@ files:
1075
1076
  - lib/openc3/processors/watermark_processor.rb
1076
1077
  - lib/openc3/script.rb
1077
1078
  - lib/openc3/script/api_shared.rb
1079
+ - lib/openc3/script/autonomic.rb
1078
1080
  - lib/openc3/script/calendar.rb
1079
1081
  - lib/openc3/script/commands.rb
1080
1082
  - lib/openc3/script/critical_cmd.rb