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
@@ -9,9 +9,59 @@
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
11
  require 'cosmos/script/script'
12
+ require 'cosmos/gui/choosers/combobox_chooser'
12
13
 
13
14
  $cmd_tlm_gui_window = nil
14
15
 
16
+ class Qt::Dialog
17
+ def exec(*args)
18
+ Cosmos.play_wav_file(Cosmos.data_path('message.wav')) if Cosmos::System.sound
19
+ method_missing(:exec, *args)
20
+ end
21
+ end
22
+ class Qt::MessageBox
23
+ def exec(*args)
24
+ Cosmos.play_wav_file(Cosmos.data_path('message.wav')) if Cosmos::System.sound
25
+ method_missing(:exec, *args)
26
+ end
27
+ def self.critical(parent, title, text,
28
+ buttons = Qt::MessageBox::Ok,
29
+ defaultButton = Qt::MessageBox::NoButton)
30
+ # Windows overrides critical dialogs with its own alert sound
31
+ Cosmos.play_wav_file(Cosmos.data_path('critical.wav')) if Cosmos::System.sound
32
+ super(parent,title,text,buttons,defaultButton)
33
+ end
34
+ def self.information(parent, title, text,
35
+ buttons = Qt::MessageBox::Ok,
36
+ defaultButton = Qt::MessageBox::NoButton)
37
+ Cosmos.play_wav_file(Cosmos.data_path('information.wav')) if Cosmos::System.sound
38
+ super(parent,title,text,buttons,defaultButton)
39
+ end
40
+ def self.question(parent, title, text,
41
+ buttons = Qt::MessageBox::Ok,
42
+ defaultButton = Qt::MessageBox::NoButton)
43
+ Cosmos.play_wav_file(Cosmos.data_path('question.wav')) if Cosmos::System.sound
44
+ super(parent,title,text,buttons,defaultButton)
45
+ end
46
+ def self.warning(parent, title, text,
47
+ buttons = Qt::MessageBox::Ok,
48
+ defaultButton = Qt::MessageBox::NoButton)
49
+ # Windows overrides warning dialogs with its own alert sound
50
+ Cosmos.play_wav_file(Cosmos.data_path('warning.wav')) if Cosmos::System.sound
51
+ super(parent,title,text,buttons,defaultButton)
52
+ end
53
+ end
54
+
55
+ class Qt::InputDialog
56
+ def self.getText(parent, title, label,
57
+ mode = Qt::LineEdit::Normal,
58
+ text = '', ok = 0, flags = 0,
59
+ inputMethodHints = Qt::ImhNone)
60
+ Cosmos.play_wav_file(Cosmos.data_path('input.wav')) if Cosmos::System.sound
61
+ super(parent, title, label, mode, text, ok, flags, inputMethodHints)
62
+ end
63
+ end
64
+
15
65
  module Cosmos
16
66
 
17
67
  # Cosmos script changes to handle hazardous commands and prompts
@@ -124,7 +174,7 @@ module Cosmos
124
174
 
125
175
  def prompt_message_box(string, buttons)
126
176
  loop do
127
- answer_text = nil
177
+ result = nil
128
178
  Qt.execute_in_main_thread(true, 0.05) do
129
179
  window = nil
130
180
  window = get_cmd_tlm_gui_window() if get_cmd_tlm_gui_window()
@@ -140,17 +190,113 @@ module Cosmos
140
190
  else
141
191
  Logger.info "User pressed '#{msg.clickedButton.text}' for '#{string}'"
142
192
  end
143
- answer_text = msg.clickedButton.text
193
+ result = msg.clickedButton.text
144
194
  msg.dispose
145
195
  end
146
- if answer_text == "Cancel"
196
+ if result == "Cancel"
197
+ prompt_for_script_abort()
198
+ else
199
+ return result
200
+ end
201
+ end
202
+ end
203
+
204
+ def prompt_vertical_message_box(string, buttons)
205
+ loop do
206
+ result = nil
207
+ Qt.execute_in_main_thread(true, 0.05) do
208
+ dialog = _build_dialog(string)
209
+
210
+ button_layout = Qt::VBoxLayout.new
211
+ button_layout.setContentsMargins(11,11,11,11)
212
+ buttons.each do |button_text|
213
+ button = Qt::PushButton.new(button_text)
214
+ button.connect(SIGNAL('clicked()')) do
215
+ result = button_text
216
+ dialog.accept()
217
+ end
218
+ button_layout.addWidget(button)
219
+ end
220
+ dialog.layout.addLayout(button_layout)
221
+ dialog.layout.addWidget(_build_dialog_buttons(dialog, false))
222
+ result = "Cancel" unless _exec_dialog(dialog, string, result)
223
+ end
224
+ if result == "Cancel"
147
225
  prompt_for_script_abort()
148
226
  else
149
- return answer_text
227
+ return result
150
228
  end
151
229
  end
152
230
  end
153
231
 
232
+ def prompt_combo_box(string, options)
233
+ loop do
234
+ result = options[0]
235
+ Qt.execute_in_main_thread(true, 0.05) do
236
+ dialog = _build_dialog(string)
237
+ chooser = ComboboxChooser.new(dialog, "Select:", options)
238
+ chooser.setContentsMargins(11,11,11,11)
239
+ chooser.sel_command_callback = lambda { |value| result = value }
240
+ dialog.layout.addWidget(chooser)
241
+ dialog.layout.addWidget(_build_dialog_buttons(dialog))
242
+ result = "Cancel" unless _exec_dialog(dialog, string, result)
243
+ end
244
+ if result == "Cancel"
245
+ prompt_for_script_abort()
246
+ else
247
+ return result
248
+ end
249
+ end
250
+ end
251
+
252
+ def _build_dialog(message)
253
+ window = nil
254
+ window = get_cmd_tlm_gui_window() if get_cmd_tlm_gui_window()
255
+ dialog = Qt::Dialog.new(window)
256
+ dialog.setWindowTitle("Message Box")
257
+ layout = Qt::VBoxLayout.new
258
+ layout.setContentsMargins(0,0,0,0)
259
+
260
+ label = Qt::Label.new(message)
261
+ label.setStyleSheet("background-color: white;")
262
+ label.setMargin(11)
263
+ layout.addWidget(label)
264
+ dialog.setLayout(layout)
265
+ dialog
266
+ end
267
+
268
+ def _exec_dialog(dialog, message, selection)
269
+ result = true
270
+ if dialog.exec() == Qt::Dialog::Accepted
271
+ Logger.info "User selected '#{selection}' for '#{message}'"
272
+ else
273
+ Logger.warn "User pressed 'Cancel' for '#{message}'"
274
+ result = false
275
+ end
276
+ dialog.dispose
277
+ result
278
+ end
279
+
280
+ def _build_dialog_buttons(dialog, ok_button = true)
281
+ button_layout = Qt::HBoxLayout.new
282
+ if ok_button
283
+ ok = Qt::PushButton.new("Ok")
284
+ ok.connect(SIGNAL('clicked()')) do
285
+ dialog.accept()
286
+ end
287
+ button_layout.addWidget(ok)
288
+ end
289
+ cancel = Qt::PushButton.new("Cancel")
290
+ cancel.connect(SIGNAL('clicked()')) do
291
+ dialog.reject()
292
+ end
293
+ button_layout.addWidget(cancel)
294
+
295
+ widget = Qt::Widget.new
296
+ widget.setLayout(button_layout)
297
+ widget
298
+ end
299
+
154
300
  def get_scriptrunner_log_message(title_text = "Script Message Log Text Entry", prompt_text = 'Enter text to log to the script message log')
155
301
  answer = ""
156
302
  canceled = false
@@ -290,7 +290,7 @@ module Cosmos
290
290
  request_data = JsonDRb.receive_message(my_socket, data)
291
291
  start_time = Time.now
292
292
  @request_count += 1
293
- rescue Errno::ECONNRESET, Errno::ECONNABORTED
293
+ rescue Errno::ECONNRESET, Errno::ECONNABORTED, Errno::ENOTSOCK
294
294
  # Socket was closed
295
295
  break
296
296
  end
@@ -112,8 +112,7 @@ module Cosmos
112
112
 
113
113
  loop do
114
114
  loop do
115
- # Read 1 byte
116
- buffer = Win32.read_file(@handle, 1)
115
+ buffer = Win32.read_file(@handle, @read_max_length - data.length)
117
116
  data << buffer
118
117
  break if buffer.length <= 0 or data.length >= @read_max_length
119
118
  end
@@ -133,8 +132,7 @@ module Cosmos
133
132
  data = ''
134
133
 
135
134
  loop do
136
- # Read 1 byte
137
- buffer = Win32.read_file(@handle, 1)
135
+ buffer = Win32.read_file(@handle, @read_max_length - data.length)
138
136
  data << buffer
139
137
  break if buffer.length <= 0 or data.length >= @read_max_length
140
138
  end
@@ -89,6 +89,7 @@ module Cosmos
89
89
  @file_header_length = 0
90
90
  @file.seek(0, IO::SEEK_SET)
91
91
  System.load_configuration(nil)
92
+ return true, nil # No configuration name supported so always return success
92
93
  else
93
94
  raise "Failed to read at least #{CCSDS_HEADER_LENGTH} bytes from packet log"
94
95
  end
@@ -107,13 +107,16 @@ module Cosmos
107
107
  end
108
108
 
109
109
  # @param filename [String] The log filename to open
110
+ # @return [Boolean, Exception] Returns true if successfully changed to configuration specified in log,
111
+ # otherwise returns false and potentially an Exception class if an error occurred. If no error occurred
112
+ # false indicates that the requested configuration was simply not found
110
113
  def open(filename)
111
114
  close()
112
115
  reset()
113
116
  @filename = filename
114
117
  @file = BufferedFile.open(@filename, 'rb')
115
118
  @bytes_read = 0
116
- read_file_header()
119
+ return read_file_header()
117
120
  rescue => err
118
121
  close()
119
122
  raise err
@@ -253,29 +256,35 @@ module Cosmos
253
256
  packet
254
257
  end
255
258
 
259
+ # Should return if successfully switched to requested configuration
256
260
  def read_file_header
257
261
  header = @file.read(COSMOS2_HEADER_LENGTH)
258
262
  if header and header.length == COSMOS2_HEADER_LENGTH
259
263
  if header[COSMOS2_MARKER_RANGE] == COSMOS2_MARKER
260
264
  # Found COSMOS 2 File Header
261
265
  @log_type = header[COSMOS2_LOG_TYPE_RANGE].intern
266
+ raise "Unknown log type #{@log_type}" unless [:CMD, :TLM].include? @log_type
262
267
  @configuration_name = header[COSMOS2_CONFIGURATION_NAME_RANGE]
263
268
  @hostname = header[COSMOS2_HOSTNAME_RANGE].strip
264
269
  @file_header_length = COSMOS2_HEADER_LENGTH
265
- System.load_configuration(@configuration_name)
270
+ new_config_name, error = System.load_configuration(@configuration_name)
271
+ return true, error if new_config_name == @configuration_name
272
+ return false, error # Did not successfully change to requested configuration name
266
273
  elsif header[COSMOS1_MARKER_RANGE] == COSMOS1_MARKER
267
274
  # Found COSMOS 1 File Header
268
275
  @log_type = header[COSMOS1_LOG_TYPE_RANGE].upcase.intern
276
+ raise "Unknown log type #{@log_type}" unless [:CMD, :TLM].include? @log_type
269
277
  @configuration_name = header[COSMOS1_CONFIGURATION_NAME_RANGE]
270
278
  @hostname = nil
271
279
  @file_header_length = COSMOS1_HEADER_LENGTH
272
280
  # Move back to beginning of first packet
273
281
  @file.seek(COSMOS1_HEADER_LENGTH, IO::SEEK_SET)
274
- System.load_configuration(@configuration_name)
282
+ new_config_name, error = System.load_configuration(@configuration_name)
283
+ return true, error if new_config_name == @configuration_name
284
+ return false, error # Did not successfully change to requested configuration name
275
285
  else
276
286
  raise "COSMOS file header not found on packet log"
277
287
  end
278
- raise "Unknown log type #{@log_type}" unless [:CMD, :TLM].include? @log_type
279
288
  else
280
289
  raise "Failed to read at least #{COSMOS2_HEADER_LENGTH} bytes from packet log"
281
290
  end
@@ -249,9 +249,12 @@ module Cosmos
249
249
  return packet
250
250
  end
251
251
 
252
- def includes_item?(array, target_name, packet_name, item_name)
253
- array.each do |array_target_name, array_packet_name, array_item_name|
254
- if ((array_target_name == target_name) && (array_packet_name == packet_name) && (array_item_name == item_name))
252
+ def includes_item?(ignored_items, target_name, packet_name, item_name)
253
+ ignored_items.each do |array_target_name, array_packet_name, array_item_name|
254
+ if ((array_target_name == target_name) &&
255
+ (array_packet_name == packet_name) &&
256
+ # If the item name is nil we're ignoring an entire packet
257
+ (array_item_name == item_name || array_item_name.nil?))
255
258
  return true
256
259
  end
257
260
  end
@@ -244,13 +244,43 @@ module Cosmos
244
244
 
245
245
  # Iterates through all the telemetry packets and marks them stale if they
246
246
  # haven't been received for over the System.staleness_seconds value.
247
+ #
248
+ # @return [Array(Packet)] Array of the stale packets
247
249
  def check_stale
250
+ stale = []
248
251
  time = Time.now
249
252
  @config.telemetry.each do |target_name, target_packets|
250
253
  target_packets.each do |packet_name, packet|
251
- packet.set_stale if packet.received_time and (!packet.stale) and (time - packet.received_time > System.staleness_seconds)
254
+ if packet.received_time and (!packet.stale) and (time - packet.received_time > System.staleness_seconds)
255
+ packet.set_stale
256
+ stale << packet
257
+ end
258
+ end
259
+ end
260
+ stale
261
+ end
262
+
263
+ # @param with_limits_only [Boolean] Return only the stale packets
264
+ # that have limits items and thus affect the overall limits
265
+ # state of the system
266
+ # @param target [String] Target name or nil for all targets
267
+ # @return [Array(Packet)] Array of the stale packets
268
+ def stale(with_limits_only = false, target = nil)
269
+ if target && !target_names.include?(target)
270
+ raise "Telemetry target '#{target.upcase}' does not exist"
271
+ end
272
+ stale = []
273
+ @config.telemetry.each do |target_name, target_packets|
274
+ next if (target && target != target_name)
275
+ next if target_name == 'UNKNOWN'
276
+ target_packets.each do |packet_name, packet|
277
+ if packet.stale
278
+ next if (with_limits_only && packet.limits_items.empty?)
279
+ stale << packet
280
+ end
252
281
  end
253
282
  end
283
+ stale
254
284
  end
255
285
 
256
286
  # Clears the received_count value on every packet in every target
@@ -308,8 +338,9 @@ module Cosmos
308
338
  strings
309
339
  end
310
340
 
311
- # @return [Hash<String=>Packet>] Hash of all the telemetry packets
312
- # keyed by the packet name.
341
+ # @return [Hash{String=>Hash{String=>Packet}}] Hash of all the telemetry
342
+ # packets keyed by the target name. The value is another hash keyed by the
343
+ # packet name returning the packet.
313
344
  def all
314
345
  @config.telemetry
315
346
  end
@@ -24,7 +24,7 @@ module Cosmos
24
24
  #
25
25
  # See Processor#call
26
26
  def call(packet, buffer)
27
- if CmdTlmServer.instance
27
+ if CmdTlmServer.instance and $0 !~ /Replay/
28
28
  CmdTlmServer.instance.start_logging(@packet_log_writer_name)
29
29
  end
30
30
  end
@@ -161,6 +161,24 @@ module Cosmos
161
161
  return $cmd_tlm_server.get_cmd_hazardous(target_name, cmd_name, cmd_params)
162
162
  end
163
163
 
164
- end
165
- end
164
+ # Returns a value from the specified command
165
+ def get_cmd_value(target_name, command_name, parameter_name, value_type = :CONVERTED)
166
+ return $cmd_tlm_server.get_cmd_value(target_name, command_name, parameter_name, value_type)
167
+ end
168
+
169
+ # Returns the time the most recent command was sent
170
+ def get_cmd_time(target_name = nil, command_name = nil)
171
+ results = $cmd_tlm_server.get_cmd_time(target_name, command_name)
172
+ if Array === results
173
+ if results[2] and results[3]
174
+ results[2] = Time.at(results[2], results[3])
175
+ end
176
+ results.delete_at(3)
177
+ end
178
+ results
179
+ end
180
+
181
+ end # module Script
182
+
183
+ end # module Cosmos
166
184
 
@@ -86,12 +86,20 @@ module Cosmos
86
86
  end
87
87
 
88
88
  def extract_fields_from_set_tlm_text(text)
89
- split_string = text.split
90
- raise "ERROR: Set Telemetry Item must be specified as 'TargetName PacketName ItemName = Value' : #{text}" if split_string.length != 5
89
+ error_msg = "ERROR: Set Telemetry Item must be specified as 'TargetName PacketName ItemName = Value' : #{text}"
90
+ # We have to handle these cases:
91
+ # set_tlm("TGT PKT ITEM='new item'")
92
+ # set_tlm("TGT PKT ITEM = 'new item'")
93
+ # set_tlm("TGT PKT ITEM= 'new item'")
94
+ # set_tlm("TGT PKT ITEM ='new item'")
95
+ split_string = text.split('=')
96
+ raise error_msg if split_string.length < 2 || split_string[1].strip.empty?
97
+ split_string = split_string[0].strip.split << split_string[1..-1].join('=').strip
98
+ raise error_msg if split_string.length != 4 # Ensure tgt,pkt,item,value
91
99
  target_name = split_string[0]
92
100
  packet_name = split_string[1]
93
101
  item_name = split_string[2]
94
- value = split_string[4].convert_to_value
102
+ value = split_string[3].strip.convert_to_value
95
103
  value = value.remove_quotes if String === value
96
104
  return [target_name, packet_name, item_name, value]
97
105
  end
@@ -37,6 +37,10 @@ module Cosmos
37
37
  return $cmd_tlm_server.disable_limits(*args)
38
38
  end
39
39
 
40
+ def get_stale(with_limits_only = false, target_name = nil)
41
+ return $cmd_tlm_server.get_stale(with_limits_only, target_name)
42
+ end
43
+
40
44
  def get_limits(target_name, packet_name, item_name, limits_set = nil)
41
45
  results = $cmd_tlm_server.get_limits(target_name, packet_name, item_name, limits_set)
42
46
  results[0] = results[0].to_s.intern if results[0]
@@ -96,6 +100,8 @@ module Cosmos
96
100
  result[1][4] = result[1][4].to_s.intern if result[1][4]
97
101
  elsif result[0] == :LIMITS_SETTINGS
98
102
  result[1][3] = result[1][3].to_s.intern if result[1][3]
103
+ elsif result[0] == :STALE_PACKET
104
+ # Nothing extra to do
99
105
  else
100
106
  result[1] = result[1].to_s.intern
101
107
  end
@@ -19,15 +19,7 @@ module Cosmos
19
19
  include Extract
20
20
 
21
21
  def play_wav_file(wav_filename)
22
- if defined? Qt
23
- Qt.execute_in_main_thread(true) do
24
- if Qt::CoreApplication.instance and Qt::Sound.isAvailable
25
- Cosmos.set_working_dir do
26
- Qt::Sound.play(wav_filename.to_s)
27
- end
28
- end
29
- end
30
- end
22
+ Cosmos.play_wav_file(wav_filename)
31
23
  end
32
24
 
33
25
  def status_bar(message)
@@ -69,6 +61,14 @@ module Cosmos
69
61
  prompt_message_box(string, buttons)
70
62
  end
71
63
 
64
+ def vertical_message_box(string, *buttons)
65
+ prompt_vertical_message_box(string, buttons)
66
+ end
67
+
68
+ def combo_box(string, *options)
69
+ prompt_combo_box(string, options)
70
+ end
71
+
72
72
  # Creates a string with the parameters upcased
73
73
  def _upcase(target_name, packet_name, item_name)
74
74
  "#{target_name.upcase} #{packet_name.upcase} #{item_name.upcase}"
@@ -884,6 +884,14 @@ module Cosmos
884
884
  gets.chomp
885
885
  end
886
886
 
887
+ def prompt_vertical_message_box(string, options)
888
+ prompt_message_box(string, options)
889
+ end
890
+
891
+ def prompt_combo_box(string, options)
892
+ prompt_message_box(string, options)
893
+ end
894
+
887
895
  end # module Script
888
896
 
889
897
  end # module Cosmos