openc3 5.18.0 → 5.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +7 -4
- data/bin/cstol_converter +14 -14
- data/bin/openc3cli +189 -7
- data/data/config/_interfaces.yaml +1 -1
- data/data/config/command_modifiers.yaml +55 -0
- data/data/config/interface_modifiers.yaml +1 -1
- data/data/config/param_item_modifiers.yaml +1 -1
- data/data/config/parameter_modifiers.yaml +1 -1
- data/data/config/plugins.yaml +6 -2
- data/data/config/screen.yaml +2 -2
- data/data/config/table_manager.yaml +2 -2
- data/data/config/tool.yaml +4 -1
- data/data/config/widgets.yaml +3 -3
- data/ext/openc3/ext/config_parser/config_parser.c +1 -1
- data/ext/openc3/ext/packet/packet.c +1 -1
- data/ext/openc3/ext/platform/platform.c +3 -3
- data/ext/openc3/ext/structure/structure.c +56 -76
- data/lib/openc3/accessors/binary_accessor.rb +4 -4
- data/lib/openc3/accessors/form_accessor.rb +2 -2
- data/lib/openc3/accessors/http_accessor.rb +1 -1
- data/lib/openc3/accessors/json_accessor.rb +6 -4
- data/lib/openc3/accessors/template_accessor.rb +6 -9
- data/lib/openc3/accessors/xml_accessor.rb +1 -1
- data/lib/openc3/api/cmd_api.rb +35 -11
- data/lib/openc3/api/limits_api.rb +1 -1
- data/lib/openc3/config/config_parser.rb +1 -1
- data/lib/openc3/conversions/segmented_polynomial_conversion.rb +7 -7
- data/lib/openc3/core_ext/array.rb +5 -5
- data/lib/openc3/core_ext/exception.rb +9 -2
- data/lib/openc3/core_ext/string.rb +2 -2
- data/lib/openc3/interfaces/http_server_interface.rb +1 -0
- data/lib/openc3/interfaces/interface.rb +1 -1
- data/lib/openc3/interfaces/linc_interface.rb +3 -3
- data/lib/openc3/io/json_api.rb +11 -6
- data/lib/openc3/io/json_rpc.rb +1 -1
- data/lib/openc3/logs/buffered_packet_log_writer.rb +3 -3
- data/lib/openc3/logs/log_writer.rb +7 -8
- data/lib/openc3/logs/packet_log_writer.rb +7 -7
- data/lib/openc3/logs/text_log_writer.rb +4 -4
- data/lib/openc3/microservices/decom_microservice.rb +19 -4
- data/lib/openc3/microservices/interface_microservice.rb +41 -3
- data/lib/openc3/microservices/reaction_microservice.rb +2 -2
- data/lib/openc3/microservices/trigger_group_microservice.rb +3 -3
- data/lib/openc3/migrations/20240915000000_activity_uuid.rb +28 -0
- data/lib/openc3/models/activity_model.rb +109 -80
- data/lib/openc3/models/auth_model.rb +31 -2
- data/lib/openc3/models/cvt_model.rb +11 -5
- data/lib/openc3/models/gem_model.rb +8 -8
- data/lib/openc3/models/plugin_model.rb +3 -3
- data/lib/openc3/models/reducer_model.rb +2 -2
- data/lib/openc3/models/scope_model.rb +1 -1
- data/lib/openc3/models/sorted_model.rb +4 -4
- data/lib/openc3/models/target_model.rb +3 -3
- data/lib/openc3/models/tool_config_model.rb +1 -1
- data/lib/openc3/models/tool_model.rb +4 -4
- data/lib/openc3/models/widget_model.rb +11 -5
- data/lib/openc3/operators/operator.rb +5 -3
- data/lib/openc3/packets/command_validator.rb +48 -0
- data/lib/openc3/packets/commands.rb +6 -14
- data/lib/openc3/packets/packet.rb +31 -15
- data/lib/openc3/packets/packet_config.rb +10 -9
- data/lib/openc3/packets/parsers/packet_parser.rb +3 -3
- data/lib/openc3/packets/structure.rb +21 -13
- data/lib/openc3/packets/structure_item.rb +33 -47
- data/lib/openc3/packets/telemetry.rb +6 -27
- data/lib/openc3/script/api_shared.rb +7 -5
- data/lib/openc3/script/calendar.rb +2 -2
- data/lib/openc3/script/commands.rb +6 -4
- data/lib/openc3/script/metadata.rb +2 -2
- data/lib/openc3/script/suite.rb +17 -17
- data/lib/openc3/streams/serial_stream.rb +2 -3
- data/lib/openc3/streams/stream.rb +2 -2
- data/lib/openc3/tools/cmd_tlm_server/interface_thread.rb +10 -10
- data/lib/openc3/tools/table_manager/table_manager_core.rb +11 -11
- data/lib/openc3/tools/table_manager/table_parser.rb +2 -3
- data/lib/openc3/topics/command_decom_topic.rb +2 -1
- data/lib/openc3/topics/command_topic.rb +3 -3
- data/lib/openc3/topics/decom_interface_topic.rb +2 -2
- data/lib/openc3/topics/telemetry_decom_topic.rb +1 -1
- data/lib/openc3/utilities/authorization.rb +2 -1
- data/lib/openc3/utilities/cli_generator.rb +15 -8
- data/lib/openc3/utilities/cosmos_rails_formatter.rb +60 -0
- data/lib/openc3/utilities/crc.rb +6 -6
- data/lib/openc3/utilities/local_mode.rb +2 -1
- data/lib/openc3/utilities/logger.rb +44 -34
- data/lib/openc3/utilities/metric.rb +1 -2
- data/lib/openc3/utilities/quaternion.rb +18 -18
- data/lib/openc3/utilities/target_file.rb +4 -4
- data/lib/openc3/version.rb +5 -5
- data/lib/openc3/win32/win32_main.rb +2 -2
- data/templates/tool_angular/package.json +21 -21
- data/templates/tool_react/package.json +10 -10
- data/templates/tool_svelte/package.json +11 -11
- data/templates/tool_svelte/src/services/openc3-api.js +17 -17
- data/templates/tool_vue/package.json +9 -9
- data/templates/widget/package.json +6 -7
- metadata +5 -2
@@ -15,7 +15,7 @@
|
|
15
15
|
|
16
16
|
/*
|
17
17
|
# Modified by OpenC3, Inc.
|
18
|
-
# All changes Copyright
|
18
|
+
# All changes Copyright 2024, OpenC3, Inc.
|
19
19
|
# All Rights Reserved
|
20
20
|
#
|
21
21
|
# This file may also be used under the terms of a commercial license
|
@@ -69,7 +69,9 @@ static ID id_method_class2 = 0;
|
|
69
69
|
|
70
70
|
static ID id_ivar_buffer = 0;
|
71
71
|
static ID id_ivar_bit_offset = 0;
|
72
|
+
static ID id_ivar_original_bit_offset = 0;
|
72
73
|
static ID id_ivar_bit_size = 0;
|
74
|
+
static ID id_ivar_variable_bit_size = 0;
|
73
75
|
static ID id_ivar_array_size = 0;
|
74
76
|
static ID id_ivar_endianness = 0;
|
75
77
|
static ID id_ivar_data_type = 0;
|
@@ -384,7 +386,7 @@ static void write_bitfield(int lower_bound, int upper_bound, int bit_offset, int
|
|
384
386
|
memcpy(&buffer[lower_bound], write_value, num_bytes);
|
385
387
|
}
|
386
388
|
|
387
|
-
/* Check the bit size and bit offset for problems.
|
389
|
+
/* Check the bit size and bit offset for problems. Recalculate the bit offset
|
388
390
|
* and return back through the passed in pointer. */
|
389
391
|
static void check_bit_offset_and_size(VALUE self, VALUE type_param, VALUE bit_offset_param, VALUE bit_size_param, VALUE data_type_param, VALUE buffer_param, int *new_bit_offset)
|
390
392
|
{
|
@@ -1140,7 +1142,7 @@ static VALUE binary_accessor_write(VALUE self, VALUE value, VALUE param_bit_offs
|
|
1140
1142
|
c_value = NUM2ULL(value);
|
1141
1143
|
break;
|
1142
1144
|
}
|
1143
|
-
/* If the passed
|
1145
|
+
/* If the passed endianness doesn't match the host we reverse the bytes.
|
1144
1146
|
* Then shift the result over so it's at the bottom of the long long value. */
|
1145
1147
|
if (param_endianness != HOST_ENDIANNESS)
|
1146
1148
|
{
|
@@ -1360,92 +1362,86 @@ static VALUE read_item(int argc, VALUE *argv, VALUE self)
|
|
1360
1362
|
*/
|
1361
1363
|
static VALUE structure_item_spaceship(VALUE self, VALUE other_item)
|
1362
1364
|
{
|
1363
|
-
int
|
1364
|
-
int
|
1365
|
-
int bit_size = 0;
|
1366
|
-
int other_bit_size = 0;
|
1365
|
+
int original_bit_offset = 0;
|
1366
|
+
int other_original_bit_offset = 0;
|
1367
1367
|
int create_index = 0;
|
1368
1368
|
int other_create_index = 0;
|
1369
|
-
|
1370
|
-
volatile VALUE
|
1371
|
-
volatile VALUE
|
1369
|
+
volatile VALUE data_type = Qnil;
|
1370
|
+
volatile VALUE other_data_type = Qnil;
|
1371
|
+
volatile VALUE variable_bit_size = Qnil;
|
1372
|
+
volatile VALUE other_variable_bit_size = Qnil;
|
1372
1373
|
|
1373
1374
|
if (!RTEST(rb_funcall(other_item, id_method_kind_of, 1, cStructureItem)))
|
1374
1375
|
{
|
1375
1376
|
return Qnil;
|
1376
1377
|
}
|
1377
1378
|
|
1378
|
-
|
1379
|
-
|
1379
|
+
original_bit_offset = FIX2INT(rb_ivar_get(self, id_ivar_original_bit_offset));
|
1380
|
+
other_original_bit_offset = FIX2INT(rb_ivar_get(other_item, id_ivar_original_bit_offset));
|
1380
1381
|
|
1381
|
-
|
1382
|
-
|
1383
|
-
|
1384
|
-
|
1385
|
-
|
1386
|
-
other_create_index = FIX2INT(v_other_create_index);
|
1387
|
-
have_create_index = 1;
|
1388
|
-
}
|
1382
|
+
create_index = FIX2INT(rb_ivar_get(self, id_ivar_create_index));
|
1383
|
+
other_create_index = FIX2INT(rb_ivar_get(other_item, id_ivar_create_index));
|
1384
|
+
|
1385
|
+
data_type = rb_ivar_get(self, id_ivar_data_type);
|
1386
|
+
other_data_type = rb_ivar_get(other_item, id_ivar_data_type);
|
1389
1387
|
|
1390
|
-
|
1391
|
-
|
1388
|
+
variable_bit_size = rb_ivar_get(self, id_ivar_variable_bit_size);
|
1389
|
+
other_variable_bit_size = rb_ivar_get(other_item, id_ivar_variable_bit_size);
|
1390
|
+
|
1391
|
+
/* Derived items should be first in the list with multiple derived sorted
|
1392
|
+
* by create_index */
|
1393
|
+
if (data_type == symbol_DERIVED)
|
1392
1394
|
{
|
1393
|
-
|
1394
|
-
* This allows derived items with bit_size of 0 to be listed first
|
1395
|
-
* Compare based on bit size */
|
1396
|
-
bit_size = FIX2INT(rb_ivar_get(self, id_ivar_bit_size));
|
1397
|
-
other_bit_size = FIX2INT(rb_ivar_get(other_item, id_ivar_bit_size));
|
1398
|
-
if (bit_size == other_bit_size)
|
1395
|
+
if (other_data_type != symbol_DERIVED)
|
1399
1396
|
{
|
1400
|
-
|
1397
|
+
return INT2FIX(-1);
|
1398
|
+
}
|
1399
|
+
else
|
1400
|
+
{
|
1401
|
+
if (create_index <= other_create_index)
|
1401
1402
|
{
|
1402
|
-
|
1403
|
-
{
|
1404
|
-
return INT2FIX(-1);
|
1405
|
-
}
|
1406
|
-
else
|
1407
|
-
{
|
1408
|
-
return INT2FIX(1);
|
1409
|
-
}
|
1403
|
+
return INT2FIX(-1);
|
1410
1404
|
}
|
1411
1405
|
else
|
1412
1406
|
{
|
1413
|
-
return INT2FIX(
|
1407
|
+
return INT2FIX(1);
|
1414
1408
|
}
|
1415
1409
|
}
|
1416
|
-
|
1417
|
-
|
1418
|
-
|
1419
|
-
|
1420
|
-
else
|
1421
|
-
{
|
1422
|
-
return INT2FIX(1);
|
1423
|
-
}
|
1410
|
+
}
|
1411
|
+
else if (other_data_type == symbol_DERIVED)
|
1412
|
+
{
|
1413
|
+
return INT2FIX(1);
|
1424
1414
|
}
|
1425
1415
|
|
1426
|
-
/* Handle
|
1427
|
-
if (((
|
1416
|
+
/* Handle non-derived items */
|
1417
|
+
if (((original_bit_offset >= 0) && (other_original_bit_offset >= 0)) || ((original_bit_offset < 0) && (other_original_bit_offset < 0)))
|
1428
1418
|
{
|
1429
1419
|
/* Both Have Same Sign */
|
1430
|
-
if (
|
1420
|
+
if (original_bit_offset == other_original_bit_offset)
|
1431
1421
|
{
|
1432
|
-
if (
|
1422
|
+
if (RTEST(variable_bit_size))
|
1433
1423
|
{
|
1434
|
-
if (
|
1424
|
+
if (!RTEST(other_variable_bit_size))
|
1435
1425
|
{
|
1436
1426
|
return INT2FIX(-1);
|
1437
1427
|
}
|
1438
|
-
|
1439
|
-
|
1440
|
-
|
1441
|
-
|
1428
|
+
/* If both variable_bit_size use create index */
|
1429
|
+
}
|
1430
|
+
else if (RTEST(other_variable_bit_size))
|
1431
|
+
{
|
1432
|
+
return INT2FIX(1);
|
1433
|
+
}
|
1434
|
+
|
1435
|
+
if (create_index <= other_create_index)
|
1436
|
+
{
|
1437
|
+
return INT2FIX(-1);
|
1442
1438
|
}
|
1443
1439
|
else
|
1444
1440
|
{
|
1445
|
-
return INT2FIX(
|
1441
|
+
return INT2FIX(1);
|
1446
1442
|
}
|
1447
1443
|
}
|
1448
|
-
else if (
|
1444
|
+
else if (original_bit_offset <= other_original_bit_offset)
|
1449
1445
|
{
|
1450
1446
|
return INT2FIX(-1);
|
1451
1447
|
}
|
@@ -1457,25 +1453,7 @@ static VALUE structure_item_spaceship(VALUE self, VALUE other_item)
|
|
1457
1453
|
else
|
1458
1454
|
{
|
1459
1455
|
/* Different Signs */
|
1460
|
-
if (
|
1461
|
-
{
|
1462
|
-
if (have_create_index)
|
1463
|
-
{
|
1464
|
-
if (create_index <= other_create_index)
|
1465
|
-
{
|
1466
|
-
return INT2FIX(-1);
|
1467
|
-
}
|
1468
|
-
else
|
1469
|
-
{
|
1470
|
-
return INT2FIX(1);
|
1471
|
-
}
|
1472
|
-
}
|
1473
|
-
else
|
1474
|
-
{
|
1475
|
-
return INT2FIX(0);
|
1476
|
-
}
|
1477
|
-
}
|
1478
|
-
else if (bit_offset < other_bit_offset)
|
1456
|
+
if (original_bit_offset < other_original_bit_offset)
|
1479
1457
|
{
|
1480
1458
|
return INT2FIX(1);
|
1481
1459
|
}
|
@@ -1649,7 +1627,9 @@ void Init_structure(void)
|
|
1649
1627
|
|
1650
1628
|
id_ivar_buffer = rb_intern("@buffer");
|
1651
1629
|
id_ivar_bit_offset = rb_intern("@bit_offset");
|
1630
|
+
id_ivar_original_bit_offset = rb_intern("@original_bit_offset");
|
1652
1631
|
id_ivar_bit_size = rb_intern("@bit_size");
|
1632
|
+
id_ivar_variable_bit_size = rb_intern("@variable_bit_size");
|
1653
1633
|
id_ivar_array_size = rb_intern("@array_size");
|
1654
1634
|
id_ivar_endianness = rb_intern("@endianness");
|
1655
1635
|
id_ivar_data_type = rb_intern("@data_type");
|
@@ -108,7 +108,7 @@ module OpenC3
|
|
108
108
|
|
109
109
|
# Store the host endianness so that it only has to be determined once
|
110
110
|
HOST_ENDIANNESS = get_host_endianness()
|
111
|
-
# Valid
|
111
|
+
# Valid endianness
|
112
112
|
ENDIANNESS = [:BIG_ENDIAN, :LITTLE_ENDIAN]
|
113
113
|
|
114
114
|
def handle_read_variable_bit_size(item, _buffer)
|
@@ -749,7 +749,7 @@ module OpenC3
|
|
749
749
|
end
|
750
750
|
|
751
751
|
|
752
|
-
# Check the bit size and bit offset for problems.
|
752
|
+
# Check the bit size and bit offset for problems. Recalculate the bit offset
|
753
753
|
# and return back through the passed in pointer.
|
754
754
|
def self.check_bit_offset_and_size(read_or_write, given_bit_offset, given_bit_size, data_type, buffer)
|
755
755
|
bit_offset = given_bit_offset
|
@@ -1104,7 +1104,7 @@ module OpenC3
|
|
1104
1104
|
# Remove extra bytes from old buffer
|
1105
1105
|
buffer[(upper_bound + 1)..old_upper_bound] = ''
|
1106
1106
|
elsif upper_bound > old_upper_bound
|
1107
|
-
# Grow buffer and preserve bytes at end of buffer if
|
1107
|
+
# Grow buffer and preserve bytes at end of buffer if necessary
|
1108
1108
|
buffer_length = buffer.length
|
1109
1109
|
diff = upper_bound - old_upper_bound
|
1110
1110
|
buffer << (ZERO_STRING * diff)
|
@@ -1408,7 +1408,7 @@ module OpenC3
|
|
1408
1408
|
return false
|
1409
1409
|
end
|
1410
1410
|
|
1411
|
-
# If this is true it will
|
1411
|
+
# If this is true it will enforce that COSMOS DERIVED items must have a
|
1412
1412
|
# write_conversion to be written
|
1413
1413
|
def enforce_derived_write_conversion(_item)
|
1414
1414
|
return true
|
@@ -45,7 +45,7 @@ module OpenC3
|
|
45
45
|
ary = URI.decode_www_form(buffer)
|
46
46
|
|
47
47
|
# Remove existing item and bad keys from array
|
48
|
-
ary.reject! {|key,
|
48
|
+
ary.reject! {|key, _ary_value| (key == item.key) or (key.to_s[0] == "\u0000")}
|
49
49
|
|
50
50
|
if Array === value
|
51
51
|
value.each do |value_value|
|
@@ -79,7 +79,7 @@ module OpenC3
|
|
79
79
|
return true
|
80
80
|
end
|
81
81
|
|
82
|
-
# If this is true it will
|
82
|
+
# If this is true it will enforce that COSMOS DERIVED items must have a
|
83
83
|
# write_conversion to be written
|
84
84
|
def enforce_derived_write_conversion(_item)
|
85
85
|
return true
|
@@ -169,7 +169,7 @@ module OpenC3
|
|
169
169
|
return @body_accessor.enforce_short_buffer_allowed
|
170
170
|
end
|
171
171
|
|
172
|
-
# If this is true it will
|
172
|
+
# If this is true it will enforce that COSMOS DERIVED items must have a
|
173
173
|
# write_conversion to be written
|
174
174
|
def enforce_derived_write_conversion(item)
|
175
175
|
case item.name
|
@@ -22,9 +22,11 @@ require 'openc3/io/json_rpc'
|
|
22
22
|
require 'openc3/accessors/accessor'
|
23
23
|
|
24
24
|
# Monkey patch JsonPath to enable create_additions and allow_nan to support binary strings, and NaN, Infinity, -Infinity
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
OpenC3.disable_warnings do
|
26
|
+
class JsonPath
|
27
|
+
def self.process_object(obj_or_str, opts = {})
|
28
|
+
obj_or_str.is_a?(String) ? MultiJson.decode(obj_or_str, max_nesting: opts[:max_nesting], create_additions: true, allow_nan: true) : obj_or_str
|
29
|
+
end
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
@@ -161,7 +163,7 @@ module OpenC3
|
|
161
163
|
return true
|
162
164
|
end
|
163
165
|
|
164
|
-
# If this is true it will
|
166
|
+
# If this is true it will enforce that COSMOS DERIVED items must have a
|
165
167
|
# write_conversion to be written
|
166
168
|
def enforce_derived_write_conversion(_item)
|
167
169
|
return true
|
@@ -38,21 +38,18 @@ module OpenC3
|
|
38
38
|
# Convert the template into a Regexp for reading each item
|
39
39
|
template = @packet.template.dup
|
40
40
|
template_items = template.scan(Regexp.new("#{escaped_left_char}.*?#{escaped_right_char}"))
|
41
|
-
escaped_read_template = template
|
42
|
-
if @left_char != '('
|
43
|
-
escaped_read_template = escaped_read_template.gsub('(', '\(')
|
44
|
-
end
|
45
|
-
if @right_char != ')'
|
46
|
-
escaped_read_template = escaped_read_template.gsub(')', '\)')
|
47
|
-
end
|
41
|
+
escaped_read_template = Regexp.escape(template)
|
48
42
|
|
49
43
|
@item_keys = []
|
50
44
|
template_items.each do |item|
|
51
45
|
@item_keys << item[1..-2]
|
46
|
+
# If they're using parens we have to escape them
|
47
|
+
# since we're working with the already escaped template
|
48
|
+
item = "\\#{item}" if @left_char == '('
|
49
|
+
item = "#{item[0..-2]}\\)" if @right_char == ')'
|
52
50
|
escaped_read_template.gsub!(item, "(.*)")
|
53
51
|
end
|
54
52
|
@read_regexp = Regexp.new(escaped_read_template)
|
55
|
-
|
56
53
|
@configured = true
|
57
54
|
end
|
58
55
|
|
@@ -141,7 +138,7 @@ module OpenC3
|
|
141
138
|
return true
|
142
139
|
end
|
143
140
|
|
144
|
-
# If this is true it will
|
141
|
+
# If this is true it will enforce that COSMOS DERIVED items must have a
|
145
142
|
# write_conversion to be written
|
146
143
|
def enforce_derived_write_conversion(_item)
|
147
144
|
return true
|
@@ -88,7 +88,7 @@ module OpenC3
|
|
88
88
|
return true
|
89
89
|
end
|
90
90
|
|
91
|
-
# If this is true it will
|
91
|
+
# If this is true it will enforce that COSMOS DERIVED items must have a
|
92
92
|
# write_conversion to be written
|
93
93
|
def enforce_derived_write_conversion(_item)
|
94
94
|
return true
|
data/lib/openc3/api/cmd_api.rb
CHANGED
@@ -452,7 +452,8 @@ module OpenC3
|
|
452
452
|
return [target_name, command_name, parameter_name]
|
453
453
|
end
|
454
454
|
|
455
|
-
|
455
|
+
# NOTE: When adding new keywords to this method, make sure to update script/commands.rb
|
456
|
+
def _cmd_implementation(method_name, *args, range_check:, hazardous_check:, raw:, timeout: nil, log_message: nil, manual: false, validate: true,
|
456
457
|
scope: $openc3_scope, token: $openc3_token, **kwargs)
|
457
458
|
extract_string_kwargs_to_args(args, kwargs)
|
458
459
|
unless [nil, true, false].include?(log_message)
|
@@ -484,7 +485,24 @@ module OpenC3
|
|
484
485
|
target_name = target_name.upcase
|
485
486
|
cmd_name = cmd_name.upcase
|
486
487
|
cmd_params = cmd_params.transform_keys(&:upcase)
|
487
|
-
authorize(permission: 'cmd', target_name: target_name, packet_name: cmd_name, manual: manual, scope: scope, token: token)
|
488
|
+
user = authorize(permission: 'cmd', target_name: target_name, packet_name: cmd_name, manual: manual, scope: scope, token: token)
|
489
|
+
if user.nil?
|
490
|
+
user = {}
|
491
|
+
user['username'] = ENV['OPENC3_MICROSERVICE_NAME']
|
492
|
+
|
493
|
+
# Get the caller stack trace to determine the point in the code where the command was called
|
494
|
+
# This code works but ultimately we didn't want to overload 'username' and take a performance hit
|
495
|
+
# caller.each do |frame|
|
496
|
+
# # Look for the following line in the stack trace which indicates custom code
|
497
|
+
# # /tmp/d20240827-62-8e57pf/targets/INST/lib/example_limits_response.rb:31:in `call'
|
498
|
+
# if frame.include?("/targets/#{target_name}")
|
499
|
+
# user = {}
|
500
|
+
# # username is the name of the custom code file
|
501
|
+
# user['username'] = frame.split("/targets/")[-1].split(':')[0]
|
502
|
+
# break
|
503
|
+
# end
|
504
|
+
# end
|
505
|
+
end
|
488
506
|
packet = TargetModel.packet(target_name, cmd_name, type: :CMD, scope: scope)
|
489
507
|
if packet['disabled']
|
490
508
|
error = DisabledError.new
|
@@ -493,14 +511,6 @@ module OpenC3
|
|
493
511
|
raise error
|
494
512
|
end
|
495
513
|
|
496
|
-
command = {
|
497
|
-
'target_name' => target_name,
|
498
|
-
'cmd_name' => cmd_name,
|
499
|
-
'cmd_params' => cmd_params,
|
500
|
-
'range_check' => range_check.to_s,
|
501
|
-
'hazardous_check' => hazardous_check.to_s,
|
502
|
-
'raw' => raw.to_s
|
503
|
-
}
|
504
514
|
if log_message.nil? # This means the default was used, no argument was passed
|
505
515
|
log_message = true # Default is true
|
506
516
|
# If the packet has the DISABLE_MESSAGES keyword then no messages by default
|
@@ -513,9 +523,23 @@ module OpenC3
|
|
513
523
|
end
|
514
524
|
end
|
515
525
|
end
|
526
|
+
cmd_string = _build_cmd_output_string(method_name, target_name, cmd_name, cmd_params, packet)
|
516
527
|
if log_message
|
517
|
-
Logger.info(
|
528
|
+
Logger.info(cmd_string, scope: scope)
|
518
529
|
end
|
530
|
+
|
531
|
+
username = user && user['username'] ? user['username'] : 'anonymous'
|
532
|
+
command = {
|
533
|
+
'target_name' => target_name,
|
534
|
+
'cmd_name' => cmd_name,
|
535
|
+
'cmd_params' => cmd_params,
|
536
|
+
'range_check' => range_check.to_s,
|
537
|
+
'hazardous_check' => hazardous_check.to_s,
|
538
|
+
'raw' => raw.to_s,
|
539
|
+
'cmd_string' => cmd_string,
|
540
|
+
'username' => username,
|
541
|
+
'validate' => validate.to_s
|
542
|
+
}
|
519
543
|
CommandTopic.send_command(command, timeout: timeout, scope: scope)
|
520
544
|
end
|
521
545
|
|
@@ -107,7 +107,7 @@ module OpenC3
|
|
107
107
|
# Favor the first syntax where possible as it is more succinct.
|
108
108
|
#
|
109
109
|
# @param args [String|Array<String>] See the description for calling style
|
110
|
-
# @return [Boolean] Whether limits are enable for the
|
110
|
+
# @return [Boolean] Whether limits are enable for the item
|
111
111
|
def limits_enabled?(*args, manual: false, scope: $openc3_scope, token: $openc3_token)
|
112
112
|
target_name, packet_name, item_name = _tlm_process_args(args, 'limits_enabled?', scope: scope)
|
113
113
|
authorize(permission: 'tlm', target_name: target_name, packet_name: packet_name, manual: manual, scope: scope, token: token)
|
@@ -190,7 +190,7 @@ module OpenC3
|
|
190
190
|
# @param remove_quotes [Boolean] Whether to remove beginning and ending single
|
191
191
|
# or double quote characters from parameters.
|
192
192
|
# @param run_erb [Boolean] Whether or not to run ERB on the file
|
193
|
-
# @param variables [Hash] variables to
|
193
|
+
# @param variables [Hash] variables to push to ERB context
|
194
194
|
# @param block [Block] The block to yield to
|
195
195
|
# @yieldparam keyword [String] The keyword in the current parsed line
|
196
196
|
# @yieldparam parameters [Array<String>] The parameters in the current parsed line
|
@@ -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/conversions/conversion'
|
@@ -42,7 +42,7 @@ module OpenC3
|
|
42
42
|
attr_reader :coeffs
|
43
43
|
|
44
44
|
# Creates a polynomial conversion segment. Multiple Segments are used to
|
45
|
-
#
|
45
|
+
# implement a {SegmentedPolynomialConversion}.
|
46
46
|
#
|
47
47
|
# @param lower_bound [Integer] The value at which point this polynomial conversion
|
48
48
|
# should apply. All values >= to this value will be converted using the
|
@@ -60,16 +60,16 @@ module OpenC3
|
|
60
60
|
# @param other_segment [Segment] The segment to compare
|
61
61
|
# @return [Integer] 1 if self.lower_bound > other_segment.lower_bound, 0
|
62
62
|
# if they are equal, -1 if self.lower_bound < other_segment.lower_bound
|
63
|
-
def <=>(
|
64
|
-
return
|
63
|
+
def <=>(other)
|
64
|
+
return other.lower_bound <=> @lower_bound
|
65
65
|
end
|
66
66
|
|
67
67
|
# Implement equality operator primarily for ease of testing
|
68
68
|
#
|
69
69
|
# @param segment [Segment] Other segment
|
70
|
-
def ==(
|
71
|
-
@lower_bound ==
|
72
|
-
@coeffs ==
|
70
|
+
def ==(other)
|
71
|
+
@lower_bound == other.lower_bound &&
|
72
|
+
@coeffs == other.coeffs
|
73
73
|
end
|
74
74
|
|
75
75
|
# Perform the polynomial conversion
|
@@ -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/ext/array' if RUBY_ENGINE == 'ruby' and !ENV['OPENC3_NO_EXT']
|
@@ -306,10 +306,10 @@ class Array
|
|
306
306
|
# which are arrays containing the first value that is found in the bucket,
|
307
307
|
# the last value found in the bucket, and the total number of values in the
|
308
308
|
# bucket.
|
309
|
-
def histogram(num_buckets = nil, numeric = false, &
|
309
|
+
def histogram(num_buckets = nil, numeric = false, &)
|
310
310
|
buckets = {}
|
311
311
|
|
312
|
-
# Count the
|
312
|
+
# Count the occurrence of each value
|
313
313
|
self.each do |value|
|
314
314
|
buckets[value] ||= 0
|
315
315
|
buckets[value] += 1
|
@@ -338,7 +338,7 @@ class Array
|
|
338
338
|
integers = true if first_value.kind_of?(Integer) and last_value.kind_of?(Integer)
|
339
339
|
if integers
|
340
340
|
bucket_size = bucket_size.ceil
|
341
|
-
last_value = first_value + bucket_size * num_buckets - 1
|
341
|
+
last_value = first_value + (bucket_size * num_buckets) - 1
|
342
342
|
delta = last_value - first_value
|
343
343
|
(delta + 1).times do |index|
|
344
344
|
buckets[first_value + index] ||= 0
|
@@ -406,7 +406,7 @@ class Array
|
|
406
406
|
last_index = sorted_buckets.length - 1 if last_index > (sorted_buckets.length - 1)
|
407
407
|
end
|
408
408
|
sum = 0
|
409
|
-
sorted_buckets[first_index..last_index].each { |
|
409
|
+
sorted_buckets[first_index..last_index].each { |_key, value| sum += value }
|
410
410
|
reduced_buckets[bucket_index] = [sorted_buckets[first_index][0], sorted_buckets[last_index][0], sum]
|
411
411
|
first_index = first_index + bucket_sizes[bucket_index]
|
412
412
|
end
|
@@ -14,14 +14,21 @@
|
|
14
14
|
# GNU Affero General Public License for more details.
|
15
15
|
|
16
16
|
# Modified by OpenC3, Inc.
|
17
|
-
# All changes Copyright
|
17
|
+
# All changes Copyright 2024, 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
|
# OpenC3 specific additions to the Ruby Exception class
|
24
24
|
class Exception
|
25
|
+
def filtered
|
26
|
+
backtrace = self.backtrace.select do |line|
|
27
|
+
!line.include?('lib/ruby/gems')
|
28
|
+
end
|
29
|
+
return "#{self.message}\n#{backtrace.join("\n")}"
|
30
|
+
end
|
31
|
+
|
25
32
|
# @param hide_runtime_error_class [Boolean] Whether to hide the Exception
|
26
33
|
# error class if the class is RuntimeError. Other classes will continue to
|
27
34
|
# be printed.
|
@@ -63,7 +63,7 @@ class String
|
|
63
63
|
# @param unprintable_character [String] The string to output when data in the
|
64
64
|
# binary String does not result in a printable ASCII character. Only used if
|
65
65
|
# show_ascii is true.
|
66
|
-
# @param line_separator [String] The string used to end a line.
|
66
|
+
# @param line_separator [String] The string used to end a line. Normally newline.
|
67
67
|
def formatted(
|
68
68
|
word_size = 1,
|
69
69
|
words_per_line = 16,
|
@@ -149,7 +149,7 @@ class String
|
|
149
149
|
string
|
150
150
|
end
|
151
151
|
|
152
|
-
# Uses the String each_line method to
|
152
|
+
# Uses the String each_line method to iterate through the lines and removes
|
153
153
|
# the line specified.
|
154
154
|
#
|
155
155
|
# @param line_number [Integer] The line to remove from the string (1 based)
|
@@ -258,7 +258,7 @@ module OpenC3
|
|
258
258
|
first = true
|
259
259
|
loop do
|
260
260
|
# Protocols may have cached data for a packet, so initially just inject a blank string
|
261
|
-
# Otherwise we can hold off
|
261
|
+
# Otherwise we can hold off outputting other packets where all the data has already
|
262
262
|
# been received
|
263
263
|
extra = nil
|
264
264
|
if !first or @read_protocols.length <= 0
|
@@ -128,11 +128,11 @@ module OpenC3
|
|
128
128
|
raise "Interface not connected" unless connected?()
|
129
129
|
|
130
130
|
# Add a GUID to the GUID field if its defined
|
131
|
-
# A GUID means it's an
|
131
|
+
# A GUID means it's an asynchronous packet type.
|
132
132
|
if @fieldname_guid
|
133
133
|
guid = get_guid(packet)
|
134
134
|
else
|
135
|
-
# If @fieldname_guid is not defined (
|
135
|
+
# If @fieldname_guid is not defined (synchronous) we don't care what the
|
136
136
|
# GUID is because we're not trying to match it up with anything.
|
137
137
|
# As soon as we get a response we free the command.
|
138
138
|
guid = 0
|
@@ -323,7 +323,7 @@ module OpenC3
|
|
323
323
|
# first looks up the handshake before removing it.
|
324
324
|
@handshakes_mutex.synchronize do
|
325
325
|
if @fieldname_guid
|
326
|
-
# A GUID means it's an
|
326
|
+
# A GUID means it's an asynchronous packet type.
|
327
327
|
# So look at the list of incoming handshakes and pick off (deleting)
|
328
328
|
# the handshake from the list if it's for this command.
|
329
329
|
#
|
data/lib/openc3/io/json_api.rb
CHANGED
@@ -40,13 +40,18 @@ module OpenC3
|
|
40
40
|
# pull openc3-cosmos-script-runner-api url from environment variables
|
41
41
|
def _generate_url(microservice_name:, prefix:, schema: 'http', hostname: nil, port:, scope: $openc3_scope)
|
42
42
|
prefix = '/' + prefix unless prefix[0] == '/'
|
43
|
-
if ENV['
|
44
|
-
hostname =
|
45
|
-
hostname = hostname.downcase.gsub("__", "-").gsub("_", "-")
|
46
|
-
return "#{schema}://#{hostname}-service:#{port.to_i}#{prefix}"
|
47
|
-
else
|
48
|
-
hostname = 'openc3-operator' unless hostname
|
43
|
+
if ENV['OPENC3_OPERATOR_HOSTNAME']
|
44
|
+
hostname = ENV['OPENC3_OPERATOR_HOSTNAME'] unless hostname
|
49
45
|
return "#{schema}://#{hostname}:#{port.to_i}#{prefix}"
|
46
|
+
else
|
47
|
+
if ENV['KUBERNETES_SERVICE_HOST']
|
48
|
+
hostname = "#{scope}__USER__#{microservice_name}" unless hostname
|
49
|
+
hostname = hostname.downcase.gsub("__", "-").gsub("_", "-")
|
50
|
+
return "#{schema}://#{hostname}-service:#{port.to_i}#{prefix}"
|
51
|
+
else
|
52
|
+
hostname = 'openc3-operator' unless hostname
|
53
|
+
return "#{schema}://#{hostname}:#{port.to_i}#{prefix}"
|
54
|
+
end
|
50
55
|
end
|
51
56
|
end
|
52
57
|
|
data/lib/openc3/io/json_rpc.rb
CHANGED
@@ -214,7 +214,7 @@ module OpenC3
|
|
214
214
|
|
215
215
|
# Represents a JSON Remote Procedure Call Request
|
216
216
|
class JsonRpcRequest < JsonRpc
|
217
|
-
DANGEROUS_METHODS = ['__send__', 'send', 'instance_eval', 'instance_exec']
|
217
|
+
DANGEROUS_METHODS = Set['__send__', 'send', 'instance_eval', 'instance_exec']
|
218
218
|
|
219
219
|
# @param method_name [String] The name of the method to call
|
220
220
|
# @param method_params [Array<String>] Array of strings which represent the
|