cosmos 4.2.4-java → 4.3.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 +1 -1
- data/Gemfile +1 -1
- data/Manifest.txt +12 -0
- data/autohotkey/tools/cmd_sequence.ahk +21 -20
- data/autohotkey/tools/cmd_sequence2.ahk +1 -1
- data/autohotkey/tools/config_editor.ahk +1 -1
- data/autohotkey/tools/launcher.ahk +1 -0
- data/autohotkey/tools/packet_viewer.ahk +6 -5
- data/autohotkey/tools/test_runner.ahk +8 -8
- data/bin/cosmos +37 -0
- data/bin/dart_util +0 -0
- data/data/config/item_modifiers.yaml +9 -0
- data/data/crc.txt +91 -86
- data/demo/Rakefile +2 -0
- data/demo/config/dart/Gemfile +1 -1
- data/demo/config/data/crc.txt +8 -5
- data/demo/config/system/system.txt +28 -0
- data/demo/config/system/system2.txt +21 -3
- data/demo/config/system/system_alt_ports.txt +69 -0
- data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +1 -0
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server_chain.txt +18 -0
- data/demo/procedures/cosmos_api_test.rb +18 -14
- data/demo/procedures/local_screen_example.rb +51 -0
- data/ext/cosmos/ext/cosmos_io/cosmos_io.c +32 -4
- data/ext/cosmos/ext/packet/packet.c +6 -0
- data/ext/mkrf_conf.rb +2 -2
- data/install/config/dart/Gemfile +1 -1
- data/install/config/data/crc.txt +2 -2
- data/install/config/system/system.txt +23 -1
- data/lib/cosmos/conversions.rb +2 -0
- data/lib/cosmos/conversions/packet_time_formatted_conversion.rb +38 -0
- data/lib/cosmos/conversions/packet_time_seconds_conversion.rb +38 -0
- data/lib/cosmos/core_ext/cosmos_io.rb +2 -1
- data/lib/cosmos/dart/Gemfile +1 -1
- data/lib/cosmos/dart/examples/dart_stream_client.rb +6 -2
- data/lib/cosmos/dart/lib/dart_common.rb +1 -1
- data/lib/cosmos/dart/lib/dart_database_cleaner.rb +2 -2
- data/lib/cosmos/dart/lib/dart_decommutator.rb +4 -4
- data/lib/cosmos/dart/lib/dart_importer.rb +3 -3
- data/lib/cosmos/dart/lib/dart_packet_log_writer.rb +2 -2
- data/lib/cosmos/dart/processes/dart_ingester.rb +2 -0
- data/lib/cosmos/dart/processes/dart_util.rb +4 -4
- data/lib/cosmos/dart/spec/dart/dart_reducer_manager_spec.rb +3 -3
- data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +9 -5
- data/lib/cosmos/gui/dialogs/details_dialog.rb +29 -29
- data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +3 -3
- data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +2 -2
- data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +1 -1
- data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +10 -10
- data/lib/cosmos/gui/qt.rb +10 -1
- data/lib/cosmos/gui/qt_tool.rb +17 -10
- data/lib/cosmos/gui/text/ruby_editor.rb +47 -8
- data/lib/cosmos/gui/utilities/classification_banner.rb +60 -0
- data/lib/cosmos/gui/utilities/script_module_gui.rb +26 -0
- data/lib/cosmos/interfaces.rb +1 -0
- data/lib/cosmos/interfaces/interface.rb +4 -0
- data/lib/cosmos/interfaces/protocols/ignore_packet_protocol.rb +46 -0
- data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +68 -23
- data/lib/cosmos/packet_logs/packet_log_reader.rb +69 -26
- data/lib/cosmos/packet_logs/packet_log_writer.rb +13 -1
- data/lib/cosmos/packets/commands.rb +5 -1
- data/lib/cosmos/packets/packet.rb +36 -2
- data/lib/cosmos/packets/packet_config.rb +0 -1
- data/lib/cosmos/packets/parsers/format_string_parser.rb +0 -1
- data/lib/cosmos/packets/parsers/xtce_parser.rb +1 -1
- data/lib/cosmos/packets/telemetry.rb +4 -0
- data/lib/cosmos/script/api_shared.rb +2 -0
- data/lib/cosmos/script/limits.rb +4 -0
- data/lib/cosmos/script/script.rb +27 -11
- data/lib/cosmos/script/telemetry.rb +3 -1
- data/lib/cosmos/script/tools.rb +18 -8
- data/lib/cosmos/system/system.rb +21 -0
- data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +26 -24
- data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +29 -29
- data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +65 -40
- data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +6 -6
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +13 -0
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +12 -9
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +7 -1
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +8 -8
- data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +13 -2
- data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +2 -2
- data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +13 -13
- data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +4 -4
- data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +8 -8
- data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +5 -5
- data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +35 -20
- data/lib/cosmos/tools/cmd_tlm_server/replay_backend.rb +15 -11
- data/lib/cosmos/tools/config_editor/config_editor.rb +69 -69
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +42 -38
- data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +1 -0
- data/lib/cosmos/tools/data_viewer/dump_component.rb +1 -0
- data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +4 -4
- data/lib/cosmos/tools/launcher/launcher.rb +1 -1
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +28 -24
- data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +42 -42
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +56 -53
- data/lib/cosmos/tools/script_runner/script_runner.rb +112 -95
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +48 -30
- data/lib/cosmos/tools/table_manager/table_manager.rb +42 -42
- data/lib/cosmos/tools/test_runner/test_runner.rb +45 -27
- data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +3 -3
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +45 -45
- data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +4 -4
- data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +3 -3
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +7 -7
- data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +10 -10
- data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +10 -3
- data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +6 -6
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +14 -14
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +83 -83
- data/lib/cosmos/tools/tlm_viewer/screen.rb +73 -13
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +15 -15
- data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasellipse_widget.rb +40 -0
- data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +1 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +6 -1
- data/lib/cosmos/top_level.rb +14 -1
- data/lib/cosmos/version.rb +5 -5
- data/lib/cosmos/win32/excel.rb +63 -12
- data/make_gems.sh +10 -0
- data/spec/conversions/packet_time_formatted_conversion_spec.rb +58 -0
- data/spec/conversions/packet_time_seconds_conversion_spec.rb +60 -0
- data/spec/interfaces/protocols/ignore_packet_protocol_spec.rb +243 -0
- data/spec/interfaces/protocols/preidentified_protocol_spec.rb +227 -4
- data/spec/io/serial_driver_spec.rb +15 -13
- data/spec/packet_logs/packet_log_reader_spec.rb +72 -17
- data/spec/packets/packet_config_spec.rb +5 -16
- data/spec/packets/parsers/format_string_parser_spec.rb +0 -11
- data/spec/packets/parsers/macro_parser_spec.rb +36 -36
- data/spec/packets/parsers/state_parser_spec.rb +36 -0
- data/spec/packets/telemetry_spec.rb +11 -9
- data/spec/script/script_spec.rb +2 -3
- data/spec/script/scripting_spec.rb +2 -1
- data/spec/script/tools_spec.rb +0 -1
- data/spec/tools/cmd_tlm_server/api_spec.rb +28 -20
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +33 -0
- data/spec/tools/cmd_tlm_server/commanding_spec.rb +25 -1
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +15 -0
- data/tasks/gemfile_stats.rake +3 -2
- metadata +14 -2
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2018 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/config/config_parser'
|
|
12
|
+
require 'cosmos/interfaces/protocols/protocol'
|
|
13
|
+
require 'cosmos/utilities/crc'
|
|
14
|
+
require 'thread'
|
|
15
|
+
|
|
16
|
+
module Cosmos
|
|
17
|
+
# Ignore a specific packet by not letting it through the protocol
|
|
18
|
+
class IgnorePacketProtocol < Protocol
|
|
19
|
+
# @param target_name [String] Target name
|
|
20
|
+
# @param packet_name [String] Packet name
|
|
21
|
+
def initialize(target_name, packet_name, allow_empty_data = nil)
|
|
22
|
+
super(allow_empty_data)
|
|
23
|
+
System.telemetry.packet(target_name, packet_name)
|
|
24
|
+
@target_name = target_name
|
|
25
|
+
@packet_name = packet_name
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def read_packet(packet)
|
|
29
|
+
# Need to make sure packet is identified and defined
|
|
30
|
+
target_names = nil
|
|
31
|
+
target_names = @interface.target_names if @interface
|
|
32
|
+
identified_packet = System.telemetry.identify_and_define_packet(packet, target_names)
|
|
33
|
+
if identified_packet
|
|
34
|
+
if identified_packet.target_name == @target_name && identified_packet.packet_name == @packet_name
|
|
35
|
+
return :STOP
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
return super(packet)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def write_packet(packet)
|
|
42
|
+
return :STOP if packet.target_name == @target_name && packet.packet_name == @packet_name
|
|
43
|
+
return super(packet)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
# attribution addendums as found in the LICENSE.txt
|
|
10
10
|
|
|
11
11
|
require 'cosmos/interfaces/protocols/burst_protocol'
|
|
12
|
+
require 'cosmos/packet_logs/packet_log_reader'
|
|
12
13
|
|
|
13
14
|
module Cosmos
|
|
14
15
|
# Delineates packets using the COSMOS preidentification system
|
|
@@ -17,10 +18,11 @@ module Cosmos
|
|
|
17
18
|
# @param sync_pattern (see BurstProtocol#initialize)
|
|
18
19
|
# @param max_length [Integer] The maximum allowed value of the length field
|
|
19
20
|
# @param allow_empty_data [true/false/nil] See Protocol#initialize
|
|
20
|
-
def initialize(sync_pattern = nil, max_length = nil, allow_empty_data = nil)
|
|
21
|
+
def initialize(sync_pattern = nil, max_length = nil, mode = 4, allow_empty_data = nil)
|
|
21
22
|
super(0, sync_pattern, false, allow_empty_data)
|
|
22
23
|
@max_length = ConfigParser.handle_nil(max_length)
|
|
23
24
|
@max_length = Integer(@max_length) if @max_length
|
|
25
|
+
@mode = Integer(mode)
|
|
24
26
|
end
|
|
25
27
|
|
|
26
28
|
def reset
|
|
@@ -29,21 +31,34 @@ module Cosmos
|
|
|
29
31
|
end
|
|
30
32
|
|
|
31
33
|
def read_packet(packet)
|
|
32
|
-
packet.received_time = @
|
|
33
|
-
packet.target_name = @
|
|
34
|
-
packet.packet_name = @
|
|
34
|
+
packet.received_time = @read_received_time
|
|
35
|
+
packet.target_name = @read_target_name
|
|
36
|
+
packet.packet_name = @read_packet_name
|
|
37
|
+
if @mode == 4 # COSMOS4.3+ Protocol
|
|
38
|
+
packet.stored = @read_stored
|
|
39
|
+
packet.extra = @read_extra
|
|
40
|
+
end
|
|
35
41
|
return packet
|
|
36
42
|
end
|
|
37
43
|
|
|
38
44
|
def write_packet(packet)
|
|
39
45
|
received_time = packet.received_time
|
|
40
46
|
received_time = Time.now unless received_time
|
|
41
|
-
@
|
|
42
|
-
@
|
|
43
|
-
@
|
|
44
|
-
@
|
|
45
|
-
@
|
|
46
|
-
@
|
|
47
|
+
@write_time_seconds = [received_time.tv_sec].pack('N') # UINT32
|
|
48
|
+
@write_time_microseconds = [received_time.tv_usec].pack('N') # UINT32
|
|
49
|
+
@write_target_name = packet.target_name
|
|
50
|
+
@write_target_name = 'UNKNOWN' unless @write_target_name
|
|
51
|
+
@write_packet_name = packet.packet_name
|
|
52
|
+
@write_packet_name = 'UNKNOWN' unless @write_packet_name
|
|
53
|
+
if @mode == 4 # COSMOS4.3+ Protocol
|
|
54
|
+
@write_flags = 0
|
|
55
|
+
@write_flags |= PacketLogReader::COSMOS4_STORED_FLAG_MASK if packet.stored
|
|
56
|
+
@write_extra = nil
|
|
57
|
+
if packet.extra
|
|
58
|
+
@write_flags |= PacketLogReader::COSMOS4_EXTRA_FLAG_MASK
|
|
59
|
+
@write_extra = packet.extra.to_json
|
|
60
|
+
end
|
|
61
|
+
end
|
|
47
62
|
return packet
|
|
48
63
|
end
|
|
49
64
|
|
|
@@ -51,12 +66,19 @@ module Cosmos
|
|
|
51
66
|
data_length = [data.length].pack('N') # UINT32
|
|
52
67
|
data_to_send = ''
|
|
53
68
|
data_to_send << @sync_pattern if @sync_pattern
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
69
|
+
if @mode == 4 # COSMOS4.3+ Protocol
|
|
70
|
+
data_to_send << @write_flags
|
|
71
|
+
if @write_extra
|
|
72
|
+
data_to_send << [@write_extra.length].pack('N')
|
|
73
|
+
data_to_send << @write_extra
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
data_to_send << @write_time_seconds
|
|
77
|
+
data_to_send << @write_time_microseconds
|
|
78
|
+
data_to_send << @write_target_name.length
|
|
79
|
+
data_to_send << @write_target_name
|
|
80
|
+
data_to_send << @write_packet_name.length
|
|
81
|
+
data_to_send << @write_packet_name
|
|
60
82
|
data_to_send << data_length
|
|
61
83
|
data_to_send << data
|
|
62
84
|
return data_to_send
|
|
@@ -104,27 +126,50 @@ module Cosmos
|
|
|
104
126
|
@reduction_state = :SYNC_REMOVED
|
|
105
127
|
end
|
|
106
128
|
|
|
107
|
-
|
|
108
|
-
|
|
129
|
+
if @reduction_state == :SYNC_REMOVED and @mode == 4
|
|
130
|
+
# Read and remove flags
|
|
131
|
+
return :STOP if @data.length < 1
|
|
132
|
+
flags = @data[0].unpack('C')[0] # byte
|
|
133
|
+
@data.replace(@data[1..-1])
|
|
134
|
+
@read_stored = false
|
|
135
|
+
@read_stored = true if (flags & PacketLogReader::COSMOS4_STORED_FLAG_MASK) != 0
|
|
136
|
+
@read_extra = nil
|
|
137
|
+
if (flags & PacketLogReader::COSMOS4_EXTRA_FLAG_MASK) != 0
|
|
138
|
+
@reduction_state = :NEED_EXTRA
|
|
139
|
+
else
|
|
140
|
+
@reduction_state = :FLAGS_REMOVED
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
if @reduction_state == :NEED_EXTRA
|
|
145
|
+
# Read and remove extra
|
|
146
|
+
@read_extra = read_length_field_followed_by_string(4)
|
|
147
|
+
return :STOP if @read_extra == :STOP
|
|
148
|
+
@read_extra = JSON.parse(@read_extra)
|
|
149
|
+
@reduction_state = :FLAGS_REMOVED
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
if @reduction_state == :FLAGS_REMOVED or (@reduction_state == :SYNC_REMOVED and @mode != 4)
|
|
153
|
+
# Read and remove packet received time
|
|
109
154
|
return :STOP if @data.length < 8
|
|
110
155
|
time_seconds = @data[0..3].unpack('N')[0] # UINT32
|
|
111
156
|
time_microseconds = @data[4..7].unpack('N')[0] # UINT32
|
|
112
|
-
@
|
|
157
|
+
@read_received_time = Time.at(time_seconds, time_microseconds).sys
|
|
113
158
|
@data.replace(@data[8..-1])
|
|
114
159
|
@reduction_state = :TIME_REMOVED
|
|
115
160
|
end
|
|
116
161
|
|
|
117
162
|
if @reduction_state == :TIME_REMOVED
|
|
118
163
|
# Read and remove the target name
|
|
119
|
-
@
|
|
120
|
-
return :STOP if @
|
|
164
|
+
@read_target_name = read_length_field_followed_by_string(1)
|
|
165
|
+
return :STOP if @read_target_name == :STOP
|
|
121
166
|
@reduction_state = :TARGET_NAME_REMOVED
|
|
122
167
|
end
|
|
123
168
|
|
|
124
169
|
if @reduction_state == :TARGET_NAME_REMOVED
|
|
125
170
|
# Read and remove the packet name
|
|
126
|
-
@
|
|
127
|
-
return :STOP if @
|
|
171
|
+
@read_packet_name = read_length_field_followed_by_string(1)
|
|
172
|
+
return :STOP if @read_packet_name == :STOP
|
|
128
173
|
@reduction_state = :PACKET_NAME_REMOVED
|
|
129
174
|
end
|
|
130
175
|
|
|
@@ -35,6 +35,18 @@ module Cosmos
|
|
|
35
35
|
COSMOS1_LOG_TYPE_RANGE = 6..8
|
|
36
36
|
COSMOS1_CONFIGURATION_NAME_RANGE = 10..41
|
|
37
37
|
|
|
38
|
+
# COSMOS 4.3+ log file header definition
|
|
39
|
+
COSMOS4_MARKER = 'COSMOS4_'
|
|
40
|
+
COSMOS4_HEADER_LENGTH = COSMOS2_HEADER_LENGTH
|
|
41
|
+
COSMOS4_MARKER_RANGE = COSMOS2_MARKER_RANGE
|
|
42
|
+
COSMOS4_LOG_TYPE_RANGE = COSMOS2_LOG_TYPE_RANGE
|
|
43
|
+
COSMOS4_CONFIGURATION_NAME_RANGE = COSMOS2_CONFIGURATION_NAME_RANGE
|
|
44
|
+
COSMOS4_HOSTNAME_RANGE = COSMOS2_HOSTNAME_RANGE
|
|
45
|
+
COSMOS4_STORED_FLAG_MASK = 0x80
|
|
46
|
+
COSMOS4_EXTRA_FLAG_MASK = 0x40
|
|
47
|
+
|
|
48
|
+
MAX_READ_SIZE = 1000000000
|
|
49
|
+
|
|
38
50
|
# Create a new log file reader
|
|
39
51
|
def initialize
|
|
40
52
|
reset()
|
|
@@ -62,10 +74,10 @@ module Cosmos
|
|
|
62
74
|
packet = read(identify_and_define)
|
|
63
75
|
break unless packet
|
|
64
76
|
|
|
65
|
-
|
|
66
|
-
if
|
|
67
|
-
next if start_time and
|
|
68
|
-
break if end_time and
|
|
77
|
+
time = packet.packet_time
|
|
78
|
+
if time
|
|
79
|
+
next if start_time and time < start_time
|
|
80
|
+
break if end_time and time > end_time
|
|
69
81
|
end
|
|
70
82
|
|
|
71
83
|
yield packet
|
|
@@ -115,6 +127,8 @@ module Cosmos
|
|
|
115
127
|
reset()
|
|
116
128
|
@filename = filename
|
|
117
129
|
@file = BufferedFile.open(@filename, 'rb')
|
|
130
|
+
@max_read_size = @file.size
|
|
131
|
+
@max_read_size = MAX_READ_SIZE if @max_read_size > MAX_READ_SIZE
|
|
118
132
|
@bytes_read = 0
|
|
119
133
|
return read_file_header()
|
|
120
134
|
rescue => err
|
|
@@ -133,11 +147,11 @@ module Cosmos
|
|
|
133
147
|
# @return [Packet]
|
|
134
148
|
def read(identify_and_define = true)
|
|
135
149
|
# Read the Packet Header
|
|
136
|
-
success, target_name, packet_name, received_time = read_entry_header()
|
|
150
|
+
success, target_name, packet_name, received_time, stored, extra = read_entry_header()
|
|
137
151
|
return nil unless success
|
|
138
152
|
|
|
139
153
|
# Read Packet Data
|
|
140
|
-
packet_data = @file.read_length_bytes(4)
|
|
154
|
+
packet_data = @file.read_length_bytes(4, @max_read_size)
|
|
141
155
|
return nil unless packet_data and packet_data.length > 0
|
|
142
156
|
|
|
143
157
|
if identify_and_define
|
|
@@ -147,6 +161,8 @@ module Cosmos
|
|
|
147
161
|
packet = Packet.new(target_name, packet_name, :BIG_ENDIAN, nil, packet_data)
|
|
148
162
|
packet.set_received_time_fast(received_time)
|
|
149
163
|
end
|
|
164
|
+
packet.stored = stored
|
|
165
|
+
packet.extra = extra
|
|
150
166
|
|
|
151
167
|
# Auto change configuration on SYSTEM META
|
|
152
168
|
if packet.target_name == 'SYSTEM'.freeze and packet.packet_name == 'META'.freeze
|
|
@@ -231,11 +247,13 @@ module Cosmos
|
|
|
231
247
|
|
|
232
248
|
def reset
|
|
233
249
|
@file = nil
|
|
250
|
+
@max_read_size = MAX_READ_SIZE
|
|
234
251
|
@filename = nil
|
|
235
252
|
@log_type = :TLM
|
|
236
253
|
@configuration_name = nil
|
|
237
254
|
@hostname = nil
|
|
238
|
-
@
|
|
255
|
+
@mode = 4
|
|
256
|
+
@file_header_length = COSMOS4_HEADER_LENGTH
|
|
239
257
|
end
|
|
240
258
|
|
|
241
259
|
# This is best effort. May return unidentified/undefined packets
|
|
@@ -269,10 +287,15 @@ module Cosmos
|
|
|
269
287
|
|
|
270
288
|
# Should return if successfully switched to requested configuration
|
|
271
289
|
def read_file_header
|
|
272
|
-
header = @file.read(
|
|
273
|
-
if header and header.length ==
|
|
274
|
-
if header[COSMOS2_MARKER_RANGE] == COSMOS2_MARKER
|
|
275
|
-
# Found COSMOS 2 File Header
|
|
290
|
+
header = @file.read(COSMOS4_HEADER_LENGTH)
|
|
291
|
+
if header and header.length == COSMOS4_HEADER_LENGTH
|
|
292
|
+
if header[COSMOS4_MARKER_RANGE] == COSMOS4_MARKER or header[COSMOS2_MARKER_RANGE] == COSMOS2_MARKER
|
|
293
|
+
# Found COSMOS 2/4 File Header
|
|
294
|
+
if header[COSMOS4_MARKER_RANGE] == COSMOS4_MARKER
|
|
295
|
+
@mode = 4
|
|
296
|
+
else
|
|
297
|
+
@mode = 2
|
|
298
|
+
end
|
|
276
299
|
@log_type = header[COSMOS2_LOG_TYPE_RANGE].intern
|
|
277
300
|
raise "Unknown log type #{@log_type}" unless [:CMD, :TLM].include? @log_type
|
|
278
301
|
@configuration_name = header[COSMOS2_CONFIGURATION_NAME_RANGE]
|
|
@@ -283,6 +306,7 @@ module Cosmos
|
|
|
283
306
|
return false, error # Did not successfully change to requested configuration name
|
|
284
307
|
elsif header[COSMOS1_MARKER_RANGE] == COSMOS1_MARKER
|
|
285
308
|
# Found COSMOS 1 File Header
|
|
309
|
+
@mode = 1
|
|
286
310
|
@log_type = header[COSMOS1_LOG_TYPE_RANGE].upcase.intern
|
|
287
311
|
raise "Unknown log type #{@log_type}" unless [:CMD, :TLM].include? @log_type
|
|
288
312
|
@configuration_name = header[COSMOS1_CONFIGURATION_NAME_RANGE]
|
|
@@ -297,29 +321,48 @@ module Cosmos
|
|
|
297
321
|
raise "COSMOS file header not found on packet log"
|
|
298
322
|
end
|
|
299
323
|
else
|
|
300
|
-
raise "Failed to read at least #{
|
|
324
|
+
raise "Failed to read at least #{COSMOS4_HEADER_LENGTH} bytes from packet log"
|
|
301
325
|
end
|
|
302
326
|
end
|
|
303
327
|
|
|
304
328
|
def read_entry_header
|
|
329
|
+
stored = false
|
|
330
|
+
extra = nil
|
|
331
|
+
|
|
332
|
+
if @mode == 4
|
|
333
|
+
# Read Flags
|
|
334
|
+
flags = @file.read(1)
|
|
335
|
+
return [nil, nil, nil, nil, nil, nil] if flags.nil? or flags.length != 1
|
|
336
|
+
flags = flags.unpack('C')[0]
|
|
337
|
+
|
|
338
|
+
stored = true if (flags & COSMOS4_STORED_FLAG_MASK) != 0
|
|
339
|
+
|
|
340
|
+
if (flags & COSMOS4_EXTRA_FLAG_MASK) != 0
|
|
341
|
+
# Read Extra data
|
|
342
|
+
extra_data = @file.read_length_bytes(4, @max_read_size)
|
|
343
|
+
return [nil, nil, nil, nil, nil, nil] unless extra_data and extra_data.length > 0
|
|
344
|
+
extra = JSON.parse(extra_data)
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
|
|
305
348
|
# Read Received Time
|
|
306
349
|
time_seconds = @file.read(4)
|
|
307
|
-
return [nil, nil, nil, nil] if time_seconds.nil? or time_seconds.length != 4
|
|
350
|
+
return [nil, nil, nil, nil, nil, nil] if time_seconds.nil? or time_seconds.length != 4
|
|
308
351
|
time_seconds = time_seconds.unpack('N')[0]
|
|
309
352
|
time_microseconds = @file.read(4)
|
|
310
|
-
return [nil, nil, nil, nil] if time_microseconds.nil? or time_microseconds.length != 4
|
|
353
|
+
return [nil, nil, nil, nil, nil, nil] if time_microseconds.nil? or time_microseconds.length != 4
|
|
311
354
|
time_microseconds = time_microseconds.unpack('N')[0]
|
|
312
355
|
received_time = Time.at(time_seconds, time_microseconds).sys
|
|
313
356
|
|
|
314
357
|
# Read Target Name
|
|
315
358
|
target_name = @file.read_length_bytes(1)
|
|
316
|
-
return [nil, nil, nil, nil] unless target_name and target_name.length > 0
|
|
359
|
+
return [nil, nil, nil, nil, nil, nil] unless target_name and target_name.length > 0
|
|
317
360
|
|
|
318
361
|
# Read Packet Name
|
|
319
362
|
packet_name = @file.read_length_bytes(1)
|
|
320
|
-
return [nil, nil, nil, nil] unless packet_name and packet_name.length > 0
|
|
363
|
+
return [nil, nil, nil, nil, nil, nil] unless packet_name and packet_name.length > 0
|
|
321
364
|
|
|
322
|
-
return [true, target_name, packet_name, received_time]
|
|
365
|
+
return [true, target_name, packet_name, received_time, stored, extra]
|
|
323
366
|
end
|
|
324
367
|
|
|
325
368
|
def test
|
|
@@ -331,7 +374,7 @@ module Cosmos
|
|
|
331
374
|
begin
|
|
332
375
|
# Try to read the packet header
|
|
333
376
|
# This will fail with file read errors and invalid timestamps
|
|
334
|
-
success, target_name, packet_name, _ = read_entry_header()
|
|
377
|
+
success, target_name, packet_name, _, _, _ = read_entry_header()
|
|
335
378
|
if success
|
|
336
379
|
if target_name !~ File::NON_ASCII_PRINTABLE and packet_name !~ File::NON_ASCII_PRINTABLE
|
|
337
380
|
packet_data_length = @file.read(4)
|
|
@@ -402,17 +445,17 @@ module Cosmos
|
|
|
402
445
|
# Read the first packet in the log
|
|
403
446
|
first_packet = first()
|
|
404
447
|
raise "Error reading first packet" unless first
|
|
405
|
-
raise "First Packet does not contain a packet received time" unless first_packet.
|
|
448
|
+
raise "First Packet does not contain a packet received time" unless first_packet.packet_time
|
|
406
449
|
|
|
407
450
|
# Read the last packet in the log
|
|
408
451
|
file_size = size()
|
|
409
452
|
last_packet = last()
|
|
410
453
|
raise "Search failed looking for last packet" unless last_packet
|
|
411
|
-
raise "Last Packet does not contain a packet received time" unless last_packet.
|
|
454
|
+
raise "Last Packet does not contain a packet received time" unless last_packet.packet_time
|
|
412
455
|
|
|
413
|
-
if time >= first_packet.
|
|
456
|
+
if time >= first_packet.packet_time and time <= last_packet.packet_time
|
|
414
457
|
# Guess at where to start looking for time in log
|
|
415
|
-
percentage = (time - first_packet.
|
|
458
|
+
percentage = (time - first_packet.packet_time) / (last_packet.packet_time - first_packet.packet_time)
|
|
416
459
|
offset = (percentage * file_size.to_f).to_i
|
|
417
460
|
offset = @file_header_length if offset < @file_header_length
|
|
418
461
|
@file.seek(offset, IO::SEEK_SET)
|
|
@@ -420,10 +463,10 @@ module Cosmos
|
|
|
420
463
|
# Move backwards until a packet before the time is found
|
|
421
464
|
while true
|
|
422
465
|
packet = search(-1, :BEFORE)
|
|
423
|
-
break if !packet or packet.
|
|
466
|
+
break if !packet or packet.packet_time <= time
|
|
424
467
|
|
|
425
468
|
# Guess again
|
|
426
|
-
percentage = 1.0 - ((packet.
|
|
469
|
+
percentage = 1.0 - ((packet.packet_time - time) / (packet.packet_time - first_packet.packet_time))
|
|
427
470
|
offset = (percentage * @file.pos.to_f).to_i
|
|
428
471
|
offset = @file_header_length if offset < @file_header_length
|
|
429
472
|
@file.seek(offset, IO::SEEK_SET)
|
|
@@ -434,7 +477,7 @@ module Cosmos
|
|
|
434
477
|
position = @file.pos
|
|
435
478
|
packet = read(false)
|
|
436
479
|
raise "Search failed looking for packet after time" unless packet
|
|
437
|
-
if packet.
|
|
480
|
+
if packet.packet_time >= time
|
|
438
481
|
# Back up this packet so the read can get it because we want it
|
|
439
482
|
@file.seek(position, IO::SEEK_SET)
|
|
440
483
|
break
|
|
@@ -442,7 +485,7 @@ module Cosmos
|
|
|
442
485
|
end
|
|
443
486
|
|
|
444
487
|
else
|
|
445
|
-
if time > last_packet.
|
|
488
|
+
if time > last_packet.packet_time
|
|
446
489
|
# File is entirely before time, so jump to the end
|
|
447
490
|
@file.seek(0, IO::SEEK_END)
|
|
448
491
|
else
|
|
@@ -311,7 +311,7 @@ module Cosmos
|
|
|
311
311
|
|
|
312
312
|
def build_file_header(configuration_name = System.configuration_name)
|
|
313
313
|
hostname = Socket.gethostname.to_s
|
|
314
|
-
file_header = "
|
|
314
|
+
file_header = "COSMOS4_#{@log_type}_#{configuration_name.ljust(32, ' ')[0..31]}_"
|
|
315
315
|
file_header << hostname.ljust(83)
|
|
316
316
|
return file_header
|
|
317
317
|
end
|
|
@@ -322,6 +322,18 @@ module Cosmos
|
|
|
322
322
|
# This is an optimization to avoid creating a new entry_header object
|
|
323
323
|
# each time we create an entry_header which we do a LOT!
|
|
324
324
|
@entry_header.clear
|
|
325
|
+
flags = 0
|
|
326
|
+
flags |= PacketLogReader::COSMOS4_STORED_FLAG_MASK if packet.stored
|
|
327
|
+
extra = packet.extra
|
|
328
|
+
if extra
|
|
329
|
+
flags |= PacketLogReader::COSMOS4_EXTRA_FLAG_MASK
|
|
330
|
+
extra = extra.to_json
|
|
331
|
+
end
|
|
332
|
+
@entry_header << [flags].pack('C'.freeze)
|
|
333
|
+
if extra
|
|
334
|
+
@entry_header << [extra.length].pack('N'.freeze)
|
|
335
|
+
@entry_header << extra
|
|
336
|
+
end
|
|
325
337
|
@entry_header << [received_time.tv_sec].pack('N'.freeze)
|
|
326
338
|
@entry_header << [received_time.tv_usec].pack('N'.freeze)
|
|
327
339
|
target_name = packet.target_name
|
|
@@ -102,7 +102,9 @@ module Cosmos
|
|
|
102
102
|
target_packets.each do |packet_name, packet|
|
|
103
103
|
if (packet.identify?(packet_data))
|
|
104
104
|
identified_packet = packet.clone
|
|
105
|
-
identified_packet.received_time
|
|
105
|
+
identified_packet.received_time = nil
|
|
106
|
+
identified_packet.stored = false
|
|
107
|
+
identified_packet.extra = nil
|
|
106
108
|
identified_packet.received_count = 0
|
|
107
109
|
identified_packet.buffer = packet_data
|
|
108
110
|
break
|
|
@@ -141,6 +143,8 @@ module Cosmos
|
|
|
141
143
|
|
|
142
144
|
# Set time, parameters, and restore defaults
|
|
143
145
|
command.received_time = Time.now.sys
|
|
146
|
+
command.stored = false
|
|
147
|
+
command.extra = nil
|
|
144
148
|
command.given_values = params
|
|
145
149
|
command.restore_defaults(command.buffer(false), params.keys)
|
|
146
150
|
command.raw = raw
|