cosmos 3.4.2 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (261) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +69 -11
  3. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +23 -0
  4. data/autohotkey/tools/TestRunnerAHK5 +17 -0
  5. data/autohotkey/tools/TestRunnerAHK6 +17 -0
  6. data/autohotkey/tools/cmd_extractor.ahk +6 -0
  7. data/autohotkey/tools/data_viewer.ahk +6 -0
  8. data/autohotkey/tools/limits_monitor.ahk +67 -14
  9. data/autohotkey/tools/replay.ahk +6 -0
  10. data/autohotkey/tools/test_runner5.ahk +8 -0
  11. data/autohotkey/tools/test_runner6.ahk +5 -0
  12. data/autohotkey/tools/tlm_extractor.ahk +25 -1
  13. data/autohotkey/tools/tlm_grapher.ahk +6 -0
  14. data/cosmos.gemspec +19 -19
  15. data/data/crc.txt +46 -46
  16. data/data/critical.wav +0 -0
  17. data/data/information.wav +0 -0
  18. data/data/input.wav +0 -0
  19. data/data/message.wav +0 -0
  20. data/data/question.wav +0 -0
  21. data/data/warning.wav +0 -0
  22. data/demo/Gemfile +5 -1
  23. data/demo/Launcher +5 -4
  24. data/demo/Launcher.bat +6 -56
  25. data/demo/config/data/crc.txt +73 -55
  26. data/demo/config/system/system.txt +1 -0
  27. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +2 -0
  28. data/demo/procedures/example_test.rb +17 -16
  29. data/demo/tools/CmdExtractor +6 -5
  30. data/demo/tools/CmdExtractor.bat +6 -56
  31. data/demo/tools/CmdSender +6 -5
  32. data/demo/tools/CmdSender.bat +6 -56
  33. data/demo/tools/CmdTlmServer +6 -5
  34. data/demo/tools/CmdTlmServer.bat +6 -56
  35. data/demo/tools/DataViewer +6 -5
  36. data/demo/tools/DataViewer.bat +6 -56
  37. data/demo/tools/ExampleTarget +6 -5
  38. data/demo/tools/ExampleTarget.bat +6 -56
  39. data/demo/tools/HandbookCreator +6 -5
  40. data/demo/tools/HandbookCreator.bat +6 -58
  41. data/demo/tools/Launcher +6 -5
  42. data/demo/tools/Launcher.bat +6 -56
  43. data/demo/tools/LimitsMonitor +6 -5
  44. data/demo/tools/LimitsMonitor.bat +6 -56
  45. data/demo/tools/OpenGLBuilder +6 -5
  46. data/demo/tools/OpenGLBuilder.bat +6 -56
  47. data/demo/tools/PacketViewer +6 -5
  48. data/demo/tools/PacketViewer.bat +6 -56
  49. data/demo/tools/Replay +6 -5
  50. data/demo/tools/Replay.bat +6 -56
  51. data/demo/tools/ScpiTarget +6 -5
  52. data/demo/tools/ScpiTarget.bat +6 -56
  53. data/demo/tools/ScriptRunner +6 -5
  54. data/demo/tools/ScriptRunner.bat +6 -56
  55. data/demo/tools/TableManager +6 -5
  56. data/demo/tools/TableManager.bat +6 -56
  57. data/demo/tools/TestRunner +6 -5
  58. data/demo/tools/TestRunner.bat +6 -56
  59. data/demo/tools/TlmExtractor +6 -5
  60. data/demo/tools/TlmExtractor.bat +6 -56
  61. data/demo/tools/TlmGrapher +6 -5
  62. data/demo/tools/TlmGrapher.bat +6 -56
  63. data/demo/tools/TlmViewer +6 -5
  64. data/demo/tools/TlmViewer.bat +6 -56
  65. data/demo/tools/ToolLaunch.bat +63 -0
  66. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +6 -5
  67. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  68. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +6 -5
  69. data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -0
  70. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +6 -5
  71. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -0
  72. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +6 -5
  73. data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  74. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +6 -5
  75. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -0
  76. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +6 -5
  77. data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -0
  78. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +6 -5
  79. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -0
  80. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +6 -5
  81. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -0
  82. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +6 -5
  83. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  84. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +6 -5
  85. data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -0
  86. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +6 -5
  87. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  88. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +6 -5
  89. data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -0
  90. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +6 -5
  91. data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  92. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +6 -5
  93. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  94. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +6 -5
  95. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -0
  96. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +6 -5
  97. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  98. data/demo/tools/tool_launch.rb +38 -0
  99. data/install/Gemfile +5 -1
  100. data/install/Launcher +5 -3
  101. data/install/Launcher.bat +6 -56
  102. data/install/config/data/crc.txt +67 -49
  103. data/install/config/tools/launcher/launcher.txt +1 -0
  104. data/install/tools/CmdExtractor +6 -5
  105. data/install/tools/CmdExtractor.bat +6 -56
  106. data/install/tools/CmdSender +6 -5
  107. data/install/tools/CmdSender.bat +6 -56
  108. data/install/tools/CmdTlmServer +6 -5
  109. data/install/tools/CmdTlmServer.bat +6 -56
  110. data/install/tools/DataViewer +6 -5
  111. data/install/tools/DataViewer.bat +6 -56
  112. data/install/tools/HandbookCreator +6 -5
  113. data/install/tools/HandbookCreator.bat +6 -58
  114. data/install/tools/Launcher +6 -5
  115. data/install/tools/Launcher.bat +6 -56
  116. data/install/tools/LimitsMonitor +6 -5
  117. data/install/tools/LimitsMonitor.bat +6 -56
  118. data/install/tools/OpenGLBuilder +6 -5
  119. data/install/tools/OpenGLBuilder.bat +6 -56
  120. data/install/tools/PacketViewer +6 -5
  121. data/install/tools/PacketViewer.bat +6 -56
  122. data/install/tools/Replay +6 -5
  123. data/install/tools/Replay.bat +6 -56
  124. data/install/tools/ScriptRunner +6 -5
  125. data/install/tools/ScriptRunner.bat +6 -56
  126. data/install/tools/TableManager +6 -5
  127. data/install/tools/TableManager.bat +6 -56
  128. data/install/tools/TestRunner +6 -5
  129. data/install/tools/TestRunner.bat +6 -56
  130. data/install/tools/TlmExtractor +6 -5
  131. data/install/tools/TlmExtractor.bat +6 -56
  132. data/install/tools/TlmGrapher +6 -5
  133. data/install/tools/TlmGrapher.bat +6 -56
  134. data/install/tools/TlmViewer +6 -5
  135. data/install/tools/TlmViewer.bat +6 -56
  136. data/install/tools/ToolLaunch.bat +63 -0
  137. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +6 -5
  138. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  139. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +6 -5
  140. data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -0
  141. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +6 -5
  142. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -0
  143. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +6 -5
  144. data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  145. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +6 -5
  146. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -0
  147. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +6 -5
  148. data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -0
  149. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +6 -5
  150. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -0
  151. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +6 -5
  152. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -0
  153. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +6 -5
  154. data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  155. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +6 -5
  156. data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -0
  157. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +6 -5
  158. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  159. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +6 -5
  160. data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -0
  161. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +6 -5
  162. data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  163. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +6 -5
  164. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  165. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +6 -5
  166. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -0
  167. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +6 -5
  168. data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  169. data/install/tools/tool_launch.rb +38 -0
  170. data/lib/cosmos/core_ext/string.rb +3 -2
  171. data/lib/cosmos/gui/dialogs/about_dialog.rb +3 -7
  172. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +200 -136
  173. data/lib/cosmos/gui/opengl/gl_viewer.rb +8 -8
  174. data/lib/cosmos/gui/qt.rb +56 -27
  175. data/lib/cosmos/gui/qt_tool.rb +3 -1
  176. data/lib/cosmos/gui/text/ruby_editor.rb +130 -110
  177. data/lib/cosmos/gui/utilities/script_module_gui.rb +150 -4
  178. data/lib/cosmos/io/json_drb.rb +1 -1
  179. data/lib/cosmos/io/win32_serial_driver.rb +2 -4
  180. data/lib/cosmos/packet_logs/ccsds_log_reader.rb +1 -0
  181. data/lib/cosmos/packet_logs/packet_log_reader.rb +13 -4
  182. data/lib/cosmos/packets/limits.rb +6 -3
  183. data/lib/cosmos/packets/telemetry.rb +34 -3
  184. data/lib/cosmos/processors/new_packet_log_processor.rb +1 -1
  185. data/lib/cosmos/script/commands.rb +20 -2
  186. data/lib/cosmos/script/extract.rb +11 -3
  187. data/lib/cosmos/script/limits.rb +6 -0
  188. data/lib/cosmos/script/scripting.rb +17 -9
  189. data/lib/cosmos/system/system.rb +73 -17
  190. data/lib/cosmos/system/target.rb +10 -5
  191. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +1 -0
  192. data/lib/cosmos/tools/cmd_tlm_server/api.rb +95 -0
  193. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +8 -4
  194. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +55 -0
  195. data/lib/cosmos/tools/data_viewer/data_viewer.rb +5 -12
  196. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +14 -48
  197. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +1 -5
  198. data/lib/cosmos/tools/launcher/launcher.rb +4 -0
  199. data/lib/cosmos/tools/launcher/launcher_config.rb +50 -0
  200. data/lib/cosmos/tools/launcher/launcher_tool.rb +21 -9
  201. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +607 -566
  202. data/lib/cosmos/tools/replay/replay.rb +51 -45
  203. data/lib/cosmos/tools/script_runner/script_runner.rb +13 -5
  204. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +8 -109
  205. data/lib/cosmos/tools/test_runner/test.rb +65 -6
  206. data/lib/cosmos/tools/test_runner/test_runner.rb +4 -4
  207. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +5 -0
  208. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +3 -0
  209. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +3 -2
  210. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +9 -6
  211. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +1 -5
  212. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +1 -5
  213. data/lib/cosmos/top_level.rb +86 -3
  214. data/lib/cosmos/version.rb +5 -5
  215. data/lib/cosmos/win32/win32_main.rb +7 -1
  216. data/spec/packet_logs/packet_log_reader_spec.rb +67 -7
  217. data/spec/packets/limits_spec.rb +19 -1
  218. data/spec/packets/telemetry_spec.rb +44 -1
  219. data/spec/script/commands_spec.rb +14 -0
  220. data/spec/script/scripting_spec.rb +5 -1
  221. data/spec/script/telemetry_spec.rb +38 -3
  222. data/spec/system/system_spec.rb +24 -4
  223. data/spec/tools/cmd_tlm_server/api_spec.rb +30 -0
  224. data/test/benchmarks/gsub_benchmark.rb +42 -4
  225. data/test/benchmarks/is_a_benchmark.rb +34 -0
  226. data/test/performance/config/data/crc.txt +161 -171
  227. data/test/performance/config/system/system_packets.txt +10 -10
  228. data/test/performance/config/system/system_threads.txt +30 -30
  229. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +7 -2
  230. data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -0
  231. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -0
  232. data/test/performance/config/targets/{EXAMPLE → PACKET}/cmd_tlm_server.txt +2 -2
  233. data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -0
  234. data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -0
  235. data/test/performance/config/targets/PACKET/screens/status.txt +25 -0
  236. data/test/performance/config/targets/PACKET/target.txt +28 -0
  237. data/test/performance/config/targets/{EXAMPLE/cmd_tlm/example_cmds.txt → THREAD/cmd_tlm/thread_cmds.txt} +1 -1
  238. data/test/performance/config/targets/{EXAMPLE/cmd_tlm/example_tlm.txt → THREAD/cmd_tlm/thread_tlm.txt} +1 -1
  239. data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -0
  240. data/test/performance/config/targets/{EXAMPLE/lib/example_interface.rb → THREAD/lib/thread_interface.rb} +1 -1
  241. data/test/performance/config/targets/THREAD/screens/status.txt +25 -0
  242. data/test/performance/config/targets/{EXAMPLE → THREAD}/target.txt +0 -0
  243. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +24 -30
  244. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +31 -31
  245. data/test/performance/config/tools/launcher/launcher_packets.txt +16 -11
  246. data/test/performance/config/tools/launcher/launcher_threads.txt +41 -35
  247. data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -0
  248. data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +10 -38
  249. data/test/performance/lib/packet_target.rb +126 -0
  250. data/test/performance/lib/{example_target.rb → thread_target.rb} +9 -9
  251. data/test/performance/tools/CmdTlmServerMemProf +1 -1
  252. data/test/performance/tools/{ExampleTarget → PacketTarget} +2 -2
  253. data/test/performance/tools/{ExampleTarget.bat → PacketTarget.bat} +0 -0
  254. data/test/performance/tools/ThreadTarget +14 -0
  255. data/test/performance/tools/ThreadTarget.bat +59 -0
  256. data/test/performance/tools/TlmGrapherMemProf +1 -1
  257. data/test/performance/tools/TlmViewerMemProf +19 -0
  258. data/{autohotkey/tools/Replay.bat → test/performance/tools/TlmViewerMemProf.bat} +1 -1
  259. metadata +107 -55
  260. data/test/performance/lib/example_background_task.rb +0 -57
  261. data/test/performance/lib/scpi_target.rb +0 -74
@@ -17,6 +17,7 @@ require 'cosmos/system/target'
17
17
  require 'cosmos/packet_logs'
18
18
  require 'fileutils'
19
19
  require 'drb/acl'
20
+ require 'bundler'
20
21
 
21
22
  module Cosmos
22
23
 
@@ -39,6 +40,8 @@ module Cosmos
39
40
  instance_attr_reader :default_packet_log_writer
40
41
  # @return [PacketLogReader] Class used to read log files
41
42
  instance_attr_reader :default_packet_log_reader
43
+ # @return [Boolean] Whether to use sound for alerts
44
+ instance_attr_reader :sound
42
45
  # @return [Boolean] Whether to use DNS to lookup IP addresses or not
43
46
  instance_attr_reader :use_dns
44
47
  # @return [String] Stores the initial configuration file used when this
@@ -81,7 +84,8 @@ module Cosmos
81
84
  @cmd_tlm_version = nil
82
85
  @default_packet_log_writer = PacketLogWriter
83
86
  @default_packet_log_reader = PacketLogReader
84
- @use_dns = true
87
+ @sound = false
88
+ @use_dns = false
85
89
  @acl = nil
86
90
  @staleness_seconds = 30
87
91
  @limits_set = :DEFAULT
@@ -222,7 +226,7 @@ module Cosmos
222
226
  # First pass - Everything except targets
223
227
  parser.parse_file(filename) do |keyword, parameters|
224
228
  case keyword
225
- when 'AUTO_DECLARE_TARGETS', 'DECLARE_TARGET'
229
+ when 'AUTO_DECLARE_TARGETS', 'DECLARE_TARGET', 'DECLARE_GEM_TARGET'
226
230
  # Will be handled by second pass
227
231
 
228
232
  when 'PORT'
@@ -267,11 +271,21 @@ module Cosmos
267
271
  parser.verify_num_parameters(1, 1, usage)
268
272
  @default_packet_log_reader = Cosmos.require_class(parameters[0])
269
273
 
274
+ when 'ENABLE_SOUND'
275
+ usage = "#{keyword}"
276
+ parser.verify_num_parameters(0, 0, usage)
277
+ @sound = true
278
+
270
279
  when 'DISABLE_DNS'
271
280
  usage = "#{keyword}"
272
281
  parser.verify_num_parameters(0, 0, usage)
273
282
  @use_dns = false
274
283
 
284
+ when 'ENABLE_DNS'
285
+ usage = "#{keyword}"
286
+ parser.verify_num_parameters(0, 0, usage)
287
+ @use_dns = true
288
+
275
289
  when 'ALLOW_ACCESS'
276
290
  parser.verify_num_parameters(1, 1, "#{keyword} <IP Address or Hostname>")
277
291
  begin
@@ -364,6 +378,9 @@ module Cosmos
364
378
  end
365
379
  end
366
380
  end
381
+
382
+ auto_detect_gem_based_targets()
383
+
367
384
  if system_found
368
385
  target = Target.new('SYSTEM')
369
386
  @targets[target.name] = target
@@ -386,6 +403,19 @@ module Cosmos
386
403
  end
387
404
  target = Target.new(target_name, substitute_name, configuration_directory, ConfigParser.handle_nil(parameters[2]))
388
405
  @targets[target.name] = target
406
+
407
+ when 'DECLARE_GEM_TARGET'
408
+ usage = "#{keyword} <GEM NAME> <SUBSTITUTE TARGET NAME (Optional)> <TARGET FILENAME (Optional - defaults to target.txt)>"
409
+ parser.verify_num_parameters(1, 3, usage)
410
+ # Remove 'cosmos' from the gem name 'cosmos-power-supply'
411
+ target_name = parameters[0].split('-')[1..-1].join('-').to_s.upcase
412
+ substitute_name = nil
413
+ substitute_name = ConfigParser.handle_nil(parameters[1])
414
+ substitute_name.to_s.upcase if substitute_name
415
+ gem_dir = Gem::Specification.find_by_name(parameters[0]).gem_dir
416
+ target = Target.new(target_name, substitute_name, configuration_directory, ConfigParser.handle_nil(parameters[2]), gem_dir)
417
+ @targets[target.name] = target
418
+
389
419
  end # case keyword
390
420
  end # parser.parse_file
391
421
  end
@@ -396,7 +426,7 @@ module Cosmos
396
426
  #
397
427
  # @param name [String] MD5 string which identifies the
398
428
  # configuration. Pass nil to load the default configuration.
399
- # @return [String] The actual configuration loaded
429
+ # @return [String, Exception/nil] The actual configuration loaded
400
430
  def load_configuration(name = nil)
401
431
  if name and @config
402
432
  # Make sure they're requesting something other than the current
@@ -412,24 +442,27 @@ module Cosmos
412
442
  if configuration_directory
413
443
  # We found the configuration requested. Reprocess the system.txt
414
444
  # and reload the packets
415
- process_file(File.join(configuration_directory, 'system.txt'), configuration_directory)
416
- load_packets()
445
+ begin
446
+ process_file(File.join(configuration_directory, 'system.txt'), configuration_directory)
447
+ load_packets(name)
448
+ rescue Exception => error
449
+ # Failed to load - Restore initial
450
+ update_config(@initial_config)
451
+ return @config.name, error
452
+ end
417
453
  else
418
454
  # We couldn't find the configuration request. Reload the
419
455
  # initial configuration
420
456
  update_config(@initial_config)
421
457
  end
422
458
  end
423
- @telemetry.reset
424
459
  end
425
460
  else
426
461
  # Ensure packets have been lazy loaded
427
- System.commands()
428
- current_config = @config
429
- @config = @initial_config
430
- @telemetry.reset if current_config != @initial_config
462
+ System.commands
463
+ update_config(@initial_config)
431
464
  end
432
- return @config.name
465
+ return @config.name, nil
433
466
  end
434
467
 
435
468
  # (see #load_configuration)
@@ -439,7 +472,24 @@ module Cosmos
439
472
 
440
473
  protected
441
474
 
475
+ def auto_detect_gem_based_targets
476
+ Bundler.load.specs.each do |spec|
477
+ spec_name_split = spec.name.split('-')
478
+ if spec_name_split.length > 1 and spec_name_split[0] == 'cosmos'
479
+ # Filter to just targets and not tools and other extensions
480
+ if File.exist?(File.join(spec.gem_dir, 'cmd_tlm'))
481
+ target_name = spec_name_split[1..-1].join('-').to_s.upcase
482
+ target = Target.new(target_name, nil, nil, nil, spec.gem_dir)
483
+ @targets[target.name] = target
484
+ end
485
+ end
486
+ end
487
+ rescue Bundler::GemfileNotFound
488
+ # No Gemfile - so no gem based targets
489
+ end
490
+
442
491
  def update_config(config)
492
+ current_config = @config
443
493
  unless @config
444
494
  @config = config
445
495
  @commands = Commands.new(config)
@@ -451,6 +501,7 @@ module Cosmos
451
501
  @telemetry.config = config
452
502
  @limits.config = config
453
503
  end
504
+ @telemetry.reset if current_config != config
454
505
  end
455
506
 
456
507
  def find_configuration(name)
@@ -476,10 +527,9 @@ module Cosmos
476
527
 
477
528
  # Copy target files into directory
478
529
  @targets.each do |target_name, target|
479
- source_dir = File.join(USERPATH, 'config', 'targets', target.original_name)
480
530
  destination_dir = File.join(configuration_directory, target.original_name)
481
531
  unless Dir.exist?(destination_dir)
482
- FileUtils.cp_r(source_dir, destination_dir)
532
+ FileUtils.cp_r(target.dir, destination_dir)
483
533
  end
484
534
  end
485
535
 
@@ -502,9 +552,9 @@ module Cosmos
502
552
  end
503
553
  end
504
554
 
505
- def load_packets
555
+ def load_packets(configuration_name = nil)
506
556
  # Determine MD5 over all targets cmd_tlm files
507
- cmd_tlm_files = [System.initial_filename]
557
+ cmd_tlm_files = []
508
558
  additional_data = ''
509
559
  @targets.each do |target_name, target|
510
560
  cmd_tlm_files << target.filename if File.exist?(target.filename)
@@ -516,6 +566,7 @@ module Cosmos
516
566
  additional_data << target.original_name
517
567
  end
518
568
  end
569
+
519
570
  md5 = Cosmos.md5_files(cmd_tlm_files, additional_data)
520
571
  md5_string = md5.hexdigest
521
572
 
@@ -526,6 +577,8 @@ module Cosmos
526
577
  config = Cosmos.marshal_load(marshal_filename)
527
578
  if config
528
579
  update_config(config)
580
+ @config.name = configuration_name if configuration_name
581
+
529
582
  # Marshal file load successful
530
583
  Logger.info "Marshal load success: #{marshal_filename}"
531
584
  @config.warnings.each {|warning| Logger.warn(warning)} if @config.warnings
@@ -548,11 +601,14 @@ module Cosmos
548
601
  end
549
602
 
550
603
  # Create marshal file for next time
551
- @config.name = md5_string
604
+ if configuration_name
605
+ @config.name = configuration_name
606
+ else
607
+ @config.name = md5_string
608
+ end
552
609
  Cosmos.marshal_dump(marshal_filename, @config)
553
610
  end
554
611
 
555
- # Save configuration
556
612
  @initial_config = @config unless @initial_config
557
613
  save_configuration()
558
614
  end
@@ -79,7 +79,8 @@ module Cosmos
79
79
  # path to the default of <USERPATH>/config/targets.
80
80
  # @param target_filename [String] Configuration file for the target. Normally
81
81
  # target.txt
82
- def initialize(target_name, substitute_name = nil, path = nil, target_filename = nil)
82
+ # @param gem_path [String] Path to the gem file or nil if there is no gem
83
+ def initialize(target_name, substitute_name = nil, path = nil, target_filename = nil, gem_path = nil)
83
84
  @requires = []
84
85
  @ignored_parameters = []
85
86
  @ignored_items = []
@@ -100,7 +101,7 @@ module Cosmos
100
101
  @name = @original_name
101
102
  end
102
103
 
103
- @dir = get_target_dir(path, @original_name)
104
+ @dir = get_target_dir(path, @original_name, gem_path)
104
105
  # Parse the target.txt file if it exists
105
106
  @filename = process_target_config_file(@dir, @name, target_filename)
106
107
  # If target.txt didn't specify specific cmd/tlm files then add everything
@@ -156,9 +157,13 @@ module Cosmos
156
157
 
157
158
  # Get the target directory and add the target's lib folder to the
158
159
  # search path if it exists
159
- def get_target_dir(path, name)
160
- path = File.join(USERPATH,'config','targets') unless path
161
- dir = File.join(path, name)
160
+ def get_target_dir(path, name, gem_path)
161
+ if gem_path
162
+ dir = gem_path
163
+ else
164
+ path = File.join(USERPATH,'config','targets') unless path
165
+ dir = File.join(path, name)
166
+ end
162
167
  lib_dir = File.join(dir, 'lib')
163
168
  Cosmos.add_to_search_path(lib_dir, false) if File.exist?(lib_dir)
164
169
  dir
@@ -170,6 +170,7 @@ module Cosmos
170
170
  @input_filenames.each do |log_file|
171
171
  break if @cancel
172
172
  begin
173
+ Cosmos.check_log_configuration(@packet_log_reader, log_file)
173
174
  file_size = File.size(log_file).to_f
174
175
  progress_dialog.append_text("Processing File #{log_file_count}/#{@input_filenames.length}: #{log_file}")
175
176
  progress_dialog.set_step_progress(0.0)
@@ -31,6 +31,8 @@ module Cosmos
31
31
  'get_cmd_list',
32
32
  'get_cmd_param_list',
33
33
  'get_cmd_hazardous',
34
+ 'get_cmd_value',
35
+ 'get_cmd_time',
34
36
  'tlm',
35
37
  'tlm_raw',
36
38
  'tlm_formatted',
@@ -48,6 +50,7 @@ module Cosmos
48
50
  'limits_enabled?',
49
51
  'enable_limits',
50
52
  'disable_limits',
53
+ 'get_stale',
51
54
  'get_limits',
52
55
  'set_limits',
53
56
  'get_limits_groups',
@@ -273,6 +276,80 @@ module Cosmos
273
276
  return hazardous
274
277
  end
275
278
 
279
+ # Returns a value from the specified command
280
+ #
281
+ # @param target_name [String] Target name of the command
282
+ # @param command_name [String] Packet name of the command
283
+ # @param parameter_name [String] Parameter name in the command
284
+ # @param value_type [Symbol] How the values should be converted. Must be
285
+ # one of {Packet::VALUE_TYPES}
286
+ # @return [Varies] value
287
+ def get_cmd_value(target_name, command_name, parameter_name, value_type = :CONVERTED)
288
+ packet = System.commands.packet(target_name, command_name)
289
+ # Virtually support RECEIVED_TIMEFORMATTED, RECEIVED_TIMESECONDS, RECEIVED_COUNT
290
+ case parameter_name.to_s.upcase
291
+ when 'RECEIVED_TIMEFORMATTED'
292
+ if packet.received_time
293
+ return packet.received_time.formatted
294
+ else
295
+ return 'No Packet Received Time'
296
+ end
297
+ when 'RECEIVED_TIMESECONDS'
298
+ if packet.received_time
299
+ return packet.received_time.to_f
300
+ else
301
+ return 0.0
302
+ end
303
+ when 'RECEIVED_COUNT'
304
+ return packet.received_count
305
+ else
306
+ return packet.read(parameter_name, value_type.intern)
307
+ end
308
+ end
309
+
310
+ # Returns the time the most recent command was sent
311
+ #
312
+ # @param target_name [String] Target name of the command. If not given then
313
+ # the most recent time from all commands will be returned
314
+ # @param command_name [String] Packet name of the command. If not given then
315
+ # then most recent time from the given target will be returned.
316
+ # @return [Array<Target Name, Command Name, Time Seconds, Time Microseconds>]
317
+ def get_cmd_time(target_name = nil, command_name = nil)
318
+ last_command = nil
319
+ if target_name
320
+ if command_name
321
+ last_command = System.commands.packet(target_name, command_name)
322
+ else
323
+ System.commands.packets(target_name).each do |packet_name, command|
324
+ last_command = command if !last_command and command.received_time
325
+ if command.received_time and command.received_time > last_command.received_time
326
+ last_command = command
327
+ end
328
+ end
329
+ end
330
+ else
331
+ commands = System.commands.all
332
+ commands.each do |target_name, target_commands|
333
+ target_commands.each do |packet_name, command|
334
+ last_command = command if !last_command and command.received_time
335
+ if command.received_time and command.received_time > last_command.received_time
336
+ last_command = command
337
+ end
338
+ end
339
+ end
340
+ end
341
+
342
+ if last_command
343
+ if last_command.received_time
344
+ return [last_command.target_name, last_command.packet_name, last_command.received_time.tv_sec, last_command.received_time.tv_usec]
345
+ else
346
+ return [last_command.target_name, last_command.packet_name, nil, nil]
347
+ end
348
+ else
349
+ return [nil, nil, nil, nil]
350
+ end
351
+ end
352
+
276
353
  # Request a converted telemetry item from a packet.
277
354
  #
278
355
  # Accepts two different calling styles:
@@ -549,6 +626,24 @@ module Cosmos
549
626
  nil
550
627
  end
551
628
 
629
+ # Get the list of stale packets for a specific target or pass nil to list
630
+ # all stale packets
631
+ #
632
+ # @param with_limits_only [Boolean] Return only the stale packets
633
+ # that have limits items and thus affect the overall limits
634
+ # state of the system
635
+ # @param target [String] The target to find stale packets for or nil to list
636
+ # all stale packets in the system
637
+ # @return [Array<Array<String, String>>] Array of arrays listing the target
638
+ # name and packet name
639
+ def get_stale(with_limits_only = false, target = nil)
640
+ stale = []
641
+ System.telemetry.stale(with_limits_only, target).each do |packet|
642
+ stale << [packet.target_name, packet.packet_name]
643
+ end
644
+ stale
645
+ end
646
+
552
647
  # (see Cosmos::Limits#get)
553
648
  def get_limits(target_name, packet_name, item_name, limits_set = nil)
554
649
  System.limits.get(target_name, packet_name, item_name, limits_set)
@@ -197,7 +197,10 @@ module Cosmos
197
197
  @staleness_monitor_thread = Thread.new do
198
198
  begin
199
199
  while true
200
- System.telemetry.check_stale
200
+ stale = System.telemetry.check_stale
201
+ stale.each do |packet|
202
+ post_limits_event(:STALE_PACKET, [packet.target_name, packet.packet_name])
203
+ end
201
204
  broken = @sleeper.sleep(10)
202
205
  break if broken
203
206
  end
@@ -281,8 +284,9 @@ module Cosmos
281
284
  #
282
285
  # @param event_type [Symbol] The type of limits event that occurred. Must
283
286
  # be one of :LIMITS_SET which means the system limits set has changed,
284
- # :LIMITS_CHANGE which means an individual item has changed limits state, or
285
- # :LIMITS_SETTINGS which means an individual item has new settings
287
+ # :LIMITS_CHANGE which means an individual item has changed limits state,
288
+ # :LIMITS_SETTINGS which means an individual item has new settings, or
289
+ # :STALE_PACKET which means a packet with limits has gone stale
286
290
  # @param event_data [Symbol|Array<String,String,String,Symbol,Symbol>]
287
291
  # Returns the current limits set name for event_type == :LIMITS_SET.
288
292
  # Returns an array containing the target name, packet name, item name,
@@ -354,7 +358,7 @@ module Cosmos
354
358
  # Get a limits event from the queue created by {#subscribe_limits_events}.
355
359
  #
356
360
  # Each limits event consists of an Array with two elements:
357
- # \[:LIMITS_CHANGE, [target, packet, item, old state, current state]]
361
+ # The Symbol name of the event and an Array of data
358
362
  #
359
363
  # @param id [Integer] The queue ID received from calling
360
364
  # {#subscribe_limits_events}
@@ -320,6 +320,57 @@ module Cosmos
320
320
  # Just to avoid warning
321
321
  end
322
322
 
323
+ def self.graceful_kill
324
+ # Just to avoid warning
325
+ end
326
+
327
+ def self.no_gui_handle_string_output
328
+ if @string_output.string[-1..-1] == "\n"
329
+ lines_to_write = ''
330
+ string = @string_output.string.clone
331
+ @string_output.string = @string_output.string[string.length..-1]
332
+ string.each_line {|out_line| lines_to_write << out_line }
333
+ @message_log.write(lines_to_write)
334
+ STDOUT.print lines_to_write if STDIN.isatty # Have a console
335
+ end
336
+ end
337
+
338
+ def self.no_gui_stop_callback
339
+ no_gui_handle_string_output()
340
+ @output_sleeper.cancel
341
+ Cosmos.kill_thread(self, @output_thread)
342
+ no_gui_handle_string_output()
343
+ end
344
+
345
+ def self.post_options_parsed_hook(options)
346
+ if options.no_gui
347
+ begin
348
+ @output_sleeper = Sleeper.new
349
+ @string_output = StringIO.new("", "r+")
350
+ $stdout = @string_output
351
+ Logger.level = Logger::INFO
352
+ cts = CmdTlmServer.new(options.config_file, options.production)
353
+ @message_log = CmdTlmServer.message_log
354
+ @output_thread = Thread.new do
355
+ while true
356
+ no_gui_handle_string_output()
357
+ break if @output_sleeper.sleep(1)
358
+ end
359
+ end
360
+ cts.stop_callback = method(:no_gui_stop_callback)
361
+ sleep # Sleep until waked by signal
362
+ ensure
363
+ if defined? cts and cts
364
+ cts.stop_logging('ALL')
365
+ cts.stop
366
+ end
367
+ end
368
+ return false
369
+ else
370
+ return true
371
+ end
372
+ end
373
+
323
374
  # Entry point to the server application
324
375
  def self.run(option_parser = nil, options = nil)
325
376
  Cosmos.catch_fatal_exception do
@@ -333,6 +384,7 @@ module Cosmos
333
384
  options.config_file = CmdTlmServer::DEFAULT_CONFIG_FILE
334
385
  options.production = false
335
386
  options.no_prompt = false
387
+ options.no_gui = false
336
388
  option_parser.separator "CTS Specific Options:"
337
389
  option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
338
390
  options.config_file = arg
@@ -343,6 +395,9 @@ module Cosmos
343
395
  option_parser.on("-n", "--no-prompt", "Don't prompt with Are You Sure dialog on close.") do |arg|
344
396
  options.no_prompt = true
345
397
  end
398
+ option_parser.on(nil, "--no-gui", "Run the server without a GUI") do |arg|
399
+ options.no_gui = true
400
+ end
346
401
  end
347
402
 
348
403
  super(option_parser, options)