cosmos 3.5.1 → 3.5.2

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 (1158) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -1
  3. data/.gitattributes +3 -3
  4. data/.gitignore +48 -48
  5. data/.travis.yml +8 -8
  6. data/CONTRIBUTING.txt +50 -50
  7. data/Gemfile +10 -10
  8. data/Guardfile +27 -27
  9. data/LICENSE.txt +879 -879
  10. data/Manifest.txt +1414 -1414
  11. data/README.md +111 -111
  12. data/Rakefile +218 -214
  13. data/autohotkey/config/data/diamond.STL +57 -57
  14. data/autohotkey/config/system/system.txt +34 -34
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  17. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  18. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  20. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +270 -270
  21. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  22. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  23. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -305
  24. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  25. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  26. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  27. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  28. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  29. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  30. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  31. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  32. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  33. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  34. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  37. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  38. data/autohotkey/config/targets/INST/target.txt +26 -26
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  40. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  41. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  42. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  43. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  44. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  45. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  46. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  47. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  48. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  49. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  50. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  51. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  52. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  55. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  57. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  58. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  59. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  60. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  61. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  62. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  63. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  64. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  65. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  66. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  67. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  69. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  70. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  71. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  72. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  75. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  76. data/autohotkey/lib/example_background_task.rb +42 -42
  77. data/autohotkey/lib/user_version.rb +3 -3
  78. data/autohotkey/procedures/clear_util.rb +7 -7
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +24 -24
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/ReplayAHK +17 -17
  101. data/autohotkey/tools/ScriptRunner +14 -14
  102. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  103. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  104. data/autohotkey/tools/TableManager +14 -14
  105. data/autohotkey/tools/TableManagerAHK +30 -30
  106. data/autohotkey/tools/TestRunner +15 -15
  107. data/autohotkey/tools/TestRunnerAHK +17 -17
  108. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  109. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK5 +17 -17
  112. data/autohotkey/tools/TestRunnerAHK6 +17 -17
  113. data/autohotkey/tools/TlmExtractor +15 -15
  114. data/autohotkey/tools/TlmExtractorAHK +19 -19
  115. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  116. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  117. data/autohotkey/tools/TlmGrapher +14 -14
  118. data/autohotkey/tools/TlmGrapherAHK +19 -19
  119. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  120. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  121. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  122. data/autohotkey/tools/TlmViewer +14 -14
  123. data/autohotkey/tools/TlmViewerAHK +28 -28
  124. data/autohotkey/tools/TlmViewerAHK2 +22 -22
  125. data/autohotkey/tools/TlmViewerAHK3 +23 -23
  126. data/autohotkey/tools/TlmViewerAHK4 +22 -22
  127. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  128. data/autohotkey/tools/autohotkey.rb +37 -37
  129. data/autohotkey/tools/cmd_extractor.ahk +33 -33
  130. data/autohotkey/tools/cmd_sender.ahk +182 -182
  131. data/autohotkey/tools/cmd_tlm_server.ahk +90 -90
  132. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  133. data/autohotkey/tools/data_viewer.ahk +141 -141
  134. data/autohotkey/tools/handbook_creator.ahk +32 -32
  135. data/autohotkey/tools/launcher.ahk +41 -41
  136. data/autohotkey/tools/limits_monitor.ahk +123 -123
  137. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  138. data/autohotkey/tools/packet_viewer.ahk +196 -196
  139. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  140. data/autohotkey/tools/replay.ahk +104 -104
  141. data/autohotkey/tools/script_runner.ahk +589 -589
  142. data/autohotkey/tools/script_runner2.ahk +38 -38
  143. data/autohotkey/tools/table_manager.ahk +220 -220
  144. data/autohotkey/tools/test_runner.ahk +262 -262
  145. data/autohotkey/tools/test_runner2.ahk +53 -53
  146. data/autohotkey/tools/test_runner3.ahk +13 -13
  147. data/autohotkey/tools/test_runner5.ahk +8 -8
  148. data/autohotkey/tools/test_runner6.ahk +5 -5
  149. data/autohotkey/tools/tlm_extractor.ahk +296 -296
  150. data/autohotkey/tools/tlm_grapher.ahk +660 -660
  151. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  152. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  153. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  154. data/autohotkey/tools/tlm_viewer2.ahk +50 -50
  155. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  156. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  157. data/bin/cosmos +96 -96
  158. data/bin/cstol_converter +1166 -1166
  159. data/bin/rubysloc +85 -85
  160. data/cosmos.gemspec +99 -99
  161. data/data/about.txt +4 -4
  162. data/data/crc.txt +326 -326
  163. data/data/diamond.STL +57 -57
  164. data/data/legal.txt +9 -9
  165. data/demo/Gemfile +10 -10
  166. data/demo/Launcher +16 -16
  167. data/demo/Launcher.bat +0 -0
  168. data/demo/Rakefile +77 -77
  169. data/demo/config/data/crc.txt +224 -226
  170. data/demo/config/data/diamond.STL +57 -57
  171. data/demo/config/data/meta_init.txt +4 -4
  172. data/demo/config/system/system.txt +35 -35
  173. data/demo/config/system/system2.txt +33 -33
  174. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  175. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  176. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  177. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  178. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  179. data/demo/config/targets/COSMOS/target.txt +11 -11
  180. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  181. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +5 -5
  182. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  183. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  184. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  185. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  186. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  187. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  188. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  189. data/demo/config/targets/INST/lib/sim_inst.rb +305 -305
  190. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  191. data/demo/config/targets/INST/screens/array.txt +15 -15
  192. data/demo/config/targets/INST/screens/block.txt +8 -8
  193. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  194. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  195. data/demo/config/targets/INST/screens/ground.txt +25 -25
  196. data/demo/config/targets/INST/screens/hs.txt +44 -44
  197. data/demo/config/targets/INST/screens/latest.txt +23 -23
  198. data/demo/config/targets/INST/screens/other.txt +29 -29
  199. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  200. data/demo/config/targets/INST/target.txt +33 -33
  201. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  202. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  203. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  204. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  205. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  206. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -13
  207. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  208. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  209. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +56 -56
  210. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  211. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +39 -39
  212. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +34 -34
  213. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  214. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  215. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +88 -88
  216. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  217. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  218. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  219. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  220. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  221. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  222. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  223. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  224. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  225. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +82 -82
  226. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  227. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  228. data/demo/config/tools/launcher/launcher.txt +45 -45
  229. data/demo/config/tools/launcher/launcher2.txt +45 -45
  230. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  231. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  232. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  233. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  234. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  235. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  236. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  237. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  238. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  239. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  240. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  241. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  242. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  243. data/demo/lib/example_background_task.rb +57 -57
  244. data/demo/lib/example_target.rb +113 -113
  245. data/demo/lib/scpi_target.rb +74 -74
  246. data/demo/lib/user_version.rb +3 -3
  247. data/demo/procedures/checks.rb +11 -11
  248. data/demo/procedures/clear_util.rb +7 -7
  249. data/demo/procedures/collect.rb +18 -18
  250. data/demo/procedures/collect_util.rb +14 -14
  251. data/demo/procedures/cosmos_api_test.rb +293 -293
  252. data/demo/procedures/disconnect.rb +29 -29
  253. data/demo/procedures/example_test.rb +183 -183
  254. data/demo/procedures/plot_test.rb +8 -8
  255. data/demo/procedures/run_example_test.rb +3 -3
  256. data/demo/procedures/test.rb +51 -51
  257. data/demo/tools/CmdExtractor +16 -16
  258. data/demo/tools/CmdExtractor.bat +0 -0
  259. data/demo/tools/CmdSender +16 -16
  260. data/demo/tools/CmdSender.bat +0 -0
  261. data/demo/tools/CmdTlmServer +16 -16
  262. data/demo/tools/CmdTlmServer.bat +0 -0
  263. data/demo/tools/DataViewer +16 -16
  264. data/demo/tools/DataViewer.bat +0 -0
  265. data/demo/tools/ExampleTarget +16 -16
  266. data/demo/tools/ExampleTarget.bat +0 -0
  267. data/demo/tools/HandbookCreator +16 -16
  268. data/demo/tools/HandbookCreator.bat +0 -0
  269. data/demo/tools/Launcher +16 -16
  270. data/demo/tools/Launcher.bat +0 -0
  271. data/demo/tools/LimitsMonitor +16 -16
  272. data/demo/tools/LimitsMonitor.bat +0 -0
  273. data/demo/tools/OpenGLBuilder +16 -16
  274. data/demo/tools/OpenGLBuilder.bat +0 -0
  275. data/demo/tools/PacketViewer +16 -16
  276. data/demo/tools/PacketViewer.bat +0 -0
  277. data/demo/tools/Replay +16 -16
  278. data/demo/tools/Replay.bat +0 -0
  279. data/demo/tools/ScpiTarget +16 -16
  280. data/demo/tools/ScpiTarget.bat +0 -0
  281. data/demo/tools/ScriptRunner +16 -16
  282. data/demo/tools/ScriptRunner.bat +0 -0
  283. data/demo/tools/TableManager +16 -16
  284. data/demo/tools/TableManager.bat +0 -0
  285. data/demo/tools/TestRunner +16 -16
  286. data/demo/tools/TestRunner.bat +0 -0
  287. data/demo/tools/TlmExtractor +16 -16
  288. data/demo/tools/TlmExtractor.bat +0 -0
  289. data/demo/tools/TlmGrapher +16 -16
  290. data/demo/tools/TlmGrapher.bat +0 -0
  291. data/demo/tools/TlmViewer +16 -16
  292. data/demo/tools/TlmViewer.bat +0 -0
  293. data/demo/tools/ToolLaunch.bat +14 -5
  294. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  295. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  296. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  297. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  298. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  299. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  300. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  301. data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  302. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  304. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  305. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  306. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  307. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  308. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  309. data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  310. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  311. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  312. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  313. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  314. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  316. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  317. data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  318. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  319. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  320. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  321. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  322. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  323. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  324. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  325. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  326. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  328. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  329. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  330. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  331. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  332. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  333. data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  334. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  335. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  336. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  337. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  338. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  339. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  340. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  341. data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  342. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  343. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  344. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  345. data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  346. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  347. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  348. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  349. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  350. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  351. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  352. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  353. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  354. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  355. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  356. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  357. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  358. data/demo/tools/tool_launch.rb +38 -38
  359. data/ext/cosmos/ext/array/array.c +111 -111
  360. data/ext/cosmos/ext/array/extconf.rb +13 -13
  361. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  362. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  363. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  364. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  365. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  366. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  367. data/ext/cosmos/ext/crc/crc.c +341 -341
  368. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  369. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  370. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  371. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  372. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +265 -265
  373. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  374. data/ext/cosmos/ext/packet/packet.c +339 -339
  375. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  376. data/ext/cosmos/ext/platform/platform.c +101 -101
  377. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  378. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  379. data/ext/cosmos/ext/string/extconf.rb +13 -13
  380. data/ext/cosmos/ext/string/string.c +49 -49
  381. data/ext/cosmos/ext/structure/structure.c +1428 -1428
  382. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  383. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  384. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  385. data/ext/cosmos/ext/telemetry/telemetry.c +307 -307
  386. data/ext/mkrf_conf.rb +40 -40
  387. data/install/Gemfile +10 -10
  388. data/install/Launcher +16 -16
  389. data/install/Launcher.bat +0 -0
  390. data/install/Rakefile +77 -77
  391. data/install/config/data/crc.txt +151 -151
  392. data/install/config/system/system.txt +29 -29
  393. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  394. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  395. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  396. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  397. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  398. data/install/config/targets/COSMOS/target.txt +8 -8
  399. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  400. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  401. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  402. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  403. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  404. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  405. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  406. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  407. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  408. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  409. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  410. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  411. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  412. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  413. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  414. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  415. data/install/config/tools/launcher/launcher.txt +40 -40
  416. data/install/config/tools/script_runner/script_runner.txt +3 -3
  417. data/install/config/tools/test_runner/test_runner.txt +8 -8
  418. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  419. data/install/lib/user_version.rb +3 -3
  420. data/install/tools/CmdExtractor +16 -16
  421. data/install/tools/CmdExtractor.bat +0 -0
  422. data/install/tools/CmdSender +16 -16
  423. data/install/tools/CmdSender.bat +0 -0
  424. data/install/tools/CmdTlmServer +16 -16
  425. data/install/tools/CmdTlmServer.bat +0 -0
  426. data/install/tools/DataViewer +16 -16
  427. data/install/tools/DataViewer.bat +0 -0
  428. data/install/tools/HandbookCreator +16 -16
  429. data/install/tools/HandbookCreator.bat +0 -0
  430. data/install/tools/Launcher +16 -16
  431. data/install/tools/Launcher.bat +0 -0
  432. data/install/tools/LimitsMonitor +16 -16
  433. data/install/tools/LimitsMonitor.bat +0 -0
  434. data/install/tools/OpenGLBuilder +16 -16
  435. data/install/tools/OpenGLBuilder.bat +0 -0
  436. data/install/tools/PacketViewer +16 -16
  437. data/install/tools/PacketViewer.bat +0 -0
  438. data/install/tools/Replay +16 -16
  439. data/install/tools/Replay.bat +0 -0
  440. data/install/tools/ScriptRunner +16 -16
  441. data/install/tools/ScriptRunner.bat +0 -0
  442. data/install/tools/TableManager +16 -16
  443. data/install/tools/TableManager.bat +0 -0
  444. data/install/tools/TestRunner +16 -16
  445. data/install/tools/TestRunner.bat +0 -0
  446. data/install/tools/TlmExtractor +16 -16
  447. data/install/tools/TlmExtractor.bat +0 -0
  448. data/install/tools/TlmGrapher +16 -16
  449. data/install/tools/TlmGrapher.bat +0 -0
  450. data/install/tools/TlmViewer +16 -16
  451. data/install/tools/TlmViewer.bat +0 -0
  452. data/install/tools/ToolLaunch.bat +14 -5
  453. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  454. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  455. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  456. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  457. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  458. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  459. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  460. data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  461. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  463. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  464. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  465. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  466. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  467. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  468. data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  469. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  470. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  471. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  472. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  473. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  475. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  476. data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  477. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  478. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  479. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  480. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  481. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  482. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  483. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  484. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  485. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  486. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  487. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  488. data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  489. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  490. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  491. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  492. data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  493. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  494. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  495. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  496. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  497. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  498. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  499. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  500. data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  501. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  502. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  503. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  504. data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  505. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  506. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  507. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  508. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  509. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  510. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  511. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  512. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  513. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  514. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  515. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  516. data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  517. data/install/tools/tool_launch.rb +38 -38
  518. data/lib/cosmos.rb +63 -63
  519. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  520. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  521. data/lib/cosmos/config/config_parser.rb +324 -324
  522. data/lib/cosmos/conversions.rb +13 -13
  523. data/lib/cosmos/conversions/conversion.rb +47 -47
  524. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  525. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  526. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  527. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  528. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  529. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  530. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  531. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  532. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  533. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  534. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  535. data/lib/cosmos/core_ext.rb +18 -18
  536. data/lib/cosmos/core_ext/array.rb +354 -354
  537. data/lib/cosmos/core_ext/class.rb +51 -51
  538. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  539. data/lib/cosmos/core_ext/exception.rb +52 -52
  540. data/lib/cosmos/core_ext/file.rb +75 -75
  541. data/lib/cosmos/core_ext/hash.rb +28 -28
  542. data/lib/cosmos/core_ext/io.rb +75 -75
  543. data/lib/cosmos/core_ext/kernel.rb +38 -38
  544. data/lib/cosmos/core_ext/math.rb +119 -119
  545. data/lib/cosmos/core_ext/matrix.rb +146 -146
  546. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  547. data/lib/cosmos/core_ext/range.rb +22 -22
  548. data/lib/cosmos/core_ext/socket.rb +32 -32
  549. data/lib/cosmos/core_ext/string.rb +311 -311
  550. data/lib/cosmos/core_ext/stringio.rb +24 -24
  551. data/lib/cosmos/core_ext/time.rb +448 -448
  552. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  553. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  554. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  555. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  556. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  557. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +326 -326
  558. data/lib/cosmos/gui/dialogs/about_dialog.rb +137 -137
  559. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  560. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  561. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  562. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  563. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  564. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  565. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +260 -260
  566. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -169
  567. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  568. data/lib/cosmos/gui/dialogs/progress_dialog.rb +276 -276
  569. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -165
  570. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  571. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  572. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  573. data/lib/cosmos/gui/dialogs/splash.rb +135 -135
  574. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  575. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  576. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  577. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  578. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +473 -473
  579. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  580. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +451 -451
  581. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  582. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  583. data/lib/cosmos/gui/line_graph/overview_graph.rb +469 -469
  584. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  585. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  586. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  587. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  588. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  589. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  590. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -724
  591. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  592. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  593. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  594. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  595. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  596. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  597. data/lib/cosmos/gui/qt.rb +860 -860
  598. data/lib/cosmos/gui/qt_tool.rb +380 -380
  599. data/lib/cosmos/gui/text/completion.rb +381 -381
  600. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  601. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  602. data/lib/cosmos/gui/text/ruby_editor.rb +415 -415
  603. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  604. data/lib/cosmos/gui/utilities/script_module_gui.rb +330 -330
  605. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  606. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  607. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  608. data/lib/cosmos/interfaces.rb +11 -11
  609. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -153
  610. data/lib/cosmos/interfaces/interface.rb +225 -225
  611. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  612. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  613. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -129
  614. data/lib/cosmos/interfaces/stream_interface.rb +136 -136
  615. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  616. data/lib/cosmos/interfaces/tcpip_server_interface.rb +164 -164
  617. data/lib/cosmos/interfaces/udp_interface.rb +161 -161
  618. data/lib/cosmos/io/buffered_file.rb +11 -11
  619. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  620. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  621. data/lib/cosmos/io/json_drb.rb +376 -376
  622. data/lib/cosmos/io/json_drb_object.rb +198 -198
  623. data/lib/cosmos/io/json_rpc.rb +365 -365
  624. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  625. data/lib/cosmos/io/raw_logger.rb +174 -174
  626. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  627. data/lib/cosmos/io/serial_driver.rb +85 -85
  628. data/lib/cosmos/io/stderr.rb +36 -36
  629. data/lib/cosmos/io/stdout.rb +36 -36
  630. data/lib/cosmos/io/tcpip_server.rb +571 -571
  631. data/lib/cosmos/io/udp_sockets.rb +152 -152
  632. data/lib/cosmos/io/win32_serial_driver.rb +145 -145
  633. data/lib/cosmos/packet_logs.rb +7 -7
  634. data/lib/cosmos/packet_logs/ccsds_log_reader.rb +104 -104
  635. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  636. data/lib/cosmos/packet_logs/packet_log_reader.rb +450 -450
  637. data/lib/cosmos/packet_logs/packet_log_writer.rb +323 -323
  638. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  639. data/lib/cosmos/packets/binary_accessor.rb +634 -634
  640. data/lib/cosmos/packets/commands.rb +293 -293
  641. data/lib/cosmos/packets/limits.rb +267 -267
  642. data/lib/cosmos/packets/limits_response.rb +38 -38
  643. data/lib/cosmos/packets/packet.rb +786 -786
  644. data/lib/cosmos/packets/packet_config.rb +482 -482
  645. data/lib/cosmos/packets/packet_item.rb +317 -317
  646. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  647. data/lib/cosmos/packets/parsers/format_string_parser.rb +58 -58
  648. data/lib/cosmos/packets/parsers/limits_parser.rb +146 -146
  649. data/lib/cosmos/packets/parsers/limits_response_parser.rb +52 -52
  650. data/lib/cosmos/packets/parsers/macro_parser.rb +116 -116
  651. data/lib/cosmos/packets/parsers/packet_item_parser.rb +215 -215
  652. data/lib/cosmos/packets/parsers/packet_parser.rb +123 -123
  653. data/lib/cosmos/packets/parsers/processor_parser.rb +63 -63
  654. data/lib/cosmos/packets/parsers/state_parser.rb +116 -116
  655. data/lib/cosmos/packets/structure.rb +458 -458
  656. data/lib/cosmos/packets/structure_item.rb +233 -233
  657. data/lib/cosmos/packets/telemetry.rb +350 -350
  658. data/lib/cosmos/processors.rb +6 -6
  659. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  660. data/lib/cosmos/processors/processor.rb +71 -71
  661. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  662. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  663. data/lib/cosmos/script.rb +9 -9
  664. data/lib/cosmos/script/cmd_tlm_server.rb +110 -110
  665. data/lib/cosmos/script/commands.rb +184 -184
  666. data/lib/cosmos/script/extract.rb +123 -123
  667. data/lib/cosmos/script/limits.rb +114 -114
  668. data/lib/cosmos/script/script.rb +76 -76
  669. data/lib/cosmos/script/scripting.rb +897 -897
  670. data/lib/cosmos/script/telemetry.rb +174 -174
  671. data/lib/cosmos/script/tools.rb +138 -138
  672. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  673. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  674. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  675. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  676. data/lib/cosmos/streams/serial_stream.rb +157 -157
  677. data/lib/cosmos/streams/stream.rb +63 -63
  678. data/lib/cosmos/streams/stream_protocol.rb +373 -373
  679. data/lib/cosmos/streams/tcpip_client_stream.rb +113 -113
  680. data/lib/cosmos/streams/tcpip_socket_stream.rb +143 -143
  681. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  682. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  683. data/lib/cosmos/system.rb +4 -4
  684. data/lib/cosmos/system/system.rb +618 -618
  685. data/lib/cosmos/system/target.rb +197 -197
  686. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +255 -255
  687. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +717 -717
  688. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  689. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  690. data/lib/cosmos/tools/cmd_tlm_server/api.rb +1034 -1034
  691. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  692. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -67
  693. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +515 -515
  694. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +253 -253
  695. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +408 -408
  696. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  697. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +175 -175
  698. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +200 -200
  699. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +176 -176
  700. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +150 -150
  701. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +244 -244
  702. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +90 -90
  703. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +266 -266
  704. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  705. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  706. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  707. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  708. data/lib/cosmos/tools/data_viewer/data_viewer.rb +621 -621
  709. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +134 -134
  710. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  711. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +156 -156
  712. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +382 -382
  713. data/lib/cosmos/tools/launcher/launcher.rb +188 -188
  714. data/lib/cosmos/tools/launcher/launcher_config.rb +256 -256
  715. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -40
  716. data/lib/cosmos/tools/launcher/launcher_tool.rb +116 -116
  717. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +837 -837
  718. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  719. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  720. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +542 -542
  721. data/lib/cosmos/tools/replay/replay.rb +501 -501
  722. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  723. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -147
  724. data/lib/cosmos/tools/script_runner/script_runner.rb +922 -922
  725. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  726. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1798 -1798
  727. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  728. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  729. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  730. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  731. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  732. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  733. data/lib/cosmos/tools/test_runner/test.rb +539 -539
  734. data/lib/cosmos/tools/test_runner/test_runner.rb +1189 -1189
  735. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +341 -341
  736. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  737. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1016 -1016
  738. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  739. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  740. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  741. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  742. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +95 -95
  743. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  744. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +181 -181
  745. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  746. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  747. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +174 -174
  748. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +193 -193
  749. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +407 -407
  750. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  751. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  752. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -323
  753. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  754. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  755. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  756. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  757. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  758. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  759. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  760. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  761. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  762. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  763. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  764. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1291 -1291
  765. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  766. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  767. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +114 -114
  768. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  769. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +78 -78
  770. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  771. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  772. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  773. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -486
  774. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +561 -561
  775. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +290 -290
  776. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  777. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  778. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +66 -66
  779. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +57 -57
  780. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  781. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  782. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  783. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  784. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  785. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  786. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  787. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  788. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  789. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  790. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  791. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  792. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  793. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  794. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  795. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  796. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  797. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  798. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  799. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  800. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  801. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  802. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  803. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  804. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  805. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  806. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  807. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  808. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  809. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  810. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  811. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  812. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  813. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  814. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  815. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  816. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  817. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  818. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  819. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  820. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  821. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  822. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  823. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  824. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  825. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  826. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  827. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  828. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  829. data/lib/cosmos/top_level.rb +759 -759
  830. data/lib/cosmos/utilities.rb +11 -11
  831. data/lib/cosmos/utilities/crc.rb +166 -166
  832. data/lib/cosmos/utilities/csv.rb +83 -83
  833. data/lib/cosmos/utilities/logger.rb +137 -137
  834. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  835. data/lib/cosmos/utilities/message_log.rb +79 -79
  836. data/lib/cosmos/utilities/quaternion.rb +258 -258
  837. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  838. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  839. data/lib/cosmos/utilities/sleeper.rb +44 -44
  840. data/lib/cosmos/version.rb +12 -12
  841. data/lib/cosmos/win32/excel.rb +66 -66
  842. data/lib/cosmos/win32/win32.rb +387 -387
  843. data/lib/cosmos/win32/win32_main.rb +321 -321
  844. data/roodi.yml +24 -24
  845. data/run_gui_tests.bat +0 -0
  846. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  847. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  848. data/spec/config/config_parser_spec.rb +322 -322
  849. data/spec/conversions/conversion_spec.rb +31 -31
  850. data/spec/conversions/generic_conversion_spec.rb +45 -45
  851. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  852. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  853. data/spec/conversions/processor_conversion_spec.rb +45 -45
  854. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  855. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  856. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  857. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  858. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  859. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  860. data/spec/core_ext/array_spec.rb +186 -186
  861. data/spec/core_ext/class_spec.rb +36 -36
  862. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  863. data/spec/core_ext/exception_spec.rb +91 -91
  864. data/spec/core_ext/file_spec.rb +72 -72
  865. data/spec/core_ext/hash_spec.rb +24 -24
  866. data/spec/core_ext/io_spec.rb +46 -46
  867. data/spec/core_ext/kernel_spec.rb +54 -54
  868. data/spec/core_ext/math_spec.rb +116 -116
  869. data/spec/core_ext/matrix_spec.rb +66 -66
  870. data/spec/core_ext/objectspace_spec.rb +29 -29
  871. data/spec/core_ext/range_spec.rb +21 -21
  872. data/spec/core_ext/socket_spec.rb +32 -32
  873. data/spec/core_ext/string_spec.rb +223 -223
  874. data/spec/core_ext/stringio_spec.rb +21 -21
  875. data/spec/core_ext/time_spec.rb +202 -202
  876. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  877. data/spec/gui/qt_spec.rb +102 -102
  878. data/spec/install/config/system/system.txt +33 -33
  879. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  880. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  881. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  882. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  883. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  884. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  885. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  886. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  887. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  888. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  889. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  890. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -305
  891. data/spec/install/config/targets/INST/target.txt +10 -10
  892. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  893. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  894. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  895. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  896. data/spec/interfaces/interface_spec.rb +130 -130
  897. data/spec/interfaces/linc_interface_spec.rb +259 -259
  898. data/spec/interfaces/serial_interface_spec.rb +56 -56
  899. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  900. data/spec/interfaces/stream_interface_spec.rb +157 -157
  901. data/spec/interfaces/tcpip_client_interface_spec.rb +55 -55
  902. data/spec/interfaces/tcpip_server_interface_spec.rb +160 -160
  903. data/spec/interfaces/udp_interface_spec.rb +175 -175
  904. data/spec/io/buffered_file_spec.rb +113 -113
  905. data/spec/io/io_multiplexer_spec.rb +94 -94
  906. data/spec/io/json_drb_object_spec.rb +119 -119
  907. data/spec/io/json_drb_spec.rb +311 -311
  908. data/spec/io/json_rpc_spec.rb +264 -264
  909. data/spec/io/raw_logger_pair_spec.rb +76 -76
  910. data/spec/io/raw_logger_spec.rb +133 -133
  911. data/spec/io/serial_driver_spec.rb +60 -60
  912. data/spec/io/stderr_spec.rb +32 -32
  913. data/spec/io/stdout_spec.rb +32 -32
  914. data/spec/io/tcpip_server_spec.rb +338 -338
  915. data/spec/io/udp_sockets_spec.rb +94 -94
  916. data/spec/io/win32_serial_driver_spec.rb +88 -88
  917. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  918. data/spec/packet_logs/packet_log_reader_spec.rb +468 -468
  919. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  920. data/spec/packet_logs/packet_log_writer_spec.rb +225 -225
  921. data/spec/packets/binary_accessor_spec.rb +2326 -2326
  922. data/spec/packets/commands_spec.rb +369 -369
  923. data/spec/packets/limits_response_spec.rb +25 -25
  924. data/spec/packets/limits_spec.rb +344 -344
  925. data/spec/packets/packet_config_spec.rb +805 -805
  926. data/spec/packets/packet_item_limits_spec.rb +161 -161
  927. data/spec/packets/packet_item_spec.rb +386 -386
  928. data/spec/packets/packet_spec.rb +1317 -1317
  929. data/spec/packets/parsers/format_string_parser_spec.rb +122 -122
  930. data/spec/packets/parsers/limits_parser_spec.rb +282 -282
  931. data/spec/packets/parsers/limits_response_parser_spec.rb +149 -149
  932. data/spec/packets/parsers/macro_parser_spec.rb +212 -212
  933. data/spec/packets/parsers/packet_item_parser_spec.rb +306 -306
  934. data/spec/packets/parsers/packet_parser_spec.rb +99 -99
  935. data/spec/packets/parsers/processor_parser_spec.rb +114 -114
  936. data/spec/packets/parsers/state_parser_spec.rb +156 -156
  937. data/spec/packets/structure_item_spec.rb +195 -195
  938. data/spec/packets/structure_spec.rb +565 -565
  939. data/spec/packets/telemetry_spec.rb +578 -578
  940. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  941. data/spec/processors/processor_spec.rb +55 -55
  942. data/spec/processors/statistics_processor_spec.rb +60 -60
  943. data/spec/processors/watermark_processor_spec.rb +51 -51
  944. data/spec/script/cmd_tlm_server_spec.rb +110 -110
  945. data/spec/script/commands_disconnect_spec.rb +270 -270
  946. data/spec/script/commands_spec.rb +302 -302
  947. data/spec/script/limits_spec.rb +153 -153
  948. data/spec/script/script_spec.rb +86 -86
  949. data/spec/script/scripting_spec.rb +440 -440
  950. data/spec/script/telemetry_spec.rb +165 -165
  951. data/spec/script/tools_spec.rb +117 -117
  952. data/spec/spec_helper.rb +190 -190
  953. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  954. data/spec/streams/fixed_stream_protocol_spec.rb +113 -113
  955. data/spec/streams/length_stream_protocol_spec.rb +300 -300
  956. data/spec/streams/preidentified_stream_protocol_spec.rb +121 -121
  957. data/spec/streams/serial_stream_spec.rb +117 -117
  958. data/spec/streams/stream_protocol_spec.rb +346 -346
  959. data/spec/streams/stream_spec.rb +30 -30
  960. data/spec/streams/tcpip_client_stream_spec.rb +57 -57
  961. data/spec/streams/tcpip_socket_stream_spec.rb +193 -193
  962. data/spec/streams/template_stream_protocol_spec.rb +156 -156
  963. data/spec/streams/terminated_stream_protocol_spec.rb +127 -127
  964. data/spec/system/system_spec.rb +665 -665
  965. data/spec/system/target_spec.rb +250 -250
  966. data/spec/tools/cmd_tlm_server/api_spec.rb +1117 -1117
  967. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  968. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  969. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +453 -453
  970. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  971. data/spec/tools/cmd_tlm_server/commanding_spec.rb +151 -151
  972. data/spec/tools/cmd_tlm_server/connections_spec.rb +235 -235
  973. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  974. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -252
  975. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  976. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +151 -151
  977. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -223
  978. data/spec/tools/launcher/launcher_config_spec.rb +464 -464
  979. data/spec/top_level/top_level_spec.rb +334 -334
  980. data/spec/utilities/crc_spec.rb +45 -45
  981. data/spec/utilities/csv_spec.rb +97 -97
  982. data/spec/utilities/logger_spec.rb +102 -102
  983. data/spec/utilities/message_log_spec.rb +89 -89
  984. data/spec/utilities/quaternion_spec.rb +107 -107
  985. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  986. data/tasks/manifest.rake +22 -22
  987. data/tasks/spec.rake +23 -23
  988. data/test/benchmarks/binary_accessor_benchmark.rb +14 -14
  989. data/test/benchmarks/gsub_benchmark.rb +152 -152
  990. data/test/benchmarks/is_a_benchmark.rb +34 -34
  991. data/test/performance/PACKETS.bat +0 -0
  992. data/test/performance/Rakefile +77 -77
  993. data/test/performance/THREADS.bat +0 -0
  994. data/test/performance/config/data/crc.txt +196 -196
  995. data/test/performance/config/data/diamond.STL +57 -57
  996. data/test/performance/config/data/meta_init.txt +4 -4
  997. data/test/performance/config/system/system_packets.txt +39 -39
  998. data/test/performance/config/system/system_threads.txt +59 -59
  999. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +46 -46
  1000. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  1001. data/test/performance/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  1002. data/test/performance/config/targets/COSMOS/screens/limits_change.txt +20 -20
  1003. data/test/performance/config/targets/COSMOS/screens/version.txt +19 -19
  1004. data/test/performance/config/targets/COSMOS/target.txt +11 -11
  1005. data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -20
  1006. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -98
  1007. data/test/performance/config/targets/PACKET/cmd_tlm_server.txt +6 -6
  1008. data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -22
  1009. data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -24
  1010. data/test/performance/config/targets/PACKET/screens/status.txt +25 -25
  1011. data/test/performance/config/targets/PACKET/target.txt +28 -28
  1012. data/test/performance/config/targets/SYSTEM/screens/status.txt +12 -12
  1013. data/test/performance/config/targets/THREAD/cmd_tlm/thread_cmds.txt +17 -17
  1014. data/test/performance/config/targets/THREAD/cmd_tlm/thread_tlm.txt +18 -18
  1015. data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -6
  1016. data/test/performance/config/targets/THREAD/lib/thread_interface.rb +22 -22
  1017. data/test/performance/config/targets/THREAD/screens/status.txt +25 -25
  1018. data/test/performance/config/targets/THREAD/target.txt +6 -6
  1019. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +28 -28
  1020. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +68 -68
  1021. data/test/performance/config/tools/data_viewer/data_viewer.txt +11 -11
  1022. data/test/performance/config/tools/handbook_creator/handbook_creator.txt +66 -66
  1023. data/test/performance/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  1024. data/test/performance/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  1025. data/test/performance/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  1026. data/test/performance/config/tools/handbook_creator/templates/header.html.erb +25 -25
  1027. data/test/performance/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  1028. data/test/performance/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  1029. data/test/performance/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  1030. data/test/performance/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  1031. data/test/performance/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  1032. data/test/performance/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  1033. data/test/performance/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  1034. data/test/performance/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  1035. data/test/performance/config/tools/handbook_creator/templates/title.html.erb +1 -1
  1036. data/test/performance/config/tools/launcher/launcher_packets.txt +34 -34
  1037. data/test/performance/config/tools/launcher/launcher_threads.txt +83 -83
  1038. data/test/performance/config/tools/script_runner/script_runner.txt +3 -3
  1039. data/test/performance/config/tools/table_manager/ConfigTables_def.txt +8 -8
  1040. data/test/performance/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  1041. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  1042. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  1043. data/test/performance/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  1044. data/test/performance/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  1045. data/test/performance/config/tools/test_runner/test_runner.txt +17 -17
  1046. data/test/performance/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  1047. data/test/performance/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  1048. data/test/performance/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  1049. data/test/performance/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  1050. data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -204
  1051. data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +13 -13
  1052. data/test/performance/lib/packet_target.rb +126 -126
  1053. data/test/performance/lib/thread_target.rb +120 -120
  1054. data/test/performance/lib/user_version.rb +3 -3
  1055. data/test/performance/procedures/checks.rb +11 -11
  1056. data/test/performance/procedures/clear_util.rb +7 -7
  1057. data/test/performance/procedures/collect.rb +18 -18
  1058. data/test/performance/procedures/collect_util.rb +14 -14
  1059. data/test/performance/procedures/cosmos_api_test.rb +293 -293
  1060. data/test/performance/procedures/disconnect.rb +29 -29
  1061. data/test/performance/procedures/example_test.rb +182 -182
  1062. data/test/performance/procedures/plot_test.rb +8 -8
  1063. data/test/performance/procedures/procedure.rb +2 -2
  1064. data/test/performance/procedures/run_example_test.rb +3 -3
  1065. data/test/performance/procedures/test.rb +51 -51
  1066. data/test/performance/tools/CmdExtractor +14 -14
  1067. data/test/performance/tools/CmdExtractor.bat +0 -0
  1068. data/test/performance/tools/CmdSender +14 -14
  1069. data/test/performance/tools/CmdSender.bat +0 -0
  1070. data/test/performance/tools/CmdTlmServer +16 -16
  1071. data/test/performance/tools/CmdTlmServer.bat +0 -0
  1072. data/test/performance/tools/CmdTlmServerMemProf +20 -20
  1073. data/test/performance/tools/CmdTlmServerMemProf.bat +0 -0
  1074. data/test/performance/tools/DataViewer +14 -14
  1075. data/test/performance/tools/DataViewer.bat +0 -0
  1076. data/test/performance/tools/HandbookCreator +14 -14
  1077. data/test/performance/tools/HandbookCreator.bat +0 -0
  1078. data/test/performance/tools/Launcher +14 -14
  1079. data/test/performance/tools/Launcher.bat +0 -0
  1080. data/test/performance/tools/LimitsMonitor +14 -14
  1081. data/test/performance/tools/LimitsMonitor.bat +0 -0
  1082. data/test/performance/tools/OpenGLBuilder +14 -14
  1083. data/test/performance/tools/OpenGLBuilder.bat +0 -0
  1084. data/test/performance/tools/PacketTarget +14 -14
  1085. data/test/performance/tools/PacketTarget.bat +0 -0
  1086. data/test/performance/tools/PacketViewer +14 -14
  1087. data/test/performance/tools/PacketViewer.bat +0 -0
  1088. data/test/performance/tools/Replay +14 -14
  1089. data/test/performance/tools/Replay.bat +0 -0
  1090. data/test/performance/tools/ScpiTarget +14 -14
  1091. data/test/performance/tools/ScpiTarget.bat +0 -0
  1092. data/test/performance/tools/ScriptRunner +14 -14
  1093. data/test/performance/tools/ScriptRunner.bat +0 -0
  1094. data/test/performance/tools/TableManager +14 -14
  1095. data/test/performance/tools/TableManager.bat +0 -0
  1096. data/test/performance/tools/TestRunner +14 -14
  1097. data/test/performance/tools/TestRunner.bat +0 -0
  1098. data/test/performance/tools/ThreadTarget +14 -14
  1099. data/test/performance/tools/ThreadTarget.bat +0 -0
  1100. data/test/performance/tools/TlmExtractor +14 -14
  1101. data/test/performance/tools/TlmExtractor.bat +0 -0
  1102. data/test/performance/tools/TlmGrapher +14 -14
  1103. data/test/performance/tools/TlmGrapher.bat +0 -0
  1104. data/test/performance/tools/TlmGrapherMemProf +19 -19
  1105. data/test/performance/tools/TlmGrapherMemProf.bat +0 -0
  1106. data/test/performance/tools/TlmViewer +14 -14
  1107. data/test/performance/tools/TlmViewer.bat +0 -0
  1108. data/test/performance/tools/TlmViewerMemProf +19 -19
  1109. data/test/performance/tools/TlmViewerMemProf.bat +0 -0
  1110. data/test/performance/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  1111. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  1112. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  1113. data/test/performance/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  1114. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  1115. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  1116. data/test/performance/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  1117. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  1118. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  1119. data/test/performance/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  1120. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  1121. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  1122. data/test/performance/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  1123. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  1124. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  1125. data/test/performance/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  1126. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  1127. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  1128. data/test/performance/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  1129. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  1130. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  1131. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  1132. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  1133. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  1134. data/test/performance/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  1135. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  1136. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  1137. data/test/performance/tools/mac/Replay.app/Contents/Info.plist +38 -38
  1138. data/test/performance/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  1139. data/test/performance/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  1140. data/test/performance/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  1141. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  1142. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  1143. data/test/performance/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  1144. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  1145. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  1146. data/test/performance/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  1147. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  1148. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  1149. data/test/performance/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  1150. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  1151. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  1152. data/test/performance/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  1153. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  1154. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  1155. data/test/performance/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  1156. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  1157. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  1158. metadata +3 -3
@@ -1,922 +1,922 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos'
12
- Cosmos.catch_fatal_exception do
13
- require 'cosmos/gui/qt_tool'
14
- require 'cosmos/tools/script_runner/script_runner_frame'
15
- require 'cosmos/tools/script_runner/script_runner_config'
16
- require 'cosmos/tools/script_runner/script_audit'
17
- require 'cosmos/gui/dialogs/progress_dialog'
18
- require 'cosmos/gui/dialogs/scroll_text_dialog'
19
- end
20
-
21
- module Cosmos
22
-
23
- class ScriptRunner < QtTool
24
- slots 'handle_tab_change(int)'
25
- slots 'context_menu(const QPoint&)'
26
- slots 'undo_available(bool)'
27
-
28
- UNTITLED_TAB_TEXT = ' Untitled '
29
-
30
- def initialize(options)
31
- # All code before super is executed twice in RubyQt Based classes
32
- super(options) # MUST BE FIRST
33
- Cosmos.load_cosmos_icon("script_runner.png")
34
- setAcceptDrops(true) # Allow dropping in files
35
-
36
- @config_file = options.config_file
37
- @server_config_file = options.server_config_file
38
-
39
- # Add procedures to search path
40
- System.paths['PROCEDURES'].each do |path|
41
- Cosmos.add_to_search_path(path)
42
- end
43
-
44
- initialize_actions()
45
- initialize_menus()
46
- initialize_central_widget()
47
- complete_initialize()
48
-
49
- # Load icons
50
- @running_icon = Cosmos.get_icon('running.png')
51
- @no_icon = Qt::Icon.new
52
-
53
- # Handle configuration
54
- filename = File.join(::Cosmos::USERPATH, %w(config tools script_runner), @config_file)
55
- if File.exist?(filename)
56
- ScriptRunnerConfig.new(filename)
57
- elsif @config_file != 'script_runner.txt'
58
- raise "Could not find config file #{filename}"
59
- end
60
-
61
- @procedure_dir = System.paths['PROCEDURES'][0]
62
- @debug = false
63
-
64
- # Create the initial tab(s)
65
- if ARGV.length == 0
66
- create_tab()
67
- else
68
- ARGV.each {|argv_filename| create_tab(argv_filename)}
69
- end
70
- end
71
-
72
- def initialize_actions
73
- super()
74
-
75
- # File actions
76
- @file_new = Qt::Action.new(Cosmos.get_icon('file.png'), tr('&New'), self)
77
- @file_new_keyseq = Qt::KeySequence.new(tr('Ctrl+N'))
78
- @file_new.shortcut = @file_new_keyseq
79
- @file_new.statusTip = tr('Start a new script')
80
- @file_new.connect(SIGNAL('triggered()')) { file_new() }
81
-
82
- @file_open = Qt::Action.new(Cosmos.get_icon('open.png'), tr('&Open'), self)
83
- @file_open_keyseq = Qt::KeySequence.new(tr('Ctrl+O'))
84
- @file_open.shortcut = @file_open_keyseq
85
- @file_open.statusTip = tr('Open a script')
86
- @file_open.connect(SIGNAL('triggered()')) { file_open() }
87
-
88
- @file_close = Qt::Action.new(tr('&Close'), self)
89
- @file_close_keyseq = Qt::KeySequence.new(tr('Ctrl+W'))
90
- @file_close.shortcut = @file_close_keyseq
91
- @file_close.statusTip = tr('Close the script')
92
- @file_close.connect(SIGNAL('triggered()')) { file_close() }
93
-
94
- @file_reload = Qt::Action.new(tr('&Reload'), self)
95
- @file_reload_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
96
- @file_reload.shortcut = @file_reload_keyseq
97
- @file_reload.statusTip = tr('Reload a script')
98
- @file_reload.connect(SIGNAL('triggered()')) { file_reload() }
99
-
100
- @file_save = Qt::Action.new(Cosmos.get_icon('save.png'), tr('&Save'), self)
101
- @file_save_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
102
- @file_save.shortcut = @file_save_keyseq
103
- @file_save.statusTip = tr('Save the script')
104
- @file_save.connect(SIGNAL('triggered()')) { file_save(false) }
105
-
106
- @file_save_as = Qt::Action.new(Cosmos.get_icon('save_as.png'), tr('Save &As'), self)
107
- @file_save_as.statusTip = tr('Save the script')
108
- @file_save_as.connect(SIGNAL('triggered()')) { file_save(true) }
109
-
110
- @file_options = Qt::Action.new(tr('O&ptions'), self)
111
- @file_options.statusTip = tr('Application Options')
112
- @file_options.connect(SIGNAL('triggered()')) { file_options() }
113
-
114
- # Edit actions
115
- @edit_undo = Qt::Action.new(Cosmos.get_icon('undo.png'), tr('&Undo'), self)
116
- @edit_undo_keyseq = Qt::KeySequence.new(tr('Ctrl+Z'))
117
- @edit_undo.shortcut = @edit_undo_keyseq
118
- @edit_undo.statusTip = tr('Undo')
119
- @edit_undo.connect(SIGNAL('triggered()')) { active_script_runner_frame().undo }
120
-
121
- @edit_redo = Qt::Action.new(Cosmos.get_icon('redo.png'), tr('&Redo'), self)
122
- @edit_redo_keyseq = Qt::KeySequence.new(tr('Ctrl+Y'))
123
- @edit_redo.shortcut = @edit_redo_keyseq
124
- @edit_redo.statusTip = tr('Redo')
125
- @edit_redo.connect(SIGNAL('triggered()')) { active_script_runner_frame().redo }
126
-
127
- @edit_cut = Qt::Action.new(Cosmos.get_icon('cut.png'), tr('Cu&t'), self)
128
- @edit_cut_keyseq = Qt::KeySequence.new(tr('Ctrl+X'))
129
- @edit_cut.shortcut = @edit_cut_keyseq
130
- @edit_cut.statusTip = tr('Cut')
131
- @edit_cut.connect(SIGNAL('triggered()')) { active_script_runner_frame().cut }
132
-
133
- @edit_copy = Qt::Action.new(Cosmos.get_icon('copy.png'), tr('&Copy'), self)
134
- @edit_copy_keyseq = Qt::KeySequence.new(tr('Ctrl+C'))
135
- @edit_copy.shortcut = @edit_copy_keyseq
136
- @edit_copy.statusTip = tr('Copy')
137
- @edit_copy.connect(SIGNAL('triggered()')) { active_script_runner_frame().copy }
138
-
139
- @edit_paste = Qt::Action.new(tr('&Paste'), self)
140
- @edit_paste_keyseq = Qt::KeySequence.new(tr('Ctrl+V'))
141
- @edit_paste.shortcut = @edit_paste_keyseq
142
- @edit_paste.statusTip = tr('Paste')
143
- @edit_paste.connect(SIGNAL('triggered()')) { active_script_runner_frame().paste }
144
-
145
- @edit_select_all = Qt::Action.new(tr('Select &All'), self)
146
- @edit_select_all_keyseq = Qt::KeySequence.new(tr('Ctrl+A'))
147
- @edit_select_all.shortcut = @edit_select_all_keyseq
148
- @edit_select_all.statusTip = tr('Select All')
149
- @edit_select_all.connect(SIGNAL('triggered()')) { active_script_runner_frame().select_all }
150
-
151
- @edit_comment = Qt::Action.new(tr('Comment/Uncomment &Lines'), self)
152
- @edit_comment_keyseq = Qt::KeySequence.new(tr('Ctrl+K'))
153
- @edit_comment.shortcut = @edit_comment_keyseq
154
- @edit_comment.statusTip = tr('Comment/Uncomment Lines')
155
- @edit_comment.connect(SIGNAL('triggered()')) { active_script_runner_frame().comment_or_uncomment_lines }
156
-
157
- # Search Actions
158
- @search_find = Qt::Action.new(Cosmos.get_icon('search.png'), tr('&Find'), self)
159
- @search_find_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
160
- @search_find.shortcut = @search_find_keyseq
161
- @search_find.statusTip = tr('Find text')
162
- @search_find.connect(SIGNAL('triggered()')) do
163
- FindReplaceDialog.show_find(active_script_runner_frame().script)
164
- end
165
-
166
- @search_find_next = Qt::Action.new(tr('Find &Next'), self)
167
- @search_find_next_keyseq = Qt::KeySequence.new(tr('F3'))
168
- @search_find_next.shortcut = @search_find_next_keyseq
169
- @search_find_next.statusTip = tr('Find next instance')
170
- @search_find_next.connect(SIGNAL('triggered()')) do
171
- FindReplaceDialog.find_next(active_script_runner_frame().script)
172
- end
173
-
174
- @search_find_previous = Qt::Action.new(tr('Find &Previous'), self)
175
- @search_find_previous_keyseq = Qt::KeySequence.new(tr('Shift+F3'))
176
- @search_find_previous.shortcut = @search_find_previous_keyseq
177
- @search_find_previous.statusTip = tr('Find previous instance')
178
- @search_find_previous.connect(SIGNAL('triggered()')) do
179
- FindReplaceDialog.find_previous(active_script_runner_frame().script)
180
- end
181
-
182
- @search_replace = Qt::Action.new(tr('&Replace'), self)
183
- @search_replace_keyseq = Qt::KeySequence.new(tr('Ctrl+H'))
184
- @search_replace.shortcut = @search_replace_keyseq
185
- @search_replace.statusTip = tr('Replace')
186
- @search_replace.connect(SIGNAL('triggered()')) do
187
- FindReplaceDialog.show_replace(active_script_runner_frame().script)
188
- end
189
-
190
- # Script Actions
191
- @script_syntax_all = Qt::Action.new(tr('&Ruby Syntax Check'), self)
192
- @script_syntax_all.statusTip = tr('Check ruby syntax of this script')
193
- @script_syntax_all.connect(SIGNAL('triggered()')) do
194
- active_script_runner_frame().ruby_syntax_check_text()
195
- end
196
-
197
- @script_mnemonic_all = Qt::Action.new(tr('&Mnemonic Check'), self)
198
- @script_mnemonic_all.statusTip = tr('Check mnemonics of this script')
199
- @script_mnemonic_all.connect(SIGNAL('triggered()')) do
200
- active_script_runner_frame().mnemonic_check_text(active_script_runner_frame().text)
201
- end
202
-
203
- @script_execute_lines = Qt::Action.new(tr('&Execute Selected Lines'), self)
204
- @script_execute_lines.statusTip = tr('Execute selected lines')
205
- @script_execute_lines.connect(SIGNAL('triggered()')) { active_script_runner_frame().run_selection }
206
-
207
- @script_execute_cursor = Qt::Action.new(tr('E&xecute From Cursor'), self)
208
- @script_execute_cursor.statusTip = tr('Execute from cursor position')
209
- @script_execute_cursor.connect(SIGNAL('triggered()')) { active_script_runner_frame().run_from_cursor }
210
-
211
- @script_syntax_lines = Qt::Action.new(tr('Ruby &Syntax Check Selected Lines'), self)
212
- @script_syntax_lines.statusTip = tr('Check ruby syntax of selected lines')
213
- @script_syntax_lines.connect(SIGNAL('triggered()')) { active_script_runner_frame().ruby_syntax_check_selection }
214
-
215
- @script_mnemonic_lines = Qt::Action.new(tr('M&nemonic Check Selected Lines'), self)
216
- @script_mnemonic_lines.statusTip = tr('Check mnemonics of selected lines')
217
- @script_mnemonic_lines.connect(SIGNAL('triggered()')) { active_script_runner_frame().mnemonic_check_selection }
218
-
219
- @script_audit = Qt::Action.new(tr('&Generate Cmd/Tlm Audit'), self)
220
- @script_audit.statusTip = tr('Generate audit about commands sent and telemetry checked')
221
- @script_audit.connect(SIGNAL('triggered()')) { script_audit() }
222
-
223
- @script_instrumented = Qt::Action.new(tr('&View Instrumented Script'), self)
224
- @script_instrumented.statusTip = tr('View instrumented script')
225
- @script_instrumented.connect(SIGNAL('triggered()')) { script_view_instrumented() }
226
-
227
- @script_log_message = Qt::Action.new(tr('Log Message to Script Log'), self)
228
- @script_log_message.statusTip = tr('Log Message to Script Log')
229
- @script_log_message.connect(SIGNAL('triggered()')) { script_log_message() }
230
- @script_log_message.setEnabled(false)
231
-
232
- @script_call_stack = Qt::Action.new(tr('Show Call Stack'), self)
233
- @script_call_stack.statusTip = tr('Show Call Stack')
234
- @script_call_stack.connect(SIGNAL('triggered()')) { script_call_stack() }
235
- @script_call_stack.setEnabled(false)
236
-
237
- @script_debug = Qt::Action.new(Cosmos.get_icon('bug.png'), tr('Toggle &Debug'), self)
238
- @script_debug_keyseq = Qt::KeySequence.new(tr('Ctrl+D'))
239
- @script_debug.shortcut = @script_debug_keyseq
240
- @script_debug.statusTip = tr('Toggle debug capabilities for the script')
241
- @script_debug.connect(SIGNAL('triggered()')) { script_toggle_debug() }
242
-
243
- @script_disconnect = Qt::Action.new(Cosmos.get_icon('disconnected.png'), tr('&Toggle Disconnect'), self)
244
- @script_disconnect_keyseq = Qt::KeySequence.new(tr('Ctrl+T'))
245
- @script_disconnect.shortcut = @script_disconnect_keyseq
246
- @script_disconnect.statusTip = tr('Toggle disconnect from the server')
247
- @script_disconnect.connect(SIGNAL('triggered()')) { script_toggle_disconnect() }
248
- end
249
-
250
- def initialize_menus
251
- # File Menu
252
- file_menu = menuBar.addMenu(tr('&File'))
253
- file_menu.addAction(@file_new)
254
- file_menu.addAction(@file_open)
255
- file_menu.addAction(@file_close)
256
- file_menu.addAction(@file_reload)
257
- file_menu.addSeparator()
258
- file_menu.addAction(@file_save)
259
- file_menu.addAction(@file_save_as)
260
- file_menu.addSeparator()
261
- file_menu.addAction(@file_options)
262
- file_menu.addSeparator()
263
- file_menu.addAction(@exit_action)
264
-
265
- # Edit Menu
266
- mode_menu = menuBar.addMenu(tr('&Edit'))
267
- mode_menu.addAction(@edit_undo)
268
- mode_menu.addAction(@edit_redo)
269
- mode_menu.addSeparator()
270
- mode_menu.addAction(@edit_cut)
271
- mode_menu.addAction(@edit_copy)
272
- mode_menu.addAction(@edit_paste)
273
- mode_menu.addSeparator()
274
- mode_menu.addAction(@edit_select_all)
275
- mode_menu.addSeparator()
276
- mode_menu.addAction(@edit_comment)
277
-
278
- # Search Menu
279
- view_menu = menuBar.addMenu(tr('&Search'))
280
- view_menu.addAction(@search_find)
281
- view_menu.addAction(@search_find_next)
282
- view_menu.addAction(@search_find_previous)
283
- view_menu.addAction(@search_replace)
284
-
285
- # Script Menu
286
- view_menu = menuBar.addMenu(tr('Scrip&t'))
287
- view_menu.addAction(@script_syntax_all)
288
- view_menu.addAction(@script_syntax_lines)
289
- view_menu.addSeparator()
290
- view_menu.addAction(@script_mnemonic_all)
291
- view_menu.addAction(@script_mnemonic_lines)
292
- view_menu.addSeparator()
293
- view_menu.addAction(@script_execute_lines)
294
- view_menu.addAction(@script_execute_cursor)
295
- view_menu.addSeparator()
296
- view_menu.addAction(@script_audit)
297
- view_menu.addAction(@script_instrumented)
298
- view_menu.addSeparator()
299
- view_menu.addAction(@script_log_message)
300
- view_menu.addAction(@script_call_stack)
301
- view_menu.addAction(@script_debug)
302
- view_menu.addAction(@script_disconnect)
303
-
304
- # Help Menu
305
- @about_string = "Script Runner allows the user to execute commands "\
306
- "and take action on telemetry within a saveable script. "\
307
- "It allows the full power of the Ruby programming language "\
308
- "while defining several keywords to manipulate commands and telemetry in COSMOS.\n"
309
-
310
- initialize_help_menu()
311
- end
312
-
313
- def initialize_central_widget
314
- # Create the central widget
315
- @tab_book = Qt::TabWidget.new
316
- @tab_book.setMovable(true)
317
- @tab_book.setContextMenuPolicy(Qt::CustomContextMenu)
318
- connect(@tab_book,
319
- SIGNAL('customContextMenuRequested(const QPoint&)'),
320
- self,
321
- SLOT('context_menu(const QPoint&)'))
322
- connect(@tab_book,
323
- SIGNAL('currentChanged(int)'),
324
- self,
325
- SLOT('handle_tab_change(int)'))
326
- setCentralWidget(@tab_book)
327
-
328
- # Display a blank message to force the statusBar to show
329
- statusBar.showMessage("")
330
- end
331
-
332
- ###########################################
333
- # Drag files into ScriptRunner support
334
- ###########################################
335
-
336
- def dragEnterEvent(event)
337
- if event.mimeData.hasUrls
338
- event.acceptProposedAction();
339
- end
340
- end
341
-
342
- def dragMoveEvent(event)
343
- if event.mimeData.hasUrls
344
- event.acceptProposedAction();
345
- end
346
- end
347
-
348
- def dropEvent(event)
349
- event.mimeData.urls.each do |url|
350
- filename = url.toLocalFile
351
- extension = File.extname(filename).to_s.downcase
352
- if extension == '.rb' or extension == '.txt'
353
- file_open(filename)
354
- end
355
- end
356
- end
357
-
358
- ###########################################
359
- # File Menu Options
360
- ###########################################
361
-
362
- # File->New
363
- def file_new
364
- create_tab()
365
- end
366
-
367
- # File->Open
368
- def file_open(filename = nil)
369
- if !filename
370
- filename = Qt::FileDialog.getOpenFileName(self, "Select Script", @procedure_dir)
371
- end
372
- unless filename.nil? || filename.empty?
373
- # If the user opens a file we already have open
374
- # just set the current tab to that file and return
375
- @tab_book.tabs.each_with_index do |tab, index|
376
- if tab.filename == filename
377
- @tab_book.setCurrentIndex(index)
378
- @tab_book.currentTab.set_text_from_file(filename)
379
- @tab_book.currentTab.filename = filename
380
- return
381
- end
382
- end
383
-
384
- if ((@tab_book.count == 1) &&
385
- @tab_book.currentTab.filename.empty? &&
386
- !@tab_book.currentTab.modified)
387
- # Active Tab is an unmodified Untitled so just open the file in it
388
- @tab_book.currentTab.set_text_from_file(filename)
389
- @tab_book.currentTab.filename = filename
390
- @tab_book.setTabText(@tab_book.currentIndex, File.basename(filename))
391
- else
392
- create_tab(filename)
393
- end
394
-
395
- update_title()
396
- @procedure_dir = File.dirname(filename)
397
- @procedure_dir << '/' if @procedure_dir[-1..-1] != '/' and @procedure_dir[-1..-1] != '\\'
398
- end
399
- end
400
-
401
- # File->Reload
402
- def file_reload
403
- safe_to_continue = true
404
- if @tab_book.currentTab.modified
405
- case Qt::MessageBox.question(self, # parent
406
- 'Discard Changes?', # title
407
- 'Warning: Changes will be lost. Continue?', # text
408
- Qt::MessageBox::Yes | Qt::MessageBox::No, # buttons
409
- Qt::MessageBox::No) # default button
410
- when Qt::MessageBox::No
411
- safe_to_continue = false
412
- end
413
- end
414
-
415
- if safe_to_continue
416
- if active_script_runner_frame().filename.empty?
417
- active_script_runner_frame().set_text('')
418
- else
419
- active_script_runner_frame().set_text_from_file(active_script_runner_frame().filename)
420
- end
421
- @tab_book.currentTab.modified = false
422
- update_title()
423
- end
424
- end
425
-
426
- # File->Save and File->Save As
427
- def file_save(save_as = false)
428
- saved = false
429
- filename = active_script_runner_frame().filename
430
- if filename.empty?
431
- filename = Qt::FileDialog::getSaveFileName(self, # parent
432
- 'Save As...', # caption
433
- @procedure_dir + '/procedure.rb', # dir
434
- 'Procedure Files (*.rb)') # filter
435
- elsif save_as
436
- filename = Qt::FileDialog::getSaveFileName(self, # parent
437
- 'Save As...', # caption
438
- filename, # dir
439
- 'Procedure Files (*.rb)') # filter
440
- end
441
- if not filename.nil? and not filename.empty?
442
- begin
443
- @tab_book.currentTab.filename = filename
444
- @tab_book.currentTab.modified = false
445
- @tab_book.setTabText(@tab_book.currentIndex, File.basename(filename))
446
- active_script_runner_frame().filename = filename
447
- File.open(filename, "w") {|file| file.write(active_script_runner_frame().text)}
448
- saved = true
449
- update_title()
450
- statusBar.showMessage(tr("#{filename} saved"))
451
- @procedure_dir = File.dirname(filename)
452
- @procedure_dir << '/' if @procedure_dir[-1..-1] != '/' and @procedure_dir[-1..-1] != '\\'
453
- rescue => error
454
- statusBar.showMessage(tr("Error Saving Script : #{error.class} : #{error.message}"))
455
- end
456
- end
457
-
458
- return saved
459
- end
460
-
461
- # File->Close
462
- def file_close
463
- if prompt_for_save_if_needed('Save Current Script?')
464
- if @tab_book.count > 1
465
- close_active_tab()
466
- else
467
- active_script_runner_frame().stop_message_log
468
- @tab_book.setTabText(0, ' Untitled ')
469
- @tab_book.currentTab.clear
470
- end
471
- update_title()
472
- end
473
- end
474
-
475
- # File->Options
476
- def file_options
477
- dialog = Qt::Dialog.new(self)
478
- dialog.setWindowTitle('Script Runner Options')
479
- layout = Qt::VBoxLayout.new
480
-
481
- form = Qt::FormLayout.new
482
- box = Qt::DoubleSpinBox.new
483
- box.setRange(0, 60)
484
- box.setValue(ScriptRunnerFrame.line_delay)
485
- form.addRow(tr("&Delay between each script line:"), box)
486
- pause_on_error = Qt::CheckBox.new
487
- form.addRow(tr("&Pause on error:"), pause_on_error)
488
- monitor = Qt::CheckBox.new
489
- form.addRow(tr("&Monitor limits:"), monitor)
490
- if ScriptRunnerFrame.pause_on_error
491
- pause_on_error.setCheckState(Qt::Checked)
492
- else
493
- pause_on_error.setCheckState(Qt::Unchecked)
494
- end
495
- pause_on_red = Qt::CheckBox.new
496
- form.addRow(tr("Pause on &red limit:"), pause_on_red)
497
- if ScriptRunnerFrame.monitor_limits
498
- monitor.setCheckState(Qt::Checked)
499
- pause_on_red.setCheckState(Qt::Checked) if ScriptRunnerFrame.pause_on_red
500
- else
501
- pause_on_red.setEnabled(false)
502
- end
503
- monitor.connect(SIGNAL('stateChanged(int)')) do
504
- if monitor.isChecked()
505
- pause_on_red.setEnabled(true)
506
- else
507
- pause_on_red.setCheckState(Qt::Unchecked)
508
- pause_on_red.setEnabled(false)
509
- end
510
- end
511
- layout.addLayout(form)
512
-
513
- divider = Qt::Frame.new
514
- divider.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Raised)
515
- divider.setLineWidth(1)
516
- layout.addWidget(divider)
517
-
518
- ok = Qt::PushButton.new('Ok')
519
- ok.setDefault(true)
520
- ok.connect(SIGNAL('clicked(bool)')) do
521
- ScriptRunnerFrame.line_delay = box.value
522
- ScriptRunnerFrame.pause_on_error = (pause_on_error.checkState == Qt::Checked)
523
- ScriptRunnerFrame.monitor_limits = (monitor.checkState == Qt::Checked)
524
- ScriptRunnerFrame.pause_on_red = (pause_on_red.checkState == Qt::Checked)
525
- dialog.accept
526
- end
527
- cancel = Qt::PushButton.new('Cancel')
528
- cancel.connect(SIGNAL('clicked(bool)')) { dialog.reject }
529
- button_layout = Qt::HBoxLayout.new
530
- button_layout.addWidget(ok)
531
- button_layout.addWidget(cancel)
532
- layout.addLayout(button_layout)
533
- dialog.setLayout(layout)
534
- dialog.exec
535
- dialog.dispose
536
- end
537
-
538
- ###########################################
539
- # Script Menu Options
540
- ###########################################
541
-
542
- include ScriptAudit
543
-
544
- # Script->View Instrumented
545
- def script_view_instrumented
546
- begin
547
- instrumented_script =
548
- ScriptRunnerFrame.instrument_script(active_script_runner_frame().text,
549
- active_script_runner_frame().filename,
550
- true)
551
- rescue StopScript
552
- return
553
- end
554
-
555
- # Show Dialog box containing script code
556
- box = Qt::Dialog.new(self)
557
- box.setWindowTitle('Instrumented Script')
558
- text = Qt::PlainTextEdit.new
559
- text.setWordWrapMode(Qt::TextOption::NoWrap)
560
- text.setReadOnly(true)
561
- text.setPlainText(instrumented_script)
562
- layout = Qt::VBoxLayout.new
563
- layout.addWidget(text)
564
- ok = Qt::PushButton.new('OK')
565
- ok.setDefault(true)
566
- ok.connect(SIGNAL('clicked(bool)')) { box.accept }
567
- button_layout = Qt::HBoxLayout.new
568
- button_layout.addStretch
569
- button_layout.addWidget(ok)
570
- button_layout.addStretch
571
- layout.addLayout(button_layout)
572
- box.setLayout(layout)
573
- box.setMinimumWidth([Qt::CoreApplication.instance.desktop.availableGeometry.width,
574
- text.document.size.width].min)
575
- screen_height = Qt::CoreApplication.instance.desktop.availableGeometry.height
576
- preferred_height = (text.document.size.height * text.fontMetrics.lineSpacing) +
577
- text.horizontalScrollBar.height + ok.sizeHint.height + (layout.spacing * 5)
578
- box.setMinimumHeight([screen_height, preferred_height].min)
579
- box.exec
580
- box.dispose
581
- end
582
-
583
- # Script->Log Message to Script Log
584
- def script_log_message
585
- message = get_scriptrunner_log_message()
586
- if message
587
- active_script_runner_frame().scriptrunner_puts 'User logged: ' + message.to_s
588
- active_script_runner_frame().handle_output_io
589
- end
590
- end
591
-
592
- # Script->Show Call Stack
593
- def script_call_stack
594
- trace = active_script_runner_frame().current_backtrace
595
- ScrollTextDialog.new(self, 'Call Stack', trace.join("\n"))
596
- end
597
-
598
- # Script->Toggle Debug
599
- def script_toggle_debug
600
- @debug = !@debug
601
- if @tab_book.count > 0
602
- (0..(@tab_book.count - 1)).each do |index|
603
- @tab_book.tab(index).toggle_debug(@debug)
604
- end
605
- end
606
- end
607
-
608
- # Script->Toggle Disconnect
609
- def script_toggle_disconnect
610
- @server_config_file = active_script_runner_frame().toggle_disconnect(@server_config_file)
611
- end
612
-
613
- ###########################################
614
- # Callbacks
615
- ###########################################
616
-
617
- def undo_available(bool)
618
- update_title()
619
- end
620
-
621
- def closeEvent(event)
622
- if active_script_runner_frame().prompt_if_running_on_close()
623
- if prompt_for_save_if_needed_on_close()
624
- shutdown_cmd_tlm()
625
- @tab_book.tabs.each_with_index do |tab, index|
626
- tab.stop_message_log
627
- end
628
- super(event)
629
- else
630
- event.ignore()
631
- end
632
- else
633
- event.ignore()
634
- end
635
- end
636
-
637
- # This method disables things that you shouldn't do while running
638
- def run_callback(script_runner_frame = nil)
639
- if script_runner_frame
640
- @tab_book.tabs.each_with_index do |tab, index|
641
- if tab != script_runner_frame
642
- @tab_book.setTabEnabled(index, false)
643
- else
644
- @tab_book.tabBar.setTabIcon(index, @running_icon)
645
- end
646
- end
647
- end
648
- disable_menu_items()
649
- end
650
-
651
- # This method reenables things after running
652
- def stop_callback(script_runner_frame = nil)
653
- if script_runner_frame
654
- @tab_book.tabs.each_with_index do |tab, index|
655
- @tab_book.setTabEnabled(index, true)
656
- @tab_book.tabBar.setTabIcon(index, @no_icon)
657
- end
658
- end
659
- enable_menu_items()
660
- end
661
-
662
- def enable_menu_items
663
- # Enable File Menu Items
664
- @file_new.setEnabled(true)
665
- @file_open.setEnabled(true)
666
- @file_close.setEnabled(true)
667
- @file_reload.setEnabled(true)
668
- @file_save.setEnabled(true)
669
- @file_save_as.setEnabled(true)
670
- @file_options.setEnabled(true)
671
-
672
- # Enable Edit Menu Items
673
- @edit_undo.setEnabled(true)
674
- @edit_redo.setEnabled(true)
675
- @edit_cut.setEnabled(true)
676
- @edit_copy.setEnabled(true)
677
- @edit_paste.setEnabled(true)
678
- @edit_select_all.setEnabled(true)
679
- @edit_comment.setEnabled(true)
680
-
681
- # Enable Script Menu Items
682
- @script_syntax_all.setEnabled(true)
683
- @script_syntax_lines.setEnabled(true)
684
- @script_mnemonic_all.setEnabled(true)
685
- @script_mnemonic_lines.setEnabled(true)
686
- @script_execute_lines.setEnabled(true)
687
- @script_execute_cursor.setEnabled(true)
688
-
689
- # Disable Script Runtime Items'
690
- @script_log_message.setEnabled(false)
691
- @script_call_stack.setEnabled(false)
692
- end
693
-
694
- def disable_menu_items
695
- # Disable File Menu Items
696
- @file_new.setEnabled(false)
697
- @file_open.setEnabled(false)
698
- @file_close.setEnabled(false)
699
- @file_reload.setEnabled(false)
700
- @file_save.setEnabled(false)
701
- @file_save_as.setEnabled(false)
702
- @file_options.setEnabled(false)
703
-
704
- # Disable Edit Menu Items
705
- @edit_undo.setEnabled(false)
706
- @edit_redo.setEnabled(false)
707
- @edit_cut.setEnabled(false)
708
- @edit_copy.setEnabled(false)
709
- @edit_paste.setEnabled(false)
710
- @edit_select_all.setEnabled(false)
711
- @edit_comment.setEnabled(false)
712
-
713
- # Disable Script Menu Items
714
- @script_syntax_all.setEnabled(false)
715
- @script_syntax_lines.setEnabled(false)
716
- @script_mnemonic_all.setEnabled(false)
717
- @script_mnemonic_lines.setEnabled(false)
718
- @script_execute_lines.setEnabled(false)
719
- @script_execute_cursor.setEnabled(false)
720
-
721
- # Enable Script Runtime Items
722
- @script_log_message.setEnabled(true)
723
- @script_call_stack.setEnabled(true)
724
- end
725
-
726
- # Handle the user changing tabs
727
- def handle_tab_change(index)
728
- update_title()
729
- end
730
-
731
- def handle_script_keypress(event)
732
- update_title()
733
- if event.matches(Qt::KeySequence::NextChild)
734
- index = @tab_book.currentIndex + 1
735
- index = 0 if index >= @tab_book.count
736
- @tab_book.setCurrentIndex(index)
737
- elsif event.matches(Qt::KeySequence::PreviousChild)
738
- index = @tab_book.currentIndex - 1
739
- index = @tab_book.count - 1 if index < 0
740
- @tab_book.setCurrentIndex(index)
741
- end
742
- end
743
-
744
- def context_menu(point)
745
- index = 0
746
- @tab_book.tabBar.count.times do
747
- break if @tab_book.tabBar.tabRect(index).contains(point)
748
- index += 1
749
- end
750
-
751
- return if (index == @tab_book.tabBar.count)
752
-
753
- # Bring the right clicked tab to the front
754
- @tab_book.setCurrentIndex(index)
755
-
756
- menu = Qt::Menu.new()
757
-
758
- new_action = Qt::Action.new(tr("&New"), self)
759
- new_action.statusTip = tr("Create a new script")
760
- new_action.connect(SIGNAL('triggered()')) { file_new() }
761
- menu.addAction(new_action)
762
-
763
- close_action = Qt::Action.new(tr("&Close"), self)
764
- close_action.statusTip = tr("Close the script")
765
- close_action.connect(SIGNAL('triggered()')) { file_close() }
766
- menu.addAction(close_action)
767
-
768
- save_action = Qt::Action.new(tr("&Save"), self)
769
- save_action.statusTip = tr("Save the script")
770
- save_action.connect(SIGNAL('triggered()')) { file_save(false) }
771
- menu.addAction(save_action)
772
-
773
- save_action = Qt::Action.new(tr("Save &As"), self)
774
- save_action.statusTip = tr("Save the script as")
775
- save_action.connect(SIGNAL('triggered()')) { file_save(true) }
776
- menu.addAction(save_action)
777
-
778
- menu.exec(@tab_book.mapToGlobal(point))
779
- menu.dispose
780
- end
781
-
782
- #############################################################
783
- # Helper Methods
784
- #############################################################
785
-
786
- # Called by cosmos_script_module by the user calling the status_bar scripting method
787
- def script_set_status(message)
788
- Qt.execute_in_main_thread(true) do
789
- # Check for self.disposed? to work around crash when using SimpleCov
790
- unless self.disposed?
791
- status_bar = statusBar()
792
- status_bar.showMessage(message)
793
- end
794
- end
795
- end
796
-
797
- # Updates the title appropriately to show the tabs filename and modified status
798
- def update_title
799
- if @tab_book.currentTab.filename.empty?
800
- self.setWindowTitle("Script Runner : Untitled")
801
- else
802
- self.setWindowTitle("Script Runner : #{@tab_book.currentTab.filename}")
803
- end
804
- self.setWindowTitle(self.windowTitle << '*') if @tab_book.currentTab.modified
805
- end
806
-
807
- # Returns the script runner frame of the active tab
808
- def active_script_runner_frame
809
- @tab_book.currentTab
810
- end
811
-
812
- # Creates a new tab
813
- def create_tab(filename = '')
814
- if filename.empty?
815
- tab_item_name = UNTITLED_TAB_TEXT
816
- else
817
- tab_item_name = ' ' + File.basename(filename) + ' '
818
- end
819
-
820
- script_runner_frame = ScriptRunnerFrame.new(self)
821
- script_runner_frame.toggle_debug(@debug)
822
- script_runner_frame.setContentsMargins(5,5,5,5)
823
- connect(script_runner_frame,
824
- SIGNAL('undoAvailable(bool)'),
825
- self,
826
- SLOT('undo_available(bool)'))
827
- script_runner_frame.run_callback = method(:run_callback)
828
- script_runner_frame.stop_callback = method(:stop_callback)
829
- script_runner_frame.set_text_from_file(filename) unless filename.empty?
830
- script_runner_frame.filename = filename
831
- # Register a keypress handler so we can Ctrl-Tab our way through the tabs
832
- script_runner_frame.key_press_callback = method(:handle_script_keypress)
833
- # Update the title if the frame changes so we can add/remove the asterix
834
- script_runner_frame.connect(SIGNAL('modificationChanged(bool)')) { update_title() }
835
-
836
- @tab_book.addTab(script_runner_frame, tab_item_name)
837
- @tab_book.setCurrentIndex(@tab_book.count-1) # index is 0 based
838
- # Set the focus on the input now that we've added the tab
839
- script_runner_frame.setFocus
840
- update_title()
841
- end
842
-
843
- # Closes the active tab
844
- def close_active_tab
845
- if @tab_book.count > 1
846
- active_script_runner_frame().stop_message_log
847
- tab_index = @tab_book.currentIndex
848
- @tab_book.removeTab(tab_index)
849
- if tab_index >= 1
850
- @tab_book.setCurrentIndex(tab_index - 1)
851
- else
852
- @tab_book.setCurrentIndex(0)
853
- end
854
- end
855
- end
856
-
857
- # Prompts for save if the current tab has been modified
858
- def prompt_for_save_if_needed(message = 'Save?')
859
- safe_to_continue = true
860
- if @tab_book.currentTab.modified
861
- case Qt::MessageBox.question(
862
- self, # parent
863
- 'Save?', # title
864
- message, # text
865
- Qt::MessageBox::Yes | Qt::MessageBox::No | Qt::MessageBox::Cancel, # buttons
866
- Qt::MessageBox::Cancel) # default button
867
- when Qt::MessageBox::Cancel
868
- safe_to_continue = false
869
- when Qt::MessageBox::Yes
870
- saved = file_save(false)
871
- if not saved
872
- safe_to_continue = false
873
- end
874
- end
875
- end
876
- return safe_to_continue
877
- end
878
-
879
- # Prompts the user that unsaved changes have been made before they close the app
880
- def prompt_for_save_if_needed_on_close
881
- safe_to_continue = true
882
- @tab_book.tabs.each_with_index do |tab, index|
883
- if tab.modified
884
- @tab_book.setCurrentIndex(index)
885
- if tab.filename.empty?
886
- message = "Save changes to 'Untitled'?"
887
- else
888
- message = "Save changes to '#{tab.filename}'?"
889
- end
890
- safe_to_continue = prompt_for_save_if_needed(message)
891
- #~ break unless safe_to_continue
892
- end
893
- end
894
- return safe_to_continue
895
- end
896
-
897
- def self.run(option_parser = nil, options = nil)
898
- Cosmos.catch_fatal_exception do
899
- unless option_parser and options
900
- option_parser, options = create_default_options()
901
- options.width = 750
902
- options.height = 600
903
- options.title = "Script Runner : Untitiled"
904
- options.auto_size = false
905
- options.config_file = "script_runner.txt"
906
- options.server_config_file = CmdTlmServer::DEFAULT_CONFIG_FILE
907
-
908
- option_parser.separator "Script Runner Specific Options:"
909
- option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
910
- options.config_file = arg
911
- end
912
- option_parser.on("-s", "--server FILE", "Use the specified server configuration file for disconnect mode") do |arg|
913
- options.server_config_file = arg
914
- end
915
- end
916
-
917
- super(option_parser, options)
918
- end
919
- end
920
- end # class ScriptRunner
921
-
922
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos'
12
+ Cosmos.catch_fatal_exception do
13
+ require 'cosmos/gui/qt_tool'
14
+ require 'cosmos/tools/script_runner/script_runner_frame'
15
+ require 'cosmos/tools/script_runner/script_runner_config'
16
+ require 'cosmos/tools/script_runner/script_audit'
17
+ require 'cosmos/gui/dialogs/progress_dialog'
18
+ require 'cosmos/gui/dialogs/scroll_text_dialog'
19
+ end
20
+
21
+ module Cosmos
22
+
23
+ class ScriptRunner < QtTool
24
+ slots 'handle_tab_change(int)'
25
+ slots 'context_menu(const QPoint&)'
26
+ slots 'undo_available(bool)'
27
+
28
+ UNTITLED_TAB_TEXT = ' Untitled '
29
+
30
+ def initialize(options)
31
+ # All code before super is executed twice in RubyQt Based classes
32
+ super(options) # MUST BE FIRST
33
+ Cosmos.load_cosmos_icon("script_runner.png")
34
+ setAcceptDrops(true) # Allow dropping in files
35
+
36
+ @config_file = options.config_file
37
+ @server_config_file = options.server_config_file
38
+
39
+ # Add procedures to search path
40
+ System.paths['PROCEDURES'].each do |path|
41
+ Cosmos.add_to_search_path(path)
42
+ end
43
+
44
+ initialize_actions()
45
+ initialize_menus()
46
+ initialize_central_widget()
47
+ complete_initialize()
48
+
49
+ # Load icons
50
+ @running_icon = Cosmos.get_icon('running.png')
51
+ @no_icon = Qt::Icon.new
52
+
53
+ # Handle configuration
54
+ filename = File.join(::Cosmos::USERPATH, %w(config tools script_runner), @config_file)
55
+ if File.exist?(filename)
56
+ ScriptRunnerConfig.new(filename)
57
+ elsif @config_file != 'script_runner.txt'
58
+ raise "Could not find config file #{filename}"
59
+ end
60
+
61
+ @procedure_dir = System.paths['PROCEDURES'][0]
62
+ @debug = false
63
+
64
+ # Create the initial tab(s)
65
+ if ARGV.length == 0
66
+ create_tab()
67
+ else
68
+ ARGV.each {|argv_filename| create_tab(argv_filename)}
69
+ end
70
+ end
71
+
72
+ def initialize_actions
73
+ super()
74
+
75
+ # File actions
76
+ @file_new = Qt::Action.new(Cosmos.get_icon('file.png'), tr('&New'), self)
77
+ @file_new_keyseq = Qt::KeySequence.new(tr('Ctrl+N'))
78
+ @file_new.shortcut = @file_new_keyseq
79
+ @file_new.statusTip = tr('Start a new script')
80
+ @file_new.connect(SIGNAL('triggered()')) { file_new() }
81
+
82
+ @file_open = Qt::Action.new(Cosmos.get_icon('open.png'), tr('&Open'), self)
83
+ @file_open_keyseq = Qt::KeySequence.new(tr('Ctrl+O'))
84
+ @file_open.shortcut = @file_open_keyseq
85
+ @file_open.statusTip = tr('Open a script')
86
+ @file_open.connect(SIGNAL('triggered()')) { file_open() }
87
+
88
+ @file_close = Qt::Action.new(tr('&Close'), self)
89
+ @file_close_keyseq = Qt::KeySequence.new(tr('Ctrl+W'))
90
+ @file_close.shortcut = @file_close_keyseq
91
+ @file_close.statusTip = tr('Close the script')
92
+ @file_close.connect(SIGNAL('triggered()')) { file_close() }
93
+
94
+ @file_reload = Qt::Action.new(tr('&Reload'), self)
95
+ @file_reload_keyseq = Qt::KeySequence.new(tr('Ctrl+R'))
96
+ @file_reload.shortcut = @file_reload_keyseq
97
+ @file_reload.statusTip = tr('Reload a script')
98
+ @file_reload.connect(SIGNAL('triggered()')) { file_reload() }
99
+
100
+ @file_save = Qt::Action.new(Cosmos.get_icon('save.png'), tr('&Save'), self)
101
+ @file_save_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
102
+ @file_save.shortcut = @file_save_keyseq
103
+ @file_save.statusTip = tr('Save the script')
104
+ @file_save.connect(SIGNAL('triggered()')) { file_save(false) }
105
+
106
+ @file_save_as = Qt::Action.new(Cosmos.get_icon('save_as.png'), tr('Save &As'), self)
107
+ @file_save_as.statusTip = tr('Save the script')
108
+ @file_save_as.connect(SIGNAL('triggered()')) { file_save(true) }
109
+
110
+ @file_options = Qt::Action.new(tr('O&ptions'), self)
111
+ @file_options.statusTip = tr('Application Options')
112
+ @file_options.connect(SIGNAL('triggered()')) { file_options() }
113
+
114
+ # Edit actions
115
+ @edit_undo = Qt::Action.new(Cosmos.get_icon('undo.png'), tr('&Undo'), self)
116
+ @edit_undo_keyseq = Qt::KeySequence.new(tr('Ctrl+Z'))
117
+ @edit_undo.shortcut = @edit_undo_keyseq
118
+ @edit_undo.statusTip = tr('Undo')
119
+ @edit_undo.connect(SIGNAL('triggered()')) { active_script_runner_frame().undo }
120
+
121
+ @edit_redo = Qt::Action.new(Cosmos.get_icon('redo.png'), tr('&Redo'), self)
122
+ @edit_redo_keyseq = Qt::KeySequence.new(tr('Ctrl+Y'))
123
+ @edit_redo.shortcut = @edit_redo_keyseq
124
+ @edit_redo.statusTip = tr('Redo')
125
+ @edit_redo.connect(SIGNAL('triggered()')) { active_script_runner_frame().redo }
126
+
127
+ @edit_cut = Qt::Action.new(Cosmos.get_icon('cut.png'), tr('Cu&t'), self)
128
+ @edit_cut_keyseq = Qt::KeySequence.new(tr('Ctrl+X'))
129
+ @edit_cut.shortcut = @edit_cut_keyseq
130
+ @edit_cut.statusTip = tr('Cut')
131
+ @edit_cut.connect(SIGNAL('triggered()')) { active_script_runner_frame().cut }
132
+
133
+ @edit_copy = Qt::Action.new(Cosmos.get_icon('copy.png'), tr('&Copy'), self)
134
+ @edit_copy_keyseq = Qt::KeySequence.new(tr('Ctrl+C'))
135
+ @edit_copy.shortcut = @edit_copy_keyseq
136
+ @edit_copy.statusTip = tr('Copy')
137
+ @edit_copy.connect(SIGNAL('triggered()')) { active_script_runner_frame().copy }
138
+
139
+ @edit_paste = Qt::Action.new(tr('&Paste'), self)
140
+ @edit_paste_keyseq = Qt::KeySequence.new(tr('Ctrl+V'))
141
+ @edit_paste.shortcut = @edit_paste_keyseq
142
+ @edit_paste.statusTip = tr('Paste')
143
+ @edit_paste.connect(SIGNAL('triggered()')) { active_script_runner_frame().paste }
144
+
145
+ @edit_select_all = Qt::Action.new(tr('Select &All'), self)
146
+ @edit_select_all_keyseq = Qt::KeySequence.new(tr('Ctrl+A'))
147
+ @edit_select_all.shortcut = @edit_select_all_keyseq
148
+ @edit_select_all.statusTip = tr('Select All')
149
+ @edit_select_all.connect(SIGNAL('triggered()')) { active_script_runner_frame().select_all }
150
+
151
+ @edit_comment = Qt::Action.new(tr('Comment/Uncomment &Lines'), self)
152
+ @edit_comment_keyseq = Qt::KeySequence.new(tr('Ctrl+K'))
153
+ @edit_comment.shortcut = @edit_comment_keyseq
154
+ @edit_comment.statusTip = tr('Comment/Uncomment Lines')
155
+ @edit_comment.connect(SIGNAL('triggered()')) { active_script_runner_frame().comment_or_uncomment_lines }
156
+
157
+ # Search Actions
158
+ @search_find = Qt::Action.new(Cosmos.get_icon('search.png'), tr('&Find'), self)
159
+ @search_find_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
160
+ @search_find.shortcut = @search_find_keyseq
161
+ @search_find.statusTip = tr('Find text')
162
+ @search_find.connect(SIGNAL('triggered()')) do
163
+ FindReplaceDialog.show_find(active_script_runner_frame().script)
164
+ end
165
+
166
+ @search_find_next = Qt::Action.new(tr('Find &Next'), self)
167
+ @search_find_next_keyseq = Qt::KeySequence.new(tr('F3'))
168
+ @search_find_next.shortcut = @search_find_next_keyseq
169
+ @search_find_next.statusTip = tr('Find next instance')
170
+ @search_find_next.connect(SIGNAL('triggered()')) do
171
+ FindReplaceDialog.find_next(active_script_runner_frame().script)
172
+ end
173
+
174
+ @search_find_previous = Qt::Action.new(tr('Find &Previous'), self)
175
+ @search_find_previous_keyseq = Qt::KeySequence.new(tr('Shift+F3'))
176
+ @search_find_previous.shortcut = @search_find_previous_keyseq
177
+ @search_find_previous.statusTip = tr('Find previous instance')
178
+ @search_find_previous.connect(SIGNAL('triggered()')) do
179
+ FindReplaceDialog.find_previous(active_script_runner_frame().script)
180
+ end
181
+
182
+ @search_replace = Qt::Action.new(tr('&Replace'), self)
183
+ @search_replace_keyseq = Qt::KeySequence.new(tr('Ctrl+H'))
184
+ @search_replace.shortcut = @search_replace_keyseq
185
+ @search_replace.statusTip = tr('Replace')
186
+ @search_replace.connect(SIGNAL('triggered()')) do
187
+ FindReplaceDialog.show_replace(active_script_runner_frame().script)
188
+ end
189
+
190
+ # Script Actions
191
+ @script_syntax_all = Qt::Action.new(tr('&Ruby Syntax Check'), self)
192
+ @script_syntax_all.statusTip = tr('Check ruby syntax of this script')
193
+ @script_syntax_all.connect(SIGNAL('triggered()')) do
194
+ active_script_runner_frame().ruby_syntax_check_text()
195
+ end
196
+
197
+ @script_mnemonic_all = Qt::Action.new(tr('&Mnemonic Check'), self)
198
+ @script_mnemonic_all.statusTip = tr('Check mnemonics of this script')
199
+ @script_mnemonic_all.connect(SIGNAL('triggered()')) do
200
+ active_script_runner_frame().mnemonic_check_text(active_script_runner_frame().text)
201
+ end
202
+
203
+ @script_execute_lines = Qt::Action.new(tr('&Execute Selected Lines'), self)
204
+ @script_execute_lines.statusTip = tr('Execute selected lines')
205
+ @script_execute_lines.connect(SIGNAL('triggered()')) { active_script_runner_frame().run_selection }
206
+
207
+ @script_execute_cursor = Qt::Action.new(tr('E&xecute From Cursor'), self)
208
+ @script_execute_cursor.statusTip = tr('Execute from cursor position')
209
+ @script_execute_cursor.connect(SIGNAL('triggered()')) { active_script_runner_frame().run_from_cursor }
210
+
211
+ @script_syntax_lines = Qt::Action.new(tr('Ruby &Syntax Check Selected Lines'), self)
212
+ @script_syntax_lines.statusTip = tr('Check ruby syntax of selected lines')
213
+ @script_syntax_lines.connect(SIGNAL('triggered()')) { active_script_runner_frame().ruby_syntax_check_selection }
214
+
215
+ @script_mnemonic_lines = Qt::Action.new(tr('M&nemonic Check Selected Lines'), self)
216
+ @script_mnemonic_lines.statusTip = tr('Check mnemonics of selected lines')
217
+ @script_mnemonic_lines.connect(SIGNAL('triggered()')) { active_script_runner_frame().mnemonic_check_selection }
218
+
219
+ @script_audit = Qt::Action.new(tr('&Generate Cmd/Tlm Audit'), self)
220
+ @script_audit.statusTip = tr('Generate audit about commands sent and telemetry checked')
221
+ @script_audit.connect(SIGNAL('triggered()')) { script_audit() }
222
+
223
+ @script_instrumented = Qt::Action.new(tr('&View Instrumented Script'), self)
224
+ @script_instrumented.statusTip = tr('View instrumented script')
225
+ @script_instrumented.connect(SIGNAL('triggered()')) { script_view_instrumented() }
226
+
227
+ @script_log_message = Qt::Action.new(tr('Log Message to Script Log'), self)
228
+ @script_log_message.statusTip = tr('Log Message to Script Log')
229
+ @script_log_message.connect(SIGNAL('triggered()')) { script_log_message() }
230
+ @script_log_message.setEnabled(false)
231
+
232
+ @script_call_stack = Qt::Action.new(tr('Show Call Stack'), self)
233
+ @script_call_stack.statusTip = tr('Show Call Stack')
234
+ @script_call_stack.connect(SIGNAL('triggered()')) { script_call_stack() }
235
+ @script_call_stack.setEnabled(false)
236
+
237
+ @script_debug = Qt::Action.new(Cosmos.get_icon('bug.png'), tr('Toggle &Debug'), self)
238
+ @script_debug_keyseq = Qt::KeySequence.new(tr('Ctrl+D'))
239
+ @script_debug.shortcut = @script_debug_keyseq
240
+ @script_debug.statusTip = tr('Toggle debug capabilities for the script')
241
+ @script_debug.connect(SIGNAL('triggered()')) { script_toggle_debug() }
242
+
243
+ @script_disconnect = Qt::Action.new(Cosmos.get_icon('disconnected.png'), tr('&Toggle Disconnect'), self)
244
+ @script_disconnect_keyseq = Qt::KeySequence.new(tr('Ctrl+T'))
245
+ @script_disconnect.shortcut = @script_disconnect_keyseq
246
+ @script_disconnect.statusTip = tr('Toggle disconnect from the server')
247
+ @script_disconnect.connect(SIGNAL('triggered()')) { script_toggle_disconnect() }
248
+ end
249
+
250
+ def initialize_menus
251
+ # File Menu
252
+ file_menu = menuBar.addMenu(tr('&File'))
253
+ file_menu.addAction(@file_new)
254
+ file_menu.addAction(@file_open)
255
+ file_menu.addAction(@file_close)
256
+ file_menu.addAction(@file_reload)
257
+ file_menu.addSeparator()
258
+ file_menu.addAction(@file_save)
259
+ file_menu.addAction(@file_save_as)
260
+ file_menu.addSeparator()
261
+ file_menu.addAction(@file_options)
262
+ file_menu.addSeparator()
263
+ file_menu.addAction(@exit_action)
264
+
265
+ # Edit Menu
266
+ mode_menu = menuBar.addMenu(tr('&Edit'))
267
+ mode_menu.addAction(@edit_undo)
268
+ mode_menu.addAction(@edit_redo)
269
+ mode_menu.addSeparator()
270
+ mode_menu.addAction(@edit_cut)
271
+ mode_menu.addAction(@edit_copy)
272
+ mode_menu.addAction(@edit_paste)
273
+ mode_menu.addSeparator()
274
+ mode_menu.addAction(@edit_select_all)
275
+ mode_menu.addSeparator()
276
+ mode_menu.addAction(@edit_comment)
277
+
278
+ # Search Menu
279
+ view_menu = menuBar.addMenu(tr('&Search'))
280
+ view_menu.addAction(@search_find)
281
+ view_menu.addAction(@search_find_next)
282
+ view_menu.addAction(@search_find_previous)
283
+ view_menu.addAction(@search_replace)
284
+
285
+ # Script Menu
286
+ view_menu = menuBar.addMenu(tr('Scrip&t'))
287
+ view_menu.addAction(@script_syntax_all)
288
+ view_menu.addAction(@script_syntax_lines)
289
+ view_menu.addSeparator()
290
+ view_menu.addAction(@script_mnemonic_all)
291
+ view_menu.addAction(@script_mnemonic_lines)
292
+ view_menu.addSeparator()
293
+ view_menu.addAction(@script_execute_lines)
294
+ view_menu.addAction(@script_execute_cursor)
295
+ view_menu.addSeparator()
296
+ view_menu.addAction(@script_audit)
297
+ view_menu.addAction(@script_instrumented)
298
+ view_menu.addSeparator()
299
+ view_menu.addAction(@script_log_message)
300
+ view_menu.addAction(@script_call_stack)
301
+ view_menu.addAction(@script_debug)
302
+ view_menu.addAction(@script_disconnect)
303
+
304
+ # Help Menu
305
+ @about_string = "Script Runner allows the user to execute commands "\
306
+ "and take action on telemetry within a saveable script. "\
307
+ "It allows the full power of the Ruby programming language "\
308
+ "while defining several keywords to manipulate commands and telemetry in COSMOS.\n"
309
+
310
+ initialize_help_menu()
311
+ end
312
+
313
+ def initialize_central_widget
314
+ # Create the central widget
315
+ @tab_book = Qt::TabWidget.new
316
+ @tab_book.setMovable(true)
317
+ @tab_book.setContextMenuPolicy(Qt::CustomContextMenu)
318
+ connect(@tab_book,
319
+ SIGNAL('customContextMenuRequested(const QPoint&)'),
320
+ self,
321
+ SLOT('context_menu(const QPoint&)'))
322
+ connect(@tab_book,
323
+ SIGNAL('currentChanged(int)'),
324
+ self,
325
+ SLOT('handle_tab_change(int)'))
326
+ setCentralWidget(@tab_book)
327
+
328
+ # Display a blank message to force the statusBar to show
329
+ statusBar.showMessage("")
330
+ end
331
+
332
+ ###########################################
333
+ # Drag files into ScriptRunner support
334
+ ###########################################
335
+
336
+ def dragEnterEvent(event)
337
+ if event.mimeData.hasUrls
338
+ event.acceptProposedAction();
339
+ end
340
+ end
341
+
342
+ def dragMoveEvent(event)
343
+ if event.mimeData.hasUrls
344
+ event.acceptProposedAction();
345
+ end
346
+ end
347
+
348
+ def dropEvent(event)
349
+ event.mimeData.urls.each do |url|
350
+ filename = url.toLocalFile
351
+ extension = File.extname(filename).to_s.downcase
352
+ if extension == '.rb' or extension == '.txt'
353
+ file_open(filename)
354
+ end
355
+ end
356
+ end
357
+
358
+ ###########################################
359
+ # File Menu Options
360
+ ###########################################
361
+
362
+ # File->New
363
+ def file_new
364
+ create_tab()
365
+ end
366
+
367
+ # File->Open
368
+ def file_open(filename = nil)
369
+ if !filename
370
+ filename = Qt::FileDialog.getOpenFileName(self, "Select Script", @procedure_dir)
371
+ end
372
+ unless filename.nil? || filename.empty?
373
+ # If the user opens a file we already have open
374
+ # just set the current tab to that file and return
375
+ @tab_book.tabs.each_with_index do |tab, index|
376
+ if tab.filename == filename
377
+ @tab_book.setCurrentIndex(index)
378
+ @tab_book.currentTab.set_text_from_file(filename)
379
+ @tab_book.currentTab.filename = filename
380
+ return
381
+ end
382
+ end
383
+
384
+ if ((@tab_book.count == 1) &&
385
+ @tab_book.currentTab.filename.empty? &&
386
+ !@tab_book.currentTab.modified)
387
+ # Active Tab is an unmodified Untitled so just open the file in it
388
+ @tab_book.currentTab.set_text_from_file(filename)
389
+ @tab_book.currentTab.filename = filename
390
+ @tab_book.setTabText(@tab_book.currentIndex, File.basename(filename))
391
+ else
392
+ create_tab(filename)
393
+ end
394
+
395
+ update_title()
396
+ @procedure_dir = File.dirname(filename)
397
+ @procedure_dir << '/' if @procedure_dir[-1..-1] != '/' and @procedure_dir[-1..-1] != '\\'
398
+ end
399
+ end
400
+
401
+ # File->Reload
402
+ def file_reload
403
+ safe_to_continue = true
404
+ if @tab_book.currentTab.modified
405
+ case Qt::MessageBox.question(self, # parent
406
+ 'Discard Changes?', # title
407
+ 'Warning: Changes will be lost. Continue?', # text
408
+ Qt::MessageBox::Yes | Qt::MessageBox::No, # buttons
409
+ Qt::MessageBox::No) # default button
410
+ when Qt::MessageBox::No
411
+ safe_to_continue = false
412
+ end
413
+ end
414
+
415
+ if safe_to_continue
416
+ if active_script_runner_frame().filename.empty?
417
+ active_script_runner_frame().set_text('')
418
+ else
419
+ active_script_runner_frame().set_text_from_file(active_script_runner_frame().filename)
420
+ end
421
+ @tab_book.currentTab.modified = false
422
+ update_title()
423
+ end
424
+ end
425
+
426
+ # File->Save and File->Save As
427
+ def file_save(save_as = false)
428
+ saved = false
429
+ filename = active_script_runner_frame().filename
430
+ if filename.empty?
431
+ filename = Qt::FileDialog::getSaveFileName(self, # parent
432
+ 'Save As...', # caption
433
+ @procedure_dir + '/procedure.rb', # dir
434
+ 'Procedure Files (*.rb)') # filter
435
+ elsif save_as
436
+ filename = Qt::FileDialog::getSaveFileName(self, # parent
437
+ 'Save As...', # caption
438
+ filename, # dir
439
+ 'Procedure Files (*.rb)') # filter
440
+ end
441
+ if not filename.nil? and not filename.empty?
442
+ begin
443
+ @tab_book.currentTab.filename = filename
444
+ @tab_book.currentTab.modified = false
445
+ @tab_book.setTabText(@tab_book.currentIndex, File.basename(filename))
446
+ active_script_runner_frame().filename = filename
447
+ File.open(filename, "w") {|file| file.write(active_script_runner_frame().text)}
448
+ saved = true
449
+ update_title()
450
+ statusBar.showMessage(tr("#{filename} saved"))
451
+ @procedure_dir = File.dirname(filename)
452
+ @procedure_dir << '/' if @procedure_dir[-1..-1] != '/' and @procedure_dir[-1..-1] != '\\'
453
+ rescue => error
454
+ statusBar.showMessage(tr("Error Saving Script : #{error.class} : #{error.message}"))
455
+ end
456
+ end
457
+
458
+ return saved
459
+ end
460
+
461
+ # File->Close
462
+ def file_close
463
+ if prompt_for_save_if_needed('Save Current Script?')
464
+ if @tab_book.count > 1
465
+ close_active_tab()
466
+ else
467
+ active_script_runner_frame().stop_message_log
468
+ @tab_book.setTabText(0, ' Untitled ')
469
+ @tab_book.currentTab.clear
470
+ end
471
+ update_title()
472
+ end
473
+ end
474
+
475
+ # File->Options
476
+ def file_options
477
+ dialog = Qt::Dialog.new(self)
478
+ dialog.setWindowTitle('Script Runner Options')
479
+ layout = Qt::VBoxLayout.new
480
+
481
+ form = Qt::FormLayout.new
482
+ box = Qt::DoubleSpinBox.new
483
+ box.setRange(0, 60)
484
+ box.setValue(ScriptRunnerFrame.line_delay)
485
+ form.addRow(tr("&Delay between each script line:"), box)
486
+ pause_on_error = Qt::CheckBox.new
487
+ form.addRow(tr("&Pause on error:"), pause_on_error)
488
+ monitor = Qt::CheckBox.new
489
+ form.addRow(tr("&Monitor limits:"), monitor)
490
+ if ScriptRunnerFrame.pause_on_error
491
+ pause_on_error.setCheckState(Qt::Checked)
492
+ else
493
+ pause_on_error.setCheckState(Qt::Unchecked)
494
+ end
495
+ pause_on_red = Qt::CheckBox.new
496
+ form.addRow(tr("Pause on &red limit:"), pause_on_red)
497
+ if ScriptRunnerFrame.monitor_limits
498
+ monitor.setCheckState(Qt::Checked)
499
+ pause_on_red.setCheckState(Qt::Checked) if ScriptRunnerFrame.pause_on_red
500
+ else
501
+ pause_on_red.setEnabled(false)
502
+ end
503
+ monitor.connect(SIGNAL('stateChanged(int)')) do
504
+ if monitor.isChecked()
505
+ pause_on_red.setEnabled(true)
506
+ else
507
+ pause_on_red.setCheckState(Qt::Unchecked)
508
+ pause_on_red.setEnabled(false)
509
+ end
510
+ end
511
+ layout.addLayout(form)
512
+
513
+ divider = Qt::Frame.new
514
+ divider.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Raised)
515
+ divider.setLineWidth(1)
516
+ layout.addWidget(divider)
517
+
518
+ ok = Qt::PushButton.new('Ok')
519
+ ok.setDefault(true)
520
+ ok.connect(SIGNAL('clicked(bool)')) do
521
+ ScriptRunnerFrame.line_delay = box.value
522
+ ScriptRunnerFrame.pause_on_error = (pause_on_error.checkState == Qt::Checked)
523
+ ScriptRunnerFrame.monitor_limits = (monitor.checkState == Qt::Checked)
524
+ ScriptRunnerFrame.pause_on_red = (pause_on_red.checkState == Qt::Checked)
525
+ dialog.accept
526
+ end
527
+ cancel = Qt::PushButton.new('Cancel')
528
+ cancel.connect(SIGNAL('clicked(bool)')) { dialog.reject }
529
+ button_layout = Qt::HBoxLayout.new
530
+ button_layout.addWidget(ok)
531
+ button_layout.addWidget(cancel)
532
+ layout.addLayout(button_layout)
533
+ dialog.setLayout(layout)
534
+ dialog.exec
535
+ dialog.dispose
536
+ end
537
+
538
+ ###########################################
539
+ # Script Menu Options
540
+ ###########################################
541
+
542
+ include ScriptAudit
543
+
544
+ # Script->View Instrumented
545
+ def script_view_instrumented
546
+ begin
547
+ instrumented_script =
548
+ ScriptRunnerFrame.instrument_script(active_script_runner_frame().text,
549
+ active_script_runner_frame().filename,
550
+ true)
551
+ rescue StopScript
552
+ return
553
+ end
554
+
555
+ # Show Dialog box containing script code
556
+ box = Qt::Dialog.new(self)
557
+ box.setWindowTitle('Instrumented Script')
558
+ text = Qt::PlainTextEdit.new
559
+ text.setWordWrapMode(Qt::TextOption::NoWrap)
560
+ text.setReadOnly(true)
561
+ text.setPlainText(instrumented_script)
562
+ layout = Qt::VBoxLayout.new
563
+ layout.addWidget(text)
564
+ ok = Qt::PushButton.new('OK')
565
+ ok.setDefault(true)
566
+ ok.connect(SIGNAL('clicked(bool)')) { box.accept }
567
+ button_layout = Qt::HBoxLayout.new
568
+ button_layout.addStretch
569
+ button_layout.addWidget(ok)
570
+ button_layout.addStretch
571
+ layout.addLayout(button_layout)
572
+ box.setLayout(layout)
573
+ box.setMinimumWidth([Qt::CoreApplication.instance.desktop.availableGeometry.width,
574
+ text.document.size.width].min)
575
+ screen_height = Qt::CoreApplication.instance.desktop.availableGeometry.height
576
+ preferred_height = (text.document.size.height * text.fontMetrics.lineSpacing) +
577
+ text.horizontalScrollBar.height + ok.sizeHint.height + (layout.spacing * 5)
578
+ box.setMinimumHeight([screen_height, preferred_height].min)
579
+ box.exec
580
+ box.dispose
581
+ end
582
+
583
+ # Script->Log Message to Script Log
584
+ def script_log_message
585
+ message = get_scriptrunner_log_message()
586
+ if message
587
+ active_script_runner_frame().scriptrunner_puts 'User logged: ' + message.to_s
588
+ active_script_runner_frame().handle_output_io
589
+ end
590
+ end
591
+
592
+ # Script->Show Call Stack
593
+ def script_call_stack
594
+ trace = active_script_runner_frame().current_backtrace
595
+ ScrollTextDialog.new(self, 'Call Stack', trace.join("\n"))
596
+ end
597
+
598
+ # Script->Toggle Debug
599
+ def script_toggle_debug
600
+ @debug = !@debug
601
+ if @tab_book.count > 0
602
+ (0..(@tab_book.count - 1)).each do |index|
603
+ @tab_book.tab(index).toggle_debug(@debug)
604
+ end
605
+ end
606
+ end
607
+
608
+ # Script->Toggle Disconnect
609
+ def script_toggle_disconnect
610
+ @server_config_file = active_script_runner_frame().toggle_disconnect(@server_config_file)
611
+ end
612
+
613
+ ###########################################
614
+ # Callbacks
615
+ ###########################################
616
+
617
+ def undo_available(bool)
618
+ update_title()
619
+ end
620
+
621
+ def closeEvent(event)
622
+ if active_script_runner_frame().prompt_if_running_on_close()
623
+ if prompt_for_save_if_needed_on_close()
624
+ shutdown_cmd_tlm()
625
+ @tab_book.tabs.each_with_index do |tab, index|
626
+ tab.stop_message_log
627
+ end
628
+ super(event)
629
+ else
630
+ event.ignore()
631
+ end
632
+ else
633
+ event.ignore()
634
+ end
635
+ end
636
+
637
+ # This method disables things that you shouldn't do while running
638
+ def run_callback(script_runner_frame = nil)
639
+ if script_runner_frame
640
+ @tab_book.tabs.each_with_index do |tab, index|
641
+ if tab != script_runner_frame
642
+ @tab_book.setTabEnabled(index, false)
643
+ else
644
+ @tab_book.tabBar.setTabIcon(index, @running_icon)
645
+ end
646
+ end
647
+ end
648
+ disable_menu_items()
649
+ end
650
+
651
+ # This method reenables things after running
652
+ def stop_callback(script_runner_frame = nil)
653
+ if script_runner_frame
654
+ @tab_book.tabs.each_with_index do |tab, index|
655
+ @tab_book.setTabEnabled(index, true)
656
+ @tab_book.tabBar.setTabIcon(index, @no_icon)
657
+ end
658
+ end
659
+ enable_menu_items()
660
+ end
661
+
662
+ def enable_menu_items
663
+ # Enable File Menu Items
664
+ @file_new.setEnabled(true)
665
+ @file_open.setEnabled(true)
666
+ @file_close.setEnabled(true)
667
+ @file_reload.setEnabled(true)
668
+ @file_save.setEnabled(true)
669
+ @file_save_as.setEnabled(true)
670
+ @file_options.setEnabled(true)
671
+
672
+ # Enable Edit Menu Items
673
+ @edit_undo.setEnabled(true)
674
+ @edit_redo.setEnabled(true)
675
+ @edit_cut.setEnabled(true)
676
+ @edit_copy.setEnabled(true)
677
+ @edit_paste.setEnabled(true)
678
+ @edit_select_all.setEnabled(true)
679
+ @edit_comment.setEnabled(true)
680
+
681
+ # Enable Script Menu Items
682
+ @script_syntax_all.setEnabled(true)
683
+ @script_syntax_lines.setEnabled(true)
684
+ @script_mnemonic_all.setEnabled(true)
685
+ @script_mnemonic_lines.setEnabled(true)
686
+ @script_execute_lines.setEnabled(true)
687
+ @script_execute_cursor.setEnabled(true)
688
+
689
+ # Disable Script Runtime Items'
690
+ @script_log_message.setEnabled(false)
691
+ @script_call_stack.setEnabled(false)
692
+ end
693
+
694
+ def disable_menu_items
695
+ # Disable File Menu Items
696
+ @file_new.setEnabled(false)
697
+ @file_open.setEnabled(false)
698
+ @file_close.setEnabled(false)
699
+ @file_reload.setEnabled(false)
700
+ @file_save.setEnabled(false)
701
+ @file_save_as.setEnabled(false)
702
+ @file_options.setEnabled(false)
703
+
704
+ # Disable Edit Menu Items
705
+ @edit_undo.setEnabled(false)
706
+ @edit_redo.setEnabled(false)
707
+ @edit_cut.setEnabled(false)
708
+ @edit_copy.setEnabled(false)
709
+ @edit_paste.setEnabled(false)
710
+ @edit_select_all.setEnabled(false)
711
+ @edit_comment.setEnabled(false)
712
+
713
+ # Disable Script Menu Items
714
+ @script_syntax_all.setEnabled(false)
715
+ @script_syntax_lines.setEnabled(false)
716
+ @script_mnemonic_all.setEnabled(false)
717
+ @script_mnemonic_lines.setEnabled(false)
718
+ @script_execute_lines.setEnabled(false)
719
+ @script_execute_cursor.setEnabled(false)
720
+
721
+ # Enable Script Runtime Items
722
+ @script_log_message.setEnabled(true)
723
+ @script_call_stack.setEnabled(true)
724
+ end
725
+
726
+ # Handle the user changing tabs
727
+ def handle_tab_change(index)
728
+ update_title()
729
+ end
730
+
731
+ def handle_script_keypress(event)
732
+ update_title()
733
+ if event.matches(Qt::KeySequence::NextChild)
734
+ index = @tab_book.currentIndex + 1
735
+ index = 0 if index >= @tab_book.count
736
+ @tab_book.setCurrentIndex(index)
737
+ elsif event.matches(Qt::KeySequence::PreviousChild)
738
+ index = @tab_book.currentIndex - 1
739
+ index = @tab_book.count - 1 if index < 0
740
+ @tab_book.setCurrentIndex(index)
741
+ end
742
+ end
743
+
744
+ def context_menu(point)
745
+ index = 0
746
+ @tab_book.tabBar.count.times do
747
+ break if @tab_book.tabBar.tabRect(index).contains(point)
748
+ index += 1
749
+ end
750
+
751
+ return if (index == @tab_book.tabBar.count)
752
+
753
+ # Bring the right clicked tab to the front
754
+ @tab_book.setCurrentIndex(index)
755
+
756
+ menu = Qt::Menu.new()
757
+
758
+ new_action = Qt::Action.new(tr("&New"), self)
759
+ new_action.statusTip = tr("Create a new script")
760
+ new_action.connect(SIGNAL('triggered()')) { file_new() }
761
+ menu.addAction(new_action)
762
+
763
+ close_action = Qt::Action.new(tr("&Close"), self)
764
+ close_action.statusTip = tr("Close the script")
765
+ close_action.connect(SIGNAL('triggered()')) { file_close() }
766
+ menu.addAction(close_action)
767
+
768
+ save_action = Qt::Action.new(tr("&Save"), self)
769
+ save_action.statusTip = tr("Save the script")
770
+ save_action.connect(SIGNAL('triggered()')) { file_save(false) }
771
+ menu.addAction(save_action)
772
+
773
+ save_action = Qt::Action.new(tr("Save &As"), self)
774
+ save_action.statusTip = tr("Save the script as")
775
+ save_action.connect(SIGNAL('triggered()')) { file_save(true) }
776
+ menu.addAction(save_action)
777
+
778
+ menu.exec(@tab_book.mapToGlobal(point))
779
+ menu.dispose
780
+ end
781
+
782
+ #############################################################
783
+ # Helper Methods
784
+ #############################################################
785
+
786
+ # Called by cosmos_script_module by the user calling the status_bar scripting method
787
+ def script_set_status(message)
788
+ Qt.execute_in_main_thread(true) do
789
+ # Check for self.disposed? to work around crash when using SimpleCov
790
+ unless self.disposed?
791
+ status_bar = statusBar()
792
+ status_bar.showMessage(message)
793
+ end
794
+ end
795
+ end
796
+
797
+ # Updates the title appropriately to show the tabs filename and modified status
798
+ def update_title
799
+ if @tab_book.currentTab.filename.empty?
800
+ self.setWindowTitle("Script Runner : Untitled")
801
+ else
802
+ self.setWindowTitle("Script Runner : #{@tab_book.currentTab.filename}")
803
+ end
804
+ self.setWindowTitle(self.windowTitle << '*') if @tab_book.currentTab.modified
805
+ end
806
+
807
+ # Returns the script runner frame of the active tab
808
+ def active_script_runner_frame
809
+ @tab_book.currentTab
810
+ end
811
+
812
+ # Creates a new tab
813
+ def create_tab(filename = '')
814
+ if filename.empty?
815
+ tab_item_name = UNTITLED_TAB_TEXT
816
+ else
817
+ tab_item_name = ' ' + File.basename(filename) + ' '
818
+ end
819
+
820
+ script_runner_frame = ScriptRunnerFrame.new(self)
821
+ script_runner_frame.toggle_debug(@debug)
822
+ script_runner_frame.setContentsMargins(5,5,5,5)
823
+ connect(script_runner_frame,
824
+ SIGNAL('undoAvailable(bool)'),
825
+ self,
826
+ SLOT('undo_available(bool)'))
827
+ script_runner_frame.run_callback = method(:run_callback)
828
+ script_runner_frame.stop_callback = method(:stop_callback)
829
+ script_runner_frame.set_text_from_file(filename) unless filename.empty?
830
+ script_runner_frame.filename = filename
831
+ # Register a keypress handler so we can Ctrl-Tab our way through the tabs
832
+ script_runner_frame.key_press_callback = method(:handle_script_keypress)
833
+ # Update the title if the frame changes so we can add/remove the asterix
834
+ script_runner_frame.connect(SIGNAL('modificationChanged(bool)')) { update_title() }
835
+
836
+ @tab_book.addTab(script_runner_frame, tab_item_name)
837
+ @tab_book.setCurrentIndex(@tab_book.count-1) # index is 0 based
838
+ # Set the focus on the input now that we've added the tab
839
+ script_runner_frame.setFocus
840
+ update_title()
841
+ end
842
+
843
+ # Closes the active tab
844
+ def close_active_tab
845
+ if @tab_book.count > 1
846
+ active_script_runner_frame().stop_message_log
847
+ tab_index = @tab_book.currentIndex
848
+ @tab_book.removeTab(tab_index)
849
+ if tab_index >= 1
850
+ @tab_book.setCurrentIndex(tab_index - 1)
851
+ else
852
+ @tab_book.setCurrentIndex(0)
853
+ end
854
+ end
855
+ end
856
+
857
+ # Prompts for save if the current tab has been modified
858
+ def prompt_for_save_if_needed(message = 'Save?')
859
+ safe_to_continue = true
860
+ if @tab_book.currentTab.modified
861
+ case Qt::MessageBox.question(
862
+ self, # parent
863
+ 'Save?', # title
864
+ message, # text
865
+ Qt::MessageBox::Yes | Qt::MessageBox::No | Qt::MessageBox::Cancel, # buttons
866
+ Qt::MessageBox::Cancel) # default button
867
+ when Qt::MessageBox::Cancel
868
+ safe_to_continue = false
869
+ when Qt::MessageBox::Yes
870
+ saved = file_save(false)
871
+ if not saved
872
+ safe_to_continue = false
873
+ end
874
+ end
875
+ end
876
+ return safe_to_continue
877
+ end
878
+
879
+ # Prompts the user that unsaved changes have been made before they close the app
880
+ def prompt_for_save_if_needed_on_close
881
+ safe_to_continue = true
882
+ @tab_book.tabs.each_with_index do |tab, index|
883
+ if tab.modified
884
+ @tab_book.setCurrentIndex(index)
885
+ if tab.filename.empty?
886
+ message = "Save changes to 'Untitled'?"
887
+ else
888
+ message = "Save changes to '#{tab.filename}'?"
889
+ end
890
+ safe_to_continue = prompt_for_save_if_needed(message)
891
+ #~ break unless safe_to_continue
892
+ end
893
+ end
894
+ return safe_to_continue
895
+ end
896
+
897
+ def self.run(option_parser = nil, options = nil)
898
+ Cosmos.catch_fatal_exception do
899
+ unless option_parser and options
900
+ option_parser, options = create_default_options()
901
+ options.width = 750
902
+ options.height = 600
903
+ options.title = "Script Runner : Untitiled"
904
+ options.auto_size = false
905
+ options.config_file = "script_runner.txt"
906
+ options.server_config_file = CmdTlmServer::DEFAULT_CONFIG_FILE
907
+
908
+ option_parser.separator "Script Runner Specific Options:"
909
+ option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
910
+ options.config_file = arg
911
+ end
912
+ option_parser.on("-s", "--server FILE", "Use the specified server configuration file for disconnect mode") do |arg|
913
+ options.server_config_file = arg
914
+ end
915
+ end
916
+
917
+ super(option_parser, options)
918
+ end
919
+ end
920
+ end # class ScriptRunner
921
+
922
+ end # module Cosmos