cosmos 3.0.1 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
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