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,77 +1,77 @@
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
- module Cosmos
12
-
13
- class CmdSenderItemDelegate < Qt::StyledItemDelegate
14
- def initialize(parent)
15
- @table = parent
16
- super(parent)
17
- end
18
-
19
- def createEditor(parent, option, index)
20
- packet_item, _, _ = CmdSender.param_widgets[index.row]
21
- if index.column == 1 and packet_item and packet_item.states
22
- combo = Qt::ComboBox.new(parent)
23
- sorted_states = packet_item.states.sort {|a, b| a[1] <=> b[1]}
24
- items = sorted_states.map {|state_name, state_value| state_name}
25
- items << CmdSender::MANUALLY
26
- combo.addItems(items)
27
- combo.setCurrentText(@table.item(index.row, index.column).text.to_s)
28
- combo.setMaxVisibleItems(6)
29
- connect(combo, SIGNAL('activated(int)')) do
30
- emit commitData(combo)
31
- CmdSender.table.closeEditor(combo, 0)
32
- end
33
- return combo
34
- else
35
- return super(parent, option, index)
36
- end
37
- end
38
-
39
- def paint(painter, option, index)
40
- packet_item, _, _ = CmdSender.param_widgets[index.row]
41
- if index.column == 1 and packet_item and packet_item.states
42
- # This code simply draws the current combo box text inside a button to
43
- # give the user an idea that they have to click it to activate it
44
- opt = Qt::StyleOptionButton.new
45
- opt.rect = option.rect
46
- opt.text = @table.item(index.row, index.column).text.to_s
47
- Qt::Application.style.drawControl(Qt::Style::CE_PushButton, opt, painter)
48
- opt.dispose
49
- else
50
- super(painter, option, index)
51
- end
52
- end
53
-
54
- def setModelData(editor, model, index)
55
- if Qt::ComboBox === editor
56
- model.setData(index, Qt::Variant.new(editor.currentText), Qt::EditRole)
57
- else
58
- super(editor, model, index)
59
- end
60
- end
61
-
62
- def setEditorData(editor, index)
63
- if Qt::ComboBox === editor
64
- v = index.data(Qt::EditRole)
65
- combo_index = editor.findText(v.toString)
66
- if combo_index >= 0
67
- editor.setCurrentIndex(combo_index)
68
- else
69
- editor.setCurrentIndex(0)
70
- end
71
- else
72
- super(editor, index)
73
- end
74
- end
75
- end
76
-
77
- 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
+ module Cosmos
12
+
13
+ class CmdSenderItemDelegate < Qt::StyledItemDelegate
14
+ def initialize(parent)
15
+ @table = parent
16
+ super(parent)
17
+ end
18
+
19
+ def createEditor(parent, option, index)
20
+ packet_item, _, _ = CmdSender.param_widgets[index.row]
21
+ if index.column == 1 and packet_item and packet_item.states
22
+ combo = Qt::ComboBox.new(parent)
23
+ sorted_states = packet_item.states.sort {|a, b| a[1] <=> b[1]}
24
+ items = sorted_states.map {|state_name, state_value| state_name}
25
+ items << CmdSender::MANUALLY
26
+ combo.addItems(items)
27
+ combo.setCurrentText(@table.item(index.row, index.column).text.to_s)
28
+ combo.setMaxVisibleItems(6)
29
+ connect(combo, SIGNAL('activated(int)')) do
30
+ emit commitData(combo)
31
+ CmdSender.table.closeEditor(combo, 0)
32
+ end
33
+ return combo
34
+ else
35
+ return super(parent, option, index)
36
+ end
37
+ end
38
+
39
+ def paint(painter, option, index)
40
+ packet_item, _, _ = CmdSender.param_widgets[index.row]
41
+ if index.column == 1 and packet_item and packet_item.states
42
+ # This code simply draws the current combo box text inside a button to
43
+ # give the user an idea that they have to click it to activate it
44
+ opt = Qt::StyleOptionButton.new
45
+ opt.rect = option.rect
46
+ opt.text = @table.item(index.row, index.column).text.to_s
47
+ Qt::Application.style.drawControl(Qt::Style::CE_PushButton, opt, painter)
48
+ opt.dispose
49
+ else
50
+ super(painter, option, index)
51
+ end
52
+ end
53
+
54
+ def setModelData(editor, model, index)
55
+ if Qt::ComboBox === editor
56
+ model.setData(index, Qt::Variant.new(editor.currentText), Qt::EditRole)
57
+ else
58
+ super(editor, model, index)
59
+ end
60
+ end
61
+
62
+ def setEditorData(editor, index)
63
+ if Qt::ComboBox === editor
64
+ v = index.data(Qt::EditRole)
65
+ combo_index = editor.findText(v.toString)
66
+ if combo_index >= 0
67
+ editor.setCurrentIndex(combo_index)
68
+ else
69
+ editor.setCurrentIndex(0)
70
+ end
71
+ else
72
+ super(editor, index)
73
+ end
74
+ end
75
+ end
76
+
77
+ end # module Cosmos
@@ -1,70 +1,70 @@
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
- module Cosmos
12
- # CmdSenderTextEdit is a subclass of TextEdit that creates a CosmosCompletion class to
13
- # allow for code completion when creating new commands in the command history
14
- # window. It also monitors for the Enter key to allow for commands in the
15
- # command history to be executed.
16
- class CmdSenderTextEdit < Qt::TextEdit
17
- def initialize(status_bar)
18
- super()
19
- @status_bar = status_bar
20
- @c = Completion.new(self)
21
- end
22
-
23
- def keyPressEvent(event)
24
- # If the completion popup is visible then ignore the event and allow the popup to handle it
25
- if (@c and @c.popup.isVisible)
26
- case event.key
27
- when Qt::Key_Return, Qt::Key_Enter
28
- event.ignore
29
- return
30
- end
31
- end
32
-
33
- case event.key
34
- # The return key means we need to execute the current line
35
- when Qt::Key_Return, Qt::Key_Enter
36
- # If the cursor is at the beginning of the line allow the newline
37
- if textCursor.atBlockStart
38
- super(event)
39
- # If the line isn't blank then execute it
40
- elsif textCursor.block.text.strip != ""
41
- begin
42
- eval(textCursor.block.text, $eval_binding)
43
- CmdSender.send_count += 1
44
- @status_bar.showMessage("#{textCursor.block.text} sent. (#{CmdSender.send_count})")
45
- rescue Exception => error
46
- if error.class == DRb::DRbConnError
47
- message = "Error Connecting to Command and Telemetry Server"
48
- else
49
- message = "Error sending command due to #{error}"
50
- end
51
- @status_bar.showMessage(message)
52
- Qt::MessageBox.critical(self, 'Error', message)
53
- end
54
- end
55
- # Handle Key_Down to automatically create a newline if they Key_Down at
56
- # the bottom of the document
57
- when Qt::Key_Down
58
- # If the number of lines equals the current line (plus one since it is 0
59
- # based) then we append a newline to allow the Key_Down to go to a new line
60
- if self.toPlainText.split("\n").length == (textCursor.block.blockNumber + 1)
61
- self.append("")
62
- end
63
- super(event)
64
- else # All other keys are handled by this widget as well as being passed to the completion handler
65
- super(event)
66
- @c.handle_keypress(event)
67
- end
68
- end
69
- end
70
- 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
+ module Cosmos
12
+ # CmdSenderTextEdit is a subclass of TextEdit that creates a CosmosCompletion class to
13
+ # allow for code completion when creating new commands in the command history
14
+ # window. It also monitors for the Enter key to allow for commands in the
15
+ # command history to be executed.
16
+ class CmdSenderTextEdit < Qt::TextEdit
17
+ def initialize(status_bar)
18
+ super()
19
+ @status_bar = status_bar
20
+ @c = Completion.new(self)
21
+ end
22
+
23
+ def keyPressEvent(event)
24
+ # If the completion popup is visible then ignore the event and allow the popup to handle it
25
+ if (@c and @c.popup.isVisible)
26
+ case event.key
27
+ when Qt::Key_Return, Qt::Key_Enter
28
+ event.ignore
29
+ return
30
+ end
31
+ end
32
+
33
+ case event.key
34
+ # The return key means we need to execute the current line
35
+ when Qt::Key_Return, Qt::Key_Enter
36
+ # If the cursor is at the beginning of the line allow the newline
37
+ if textCursor.atBlockStart
38
+ super(event)
39
+ # If the line isn't blank then execute it
40
+ elsif textCursor.block.text.strip != ""
41
+ begin
42
+ eval(textCursor.block.text, $eval_binding)
43
+ CmdSender.send_count += 1
44
+ @status_bar.showMessage("#{textCursor.block.text} sent. (#{CmdSender.send_count})")
45
+ rescue Exception => error
46
+ if error.class == DRb::DRbConnError
47
+ message = "Error Connecting to Command and Telemetry Server"
48
+ else
49
+ message = "Error sending command due to #{error}"
50
+ end
51
+ @status_bar.showMessage(message)
52
+ Qt::MessageBox.critical(self, 'Error', message)
53
+ end
54
+ end
55
+ # Handle Key_Down to automatically create a newline if they Key_Down at
56
+ # the bottom of the document
57
+ when Qt::Key_Down
58
+ # If the number of lines equals the current line (plus one since it is 0
59
+ # based) then we append a newline to allow the Key_Down to go to a new line
60
+ if self.toPlainText.split("\n").length == (textCursor.block.blockNumber + 1)
61
+ self.append("")
62
+ end
63
+ super(event)
64
+ else # All other keys are handled by this widget as well as being passed to the completion handler
65
+ super(event)
66
+ @c.handle_keypress(event)
67
+ end
68
+ end
69
+ end
70
+ end # module Cosmos
@@ -1,940 +1,936 @@
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/script/extract'
12
-
13
- module Cosmos
14
-
15
- module Api
16
- include Extract
17
-
18
- # Sets api_requests to 0 and initializes the whitelist of allowable API
19
- # method calls
20
- def initialize
21
- @api_whitelist = [
22
- 'cmd',
23
- 'cmd_no_range_check',
24
- 'cmd_no_hazardous_check',
25
- 'cmd_no_checks',
26
- 'cmd_raw',
27
- 'cmd_raw_no_range_check',
28
- 'cmd_raw_no_hazardous_check',
29
- 'cmd_raw_no_checks',
30
- 'send_raw',
31
- 'get_cmd_list',
32
- 'get_cmd_param_list',
33
- 'get_cmd_hazardous',
34
- 'tlm',
35
- 'tlm_raw',
36
- 'tlm_formatted',
37
- 'tlm_with_units',
38
- 'tlm_variable',
39
- 'set_tlm',
40
- 'set_tlm_raw',
41
- 'get_tlm_packet',
42
- 'get_tlm_values',
43
- 'get_tlm_list',
44
- 'get_tlm_item_list',
45
- 'get_tlm_details',
46
- 'get_out_of_limits',
47
- 'get_overall_limits_state',
48
- 'limits_enabled?',
49
- 'enable_limits',
50
- 'disable_limits',
51
- 'get_limits',
52
- 'set_limits',
53
- 'get_limits_groups',
54
- 'enable_limits_group',
55
- 'disable_limits_group',
56
- 'get_limits_sets',
57
- 'set_limits_set',
58
- 'get_limits_set',
59
- 'get_target_list',
60
- 'subscribe_limits_events',
61
- 'unsubscribe_limits_events',
62
- 'get_limits_event',
63
- 'subscribe_packet_data',
64
- 'unsubscribe_packet_data',
65
- 'get_packet_data',
66
- 'get_interface_names',
67
- 'connect_interface',
68
- 'disconnect_interface',
69
- 'interface_state',
70
- 'map_target_to_interface',
71
- 'get_router_names',
72
- 'connect_router',
73
- 'disconnect_router',
74
- 'router_state',
75
- 'get_cmd_log_filename',
76
- 'get_tlm_log_filename',
77
- 'start_logging',
78
- 'stop_logging',
79
- 'start_cmd_log',
80
- 'start_tlm_log',
81
- 'stop_cmd_log',
82
- 'stop_tlm_log',
83
- 'start_raw_logging_interface',
84
- 'stop_raw_logging_interface',
85
- 'start_raw_logging_router',
86
- 'stop_raw_logging_router',
87
- 'get_server_message_log_filename',
88
- 'start_new_server_message_log']
89
- end
90
-
91
- ############################################################################
92
- # Methods Used by cosmos/script
93
- ############################################################################
94
-
95
- # Send a command packet to a target.
96
- #
97
- # Accepts two different calling styles:
98
- # cmd("TGT CMD with PARAM1 val, PARAM2 val")
99
- # cmd('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
100
- #
101
- # Favor the first syntax where possible as it is more succinct.
102
- #
103
- # @param args [String|Array<String>] See the description for calling style
104
- # @return [Array<String, String, Hash>] target_name, command_name, parameters
105
- def cmd(*args)
106
- cmd_implementation(true, true, false, 'cmd', *args)
107
- end
108
-
109
- # Send a command packet to a target without performing any value range
110
- # checks on the parameters. Useful for testing to allow sending command
111
- # parameters outside the allowable range as defined in the configuration.
112
- #
113
- # Accepts two different calling styles:
114
- # cmd_no_range_check("TGT CMD with PARAM1 val, PARAM2 val")
115
- # cmd_no_range_check('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
116
- #
117
- # Favor the first syntax where possible as it is more succinct.
118
- #
119
- # @param (see #cmd)
120
- # @return (see #cmd)
121
- def cmd_no_range_check(*args)
122
- cmd_implementation(false, true, false, 'cmd_no_range_check', *args)
123
- end
124
-
125
- # Send a command packet to a target without performing any hazardous checks
126
- # both on the command itself and its parameters. Useful in scripts to
127
- # prevent popping up warnings to the user.
128
- #
129
- # Accepts two different calling styles:
130
- # cmd_no_hazardous_check("TGT CMD with PARAM1 val, PARAM2 val")
131
- # cmd_no_hazardous_check('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
132
- #
133
- # Favor the first syntax where possible as it is more succinct.
134
- #
135
- # @param (see #cmd)
136
- # @return (see #cmd)
137
- def cmd_no_hazardous_check(*args)
138
- cmd_implementation(true, false, false, 'cmd_no_hazardous_check', *args)
139
- end
140
-
141
- # Send a command packet to a target without performing any value range
142
- # checks or hazardous checks both on the command itself and its parameters.
143
- #
144
- # Accepts two different calling styles:
145
- # cmd_no_checks("TGT CMD with PARAM1 val, PARAM2 val")
146
- # cmd_no_checks('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
147
- #
148
- # Favor the first syntax where possible as it is more succinct.
149
- #
150
- # @param (see #cmd)
151
- # @return (see #cmd)
152
- def cmd_no_checks(*args)
153
- cmd_implementation(false, false, false, 'cmd_no_checks', *args)
154
- end
155
-
156
- # Send a command packet to a target without running conversions.
157
- #
158
- # Accepts two different calling styles:
159
- # cmd_raw("TGT CMD with PARAM1 val, PARAM2 val")
160
- # cmd_raw('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
161
- #
162
- # Favor the first syntax where possible as it is more succinct.
163
- #
164
- # @param args [String|Array<String>] See the description for calling style
165
- # @return [Array<String, String, Hash>] target_name, command_name, parameters
166
- def cmd_raw(*args)
167
- cmd_implementation(true, true, true, 'cmd_raw', *args)
168
- end
169
-
170
- # Send a command packet to a target without performing any value range
171
- # checks on the parameters or running conversions. Useful for testing to allow sending command
172
- # parameters outside the allowable range as defined in the configuration.
173
- #
174
- # Accepts two different calling styles:
175
- # cmd_raw_no_range_check("TGT CMD with PARAM1 val, PARAM2 val")
176
- # cmd_raw_no_range_check('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
177
- #
178
- # Favor the first syntax where possible as it is more succinct.
179
- #
180
- # @param (see #cmd)
181
- # @return (see #cmd)
182
- def cmd_raw_no_range_check(*args)
183
- cmd_implementation(false, true, true, 'cmd_raw_no_range_check', *args)
184
- end
185
-
186
- # Send a command packet to a target without running conversions or performing any hazardous checks
187
- # both on the command itself and its parameters. Useful in scripts to
188
- # prevent popping up warnings to the user.
189
- #
190
- # Accepts two different calling styles:
191
- # cmd_raw_no_hazardous_check("TGT CMD with PARAM1 val, PARAM2 val")
192
- # cmd_raw_no_hazardous_check('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
193
- #
194
- # Favor the first syntax where possible as it is more succinct.
195
- #
196
- # @param (see #cmd)
197
- # @return (see #cmd)
198
- def cmd_raw_no_hazardous_check(*args)
199
- cmd_implementation(true, false, true, 'cmd_raw_no_hazardous_check', *args)
200
- end
201
-
202
- # Send a command packet to a target without running conversions or performing any value range
203
- # checks or hazardous checks both on the command itself and its parameters.
204
- #
205
- # Accepts two different calling styles:
206
- # cmd_raw_no_checks("TGT CMD with PARAM1 val, PARAM2 val")
207
- # cmd_raw_no_checks('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
208
- #
209
- # Favor the first syntax where possible as it is more succinct.
210
- #
211
- # @param (see #cmd)
212
- # @return (see #cmd)
213
- def cmd_raw_no_checks(*args)
214
- cmd_implementation(false, false, true, 'cmd_raw_no_checks', *args)
215
- end
216
-
217
- # Send a raw binary string to the specified interface.
218
- #
219
- # @param interface_name [String] The interface to send the raw binary
220
- # @param data [String] The raw binary data
221
- def send_raw(interface_name, data)
222
- CmdTlmServer.commanding.send_raw(interface_name, data)
223
- nil
224
- end
225
-
226
- # Returns the list of all the command names and their descriptions from the
227
- # given target.
228
- #
229
- # @param target_name [String] Name of the target
230
- # @return [Array<Array<String, String>>] Array containing \[command name,
231
- # command description] for all commands in the target
232
- def get_cmd_list(target_name)
233
- list = []
234
- System.commands.packets(target_name).each do |name, command|
235
- list << [name, command.description]
236
- end
237
- return list.sort
238
- end
239
-
240
- # Returns the list of all the parameters for the given command.
241
- #
242
- # @param target_name (see #get_cmd_list)
243
- # @param command_name [String] Name of the command
244
- # @return [Array<Array<String, Object, nil|Array, nil|String, nil|String,
245
- # nil|String, Boolean>] Array containing \[name, default, states,
246
- # description, units_full, units, required] for all parameters in the
247
- # command
248
- def get_cmd_param_list(target_name, command_name)
249
- list = []
250
- System.commands.params(target_name, command_name).each do |parameter|
251
- if parameter.format_string
252
- unless parameter.default.kind_of?(Array)
253
- list << [parameter.name, sprintf(parameter.format_string, parameter.default), parameter.states, parameter.description, parameter.units_full, parameter.units, parameter.required]
254
- else
255
- list << [parameter.name, "[]", parameter.states, parameter.description, parameter.units_full, parameter.units, parameter.required]
256
- end
257
- else
258
- list << [parameter.name, parameter.default, parameter.states, parameter.description, parameter.units_full, parameter.units, parameter.required]
259
- end
260
- end
261
- return list
262
- end
263
-
264
- # Returns whether the specified command is hazardous
265
- #
266
- # @param target_name (see #get_cmd_param_list)
267
- # @param command_name (see #get_cmd_param_list)
268
- # @param params [Hash] Command parameter hash to test whether a particular
269
- # parameter setting makes the command hazardous
270
- # @return [Boolean] Whether the command is hazardous
271
- def get_cmd_hazardous(target_name, command_name, params = {})
272
- hazardous, _ = System.commands.cmd_hazardous?(target_name, command_name, params)
273
- return hazardous
274
- end
275
-
276
- # Request a converted telemetry item from a packet.
277
- #
278
- # Accepts two different calling styles:
279
- # tlm("TGT PKT ITEM")
280
- # tlm('TGT','PKT','ITEM')
281
- #
282
- # Favor the first syntax where possible as it is more succinct.
283
- #
284
- # @param args [String|Array<String>] See the description for calling style
285
- # @return [Numeric] The converted telemetry value without formatting or
286
- # units
287
- def tlm(*args)
288
- target_name, packet_name, item_name = tlm_process_args(args, 'tlm')
289
- System.telemetry.value(target_name, packet_name, item_name, :CONVERTED)
290
- end
291
-
292
- # Request a raw telemetry item from a packet.
293
- #
294
- # Accepts two different calling styles:
295
- # tlm_raw("TGT PKT ITEM")
296
- # tlm_raw('TGT','PKT','ITEM')
297
- #
298
- # Favor the first syntax where possible as it is more succinct.
299
- #
300
- # @param args (see #tlm)
301
- # @return [Numeric] The unconverted telemetry value without formatting or
302
- # units
303
- def tlm_raw(*args)
304
- target_name, packet_name, item_name = tlm_process_args(args, 'tlm_raw')
305
- System.telemetry.value(target_name, packet_name, item_name, :RAW)
306
- end
307
-
308
- # Request a formatted telemetry item from a packet.
309
- #
310
- # Accepts two different calling styles:
311
- # tlm_formatted("TGT PKT ITEM")
312
- # tlm_formatted('TGT','PKT','ITEM')
313
- #
314
- # Favor the first syntax where possible as it is more succinct.
315
- #
316
- # @param args (see #tlm)
317
- # @return [String] The converted telemetry value with formatting but
318
- # without units
319
- def tlm_formatted(*args)
320
- target_name, packet_name, item_name = tlm_process_args(args, 'tlm_formatted')
321
- System.telemetry.value(target_name, packet_name, item_name, :FORMATTED)
322
- end
323
-
324
- # Request a telemetry item with units from a packet.
325
- #
326
- # Accepts two different calling styles:
327
- # tlm_with_units("TGT PKT ITEM")
328
- # tlm_with_units('TGT','PKT','ITEM')
329
- #
330
- # Favor the first syntax where possible as it is more succinct.
331
- #
332
- # @param args (see #tlm)
333
- # @return [String] The converted, formatted telemetry value with units
334
- def tlm_with_units(*args)
335
- target_name, packet_name, item_name = tlm_process_args(args, 'tlm_with_units')
336
- System.telemetry.value(target_name, packet_name, item_name, :WITH_UNITS)
337
- end
338
-
339
- # Request a telemetry item from a packet with the specified conversion
340
- # applied. This method is equivalent to calling the other tlm_xxx methods.
341
- #
342
- # Accepts two different calling styles:
343
- # tlm_variable("TGT PKT ITEM", :RAW)
344
- # tlm_variable('TGT','PKT','ITEM', :RAW)
345
- #
346
- # Favor the first syntax where possible as it is more succinct.
347
- #
348
- # @param args The args must either be a string followed by a symbol or
349
- # three strings followed by a symbol (see the calling style in the
350
- # description). The symbol must be one of {Packet::VALUE_TYPES}.
351
- # @return [Object] The converted telemetry value
352
- def tlm_variable(*args)
353
- target_name, packet_name, item_name, value_type = tlm_variable_process_args(args, 'tlm_variable')
354
- System.telemetry.value(target_name, packet_name, item_name, value_type)
355
- end
356
-
357
- # Set a telemetry item in a packet to a particular value and then verifies
358
- # the value is within the acceptable limits. This method uses any
359
- # conversions that apply to the item when setting the value.
360
- #
361
- # Note: If this is done while COSMOS is currently receiving telemetry,
362
- # this value could get overwritten at any time. Thus this capability is
363
- # best used for testing or for telemetry items that are not received
364
- # regularly through the target interface.
365
- #
366
- # Accepts two different calling styles:
367
- # set_tlm("TGT PKT ITEM = 1.0")
368
- # set_tlm('TGT','PKT','ITEM', 10.0)
369
- #
370
- # Favor the first syntax where possible as it is more succinct.
371
- #
372
- # @param args The args must either be a string followed by a value or
373
- # three strings followed by a value (see the calling style in the
374
- # description).
375
- def set_tlm(*args)
376
- target_name, packet_name, item_name, value = set_tlm_process_args(args, 'set_tlm')
377
- System.telemetry.set_value(target_name, packet_name, item_name, value, :CONVERTED)
378
- System.telemetry.packet(target_name, packet_name).check_limits(System.limits_set, true)
379
- nil
380
- end
381
-
382
- # Set a telemetry item in a packet to a particular value and then verifies
383
- # the value is within the acceptable limits. No conversions are applied.
384
- #
385
- # Note: If this is done while COSMOS is currently receiving telemetry,
386
- # this value could get overwritten at any time. Thus this capability is
387
- # best used for testing or for telemetry items that are not received
388
- # regularly through the target interface.
389
- #
390
- # Accepts two different calling styles:
391
- # set_tlm_raw("TGT PKT ITEM = 1.0")
392
- # set_tlm_raw('TGT','PKT','ITEM', 10.0)
393
- #
394
- # Favor the first syntax where possible as it is more succinct.
395
- #
396
- # @param args The args must either be a string followed by a value or
397
- # three strings followed by a value (see the calling style in the
398
- # description).
399
- def set_tlm_raw(*args)
400
- target_name, packet_name, item_name, value = set_tlm_process_args(args, 'set_tlm_raw')
401
- System.telemetry.set_value(target_name, packet_name, item_name, value, :RAW)
402
- System.telemetry.packet(target_name, packet_name).check_limits(System.limits_set, true)
403
- nil
404
- end
405
-
406
- # Returns all the values (along with their limits state) for a packet.
407
- #
408
- # @param target_name [String] Name of the target
409
- # @param packet_name [String] Name of the packet
410
- # @param value_type [Symbol] How the values should be converted. Must be
411
- # one of {Packet::VALUE_TYPES}
412
- # @return (see Cosmos::Packet#read_all_with_limits_states)
413
- def get_tlm_packet(target_name, packet_name, value_type = :CONVERTED)
414
- packet = System.telemetry.packet(target_name, packet_name)
415
- values = nil
416
- packet.synchronize do
417
- values = packet.read_all_with_limits_states(value_type.to_s.intern)
418
- end
419
- values
420
- end
421
-
422
- # Returns all the item values (along with their limits state). The items
423
- # can be from any target and packet and thus must be fully qualified with
424
- # their target and packet names.
425
- #
426
- # @param (see Cosmos::Telemetry#values_and_limits_states)
427
- # @return [Array<String, Object, Array, Symbol|nil>] Array consisting of
428
- # \[item name, item value, item limits settings, item limits state] where the item limits
429
- # state can be one of {Cosmos::Limits::LIMITS_STATES}
430
- def get_tlm_values(item_array, value_types = :CONVERTED)
431
- if !item_array.is_a?(Array) || (!item_array[0].is_a?(Array) and !item_array.empty?)
432
- raise ArgumentError, "item_array must be nested array: [['TGT','PKT','ITEM'],...]"
433
- end
434
- return [[], [], [], System.limits_set] if item_array.empty?
435
- if value_types.is_a?(Array)
436
- elem = value_types[0]
437
- else
438
- elem = value_types
439
- end
440
- # Due to JSON round tripping from scripts, value_types can be a String
441
- # so we must check for both Symbol and String
442
- if !elem.is_a?(Symbol) && !elem.is_a?(String)
443
- raise ArgumentError, "value_types must be a single symbol or array of symbols specifying the conversion method (:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS)"
444
- end
445
- array = System.telemetry.values_and_limits_states(item_array, value_types)
446
- array << System.limits_set
447
- return array
448
- end
449
-
450
- # Returns the sorted packet names and their descriptions for a particular
451
- # target.
452
- #
453
- # @param target_name (see #get_tlm_packet)
454
- # @return [Array<String, String>] Array of \[packet name, packet
455
- # description] sorted by packet name
456
- def get_tlm_list(target_name)
457
- list = []
458
- packets = System.telemetry.packets(target_name)
459
- packets.each do |packet_name, packet|
460
- list << [packet_name, packet.description]
461
- end
462
- list.sort
463
- end
464
-
465
- # Returns the item names and their states and descriptions for a particular
466
- # packet.
467
- #
468
- # @param target_name (see #get_tlm_packet)
469
- # @param packet_name (see #get_tlm_packet)
470
- # @return [Array<String, Hash, String>] Array of \[item name, item states,
471
- # item description]
472
- def get_tlm_item_list(target_name, packet_name)
473
- list = []
474
- System.telemetry.items(target_name, packet_name).each do |item|
475
- list << [item.name, item.states, item.description]
476
- end
477
- list
478
- end
479
-
480
- # Returns an array of Hashes with all the attributes of the item.
481
- #
482
- # @param (see Cosmos::Telemetry#values_and_limits_states)
483
- # @return [Array<Hash>] Array of hashes describing the items. All the
484
- # attributes in {Cosmos::PacketItem} and {Cosmos::StructItem} are
485
- # present in the Hash.
486
- def get_tlm_details(item_array)
487
- if !item_array.is_a?(Array) || !item_array[0].is_a?(Array)
488
- raise ArgumentError, "item_array must be nested array: [['TGT','PKT','ITEM'],...]"
489
- end
490
- details = []
491
- item_array.each do |target_name, packet_name, item_name|
492
- _, item = System.telemetry.packet_and_item(target_name, packet_name, item_name)
493
- details << item.to_hash
494
- end
495
- details
496
- end
497
-
498
- # (see Cosmos::Limits#out_of_limits)
499
- def get_out_of_limits
500
- return System.limits.out_of_limits
501
- end
502
-
503
- # (see Cosmos::Limits#overall_limits_state)
504
- def get_overall_limits_state (ignored_items = nil)
505
- return System.limits.overall_limits_state(ignored_items)
506
- end
507
-
508
- # Whether the limits are enabled for the given item
509
- #
510
- # Accepts two different calling styles:
511
- # limits_enabled?("TGT PKT ITEM")
512
- # limits_enabled?('TGT','PKT','ITEM')
513
- #
514
- # Favor the first syntax where possible as it is more succinct.
515
- #
516
- # @param args [String|Array<String>] See the description for calling style
517
- # @return [Boolean] Whether limits are enable for the itme
518
- def limits_enabled?(*args)
519
- target_name, packet_name, item_name = tlm_process_args(args, 'limits_enabled?')
520
- return System.limits.enabled?(target_name, packet_name, item_name)
521
- end
522
-
523
- # Enable limits checking for a telemetry item
524
- #
525
- # Accepts two different calling styles:
526
- # enable_limits("TGT PKT ITEM")
527
- # enable_limits('TGT','PKT','ITEM')
528
- #
529
- # Favor the first syntax where possible as it is more succinct.
530
- #
531
- # @param args [String|Array<String>] See the description for calling style
532
- def enable_limits(*args)
533
- target_name, packet_name, item_name = tlm_process_args(args, 'enable_limits')
534
- System.limits.enable(target_name, packet_name, item_name)
535
- nil
536
- end
537
-
538
- # Disable limit checking for a telemetry item
539
- #
540
- # Accepts two different calling styles:
541
- # disable_limits("TGT PKT ITEM")
542
- # disable_limits('TGT','PKT','ITEM')
543
- #
544
- # Favor the first syntax where possible as it is more succinct.
545
- #
546
- # @param args [String|Array<String>] See the description for calling style
547
- def disable_limits(*args)
548
- target_name, packet_name, item_name = tlm_process_args(args, 'disable_limits')
549
- System.limits.disable(target_name, packet_name, item_name)
550
- nil
551
- end
552
-
553
- # (see Cosmos::Limits#get)
554
- def get_limits(target_name, packet_name, item_name, limits_set = nil)
555
- System.limits.get(target_name, packet_name, item_name, limits_set)
556
- end
557
-
558
- # (see Cosmos::Limits#set)
559
- def set_limits(target_name, packet_name, item_name, red_low, yellow_low, yellow_high, red_high, green_low = nil, green_high = nil, limits_set = :CUSTOM, persistence = nil, enabled = true)
560
- result = System.limits.set(target_name, packet_name, item_name, red_low, yellow_low, yellow_high, red_high, green_low, green_high, limits_set, persistence, enabled)
561
- if result[0] != nil
562
- limits_settings = [target_name, packet_name, item_name].concat(result)
563
- CmdTlmServer.instance.post_limits_event(:LIMITS_SETTINGS, limits_settings)
564
- Logger.info("Limits Settings Changed: #{limits_settings}")
565
- end
566
- result
567
- end
568
-
569
- # (see Cosmos::Limits#groups)
570
- def get_limits_groups
571
- return System.limits.groups.keys
572
- end
573
-
574
- # (see Cosmos::Limits#enable_group)
575
- def enable_limits_group(group_name)
576
- System.limits.enable_group(group_name)
577
- nil
578
- end
579
-
580
- # (see Cosmos::Limits#disable_group)
581
- def disable_limits_group(group_name)
582
- System.limits.disable_group(group_name)
583
- nil
584
- end
585
-
586
- # Returns all defined limits sets
587
- #
588
- # @return [Array<Symbol>] All defined limits sets
589
- def get_limits_sets
590
- return System.limits.sets
591
- end
592
-
593
- # Changes the active limits set that applies to all telemetry
594
- #
595
- # @param limits_set [String] The name of the limits set
596
- def set_limits_set(limits_set)
597
- System.limits_set = limits_set if System.limits_set != limits_set.to_s.upcase.intern
598
- end
599
-
600
- # Returns the active limits set that applies to all telemetry
601
- #
602
- # @return [String] The current limits set
603
- def get_limits_set
604
- return System.limits_set.to_s
605
- end
606
-
607
- #
608
- # General Purpose Methods
609
- #
610
-
611
- # Returns the list of all target names
612
- #
613
- # @return [Array<String>] All target names
614
- def get_target_list
615
- list = []
616
- System.targets.each_key {|target_name| list << target_name }
617
- return list.sort
618
- end
619
-
620
- # @see CmdTlmServer.subscribe_limits_events
621
- def subscribe_limits_events(queue_size = CmdTlmServer::DEFAULT_LIMITS_EVENT_QUEUE_SIZE)
622
- CmdTlmServer.subscribe_limits_events(queue_size)
623
- end
624
-
625
- # @see CmdTlmServer.unsubscribe_limits_events
626
- def unsubscribe_limits_events(id)
627
- CmdTlmServer.unsubscribe_limits_events(id)
628
- end
629
-
630
- # @see CmdTlmServer.get_limits_event
631
- def get_limits_event(id, non_block = false)
632
- CmdTlmServer.get_limits_event(id, non_block)
633
- end
634
-
635
- # @see CmdTlmServer.subscribe_packet_data
636
- def subscribe_packet_data(packets,
637
- queue_size = CmdTlmServer::DEFAULT_PACKET_DATA_QUEUE_SIZE)
638
- CmdTlmServer.subscribe_packet_data(packets, queue_size)
639
- end
640
-
641
- # @see CmdTlmServer.unsubscribe_packet_data
642
- def unsubscribe_packet_data(id)
643
- CmdTlmServer.unsubscribe_packet_data(id)
644
- end
645
-
646
- # @see CmdTlmServer.get_packet_data
647
- def get_packet_data(id, non_block = false)
648
- CmdTlmServer.get_packet_data(id, non_block)
649
- end
650
-
651
- #
652
- # Methods for scripting
653
- #
654
-
655
- # @return [Array<String>] All the interface names
656
- def get_interface_names
657
- CmdTlmServer.interfaces.names
658
- end
659
-
660
- # Connects to an interface and starts its telemetry gathering thread. If
661
- # optional parameters are given, the interface is recreated with new
662
- # parameters.
663
- #
664
- # @param interface_name [String] The name of the interface
665
- # @param params [Array] Parameters to pass to the interface.
666
- def connect_interface(interface_name, *params)
667
- CmdTlmServer.interfaces.connect(interface_name, *params)
668
- nil
669
- end
670
-
671
- # Disconnects from an interface and kills its telemetry gathering thread
672
- #
673
- # @param interface_name (see #connect_interface)
674
- def disconnect_interface(interface_name)
675
- CmdTlmServer.interfaces.disconnect(interface_name)
676
- nil
677
- end
678
-
679
- # @param interface_name (see #connect_interface)
680
- # @return [String] The state of the interface which is one of 'CONNECTED',
681
- # 'ATTEMPTING' or 'DISCONNECTED'.
682
- def interface_state(interface_name)
683
- CmdTlmServer.interfaces.state(interface_name)
684
- end
685
-
686
- # Associates a target and all its commands and telemetry with a particular
687
- # interface. All the commands will go out over and telemetry be received
688
- # from that interface.
689
- #
690
- # @param target_name [String] The name of the target
691
- # @param interface_name (see #connect_interface)
692
- def map_target_to_interface(target_name, interface_name)
693
- CmdTlmServer.interfaces.map_target(target_name, interface_name)
694
- nil
695
- end
696
-
697
- # @return [Array<String>] All the router names
698
- def get_router_names
699
- CmdTlmServer.routers.names
700
- end
701
-
702
- # Connects a router and starts its command gathering thread. If
703
- # optional parameters are given, the router is recreated with new
704
- # parameters.
705
- #
706
- # @param router_name [String] The name of the router
707
- # @param params [Array] Parameters to pass to the router.
708
- def connect_router(router_name, *params)
709
- CmdTlmServer.routers.connect(router_name, *params)
710
- nil
711
- end
712
-
713
- # Disconnects a router and kills its command gathering thread
714
- #
715
- # @param router_name (see #connect_router)
716
- def disconnect_router(router_name)
717
- CmdTlmServer.routers.disconnect(router_name)
718
- nil
719
- end
720
-
721
- # @param router_name (see #connect_router)
722
- # @return [String] The state of the router which is one of 'CONNECTED',
723
- # 'ATTEMPTING' or 'DISCONNECTED'.
724
- def router_state(router_name)
725
- CmdTlmServer.routers.state(router_name)
726
- end
727
-
728
- # @param packet_log_writer_name [String] The name of the packet log writer which
729
- # is writing the command packet log
730
- # @return [String] The command packet log filename
731
- def get_cmd_log_filename(packet_log_writer_name = 'DEFAULT')
732
- CmdTlmServer.packet_logging.cmd_filename(packet_log_writer_name)
733
- end
734
-
735
- # @param packet_log_writer_name [String] The name of the packet log writer which
736
- # is writing the telemetry packet log
737
- # @return [String] The telemetry packet log filename
738
- def get_tlm_log_filename(packet_log_writer_name = 'DEFAULT')
739
- CmdTlmServer.packet_logging.tlm_filename(packet_log_writer_name)
740
- end
741
-
742
- # Start both command and telemetry packet logging.
743
- #
744
- # @param packet_log_writer_name [String] The name of the packet log writer which
745
- # is writing both the command and telemetry logs
746
- # @param label [String] Optional label to apply to both the command and
747
- # telemetry packet log filename
748
- def start_logging(packet_log_writer_name = 'ALL', label = nil)
749
- CmdTlmServer.packet_logging.start(packet_log_writer_name, label)
750
- nil
751
- end
752
-
753
- # Stop both command and telemetry packet logging.
754
- #
755
- # @param packet_log_writer_name [String] The name of the packet log writer which
756
- # is writing both the command and telemetry logs
757
- def stop_logging(packet_log_writer_name = 'ALL')
758
- CmdTlmServer.packet_logging.stop(packet_log_writer_name)
759
- nil
760
- end
761
-
762
- # Start command packet logging.
763
- #
764
- # @param packet_log_writer_name [String] The name of the packet log writer which
765
- # is writing the command logs
766
- # @param label [String] Optional label to apply to the command packet log
767
- # filename
768
- def start_cmd_log(packet_log_writer_name = 'ALL', label = nil)
769
- CmdTlmServer.packet_logging.start_cmd(packet_log_writer_name, label)
770
- nil
771
- end
772
-
773
- # Start telemetry packet logging.
774
- #
775
- # @param packet_log_writer_name [String] The name of the packet log writer which
776
- # is writing the telemetry logs
777
- # @param label [String] Optional label to apply to the telemetry packet log
778
- # filename
779
- def start_tlm_log(packet_log_writer_name = 'ALL', label = nil)
780
- CmdTlmServer.packet_logging.start_tlm(packet_log_writer_name, label)
781
- nil
782
- end
783
-
784
- # Stop command packet logging.
785
- #
786
- # @param packet_log_writer_name [String] The name of the packet log writer which
787
- # is writing the command log
788
- def stop_cmd_log(packet_log_writer_name = 'ALL')
789
- CmdTlmServer.packet_logging.stop_cmd(packet_log_writer_name)
790
- nil
791
- end
792
-
793
- # Stop telemetry packet logging.
794
- #
795
- # @param packet_log_writer_name [String] The name of the packet log writer which
796
- # is writing the telemetry log
797
- def stop_tlm_log(packet_log_writer_name = 'ALL')
798
- CmdTlmServer.packet_logging.stop_tlm(packet_log_writer_name)
799
- nil
800
- end
801
-
802
- # Starts raw logging for an interface
803
- #
804
- # @param interface_name [String] The name of the interface
805
- def start_raw_logging_interface(interface_name = 'ALL')
806
- CmdTlmServer.interfaces.start_raw_logging(interface_name)
807
- nil
808
- end
809
-
810
- # Stop raw logging for an interface
811
- #
812
- # @param interface_name [String] The name of the interface
813
- def stop_raw_logging_interface(interface_name = 'ALL')
814
- CmdTlmServer.interfaces.stop_raw_logging(interface_name)
815
- nil
816
- end
817
-
818
- # Starts raw logging for a router
819
- #
820
- # @param router_name [String] The name of the router
821
- def start_raw_logging_router(router_name = 'ALL')
822
- CmdTlmServer.routers.start_raw_logging(router_name)
823
- nil
824
- end
825
-
826
- # Stops raw logging for a router
827
- #
828
- # @param router_name [String] The name of the router
829
- def stop_raw_logging_router(router_name = 'ALL')
830
- CmdTlmServer.routers.stop_raw_logging(router_name)
831
- nil
832
- end
833
-
834
- # @return [String] The server message log filename
835
- def get_server_message_log_filename
836
- CmdTlmServer.message_log.filename
837
- end
838
-
839
- # Starts a new server message log
840
- def start_new_server_message_log
841
- CmdTlmServer.message_log.start
842
- nil
843
- end
844
-
845
- private
846
-
847
- def cmd_implementation(range_check, hazardous_check, raw, method_name, *args)
848
- case args.length
849
- when 1
850
- target_name, cmd_name, cmd_params = extract_fields_from_cmd_text(args[0])
851
- when 2, 3
852
- target_name = args[0]
853
- cmd_name = args[1]
854
- if args.length == 2
855
- cmd_params = {}
856
- else
857
- cmd_params = args[2]
858
- end
859
- else
860
- # Invalid number of arguments
861
- raise "ERROR: Invalid number of arguments (#{args.length}) passed to #{method_name}()"
862
- end
863
-
864
- if hazardous_check
865
- hazardous, hazardous_description = System.commands.cmd_hazardous?(target_name, cmd_name, cmd_params)
866
- if hazardous
867
- error = HazardousError.new
868
- error.target_name = target_name
869
- error.cmd_name = cmd_name
870
- error.cmd_params = cmd_params
871
- error.hazardous_description = hazardous_description
872
- raise error
873
- end
874
- end
875
-
876
- # Build the command
877
- begin
878
- command = System.commands.build_cmd(target_name, cmd_name, cmd_params, range_check, raw)
879
- rescue Exception => e
880
- Logger.error e.message
881
- raise e
882
- end
883
-
884
- # Send the command
885
- @disconnect = false unless defined? @disconnect
886
- CmdTlmServer.commanding.send_command_to_target(target_name, command) unless @disconnect
887
-
888
- [target_name, cmd_name, cmd_params]
889
- end
890
-
891
- def tlm_process_args(args, function_name)
892
- case args.length
893
- when 1
894
- target_name, packet_name, item_name = extract_fields_from_tlm_text(args[0])
895
- when 3
896
- target_name = args[0]
897
- packet_name = args[1]
898
- item_name = args[2]
899
- else
900
- # Invalid number of arguments
901
- raise "ERROR: Invalid number of arguments (#{args.length}) passed to #{function_name}()"
902
- end
903
- return [target_name, packet_name, item_name]
904
- end
905
-
906
- def tlm_variable_process_args(args, function_name)
907
- case args.length
908
- when 2
909
- target_name, packet_name, item_name = extract_fields_from_tlm_text(args[0])
910
- value_type = args[1].to_s.intern
911
- when 4
912
- target_name = args[0]
913
- packet_name = args[1]
914
- item_name = args[2]
915
- value_type = args[3].to_s.intern
916
- else
917
- # Invalid number of arguments
918
- raise "ERROR: Invalid number of arguments (#{args.length}) passed to #{function_name}()"
919
- end
920
- return [target_name, packet_name, item_name, value_type]
921
- end
922
-
923
- def set_tlm_process_args(args, function_name)
924
- case args.length
925
- when 1
926
- target_name, packet_name, item_name, value = extract_fields_from_set_tlm_text(args[0])
927
- when 4
928
- target_name = args[0]
929
- packet_name = args[1]
930
- item_name = args[2]
931
- value = args[3]
932
- else
933
- # Invalid number of arguments
934
- raise "ERROR: Invalid number of arguments (#{args.length}) passed to #{function_name}()"
935
- end
936
- return [target_name, packet_name, item_name, value]
937
- end
938
-
939
- end # module Api
940
- 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/script/extract'
12
+
13
+ module Cosmos
14
+
15
+ module Api
16
+ include Extract
17
+
18
+ # Sets api_requests to 0 and initializes the whitelist of allowable API
19
+ # method calls
20
+ def initialize
21
+ @api_whitelist = [
22
+ 'cmd',
23
+ 'cmd_no_range_check',
24
+ 'cmd_no_hazardous_check',
25
+ 'cmd_no_checks',
26
+ 'cmd_raw',
27
+ 'cmd_raw_no_range_check',
28
+ 'cmd_raw_no_hazardous_check',
29
+ 'cmd_raw_no_checks',
30
+ 'send_raw',
31
+ 'get_cmd_list',
32
+ 'get_cmd_param_list',
33
+ 'get_cmd_hazardous',
34
+ 'tlm',
35
+ 'tlm_raw',
36
+ 'tlm_formatted',
37
+ 'tlm_with_units',
38
+ 'tlm_variable',
39
+ 'set_tlm',
40
+ 'set_tlm_raw',
41
+ 'get_tlm_packet',
42
+ 'get_tlm_values',
43
+ 'get_tlm_list',
44
+ 'get_tlm_item_list',
45
+ 'get_tlm_details',
46
+ 'get_out_of_limits',
47
+ 'get_overall_limits_state',
48
+ 'limits_enabled?',
49
+ 'enable_limits',
50
+ 'disable_limits',
51
+ 'get_limits',
52
+ 'set_limits',
53
+ 'get_limits_groups',
54
+ 'enable_limits_group',
55
+ 'disable_limits_group',
56
+ 'get_limits_sets',
57
+ 'set_limits_set',
58
+ 'get_limits_set',
59
+ 'get_target_list',
60
+ 'subscribe_limits_events',
61
+ 'unsubscribe_limits_events',
62
+ 'get_limits_event',
63
+ 'subscribe_packet_data',
64
+ 'unsubscribe_packet_data',
65
+ 'get_packet_data',
66
+ 'get_interface_names',
67
+ 'connect_interface',
68
+ 'disconnect_interface',
69
+ 'interface_state',
70
+ 'map_target_to_interface',
71
+ 'get_router_names',
72
+ 'connect_router',
73
+ 'disconnect_router',
74
+ 'router_state',
75
+ 'get_cmd_log_filename',
76
+ 'get_tlm_log_filename',
77
+ 'start_logging',
78
+ 'stop_logging',
79
+ 'start_cmd_log',
80
+ 'start_tlm_log',
81
+ 'stop_cmd_log',
82
+ 'stop_tlm_log',
83
+ 'start_raw_logging_interface',
84
+ 'stop_raw_logging_interface',
85
+ 'start_raw_logging_router',
86
+ 'stop_raw_logging_router',
87
+ 'get_server_message_log_filename',
88
+ 'start_new_server_message_log']
89
+ end
90
+
91
+ ############################################################################
92
+ # Methods Used by cosmos/script
93
+ ############################################################################
94
+
95
+ # Send a command packet to a target.
96
+ #
97
+ # Accepts two different calling styles:
98
+ # cmd("TGT CMD with PARAM1 val, PARAM2 val")
99
+ # cmd('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
100
+ #
101
+ # Favor the first syntax where possible as it is more succinct.
102
+ #
103
+ # @param args [String|Array<String>] See the description for calling style
104
+ # @return [Array<String, String, Hash>] target_name, command_name, parameters
105
+ def cmd(*args)
106
+ cmd_implementation(true, true, false, 'cmd', *args)
107
+ end
108
+
109
+ # Send a command packet to a target without performing any value range
110
+ # checks on the parameters. Useful for testing to allow sending command
111
+ # parameters outside the allowable range as defined in the configuration.
112
+ #
113
+ # Accepts two different calling styles:
114
+ # cmd_no_range_check("TGT CMD with PARAM1 val, PARAM2 val")
115
+ # cmd_no_range_check('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
116
+ #
117
+ # Favor the first syntax where possible as it is more succinct.
118
+ #
119
+ # @param (see #cmd)
120
+ # @return (see #cmd)
121
+ def cmd_no_range_check(*args)
122
+ cmd_implementation(false, true, false, 'cmd_no_range_check', *args)
123
+ end
124
+
125
+ # Send a command packet to a target without performing any hazardous checks
126
+ # both on the command itself and its parameters. Useful in scripts to
127
+ # prevent popping up warnings to the user.
128
+ #
129
+ # Accepts two different calling styles:
130
+ # cmd_no_hazardous_check("TGT CMD with PARAM1 val, PARAM2 val")
131
+ # cmd_no_hazardous_check('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
132
+ #
133
+ # Favor the first syntax where possible as it is more succinct.
134
+ #
135
+ # @param (see #cmd)
136
+ # @return (see #cmd)
137
+ def cmd_no_hazardous_check(*args)
138
+ cmd_implementation(true, false, false, 'cmd_no_hazardous_check', *args)
139
+ end
140
+
141
+ # Send a command packet to a target without performing any value range
142
+ # checks or hazardous checks both on the command itself and its parameters.
143
+ #
144
+ # Accepts two different calling styles:
145
+ # cmd_no_checks("TGT CMD with PARAM1 val, PARAM2 val")
146
+ # cmd_no_checks('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
147
+ #
148
+ # Favor the first syntax where possible as it is more succinct.
149
+ #
150
+ # @param (see #cmd)
151
+ # @return (see #cmd)
152
+ def cmd_no_checks(*args)
153
+ cmd_implementation(false, false, false, 'cmd_no_checks', *args)
154
+ end
155
+
156
+ # Send a command packet to a target without running conversions.
157
+ #
158
+ # Accepts two different calling styles:
159
+ # cmd_raw("TGT CMD with PARAM1 val, PARAM2 val")
160
+ # cmd_raw('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
161
+ #
162
+ # Favor the first syntax where possible as it is more succinct.
163
+ #
164
+ # @param args [String|Array<String>] See the description for calling style
165
+ # @return [Array<String, String, Hash>] target_name, command_name, parameters
166
+ def cmd_raw(*args)
167
+ cmd_implementation(true, true, true, 'cmd_raw', *args)
168
+ end
169
+
170
+ # Send a command packet to a target without performing any value range
171
+ # checks on the parameters or running conversions. Useful for testing to allow sending command
172
+ # parameters outside the allowable range as defined in the configuration.
173
+ #
174
+ # Accepts two different calling styles:
175
+ # cmd_raw_no_range_check("TGT CMD with PARAM1 val, PARAM2 val")
176
+ # cmd_raw_no_range_check('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
177
+ #
178
+ # Favor the first syntax where possible as it is more succinct.
179
+ #
180
+ # @param (see #cmd)
181
+ # @return (see #cmd)
182
+ def cmd_raw_no_range_check(*args)
183
+ cmd_implementation(false, true, true, 'cmd_raw_no_range_check', *args)
184
+ end
185
+
186
+ # Send a command packet to a target without running conversions or performing any hazardous checks
187
+ # both on the command itself and its parameters. Useful in scripts to
188
+ # prevent popping up warnings to the user.
189
+ #
190
+ # Accepts two different calling styles:
191
+ # cmd_raw_no_hazardous_check("TGT CMD with PARAM1 val, PARAM2 val")
192
+ # cmd_raw_no_hazardous_check('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
193
+ #
194
+ # Favor the first syntax where possible as it is more succinct.
195
+ #
196
+ # @param (see #cmd)
197
+ # @return (see #cmd)
198
+ def cmd_raw_no_hazardous_check(*args)
199
+ cmd_implementation(true, false, true, 'cmd_raw_no_hazardous_check', *args)
200
+ end
201
+
202
+ # Send a command packet to a target without running conversions or performing any value range
203
+ # checks or hazardous checks both on the command itself and its parameters.
204
+ #
205
+ # Accepts two different calling styles:
206
+ # cmd_raw_no_checks("TGT CMD with PARAM1 val, PARAM2 val")
207
+ # cmd_raw_no_checks('TGT','CMD','PARAM1'=>val,'PARAM2'=>val)
208
+ #
209
+ # Favor the first syntax where possible as it is more succinct.
210
+ #
211
+ # @param (see #cmd)
212
+ # @return (see #cmd)
213
+ def cmd_raw_no_checks(*args)
214
+ cmd_implementation(false, false, true, 'cmd_raw_no_checks', *args)
215
+ end
216
+
217
+ # Send a raw binary string to the specified interface.
218
+ #
219
+ # @param interface_name [String] The interface to send the raw binary
220
+ # @param data [String] The raw binary data
221
+ def send_raw(interface_name, data)
222
+ CmdTlmServer.commanding.send_raw(interface_name, data)
223
+ nil
224
+ end
225
+
226
+ # Returns the list of all the command names and their descriptions from the
227
+ # given target.
228
+ #
229
+ # @param target_name [String] Name of the target
230
+ # @return [Array<Array<String, String>>] Array containing \[command name,
231
+ # command description] for all commands in the target
232
+ def get_cmd_list(target_name)
233
+ list = []
234
+ System.commands.packets(target_name).each do |name, command|
235
+ list << [name, command.description]
236
+ end
237
+ return list.sort
238
+ end
239
+
240
+ # Returns the list of all the parameters for the given command.
241
+ #
242
+ # @param target_name (see #get_cmd_list)
243
+ # @param command_name [String] Name of the command
244
+ # @return [Array<Array<String, Object, nil|Array, nil|String, nil|String,
245
+ # nil|String, Boolean>] Array containing \[name, default, states,
246
+ # description, units_full, units, required] for all parameters in the
247
+ # command
248
+ def get_cmd_param_list(target_name, command_name)
249
+ list = []
250
+ System.commands.params(target_name, command_name).each do |parameter|
251
+ if parameter.format_string
252
+ unless parameter.default.kind_of?(Array)
253
+ list << [parameter.name, sprintf(parameter.format_string, parameter.default), parameter.states, parameter.description, parameter.units_full, parameter.units, parameter.required]
254
+ else
255
+ list << [parameter.name, "[]", parameter.states, parameter.description, parameter.units_full, parameter.units, parameter.required]
256
+ end
257
+ else
258
+ list << [parameter.name, parameter.default, parameter.states, parameter.description, parameter.units_full, parameter.units, parameter.required]
259
+ end
260
+ end
261
+ return list
262
+ end
263
+
264
+ # Returns whether the specified command is hazardous
265
+ #
266
+ # @param target_name (see #get_cmd_param_list)
267
+ # @param command_name (see #get_cmd_param_list)
268
+ # @param params [Hash] Command parameter hash to test whether a particular
269
+ # parameter setting makes the command hazardous
270
+ # @return [Boolean] Whether the command is hazardous
271
+ def get_cmd_hazardous(target_name, command_name, params = {})
272
+ hazardous, _ = System.commands.cmd_hazardous?(target_name, command_name, params)
273
+ return hazardous
274
+ end
275
+
276
+ # Request a converted telemetry item from a packet.
277
+ #
278
+ # Accepts two different calling styles:
279
+ # tlm("TGT PKT ITEM")
280
+ # tlm('TGT','PKT','ITEM')
281
+ #
282
+ # Favor the first syntax where possible as it is more succinct.
283
+ #
284
+ # @param args [String|Array<String>] See the description for calling style
285
+ # @return [Numeric] The converted telemetry value without formatting or
286
+ # units
287
+ def tlm(*args)
288
+ target_name, packet_name, item_name = tlm_process_args(args, 'tlm')
289
+ System.telemetry.value(target_name, packet_name, item_name, :CONVERTED)
290
+ end
291
+
292
+ # Request a raw telemetry item from a packet.
293
+ #
294
+ # Accepts two different calling styles:
295
+ # tlm_raw("TGT PKT ITEM")
296
+ # tlm_raw('TGT','PKT','ITEM')
297
+ #
298
+ # Favor the first syntax where possible as it is more succinct.
299
+ #
300
+ # @param args (see #tlm)
301
+ # @return [Numeric] The unconverted telemetry value without formatting or
302
+ # units
303
+ def tlm_raw(*args)
304
+ target_name, packet_name, item_name = tlm_process_args(args, 'tlm_raw')
305
+ System.telemetry.value(target_name, packet_name, item_name, :RAW)
306
+ end
307
+
308
+ # Request a formatted telemetry item from a packet.
309
+ #
310
+ # Accepts two different calling styles:
311
+ # tlm_formatted("TGT PKT ITEM")
312
+ # tlm_formatted('TGT','PKT','ITEM')
313
+ #
314
+ # Favor the first syntax where possible as it is more succinct.
315
+ #
316
+ # @param args (see #tlm)
317
+ # @return [String] The converted telemetry value with formatting but
318
+ # without units
319
+ def tlm_formatted(*args)
320
+ target_name, packet_name, item_name = tlm_process_args(args, 'tlm_formatted')
321
+ System.telemetry.value(target_name, packet_name, item_name, :FORMATTED)
322
+ end
323
+
324
+ # Request a telemetry item with units from a packet.
325
+ #
326
+ # Accepts two different calling styles:
327
+ # tlm_with_units("TGT PKT ITEM")
328
+ # tlm_with_units('TGT','PKT','ITEM')
329
+ #
330
+ # Favor the first syntax where possible as it is more succinct.
331
+ #
332
+ # @param args (see #tlm)
333
+ # @return [String] The converted, formatted telemetry value with units
334
+ def tlm_with_units(*args)
335
+ target_name, packet_name, item_name = tlm_process_args(args, 'tlm_with_units')
336
+ System.telemetry.value(target_name, packet_name, item_name, :WITH_UNITS)
337
+ end
338
+
339
+ # Request a telemetry item from a packet with the specified conversion
340
+ # applied. This method is equivalent to calling the other tlm_xxx methods.
341
+ #
342
+ # Accepts two different calling styles:
343
+ # tlm_variable("TGT PKT ITEM", :RAW)
344
+ # tlm_variable('TGT','PKT','ITEM', :RAW)
345
+ #
346
+ # Favor the first syntax where possible as it is more succinct.
347
+ #
348
+ # @param args The args must either be a string followed by a symbol or
349
+ # three strings followed by a symbol (see the calling style in the
350
+ # description). The symbol must be one of {Packet::VALUE_TYPES}.
351
+ # @return [Object] The converted telemetry value
352
+ def tlm_variable(*args)
353
+ target_name, packet_name, item_name, value_type = tlm_variable_process_args(args, 'tlm_variable')
354
+ System.telemetry.value(target_name, packet_name, item_name, value_type)
355
+ end
356
+
357
+ # Set a telemetry item in a packet to a particular value and then verifies
358
+ # the value is within the acceptable limits. This method uses any
359
+ # conversions that apply to the item when setting the value.
360
+ #
361
+ # Note: If this is done while COSMOS is currently receiving telemetry,
362
+ # this value could get overwritten at any time. Thus this capability is
363
+ # best used for testing or for telemetry items that are not received
364
+ # regularly through the target interface.
365
+ #
366
+ # Accepts two different calling styles:
367
+ # set_tlm("TGT PKT ITEM = 1.0")
368
+ # set_tlm('TGT','PKT','ITEM', 10.0)
369
+ #
370
+ # Favor the first syntax where possible as it is more succinct.
371
+ #
372
+ # @param args The args must either be a string followed by a value or
373
+ # three strings followed by a value (see the calling style in the
374
+ # description).
375
+ def set_tlm(*args)
376
+ target_name, packet_name, item_name, value = set_tlm_process_args(args, 'set_tlm')
377
+ System.telemetry.set_value(target_name, packet_name, item_name, value, :CONVERTED)
378
+ System.telemetry.packet(target_name, packet_name).check_limits(System.limits_set, true)
379
+ nil
380
+ end
381
+
382
+ # Set a telemetry item in a packet to a particular value and then verifies
383
+ # the value is within the acceptable limits. No conversions are applied.
384
+ #
385
+ # Note: If this is done while COSMOS is currently receiving telemetry,
386
+ # this value could get overwritten at any time. Thus this capability is
387
+ # best used for testing or for telemetry items that are not received
388
+ # regularly through the target interface.
389
+ #
390
+ # Accepts two different calling styles:
391
+ # set_tlm_raw("TGT PKT ITEM = 1.0")
392
+ # set_tlm_raw('TGT','PKT','ITEM', 10.0)
393
+ #
394
+ # Favor the first syntax where possible as it is more succinct.
395
+ #
396
+ # @param args The args must either be a string followed by a value or
397
+ # three strings followed by a value (see the calling style in the
398
+ # description).
399
+ def set_tlm_raw(*args)
400
+ target_name, packet_name, item_name, value = set_tlm_process_args(args, 'set_tlm_raw')
401
+ System.telemetry.set_value(target_name, packet_name, item_name, value, :RAW)
402
+ System.telemetry.packet(target_name, packet_name).check_limits(System.limits_set, true)
403
+ nil
404
+ end
405
+
406
+ # Returns all the values (along with their limits state) for a packet.
407
+ #
408
+ # @param target_name [String] Name of the target
409
+ # @param packet_name [String] Name of the packet
410
+ # @param value_type [Symbol] How the values should be converted. Must be
411
+ # one of {Packet::VALUE_TYPES}
412
+ # @return (see Cosmos::Packet#read_all_with_limits_states)
413
+ def get_tlm_packet(target_name, packet_name, value_type = :CONVERTED)
414
+ packet = System.telemetry.packet(target_name, packet_name)
415
+ return packet.read_all_with_limits_states(value_type.to_s.intern)
416
+ end
417
+
418
+ # Returns all the item values (along with their limits state). The items
419
+ # can be from any target and packet and thus must be fully qualified with
420
+ # their target and packet names.
421
+ #
422
+ # @param (see Cosmos::Telemetry#values_and_limits_states)
423
+ # @return [Array<String, Object, Array, Symbol|nil>] Array consisting of
424
+ # \[item name, item value, item limits settings, item limits state] where the item limits
425
+ # state can be one of {Cosmos::Limits::LIMITS_STATES}
426
+ def get_tlm_values(item_array, value_types = :CONVERTED)
427
+ if !item_array.is_a?(Array) || (!item_array[0].is_a?(Array) and !item_array.empty?)
428
+ raise ArgumentError, "item_array must be nested array: [['TGT','PKT','ITEM'],...]"
429
+ end
430
+ return [[], [], [], System.limits_set] if item_array.empty?
431
+ if value_types.is_a?(Array)
432
+ elem = value_types[0]
433
+ else
434
+ elem = value_types
435
+ end
436
+ # Due to JSON round tripping from scripts, value_types can be a String
437
+ # so we must check for both Symbol and String
438
+ if !elem.is_a?(Symbol) && !elem.is_a?(String)
439
+ raise ArgumentError, "value_types must be a single symbol or array of symbols specifying the conversion method (:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS)"
440
+ end
441
+ array = System.telemetry.values_and_limits_states(item_array, value_types)
442
+ array << System.limits_set
443
+ return array
444
+ end
445
+
446
+ # Returns the sorted packet names and their descriptions for a particular
447
+ # target.
448
+ #
449
+ # @param target_name (see #get_tlm_packet)
450
+ # @return [Array<String, String>] Array of \[packet name, packet
451
+ # description] sorted by packet name
452
+ def get_tlm_list(target_name)
453
+ list = []
454
+ packets = System.telemetry.packets(target_name)
455
+ packets.each do |packet_name, packet|
456
+ list << [packet_name, packet.description]
457
+ end
458
+ list.sort
459
+ end
460
+
461
+ # Returns the item names and their states and descriptions for a particular
462
+ # packet.
463
+ #
464
+ # @param target_name (see #get_tlm_packet)
465
+ # @param packet_name (see #get_tlm_packet)
466
+ # @return [Array<String, Hash, String>] Array of \[item name, item states,
467
+ # item description]
468
+ def get_tlm_item_list(target_name, packet_name)
469
+ list = []
470
+ System.telemetry.items(target_name, packet_name).each do |item|
471
+ list << [item.name, item.states, item.description]
472
+ end
473
+ list
474
+ end
475
+
476
+ # Returns an array of Hashes with all the attributes of the item.
477
+ #
478
+ # @param (see Cosmos::Telemetry#values_and_limits_states)
479
+ # @return [Array<Hash>] Array of hashes describing the items. All the
480
+ # attributes in {Cosmos::PacketItem} and {Cosmos::StructItem} are
481
+ # present in the Hash.
482
+ def get_tlm_details(item_array)
483
+ if !item_array.is_a?(Array) || !item_array[0].is_a?(Array)
484
+ raise ArgumentError, "item_array must be nested array: [['TGT','PKT','ITEM'],...]"
485
+ end
486
+ details = []
487
+ item_array.each do |target_name, packet_name, item_name|
488
+ _, item = System.telemetry.packet_and_item(target_name, packet_name, item_name)
489
+ details << item.to_hash
490
+ end
491
+ details
492
+ end
493
+
494
+ # (see Cosmos::Limits#out_of_limits)
495
+ def get_out_of_limits
496
+ return System.limits.out_of_limits
497
+ end
498
+
499
+ # (see Cosmos::Limits#overall_limits_state)
500
+ def get_overall_limits_state (ignored_items = nil)
501
+ return System.limits.overall_limits_state(ignored_items)
502
+ end
503
+
504
+ # Whether the limits are enabled for the given item
505
+ #
506
+ # Accepts two different calling styles:
507
+ # limits_enabled?("TGT PKT ITEM")
508
+ # limits_enabled?('TGT','PKT','ITEM')
509
+ #
510
+ # Favor the first syntax where possible as it is more succinct.
511
+ #
512
+ # @param args [String|Array<String>] See the description for calling style
513
+ # @return [Boolean] Whether limits are enable for the itme
514
+ def limits_enabled?(*args)
515
+ target_name, packet_name, item_name = tlm_process_args(args, 'limits_enabled?')
516
+ return System.limits.enabled?(target_name, packet_name, item_name)
517
+ end
518
+
519
+ # Enable limits checking for a telemetry item
520
+ #
521
+ # Accepts two different calling styles:
522
+ # enable_limits("TGT PKT ITEM")
523
+ # enable_limits('TGT','PKT','ITEM')
524
+ #
525
+ # Favor the first syntax where possible as it is more succinct.
526
+ #
527
+ # @param args [String|Array<String>] See the description for calling style
528
+ def enable_limits(*args)
529
+ target_name, packet_name, item_name = tlm_process_args(args, 'enable_limits')
530
+ System.limits.enable(target_name, packet_name, item_name)
531
+ nil
532
+ end
533
+
534
+ # Disable limit checking for a telemetry item
535
+ #
536
+ # Accepts two different calling styles:
537
+ # disable_limits("TGT PKT ITEM")
538
+ # disable_limits('TGT','PKT','ITEM')
539
+ #
540
+ # Favor the first syntax where possible as it is more succinct.
541
+ #
542
+ # @param args [String|Array<String>] See the description for calling style
543
+ def disable_limits(*args)
544
+ target_name, packet_name, item_name = tlm_process_args(args, 'disable_limits')
545
+ System.limits.disable(target_name, packet_name, item_name)
546
+ nil
547
+ end
548
+
549
+ # (see Cosmos::Limits#get)
550
+ def get_limits(target_name, packet_name, item_name, limits_set = nil)
551
+ System.limits.get(target_name, packet_name, item_name, limits_set)
552
+ end
553
+
554
+ # (see Cosmos::Limits#set)
555
+ def set_limits(target_name, packet_name, item_name, red_low, yellow_low, yellow_high, red_high, green_low = nil, green_high = nil, limits_set = :CUSTOM, persistence = nil, enabled = true)
556
+ result = System.limits.set(target_name, packet_name, item_name, red_low, yellow_low, yellow_high, red_high, green_low, green_high, limits_set, persistence, enabled)
557
+ if result[0] != nil
558
+ limits_settings = [target_name, packet_name, item_name].concat(result)
559
+ CmdTlmServer.instance.post_limits_event(:LIMITS_SETTINGS, limits_settings)
560
+ Logger.info("Limits Settings Changed: #{limits_settings}")
561
+ end
562
+ result
563
+ end
564
+
565
+ # (see Cosmos::Limits#groups)
566
+ def get_limits_groups
567
+ return System.limits.groups.keys
568
+ end
569
+
570
+ # (see Cosmos::Limits#enable_group)
571
+ def enable_limits_group(group_name)
572
+ System.limits.enable_group(group_name)
573
+ nil
574
+ end
575
+
576
+ # (see Cosmos::Limits#disable_group)
577
+ def disable_limits_group(group_name)
578
+ System.limits.disable_group(group_name)
579
+ nil
580
+ end
581
+
582
+ # Returns all defined limits sets
583
+ #
584
+ # @return [Array<Symbol>] All defined limits sets
585
+ def get_limits_sets
586
+ return System.limits.sets
587
+ end
588
+
589
+ # Changes the active limits set that applies to all telemetry
590
+ #
591
+ # @param limits_set [String] The name of the limits set
592
+ def set_limits_set(limits_set)
593
+ System.limits_set = limits_set if System.limits_set != limits_set.to_s.upcase.intern
594
+ end
595
+
596
+ # Returns the active limits set that applies to all telemetry
597
+ #
598
+ # @return [String] The current limits set
599
+ def get_limits_set
600
+ return System.limits_set.to_s
601
+ end
602
+
603
+ #
604
+ # General Purpose Methods
605
+ #
606
+
607
+ # Returns the list of all target names
608
+ #
609
+ # @return [Array<String>] All target names
610
+ def get_target_list
611
+ list = []
612
+ System.targets.each_key {|target_name| list << target_name }
613
+ return list.sort
614
+ end
615
+
616
+ # @see CmdTlmServer.subscribe_limits_events
617
+ def subscribe_limits_events(queue_size = CmdTlmServer::DEFAULT_LIMITS_EVENT_QUEUE_SIZE)
618
+ CmdTlmServer.subscribe_limits_events(queue_size)
619
+ end
620
+
621
+ # @see CmdTlmServer.unsubscribe_limits_events
622
+ def unsubscribe_limits_events(id)
623
+ CmdTlmServer.unsubscribe_limits_events(id)
624
+ end
625
+
626
+ # @see CmdTlmServer.get_limits_event
627
+ def get_limits_event(id, non_block = false)
628
+ CmdTlmServer.get_limits_event(id, non_block)
629
+ end
630
+
631
+ # @see CmdTlmServer.subscribe_packet_data
632
+ def subscribe_packet_data(packets,
633
+ queue_size = CmdTlmServer::DEFAULT_PACKET_DATA_QUEUE_SIZE)
634
+ CmdTlmServer.subscribe_packet_data(packets, queue_size)
635
+ end
636
+
637
+ # @see CmdTlmServer.unsubscribe_packet_data
638
+ def unsubscribe_packet_data(id)
639
+ CmdTlmServer.unsubscribe_packet_data(id)
640
+ end
641
+
642
+ # @see CmdTlmServer.get_packet_data
643
+ def get_packet_data(id, non_block = false)
644
+ CmdTlmServer.get_packet_data(id, non_block)
645
+ end
646
+
647
+ #
648
+ # Methods for scripting
649
+ #
650
+
651
+ # @return [Array<String>] All the interface names
652
+ def get_interface_names
653
+ CmdTlmServer.interfaces.names
654
+ end
655
+
656
+ # Connects to an interface and starts its telemetry gathering thread. If
657
+ # optional parameters are given, the interface is recreated with new
658
+ # parameters.
659
+ #
660
+ # @param interface_name [String] The name of the interface
661
+ # @param params [Array] Parameters to pass to the interface.
662
+ def connect_interface(interface_name, *params)
663
+ CmdTlmServer.interfaces.connect(interface_name, *params)
664
+ nil
665
+ end
666
+
667
+ # Disconnects from an interface and kills its telemetry gathering thread
668
+ #
669
+ # @param interface_name (see #connect_interface)
670
+ def disconnect_interface(interface_name)
671
+ CmdTlmServer.interfaces.disconnect(interface_name)
672
+ nil
673
+ end
674
+
675
+ # @param interface_name (see #connect_interface)
676
+ # @return [String] The state of the interface which is one of 'CONNECTED',
677
+ # 'ATTEMPTING' or 'DISCONNECTED'.
678
+ def interface_state(interface_name)
679
+ CmdTlmServer.interfaces.state(interface_name)
680
+ end
681
+
682
+ # Associates a target and all its commands and telemetry with a particular
683
+ # interface. All the commands will go out over and telemetry be received
684
+ # from that interface.
685
+ #
686
+ # @param target_name [String] The name of the target
687
+ # @param interface_name (see #connect_interface)
688
+ def map_target_to_interface(target_name, interface_name)
689
+ CmdTlmServer.interfaces.map_target(target_name, interface_name)
690
+ nil
691
+ end
692
+
693
+ # @return [Array<String>] All the router names
694
+ def get_router_names
695
+ CmdTlmServer.routers.names
696
+ end
697
+
698
+ # Connects a router and starts its command gathering thread. If
699
+ # optional parameters are given, the router is recreated with new
700
+ # parameters.
701
+ #
702
+ # @param router_name [String] The name of the router
703
+ # @param params [Array] Parameters to pass to the router.
704
+ def connect_router(router_name, *params)
705
+ CmdTlmServer.routers.connect(router_name, *params)
706
+ nil
707
+ end
708
+
709
+ # Disconnects a router and kills its command gathering thread
710
+ #
711
+ # @param router_name (see #connect_router)
712
+ def disconnect_router(router_name)
713
+ CmdTlmServer.routers.disconnect(router_name)
714
+ nil
715
+ end
716
+
717
+ # @param router_name (see #connect_router)
718
+ # @return [String] The state of the router which is one of 'CONNECTED',
719
+ # 'ATTEMPTING' or 'DISCONNECTED'.
720
+ def router_state(router_name)
721
+ CmdTlmServer.routers.state(router_name)
722
+ end
723
+
724
+ # @param packet_log_writer_name [String] The name of the packet log writer which
725
+ # is writing the command packet log
726
+ # @return [String] The command packet log filename
727
+ def get_cmd_log_filename(packet_log_writer_name = 'DEFAULT')
728
+ CmdTlmServer.packet_logging.cmd_filename(packet_log_writer_name)
729
+ end
730
+
731
+ # @param packet_log_writer_name [String] The name of the packet log writer which
732
+ # is writing the telemetry packet log
733
+ # @return [String] The telemetry packet log filename
734
+ def get_tlm_log_filename(packet_log_writer_name = 'DEFAULT')
735
+ CmdTlmServer.packet_logging.tlm_filename(packet_log_writer_name)
736
+ end
737
+
738
+ # Start both command and telemetry packet logging.
739
+ #
740
+ # @param packet_log_writer_name [String] The name of the packet log writer which
741
+ # is writing both the command and telemetry logs
742
+ # @param label [String] Optional label to apply to both the command and
743
+ # telemetry packet log filename
744
+ def start_logging(packet_log_writer_name = 'ALL', label = nil)
745
+ CmdTlmServer.packet_logging.start(packet_log_writer_name, label)
746
+ nil
747
+ end
748
+
749
+ # Stop both command and telemetry packet logging.
750
+ #
751
+ # @param packet_log_writer_name [String] The name of the packet log writer which
752
+ # is writing both the command and telemetry logs
753
+ def stop_logging(packet_log_writer_name = 'ALL')
754
+ CmdTlmServer.packet_logging.stop(packet_log_writer_name)
755
+ nil
756
+ end
757
+
758
+ # Start command packet logging.
759
+ #
760
+ # @param packet_log_writer_name [String] The name of the packet log writer which
761
+ # is writing the command logs
762
+ # @param label [String] Optional label to apply to the command packet log
763
+ # filename
764
+ def start_cmd_log(packet_log_writer_name = 'ALL', label = nil)
765
+ CmdTlmServer.packet_logging.start_cmd(packet_log_writer_name, label)
766
+ nil
767
+ end
768
+
769
+ # Start telemetry packet logging.
770
+ #
771
+ # @param packet_log_writer_name [String] The name of the packet log writer which
772
+ # is writing the telemetry logs
773
+ # @param label [String] Optional label to apply to the telemetry packet log
774
+ # filename
775
+ def start_tlm_log(packet_log_writer_name = 'ALL', label = nil)
776
+ CmdTlmServer.packet_logging.start_tlm(packet_log_writer_name, label)
777
+ nil
778
+ end
779
+
780
+ # Stop command packet logging.
781
+ #
782
+ # @param packet_log_writer_name [String] The name of the packet log writer which
783
+ # is writing the command log
784
+ def stop_cmd_log(packet_log_writer_name = 'ALL')
785
+ CmdTlmServer.packet_logging.stop_cmd(packet_log_writer_name)
786
+ nil
787
+ end
788
+
789
+ # Stop telemetry packet logging.
790
+ #
791
+ # @param packet_log_writer_name [String] The name of the packet log writer which
792
+ # is writing the telemetry log
793
+ def stop_tlm_log(packet_log_writer_name = 'ALL')
794
+ CmdTlmServer.packet_logging.stop_tlm(packet_log_writer_name)
795
+ nil
796
+ end
797
+
798
+ # Starts raw logging for an interface
799
+ #
800
+ # @param interface_name [String] The name of the interface
801
+ def start_raw_logging_interface(interface_name = 'ALL')
802
+ CmdTlmServer.interfaces.start_raw_logging(interface_name)
803
+ nil
804
+ end
805
+
806
+ # Stop raw logging for an interface
807
+ #
808
+ # @param interface_name [String] The name of the interface
809
+ def stop_raw_logging_interface(interface_name = 'ALL')
810
+ CmdTlmServer.interfaces.stop_raw_logging(interface_name)
811
+ nil
812
+ end
813
+
814
+ # Starts raw logging for a router
815
+ #
816
+ # @param router_name [String] The name of the router
817
+ def start_raw_logging_router(router_name = 'ALL')
818
+ CmdTlmServer.routers.start_raw_logging(router_name)
819
+ nil
820
+ end
821
+
822
+ # Stops raw logging for a router
823
+ #
824
+ # @param router_name [String] The name of the router
825
+ def stop_raw_logging_router(router_name = 'ALL')
826
+ CmdTlmServer.routers.stop_raw_logging(router_name)
827
+ nil
828
+ end
829
+
830
+ # @return [String] The server message log filename
831
+ def get_server_message_log_filename
832
+ CmdTlmServer.message_log.filename
833
+ end
834
+
835
+ # Starts a new server message log
836
+ def start_new_server_message_log
837
+ CmdTlmServer.message_log.start
838
+ nil
839
+ end
840
+
841
+ private
842
+
843
+ def cmd_implementation(range_check, hazardous_check, raw, method_name, *args)
844
+ case args.length
845
+ when 1
846
+ target_name, cmd_name, cmd_params = extract_fields_from_cmd_text(args[0])
847
+ when 2, 3
848
+ target_name = args[0]
849
+ cmd_name = args[1]
850
+ if args.length == 2
851
+ cmd_params = {}
852
+ else
853
+ cmd_params = args[2]
854
+ end
855
+ else
856
+ # Invalid number of arguments
857
+ raise "ERROR: Invalid number of arguments (#{args.length}) passed to #{method_name}()"
858
+ end
859
+
860
+ if hazardous_check
861
+ hazardous, hazardous_description = System.commands.cmd_hazardous?(target_name, cmd_name, cmd_params)
862
+ if hazardous
863
+ error = HazardousError.new
864
+ error.target_name = target_name
865
+ error.cmd_name = cmd_name
866
+ error.cmd_params = cmd_params
867
+ error.hazardous_description = hazardous_description
868
+ raise error
869
+ end
870
+ end
871
+
872
+ # Build the command
873
+ begin
874
+ command = System.commands.build_cmd(target_name, cmd_name, cmd_params, range_check, raw)
875
+ rescue Exception => e
876
+ Logger.error e.message
877
+ raise e
878
+ end
879
+
880
+ # Send the command
881
+ @disconnect = false unless defined? @disconnect
882
+ CmdTlmServer.commanding.send_command_to_target(target_name, command) unless @disconnect
883
+
884
+ [target_name, cmd_name, cmd_params]
885
+ end
886
+
887
+ def tlm_process_args(args, function_name)
888
+ case args.length
889
+ when 1
890
+ target_name, packet_name, item_name = extract_fields_from_tlm_text(args[0])
891
+ when 3
892
+ target_name = args[0]
893
+ packet_name = args[1]
894
+ item_name = args[2]
895
+ else
896
+ # Invalid number of arguments
897
+ raise "ERROR: Invalid number of arguments (#{args.length}) passed to #{function_name}()"
898
+ end
899
+ return [target_name, packet_name, item_name]
900
+ end
901
+
902
+ def tlm_variable_process_args(args, function_name)
903
+ case args.length
904
+ when 2
905
+ target_name, packet_name, item_name = extract_fields_from_tlm_text(args[0])
906
+ value_type = args[1].to_s.intern
907
+ when 4
908
+ target_name = args[0]
909
+ packet_name = args[1]
910
+ item_name = args[2]
911
+ value_type = args[3].to_s.intern
912
+ else
913
+ # Invalid number of arguments
914
+ raise "ERROR: Invalid number of arguments (#{args.length}) passed to #{function_name}()"
915
+ end
916
+ return [target_name, packet_name, item_name, value_type]
917
+ end
918
+
919
+ def set_tlm_process_args(args, function_name)
920
+ case args.length
921
+ when 1
922
+ target_name, packet_name, item_name, value = extract_fields_from_set_tlm_text(args[0])
923
+ when 4
924
+ target_name = args[0]
925
+ packet_name = args[1]
926
+ item_name = args[2]
927
+ value = args[3]
928
+ else
929
+ # Invalid number of arguments
930
+ raise "ERROR: Invalid number of arguments (#{args.length}) passed to #{function_name}()"
931
+ end
932
+ return [target_name, packet_name, item_name, value]
933
+ end
934
+
935
+ end # module Api
936
+ end # module Cosmos