cosmos 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1114) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +48 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +5 -0
  5. data/Guardfile +27 -0
  6. data/LICENSE.txt +879 -0
  7. data/Manifest.txt +1112 -0
  8. data/README.md +42 -0
  9. data/Rakefile +214 -0
  10. data/autohotkey/config/data/attitude.bin +0 -0
  11. data/autohotkey/config/data/diamond.STL +58 -0
  12. data/autohotkey/config/data/groundoff.gif +0 -0
  13. data/autohotkey/config/data/groundon.gif +0 -0
  14. data/autohotkey/config/data/position.bin +0 -0
  15. data/autohotkey/config/data/satellite.gif +0 -0
  16. data/autohotkey/config/data/tada.wav +0 -0
  17. data/autohotkey/config/system/system.txt +34 -0
  18. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -0
  19. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -0
  20. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -0
  21. data/autohotkey/config/targets/COSMOS/target.txt +5 -0
  22. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -0
  23. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -0
  24. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -0
  25. data/autohotkey/config/targets/INST/doc/README.txt +1 -0
  26. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -0
  27. data/autohotkey/config/targets/INST/lib/sim_inst.rb +294 -0
  28. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -0
  29. data/autohotkey/config/targets/INST/screens/array.txt +7 -0
  30. data/autohotkey/config/targets/INST/screens/block.txt +8 -0
  31. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -0
  32. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -0
  33. data/autohotkey/config/targets/INST/screens/ground.txt +25 -0
  34. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -0
  35. data/autohotkey/config/targets/INST/screens/hs.txt +49 -0
  36. data/autohotkey/config/targets/INST/screens/image.txt +21 -0
  37. data/autohotkey/config/targets/INST/screens/latest.txt +23 -0
  38. data/autohotkey/config/targets/INST/screens/mech.txt +25 -0
  39. data/autohotkey/config/targets/INST/screens/other.txt +25 -0
  40. data/autohotkey/config/targets/INST/screens/params.txt +25 -0
  41. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -0
  42. data/autohotkey/config/targets/INST/target.txt +27 -0
  43. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -0
  44. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -0
  45. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -0
  46. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -0
  47. data/autohotkey/config/tools/cmd_sender/cmd_sender.txt +1 -0
  48. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -0
  49. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -0
  50. data/autohotkey/config/tools/handbook_creator/default_toc.xsl +59 -0
  51. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -0
  52. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -0
  53. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -0
  54. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -0
  55. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -0
  56. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -0
  57. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -0
  58. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -0
  59. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -0
  60. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -0
  61. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -0
  62. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -0
  63. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -0
  64. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -0
  65. data/autohotkey/config/tools/launcher/launcher.txt +38 -0
  66. data/autohotkey/config/tools/limits_monitor/README.txt +1 -0
  67. data/autohotkey/config/tools/opengl_builder/error.txt +1 -0
  68. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -0
  69. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -0
  70. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -0
  71. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -0
  72. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -0
  73. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -0
  74. data/autohotkey/config/tools/test_runner/test_runner3.txt +7 -0
  75. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -0
  76. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +14 -0
  77. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -0
  78. data/autohotkey/config/tools/tlm_grapher/README.txt +1 -0
  79. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -0
  80. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -0
  81. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -0
  82. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -0
  83. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -0
  84. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -0
  85. data/autohotkey/lib/example_background_task.rb +42 -0
  86. data/autohotkey/lib/user_version.rb +3 -0
  87. data/autohotkey/outputs/handbooks/assets/css/bootstrap-theme.css +397 -0
  88. data/autohotkey/outputs/handbooks/assets/css/bootstrap-theme.min.css +7 -0
  89. data/autohotkey/outputs/handbooks/assets/css/bootstrap.css +7118 -0
  90. data/autohotkey/outputs/handbooks/assets/css/bootstrap.min.css +7 -0
  91. data/autohotkey/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  92. data/autohotkey/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  93. data/autohotkey/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  94. data/autohotkey/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  95. data/autohotkey/outputs/handbooks/assets/js/bootstrap.js +2006 -0
  96. data/autohotkey/outputs/handbooks/assets/js/bootstrap.min.js +7 -0
  97. data/autohotkey/outputs/logs/bigtlm.bin +0 -0
  98. data/autohotkey/outputs/logs/cmd.bin +0 -0
  99. data/autohotkey/outputs/logs/tlm.bin +0 -0
  100. data/autohotkey/outputs/saved_config/README.txt +1 -0
  101. data/autohotkey/outputs/tables/README.txt +1 -0
  102. data/autohotkey/outputs/tmp/README.txt +1 -0
  103. data/autohotkey/procedures/clear_util.rb +7 -0
  104. data/autohotkey/procedures/collect.rb +18 -0
  105. data/autohotkey/procedures/collect_util.rb +14 -0
  106. data/autohotkey/procedures/example_test.rb +67 -0
  107. data/autohotkey/procedures/example_test2.rb +74 -0
  108. data/autohotkey/procedures/script_test.rb +17 -0
  109. data/autohotkey/procedures/syntax_error.rb +18 -0
  110. data/autohotkey/tools/CmdExtractorAHK +16 -0
  111. data/autohotkey/tools/CmdSender +14 -0
  112. data/autohotkey/tools/CmdSenderAHK +18 -0
  113. data/autohotkey/tools/CmdTlmServer +14 -0
  114. data/autohotkey/tools/CmdTlmServerAHK +28 -0
  115. data/autohotkey/tools/CmdTlmServerAHK2 +17 -0
  116. data/autohotkey/tools/DataViewer +14 -0
  117. data/autohotkey/tools/DataViewerAHK +17 -0
  118. data/autohotkey/tools/HandbookCreatorAHK +20 -0
  119. data/autohotkey/tools/LauncherAHK +17 -0
  120. data/autohotkey/tools/LimitsMonitorAHK +20 -0
  121. data/autohotkey/tools/OpenGLBuilderAHK +20 -0
  122. data/autohotkey/tools/PacketViewer +14 -0
  123. data/autohotkey/tools/PacketViewerAHK +18 -0
  124. data/autohotkey/tools/PacketViewerAHK2 +17 -0
  125. data/autohotkey/tools/Replay +14 -0
  126. data/autohotkey/tools/Replay.bat +59 -0
  127. data/autohotkey/tools/ReplayAHK +17 -0
  128. data/autohotkey/tools/ScriptRunner +14 -0
  129. data/autohotkey/tools/ScriptRunnerAHK +20 -0
  130. data/autohotkey/tools/ScriptRunnerAHK2 +17 -0
  131. data/autohotkey/tools/TableManager +14 -0
  132. data/autohotkey/tools/TableManagerAHK +30 -0
  133. data/autohotkey/tools/TestRunner +15 -0
  134. data/autohotkey/tools/TestRunnerAHK +17 -0
  135. data/autohotkey/tools/TestRunnerAHK2 +17 -0
  136. data/autohotkey/tools/TestRunnerAHK3 +17 -0
  137. data/autohotkey/tools/TestRunnerAHK4 +17 -0
  138. data/autohotkey/tools/TlmExtractor +15 -0
  139. data/autohotkey/tools/TlmExtractorAHK +19 -0
  140. data/autohotkey/tools/TlmExtractorAHK2 +16 -0
  141. data/autohotkey/tools/TlmExtractorAHK3 +16 -0
  142. data/autohotkey/tools/TlmGrapher +14 -0
  143. data/autohotkey/tools/TlmGrapherAHK +19 -0
  144. data/autohotkey/tools/TlmGrapherAHK2 +23 -0
  145. data/autohotkey/tools/TlmGrapherAHK3 +17 -0
  146. data/autohotkey/tools/TlmGrapherAHK4 +17 -0
  147. data/autohotkey/tools/TlmViewer +14 -0
  148. data/autohotkey/tools/TlmViewerAHK +28 -0
  149. data/autohotkey/tools/TlmViewerAHK2 +18 -0
  150. data/autohotkey/tools/TlmViewerAHK3 +18 -0
  151. data/autohotkey/tools/TlmViewerAHK4 +18 -0
  152. data/autohotkey/tools/TlmViewerAHK5 +18 -0
  153. data/autohotkey/tools/autohotkey.rb +37 -0
  154. data/autohotkey/tools/cmd_extractor.ahk +27 -0
  155. data/autohotkey/tools/cmd_sender.ahk +162 -0
  156. data/autohotkey/tools/cmd_tlm_server.ahk +89 -0
  157. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -0
  158. data/autohotkey/tools/data_viewer.ahk +135 -0
  159. data/autohotkey/tools/handbook_creator.ahk +23 -0
  160. data/autohotkey/tools/launcher.ahk +41 -0
  161. data/autohotkey/tools/limits_monitor.ahk +70 -0
  162. data/autohotkey/tools/open_gl_builder.ahk +134 -0
  163. data/autohotkey/tools/packet_viewer.ahk +143 -0
  164. data/autohotkey/tools/packet_viewer2.ahk +9 -0
  165. data/autohotkey/tools/replay.ahk +98 -0
  166. data/autohotkey/tools/script_runner.ahk +589 -0
  167. data/autohotkey/tools/script_runner2.ahk +31 -0
  168. data/autohotkey/tools/table_manager.ahk +220 -0
  169. data/autohotkey/tools/test_runner.ahk +259 -0
  170. data/autohotkey/tools/test_runner2.ahk +52 -0
  171. data/autohotkey/tools/test_runner3.ahk +13 -0
  172. data/autohotkey/tools/tlm_extractor.ahk +272 -0
  173. data/autohotkey/tools/tlm_grapher.ahk +642 -0
  174. data/autohotkey/tools/tlm_grapher2.ahk +115 -0
  175. data/autohotkey/tools/tlm_grapher3.ahk +24 -0
  176. data/autohotkey/tools/tlm_viewer.ahk +133 -0
  177. data/autohotkey/tools/tlm_viewer2.ahk +49 -0
  178. data/autohotkey/tools/tlm_viewer4.ahk +4 -0
  179. data/autohotkey/tools/tlm_viewer5.ahk +20 -0
  180. data/autohotkey/userpath.txt +1 -0
  181. data/bin/cosmos +96 -0
  182. data/bin/cstol_converter +1166 -0
  183. data/bin/exchndl20.dll +0 -0
  184. data/bin/exchndl21.dll +0 -0
  185. data/bin/mgwhelp.dll +0 -0
  186. data/bin/rubysloc +85 -0
  187. data/cosmos.gemspec +98 -0
  188. data/data/COSMOS_64x64.bmp +0 -0
  189. data/data/COSMOS_64x64.ico +0 -0
  190. data/data/COSMOS_64x64.png +0 -0
  191. data/data/CheckBoxCheck.gif +0 -0
  192. data/data/CheckBoxEmpty.gif +0 -0
  193. data/data/Earthmap1024x512.gif +0 -0
  194. data/data/about.txt +4 -0
  195. data/data/add_database.png +0 -0
  196. data/data/add_plot.png +0 -0
  197. data/data/add_tab.png +0 -0
  198. data/data/blank.png +0 -0
  199. data/data/bug.png +0 -0
  200. data/data/checkmark.png +0 -0
  201. data/data/close.png +0 -0
  202. data/data/cmd_extractor.png +0 -0
  203. data/data/cmd_sender.png +0 -0
  204. data/data/copy.png +0 -0
  205. data/data/cosmos.xcf +0 -0
  206. data/data/cosmos_word.gif +0 -0
  207. data/data/crc.txt +305 -0
  208. data/data/cts.png +0 -0
  209. data/data/cut.png +0 -0
  210. data/data/data_viewer.png +0 -0
  211. data/data/delete_database.png +0 -0
  212. data/data/delete_plot.png +0 -0
  213. data/data/delete_tab.png +0 -0
  214. data/data/diamond.STL +58 -0
  215. data/data/disconnected.png +0 -0
  216. data/data/edit.png +0 -0
  217. data/data/edit_database.png +0 -0
  218. data/data/edit_plot.png +0 -0
  219. data/data/edit_tab.png +0 -0
  220. data/data/end-26.png +0 -0
  221. data/data/fast_forward-26.png +0 -0
  222. data/data/file.png +0 -0
  223. data/data/handbook_creator.png +0 -0
  224. data/data/help.png +0 -0
  225. data/data/html-32.png +0 -0
  226. data/data/launcher.png +0 -0
  227. data/data/legal.gif +0 -0
  228. data/data/legal.txt +9 -0
  229. data/data/limits_monitor.png +0 -0
  230. data/data/moonmap1k.gif +0 -0
  231. data/data/multi.png +0 -0
  232. data/data/open.png +0 -0
  233. data/data/open_in_browser-32.png +0 -0
  234. data/data/opengl_builder.png +0 -0
  235. data/data/packet_viewer.png +0 -0
  236. data/data/pdf-32.png +0 -0
  237. data/data/play-26.png +0 -0
  238. data/data/redo.png +0 -0
  239. data/data/replay.png +0 -0
  240. data/data/reverse-play-26.png +0 -0
  241. data/data/rewind-26.png +0 -0
  242. data/data/running.png +0 -0
  243. data/data/save.png +0 -0
  244. data/data/save_as.png +0 -0
  245. data/data/screenshot.png +0 -0
  246. data/data/script_runner.png +0 -0
  247. data/data/search-14.png +0 -0
  248. data/data/search.png +0 -0
  249. data/data/send_file.png +0 -0
  250. data/data/skip_to_start-26.png +0 -0
  251. data/data/spinner.gif +0 -0
  252. data/data/splash.gif +0 -0
  253. data/data/stop-26.png +0 -0
  254. data/data/table_manager.png +0 -0
  255. data/data/test_runner.png +0 -0
  256. data/data/tlm_extractor.png +0 -0
  257. data/data/tlm_grapher.png +0 -0
  258. data/data/tlm_viewer.png +0 -0
  259. data/data/undo.png +0 -0
  260. data/demo/Gemfile +5 -0
  261. data/demo/Launcher +15 -0
  262. data/demo/Launcher.bat +59 -0
  263. data/demo/Rakefile +61 -0
  264. data/demo/config/data/attitude.bin +0 -0
  265. data/demo/config/data/crc.txt +206 -0
  266. data/demo/config/data/diamond.STL +58 -0
  267. data/demo/config/data/groundoff.gif +0 -0
  268. data/demo/config/data/groundon.gif +0 -0
  269. data/demo/config/data/hselectoff.gif +0 -0
  270. data/demo/config/data/hselecton.gif +0 -0
  271. data/demo/config/data/hswitchoff.gif +0 -0
  272. data/demo/config/data/hswitchon.gif +0 -0
  273. data/demo/config/data/meta_init.txt +4 -0
  274. data/demo/config/data/position.bin +0 -0
  275. data/demo/config/data/poweroff.gif +0 -0
  276. data/demo/config/data/poweron.gif +0 -0
  277. data/demo/config/data/satellite.gif +0 -0
  278. data/demo/config/data/tada.wav +0 -0
  279. data/demo/config/data/vswitchoff.gif +0 -0
  280. data/demo/config/data/vswitchon.gif +0 -0
  281. data/demo/config/system/system.txt +34 -0
  282. data/demo/config/system/system2.txt +33 -0
  283. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -0
  284. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -0
  285. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -0
  286. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -0
  287. data/demo/config/targets/COSMOS/screens/version.txt +19 -0
  288. data/demo/config/targets/COSMOS/target.txt +11 -0
  289. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -0
  290. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -0
  291. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -0
  292. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -0
  293. data/demo/config/targets/EXAMPLE/target.txt +7 -0
  294. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -0
  295. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -0
  296. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -0
  297. data/demo/config/targets/INST/doc/README.txt +1 -0
  298. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -0
  299. data/demo/config/targets/INST/lib/sim_inst.rb +294 -0
  300. data/demo/config/targets/INST/screens/adcs.txt +46 -0
  301. data/demo/config/targets/INST/screens/array.txt +15 -0
  302. data/demo/config/targets/INST/screens/block.txt +8 -0
  303. data/demo/config/targets/INST/screens/commanding.txt +30 -0
  304. data/demo/config/targets/INST/screens/graphs.txt +14 -0
  305. data/demo/config/targets/INST/screens/ground.txt +25 -0
  306. data/demo/config/targets/INST/screens/hs.txt +44 -0
  307. data/demo/config/targets/INST/screens/latest.txt +23 -0
  308. data/demo/config/targets/INST/screens/other.txt +29 -0
  309. data/demo/config/targets/INST/screens/tabs.txt +70 -0
  310. data/demo/config/targets/INST/target.txt +33 -0
  311. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -0
  312. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -0
  313. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -0
  314. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -0
  315. data/demo/config/targets/SYSTEM/screens/status.txt +12 -0
  316. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +12 -0
  317. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -0
  318. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -0
  319. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +48 -0
  320. data/demo/config/targets/TEMPLATED/target.txt +6 -0
  321. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -0
  322. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -0
  323. data/demo/config/tools/data_viewer/data_viewer.txt +11 -0
  324. data/demo/config/tools/handbook_creator/default_toc.xsl +59 -0
  325. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -0
  326. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -0
  327. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -0
  328. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -0
  329. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -0
  330. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -0
  331. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -0
  332. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -0
  333. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -0
  334. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -0
  335. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -0
  336. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -0
  337. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -0
  338. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -0
  339. data/demo/config/tools/launcher/launcher.txt +45 -0
  340. data/demo/config/tools/launcher/launcher2.txt +45 -0
  341. data/demo/config/tools/limits_monitor/README.txt +1 -0
  342. data/demo/config/tools/opengl_builder/README.txt +1 -0
  343. data/demo/config/tools/script_runner/script_runner.txt +3 -0
  344. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -0
  345. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -0
  346. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -0
  347. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -0
  348. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -0
  349. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -0
  350. data/demo/config/tools/test_runner/test_runner.txt +17 -0
  351. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -0
  352. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -0
  353. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -0
  354. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -0
  355. data/demo/config/tools/tlm_grapher/README.txt +1 -0
  356. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -0
  357. data/demo/lib/example_background_task.rb +52 -0
  358. data/demo/lib/example_target.rb +108 -0
  359. data/demo/lib/scpi_target.rb +74 -0
  360. data/demo/lib/user_version.rb +3 -0
  361. data/demo/outputs/handbooks/assets/css/bootstrap-theme.css +397 -0
  362. data/demo/outputs/handbooks/assets/css/bootstrap-theme.min.css +7 -0
  363. data/demo/outputs/handbooks/assets/css/bootstrap.css +7118 -0
  364. data/demo/outputs/handbooks/assets/css/bootstrap.min.css +7 -0
  365. data/demo/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  366. data/demo/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  367. data/demo/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  368. data/demo/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  369. data/demo/outputs/handbooks/assets/img/ball_logo.bmp +0 -0
  370. data/demo/outputs/handbooks/assets/img/ball_logo.gif +0 -0
  371. data/demo/outputs/handbooks/assets/img/ball_logo.jpg +0 -0
  372. data/demo/outputs/handbooks/assets/js/bootstrap.js +2006 -0
  373. data/demo/outputs/handbooks/assets/js/bootstrap.min.js +7 -0
  374. data/demo/outputs/handbooks/assets/js/html5shiv.js +8 -0
  375. data/demo/outputs/handbooks/assets/js/jquery-1.10.2.min.js +6 -0
  376. data/demo/outputs/handbooks/assets/js/respond.min.js +6 -0
  377. data/demo/outputs/logs/README.txt +1 -0
  378. data/demo/outputs/saved_config/README.txt +1 -0
  379. data/demo/outputs/tables/README.txt +1 -0
  380. data/demo/outputs/tmp/README.txt +1 -0
  381. data/demo/procedures/checks.rb +11 -0
  382. data/demo/procedures/clear_util.rb +7 -0
  383. data/demo/procedures/collect.rb +18 -0
  384. data/demo/procedures/collect_util.rb +14 -0
  385. data/demo/procedures/cosmos_api_test.rb +293 -0
  386. data/demo/procedures/disconnect.rb +29 -0
  387. data/demo/procedures/example_test.rb +182 -0
  388. data/demo/procedures/plot_test.rb +8 -0
  389. data/demo/procedures/run_example_test.rb +3 -0
  390. data/demo/procedures/test.rb +51 -0
  391. data/demo/tools/CmdExtractor +15 -0
  392. data/demo/tools/CmdExtractor.bat +59 -0
  393. data/demo/tools/CmdSender +15 -0
  394. data/demo/tools/CmdSender.bat +59 -0
  395. data/demo/tools/CmdTlmServer +15 -0
  396. data/demo/tools/CmdTlmServer.bat +59 -0
  397. data/demo/tools/DataViewer +15 -0
  398. data/demo/tools/DataViewer.bat +59 -0
  399. data/demo/tools/ExampleTarget +15 -0
  400. data/demo/tools/ExampleTarget.bat +59 -0
  401. data/demo/tools/HandbookCreator +15 -0
  402. data/demo/tools/HandbookCreator.bat +61 -0
  403. data/demo/tools/Launcher +15 -0
  404. data/demo/tools/Launcher.bat +59 -0
  405. data/demo/tools/LimitsMonitor +15 -0
  406. data/demo/tools/LimitsMonitor.bat +59 -0
  407. data/demo/tools/OpenGLBuilder +15 -0
  408. data/demo/tools/OpenGLBuilder.bat +59 -0
  409. data/demo/tools/PacketViewer +15 -0
  410. data/demo/tools/PacketViewer.bat +59 -0
  411. data/demo/tools/Replay +15 -0
  412. data/demo/tools/Replay.bat +59 -0
  413. data/demo/tools/ScpiTarget +15 -0
  414. data/demo/tools/ScpiTarget.bat +59 -0
  415. data/demo/tools/ScriptRunner +15 -0
  416. data/demo/tools/ScriptRunner.bat +59 -0
  417. data/demo/tools/TableManager +15 -0
  418. data/demo/tools/TableManager.bat +59 -0
  419. data/demo/tools/TestRunner +15 -0
  420. data/demo/tools/TestRunner.bat +59 -0
  421. data/demo/tools/TlmExtractor +15 -0
  422. data/demo/tools/TlmExtractor.bat +59 -0
  423. data/demo/tools/TlmGrapher +15 -0
  424. data/demo/tools/TlmGrapher.bat +59 -0
  425. data/demo/tools/TlmViewer +15 -0
  426. data/demo/tools/TlmViewer.bat +59 -0
  427. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -0
  428. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -0
  429. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -0
  430. data/demo/tools/mac/CmdExtractor.app/Contents/Resources/appIcon.icns +0 -0
  431. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -0
  432. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -0
  433. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -0
  434. data/demo/tools/mac/CmdSender.app/Contents/Resources/appIcon.icns +0 -0
  435. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -0
  436. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -0
  437. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -0
  438. data/demo/tools/mac/CmdTlmServer.app/Contents/Resources/appIcon.icns +0 -0
  439. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -0
  440. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -0
  441. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -0
  442. data/demo/tools/mac/DataViewer.app/Contents/Resources/appIcon.icns +0 -0
  443. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -0
  444. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -0
  445. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -0
  446. data/demo/tools/mac/HandbookCreator.app/Contents/Resources/appIcon.icns +0 -0
  447. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -0
  448. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -0
  449. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -0
  450. data/demo/tools/mac/Launcher.app/Contents/Resources/appIcon.icns +0 -0
  451. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -0
  452. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -0
  453. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -0
  454. data/demo/tools/mac/LimitsMonitor.app/Contents/Resources/appIcon.icns +0 -0
  455. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -0
  456. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -0
  457. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -0
  458. data/demo/tools/mac/OpenGLBuilder.app/Contents/Resources/appIcon.icns +0 -0
  459. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -0
  460. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -0
  461. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -0
  462. data/demo/tools/mac/PacketViewer.app/Contents/Resources/appIcon.icns +0 -0
  463. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -0
  464. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -0
  465. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -0
  466. data/demo/tools/mac/Replay.app/Contents/Resources/appIcon.icns +0 -0
  467. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -0
  468. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -0
  469. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -0
  470. data/demo/tools/mac/ScriptRunner.app/Contents/Resources/appIcon.icns +0 -0
  471. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -0
  472. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -0
  473. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -0
  474. data/demo/tools/mac/TableManager.app/Contents/Resources/appIcon.icns +0 -0
  475. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -0
  476. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -0
  477. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -0
  478. data/demo/tools/mac/TestRunner.app/Contents/Resources/appIcon.icns +0 -0
  479. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -0
  480. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -0
  481. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -0
  482. data/demo/tools/mac/TlmExtractor.app/Contents/Resources/appIcon.icns +0 -0
  483. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -0
  484. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -0
  485. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -0
  486. data/demo/tools/mac/TlmGrapher.app/Contents/Resources/appIcon.icns +0 -0
  487. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -0
  488. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -0
  489. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -0
  490. data/demo/tools/mac/TlmViewer.app/Contents/Resources/appIcon.icns +0 -0
  491. data/demo/userpath.txt +1 -0
  492. data/ext/cosmos/ext/array/array.c +111 -0
  493. data/ext/cosmos/ext/array/extconf.rb +13 -0
  494. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -0
  495. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -0
  496. data/ext/cosmos/ext/config_parser/config_parser.c +237 -0
  497. data/ext/cosmos/ext/config_parser/extconf.rb +13 -0
  498. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -0
  499. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -0
  500. data/ext/cosmos/ext/crc/crc.c +341 -0
  501. data/ext/cosmos/ext/crc/extconf.rb +13 -0
  502. data/ext/cosmos/ext/line_graph/extconf.rb +13 -0
  503. data/ext/cosmos/ext/line_graph/line_graph.c +501 -0
  504. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +13 -0
  505. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -0
  506. data/ext/cosmos/ext/packet/extconf.rb +13 -0
  507. data/ext/cosmos/ext/packet/packet.c +339 -0
  508. data/ext/cosmos/ext/platform/extconf.rb +13 -0
  509. data/ext/cosmos/ext/platform/platform.c +82 -0
  510. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -0
  511. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -0
  512. data/ext/cosmos/ext/string/extconf.rb +13 -0
  513. data/ext/cosmos/ext/string/string.c +49 -0
  514. data/ext/cosmos/ext/structure/structure.c +894 -0
  515. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -0
  516. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -0
  517. data/ext/cosmos/ext/telemetry/extconf.rb +13 -0
  518. data/ext/cosmos/ext/telemetry/telemetry.c +306 -0
  519. data/install/Gemfile +5 -0
  520. data/install/Launcher +14 -0
  521. data/install/Launcher.bat +59 -0
  522. data/install/Rakefile +61 -0
  523. data/install/config/data/README.txt +1 -0
  524. data/install/config/data/crc.txt +133 -0
  525. data/install/config/system/system.txt +29 -0
  526. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -0
  527. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -0
  528. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -0
  529. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -0
  530. data/install/config/targets/COSMOS/screens/version.txt +19 -0
  531. data/install/config/targets/COSMOS/target.txt +9 -0
  532. data/install/config/targets/SYSTEM/README.txt +1 -0
  533. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -0
  534. data/install/config/tools/data_viewer/data_viewer.txt +4 -0
  535. data/install/config/tools/handbook_creator/default_toc.xsl +59 -0
  536. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -0
  537. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -0
  538. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -0
  539. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -0
  540. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -0
  541. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -0
  542. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -0
  543. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -0
  544. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -0
  545. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -0
  546. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -0
  547. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -0
  548. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -0
  549. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -0
  550. data/install/config/tools/launcher/launcher.txt +39 -0
  551. data/install/config/tools/limits_monitor/README.txt +1 -0
  552. data/install/config/tools/opengl_builder/README.txt +1 -0
  553. data/install/config/tools/script_runner/script_runner.txt +3 -0
  554. data/install/config/tools/table_manager/README.txt +1 -0
  555. data/install/config/tools/test_runner/test_runner.txt +8 -0
  556. data/install/config/tools/tlm_extractor/README.txt +1 -0
  557. data/install/config/tools/tlm_grapher/README.txt +1 -0
  558. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -0
  559. data/install/lib/user_version.rb +3 -0
  560. data/install/outputs/handbooks/assets/css/bootstrap-theme.css +397 -0
  561. data/install/outputs/handbooks/assets/css/bootstrap-theme.min.css +7 -0
  562. data/install/outputs/handbooks/assets/css/bootstrap.css +7118 -0
  563. data/install/outputs/handbooks/assets/css/bootstrap.min.css +7 -0
  564. data/install/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  565. data/install/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  566. data/install/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  567. data/install/outputs/handbooks/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  568. data/install/outputs/handbooks/assets/img/ball_logo.bmp +0 -0
  569. data/install/outputs/handbooks/assets/img/ball_logo.gif +0 -0
  570. data/install/outputs/handbooks/assets/img/ball_logo.jpg +0 -0
  571. data/install/outputs/handbooks/assets/js/bootstrap.js +2006 -0
  572. data/install/outputs/handbooks/assets/js/bootstrap.min.js +7 -0
  573. data/install/outputs/handbooks/assets/js/html5shiv.js +8 -0
  574. data/install/outputs/handbooks/assets/js/jquery-1.10.2.min.js +6 -0
  575. data/install/outputs/handbooks/assets/js/respond.min.js +6 -0
  576. data/install/outputs/logs/README.txt +1 -0
  577. data/install/outputs/saved_config/README.txt +1 -0
  578. data/install/outputs/tables/README.txt +1 -0
  579. data/install/outputs/tmp/README.txt +1 -0
  580. data/install/procedures/README.txt +1 -0
  581. data/install/tools/CmdExtractor +15 -0
  582. data/install/tools/CmdExtractor.bat +59 -0
  583. data/install/tools/CmdSender +15 -0
  584. data/install/tools/CmdSender.bat +59 -0
  585. data/install/tools/CmdTlmServer +15 -0
  586. data/install/tools/CmdTlmServer.bat +59 -0
  587. data/install/tools/DataViewer +15 -0
  588. data/install/tools/DataViewer.bat +59 -0
  589. data/install/tools/HandbookCreator +15 -0
  590. data/install/tools/HandbookCreator.bat +61 -0
  591. data/install/tools/Launcher +15 -0
  592. data/install/tools/Launcher.bat +59 -0
  593. data/install/tools/LimitsMonitor +15 -0
  594. data/install/tools/LimitsMonitor.bat +59 -0
  595. data/install/tools/OpenGLBuilder +15 -0
  596. data/install/tools/OpenGLBuilder.bat +59 -0
  597. data/install/tools/PacketViewer +15 -0
  598. data/install/tools/PacketViewer.bat +59 -0
  599. data/install/tools/Replay +15 -0
  600. data/install/tools/Replay.bat +59 -0
  601. data/install/tools/ScriptRunner +15 -0
  602. data/install/tools/ScriptRunner.bat +59 -0
  603. data/install/tools/TableManager +15 -0
  604. data/install/tools/TableManager.bat +59 -0
  605. data/install/tools/TestRunner +15 -0
  606. data/install/tools/TestRunner.bat +59 -0
  607. data/install/tools/TlmExtractor +15 -0
  608. data/install/tools/TlmExtractor.bat +59 -0
  609. data/install/tools/TlmGrapher +15 -0
  610. data/install/tools/TlmGrapher.bat +59 -0
  611. data/install/tools/TlmViewer +15 -0
  612. data/install/tools/TlmViewer.bat +59 -0
  613. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -0
  614. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -0
  615. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -0
  616. data/install/tools/mac/CmdExtractor.app/Contents/Resources/appIcon.icns +0 -0
  617. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -0
  618. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -0
  619. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -0
  620. data/install/tools/mac/CmdSender.app/Contents/Resources/appIcon.icns +0 -0
  621. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -0
  622. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -0
  623. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -0
  624. data/install/tools/mac/CmdTlmServer.app/Contents/Resources/appIcon.icns +0 -0
  625. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -0
  626. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -0
  627. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -0
  628. data/install/tools/mac/DataViewer.app/Contents/Resources/appIcon.icns +0 -0
  629. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -0
  630. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -0
  631. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -0
  632. data/install/tools/mac/HandbookCreator.app/Contents/Resources/appIcon.icns +0 -0
  633. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -0
  634. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -0
  635. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -0
  636. data/install/tools/mac/Launcher.app/Contents/Resources/appIcon.icns +0 -0
  637. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -0
  638. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -0
  639. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -0
  640. data/install/tools/mac/LimitsMonitor.app/Contents/Resources/appIcon.icns +0 -0
  641. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -0
  642. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -0
  643. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -0
  644. data/install/tools/mac/OpenGLBuilder.app/Contents/Resources/appIcon.icns +0 -0
  645. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -0
  646. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -0
  647. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -0
  648. data/install/tools/mac/PacketViewer.app/Contents/Resources/appIcon.icns +0 -0
  649. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -0
  650. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -0
  651. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -0
  652. data/install/tools/mac/Replay.app/Contents/Resources/appIcon.icns +0 -0
  653. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -0
  654. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -0
  655. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -0
  656. data/install/tools/mac/ScriptRunner.app/Contents/Resources/appIcon.icns +0 -0
  657. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -0
  658. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -0
  659. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -0
  660. data/install/tools/mac/TableManager.app/Contents/Resources/appIcon.icns +0 -0
  661. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -0
  662. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -0
  663. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -0
  664. data/install/tools/mac/TestRunner.app/Contents/Resources/appIcon.icns +0 -0
  665. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -0
  666. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -0
  667. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -0
  668. data/install/tools/mac/TlmExtractor.app/Contents/Resources/appIcon.icns +0 -0
  669. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -0
  670. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -0
  671. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -0
  672. data/install/tools/mac/TlmGrapher.app/Contents/Resources/appIcon.icns +0 -0
  673. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -0
  674. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -0
  675. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -0
  676. data/install/tools/mac/TlmViewer.app/Contents/Resources/appIcon.icns +0 -0
  677. data/install/userpath.txt +1 -0
  678. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -0
  679. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -0
  680. data/lib/cosmos/config/config_parser.rb +324 -0
  681. data/lib/cosmos/conversions/conversion.rb +47 -0
  682. data/lib/cosmos/conversions/generic_conversion.rb +55 -0
  683. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -0
  684. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -0
  685. data/lib/cosmos/conversions/processor_conversion.rb +46 -0
  686. data/lib/cosmos/conversions/received_count_conversion.rb +33 -0
  687. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -0
  688. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -0
  689. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -0
  690. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -0
  691. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -0
  692. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -0
  693. data/lib/cosmos/conversions.rb +13 -0
  694. data/lib/cosmos/core_ext/array.rb +354 -0
  695. data/lib/cosmos/core_ext/class.rb +51 -0
  696. data/lib/cosmos/core_ext/cosmos_io.rb +29 -0
  697. data/lib/cosmos/core_ext/exception.rb +52 -0
  698. data/lib/cosmos/core_ext/file.rb +75 -0
  699. data/lib/cosmos/core_ext/hash.rb +28 -0
  700. data/lib/cosmos/core_ext/io.rb +75 -0
  701. data/lib/cosmos/core_ext/kernel.rb +38 -0
  702. data/lib/cosmos/core_ext/math.rb +119 -0
  703. data/lib/cosmos/core_ext/matrix.rb +146 -0
  704. data/lib/cosmos/core_ext/objectspace.rb +29 -0
  705. data/lib/cosmos/core_ext/range.rb +22 -0
  706. data/lib/cosmos/core_ext/socket.rb +32 -0
  707. data/lib/cosmos/core_ext/string.rb +310 -0
  708. data/lib/cosmos/core_ext/stringio.rb +24 -0
  709. data/lib/cosmos/core_ext/time.rb +446 -0
  710. data/lib/cosmos/core_ext.rb +18 -0
  711. data/lib/cosmos/ext/.keep +0 -0
  712. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -0
  713. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -0
  714. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -0
  715. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -0
  716. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -0
  717. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -0
  718. data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -0
  719. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -0
  720. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -0
  721. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -0
  722. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -0
  723. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -0
  724. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -0
  725. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -0
  726. data/lib/cosmos/gui/dialogs/legal_dialog.rb +168 -0
  727. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -0
  728. data/lib/cosmos/gui/dialogs/progress_dialog.rb +262 -0
  729. data/lib/cosmos/gui/dialogs/pry_dialog.rb +161 -0
  730. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -0
  731. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -0
  732. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -0
  733. data/lib/cosmos/gui/dialogs/splash.rb +113 -0
  734. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -0
  735. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -0
  736. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -0
  737. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -0
  738. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -0
  739. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -0
  740. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -0
  741. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -0
  742. data/lib/cosmos/gui/line_graph/lines.rb +290 -0
  743. data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -0
  744. data/lib/cosmos/gui/opengl/earth_model.rb +22 -0
  745. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -0
  746. data/lib/cosmos/gui/opengl/gl_light.rb +39 -0
  747. data/lib/cosmos/gui/opengl/gl_material.rb +29 -0
  748. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -0
  749. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -0
  750. data/lib/cosmos/gui/opengl/gl_viewer.rb +712 -0
  751. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -0
  752. data/lib/cosmos/gui/opengl/moon_model.rb +22 -0
  753. data/lib/cosmos/gui/opengl/opengl.rb +8 -0
  754. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -0
  755. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -0
  756. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -0
  757. data/lib/cosmos/gui/qt.rb +786 -0
  758. data/lib/cosmos/gui/qt_tool.rb +373 -0
  759. data/lib/cosmos/gui/text/completion.rb +381 -0
  760. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -0
  761. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -0
  762. data/lib/cosmos/gui/text/ruby_editor.rb +395 -0
  763. data/lib/cosmos/gui/utilities/screenshot.rb +25 -0
  764. data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -0
  765. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -0
  766. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -0
  767. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -0
  768. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +149 -0
  769. data/lib/cosmos/interfaces/interface.rb +213 -0
  770. data/lib/cosmos/interfaces/linc_interface.rb +360 -0
  771. data/lib/cosmos/interfaces/serial_interface.rb +76 -0
  772. data/lib/cosmos/interfaces/simulated_target_interface.rb +128 -0
  773. data/lib/cosmos/interfaces/stream_interface.rb +156 -0
  774. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -0
  775. data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -0
  776. data/lib/cosmos/interfaces/udp_interface.rb +173 -0
  777. data/lib/cosmos/interfaces.rb +11 -0
  778. data/lib/cosmos/io/buffered_file.rb +11 -0
  779. data/lib/cosmos/io/cosmos_snmp.rb +50 -0
  780. data/lib/cosmos/io/io_multiplexer.rb +89 -0
  781. data/lib/cosmos/io/json_drb.rb +320 -0
  782. data/lib/cosmos/io/json_drb_object.rb +137 -0
  783. data/lib/cosmos/io/json_rpc.rb +365 -0
  784. data/lib/cosmos/io/posix_serial_driver.rb +145 -0
  785. data/lib/cosmos/io/raw_logger.rb +174 -0
  786. data/lib/cosmos/io/raw_logger_pair.rb +71 -0
  787. data/lib/cosmos/io/serial_driver.rb +85 -0
  788. data/lib/cosmos/io/stderr.rb +36 -0
  789. data/lib/cosmos/io/stdout.rb +36 -0
  790. data/lib/cosmos/io/tcpip_server.rb +532 -0
  791. data/lib/cosmos/io/udp_sockets.rb +152 -0
  792. data/lib/cosmos/io/win32_serial_driver.rb +147 -0
  793. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -0
  794. data/lib/cosmos/packet_logs/packet_log_reader.rb +439 -0
  795. data/lib/cosmos/packet_logs/packet_log_writer.rb +309 -0
  796. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -0
  797. data/lib/cosmos/packet_logs.rb +6 -0
  798. data/lib/cosmos/packets/binary_accessor.rb +921 -0
  799. data/lib/cosmos/packets/commands.rb +291 -0
  800. data/lib/cosmos/packets/limits.rb +263 -0
  801. data/lib/cosmos/packets/limits_response.rb +38 -0
  802. data/lib/cosmos/packets/packet.rb +699 -0
  803. data/lib/cosmos/packets/packet_config.rb +1034 -0
  804. data/lib/cosmos/packets/packet_item.rb +317 -0
  805. data/lib/cosmos/packets/packet_item_limits.rb +128 -0
  806. data/lib/cosmos/packets/structure.rb +386 -0
  807. data/lib/cosmos/packets/structure_item.rb +233 -0
  808. data/lib/cosmos/packets/telemetry.rb +317 -0
  809. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -0
  810. data/lib/cosmos/processors/processor.rb +71 -0
  811. data/lib/cosmos/processors/statistics_processor.rb +65 -0
  812. data/lib/cosmos/processors/watermark_processor.rb +44 -0
  813. data/lib/cosmos/processors.rb +6 -0
  814. data/lib/cosmos/script/extract.rb +115 -0
  815. data/lib/cosmos/script/script.rb +1493 -0
  816. data/lib/cosmos/script.rb +9 -0
  817. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -0
  818. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -0
  819. data/lib/cosmos/streams/length_stream_protocol.rb +140 -0
  820. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -0
  821. data/lib/cosmos/streams/serial_stream.rb +143 -0
  822. data/lib/cosmos/streams/stream.rb +57 -0
  823. data/lib/cosmos/streams/stream_protocol.rb +369 -0
  824. data/lib/cosmos/streams/tcpip_client_stream.rb +77 -0
  825. data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -0
  826. data/lib/cosmos/streams/template_stream_protocol.rb +140 -0
  827. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -0
  828. data/lib/cosmos/system/system.rb +558 -0
  829. data/lib/cosmos/system/target.rb +178 -0
  830. data/lib/cosmos/system.rb +4 -0
  831. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +253 -0
  832. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -0
  833. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -0
  834. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -0
  835. data/lib/cosmos/tools/cmd_tlm_server/api.rb +940 -0
  836. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -0
  837. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +63 -0
  838. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +496 -0
  839. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -0
  840. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1008 -0
  841. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -0
  842. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -0
  843. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +221 -0
  844. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -0
  845. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -0
  846. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -0
  847. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -0
  848. data/lib/cosmos/tools/data_viewer/data_viewer.rb +600 -0
  849. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -0
  850. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -0
  851. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -0
  852. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -0
  853. data/lib/cosmos/tools/launcher/launcher.rb +184 -0
  854. data/lib/cosmos/tools/launcher/launcher_config.rb +167 -0
  855. data/lib/cosmos/tools/launcher/launcher_multitool.rb +41 -0
  856. data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -0
  857. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +768 -0
  858. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -0
  859. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -0
  860. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -0
  861. data/lib/cosmos/tools/replay/replay.rb +488 -0
  862. data/lib/cosmos/tools/replay/replay_server.rb +91 -0
  863. data/lib/cosmos/tools/script_runner/script_audit.rb +139 -0
  864. data/lib/cosmos/tools/script_runner/script_runner.rb +914 -0
  865. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -0
  866. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1859 -0
  867. data/lib/cosmos/tools/table_manager/table.rb +70 -0
  868. data/lib/cosmos/tools/table_manager/table_config.rb +764 -0
  869. data/lib/cosmos/tools/table_manager/table_item.rb +74 -0
  870. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -0
  871. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -0
  872. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -0
  873. data/lib/cosmos/tools/test_runner/test.rb +480 -0
  874. data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -0
  875. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -0
  876. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -0
  877. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -0
  878. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -0
  879. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -0
  880. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -0
  881. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -0
  882. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -0
  883. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -0
  884. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -0
  885. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -0
  886. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -0
  887. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -0
  888. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -0
  889. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +409 -0
  890. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -0
  891. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -0
  892. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +320 -0
  893. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -0
  894. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -0
  895. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -0
  896. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -0
  897. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -0
  898. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -0
  899. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -0
  900. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -0
  901. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -0
  902. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -0
  903. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -0
  904. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -0
  905. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -0
  906. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -0
  907. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +95 -0
  908. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -0
  909. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +66 -0
  910. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -0
  911. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -0
  912. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -0
  913. data/lib/cosmos/tools/tlm_viewer/screen.rb +458 -0
  914. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +544 -0
  915. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -0
  916. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -0
  917. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -0
  918. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -0
  919. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -0
  920. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -0
  921. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -0
  922. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -0
  923. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -0
  924. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -0
  925. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -0
  926. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -0
  927. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -0
  928. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -0
  929. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -0
  930. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -0
  931. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -0
  932. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -0
  933. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -0
  934. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -0
  935. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -0
  936. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -0
  937. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -0
  938. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -0
  939. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -0
  940. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -0
  941. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -0
  942. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -0
  943. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -0
  944. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -0
  945. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -0
  946. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -0
  947. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -0
  948. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -0
  949. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -0
  950. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -0
  951. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -0
  952. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -0
  953. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -0
  954. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -0
  955. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -0
  956. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -0
  957. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -0
  958. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -0
  959. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -0
  960. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -0
  961. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -0
  962. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -0
  963. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -0
  964. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -0
  965. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -0
  966. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -0
  967. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -0
  968. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -0
  969. data/lib/cosmos/top_level.rb +596 -0
  970. data/lib/cosmos/utilities/crc.rb +166 -0
  971. data/lib/cosmos/utilities/csv.rb +83 -0
  972. data/lib/cosmos/utilities/logger.rb +137 -0
  973. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -0
  974. data/lib/cosmos/utilities/message_log.rb +74 -0
  975. data/lib/cosmos/utilities/quaternion.rb +258 -0
  976. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -0
  977. data/lib/cosmos/utilities/simulated_target.rb +99 -0
  978. data/lib/cosmos/utilities.rb +10 -0
  979. data/lib/cosmos/version.rb +12 -0
  980. data/lib/cosmos/win32/excel.rb +66 -0
  981. data/lib/cosmos/win32/win32.rb +387 -0
  982. data/lib/cosmos/win32/win32_main.rb +311 -0
  983. data/lib/cosmos.rb +63 -0
  984. data/roodi.yml +24 -0
  985. data/run_gui_tests.bat +32 -0
  986. data/spec/ccsds/ccsds_packet_spec.rb +67 -0
  987. data/spec/ccsds/ccsds_parser_spec.rb +148 -0
  988. data/spec/config/config_parser_spec.rb +322 -0
  989. data/spec/conversions/conversion_spec.rb +31 -0
  990. data/spec/conversions/generic_conversion_spec.rb +45 -0
  991. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -0
  992. data/spec/conversions/polynomial_conversion_spec.rb +40 -0
  993. data/spec/conversions/processor_conversion_spec.rb +45 -0
  994. data/spec/conversions/received_count_conversion_spec.rb +43 -0
  995. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -0
  996. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -0
  997. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -0
  998. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -0
  999. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -0
  1000. data/spec/core_ext/array_spec.rb +186 -0
  1001. data/spec/core_ext/class_spec.rb +36 -0
  1002. data/spec/core_ext/cosmos_io_spec.rb +77 -0
  1003. data/spec/core_ext/exception_spec.rb +91 -0
  1004. data/spec/core_ext/file_spec.rb +72 -0
  1005. data/spec/core_ext/hash_spec.rb +24 -0
  1006. data/spec/core_ext/io_spec.rb +46 -0
  1007. data/spec/core_ext/kernel_spec.rb +54 -0
  1008. data/spec/core_ext/math_spec.rb +116 -0
  1009. data/spec/core_ext/matrix_spec.rb +66 -0
  1010. data/spec/core_ext/objectspace_spec.rb +29 -0
  1011. data/spec/core_ext/range_spec.rb +21 -0
  1012. data/spec/core_ext/socket_spec.rb +32 -0
  1013. data/spec/core_ext/string_spec.rb +223 -0
  1014. data/spec/core_ext/stringio_spec.rb +21 -0
  1015. data/spec/core_ext/time_spec.rb +151 -0
  1016. data/spec/gui/line_graph/line_clip_spec.rb +322 -0
  1017. data/spec/install/config/system/system.txt +33 -0
  1018. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -0
  1019. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -0
  1020. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -0
  1021. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -0
  1022. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -0
  1023. data/spec/install/config/targets/COSMOS/target.txt +5 -0
  1024. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -0
  1025. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -0
  1026. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -0
  1027. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -0
  1028. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -0
  1029. data/spec/install/config/targets/INST/lib/sim_inst.rb +294 -0
  1030. data/spec/install/config/targets/INST/target.txt +10 -0
  1031. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -0
  1032. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -0
  1033. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -0
  1034. data/spec/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +1 -0
  1035. data/spec/install/lib/README.txt +1 -0
  1036. data/spec/install/userpath.txt +1 -0
  1037. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -0
  1038. data/spec/interfaces/interface_spec.rb +128 -0
  1039. data/spec/interfaces/linc_interface_spec.rb +199 -0
  1040. data/spec/interfaces/serial_interface_spec.rb +56 -0
  1041. data/spec/interfaces/simulated_target_interface_spec.rb +128 -0
  1042. data/spec/interfaces/stream_interface_spec.rb +157 -0
  1043. data/spec/interfaces/tcpip_client_interface_spec.rb +54 -0
  1044. data/spec/interfaces/tcpip_server_interface_spec.rb +151 -0
  1045. data/spec/interfaces/udp_interface_spec.rb +175 -0
  1046. data/spec/io/buffered_file_spec.rb +113 -0
  1047. data/spec/io/io_multiplexer_spec.rb +94 -0
  1048. data/spec/io/json_drb_object_spec.rb +93 -0
  1049. data/spec/io/json_drb_spec.rb +293 -0
  1050. data/spec/io/json_rpc_spec.rb +264 -0
  1051. data/spec/io/raw_logger_pair_spec.rb +76 -0
  1052. data/spec/io/raw_logger_spec.rb +133 -0
  1053. data/spec/io/serial_driver_spec.rb +61 -0
  1054. data/spec/io/stderr_spec.rb +32 -0
  1055. data/spec/io/stdout_spec.rb +32 -0
  1056. data/spec/io/tcpip_server_spec.rb +322 -0
  1057. data/spec/io/udp_sockets_spec.rb +94 -0
  1058. data/spec/io/win32_serial_driver_spec.rb +88 -0
  1059. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -0
  1060. data/spec/packet_logs/packet_log_reader_spec.rb +408 -0
  1061. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -0
  1062. data/spec/packet_logs/packet_log_writer_spec.rb +209 -0
  1063. data/spec/packets/binary_accessor_spec.rb +2073 -0
  1064. data/spec/packets/commands_spec.rb +369 -0
  1065. data/spec/packets/limits_response_spec.rb +25 -0
  1066. data/spec/packets/limits_spec.rb +326 -0
  1067. data/spec/packets/packet_config_spec.rb +1620 -0
  1068. data/spec/packets/packet_item_limits_spec.rb +161 -0
  1069. data/spec/packets/packet_item_spec.rb +386 -0
  1070. data/spec/packets/packet_spec.rb +949 -0
  1071. data/spec/packets/structure_item_spec.rb +195 -0
  1072. data/spec/packets/structure_spec.rb +419 -0
  1073. data/spec/packets/telemetry_spec.rb +535 -0
  1074. data/spec/processors/new_packet_log_processor_spec.rb +39 -0
  1075. data/spec/processors/processor_spec.rb +55 -0
  1076. data/spec/processors/statistics_processor_spec.rb +60 -0
  1077. data/spec/processors/watermark_processor_spec.rb +51 -0
  1078. data/spec/script/script_spec.rb +650 -0
  1079. data/spec/spec_helper.rb +138 -0
  1080. data/spec/streams/burst_stream_protocol_spec.rb +32 -0
  1081. data/spec/streams/fixed_stream_protocol_spec.rb +110 -0
  1082. data/spec/streams/length_stream_protocol_spec.rb +297 -0
  1083. data/spec/streams/preidentified_stream_protocol_spec.rb +118 -0
  1084. data/spec/streams/serial_stream_spec.rb +105 -0
  1085. data/spec/streams/stream_protocol_spec.rb +332 -0
  1086. data/spec/streams/stream_spec.rb +29 -0
  1087. data/spec/streams/tcpip_client_stream_spec.rb +54 -0
  1088. data/spec/streams/tcpip_socket_stream_spec.rb +146 -0
  1089. data/spec/streams/template_stream_protocol_spec.rb +151 -0
  1090. data/spec/streams/terminated_stream_protocol_spec.rb +123 -0
  1091. data/spec/system/system_spec.rb +645 -0
  1092. data/spec/system/target_spec.rb +248 -0
  1093. data/spec/tools/cmd_tlm_server/api_spec.rb +1090 -0
  1094. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -0
  1095. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +82 -0
  1096. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +406 -0
  1097. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +418 -0
  1098. data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -0
  1099. data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -0
  1100. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +317 -0
  1101. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +228 -0
  1102. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -0
  1103. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +104 -0
  1104. data/spec/tools/cmd_tlm_server/routers_spec.rb +196 -0
  1105. data/spec/top_level/top_level_spec.rb +320 -0
  1106. data/spec/utilities/crc_spec.rb +45 -0
  1107. data/spec/utilities/csv_spec.rb +97 -0
  1108. data/spec/utilities/logger_spec.rb +102 -0
  1109. data/spec/utilities/message_log_spec.rb +89 -0
  1110. data/spec/utilities/quaternion_spec.rb +107 -0
  1111. data/spec/utilities/ruby_lex_utils_spec.rb +86 -0
  1112. data/tasks/manifest.rake +22 -0
  1113. data/tasks/spec.rake +23 -0
  1114. metadata +1566 -0
@@ -0,0 +1,1859 @@
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
+ require 'cosmos/script'
13
+ require 'cosmos/gui/utilities/script_module_gui'
14
+ require 'cosmos/gui/dialogs/splash'
15
+ require 'cosmos/gui/dialogs/exception_dialog'
16
+ require 'cosmos/gui/text/completion'
17
+ require 'cosmos/gui/text/completion_line_edit'
18
+ require 'cosmos/gui/text/ruby_editor'
19
+ require 'cosmos/gui/dialogs/progress_dialog'
20
+ require 'cosmos/gui/widgets/realtime_button_bar'
21
+ require 'cosmos/gui/dialogs/find_replace_dialog'
22
+ require 'cosmos/gui/choosers/file_chooser'
23
+ require 'cosmos/io/stdout'
24
+ require 'cosmos/io/stderr'
25
+
26
+ module Cosmos
27
+
28
+ class ScriptRunnerDialog < Qt::Dialog
29
+ attr_reader :script_runner_frame
30
+
31
+ # Constructor
32
+ def initialize(parent,
33
+ title,
34
+ default_tab_text = 'Untitled')
35
+ # Call base class constructor
36
+ super(parent)
37
+ setWindowTitle(title)
38
+ setMinimumWidth(parent.width * 0.8)
39
+ setMinimumHeight(parent.height * 0.6)
40
+
41
+ # Create script runner frame
42
+ @script_runner_frame = ScriptRunnerFrame.new(self, default_tab_text)
43
+ layout = Qt::VBoxLayout.new
44
+ layout.addWidget(@script_runner_frame)
45
+ setLayout(layout)
46
+ end # def initialize
47
+
48
+ # Executes the given text and closes when complete
49
+ def execute_text_and_close_on_complete(text, text_binding = nil)
50
+ @script_runner_frame.set_text(text)
51
+ @script_runner_frame.run_and_close_on_complete(text_binding)
52
+ exec
53
+ dispose
54
+ end
55
+
56
+ def reject
57
+ # Don't allow the dialog to close if we're running
58
+ return if @script_runner_frame.running?
59
+ super
60
+ end
61
+ end # class ScriptRunnerDialog
62
+
63
+ class ScriptRunnerFrame < Qt::Widget
64
+ slots 'context_menu(const QPoint&)'
65
+ slots 'undo_available(bool)'
66
+ slots 'breakpoint_set(int)'
67
+ slots 'breakpoint_cleared(int)'
68
+ slots 'breakpoints_cleared()'
69
+ signals 'undoAvailable(bool)'
70
+ signals 'modificationChanged(bool)'
71
+
72
+ CMD_KEYWORDS = %w(cmd cmd_no_range_check cmd_no_hazardous_check cmd_no_checks)
73
+ TLM_KEYWORDS = %w(tlm tlm_raw tlm_formatted tlm_with_units limits_enabled? \
74
+ enable_limits disable_limits wait_tolerance wait_tolerance_raw \
75
+ check_tolerance check_tolerance_raw wait_check_tolerance \
76
+ wait_check_tolerance_raw)
77
+ SET_TLM_KEYWORDS = %w(set_tlm set_tlm_raw)
78
+ CHECK_KEYWORDS = %w(check check_raw wait wait_raw wait_check wait_check_raw)
79
+
80
+ attr_accessor :use_instrumentation
81
+ attr_accessor :change_callback
82
+ attr_accessor :run_callback
83
+ attr_accessor :stop_callback
84
+ attr_accessor :error_callback
85
+ attr_accessor :pause_callback
86
+ attr_reader :filename
87
+ attr_accessor :continue_after_error
88
+ attr_accessor :exceptions
89
+ attr_accessor :script_binding
90
+ attr_accessor :inline_return
91
+ attr_accessor :inline_return_params
92
+ attr_reader :message_log
93
+ attr_reader :script_class
94
+ attr_reader :top_level_instrumented_cache
95
+
96
+ @@instance = nil
97
+ @@run_thread = nil
98
+ @@breakpoints = {}
99
+ @@step_mode = false
100
+ @@line_delay = 0.1
101
+ @@instrumented_cache = {}
102
+ @@file_cache = {}
103
+ @@output_thread = nil
104
+ @@limits_monitor_thread = nil
105
+ @@pause_on_error = true
106
+ @@monitor_limits = false
107
+ @@pause_on_red = false
108
+ @@show_backtrace = false
109
+ @@error = nil
110
+
111
+ def initialize(parent, default_tab_text = 'Untitled')
112
+ super(parent)
113
+ @default_tab_text = ' ' + default_tab_text + ' '
114
+ # Keep track of whether this frame has been fully initialized
115
+ @initialized = false
116
+ @debug_frame = nil
117
+
118
+ @layout = Qt::VBoxLayout.new
119
+ @layout.setContentsMargins(0,0,0,0)
120
+
121
+ # Add Realtime Button Bar
122
+ @realtime_button_bar = RealtimeButtonBar.new(self)
123
+ @realtime_button_bar.state = 'Stopped'
124
+ @realtime_button_bar.start_callback = method(:handle_start_go_button)
125
+ @realtime_button_bar.pause_callback = method(:handle_pause_retry_button)
126
+ @realtime_button_bar.stop_callback = method(:handle_stop_button)
127
+ @layout.addWidget(@realtime_button_bar)
128
+
129
+ # Create a splitter to hold the script text area and the script output text area.
130
+ @splitter = Qt::Splitter.new(Qt::Vertical, self)
131
+ @layout.addWidget(@splitter)
132
+ @top_widget = Qt::Widget.new(@splitter)
133
+ @top_widget.setContentsMargins(0,0,0,0)
134
+ @top_frame = Qt::VBoxLayout.new(@top_widget)
135
+ @top_frame.setContentsMargins(0,0,0,0)
136
+
137
+ # Add Initial Text Window
138
+ @script = create_ruby_editor()
139
+ @script.connect(SIGNAL('modificationChanged(bool)')) do |changed|
140
+ emit modificationChanged(changed)
141
+ end
142
+ @top_frame.addWidget(@script)
143
+
144
+ # Set self as the gui window to allow prompts and other popups to appear
145
+ set_cmd_tlm_gui_window(self)
146
+
147
+ # Add change handlers
148
+ connect(@script,
149
+ SIGNAL('undoAvailable(bool)'),
150
+ self,
151
+ SLOT('undo_available(bool)'))
152
+
153
+ # Add Output Text
154
+ @bottom_frame = Qt::Widget.new
155
+ @bottom_layout = Qt::VBoxLayout.new
156
+ @bottom_layout.setContentsMargins(0,0,0,0)
157
+ @bottom_layout_label = Qt::Label.new("Script Output:")
158
+ @bottom_layout.addWidget(@bottom_layout_label)
159
+ @output = Qt::PlainTextEdit.new
160
+ @output.setReadOnly(true)
161
+ @output.setMaximumBlockCount(10000) # 10000 lines of history will be displayed
162
+ @bottom_layout.addWidget(@output)
163
+ @bottom_frame.setLayout(@bottom_layout)
164
+ @splitter.addWidget(@bottom_frame)
165
+ @splitter.setStretchFactor(0,10)
166
+ @splitter.setStretchFactor(1,1)
167
+
168
+ setLayout(@layout)
169
+
170
+ # Configure Variables
171
+ @line_offset = 0
172
+ @filename = ''
173
+ @output_io = StringIO.new('', 'r+')
174
+ @output_io_mutex = Mutex.new
175
+ @change_callback = nil
176
+ @run_callback = nil
177
+ @stop_callback = nil
178
+ @error_callback = nil
179
+ @pause_callback = nil
180
+ @key_press_callback = nil
181
+ @allow_start = true
182
+ @continue_after_error = true
183
+ @debug_text = nil
184
+ @debug_history = []
185
+ @debug_code_completion = nil
186
+ @top_level_instrumented_cache = nil
187
+ @output_time = Time.now
188
+ initialize_variables()
189
+
190
+ # Redirect $stdout and $stderr
191
+ redirect_io()
192
+
193
+ # Create Tabbook
194
+ @tab_book = Qt::TabWidget.new
195
+ @tab_book_shown = false
196
+
197
+ @find_dialog = nil
198
+ @replace_dialog = nil
199
+
200
+ mark_breakpoints('')
201
+ end
202
+
203
+ def current_tab_filename
204
+ if @tab_book_shown
205
+ filename = @tab_book.tabText(@tab_book.currentIndex)
206
+ if filename == @default_tab_text
207
+ return ''
208
+ else
209
+ return filename.strip
210
+ end
211
+ else
212
+ return @filename
213
+ end
214
+ end
215
+
216
+ def create_ruby_editor
217
+ # Add Initial Text Window
218
+ script = RubyEditor.new(self)
219
+ script.enable_breakpoints = true if @debug_frame
220
+ connect(script,
221
+ SIGNAL('breakpoint_set(int)'),
222
+ self,
223
+ SLOT('breakpoint_set(int)'))
224
+ connect(script,
225
+ SIGNAL('breakpoint_cleared(int)'),
226
+ self,
227
+ SLOT('breakpoint_cleared(int)'))
228
+ connect(script,
229
+ SIGNAL('breakpoints_cleared()'),
230
+ self,
231
+ SLOT('breakpoints_cleared()'))
232
+
233
+ # Add right click menu
234
+ script.setContextMenuPolicy(Qt::CustomContextMenu)
235
+ connect(script,
236
+ SIGNAL('customContextMenuRequested(const QPoint&)'),
237
+ self,
238
+ SLOT('context_menu(const QPoint&)'))
239
+
240
+ return script
241
+ end
242
+
243
+ def stop_message_log
244
+ @message_log.stop if @message_log
245
+ @message_log = nil
246
+ end
247
+
248
+ def filename=(filename)
249
+ # Stop the message log so a new one will be created with the new filename
250
+ stop_message_log()
251
+ @filename = filename
252
+ mark_breakpoints(filename)
253
+ end
254
+
255
+ def modified
256
+ @script.document.isModified()
257
+ end
258
+
259
+ def modified=(bool)
260
+ @script.document.setModified(bool)
261
+ end
262
+
263
+ def undo_available(bool)
264
+ emit undoAvailable(bool)
265
+ end
266
+
267
+ def key_press_callback=(callback)
268
+ @script.keyPressCallback = callback
269
+ end
270
+
271
+ def setFocus
272
+ @script.setFocus
273
+ end
274
+
275
+ def allow_start=(value)
276
+ @allow_start = value
277
+ if @allow_start
278
+ @realtime_button_bar.start_button.setEnabled(true)
279
+ elsif not running?
280
+ @realtime_button_bar.start_button.setEnabled(false)
281
+ @script.setReadOnly(true)
282
+ end
283
+ end
284
+
285
+ def clear
286
+ self.set_text('')
287
+ self.filename = ''
288
+ self.modified = false
289
+ end
290
+
291
+ def self.instance
292
+ @@instance
293
+ end
294
+
295
+ def self.instance=(value)
296
+ @@instance = value
297
+ end
298
+
299
+ def self.step_mode
300
+ @@step_mode
301
+ end
302
+
303
+ def self.step_mode=(value)
304
+ @@step_mode = value
305
+ if self.instance
306
+ if value
307
+ self.instance.pause
308
+ else
309
+ self.instance.go
310
+ end
311
+ end
312
+ end
313
+
314
+ def self.line_delay
315
+ @@line_delay
316
+ end
317
+
318
+ def self.line_delay=(value)
319
+ @@line_delay = value
320
+ end
321
+
322
+ def self.instrumented_cache
323
+ @@instrumented_cache
324
+ end
325
+
326
+ def self.instrumented_cache=(value)
327
+ @@instrumented_cache = value
328
+ end
329
+
330
+ def self.pause_on_error
331
+ @@pause_on_error
332
+ end
333
+
334
+ def self.pause_on_error=(value)
335
+ @@pause_on_error = value
336
+ end
337
+
338
+ def self.monitor_limits
339
+ @@monitor_limits
340
+ end
341
+
342
+ def self.monitor_limits=(value)
343
+ @@monitor_limits = value
344
+ end
345
+
346
+ def self.pause_on_red
347
+ @@pause_on_red
348
+ end
349
+
350
+ def self.pause_on_red=(value)
351
+ @@pause_on_red = value
352
+ end
353
+
354
+ def self.show_backtrace
355
+ @@show_backtrace
356
+ end
357
+
358
+ def self.show_backtrace=(value)
359
+ @@show_backtrace = value
360
+ if @@show_backtrace and @@error
361
+ puts Time.now.formatted + " (SCRIPTRUNNER): " + "Most recent exception:\n" + @@error.formatted
362
+ end
363
+ end
364
+
365
+ def text
366
+ @script.toPlainText.gsub("\r", '')
367
+ end
368
+
369
+ def set_text(text, filename = '')
370
+ unless running?()
371
+ @script.setPlainText(text)
372
+ @script.stop_highlight
373
+ @filename = filename
374
+ mark_breakpoints(filename)
375
+ end
376
+ end
377
+
378
+ def set_text_from_file(filename)
379
+ unless running?()
380
+ @@file_cache[filename] = nil
381
+ load_file_into_script(filename)
382
+ @filename = filename
383
+ end
384
+ end
385
+
386
+ def self.running?
387
+ if @@run_thread then true else false end
388
+ end
389
+
390
+ def running?
391
+ if @@instance == self and ScriptRunnerFrame.running?() then true else false end
392
+ end
393
+
394
+ def go
395
+ @go = true
396
+ @pause = false unless @@step_mode
397
+ end
398
+
399
+ def go?
400
+ temp = @go
401
+ @go = false
402
+ temp
403
+ end
404
+
405
+ def pause
406
+ @pause = true
407
+ @go = false
408
+ end
409
+
410
+ def pause?
411
+ @pause
412
+ end
413
+
414
+ def self.stop!
415
+ if @@run_thread
416
+ @@run_thread.kill
417
+ @@run_thread = nil
418
+ end
419
+ end
420
+
421
+ def stop?
422
+ @stop
423
+ end
424
+
425
+ def retry_needed?
426
+ @retry_needed
427
+ end
428
+
429
+ def retry_needed
430
+ @retry_needed = true
431
+ end
432
+
433
+ def disable_retry
434
+ @realtime_button_bar.start_button.setText('Skip')
435
+ @realtime_button_bar.pause_button.setDisabled(true)
436
+ end
437
+
438
+ def enable_retry
439
+ @realtime_button_bar.start_button.setText('Go')
440
+ @realtime_button_bar.pause_button.setDisabled(false)
441
+ end
442
+
443
+ def run
444
+ unless self.class.running?()
445
+ run_text(@script.toPlainText)
446
+ end
447
+ end
448
+
449
+ def run_and_close_on_complete(text_binding = nil)
450
+ run_text(@script.toPlainText, 0, text_binding, true)
451
+ end
452
+
453
+ def self.instrument_script(text, filename, mark_private = false)
454
+ if filename and !filename.empty?
455
+ @@file_cache[filename] = text.clone
456
+ end
457
+
458
+ ruby_lex_utils = RubyLexUtils.new
459
+ instrumented_text = ''
460
+ # Add an extra newline because the Ruby 1.9.1 lexer RubyLex has a bug
461
+ # where it loops unless the file ends in a newline. If there is already
462
+ # a newline then so what, we add an extra.
463
+ text += "\n"
464
+
465
+ Qt.execute_in_main_thread(true) do
466
+ window = Qt::CoreApplication.instance.activeWindow
467
+ ProgressDialog.execute(window, # parent
468
+ "Instrumenting: #{File.basename(filename.to_s)}",
469
+ 500, # width
470
+ 100, # height
471
+ true, # show overall progress
472
+ false, # don't show step progress
473
+ false, # don't show text
474
+ false, # don't show done
475
+ true) do |progress_dialog| # show cancel
476
+ progress_dialog.enable_cancel_button
477
+ comments_removed_text = ruby_lex_utils.remove_comments(text)
478
+ num_lines = comments_removed_text.num_lines.to_f
479
+ num_lines = 1 if num_lines < 1
480
+ instrumented_text =
481
+ instrument_script_implementation(ruby_lex_utils,
482
+ comments_removed_text,
483
+ num_lines,
484
+ progress_dialog,
485
+ filename,
486
+ mark_private)
487
+ progress_dialog.close_done
488
+ end
489
+ end
490
+
491
+ Kernel.raise StopScript if ProgressDialog.canceled?
492
+ instrumented_text
493
+ end
494
+
495
+ def self.instrument_script_implementation(ruby_lex_utils,
496
+ comments_removed_text,
497
+ num_lines,
498
+ progress_dialog,
499
+ filename,
500
+ mark_private = false)
501
+ if mark_private
502
+ instrumented_text = 'private; '
503
+ else
504
+ instrumented_text = ''
505
+ end
506
+
507
+ ruby_lex_utils.each_lexed_segment(comments_removed_text) do |segment, instrumentable, inside_begin, line_no|
508
+ instrumented_line = ''
509
+ if instrumentable
510
+ # If not inside a begin block then create one to catch exceptions
511
+ unless inside_begin
512
+ instrumented_line << 'begin; '
513
+ end
514
+
515
+ # Add preline instrumentation
516
+ instrumented_line << "ScriptRunnerFrame.instance.script_binding = binding(); if ScriptRunnerFrame.instance.inline_return then ScriptRunnerFrame.instance.inline_return = nil; return ScriptRunnerFrame.instance.inline_return_params; end; ScriptRunnerFrame.instance.pre_line_instrumentation('#{filename}', #{line_no}); "
517
+
518
+ # Add the actual line
519
+ instrumented_line << segment
520
+ instrumented_line.chomp!
521
+
522
+ # Add postline instrumentation
523
+ instrumented_line << "; ScriptRunnerFrame.instance.post_line_instrumentation('#{filename}', #{line_no})"
524
+
525
+ # Complete begin block to catch exceptions
526
+ unless inside_begin
527
+ instrumented_line << "; rescue Exception => eval_error; retry if ScriptRunnerFrame.instance.exception_instrumentation(eval_error, '#{filename}', #{line_no}); end"
528
+ end
529
+
530
+ instrumented_line << "\n"
531
+ else
532
+ unless segment =~ /^\s*end\s*$/ or segment =~ /^\s*when .*$/
533
+ num_left_brackets = segment.count('{')
534
+ num_right_brackets = segment.count('}')
535
+ num_left_square_brackets = segment.count('[')
536
+ num_right_square_brackets = segment.count(']')
537
+
538
+ if (num_right_brackets > num_left_brackets) ||
539
+ (num_right_square_brackets > num_left_square_brackets)
540
+ instrumented_line = segment
541
+ else
542
+ instrumented_line = "ScriptRunnerFrame.instance.pre_line_instrumentation('#{filename}', #{line_no}); " + segment
543
+ end
544
+ else
545
+ instrumented_line = segment
546
+ end
547
+ end
548
+
549
+ instrumented_text << instrumented_line
550
+
551
+ progress_dialog.set_overall_progress(line_no / num_lines) if progress_dialog and line_no
552
+ end
553
+ instrumented_text
554
+ end
555
+
556
+ def pre_line_instrumentation(filename, line_number)
557
+ @current_filename = filename
558
+ @current_line_number = line_number
559
+ if @use_instrumentation
560
+ # Clear go
561
+ @go = false
562
+
563
+ # Handle stopping mid-script if necessary
564
+ Kernel.raise StopScript if @stop
565
+
566
+ # Handle needing to change tabs
567
+ handle_potential_tab_change(filename)
568
+
569
+ # Adjust line number for offset in main script
570
+ line_number = line_number + @line_offset if @active_script.object_id == @script.object_id
571
+ detail_string = nil
572
+ if filename
573
+ detail_string = File.basename(filename) << ':' << line_number.to_s
574
+ end
575
+ Logger.detail_string = detail_string
576
+
577
+ # Highlight the line that is about to run
578
+ Qt.execute_in_main_thread(true) {@active_script.highlight_line(line_number)}
579
+
580
+ # Handle pausing the script
581
+ handle_pause(filename, line_number)
582
+
583
+ # Handle delay between lines
584
+ handle_line_delay()
585
+ end
586
+ end
587
+
588
+ def post_line_instrumentation(filename, line_number)
589
+ if @use_instrumentation
590
+ line_number = line_number + @line_offset if @active_script.object_id == @script.object_id
591
+ handle_output_io(filename, line_number)
592
+ end
593
+ end
594
+
595
+ def exception_instrumentation(error, filename, line_number)
596
+ if error.class == StopScript || error.class == SkipTestCase || !@use_instrumentation
597
+ Kernel.raise error
598
+ else
599
+ line_number = line_number + @line_offset if @active_script.object_id == @script.object_id
600
+ handle_exception(error, false, filename, line_number)
601
+ end
602
+ end
603
+
604
+ def perform_pause
605
+ mark_paused()
606
+ wait_for_go_or_stop()
607
+ end
608
+
609
+ def perform_breakpoint(filename, line_number)
610
+ mark_breakpoint()
611
+ scriptrunner_puts "Hit Breakpoint at #{filename}:#{line_number}"
612
+ handle_output_io(filename, line_number)
613
+ wait_for_go_or_stop()
614
+ end
615
+
616
+ # Prompts the user that a script is running before they close the app
617
+ def prompt_if_running_on_close
618
+ safe_to_continue = true
619
+ if running?
620
+ case Qt::MessageBox.warning(
621
+ self, # parent
622
+ 'Warning', # title
623
+ 'A Script is Running! Close Anyways?', # text
624
+ Qt::MessageBox::Yes | Qt::MessageBox::No, # buttons
625
+ Qt::MessageBox::No) # default button
626
+ when Qt::MessageBox::Yes
627
+ safe_to_continue = true
628
+ ScriptRunnerFrame.stop!
629
+ else
630
+ safe_to_continue = false
631
+ end
632
+ end
633
+ return safe_to_continue
634
+ end
635
+
636
+ ######################################
637
+ # Implement the breakpoint callbacks from the RubyEditor
638
+ ######################################
639
+ def breakpoint_set(line)
640
+ ScriptRunnerFrame.breakpoint(current_tab_filename(), line)
641
+ end
642
+
643
+ def breakpoint_cleared(line)
644
+ ScriptRunnerFrame.clear_breakpoint(current_tab_filename(), line)
645
+ end
646
+
647
+ def breakpoints_cleared
648
+ ScriptRunnerFrame.clear_breakpoints(current_tab_filename())
649
+ end
650
+
651
+ ######################################
652
+ # Implement edit functionality in the frame (cut, copy, paste, etc)
653
+ ######################################
654
+ def undo
655
+ @script.undo unless running?()
656
+ end
657
+
658
+ def redo
659
+ @script.redo unless running?()
660
+ end
661
+
662
+ def cut
663
+ @script.cut unless running?()
664
+ end
665
+
666
+ def copy
667
+ @script.copy unless running?()
668
+ end
669
+
670
+ def paste
671
+ @script.paste unless running?()
672
+ end
673
+
674
+ def select_all
675
+ @script.select_all unless running?()
676
+ end
677
+
678
+ def comment_or_uncomment_lines
679
+ @script.comment_or_uncomment_lines unless running?()
680
+ end
681
+
682
+ ##################################################################
683
+ # Implement Search functionality in the frame (find, replace, etc)
684
+ ##################################################################
685
+ def find
686
+ unless @find_dialog
687
+ @find_dialog = FindReplaceDialog.new(@script)
688
+ @find_dialog.connect(SIGNAL('find_next()')) { dialog_find(@find_dialog) }
689
+ end
690
+ @find_dialog.show
691
+ @find_dialog.raise
692
+ @find_dialog.activateWindow
693
+ end
694
+
695
+ def find_next
696
+ flags = FindReplaceDialog.find_flags
697
+ flags &= ~Qt::TextDocument::FindBackward.to_i
698
+ found = @script.find(FindReplaceDialog.find_text, flags)
699
+ if not found and FindReplaceDialog.wrap_around?
700
+ cursor = @script.textCursor
701
+ cursor.movePosition(Qt::TextCursor::Start)
702
+ @script.setTextCursor(cursor)
703
+ @script.find(FindReplaceDialog.find_text, flags)
704
+ end
705
+ end
706
+
707
+ def find_previous
708
+ flags = FindReplaceDialog.find_flags
709
+ flags |= Qt::TextDocument::FindBackward.to_i
710
+ found = @script.find(FindReplaceDialog.find_text, flags)
711
+ if not found and FindReplaceDialog.wrap_around?
712
+ cursor = @script.textCursor
713
+ cursor.movePosition(Qt::TextCursor::End)
714
+ @script.setTextCursor(cursor)
715
+ @script.find(FindReplaceDialog.find_text, flags)
716
+ end
717
+ end
718
+
719
+ def replace
720
+ unless @replace_dialog
721
+ @replace_dialog = FindReplaceDialog.new(@script, true)
722
+ @replace_dialog.connect(SIGNAL('find_next()')) { dialog_find(@replace_dialog) }
723
+ @replace_dialog.connect(SIGNAL('replace()')) { dialog_replace(@replace_dialog) }
724
+ @replace_dialog.connect(SIGNAL('replace_all()')) { dialog_replace_all(@replace_dialog) }
725
+ end
726
+ @replace_dialog.show
727
+ @replace_dialog.raise
728
+ @replace_dialog.activateWindow
729
+ end
730
+
731
+ def dialog_find(dialog)
732
+ found = @script.find(dialog.find_text, dialog.find_flags)
733
+ if not found and dialog.wrap_around?
734
+ cursor = @script.textCursor
735
+ if dialog.find_up?
736
+ cursor.movePosition(Qt::TextCursor::End)
737
+ else
738
+ cursor.movePosition(Qt::TextCursor::Start)
739
+ end
740
+ @script.setTextCursor(cursor)
741
+ @script.find(dialog.find_text, dialog.find_flags)
742
+ end
743
+ end
744
+
745
+ def dialog_replace(dialog)
746
+ if @script.textCursor.hasSelection &&
747
+ @script.textCursor.selectedText == dialog.find_text
748
+ found = true
749
+ else
750
+ found = @script.find(dialog.find_text, dialog.find_flags)
751
+ if not found and dialog.wrap_around?
752
+ cursor = @script.textCursor
753
+ if dialog.find_up?
754
+ cursor.movePosition(Qt::TextCursor::End)
755
+ else
756
+ cursor.movePosition(Qt::TextCursor::Start)
757
+ end
758
+ @script.setTextCursor(cursor)
759
+ found = @script.find(dialog.find_text, dialog.find_flags)
760
+ end
761
+ end
762
+ if found
763
+ @script.textCursor.removeSelectedText
764
+ @script.textCursor.insertText(dialog.replace_text)
765
+ cursor = @script.textCursor
766
+ cursor.setPosition(cursor.position-1)
767
+ cursor.select(Qt::TextCursor::WordUnderCursor)
768
+ @script.setTextCursor(cursor)
769
+ end
770
+ end
771
+
772
+ def dialog_replace_all(dialog)
773
+ cursor = @script.textCursor
774
+ cursor.movePosition(Qt::TextCursor::Start)
775
+ @script.setTextCursor(cursor)
776
+
777
+ while (@script.find(dialog.find_text, dialog.find_flags) == true)
778
+ @script.textCursor.removeSelectedText
779
+ @script.textCursor.insertText(dialog.replace_text)
780
+ end
781
+ end
782
+
783
+ ##################################################################################
784
+ # Implement Script functionality in the frame (run selection, run from cursor, etc
785
+ ##################################################################################
786
+ def run_selection
787
+ unless self.class.running?()
788
+ selection = @script.selected_lines
789
+ if selection
790
+ start_line_number = @script.selection_start_line
791
+ end_line_number = @script.selection_end_line
792
+ scriptrunner_puts "Running script lines #{start_line_number+1}-#{end_line_number+1}: #{File.basename(@filename)}"
793
+ handle_output_io()
794
+ run_text(selection, start_line_number)
795
+ end
796
+ end
797
+ end
798
+
799
+ def run_selection_while_paused
800
+ current_script = @tab_book.tab(@tab_book.currentIndex)
801
+ selection = current_script.selected_lines
802
+ if selection
803
+ start_line_number = current_script.selection_start_line
804
+ end_line_number = current_script.selection_end_line
805
+ scriptrunner_puts "Debug: Running selected lines #{start_line_number+1}-#{end_line_number+1}: #{@tab_book.tabText(@tab_book.currentIndex)}"
806
+ handle_output_io()
807
+ dialog = ScriptRunnerDialog.new(self, 'Executing Selected Lines While Paused')
808
+ dialog.execute_text_and_close_on_complete(selection, @script_binding)
809
+ handle_output_io()
810
+ end
811
+ end
812
+
813
+ def run_from_cursor
814
+ unless self.class.running?()
815
+ line_number = @script.selection_start_line
816
+ text = @script.toPlainText.split("\n")[line_number..-1].join("\n")
817
+ scriptrunner_puts "Running script from line #{line_number}: #{File.basename(@filename)}"
818
+ handle_output_io()
819
+ run_text(text, line_number)
820
+ end
821
+ end
822
+
823
+ def ruby_syntax_check_selection
824
+ unless self.class.running?()
825
+ selection = @script.selected_lines
826
+ ruby_syntax_check_text(selection) if selection
827
+ end
828
+ end
829
+
830
+ def ruby_syntax_check_text(text)
831
+ unless self.class.running?()
832
+ check_process = IO.popen("ruby -c -rubygems 2>&1", 'r+')
833
+ check_process.write("require 'cosmos'; require 'cosmos/script'; " + text)
834
+ check_process.close_write
835
+ results = check_process.gets
836
+ check_process.close
837
+ if results
838
+ if results =~ /Syntax OK/
839
+ Qt::MessageBox.information(self, 'Syntax Check Successful', results)
840
+ else
841
+ # Results is a string like this: ":2: syntax error ..."
842
+ # Normally the procedure comes before the first colon but since we
843
+ # are writing to the process this is blank so we throw it away
844
+ _, line_no, error = results.split(':')
845
+ Qt::MessageBox.warning(self,
846
+ 'Syntax Check Failed',
847
+ "Error on line #{line_no}: #{error.strip}")
848
+ end
849
+ else
850
+ Qt::MessageBox.critical(self,
851
+ 'Syntax Check Exception',
852
+ 'Ruby syntax check unexpectedly returned nil')
853
+ end
854
+ end
855
+ end
856
+
857
+ def mnemonic_check_selection
858
+ unless self.class.running?()
859
+ selection = @script.selected_lines
860
+ mnemonic_check_text(selection, @script.selection_start_line+1) if selection
861
+ end
862
+ end
863
+
864
+ def mnemonic_check_text(text, start_line_number = 1)
865
+ results = []
866
+ line_number = start_line_number
867
+ text.each_line do |line|
868
+ if line =~ /\(/
869
+ result = nil
870
+ keyword = line.split('(')[0].split[-1]
871
+ if CMD_KEYWORDS.include? keyword
872
+ result = mnemonic_check_cmd_line(keyword, line_number, line)
873
+ elsif TLM_KEYWORDS.include? keyword
874
+ result = mnemonic_check_tlm_line(keyword, line_number, line)
875
+ elsif SET_TLM_KEYWORDS.include? keyword
876
+ result = mnemonic_check_set_tlm_line(keyword, line_number, line)
877
+ elsif CHECK_KEYWORDS.include? keyword
878
+ result = mnemonic_check_check_line(keyword, line_number, line)
879
+ end
880
+ results << result if result
881
+ end
882
+ line_number += 1
883
+ end
884
+
885
+ if results.empty?
886
+ Qt::MessageBox.information(self,
887
+ 'Mnemonic Check Successful',
888
+ 'Mnemonic Check Found No Errors')
889
+ else
890
+ dialog = Qt::Dialog.new(self) do |box|
891
+ box.setWindowTitle('Mnemonic Check Failed')
892
+ text = Qt::PlainTextEdit.new
893
+ text.setReadOnly(true)
894
+ text.setPlainText(results.join("\n"))
895
+ frame = Qt::VBoxLayout.new(box)
896
+ ok = Qt::PushButton.new('Ok')
897
+ ok.setDefault(true)
898
+ ok.connect(SIGNAL('clicked(bool)')) { box.accept }
899
+ frame.addWidget(text)
900
+ frame.addWidget(ok)
901
+ end
902
+ dialog.exec
903
+ dialog.dispose
904
+ end
905
+ end
906
+
907
+ ######################################################
908
+ # Implement the debug capability
909
+ ######################################################
910
+ def toggle_debug(debug = nil)
911
+ if debug.nil?
912
+ if @debug_frame
913
+ hide_debug()
914
+ else
915
+ show_debug()
916
+ end
917
+ else
918
+ if debug
919
+ if !@debug_frame
920
+ show_debug()
921
+ end
922
+ else
923
+ if @debug_frame
924
+ hide_debug()
925
+ end
926
+ end
927
+ end
928
+ end
929
+
930
+ def show_debug
931
+ unless @debug_frame
932
+ @script.enable_breakpoints = true
933
+ if @tab_book_shown
934
+ if @tab_book.count > 0
935
+ (0..(@tab_book.count - 1)).each do |index|
936
+ @tab_book.tab(index).enable_breakpoints = true
937
+ end
938
+ end
939
+ end
940
+
941
+ @debug_frame = Qt::HBoxLayout.new
942
+ @debug_frame.setContentsMargins(0,0,0,0)
943
+ @debug_frame_label = Qt::Label.new("Debug:")
944
+ @debug_frame.addWidget(@debug_frame_label)
945
+ @debug_text = CompletionLineEdit.new(self)
946
+ @debug_text.setFocus(Qt::OtherFocusReason)
947
+ @debug_text.keyPressCallback = lambda { |event|
948
+ case event.key
949
+ when Qt::Key_Return, Qt::Key_Enter
950
+ begin
951
+ debug_text = @debug_text.toPlainText
952
+ @debug_history.unshift(debug_text)
953
+ @debug_history_index = 0
954
+ @debug_text.setPlainText('')
955
+ scriptrunner_puts "Debug: #{debug_text}"
956
+ handle_output_io()
957
+ if not running?
958
+ # Capture STDOUT and STDERR
959
+ $stdout.add_stream(@output_io)
960
+ $stderr.add_stream(@output_io)
961
+ end
962
+
963
+ if @script_binding
964
+ eval(debug_text, @script_binding, 'debug', 1)
965
+ else
966
+ Object.class_eval(debug_text, 'debug', 1)
967
+ end
968
+ handle_output_io()
969
+ rescue Exception => error
970
+ if error.class == DRb::DRbConnError
971
+ Logger.error("Error Connecting to Command and Telemetry Server")
972
+ else
973
+ Logger.error(error.class.to_s.split('::')[-1] + ' : ' + error.message)
974
+ end
975
+ handle_output_io()
976
+ ensure
977
+ if not running?
978
+ # Capture STDOUT and STDERR
979
+ $stdout.remove_stream(@output_io)
980
+ $stderr.remove_stream(@output_io)
981
+ end
982
+ end
983
+ when Qt::Key_Up
984
+ if @debug_history.length > 0
985
+ @debug_text.setPlainText(@debug_history[@debug_history_index])
986
+ @debug_history_index += 1
987
+ if @debug_history_index == @debug_history.length
988
+ @debug_history_index = @debug_history.length-1
989
+ end
990
+ end
991
+ when Qt::Key_Down
992
+ if @debug_history.length > 0
993
+ @debug_text.setPlainText(@debug_history[@debug_history_index])
994
+ @debug_history_index -= 1
995
+ @debug_history_index = 0 if @debug_history_index < 0
996
+ end
997
+ when Qt::Key_Escape
998
+ @debug_text.setPlainText("")
999
+ end
1000
+ }
1001
+
1002
+ @debug_frame.addWidget(@debug_text)
1003
+
1004
+ @toggle_button = Qt::PushButton.new('Toggle Run/Step')
1005
+ @debug_frame.addWidget(@toggle_button)
1006
+ @toggle_button.connect(SIGNAL('clicked(bool)')) do
1007
+ if @@step_mode
1008
+ scriptrunner_puts "Debug: run_mode"
1009
+ handle_output_io()
1010
+ self.class.step_mode = false
1011
+ else
1012
+ scriptrunner_puts "Debug: step_mode"
1013
+ handle_output_io()
1014
+ self.class.step_mode = true
1015
+ end
1016
+ end
1017
+
1018
+ @return_button = Qt::PushButton.new('Insert Return')
1019
+ @debug_frame.addWidget(@return_button)
1020
+ @return_button.connect(SIGNAL('clicked(bool)')) do
1021
+ scriptrunner_puts "Debug: insert_return(); ScriptRunnerFrame.instance.go()"
1022
+ handle_output_io()
1023
+ insert_return()
1024
+ go()
1025
+ end
1026
+
1027
+ @bottom_frame.layout.addLayout(@debug_frame)
1028
+ end
1029
+ end
1030
+
1031
+ def hide_debug
1032
+ # Since we're disabling debug, clear the breakpoints and disable them
1033
+ ScriptRunnerFrame.clear_breakpoints()
1034
+ @script.clear_breakpoints
1035
+ @script.enable_breakpoints = false
1036
+ if @tab_book_shown
1037
+ if @tab_book.count > 0
1038
+ (0..(@tab_book.count - 1)).each do |index|
1039
+ @tab_book.tab(index).enable_breakpoints = false
1040
+ end
1041
+ end
1042
+ end
1043
+ # Remove the debug frame
1044
+ @bottom_frame.layout.takeAt(@bottom_frame.layout.count - 1) if @debug_frame
1045
+ @debug_frame.removeAll
1046
+ @debug_frame.dispose
1047
+ @debug_frame = nil
1048
+ end
1049
+
1050
+ def self.breakpoint(filename, line_number)
1051
+ filename = File.basename(filename)
1052
+ @@breakpoints[filename] ||= {}
1053
+ @@breakpoints[filename][line_number] = true
1054
+ end
1055
+
1056
+ def self.clear_breakpoint(filename, line_number)
1057
+ filename = File.basename(filename)
1058
+ @@breakpoints[filename] ||= {}
1059
+ @@breakpoints[filename].delete(line_number) if @@breakpoints[filename][line_number]
1060
+ end
1061
+
1062
+ def self.clear_breakpoints(filename = nil)
1063
+ filename = File.basename(filename) unless filename.nil?
1064
+ if filename == nil or filename.empty?
1065
+ @@breakpoints = {}
1066
+ else
1067
+ @@breakpoints[filename] = {}
1068
+ end
1069
+ end
1070
+
1071
+ def select_tab_and_destroy_tabs_after_index(index)
1072
+ Qt.execute_in_main_thread(true) do
1073
+ if @tab_book_shown
1074
+ @tab_book.setCurrentIndex(index)
1075
+ @active_script = @tab_book.tab(@tab_book.currentIndex)
1076
+
1077
+ first_to_remove = index + 1
1078
+ last_to_remove = @call_stack.length - 1
1079
+
1080
+ last_to_remove.downto(first_to_remove) do |tab_index|
1081
+ tab = @tab_book.tab(tab_index)
1082
+ @tab_book.removeTab(tab_index)
1083
+ tab.dispose
1084
+ end
1085
+
1086
+ @call_stack = @call_stack[0..index]
1087
+ @current_file = @call_stack[index]
1088
+ end
1089
+ end
1090
+ end
1091
+
1092
+ def toggle_disconnect(config_file)
1093
+ if get_cmd_tlm_disconnect
1094
+ set_cmd_tlm_disconnect(false)
1095
+ self.parent.setPalette(Cosmos::DEFAULT_PALETTE)
1096
+ else
1097
+ dialog = Qt::Dialog.new(self, Qt::WindowTitleHint | Qt::WindowSystemMenuHint)
1098
+ dialog.setWindowTitle(tr("Server Config File"))
1099
+ dialog_layout = Qt::VBoxLayout.new
1100
+
1101
+ chooser = FileChooser.new(self, "Config File", config_file, 'Select',
1102
+ File.join('config', 'tools', 'cmd_tlm_server', config_file))
1103
+ chooser.callback = lambda do |filename|
1104
+ chooser.filename = File.basename(filename)
1105
+ end
1106
+ dialog_layout.addWidget(chooser)
1107
+
1108
+ button_layout = Qt::HBoxLayout.new
1109
+ ok = Qt::PushButton.new("Ok")
1110
+ ok.setDefault(true)
1111
+ ok.connect(SIGNAL('clicked()')) do
1112
+ dialog.accept()
1113
+ end
1114
+ button_layout.addWidget(ok)
1115
+ cancel = Qt::PushButton.new("Cancel")
1116
+ cancel.connect(SIGNAL('clicked()')) do
1117
+ dialog.reject()
1118
+ end
1119
+ button_layout.addWidget(cancel)
1120
+ dialog_layout.addLayout(button_layout)
1121
+
1122
+ dialog.setLayout(dialog_layout)
1123
+ if dialog.exec == Qt::Dialog::Accepted
1124
+ config_file = chooser.filename
1125
+ self.parent.setPalette(Cosmos::RED_PALETTE)
1126
+ Splash.execute(self) do |splash|
1127
+ ConfigParser.splash = splash
1128
+ splash.message = "Initializing Command and Telemetry Server"
1129
+ set_cmd_tlm_disconnect(true, config_file)
1130
+ ConfigParser.splash = nil
1131
+ end
1132
+ end
1133
+ dialog.dispose
1134
+ end
1135
+ config_file
1136
+ end
1137
+
1138
+ def current_backtrace
1139
+ trace = []
1140
+ Qt.execute_in_main_thread(true) do
1141
+ if @@run_thread
1142
+ temp_trace = @@run_thread.backtrace
1143
+ cosmos_lib = Regexp.new(File.join(Cosmos::PATH, 'lib'))
1144
+ temp_trace.each do |line|
1145
+ next if line =~ cosmos_lib
1146
+ trace << line
1147
+ end
1148
+ end
1149
+ end
1150
+ trace
1151
+ end
1152
+
1153
+ def scriptrunner_puts(string)
1154
+ puts Time.now.formatted + " (SCRIPTRUNNER): " + string
1155
+ end
1156
+
1157
+ def handle_output_io(filename = @current_filename, line_number = @current_line_number)
1158
+ @output_time = Time.now
1159
+ Qt.execute_in_main_thread(true) do
1160
+ if @output_io.string[-1..-1] == "\n"
1161
+ time_formatted = Time.now.formatted
1162
+ lines_to_write = ''
1163
+ out_line_number = line_number.to_s
1164
+ out_filename = File.basename(filename) if filename
1165
+
1166
+ # Build each line to write
1167
+ string = @output_io.string.clone
1168
+ @output_io.string = @output_io.string[string.length..-1]
1169
+ line_count = 0
1170
+ string.each_line do |out_line|
1171
+ color = nil
1172
+ if out_line[0..1] == '20' and out_line[10] == ' ' and out_line[23..24] == ' ('
1173
+ line_to_write = out_line
1174
+ else
1175
+ if filename
1176
+ line_to_write = time_formatted + " (#{out_filename}:#{out_line_number}): " + out_line
1177
+ else
1178
+ line_to_write = time_formatted + " (SCRIPTRUNNER): " + out_line
1179
+ color = Cosmos::BLUE
1180
+ end
1181
+ end
1182
+ @output.add_formatted_text(line_to_write, color)
1183
+ lines_to_write += line_to_write
1184
+
1185
+ line_count += 1
1186
+ if line_count > 1000
1187
+ out_line = "ERROR: Too much written to stdout. Truncating output to 1000 lines.\n"
1188
+ if filename
1189
+ line_to_write = time_formatted + " (#{out_filename}:#{out_line_number}): " + out_line
1190
+ else
1191
+ line_to_write = time_formatted + " (SCRIPTRUNNER): " + out_line
1192
+ end
1193
+ @output.addText(line_to_write, Cosmos::RED)
1194
+ lines_to_write += line_to_write
1195
+ break
1196
+ end
1197
+ end # string.each_line
1198
+
1199
+ # Actually add to the GUI
1200
+ @output.flush
1201
+
1202
+ # Add to the message log
1203
+ if @filename.empty?
1204
+ @message_log ||= MessageLog.new("sr_untitled")
1205
+ else
1206
+ @message_log ||= MessageLog.new("sr_#{File.basename(@filename).split('.')[0]}")
1207
+ end
1208
+ @message_log.write(lines_to_write)
1209
+ end
1210
+ end
1211
+ end
1212
+
1213
+ protected
1214
+
1215
+ def initialize_variables
1216
+ @@file_cache = {}
1217
+ @@error = nil
1218
+ @go = false
1219
+ if @@step_mode
1220
+ @pause = true
1221
+ else
1222
+ @pause = false
1223
+ end
1224
+ @stop = false
1225
+ @retry_needed = false
1226
+ @use_instrumentation = true
1227
+ @active_script = @script
1228
+ @call_stack = []
1229
+ @pre_line_time = Time.now
1230
+ @current_file = @filename
1231
+ @exceptions = nil
1232
+ @script_binding = nil
1233
+ @inline_eval = nil
1234
+ @current_filename = nil
1235
+ @current_line_number = 0
1236
+
1237
+ @script.stop_highlight
1238
+ @call_stack.push(@current_file.dup)
1239
+ end
1240
+
1241
+ def wait_for_go_or_stop(error = nil)
1242
+ @go = false
1243
+ sleep(0.01) until @go or @stop
1244
+ @go = false
1245
+ mark_running()
1246
+ Kernel.raise StopScript if @stop
1247
+ Kernel.raise error if error and !@continue_after_error
1248
+ end
1249
+
1250
+ def wait_for_go_or_stop_or_retry(error = nil)
1251
+ @go = false
1252
+ sleep(0.01) until @go or @stop or @retry_needed
1253
+ @go = false
1254
+ mark_running()
1255
+ Kernel.raise StopScript if @stop
1256
+ Kernel.raise error if error and !@continue_after_error
1257
+ end
1258
+
1259
+ def mark_running
1260
+ Qt.execute_in_main_thread(true) do
1261
+ @run_callback.call(self) if @run_callback
1262
+ @active_script.rehighlight
1263
+ @realtime_button_bar.state = 'Running'
1264
+ @realtime_button_bar.start_button.setText('Go')
1265
+ @realtime_button_bar.pause_button.setText('Pause')
1266
+ end
1267
+ end
1268
+
1269
+ def mark_paused
1270
+ Qt.execute_in_main_thread(true) do
1271
+ @pause_callback.call(self) if @pause_callback
1272
+ @active_script.rehighlight('lightblue')
1273
+ @realtime_button_bar.state = 'Paused'
1274
+ end
1275
+ end
1276
+
1277
+ def mark_error
1278
+ Qt.execute_in_main_thread(true) do
1279
+ @error_callback.call(self) if @error_callback
1280
+ @active_script.rehighlight('pink')
1281
+ @realtime_button_bar.state = 'Error'
1282
+ @realtime_button_bar.pause_button.setText('Retry')
1283
+ end
1284
+ end
1285
+
1286
+ def mark_stopped
1287
+ stop_message_log()
1288
+ Qt.execute_in_main_thread(true) do
1289
+ @realtime_button_bar.start_button.setText('Start')
1290
+ @realtime_button_bar.pause_button.setText('Pause')
1291
+ @realtime_button_bar.state = 'Stopped'
1292
+ @stop_callback.call(self) if @stop_callback
1293
+ end
1294
+ end
1295
+
1296
+ def mark_breakpoint
1297
+ Qt.execute_in_main_thread(true) do
1298
+ @active_script.rehighlight('tan')
1299
+ @realtime_button_bar.state = 'Breakpoint'
1300
+ end
1301
+ end
1302
+
1303
+ def run_text(text,
1304
+ line_offset = 0,
1305
+ text_binding = nil,
1306
+ close_on_complete = false)
1307
+ @run_callback.call(self) if @run_callback
1308
+ @realtime_button_bar.start_button.setEnabled(true)
1309
+ initialize_variables()
1310
+ create_tabs()
1311
+ @line_offset = line_offset
1312
+ @script.setReadOnly(true)
1313
+ @realtime_button_bar.start_button.setText(' Go ')
1314
+ @realtime_button_bar.state = 'Running'
1315
+
1316
+ saved_instance = @@instance
1317
+ saved_run_thread = @@run_thread
1318
+ @@instance = self
1319
+ @@run_thread = Thread.new do
1320
+ uncaught_exception = false
1321
+ begin
1322
+ # Capture STDOUT and STDERR
1323
+ $stdout.add_stream(@output_io)
1324
+ $stderr.add_stream(@output_io)
1325
+
1326
+ scriptrunner_puts "Starting script: #{File.basename(@filename)}" unless close_on_complete
1327
+ handle_output_io()
1328
+
1329
+ # Start Limits Monitoring
1330
+ @@limits_monitor_thread = Thread.new { limits_monitor_thread() } if @@monitor_limits and !@@limits_monitor_thread
1331
+
1332
+ # Start Output Thread
1333
+ @@output_thread = Thread.new { output_thread() } unless @@output_thread
1334
+
1335
+ # Check top level cache
1336
+ if @top_level_instrumented_cache &&
1337
+ (@top_level_instrumented_cache[1] == line_offset) &&
1338
+ (@top_level_instrumented_cache[2] == @filename) &&
1339
+ (@top_level_instrumented_cache[0] == text)
1340
+ # Use the instrumented cache
1341
+ instrumented_script = @top_level_instrumented_cache[3]
1342
+ else
1343
+ # Instrument the script
1344
+ if text_binding
1345
+ instrumented_script = self.class.instrument_script(text, @filename, false)
1346
+ else
1347
+ instrumented_script = self.class.instrument_script(text, @filename, true)
1348
+ end
1349
+ @top_level_instrumented_cache = [text, line_offset, @filename, instrumented_script]
1350
+ end
1351
+
1352
+ # Execute the script with warnings disabled
1353
+ Cosmos.disable_warnings do
1354
+ @pre_line_time = Time.now
1355
+ Cosmos.set_working_dir do
1356
+ if text_binding
1357
+ eval(instrumented_script, text_binding, @filename, 1)
1358
+ else
1359
+ Object.class_eval(instrumented_script, @filename, 1)
1360
+ end
1361
+ end
1362
+ end
1363
+
1364
+ scriptrunner_puts "Script completed: #{File.basename(@filename)}" unless close_on_complete
1365
+ handle_output_io()
1366
+
1367
+ rescue Exception => error
1368
+ if error.class == StopScript or error.class == SkipTestCase
1369
+ scriptrunner_puts "Script stopped: #{File.basename(@filename)}"
1370
+ handle_output_io()
1371
+ else
1372
+ uncaught_exception = true
1373
+ filename, line_number = error.source
1374
+ handle_exception(error, true, filename, line_number)
1375
+ scriptrunner_puts "Exception in Control Statement - Script stopped: #{File.basename(@filename)}"
1376
+ handle_output_io()
1377
+ Qt.execute_in_main_thread(true) {@script.rehighlight('red') }
1378
+ end
1379
+ ensure
1380
+ # Change Go Button to Start Button and remove highlight
1381
+ Qt.execute_in_main_thread(true) do
1382
+ # Stop Capturing STDOUT and STDERR
1383
+ # Check for remove_stream because if the tool is quitting the
1384
+ # Cosmos::restore_io may have been called which sets $stdout and
1385
+ # $stderr to the IO constant
1386
+ $stdout.remove_stream(@output_io) if $stdout.respond_to? :remove_stream
1387
+ $stderr.remove_stream(@output_io) if $stderr.respond_to? :remove_stream
1388
+
1389
+ # Clear run thread and instance to indicate we are no longer running
1390
+ @@instance = saved_instance
1391
+ @@run_thread = saved_run_thread
1392
+ @active_script = @script
1393
+ @script_binding = nil
1394
+ @current_filename = nil
1395
+ @current_line_number = 0
1396
+ if @@limits_monitor_thread and not @@instance
1397
+ @@limits_monitor_thread.kill
1398
+ @@limits_monitor_thread = nil
1399
+ end
1400
+ if @@output_thread and not @@instance
1401
+ @@output_thread.kill
1402
+ @@output_thread = nil
1403
+ end
1404
+
1405
+ @script.setReadOnly(false)
1406
+ @script.stop_highlight unless uncaught_exception
1407
+ select_tab_and_destroy_tabs_after_index(0)
1408
+ remove_tabs()
1409
+ unless @allow_start
1410
+ @realtime_button_bar.start_button.setEnabled(false)
1411
+ @script.setReadOnly(true)
1412
+ end
1413
+ mark_stopped()
1414
+ if close_on_complete
1415
+ self.parent.done(0)
1416
+ end
1417
+ end
1418
+ end
1419
+ end
1420
+ end
1421
+
1422
+ def handle_potential_tab_change(filename)
1423
+ # Make sure the correct file is shown in script runner
1424
+ if @current_file != filename and @tab_book_shown
1425
+ Qt.execute_in_main_thread(true) do
1426
+ if @call_stack.include?(filename)
1427
+ index = @call_stack.index(filename)
1428
+ select_tab_and_destroy_tabs_after_index(index)
1429
+ else # new file
1430
+ # Create new tab
1431
+ new_script = create_ruby_editor()
1432
+ @tab_book.addTab(new_script, ' ' + File.basename(filename) + ' ')
1433
+
1434
+ @call_stack.push(filename.dup)
1435
+
1436
+ # Switch to new tab
1437
+ @tab_book.setCurrentIndex(@tab_book.count - 1)
1438
+ @active_script = new_script
1439
+ load_file_into_script(filename)
1440
+ new_script.setReadOnly(true)
1441
+ end
1442
+
1443
+ @current_file = filename
1444
+ end
1445
+ end
1446
+ end
1447
+
1448
+ def show_active_tab
1449
+ @tab_book.setCurrentIndex(@call_stack.length - 1) if @tab_book_shown
1450
+ end
1451
+
1452
+ def handle_pause(filename, line_number)
1453
+ filename = File.basename(filename)
1454
+ breakpoint = false
1455
+ breakpoint = true if @@breakpoints[filename] and @@breakpoints[filename][line_number]
1456
+ if @pause
1457
+ @pause = false unless @@step_mode
1458
+ if breakpoint
1459
+ perform_breakpoint(filename, line_number)
1460
+ else
1461
+ perform_pause()
1462
+ end
1463
+ else
1464
+ perform_breakpoint(filename, line_number) if breakpoint
1465
+ end
1466
+ end
1467
+
1468
+ def handle_line_delay
1469
+ if @@line_delay > 0.0
1470
+ sleep_time = @@line_delay - (Time.now - @pre_line_time)
1471
+ sleep(sleep_time) if sleep_time > 0.0
1472
+ end
1473
+ @pre_line_time = Time.now
1474
+ end
1475
+
1476
+ def continue_without_pausing_on_errors?
1477
+ if !@@pause_on_error
1478
+ if Qt::MessageBox.warning(self, "Warning", "If an error occurs, the script will not pause and will run to completion. Continue?", Qt::MessageBox::Yes | Qt::MessageBox::No, Qt::MessageBox::Yes) == Qt::MessageBox::No
1479
+ return false
1480
+ end
1481
+ end
1482
+ true
1483
+ end
1484
+
1485
+ def handle_start_go_button
1486
+ scriptrunner_puts "User pressed #{@realtime_button_bar.start_button.text.strip}"
1487
+ handle_output_io()
1488
+ @realtime_button_bar.start_button.clear_focus()
1489
+
1490
+ if running?()
1491
+ show_active_tab()
1492
+ go()
1493
+ else
1494
+ if @allow_start
1495
+ run() if continue_without_pausing_on_errors?()
1496
+ end
1497
+ end
1498
+ end
1499
+
1500
+ def handle_pause_retry_button
1501
+ scriptrunner_puts "User pressed #{@realtime_button_bar.pause_button.text.strip}"
1502
+ handle_output_io()
1503
+ @realtime_button_bar.pause_button.clear_focus()
1504
+ show_active_tab() if running?
1505
+ if @realtime_button_bar.pause_button.text.to_s == 'Pause'
1506
+ pause()
1507
+ else
1508
+ retry_needed()
1509
+ end
1510
+ end
1511
+
1512
+ def handle_stop_button
1513
+ scriptrunner_puts "User pressed #{@realtime_button_bar.stop_button.text.strip}"
1514
+ handle_output_io()
1515
+ @realtime_button_bar.stop_button.clear_focus()
1516
+
1517
+ if @stop
1518
+ # If we're already stopped and they click Stop again, kill the run
1519
+ # thread. This will break any ruby sleeps or other code blocks.
1520
+ ScriptRunnerFrame.stop!
1521
+ handle_output_io()
1522
+ else
1523
+ @stop = true
1524
+ end
1525
+ if !running?()
1526
+ # Stop highlight if there was a red syntax error
1527
+ @script.stop_highlight
1528
+ end
1529
+ end
1530
+
1531
+ def handle_exception(error, fatal, filename = nil, line_number = 0)
1532
+ @error_callback.call(self) if @error_callback
1533
+
1534
+ @exceptions ||= []
1535
+ @exceptions << error
1536
+ @@error = error
1537
+
1538
+ if error.class == DRb::DRbConnError
1539
+ Logger.error("Error Connecting to Command and Telemetry Server")
1540
+ elsif error.class == CheckError
1541
+ Logger.error(error.message)
1542
+ else
1543
+ Logger.error(error.class.to_s.split('::')[-1] + ' : ' + error.message)
1544
+ end
1545
+ Logger.error(error.backtrace.join("\n")) if @@show_backtrace
1546
+ handle_output_io(filename, line_number)
1547
+
1548
+ Kernel.raise error if !@@pause_on_error and !@continue_after_error and !fatal
1549
+
1550
+ if !fatal and @@pause_on_error
1551
+ mark_error()
1552
+ wait_for_go_or_stop_or_retry(error)
1553
+ end
1554
+
1555
+ if @retry_needed
1556
+ @retry_needed = false
1557
+ true
1558
+ else
1559
+ false
1560
+ end
1561
+ end
1562
+
1563
+ # Right click context_menu for the script
1564
+ def context_menu(point)
1565
+ if @tab_book_shown
1566
+ current_script = @tab_book.tab(@tab_book.currentIndex)
1567
+ else
1568
+ current_script = @script
1569
+ end
1570
+ menu = current_script.context_menu(point)
1571
+ menu.addSeparator()
1572
+ if not self.class.running?
1573
+ exec_selected_action = Qt::Action.new(tr("Execute Selected Lines"), self)
1574
+ exec_selected_action.statusTip = tr("Execute the selected lines as a standalone script")
1575
+ exec_selected_action.connect(SIGNAL('triggered()')) { run_selection() }
1576
+ menu.addAction(exec_selected_action)
1577
+
1578
+ exec_cursor_action = Qt::Action.new(tr("Execute From Cursor"), self)
1579
+ exec_cursor_action.statusTip = tr("Execute the script starting at the line containing the cursor")
1580
+ exec_cursor_action.connect(SIGNAL('triggered()')) { run_from_cursor() }
1581
+ menu.addAction(exec_cursor_action)
1582
+
1583
+ menu.addSeparator()
1584
+
1585
+ if RUBY_VERSION.split('.')[0].to_i > 1
1586
+ syntax_action = Qt::Action.new(tr("Ruby Syntax Check Selected Lines"), self)
1587
+ syntax_action.statusTip = tr("Check the selected lines for valid Ruby syntax")
1588
+ syntax_action.connect(SIGNAL('triggered()')) { ruby_syntax_check_selection() }
1589
+ menu.addAction(syntax_action)
1590
+ end
1591
+
1592
+ mnemonic_action = Qt::Action.new(tr("Mnemonic Check Selected Lines"), self)
1593
+ mnemonic_action.statusTip = tr("Check the selected lines for valid targets, packets, mnemonics and parameters")
1594
+ mnemonic_action.connect(SIGNAL('triggered()')) { mnemonic_check_selection() }
1595
+ menu.addAction(mnemonic_action)
1596
+
1597
+ elsif running?() and @realtime_button_bar.state != 'Running'
1598
+ exec_selected_action = Qt::Action.new(tr("Execute Selected Lines While Paused"), self)
1599
+ exec_selected_action.statusTip = tr("Execute the selected lines as a standalone script")
1600
+ exec_selected_action.connect(SIGNAL('triggered()')) { run_selection_while_paused() }
1601
+ menu.addAction(exec_selected_action)
1602
+ end
1603
+ menu.exec(current_script.mapToGlobal(point))
1604
+ menu.dispose
1605
+ end
1606
+
1607
+ def load_file_into_script(filename)
1608
+ cached = @@file_cache[filename]
1609
+ if cached
1610
+ @active_script.setPlainText(cached.gsub("\r", ''))
1611
+ else
1612
+ @active_script.setPlainText(File.read(filename).gsub("\r", ''))
1613
+ end
1614
+ mark_breakpoints(filename)
1615
+
1616
+ @active_script.stop_highlight
1617
+ end
1618
+
1619
+ def mark_breakpoints(filename)
1620
+ @active_script.clear_breakpoints
1621
+ breakpoints = @@breakpoints[File.basename(filename)]
1622
+ if breakpoints
1623
+ breakpoints.each do |line_number, present|
1624
+ @active_script.breakpoint(line_number) if present
1625
+ end
1626
+ end
1627
+ end
1628
+
1629
+ def redirect_io
1630
+ # Redirect Standard Output and Standard Error
1631
+ $stdout = Stdout.instance
1632
+ $stderr = Stderr.instance
1633
+
1634
+ # Disable outputting to default io file descriptors
1635
+ $stdout.remove_default_io
1636
+ $stderr.remove_default_io
1637
+
1638
+ Logger.level = Logger::INFO
1639
+ Logger::INFO_SEVERITY_STRING.replace('')
1640
+ Logger::WARN_SEVERITY_STRING.replace('<Y> WARN:')
1641
+ Logger::ERROR_SEVERITY_STRING.replace('<R> ERROR:')
1642
+ end
1643
+
1644
+ def create_tabs
1645
+ tab_text = @default_tab_text
1646
+ tab_text = ' ' + File.basename(@filename) + ' ' unless @filename.empty?
1647
+ @tab_book.addTab(@script, tab_text)
1648
+ @top_frame.insertWidget(0, @tab_book)
1649
+ @tab_book_shown = true
1650
+ end
1651
+
1652
+ def remove_tabs
1653
+ @top_frame.takeAt(0) # Remove the @tab_book from the layout
1654
+ @top_frame.addWidget(@script) # Add back the script
1655
+ @script.show
1656
+ @tab_book_shown = false
1657
+ end
1658
+
1659
+ def isolate_string(keyword, line)
1660
+ found_string = nil
1661
+
1662
+ # Find keyword
1663
+ keyword_index = line.index(keyword)
1664
+
1665
+ # Remove keyword from line
1666
+ line = line[(keyword_index + keyword.length)..-1]
1667
+
1668
+ # Find start parens
1669
+ start_parens = line.index('(')
1670
+ if start_parens
1671
+ end_parens = line[start_parens..-1].index(')')
1672
+ found_string = line[(start_parens + 1)..(end_parens + start_parens - 1)].remove_quotes if end_parens
1673
+ if keyword == 'wait' or keyword == 'wait_check'
1674
+ quote_index = found_string.rindex('"')
1675
+ quote_index = found_string.rindex("'") unless quote_index
1676
+ if quote_index
1677
+ found_string = found_string[0..quote_index].remove_quotes
1678
+ else
1679
+ found_string = nil
1680
+ end
1681
+ end
1682
+ end
1683
+ found_string
1684
+ end
1685
+
1686
+ def mnemonic_check_cmd_line(keyword, line_number, line)
1687
+ result = nil
1688
+
1689
+ # Isolate the string
1690
+ string = isolate_string(keyword, line)
1691
+ if string
1692
+ begin
1693
+ target_name, cmd_name, cmd_params = extract_fields_from_cmd_text(string)
1694
+ result = "At line #{line_number}: Unknown command: #{target_name} #{cmd_name}"
1695
+ packet = System.commands.packet(target_name, cmd_name)
1696
+ Kernel.raise "Command not found" unless packet
1697
+ cmd_params.each do |param_name, param_value|
1698
+ result = "At line #{line_number}: Unknown command parameter: #{target_name} #{cmd_name} #{param_name}"
1699
+ packet.get_item(param_name)
1700
+ end
1701
+ result = nil
1702
+ rescue
1703
+ if result
1704
+ if string.index('=>')
1705
+ # Assume alternative syntax
1706
+ result = nil
1707
+ end
1708
+ else
1709
+ result = "At line #{line_number}: Potentially malformed command: #{line}"
1710
+ end
1711
+ end
1712
+ end
1713
+
1714
+ result
1715
+ end
1716
+
1717
+ def _mnemonic_check_tlm_line(keyword, line_number, line)
1718
+ result = nil
1719
+
1720
+ # Isolate the string
1721
+ string = isolate_string(keyword, line)
1722
+ if string
1723
+ begin
1724
+ target_name, packet_name, item_name = yield string
1725
+ result = "At line #{line_number}: Unknown telemetry item: #{target_name} #{packet_name} #{item_name}"
1726
+ System.telemetry.packet_and_item(target_name, packet_name, item_name)
1727
+ result = nil
1728
+ rescue
1729
+ if result
1730
+ if string.index(',')
1731
+ # Assume alternative syntax
1732
+ result = nil
1733
+ end
1734
+ else
1735
+ result = "At line #{line_number}: Potentially malformed telemetry: #{line}"
1736
+ end
1737
+ end
1738
+ end
1739
+
1740
+ result
1741
+ end
1742
+
1743
+ def mnemonic_check_tlm_line(keyword, line_number, line)
1744
+ _mnemonic_check_tlm_line(keyword, line_number, line) do |string|
1745
+ extract_fields_from_tlm_text(string)
1746
+ end
1747
+ end
1748
+
1749
+ def mnemonic_check_set_tlm_line(keyword, line_number, line)
1750
+ _mnemonic_check_tlm_line(keyword, line_number, line) do |string|
1751
+ extract_fields_from_set_tlm_text(string)
1752
+ end
1753
+ end
1754
+
1755
+ def mnemonic_check_check_line(keyword, line_number, line)
1756
+ _mnemonic_check_tlm_line(keyword, line_number, line) do |string|
1757
+ extract_fields_from_check_text(string)
1758
+ end
1759
+ end
1760
+
1761
+ def output_thread
1762
+ begin
1763
+ loop do
1764
+ handle_output_io() if (Time.now - @output_time) > 5.0
1765
+ sleep(1.0)
1766
+ end # loop
1767
+ rescue => error
1768
+ Qt.execute_in_main_thread(true) do
1769
+ ExceptionDialog.new(self, error, "Output Thread")
1770
+ end
1771
+ end
1772
+ end
1773
+
1774
+ def limits_monitor_thread
1775
+ queue_id = nil
1776
+ begin
1777
+ loop do
1778
+ begin
1779
+ # Subscribe to limits notifications
1780
+ queue_id = subscribe_limits_events(100000) unless queue_id
1781
+
1782
+ # Get the next limits event
1783
+ begin
1784
+ type, data = get_limits_event(queue_id, true)
1785
+ rescue ThreadError
1786
+ sleep(0.5)
1787
+ next
1788
+ end
1789
+
1790
+ # Display limits state changes
1791
+ if type == :LIMITS_CHANGE
1792
+ target_name = data[0]
1793
+ packet_name = data[1]
1794
+ item_name = data[2]
1795
+ old_limits_state = data[3]
1796
+ new_limits_state = data[4]
1797
+
1798
+ if old_limits_state == nil # Changing from nil
1799
+ if (new_limits_state != :GREEN) &&
1800
+ (new_limits_state != :GREEN_LOW) &&
1801
+ (new_limits_state != :GREEN_HIGH) &&
1802
+ (new_limits_state != :BLUE)
1803
+ msg = "#{target_name} #{packet_name} #{item_name} is #{new_limits_state.to_s}"
1804
+ case new_limits_state
1805
+ when :YELLOW, :YELLOW_LOW, :YELLOW_HIGH
1806
+ scriptrunner_puts "<Y>#{msg}"
1807
+ when :RED, :RED_LOW, :RED_HIGH
1808
+ scriptrunner_puts "<R>#{msg}"
1809
+ else
1810
+ # Print nothing
1811
+ end
1812
+ handle_output_io()
1813
+ end
1814
+ else # changing from a color
1815
+ msg = "#{target_name} #{packet_name} #{item_name} is #{new_limits_state.to_s}"
1816
+ case new_limits_state
1817
+ when :BLUE
1818
+ scriptrunner_puts "<B>#{msg}"
1819
+ when :GREEN, :GREEN_LOW, :GREEN_HIGH
1820
+ scriptrunner_puts "<G>#{msg}"
1821
+ when :YELLOW, :YELLOW_LOW, :YELLOW_HIGH
1822
+ scriptrunner_puts "<Y>#{msg}"
1823
+ when :RED, :RED_LOW, :RED_HIGH
1824
+ scriptrunner_puts "<R>#{msg}"
1825
+ else
1826
+ # Print nothing
1827
+ end
1828
+ handle_output_io()
1829
+ end
1830
+
1831
+ if @@pause_on_red && (new_limits_state == :RED ||
1832
+ new_limits_state == :RED_LOW ||
1833
+ new_limits_state == :RED_HIGH)
1834
+ pause()
1835
+ end
1836
+ end
1837
+
1838
+ rescue DRb::DRbConnError
1839
+ queue_id = nil
1840
+ sleep(1)
1841
+ end
1842
+
1843
+ end # loop
1844
+ rescue => error
1845
+ Qt.execute_in_main_thread(true) do
1846
+ ExceptionDialog.new(self, error, "Limits Monitor Thread")
1847
+ end
1848
+ end
1849
+ ensure
1850
+ begin
1851
+ unsubscribe_limits_events(queue_id) if queue_id
1852
+ rescue
1853
+ # Oh Well
1854
+ end
1855
+ end
1856
+
1857
+ end # class ScriptRunnerFrame
1858
+
1859
+ end # module Cosmos