cosmos 3.0.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (912) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +48 -48
  4. data/.travis.yml +7 -7
  5. data/CONTRIBUTING.txt +50 -50
  6. data/Gemfile +6 -6
  7. data/Guardfile +27 -27
  8. data/LICENSE.txt +879 -879
  9. data/Manifest.txt +1116 -1114
  10. data/README.md +109 -107
  11. data/Rakefile +214 -214
  12. data/autohotkey/config/data/diamond.STL +57 -57
  13. data/autohotkey/config/system/system.txt +34 -34
  14. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  17. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  18. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  20. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  21. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  22. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -294
  23. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  24. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  25. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  26. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  27. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  28. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  29. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  30. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  31. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  32. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  33. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  34. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  37. data/autohotkey/config/targets/INST/target.txt +26 -26
  38. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  40. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  41. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  42. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  43. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  44. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  45. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  46. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  47. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  48. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  49. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  50. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  51. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  52. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  55. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  57. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  58. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  59. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  60. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  61. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  62. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  63. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  64. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  65. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  66. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  67. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  69. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  70. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  71. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  72. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  75. data/autohotkey/lib/example_background_task.rb +42 -42
  76. data/autohotkey/lib/user_version.rb +3 -3
  77. data/autohotkey/procedures/clear_util.rb +7 -7
  78. data/autohotkey/procedures/collect.rb +18 -18
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +20 -20
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/Replay.bat +59 -59
  101. data/autohotkey/tools/ReplayAHK +17 -17
  102. data/autohotkey/tools/ScriptRunner +14 -14
  103. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  104. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  105. data/autohotkey/tools/TableManager +14 -14
  106. data/autohotkey/tools/TableManagerAHK +30 -30
  107. data/autohotkey/tools/TestRunner +15 -15
  108. data/autohotkey/tools/TestRunnerAHK +17 -17
  109. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  112. data/autohotkey/tools/TlmExtractor +15 -15
  113. data/autohotkey/tools/TlmExtractorAHK +19 -19
  114. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  115. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  116. data/autohotkey/tools/TlmGrapher +14 -14
  117. data/autohotkey/tools/TlmGrapherAHK +19 -19
  118. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  119. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  120. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  121. data/autohotkey/tools/TlmViewer +14 -14
  122. data/autohotkey/tools/TlmViewerAHK +28 -28
  123. data/autohotkey/tools/TlmViewerAHK2 +18 -18
  124. data/autohotkey/tools/TlmViewerAHK3 +18 -18
  125. data/autohotkey/tools/TlmViewerAHK4 +18 -18
  126. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  127. data/autohotkey/tools/autohotkey.rb +37 -37
  128. data/autohotkey/tools/cmd_extractor.ahk +27 -27
  129. data/autohotkey/tools/cmd_sender.ahk +182 -162
  130. data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
  131. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  132. data/autohotkey/tools/data_viewer.ahk +135 -135
  133. data/autohotkey/tools/handbook_creator.ahk +23 -23
  134. data/autohotkey/tools/launcher.ahk +41 -41
  135. data/autohotkey/tools/limits_monitor.ahk +70 -70
  136. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  137. data/autohotkey/tools/packet_viewer.ahk +143 -143
  138. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  139. data/autohotkey/tools/replay.ahk +98 -98
  140. data/autohotkey/tools/script_runner.ahk +589 -589
  141. data/autohotkey/tools/script_runner2.ahk +34 -31
  142. data/autohotkey/tools/table_manager.ahk +220 -220
  143. data/autohotkey/tools/test_runner.ahk +262 -259
  144. data/autohotkey/tools/test_runner2.ahk +52 -52
  145. data/autohotkey/tools/test_runner3.ahk +13 -13
  146. data/autohotkey/tools/tlm_extractor.ahk +272 -272
  147. data/autohotkey/tools/tlm_grapher.ahk +642 -642
  148. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  149. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  150. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  151. data/autohotkey/tools/tlm_viewer2.ahk +50 -49
  152. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  153. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  154. data/bin/cosmos +96 -96
  155. data/bin/cstol_converter +1166 -1166
  156. data/bin/rubysloc +85 -85
  157. data/cosmos.gemspec +98 -97
  158. data/data/about.txt +4 -4
  159. data/data/crc.txt +306 -305
  160. data/data/diamond.STL +57 -57
  161. data/data/legal.txt +9 -9
  162. data/demo/Gemfile +6 -6
  163. data/demo/Launcher +15 -15
  164. data/demo/Launcher.bat +59 -59
  165. data/demo/Rakefile +61 -61
  166. data/demo/config/data/crc.txt +222 -206
  167. data/demo/config/data/diamond.STL +57 -57
  168. data/demo/config/data/meta_init.txt +4 -4
  169. data/demo/config/system/system.txt +34 -34
  170. data/demo/config/system/system2.txt +33 -33
  171. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  172. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  173. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  174. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  175. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  176. data/demo/config/targets/COSMOS/target.txt +11 -11
  177. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  178. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -3
  179. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  180. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  181. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  182. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  183. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  184. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  185. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  186. data/demo/config/targets/INST/lib/sim_inst.rb +305 -294
  187. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  188. data/demo/config/targets/INST/screens/array.txt +15 -15
  189. data/demo/config/targets/INST/screens/block.txt +8 -8
  190. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  191. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  192. data/demo/config/targets/INST/screens/ground.txt +25 -25
  193. data/demo/config/targets/INST/screens/hs.txt +44 -44
  194. data/demo/config/targets/INST/screens/latest.txt +23 -23
  195. data/demo/config/targets/INST/screens/other.txt +29 -29
  196. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  197. data/demo/config/targets/INST/target.txt +33 -33
  198. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  199. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  200. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  201. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  202. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  203. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -12
  204. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  205. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  206. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +54 -48
  207. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  208. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
  209. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
  210. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  211. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  212. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  213. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  214. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  215. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  216. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  217. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  218. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  219. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  220. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  221. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  222. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  223. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  224. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  225. data/demo/config/tools/launcher/launcher.txt +45 -45
  226. data/demo/config/tools/launcher/launcher2.txt +45 -45
  227. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  228. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  229. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  230. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  231. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  232. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  233. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  234. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  235. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  236. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  237. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  238. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  239. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  240. data/demo/lib/example_background_task.rb +57 -52
  241. data/demo/lib/example_target.rb +113 -108
  242. data/demo/lib/scpi_target.rb +74 -74
  243. data/demo/lib/user_version.rb +3 -3
  244. data/demo/procedures/checks.rb +11 -11
  245. data/demo/procedures/clear_util.rb +7 -7
  246. data/demo/procedures/collect.rb +18 -18
  247. data/demo/procedures/collect_util.rb +14 -14
  248. data/demo/procedures/cosmos_api_test.rb +293 -293
  249. data/demo/procedures/disconnect.rb +29 -29
  250. data/demo/procedures/example_test.rb +182 -182
  251. data/demo/procedures/plot_test.rb +8 -8
  252. data/demo/procedures/run_example_test.rb +3 -3
  253. data/demo/procedures/test.rb +51 -51
  254. data/demo/tools/CmdExtractor +15 -15
  255. data/demo/tools/CmdExtractor.bat +59 -59
  256. data/demo/tools/CmdSender +15 -15
  257. data/demo/tools/CmdSender.bat +59 -59
  258. data/demo/tools/CmdTlmServer +15 -15
  259. data/demo/tools/CmdTlmServer.bat +59 -59
  260. data/demo/tools/DataViewer +15 -15
  261. data/demo/tools/DataViewer.bat +59 -59
  262. data/demo/tools/ExampleTarget +15 -15
  263. data/demo/tools/ExampleTarget.bat +59 -59
  264. data/demo/tools/HandbookCreator +15 -15
  265. data/demo/tools/HandbookCreator.bat +61 -61
  266. data/demo/tools/Launcher +15 -15
  267. data/demo/tools/Launcher.bat +59 -59
  268. data/demo/tools/LimitsMonitor +15 -15
  269. data/demo/tools/LimitsMonitor.bat +59 -59
  270. data/demo/tools/OpenGLBuilder +15 -15
  271. data/demo/tools/OpenGLBuilder.bat +59 -59
  272. data/demo/tools/PacketViewer +15 -15
  273. data/demo/tools/PacketViewer.bat +59 -59
  274. data/demo/tools/Replay +15 -15
  275. data/demo/tools/Replay.bat +59 -59
  276. data/demo/tools/ScpiTarget +15 -15
  277. data/demo/tools/ScpiTarget.bat +59 -59
  278. data/demo/tools/ScriptRunner +15 -15
  279. data/demo/tools/ScriptRunner.bat +59 -59
  280. data/demo/tools/TableManager +15 -15
  281. data/demo/tools/TableManager.bat +59 -59
  282. data/demo/tools/TestRunner +15 -15
  283. data/demo/tools/TestRunner.bat +59 -59
  284. data/demo/tools/TlmExtractor +15 -15
  285. data/demo/tools/TlmExtractor.bat +59 -59
  286. data/demo/tools/TlmGrapher +15 -15
  287. data/demo/tools/TlmGrapher.bat +59 -59
  288. data/demo/tools/TlmViewer +15 -15
  289. data/demo/tools/TlmViewer.bat +59 -59
  290. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  291. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  292. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  293. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  294. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  295. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  296. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  297. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  298. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  299. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  300. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  301. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  302. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  304. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  305. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  306. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  307. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  308. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  309. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  310. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  311. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  312. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  313. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  314. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  316. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  317. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  318. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  319. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  320. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  321. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  322. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  323. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  324. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  325. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  326. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  328. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  329. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  330. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  331. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  332. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  333. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  334. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  335. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  336. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  337. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  338. data/ext/cosmos/ext/array/array.c +111 -111
  339. data/ext/cosmos/ext/array/extconf.rb +13 -13
  340. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  341. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  342. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  343. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  344. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  345. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  346. data/ext/cosmos/ext/crc/crc.c +341 -341
  347. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  348. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  349. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  350. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  351. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -261
  352. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  353. data/ext/cosmos/ext/packet/packet.c +339 -339
  354. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  355. data/ext/cosmos/ext/platform/platform.c +81 -81
  356. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  357. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  358. data/ext/cosmos/ext/string/extconf.rb +13 -13
  359. data/ext/cosmos/ext/string/string.c +49 -49
  360. data/ext/cosmos/ext/structure/structure.c +894 -894
  361. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  362. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  363. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  364. data/ext/cosmos/ext/telemetry/telemetry.c +306 -306
  365. data/ext/mkrf_conf.rb +40 -40
  366. data/install/Gemfile +6 -6
  367. data/install/Launcher +14 -14
  368. data/install/Launcher.bat +59 -59
  369. data/install/Rakefile +61 -61
  370. data/install/config/data/crc.txt +134 -133
  371. data/install/config/system/system.txt +29 -29
  372. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  373. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  374. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  375. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  376. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  377. data/install/config/targets/COSMOS/target.txt +8 -8
  378. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  379. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  380. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  381. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  382. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  383. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  384. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  385. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  386. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  387. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  388. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  389. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  390. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  391. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  392. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  393. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  394. data/install/config/tools/launcher/launcher.txt +39 -39
  395. data/install/config/tools/script_runner/script_runner.txt +3 -3
  396. data/install/config/tools/test_runner/test_runner.txt +8 -8
  397. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  398. data/install/lib/user_version.rb +3 -3
  399. data/install/tools/CmdExtractor +15 -15
  400. data/install/tools/CmdExtractor.bat +59 -59
  401. data/install/tools/CmdSender +15 -15
  402. data/install/tools/CmdSender.bat +59 -59
  403. data/install/tools/CmdTlmServer +15 -15
  404. data/install/tools/CmdTlmServer.bat +59 -59
  405. data/install/tools/DataViewer +15 -15
  406. data/install/tools/DataViewer.bat +59 -59
  407. data/install/tools/HandbookCreator +15 -15
  408. data/install/tools/HandbookCreator.bat +61 -61
  409. data/install/tools/Launcher +15 -15
  410. data/install/tools/Launcher.bat +59 -59
  411. data/install/tools/LimitsMonitor +15 -15
  412. data/install/tools/LimitsMonitor.bat +59 -59
  413. data/install/tools/OpenGLBuilder +15 -15
  414. data/install/tools/OpenGLBuilder.bat +59 -59
  415. data/install/tools/PacketViewer +15 -15
  416. data/install/tools/PacketViewer.bat +59 -59
  417. data/install/tools/Replay +15 -15
  418. data/install/tools/Replay.bat +59 -59
  419. data/install/tools/ScriptRunner +15 -15
  420. data/install/tools/ScriptRunner.bat +59 -59
  421. data/install/tools/TableManager +15 -15
  422. data/install/tools/TableManager.bat +59 -59
  423. data/install/tools/TestRunner +15 -15
  424. data/install/tools/TestRunner.bat +59 -59
  425. data/install/tools/TlmExtractor +15 -15
  426. data/install/tools/TlmExtractor.bat +59 -59
  427. data/install/tools/TlmGrapher +15 -15
  428. data/install/tools/TlmGrapher.bat +59 -59
  429. data/install/tools/TlmViewer +15 -15
  430. data/install/tools/TlmViewer.bat +59 -59
  431. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  432. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  433. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  434. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  435. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  436. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  437. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  438. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  439. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  440. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  441. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  442. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  443. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  444. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  445. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  446. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  447. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  448. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  449. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  450. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  451. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  452. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  453. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  454. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  455. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  456. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  457. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  458. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  459. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  460. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  461. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  463. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  464. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  465. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  466. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  467. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  468. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  469. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  470. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  471. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  472. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  473. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  475. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  476. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  477. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  478. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  479. data/lib/cosmos.rb +63 -63
  480. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  481. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  482. data/lib/cosmos/config/config_parser.rb +324 -324
  483. data/lib/cosmos/conversions.rb +13 -13
  484. data/lib/cosmos/conversions/conversion.rb +47 -47
  485. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  486. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  487. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  488. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  489. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  490. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  491. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  492. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  493. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  494. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  495. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  496. data/lib/cosmos/core_ext.rb +18 -18
  497. data/lib/cosmos/core_ext/array.rb +354 -354
  498. data/lib/cosmos/core_ext/class.rb +51 -51
  499. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  500. data/lib/cosmos/core_ext/exception.rb +52 -52
  501. data/lib/cosmos/core_ext/file.rb +75 -75
  502. data/lib/cosmos/core_ext/hash.rb +28 -28
  503. data/lib/cosmos/core_ext/io.rb +75 -75
  504. data/lib/cosmos/core_ext/kernel.rb +38 -38
  505. data/lib/cosmos/core_ext/math.rb +119 -119
  506. data/lib/cosmos/core_ext/matrix.rb +146 -146
  507. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  508. data/lib/cosmos/core_ext/range.rb +22 -22
  509. data/lib/cosmos/core_ext/socket.rb +32 -32
  510. data/lib/cosmos/core_ext/string.rb +310 -310
  511. data/lib/cosmos/core_ext/stringio.rb +24 -24
  512. data/lib/cosmos/core_ext/time.rb +446 -446
  513. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  514. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  515. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  516. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  517. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  518. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -317
  519. data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
  520. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  521. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  522. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  523. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  524. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  525. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  526. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -196
  527. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
  528. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  529. data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
  530. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
  531. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  532. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  533. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  534. data/lib/cosmos/gui/dialogs/splash.rb +113 -113
  535. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  536. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  537. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  538. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  539. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -494
  540. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  541. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
  542. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  543. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  544. data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -459
  545. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  546. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  547. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  548. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  549. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  550. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  551. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -712
  552. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  553. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  554. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  555. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  556. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  557. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  558. data/lib/cosmos/gui/qt.rb +813 -786
  559. data/lib/cosmos/gui/qt_tool.rb +378 -373
  560. data/lib/cosmos/gui/text/completion.rb +381 -381
  561. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  562. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  563. data/lib/cosmos/gui/text/ruby_editor.rb +395 -395
  564. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  565. data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
  566. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  567. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  568. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  569. data/lib/cosmos/interfaces.rb +11 -11
  570. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -149
  571. data/lib/cosmos/interfaces/interface.rb +213 -213
  572. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  573. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  574. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -128
  575. data/lib/cosmos/interfaces/stream_interface.rb +156 -156
  576. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  577. data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
  578. data/lib/cosmos/interfaces/udp_interface.rb +173 -173
  579. data/lib/cosmos/io/buffered_file.rb +11 -11
  580. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  581. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  582. data/lib/cosmos/io/json_drb.rb +344 -320
  583. data/lib/cosmos/io/json_drb_object.rb +137 -137
  584. data/lib/cosmos/io/json_rpc.rb +365 -365
  585. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  586. data/lib/cosmos/io/raw_logger.rb +174 -174
  587. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  588. data/lib/cosmos/io/serial_driver.rb +85 -85
  589. data/lib/cosmos/io/stderr.rb +36 -36
  590. data/lib/cosmos/io/stdout.rb +36 -36
  591. data/lib/cosmos/io/tcpip_server.rb +583 -532
  592. data/lib/cosmos/io/udp_sockets.rb +152 -152
  593. data/lib/cosmos/io/win32_serial_driver.rb +147 -147
  594. data/lib/cosmos/packet_logs.rb +6 -6
  595. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  596. data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
  597. data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
  598. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  599. data/lib/cosmos/packets/binary_accessor.rb +921 -921
  600. data/lib/cosmos/packets/commands.rb +291 -291
  601. data/lib/cosmos/packets/limits.rb +263 -263
  602. data/lib/cosmos/packets/limits_response.rb +38 -38
  603. data/lib/cosmos/packets/packet.rb +714 -699
  604. data/lib/cosmos/packets/packet_config.rb +1034 -1034
  605. data/lib/cosmos/packets/packet_item.rb +317 -317
  606. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  607. data/lib/cosmos/packets/structure.rb +421 -386
  608. data/lib/cosmos/packets/structure_item.rb +233 -233
  609. data/lib/cosmos/packets/telemetry.rb +317 -317
  610. data/lib/cosmos/processors.rb +6 -6
  611. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  612. data/lib/cosmos/processors/processor.rb +71 -71
  613. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  614. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  615. data/lib/cosmos/script.rb +9 -9
  616. data/lib/cosmos/script/extract.rb +115 -115
  617. data/lib/cosmos/script/script.rb +1513 -1493
  618. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  619. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  620. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  621. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  622. data/lib/cosmos/streams/serial_stream.rb +152 -143
  623. data/lib/cosmos/streams/stream.rb +57 -57
  624. data/lib/cosmos/streams/stream_protocol.rb +369 -369
  625. data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
  626. data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
  627. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  628. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  629. data/lib/cosmos/system.rb +4 -4
  630. data/lib/cosmos/system/system.rb +558 -558
  631. data/lib/cosmos/system/target.rb +178 -178
  632. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
  633. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
  634. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  635. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  636. data/lib/cosmos/tools/cmd_tlm_server/api.rb +936 -940
  637. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  638. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
  639. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
  640. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
  641. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
  642. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  643. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
  644. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
  645. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  646. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  647. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  648. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  649. data/lib/cosmos/tools/data_viewer/data_viewer.rb +628 -600
  650. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
  651. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  652. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
  653. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
  654. data/lib/cosmos/tools/launcher/launcher.rb +184 -184
  655. data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
  656. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
  657. data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
  658. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
  659. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  660. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  661. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -525
  662. data/lib/cosmos/tools/replay/replay.rb +495 -488
  663. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  664. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
  665. data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
  666. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  667. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
  668. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  669. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  670. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  671. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  672. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  673. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  674. data/lib/cosmos/tools/test_runner/test.rb +480 -480
  675. data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
  676. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
  677. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  678. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
  679. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  680. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  681. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  682. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  683. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -94
  684. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  685. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -180
  686. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  687. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  688. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -173
  689. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
  690. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
  691. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  692. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  693. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -320
  694. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  695. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  696. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  697. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  698. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  699. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  700. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  701. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  702. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  703. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  704. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  705. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -1278
  706. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  707. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  708. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +111 -95
  709. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  710. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +72 -66
  711. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  712. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  713. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  714. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -458
  715. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
  716. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
  717. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  718. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  719. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -70
  720. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
  721. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  722. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  723. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  724. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  725. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  726. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  727. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  728. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  729. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  730. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  731. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  732. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  733. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  734. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  735. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  736. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  737. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  738. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  739. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  740. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  741. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  742. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  743. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  744. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  745. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  746. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  747. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  748. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  749. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  750. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  751. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  752. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  753. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  754. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  755. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  756. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  757. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  758. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  759. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  760. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  761. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  762. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  763. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  764. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  765. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  766. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  767. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  768. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  769. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  770. data/lib/cosmos/top_level.rb +647 -596
  771. data/lib/cosmos/utilities.rb +11 -10
  772. data/lib/cosmos/utilities/crc.rb +166 -166
  773. data/lib/cosmos/utilities/csv.rb +83 -83
  774. data/lib/cosmos/utilities/logger.rb +137 -137
  775. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  776. data/lib/cosmos/utilities/message_log.rb +74 -74
  777. data/lib/cosmos/utilities/quaternion.rb +258 -258
  778. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  779. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  780. data/lib/cosmos/utilities/sleeper.rb +44 -0
  781. data/lib/cosmos/version.rb +12 -12
  782. data/lib/cosmos/win32/excel.rb +66 -66
  783. data/lib/cosmos/win32/win32.rb +387 -387
  784. data/lib/cosmos/win32/win32_main.rb +311 -311
  785. data/roodi.yml +24 -24
  786. data/run_gui_tests.bat +32 -32
  787. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  788. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  789. data/spec/config/config_parser_spec.rb +322 -322
  790. data/spec/conversions/conversion_spec.rb +31 -31
  791. data/spec/conversions/generic_conversion_spec.rb +45 -45
  792. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  793. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  794. data/spec/conversions/processor_conversion_spec.rb +45 -45
  795. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  796. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  797. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  798. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  799. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  800. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  801. data/spec/core_ext/array_spec.rb +186 -186
  802. data/spec/core_ext/class_spec.rb +36 -36
  803. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  804. data/spec/core_ext/exception_spec.rb +91 -91
  805. data/spec/core_ext/file_spec.rb +72 -72
  806. data/spec/core_ext/hash_spec.rb +24 -24
  807. data/spec/core_ext/io_spec.rb +46 -46
  808. data/spec/core_ext/kernel_spec.rb +54 -54
  809. data/spec/core_ext/math_spec.rb +116 -116
  810. data/spec/core_ext/matrix_spec.rb +66 -66
  811. data/spec/core_ext/objectspace_spec.rb +29 -29
  812. data/spec/core_ext/range_spec.rb +21 -21
  813. data/spec/core_ext/socket_spec.rb +32 -32
  814. data/spec/core_ext/string_spec.rb +223 -223
  815. data/spec/core_ext/stringio_spec.rb +21 -21
  816. data/spec/core_ext/time_spec.rb +151 -151
  817. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  818. data/spec/install/config/system/system.txt +33 -33
  819. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  820. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  821. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  822. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  823. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  824. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  825. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  826. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  827. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  828. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  829. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  830. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -294
  831. data/spec/install/config/targets/INST/target.txt +10 -10
  832. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  833. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  834. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  835. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  836. data/spec/interfaces/interface_spec.rb +130 -131
  837. data/spec/interfaces/linc_interface_spec.rb +199 -199
  838. data/spec/interfaces/serial_interface_spec.rb +56 -56
  839. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  840. data/spec/interfaces/stream_interface_spec.rb +157 -157
  841. data/spec/interfaces/tcpip_client_interface_spec.rb +54 -54
  842. data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
  843. data/spec/interfaces/udp_interface_spec.rb +175 -177
  844. data/spec/io/buffered_file_spec.rb +113 -113
  845. data/spec/io/io_multiplexer_spec.rb +94 -94
  846. data/spec/io/json_drb_object_spec.rb +99 -99
  847. data/spec/io/json_drb_spec.rb +311 -311
  848. data/spec/io/json_rpc_spec.rb +264 -264
  849. data/spec/io/raw_logger_pair_spec.rb +76 -76
  850. data/spec/io/raw_logger_spec.rb +133 -133
  851. data/spec/io/serial_driver_spec.rb +61 -61
  852. data/spec/io/stderr_spec.rb +32 -32
  853. data/spec/io/stdout_spec.rb +32 -32
  854. data/spec/io/tcpip_server_spec.rb +338 -338
  855. data/spec/io/udp_sockets_spec.rb +94 -94
  856. data/spec/io/win32_serial_driver_spec.rb +88 -88
  857. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  858. data/spec/packet_logs/packet_log_reader_spec.rb +408 -408
  859. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  860. data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
  861. data/spec/packets/binary_accessor_spec.rb +2073 -2073
  862. data/spec/packets/commands_spec.rb +369 -369
  863. data/spec/packets/limits_response_spec.rb +25 -25
  864. data/spec/packets/limits_spec.rb +326 -326
  865. data/spec/packets/packet_config_spec.rb +1620 -1620
  866. data/spec/packets/packet_item_limits_spec.rb +161 -161
  867. data/spec/packets/packet_item_spec.rb +386 -386
  868. data/spec/packets/packet_spec.rb +1057 -949
  869. data/spec/packets/structure_item_spec.rb +195 -195
  870. data/spec/packets/structure_spec.rb +419 -419
  871. data/spec/packets/telemetry_spec.rb +535 -535
  872. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  873. data/spec/processors/processor_spec.rb +55 -55
  874. data/spec/processors/statistics_processor_spec.rb +60 -60
  875. data/spec/processors/watermark_processor_spec.rb +51 -51
  876. data/spec/script/script_spec.rb +654 -654
  877. data/spec/spec_helper.rb +154 -148
  878. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  879. data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
  880. data/spec/streams/length_stream_protocol_spec.rb +297 -297
  881. data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
  882. data/spec/streams/serial_stream_spec.rb +105 -105
  883. data/spec/streams/stream_protocol_spec.rb +332 -332
  884. data/spec/streams/stream_spec.rb +29 -29
  885. data/spec/streams/tcpip_client_stream_spec.rb +54 -54
  886. data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
  887. data/spec/streams/template_stream_protocol_spec.rb +151 -151
  888. data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
  889. data/spec/system/system_spec.rb +645 -645
  890. data/spec/system/target_spec.rb +248 -248
  891. data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
  892. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  893. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  894. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +411 -411
  895. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  896. data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
  897. data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
  898. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  899. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
  900. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  901. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
  902. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
  903. data/spec/top_level/top_level_spec.rb +334 -321
  904. data/spec/utilities/crc_spec.rb +45 -45
  905. data/spec/utilities/csv_spec.rb +97 -97
  906. data/spec/utilities/logger_spec.rb +102 -102
  907. data/spec/utilities/message_log_spec.rb +89 -89
  908. data/spec/utilities/quaternion_spec.rb +107 -107
  909. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  910. data/tasks/manifest.rake +22 -22
  911. data/tasks/spec.rake +23 -23
  912. metadata +18 -2
@@ -1,1113 +1,1087 @@
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 'spec_helper'
12
- require 'cosmos'
13
- require 'cosmos/tools/cmd_tlm_server/cmd_tlm_server'
14
- require 'cosmos/tools/cmd_tlm_server/api'
15
-
16
- module Cosmos
17
-
18
- describe Api do
19
-
20
- before(:all) do
21
- cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
22
- FileUtils.mkdir_p(File.dirname(cts))
23
- File.open(cts,'w') do |file|
24
- file.puts 'INTERFACE INT interface.rb'
25
- file.puts 'ROUTER ROUTE interface.rb'
26
- end
27
- end
28
-
29
- before(:each) do
30
- @api = CmdTlmServer.new
31
- config = @api.interfaces.instance_variable_get(:@config)
32
- # Stub interfaces and routers. Do this like this so that they can still be used in an after hook
33
- config.interfaces.each do |interface_name, i|
34
- if i.class == Cosmos::Interface
35
- def i.connected?(*args)
36
- end
37
- def i.connect(*args)
38
- end
39
- def i.disconnect(*args)
40
- end
41
- def i.write_raw(*args)
42
- end
43
- def i.read(*args)
44
- end
45
- end
46
- end
47
- config.routers.each do |router_name, i|
48
- if i.class == Cosmos::Interface
49
- def i.connected?(*args)
50
- end
51
- def i.connect(*args)
52
- end
53
- def i.disconnect(*args)
54
- end
55
- def i.write_raw(*args)
56
- end
57
- def i.read(*args)
58
- end
59
- end
60
- end
61
- allow(@api.commanding).to receive(:send_command_to_target)
62
- end
63
-
64
- after(:each) do
65
- @api.stop
66
- sleep(0.2)
67
- end
68
-
69
- after(:all) do
70
- clean_config()
71
- FileUtils.rm_rf File.join(Cosmos::USERPATH,'config','tools')
72
- end
73
-
74
- def test_cmd_unknown(method)
75
- expect { @api.send(method,"BLAH COLLECT with TYPE NORMAL") }.to raise_error(/does not exist/)
76
- expect { @api.send(method,"INST UNKNOWN with TYPE NORMAL") }.to raise_error(/does not exist/)
77
- expect { @api.send(method,"INST COLLECT with BLAH NORMAL") }.to raise_error(/does not exist/)
78
- expect { @api.send(method,"BLAH","COLLECT","TYPE"=>"NORMAL") }.to raise_error(/does not exist/)
79
- expect { @api.send(method,"INST","UNKNOWN","TYPE"=>"NORMAL") }.to raise_error(/does not exist/)
80
- expect { @api.send(method,"INST","COLLECT","BLAH"=>"NORMAL") }.to raise_error(/does not exist/)
81
- end
82
-
83
- describe "cmd" do
84
- it "should complain about unknown targets, commands, and parameters" do
85
- test_cmd_unknown(:cmd)
86
- sleep(0.5)
87
- end
88
-
89
- it "should process a string" do
90
- target_name, cmd_name, params = @api.cmd("INST COLLECT with TYPE NORMAL, DURATION 5")
91
- target_name.should eql 'INST'
92
- cmd_name.should eql 'COLLECT'
93
- params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
94
- end
95
-
96
- it "should complain if parameters are not separated by commas" do
97
- expect { @api.cmd("INST COLLECT with TYPE NORMAL DURATION 5") }.to raise_error(/Missing comma/)
98
- end
99
-
100
- it "should complain if parameters don't have values" do
101
- expect { @api.cmd("INST COLLECT with TYPE") }.to raise_error(/Missing value/)
102
- end
103
-
104
- it "should process parameters" do
105
- target_name, cmd_name, params = @api.cmd("INST","COLLECT","TYPE"=>"NORMAL","DURATION"=>5)
106
- target_name.should eql 'INST'
107
- cmd_name.should eql 'COLLECT'
108
- params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
109
- end
110
-
111
- it "should process commands without parameters" do
112
- target_name, cmd_name, params = @api.cmd("INST","ABORT")
113
- target_name.should eql 'INST'
114
- cmd_name.should eql 'ABORT'
115
- params.should be {}
116
- end
117
-
118
- it "should complain about too many parameters" do
119
- expect { @api.cmd("INST","COLLECT","TYPE","DURATION") }.to raise_error(/Invalid number of arguments/)
120
- end
121
-
122
- it "should warn about required parameters" do
123
- expect { @api.cmd("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
124
- end
125
-
126
- it "should warn about out of range parameters" do
127
- expect { @api.cmd("INST COLLECT with TYPE NORMAL, DURATION 1000") }.to raise_error(/not in valid range/)
128
- end
129
-
130
- it "should warn about hazardous parameters" do
131
- expect { @api.cmd("INST COLLECT with TYPE SPECIAL") }.to raise_error(/Hazardous/)
132
- end
133
-
134
- it "should warn about hazardous commands" do
135
- expect { @api.cmd("INST CLEAR") }.to raise_error(/Hazardous/)
136
- end
137
- end
138
-
139
- describe "cmd_no_range_check" do
140
- it "should complain about unknown targets, commands, and parameters" do
141
- test_cmd_unknown(:cmd_no_range_check)
142
- end
143
-
144
- it "should process a string" do
145
- target_name, cmd_no_range_check_name, params = @api.cmd_no_range_check("INST COLLECT with TYPE NORMAL, DURATION 5")
146
- target_name.should eql 'INST'
147
- cmd_no_range_check_name.should eql 'COLLECT'
148
- params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
149
- end
150
-
151
- it "should process parameters" do
152
- target_name, cmd_no_range_check_name, params = @api.cmd_no_range_check("INST","COLLECT","TYPE"=>"NORMAL","DURATION"=>5)
153
- target_name.should eql 'INST'
154
- cmd_no_range_check_name.should eql 'COLLECT'
155
- params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
156
- end
157
-
158
- it "should warn about required parameters" do
159
- expect { @api.cmd_no_range_check("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
160
- end
161
-
162
- it "should not warn about out of range parameters" do
163
- expect { @api.cmd_no_range_check("INST COLLECT with TYPE NORMAL, DURATION 1000") }.to_not raise_error
164
- end
165
-
166
- it "should warn about hazardous parameters" do
167
- expect { @api.cmd_no_range_check("INST COLLECT with TYPE SPECIAL") }.to raise_error(/Hazardous/)
168
- end
169
-
170
- it "should warn about hazardous commands" do
171
- expect { @api.cmd_no_range_check("INST CLEAR") }.to raise_error(/Hazardous/)
172
- end
173
- end
174
-
175
- describe "cmd_no_hazardous_check" do
176
- it "should complain about unknown targets, commands, and parameters" do
177
- test_cmd_unknown(:cmd_no_hazardous_check)
178
- end
179
-
180
- it "should process a string" do
181
- target_name, cmd_no_hazardous_check_name, params = @api.cmd_no_hazardous_check("INST COLLECT with TYPE NORMAL, DURATION 5")
182
- target_name.should eql 'INST'
183
- cmd_no_hazardous_check_name.should eql 'COLLECT'
184
- params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
185
- end
186
-
187
- it "should process parameters" do
188
- target_name, cmd_no_hazardous_check_name, params = @api.cmd_no_hazardous_check("INST","COLLECT","TYPE"=>"NORMAL","DURATION"=>5)
189
- target_name.should eql 'INST'
190
- cmd_no_hazardous_check_name.should eql 'COLLECT'
191
- params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
192
- end
193
-
194
- it "should process parameters that are strings" do
195
- target_name, cmd_name, params = @api.cmd_no_hazardous_check("INST ASCIICMD with STRING 'ARM LASER'")
196
- target_name.should eql 'INST'
197
- cmd_name.should eql 'ASCIICMD'
198
- params.should include('STRING'=>'ARM LASER')
199
- end
200
-
201
- it "should warn about required parameters" do
202
- expect { @api.cmd_no_hazardous_check("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
203
- end
204
-
205
- it "should warn about out of range parameters" do
206
- expect { @api.cmd_no_hazardous_check("INST COLLECT with TYPE NORMAL, DURATION 1000") }.to raise_error(/not in valid range/)
207
- end
208
-
209
- it "should not warn about hazardous parameters" do
210
- expect { @api.cmd_no_hazardous_check("INST COLLECT with TYPE SPECIAL") }.to_not raise_error
211
- end
212
-
213
- it "should not warn about hazardous commands" do
214
- expect { @api.cmd_no_hazardous_check("INST CLEAR") }.to_not raise_error
215
- end
216
- end
217
-
218
- describe "cmd_no_checks" do
219
- it "should complain about unknown targets, commands, and parameters" do
220
- test_cmd_unknown(:cmd_no_checks)
221
- end
222
-
223
- it "should process a string" do
224
- target_name, cmd_no_checks_name, params = @api.cmd_no_checks("INST COLLECT with TYPE NORMAL, DURATION 5")
225
- target_name.should eql 'INST'
226
- cmd_no_checks_name.should eql 'COLLECT'
227
- params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
228
- end
229
-
230
- it "should process parameters" do
231
- target_name, cmd_no_checks_name, params = @api.cmd_no_checks("INST","COLLECT","TYPE"=>"NORMAL","DURATION"=>5)
232
- target_name.should eql 'INST'
233
- cmd_no_checks_name.should eql 'COLLECT'
234
- params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
235
- end
236
-
237
- it "should warn about required parameters" do
238
- expect { @api.cmd_no_checks("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
239
- end
240
-
241
- it "should not warn about out of range parameters" do
242
- expect { @api.cmd_no_checks("INST COLLECT with TYPE NORMAL, DURATION 1000") }.to_not raise_error
243
- end
244
-
245
- it "should not warn about hazardous parameters" do
246
- expect { @api.cmd_no_checks("INST COLLECT with TYPE SPECIAL") }.to_not raise_error
247
- end
248
-
249
- it "should not warn about hazardous commands" do
250
- expect { @api.cmd_no_checks("INST CLEAR") }.to_not raise_error
251
- end
252
- end
253
-
254
- describe "cmd_raw" do
255
- it "should complain about unknown targets, commands, and parameters" do
256
- test_cmd_unknown(:cmd_raw)
257
- end
258
-
259
- it "should process a string" do
260
- target_name, cmd_name, params = @api.cmd_raw("INST COLLECT with TYPE 0, DURATION 5")
261
- target_name.should eql 'INST'
262
- cmd_name.should eql 'COLLECT'
263
- params.should include('TYPE'=>0, 'DURATION'=>5)
264
- end
265
-
266
- it "should complain if parameters are not separated by commas" do
267
- expect { @api.cmd_raw("INST COLLECT with TYPE 0 DURATION 5") }.to raise_error(/Missing comma/)
268
- end
269
-
270
- it "should complain if parameters don't have values" do
271
- expect { @api.cmd_raw("INST COLLECT with TYPE") }.to raise_error(/Missing value/)
272
- end
273
-
274
- it "should process parameters" do
275
- target_name, cmd_name, params = @api.cmd_raw("INST","COLLECT","TYPE"=>0,"DURATION"=>5)
276
- target_name.should eql 'INST'
277
- cmd_name.should eql 'COLLECT'
278
- params.should include('TYPE'=>0, 'DURATION'=>5)
279
- end
280
-
281
- it "should process commands without parameters" do
282
- target_name, cmd_name, params = @api.cmd_raw("INST","ABORT")
283
- target_name.should eql 'INST'
284
- cmd_name.should eql 'ABORT'
285
- params.should be {}
286
- end
287
-
288
- it "should complain about too many parameters" do
289
- expect { @api.cmd_raw("INST","COLLECT","TYPE","DURATION") }.to raise_error(/Invalid number of arguments/)
290
- end
291
-
292
- it "should warn about required parameters" do
293
- expect { @api.cmd_raw("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
294
- end
295
-
296
- it "should warn about out of range parameters" do
297
- expect { @api.cmd_raw("INST COLLECT with TYPE 0, DURATION 1000") }.to raise_error(/not in valid range/)
298
- end
299
-
300
- it "should warn about hazardous parameters" do
301
- expect { @api.cmd_raw("INST COLLECT with TYPE 1") }.to raise_error(/Hazardous/)
302
- end
303
-
304
- it "should warn about hazardous commands" do
305
- expect { @api.cmd_raw("INST CLEAR") }.to raise_error(/Hazardous/)
306
- end
307
- end
308
-
309
- describe "cmd_no_range_check" do
310
- it "should complain about unknown targets, commands, and parameters" do
311
- test_cmd_unknown(:cmd_raw_no_range_check)
312
- end
313
-
314
- it "should process a string" do
315
- target_name, cmd_no_range_check_name, params = @api.cmd_raw_no_range_check("INST COLLECT with TYPE 0, DURATION 5")
316
- target_name.should eql 'INST'
317
- cmd_no_range_check_name.should eql 'COLLECT'
318
- params.should include('TYPE'=>0, 'DURATION'=>5)
319
- end
320
-
321
- it "should process parameters" do
322
- target_name, cmd_no_range_check_name, params = @api.cmd_raw_no_range_check("INST","COLLECT","TYPE"=>0,"DURATION"=>5)
323
- target_name.should eql 'INST'
324
- cmd_no_range_check_name.should eql 'COLLECT'
325
- params.should include('TYPE'=>0, 'DURATION'=>5)
326
- end
327
-
328
- it "should warn about required parameters" do
329
- expect { @api.cmd_raw_no_range_check("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
330
- end
331
-
332
- it "should not warn about out of range parameters" do
333
- expect { @api.cmd_raw_no_range_check("INST COLLECT with TYPE 0, DURATION 1000") }.to_not raise_error
334
- end
335
-
336
- it "should warn about hazardous parameters" do
337
- expect { @api.cmd_raw_no_range_check("INST COLLECT with TYPE 1") }.to raise_error(/Hazardous/)
338
- end
339
-
340
- it "should warn about hazardous commands" do
341
- expect { @api.cmd_raw_no_range_check("INST CLEAR") }.to raise_error(/Hazardous/)
342
- end
343
- end
344
-
345
- describe "cmd_raw_no_hazardous_check" do
346
- it "should complain about unknown targets, commands, and parameters" do
347
- test_cmd_unknown(:cmd_raw_no_hazardous_check)
348
- end
349
-
350
- it "should process a string" do
351
- target_name, cmd_no_hazardous_check_name, params = @api.cmd_raw_no_hazardous_check("INST COLLECT with TYPE 0, DURATION 5")
352
- target_name.should eql 'INST'
353
- cmd_no_hazardous_check_name.should eql 'COLLECT'
354
- params.should include('TYPE'=>0, 'DURATION'=>5)
355
- end
356
-
357
- it "should process parameters" do
358
- target_name, cmd_no_hazardous_check_name, params = @api.cmd_raw_no_hazardous_check("INST","COLLECT","TYPE"=>0,"DURATION"=>5)
359
- target_name.should eql 'INST'
360
- cmd_no_hazardous_check_name.should eql 'COLLECT'
361
- params.should include('TYPE'=>0, 'DURATION'=>5)
362
- end
363
-
364
- it "should process parameters that are strings" do
365
- target_name, cmd_name, params = @api.cmd_raw_no_hazardous_check("INST ASCIICMD with STRING 'ARM LASER'")
366
- target_name.should eql 'INST'
367
- cmd_name.should eql 'ASCIICMD'
368
- params.should include('STRING'=>'ARM LASER')
369
- end
370
-
371
- it "should warn about required parameters" do
372
- expect { @api.cmd_raw_no_hazardous_check("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
373
- end
374
-
375
- it "should warn about out of range parameters" do
376
- expect { @api.cmd_raw_no_hazardous_check("INST COLLECT with TYPE 0, DURATION 1000") }.to raise_error(/not in valid range/)
377
- end
378
-
379
- it "should not warn about hazardous parameters" do
380
- expect { @api.cmd_raw_no_hazardous_check("INST COLLECT with TYPE 1") }.to_not raise_error
381
- end
382
-
383
- it "should not warn about hazardous commands" do
384
- expect { @api.cmd_raw_no_hazardous_check("INST CLEAR") }.to_not raise_error
385
- end
386
- end
387
-
388
- describe "cmd_raw_no_checks" do
389
- it "should complain about unknown targets, commands, and parameters" do
390
- test_cmd_unknown(:cmd_raw_no_checks)
391
- end
392
-
393
- it "should process a string" do
394
- target_name, cmd_no_checks_name, params = @api.cmd_raw_no_checks("INST COLLECT with TYPE 0, DURATION 5")
395
- target_name.should eql 'INST'
396
- cmd_no_checks_name.should eql 'COLLECT'
397
- params.should include('TYPE'=>0, 'DURATION'=>5)
398
- end
399
-
400
- it "should process parameters" do
401
- target_name, cmd_no_checks_name, params = @api.cmd_raw_no_checks("INST","COLLECT","TYPE"=>0,"DURATION"=>5)
402
- target_name.should eql 'INST'
403
- cmd_no_checks_name.should eql 'COLLECT'
404
- params.should include('TYPE'=>0, 'DURATION'=>5)
405
- end
406
-
407
- it "should warn about required parameters" do
408
- expect { @api.cmd_raw_no_checks("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
409
- end
410
-
411
- it "should not warn about out of range parameters" do
412
- expect { @api.cmd_raw_no_checks("INST COLLECT with TYPE 0, DURATION 1000") }.to_not raise_error
413
- end
414
-
415
- it "should not warn about hazardous parameters" do
416
- expect { @api.cmd_raw_no_checks("INST COLLECT with TYPE 1") }.to_not raise_error
417
- end
418
-
419
- it "should not warn about hazardous commands" do
420
- expect { @api.cmd_raw_no_checks("INST CLEAR") }.to_not raise_error
421
- end
422
- end
423
-
424
- describe "get_cmd_list" do
425
- it "should return command names sorted" do
426
- result = @api.get_cmd_list("INST")
427
- result.sort.should eql result
428
- end
429
-
430
- it "should complain with a unknown target" do
431
- expect { @api.get_cmd_list("BLAH") }.to raise_error(/does not exist/)
432
- end
433
-
434
- it "should return command names and descriptions for a given target" do
435
- result = @api.get_cmd_list("INST")
436
- result[0][0].should eql "ABORT"
437
- # The second parameter is the description ... only test one
438
- result[0][1].should eql "Aborts a collect on the instrument"
439
- result[1][0].should eql "ARYCMD"
440
- result[2][0].should eql "ASCIICMD"
441
- result[3][0].should eql "CLEAR"
442
- result[4][0].should eql "COLLECT"
443
- result[5][0].should eql "COSMOS_ERROR_HANDLE"
444
- result[6][0].should eql "COSMOS_ERROR_IGNORE"
445
- result[7][0].should eql "COSMOS_HANDSHAKE_DS"
446
- result[8][0].should eql "COSMOS_HANDSHAKE_EN"
447
- result[9][0].should eql "FLTCMD"
448
- result[10][0].should eql "LINC_COMMAND"
449
- result[11][0].should eql "SETPARAMS"
450
- result[12][0].should eql "SLRPNLDEPLOY"
451
- result[13][0].should eql "SLRPNLRESET"
452
- end
453
- end
454
-
455
- describe "get_cmd_param_list" do
456
- it "should return parameters for the command" do
457
- result = @api.get_cmd_param_list("INST","COLLECT")
458
- # Each element in the results array contains:
459
- # name, default, states, description, full units, units, required
460
- result.should include ['TYPE',0,{"NORMAL"=>0,"SPECIAL"=>1},'Collect type',nil,nil,true]
461
- result.should include ['TEMP',0.0,nil,'Collect temperature','Celcius','C',false]
462
- end
463
-
464
- it "should return array parameters for the command" do
465
- result = @api.get_cmd_param_list("INST","ARYCMD")
466
- # Each element in the results array contains:
467
- # name, default, states, description, full units, units, required
468
- result.should include ['ARRAY',[],nil,'Array parameter',nil,nil,false]
469
- end
470
- end
471
-
472
- describe "get_cmd_hazardous" do
473
- it "should return whether the command with parameters is hazardous" do
474
- @api.get_cmd_hazardous("INST","COLLECT",{"TYPE"=>"NORMAL"}).should be_falsey
475
- @api.get_cmd_hazardous("INST","COLLECT",{"TYPE"=>"SPECIAL"}).should be_truthy
476
- end
477
-
478
- it "should return whether the command is hazardous" do
479
- @api.get_cmd_hazardous("INST","CLEAR").should be_truthy
480
- end
481
- end
482
-
483
- def test_tlm_unknown(method)
484
- expect { @api.send(method,"BLAH HEALTH_STATUS COLLECTS") }.to raise_error(/does not exist/)
485
- expect { @api.send(method,"INST UNKNOWN COLLECTS") }.to raise_error(/does not exist/)
486
- expect { @api.send(method,"INST HEALTH_STATUS BLAH") }.to raise_error(/does not exist/)
487
- expect { @api.send(method,"BLAH","HEALTH_STATUS","COLLECTS") }.to raise_error(/does not exist/)
488
- expect { @api.send(method,"INST","UNKNOWN","COLLECTS") }.to raise_error(/does not exist/)
489
- expect { @api.send(method,"INST","HEALTH_STATUS","BLAH") }.to raise_error(/does not exist/)
490
- end
491
-
492
- describe "tlm" do
493
- it "should complain about unknown targets, commands, and parameters" do
494
- test_tlm_unknown(:tlm)
495
- end
496
-
497
- it "should process a string" do
498
- value = @api.tlm("INST HEALTH_STATUS TEMP1")
499
- value.should eql -100.0
500
- end
501
-
502
- it "should process parameters" do
503
- value = @api.tlm("INST","HEALTH_STATUS","TEMP1")
504
- end
505
-
506
- it "should complain if too many parameters" do
507
- expect { @api.tlm("INST","HEALTH_STATUS","TEMP1","TEMP2") }.to raise_error(/Invalid number of arguments/)
508
- end
509
- end
510
-
511
- describe "tlm_raw" do
512
- it "should complain about unknown targets, commands, and parameters" do
513
- test_tlm_unknown(:tlm_raw)
514
- end
515
-
516
- it "should process a string" do
517
- @api.tlm_raw("INST HEALTH_STATUS TEMP1").should eql 0
518
- end
519
-
520
- it "should return the value using LATEST" do
521
- @api.tlm_raw("INST LATEST TEMP1").should eql 0
522
- end
523
-
524
- it "should process parameters" do
525
- @api.tlm_raw("INST","HEALTH_STATUS","TEMP1").should eql 0
526
- end
527
- end
528
-
529
- describe "tlm_formatted" do
530
- it "should complain about unknown targets, commands, and parameters" do
531
- test_tlm_unknown(:tlm_formatted)
532
- end
533
-
534
- it "should process a string" do
535
- @api.tlm_formatted("INST HEALTH_STATUS TEMP1").should eql "-100.000"
536
- end
537
-
538
- it "should return the value using LATEST" do
539
- @api.tlm_formatted("INST LATEST TEMP1").should eql "-100.000"
540
- end
541
-
542
- it "should process parameters" do
543
- @api.tlm_formatted("INST","HEALTH_STATUS","TEMP1").should eql "-100.000"
544
- end
545
- end
546
-
547
- describe "tlm_with_units" do
548
- it "should complain about unknown targets, commands, and parameters" do
549
- test_tlm_unknown(:tlm_with_units)
550
- end
551
-
552
- it "should process a string" do
553
- @api.tlm_with_units("INST HEALTH_STATUS TEMP1").should eql "-100.000 C"
554
- end
555
-
556
- it "should return the value using LATEST" do
557
- @api.tlm_with_units("INST LATEST TEMP1").should eql "-100.000 C"
558
- end
559
-
560
- it "should process parameters" do
561
- @api.tlm_with_units("INST","HEALTH_STATUS","TEMP1").should eql "-100.000 C"
562
- end
563
- end
564
-
565
- describe "tlm_variable" do
566
- it "should complain about unknown targets, commands, and parameters" do
567
- expect { @api.tlm_variable("BLAH HEALTH_STATUS COLLECTS",:RAW) }.to raise_error(/does not exist/)
568
- expect { @api.tlm_variable("INST UNKNOWN COLLECTS",:RAW) }.to raise_error(/does not exist/)
569
- expect { @api.tlm_variable("INST HEALTH_STATUS BLAH",:RAW) }.to raise_error(/does not exist/)
570
- expect { @api.tlm_variable("BLAH","HEALTH_STATUS","COLLECTS",:RAW) }.to raise_error(/does not exist/)
571
- expect { @api.tlm_variable("INST","UNKNOWN","COLLECTS",:RAW) }.to raise_error(/does not exist/)
572
- expect { @api.tlm_variable("INST","HEALTH_STATUS","BLAH",:RAW) }.to raise_error(/does not exist/)
573
- end
574
-
575
- it "should process a string" do
576
- @api.tlm_variable("INST HEALTH_STATUS TEMP1",:CONVERTED).should eql -100.0
577
- @api.tlm_variable("INST HEALTH_STATUS TEMP1",:RAW).should eql 0
578
- @api.tlm_variable("INST HEALTH_STATUS TEMP1",:FORMATTED).should eql "-100.000"
579
- @api.tlm_variable("INST HEALTH_STATUS TEMP1",:WITH_UNITS).should eql "-100.000 C"
580
- end
581
-
582
- it "should return the value using LATEST" do
583
- @api.tlm_variable("INST LATEST TEMP1",:CONVERTED).should eql -100.0
584
- @api.tlm_variable("INST LATEST TEMP1",:RAW).should eql 0
585
- @api.tlm_variable("INST LATEST TEMP1",:FORMATTED).should eql "-100.000"
586
- @api.tlm_variable("INST LATEST TEMP1",:WITH_UNITS).should eql "-100.000 C"
587
- end
588
-
589
- it "should process parameters" do
590
- @api.tlm_variable("INST","HEALTH_STATUS","TEMP1",:CONVERTED).should eql -100.0
591
- @api.tlm_variable("INST","HEALTH_STATUS","TEMP1",:RAW).should eql 0
592
- @api.tlm_variable("INST","HEALTH_STATUS","TEMP1",:FORMATTED).should eql "-100.000"
593
- @api.tlm_variable("INST","HEALTH_STATUS","TEMP1",:WITH_UNITS).should eql "-100.000 C"
594
- end
595
-
596
- it "should complain with too many parameters" do
597
- expect { @api.tlm_variable("INST","HEALTH_STATUS","TEMP1","TEMP2",:CONVERTED) }.to raise_error(/Invalid number of arguments/)
598
- end
599
- end
600
-
601
- describe "set_tlm" do
602
- it "should complain about unknown targets, commands, and parameters" do
603
- expect { @api.set_tlm("BLAH HEALTH_STATUS COLLECTS = 1") }.to raise_error(/does not exist/)
604
- expect { @api.set_tlm("INST UNKNOWN COLLECTS = 1") }.to raise_error(/does not exist/)
605
- expect { @api.set_tlm("INST HEALTH_STATUS BLAH = 1") }.to raise_error(/does not exist/)
606
- expect { @api.set_tlm("BLAH","HEALTH_STATUS","COLLECTS",1) }.to raise_error(/does not exist/)
607
- expect { @api.set_tlm("INST","UNKNOWN","COLLECTS",1) }.to raise_error(/does not exist/)
608
- expect { @api.set_tlm("INST","HEALTH_STATUS","BLAH",1) }.to raise_error(/does not exist/)
609
- end
610
-
611
- it "should process a string" do
612
- @api.set_tlm("INST HEALTH_STATUS TEMP1 = 0.0")
613
- @api.tlm("INST HEALTH_STATUS TEMP1").should be_within(0.00001).of(-0.05759)
614
- end
615
-
616
- it "should process parameters" do
617
- @api.set_tlm("INST","HEALTH_STATUS","TEMP1", 0.0)
618
- @api.tlm("INST HEALTH_STATUS TEMP1").should be_within(0.00001).of(-0.05759)
619
- end
620
-
621
- it "should complain with too many parameters" do
622
- expect { @api.set_tlm("INST","HEALTH_STATUS","TEMP1","TEMP2",0.0) }.to raise_error(/Invalid number of arguments/)
623
- end
624
- end
625
-
626
- describe "set_tlm_raw" do
627
- it "should complain about unknown targets, commands, and parameters" do
628
- expect { @api.set_tlm_raw("BLAH HEALTH_STATUS COLLECTS = 1") }.to raise_error(/does not exist/)
629
- expect { @api.set_tlm_raw("INST UNKNOWN COLLECTS = 1") }.to raise_error(/does not exist/)
630
- expect { @api.set_tlm_raw("INST HEALTH_STATUS BLAH = 1") }.to raise_error(/does not exist/)
631
- expect { @api.set_tlm_raw("BLAH","HEALTH_STATUS","COLLECTS",1) }.to raise_error(/does not exist/)
632
- expect { @api.set_tlm_raw("INST","UNKNOWN","COLLECTS",1) }.to raise_error(/does not exist/)
633
- expect { @api.set_tlm_raw("INST","HEALTH_STATUS","BLAH",1) }.to raise_error(/does not exist/)
634
- end
635
-
636
- it "should process a string" do
637
- @api.set_tlm_raw("INST HEALTH_STATUS TEMP1 = 0.0")
638
- @api.tlm("INST HEALTH_STATUS TEMP1").should eql -100.0
639
- end
640
-
641
- it "should process parameters" do
642
- @api.set_tlm_raw("INST","HEALTH_STATUS","TEMP1", 0.0)
643
- @api.tlm("INST HEALTH_STATUS TEMP1").should eql -100.0
644
- end
645
- end
646
-
647
- describe "get_tlm_packet" do
648
- it "should complain about non-existant targets" do
649
- expect { @api.get_tlm_packet("BLAH","HEALTH_STATUS") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
650
- end
651
-
652
- it "should complain about non-existant packets" do
653
- expect { @api.get_tlm_packet("INST","BLAH") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
654
- end
655
-
656
- it "should complain using LATEST" do
657
- expect { @api.get_tlm_packet("INST","LATEST") }.to raise_error(RuntimeError, "Telemetry packet 'INST LATEST' does not exist")
658
- end
659
-
660
- it "should complain about non-existant value_types" do
661
- expect { @api.get_tlm_packet("INST","HEALTH_STATUS",:MINE) }.to raise_error(ArgumentError, "Unknown value type on read: MINE")
662
- end
663
-
664
- it "should read all telemetry items with their limits states" do
665
- vals = @api.get_tlm_packet("INST","HEALTH_STATUS")
666
- vals[0][0].should eql "RECEIVED_TIMESECONDS"
667
- vals[0][1].should eql 0.0
668
- vals[0][2].should be_nil
669
- vals[1][0].should eql "RECEIVED_TIMEFORMATTED"
670
- vals[1][1].should eql "No Packet Received Time"
671
- vals[1][2].should be_nil
672
- vals[2][0].should eql "RECEIVED_COUNT"
673
- vals[2][1].should eql 0
674
- vals[2][2].should be_nil
675
- # Spot check a few more
676
- vals[22][0].should eql "TEMP1"
677
- vals[22][1].should eql -100.0
678
- vals[22][2].should eql :RED_LOW
679
- vals[23][0].should eql "TEMP2"
680
- vals[23][1].should eql -100.0
681
- vals[23][2].should eql :RED_LOW
682
- vals[24][0].should eql "TEMP3"
683
- vals[24][1].should eql -100.0
684
- vals[24][2].should eql :RED_LOW
685
- vals[25][0].should eql "TEMP4"
686
- vals[25][1].should eql -100.0
687
- vals[25][2].should eql :RED_LOW
688
- end
689
- end
690
-
691
- describe "get_tlm_values" do
692
- it "should handle an empty request" do
693
- @api.get_tlm_values([]).should eql [[], [], [], :DEFAULT]
694
- end
695
-
696
- it "should complain about non-existant targets" do
697
- expect { @api.get_tlm_values([["BLAH","HEALTH_STATUS","TEMP1"]]) }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
698
- end
699
-
700
- it "should complain about non-existant packets" do
701
- expect { @api.get_tlm_values([["INST","BLAH","TEMP1"]]) }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
702
- end
703
-
704
- it "should complain about non-existant items" do
705
- expect { @api.get_tlm_values([["INST","LATEST","BLAH"]]) }.to raise_error(RuntimeError, "Telemetry item 'INST LATEST BLAH' does not exist")
706
- end
707
-
708
- it "should complain about non-existant value_types" do
709
- expect { @api.get_tlm_values([["INST","HEALTH_STATUS","TEMP1"]],:MINE) }.to raise_error(ArgumentError, "Unknown value type on read: MINE")
710
- end
711
-
712
- it "should complain about bad arguments" do
713
- expect { @api.get_tlm_values("INST",:MINE) }.to raise_error(ArgumentError, /item_array must be nested array/)
714
- expect { @api.get_tlm_values(["INST","HEALTH_STATUS","TEMP1"],:MINE) }.to raise_error(ArgumentError, /item_array must be nested array/)
715
- expect { @api.get_tlm_values([["INST","HEALTH_STATUS","TEMP1"]],10) }.to raise_error(ArgumentError, /value_types must be a single symbol or array of symbols/)
716
- expect { @api.get_tlm_values([["INST","HEALTH_STATUS","TEMP1"]],[10]) }.to raise_error(ArgumentError, /value_types must be a single symbol or array of symbols/)
717
- end
718
-
719
- it "should read all the specified items" do
720
- items = []
721
- items << %w(INST HEALTH_STATUS TEMP1)
722
- items << %w(INST HEALTH_STATUS TEMP2)
723
- items << %w(INST HEALTH_STATUS TEMP3)
724
- items << %w(INST HEALTH_STATUS TEMP4)
725
- vals = @api.get_tlm_values(items)
726
- vals[0][0].should eql -100.0
727
- vals[0][1].should eql -100.0
728
- vals[0][2].should eql -100.0
729
- vals[0][3].should eql -100.0
730
- vals[1][0].should eql :RED_LOW
731
- vals[1][1].should eql :RED_LOW
732
- vals[1][2].should eql :RED_LOW
733
- vals[1][3].should eql :RED_LOW
734
- vals[2][0].should eql [-80.0, -70.0, 60.0, 80.0, -20.0, 20.0]
735
- vals[2][1].should eql [-60.0, -55.0, 30.0, 35.0]
736
- vals[2][2].should eql [-25.0, -10.0, 50.0, 55.0]
737
- vals[2][3].should eql [-80.0, -70.0, 60.0, 80.0]
738
- vals[3].should eql :DEFAULT
739
- end
740
-
741
- it "should read all the specified items with one conversion" do
742
- items = []
743
- items << %w(INST HEALTH_STATUS TEMP1)
744
- items << %w(INST HEALTH_STATUS TEMP2)
745
- items << %w(INST HEALTH_STATUS TEMP3)
746
- items << %w(INST HEALTH_STATUS TEMP4)
747
- vals = @api.get_tlm_values(items, :RAW)
748
- vals[0][0].should eql 0
749
- vals[0][1].should eql 0
750
- vals[0][2].should eql 0
751
- vals[0][3].should eql 0
752
- vals[1][0].should eql :RED_LOW
753
- vals[1][1].should eql :RED_LOW
754
- vals[1][2].should eql :RED_LOW
755
- vals[1][3].should eql :RED_LOW
756
- vals[2][0].should eql [-80.0, -70.0, 60.0, 80.0, -20.0, 20.0]
757
- vals[2][1].should eql [-60.0, -55.0, 30.0, 35.0]
758
- vals[2][2].should eql [-25.0, -10.0, 50.0, 55.0]
759
- vals[2][3].should eql [-80.0, -70.0, 60.0, 80.0]
760
- vals[3].should eql :DEFAULT
761
- end
762
-
763
- it "should read all the specified items with different conversions" do
764
- items = []
765
- items << %w(INST HEALTH_STATUS TEMP1)
766
- items << %w(INST HEALTH_STATUS TEMP2)
767
- items << %w(INST HEALTH_STATUS TEMP3)
768
- items << %w(INST HEALTH_STATUS TEMP4)
769
- vals = @api.get_tlm_values(items, [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS])
770
- vals[0][0].should eql 0
771
- vals[0][1].should eql -100.0
772
- vals[0][2].should eql "-100.000"
773
- vals[0][3].should eql "-100.000 C"
774
- vals[1][0].should eql :RED_LOW
775
- vals[1][1].should eql :RED_LOW
776
- vals[1][2].should eql :RED_LOW
777
- vals[1][3].should eql :RED_LOW
778
- vals[2][0].should eql [-80.0, -70.0, 60.0, 80.0, -20.0, 20.0]
779
- vals[2][1].should eql [-60.0, -55.0, 30.0, 35.0]
780
- vals[2][2].should eql [-25.0, -10.0, 50.0, 55.0]
781
- vals[2][3].should eql [-80.0, -70.0, 60.0, 80.0]
782
- vals[3].should eql :DEFAULT
783
- end
784
-
785
- it "should complain if items length != conversions length" do
786
- items = []
787
- items << %w(INST HEALTH_STATUS TEMP1)
788
- items << %w(INST HEALTH_STATUS TEMP2)
789
- items << %w(INST HEALTH_STATUS TEMP3)
790
- items << %w(INST HEALTH_STATUS TEMP4)
791
- expect { @api.get_tlm_values(items, [:RAW, :CONVERTED]) }.to raise_error(ArgumentError, "Passed 4 items but only 2 value types")
792
- end
793
- end
794
-
795
- describe "get_tlm_list" do
796
- it "should complain about non-existant targets" do
797
- expect { @api.get_tlm_list("BLAH") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
798
- end
799
-
800
- it "should return the sorted packet names for a target" do
801
- pkts = @api.get_tlm_list("INST")
802
- pkts[0][0].should eql "ADCS"
803
- pkts[1][0].should eql "ERROR"
804
- pkts[2][0].should eql "HANDSHAKE"
805
- pkts[3][0].should eql "HEALTH_STATUS"
806
- pkts[4][0].should eql "IMAGE"
807
- pkts[5][0].should eql "MECH"
808
- pkts[6][0].should eql "PARAMS"
809
- end
810
- end
811
-
812
- describe "get_tlm_item_list" do
813
- it "should complain about non-existant targets" do
814
- expect { @api.get_tlm_item_list("BLAH","HEALTH_STATUS") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
815
- end
816
-
817
- it "should complain about non-existant packets" do
818
- expect { @api.get_tlm_item_list("INST","BLAH") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
819
- end
820
-
821
- it "should return all the items for a target/packet" do
822
- items = @api.get_tlm_item_list("INST","HEALTH_STATUS")
823
- items[0][0].should eql "RECEIVED_TIMESECONDS"
824
- items[1][0].should eql "RECEIVED_TIMEFORMATTED"
825
- items[2][0].should eql "RECEIVED_COUNT"
826
- # Spot check a few more
827
- items[22][0].should eql "TEMP1"
828
- items[22][1].should be_nil
829
- items[22][2].should eql "Temperature #1"
830
- items[28][0].should eql "COLLECT_TYPE"
831
- items[28][1].should include("NORMAL"=>0, "SPECIAL"=>1)
832
- items[28][2].should eql "Most recent collect type"
833
- end
834
- end
835
-
836
- describe "get_tlm_details" do
837
- it "should complain about non-existant targets" do
838
- expect { @api.get_tlm_details([["BLAH","HEALTH_STATUS","TEMP1"]]) }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
839
- end
840
-
841
- it "should complain about non-existant packets" do
842
- expect { @api.get_tlm_details([["INST","BLAH","TEMP1"]]) }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
843
- end
844
-
845
- it "should complain about non-existant items" do
846
- expect { @api.get_tlm_details([["INST","LATEST","BLAH"]]) }.to raise_error(RuntimeError, "Telemetry item 'INST LATEST BLAH' does not exist")
847
- end
848
-
849
- it "should complain about bad parameters" do
850
- expect { @api.get_tlm_details("INST") }.to raise_error(ArgumentError, /item_array must be nested array/)
851
- expect { @api.get_tlm_details(["INST","LATEST","BLAH"]) }.to raise_error(ArgumentError, /item_array must be nested array/)
852
- end
853
-
854
- it "should read all the specified items" do
855
- items = []
856
- items << %w(INST HEALTH_STATUS TEMP1)
857
- items << %w(INST HEALTH_STATUS TEMP2)
858
- items << %w(INST HEALTH_STATUS TEMP3)
859
- items << %w(INST HEALTH_STATUS TEMP4)
860
- details = @api.get_tlm_details(items)
861
- details.length.should eql 4
862
- details[0]["name"].should eql "TEMP1"
863
- details[1]["name"].should eql "TEMP2"
864
- details[2]["name"].should eql "TEMP3"
865
- details[3]["name"].should eql "TEMP4"
866
- end
867
- end
868
-
869
- describe "get_out_of_limits" do
870
- it "should return all out of limits items" do
871
- items = @api.get_out_of_limits
872
- (0..3).each do |i|
873
- items[i][0].should eql "INST"
874
- items[i][1].should eql "HEALTH_STATUS"
875
- items[i][2].should eql "TEMP#{i+1}"
876
- items[i][3].should eql :RED_LOW
877
- end
878
- end
879
- end
880
-
881
- describe "limits_enabled?" do
882
- it "should complain about non-existant targets" do
883
- expect { @api.limits_enabled?("BLAH","HEALTH_STATUS","TEMP1") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
884
- end
885
-
886
- it "should complain about non-existant packets" do
887
- expect { @api.limits_enabled?("INST","BLAH","TEMP1") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
888
- end
889
-
890
- it "should complain about non-existant items" do
891
- expect { @api.limits_enabled?("INST","HEALTH_STATUS","BLAH") }.to raise_error(RuntimeError, "Packet item 'INST HEALTH_STATUS BLAH' does not exist")
892
- end
893
-
894
- it "should return whether limits are enable for an item" do
895
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_truthy
896
- end
897
- end
898
-
899
- describe "enable_limits" do
900
- it "should complain about non-existant targets" do
901
- expect { @api.enable_limits("BLAH","HEALTH_STATUS","TEMP1") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
902
- end
903
-
904
- it "should complain about non-existant packets" do
905
- expect { @api.enable_limits("INST","BLAH","TEMP1") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
906
- end
907
-
908
- it "should complain about non-existant items" do
909
- expect { @api.enable_limits("INST","HEALTH_STATUS","BLAH") }.to raise_error(RuntimeError, "Packet item 'INST HEALTH_STATUS BLAH' does not exist")
910
- end
911
-
912
- it "should enable limits for an item" do
913
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_truthy
914
- @api.disable_limits("INST","HEALTH_STATUS","TEMP1")
915
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_falsey
916
- @api.enable_limits("INST","HEALTH_STATUS","TEMP1")
917
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_truthy
918
- end
919
- end
920
-
921
- describe "disable_limits" do
922
- it "should complain about non-existant targets" do
923
- expect { @api.disable_limits("BLAH","HEALTH_STATUS","TEMP1") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
924
- end
925
-
926
- it "should complain about non-existant packets" do
927
- expect { @api.disable_limits("INST","BLAH","TEMP1") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
928
- end
929
-
930
- it "should complain about non-existant items" do
931
- expect { @api.disable_limits("INST","HEALTH_STATUS","BLAH") }.to raise_error(RuntimeError, "Packet item 'INST HEALTH_STATUS BLAH' does not exist")
932
- end
933
-
934
- it "should disable limits for an item" do
935
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_truthy
936
- @api.disable_limits("INST","HEALTH_STATUS","TEMP1")
937
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_falsey
938
- @api.enable_limits("INST","HEALTH_STATUS","TEMP1")
939
- end
940
- end
941
-
942
- describe "get_limits" do
943
- it "should complain about non-existant targets" do
944
- expect { @api.get_limits("BLAH","HEALTH_STATUS","TEMP1") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
945
- end
946
-
947
- it "should complain about non-existant packets" do
948
- expect { @api.get_limits("INST","BLAH","TEMP1") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
949
- end
950
-
951
- it "should complain about non-existant items" do
952
- expect { @api.get_limits("INST","HEALTH_STATUS","BLAH") }.to raise_error(RuntimeError, "Packet item 'INST HEALTH_STATUS BLAH' does not exist")
953
- end
954
-
955
- it "should get limits for an item" do
956
- @api.get_limits("INST","HEALTH_STATUS","TEMP1").should eql([:DEFAULT, 1, true, -80.0, -70.0, 60.0, 80.0, -20.0, 20.0])
957
- @api.get_limits("INST","HEALTH_STATUS","TEMP1",:TVAC).should eql([:TVAC, 1, true, -80.0, -30.0, 30.0, 80.0, nil, nil])
958
- end
959
- end
960
-
961
- describe "set_limits" do
962
- it "should complain about non-existant targets" do
963
- expect { @api.set_limits("BLAH","HEALTH_STATUS","TEMP1",0.0,10.0,20.0,30.0) }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
964
- end
965
-
966
- it "should complain about non-existant packets" do
967
- expect { @api.set_limits("INST","BLAH","TEMP1",0.0,10.0,20.0,30.0) }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
968
- end
969
-
970
- it "should complain about non-existant items" do
971
- expect { @api.set_limits("INST","HEALTH_STATUS","BLAH",0.0,10.0,20.0,30.0) }.to raise_error(RuntimeError, "Packet item 'INST HEALTH_STATUS BLAH' does not exist")
972
- end
973
-
974
- it "should get limits for an item" do
975
- @api.set_limits("INST","HEALTH_STATUS","TEMP1",0.0,10.0,20.0,30.0).should eql([:CUSTOM, 1, true, 0.0, 10.0, 20.0, 30.0, nil, nil])
976
- @api.set_limits("INST","HEALTH_STATUS","TEMP1",0.0,10.0,20.0,30.0,12.0,15.0,:CUSTOM2,2,false).should eql([:CUSTOM2, 2, false, 0.0, 10.0, 20.0, 30.0, 12.0, 15.0])
977
- @api.set_limits("INST","HEALTH_STATUS","TEMP1",0.0,10.0,20.0,30.0,12.0,15.0,:CUSTOM,1,true).should eql([:CUSTOM, 1, true, 0.0, 10.0, 20.0, 30.0, 12.0, 15.0])
978
- end
979
- end
980
-
981
- describe "get_limits_groups" do
982
- it "should return all the limits groups" do
983
- @api.get_limits_groups.should eql %w(FIRST SECOND)
984
- end
985
- end
986
-
987
- describe "enable_limits_group" do
988
- it "should complain about undefined limits groups" do
989
- expect { @api.enable_limits_group("MINE") }.to raise_error(RuntimeError, "LIMITS_GROUP MINE undefined. Ensure your telemetry definition contains the line: LIMITS_GROUP MINE")
990
- end
991
-
992
- it "should enable limits for all items in the group" do
993
- @api.disable_limits("INST","HEALTH_STATUS","TEMP1")
994
- @api.disable_limits("INST","HEALTH_STATUS","TEMP3")
995
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_falsey
996
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP3").should be_falsey
997
- @api.enable_limits_group("FIRST")
998
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_truthy
999
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP3").should be_truthy
1000
- end
1001
- end
1002
-
1003
- describe "disable_limits_group" do
1004
- it "should complain about undefined limits groups" do
1005
- expect { @api.disable_limits_group("MINE") }.to raise_error(RuntimeError, "LIMITS_GROUP MINE undefined. Ensure your telemetry definition contains the line: LIMITS_GROUP MINE")
1006
- end
1007
-
1008
- it "should disable limits for all items in the group" do
1009
- @api.enable_limits("INST","HEALTH_STATUS","TEMP1")
1010
- @api.enable_limits("INST","HEALTH_STATUS","TEMP3")
1011
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_truthy
1012
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP3").should be_truthy
1013
- @api.disable_limits_group("FIRST")
1014
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_falsey
1015
- @api.limits_enabled?("INST","HEALTH_STATUS","TEMP3").should be_falsey
1016
- end
1017
- end
1018
-
1019
- describe "get_limits_sets, get_limits_set, set_limits_set" do
1020
- it "should get and set the active limits set" do
1021
- if @api.get_limits_sets.include?(:CUSTOM)
1022
- @api.get_limits_sets.should eql [:DEFAULT,:TVAC, :CUSTOM, :CUSTOM2]
1023
- else
1024
- @api.get_limits_sets.should eql [:DEFAULT,:TVAC]
1025
- end
1026
- @api.set_limits_set("TVAC")
1027
- @api.get_limits_set.should eql "TVAC"
1028
- @api.set_limits_set("DEFAULT")
1029
- @api.get_limits_set.should eql "DEFAULT"
1030
- end
1031
- end
1032
-
1033
- describe "get_target_list" do
1034
- it "should return all target names" do
1035
- @api.get_target_list.should eql %w(COSMOS INST META SYSTEM)
1036
- end
1037
- end
1038
-
1039
- describe "subscribe_limits_events" do
1040
- it "should call CmdTlmServer" do
1041
- stub_const("Cosmos::CmdTlmServer::DEFAULT_LIMITS_EVENT_QUEUE_SIZE", 100)
1042
- expect(CmdTlmServer).to receive(:subscribe_limits_events)
1043
- @api.subscribe_limits_events
1044
- end
1045
- end
1046
-
1047
- describe "unsubscribe_limits_events" do
1048
- it "should call CmdTlmServer" do
1049
- expect(CmdTlmServer).to receive(:unsubscribe_limits_events)
1050
- @api.unsubscribe_limits_events(0)
1051
- end
1052
- end
1053
-
1054
- describe "get_limits_event" do
1055
- it "should get a limits event" do
1056
- expect(CmdTlmServer).to receive(:get_limits_event)
1057
- @api.get_limits_event(0)
1058
- end
1059
- end
1060
-
1061
- describe "subscribe_packet_data" do
1062
- it "should call CmdTlmServer" do
1063
- stub_const("Cosmos::CmdTlmServer::DEFAULT_PACKET_DATA_QUEUE_SIZE", 100)
1064
- expect(CmdTlmServer).to receive(:subscribe_packet_data)
1065
- @api.subscribe_packet_data([["TGT","PKT1"],["TGT","PKT2"]])
1066
- end
1067
- end
1068
-
1069
- describe "unsubscribe_packet_datas" do
1070
- it "should call CmdTlmServer" do
1071
- expect(CmdTlmServer).to receive(:unsubscribe_packet_data)
1072
- @api.unsubscribe_packet_data(10)
1073
- end
1074
- end
1075
-
1076
- describe "get_packet_data" do
1077
- it "should call CmdTlmServer" do
1078
- expect(CmdTlmServer).to receive(:get_packet_data)
1079
- @api.get_packet_data(10)
1080
- end
1081
- end
1082
-
1083
- # All these methods simply pass through directly to CmdTlmServer without
1084
- # adding any functionality. Thus we just test that they are are received
1085
- # by the CmdTlmServer.
1086
- describe "CmdTlmServer pass-throughs" do
1087
- it "should call through to the CmdTlmServer" do
1088
- @api.get_interface_names
1089
- @api.connect_interface("INT")
1090
- @api.disconnect_interface("INT")
1091
- @api.interface_state("INT")
1092
- @api.map_target_to_interface("INST", "INT")
1093
- @api.get_router_names
1094
- @api.connect_router("ROUTE")
1095
- @api.disconnect_router("ROUTE")
1096
- @api.router_state("ROUTE")
1097
- @api.send_raw("INT","\x00\x01")
1098
- @api.get_cmd_log_filename('DEFAULT')
1099
- @api.get_tlm_log_filename('DEFAULT')
1100
- @api.start_logging('ALL')
1101
- @api.stop_logging('ALL')
1102
- @api.start_cmd_log('ALL')
1103
- @api.start_tlm_log('ALL')
1104
- @api.stop_cmd_log('ALL')
1105
- @api.stop_tlm_log('ALL')
1106
- @api.get_server_message_log_filename
1107
- @api.start_new_server_message_log
1108
- end
1109
- end
1110
-
1111
- end
1112
- end
1113
-
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 'spec_helper'
12
+ require 'cosmos'
13
+ require 'cosmos/tools/cmd_tlm_server/cmd_tlm_server'
14
+ require 'cosmos/tools/cmd_tlm_server/api'
15
+
16
+ module Cosmos
17
+
18
+ describe Api do
19
+
20
+ before(:all) do
21
+ cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
22
+ FileUtils.mkdir_p(File.dirname(cts))
23
+ File.open(cts,'w') do |file|
24
+ file.puts 'INTERFACE INT interface.rb'
25
+ file.puts 'ROUTER ROUTE interface.rb'
26
+ end
27
+ end
28
+
29
+ after(:all) do
30
+ clean_config()
31
+ FileUtils.rm_rf File.join(Cosmos::USERPATH,'config','tools')
32
+ end
33
+
34
+ before(:each) do
35
+ allow_any_instance_of(Interface).to receive(:connected?)
36
+ allow_any_instance_of(Interface).to receive(:connect)
37
+ allow_any_instance_of(Interface).to receive(:disconnect)
38
+ allow_any_instance_of(Interface).to receive(:write_raw)
39
+ allow_any_instance_of(Interface).to receive(:read)
40
+ @api = CmdTlmServer.new
41
+ allow(@api.commanding).to receive(:send_command_to_target)
42
+ end
43
+
44
+ after(:each) do
45
+ @api.stop
46
+ end
47
+
48
+ def test_cmd_unknown(method)
49
+ expect { @api.send(method,"BLAH COLLECT with TYPE NORMAL") }.to raise_error(/does not exist/)
50
+ expect { @api.send(method,"INST UNKNOWN with TYPE NORMAL") }.to raise_error(/does not exist/)
51
+ expect { @api.send(method,"INST COLLECT with BLAH NORMAL") }.to raise_error(/does not exist/)
52
+ expect { @api.send(method,"BLAH","COLLECT","TYPE"=>"NORMAL") }.to raise_error(/does not exist/)
53
+ expect { @api.send(method,"INST","UNKNOWN","TYPE"=>"NORMAL") }.to raise_error(/does not exist/)
54
+ expect { @api.send(method,"INST","COLLECT","BLAH"=>"NORMAL") }.to raise_error(/does not exist/)
55
+ end
56
+
57
+ describe "cmd" do
58
+ it "should complain about unknown targets, commands, and parameters" do
59
+ test_cmd_unknown(:cmd)
60
+ sleep(0.5)
61
+ end
62
+
63
+ it "should process a string" do
64
+ target_name, cmd_name, params = @api.cmd("INST COLLECT with TYPE NORMAL, DURATION 5")
65
+ target_name.should eql 'INST'
66
+ cmd_name.should eql 'COLLECT'
67
+ params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
68
+ end
69
+
70
+ it "should complain if parameters are not separated by commas" do
71
+ expect { @api.cmd("INST COLLECT with TYPE NORMAL DURATION 5") }.to raise_error(/Missing comma/)
72
+ end
73
+
74
+ it "should complain if parameters don't have values" do
75
+ expect { @api.cmd("INST COLLECT with TYPE") }.to raise_error(/Missing value/)
76
+ end
77
+
78
+ it "should process parameters" do
79
+ target_name, cmd_name, params = @api.cmd("INST","COLLECT","TYPE"=>"NORMAL","DURATION"=>5)
80
+ target_name.should eql 'INST'
81
+ cmd_name.should eql 'COLLECT'
82
+ params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
83
+ end
84
+
85
+ it "should process commands without parameters" do
86
+ target_name, cmd_name, params = @api.cmd("INST","ABORT")
87
+ target_name.should eql 'INST'
88
+ cmd_name.should eql 'ABORT'
89
+ params.should be {}
90
+ end
91
+
92
+ it "should complain about too many parameters" do
93
+ expect { @api.cmd("INST","COLLECT","TYPE","DURATION") }.to raise_error(/Invalid number of arguments/)
94
+ end
95
+
96
+ it "should warn about required parameters" do
97
+ expect { @api.cmd("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
98
+ end
99
+
100
+ it "should warn about out of range parameters" do
101
+ expect { @api.cmd("INST COLLECT with TYPE NORMAL, DURATION 1000") }.to raise_error(/not in valid range/)
102
+ end
103
+
104
+ it "should warn about hazardous parameters" do
105
+ expect { @api.cmd("INST COLLECT with TYPE SPECIAL") }.to raise_error(/Hazardous/)
106
+ end
107
+
108
+ it "should warn about hazardous commands" do
109
+ expect { @api.cmd("INST CLEAR") }.to raise_error(/Hazardous/)
110
+ end
111
+ end
112
+
113
+ describe "cmd_no_range_check" do
114
+ it "should complain about unknown targets, commands, and parameters" do
115
+ test_cmd_unknown(:cmd_no_range_check)
116
+ end
117
+
118
+ it "should process a string" do
119
+ target_name, cmd_no_range_check_name, params = @api.cmd_no_range_check("INST COLLECT with TYPE NORMAL, DURATION 5")
120
+ target_name.should eql 'INST'
121
+ cmd_no_range_check_name.should eql 'COLLECT'
122
+ params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
123
+ end
124
+
125
+ it "should process parameters" do
126
+ target_name, cmd_no_range_check_name, params = @api.cmd_no_range_check("INST","COLLECT","TYPE"=>"NORMAL","DURATION"=>5)
127
+ target_name.should eql 'INST'
128
+ cmd_no_range_check_name.should eql 'COLLECT'
129
+ params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
130
+ end
131
+
132
+ it "should warn about required parameters" do
133
+ expect { @api.cmd_no_range_check("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
134
+ end
135
+
136
+ it "should not warn about out of range parameters" do
137
+ expect { @api.cmd_no_range_check("INST COLLECT with TYPE NORMAL, DURATION 1000") }.to_not raise_error
138
+ end
139
+
140
+ it "should warn about hazardous parameters" do
141
+ expect { @api.cmd_no_range_check("INST COLLECT with TYPE SPECIAL") }.to raise_error(/Hazardous/)
142
+ end
143
+
144
+ it "should warn about hazardous commands" do
145
+ expect { @api.cmd_no_range_check("INST CLEAR") }.to raise_error(/Hazardous/)
146
+ end
147
+ end
148
+
149
+ describe "cmd_no_hazardous_check" do
150
+ it "should complain about unknown targets, commands, and parameters" do
151
+ test_cmd_unknown(:cmd_no_hazardous_check)
152
+ end
153
+
154
+ it "should process a string" do
155
+ target_name, cmd_no_hazardous_check_name, params = @api.cmd_no_hazardous_check("INST COLLECT with TYPE NORMAL, DURATION 5")
156
+ target_name.should eql 'INST'
157
+ cmd_no_hazardous_check_name.should eql 'COLLECT'
158
+ params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
159
+ end
160
+
161
+ it "should process parameters" do
162
+ target_name, cmd_no_hazardous_check_name, params = @api.cmd_no_hazardous_check("INST","COLLECT","TYPE"=>"NORMAL","DURATION"=>5)
163
+ target_name.should eql 'INST'
164
+ cmd_no_hazardous_check_name.should eql 'COLLECT'
165
+ params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
166
+ end
167
+
168
+ it "should process parameters that are strings" do
169
+ target_name, cmd_name, params = @api.cmd_no_hazardous_check("INST ASCIICMD with STRING 'ARM LASER'")
170
+ target_name.should eql 'INST'
171
+ cmd_name.should eql 'ASCIICMD'
172
+ params.should include('STRING'=>'ARM LASER')
173
+ end
174
+
175
+ it "should warn about required parameters" do
176
+ expect { @api.cmd_no_hazardous_check("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
177
+ end
178
+
179
+ it "should warn about out of range parameters" do
180
+ expect { @api.cmd_no_hazardous_check("INST COLLECT with TYPE NORMAL, DURATION 1000") }.to raise_error(/not in valid range/)
181
+ end
182
+
183
+ it "should not warn about hazardous parameters" do
184
+ expect { @api.cmd_no_hazardous_check("INST COLLECT with TYPE SPECIAL") }.to_not raise_error
185
+ end
186
+
187
+ it "should not warn about hazardous commands" do
188
+ expect { @api.cmd_no_hazardous_check("INST CLEAR") }.to_not raise_error
189
+ end
190
+ end
191
+
192
+ describe "cmd_no_checks" do
193
+ it "should complain about unknown targets, commands, and parameters" do
194
+ test_cmd_unknown(:cmd_no_checks)
195
+ end
196
+
197
+ it "should process a string" do
198
+ target_name, cmd_no_checks_name, params = @api.cmd_no_checks("INST COLLECT with TYPE NORMAL, DURATION 5")
199
+ target_name.should eql 'INST'
200
+ cmd_no_checks_name.should eql 'COLLECT'
201
+ params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
202
+ end
203
+
204
+ it "should process parameters" do
205
+ target_name, cmd_no_checks_name, params = @api.cmd_no_checks("INST","COLLECT","TYPE"=>"NORMAL","DURATION"=>5)
206
+ target_name.should eql 'INST'
207
+ cmd_no_checks_name.should eql 'COLLECT'
208
+ params.should include('TYPE'=>'NORMAL', 'DURATION'=>5)
209
+ end
210
+
211
+ it "should warn about required parameters" do
212
+ expect { @api.cmd_no_checks("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
213
+ end
214
+
215
+ it "should not warn about out of range parameters" do
216
+ expect { @api.cmd_no_checks("INST COLLECT with TYPE NORMAL, DURATION 1000") }.to_not raise_error
217
+ end
218
+
219
+ it "should not warn about hazardous parameters" do
220
+ expect { @api.cmd_no_checks("INST COLLECT with TYPE SPECIAL") }.to_not raise_error
221
+ end
222
+
223
+ it "should not warn about hazardous commands" do
224
+ expect { @api.cmd_no_checks("INST CLEAR") }.to_not raise_error
225
+ end
226
+ end
227
+
228
+ describe "cmd_raw" do
229
+ it "should complain about unknown targets, commands, and parameters" do
230
+ test_cmd_unknown(:cmd_raw)
231
+ end
232
+
233
+ it "should process a string" do
234
+ target_name, cmd_name, params = @api.cmd_raw("INST COLLECT with TYPE 0, DURATION 5")
235
+ target_name.should eql 'INST'
236
+ cmd_name.should eql 'COLLECT'
237
+ params.should include('TYPE'=>0, 'DURATION'=>5)
238
+ end
239
+
240
+ it "should complain if parameters are not separated by commas" do
241
+ expect { @api.cmd_raw("INST COLLECT with TYPE 0 DURATION 5") }.to raise_error(/Missing comma/)
242
+ end
243
+
244
+ it "should complain if parameters don't have values" do
245
+ expect { @api.cmd_raw("INST COLLECT with TYPE") }.to raise_error(/Missing value/)
246
+ end
247
+
248
+ it "should process parameters" do
249
+ target_name, cmd_name, params = @api.cmd_raw("INST","COLLECT","TYPE"=>0,"DURATION"=>5)
250
+ target_name.should eql 'INST'
251
+ cmd_name.should eql 'COLLECT'
252
+ params.should include('TYPE'=>0, 'DURATION'=>5)
253
+ end
254
+
255
+ it "should process commands without parameters" do
256
+ target_name, cmd_name, params = @api.cmd_raw("INST","ABORT")
257
+ target_name.should eql 'INST'
258
+ cmd_name.should eql 'ABORT'
259
+ params.should be {}
260
+ end
261
+
262
+ it "should complain about too many parameters" do
263
+ expect { @api.cmd_raw("INST","COLLECT","TYPE","DURATION") }.to raise_error(/Invalid number of arguments/)
264
+ end
265
+
266
+ it "should warn about required parameters" do
267
+ expect { @api.cmd_raw("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
268
+ end
269
+
270
+ it "should warn about out of range parameters" do
271
+ expect { @api.cmd_raw("INST COLLECT with TYPE 0, DURATION 1000") }.to raise_error(/not in valid range/)
272
+ end
273
+
274
+ it "should warn about hazardous parameters" do
275
+ expect { @api.cmd_raw("INST COLLECT with TYPE 1") }.to raise_error(/Hazardous/)
276
+ end
277
+
278
+ it "should warn about hazardous commands" do
279
+ expect { @api.cmd_raw("INST CLEAR") }.to raise_error(/Hazardous/)
280
+ end
281
+ end
282
+
283
+ describe "cmd_no_range_check" do
284
+ it "should complain about unknown targets, commands, and parameters" do
285
+ test_cmd_unknown(:cmd_raw_no_range_check)
286
+ end
287
+
288
+ it "should process a string" do
289
+ target_name, cmd_no_range_check_name, params = @api.cmd_raw_no_range_check("INST COLLECT with TYPE 0, DURATION 5")
290
+ target_name.should eql 'INST'
291
+ cmd_no_range_check_name.should eql 'COLLECT'
292
+ params.should include('TYPE'=>0, 'DURATION'=>5)
293
+ end
294
+
295
+ it "should process parameters" do
296
+ target_name, cmd_no_range_check_name, params = @api.cmd_raw_no_range_check("INST","COLLECT","TYPE"=>0,"DURATION"=>5)
297
+ target_name.should eql 'INST'
298
+ cmd_no_range_check_name.should eql 'COLLECT'
299
+ params.should include('TYPE'=>0, 'DURATION'=>5)
300
+ end
301
+
302
+ it "should warn about required parameters" do
303
+ expect { @api.cmd_raw_no_range_check("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
304
+ end
305
+
306
+ it "should not warn about out of range parameters" do
307
+ expect { @api.cmd_raw_no_range_check("INST COLLECT with TYPE 0, DURATION 1000") }.to_not raise_error
308
+ end
309
+
310
+ it "should warn about hazardous parameters" do
311
+ expect { @api.cmd_raw_no_range_check("INST COLLECT with TYPE 1") }.to raise_error(/Hazardous/)
312
+ end
313
+
314
+ it "should warn about hazardous commands" do
315
+ expect { @api.cmd_raw_no_range_check("INST CLEAR") }.to raise_error(/Hazardous/)
316
+ end
317
+ end
318
+
319
+ describe "cmd_raw_no_hazardous_check" do
320
+ it "should complain about unknown targets, commands, and parameters" do
321
+ test_cmd_unknown(:cmd_raw_no_hazardous_check)
322
+ end
323
+
324
+ it "should process a string" do
325
+ target_name, cmd_no_hazardous_check_name, params = @api.cmd_raw_no_hazardous_check("INST COLLECT with TYPE 0, DURATION 5")
326
+ target_name.should eql 'INST'
327
+ cmd_no_hazardous_check_name.should eql 'COLLECT'
328
+ params.should include('TYPE'=>0, 'DURATION'=>5)
329
+ end
330
+
331
+ it "should process parameters" do
332
+ target_name, cmd_no_hazardous_check_name, params = @api.cmd_raw_no_hazardous_check("INST","COLLECT","TYPE"=>0,"DURATION"=>5)
333
+ target_name.should eql 'INST'
334
+ cmd_no_hazardous_check_name.should eql 'COLLECT'
335
+ params.should include('TYPE'=>0, 'DURATION'=>5)
336
+ end
337
+
338
+ it "should process parameters that are strings" do
339
+ target_name, cmd_name, params = @api.cmd_raw_no_hazardous_check("INST ASCIICMD with STRING 'ARM LASER'")
340
+ target_name.should eql 'INST'
341
+ cmd_name.should eql 'ASCIICMD'
342
+ params.should include('STRING'=>'ARM LASER')
343
+ end
344
+
345
+ it "should warn about required parameters" do
346
+ expect { @api.cmd_raw_no_hazardous_check("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
347
+ end
348
+
349
+ it "should warn about out of range parameters" do
350
+ expect { @api.cmd_raw_no_hazardous_check("INST COLLECT with TYPE 0, DURATION 1000") }.to raise_error(/not in valid range/)
351
+ end
352
+
353
+ it "should not warn about hazardous parameters" do
354
+ expect { @api.cmd_raw_no_hazardous_check("INST COLLECT with TYPE 1") }.to_not raise_error
355
+ end
356
+
357
+ it "should not warn about hazardous commands" do
358
+ expect { @api.cmd_raw_no_hazardous_check("INST CLEAR") }.to_not raise_error
359
+ end
360
+ end
361
+
362
+ describe "cmd_raw_no_checks" do
363
+ it "should complain about unknown targets, commands, and parameters" do
364
+ test_cmd_unknown(:cmd_raw_no_checks)
365
+ end
366
+
367
+ it "should process a string" do
368
+ target_name, cmd_no_checks_name, params = @api.cmd_raw_no_checks("INST COLLECT with TYPE 0, DURATION 5")
369
+ target_name.should eql 'INST'
370
+ cmd_no_checks_name.should eql 'COLLECT'
371
+ params.should include('TYPE'=>0, 'DURATION'=>5)
372
+ end
373
+
374
+ it "should process parameters" do
375
+ target_name, cmd_no_checks_name, params = @api.cmd_raw_no_checks("INST","COLLECT","TYPE"=>0,"DURATION"=>5)
376
+ target_name.should eql 'INST'
377
+ cmd_no_checks_name.should eql 'COLLECT'
378
+ params.should include('TYPE'=>0, 'DURATION'=>5)
379
+ end
380
+
381
+ it "should warn about required parameters" do
382
+ expect { @api.cmd_raw_no_checks("INST COLLECT with DURATION 5") }.to raise_error(/Required/)
383
+ end
384
+
385
+ it "should not warn about out of range parameters" do
386
+ expect { @api.cmd_raw_no_checks("INST COLLECT with TYPE 0, DURATION 1000") }.to_not raise_error
387
+ end
388
+
389
+ it "should not warn about hazardous parameters" do
390
+ expect { @api.cmd_raw_no_checks("INST COLLECT with TYPE 1") }.to_not raise_error
391
+ end
392
+
393
+ it "should not warn about hazardous commands" do
394
+ expect { @api.cmd_raw_no_checks("INST CLEAR") }.to_not raise_error
395
+ end
396
+ end
397
+
398
+ describe "get_cmd_list" do
399
+ it "should return command names sorted" do
400
+ result = @api.get_cmd_list("INST")
401
+ result.sort.should eql result
402
+ end
403
+
404
+ it "should complain with a unknown target" do
405
+ expect { @api.get_cmd_list("BLAH") }.to raise_error(/does not exist/)
406
+ end
407
+
408
+ it "should return command names and descriptions for a given target" do
409
+ result = @api.get_cmd_list("INST")
410
+ result[0][0].should eql "ABORT"
411
+ # The second parameter is the description ... only test one
412
+ result[0][1].should eql "Aborts a collect on the instrument"
413
+ result[1][0].should eql "ARYCMD"
414
+ result[2][0].should eql "ASCIICMD"
415
+ result[3][0].should eql "CLEAR"
416
+ result[4][0].should eql "COLLECT"
417
+ result[5][0].should eql "COSMOS_ERROR_HANDLE"
418
+ result[6][0].should eql "COSMOS_ERROR_IGNORE"
419
+ result[7][0].should eql "COSMOS_HANDSHAKE_DS"
420
+ result[8][0].should eql "COSMOS_HANDSHAKE_EN"
421
+ result[9][0].should eql "FLTCMD"
422
+ result[10][0].should eql "LINC_COMMAND"
423
+ result[11][0].should eql "SETPARAMS"
424
+ result[12][0].should eql "SLRPNLDEPLOY"
425
+ result[13][0].should eql "SLRPNLRESET"
426
+ end
427
+ end
428
+
429
+ describe "get_cmd_param_list" do
430
+ it "should return parameters for the command" do
431
+ result = @api.get_cmd_param_list("INST","COLLECT")
432
+ # Each element in the results array contains:
433
+ # name, default, states, description, full units, units, required
434
+ result.should include ['TYPE',0,{"NORMAL"=>0,"SPECIAL"=>1},'Collect type',nil,nil,true]
435
+ result.should include ['TEMP',0.0,nil,'Collect temperature','Celcius','C',false]
436
+ end
437
+
438
+ it "should return array parameters for the command" do
439
+ result = @api.get_cmd_param_list("INST","ARYCMD")
440
+ # Each element in the results array contains:
441
+ # name, default, states, description, full units, units, required
442
+ result.should include ['ARRAY',[],nil,'Array parameter',nil,nil,false]
443
+ end
444
+ end
445
+
446
+ describe "get_cmd_hazardous" do
447
+ it "should return whether the command with parameters is hazardous" do
448
+ @api.get_cmd_hazardous("INST","COLLECT",{"TYPE"=>"NORMAL"}).should be_falsey
449
+ @api.get_cmd_hazardous("INST","COLLECT",{"TYPE"=>"SPECIAL"}).should be_truthy
450
+ end
451
+
452
+ it "should return whether the command is hazardous" do
453
+ @api.get_cmd_hazardous("INST","CLEAR").should be_truthy
454
+ end
455
+ end
456
+
457
+ def test_tlm_unknown(method)
458
+ expect { @api.send(method,"BLAH HEALTH_STATUS COLLECTS") }.to raise_error(/does not exist/)
459
+ expect { @api.send(method,"INST UNKNOWN COLLECTS") }.to raise_error(/does not exist/)
460
+ expect { @api.send(method,"INST HEALTH_STATUS BLAH") }.to raise_error(/does not exist/)
461
+ expect { @api.send(method,"BLAH","HEALTH_STATUS","COLLECTS") }.to raise_error(/does not exist/)
462
+ expect { @api.send(method,"INST","UNKNOWN","COLLECTS") }.to raise_error(/does not exist/)
463
+ expect { @api.send(method,"INST","HEALTH_STATUS","BLAH") }.to raise_error(/does not exist/)
464
+ end
465
+
466
+ describe "tlm" do
467
+ it "should complain about unknown targets, commands, and parameters" do
468
+ test_tlm_unknown(:tlm)
469
+ end
470
+
471
+ it "should process a string" do
472
+ value = @api.tlm("INST HEALTH_STATUS TEMP1")
473
+ value.should eql -100.0
474
+ end
475
+
476
+ it "should process parameters" do
477
+ value = @api.tlm("INST","HEALTH_STATUS","TEMP1")
478
+ end
479
+
480
+ it "should complain if too many parameters" do
481
+ expect { @api.tlm("INST","HEALTH_STATUS","TEMP1","TEMP2") }.to raise_error(/Invalid number of arguments/)
482
+ end
483
+ end
484
+
485
+ describe "tlm_raw" do
486
+ it "should complain about unknown targets, commands, and parameters" do
487
+ test_tlm_unknown(:tlm_raw)
488
+ end
489
+
490
+ it "should process a string" do
491
+ @api.tlm_raw("INST HEALTH_STATUS TEMP1").should eql 0
492
+ end
493
+
494
+ it "should return the value using LATEST" do
495
+ @api.tlm_raw("INST LATEST TEMP1").should eql 0
496
+ end
497
+
498
+ it "should process parameters" do
499
+ @api.tlm_raw("INST","HEALTH_STATUS","TEMP1").should eql 0
500
+ end
501
+ end
502
+
503
+ describe "tlm_formatted" do
504
+ it "should complain about unknown targets, commands, and parameters" do
505
+ test_tlm_unknown(:tlm_formatted)
506
+ end
507
+
508
+ it "should process a string" do
509
+ @api.tlm_formatted("INST HEALTH_STATUS TEMP1").should eql "-100.000"
510
+ end
511
+
512
+ it "should return the value using LATEST" do
513
+ @api.tlm_formatted("INST LATEST TEMP1").should eql "-100.000"
514
+ end
515
+
516
+ it "should process parameters" do
517
+ @api.tlm_formatted("INST","HEALTH_STATUS","TEMP1").should eql "-100.000"
518
+ end
519
+ end
520
+
521
+ describe "tlm_with_units" do
522
+ it "should complain about unknown targets, commands, and parameters" do
523
+ test_tlm_unknown(:tlm_with_units)
524
+ end
525
+
526
+ it "should process a string" do
527
+ @api.tlm_with_units("INST HEALTH_STATUS TEMP1").should eql "-100.000 C"
528
+ end
529
+
530
+ it "should return the value using LATEST" do
531
+ @api.tlm_with_units("INST LATEST TEMP1").should eql "-100.000 C"
532
+ end
533
+
534
+ it "should process parameters" do
535
+ @api.tlm_with_units("INST","HEALTH_STATUS","TEMP1").should eql "-100.000 C"
536
+ end
537
+ end
538
+
539
+ describe "tlm_variable" do
540
+ it "should complain about unknown targets, commands, and parameters" do
541
+ expect { @api.tlm_variable("BLAH HEALTH_STATUS COLLECTS",:RAW) }.to raise_error(/does not exist/)
542
+ expect { @api.tlm_variable("INST UNKNOWN COLLECTS",:RAW) }.to raise_error(/does not exist/)
543
+ expect { @api.tlm_variable("INST HEALTH_STATUS BLAH",:RAW) }.to raise_error(/does not exist/)
544
+ expect { @api.tlm_variable("BLAH","HEALTH_STATUS","COLLECTS",:RAW) }.to raise_error(/does not exist/)
545
+ expect { @api.tlm_variable("INST","UNKNOWN","COLLECTS",:RAW) }.to raise_error(/does not exist/)
546
+ expect { @api.tlm_variable("INST","HEALTH_STATUS","BLAH",:RAW) }.to raise_error(/does not exist/)
547
+ end
548
+
549
+ it "should process a string" do
550
+ @api.tlm_variable("INST HEALTH_STATUS TEMP1",:CONVERTED).should eql -100.0
551
+ @api.tlm_variable("INST HEALTH_STATUS TEMP1",:RAW).should eql 0
552
+ @api.tlm_variable("INST HEALTH_STATUS TEMP1",:FORMATTED).should eql "-100.000"
553
+ @api.tlm_variable("INST HEALTH_STATUS TEMP1",:WITH_UNITS).should eql "-100.000 C"
554
+ end
555
+
556
+ it "should return the value using LATEST" do
557
+ @api.tlm_variable("INST LATEST TEMP1",:CONVERTED).should eql -100.0
558
+ @api.tlm_variable("INST LATEST TEMP1",:RAW).should eql 0
559
+ @api.tlm_variable("INST LATEST TEMP1",:FORMATTED).should eql "-100.000"
560
+ @api.tlm_variable("INST LATEST TEMP1",:WITH_UNITS).should eql "-100.000 C"
561
+ end
562
+
563
+ it "should process parameters" do
564
+ @api.tlm_variable("INST","HEALTH_STATUS","TEMP1",:CONVERTED).should eql -100.0
565
+ @api.tlm_variable("INST","HEALTH_STATUS","TEMP1",:RAW).should eql 0
566
+ @api.tlm_variable("INST","HEALTH_STATUS","TEMP1",:FORMATTED).should eql "-100.000"
567
+ @api.tlm_variable("INST","HEALTH_STATUS","TEMP1",:WITH_UNITS).should eql "-100.000 C"
568
+ end
569
+
570
+ it "should complain with too many parameters" do
571
+ expect { @api.tlm_variable("INST","HEALTH_STATUS","TEMP1","TEMP2",:CONVERTED) }.to raise_error(/Invalid number of arguments/)
572
+ end
573
+ end
574
+
575
+ describe "set_tlm" do
576
+ it "should complain about unknown targets, commands, and parameters" do
577
+ expect { @api.set_tlm("BLAH HEALTH_STATUS COLLECTS = 1") }.to raise_error(/does not exist/)
578
+ expect { @api.set_tlm("INST UNKNOWN COLLECTS = 1") }.to raise_error(/does not exist/)
579
+ expect { @api.set_tlm("INST HEALTH_STATUS BLAH = 1") }.to raise_error(/does not exist/)
580
+ expect { @api.set_tlm("BLAH","HEALTH_STATUS","COLLECTS",1) }.to raise_error(/does not exist/)
581
+ expect { @api.set_tlm("INST","UNKNOWN","COLLECTS",1) }.to raise_error(/does not exist/)
582
+ expect { @api.set_tlm("INST","HEALTH_STATUS","BLAH",1) }.to raise_error(/does not exist/)
583
+ end
584
+
585
+ it "should process a string" do
586
+ @api.set_tlm("INST HEALTH_STATUS TEMP1 = 0.0")
587
+ @api.tlm("INST HEALTH_STATUS TEMP1").should be_within(0.00001).of(-0.05759)
588
+ end
589
+
590
+ it "should process parameters" do
591
+ @api.set_tlm("INST","HEALTH_STATUS","TEMP1", 0.0)
592
+ @api.tlm("INST HEALTH_STATUS TEMP1").should be_within(0.00001).of(-0.05759)
593
+ end
594
+
595
+ it "should complain with too many parameters" do
596
+ expect { @api.set_tlm("INST","HEALTH_STATUS","TEMP1","TEMP2",0.0) }.to raise_error(/Invalid number of arguments/)
597
+ end
598
+ end
599
+
600
+ describe "set_tlm_raw" do
601
+ it "should complain about unknown targets, commands, and parameters" do
602
+ expect { @api.set_tlm_raw("BLAH HEALTH_STATUS COLLECTS = 1") }.to raise_error(/does not exist/)
603
+ expect { @api.set_tlm_raw("INST UNKNOWN COLLECTS = 1") }.to raise_error(/does not exist/)
604
+ expect { @api.set_tlm_raw("INST HEALTH_STATUS BLAH = 1") }.to raise_error(/does not exist/)
605
+ expect { @api.set_tlm_raw("BLAH","HEALTH_STATUS","COLLECTS",1) }.to raise_error(/does not exist/)
606
+ expect { @api.set_tlm_raw("INST","UNKNOWN","COLLECTS",1) }.to raise_error(/does not exist/)
607
+ expect { @api.set_tlm_raw("INST","HEALTH_STATUS","BLAH",1) }.to raise_error(/does not exist/)
608
+ end
609
+
610
+ it "should process a string" do
611
+ @api.set_tlm_raw("INST HEALTH_STATUS TEMP1 = 0.0")
612
+ @api.tlm("INST HEALTH_STATUS TEMP1").should eql -100.0
613
+ end
614
+
615
+ it "should process parameters" do
616
+ @api.set_tlm_raw("INST","HEALTH_STATUS","TEMP1", 0.0)
617
+ @api.tlm("INST HEALTH_STATUS TEMP1").should eql -100.0
618
+ end
619
+ end
620
+
621
+ describe "get_tlm_packet" do
622
+ it "should complain about non-existant targets" do
623
+ expect { @api.get_tlm_packet("BLAH","HEALTH_STATUS") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
624
+ end
625
+
626
+ it "should complain about non-existant packets" do
627
+ expect { @api.get_tlm_packet("INST","BLAH") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
628
+ end
629
+
630
+ it "should complain using LATEST" do
631
+ expect { @api.get_tlm_packet("INST","LATEST") }.to raise_error(RuntimeError, "Telemetry packet 'INST LATEST' does not exist")
632
+ end
633
+
634
+ it "should complain about non-existant value_types" do
635
+ expect { @api.get_tlm_packet("INST","HEALTH_STATUS",:MINE) }.to raise_error(ArgumentError, "Unknown value type on read: MINE")
636
+ end
637
+
638
+ it "should read all telemetry items with their limits states" do
639
+ vals = @api.get_tlm_packet("INST","HEALTH_STATUS")
640
+ vals[0][0].should eql "RECEIVED_TIMESECONDS"
641
+ vals[0][1].should eql 0.0
642
+ vals[0][2].should be_nil
643
+ vals[1][0].should eql "RECEIVED_TIMEFORMATTED"
644
+ vals[1][1].should eql "No Packet Received Time"
645
+ vals[1][2].should be_nil
646
+ vals[2][0].should eql "RECEIVED_COUNT"
647
+ vals[2][1].should eql 0
648
+ vals[2][2].should be_nil
649
+ # Spot check a few more
650
+ vals[22][0].should eql "TEMP1"
651
+ vals[22][1].should eql -100.0
652
+ vals[22][2].should eql :RED_LOW
653
+ vals[23][0].should eql "TEMP2"
654
+ vals[23][1].should eql -100.0
655
+ vals[23][2].should eql :RED_LOW
656
+ vals[24][0].should eql "TEMP3"
657
+ vals[24][1].should eql -100.0
658
+ vals[24][2].should eql :RED_LOW
659
+ vals[25][0].should eql "TEMP4"
660
+ vals[25][1].should eql -100.0
661
+ vals[25][2].should eql :RED_LOW
662
+ end
663
+ end
664
+
665
+ describe "get_tlm_values" do
666
+ it "should handle an empty request" do
667
+ @api.get_tlm_values([]).should eql [[], [], [], :DEFAULT]
668
+ end
669
+
670
+ it "should complain about non-existant targets" do
671
+ expect { @api.get_tlm_values([["BLAH","HEALTH_STATUS","TEMP1"]]) }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
672
+ end
673
+
674
+ it "should complain about non-existant packets" do
675
+ expect { @api.get_tlm_values([["INST","BLAH","TEMP1"]]) }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
676
+ end
677
+
678
+ it "should complain about non-existant items" do
679
+ expect { @api.get_tlm_values([["INST","LATEST","BLAH"]]) }.to raise_error(RuntimeError, "Telemetry item 'INST LATEST BLAH' does not exist")
680
+ end
681
+
682
+ it "should complain about non-existant value_types" do
683
+ expect { @api.get_tlm_values([["INST","HEALTH_STATUS","TEMP1"]],:MINE) }.to raise_error(ArgumentError, "Unknown value type on read: MINE")
684
+ end
685
+
686
+ it "should complain about bad arguments" do
687
+ expect { @api.get_tlm_values("INST",:MINE) }.to raise_error(ArgumentError, /item_array must be nested array/)
688
+ expect { @api.get_tlm_values(["INST","HEALTH_STATUS","TEMP1"],:MINE) }.to raise_error(ArgumentError, /item_array must be nested array/)
689
+ expect { @api.get_tlm_values([["INST","HEALTH_STATUS","TEMP1"]],10) }.to raise_error(ArgumentError, /value_types must be a single symbol or array of symbols/)
690
+ expect { @api.get_tlm_values([["INST","HEALTH_STATUS","TEMP1"]],[10]) }.to raise_error(ArgumentError, /value_types must be a single symbol or array of symbols/)
691
+ end
692
+
693
+ it "should read all the specified items" do
694
+ items = []
695
+ items << %w(INST HEALTH_STATUS TEMP1)
696
+ items << %w(INST HEALTH_STATUS TEMP2)
697
+ items << %w(INST HEALTH_STATUS TEMP3)
698
+ items << %w(INST HEALTH_STATUS TEMP4)
699
+ vals = @api.get_tlm_values(items)
700
+ vals[0][0].should eql -100.0
701
+ vals[0][1].should eql -100.0
702
+ vals[0][2].should eql -100.0
703
+ vals[0][3].should eql -100.0
704
+ vals[1][0].should eql :RED_LOW
705
+ vals[1][1].should eql :RED_LOW
706
+ vals[1][2].should eql :RED_LOW
707
+ vals[1][3].should eql :RED_LOW
708
+ vals[2][0].should eql [-80.0, -70.0, 60.0, 80.0, -20.0, 20.0]
709
+ vals[2][1].should eql [-60.0, -55.0, 30.0, 35.0]
710
+ vals[2][2].should eql [-25.0, -10.0, 50.0, 55.0]
711
+ vals[2][3].should eql [-80.0, -70.0, 60.0, 80.0]
712
+ vals[3].should eql :DEFAULT
713
+ end
714
+
715
+ it "should read all the specified items with one conversion" do
716
+ items = []
717
+ items << %w(INST HEALTH_STATUS TEMP1)
718
+ items << %w(INST HEALTH_STATUS TEMP2)
719
+ items << %w(INST HEALTH_STATUS TEMP3)
720
+ items << %w(INST HEALTH_STATUS TEMP4)
721
+ vals = @api.get_tlm_values(items, :RAW)
722
+ vals[0][0].should eql 0
723
+ vals[0][1].should eql 0
724
+ vals[0][2].should eql 0
725
+ vals[0][3].should eql 0
726
+ vals[1][0].should eql :RED_LOW
727
+ vals[1][1].should eql :RED_LOW
728
+ vals[1][2].should eql :RED_LOW
729
+ vals[1][3].should eql :RED_LOW
730
+ vals[2][0].should eql [-80.0, -70.0, 60.0, 80.0, -20.0, 20.0]
731
+ vals[2][1].should eql [-60.0, -55.0, 30.0, 35.0]
732
+ vals[2][2].should eql [-25.0, -10.0, 50.0, 55.0]
733
+ vals[2][3].should eql [-80.0, -70.0, 60.0, 80.0]
734
+ vals[3].should eql :DEFAULT
735
+ end
736
+
737
+ it "should read all the specified items with different conversions" do
738
+ items = []
739
+ items << %w(INST HEALTH_STATUS TEMP1)
740
+ items << %w(INST HEALTH_STATUS TEMP2)
741
+ items << %w(INST HEALTH_STATUS TEMP3)
742
+ items << %w(INST HEALTH_STATUS TEMP4)
743
+ vals = @api.get_tlm_values(items, [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS])
744
+ vals[0][0].should eql 0
745
+ vals[0][1].should eql -100.0
746
+ vals[0][2].should eql "-100.000"
747
+ vals[0][3].should eql "-100.000 C"
748
+ vals[1][0].should eql :RED_LOW
749
+ vals[1][1].should eql :RED_LOW
750
+ vals[1][2].should eql :RED_LOW
751
+ vals[1][3].should eql :RED_LOW
752
+ vals[2][0].should eql [-80.0, -70.0, 60.0, 80.0, -20.0, 20.0]
753
+ vals[2][1].should eql [-60.0, -55.0, 30.0, 35.0]
754
+ vals[2][2].should eql [-25.0, -10.0, 50.0, 55.0]
755
+ vals[2][3].should eql [-80.0, -70.0, 60.0, 80.0]
756
+ vals[3].should eql :DEFAULT
757
+ end
758
+
759
+ it "should complain if items length != conversions length" do
760
+ items = []
761
+ items << %w(INST HEALTH_STATUS TEMP1)
762
+ items << %w(INST HEALTH_STATUS TEMP2)
763
+ items << %w(INST HEALTH_STATUS TEMP3)
764
+ items << %w(INST HEALTH_STATUS TEMP4)
765
+ expect { @api.get_tlm_values(items, [:RAW, :CONVERTED]) }.to raise_error(ArgumentError, "Passed 4 items but only 2 value types")
766
+ end
767
+ end
768
+
769
+ describe "get_tlm_list" do
770
+ it "should complain about non-existant targets" do
771
+ expect { @api.get_tlm_list("BLAH") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
772
+ end
773
+
774
+ it "should return the sorted packet names for a target" do
775
+ pkts = @api.get_tlm_list("INST")
776
+ pkts[0][0].should eql "ADCS"
777
+ pkts[1][0].should eql "ERROR"
778
+ pkts[2][0].should eql "HANDSHAKE"
779
+ pkts[3][0].should eql "HEALTH_STATUS"
780
+ pkts[4][0].should eql "IMAGE"
781
+ pkts[5][0].should eql "MECH"
782
+ pkts[6][0].should eql "PARAMS"
783
+ end
784
+ end
785
+
786
+ describe "get_tlm_item_list" do
787
+ it "should complain about non-existant targets" do
788
+ expect { @api.get_tlm_item_list("BLAH","HEALTH_STATUS") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
789
+ end
790
+
791
+ it "should complain about non-existant packets" do
792
+ expect { @api.get_tlm_item_list("INST","BLAH") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
793
+ end
794
+
795
+ it "should return all the items for a target/packet" do
796
+ items = @api.get_tlm_item_list("INST","HEALTH_STATUS")
797
+ items[0][0].should eql "RECEIVED_TIMESECONDS"
798
+ items[1][0].should eql "RECEIVED_TIMEFORMATTED"
799
+ items[2][0].should eql "RECEIVED_COUNT"
800
+ # Spot check a few more
801
+ items[22][0].should eql "TEMP1"
802
+ items[22][1].should be_nil
803
+ items[22][2].should eql "Temperature #1"
804
+ items[28][0].should eql "COLLECT_TYPE"
805
+ items[28][1].should include("NORMAL"=>0, "SPECIAL"=>1)
806
+ items[28][2].should eql "Most recent collect type"
807
+ end
808
+ end
809
+
810
+ describe "get_tlm_details" do
811
+ it "should complain about non-existant targets" do
812
+ expect { @api.get_tlm_details([["BLAH","HEALTH_STATUS","TEMP1"]]) }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
813
+ end
814
+
815
+ it "should complain about non-existant packets" do
816
+ expect { @api.get_tlm_details([["INST","BLAH","TEMP1"]]) }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
817
+ end
818
+
819
+ it "should complain about non-existant items" do
820
+ expect { @api.get_tlm_details([["INST","LATEST","BLAH"]]) }.to raise_error(RuntimeError, "Telemetry item 'INST LATEST BLAH' does not exist")
821
+ end
822
+
823
+ it "should complain about bad parameters" do
824
+ expect { @api.get_tlm_details("INST") }.to raise_error(ArgumentError, /item_array must be nested array/)
825
+ expect { @api.get_tlm_details(["INST","LATEST","BLAH"]) }.to raise_error(ArgumentError, /item_array must be nested array/)
826
+ end
827
+
828
+ it "should read all the specified items" do
829
+ items = []
830
+ items << %w(INST HEALTH_STATUS TEMP1)
831
+ items << %w(INST HEALTH_STATUS TEMP2)
832
+ items << %w(INST HEALTH_STATUS TEMP3)
833
+ items << %w(INST HEALTH_STATUS TEMP4)
834
+ details = @api.get_tlm_details(items)
835
+ details.length.should eql 4
836
+ details[0]["name"].should eql "TEMP1"
837
+ details[1]["name"].should eql "TEMP2"
838
+ details[2]["name"].should eql "TEMP3"
839
+ details[3]["name"].should eql "TEMP4"
840
+ end
841
+ end
842
+
843
+ describe "get_out_of_limits" do
844
+ it "should return all out of limits items" do
845
+ items = @api.get_out_of_limits
846
+ (0..3).each do |i|
847
+ items[i][0].should eql "INST"
848
+ items[i][1].should eql "HEALTH_STATUS"
849
+ items[i][2].should eql "TEMP#{i+1}"
850
+ items[i][3].should eql :RED_LOW
851
+ end
852
+ end
853
+ end
854
+
855
+ describe "limits_enabled?" do
856
+ it "should complain about non-existant targets" do
857
+ expect { @api.limits_enabled?("BLAH","HEALTH_STATUS","TEMP1") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
858
+ end
859
+
860
+ it "should complain about non-existant packets" do
861
+ expect { @api.limits_enabled?("INST","BLAH","TEMP1") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
862
+ end
863
+
864
+ it "should complain about non-existant items" do
865
+ expect { @api.limits_enabled?("INST","HEALTH_STATUS","BLAH") }.to raise_error(RuntimeError, "Packet item 'INST HEALTH_STATUS BLAH' does not exist")
866
+ end
867
+
868
+ it "should return whether limits are enable for an item" do
869
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_truthy
870
+ end
871
+ end
872
+
873
+ describe "enable_limits" do
874
+ it "should complain about non-existant targets" do
875
+ expect { @api.enable_limits("BLAH","HEALTH_STATUS","TEMP1") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
876
+ end
877
+
878
+ it "should complain about non-existant packets" do
879
+ expect { @api.enable_limits("INST","BLAH","TEMP1") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
880
+ end
881
+
882
+ it "should complain about non-existant items" do
883
+ expect { @api.enable_limits("INST","HEALTH_STATUS","BLAH") }.to raise_error(RuntimeError, "Packet item 'INST HEALTH_STATUS BLAH' does not exist")
884
+ end
885
+
886
+ it "should enable limits for an item" do
887
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_truthy
888
+ @api.disable_limits("INST","HEALTH_STATUS","TEMP1")
889
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_falsey
890
+ @api.enable_limits("INST","HEALTH_STATUS","TEMP1")
891
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_truthy
892
+ end
893
+ end
894
+
895
+ describe "disable_limits" do
896
+ it "should complain about non-existant targets" do
897
+ expect { @api.disable_limits("BLAH","HEALTH_STATUS","TEMP1") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
898
+ end
899
+
900
+ it "should complain about non-existant packets" do
901
+ expect { @api.disable_limits("INST","BLAH","TEMP1") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
902
+ end
903
+
904
+ it "should complain about non-existant items" do
905
+ expect { @api.disable_limits("INST","HEALTH_STATUS","BLAH") }.to raise_error(RuntimeError, "Packet item 'INST HEALTH_STATUS BLAH' does not exist")
906
+ end
907
+
908
+ it "should disable limits for an item" do
909
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_truthy
910
+ @api.disable_limits("INST","HEALTH_STATUS","TEMP1")
911
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_falsey
912
+ @api.enable_limits("INST","HEALTH_STATUS","TEMP1")
913
+ end
914
+ end
915
+
916
+ describe "get_limits" do
917
+ it "should complain about non-existant targets" do
918
+ expect { @api.get_limits("BLAH","HEALTH_STATUS","TEMP1") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
919
+ end
920
+
921
+ it "should complain about non-existant packets" do
922
+ expect { @api.get_limits("INST","BLAH","TEMP1") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
923
+ end
924
+
925
+ it "should complain about non-existant items" do
926
+ expect { @api.get_limits("INST","HEALTH_STATUS","BLAH") }.to raise_error(RuntimeError, "Packet item 'INST HEALTH_STATUS BLAH' does not exist")
927
+ end
928
+
929
+ it "should get limits for an item" do
930
+ @api.get_limits("INST","HEALTH_STATUS","TEMP1").should eql([:DEFAULT, 1, true, -80.0, -70.0, 60.0, 80.0, -20.0, 20.0])
931
+ @api.get_limits("INST","HEALTH_STATUS","TEMP1",:TVAC).should eql([:TVAC, 1, true, -80.0, -30.0, 30.0, 80.0, nil, nil])
932
+ end
933
+ end
934
+
935
+ describe "set_limits" do
936
+ it "should complain about non-existant targets" do
937
+ expect { @api.set_limits("BLAH","HEALTH_STATUS","TEMP1",0.0,10.0,20.0,30.0) }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
938
+ end
939
+
940
+ it "should complain about non-existant packets" do
941
+ expect { @api.set_limits("INST","BLAH","TEMP1",0.0,10.0,20.0,30.0) }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
942
+ end
943
+
944
+ it "should complain about non-existant items" do
945
+ expect { @api.set_limits("INST","HEALTH_STATUS","BLAH",0.0,10.0,20.0,30.0) }.to raise_error(RuntimeError, "Packet item 'INST HEALTH_STATUS BLAH' does not exist")
946
+ end
947
+
948
+ it "should get limits for an item" do
949
+ @api.set_limits("INST","HEALTH_STATUS","TEMP1",0.0,10.0,20.0,30.0).should eql([:CUSTOM, 1, true, 0.0, 10.0, 20.0, 30.0, nil, nil])
950
+ @api.set_limits("INST","HEALTH_STATUS","TEMP1",0.0,10.0,20.0,30.0,12.0,15.0,:CUSTOM2,2,false).should eql([:CUSTOM2, 2, false, 0.0, 10.0, 20.0, 30.0, 12.0, 15.0])
951
+ @api.set_limits("INST","HEALTH_STATUS","TEMP1",0.0,10.0,20.0,30.0,12.0,15.0,:CUSTOM,1,true).should eql([:CUSTOM, 1, true, 0.0, 10.0, 20.0, 30.0, 12.0, 15.0])
952
+ end
953
+ end
954
+
955
+ describe "get_limits_groups" do
956
+ it "should return all the limits groups" do
957
+ @api.get_limits_groups.should eql %w(FIRST SECOND)
958
+ end
959
+ end
960
+
961
+ describe "enable_limits_group" do
962
+ it "should complain about undefined limits groups" do
963
+ expect { @api.enable_limits_group("MINE") }.to raise_error(RuntimeError, "LIMITS_GROUP MINE undefined. Ensure your telemetry definition contains the line: LIMITS_GROUP MINE")
964
+ end
965
+
966
+ it "should enable limits for all items in the group" do
967
+ @api.disable_limits("INST","HEALTH_STATUS","TEMP1")
968
+ @api.disable_limits("INST","HEALTH_STATUS","TEMP3")
969
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_falsey
970
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP3").should be_falsey
971
+ @api.enable_limits_group("FIRST")
972
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_truthy
973
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP3").should be_truthy
974
+ end
975
+ end
976
+
977
+ describe "disable_limits_group" do
978
+ it "should complain about undefined limits groups" do
979
+ expect { @api.disable_limits_group("MINE") }.to raise_error(RuntimeError, "LIMITS_GROUP MINE undefined. Ensure your telemetry definition contains the line: LIMITS_GROUP MINE")
980
+ end
981
+
982
+ it "should disable limits for all items in the group" do
983
+ @api.enable_limits("INST","HEALTH_STATUS","TEMP1")
984
+ @api.enable_limits("INST","HEALTH_STATUS","TEMP3")
985
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_truthy
986
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP3").should be_truthy
987
+ @api.disable_limits_group("FIRST")
988
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP1").should be_falsey
989
+ @api.limits_enabled?("INST","HEALTH_STATUS","TEMP3").should be_falsey
990
+ end
991
+ end
992
+
993
+ describe "get_limits_sets, get_limits_set, set_limits_set" do
994
+ it "should get and set the active limits set" do
995
+ if @api.get_limits_sets.include?(:CUSTOM)
996
+ @api.get_limits_sets.should eql [:DEFAULT,:TVAC, :CUSTOM, :CUSTOM2]
997
+ else
998
+ @api.get_limits_sets.should eql [:DEFAULT,:TVAC]
999
+ end
1000
+ @api.set_limits_set("TVAC")
1001
+ @api.get_limits_set.should eql "TVAC"
1002
+ @api.set_limits_set("DEFAULT")
1003
+ @api.get_limits_set.should eql "DEFAULT"
1004
+ end
1005
+ end
1006
+
1007
+ describe "get_target_list" do
1008
+ it "should return all target names" do
1009
+ @api.get_target_list.should eql %w(COSMOS INST META SYSTEM)
1010
+ end
1011
+ end
1012
+
1013
+ describe "subscribe_limits_events" do
1014
+ it "should call CmdTlmServer" do
1015
+ stub_const("Cosmos::CmdTlmServer::DEFAULT_LIMITS_EVENT_QUEUE_SIZE", 100)
1016
+ expect(CmdTlmServer).to receive(:subscribe_limits_events)
1017
+ @api.subscribe_limits_events
1018
+ end
1019
+ end
1020
+
1021
+ describe "unsubscribe_limits_events" do
1022
+ it "should call CmdTlmServer" do
1023
+ expect(CmdTlmServer).to receive(:unsubscribe_limits_events)
1024
+ @api.unsubscribe_limits_events(0)
1025
+ end
1026
+ end
1027
+
1028
+ describe "get_limits_event" do
1029
+ it "should get a limits event" do
1030
+ expect(CmdTlmServer).to receive(:get_limits_event)
1031
+ @api.get_limits_event(0)
1032
+ end
1033
+ end
1034
+
1035
+ describe "subscribe_packet_data" do
1036
+ it "should call CmdTlmServer" do
1037
+ stub_const("Cosmos::CmdTlmServer::DEFAULT_PACKET_DATA_QUEUE_SIZE", 100)
1038
+ expect(CmdTlmServer).to receive(:subscribe_packet_data)
1039
+ @api.subscribe_packet_data([["TGT","PKT1"],["TGT","PKT2"]])
1040
+ end
1041
+ end
1042
+
1043
+ describe "unsubscribe_packet_datas" do
1044
+ it "should call CmdTlmServer" do
1045
+ expect(CmdTlmServer).to receive(:unsubscribe_packet_data)
1046
+ @api.unsubscribe_packet_data(10)
1047
+ end
1048
+ end
1049
+
1050
+ describe "get_packet_data" do
1051
+ it "should call CmdTlmServer" do
1052
+ expect(CmdTlmServer).to receive(:get_packet_data)
1053
+ @api.get_packet_data(10)
1054
+ end
1055
+ end
1056
+
1057
+ # All these methods simply pass through directly to CmdTlmServer without
1058
+ # adding any functionality. Thus we just test that they are are received
1059
+ # by the CmdTlmServer.
1060
+ describe "CmdTlmServer pass-throughs" do
1061
+ it "should call through to the CmdTlmServer" do
1062
+ @api.get_interface_names
1063
+ @api.connect_interface("INT")
1064
+ @api.disconnect_interface("INT")
1065
+ @api.interface_state("INT")
1066
+ @api.map_target_to_interface("INST", "INT")
1067
+ @api.get_router_names
1068
+ @api.connect_router("ROUTE")
1069
+ @api.disconnect_router("ROUTE")
1070
+ @api.router_state("ROUTE")
1071
+ @api.send_raw("INT","\x00\x01")
1072
+ @api.get_cmd_log_filename('DEFAULT')
1073
+ @api.get_tlm_log_filename('DEFAULT')
1074
+ @api.start_logging('ALL')
1075
+ @api.stop_logging('ALL')
1076
+ @api.start_cmd_log('ALL')
1077
+ @api.start_tlm_log('ALL')
1078
+ @api.stop_cmd_log('ALL')
1079
+ @api.stop_tlm_log('ALL')
1080
+ @api.get_server_message_log_filename
1081
+ @api.start_new_server_message_log
1082
+ end
1083
+ end
1084
+
1085
+ end
1086
+ end
1087
+