cosmos 4.0.3-java → 4.1.0-java
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.
- checksums.yaml +4 -4
- data/.travis.yml +5 -5
- data/Manifest.txt +11 -1
- data/README.md +3 -2
- data/Rakefile +18 -4
- data/appveyor.yml +19 -0
- data/cosmos.gemspec +12 -3
- data/data/config/cmd_tlm_server.yaml +3 -0
- data/data/crc.txt +63 -60
- data/demo/config/targets/INST/cmd_tlm_server.txt +1 -0
- data/demo/config/targets/INST/cmd_tlm_server2.txt +7 -0
- data/demo/config/tools/cmd_sequence/cmd_sequence.txt +2 -0
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +8 -12
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +7 -9
- data/demo/lib/cmd_sequence_exporter.rb +52 -0
- data/demo/lib/example_background_task.rb +1 -0
- data/demo/procedures/replay_test.rb +32 -0
- data/ext/cosmos/ext/structure/structure.c +39 -3
- data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +1 -0
- data/install/config/tools/launcher/launcher.txt +2 -0
- data/lib/cosmos/config/config_parser.rb +2 -0
- data/lib/cosmos/core_ext/io.rb +89 -60
- data/lib/cosmos/gui/qt.rb +5 -8
- data/lib/cosmos/gui/qt_tool.rb +8 -8
- data/lib/cosmos/gui/text/ruby_editor.rb +12 -12
- data/lib/cosmos/gui/utilities/script_module_gui.rb +9 -9
- data/lib/cosmos/gui/widgets/realtime_button_bar.rb +18 -17
- data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +2 -2
- data/lib/cosmos/interfaces/protocols/template_protocol.rb +3 -0
- data/lib/cosmos/interfaces/udp_interface.rb +27 -14
- data/lib/cosmos/io/buffered_file.rb +0 -1
- data/lib/cosmos/io/json_drb.rb +134 -214
- data/lib/cosmos/io/json_drb_object.rb +22 -61
- data/lib/cosmos/io/json_drb_rack.rb +79 -0
- data/lib/cosmos/io/json_rpc.rb +27 -0
- data/lib/cosmos/io/udp_sockets.rb +102 -58
- data/lib/cosmos/packets/commands.rb +1 -1
- data/lib/cosmos/packets/structure.rb +1 -1
- data/lib/cosmos/packets/structure_item.rb +37 -5
- data/lib/cosmos/script/cmd_tlm_server.rb +76 -2
- data/lib/cosmos/script/replay.rb +60 -0
- data/lib/cosmos/script/script.rb +20 -2
- data/lib/cosmos/script/scripting.rb +9 -9
- data/lib/cosmos/script/tools.rb +14 -0
- data/lib/cosmos/system/system.rb +185 -92
- data/lib/cosmos/system/target.rb +1 -1
- data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +44 -4
- data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +4 -0
- data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +7 -0
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +347 -20
- data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +3 -0
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +329 -111
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +13 -0
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +261 -95
- data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +46 -35
- data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +18 -8
- data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +39 -28
- data/lib/cosmos/tools/cmd_tlm_server/gui/replay_tab.rb +242 -0
- data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +24 -8
- data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +18 -6
- data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +5 -4
- data/lib/cosmos/tools/cmd_tlm_server/replay_backend.rb +375 -0
- data/lib/cosmos/tools/cmd_tlm_server/routers.rb +10 -2
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +40 -5
- data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +18 -20
- data/lib/cosmos/tools/launcher/launcher_config.rb +5 -16
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +65 -39
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +19 -0
- data/lib/cosmos/tools/replay/replay.rb +5 -505
- data/lib/cosmos/tools/script_runner/script_audit.rb +1 -0
- data/lib/cosmos/tools/script_runner/script_runner.rb +3 -4
- data/lib/cosmos/tools/script_runner/script_runner_config.rb +3 -4
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +44 -23
- data/lib/cosmos/tools/test_runner/results_writer.rb +4 -0
- data/lib/cosmos/tools/test_runner/test_runner.rb +0 -3
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +6 -2
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +26 -1
- data/lib/cosmos/tools/tlm_viewer/screen.rb +24 -1
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +25 -0
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +24 -14
- data/lib/cosmos/top_level.rb +34 -24
- data/lib/cosmos/utilities/csv.rb +60 -8
- data/lib/cosmos/version.rb +5 -5
- data/spec/config/config_parser_spec.rb +10 -1
- data/spec/core_ext/socket_spec.rb +4 -2
- data/spec/gui/utilities/script_module_gui_spec.rb +102 -0
- data/spec/install/config/data/data.txt +1 -0
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +2 -0
- data/spec/interfaces/cmd_tlm_server_interface_spec.rb +1 -2
- data/spec/interfaces/protocols/template_protocol_spec.rb +72 -2
- data/spec/interfaces/serial_interface_spec.rb +1 -1
- data/spec/interfaces/udp_interface_spec.rb +14 -0
- data/spec/io/buffered_file_spec.rb +37 -0
- data/spec/io/json_drb_object_spec.rb +2 -15
- data/spec/io/json_drb_spec.rb +61 -121
- data/spec/io/udp_sockets_spec.rb +42 -2
- data/spec/packet_logs/packet_log_reader_spec.rb +5 -2
- data/spec/packets/binary_accessor_spec.rb +1 -1
- data/spec/packets/packet_item_spec.rb +1 -1
- data/spec/packets/structure_item_spec.rb +5 -6
- data/spec/script/cmd_tlm_server_spec.rb +39 -4
- data/spec/script/commands_disconnect_spec.rb +1 -1
- data/spec/script/commands_spec.rb +2 -1
- data/spec/script/scripting_spec.rb +18 -3
- data/spec/script/telemetry_spec.rb +5 -0
- data/spec/spec_helper.rb +43 -26
- data/spec/streams/tcpip_socket_stream_spec.rb +2 -2
- data/spec/system/system_spec.rb +11 -9
- data/spec/system/target_spec.rb +3 -0
- data/spec/tools/cmd_tlm_server/api_spec.rb +543 -29
- data/spec/tools/cmd_tlm_server/background_task_spec.rb +2 -2
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +31 -75
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +199 -66
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +85 -9
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +29 -127
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +10 -50
- data/spec/tools/launcher/launcher_config_spec.rb +1 -1
- data/spec/tools/table_manager/table_item_spec.rb +1 -1
- data/spec/tools/table_manager/tablemanager_core_spec.rb +4 -4
- data/spec/top_level/top_level_spec.rb +151 -3
- data/spec/utilities/csv_spec.rb +24 -5
- metadata +61 -9
- data/lib/cosmos/tools/replay/replay_server.rb +0 -91
|
@@ -11,18 +11,11 @@ TITLE 'COSMOS Command and Telemetry Server - Demo Configuration'
|
|
|
11
11
|
PACKET_LOG_WRITER DEFAULT packet_log_writer.rb nil true nil 2000000000 nil false
|
|
12
12
|
# PACKET_LOG_WRITER SYSTEMLOG packet_log_writer.rb system
|
|
13
13
|
|
|
14
|
-
#
|
|
15
|
-
|
|
16
|
-
INTERFACE_TARGET
|
|
17
|
-
|
|
18
|
-
INTERFACE INST2_INT simulated_target_interface.rb sim_inst.rb
|
|
19
|
-
TARGET INST2
|
|
20
|
-
DONT_LOG
|
|
21
|
-
|
|
22
|
-
INTERFACE_TARGET EXAMPLE cmd_tlm_server.txt # Use cmd_tlm_server.txt in target package
|
|
23
|
-
|
|
24
|
-
INTERFACE_TARGET TEMPLATED cmd_tlm_server.txt # Use cmd_tlm_server.txt in target package
|
|
14
|
+
# Explicitly declare these interfaces since we're using name substitution
|
|
15
|
+
INTERFACE_TARGET INST cmd_tlm_server.txt # Use cmd_tlm_server.txt in targets/INST
|
|
16
|
+
INTERFACE_TARGET INST2 cmd_tlm_server2.txt # Use cmd_tlm_server2.txt in targets/INST
|
|
25
17
|
|
|
18
|
+
# Here is an example of declaring the interface directly
|
|
26
19
|
INTERFACE SYSTEM_INT cmd_tlm_server_interface.rb
|
|
27
20
|
TARGET SYSTEM
|
|
28
21
|
DISABLE_DISCONNECT
|
|
@@ -33,6 +26,9 @@ INTERFACE SYSTEM_INT cmd_tlm_server_interface.rb
|
|
|
33
26
|
# RECONNECT_DELAY 15.0
|
|
34
27
|
# LOG_RAW
|
|
35
28
|
|
|
29
|
+
# Auto interface the rest of the targets by using their cmd_tlm_server.txt file
|
|
30
|
+
AUTO_INTERFACE_TARGETS
|
|
31
|
+
|
|
36
32
|
ROUTER INST_ROUTER tcpip_server_interface.rb 2055 2055 10.0 nil LENGTH 32 16 7
|
|
37
33
|
OPTION LISTEN_ADDRESS 127.0.0.1
|
|
38
34
|
ROUTE INST_INT
|
|
@@ -46,4 +42,4 @@ BACKGROUND_TASK example_background_task.rb
|
|
|
46
42
|
STOPPED
|
|
47
43
|
BACKGROUND_TASK limits_groups.rb 5 # Initial delay to allow interfaces to connect
|
|
48
44
|
|
|
49
|
-
COLLECT_METADATA
|
|
45
|
+
#COLLECT_METADATA
|
|
@@ -11,16 +11,11 @@ TITLE 'COSMOS Command and Telemetry Server - Demo Configuration 2'
|
|
|
11
11
|
PACKET_LOG_WRITER DEFAULT packet_log_writer.rb nil true nil 2000000000 nil false
|
|
12
12
|
# PACKET_LOG_WRITER SYSTEMLOG packet_log_writer.rb system
|
|
13
13
|
|
|
14
|
-
#
|
|
15
|
-
|
|
16
|
-
INTERFACE_TARGET
|
|
17
|
-
|
|
18
|
-
INTERFACE INST2_INT simulated_target_interface.rb sim_inst.rb
|
|
19
|
-
TARGET INST2
|
|
20
|
-
DONT_LOG
|
|
21
|
-
|
|
22
|
-
INTERFACE_TARGET EXAMPLE cmd_tlm_server.txt # Use cmd_tlm_server.txt in target package
|
|
14
|
+
# Explicitly declare these interfaces since we're using name substitution
|
|
15
|
+
INTERFACE_TARGET INST cmd_tlm_server.txt # Use cmd_tlm_server.txt in targets/INST
|
|
16
|
+
INTERFACE_TARGET INST2 cmd_tlm_server2.txt # Use cmd_tlm_server2.txt in targets/INST
|
|
23
17
|
|
|
18
|
+
# Here is an example of declaring the interface directly
|
|
24
19
|
INTERFACE SYSTEM_INT cmd_tlm_server_interface.rb
|
|
25
20
|
TARGET SYSTEM
|
|
26
21
|
DISABLE_DISCONNECT
|
|
@@ -31,6 +26,9 @@ INTERFACE SYSTEM_INT cmd_tlm_server_interface.rb
|
|
|
31
26
|
# RECONNECT_DELAY 15.0
|
|
32
27
|
# LOG_RAW
|
|
33
28
|
|
|
29
|
+
# Auto interface the rest of the targets by using their cmd_tlm_server.txt file
|
|
30
|
+
AUTO_INTERFACE_TARGETS
|
|
31
|
+
|
|
34
32
|
ROUTER INST_ROUTER tcpip_server_interface.rb 3055 3055 10.0 nil LENGTH 32 16 7
|
|
35
33
|
ROUTE INST_INT
|
|
36
34
|
# DONT_CONNECT
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
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 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
|
+
require 'cosmos'
|
|
12
|
+
require 'cosmos/ccsds/ccsds_packet'
|
|
13
|
+
|
|
14
|
+
module Cosmos
|
|
15
|
+
class CmdSequenceExporter
|
|
16
|
+
def initialize(parent)
|
|
17
|
+
@parent = parent
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def export(filename, sequence_dir, sequence_list)
|
|
21
|
+
basename = File.basename(filename, ".*")
|
|
22
|
+
filename = Qt::FileDialog::getSaveFileName(@parent, # parent
|
|
23
|
+
'Export', # caption
|
|
24
|
+
sequence_dir + "/#{basename}.bin", # dir
|
|
25
|
+
'Sequence Binary (*.bin)') # filter
|
|
26
|
+
return if filename.nil? || filename.empty?
|
|
27
|
+
|
|
28
|
+
data = ''
|
|
29
|
+
sequence_list.each do |item|
|
|
30
|
+
begin
|
|
31
|
+
time = Time.parse(item.time)
|
|
32
|
+
day, ms, us = Time.mdy2ccsds(time.year, time.month, time.day, time.hour, time.min, time.sec, time.usec)
|
|
33
|
+
data << [day].pack("N") # UINT32
|
|
34
|
+
data << [ms].pack("N") # UINT32
|
|
35
|
+
rescue
|
|
36
|
+
time = item.time.to_f * 1000
|
|
37
|
+
data << [0].pack("N") # UINT32
|
|
38
|
+
data << [time].pack("N") # UINT32
|
|
39
|
+
end
|
|
40
|
+
data << item.command.buffer
|
|
41
|
+
end
|
|
42
|
+
ccsds = CcsdsPacket.new
|
|
43
|
+
ccsds.write("CCSDSTYPE", CcsdsPacket::COMMAND)
|
|
44
|
+
ccsds.write('CCSDSSHF', 0)
|
|
45
|
+
ccsds.write("CCSDSAPID", 505)
|
|
46
|
+
ccsds.write("CCSDSSEQFLAGS", CcsdsPacket::STANDALONE)
|
|
47
|
+
ccsds.write("CCSDSDATA", data)
|
|
48
|
+
ccsds.write("CCSDSLENGTH", data.length - 1)
|
|
49
|
+
File.open(filename, 'wb') { |file| file.write ccsds.buffer }
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
set_line_delay(0)
|
|
2
|
+
set_replay_mode(true)
|
|
3
|
+
filenames = get_output_logs_filenames()
|
|
4
|
+
replay_select_file(filenames[-1])
|
|
5
|
+
status = 'Analyzing'
|
|
6
|
+
while status =~ /Analyzing/
|
|
7
|
+
status, playback_delay, filename, file_start, file_current, file_end, file_index, file_max_index = replay_status
|
|
8
|
+
wait(1)
|
|
9
|
+
end
|
|
10
|
+
100.times do
|
|
11
|
+
replay_step_forward()
|
|
12
|
+
end
|
|
13
|
+
100.times do
|
|
14
|
+
replay_step_back()
|
|
15
|
+
end
|
|
16
|
+
replay_move_end()
|
|
17
|
+
replay_move_index(file_max_index / 2)
|
|
18
|
+
replay_move_start()
|
|
19
|
+
replay_set_playback_delay(0.1)
|
|
20
|
+
replay_play()
|
|
21
|
+
wait(2)
|
|
22
|
+
replay_set_playback_delay(0.125)
|
|
23
|
+
wait(5)
|
|
24
|
+
replay_set_playback_delay(nil)
|
|
25
|
+
wait(2)
|
|
26
|
+
replay_set_playback_delay(0.0)
|
|
27
|
+
wait(4)
|
|
28
|
+
replay_stop()
|
|
29
|
+
replay_reverse_play()
|
|
30
|
+
wait(5)
|
|
31
|
+
cmd_tlm_clear_counters()
|
|
32
|
+
cmd_tlm_reload()
|
|
@@ -64,6 +64,7 @@ static ID id_ivar_neg_bit_size = 0;
|
|
|
64
64
|
static ID id_ivar_fixed_size = 0;
|
|
65
65
|
static ID id_ivar_short_buffer_allowed = 0;
|
|
66
66
|
static ID id_ivar_mutex = 0;
|
|
67
|
+
static ID id_ivar_create_index = 0;
|
|
67
68
|
|
|
68
69
|
static ID id_const_ASCII_8BIT_STRING = 0;
|
|
69
70
|
static ID id_const_ZERO_STRING = 0;
|
|
@@ -1189,6 +1190,16 @@ static VALUE structure_item_spaceship(VALUE self, VALUE other_item) {
|
|
|
1189
1190
|
int other_bit_offset = FIX2INT(rb_ivar_get(other_item, id_ivar_bit_offset));
|
|
1190
1191
|
int bit_size = 0;
|
|
1191
1192
|
int other_bit_size = 0;
|
|
1193
|
+
int create_index = 0;
|
|
1194
|
+
int other_create_index = 0;
|
|
1195
|
+
int have_create_index = 0;
|
|
1196
|
+
volatile VALUE v_create_index = rb_ivar_get(self, id_ivar_create_index);
|
|
1197
|
+
volatile VALUE v_other_create_index = rb_ivar_get(other_item, id_ivar_create_index);
|
|
1198
|
+
if (RTEST(v_create_index) && RTEST(v_other_create_index)) {
|
|
1199
|
+
create_index = FIX2INT(v_create_index);
|
|
1200
|
+
other_create_index = FIX2INT(v_other_create_index);
|
|
1201
|
+
have_create_index = 1;
|
|
1202
|
+
}
|
|
1192
1203
|
|
|
1193
1204
|
/* Handle same bit offset case */
|
|
1194
1205
|
if ((bit_offset == 0) && (other_bit_offset == 0)) {
|
|
@@ -1198,7 +1209,15 @@ static VALUE structure_item_spaceship(VALUE self, VALUE other_item) {
|
|
|
1198
1209
|
bit_size = FIX2INT(rb_ivar_get(self, id_ivar_bit_size));
|
|
1199
1210
|
other_bit_size = FIX2INT(rb_ivar_get(other_item, id_ivar_bit_size));
|
|
1200
1211
|
if (bit_size == other_bit_size) {
|
|
1201
|
-
|
|
1212
|
+
if (have_create_index) {
|
|
1213
|
+
if (create_index <= other_create_index) {
|
|
1214
|
+
return INT2FIX(-1);
|
|
1215
|
+
} else {
|
|
1216
|
+
return INT2FIX(1);
|
|
1217
|
+
}
|
|
1218
|
+
} else {
|
|
1219
|
+
return INT2FIX(0);
|
|
1220
|
+
}
|
|
1202
1221
|
} if (bit_size < other_bit_size) {
|
|
1203
1222
|
return INT2FIX(-1);
|
|
1204
1223
|
} else {
|
|
@@ -1210,7 +1229,15 @@ static VALUE structure_item_spaceship(VALUE self, VALUE other_item) {
|
|
|
1210
1229
|
if (((bit_offset >= 0) && (other_bit_offset >= 0)) || ((bit_offset < 0) && (other_bit_offset < 0))) {
|
|
1211
1230
|
/* Both Have Same Sign */
|
|
1212
1231
|
if (bit_offset == other_bit_offset) {
|
|
1213
|
-
|
|
1232
|
+
if (have_create_index) {
|
|
1233
|
+
if (create_index <= other_create_index) {
|
|
1234
|
+
return INT2FIX(-1);
|
|
1235
|
+
} else {
|
|
1236
|
+
return INT2FIX(1);
|
|
1237
|
+
}
|
|
1238
|
+
} else {
|
|
1239
|
+
return INT2FIX(0);
|
|
1240
|
+
}
|
|
1214
1241
|
} else if (bit_offset < other_bit_offset) {
|
|
1215
1242
|
return INT2FIX(-1);
|
|
1216
1243
|
} else {
|
|
@@ -1219,7 +1246,15 @@ static VALUE structure_item_spaceship(VALUE self, VALUE other_item) {
|
|
|
1219
1246
|
} else {
|
|
1220
1247
|
/* Different Signs */
|
|
1221
1248
|
if (bit_offset == other_bit_offset) {
|
|
1222
|
-
|
|
1249
|
+
if (have_create_index) {
|
|
1250
|
+
if (create_index <= other_create_index) {
|
|
1251
|
+
return INT2FIX(-1);
|
|
1252
|
+
} else {
|
|
1253
|
+
return INT2FIX(1);
|
|
1254
|
+
}
|
|
1255
|
+
} else {
|
|
1256
|
+
return INT2FIX(0);
|
|
1257
|
+
}
|
|
1223
1258
|
} else if (bit_offset < other_bit_offset) {
|
|
1224
1259
|
return INT2FIX(1);
|
|
1225
1260
|
} else {
|
|
@@ -1387,6 +1422,7 @@ void Init_structure (void)
|
|
|
1387
1422
|
id_ivar_fixed_size = rb_intern("@fixed_size");
|
|
1388
1423
|
id_ivar_short_buffer_allowed = rb_intern("@short_buffer_allowed");
|
|
1389
1424
|
id_ivar_mutex = rb_intern("@mutex");
|
|
1425
|
+
id_ivar_create_index = rb_intern("@create_index");
|
|
1390
1426
|
|
|
1391
1427
|
symbol_LITTLE_ENDIAN = ID2SYM(rb_intern("LITTLE_ENDIAN"));
|
|
1392
1428
|
symbol_BIG_ENDIAN = ID2SYM(rb_intern("BIG_ENDIAN"));
|
|
@@ -20,6 +20,7 @@ DIVIDER
|
|
|
20
20
|
LABEL "Commanding and Scripting"
|
|
21
21
|
|
|
22
22
|
TOOL "Command Sender" "LAUNCH CmdSender" "cmd_sender.png"
|
|
23
|
+
TOOL "Command Sequence" "LAUNCH CmdSequence" "cmd_sequence.png"
|
|
23
24
|
TOOL "Script Runner" "LAUNCH ScriptRunner" "script_runner.png"
|
|
24
25
|
TOOL "Test Runner" "LAUNCH TestRunner" "test_runner.png"
|
|
25
26
|
|
|
@@ -34,6 +35,7 @@ TOOL "Data Viewer" "LAUNCH DataViewer" "data_viewer.png"
|
|
|
34
35
|
DIVIDER
|
|
35
36
|
LABEL Utilities
|
|
36
37
|
|
|
38
|
+
TOOL "Config Editor" "LAUNCH ConfigEditor" "config_editor.png"
|
|
37
39
|
TOOL "Telemetry Extractor" "LAUNCH TlmExtractor" "tlm_extractor.png"
|
|
38
40
|
TOOL "Command Extractor" "LAUNCH CmdExtractor" "cmd_extractor.png"
|
|
39
41
|
TOOL "Handbook Creator" "LAUNCH HandbookCreator" "handbook_creator.png"
|
|
@@ -146,6 +146,7 @@ module Cosmos
|
|
|
146
146
|
|
|
147
147
|
# Called by the ERB template to render a partial
|
|
148
148
|
def render(template_name, options = {})
|
|
149
|
+
raise Error.new(self, "Partial name '#{template_name}' must begin with an underscore.") if template_name[0] != '_'
|
|
149
150
|
b = binding
|
|
150
151
|
if options[:locals]
|
|
151
152
|
if RUBY_VERSION.split('.')[0..1].join.to_i >= 21
|
|
@@ -178,6 +179,7 @@ module Cosmos
|
|
|
178
179
|
yield_non_keyword_lines = false,
|
|
179
180
|
remove_quotes = true,
|
|
180
181
|
&block)
|
|
182
|
+
raise "Configuration file #{filename} does not exist." unless filename && File.exist?(filename)
|
|
181
183
|
@filename = filename
|
|
182
184
|
|
|
183
185
|
# Create a temp file where we write the ERB parsed output
|
data/lib/cosmos/core_ext/io.rb
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
# as published by the Free Software Foundation; version 3 with
|
|
9
9
|
# attribution addendums as found in the LICENSE.txt
|
|
10
10
|
|
|
11
|
+
require 'cosmos/core_ext/kernel'
|
|
11
12
|
require 'cosmos/core_ext/cosmos_io'
|
|
12
13
|
|
|
13
14
|
class IO
|
|
@@ -20,74 +21,102 @@ class IO
|
|
|
20
21
|
# remaining timeout is left.
|
|
21
22
|
SELECT_MAX_TIMEOUT = 0.016
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
# the full timeout, it calls IO.select with a small timeout and then
|
|
25
|
-
# doubles the timeout twice until eventually it calls IO.select with the
|
|
26
|
-
# remaining passed in timeout value.
|
|
27
|
-
# TODO: Ryan why was this originally done?
|
|
28
|
-
#
|
|
29
|
-
# @param read_sockets [Array<IO>] IO objects to wait to be ready to read
|
|
30
|
-
# @param write_sockets [Array<IO>] IO objects to wait to be ready to write
|
|
31
|
-
# @param error_array [Array<IO>] IO objects to wait for exceptions
|
|
32
|
-
# @param timeout [Numeric] Number of seconds to wait
|
|
33
|
-
def self.fast_select(read_sockets = nil, write_sockets = nil, error_array = nil, timeout = nil)
|
|
34
|
-
# Always try a zero timeout first
|
|
35
|
-
current_timeout = SELECT_BASE_TIMEOUT
|
|
36
|
-
total_timeout = 0.0
|
|
24
|
+
class << self
|
|
37
25
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return result if result or current_timeout.nil?
|
|
41
|
-
return nil if timeout and total_timeout >= timeout
|
|
26
|
+
# Alias the original IO.select method
|
|
27
|
+
alias_method :__select__, :select
|
|
42
28
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
29
|
+
# On Windows the IO.select function (when called with no timeout) takes
|
|
30
|
+
# a minimum of 10 msec to return, even if one of the IO objects is
|
|
31
|
+
# ready to read/write sooner than that.
|
|
32
|
+
#
|
|
33
|
+
# This method is identical to IO.select but instead of calling IO.select with
|
|
34
|
+
# the full timeout, it calls IO.select with a small timeout and then
|
|
35
|
+
# doubles the timeout twice until eventually it calls IO.select with the
|
|
36
|
+
# remaining passed in timeout value.
|
|
37
|
+
#
|
|
38
|
+
# @param read_sockets [Array<IO>] IO objects to wait to be ready to read
|
|
39
|
+
# @param write_sockets [Array<IO>] IO objects to wait to be ready to write
|
|
40
|
+
# @param error_array [Array<IO>] IO objects to wait for exceptions
|
|
41
|
+
# @param timeout [Numeric] Number of seconds to wait
|
|
42
|
+
def fast_select(read_sockets = nil, write_sockets = nil, error_array = nil, timeout = nil)
|
|
43
|
+
# Always try a zero timeout first
|
|
44
|
+
current_timeout = SELECT_BASE_TIMEOUT
|
|
45
|
+
total_timeout = 0.0
|
|
46
|
+
|
|
47
|
+
while true
|
|
48
|
+
result = IO.__select__(read_sockets, write_sockets, error_array, current_timeout)
|
|
49
|
+
return result if result or current_timeout.nil?
|
|
50
|
+
return nil if timeout and total_timeout >= timeout
|
|
51
|
+
|
|
52
|
+
if current_timeout <= 0.0001
|
|
53
|
+
# Always try the base timeout next
|
|
54
|
+
current_timeout = SELECT_BASE_TIMEOUT
|
|
55
|
+
total_timeout = SELECT_BASE_TIMEOUT
|
|
61
56
|
else
|
|
62
|
-
#
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
57
|
+
# Then start doubling the timeout
|
|
58
|
+
current_timeout = current_timeout * 2
|
|
59
|
+
|
|
60
|
+
# Until it is bigger than our max timeout
|
|
61
|
+
if current_timeout >= SELECT_MAX_TIMEOUT
|
|
62
|
+
if timeout
|
|
63
|
+
# Block for the remaining requested timeout
|
|
64
|
+
current_timeout = timeout - total_timeout
|
|
65
|
+
total_timeout = timeout
|
|
66
|
+
else
|
|
67
|
+
# Or block forever
|
|
68
|
+
current_timeout = nil
|
|
69
|
+
end
|
|
67
70
|
else
|
|
68
|
-
#
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
# Or it is bigger than the given timeout
|
|
72
|
+
if timeout and current_timeout >= timeout
|
|
73
|
+
# Block for the remaining requested timeout
|
|
74
|
+
current_timeout = timeout - total_timeout
|
|
75
|
+
total_timeout = timeout
|
|
76
|
+
else
|
|
77
|
+
# Up our total time in select
|
|
78
|
+
total_timeout += current_timeout
|
|
79
|
+
end
|
|
80
|
+
if timeout and total_timeout > timeout
|
|
81
|
+
# Block for the remaining requested timeout
|
|
82
|
+
current_timeout = timeout - total_timeout
|
|
83
|
+
total_timeout = timeout
|
|
84
|
+
end
|
|
75
85
|
end
|
|
86
|
+
return nil if current_timeout and current_timeout < 0
|
|
76
87
|
end
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
end # while true
|
|
80
|
-
end # fast_select
|
|
88
|
+
end # while true
|
|
89
|
+
end # fast_select
|
|
81
90
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
91
|
+
# For non-windows systems, leave IO.select alone, but for windows
|
|
92
|
+
# monkey-patch IO.select to use our fast-select implementation.
|
|
93
|
+
if Kernel.is_windows?
|
|
94
|
+
def select(read_sockets = nil, write_sockets = nil, error_array = nil, timeout = nil)
|
|
95
|
+
return fast_select(read_sockets, write_sockets, error_array, timeout)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# @param read_sockets [Array<IO>] IO objects to wait to be ready to read
|
|
100
|
+
# @param timeout [Numeric] Number of seconds to wait
|
|
101
|
+
def fast_read_select(read_sockets, timeout)
|
|
102
|
+
return fast_select(read_sockets, nil, nil, timeout)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# @param write_sockets [Array<IO>] IO objects to wait to be ready to write
|
|
106
|
+
# @param timeout [Numeric] Number of seconds to wait
|
|
107
|
+
def fast_write_select(write_sockets, timeout)
|
|
108
|
+
return fast_select(nil, write_sockets, nil, timeout)
|
|
109
|
+
end
|
|
86
110
|
end
|
|
87
111
|
|
|
88
|
-
#
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
112
|
+
# Alias the original close method
|
|
113
|
+
alias_method :__close__, :close
|
|
114
|
+
|
|
115
|
+
# Patch the close method so that it won't raise any exceptions
|
|
116
|
+
def close
|
|
117
|
+
begin
|
|
118
|
+
__close__
|
|
119
|
+
rescue
|
|
120
|
+
end
|
|
92
121
|
end
|
|
93
122
|
end
|