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
@@ -717,7 +717,7 @@ module Cosmos
717
717
 
718
718
  orig_font = nil
719
719
  @@test_suites.each do |suite|
720
- next if suite.name == "Cosmos::CustomTestSuite"
720
+ next if suite.name == "CustomTestSuite"
721
721
  doc = YARD::Registry.resolve(nil, suite.name)
722
722
  suite_node = create_node(doc, suite.name, tree) do |node|
723
723
  orig_font = node.font(0)
@@ -1047,10 +1047,10 @@ module Cosmos
1047
1047
  end
1048
1048
 
1049
1049
  # Build list of TestSuites and Tests
1050
- @@test_suites = @@test_suites.select {|my_suite| my_suite.name == 'Cosmos::CustomTestSuite'}
1050
+ @@test_suites = @@test_suites.select {|my_suite| my_suite.name == 'CustomTestSuite'}
1051
1051
  tests = []
1052
1052
  ObjectSpace.each_object(Class) do |object|
1053
- next if object.name == 'Cosmos::CustomTestSuite'
1053
+ next if object.name == 'CustomTestSuite'
1054
1054
  if (object.ancestors.include?(TestSuite) &&
1055
1055
  object != TestSuite &&
1056
1056
  !ignored_test_suite_classes.include?(object))
@@ -1140,7 +1140,7 @@ module Cosmos
1140
1140
  end
1141
1141
  end
1142
1142
  end
1143
- @@suites[suite.name.split('::')[-1]] = cur_suite unless suite.name == 'Cosmos::CustomTestSuite'
1143
+ @@suites[suite.name.split('::')[-1]] = cur_suite unless suite.name == 'CustomTestSuite'
1144
1144
  end
1145
1145
  Qt.execute_in_main_thread(true) { @test_runner_chooser.test_suites = @@suites }
1146
1146
  end
@@ -939,6 +939,11 @@ module Cosmos
939
939
  return false
940
940
  end
941
941
 
942
+ # Validate configurations exist for input filenames
943
+ @input_filenames.each do |input_filename|
944
+ Cosmos.check_log_configuration(@tlm_extractor_processor.packet_log_reader, input_filename)
945
+ end
946
+
942
947
  #Validate config information
943
948
  @tlm_extractor_processor.packet_log_reader.open(@input_filenames[0])
944
949
  @tlm_extractor_processor.packet_log_reader.close
@@ -48,6 +48,9 @@ module Cosmos
48
48
  progress_dialog.set_step_progress(0) if progress_dialog
49
49
  break if @cancel
50
50
  packet_count = 0
51
+ if progress_dialog
52
+ Cosmos.check_log_configuration(@packet_log_reader, log_file)
53
+ end
51
54
  @packet_log_reader.each(log_file, true, time_start, time_end) do |packet|
52
55
  break if @cancel
53
56
  if progress_dialog and packet_count % PROGRESS_UPDATE_PACKET_COUNT == 0
@@ -19,6 +19,7 @@ Cosmos.catch_fatal_exception do
19
19
  require 'cosmos/gui/widgets/full_text_search_line_edit'
20
20
  require 'cosmos/tools/tlm_viewer/tlm_viewer_config'
21
21
  require 'find'
22
+ require 'fileutils'
22
23
  end
23
24
 
24
25
  module Cosmos
@@ -58,7 +59,7 @@ module Cosmos
58
59
  additional_data = ''
59
60
  System.targets.each do |target_name, target|
60
61
  tlmviewer_files << target.filename if File.exist?(target.filename)
61
- screen_dir = File.join(Cosmos::USERPATH, 'config', 'targets', target.original_name, 'screens')
62
+ screen_dir = File.join(target.dir, 'screens')
62
63
  if File.exist?(screen_dir)
63
64
  if target.substitute
64
65
  additional_data << target.original_name
@@ -304,7 +305,7 @@ module Cosmos
304
305
 
305
306
  results = ''
306
307
  screen_dir = File.join(USERPATH, 'config', 'targets', target.original_name, 'screens')
307
- Dir.mkdir(screen_dir, 0777) unless File.exist?(screen_dir)
308
+ FileUtils.mkdir_p(screen_dir, :mode => 0777) unless File.exist?(screen_dir)
308
309
 
309
310
  System.telemetry.packets(target.name).each do |packet_name, packet|
310
311
  filename = File.join(screen_dir, packet_name.downcase + '.txt')
@@ -126,7 +126,7 @@ module Cosmos
126
126
  when 'AUTO_TARGETS'
127
127
  parser.verify_num_parameters(0, 0, 'AUTO_TARGETS')
128
128
  System.targets.each do |target_name, target|
129
- screen_dir = File.join(Cosmos::USERPATH, 'config', 'targets', target.original_name, 'screens')
129
+ screen_dir = File.join(target.dir, 'screens')
130
130
  if File.exist?(screen_dir) and num_screens(screen_dir) > 0
131
131
  start_target(target.name, parser)
132
132
  auto_screens()
@@ -138,7 +138,7 @@ module Cosmos
138
138
  target_name = parameters[0].upcase
139
139
  target = System.targets[target_name]
140
140
  raise parser.error("Unknown target #{target_name}") unless target
141
- screen_dir = File.join(Cosmos::USERPATH, 'config', 'targets', target.original_name, 'screens')
141
+ screen_dir = File.join(target.dir, 'screens')
142
142
  if File.exist?(screen_dir) and num_screens(screen_dir) > 0
143
143
  start_target(target.name, parser)
144
144
  auto_screens()
@@ -152,7 +152,7 @@ module Cosmos
152
152
  when 'SCREEN'
153
153
  raise parser.error("No target defined. SCREEN must follow TARGET.") unless @current_target
154
154
  parser.verify_num_parameters(1, 3, 'SCREEN <Filename> <X Position (optional)> <Y Position (optional)>')
155
- screen_filename = File.join(Cosmos::USERPATH, 'config', 'targets', @current_target.original_name, 'screens', parameters[0])
155
+ screen_filename = File.join(@current_target.dir, 'screens', parameters[0])
156
156
  start_screen(screen_filename, parameters[1], parameters[2])
157
157
 
158
158
  when 'SHOW_ON_STARTUP'
@@ -178,7 +178,7 @@ module Cosmos
178
178
  raise parser.error("No group defined. GROUP_SCREEN must follow GROUP.") unless @current_group
179
179
  parser.verify_num_parameters(2, 4, 'GROUP_SCREEN <Target Name> <Screen Filename> <X Position (optional)> <Y Position (Optional)>')
180
180
  start_target(parameters[0].upcase, parser, @current_group)
181
- screen_filename = File.join(Cosmos::USERPATH, 'config', 'targets', @current_target.original_name, 'screens', parameters[1])
181
+ screen_filename = File.join(@current_target.dir, 'screens', parameters[1])
182
182
  start_screen(screen_filename, parameters[2], parameters[3])
183
183
 
184
184
  else
@@ -203,7 +203,10 @@ module Cosmos
203
203
  target_screen_infos.each do |target_name, screen_infos|
204
204
  file.puts "TARGET \"#{target_name}\""
205
205
  screen_infos.each do |screen_name, screen_info|
206
- screen_filename = screen_info.filename.gsub(File.join(Cosmos::USERPATH, 'config', 'targets', screen_info.original_target_name, 'screens', ''), '')
206
+ # Grab the filename by indexing the full path for 'screens' and going past
207
+ # to capture the filename such as 'status.txt' below
208
+ # C:/COSMOS/config/targets/TGT/screens/status.txt
209
+ screen_filename = screen_info.filename[(screen_info.filename.index("screens").to_i + 8)..-1]
207
210
  string = " SCREEN"
208
211
  string << " \"#{screen_filename}\""
209
212
  string << " #{screen_info.x_pos}" if screen_info.x_pos
@@ -246,7 +249,7 @@ module Cosmos
246
249
 
247
250
  def auto_screens
248
251
  @current_group = nil
249
- screen_dir = File.join(Cosmos::USERPATH, 'config', 'targets', @current_target.original_name, 'screens')
252
+ screen_dir = File.join(@current_target.dir, 'screens')
250
253
  if File.exist?(screen_dir)
251
254
  Dir.new(screen_dir).each do |filename|
252
255
  if filename[0..0] != '.'
@@ -25,11 +25,7 @@ module Cosmos
25
25
  @items_per_row = items_per_row.to_i
26
26
  setFixedSize(width.to_i, height.to_i)
27
27
  setReadOnly(true)
28
- if Kernel.is_windows?
29
- setFont(Cosmos.getFont("courier", 10))
30
- else
31
- setFont(Cosmos.getFont("courier", 14))
32
- end
28
+ setFont(Cosmos.get_default_font)
33
29
  parent_layout.addWidget(self) if parent_layout
34
30
  end
35
31
 
@@ -26,11 +26,7 @@ module Cosmos
26
26
  @bytes_per_row = @bytes_per_word * @words_per_row
27
27
  @addr_format = ConfigParser.handle_nil(addr_format)
28
28
  @addr_format << ' ' if @addr_format
29
- if Kernel.is_windows?
30
- setFont(Cosmos.getFont("courier", 10))
31
- else
32
- setFont(Cosmos.getFont("courier", 14))
33
- end
29
+ setFont(Cosmos.get_default_font)
34
30
  end
35
31
 
36
32
  def format_value(data)
@@ -17,6 +17,8 @@ require 'cosmos/core_ext'
17
17
  require 'cosmos/version'
18
18
  require 'cosmos/utilities/logger'
19
19
  require 'socket'
20
+ require 'pathname'
21
+ require 'bundler'
20
22
 
21
23
  # If a hazardous command is sent through the {Cosmos::Api} this error is raised.
22
24
  # {Cosmos::Script} rescues the error and prompts the user to continue.
@@ -44,6 +46,8 @@ end
44
46
  # new tool. Be sure to explore the various GUI classes
45
47
  module Cosmos
46
48
 
49
+ BASE_PWD = Dir.pwd
50
+
47
51
  # FatalErrors cause an exit but are not as dangerous as other errors.
48
52
  # They are used for known issues and thus we don't need a full error report.
49
53
  class FatalError < StandardError; end
@@ -136,6 +140,70 @@ module Cosmos
136
140
  end
137
141
  end
138
142
 
143
+ # Searches the COSMOS::USERPATH/config/data directory and then the core
144
+ # COSMOS/data directory for the given file name. Returns the absolute file
145
+ # path or nil if the file could not be found. This allows for user configuration
146
+ # files to override COSMOS data file defaults.
147
+ def self.data_path(name)
148
+ # Check USERPATH
149
+ filename = File.join(::Cosmos::USERPATH, 'config', 'data', name)
150
+ return filename if File.exist? filename
151
+
152
+ # Check extensions
153
+ begin
154
+ Bundler.load.specs.each do |spec|
155
+ spec_name_split = spec.name.split('-')
156
+ if spec_name_split.length > 1 and spec_name_split[0] == 'cosmos'
157
+ filename = File.join(spec.gem_dir, 'config', 'data', name)
158
+ return filename if File.exist? filename
159
+ end
160
+ end
161
+ rescue Bundler::GemfileNotFound
162
+ # No Gemfile - so no gem based extensions
163
+ end
164
+
165
+ filename = File.join(::Cosmos::PATH, 'data', name)
166
+ return filename if File.exist? filename
167
+
168
+ # Check CORE
169
+ filename = Cosmos.path('data', name)
170
+ return filename if File.exist? filename
171
+
172
+ nil
173
+ end
174
+
175
+ # Returns a path to a cosmos file. Prefers files in USERPATH but will look
176
+ # relative to calling_file if not present in USERPATH
177
+ # @param calling_file [String] Should be __FILE__ from the calling file
178
+ # @param paths [Array<String>] Partial paths like in File.join
179
+ def self.path(calling_file, *paths)
180
+ partial_path = File.join(*paths)
181
+
182
+ # First look in the Cosmos::USERPATH
183
+ user_path = File.join(Cosmos::USERPATH, partial_path)
184
+ return user_path if File.exist?(user_path)
185
+
186
+ # Then look relative to the calling file
187
+ if Pathname.new(calling_file).absolute?
188
+ current_dir = File.dirname(calling_file)
189
+ else
190
+ current_dir = File.join(BASE_PWD, calling_file)
191
+ end
192
+ while true
193
+ test_path = File.join(current_dir, partial_path)
194
+ if File.exist?(test_path)
195
+ return test_path
196
+ else
197
+ old_current_dir = current_dir
198
+ current_dir = File.expand_path(File.join(current_dir, '..'))
199
+ if old_current_dir == current_dir
200
+ # Hit the root dir - give up
201
+ raise "Could not find path to #{File.join(*paths)}"
202
+ end
203
+ end
204
+ end
205
+ end
206
+
139
207
  # Creates a marshal file by serializing the given obj
140
208
  #
141
209
  # @param marshal_filename [String] Name of the marshal file to create
@@ -323,7 +391,7 @@ module Cosmos
323
391
  # Make sure the log directory exists
324
392
  raise unless File.exist?(log_dir)
325
393
  log_file
326
- rescue
394
+ rescue Exception
327
395
  # If not then we just build a file locally
328
396
  if File.exist?('./outputs/logs')
329
397
  log_file = File.join('./outputs/logs', File.build_timestamped_filename([filename]))
@@ -455,12 +523,13 @@ module Cosmos
455
523
  # @param error [Exception] The exception to handle
456
524
  # @param try_gui [Boolean] Whether to try and create a GUI exception popup
457
525
  def self.handle_fatal_exception(error, try_gui = true)
526
+ $cosmos_fatal_exception = error
458
527
  log_file = self.write_exception_file(error)
459
528
  Logger.level = Logger::FATAL unless try_gui
460
529
  Logger.fatal "Fatal Exception! Exiting..."
461
530
  Logger.fatal error.formatted
462
- if defined? ExceptionDialog and try_gui
463
- Qt.execute_in_main_thread(true) {|| ExceptionDialog.new(nil, error, '', true, false, log_file)}
531
+ if defined? ExceptionDialog and try_gui and Qt::Application.instance
532
+ Qt.execute_in_main_thread(true) {||ExceptionDialog.new(nil, error, '', true, false, log_file)}
464
533
  else
465
534
  if $stdout != STDOUT
466
535
  $stdout = STDOUT
@@ -673,4 +742,18 @@ module Cosmos
673
742
  end
674
743
  end
675
744
 
745
+ # Play a wav file
746
+ # @param wav_filename filename of the wav file
747
+ def self.play_wav_file(wav_filename)
748
+ if defined? Qt and wav_filename
749
+ Qt.execute_in_main_thread(true) do
750
+ if Qt::CoreApplication.instance and Qt::Sound.isAvailable
751
+ Cosmos.set_working_dir do
752
+ Qt::Sound.play(wav_filename.to_s)
753
+ end
754
+ end
755
+ end
756
+ end
757
+ end
758
+
676
759
  end
@@ -1,12 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- COSMOS_VERSION = '3.4.2'
3
+ COSMOS_VERSION = '3.5.0'
4
4
  module Cosmos
5
5
  module Version
6
6
  MAJOR = '3'
7
- MINOR = '4'
8
- PATCH = '2'
9
- BUILD = 'd7b8067e652f11393629c9e8e1708cb846c5d233'
7
+ MINOR = '5'
8
+ PATCH = '0'
9
+ BUILD = 'a1963b6efc3b22a28c3abb878079ebad4aa73067'
10
10
  end
11
- VERSION = '3.4.2'
11
+ VERSION = '3.5.0'
12
12
  end
@@ -131,7 +131,13 @@ module Cosmos
131
131
  CBR_115200 = 115200
132
132
  CBR_128000 = 128000
133
133
  CBR_256000 = 256000
134
- BAUD_RATES = [CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000]
134
+
135
+ BAUD_RATES = [
136
+ CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600,
137
+ CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200,
138
+ CBR_128000, CBR_256000, 230400, 460800, 500000, 576000, 921600,
139
+ 1000000, 1152000, 1500000, 2000000, 3000000, 3500000, 4000000
140
+ ]
135
141
 
136
142
  # Parity
137
143
  NOPARITY = 0
@@ -125,7 +125,7 @@ module Cosmos
125
125
  file.write [pkt.buffer.length].pack('N')
126
126
  file.write pkt.buffer
127
127
  end
128
- @plr.open(filename)
128
+ expect(@plr.open(filename)).to eql [false, nil]
129
129
  pkt1 = @plr.read
130
130
  expect(pkt1.target_name).to eql 'TGT1'
131
131
  expect(pkt1.packet_name).to eql 'PKT1'
@@ -139,6 +139,66 @@ module Cosmos
139
139
  end
140
140
  end
141
141
 
142
+ it "handles saved configuration with errors" do
143
+ begin
144
+ System.class_eval('@@instance = nil')
145
+
146
+ # Save system.txt
147
+ @config_file = File.join(Cosmos::USERPATH,'config','system','system.txt')
148
+ FileUtils.mv @config_file, Cosmos::USERPATH
149
+
150
+ # Create a dummy system.txt
151
+ File.open(@config_file,'w') {|file| file.puts "# This is a comment" }
152
+ @config_targets = File.join(Cosmos::USERPATH,'config','targets')
153
+
154
+ File.open(@config_file,'w') do |file|
155
+ file.puts "DECLARE_TARGET COSMOS"
156
+ file.puts "DECLARE_TARGET COSMOS OVERRIDE"
157
+ end
158
+
159
+ # Load the original configuration
160
+ original_config_name, err = System.load_configuration
161
+ expect(err).to eql nil
162
+ expect(System.telemetry.target_names).to eql %w(COSMOS OVERRIDE)
163
+ original_pkts = System.telemetry.packets('COSMOS').keys
164
+
165
+ # Create a new configuration by writing another telemetry file
166
+ File.open(File.join(@config_targets,'COSMOS','cmd_tlm','test1_tlm.txt'),'w') do |file|
167
+ file.puts "TELEMETRY COSMOS TEST1 BIG_ENDIAN"
168
+ file.puts " APPEND_ITEM DATA 240 STRING"
169
+ end
170
+ System.instance.process_file(@config_file)
171
+ # Verify the new telemetry packet is there
172
+ expect(System.telemetry.packets('COSMOS').keys).to include "TEST1"
173
+ second_config_name = System.configuration_name
174
+
175
+ # Create a log file for the second config
176
+ filename = File.join(@log_path,'test.bin')
177
+ File.open(filename,'wb') do |file|
178
+ file.write "COSMOS2_TLM_#{second_config_name}_#{'A' * 83}"
179
+ end
180
+
181
+ # Corrupt the second config
182
+ second_config_path = System.instance.send(:find_configuration, second_config_name)
183
+ FileUtils.mv File.join(second_config_path, 'system.txt'), File.join(second_config_path, 'system2.txt')
184
+
185
+ # Return to original config
186
+ System.load_configuration
187
+
188
+ # Open the file from the second config and expect an error
189
+ success, error = @plr.open(filename)
190
+ expect(success).to eql false
191
+ expect(error).to_not be_nil
192
+ @plr.close
193
+ ensure
194
+ # Restore system.txt
195
+ FileUtils.mv File.join(Cosmos::USERPATH, 'system.txt'),
196
+ File.join(Cosmos::USERPATH,'config','system')
197
+
198
+ File.delete(File.join(@config_targets,'COSMOS','cmd_tlm','test1_tlm.txt'))
199
+ end
200
+ end
201
+
142
202
  describe "packet_offsets and read_at_offset" do
143
203
  it "returns packet offsets CTS-20, CTS-22" do
144
204
  packet_offsets = @plr.packet_offsets(Dir[File.join(@log_path,"*cmd.bin")][0])
@@ -148,7 +208,7 @@ module Cosmos
148
208
  header_length = 8 + 1 + 6 + 1 + 12 + 4
149
209
  expect(packet_offsets).to eql [PacketLogReader::COSMOS2_HEADER_LENGTH, PacketLogReader::COSMOS2_HEADER_LENGTH + header_length + @cmd_packet_length, PacketLogReader::COSMOS2_HEADER_LENGTH + (header_length + @cmd_packet_length) * 2]
150
210
 
151
- @plr.open(Dir[File.join(@log_path,"*cmd.bin")][0])
211
+ expect(@plr.open(Dir[File.join(@log_path,"*cmd.bin")][0])).to eql [true, nil]
152
212
  pkt = @plr.read_at_offset(packet_offsets[1])
153
213
  expect(pkt.target_name).to eql "COSMOS"
154
214
  expect(pkt.packet_name).to eql "STARTLOGGING"
@@ -164,7 +224,7 @@ module Cosmos
164
224
  header_length = 8 + 1 + 6 + 1 + 7 + 4
165
225
  expect(packet_offsets).to eql [PacketLogReader::COSMOS2_HEADER_LENGTH, PacketLogReader::COSMOS2_HEADER_LENGTH + header_length + @tlm_packet_length, PacketLogReader::COSMOS2_HEADER_LENGTH + (header_length + @tlm_packet_length) * 2]
166
226
 
167
- @plr.open(Dir[File.join(@log_path,"*tlm.bin")][0])
227
+ expect(@plr.open(Dir[File.join(@log_path,"*tlm.bin")][0])).to eql [true, nil]
168
228
  pkt = @plr.read_at_offset(packet_offsets[1])
169
229
  expect(pkt.target_name).to eql "COSMOS"
170
230
  expect(pkt.packet_name).to eql "VERSION"
@@ -313,7 +373,7 @@ module Cosmos
313
373
 
314
374
  describe "first" do
315
375
  it "returns the first command packet and retain the file position" do
316
- @plr.open(Dir[File.join(@log_path,"*cmd.bin")][0])
376
+ expect(@plr.open(Dir[File.join(@log_path,"*cmd.bin")][0])).to eql [true, nil]
317
377
  pkt1 = @plr.read
318
378
  expect(pkt1.target_name).to eql @cmd_packets[0].target_name
319
379
  expect(pkt1.packet_name).to eql @cmd_packets[0].packet_name
@@ -335,7 +395,7 @@ module Cosmos
335
395
  end
336
396
 
337
397
  it "returns the first telemetry packet and retain the file position" do
338
- @plr.open(Dir[File.join(@log_path,"*tlm.bin")][0])
398
+ expect(@plr.open(Dir[File.join(@log_path,"*tlm.bin")][0])).to eql [true, nil]
339
399
  pkt1 = @plr.read
340
400
  expect(pkt1.target_name).to eql @tlm_packets[0].target_name
341
401
  expect(pkt1.packet_name).to eql @tlm_packets[0].packet_name
@@ -359,7 +419,7 @@ module Cosmos
359
419
 
360
420
  describe "last" do
361
421
  it "returns the last command packet and retain the file position" do
362
- @plr.open(Dir[File.join(@log_path,"*cmd.bin")][0])
422
+ expect(@plr.open(Dir[File.join(@log_path,"*cmd.bin")][0])).to eql [true, nil]
363
423
  pkt1 = @plr.read
364
424
  expect(pkt1.target_name).to eql @cmd_packets[0].target_name
365
425
  expect(pkt1.packet_name).to eql @cmd_packets[0].packet_name
@@ -381,7 +441,7 @@ module Cosmos
381
441
  end
382
442
 
383
443
  it "returns the last telemetry packet and retain the file position" do
384
- @plr.open(Dir[File.join(@log_path,"*tlm.bin")][0])
444
+ expect(@plr.open(Dir[File.join(@log_path,"*tlm.bin")][0])).to eql [true, nil]
385
445
  pkt1 = @plr.read
386
446
  expect(pkt1.target_name).to eql @tlm_packets[0].target_name
387
447
  expect(pkt1.packet_name).to eql @tlm_packets[0].packet_name