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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/Manifest.txt +14 -1
  4. data/bin/dart_util +4 -0
  5. data/cosmos.gemspec +3 -2
  6. data/data/config/interface_modifiers.yaml +2 -1
  7. data/data/config/item_modifiers.yaml +1 -1
  8. data/data/config/parameter_modifiers.yaml +1 -1
  9. data/data/crc.txt +52 -45
  10. data/demo/config/data/crc.txt +6 -1
  11. data/demo/config/system/system.txt +1 -0
  12. data/demo/config/targets/DART/cmd_tlm/dart_cmds.txt +2 -0
  13. data/demo/config/targets/DART/cmd_tlm/dart_tlm.txt +40 -0
  14. data/demo/config/targets/DART/cmd_tlm_server.txt +6 -0
  15. data/demo/config/targets/DART/screens/status.txt +54 -0
  16. data/demo/config/targets/DART/target.txt +7 -0
  17. data/ext/cosmos/ext/structure/structure.c +16 -4
  18. data/lib/cosmos/dart/app/models/status.rb +2 -0
  19. data/lib/cosmos/dart/db/migrate/20180423205644_create_statuses.rb +22 -0
  20. data/lib/cosmos/dart/db/migrate/20180425211340_add_decom_state_index.rb +5 -0
  21. data/lib/cosmos/dart/db/migrate/20180509204705_remove_indexes.rb +29 -0
  22. data/lib/cosmos/dart/db/migrate/20180510160002_remove_timestamps_from_ples.rb +6 -0
  23. data/lib/cosmos/dart/db/migrate/20180511194944_add_packet_log_id_to_tables.rb +18 -0
  24. data/lib/cosmos/dart/db/schema.rb +15 -9
  25. data/lib/cosmos/dart/db/seeds.rb +8 -0
  26. data/lib/cosmos/dart/lib/dart_common.rb +5 -6
  27. data/lib/cosmos/dart/lib/dart_database_cleaner.rb +56 -5
  28. data/lib/cosmos/dart/lib/dart_decom_query.rb +108 -6
  29. data/lib/cosmos/dart/lib/dart_decommutator.rb +81 -22
  30. data/lib/cosmos/dart/lib/dart_importer.rb +44 -14
  31. data/lib/cosmos/dart/lib/dart_packet_log_writer.rb +73 -55
  32. data/lib/cosmos/dart/lib/dart_reducer_manager.rb +34 -3
  33. data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +18 -7
  34. data/lib/cosmos/dart/processes/dart.rb +2 -1
  35. data/lib/cosmos/dart/processes/dart_decom_server.rb +2 -1
  36. data/lib/cosmos/dart/processes/dart_import.rb +1 -0
  37. data/lib/cosmos/dart/processes/dart_ingester.rb +1 -0
  38. data/lib/cosmos/dart/processes/dart_reducer.rb +1 -0
  39. data/lib/cosmos/dart/processes/dart_stream_server.rb +1 -0
  40. data/lib/cosmos/dart/processes/dart_util.rb +147 -0
  41. data/lib/cosmos/dart/processes/dart_worker.rb +1 -0
  42. data/lib/cosmos/dart/spec/dart/dart_database_cleaner_spec.rb +1 -1
  43. data/lib/cosmos/dart/spec/dart/dart_decom_query_spec.rb +1 -0
  44. data/lib/cosmos/dart/spec/dart/dart_decommutator_spec.rb +1 -0
  45. data/lib/cosmos/dart/spec/dart/dart_importer_spec.rb +1 -0
  46. data/lib/cosmos/dart/spec/dart/dart_packet_log_writer_spec.rb +39 -36
  47. data/lib/cosmos/dart/spec/dart/dart_reducer_manager_spec.rb +2 -1
  48. data/lib/cosmos/dart/spec/dart/dart_tcpip_server_interface_spec.rb +1 -2
  49. data/lib/cosmos/gui/widgets/dart_meta_frame.rb +13 -6
  50. data/lib/cosmos/interfaces.rb +1 -0
  51. data/lib/cosmos/interfaces/dart_status_interface.rb +91 -0
  52. data/lib/cosmos/interfaces/serial_interface.rb +5 -1
  53. data/lib/cosmos/io/json_drb.rb +7 -2
  54. data/lib/cosmos/io/json_drb_object.rb +11 -6
  55. data/lib/cosmos/io/json_rpc.rb +1 -0
  56. data/lib/cosmos/io/posix_serial_driver.rb +4 -2
  57. data/lib/cosmos/io/serial_driver.rb +8 -4
  58. data/lib/cosmos/io/win32_serial_driver.rb +4 -3
  59. data/lib/cosmos/packets/packet_config.rb +12 -2
  60. data/lib/cosmos/packets/structure_item.rb +1 -0
  61. data/lib/cosmos/script/extract.rb +4 -2
  62. data/lib/cosmos/streams/serial_stream.rb +10 -5
  63. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +15 -15
  64. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +1 -1
  65. data/lib/cosmos/tools/table_manager/table_manager.rb +6 -4
  66. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +5 -4
  67. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +1 -1
  68. data/lib/cosmos/top_level.rb +1 -1
  69. data/lib/cosmos/version.rb +4 -4
  70. data/spec/interfaces/serial_interface_spec.rb +13 -0
  71. data/spec/io/json_rpc_spec.rb +7 -0
  72. data/spec/io/win32_serial_driver_spec.rb +8 -0
  73. data/spec/packets/structure_item_spec.rb +6 -0
  74. data/spec/script/extract_spec.rb +5 -0
  75. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +10 -0
  76. metadata +17 -3
  77. data/lib/cosmos/dart/app/helpers/application_helper.rb +0 -2
@@ -12,6 +12,24 @@ require 'dart_common'
12
12
  require 'dart_logging'
13
13
  require 'packet_log_entry'
14
14
 
15
+ class DartDecommutatorStatus
16
+ attr_accessor :count
17
+ attr_accessor :error_count
18
+ attr_accessor :message
19
+ attr_accessor :message_time
20
+
21
+ def initialize
22
+ @count = 0
23
+ @error_count = 0
24
+ @message = ''
25
+ @message_time = Time.now
26
+ @cached_meta_ple = nil
27
+ @cached_system_meta = nil
28
+ @cached_system_meta_id = nil
29
+ @cached_system_config = nil
30
+ end
31
+ end
32
+
15
33
  class DartDecommutator
16
34
  include DartCommon
17
35
 
@@ -22,10 +40,12 @@ class DartDecommutator
22
40
  sync_targets_and_packets()
23
41
  @worker_id = worker_id
24
42
  @num_workers = num_workers
43
+ @status = DartDecommutatorStatus.new
25
44
  end
26
45
 
27
46
  # Run forever looking for data to decommutate
28
47
  def run
48
+ status_time = Time.now + 60.seconds
29
49
  while true
30
50
  time_start = Time.now # Remember start time so we can throttle
31
51
  # Get all entries that are ready and decommutation hasn't started
@@ -34,7 +54,6 @@ class DartDecommutator
34
54
  where("id % #{@num_workers} = #{@worker_id}").in_batches do |group|
35
55
  group.each do |ple|
36
56
  begin
37
- # TODO - Optimize and cache meta and system config and packet config lookup
38
57
  meta_ple = get_meta_ple(ple)
39
58
  next unless meta_ple
40
59
  system_meta = get_system_meta(ple, meta_ple)
@@ -48,12 +67,28 @@ class DartDecommutator
48
67
  # If we timeout this code will simply exit the application
49
68
  wait_for_ready_packet_config(packet_config)
50
69
  decom_packet(ple, packet, packet_config)
70
+
71
+ # Update status
72
+ if Time.now > status_time
73
+ status_time = Time.now + 60.seconds
74
+ status = Status.first
75
+ if (Time.now - @status.message_time) <= 60.0
76
+ status.decom_message = @status.message
77
+ status.decom_message_time = @status.message_time
78
+ status.save!
79
+ end
80
+ if @status.count > 0 or @status.error_count > 0
81
+ Status.update_counters(status.id, :decom_count => @status.count, :decom_error_count => @status.error_count)
82
+ @status.count = 0
83
+ @status.error_count = 0
84
+ end
85
+ end
51
86
  rescue => err
52
- Cosmos::Logger.error("PLE:#{ple.id}:ERROR")
53
- Cosmos::Logger.error(err.formatted)
87
+ handle_error("PLE:#{ple.id}:ERROR\n#{err.formatted}")
54
88
  end
55
89
  end # each ple
56
90
  end # batches
91
+
57
92
  # Throttle to no faster than 1 Hz
58
93
  delta = Time.now - time_start
59
94
  sleep(1 - delta) if delta < 1 && delta > 0
@@ -65,46 +100,61 @@ class DartDecommutator
65
100
  protected
66
101
 
67
102
  def get_meta_ple(ple)
103
+ return @cached_meta_ple if @cached_meta_ple and @cached_meta_ple.id == ple.meta_id
104
+
68
105
  if ple.meta_id != ple.id
69
- PacketLogEntry.find(ple.meta_id)
106
+ meta_ple = PacketLogEntry.find(ple.meta_id)
70
107
  else
71
- ple
108
+ meta_ple = ple
72
109
  end
110
+ @cached_meta_ple = meta_ple
111
+ return meta_ple
73
112
  rescue => err
74
113
  ple.decom_state = PacketLogEntry::NO_META_PLE
75
114
  ple.save!
76
- Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
115
+ handle_error("PLE:#{ple.id}:#{ple.decom_state_string}")
77
116
  nil
78
117
  end
79
118
 
80
119
  def get_system_meta(ple, meta_ple)
120
+ return @cached_system_meta if @cached_system_meta and @cached_system_meta_id == meta_ple.id
121
+
81
122
  system_meta = read_packet_from_ple(meta_ple)
82
- return system_meta if system_meta
123
+ if system_meta
124
+ @cached_system_meta_id = meta_ple.id
125
+ @cached_system_meta = system_meta
126
+ return system_meta
127
+ end
83
128
 
84
129
  ple.decom_state = PacketLogEntry::NO_META_PACKET
85
130
  ple.save!
86
- Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
131
+ handle_error("PLE:#{ple.id}:#{ple.decom_state_string}")
87
132
  nil
88
133
  end
89
134
 
90
135
  def get_system_config(ple, system_meta)
91
136
  system_config_name = system_meta.read("CONFIG")
92
- system_config = SystemConfig.where("name = ?", system_config_name).first
93
- unless system_config
94
- begin
95
- # Try to create a new SystemConfig since it didn't exist
96
- system_config = SystemConfig.create(:name => system_config_name)
97
- rescue
98
- # Another thread probably already created it - Try to get it one more time
99
- system_config = SystemConfig.where("name = ?", system_config_name).first
137
+ if @cached_system_config and @cached_system_config.name == system_config_name
138
+ system_config = @cached_system_config
139
+ else
140
+ system_config = SystemConfig.where("name = ?", system_config_name).first
141
+ unless system_config
142
+ begin
143
+ # Try to create a new SystemConfig since it didn't exist
144
+ system_config = SystemConfig.create(:name => system_config_name)
145
+ rescue
146
+ # Another thread probably already created it - Try to get it one more time
147
+ system_config = SystemConfig.where("name = ?", system_config_name).first
148
+ end
100
149
  end
101
150
  end
102
151
  unless system_config
103
152
  ple.decom_state = PacketLogEntry::NO_SYSTEM_CONFIG
104
153
  ple.save!
105
- Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
154
+ handle_error("PLE:#{ple.id}:#{ple.decom_state_string}")
106
155
  return nil
107
156
  end
157
+ @cached_system_config = system_config
108
158
 
109
159
  # Switch to this system_config
110
160
  begin
@@ -113,7 +163,7 @@ class DartDecommutator
113
163
  Cosmos::Logger.error("Could not load system_config: #{system_config_name}")
114
164
  ple.decom_state = PacketLogEntry::NO_CONFIG
115
165
  ple.save!
116
- Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
166
+ handle_error("PLE:#{ple.id}:#{ple.decom_state_string}")
117
167
  return nil
118
168
  end
119
169
  system_config
@@ -125,7 +175,7 @@ class DartDecommutator
125
175
 
126
176
  ple.decom_state = PacketLogEntry::NO_PACKET
127
177
  ple.save!
128
- Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
178
+ handle_error("PLE:#{ple.id}:#{ple.decom_state_string}")
129
179
  nil
130
180
  end
131
181
 
@@ -141,14 +191,14 @@ class DartDecommutator
141
191
  setup_packet_config(packet, packet_id, packet_config)
142
192
  Cosmos::Logger.info("Successfully Created PacketConfig: #{packet.config_name}")
143
193
  rescue => err
144
- Cosmos::Logger.error(err.formatted)
194
+ handle_error(err.formatted)
145
195
  # Another thread probably already created it - Try to get it one more time
146
196
  packet_config = PacketConfig.where("packet_id = ? and name = ?", packet_id, packet.config_name).first
147
197
  end
148
198
  unless packet_config
149
199
  ple.decom_state = PacketLogEntry::NO_PACKET_CONFIG
150
200
  ple.save!
151
- Cosmos::Logger.error("PLE:#{ple.id}:#{ple.decom_state_string}")
201
+ handle_error("PLE:#{ple.id}:#{ple.decom_state_string}")
152
202
  return nil
153
203
  end
154
204
  packet_config
@@ -167,7 +217,7 @@ class DartDecommutator
167
217
  packet_config.reload
168
218
 
169
219
  if (Time.now - ready_wait_start) > PACKET_CONFIG_READY_TIMEOUT
170
- Cosmos::Logger.fatal("Timeout waiting for ready on PacketConfig:#{packet_config.id}")
220
+ handle_error("Timeout waiting for ready on PacketConfig:#{packet_config.id}")
171
221
  exit(1)
172
222
  end
173
223
  end
@@ -211,6 +261,7 @@ class DartDecommutator
211
261
  row = model.new
212
262
  row.time = ple.time
213
263
  row.ple_id = ple.id
264
+ row.packet_log_id = ple.packet_log_id
214
265
  row.meta_id = ple.meta_id
215
266
  row.reduced_state = INITIALIZING
216
267
  table_values.each_with_index do |value, index|
@@ -230,6 +281,14 @@ class DartDecommutator
230
281
  # The log entry has been decommutated, mark COMPLETE
231
282
  ple.decom_state = PacketLogEntry::COMPLETE
232
283
  ple.save!
284
+ @status.count += 1
233
285
  Cosmos::Logger.debug("PLE:#{ple.id}:#{ple.decom_state_string}")
234
286
  end
287
+
288
+ def handle_error(message)
289
+ Cosmos::Logger.error(message)
290
+ @status.error_count += 1
291
+ @status.message = message
292
+ @status.message_time = Time.now
293
+ end
235
294
  end
@@ -80,10 +80,12 @@ class DartImporter
80
80
  Cosmos::Logger.info("First and Last Packet in File not in database")
81
81
 
82
82
  # Check if time range of packets is not present in database
83
- ple = PacketLogEntry.where("time >= ? or time <= ?", first_packet.received_time, last_packet.received_time).first
83
+ ple = PacketLogEntry.where("time >= ? and time <= ?", first_packet.received_time, last_packet.received_time).first
84
84
  if !ple # Can go fast if not present at all
85
85
  Cosmos::Logger.info(" Fast Import Enabled...")
86
86
  fast = true
87
+ else
88
+ Cosmos::Logger.warn("Time range already in database. Will verify each packet before adding")
87
89
  end
88
90
  else
89
91
  Cosmos::Logger.warn("File partially in database. Will verify each packet before adding")
@@ -97,6 +99,8 @@ class DartImporter
97
99
  # Read File and Create PacketLogEntries
98
100
  count = 0
99
101
  meta_id = nil
102
+ ple_data = ""
103
+ ple_data_count = 0
100
104
  plr.open(filename)
101
105
  data_offset = plr.bytes_read
102
106
  plr.each(filename) do |packet|
@@ -117,27 +121,39 @@ class DartImporter
117
121
 
118
122
  # No PacketLogEntry was found so create one from scratch
119
123
  unless ple
120
- ple = PacketLogEntry.new
121
- ple.target_id = target_id
122
- ple.packet_id = packet_id
123
- ple.time = packet.received_time
124
- ple.packet_log_id = packet_log.id
125
- ple.data_offset = data_offset
126
- ple.meta_id = meta_id
127
- ple.is_tlm = is_tlm
128
- ple.ready = true
129
- ple.save!
130
- count += 1
131
-
132
124
  # SYSTEM META packets are special in that their meta_id is their own
133
125
  # PacketLogEntry ID from the database. All other packets have meta_id
134
126
  # values which point back to the last SYSTEM META PacketLogEntry ID.
135
127
  if target_name == 'SYSTEM'.freeze and packet_name == 'META'.freeze
128
+ if ple_data.length > 0
129
+ ActiveRecord::Base.connection.execute("INSERT INTO packet_log_entries (target_id, packet_id, time, packet_log_id, data_offset, meta_id, is_tlm, ready) VALUES #{ple_data}")
130
+ ple_data.clear
131
+ ple_data_count = 0
132
+ end
133
+
134
+ ple = PacketLogEntry.new
135
+ ple.target_id = target_id
136
+ ple.packet_id = packet_id
137
+ ple.time = packet.received_time
138
+ ple.packet_log_id = packet_log.id
139
+ ple.data_offset = data_offset
140
+ ple.meta_id = meta_id
141
+ ple.is_tlm = is_tlm
142
+ ple.ready = false
143
+ ple.save!(validate: false)
144
+
136
145
  # Need to update meta_id for this and all subsequent packets
137
146
  meta_id = ple.id
138
147
  ple.meta_id = meta_id
139
- ple.save!
148
+ ple.ready = true
149
+ ple.save!(validate: false)
150
+ else
151
+ ple_data << "," if ple_data.length > 0
152
+ ple_data << "(#{target_id},#{packet_id},'#{packet.received_time.dup.utc.iso8601(6)}',#{packet_log.id},#{data_offset},#{meta_id},#{is_tlm},true)"
153
+ ple_data_count += 1
140
154
  end
155
+
156
+ count += 1
141
157
  else # A PacketLogEntry was found so this packet is skipped
142
158
  # If the packet is a SYSTEM META packet we keep track of the meta_id
143
159
  # for use in subsequent packets that aren't already in the database.
@@ -146,8 +162,22 @@ class DartImporter
146
162
  meta_id = ple.id
147
163
  end
148
164
  end
165
+
166
+ if ple_data_count >= 1000
167
+ ActiveRecord::Base.connection.execute("INSERT INTO packet_log_entries (target_id, packet_id, time, packet_log_id, data_offset, meta_id, is_tlm, ready) VALUES #{ple_data}")
168
+ ple_data.clear
169
+ ple_data_count = 0
170
+ end
171
+
149
172
  data_offset = plr.bytes_read
150
173
  end
174
+
175
+ if ple_data.length > 0
176
+ ActiveRecord::Base.connection.execute("INSERT INTO packet_log_entries (target_id, packet_id, time, packet_log_id, data_offset, meta_id, is_tlm, ready) VALUES #{ple_data}")
177
+ ple_data.clear
178
+ ple_data_count = 0
179
+ end
180
+
151
181
  Cosmos::Logger.info("Added #{count} packet log entries to database")
152
182
  return 0 # Success code
153
183
  end
@@ -29,7 +29,13 @@ class DartPacketLogWriter < Cosmos::PacketLogWriter
29
29
  @db_queue = Queue.new
30
30
  @sync_count = 0
31
31
  @sync_count_limit = DEFAULT_SYNC_COUNT_LIMIT
32
- @not_ready_ple_ids = []
32
+ @ple_data = ""
33
+ @sync_ple = nil
34
+ if @log_type == :TLM
35
+ @is_tlm = true
36
+ else
37
+ @is_tlm = false
38
+ end
33
39
 
34
40
  sync_targets_and_packets()
35
41
 
@@ -42,6 +48,13 @@ class DartPacketLogWriter < Cosmos::PacketLogWriter
42
48
  def shutdown
43
49
  super()
44
50
  Cosmos.kill_thread(self, @db_thread)
51
+ handle_sync_ple()
52
+ queue_ple_data()
53
+ while @db_queue.length > 0
54
+ ple_data = @db_queue.pop
55
+ break if ple_data.nil?
56
+ ActiveRecord::Base.connection.execute("INSERT INTO packet_log_entries (target_id, packet_id, time, packet_log_id, data_offset, meta_id, is_tlm, ready) VALUES #{ple_data}")
57
+ end
45
58
  end
46
59
 
47
60
  # Kick the database update thread to allow it to quit
@@ -54,33 +67,75 @@ class DartPacketLogWriter < Cosmos::PacketLogWriter
54
67
 
55
68
  # Override the default new file hook to create a PacketLog entry in the database
56
69
  def start_new_file_hook(packet)
57
- # When we create a new file we mark any existing PLEs ready
58
- PacketLogEntry.where("id" => @not_ready_ple_ids).update_all(ready: true)
59
- @not_ready_ple_ids.clear
60
- @sync_count = 0
70
+ # When we create a new file we write out any queued ple_data
71
+ if @ple_data.length > 0
72
+ @db_queue << @ple_data.clone
73
+ @ple_data.clear
74
+ @sync_count = 0
75
+ end
61
76
 
62
77
  packet_log = PacketLog.new
63
78
  packet_log.filename = @filename.clone
64
- if @log_type == :TLM
65
- packet_log.is_tlm = true
66
- else
67
- packet_log.is_tlm = false
68
- end
79
+ packet_log.is_tlm = @is_tlm
69
80
  packet_log.save!
70
81
  @packet_log_id = packet_log.id
71
82
  super(packet)
72
83
  end
73
84
 
85
+ def queue_ple_data
86
+ if @ple_data.length > 0
87
+ @db_queue << @ple_data.clone
88
+ @ple_data.clear
89
+ @sync_count = 0
90
+ end
91
+ end
92
+
93
+ def handle_sync_ple
94
+ if @sync_ple
95
+ @file.fsync if @file
96
+ @sync_ple.ready = true
97
+ @sync_ple.save!
98
+ @sync_ple = nil
99
+ queue_ple_data()
100
+ end
101
+ end
102
+
74
103
  # Override the default pre write hook to pop a message on the queue which
75
104
  # will be processed by the database thread. This also writes out the log
76
105
  # files to disk periodically for use by other DART processes.
77
106
  def pre_write_entry_hook(packet)
78
- @sync_count += 1
79
- if @sync_count > @sync_count_limit
80
- @file.fsync
81
- @sync_count = 0
107
+ handle_sync_ple()
108
+
109
+ # SYSTEM META packets are special in that their meta_id is their own
110
+ # PacketLogEntry ID from the database. All other packets have meta_id
111
+ # values which point back to the last SYSTEM META PacketLogEntry ID.
112
+ target_id, packet_id = lookup_target_and_packet_id(packet.target_name, packet.packet_name, @is_tlm)
113
+ if packet.target_name == 'SYSTEM'.freeze and packet.packet_name == 'META'.freeze
114
+ ple = PacketLogEntry.new
115
+ ple.target_id = target_id
116
+ ple.packet_id = packet_id
117
+ ple.time = packet.received_time
118
+ ple.packet_log_id = @packet_log_id
119
+ ple.data_offset = @file_size
120
+ ple.meta_id = @meta_id
121
+ ple.is_tlm = @is_tlm
122
+ ple.ready = false
123
+ ple.save!
124
+ @meta_id = ple.id
125
+ ple.meta_id = @meta_id
126
+ ple.save!
127
+ @sync_ple = ple
128
+ else
129
+ @sync_count += 1
130
+ if @sync_count > @sync_count_limit
131
+ @file.fsync
132
+ @db_queue << @ple_data.clone
133
+ @ple_data.clear
134
+ @sync_count = 0
135
+ end
136
+ @ple_data << "," if @ple_data.length > 0
137
+ @ple_data << "(#{target_id},#{packet_id},'#{packet.received_time.dup.utc.iso8601(6)}',#{@packet_log_id},#{@file_size},#{@meta_id},#{@is_tlm},true)"
82
138
  end
83
- @db_queue << [packet.target_name, packet.packet_name, packet.received_time, @file_size, @packet_log_id, @sync_count]
84
139
  end
85
140
 
86
141
  # Build the target / packet table lookup table and then wait on the queue
@@ -88,52 +143,15 @@ class DartPacketLogWriter < Cosmos::PacketLogWriter
88
143
  # PacketLogEntry table. Each entry identifies a packet in the log file by
89
144
  # its target, packet, time, and data offset (among other things).
90
145
  def db_thread_body
91
- if @log_type == :TLM
92
- is_tlm = true
93
- else
94
- is_tlm = false
95
- end
96
-
97
146
  while true
98
147
  begin
99
- target_name, packet_name, time, data_offset, packet_log_id, sync_count = @db_queue.pop
100
- # Every time the sync_count resets by the pre_write_entry_hook the file
101
- # is written out to disk. Thus we mark all the PacketLogEntrys to ready
102
- # since we know the packets have been written to disk.
103
- if sync_count == 0 or sync_count.nil?
104
- PacketLogEntry.where("id" => @not_ready_ple_ids).update_all(ready: true)
105
- @not_ready_ple_ids.clear
106
- end
107
- return if @cancel_threads or sync_count.nil?
148
+ ple_data = @db_queue.pop
149
+ return if @cancel_threads or ple_data.nil?
150
+ ActiveRecord::Base.connection.execute("INSERT INTO packet_log_entries (target_id, packet_id, time, packet_log_id, data_offset, meta_id, is_tlm, ready) VALUES #{ple_data}")
108
151
  rescue ThreadError
109
152
  # This can happen when the thread is killed
110
153
  return
111
154
  end
112
-
113
- target_id, packet_id = lookup_target_and_packet_id(target_name, packet_name, is_tlm)
114
-
115
- ple = PacketLogEntry.new
116
- ple.target_id = target_id
117
- ple.packet_id = packet_id
118
- ple.time = time
119
- ple.packet_log_id = packet_log_id
120
- ple.data_offset = data_offset
121
- ple.meta_id = @meta_id
122
- ple.is_tlm = is_tlm
123
- ple.ready = false
124
- ple.save!
125
-
126
- # SYSTEM META packets are special in that their meta_id is their own
127
- # PacketLogEntry ID from the database. All other packets have meta_id
128
- # values which point back to the last SYSTEM META PacketLogEntry ID.
129
- if target_name == 'SYSTEM'.freeze and packet_name == 'META'.freeze
130
- # Need to update meta_id for this and all subsequent packets
131
- @meta_id = ple.id
132
- ple.meta_id = @meta_id
133
- ple.save!
134
- end
135
- # Remember this new PacketLogEntry so we can mark it ready later
136
- @not_ready_ple_ids << ple.id
137
155
  end
138
156
  end
139
157
  end