cosmos 3.0.1 → 3.1.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 (912) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +48 -48
  4. data/.travis.yml +7 -7
  5. data/CONTRIBUTING.txt +50 -50
  6. data/Gemfile +6 -6
  7. data/Guardfile +27 -27
  8. data/LICENSE.txt +879 -879
  9. data/Manifest.txt +1116 -1114
  10. data/README.md +109 -107
  11. data/Rakefile +214 -214
  12. data/autohotkey/config/data/diamond.STL +57 -57
  13. data/autohotkey/config/system/system.txt +34 -34
  14. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  17. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  18. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  20. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  21. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  22. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -294
  23. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  24. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  25. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  26. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  27. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  28. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  29. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  30. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  31. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  32. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  33. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  34. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  37. data/autohotkey/config/targets/INST/target.txt +26 -26
  38. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  40. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  41. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  42. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  43. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  44. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  45. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  46. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  47. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  48. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  49. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  50. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  51. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  52. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  55. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  57. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  58. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  59. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  60. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  61. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  62. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  63. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  64. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  65. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  66. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  67. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  69. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  70. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  71. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  72. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  75. data/autohotkey/lib/example_background_task.rb +42 -42
  76. data/autohotkey/lib/user_version.rb +3 -3
  77. data/autohotkey/procedures/clear_util.rb +7 -7
  78. data/autohotkey/procedures/collect.rb +18 -18
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +20 -20
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/Replay.bat +59 -59
  101. data/autohotkey/tools/ReplayAHK +17 -17
  102. data/autohotkey/tools/ScriptRunner +14 -14
  103. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  104. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  105. data/autohotkey/tools/TableManager +14 -14
  106. data/autohotkey/tools/TableManagerAHK +30 -30
  107. data/autohotkey/tools/TestRunner +15 -15
  108. data/autohotkey/tools/TestRunnerAHK +17 -17
  109. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  112. data/autohotkey/tools/TlmExtractor +15 -15
  113. data/autohotkey/tools/TlmExtractorAHK +19 -19
  114. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  115. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  116. data/autohotkey/tools/TlmGrapher +14 -14
  117. data/autohotkey/tools/TlmGrapherAHK +19 -19
  118. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  119. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  120. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  121. data/autohotkey/tools/TlmViewer +14 -14
  122. data/autohotkey/tools/TlmViewerAHK +28 -28
  123. data/autohotkey/tools/TlmViewerAHK2 +18 -18
  124. data/autohotkey/tools/TlmViewerAHK3 +18 -18
  125. data/autohotkey/tools/TlmViewerAHK4 +18 -18
  126. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  127. data/autohotkey/tools/autohotkey.rb +37 -37
  128. data/autohotkey/tools/cmd_extractor.ahk +27 -27
  129. data/autohotkey/tools/cmd_sender.ahk +182 -162
  130. data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
  131. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  132. data/autohotkey/tools/data_viewer.ahk +135 -135
  133. data/autohotkey/tools/handbook_creator.ahk +23 -23
  134. data/autohotkey/tools/launcher.ahk +41 -41
  135. data/autohotkey/tools/limits_monitor.ahk +70 -70
  136. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  137. data/autohotkey/tools/packet_viewer.ahk +143 -143
  138. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  139. data/autohotkey/tools/replay.ahk +98 -98
  140. data/autohotkey/tools/script_runner.ahk +589 -589
  141. data/autohotkey/tools/script_runner2.ahk +34 -31
  142. data/autohotkey/tools/table_manager.ahk +220 -220
  143. data/autohotkey/tools/test_runner.ahk +262 -259
  144. data/autohotkey/tools/test_runner2.ahk +52 -52
  145. data/autohotkey/tools/test_runner3.ahk +13 -13
  146. data/autohotkey/tools/tlm_extractor.ahk +272 -272
  147. data/autohotkey/tools/tlm_grapher.ahk +642 -642
  148. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  149. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  150. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  151. data/autohotkey/tools/tlm_viewer2.ahk +50 -49
  152. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  153. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  154. data/bin/cosmos +96 -96
  155. data/bin/cstol_converter +1166 -1166
  156. data/bin/rubysloc +85 -85
  157. data/cosmos.gemspec +98 -97
  158. data/data/about.txt +4 -4
  159. data/data/crc.txt +306 -305
  160. data/data/diamond.STL +57 -57
  161. data/data/legal.txt +9 -9
  162. data/demo/Gemfile +6 -6
  163. data/demo/Launcher +15 -15
  164. data/demo/Launcher.bat +59 -59
  165. data/demo/Rakefile +61 -61
  166. data/demo/config/data/crc.txt +222 -206
  167. data/demo/config/data/diamond.STL +57 -57
  168. data/demo/config/data/meta_init.txt +4 -4
  169. data/demo/config/system/system.txt +34 -34
  170. data/demo/config/system/system2.txt +33 -33
  171. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  172. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  173. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  174. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  175. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  176. data/demo/config/targets/COSMOS/target.txt +11 -11
  177. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  178. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -3
  179. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  180. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  181. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  182. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  183. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  184. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  185. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  186. data/demo/config/targets/INST/lib/sim_inst.rb +305 -294
  187. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  188. data/demo/config/targets/INST/screens/array.txt +15 -15
  189. data/demo/config/targets/INST/screens/block.txt +8 -8
  190. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  191. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  192. data/demo/config/targets/INST/screens/ground.txt +25 -25
  193. data/demo/config/targets/INST/screens/hs.txt +44 -44
  194. data/demo/config/targets/INST/screens/latest.txt +23 -23
  195. data/demo/config/targets/INST/screens/other.txt +29 -29
  196. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  197. data/demo/config/targets/INST/target.txt +33 -33
  198. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  199. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  200. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  201. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  202. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  203. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -12
  204. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  205. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  206. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +54 -48
  207. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  208. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
  209. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
  210. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  211. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  212. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  213. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  214. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  215. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  216. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  217. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  218. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  219. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  220. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  221. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  222. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  223. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  224. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  225. data/demo/config/tools/launcher/launcher.txt +45 -45
  226. data/demo/config/tools/launcher/launcher2.txt +45 -45
  227. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  228. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  229. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  230. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  231. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  232. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  233. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  234. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  235. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  236. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  237. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  238. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  239. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  240. data/demo/lib/example_background_task.rb +57 -52
  241. data/demo/lib/example_target.rb +113 -108
  242. data/demo/lib/scpi_target.rb +74 -74
  243. data/demo/lib/user_version.rb +3 -3
  244. data/demo/procedures/checks.rb +11 -11
  245. data/demo/procedures/clear_util.rb +7 -7
  246. data/demo/procedures/collect.rb +18 -18
  247. data/demo/procedures/collect_util.rb +14 -14
  248. data/demo/procedures/cosmos_api_test.rb +293 -293
  249. data/demo/procedures/disconnect.rb +29 -29
  250. data/demo/procedures/example_test.rb +182 -182
  251. data/demo/procedures/plot_test.rb +8 -8
  252. data/demo/procedures/run_example_test.rb +3 -3
  253. data/demo/procedures/test.rb +51 -51
  254. data/demo/tools/CmdExtractor +15 -15
  255. data/demo/tools/CmdExtractor.bat +59 -59
  256. data/demo/tools/CmdSender +15 -15
  257. data/demo/tools/CmdSender.bat +59 -59
  258. data/demo/tools/CmdTlmServer +15 -15
  259. data/demo/tools/CmdTlmServer.bat +59 -59
  260. data/demo/tools/DataViewer +15 -15
  261. data/demo/tools/DataViewer.bat +59 -59
  262. data/demo/tools/ExampleTarget +15 -15
  263. data/demo/tools/ExampleTarget.bat +59 -59
  264. data/demo/tools/HandbookCreator +15 -15
  265. data/demo/tools/HandbookCreator.bat +61 -61
  266. data/demo/tools/Launcher +15 -15
  267. data/demo/tools/Launcher.bat +59 -59
  268. data/demo/tools/LimitsMonitor +15 -15
  269. data/demo/tools/LimitsMonitor.bat +59 -59
  270. data/demo/tools/OpenGLBuilder +15 -15
  271. data/demo/tools/OpenGLBuilder.bat +59 -59
  272. data/demo/tools/PacketViewer +15 -15
  273. data/demo/tools/PacketViewer.bat +59 -59
  274. data/demo/tools/Replay +15 -15
  275. data/demo/tools/Replay.bat +59 -59
  276. data/demo/tools/ScpiTarget +15 -15
  277. data/demo/tools/ScpiTarget.bat +59 -59
  278. data/demo/tools/ScriptRunner +15 -15
  279. data/demo/tools/ScriptRunner.bat +59 -59
  280. data/demo/tools/TableManager +15 -15
  281. data/demo/tools/TableManager.bat +59 -59
  282. data/demo/tools/TestRunner +15 -15
  283. data/demo/tools/TestRunner.bat +59 -59
  284. data/demo/tools/TlmExtractor +15 -15
  285. data/demo/tools/TlmExtractor.bat +59 -59
  286. data/demo/tools/TlmGrapher +15 -15
  287. data/demo/tools/TlmGrapher.bat +59 -59
  288. data/demo/tools/TlmViewer +15 -15
  289. data/demo/tools/TlmViewer.bat +59 -59
  290. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  291. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  292. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  293. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  294. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  295. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  296. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  297. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  298. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  299. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  300. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  301. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  302. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  304. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  305. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  306. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  307. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  308. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  309. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  310. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  311. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  312. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  313. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  314. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  316. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  317. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  318. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  319. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  320. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  321. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  322. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  323. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  324. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  325. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  326. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  328. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  329. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  330. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  331. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  332. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  333. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  334. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  335. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  336. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  337. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  338. data/ext/cosmos/ext/array/array.c +111 -111
  339. data/ext/cosmos/ext/array/extconf.rb +13 -13
  340. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  341. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  342. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  343. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  344. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  345. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  346. data/ext/cosmos/ext/crc/crc.c +341 -341
  347. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  348. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  349. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  350. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  351. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -261
  352. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  353. data/ext/cosmos/ext/packet/packet.c +339 -339
  354. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  355. data/ext/cosmos/ext/platform/platform.c +81 -81
  356. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  357. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  358. data/ext/cosmos/ext/string/extconf.rb +13 -13
  359. data/ext/cosmos/ext/string/string.c +49 -49
  360. data/ext/cosmos/ext/structure/structure.c +894 -894
  361. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  362. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  363. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  364. data/ext/cosmos/ext/telemetry/telemetry.c +306 -306
  365. data/ext/mkrf_conf.rb +40 -40
  366. data/install/Gemfile +6 -6
  367. data/install/Launcher +14 -14
  368. data/install/Launcher.bat +59 -59
  369. data/install/Rakefile +61 -61
  370. data/install/config/data/crc.txt +134 -133
  371. data/install/config/system/system.txt +29 -29
  372. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  373. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  374. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  375. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  376. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  377. data/install/config/targets/COSMOS/target.txt +8 -8
  378. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  379. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  380. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  381. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  382. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  383. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  384. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  385. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  386. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  387. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  388. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  389. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  390. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  391. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  392. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  393. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  394. data/install/config/tools/launcher/launcher.txt +39 -39
  395. data/install/config/tools/script_runner/script_runner.txt +3 -3
  396. data/install/config/tools/test_runner/test_runner.txt +8 -8
  397. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  398. data/install/lib/user_version.rb +3 -3
  399. data/install/tools/CmdExtractor +15 -15
  400. data/install/tools/CmdExtractor.bat +59 -59
  401. data/install/tools/CmdSender +15 -15
  402. data/install/tools/CmdSender.bat +59 -59
  403. data/install/tools/CmdTlmServer +15 -15
  404. data/install/tools/CmdTlmServer.bat +59 -59
  405. data/install/tools/DataViewer +15 -15
  406. data/install/tools/DataViewer.bat +59 -59
  407. data/install/tools/HandbookCreator +15 -15
  408. data/install/tools/HandbookCreator.bat +61 -61
  409. data/install/tools/Launcher +15 -15
  410. data/install/tools/Launcher.bat +59 -59
  411. data/install/tools/LimitsMonitor +15 -15
  412. data/install/tools/LimitsMonitor.bat +59 -59
  413. data/install/tools/OpenGLBuilder +15 -15
  414. data/install/tools/OpenGLBuilder.bat +59 -59
  415. data/install/tools/PacketViewer +15 -15
  416. data/install/tools/PacketViewer.bat +59 -59
  417. data/install/tools/Replay +15 -15
  418. data/install/tools/Replay.bat +59 -59
  419. data/install/tools/ScriptRunner +15 -15
  420. data/install/tools/ScriptRunner.bat +59 -59
  421. data/install/tools/TableManager +15 -15
  422. data/install/tools/TableManager.bat +59 -59
  423. data/install/tools/TestRunner +15 -15
  424. data/install/tools/TestRunner.bat +59 -59
  425. data/install/tools/TlmExtractor +15 -15
  426. data/install/tools/TlmExtractor.bat +59 -59
  427. data/install/tools/TlmGrapher +15 -15
  428. data/install/tools/TlmGrapher.bat +59 -59
  429. data/install/tools/TlmViewer +15 -15
  430. data/install/tools/TlmViewer.bat +59 -59
  431. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  432. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  433. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  434. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  435. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  436. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  437. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  438. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  439. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  440. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  441. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  442. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  443. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  444. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  445. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  446. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  447. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  448. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  449. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  450. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  451. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  452. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  453. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  454. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  455. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  456. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  457. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  458. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  459. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  460. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  461. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  463. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  464. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  465. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  466. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  467. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  468. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  469. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  470. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  471. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  472. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  473. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  475. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  476. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  477. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  478. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  479. data/lib/cosmos.rb +63 -63
  480. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  481. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  482. data/lib/cosmos/config/config_parser.rb +324 -324
  483. data/lib/cosmos/conversions.rb +13 -13
  484. data/lib/cosmos/conversions/conversion.rb +47 -47
  485. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  486. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  487. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  488. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  489. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  490. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  491. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  492. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  493. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  494. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  495. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  496. data/lib/cosmos/core_ext.rb +18 -18
  497. data/lib/cosmos/core_ext/array.rb +354 -354
  498. data/lib/cosmos/core_ext/class.rb +51 -51
  499. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  500. data/lib/cosmos/core_ext/exception.rb +52 -52
  501. data/lib/cosmos/core_ext/file.rb +75 -75
  502. data/lib/cosmos/core_ext/hash.rb +28 -28
  503. data/lib/cosmos/core_ext/io.rb +75 -75
  504. data/lib/cosmos/core_ext/kernel.rb +38 -38
  505. data/lib/cosmos/core_ext/math.rb +119 -119
  506. data/lib/cosmos/core_ext/matrix.rb +146 -146
  507. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  508. data/lib/cosmos/core_ext/range.rb +22 -22
  509. data/lib/cosmos/core_ext/socket.rb +32 -32
  510. data/lib/cosmos/core_ext/string.rb +310 -310
  511. data/lib/cosmos/core_ext/stringio.rb +24 -24
  512. data/lib/cosmos/core_ext/time.rb +446 -446
  513. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  514. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  515. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  516. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  517. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  518. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -317
  519. data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
  520. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  521. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  522. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  523. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  524. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  525. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  526. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -196
  527. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
  528. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  529. data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
  530. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
  531. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  532. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  533. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  534. data/lib/cosmos/gui/dialogs/splash.rb +113 -113
  535. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  536. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  537. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  538. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  539. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -494
  540. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  541. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
  542. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  543. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  544. data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -459
  545. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  546. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  547. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  548. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  549. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  550. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  551. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -712
  552. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  553. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  554. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  555. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  556. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  557. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  558. data/lib/cosmos/gui/qt.rb +813 -786
  559. data/lib/cosmos/gui/qt_tool.rb +378 -373
  560. data/lib/cosmos/gui/text/completion.rb +381 -381
  561. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  562. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  563. data/lib/cosmos/gui/text/ruby_editor.rb +395 -395
  564. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  565. data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
  566. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  567. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  568. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  569. data/lib/cosmos/interfaces.rb +11 -11
  570. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -149
  571. data/lib/cosmos/interfaces/interface.rb +213 -213
  572. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  573. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  574. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -128
  575. data/lib/cosmos/interfaces/stream_interface.rb +156 -156
  576. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  577. data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
  578. data/lib/cosmos/interfaces/udp_interface.rb +173 -173
  579. data/lib/cosmos/io/buffered_file.rb +11 -11
  580. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  581. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  582. data/lib/cosmos/io/json_drb.rb +344 -320
  583. data/lib/cosmos/io/json_drb_object.rb +137 -137
  584. data/lib/cosmos/io/json_rpc.rb +365 -365
  585. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  586. data/lib/cosmos/io/raw_logger.rb +174 -174
  587. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  588. data/lib/cosmos/io/serial_driver.rb +85 -85
  589. data/lib/cosmos/io/stderr.rb +36 -36
  590. data/lib/cosmos/io/stdout.rb +36 -36
  591. data/lib/cosmos/io/tcpip_server.rb +583 -532
  592. data/lib/cosmos/io/udp_sockets.rb +152 -152
  593. data/lib/cosmos/io/win32_serial_driver.rb +147 -147
  594. data/lib/cosmos/packet_logs.rb +6 -6
  595. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  596. data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
  597. data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
  598. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  599. data/lib/cosmos/packets/binary_accessor.rb +921 -921
  600. data/lib/cosmos/packets/commands.rb +291 -291
  601. data/lib/cosmos/packets/limits.rb +263 -263
  602. data/lib/cosmos/packets/limits_response.rb +38 -38
  603. data/lib/cosmos/packets/packet.rb +714 -699
  604. data/lib/cosmos/packets/packet_config.rb +1034 -1034
  605. data/lib/cosmos/packets/packet_item.rb +317 -317
  606. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  607. data/lib/cosmos/packets/structure.rb +421 -386
  608. data/lib/cosmos/packets/structure_item.rb +233 -233
  609. data/lib/cosmos/packets/telemetry.rb +317 -317
  610. data/lib/cosmos/processors.rb +6 -6
  611. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  612. data/lib/cosmos/processors/processor.rb +71 -71
  613. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  614. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  615. data/lib/cosmos/script.rb +9 -9
  616. data/lib/cosmos/script/extract.rb +115 -115
  617. data/lib/cosmos/script/script.rb +1513 -1493
  618. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  619. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  620. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  621. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  622. data/lib/cosmos/streams/serial_stream.rb +152 -143
  623. data/lib/cosmos/streams/stream.rb +57 -57
  624. data/lib/cosmos/streams/stream_protocol.rb +369 -369
  625. data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
  626. data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
  627. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  628. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  629. data/lib/cosmos/system.rb +4 -4
  630. data/lib/cosmos/system/system.rb +558 -558
  631. data/lib/cosmos/system/target.rb +178 -178
  632. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
  633. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
  634. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  635. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  636. data/lib/cosmos/tools/cmd_tlm_server/api.rb +936 -940
  637. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  638. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
  639. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
  640. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
  641. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
  642. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  643. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
  644. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
  645. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  646. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  647. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  648. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  649. data/lib/cosmos/tools/data_viewer/data_viewer.rb +628 -600
  650. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
  651. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  652. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
  653. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
  654. data/lib/cosmos/tools/launcher/launcher.rb +184 -184
  655. data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
  656. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
  657. data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
  658. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
  659. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  660. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  661. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -525
  662. data/lib/cosmos/tools/replay/replay.rb +495 -488
  663. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  664. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
  665. data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
  666. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  667. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
  668. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  669. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  670. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  671. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  672. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  673. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  674. data/lib/cosmos/tools/test_runner/test.rb +480 -480
  675. data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
  676. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
  677. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  678. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
  679. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  680. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  681. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  682. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  683. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -94
  684. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  685. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -180
  686. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  687. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  688. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -173
  689. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
  690. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
  691. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  692. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  693. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -320
  694. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  695. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  696. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  697. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  698. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  699. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  700. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  701. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  702. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  703. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  704. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  705. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -1278
  706. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  707. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  708. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +111 -95
  709. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  710. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +72 -66
  711. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  712. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  713. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  714. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -458
  715. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
  716. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
  717. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  718. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  719. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -70
  720. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
  721. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  722. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  723. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  724. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  725. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  726. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  727. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  728. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  729. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  730. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  731. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  732. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  733. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  734. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  735. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  736. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  737. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  738. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  739. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  740. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  741. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  742. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  743. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  744. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  745. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  746. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  747. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  748. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  749. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  750. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  751. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  752. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  753. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  754. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  755. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  756. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  757. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  758. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  759. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  760. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  761. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  762. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  763. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  764. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  765. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  766. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  767. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  768. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  769. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  770. data/lib/cosmos/top_level.rb +647 -596
  771. data/lib/cosmos/utilities.rb +11 -10
  772. data/lib/cosmos/utilities/crc.rb +166 -166
  773. data/lib/cosmos/utilities/csv.rb +83 -83
  774. data/lib/cosmos/utilities/logger.rb +137 -137
  775. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  776. data/lib/cosmos/utilities/message_log.rb +74 -74
  777. data/lib/cosmos/utilities/quaternion.rb +258 -258
  778. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  779. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  780. data/lib/cosmos/utilities/sleeper.rb +44 -0
  781. data/lib/cosmos/version.rb +12 -12
  782. data/lib/cosmos/win32/excel.rb +66 -66
  783. data/lib/cosmos/win32/win32.rb +387 -387
  784. data/lib/cosmos/win32/win32_main.rb +311 -311
  785. data/roodi.yml +24 -24
  786. data/run_gui_tests.bat +32 -32
  787. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  788. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  789. data/spec/config/config_parser_spec.rb +322 -322
  790. data/spec/conversions/conversion_spec.rb +31 -31
  791. data/spec/conversions/generic_conversion_spec.rb +45 -45
  792. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  793. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  794. data/spec/conversions/processor_conversion_spec.rb +45 -45
  795. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  796. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  797. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  798. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  799. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  800. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  801. data/spec/core_ext/array_spec.rb +186 -186
  802. data/spec/core_ext/class_spec.rb +36 -36
  803. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  804. data/spec/core_ext/exception_spec.rb +91 -91
  805. data/spec/core_ext/file_spec.rb +72 -72
  806. data/spec/core_ext/hash_spec.rb +24 -24
  807. data/spec/core_ext/io_spec.rb +46 -46
  808. data/spec/core_ext/kernel_spec.rb +54 -54
  809. data/spec/core_ext/math_spec.rb +116 -116
  810. data/spec/core_ext/matrix_spec.rb +66 -66
  811. data/spec/core_ext/objectspace_spec.rb +29 -29
  812. data/spec/core_ext/range_spec.rb +21 -21
  813. data/spec/core_ext/socket_spec.rb +32 -32
  814. data/spec/core_ext/string_spec.rb +223 -223
  815. data/spec/core_ext/stringio_spec.rb +21 -21
  816. data/spec/core_ext/time_spec.rb +151 -151
  817. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  818. data/spec/install/config/system/system.txt +33 -33
  819. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  820. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  821. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  822. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  823. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  824. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  825. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  826. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  827. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  828. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  829. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  830. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -294
  831. data/spec/install/config/targets/INST/target.txt +10 -10
  832. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  833. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  834. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  835. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  836. data/spec/interfaces/interface_spec.rb +130 -131
  837. data/spec/interfaces/linc_interface_spec.rb +199 -199
  838. data/spec/interfaces/serial_interface_spec.rb +56 -56
  839. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  840. data/spec/interfaces/stream_interface_spec.rb +157 -157
  841. data/spec/interfaces/tcpip_client_interface_spec.rb +54 -54
  842. data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
  843. data/spec/interfaces/udp_interface_spec.rb +175 -177
  844. data/spec/io/buffered_file_spec.rb +113 -113
  845. data/spec/io/io_multiplexer_spec.rb +94 -94
  846. data/spec/io/json_drb_object_spec.rb +99 -99
  847. data/spec/io/json_drb_spec.rb +311 -311
  848. data/spec/io/json_rpc_spec.rb +264 -264
  849. data/spec/io/raw_logger_pair_spec.rb +76 -76
  850. data/spec/io/raw_logger_spec.rb +133 -133
  851. data/spec/io/serial_driver_spec.rb +61 -61
  852. data/spec/io/stderr_spec.rb +32 -32
  853. data/spec/io/stdout_spec.rb +32 -32
  854. data/spec/io/tcpip_server_spec.rb +338 -338
  855. data/spec/io/udp_sockets_spec.rb +94 -94
  856. data/spec/io/win32_serial_driver_spec.rb +88 -88
  857. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  858. data/spec/packet_logs/packet_log_reader_spec.rb +408 -408
  859. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  860. data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
  861. data/spec/packets/binary_accessor_spec.rb +2073 -2073
  862. data/spec/packets/commands_spec.rb +369 -369
  863. data/spec/packets/limits_response_spec.rb +25 -25
  864. data/spec/packets/limits_spec.rb +326 -326
  865. data/spec/packets/packet_config_spec.rb +1620 -1620
  866. data/spec/packets/packet_item_limits_spec.rb +161 -161
  867. data/spec/packets/packet_item_spec.rb +386 -386
  868. data/spec/packets/packet_spec.rb +1057 -949
  869. data/spec/packets/structure_item_spec.rb +195 -195
  870. data/spec/packets/structure_spec.rb +419 -419
  871. data/spec/packets/telemetry_spec.rb +535 -535
  872. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  873. data/spec/processors/processor_spec.rb +55 -55
  874. data/spec/processors/statistics_processor_spec.rb +60 -60
  875. data/spec/processors/watermark_processor_spec.rb +51 -51
  876. data/spec/script/script_spec.rb +654 -654
  877. data/spec/spec_helper.rb +154 -148
  878. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  879. data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
  880. data/spec/streams/length_stream_protocol_spec.rb +297 -297
  881. data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
  882. data/spec/streams/serial_stream_spec.rb +105 -105
  883. data/spec/streams/stream_protocol_spec.rb +332 -332
  884. data/spec/streams/stream_spec.rb +29 -29
  885. data/spec/streams/tcpip_client_stream_spec.rb +54 -54
  886. data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
  887. data/spec/streams/template_stream_protocol_spec.rb +151 -151
  888. data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
  889. data/spec/system/system_spec.rb +645 -645
  890. data/spec/system/target_spec.rb +248 -248
  891. data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
  892. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  893. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  894. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +411 -411
  895. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  896. data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
  897. data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
  898. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  899. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
  900. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  901. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
  902. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
  903. data/spec/top_level/top_level_spec.rb +334 -321
  904. data/spec/utilities/crc_spec.rb +45 -45
  905. data/spec/utilities/csv_spec.rb +97 -97
  906. data/spec/utilities/logger_spec.rb +102 -102
  907. data/spec/utilities/message_log_spec.rb +89 -89
  908. data/spec/utilities/quaternion_spec.rb +107 -107
  909. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  910. data/tasks/manifest.rake +22 -22
  911. data/tasks/spec.rake +23 -23
  912. metadata +18 -2
@@ -1,716 +1,716 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos'
12
- Cosmos.catch_fatal_exception do
13
- require 'cosmos/script'
14
- require 'cosmos/gui/qt_tool'
15
- require 'cosmos/config/config_parser'
16
- require 'cosmos/gui/text/completion'
17
- require 'cosmos/gui/utilities/script_module_gui'
18
- require 'cosmos/gui/dialogs/splash'
19
- require 'cosmos/gui/dialogs/cmd_details_dialog'
20
- require 'cosmos/tools/cmd_sender/cmd_sender_text_edit'
21
- require 'cosmos/tools/cmd_sender/cmd_sender_item_delegate'
22
- end
23
-
24
- module Cosmos
25
-
26
- Cosmos.disable_warnings do
27
- module Script
28
- def prompt_for_script_abort
29
- window = get_cmd_tlm_gui_window()
30
- window.statusBar.showMessage(tr("Hazardous command not sent"))
31
- end
32
- end #module Script
33
- end
34
-
35
- $eval_binding = binding()
36
-
37
- # Command Sender sends commands to the COSMOS server. Itgives the user
38
- # a drop down to select the target and then command to send.
39
- # It then displays all the command parameters. Once a
40
- # command is sent it is added to the command history window which allows the
41
- # user to resend the command or copy it for use in a script.
42
- class CmdSender < QtTool
43
- slots 'file_send_raw()'
44
- slots 'update_cmd_params(bool)'
45
- slots 'menu_states_in_hex(bool)'
46
- slots 'target_changed(const QString&)'
47
- slots 'cmd_changed(const QString&)'
48
- slots 'send_button()'
49
- slots 'context_menu(const QPoint&)'
50
- slots 'click_callback(QTableWidgetItem*)'
51
-
52
- MANUALLY = "MANUALLY ENTERED"
53
-
54
- def self.send_count
55
- @@send_count
56
- end
57
-
58
- def self.send_count=(val)
59
- @@send_count = val
60
- end
61
-
62
- def self.param_widgets
63
- @@param_widgets
64
- end
65
-
66
- def self.table
67
- @@table
68
- end
69
-
70
- def initialize(options)
71
- # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
72
- super(options)
73
- Cosmos.load_cosmos_icon("cmd_sender.png")
74
-
75
- @file_dir = System.paths['LOGS']
76
- @message_log = MessageLog.new('cmdsender')
77
- @send_raw_dir = nil
78
- @@send_count = 0
79
- @@param_widgets = []
80
- @@table = nil
81
-
82
- initialize_actions()
83
- initialize_menus()
84
- initialize_central_widget()
85
- complete_initialize() # defined in qt_tool
86
- end
87
-
88
- def initialize_actions
89
- super()
90
-
91
- @send_raw_action = Qt::Action.new(Cosmos.get_icon('send_file.png'),
92
- tr('&Send Raw'),
93
- self)
94
- @send_raw_action.shortcut = Qt::KeySequence.new(tr('Ctrl+S'))
95
- @send_raw_action.statusTip = tr('Send raw data from a file')
96
- connect(@send_raw_action, SIGNAL('triggered()'), self, SLOT('file_send_raw()'))
97
-
98
- @ignore_range = Qt::Action.new(tr('&Ignore Range Checks'), self)
99
- @ignore_range.statusTip = tr('Ignore range checks when processing command')
100
- @ignore_range.setCheckable(true)
101
- @ignore_range.setChecked(false)
102
-
103
- @states_in_hex = Qt::Action.new(tr('&Display State Values in Hex'), self)
104
- @states_in_hex.statusTip = tr('Display states values in hex instead of decimal')
105
- @states_in_hex.setCheckable(true)
106
- @states_in_hex.setChecked(false)
107
- connect(@states_in_hex, SIGNAL('toggled(bool)'), self, SLOT('menu_states_in_hex(bool)'))
108
-
109
- @show_ignored = Qt::Action.new(tr('&Show Ignored Parameters'), self)
110
- @show_ignored.statusTip = tr('Show ignored parameters which are normally hidden')
111
- @show_ignored.setCheckable(true)
112
- @show_ignored.setChecked(false)
113
- connect(@show_ignored, SIGNAL('toggled(bool)'), self, SLOT('update_cmd_params(bool)'))
114
-
115
- @cmd_raw = Qt::Action.new(tr('Disable &Parameter Conversions'), self)
116
- @cmd_raw.statusTip = tr('Send the command without running write or state conversions')
117
- @cmd_raw.setCheckable(true)
118
- @cmd_raw.setChecked(false)
119
- end
120
-
121
- def initialize_menus
122
- # File Menu
123
- file_menu = menuBar.addMenu(tr('&File'))
124
- file_menu.addAction(@send_raw_action)
125
- file_menu.addAction(@exit_action)
126
- file_menu.insertSeparator(@exit_action)
127
-
128
- # Mode Menu
129
- mode_menu = menuBar.addMenu(tr('&Mode'))
130
- mode_menu.addAction(@ignore_range)
131
- mode_menu.addAction(@states_in_hex)
132
- mode_menu.addAction(@show_ignored)
133
- mode_menu.addAction(@cmd_raw)
134
-
135
- # Help Menu
136
- @about_string = "Command Sender allows the user to send any command defined in the system."
137
- initialize_help_menu()
138
- end
139
-
140
- def initialize_central_widget
141
- # Create the central widget
142
- central_widget = Qt::Widget.new
143
- setCentralWidget(central_widget)
144
-
145
- # Create the top half of the splitter window
146
- sender = Qt::Widget.new
147
-
148
- # Create the top level vertical layout
149
- top_layout = Qt::VBoxLayout.new(sender)
150
- # Set the size constraint to always respect the minimum sizes of the child widgets
151
- # If this is not set then when we refresh the command parameters they'll all be squished
152
- top_layout.setSizeConstraint(Qt::Layout::SetMinimumSize)
153
-
154
- # Set the target combobox selection
155
- @target_select = Qt::ComboBox.new
156
- @target_select.setMaxVisibleItems(6)
157
- connect(@target_select, SIGNAL('activated(const QString&)'), self, SLOT('target_changed(const QString&)'))
158
- target_label = Qt::Label.new(tr("&Target:"))
159
- target_label.setBuddy(@target_select)
160
-
161
- # Set the comamnd combobox selection
162
- @cmd_select = Qt::ComboBox.new
163
- @cmd_select.setMaxVisibleItems(20)
164
- connect(@cmd_select, SIGNAL('activated(const QString&)'), self, SLOT('cmd_changed(const QString&)'))
165
- cmd_label = Qt::Label.new(tr("&Command:"))
166
- cmd_label.setBuddy(@cmd_select)
167
-
168
- # Button to send command
169
- send = Qt::PushButton.new("Send")
170
- connect(send, SIGNAL('clicked()'), self, SLOT('send_button()'))
171
-
172
- # Layout the top level selection
173
- select_layout = Qt::HBoxLayout.new
174
- select_layout.addWidget(target_label)
175
- select_layout.addWidget(@target_select, 1)
176
- select_layout.addWidget(cmd_label)
177
- select_layout.addWidget(@cmd_select, 1)
178
- select_layout.addWidget(send)
179
- top_layout.addLayout(select_layout)
180
-
181
- # Separator Between Command Selection and Command Description
182
- sep1 = Qt::Frame.new(sender)
183
- sep1.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
184
- top_layout.addWidget(sep1)
185
-
186
- # Command Description Label
187
- dec_label = Qt::Label.new(tr("Description:"))
188
- @description = Qt::Label.new('')
189
- @description.setWordWrap(true)
190
- desc_layout = Qt::HBoxLayout.new
191
- desc_layout.addWidget(dec_label)
192
- desc_layout.addWidget(@description, 1)
193
- top_layout.addLayout(desc_layout)
194
-
195
- # Separator Between Command Selection and Description
196
- sep2 = Qt::Frame.new(sender)
197
- sep2.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
198
- top_layout.addWidget(sep2)
199
-
200
- # Parameters Label
201
- param_label = Qt::Label.new(tr("Parameters:"))
202
- top_layout.addWidget(param_label)
203
-
204
- # Grid Layout for Parameters
205
- @table_layout = Qt::VBoxLayout.new
206
- top_layout.addLayout(@table_layout, 500)
207
-
208
- # Add stretch to force everything to fit against the top of the window
209
- # otherwise the selection window, description, and parameters all try
210
- # to get equal space.
211
- top_layout.addStretch(1)
212
-
213
- # Create the text edit where previously issued commands go and where
214
- # commands can be manually typed in and re-executed
215
- @input = CmdSenderTextEdit.new(statusBar)
216
- @input.setFocus()
217
-
218
- layout = Qt::VBoxLayout.new
219
- layout.setSpacing(1)
220
- layout.setContentsMargins(1, 1, 1, 1)
221
- layout.setSizeConstraint(Qt::Layout::SetMaximumSize)
222
- layout.addWidget(Qt::Label.new("Command History: (Pressing Enter on the line re-executes the command)"))
223
- layout.addWidget(@input)
224
- history = Qt::Widget.new
225
- history.layout = layout
226
-
227
- # Create the scroll area
228
- scroll = Qt::ScrollArea.new
229
- scroll.setMinimumSize(500, 150)
230
- scroll.setWidgetResizable(true)
231
- scroll.setWidget(sender)
232
-
233
- splitter = Qt::Splitter.new(central_widget)
234
- splitter.setOrientation(Qt::Vertical)
235
- splitter.addWidget(scroll)
236
- splitter.addWidget(history)
237
- splitter.setStretchFactor(0,10)
238
- splitter.setStretchFactor(1,1)
239
-
240
- layout = Qt::VBoxLayout.new
241
- layout.setSpacing(1)
242
- layout.setContentsMargins(1, 1, 1, 1)
243
- layout.setSizeConstraint(Qt::Layout::SetMaximumSize)
244
- layout.addWidget(splitter)
245
- central_widget.layout = layout
246
-
247
- #Mark this window as the window for popups
248
- set_cmd_tlm_gui_window(self)
249
-
250
- # Bring up slash screen for long duration tasks after creation
251
- Splash.execute(self) do |splash|
252
- # Configure CosmosConfig to interact with splash screen
253
- ConfigParser.splash = splash
254
-
255
- System.commands
256
- Qt.execute_in_main_thread(true) do
257
- update_targets()
258
- update_commands()
259
- update_cmd_params()
260
- end
261
-
262
- # Unconfigure CosmosConfig to interact with splash screen
263
- ConfigParser.splash = nil
264
- end
265
- end
266
-
267
- def menu_states_in_hex(checked)
268
- @@param_widgets.each do |packet_item, value_item, state_value_item|
269
- if state_value_item
270
- text = state_value_item.text
271
- quotes_removed = text.remove_quotes
272
- if text == quotes_removed
273
- if checked
274
- if text.is_int?
275
- @@table.blockSignals(true)
276
- state_value_item.text = sprintf("0x%X", text.to_i)
277
- @@table.blockSignals(false)
278
- end
279
- else
280
- if text.is_hex?
281
- @@table.blockSignals(true)
282
- state_value_item.text = Integer(text).to_s
283
- @@table.blockSignals(false)
284
- end
285
- end
286
- end
287
- end
288
- end
289
- end
290
-
291
- def file_send_raw
292
- begin
293
- dialog = Qt::Dialog.new(self, Qt::WindowTitleHint | Qt::WindowSystemMenuHint)
294
- dialog.setWindowTitle("Send Raw Data From File")
295
- layout = Qt::GridLayout.new
296
- interfaces = Qt::ComboBox.new
297
- interfaces.addItems(get_interface_names())
298
- interfaces.setMaxVisibleItems(30)
299
- layout.addWidget(interfaces, 0, 1)
300
- int_label = Qt::Label.new(tr("&Interface:"))
301
- int_label.setBuddy(interfaces)
302
- layout.addWidget(int_label, 0, 0)
303
-
304
- file_line = Qt::LineEdit.new(@send_raw_dir)
305
- file_line.setMinimumSize(250, 0)
306
- file_label = Qt::Label.new(tr("&Filename:"))
307
- file_label.setBuddy(file_line)
308
- get_file = Qt::PushButton.new("Select")
309
- file_layout = Qt::BoxLayout.new(Qt::Horizontal)
310
- file_layout.addWidget(get_file)
311
- file_layout.addWidget(file_line)
312
- get_file.connect(SIGNAL('clicked()')) do
313
- Cosmos.set_working_dir do
314
- file_line.text = Qt::FileDialog::getOpenFileName(self, "Select File", @send_raw_dir, tr("Binary Files (*.bin);;All Files (*)"))
315
- end
316
- end
317
-
318
- layout.addWidget(file_label, 1, 0)
319
- layout.addLayout(file_layout, 1, 1)
320
-
321
- button_layout = Qt::BoxLayout.new(Qt::Horizontal)
322
- ok = Qt::PushButton.new("Ok")
323
- connect(ok, SIGNAL('clicked()'), dialog, SLOT('accept()'))
324
- button_layout.addWidget(ok)
325
- cancel = Qt::PushButton.new("Cancel")
326
- connect(cancel, SIGNAL('clicked()'), dialog, SLOT('reject()'))
327
- button_layout.addWidget(cancel)
328
- layout.addLayout(button_layout, 2, 0, 1 ,2)
329
-
330
- dialog.setLayout(layout)
331
- if dialog.exec == Qt::Dialog::Accepted
332
- @send_raw_dir = file_line.text
333
- Cosmos.set_working_dir do
334
- send_raw_file(interfaces.text, file_line.text)
335
- end
336
- statusBar.showMessage(tr("File #{file_line.text} sent to interface #{interfaces.text}"))
337
- end
338
- dialog.dispose
339
- rescue Exception => err
340
- message = "Error sending raw file due to #{err}"
341
- @message_log.write(Time.now.formatted + ' ' + message + "\n")
342
- statusBar.showMessage(message)
343
- rescue DRb::DRbConnError
344
- message = "Error Connecting to Command and Telemetry Server"
345
- @message_log.write(Time.now.formatted + ' ' + message + "\n")
346
- statusBar.showMessage(message)
347
- end
348
- end
349
-
350
- def closeEvent(event)
351
- shutdown_cmd_tlm()
352
- @message_log.stop
353
- super(event)
354
- end
355
-
356
- def target_changed(target)
357
- update_commands()
358
- update_cmd_params()
359
- end
360
-
361
- def cmd_changed(command)
362
- update_cmd_params()
363
- end
364
-
365
- def send_button
366
- begin
367
- target_name = @target_select.text
368
- packet_name = @cmd_select.text
369
- if target_name and packet_name
370
- output_string, params = view_as_script()
371
- @message_log.write(Time.now.formatted + ' ' + output_string + "\n")
372
- if @cmd_raw.checked?
373
- if @ignore_range.checked?
374
- cmd_raw_no_range_check(target_name, packet_name, params)
375
- else
376
- cmd_raw(target_name, packet_name, params)
377
- end
378
- else
379
- if @ignore_range.checked?
380
- cmd_no_range_check(target_name, packet_name, params)
381
- else
382
- cmd(target_name, packet_name, params)
383
- end
384
- end
385
-
386
- if statusBar.currentMessage != 'Hazardous command not sent'
387
- @@send_count += 1
388
- statusBar.showMessage("#{output_string} sent. (#{@@send_count})")
389
- @input.append(output_string)
390
- @input.moveCursor(Qt::TextCursor::End)
391
- @input.ensureCursorVisible()
392
- end
393
- end
394
- rescue DRb::DRbConnError
395
- message = "Error Connecting to Command and Telemetry Server"
396
- @message_log.write(Time.now.formatted + ' ' + message + "\n")
397
- statusBar.showMessage(message)
398
- Qt::MessageBox.critical(self, 'Error', message)
399
- rescue Exception => err
400
- message = "Error sending #{target_name} #{packet_name} due to #{err}"
401
- @message_log.write(Time.now.formatted + ' ' + message + "\n")
402
- statusBar.showMessage(message)
403
- Qt::MessageBox.critical(self, 'Error', message)
404
- end
405
- end
406
-
407
- def view_as_script
408
- params = {}
409
-
410
- @@param_widgets.each do |packet_item, value_item, state_value_item|
411
- text = value_item.text
412
-
413
- text = state_value_item.text if state_value_item and (text == MANUALLY or @cmd_raw.checked?)
414
- quotes_removed = text.remove_quotes
415
- if text == quotes_removed
416
- params[packet_item.name] = text.convert_to_value
417
- else
418
- params[packet_item.name] = quotes_removed
419
- end
420
- raise "#{packet_item.name} is required." if quotes_removed == '' and packet_item.required
421
- end
422
- statusBar.clearMessage()
423
-
424
- output_string = build_cmd_output_string(@target_select.text, @cmd_select.text, params, @cmd_raw.checked?)
425
- if output_string =~ /[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F-\xFF]/
426
- output_string = output_string.inspect.remove_quotes
427
- end
428
-
429
- if @cmd_raw.checked?
430
- if @ignore_range.checked?
431
- output_string.insert(7, '_no_range_check')
432
- end
433
- else
434
- if @ignore_range.checked?
435
- output_string.insert(3, '_no_range_check')
436
- end
437
- end
438
-
439
- return output_string, params
440
- end
441
-
442
- def update_targets
443
- @target_select.clearItems()
444
- target_names = System.commands.target_names
445
- target_names_to_delete = ['UNKNOWN']
446
- target_names.each do |target_name|
447
- found_non_hidden = false
448
- begin
449
- packets = System.commands.packets(target_name)
450
- packets.each do |packet_name, packet|
451
- found_non_hidden = true unless packet.hidden
452
- end
453
- rescue
454
- # Don't do anything
455
- end
456
- target_names_to_delete << target_name unless found_non_hidden
457
- end
458
- target_names_to_delete.each do |target_name|
459
- target_names.delete(target_name)
460
- end
461
- target_names.each do |target_name|
462
- @target_select.addItem(target_name)
463
- end
464
- end
465
-
466
- def update_commands
467
- @cmd_select.clearItems()
468
- target_name = @target_select.text
469
- if target_name
470
- commands = System.commands.packets(@target_select.text)
471
- command_names = []
472
- commands.each do |command_name, command|
473
- command_names << command_name unless command.hidden
474
- end
475
- command_names.sort!
476
- command_names.each do |command_name|
477
- @cmd_select.addItem(command_name)
478
- end
479
- end
480
- end
481
-
482
- def update_cmd_params(ignored_toggle = nil)
483
- old_params = {}
484
- if ignored_toggle.nil?
485
- ignored_toggle = false
486
- else
487
- ignored_toggle = true
488
- # Save parameter values
489
- @@param_widgets.each do |packet_item, value_item, state_value_item|
490
- text = value_item.text
491
- if state_value_item
492
- old_params[packet_item.name] = [text, state_value_item.text]
493
- else
494
- old_params[packet_item.name] = text
495
- end
496
- end
497
- end
498
-
499
- # Clear Status Bar
500
- statusBar.showMessage(tr(""))
501
-
502
- target_name = @target_select.text
503
- target = System.targets[target_name]
504
- packet_name = @cmd_select.text
505
- if target_name and packet_name
506
- packet = System.commands.packet(target_name, packet_name)
507
- packet_items = packet.sorted_items
508
- shown_packet_items = []
509
- packet_items.each do |packet_item|
510
- next if target and target.ignored_parameters.include?(packet_item.name) && !@show_ignored.checked?
511
- shown_packet_items << packet_item
512
- end
513
-
514
- # Update Command Description
515
- @description.text = packet.description.to_s
516
-
517
- # Destroy the old table widget
518
- @@table.dispose if @@table
519
- @@table = nil
520
-
521
- # Update Parameters
522
- @@param_widgets = []
523
- drawn_header = false
524
-
525
- row = 0
526
- shown_packet_items.each do |packet_item|
527
- next if target and target.ignored_parameters.include?(packet_item.name) && !@show_ignored.checked?
528
- value_item = nil
529
- state_value_item = nil
530
-
531
- unless drawn_header
532
- @@table = Qt::TableWidget.new()
533
- @@table.setSizePolicy(Qt::SizePolicy::Expanding, Qt::SizePolicy::Expanding)
534
- @@table.setWordWrap(true)
535
- @@table.setRowCount(shown_packet_items.length)
536
- @@table.setColumnCount(5)
537
- @@table.setHorizontalHeaderLabels(['Name', ' Value or State ', ' ', 'Units', 'Description'])
538
- @@table.horizontalHeader.setStretchLastSection(true)
539
- @@table.verticalHeader.setVisible(false)
540
- @@table.setItemDelegate(CmdSenderItemDelegate.new(@@table))
541
- @@table.setContextMenuPolicy(Qt::CustomContextMenu)
542
- @@table.verticalHeader.setResizeMode(Qt::HeaderView::ResizeToContents)
543
- @@table.setEditTriggers(Qt::AbstractItemView::AllEditTriggers)
544
- @@table.setSelectionMode(Qt::AbstractItemView::NoSelection)
545
- connect(@@table, SIGNAL('customContextMenuRequested(const QPoint&)'), self, SLOT('context_menu(const QPoint&)'))
546
- connect(@@table, SIGNAL('itemClicked(QTableWidgetItem*)'), self, SLOT('click_callback(QTableWidgetItem*)'))
547
- drawn_header = true
548
- end
549
-
550
- # Parameter Name
551
- item = Qt::TableWidgetItem.new("#{packet_item.name}:")
552
- item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
553
- item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
554
- @@table.setItem(row, 0, item)
555
-
556
- if packet_item.states
557
- default_state = packet_item.states.key(packet_item.default)
558
- if old_params[packet_item.name]
559
- value_item = Qt::TableWidgetItem.new(old_params[packet_item.name][0])
560
- else
561
- if default_state
562
- value_item = Qt::TableWidgetItem.new(default_state.to_s)
563
- else
564
- value_item = Qt::TableWidgetItem.new(MANUALLY)
565
- end
566
- end
567
- value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
568
- value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
569
- @@table.setItem(row, 1, value_item)
570
-
571
- if old_params[packet_item.name]
572
- state_value_item = Qt::TableWidgetItem.new(old_params[packet_item.name][1])
573
- else
574
- if @states_in_hex.checked? && packet_item.default.kind_of?(Integer)
575
- state_value_item = Qt::TableWidgetItem.new(sprintf("0x%X", packet_item.default))
576
- else
577
- state_value_item = Qt::TableWidgetItem.new(packet_item.default.to_s)
578
- end
579
- end
580
- state_value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
581
- state_value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
582
- @@table.setItem(row, 2, state_value_item)
583
-
584
- # If the parameter is required set the combobox to MANUAL and
585
- # clear the value field so they have to choose something
586
- if packet_item.required and !old_params[packet_item.name]
587
- value_item.setText(MANUALLY)
588
- state_value_item.setText('')
589
- end
590
- else
591
- # Parameter Value
592
- if old_params[packet_item.name]
593
- value_item = Qt::TableWidgetItem.new(old_params[packet_item.name])
594
- else
595
- if packet_item.required
596
- value_item = Qt::TableWidgetItem.new('')
597
- else
598
- if packet_item.format_string
599
- begin
600
- value_item = Qt::TableWidgetItem.new(sprintf(packet_item.format_string, packet_item.default))
601
- rescue
602
- # Oh well - Don't use the format string
603
- value_item = Qt::TableWidgetItem.new(packet_item.default.to_s)
604
- end
605
- else
606
- value_item = Qt::TableWidgetItem.new(packet_item.default.to_s)
607
- end
608
- end
609
- end
610
- value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
611
- value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
612
- @@table.setItem(row, 1, value_item)
613
- @@table.setSpan(row, 1, 1, 2)
614
- end
615
-
616
- # Units
617
- item = Qt::TableWidgetItem.new(packet_item.units.to_s)
618
- item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
619
- item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
620
- @@table.setItem(row, 3, item)
621
-
622
- # Description
623
- item = Qt::TableWidgetItem.new(packet_item.description.to_s)
624
- item.setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter)
625
- item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
626
- @@table.setItem(row, 4, item)
627
-
628
- @@param_widgets << [packet_item, value_item, state_value_item]
629
- row += 1
630
- end
631
-
632
- if @@table
633
- @@table.connect(SIGNAL('itemChanged(QTableWidgetItem*)')) do |item|
634
- packet_item, value_item, state_value_item = @@param_widgets[item.row]
635
- if item.column == 1
636
- if packet_item.states
637
- value = packet_item.states[value_item.text]
638
- @@table.blockSignals(true)
639
- if @states_in_hex.checked? && value.kind_of?(Integer)
640
- state_value_item.setText(sprintf("0x%X", value))
641
- else
642
- state_value_item.setText(value.to_s)
643
- end
644
- @@table.blockSignals(false)
645
- end
646
- elsif item.column == 2
647
- @@table.blockSignals(true)
648
- @@table.item(item.row, 1).setText(MANUALLY)
649
- @@table.blockSignals(false)
650
- end
651
- end
652
- @table_layout.addWidget(@@table, 500)
653
- @@table.resizeColumnsToContents()
654
- @@table.resizeRowsToContents()
655
- end
656
- end # if target_name and packet_name
657
- end
658
-
659
- def context_menu(point)
660
- target_name = @target_select.text
661
- packet_name = @cmd_select.text
662
- item = @@table.itemAt(point)
663
- if item
664
- item_name = @@table.item(item.row, 0).text[0..-2] # Remove :
665
- if target_name.length > 0 and packet_name.length > 0 and item_name.length > 0
666
- menu = Qt::Menu.new()
667
-
668
- details_action = Qt::Action.new(tr("Details #{target_name} #{packet_name} #{item_name}"), self)
669
- details_action.statusTip = tr("Popup details about #{target_name} #{packet_name} #{item_name}")
670
- details_action.connect(SIGNAL('triggered()')) do
671
- CmdDetailsDialog.new(nil, target_name, packet_name, item_name)
672
- end
673
- menu.addAction(details_action)
674
-
675
- file_chooser_action = Qt::Action.new(tr("Insert Filename"), self)
676
- file_chooser_action.statusTip = tr("Select a file and place its name into this parameter")
677
- file_chooser_action.connect(SIGNAL('triggered()')) do
678
- filename = Qt::FileDialog::getOpenFileName(self, "Insert Filename:", @file_dir, "All Files (*)")
679
- if filename and not filename.empty?
680
- @file_dir = File.dirname(filename)
681
- _, value_item, state_value_item = @@param_widgets[item.row]
682
- if state_value_item
683
- state_value_item.setText(filename)
684
- elsif value_item
685
- value_item.setText(filename)
686
- end
687
- end
688
- end
689
- menu.addAction(file_chooser_action)
690
-
691
- menu.exec(@@table.mapToGlobal(point))
692
- menu.dispose
693
- end
694
- end
695
- end
696
-
697
- def click_callback(item)
698
- @@table.editItem(item) if (item.flags & Qt::ItemIsEditable) != 0
699
- end
700
-
701
- def self.run (option_parser = nil, options = nil)
702
- Cosmos.catch_fatal_exception do
703
- unless option_parser && options
704
- option_parser, options = create_default_options()
705
- options.width = 600
706
- options.height = 425
707
- options.title = 'Command Sender'
708
- end
709
-
710
- super(option_parser, options)
711
- end
712
- end
713
-
714
- end # CmdSender
715
-
716
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos'
12
+ Cosmos.catch_fatal_exception do
13
+ require 'cosmos/script'
14
+ require 'cosmos/gui/qt_tool'
15
+ require 'cosmos/config/config_parser'
16
+ require 'cosmos/gui/text/completion'
17
+ require 'cosmos/gui/utilities/script_module_gui'
18
+ require 'cosmos/gui/dialogs/splash'
19
+ require 'cosmos/gui/dialogs/cmd_details_dialog'
20
+ require 'cosmos/tools/cmd_sender/cmd_sender_text_edit'
21
+ require 'cosmos/tools/cmd_sender/cmd_sender_item_delegate'
22
+ end
23
+
24
+ module Cosmos
25
+
26
+ Cosmos.disable_warnings do
27
+ module Script
28
+ def prompt_for_script_abort
29
+ window = get_cmd_tlm_gui_window()
30
+ window.statusBar.showMessage(tr("Hazardous command not sent"))
31
+ end
32
+ end #module Script
33
+ end
34
+
35
+ $eval_binding = binding()
36
+
37
+ # Command Sender sends commands to the COSMOS server. Itgives the user
38
+ # a drop down to select the target and then command to send.
39
+ # It then displays all the command parameters. Once a
40
+ # command is sent it is added to the command history window which allows the
41
+ # user to resend the command or copy it for use in a script.
42
+ class CmdSender < QtTool
43
+ slots 'file_send_raw()'
44
+ slots 'update_cmd_params(bool)'
45
+ slots 'menu_states_in_hex(bool)'
46
+ slots 'target_changed(const QString&)'
47
+ slots 'cmd_changed(const QString&)'
48
+ slots 'send_button()'
49
+ slots 'context_menu(const QPoint&)'
50
+ slots 'click_callback(QTableWidgetItem*)'
51
+
52
+ MANUALLY = "MANUALLY ENTERED"
53
+
54
+ def self.send_count
55
+ @@send_count
56
+ end
57
+
58
+ def self.send_count=(val)
59
+ @@send_count = val
60
+ end
61
+
62
+ def self.param_widgets
63
+ @@param_widgets
64
+ end
65
+
66
+ def self.table
67
+ @@table
68
+ end
69
+
70
+ def initialize(options)
71
+ # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
72
+ super(options)
73
+ Cosmos.load_cosmos_icon("cmd_sender.png")
74
+
75
+ @file_dir = System.paths['LOGS']
76
+ @message_log = MessageLog.new('cmdsender')
77
+ @send_raw_dir = nil
78
+ @@send_count = 0
79
+ @@param_widgets = []
80
+ @@table = nil
81
+
82
+ initialize_actions()
83
+ initialize_menus()
84
+ initialize_central_widget()
85
+ complete_initialize() # defined in qt_tool
86
+ end
87
+
88
+ def initialize_actions
89
+ super()
90
+
91
+ @send_raw_action = Qt::Action.new(Cosmos.get_icon('send_file.png'),
92
+ tr('&Send Raw'),
93
+ self)
94
+ @send_raw_action.shortcut = Qt::KeySequence.new(tr('Ctrl+S'))
95
+ @send_raw_action.statusTip = tr('Send raw data from a file')
96
+ connect(@send_raw_action, SIGNAL('triggered()'), self, SLOT('file_send_raw()'))
97
+
98
+ @ignore_range = Qt::Action.new(tr('&Ignore Range Checks'), self)
99
+ @ignore_range.statusTip = tr('Ignore range checks when processing command')
100
+ @ignore_range.setCheckable(true)
101
+ @ignore_range.setChecked(false)
102
+
103
+ @states_in_hex = Qt::Action.new(tr('&Display State Values in Hex'), self)
104
+ @states_in_hex.statusTip = tr('Display states values in hex instead of decimal')
105
+ @states_in_hex.setCheckable(true)
106
+ @states_in_hex.setChecked(false)
107
+ connect(@states_in_hex, SIGNAL('toggled(bool)'), self, SLOT('menu_states_in_hex(bool)'))
108
+
109
+ @show_ignored = Qt::Action.new(tr('&Show Ignored Parameters'), self)
110
+ @show_ignored.statusTip = tr('Show ignored parameters which are normally hidden')
111
+ @show_ignored.setCheckable(true)
112
+ @show_ignored.setChecked(false)
113
+ connect(@show_ignored, SIGNAL('toggled(bool)'), self, SLOT('update_cmd_params(bool)'))
114
+
115
+ @cmd_raw = Qt::Action.new(tr('Disable &Parameter Conversions'), self)
116
+ @cmd_raw.statusTip = tr('Send the command without running write or state conversions')
117
+ @cmd_raw.setCheckable(true)
118
+ @cmd_raw.setChecked(false)
119
+ end
120
+
121
+ def initialize_menus
122
+ # File Menu
123
+ file_menu = menuBar.addMenu(tr('&File'))
124
+ file_menu.addAction(@send_raw_action)
125
+ file_menu.addAction(@exit_action)
126
+ file_menu.insertSeparator(@exit_action)
127
+
128
+ # Mode Menu
129
+ mode_menu = menuBar.addMenu(tr('&Mode'))
130
+ mode_menu.addAction(@ignore_range)
131
+ mode_menu.addAction(@states_in_hex)
132
+ mode_menu.addAction(@show_ignored)
133
+ mode_menu.addAction(@cmd_raw)
134
+
135
+ # Help Menu
136
+ @about_string = "Command Sender allows the user to send any command defined in the system."
137
+ initialize_help_menu()
138
+ end
139
+
140
+ def initialize_central_widget
141
+ # Create the central widget
142
+ central_widget = Qt::Widget.new
143
+ setCentralWidget(central_widget)
144
+
145
+ # Create the top half of the splitter window
146
+ sender = Qt::Widget.new
147
+
148
+ # Create the top level vertical layout
149
+ top_layout = Qt::VBoxLayout.new(sender)
150
+ # Set the size constraint to always respect the minimum sizes of the child widgets
151
+ # If this is not set then when we refresh the command parameters they'll all be squished
152
+ top_layout.setSizeConstraint(Qt::Layout::SetMinimumSize)
153
+
154
+ # Set the target combobox selection
155
+ @target_select = Qt::ComboBox.new
156
+ @target_select.setMaxVisibleItems(6)
157
+ connect(@target_select, SIGNAL('activated(const QString&)'), self, SLOT('target_changed(const QString&)'))
158
+ target_label = Qt::Label.new(tr("&Target:"))
159
+ target_label.setBuddy(@target_select)
160
+
161
+ # Set the comamnd combobox selection
162
+ @cmd_select = Qt::ComboBox.new
163
+ @cmd_select.setMaxVisibleItems(20)
164
+ connect(@cmd_select, SIGNAL('activated(const QString&)'), self, SLOT('cmd_changed(const QString&)'))
165
+ cmd_label = Qt::Label.new(tr("&Command:"))
166
+ cmd_label.setBuddy(@cmd_select)
167
+
168
+ # Button to send command
169
+ send = Qt::PushButton.new("Send")
170
+ connect(send, SIGNAL('clicked()'), self, SLOT('send_button()'))
171
+
172
+ # Layout the top level selection
173
+ select_layout = Qt::HBoxLayout.new
174
+ select_layout.addWidget(target_label)
175
+ select_layout.addWidget(@target_select, 1)
176
+ select_layout.addWidget(cmd_label)
177
+ select_layout.addWidget(@cmd_select, 1)
178
+ select_layout.addWidget(send)
179
+ top_layout.addLayout(select_layout)
180
+
181
+ # Separator Between Command Selection and Command Description
182
+ sep1 = Qt::Frame.new(sender)
183
+ sep1.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
184
+ top_layout.addWidget(sep1)
185
+
186
+ # Command Description Label
187
+ dec_label = Qt::Label.new(tr("Description:"))
188
+ @description = Qt::Label.new('')
189
+ @description.setWordWrap(true)
190
+ desc_layout = Qt::HBoxLayout.new
191
+ desc_layout.addWidget(dec_label)
192
+ desc_layout.addWidget(@description, 1)
193
+ top_layout.addLayout(desc_layout)
194
+
195
+ # Separator Between Command Selection and Description
196
+ sep2 = Qt::Frame.new(sender)
197
+ sep2.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
198
+ top_layout.addWidget(sep2)
199
+
200
+ # Parameters Label
201
+ param_label = Qt::Label.new(tr("Parameters:"))
202
+ top_layout.addWidget(param_label)
203
+
204
+ # Grid Layout for Parameters
205
+ @table_layout = Qt::VBoxLayout.new
206
+ top_layout.addLayout(@table_layout, 500)
207
+
208
+ # Add stretch to force everything to fit against the top of the window
209
+ # otherwise the selection window, description, and parameters all try
210
+ # to get equal space.
211
+ top_layout.addStretch(1)
212
+
213
+ # Create the text edit where previously issued commands go and where
214
+ # commands can be manually typed in and re-executed
215
+ @input = CmdSenderTextEdit.new(statusBar)
216
+ @input.setFocus()
217
+
218
+ layout = Qt::VBoxLayout.new
219
+ layout.setSpacing(1)
220
+ layout.setContentsMargins(1, 1, 1, 1)
221
+ layout.setSizeConstraint(Qt::Layout::SetMaximumSize)
222
+ layout.addWidget(Qt::Label.new("Command History: (Pressing Enter on the line re-executes the command)"))
223
+ layout.addWidget(@input)
224
+ history = Qt::Widget.new
225
+ history.layout = layout
226
+
227
+ # Create the scroll area
228
+ scroll = Qt::ScrollArea.new
229
+ scroll.setMinimumSize(500, 150)
230
+ scroll.setWidgetResizable(true)
231
+ scroll.setWidget(sender)
232
+
233
+ splitter = Qt::Splitter.new(central_widget)
234
+ splitter.setOrientation(Qt::Vertical)
235
+ splitter.addWidget(scroll)
236
+ splitter.addWidget(history)
237
+ splitter.setStretchFactor(0,10)
238
+ splitter.setStretchFactor(1,1)
239
+
240
+ layout = Qt::VBoxLayout.new
241
+ layout.setSpacing(1)
242
+ layout.setContentsMargins(1, 1, 1, 1)
243
+ layout.setSizeConstraint(Qt::Layout::SetMaximumSize)
244
+ layout.addWidget(splitter)
245
+ central_widget.layout = layout
246
+
247
+ #Mark this window as the window for popups
248
+ set_cmd_tlm_gui_window(self)
249
+
250
+ # Bring up slash screen for long duration tasks after creation
251
+ Splash.execute(self) do |splash|
252
+ # Configure CosmosConfig to interact with splash screen
253
+ ConfigParser.splash = splash
254
+
255
+ System.commands
256
+ Qt.execute_in_main_thread(true) do
257
+ update_targets()
258
+ update_commands()
259
+ update_cmd_params()
260
+ end
261
+
262
+ # Unconfigure CosmosConfig to interact with splash screen
263
+ ConfigParser.splash = nil
264
+ end
265
+ end
266
+
267
+ def menu_states_in_hex(checked)
268
+ @@param_widgets.each do |packet_item, value_item, state_value_item|
269
+ if state_value_item
270
+ text = state_value_item.text
271
+ quotes_removed = text.remove_quotes
272
+ if text == quotes_removed
273
+ if checked
274
+ if text.is_int?
275
+ @@table.blockSignals(true)
276
+ state_value_item.text = sprintf("0x%X", text.to_i)
277
+ @@table.blockSignals(false)
278
+ end
279
+ else
280
+ if text.is_hex?
281
+ @@table.blockSignals(true)
282
+ state_value_item.text = Integer(text).to_s
283
+ @@table.blockSignals(false)
284
+ end
285
+ end
286
+ end
287
+ end
288
+ end
289
+ end
290
+
291
+ def file_send_raw
292
+ begin
293
+ dialog = Qt::Dialog.new(self, Qt::WindowTitleHint | Qt::WindowSystemMenuHint)
294
+ dialog.setWindowTitle("Send Raw Data From File")
295
+ layout = Qt::GridLayout.new
296
+ interfaces = Qt::ComboBox.new
297
+ interfaces.addItems(get_interface_names())
298
+ interfaces.setMaxVisibleItems(30)
299
+ layout.addWidget(interfaces, 0, 1)
300
+ int_label = Qt::Label.new(tr("&Interface:"))
301
+ int_label.setBuddy(interfaces)
302
+ layout.addWidget(int_label, 0, 0)
303
+
304
+ file_line = Qt::LineEdit.new(@send_raw_dir)
305
+ file_line.setMinimumSize(250, 0)
306
+ file_label = Qt::Label.new(tr("&Filename:"))
307
+ file_label.setBuddy(file_line)
308
+ get_file = Qt::PushButton.new("Select")
309
+ file_layout = Qt::BoxLayout.new(Qt::Horizontal)
310
+ file_layout.addWidget(get_file)
311
+ file_layout.addWidget(file_line)
312
+ get_file.connect(SIGNAL('clicked()')) do
313
+ Cosmos.set_working_dir do
314
+ file_line.text = Qt::FileDialog::getOpenFileName(self, "Select File", @send_raw_dir, tr("Binary Files (*.bin);;All Files (*)"))
315
+ end
316
+ end
317
+
318
+ layout.addWidget(file_label, 1, 0)
319
+ layout.addLayout(file_layout, 1, 1)
320
+
321
+ button_layout = Qt::BoxLayout.new(Qt::Horizontal)
322
+ ok = Qt::PushButton.new("Ok")
323
+ connect(ok, SIGNAL('clicked()'), dialog, SLOT('accept()'))
324
+ button_layout.addWidget(ok)
325
+ cancel = Qt::PushButton.new("Cancel")
326
+ connect(cancel, SIGNAL('clicked()'), dialog, SLOT('reject()'))
327
+ button_layout.addWidget(cancel)
328
+ layout.addLayout(button_layout, 2, 0, 1 ,2)
329
+
330
+ dialog.setLayout(layout)
331
+ if dialog.exec == Qt::Dialog::Accepted
332
+ @send_raw_dir = file_line.text
333
+ Cosmos.set_working_dir do
334
+ send_raw_file(interfaces.text, file_line.text)
335
+ end
336
+ statusBar.showMessage(tr("File #{file_line.text} sent to interface #{interfaces.text}"))
337
+ end
338
+ dialog.dispose
339
+ rescue Exception => err
340
+ message = "Error sending raw file due to #{err}"
341
+ @message_log.write(Time.now.formatted + ' ' + message + "\n")
342
+ statusBar.showMessage(message)
343
+ rescue DRb::DRbConnError
344
+ message = "Error Connecting to Command and Telemetry Server"
345
+ @message_log.write(Time.now.formatted + ' ' + message + "\n")
346
+ statusBar.showMessage(message)
347
+ end
348
+ end
349
+
350
+ def closeEvent(event)
351
+ shutdown_cmd_tlm()
352
+ @message_log.stop
353
+ super(event)
354
+ end
355
+
356
+ def target_changed(target)
357
+ update_commands()
358
+ update_cmd_params()
359
+ end
360
+
361
+ def cmd_changed(command)
362
+ update_cmd_params()
363
+ end
364
+
365
+ def send_button
366
+ begin
367
+ target_name = @target_select.text
368
+ packet_name = @cmd_select.text
369
+ if target_name and packet_name
370
+ output_string, params = view_as_script()
371
+ @message_log.write(Time.now.formatted + ' ' + output_string + "\n")
372
+ if @cmd_raw.checked?
373
+ if @ignore_range.checked?
374
+ cmd_raw_no_range_check(target_name, packet_name, params)
375
+ else
376
+ cmd_raw(target_name, packet_name, params)
377
+ end
378
+ else
379
+ if @ignore_range.checked?
380
+ cmd_no_range_check(target_name, packet_name, params)
381
+ else
382
+ cmd(target_name, packet_name, params)
383
+ end
384
+ end
385
+
386
+ if statusBar.currentMessage != 'Hazardous command not sent'
387
+ @@send_count += 1
388
+ statusBar.showMessage("#{output_string} sent. (#{@@send_count})")
389
+ @input.append(output_string)
390
+ @input.moveCursor(Qt::TextCursor::End)
391
+ @input.ensureCursorVisible()
392
+ end
393
+ end
394
+ rescue DRb::DRbConnError
395
+ message = "Error Connecting to Command and Telemetry Server"
396
+ @message_log.write(Time.now.formatted + ' ' + message + "\n")
397
+ statusBar.showMessage(message)
398
+ Qt::MessageBox.critical(self, 'Error', message)
399
+ rescue Exception => err
400
+ message = "Error sending #{target_name} #{packet_name} due to #{err}"
401
+ @message_log.write(Time.now.formatted + ' ' + message + "\n")
402
+ statusBar.showMessage(message)
403
+ Qt::MessageBox.critical(self, 'Error', message)
404
+ end
405
+ end
406
+
407
+ def view_as_script
408
+ params = {}
409
+
410
+ @@param_widgets.each do |packet_item, value_item, state_value_item|
411
+ text = value_item.text
412
+
413
+ text = state_value_item.text if state_value_item and (text == MANUALLY or @cmd_raw.checked?)
414
+ quotes_removed = text.remove_quotes
415
+ if text == quotes_removed
416
+ params[packet_item.name] = text.convert_to_value
417
+ else
418
+ params[packet_item.name] = quotes_removed
419
+ end
420
+ raise "#{packet_item.name} is required." if quotes_removed == '' and packet_item.required
421
+ end
422
+ statusBar.clearMessage()
423
+
424
+ output_string = build_cmd_output_string(@target_select.text, @cmd_select.text, params, @cmd_raw.checked?)
425
+ if output_string =~ /[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F-\xFF]/
426
+ output_string = output_string.inspect.remove_quotes
427
+ end
428
+
429
+ if @cmd_raw.checked?
430
+ if @ignore_range.checked?
431
+ output_string.insert(7, '_no_range_check')
432
+ end
433
+ else
434
+ if @ignore_range.checked?
435
+ output_string.insert(3, '_no_range_check')
436
+ end
437
+ end
438
+
439
+ return output_string, params
440
+ end
441
+
442
+ def update_targets
443
+ @target_select.clearItems()
444
+ target_names = System.commands.target_names
445
+ target_names_to_delete = ['UNKNOWN']
446
+ target_names.each do |target_name|
447
+ found_non_hidden = false
448
+ begin
449
+ packets = System.commands.packets(target_name)
450
+ packets.each do |packet_name, packet|
451
+ found_non_hidden = true unless packet.hidden
452
+ end
453
+ rescue
454
+ # Don't do anything
455
+ end
456
+ target_names_to_delete << target_name unless found_non_hidden
457
+ end
458
+ target_names_to_delete.each do |target_name|
459
+ target_names.delete(target_name)
460
+ end
461
+ target_names.each do |target_name|
462
+ @target_select.addItem(target_name)
463
+ end
464
+ end
465
+
466
+ def update_commands
467
+ @cmd_select.clearItems()
468
+ target_name = @target_select.text
469
+ if target_name
470
+ commands = System.commands.packets(@target_select.text)
471
+ command_names = []
472
+ commands.each do |command_name, command|
473
+ command_names << command_name unless command.hidden
474
+ end
475
+ command_names.sort!
476
+ command_names.each do |command_name|
477
+ @cmd_select.addItem(command_name)
478
+ end
479
+ end
480
+ end
481
+
482
+ def update_cmd_params(ignored_toggle = nil)
483
+ old_params = {}
484
+ if ignored_toggle.nil?
485
+ ignored_toggle = false
486
+ else
487
+ ignored_toggle = true
488
+ # Save parameter values
489
+ @@param_widgets.each do |packet_item, value_item, state_value_item|
490
+ text = value_item.text
491
+ if state_value_item
492
+ old_params[packet_item.name] = [text, state_value_item.text]
493
+ else
494
+ old_params[packet_item.name] = text
495
+ end
496
+ end
497
+ end
498
+
499
+ # Clear Status Bar
500
+ statusBar.showMessage(tr(""))
501
+
502
+ target_name = @target_select.text
503
+ target = System.targets[target_name]
504
+ packet_name = @cmd_select.text
505
+ if target_name and packet_name
506
+ packet = System.commands.packet(target_name, packet_name)
507
+ packet_items = packet.sorted_items
508
+ shown_packet_items = []
509
+ packet_items.each do |packet_item|
510
+ next if target and target.ignored_parameters.include?(packet_item.name) && !@show_ignored.checked?
511
+ shown_packet_items << packet_item
512
+ end
513
+
514
+ # Update Command Description
515
+ @description.text = packet.description.to_s
516
+
517
+ # Destroy the old table widget
518
+ @@table.dispose if @@table
519
+ @@table = nil
520
+
521
+ # Update Parameters
522
+ @@param_widgets = []
523
+ drawn_header = false
524
+
525
+ row = 0
526
+ shown_packet_items.each do |packet_item|
527
+ next if target and target.ignored_parameters.include?(packet_item.name) && !@show_ignored.checked?
528
+ value_item = nil
529
+ state_value_item = nil
530
+
531
+ unless drawn_header
532
+ @@table = Qt::TableWidget.new()
533
+ @@table.setSizePolicy(Qt::SizePolicy::Expanding, Qt::SizePolicy::Expanding)
534
+ @@table.setWordWrap(true)
535
+ @@table.setRowCount(shown_packet_items.length)
536
+ @@table.setColumnCount(5)
537
+ @@table.setHorizontalHeaderLabels(['Name', ' Value or State ', ' ', 'Units', 'Description'])
538
+ @@table.horizontalHeader.setStretchLastSection(true)
539
+ @@table.verticalHeader.setVisible(false)
540
+ @@table.setItemDelegate(CmdSenderItemDelegate.new(@@table))
541
+ @@table.setContextMenuPolicy(Qt::CustomContextMenu)
542
+ @@table.verticalHeader.setResizeMode(Qt::HeaderView::ResizeToContents)
543
+ @@table.setEditTriggers(Qt::AbstractItemView::AllEditTriggers)
544
+ @@table.setSelectionMode(Qt::AbstractItemView::NoSelection)
545
+ connect(@@table, SIGNAL('customContextMenuRequested(const QPoint&)'), self, SLOT('context_menu(const QPoint&)'))
546
+ connect(@@table, SIGNAL('itemClicked(QTableWidgetItem*)'), self, SLOT('click_callback(QTableWidgetItem*)'))
547
+ drawn_header = true
548
+ end
549
+
550
+ # Parameter Name
551
+ item = Qt::TableWidgetItem.new("#{packet_item.name}:")
552
+ item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
553
+ item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
554
+ @@table.setItem(row, 0, item)
555
+
556
+ if packet_item.states
557
+ default_state = packet_item.states.key(packet_item.default)
558
+ if old_params[packet_item.name]
559
+ value_item = Qt::TableWidgetItem.new(old_params[packet_item.name][0])
560
+ else
561
+ if default_state
562
+ value_item = Qt::TableWidgetItem.new(default_state.to_s)
563
+ else
564
+ value_item = Qt::TableWidgetItem.new(MANUALLY)
565
+ end
566
+ end
567
+ value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
568
+ value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
569
+ @@table.setItem(row, 1, value_item)
570
+
571
+ if old_params[packet_item.name]
572
+ state_value_item = Qt::TableWidgetItem.new(old_params[packet_item.name][1])
573
+ else
574
+ if @states_in_hex.checked? && packet_item.default.kind_of?(Integer)
575
+ state_value_item = Qt::TableWidgetItem.new(sprintf("0x%X", packet_item.default))
576
+ else
577
+ state_value_item = Qt::TableWidgetItem.new(packet_item.default.to_s)
578
+ end
579
+ end
580
+ state_value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
581
+ state_value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
582
+ @@table.setItem(row, 2, state_value_item)
583
+
584
+ # If the parameter is required set the combobox to MANUAL and
585
+ # clear the value field so they have to choose something
586
+ if packet_item.required and !old_params[packet_item.name]
587
+ value_item.setText(MANUALLY)
588
+ state_value_item.setText('')
589
+ end
590
+ else
591
+ # Parameter Value
592
+ if old_params[packet_item.name]
593
+ value_item = Qt::TableWidgetItem.new(old_params[packet_item.name])
594
+ else
595
+ if packet_item.required
596
+ value_item = Qt::TableWidgetItem.new('')
597
+ else
598
+ if packet_item.format_string
599
+ begin
600
+ value_item = Qt::TableWidgetItem.new(sprintf(packet_item.format_string, packet_item.default))
601
+ rescue
602
+ # Oh well - Don't use the format string
603
+ value_item = Qt::TableWidgetItem.new(packet_item.default.to_s)
604
+ end
605
+ else
606
+ value_item = Qt::TableWidgetItem.new(packet_item.default.to_s)
607
+ end
608
+ end
609
+ end
610
+ value_item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
611
+ value_item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable)
612
+ @@table.setItem(row, 1, value_item)
613
+ @@table.setSpan(row, 1, 1, 2)
614
+ end
615
+
616
+ # Units
617
+ item = Qt::TableWidgetItem.new(packet_item.units.to_s)
618
+ item.setTextAlignment(Qt::AlignRight | Qt::AlignVCenter)
619
+ item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
620
+ @@table.setItem(row, 3, item)
621
+
622
+ # Description
623
+ item = Qt::TableWidgetItem.new(packet_item.description.to_s)
624
+ item.setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter)
625
+ item.setFlags(Qt::NoItemFlags | Qt::ItemIsSelectable | Qt::ItemIsEnabled)
626
+ @@table.setItem(row, 4, item)
627
+
628
+ @@param_widgets << [packet_item, value_item, state_value_item]
629
+ row += 1
630
+ end
631
+
632
+ if @@table
633
+ @@table.connect(SIGNAL('itemChanged(QTableWidgetItem*)')) do |item|
634
+ packet_item, value_item, state_value_item = @@param_widgets[item.row]
635
+ if item.column == 1
636
+ if packet_item.states
637
+ value = packet_item.states[value_item.text]
638
+ @@table.blockSignals(true)
639
+ if @states_in_hex.checked? && value.kind_of?(Integer)
640
+ state_value_item.setText(sprintf("0x%X", value))
641
+ else
642
+ state_value_item.setText(value.to_s)
643
+ end
644
+ @@table.blockSignals(false)
645
+ end
646
+ elsif item.column == 2
647
+ @@table.blockSignals(true)
648
+ @@table.item(item.row, 1).setText(MANUALLY)
649
+ @@table.blockSignals(false)
650
+ end
651
+ end
652
+ @table_layout.addWidget(@@table, 500)
653
+ @@table.resizeColumnsToContents()
654
+ @@table.resizeRowsToContents()
655
+ end
656
+ end # if target_name and packet_name
657
+ end
658
+
659
+ def context_menu(point)
660
+ target_name = @target_select.text
661
+ packet_name = @cmd_select.text
662
+ item = @@table.itemAt(point)
663
+ if item
664
+ item_name = @@table.item(item.row, 0).text[0..-2] # Remove :
665
+ if target_name.length > 0 and packet_name.length > 0 and item_name.length > 0
666
+ menu = Qt::Menu.new()
667
+
668
+ details_action = Qt::Action.new(tr("Details #{target_name} #{packet_name} #{item_name}"), self)
669
+ details_action.statusTip = tr("Popup details about #{target_name} #{packet_name} #{item_name}")
670
+ details_action.connect(SIGNAL('triggered()')) do
671
+ CmdDetailsDialog.new(nil, target_name, packet_name, item_name)
672
+ end
673
+ menu.addAction(details_action)
674
+
675
+ file_chooser_action = Qt::Action.new(tr("Insert Filename"), self)
676
+ file_chooser_action.statusTip = tr("Select a file and place its name into this parameter")
677
+ file_chooser_action.connect(SIGNAL('triggered()')) do
678
+ filename = Qt::FileDialog::getOpenFileName(self, "Insert Filename:", @file_dir, "All Files (*)")
679
+ if filename and not filename.empty?
680
+ @file_dir = File.dirname(filename)
681
+ _, value_item, state_value_item = @@param_widgets[item.row]
682
+ if state_value_item
683
+ state_value_item.setText(filename)
684
+ elsif value_item
685
+ value_item.setText(filename)
686
+ end
687
+ end
688
+ end
689
+ menu.addAction(file_chooser_action)
690
+
691
+ menu.exec(@@table.mapToGlobal(point))
692
+ menu.dispose
693
+ end
694
+ end
695
+ end
696
+
697
+ def click_callback(item)
698
+ @@table.editItem(item) if (item.flags & Qt::ItemIsEditable) != 0
699
+ end
700
+
701
+ def self.run (option_parser = nil, options = nil)
702
+ Cosmos.catch_fatal_exception do
703
+ unless option_parser && options
704
+ option_parser, options = create_default_options()
705
+ options.width = 600
706
+ options.height = 425
707
+ options.title = 'Command Sender'
708
+ end
709
+
710
+ super(option_parser, options)
711
+ end
712
+ end
713
+
714
+ end # CmdSender
715
+
716
+ end # module Cosmos