cosmos 4.2.3-java → 4.2.4-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/.gitignore +2 -0
- data/Manifest.txt +14 -1
- data/bin/dart_util +4 -0
- data/cosmos.gemspec +3 -2
- data/data/config/interface_modifiers.yaml +2 -1
- data/data/config/item_modifiers.yaml +1 -1
- data/data/config/parameter_modifiers.yaml +1 -1
- data/data/crc.txt +52 -45
- data/demo/config/data/crc.txt +6 -1
- data/demo/config/system/system.txt +1 -0
- data/demo/config/targets/DART/cmd_tlm/dart_cmds.txt +2 -0
- data/demo/config/targets/DART/cmd_tlm/dart_tlm.txt +40 -0
- data/demo/config/targets/DART/cmd_tlm_server.txt +6 -0
- data/demo/config/targets/DART/screens/status.txt +54 -0
- data/demo/config/targets/DART/target.txt +7 -0
- data/ext/cosmos/ext/structure/structure.c +16 -4
- data/lib/cosmos/dart/app/models/status.rb +2 -0
- data/lib/cosmos/dart/db/migrate/20180423205644_create_statuses.rb +22 -0
- data/lib/cosmos/dart/db/migrate/20180425211340_add_decom_state_index.rb +5 -0
- data/lib/cosmos/dart/db/migrate/20180509204705_remove_indexes.rb +29 -0
- data/lib/cosmos/dart/db/migrate/20180510160002_remove_timestamps_from_ples.rb +6 -0
- data/lib/cosmos/dart/db/migrate/20180511194944_add_packet_log_id_to_tables.rb +18 -0
- data/lib/cosmos/dart/db/schema.rb +15 -9
- data/lib/cosmos/dart/db/seeds.rb +8 -0
- data/lib/cosmos/dart/lib/dart_common.rb +5 -6
- data/lib/cosmos/dart/lib/dart_database_cleaner.rb +56 -5
- data/lib/cosmos/dart/lib/dart_decom_query.rb +108 -6
- data/lib/cosmos/dart/lib/dart_decommutator.rb +81 -22
- data/lib/cosmos/dart/lib/dart_importer.rb +44 -14
- data/lib/cosmos/dart/lib/dart_packet_log_writer.rb +73 -55
- data/lib/cosmos/dart/lib/dart_reducer_manager.rb +34 -3
- data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +18 -7
- data/lib/cosmos/dart/processes/dart.rb +2 -1
- data/lib/cosmos/dart/processes/dart_decom_server.rb +2 -1
- data/lib/cosmos/dart/processes/dart_import.rb +1 -0
- data/lib/cosmos/dart/processes/dart_ingester.rb +1 -0
- data/lib/cosmos/dart/processes/dart_reducer.rb +1 -0
- data/lib/cosmos/dart/processes/dart_stream_server.rb +1 -0
- data/lib/cosmos/dart/processes/dart_util.rb +147 -0
- data/lib/cosmos/dart/processes/dart_worker.rb +1 -0
- data/lib/cosmos/dart/spec/dart/dart_database_cleaner_spec.rb +1 -1
- data/lib/cosmos/dart/spec/dart/dart_decom_query_spec.rb +1 -0
- data/lib/cosmos/dart/spec/dart/dart_decommutator_spec.rb +1 -0
- data/lib/cosmos/dart/spec/dart/dart_importer_spec.rb +1 -0
- data/lib/cosmos/dart/spec/dart/dart_packet_log_writer_spec.rb +39 -36
- data/lib/cosmos/dart/spec/dart/dart_reducer_manager_spec.rb +2 -1
- data/lib/cosmos/dart/spec/dart/dart_tcpip_server_interface_spec.rb +1 -2
- data/lib/cosmos/gui/widgets/dart_meta_frame.rb +13 -6
- data/lib/cosmos/interfaces.rb +1 -0
- data/lib/cosmos/interfaces/dart_status_interface.rb +91 -0
- data/lib/cosmos/interfaces/serial_interface.rb +5 -1
- data/lib/cosmos/io/json_drb.rb +7 -2
- data/lib/cosmos/io/json_drb_object.rb +11 -6
- data/lib/cosmos/io/json_rpc.rb +1 -0
- data/lib/cosmos/io/posix_serial_driver.rb +4 -2
- data/lib/cosmos/io/serial_driver.rb +8 -4
- data/lib/cosmos/io/win32_serial_driver.rb +4 -3
- data/lib/cosmos/packets/packet_config.rb +12 -2
- data/lib/cosmos/packets/structure_item.rb +1 -0
- data/lib/cosmos/script/extract.rb +4 -2
- data/lib/cosmos/streams/serial_stream.rb +10 -5
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +15 -15
- data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +1 -1
- data/lib/cosmos/tools/table_manager/table_manager.rb +6 -4
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +5 -4
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +1 -1
- data/lib/cosmos/top_level.rb +1 -1
- data/lib/cosmos/version.rb +4 -4
- data/spec/interfaces/serial_interface_spec.rb +13 -0
- data/spec/io/json_rpc_spec.rb +7 -0
- data/spec/io/win32_serial_driver_spec.rb +8 -0
- data/spec/packets/structure_item_spec.rb +6 -0
- data/spec/script/extract_spec.rb +5 -0
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +10 -0
- metadata +17 -3
- data/lib/cosmos/dart/app/helpers/application_helper.rb +0 -2
@@ -10,6 +10,20 @@
|
|
10
10
|
|
11
11
|
require 'dart_reducer_worker_thread'
|
12
12
|
|
13
|
+
class DartReducerStatus
|
14
|
+
attr_accessor :count
|
15
|
+
attr_accessor :error_count
|
16
|
+
attr_accessor :message
|
17
|
+
attr_accessor :message_time
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@count = 0
|
21
|
+
@error_count = 0
|
22
|
+
@message = ''
|
23
|
+
@message_time = Time.now
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
13
27
|
# Reduce the decommutated data into the database. It creates a number of
|
14
28
|
# threads to perform the actual data reduction. Then it queries the database
|
15
29
|
# for all the decommutation tables and determines which need to be reduced
|
@@ -21,13 +35,15 @@ class DartReducerManager
|
|
21
35
|
#
|
22
36
|
# @param num_threads [Integer] The number of worker threads to create
|
23
37
|
def initialize(num_threads = 5)
|
24
|
-
|
38
|
+
message = "Dart Reducer Starting with #{num_threads} threads..."
|
39
|
+
Cosmos::Logger.info(message)
|
25
40
|
@master_queue = Queue.new
|
26
41
|
@locked_tables = []
|
27
42
|
@mutex = Mutex.new
|
28
43
|
@threads = []
|
44
|
+
@status = DartReducerStatus.new
|
29
45
|
num_threads.times do |index|
|
30
|
-
@threads << DartReducerWorkerThread.new(@master_queue, @locked_tables, @mutex, index + 1)
|
46
|
+
@threads << DartReducerWorkerThread.new(@master_queue, @locked_tables, @mutex, index + 1, @status)
|
31
47
|
end
|
32
48
|
end
|
33
49
|
|
@@ -51,6 +67,20 @@ class DartReducerManager
|
|
51
67
|
queue_worker(:HOUR, packet_config_id, table_index, minute_model, hour_model)
|
52
68
|
queue_worker(:DAY, packet_config_id, table_index, hour_model, day_model)
|
53
69
|
end
|
70
|
+
|
71
|
+
# Update status
|
72
|
+
status = Status.first
|
73
|
+
if (Time.now - @status.message_time) <= 60.0
|
74
|
+
status.reduction_message = @status.message
|
75
|
+
status.reduction_message_time = @status.message_time
|
76
|
+
status.save!
|
77
|
+
end
|
78
|
+
if @status.count > 0 or @status.error_count > 0
|
79
|
+
Status.update_counters(status.id, :reduction_count => @status.count, :reduction_error_count => @status.error_count)
|
80
|
+
@status.count = 0
|
81
|
+
@status.error_count = 0
|
82
|
+
end
|
83
|
+
|
54
84
|
# Throttle to no faster than once every 60 seconds
|
55
85
|
delta = Time.now - time_start
|
56
86
|
if delta < 60 and delta > 0
|
@@ -58,7 +88,8 @@ class DartReducerManager
|
|
58
88
|
end
|
59
89
|
end
|
60
90
|
rescue Interrupt
|
61
|
-
|
91
|
+
message = "Dart Reducer Shutting Down..."
|
92
|
+
Cosmos::Logger.info(message)
|
62
93
|
shutdown()
|
63
94
|
exit(0)
|
64
95
|
end
|
@@ -23,13 +23,15 @@ class DartReducerWorkerThread
|
|
23
23
|
# third values are the PacketConfig ID and table index.
|
24
24
|
# @param mutex [Mutex] Mutex used to synchronize access to the locked_tables
|
25
25
|
# @param instance_num [Integer] Simple counter to trace the thread instance
|
26
|
-
|
26
|
+
# @param status [DartReducerStatus] Status structure
|
27
|
+
def initialize(master_queue, locked_tables, mutex, instance_num, status)
|
27
28
|
@instance_num = instance_num
|
28
29
|
@running = true
|
29
30
|
@master_queue = master_queue
|
30
31
|
@locked_tables = locked_tables
|
31
32
|
@mutex = mutex
|
32
33
|
@thread_queue = Queue.new
|
34
|
+
@status = status
|
33
35
|
# Start the thread which will wait on @thread_queue.pop
|
34
36
|
@thread = Thread.new { work() }
|
35
37
|
# Add the local @thread_queue to the @master_queue so jobs can be added
|
@@ -77,6 +79,7 @@ class DartReducerWorkerThread
|
|
77
79
|
new_row.start_time = first_row_time
|
78
80
|
new_row.num_samples = sample_rows.length
|
79
81
|
new_row.meta_id = sample_rows[0].meta_id
|
82
|
+
new_row.packet_log_id = sample_rows[0].packet_log_id
|
80
83
|
# Process each of the ItemToDecomTableMapping to get the item to be reduced
|
81
84
|
mappings.each do |mapping|
|
82
85
|
item_name = "i#{mapping.item_index}"
|
@@ -105,7 +108,7 @@ class DartReducerWorkerThread
|
|
105
108
|
max_sample = value
|
106
109
|
avg_sample = value
|
107
110
|
if value.nil?
|
108
|
-
|
111
|
+
handle_error("#{item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
109
112
|
next
|
110
113
|
end
|
111
114
|
else # :HOUR or :DAY
|
@@ -116,19 +119,19 @@ class DartReducerWorkerThread
|
|
116
119
|
avg_sample = row_to_reduce.read_attribute(avg_item_name)
|
117
120
|
stddev_sample = row_to_reduce.read_attribute(stddev_item_name)
|
118
121
|
if min_sample.nil?
|
119
|
-
|
122
|
+
handle_error("#{min_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
120
123
|
next
|
121
124
|
end
|
122
125
|
if max_sample.nil?
|
123
|
-
|
126
|
+
handle_error("#{max_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
124
127
|
next
|
125
128
|
end
|
126
129
|
if avg_sample.nil?
|
127
|
-
|
130
|
+
handle_error("#{avg_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
128
131
|
next
|
129
132
|
end
|
130
133
|
if stddev_sample.nil?
|
131
|
-
|
134
|
+
handle_error("#{stddev_item_name} is nil in #{row_to_reduce.class}:#{row_to_reduce.id}")
|
132
135
|
next
|
133
136
|
end
|
134
137
|
end
|
@@ -193,6 +196,7 @@ class DartReducerWorkerThread
|
|
193
196
|
base_model.where(id: sample_rows.map(&:id)).update_all(:reduced_id => new_row.id)
|
194
197
|
new_row.reduced_state = DartCommon::READY_TO_REDUCE
|
195
198
|
new_row.save!
|
199
|
+
@status.count += 1
|
196
200
|
|
197
201
|
rows = rows[-1..-1] # Start a new sample with the last item in the previous sample
|
198
202
|
Cosmos::Logger.debug("Created #{new_row.class}:#{new_row.id} with #{mappings.length} items from #{new_row.num_samples} samples")
|
@@ -201,7 +205,7 @@ class DartReducerWorkerThread
|
|
201
205
|
end # while @running
|
202
206
|
Cosmos::Logger.info("Reducer Thread #{@instance_num} Shutdown")
|
203
207
|
rescue Exception => error
|
204
|
-
|
208
|
+
handle_error("Reducer Thread Unexpectedly Died: #{error.formatted}")
|
205
209
|
end
|
206
210
|
|
207
211
|
# Shutdown the worker thread
|
@@ -260,4 +264,11 @@ class DartReducerWorkerThread
|
|
260
264
|
raise "Reducer Thread Unexpected Job Type: #{job_type}"
|
261
265
|
end
|
262
266
|
end
|
267
|
+
|
268
|
+
def handle_error(message)
|
269
|
+
Cosmos::Logger.error(message)
|
270
|
+
@status.error_count += 1
|
271
|
+
@status.message = message
|
272
|
+
@status.message_time = Time.now
|
273
|
+
end
|
263
274
|
end
|
@@ -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
|
+
ENV['RAILS_ENV'] = 'production'
|
11
12
|
require File.expand_path('../../config/environment', __FILE__)
|
12
13
|
require 'dart_common'
|
13
14
|
require 'dart_logging'
|
@@ -45,7 +46,7 @@ class Dart
|
|
45
46
|
end
|
46
47
|
|
47
48
|
num_workers = ENV['DART_NUM_WORKERS']
|
48
|
-
num_workers ||=
|
49
|
+
num_workers ||= 2
|
49
50
|
num_workers = num_workers.to_i
|
50
51
|
|
51
52
|
process_definitions = [
|
@@ -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
|
+
ENV['RAILS_ENV'] = 'production'
|
11
12
|
require File.expand_path('../../config/environment', __FILE__)
|
12
13
|
require 'dart_common'
|
13
14
|
require 'dart_decom_query'
|
@@ -21,7 +22,7 @@ Cosmos.catch_fatal_exception do
|
|
21
22
|
json_drb = Cosmos::JsonDRb.new
|
22
23
|
json_drb.acl = Cosmos::System.acl if Cosmos::System.acl
|
23
24
|
begin
|
24
|
-
json_drb.method_whitelist = ['query', 'item_names']
|
25
|
+
json_drb.method_whitelist = ['query', 'item_names', 'dart_status', 'clear_errors']
|
25
26
|
begin
|
26
27
|
json_drb.start_service(Cosmos::System.listen_hosts['DART_DECOM'],
|
27
28
|
Cosmos::System.ports['DART_DECOM'], DartDecomQuery.new)
|
@@ -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
|
+
ENV['RAILS_ENV'] = 'production'
|
11
12
|
require File.expand_path('../../config/environment', __FILE__)
|
12
13
|
require 'dart_packet_log_writer'
|
13
14
|
require 'dart_logging'
|
@@ -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
|
+
ENV['RAILS_ENV'] = 'production'
|
11
12
|
require File.expand_path('../../config/environment', __FILE__)
|
12
13
|
require 'dart_reducer_manager'
|
13
14
|
require 'dart_logging'
|
@@ -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
|
+
ENV['RAILS_ENV'] = 'production'
|
11
12
|
require File.expand_path('../../config/environment', __FILE__)
|
12
13
|
require 'dart_tcpip_server_interface'
|
13
14
|
require 'dart_logging'
|
@@ -0,0 +1,147 @@
|
|
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
|
+
# This code must be run on the database server
|
12
|
+
|
13
|
+
require 'ostruct'
|
14
|
+
require 'optparse'
|
15
|
+
require 'cosmos/version'
|
16
|
+
|
17
|
+
options = OpenStruct.new
|
18
|
+
options.force = false
|
19
|
+
|
20
|
+
parser = OptionParser.new do |option_parser|
|
21
|
+
option_parser.banner = "Usage: dart_util <action> [options]"
|
22
|
+
option_parser.separator("")
|
23
|
+
|
24
|
+
# Create the help option
|
25
|
+
option_parser.on("-h", "--help", "Show this message") do
|
26
|
+
puts option_parser
|
27
|
+
exit(0)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Create the version option
|
31
|
+
option_parser.on("-v", "--version", "Show version") do
|
32
|
+
puts "COSMOS Version: #{COSMOS_VERSION}"
|
33
|
+
puts "User Version: #{USER_VERSION}" if defined? USER_VERSION
|
34
|
+
exit(0)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Create the system option
|
38
|
+
option_parser.on("--system FILE", "Use an alternative system.txt file") do |arg|
|
39
|
+
System.instance(File.join(USERPATH, 'config', 'system', arg))
|
40
|
+
end
|
41
|
+
|
42
|
+
# Create the force option
|
43
|
+
option_parser.on("-f", "--force", "Force parsing entire file") do
|
44
|
+
options.force = true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
parser.parse!(ARGV)
|
49
|
+
action = ARGV[0]
|
50
|
+
unless action
|
51
|
+
puts parser
|
52
|
+
exit(1)
|
53
|
+
end
|
54
|
+
|
55
|
+
ENV['RAILS_ENV'] = 'production'
|
56
|
+
require File.expand_path('../../config/environment', __FILE__)
|
57
|
+
require 'dart_database_cleaner'
|
58
|
+
|
59
|
+
Cosmos.catch_fatal_exception do
|
60
|
+
case action.downcase
|
61
|
+
when 'showpleerrors'
|
62
|
+
ples = PacketLogEntry.where("decom_state >= 3").find_each do |ple|
|
63
|
+
puts "#{ple.id}: #{ple.decom_state_string}(#{ple.decom_state})"
|
64
|
+
end
|
65
|
+
|
66
|
+
when 'resetpleerrors'
|
67
|
+
PacketLogEntry.where("decom_state >= 3").update_all(:decom_state => 0)
|
68
|
+
puts "All errored PLEs set to decom_state 0"
|
69
|
+
|
70
|
+
when 'fullcleanup'
|
71
|
+
Cosmos::Logger.level = Cosmos::Logger::INFO
|
72
|
+
DartDatabaseCleaner.clean(false, true)
|
73
|
+
|
74
|
+
when 'removepacketlog'
|
75
|
+
puts "Removing database entries for packet log #{ARGV[1]}"
|
76
|
+
puts "Note!!! This does not delete the file"
|
77
|
+
Cosmos::Logger.level = Cosmos::Logger::INFO
|
78
|
+
DartDatabaseCleaner.new.remove_packet_log(ARGV[1])
|
79
|
+
|
80
|
+
when 'showpacketlogs'
|
81
|
+
total_size = 0
|
82
|
+
packet_logs = PacketLog.all
|
83
|
+
filenames = []
|
84
|
+
reader = Cosmos::PacketLogReader.new
|
85
|
+
packet_logs.each do |pl|
|
86
|
+
filenames << pl.filename
|
87
|
+
if File.exist?(pl.filename)
|
88
|
+
exists = "FOUND "
|
89
|
+
size = File.size(pl.filename)
|
90
|
+
reader.open(pl.filename)
|
91
|
+
begin
|
92
|
+
first_packet = reader.first
|
93
|
+
last_packet = reader.last
|
94
|
+
start_time = first_packet.received_time.formatted
|
95
|
+
end_time = last_packet.received_time.formatted
|
96
|
+
rescue
|
97
|
+
if size == 128 or size == 0
|
98
|
+
start_time = "EMPTY "
|
99
|
+
end_time = "EMPTY "
|
100
|
+
else
|
101
|
+
start_time = "ERROR "
|
102
|
+
end_time = "ERROR "
|
103
|
+
end
|
104
|
+
ensure
|
105
|
+
reader.close
|
106
|
+
end
|
107
|
+
else
|
108
|
+
size = 0
|
109
|
+
start_time = "MISSING "
|
110
|
+
end_time = "MISSING "
|
111
|
+
exists = "MISSING"
|
112
|
+
end
|
113
|
+
puts "#{"%-32.32s" % File.basename(pl.filename)} #{exists} #{start_time} #{end_time} #{size}"
|
114
|
+
total_size += size
|
115
|
+
end
|
116
|
+
other_size = 0
|
117
|
+
Cosmos.set_working_dir do
|
118
|
+
Dir[Cosmos::System.paths['DART_DATA'] + '/*.bin'].each do |filename|
|
119
|
+
next if filename[0] == '.'
|
120
|
+
next if filenames.include?(filename)
|
121
|
+
exists = "NOTINDB"
|
122
|
+
size = File.size(filename)
|
123
|
+
reader.open(filename)
|
124
|
+
begin
|
125
|
+
first_packet = reader.first
|
126
|
+
last_packet = reader.last
|
127
|
+
start_time = first_packet.received_time.formatted
|
128
|
+
end_time = last_packet.received_time.formatted
|
129
|
+
rescue
|
130
|
+
if size == 128 or size == 0
|
131
|
+
start_time = "EMPTY "
|
132
|
+
end_time = "EMPTY "
|
133
|
+
else
|
134
|
+
start_time = "ERROR "
|
135
|
+
end_time = "ERROR "
|
136
|
+
end
|
137
|
+
ensure
|
138
|
+
reader.close
|
139
|
+
end
|
140
|
+
puts "#{"%-32.32s" % File.basename(filename)} #{exists} #{start_time} #{end_time} #{size}"
|
141
|
+
other_size += size
|
142
|
+
end
|
143
|
+
end
|
144
|
+
puts "Total size in database: #{"%0.2f GB" % (total_size.to_f / (1024 * 1024 * 1024))}"
|
145
|
+
puts "Total size not in database: #{"%0.2f GB" % (other_size.to_f / (1024 * 1024 * 1024))}"
|
146
|
+
end
|
147
|
+
end
|
@@ -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
|
+
ENV['RAILS_ENV'] = 'production'
|
11
12
|
require File.expand_path('../../config/environment', __FILE__)
|
12
13
|
require 'dart_common'
|
13
14
|
require 'dart_logging'
|
@@ -17,6 +17,7 @@ describe DartDatabaseCleaner do
|
|
17
17
|
before(:each) do
|
18
18
|
DatabaseCleaner.strategy = :truncation
|
19
19
|
DatabaseCleaner.clean
|
20
|
+
Rails.application.load_seed
|
20
21
|
@cleaner = DartDatabaseCleaner.new
|
21
22
|
end
|
22
23
|
|
@@ -29,7 +30,6 @@ describe DartDatabaseCleaner do
|
|
29
30
|
expect(messages.select{|m| m =~ /Cleaning up PacketLog\./}.length).to eq 1
|
30
31
|
expect(messages.select{|m| m =~ /Cleaning up PacketConfig/}.length).to eq 1
|
31
32
|
expect(messages.select{|m| m =~ /Cleaning up PacketLogEntry/}.length).to eq 1
|
32
|
-
expect(messages.select{|m| m =~ /Cleaning up Decommutation/}.length).to eq 1
|
33
33
|
expect(messages.select{|m| m =~ /Database cleanup complete/}.length).to eq 1
|
34
34
|
end
|
35
35
|
end
|
@@ -18,6 +18,7 @@ describe DartDecomQuery do
|
|
18
18
|
before(:each) do
|
19
19
|
DatabaseCleaner.strategy = :truncation
|
20
20
|
DatabaseCleaner.clean
|
21
|
+
Rails.application.load_seed
|
21
22
|
@query = DartDecomQuery.new
|
22
23
|
# Put all the known targets and packets into the DB
|
23
24
|
@query.sync_targets_and_packets
|
@@ -25,6 +25,7 @@ describe DartImporter do
|
|
25
25
|
before(:each) do
|
26
26
|
DatabaseCleaner.strategy = :truncation
|
27
27
|
DatabaseCleaner.clean
|
28
|
+
Rails.application.load_seed
|
28
29
|
# Clean the dart logs
|
29
30
|
Dir["#{Cosmos::System.paths['DART_LOGS']}/*"].each do |filename|
|
30
31
|
FileUtils.rm_f filename
|
@@ -15,10 +15,14 @@ describe DartPacketLogWriter do
|
|
15
15
|
before(:each) do
|
16
16
|
DatabaseCleaner.strategy = :truncation
|
17
17
|
DatabaseCleaner.clean
|
18
|
+
Rails.application.load_seed
|
18
19
|
end
|
19
20
|
|
20
21
|
describe "write" do
|
21
22
|
it "creates PacketLogEntries and flushes the file" do
|
23
|
+
DatabaseCleaner.clean
|
24
|
+
Rails.application.load_seed
|
25
|
+
|
22
26
|
writer = DartPacketLogWriter.new(
|
23
27
|
:TLM, # Log telemetry
|
24
28
|
'test_dart_tlm_', # Put dart_ in the log file name
|
@@ -28,7 +32,7 @@ describe DartPacketLogWriter do
|
|
28
32
|
Cosmos::System.paths['DART_DATA']) # Log into the DART_DATA dir
|
29
33
|
|
30
34
|
hs_packet = Cosmos::System.telemetry.packet("INST", "HEALTH_STATUS")
|
31
|
-
(DartPacketLogWriter::DEFAULT_SYNC_COUNT_LIMIT
|
35
|
+
(DartPacketLogWriter::DEFAULT_SYNC_COUNT_LIMIT).times do
|
32
36
|
hs_packet.received_time = Time.now
|
33
37
|
writer.write(hs_packet)
|
34
38
|
sleep 0.01
|
@@ -39,7 +43,7 @@ describe DartPacketLogWriter do
|
|
39
43
|
ple = PacketLogEntry.find(1)
|
40
44
|
expect(ple.target.name).to eq "SYSTEM"
|
41
45
|
expect(ple.packet.name).to eq "META"
|
42
|
-
expect(ple.ready).to eq
|
46
|
+
expect(ple.ready).to eq true
|
43
47
|
|
44
48
|
packet = writer.read_packet_from_ple(ple)
|
45
49
|
expect(packet.class).to eq Cosmos::Packet
|
@@ -49,35 +53,38 @@ describe DartPacketLogWriter do
|
|
49
53
|
target = Target.find_by_name("INST")
|
50
54
|
packet = Packet.find_by_name("HEALTH_STATUS")
|
51
55
|
count = 0
|
52
|
-
|
53
|
-
|
54
|
-
expect(ple.target.name).to eq "INST"
|
55
|
-
expect(ple.packet.name).to eq "HEALTH_STATUS"
|
56
|
-
expect(ple.ready).to eq false # Hasn't been flushed yet
|
57
|
-
|
58
|
-
packet = writer.read_packet_from_ple(ple)
|
59
|
-
expect(packet.target_name).to eq "INST"
|
60
|
-
expect(packet.packet_name).to eq "HEALTH_STATUS"
|
61
|
-
expect(packet.received_time).to_not eq previous_time
|
62
|
-
previous_time = packet.received_time
|
63
|
-
count += 1
|
64
|
-
end
|
65
|
-
expect(count).to eq (DartPacketLogWriter::DEFAULT_SYNC_COUNT_LIMIT - 1)
|
56
|
+
count = PacketLogEntry.where("target_id = ? and packet_id = ?", target.id, packet.id).count
|
57
|
+
expect(count).to eq (0)
|
66
58
|
|
67
59
|
hs_packet.received_time = Time.now
|
68
60
|
writer.write(hs_packet) # Write the packet that causes the flush
|
69
61
|
sleep 0.1
|
70
62
|
count = 0
|
63
|
+
previous_time = Time.now
|
71
64
|
PacketLogEntry.all.each do |ple|
|
72
|
-
if count
|
73
|
-
expect(ple.
|
65
|
+
if count == 0
|
66
|
+
expect(ple.target.name).to eq "SYSTEM"
|
67
|
+
expect(ple.packet.name).to eq "META"
|
68
|
+
expect(ple.ready).to eq true
|
69
|
+
|
70
|
+
packet = writer.read_packet_from_ple(ple)
|
71
|
+
expect(packet.target_name).to eq "SYSTEM"
|
72
|
+
expect(packet.packet_name).to eq "META"
|
73
|
+
expect(packet.received_time).to_not eq previous_time
|
74
74
|
else
|
75
|
-
|
76
|
-
expect(ple.
|
75
|
+
expect(ple.target.name).to eq "INST"
|
76
|
+
expect(ple.packet.name).to eq "HEALTH_STATUS"
|
77
|
+
expect(ple.ready).to eq true
|
78
|
+
|
79
|
+
packet = writer.read_packet_from_ple(ple)
|
80
|
+
expect(packet.target_name).to eq "INST"
|
81
|
+
expect(packet.packet_name).to eq "HEALTH_STATUS"
|
82
|
+
expect(packet.received_time).to_not eq previous_time
|
77
83
|
end
|
84
|
+
previous_time = packet.received_time
|
78
85
|
count += 1
|
79
86
|
end
|
80
|
-
# We wrote one SYSTEM META plus (DartPacketLogWriter::DEFAULT_SYNC_COUNT_LIMIT
|
87
|
+
# We wrote one SYSTEM META plus (DartPacketLogWriter::DEFAULT_SYNC_COUNT_LIMIT)
|
81
88
|
# plus one more to cause the flush
|
82
89
|
expect(count).to eq DartPacketLogWriter::DEFAULT_SYNC_COUNT_LIMIT + 1
|
83
90
|
writer.shutdown
|
@@ -89,6 +96,8 @@ describe DartPacketLogWriter do
|
|
89
96
|
|
90
97
|
it "creates command logs" do
|
91
98
|
DatabaseCleaner.clean
|
99
|
+
Rails.application.load_seed
|
100
|
+
|
92
101
|
meta = Cosmos::System.commands.packet("SYSTEM", "META")
|
93
102
|
clr_cmd = Cosmos::System.commands.packet("INST", "CLEAR")
|
94
103
|
# 128 byte file header, SYSTEM META has 24 byte header,
|
@@ -111,36 +120,30 @@ describe DartPacketLogWriter do
|
|
111
120
|
ple = PacketLogEntry.find(1)
|
112
121
|
expect(ple.target.name).to eq "SYSTEM"
|
113
122
|
expect(ple.packet.name).to eq "META"
|
114
|
-
expect(ple.ready).to eq
|
123
|
+
expect(ple.ready).to eq true
|
124
|
+
|
125
|
+
clr_cmd.received_time = Time.now
|
126
|
+
writer.write(clr_cmd) # The second command should create a new log
|
127
|
+
sleep 0.1
|
115
128
|
|
116
129
|
# The second Log Entry is the command
|
117
130
|
ple = PacketLogEntry.find(2)
|
118
131
|
expect(ple.target.name).to eq "INST"
|
119
132
|
expect(ple.packet.name).to eq "CLEAR"
|
120
|
-
expect(ple.ready).to eq
|
133
|
+
expect(ple.ready).to eq true
|
121
134
|
|
122
|
-
|
123
|
-
writer.write(clr_cmd) # The second command should create a new log
|
135
|
+
writer.shutdown
|
124
136
|
sleep 0.1
|
125
137
|
|
126
|
-
# Check the the first two have been flushed
|
127
|
-
ple = PacketLogEntry.find(1)
|
128
|
-
expect(ple.ready).to eq true # Flushed
|
129
|
-
ple = PacketLogEntry.find(2)
|
130
|
-
expect(ple.ready).to eq true # Flushed
|
131
|
-
|
132
138
|
# The third and fourth are SYSTEM META and the command
|
133
139
|
ple = PacketLogEntry.find(3)
|
134
140
|
expect(ple.target.name).to eq "SYSTEM"
|
135
141
|
expect(ple.packet.name).to eq "META"
|
136
|
-
expect(ple.ready).to eq
|
142
|
+
expect(ple.ready).to eq true
|
137
143
|
ple = PacketLogEntry.find(4)
|
138
144
|
expect(ple.target.name).to eq "INST"
|
139
145
|
expect(ple.packet.name).to eq "CLEAR"
|
140
|
-
expect(ple.ready).to eq
|
141
|
-
|
142
|
-
writer.shutdown
|
143
|
-
sleep 0.1
|
146
|
+
expect(ple.ready).to eq true
|
144
147
|
|
145
148
|
files = Dir["#{Cosmos::System.paths['DART_DATA']}/*_test_dart_cmd_*"]
|
146
149
|
expect(files.length).to eq 2
|