cosmos 3.4.2 → 3.5.0

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 (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)