cosmos 3.4.2 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (261) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +69 -11
  3. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +23 -0
  4. data/autohotkey/tools/TestRunnerAHK5 +17 -0
  5. data/autohotkey/tools/TestRunnerAHK6 +17 -0
  6. data/autohotkey/tools/cmd_extractor.ahk +6 -0
  7. data/autohotkey/tools/data_viewer.ahk +6 -0
  8. data/autohotkey/tools/limits_monitor.ahk +67 -14
  9. data/autohotkey/tools/replay.ahk +6 -0
  10. data/autohotkey/tools/test_runner5.ahk +8 -0
  11. data/autohotkey/tools/test_runner6.ahk +5 -0
  12. data/autohotkey/tools/tlm_extractor.ahk +25 -1
  13. data/autohotkey/tools/tlm_grapher.ahk +6 -0
  14. data/cosmos.gemspec +19 -19
  15. data/data/crc.txt +46 -46
  16. data/data/critical.wav +0 -0
  17. data/data/information.wav +0 -0
  18. data/data/input.wav +0 -0
  19. data/data/message.wav +0 -0
  20. data/data/question.wav +0 -0
  21. data/data/warning.wav +0 -0
  22. data/demo/Gemfile +5 -1
  23. data/demo/Launcher +5 -4
  24. data/demo/Launcher.bat +6 -56
  25. data/demo/config/data/crc.txt +73 -55
  26. data/demo/config/system/system.txt +1 -0
  27. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +2 -0
  28. data/demo/procedures/example_test.rb +17 -16
  29. data/demo/tools/CmdExtractor +6 -5
  30. data/demo/tools/CmdExtractor.bat +6 -56
  31. data/demo/tools/CmdSender +6 -5
  32. data/demo/tools/CmdSender.bat +6 -56
  33. data/demo/tools/CmdTlmServer +6 -5
  34. data/demo/tools/CmdTlmServer.bat +6 -56
  35. data/demo/tools/DataViewer +6 -5
  36. data/demo/tools/DataViewer.bat +6 -56
  37. data/demo/tools/ExampleTarget +6 -5
  38. data/demo/tools/ExampleTarget.bat +6 -56
  39. data/demo/tools/HandbookCreator +6 -5
  40. data/demo/tools/HandbookCreator.bat +6 -58
  41. data/demo/tools/Launcher +6 -5
  42. data/demo/tools/Launcher.bat +6 -56
  43. data/demo/tools/LimitsMonitor +6 -5
  44. data/demo/tools/LimitsMonitor.bat +6 -56
  45. data/demo/tools/OpenGLBuilder +6 -5
  46. data/demo/tools/OpenGLBuilder.bat +6 -56
  47. data/demo/tools/PacketViewer +6 -5
  48. data/demo/tools/PacketViewer.bat +6 -56
  49. data/demo/tools/Replay +6 -5
  50. data/demo/tools/Replay.bat +6 -56
  51. data/demo/tools/ScpiTarget +6 -5
  52. data/demo/tools/ScpiTarget.bat +6 -56
  53. data/demo/tools/ScriptRunner +6 -5
  54. data/demo/tools/ScriptRunner.bat +6 -56
  55. data/demo/tools/TableManager +6 -5
  56. data/demo/tools/TableManager.bat +6 -56
  57. data/demo/tools/TestRunner +6 -5
  58. data/demo/tools/TestRunner.bat +6 -56
  59. data/demo/tools/TlmExtractor +6 -5
  60. data/demo/tools/TlmExtractor.bat +6 -56
  61. data/demo/tools/TlmGrapher +6 -5
  62. data/demo/tools/TlmGrapher.bat +6 -56
  63. data/demo/tools/TlmViewer +6 -5
  64. data/demo/tools/TlmViewer.bat +6 -56
  65. data/demo/tools/ToolLaunch.bat +63 -0
  66. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +6 -5
  67. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  68. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +6 -5
  69. data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -0
  70. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +6 -5
  71. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -0
  72. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +6 -5
  73. data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  74. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +6 -5
  75. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -0
  76. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +6 -5
  77. data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -0
  78. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +6 -5
  79. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -0
  80. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +6 -5
  81. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -0
  82. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +6 -5
  83. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  84. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +6 -5
  85. data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -0
  86. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +6 -5
  87. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  88. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +6 -5
  89. data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -0
  90. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +6 -5
  91. data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  92. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +6 -5
  93. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  94. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +6 -5
  95. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -0
  96. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +6 -5
  97. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  98. data/demo/tools/tool_launch.rb +38 -0
  99. data/install/Gemfile +5 -1
  100. data/install/Launcher +5 -3
  101. data/install/Launcher.bat +6 -56
  102. data/install/config/data/crc.txt +67 -49
  103. data/install/config/tools/launcher/launcher.txt +1 -0
  104. data/install/tools/CmdExtractor +6 -5
  105. data/install/tools/CmdExtractor.bat +6 -56
  106. data/install/tools/CmdSender +6 -5
  107. data/install/tools/CmdSender.bat +6 -56
  108. data/install/tools/CmdTlmServer +6 -5
  109. data/install/tools/CmdTlmServer.bat +6 -56
  110. data/install/tools/DataViewer +6 -5
  111. data/install/tools/DataViewer.bat +6 -56
  112. data/install/tools/HandbookCreator +6 -5
  113. data/install/tools/HandbookCreator.bat +6 -58
  114. data/install/tools/Launcher +6 -5
  115. data/install/tools/Launcher.bat +6 -56
  116. data/install/tools/LimitsMonitor +6 -5
  117. data/install/tools/LimitsMonitor.bat +6 -56
  118. data/install/tools/OpenGLBuilder +6 -5
  119. data/install/tools/OpenGLBuilder.bat +6 -56
  120. data/install/tools/PacketViewer +6 -5
  121. data/install/tools/PacketViewer.bat +6 -56
  122. data/install/tools/Replay +6 -5
  123. data/install/tools/Replay.bat +6 -56
  124. data/install/tools/ScriptRunner +6 -5
  125. data/install/tools/ScriptRunner.bat +6 -56
  126. data/install/tools/TableManager +6 -5
  127. data/install/tools/TableManager.bat +6 -56
  128. data/install/tools/TestRunner +6 -5
  129. data/install/tools/TestRunner.bat +6 -56
  130. data/install/tools/TlmExtractor +6 -5
  131. data/install/tools/TlmExtractor.bat +6 -56
  132. data/install/tools/TlmGrapher +6 -5
  133. data/install/tools/TlmGrapher.bat +6 -56
  134. data/install/tools/TlmViewer +6 -5
  135. data/install/tools/TlmViewer.bat +6 -56
  136. data/install/tools/ToolLaunch.bat +63 -0
  137. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +6 -5
  138. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  139. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +6 -5
  140. data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -0
  141. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +6 -5
  142. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -0
  143. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +6 -5
  144. data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  145. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +6 -5
  146. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -0
  147. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +6 -5
  148. data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -0
  149. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +6 -5
  150. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -0
  151. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +6 -5
  152. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -0
  153. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +6 -5
  154. data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  155. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +6 -5
  156. data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -0
  157. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +6 -5
  158. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  159. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +6 -5
  160. data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -0
  161. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +6 -5
  162. data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  163. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +6 -5
  164. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  165. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +6 -5
  166. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -0
  167. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +6 -5
  168. data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  169. data/install/tools/tool_launch.rb +38 -0
  170. data/lib/cosmos/core_ext/string.rb +3 -2
  171. data/lib/cosmos/gui/dialogs/about_dialog.rb +3 -7
  172. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +200 -136
  173. data/lib/cosmos/gui/opengl/gl_viewer.rb +8 -8
  174. data/lib/cosmos/gui/qt.rb +56 -27
  175. data/lib/cosmos/gui/qt_tool.rb +3 -1
  176. data/lib/cosmos/gui/text/ruby_editor.rb +130 -110
  177. data/lib/cosmos/gui/utilities/script_module_gui.rb +150 -4
  178. data/lib/cosmos/io/json_drb.rb +1 -1
  179. data/lib/cosmos/io/win32_serial_driver.rb +2 -4
  180. data/lib/cosmos/packet_logs/ccsds_log_reader.rb +1 -0
  181. data/lib/cosmos/packet_logs/packet_log_reader.rb +13 -4
  182. data/lib/cosmos/packets/limits.rb +6 -3
  183. data/lib/cosmos/packets/telemetry.rb +34 -3
  184. data/lib/cosmos/processors/new_packet_log_processor.rb +1 -1
  185. data/lib/cosmos/script/commands.rb +20 -2
  186. data/lib/cosmos/script/extract.rb +11 -3
  187. data/lib/cosmos/script/limits.rb +6 -0
  188. data/lib/cosmos/script/scripting.rb +17 -9
  189. data/lib/cosmos/system/system.rb +73 -17
  190. data/lib/cosmos/system/target.rb +10 -5
  191. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +1 -0
  192. data/lib/cosmos/tools/cmd_tlm_server/api.rb +95 -0
  193. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +8 -4
  194. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +55 -0
  195. data/lib/cosmos/tools/data_viewer/data_viewer.rb +5 -12
  196. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +14 -48
  197. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +1 -5
  198. data/lib/cosmos/tools/launcher/launcher.rb +4 -0
  199. data/lib/cosmos/tools/launcher/launcher_config.rb +50 -0
  200. data/lib/cosmos/tools/launcher/launcher_tool.rb +21 -9
  201. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +607 -566
  202. data/lib/cosmos/tools/replay/replay.rb +51 -45
  203. data/lib/cosmos/tools/script_runner/script_runner.rb +13 -5
  204. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +8 -109
  205. data/lib/cosmos/tools/test_runner/test.rb +65 -6
  206. data/lib/cosmos/tools/test_runner/test_runner.rb +4 -4
  207. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +5 -0
  208. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +3 -0
  209. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +3 -2
  210. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +9 -6
  211. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +1 -5
  212. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +1 -5
  213. data/lib/cosmos/top_level.rb +86 -3
  214. data/lib/cosmos/version.rb +5 -5
  215. data/lib/cosmos/win32/win32_main.rb +7 -1
  216. data/spec/packet_logs/packet_log_reader_spec.rb +67 -7
  217. data/spec/packets/limits_spec.rb +19 -1
  218. data/spec/packets/telemetry_spec.rb +44 -1
  219. data/spec/script/commands_spec.rb +14 -0
  220. data/spec/script/scripting_spec.rb +5 -1
  221. data/spec/script/telemetry_spec.rb +38 -3
  222. data/spec/system/system_spec.rb +24 -4
  223. data/spec/tools/cmd_tlm_server/api_spec.rb +30 -0
  224. data/test/benchmarks/gsub_benchmark.rb +42 -4
  225. data/test/benchmarks/is_a_benchmark.rb +34 -0
  226. data/test/performance/config/data/crc.txt +161 -171
  227. data/test/performance/config/system/system_packets.txt +10 -10
  228. data/test/performance/config/system/system_threads.txt +30 -30
  229. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +7 -2
  230. data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -0
  231. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -0
  232. data/test/performance/config/targets/{EXAMPLE → PACKET}/cmd_tlm_server.txt +2 -2
  233. data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -0
  234. data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -0
  235. data/test/performance/config/targets/PACKET/screens/status.txt +25 -0
  236. data/test/performance/config/targets/PACKET/target.txt +28 -0
  237. data/test/performance/config/targets/{EXAMPLE/cmd_tlm/example_cmds.txt → THREAD/cmd_tlm/thread_cmds.txt} +1 -1
  238. data/test/performance/config/targets/{EXAMPLE/cmd_tlm/example_tlm.txt → THREAD/cmd_tlm/thread_tlm.txt} +1 -1
  239. data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -0
  240. data/test/performance/config/targets/{EXAMPLE/lib/example_interface.rb → THREAD/lib/thread_interface.rb} +1 -1
  241. data/test/performance/config/targets/THREAD/screens/status.txt +25 -0
  242. data/test/performance/config/targets/{EXAMPLE → THREAD}/target.txt +0 -0
  243. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +24 -30
  244. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +31 -31
  245. data/test/performance/config/tools/launcher/launcher_packets.txt +16 -11
  246. data/test/performance/config/tools/launcher/launcher_threads.txt +41 -35
  247. data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -0
  248. data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +10 -38
  249. data/test/performance/lib/packet_target.rb +126 -0
  250. data/test/performance/lib/{example_target.rb → thread_target.rb} +9 -9
  251. data/test/performance/tools/CmdTlmServerMemProf +1 -1
  252. data/test/performance/tools/{ExampleTarget → PacketTarget} +2 -2
  253. data/test/performance/tools/{ExampleTarget.bat → PacketTarget.bat} +0 -0
  254. data/test/performance/tools/ThreadTarget +14 -0
  255. data/test/performance/tools/ThreadTarget.bat +59 -0
  256. data/test/performance/tools/TlmGrapherMemProf +1 -1
  257. data/test/performance/tools/TlmViewerMemProf +19 -0
  258. data/{autohotkey/tools/Replay.bat → test/performance/tools/TlmViewerMemProf.bat} +1 -1
  259. metadata +107 -55
  260. data/test/performance/lib/example_background_task.rb +0 -57
  261. data/test/performance/lib/scpi_target.rb +0 -74
@@ -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