cosmos 4.2.3-java → 4.2.4-java
Sign up to get free protection for your applications and to get access to all the features.
- 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
|