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
@@ -48,7 +48,7 @@ module Cosmos
48
48
  end
49
49
 
50
50
  # Initialize variables
51
- @packet_log_reader = System.default_packet_log_reader.new
51
+ @packet_log_reader = System.default_packet_log_reader.new
52
52
  @log_directory = System.paths['LOGS']
53
53
  @log_directory << '/' unless @log_directory[-1..-1] == '\\' or @log_directory[-1..-1] == '/'
54
54
  @log_filename = nil
@@ -225,6 +225,7 @@ module Cosmos
225
225
  progress_dialog.set_overall_progress(0.0)
226
226
  progress_dialog.cancel_callback = method(:cancel_callback)
227
227
  progress_dialog.enable_cancel_button
228
+ Cosmos.check_log_configuration(@packet_log_reader, selection)
228
229
  @packet_offsets = @packet_log_reader.packet_offsets(selection, lambda {|percentage| progress_dialog.set_overall_progress(percentage); @cancel})
229
230
  @playback_index = 0
230
231
  update_slider_and_current_time(nil)
@@ -393,55 +394,60 @@ module Cosmos
393
394
  end
394
395
 
395
396
  def handle_packet(packet)
396
- interface = nil
397
-
398
- # Identify and update packet
399
- if packet.identified?
400
- # Preidentifed packet - place it into the current value table
401
- identified_packet = System.telemetry.update!(packet.target_name,
402
- packet.packet_name,
403
- packet.buffer)
404
- else
405
- # Packet needs to be identified
406
- identified_packet = System.telemetry.identify!(packet.buffer)
407
- end
397
+ # For replay we will try our best here but not crash on errors
398
+ begin
399
+ interface = nil
400
+
401
+ # Identify and update packet
402
+ if packet.identified?
403
+ # Preidentifed packet - place it into the current value table
404
+ identified_packet = System.telemetry.update!(packet.target_name,
405
+ packet.packet_name,
406
+ packet.buffer)
407
+ else
408
+ # Packet needs to be identified
409
+ identified_packet = System.telemetry.identify!(packet.buffer)
410
+ end
408
411
 
409
- if identified_packet and packet.target_name != 'UNKNOWN'
410
- identified_packet.received_time = packet.received_time
411
- packet = identified_packet
412
- target = System.targets[packet.target_name.upcase]
413
- interface = target.interface if target
414
- else
415
- unknown_packet = System.telemetry.update!('UNKNOWN', 'UNKNOWN', packet.buffer)
416
- unknown_packet.received_time = packet.received_time
417
- packet = unknown_packet
418
- data_length = packet.length
419
- string = "Unknown #{data_length} byte packet starting: "
420
- num_bytes_to_print = [UNKNOWN_BYTES_TO_PRINT, data_length].min
421
- data_to_print = packet.buffer(false)[0..(num_bytes_to_print - 1)]
422
- data_to_print.each_byte do |byte|
423
- string << sprintf("%02X", byte)
412
+ if identified_packet and packet.target_name != 'UNKNOWN'
413
+ identified_packet.received_time = packet.received_time
414
+ packet = identified_packet
415
+ target = System.targets[packet.target_name.upcase]
416
+ interface = target.interface if target
417
+ else
418
+ unknown_packet = System.telemetry.update!('UNKNOWN', 'UNKNOWN', packet.buffer)
419
+ unknown_packet.received_time = packet.received_time
420
+ packet = unknown_packet
421
+ data_length = packet.length
422
+ string = "Unknown #{data_length} byte packet starting: "
423
+ num_bytes_to_print = [UNKNOWN_BYTES_TO_PRINT, data_length].min
424
+ data_to_print = packet.buffer(false)[0..(num_bytes_to_print - 1)]
425
+ data_to_print.each_byte do |byte|
426
+ string << sprintf("%02X", byte)
427
+ end
428
+ time_string = ''
429
+ time_string = packet.received_time.formatted << ' ' if packet.received_time
430
+ puts "#{time_string}ERROR: #{string}"
424
431
  end
425
- time_string = ''
426
- time_string = packet.received_time.formatted << ' ' if packet.received_time
427
- puts "#{time_string}ERROR: #{string}"
428
- end
429
432
 
430
- target = System.targets[packet.target_name]
431
- target.tlm_cnt += 1 if target
432
- packet.received_count += 1
433
- packet.check_limits(System.limits_set)
434
- ReplayServer.instance.post_packet(packet)
435
-
436
- # Write to routers
437
- if interface
438
- interface.routers.each do |router|
439
- begin
440
- router.write(packet) if router.write_allowed? and router.connected?
441
- rescue => err
442
- Logger.error "Problem writing to router #{router.name} - #{err.class}:#{err.message}"
433
+ target = System.targets[packet.target_name]
434
+ target.tlm_cnt += 1 if target
435
+ packet.received_count += 1
436
+ packet.check_limits(System.limits_set)
437
+ ReplayServer.instance.post_packet(packet)
438
+
439
+ # Write to routers
440
+ if interface
441
+ interface.routers.each do |router|
442
+ begin
443
+ router.write(packet) if router.write_allowed? and router.connected?
444
+ rescue => err
445
+ Logger.error "Problem writing to router #{router.name} - #{err.class}:#{err.message}"
446
+ end
443
447
  end
444
448
  end
449
+ rescue Exception => err
450
+ Logger.error "Problem handling packet #{packet.target_name} #{packet.packet_name} - #{err.class}:#{err.message}"
445
451
  end
446
452
  end
447
453
 
@@ -159,31 +159,39 @@ module Cosmos
159
159
  @search_find_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
160
160
  @search_find.shortcut = @search_find_keyseq
161
161
  @search_find.statusTip = tr('Find text')
162
- @search_find.connect(SIGNAL('triggered()')) { active_script_runner_frame.find() }
162
+ @search_find.connect(SIGNAL('triggered()')) do
163
+ FindReplaceDialog.show_find(active_script_runner_frame().script)
164
+ end
163
165
 
164
166
  @search_find_next = Qt::Action.new(tr('Find &Next'), self)
165
167
  @search_find_next_keyseq = Qt::KeySequence.new(tr('F3'))
166
168
  @search_find_next.shortcut = @search_find_next_keyseq
167
169
  @search_find_next.statusTip = tr('Find next instance')
168
- @search_find_next.connect(SIGNAL('triggered()')) { active_script_runner_frame.find_next() }
170
+ @search_find_next.connect(SIGNAL('triggered()')) do
171
+ FindReplaceDialog.find_next(active_script_runner_frame().script)
172
+ end
169
173
 
170
174
  @search_find_previous = Qt::Action.new(tr('Find &Previous'), self)
171
175
  @search_find_previous_keyseq = Qt::KeySequence.new(tr('Shift+F3'))
172
176
  @search_find_previous.shortcut = @search_find_previous_keyseq
173
177
  @search_find_previous.statusTip = tr('Find previous instance')
174
- @search_find_previous.connect(SIGNAL('triggered()')) { active_script_runner_frame.find_previous() }
178
+ @search_find_previous.connect(SIGNAL('triggered()')) do
179
+ FindReplaceDialog.find_previous(active_script_runner_frame().script)
180
+ end
175
181
 
176
182
  @search_replace = Qt::Action.new(tr('&Replace'), self)
177
183
  @search_replace_keyseq = Qt::KeySequence.new(tr('Ctrl+H'))
178
184
  @search_replace.shortcut = @search_replace_keyseq
179
185
  @search_replace.statusTip = tr('Replace')
180
- @search_replace.connect(SIGNAL('triggered()')) { active_script_runner_frame.replace() }
186
+ @search_replace.connect(SIGNAL('triggered()')) do
187
+ FindReplaceDialog.show_replace(active_script_runner_frame().script)
188
+ end
181
189
 
182
190
  # Script Actions
183
191
  @script_syntax_all = Qt::Action.new(tr('&Ruby Syntax Check'), self)
184
192
  @script_syntax_all.statusTip = tr('Check ruby syntax of this script')
185
193
  @script_syntax_all.connect(SIGNAL('triggered()')) do
186
- active_script_runner_frame().ruby_syntax_check_text(active_script_runner_frame().text)
194
+ active_script_runner_frame().ruby_syntax_check_text()
187
195
  end
188
196
 
189
197
  @script_mnemonic_all = Qt::Action.new(tr('&Mnemonic Check'), self)
@@ -37,11 +37,9 @@ module Cosmos
37
37
  class ScriptRunnerDialog < Qt::Dialog
38
38
  attr_reader :script_runner_frame
39
39
 
40
- # Constructor
41
40
  def initialize(parent,
42
41
  title,
43
42
  default_tab_text = 'Untitled')
44
- # Call base class constructor
45
43
  super(parent)
46
44
  setWindowTitle(title)
47
45
  setMinimumWidth(parent.width * 0.8)
@@ -52,7 +50,7 @@ module Cosmos
52
50
  layout = Qt::VBoxLayout.new
53
51
  layout.addWidget(@script_runner_frame)
54
52
  setLayout(layout)
55
- end # def initialize
53
+ end
56
54
 
57
55
  # Executes the given text and closes when complete
58
56
  def execute_text_and_close_on_complete(text, text_binding = nil)
@@ -102,6 +100,7 @@ module Cosmos
102
100
  attr_reader :script_class
103
101
  attr_reader :top_level_instrumented_cache
104
102
  attr_accessor :stdout_max_lines
103
+ attr_reader :script
105
104
 
106
105
  @@instance = nil
107
106
  @@run_thread = nil
@@ -650,7 +649,7 @@ module Cosmos
650
649
  # Implement the breakpoint callbacks from the RubyEditor
651
650
  ######################################
652
651
  def breakpoint_set(line)
653
- ScriptRunnerFrame.breakpoint(current_tab_filename(), line)
652
+ ScriptRunnerFrame.set_breakpoint(current_tab_filename(), line)
654
653
  end
655
654
 
656
655
  def breakpoint_cleared(line)
@@ -692,107 +691,6 @@ module Cosmos
692
691
  @script.comment_or_uncomment_lines unless running?()
693
692
  end
694
693
 
695
- ##################################################################
696
- # Implement Search functionality in the frame (find, replace, etc)
697
- ##################################################################
698
- def find
699
- unless @find_dialog
700
- @find_dialog = FindReplaceDialog.new(@script)
701
- @find_dialog.connect(SIGNAL('find_next()')) { dialog_find(@find_dialog) }
702
- end
703
- @find_dialog.show
704
- @find_dialog.raise
705
- @find_dialog.activateWindow
706
- end
707
-
708
- def find_next
709
- flags = FindReplaceDialog.find_flags
710
- flags &= ~Qt::TextDocument::FindBackward.to_i
711
- found = @script.find(FindReplaceDialog.find_text, flags)
712
- if not found and FindReplaceDialog.wrap_around?
713
- cursor = @script.textCursor
714
- cursor.movePosition(Qt::TextCursor::Start)
715
- @script.setTextCursor(cursor)
716
- @script.find(FindReplaceDialog.find_text, flags)
717
- end
718
- end
719
-
720
- def find_previous
721
- flags = FindReplaceDialog.find_flags
722
- flags |= Qt::TextDocument::FindBackward.to_i
723
- found = @script.find(FindReplaceDialog.find_text, flags)
724
- if not found and FindReplaceDialog.wrap_around?
725
- cursor = @script.textCursor
726
- cursor.movePosition(Qt::TextCursor::End)
727
- @script.setTextCursor(cursor)
728
- @script.find(FindReplaceDialog.find_text, flags)
729
- end
730
- end
731
-
732
- def replace
733
- unless @replace_dialog
734
- @replace_dialog = FindReplaceDialog.new(@script, true)
735
- @replace_dialog.connect(SIGNAL('find_next()')) { dialog_find(@replace_dialog) }
736
- @replace_dialog.connect(SIGNAL('replace()')) { dialog_replace(@replace_dialog) }
737
- @replace_dialog.connect(SIGNAL('replace_all()')) { dialog_replace_all(@replace_dialog) }
738
- end
739
- @replace_dialog.show
740
- @replace_dialog.raise
741
- @replace_dialog.activateWindow
742
- end
743
-
744
- def dialog_find(dialog)
745
- found = @script.find(dialog.find_text, dialog.find_flags)
746
- if not found and dialog.wrap_around?
747
- cursor = @script.textCursor
748
- if dialog.find_up?
749
- cursor.movePosition(Qt::TextCursor::End)
750
- else
751
- cursor.movePosition(Qt::TextCursor::Start)
752
- end
753
- @script.setTextCursor(cursor)
754
- @script.find(dialog.find_text, dialog.find_flags)
755
- end
756
- end
757
-
758
- def dialog_replace(dialog)
759
- if @script.textCursor.hasSelection &&
760
- @script.textCursor.selectedText == dialog.find_text
761
- found = true
762
- else
763
- found = @script.find(dialog.find_text, dialog.find_flags)
764
- if not found and dialog.wrap_around?
765
- cursor = @script.textCursor
766
- if dialog.find_up?
767
- cursor.movePosition(Qt::TextCursor::End)
768
- else
769
- cursor.movePosition(Qt::TextCursor::Start)
770
- end
771
- @script.setTextCursor(cursor)
772
- found = @script.find(dialog.find_text, dialog.find_flags)
773
- end
774
- end
775
- if found
776
- @script.textCursor.removeSelectedText
777
- @script.textCursor.insertText(dialog.replace_text)
778
- cursor = @script.textCursor
779
- cursor.setPosition(cursor.position-1)
780
- cursor.select(Qt::TextCursor::WordUnderCursor)
781
- @script.setTextCursor(cursor)
782
- end
783
- end
784
-
785
- def dialog_replace_all(dialog)
786
- cursor = @script.textCursor
787
- cursor.movePosition(Qt::TextCursor::Start)
788
- @script.setTextCursor(cursor)
789
-
790
- while (@script.find(dialog.find_text, dialog.find_flags) == true)
791
- @script.textCursor.removeSelectedText
792
- @script.textCursor.insertText(dialog.replace_text)
793
- end
794
- end
795
-
796
694
  ##################################################################################
797
695
  # Implement Script functionality in the frame (run selection, run from cursor, etc
798
696
  ##################################################################################
@@ -840,10 +738,11 @@ module Cosmos
840
738
  end
841
739
  end
842
740
 
843
- def ruby_syntax_check_text(text)
741
+ def ruby_syntax_check_text(selection = nil)
844
742
  unless self.class.running?()
743
+ selection = text() unless selection
845
744
  check_process = IO.popen("ruby -c -rubygems 2>&1", 'r+')
846
- check_process.write("require 'cosmos'; require 'cosmos/script'; " + text)
745
+ check_process.write("require 'cosmos'; require 'cosmos/script'; " + selection)
847
746
  check_process.close_write
848
747
  results = check_process.gets
849
748
  check_process.close
@@ -1060,7 +959,7 @@ module Cosmos
1060
959
  @debug_frame = nil
1061
960
  end
1062
961
 
1063
- def self.breakpoint(filename, line_number)
962
+ def self.set_breakpoint(filename, line_number)
1064
963
  filename = File.basename(filename)
1065
964
  @@breakpoints[filename] ||= {}
1066
965
  @@breakpoints[filename][line_number] = true
@@ -1645,7 +1544,7 @@ module Cosmos
1645
1544
  breakpoints = @@breakpoints[File.basename(filename)]
1646
1545
  if breakpoints
1647
1546
  breakpoints.each do |line_number, present|
1648
- @active_script.breakpoint(line_number) if present
1547
+ @active_script.add_breakpoint(line_number) if present
1649
1548
  end
1650
1549
  end
1651
1550
  end
@@ -48,21 +48,30 @@ module Cosmos
48
48
  class TestResult
49
49
  attr_accessor :test
50
50
  attr_accessor :test_case
51
+ attr_accessor :test_suite
51
52
  attr_accessor :output
52
53
  attr_accessor :exceptions
53
54
  attr_accessor :stopped
54
55
  attr_accessor :result
55
56
  attr_accessor :message
56
57
 
58
+ @@test_suite = nil
59
+
57
60
  def initialize
58
61
  @test = nil
59
62
  @test_case = nil
63
+ @test_suite = nil
64
+ @test_suite = @@test_suite.clone if @@test_suite
60
65
  @output = nil
61
66
  @exceptions = nil
62
67
  @stopped = false
63
68
  @result = :SKIP
64
69
  @message = nil
65
70
  end
71
+
72
+ def self.test_suite= (test_suite)
73
+ @@test_suite = test_suite
74
+ end
66
75
  end # class TestResult
67
76
 
68
77
  # TestGroup class
@@ -104,7 +113,7 @@ module Cosmos
104
113
  # Name of the test
105
114
  def name
106
115
  if self.class != Test
107
- self.class.to_s
116
+ self.class.to_s.split('::')[-1]
108
117
  else
109
118
  'UnnamedTest'
110
119
  end
@@ -160,7 +169,7 @@ module Cosmos
160
169
  $stdout.add_stream(@output_io)
161
170
  $stderr.add_stream(@output_io)
162
171
 
163
- result.test = object.class.to_s
172
+ result.test = object.class.to_s.split('::')[-1]
164
173
  result.test_case = method_name.to_s
165
174
  begin
166
175
  if defined? ScriptRunnerFrame
@@ -273,6 +282,38 @@ module Cosmos
273
282
  @@current_test_result.message << "\n"
274
283
  end
275
284
  end
285
+
286
+ def self.current_test_suite
287
+ if @@current_test_result
288
+ @@current_test_result.test_suite
289
+ else
290
+ nil
291
+ end
292
+ end
293
+
294
+ def self.current_test_group
295
+ if @@current_test_result
296
+ @@current_test_result.test
297
+ else
298
+ nil
299
+ end
300
+ end
301
+
302
+ def self.current_test
303
+ if @@current_test_result
304
+ @@current_test_result.test
305
+ else
306
+ nil
307
+ end
308
+ end
309
+
310
+ def self.current_test_case
311
+ if @@current_test_result
312
+ @@current_test_result.test_case
313
+ else
314
+ nil
315
+ end
316
+ end
276
317
  end # class Test
277
318
 
278
319
  class TestSuite
@@ -291,7 +332,7 @@ module Cosmos
291
332
  # Name of the test suite
292
333
  def name
293
334
  if self.class != TestSuite
294
- self.class.to_s
335
+ self.class.to_s.split('::')[-1]
295
336
  else
296
337
  'UnassignedTestSuite'
297
338
  end
@@ -327,6 +368,7 @@ module Cosmos
327
368
 
328
369
  # Run all the tests
329
370
  def run(&block)
371
+ TestResult.test_suite = name()
330
372
  TestStatus.instance.total = get_num_tests()
331
373
  results = []
332
374
 
@@ -370,11 +412,14 @@ module Cosmos
370
412
  raise StopScript if result.stopped
371
413
  end
372
414
 
415
+ TestResult.test_suite = nil
373
416
  results
374
417
  end
375
418
 
376
419
  # Run a specific test
377
420
  def run_test(test_class, internal = false, &block)
421
+ TestResult.test_suite = name() unless internal
422
+
378
423
  # Determine if this test_class is in the plan and the number of tests associated with this test_class
379
424
  in_plan = false
380
425
  num_tests = 0
@@ -422,43 +467,57 @@ module Cosmos
422
467
  end
423
468
  end
424
469
 
470
+ TestResult.test_suite = nil unless internal
425
471
  return results
426
472
  end
427
473
 
428
474
  # Run a specific test case
429
475
  def run_test_case(test_class, test_case, internal = false)
476
+ TestResult.test_suite = name() unless internal
430
477
  TestStatus.instance.total = 1 unless internal
431
- @tests[test_class].run_test_case(test_case)
478
+ result = @tests[test_class].run_test_case(test_case)
479
+ TestResult.test_suite = nil unless internal
480
+ result
432
481
  end
433
482
 
434
483
  def run_setup(internal = false)
484
+ TestResult.test_suite = name() unless internal
435
485
  result = nil
436
486
  if self.class.method_defined?(:setup) and @tests.length > 0
437
487
  TestStatus.instance.total = 1 unless internal
438
488
  TestStatus.instance.status = "#{self.class} : setup"
439
489
  result = @tests[@tests.keys[0]].run_function(self, :setup)
440
490
  end
491
+ TestResult.test_suite = nil unless internal
441
492
  result
442
493
  end
443
494
 
444
495
  def run_teardown(internal = false)
496
+ TestResult.test_suite = name() unless internal
445
497
  result = nil
446
498
  if self.class.method_defined?(:teardown) and @tests.length > 0
447
499
  TestStatus.instance.total = 1 unless internal
448
500
  TestStatus.instance.status = "#{self.class} : teardown"
449
501
  result = @tests[@tests.keys[0]].run_function(self, :teardown)
450
502
  end
503
+ TestResult.test_suite = nil unless internal
451
504
  result
452
505
  end
453
506
 
454
507
  def run_test_setup(test_class, internal = false)
508
+ TestResult.test_suite = name() unless internal
455
509
  TestStatus.instance.total = 1 unless internal
456
- @tests[test_class].run_setup
510
+ result = @tests[test_class].run_setup
511
+ TestResult.test_suite = nil unless internal
512
+ result
457
513
  end
458
514
 
459
515
  def run_test_teardown(test_class, internal = false)
516
+ TestResult.test_suite = name() unless internal
460
517
  TestStatus.instance.total = 1 unless internal
461
- @tests[test_class].run_teardown
518
+ result = @tests[test_class].run_teardown
519
+ TestResult.test_suite = nil unless internal
520
+ result
462
521
  end
463
522
 
464
523
  def get_num_tests