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,46 +1,46 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos/tools/cmd_tlm_server/api'
12
-
13
- module Cosmos
14
- # Handles a user supplied thread to run in the background of the
15
- # Command and Telemetry Server
16
- class BackgroundTask
17
- include Api
18
-
19
- attr_accessor :name
20
- attr_accessor :thread
21
- attr_accessor :status
22
-
23
- # Constructor
24
- def initialize
25
- @name = nil
26
- @thread = nil
27
- @status = nil
28
- end
29
-
30
- # Subclasses should override the call method which is called once by
31
- # the Command and Telemetry Server. Thus subclasses should add their own
32
- # loop and sleep statements if they expect to run continuously.
33
- def call
34
- raise "call method must be defined by subclass"
35
- end
36
-
37
- # The Command and Telemetry Server calls the stop method before killing the
38
- # Thread which is running the background tasks. This method should be
39
- # overriden by subclasses to do whatever shutdown is necessary.
40
- def stop
41
- # Nothing to do by default
42
- end
43
-
44
- end # class BackgroundTask
45
-
46
- end
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos/tools/cmd_tlm_server/api'
12
+
13
+ module Cosmos
14
+ # Handles a user supplied thread to run in the background of the
15
+ # Command and Telemetry Server
16
+ class BackgroundTask
17
+ include Api
18
+
19
+ attr_accessor :name
20
+ attr_accessor :thread
21
+ attr_accessor :status
22
+
23
+ # Constructor
24
+ def initialize
25
+ @name = nil
26
+ @thread = nil
27
+ @status = nil
28
+ end
29
+
30
+ # Subclasses should override the call method which is called once by
31
+ # the Command and Telemetry Server. Thus subclasses should add their own
32
+ # loop and sleep statements if they expect to run continuously.
33
+ def call
34
+ raise "call method must be defined by subclass"
35
+ end
36
+
37
+ # The Command and Telemetry Server calls the stop method before killing the
38
+ # Thread which is running the background tasks. This method should be
39
+ # overriden by subclasses to do whatever shutdown is necessary.
40
+ def stop
41
+ # Nothing to do by default
42
+ end
43
+
44
+ end # class BackgroundTask
45
+
46
+ end
@@ -1,63 +1,67 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos/tools/cmd_tlm_server/cmd_tlm_server_config'
12
-
13
- module Cosmos
14
-
15
- # Manages starting and stopping all the background tasks which
16
- # were discovered when parsing the configuration file.
17
- class BackgroundTasks
18
- # @param cmd_tlm_server_config [CmdTlmServerConfig] The command telemetry
19
- # server configuration
20
- def initialize(cmd_tlm_server_config)
21
- @config = cmd_tlm_server_config
22
- @threads = []
23
- end
24
-
25
- # Start background tasks by creating a new Ruby thread for each and then
26
- # calling their 'call' method once.
27
- def start
28
- @config.background_tasks.each do |background_task|
29
- new_thread = Thread.new do
30
- background_task.thread = Thread.current
31
- begin
32
- background_task.call
33
- rescue Exception => err
34
- Logger.error "Background Task thread unexpectedly died"
35
- Cosmos.handle_fatal_exception(err)
36
- end
37
- end
38
- @threads << new_thread
39
- end
40
- end
41
-
42
- # Stop background tasks by calling their stop method and then killing their
43
- # Ruby threads.
44
- def stop
45
- @config.background_tasks.each do |background_task|
46
- begin
47
- background_task.stop
48
- rescue
49
- # Ignore any errors because we're about to kill the thread anyway
50
- end
51
- end
52
- @threads.each {|thread| thread.kill}
53
- @threads = []
54
- end
55
-
56
- # Return the array of background tasks
57
- def all
58
- @config.background_tasks
59
- end
60
-
61
- end # class BackgroundTasks
62
-
63
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos/tools/cmd_tlm_server/cmd_tlm_server_config'
12
+
13
+ module Cosmos
14
+
15
+ # Manages starting and stopping all the background tasks which
16
+ # were discovered when parsing the configuration file.
17
+ class BackgroundTasks
18
+ # @param cmd_tlm_server_config [CmdTlmServerConfig] The command telemetry
19
+ # server configuration
20
+ def initialize(cmd_tlm_server_config)
21
+ @config = cmd_tlm_server_config
22
+ @threads = []
23
+ end
24
+
25
+ # Start background tasks by creating a new Ruby thread for each and then
26
+ # calling their 'call' method once.
27
+ def start
28
+ @config.background_tasks.each do |background_task|
29
+ new_thread = Thread.new do
30
+ background_task.thread = Thread.current
31
+ begin
32
+ background_task.call
33
+ rescue Exception => err
34
+ Logger.error "Background Task thread unexpectedly died"
35
+ Cosmos.handle_fatal_exception(err)
36
+ end
37
+ end
38
+ @threads << new_thread
39
+ end
40
+ end
41
+
42
+ # Stop background tasks by calling their stop method and then killing their
43
+ # Ruby threads.
44
+ def stop
45
+ @config.background_tasks.each do |background_task|
46
+ begin
47
+ background_task.stop
48
+ rescue
49
+ # Ignore any errors because we're about to kill the thread anyway
50
+ end
51
+ end
52
+ @threads.each {|thread| Cosmos.kill_thread(self, thread)}
53
+ @threads = []
54
+ end
55
+
56
+ # Return the array of background tasks
57
+ def all
58
+ @config.background_tasks
59
+ end
60
+
61
+ def graceful_kill
62
+ # This method is just here to remove warnings - background_task.stop should kill the thread
63
+ end
64
+
65
+ end # class BackgroundTasks
66
+
67
+ end # module Cosmos
@@ -1,497 +1,511 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos/io/json_drb'
12
- require 'cosmos/tools/cmd_tlm_server/api'
13
- require 'cosmos/tools/cmd_tlm_server/cmd_tlm_server_config'
14
- require 'cosmos/tools/cmd_tlm_server/background_tasks'
15
- require 'cosmos/tools/cmd_tlm_server/commanding'
16
- require 'cosmos/tools/cmd_tlm_server/interfaces'
17
- require 'cosmos/tools/cmd_tlm_server/packet_logging'
18
- require 'cosmos/tools/cmd_tlm_server/routers'
19
-
20
- module Cosmos
21
-
22
- # Provides the interface for all applications to get the latest telemetry and
23
- # to send commands.
24
- class CmdTlmServer
25
- include Api
26
-
27
- # instance_attr_reader attributes are used by other classes and are thus
28
- # made available directly on the CmdTlmServer class
29
-
30
- # @return [BackgroundTasks] Access to the background tasks
31
- instance_attr_reader :background_tasks
32
- # @return [Commanding] Allows for sending commands to targets and
33
- # interfaces
34
- instance_attr_reader :commanding
35
- # @return [Interfaces] Access to the interfaces
36
- instance_attr_reader :interfaces
37
- # @return [PacketLogging] Access to the packet loggers
38
- instance_attr_reader :packet_logging
39
- # @return [Routers] Access to the routers
40
- instance_attr_reader :routers
41
- # @return [MessageLog] Message log for the CmdTlmServer
42
- instance_attr_reader :message_log
43
- # @return [JsonDRb] Provides access to the server for all tools both
44
- # internal and external
45
- instance_attr_accessor :json_drb
46
- # @return [String] CmdTlmServer title as set in the config file
47
- instance_attr_accessor :title
48
-
49
- # attr_reader attributes are only used by CmdTlmServer internally and are
50
- # thus only available as attributes on the singleton
51
-
52
- # @return [Mutex] Synchronization object around limits events
53
- attr_reader :limits_event_queue_mutex
54
- # @return [Hash<Integer, Array<Queue, Integer>>] The limits event queues
55
- # hashed by id. Returns an array containing the queue followed by the
56
- # queue size.
57
- attr_reader :limits_event_queues
58
- # @return [Integer] The next limits event queue id when
59
- # subscribe_limits_event is called. This ID must be used in the
60
- # limits_event_queues hash to access the queue.
61
- attr_accessor :next_limits_event_queue_id
62
- # @return [Mutex] Synchronization object around packet data events
63
- attr_reader :packet_data_queue_mutex
64
- # @return [Hash<Integer, Array<Queue, Integer>>] The packet data queues
65
- # hashed by id. Returns an array containing the queue followed by the
66
- # queue size.
67
- attr_reader :packet_data_queues
68
- # @return [Integer] The next packet data queue id when
69
- # subscribe_packet_data is called. This ID must be used in the
70
- # packet_data_queues hash to access the queue.
71
- attr_accessor :next_packet_data_queue_id
72
-
73
- # The default host
74
- DEFAULT_HOST = 'localhost'
75
- # The default configuration file name
76
- DEFAULT_CONFIG_FILE = 'cmd_tlm_server.txt'
77
- # The maximum number of limits events that are queued. Used when
78
- # subscribing to limits events.
79
- DEFAULT_LIMITS_EVENT_QUEUE_SIZE = 1000
80
- # The maximum number of packets that are queued. Used when subscribing to
81
- # packet data.
82
- DEFAULT_PACKET_DATA_QUEUE_SIZE = 1000
83
-
84
- @@instance = nil
85
- @@meta_callback = nil
86
-
87
- # Get the instance of the CmdTlmServer
88
- def self.instance
89
- @@instance
90
- end
91
-
92
- # Set the meta callback
93
- def self.meta_callback= (meta_callback)
94
- @@meta_callback = meta_callback
95
- end
96
-
97
- # Constructor for a CmdTlmServer
98
- #
99
- # @param config_file [String] The name of the server configuration file
100
- # which must be in the config/tools/cmd_tlm_server directory.
101
- # @param production [Boolean] Whether the server should be placed in
102
- # 'production' mode which does various things to protect the server
103
- # including disabling the ability to stop logging.
104
- # @param disconnect [Boolean] Whether to start the server in a disconnected
105
- # stand-alone mode which does not actually use the interfaces to send and
106
- # receive data. This is useful for testing scripts when actual hardware
107
- # is not available.
108
- def initialize(config_file = DEFAULT_CONFIG_FILE,
109
- production = false,
110
- disconnect = false,
111
- create_message_log = true)
112
- @@instance = self
113
- @packet_logging = nil # Removes warnings
114
- @message_log = MessageLog.new('server') if create_message_log
115
-
116
- super() # For Api
117
-
118
- Logger.info "COSMOS Version: #{COSMOS_VERSION}"
119
-
120
- @disconnect = disconnect
121
-
122
- @limits_event_queue_mutex = Mutex.new
123
- @limits_event_queues = {}
124
- @next_limits_event_queue_id = 1
125
-
126
- @packet_data_queue_mutex = Mutex.new
127
- @packet_data_queues = {}
128
- @next_packet_data_queue_id = 1
129
-
130
- # Process cmd_tlm_server.txt
131
- @config = CmdTlmServerConfig.new(File.join('config', 'tools', 'cmd_tlm_server', config_file))
132
- @background_tasks = BackgroundTasks.new(@config)
133
- @commanding = Commanding.new(@config)
134
- @interfaces = Interfaces.new(@config, method(:identified_packet_callback))
135
- @packet_logging = PacketLogging.new(@config)
136
- @routers = Routers.new(@config)
137
- @title = @config.title
138
-
139
- # Set Threads to kill CTS if they throw an exception
140
- Thread.abort_on_exception = true
141
-
142
- # Don't start the DRb service or the telemetry monitoring thread
143
- # if we started the server in disconnect mode
144
- @json_drb = nil
145
- start(production) unless @disconnect
146
- end # end def initialize
147
-
148
- # Start up the system by starting the JSON-RPC server, interfaces, routers,
149
- # and background tasks. Starts a thread to monitor all packets for
150
- # staleness so other tools (such as Packet Viewer or Telemetry Viewer) can
151
- # react accordingly.
152
- #
153
- # @param production (see #initialize)
154
- def start(production = false)
155
- System.telemetry # Make sure definitions are loaded by starting anything
156
- return unless @json_drb.nil?
157
-
158
- @@meta_callback.call(@config.meta_target_name, @config.meta_packet_name) if @@meta_callback if @config.meta_target_name and @config.meta_packet_name
159
-
160
- # Start DRb with access control
161
- @json_drb = JsonDRb.new
162
- @json_drb.acl = System.acl if System.acl
163
-
164
- # In production we start logging and don't allow the user to stop it
165
- # We also disallow setting telemetry and disconnecting from interfaces
166
- if production
167
- @packet_logging.start
168
- @api_whitelist.delete('stop_logging')
169
- @api_whitelist.delete('stop_cmd_log')
170
- @api_whitelist.delete('stop_tlm_log')
171
- @interfaces.all.each do |name, interface|
172
- interface.disable_disconnect = true
173
- end
174
- @routers.all.each do |name, interface|
175
- interface.disable_disconnect = true
176
- end
177
- end
178
- @json_drb.method_whitelist = @api_whitelist
179
- begin
180
- @json_drb.start_service("localhost", System.ports['CTS_API'], self)
181
- rescue Exception
182
- # Call packet_logging shutdown here to explicitly kill the logging
183
- # threads since this CTS is not going to launch
184
- @packet_logging.shutdown
185
- raise FatalError.new("Error starting JsonDRb on port #{System.ports['CTS_API']}.\nPerhaps a Command and Telemetry Server is already running?")
186
- end
187
-
188
- @routers.add_preidentified('PREIDENTIFIED_ROUTER', System.instance.ports['CTS_PREIDENTIFIED'])
189
- System.telemetry.limits_change_callback = method(:limits_change_callback)
190
- @interfaces.start
191
- @routers.start
192
- @background_tasks.start
193
-
194
- # Start staleness monitor thread
195
- @staleness_monitor_thread = Thread.new do
196
- begin
197
- while true
198
- System.telemetry.check_stale
199
- sleep(10)
200
- end
201
- rescue Exception => err
202
- Logger.fatal "Staleness Monitor thread unexpectedly died"
203
- Cosmos.handle_fatal_exception(err)
204
- end
205
- end # end Thread.new
206
- end
207
-
208
- # Properly shuts down the command and telemetry server by stoping the
209
- # JSON-RPC server, background tasks, routers, and interfaces. Also kills
210
- # the packet staleness monitor thread.
211
- def stop
212
- # Shutdown DRb
213
- @json_drb.stop_service
214
-
215
- # Shutdown staleness monitor thread
216
- @staleness_monitor_thread.kill if @staleness_monitor_thread
217
-
218
- @background_tasks.stop
219
- @routers.stop
220
- @interfaces.stop
221
- @packet_logging.shutdown
222
- @message_log.stop if @message_log
223
-
224
- @json_drb = nil
225
- end
226
-
227
- # Called when an item in any packet changes limits states.
228
- #
229
- # @param packet [Packet] Packet which has had an item change limits state
230
- # @param item [PacketItem] The item which has changed limits state
231
- # @param old_limits_state [Symbol] The previous state of the item. See
232
- # {PacketItemLimits#state}
233
- # @param value [Object] The current value of the item
234
- # @param log_change [Boolean] Whether to log this limits change event
235
- def limits_change_callback(packet, item, old_limits_state, value, log_change)
236
- if log_change
237
- # Write to Server Messages that limits state has changed
238
- tgt_pkt_item_str = "#{packet.target_name} #{packet.packet_name} #{item.name} = #{value} is"
239
- case item.limits.state
240
- when :BLUE
241
- Logger.info "<B>#{tgt_pkt_item_str} #{item.limits.state}"
242
- when :GREEN, :GREEN_LOW, :GREEN_HIGH
243
- Logger.info "<G>#{tgt_pkt_item_str} #{item.limits.state}"
244
- when :YELLOW, :YELLOW_LOW, :YELLOW_HIGH
245
- Logger.warn "<Y>#{tgt_pkt_item_str} #{item.limits.state}"
246
- when :RED, :RED_LOW, :RED_HIGH
247
- Logger.error "<R>#{tgt_pkt_item_str} #{item.limits.state}"
248
- else
249
- Logger.error "#{tgt_pkt_item_str} UNKNOWN"
250
- end
251
- end
252
-
253
- post_limits_event(:LIMITS_CHANGE, [packet.target_name, packet.packet_name, item.name, old_limits_state, item.limits.state])
254
-
255
- if item.limits.response
256
- begin
257
- item.limits.response.call(packet, item, old_limits_state)
258
- rescue Exception => err
259
- Logger.error "#{packet.target_name} #{packet.packet_name} #{item.name} Limits Response Exception!"
260
- Logger.error "Called with old_state = #{old_limits_state}, new_state = #{item.limits.state}"
261
- Logger.error err.formatted
262
- end
263
- end
264
- end
265
-
266
- # Post a limits event to all subscribed limits event listeners.
267
- #
268
- # @param event_type [Symbol] The type of limits event that occurred. Must
269
- # be one of :LIMITS_SET which means the system limits set has changed,
270
- # :LIMITS_CHANGE which means an individual item has changed limits state, or
271
- # :LIMITS_SETTINGS which means an individual item has new settings
272
- # @param event_data [Symbol|Array<String,String,String,Symbol,Symbol>]
273
- # Returns the current limits set name for event_type == :LIMITS_SET.
274
- # Returns an array containing the target name, packet name, item name,
275
- # old limits state, and current limits state for event_type ==
276
- # :LIMITS_CHANGE.
277
- def post_limits_event(event_type, event_data)
278
- if @limits_event_queues.length > 0
279
- queues_to_drop = []
280
-
281
- @limits_event_queue_mutex.synchronize do
282
- # Post event to active queues
283
- @limits_event_queues.each do |id, data|
284
- queue = data[0]
285
- queue_size = data[1]
286
- queue << [event_type, event_data]
287
- if queue.length > queue_size
288
- # Drop queue
289
- queues_to_drop << id
290
- end
291
- end
292
-
293
- # Drop queues which are not being serviced
294
- queues_to_drop.each do |id|
295
- # Remove the queue to stop servicing it. Nil is added to unblock any client threads
296
- # that might otherwise be left blocking forever for something on the queue
297
- queue, queue_size = @limits_event_queues.delete(id)
298
- queue << nil if queue
299
- end
300
- end
301
- end
302
- end
303
-
304
- # Create a queue on the CmdTlmServer that gets populated with every limits
305
- # event in the system. A limits event occurs when a telemetry item with
306
- # limits changes state. Thus limits events occur on negative transitions
307
- # (:GREEN to :YELLOW_LOW) and positive transitions (:YELLOW_HIGH to
308
- # :GREEN).
309
- #
310
- # @param queue_size [Integer] The number of limit events to accumulate
311
- # before the queue will be dropped due to inactivity.
312
- # @return [Integer] The queue ID returned from the CmdTlmServer. Use this
313
- # ID when calling {#get_limits_event} and {#unsubscribe_limits_events}.
314
- def self.subscribe_limits_events(queue_size = DEFAULT_LIMITS_EVENT_QUEUE_SIZE)
315
- id = nil
316
- @@instance.limits_event_queue_mutex.synchronize do
317
- id = @@instance.next_limits_event_queue_id
318
- @@instance.limits_event_queues[id] = [Queue.new, queue_size]
319
- @@instance.next_limits_event_queue_id += 1
320
- end
321
- return id
322
- end
323
-
324
- # Unsubscribe from being notified for every limits event in the system.
325
- # This deletes the queue and further calls to {#get_limits_event} will
326
- # raise an exception.
327
- #
328
- # @param id [Integer] The queue ID received from calling
329
- # {#subscribe_limits_events}
330
- def self.unsubscribe_limits_events(id)
331
- queue = nil
332
- @@instance.limits_event_queue_mutex.synchronize do
333
- # Remove the queue to stop servicing it. Nil is added to unblock any client threads
334
- # that might otherwise be left blocking forever for something on the queue
335
- queue, queue_size = @@instance.limits_event_queues.delete(id)
336
- queue << nil if queue
337
- end
338
- end
339
-
340
- # Get a limits event from the queue created by {#subscribe_limits_events}.
341
- #
342
- # Each limits event consists of an Array with two elements:
343
- # \[:LIMITS_CHANGE, [target, packet, item, old state, current state]]
344
- #
345
- # @param id [Integer] The queue ID received from calling
346
- # {#subscribe_limits_events}
347
- # @param non_block [Boolean] Whether to wait on the queue for the next
348
- # limits event before returning. Default is to block waiting for the next
349
- # event. NOTE: If you pass true and there is no data on the queue, a
350
- # ThreadError exception is raised.
351
- def self.get_limits_event(id, non_block = false)
352
- queue = nil
353
- @@instance.limits_event_queue_mutex.synchronize do
354
- queue, _ = @@instance.limits_event_queues[id]
355
- end
356
- if queue
357
- return queue.pop(non_block)
358
- else
359
- raise "Limits event queue with id #{id} not found"
360
- end
361
- end
362
-
363
- # Post packet data to all subscribed packet data listeners.
364
- #
365
- # @param packet [Packet]
366
- def post_packet(packet)
367
- if @packet_data_queues.length > 0
368
- queues_to_drop = []
369
-
370
- @packet_data_queue_mutex.synchronize do
371
- # Post event to active queues
372
- @packet_data_queues.each do |id, data|
373
- queue = data[0]
374
- packets = data[1]
375
- queue_size = data[2]
376
-
377
- packets.each do |target_name, packet_name|
378
- if packet.target_name == target_name and packet.packet_name == packet_name
379
- received_time = packet.received_time
380
- received_time ||= Time.now
381
- queue << [packet.buffer, target_name, packet_name,
382
- received_time.tv_sec, received_time.tv_usec, packet.received_count]
383
- if queue.length > queue_size
384
- # Drop queue
385
- queues_to_drop << id
386
- end
387
- break
388
- end
389
- end
390
- end
391
-
392
- # Drop queues which are not being serviced
393
- queues_to_drop.each do |id|
394
- # Remove the queue to stop servicing it. Nil is added to unblock any client threads
395
- # that might otherwise be left blocking forever for something on the queue
396
- queue, packets, queue_size = @packet_data_queues.delete(id)
397
- queue << nil if queue
398
- end
399
- end
400
- end
401
- end
402
-
403
- # Subscribe to one or more telemetry packets.
404
- #
405
- # @param packets [Array<Array<String,String>>] List of packets where the
406
- # Strings are target name, packet name.
407
- # @param queue_size [Integer] The size of the queue to store packet data
408
- # @return [Integer] The queue ID returned from CmdTlmServer. Use this ID
409
- # when calling {#get_packet_data} and {#unsubscribe_packet_data}.
410
- def self.subscribe_packet_data(packets,
411
- queue_size = CmdTlmServer::DEFAULT_PACKET_DATA_QUEUE_SIZE)
412
- if !packets.is_a?(Array) || !packets[0].is_a?(Array)
413
- raise ArgumentError, "packets must be nested array: [['TGT','PKT'],...]"
414
- end
415
-
416
- id = nil
417
- upcase_packets = []
418
-
419
- # Upper case packet names
420
- packets.length.times do |index|
421
- upcase_packets << []
422
- upcase_packets[index][0] = packets[index][0].upcase
423
- upcase_packets[index][1] = packets[index][1].upcase
424
- # Get the packet to ensure it exists
425
- @@instance.get_tlm_packet(upcase_packets[index][0], upcase_packets[index][1])
426
- end
427
-
428
- @@instance.packet_data_queue_mutex.synchronize do
429
- id = @@instance.next_packet_data_queue_id
430
- @@instance.packet_data_queues[id] =
431
- [Queue.new, upcase_packets, queue_size]
432
- @@instance.next_packet_data_queue_id += 1
433
- end
434
- return id
435
- end
436
-
437
- # Unsubscribe to telemetry packets.
438
- #
439
- # @param id [Integer] The queue ID received from calling
440
- # {#subscribe_packet_data}.
441
- def self.unsubscribe_packet_data(id)
442
- @@instance.packet_data_queue_mutex.synchronize do
443
- # Remove the queue to stop servicing it. Nil is added to unblock any client threads
444
- # that might otherwise be left blocking forever for something on the queue
445
- queue, packets, queue_size = @@instance.packet_data_queues.delete(id)
446
- queue << nil if queue
447
- end
448
- return nil
449
- end
450
-
451
- # Get packet data from the queue created by {#subscribe_packet_data}.
452
- #
453
- # Each packet data consists of an Array with five elements:
454
- # \[buffer, target name, packet name, received time sec, received time us]
455
- #
456
- # @param id [Integer] The queue ID received from calling
457
- # {#subscribe_packet_data}
458
- # @param non_block [Boolean] Whether to wait on the queue for the next
459
- # packet before returning. Default is to block waiting for the next
460
- # packet. NOTE: If you pass true and there is no packet on the queue, a
461
- # ThreadError exception is raised.
462
- def self.get_packet_data(id, non_block = false)
463
- queue = nil
464
- @@instance.packet_data_queue_mutex.synchronize do
465
- queue, _, _ = @@instance.packet_data_queues[id]
466
- end
467
- if queue
468
- return queue.pop(non_block)
469
- else
470
- raise "Packet data queue with id #{id} not found"
471
- end
472
- end
473
-
474
- # Calls clear_counters on the System, interfaces, routers, and sets the
475
- # request_count on json_drb to 0.
476
- def self.clear_counters
477
- System.clear_counters
478
- self.instance.interfaces.clear_counters
479
- self.instance.routers.clear_counters
480
- self.instance.json_drb.request_count = 0
481
- end
482
-
483
- protected
484
-
485
- # Method called by all interfaces when a packet has been identified. It
486
- # checks the limits of the packet and then posts the packet to any
487
- # registered subscribers.
488
- #
489
- # @param packet [Packet] Packet which has been identified by the interface
490
- def identified_packet_callback(packet)
491
- packet.check_limits(System.limits_set)
492
- post_packet(packet)
493
- end
494
-
495
- end # class CmdTlmServer
496
-
497
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos/io/json_drb'
12
+ require 'cosmos/tools/cmd_tlm_server/api'
13
+ require 'cosmos/tools/cmd_tlm_server/cmd_tlm_server_config'
14
+ require 'cosmos/tools/cmd_tlm_server/background_tasks'
15
+ require 'cosmos/tools/cmd_tlm_server/commanding'
16
+ require 'cosmos/tools/cmd_tlm_server/interfaces'
17
+ require 'cosmos/tools/cmd_tlm_server/packet_logging'
18
+ require 'cosmos/tools/cmd_tlm_server/routers'
19
+
20
+ module Cosmos
21
+
22
+ # Provides the interface for all applications to get the latest telemetry and
23
+ # to send commands.
24
+ class CmdTlmServer
25
+ include Api
26
+
27
+ # instance_attr_reader attributes are used by other classes and are thus
28
+ # made available directly on the CmdTlmServer class
29
+
30
+ # @return [BackgroundTasks] Access to the background tasks
31
+ instance_attr_reader :background_tasks
32
+ # @return [Commanding] Allows for sending commands to targets and
33
+ # interfaces
34
+ instance_attr_reader :commanding
35
+ # @return [Interfaces] Access to the interfaces
36
+ instance_attr_reader :interfaces
37
+ # @return [PacketLogging] Access to the packet loggers
38
+ instance_attr_reader :packet_logging
39
+ # @return [Routers] Access to the routers
40
+ instance_attr_reader :routers
41
+ # @return [MessageLog] Message log for the CmdTlmServer
42
+ instance_attr_reader :message_log
43
+ # @return [JsonDRb] Provides access to the server for all tools both
44
+ # internal and external
45
+ instance_attr_accessor :json_drb
46
+ # @return [String] CmdTlmServer title as set in the config file
47
+ instance_attr_accessor :title
48
+
49
+ # attr_reader attributes are only used by CmdTlmServer internally and are
50
+ # thus only available as attributes on the singleton
51
+
52
+ # @return [Mutex] Synchronization object around limits events
53
+ attr_reader :limits_event_queue_mutex
54
+ # @return [Hash<Integer, Array<Queue, Integer>>] The limits event queues
55
+ # hashed by id. Returns an array containing the queue followed by the
56
+ # queue size.
57
+ attr_reader :limits_event_queues
58
+ # @return [Integer] The next limits event queue id when
59
+ # subscribe_limits_event is called. This ID must be used in the
60
+ # limits_event_queues hash to access the queue.
61
+ attr_accessor :next_limits_event_queue_id
62
+ # @return [Mutex] Synchronization object around packet data events
63
+ attr_reader :packet_data_queue_mutex
64
+ # @return [Hash<Integer, Array<Queue, Integer>>] The packet data queues
65
+ # hashed by id. Returns an array containing the queue followed by the
66
+ # queue size.
67
+ attr_reader :packet_data_queues
68
+ # @return [Integer] The next packet data queue id when
69
+ # subscribe_packet_data is called. This ID must be used in the
70
+ # packet_data_queues hash to access the queue.
71
+ attr_accessor :next_packet_data_queue_id
72
+
73
+ # The default host
74
+ DEFAULT_HOST = 'localhost'
75
+ # The default configuration file name
76
+ DEFAULT_CONFIG_FILE = 'cmd_tlm_server.txt'
77
+ # The maximum number of limits events that are queued. Used when
78
+ # subscribing to limits events.
79
+ DEFAULT_LIMITS_EVENT_QUEUE_SIZE = 1000
80
+ # The maximum number of packets that are queued. Used when subscribing to
81
+ # packet data.
82
+ DEFAULT_PACKET_DATA_QUEUE_SIZE = 1000
83
+
84
+ @@instance = nil
85
+ @@meta_callback = nil
86
+
87
+ # Get the instance of the CmdTlmServer
88
+ def self.instance
89
+ @@instance
90
+ end
91
+
92
+ # Set the meta callback
93
+ def self.meta_callback= (meta_callback)
94
+ @@meta_callback = meta_callback
95
+ end
96
+
97
+ # Constructor for a CmdTlmServer
98
+ #
99
+ # @param config_file [String] The name of the server configuration file
100
+ # which must be in the config/tools/cmd_tlm_server directory.
101
+ # @param production [Boolean] Whether the server should be placed in
102
+ # 'production' mode which does various things to protect the server
103
+ # including disabling the ability to stop logging.
104
+ # @param disconnect [Boolean] Whether to start the server in a disconnected
105
+ # stand-alone mode which does not actually use the interfaces to send and
106
+ # receive data. This is useful for testing scripts when actual hardware
107
+ # is not available.
108
+ def initialize(config_file = DEFAULT_CONFIG_FILE,
109
+ production = false,
110
+ disconnect = false,
111
+ create_message_log = true)
112
+ @@instance = self
113
+ @packet_logging = nil # Removes warnings
114
+ @message_log = MessageLog.new('server') if create_message_log
115
+
116
+ super() # For Api
117
+
118
+ Logger.info "COSMOS Version: #{COSMOS_VERSION}"
119
+
120
+ @disconnect = disconnect
121
+
122
+ @limits_event_queue_mutex = Mutex.new
123
+ @limits_event_queues = {}
124
+ @next_limits_event_queue_id = 1
125
+
126
+ @packet_data_queue_mutex = Mutex.new
127
+ @packet_data_queues = {}
128
+ @next_packet_data_queue_id = 1
129
+
130
+ # Process cmd_tlm_server.txt
131
+ @config = CmdTlmServerConfig.new(File.join('config', 'tools', 'cmd_tlm_server', config_file))
132
+ @background_tasks = BackgroundTasks.new(@config)
133
+ @commanding = Commanding.new(@config)
134
+ @interfaces = Interfaces.new(@config, method(:identified_packet_callback))
135
+ @packet_logging = PacketLogging.new(@config)
136
+ @routers = Routers.new(@config)
137
+ @title = @config.title
138
+ @stop_callback = nil
139
+
140
+ # Set Threads to kill CTS if they throw an exception
141
+ Thread.abort_on_exception = true
142
+
143
+ # Don't start the DRb service or the telemetry monitoring thread
144
+ # if we started the server in disconnect mode
145
+ @json_drb = nil
146
+ start(production) unless @disconnect
147
+ end # end def initialize
148
+
149
+ # Start up the system by starting the JSON-RPC server, interfaces, routers,
150
+ # and background tasks. Starts a thread to monitor all packets for
151
+ # staleness so other tools (such as Packet Viewer or Telemetry Viewer) can
152
+ # react accordingly.
153
+ #
154
+ # @param production (see #initialize)
155
+ def start(production = false)
156
+ System.telemetry # Make sure definitions are loaded by starting anything
157
+ return unless @json_drb.nil?
158
+
159
+ @@meta_callback.call(@config.meta_target_name, @config.meta_packet_name) if @@meta_callback if @config.meta_target_name and @config.meta_packet_name
160
+
161
+ # Start DRb with access control
162
+ @json_drb = JsonDRb.new
163
+ @json_drb.acl = System.acl if System.acl
164
+
165
+ # In production we start logging and don't allow the user to stop it
166
+ # We also disallow setting telemetry and disconnecting from interfaces
167
+ if production
168
+ @packet_logging.start
169
+ @api_whitelist.delete('stop_logging')
170
+ @api_whitelist.delete('stop_cmd_log')
171
+ @api_whitelist.delete('stop_tlm_log')
172
+ @interfaces.all.each do |name, interface|
173
+ interface.disable_disconnect = true
174
+ end
175
+ @routers.all.each do |name, interface|
176
+ interface.disable_disconnect = true
177
+ end
178
+ end
179
+ @json_drb.method_whitelist = @api_whitelist
180
+ begin
181
+ @json_drb.start_service("localhost", System.ports['CTS_API'], self)
182
+ rescue Exception
183
+ # Call packet_logging shutdown here to explicitly kill the logging
184
+ # threads since this CTS is not going to launch
185
+ @packet_logging.shutdown
186
+ raise FatalError.new("Error starting JsonDRb on port #{System.ports['CTS_API']}.\nPerhaps a Command and Telemetry Server is already running?")
187
+ end
188
+
189
+ @routers.add_preidentified('PREIDENTIFIED_ROUTER', System.instance.ports['CTS_PREIDENTIFIED'])
190
+ System.telemetry.limits_change_callback = method(:limits_change_callback)
191
+ @interfaces.start
192
+ @routers.start
193
+ @background_tasks.start
194
+
195
+ # Start staleness monitor thread
196
+ @sleeper = Sleeper.new
197
+ @staleness_monitor_thread = Thread.new do
198
+ begin
199
+ while true
200
+ System.telemetry.check_stale
201
+ broken = @sleeper.sleep(10)
202
+ break if broken
203
+ end
204
+ rescue Exception => err
205
+ Logger.fatal "Staleness Monitor thread unexpectedly died"
206
+ Cosmos.handle_fatal_exception(err)
207
+ end
208
+ end # end Thread.new
209
+ end
210
+
211
+ # Properly shuts down the command and telemetry server by stoping the
212
+ # JSON-RPC server, background tasks, routers, and interfaces. Also kills
213
+ # the packet staleness monitor thread.
214
+ def stop
215
+ # Shutdown DRb
216
+ @json_drb.stop_service
217
+
218
+ # Shutdown staleness monitor thread
219
+ Cosmos.kill_thread(self, @staleness_monitor_thread)
220
+
221
+ @background_tasks.stop
222
+ @routers.stop
223
+ @interfaces.stop
224
+ @packet_logging.shutdown
225
+ @stop_callback.call if @stop_callback
226
+ @message_log.stop if @message_log
227
+
228
+ @json_drb = nil
229
+ end
230
+
231
+ # Set a stop callback
232
+ def stop_callback= (stop_callback)
233
+ @stop_callback = stop_callback
234
+ end
235
+
236
+ # Gracefully kill the staleness monitor thread
237
+ def graceful_kill
238
+ @sleeper.cancel
239
+ end
240
+
241
+ # Called when an item in any packet changes limits states.
242
+ #
243
+ # @param packet [Packet] Packet which has had an item change limits state
244
+ # @param item [PacketItem] The item which has changed limits state
245
+ # @param old_limits_state [Symbol] The previous state of the item. See
246
+ # {PacketItemLimits#state}
247
+ # @param value [Object] The current value of the item
248
+ # @param log_change [Boolean] Whether to log this limits change event
249
+ def limits_change_callback(packet, item, old_limits_state, value, log_change)
250
+ if log_change
251
+ # Write to Server Messages that limits state has changed
252
+ tgt_pkt_item_str = "#{packet.target_name} #{packet.packet_name} #{item.name} = #{value} is"
253
+ case item.limits.state
254
+ when :BLUE
255
+ Logger.info "<B>#{tgt_pkt_item_str} #{item.limits.state}"
256
+ when :GREEN, :GREEN_LOW, :GREEN_HIGH
257
+ Logger.info "<G>#{tgt_pkt_item_str} #{item.limits.state}"
258
+ when :YELLOW, :YELLOW_LOW, :YELLOW_HIGH
259
+ Logger.warn "<Y>#{tgt_pkt_item_str} #{item.limits.state}"
260
+ when :RED, :RED_LOW, :RED_HIGH
261
+ Logger.error "<R>#{tgt_pkt_item_str} #{item.limits.state}"
262
+ else
263
+ Logger.error "#{tgt_pkt_item_str} UNKNOWN"
264
+ end
265
+ end
266
+
267
+ post_limits_event(:LIMITS_CHANGE, [packet.target_name, packet.packet_name, item.name, old_limits_state, item.limits.state])
268
+
269
+ if item.limits.response
270
+ begin
271
+ item.limits.response.call(packet, item, old_limits_state)
272
+ rescue Exception => err
273
+ Logger.error "#{packet.target_name} #{packet.packet_name} #{item.name} Limits Response Exception!"
274
+ Logger.error "Called with old_state = #{old_limits_state}, new_state = #{item.limits.state}"
275
+ Logger.error err.formatted
276
+ end
277
+ end
278
+ end
279
+
280
+ # Post a limits event to all subscribed limits event listeners.
281
+ #
282
+ # @param event_type [Symbol] The type of limits event that occurred. Must
283
+ # be one of :LIMITS_SET which means the system limits set has changed,
284
+ # :LIMITS_CHANGE which means an individual item has changed limits state, or
285
+ # :LIMITS_SETTINGS which means an individual item has new settings
286
+ # @param event_data [Symbol|Array<String,String,String,Symbol,Symbol>]
287
+ # Returns the current limits set name for event_type == :LIMITS_SET.
288
+ # Returns an array containing the target name, packet name, item name,
289
+ # old limits state, and current limits state for event_type ==
290
+ # :LIMITS_CHANGE.
291
+ def post_limits_event(event_type, event_data)
292
+ if @limits_event_queues.length > 0
293
+ queues_to_drop = []
294
+
295
+ @limits_event_queue_mutex.synchronize do
296
+ # Post event to active queues
297
+ @limits_event_queues.each do |id, data|
298
+ queue = data[0]
299
+ queue_size = data[1]
300
+ queue << [event_type, event_data]
301
+ if queue.length > queue_size
302
+ # Drop queue
303
+ queues_to_drop << id
304
+ end
305
+ end
306
+
307
+ # Drop queues which are not being serviced
308
+ queues_to_drop.each do |id|
309
+ # Remove the queue to stop servicing it. Nil is added to unblock any client threads
310
+ # that might otherwise be left blocking forever for something on the queue
311
+ queue, queue_size = @limits_event_queues.delete(id)
312
+ queue << nil if queue
313
+ end
314
+ end
315
+ end
316
+ end
317
+
318
+ # Create a queue on the CmdTlmServer that gets populated with every limits
319
+ # event in the system. A limits event occurs when a telemetry item with
320
+ # limits changes state. Thus limits events occur on negative transitions
321
+ # (:GREEN to :YELLOW_LOW) and positive transitions (:YELLOW_HIGH to
322
+ # :GREEN).
323
+ #
324
+ # @param queue_size [Integer] The number of limit events to accumulate
325
+ # before the queue will be dropped due to inactivity.
326
+ # @return [Integer] The queue ID returned from the CmdTlmServer. Use this
327
+ # ID when calling {#get_limits_event} and {#unsubscribe_limits_events}.
328
+ def self.subscribe_limits_events(queue_size = DEFAULT_LIMITS_EVENT_QUEUE_SIZE)
329
+ id = nil
330
+ @@instance.limits_event_queue_mutex.synchronize do
331
+ id = @@instance.next_limits_event_queue_id
332
+ @@instance.limits_event_queues[id] = [Queue.new, queue_size]
333
+ @@instance.next_limits_event_queue_id += 1
334
+ end
335
+ return id
336
+ end
337
+
338
+ # Unsubscribe from being notified for every limits event in the system.
339
+ # This deletes the queue and further calls to {#get_limits_event} will
340
+ # raise an exception.
341
+ #
342
+ # @param id [Integer] The queue ID received from calling
343
+ # {#subscribe_limits_events}
344
+ def self.unsubscribe_limits_events(id)
345
+ queue = nil
346
+ @@instance.limits_event_queue_mutex.synchronize do
347
+ # Remove the queue to stop servicing it. Nil is added to unblock any client threads
348
+ # that might otherwise be left blocking forever for something on the queue
349
+ queue, queue_size = @@instance.limits_event_queues.delete(id)
350
+ queue << nil if queue
351
+ end
352
+ end
353
+
354
+ # Get a limits event from the queue created by {#subscribe_limits_events}.
355
+ #
356
+ # Each limits event consists of an Array with two elements:
357
+ # \[:LIMITS_CHANGE, [target, packet, item, old state, current state]]
358
+ #
359
+ # @param id [Integer] The queue ID received from calling
360
+ # {#subscribe_limits_events}
361
+ # @param non_block [Boolean] Whether to wait on the queue for the next
362
+ # limits event before returning. Default is to block waiting for the next
363
+ # event. NOTE: If you pass true and there is no data on the queue, a
364
+ # ThreadError exception is raised.
365
+ def self.get_limits_event(id, non_block = false)
366
+ queue = nil
367
+ @@instance.limits_event_queue_mutex.synchronize do
368
+ queue, _ = @@instance.limits_event_queues[id]
369
+ end
370
+ if queue
371
+ return queue.pop(non_block)
372
+ else
373
+ raise "Limits event queue with id #{id} not found"
374
+ end
375
+ end
376
+
377
+ # Post packet data to all subscribed packet data listeners.
378
+ #
379
+ # @param packet [Packet]
380
+ def post_packet(packet)
381
+ if @packet_data_queues.length > 0
382
+ queues_to_drop = []
383
+
384
+ @packet_data_queue_mutex.synchronize do
385
+ # Post event to active queues
386
+ @packet_data_queues.each do |id, data|
387
+ queue = data[0]
388
+ packets = data[1]
389
+ queue_size = data[2]
390
+
391
+ packets.each do |target_name, packet_name|
392
+ if packet.target_name == target_name and packet.packet_name == packet_name
393
+ received_time = packet.received_time
394
+ received_time ||= Time.now
395
+ queue << [packet.buffer, target_name, packet_name,
396
+ received_time.tv_sec, received_time.tv_usec, packet.received_count]
397
+ if queue.length > queue_size
398
+ # Drop queue
399
+ queues_to_drop << id
400
+ end
401
+ break
402
+ end
403
+ end
404
+ end
405
+
406
+ # Drop queues which are not being serviced
407
+ queues_to_drop.each do |id|
408
+ # Remove the queue to stop servicing it. Nil is added to unblock any client threads
409
+ # that might otherwise be left blocking forever for something on the queue
410
+ queue, packets, queue_size = @packet_data_queues.delete(id)
411
+ queue << nil if queue
412
+ end
413
+ end
414
+ end
415
+ end
416
+
417
+ # Subscribe to one or more telemetry packets.
418
+ #
419
+ # @param packets [Array<Array<String,String>>] List of packets where the
420
+ # Strings are target name, packet name.
421
+ # @param queue_size [Integer] The size of the queue to store packet data
422
+ # @return [Integer] The queue ID returned from CmdTlmServer. Use this ID
423
+ # when calling {#get_packet_data} and {#unsubscribe_packet_data}.
424
+ def self.subscribe_packet_data(packets,
425
+ queue_size = CmdTlmServer::DEFAULT_PACKET_DATA_QUEUE_SIZE)
426
+ if !packets.is_a?(Array) || !packets[0].is_a?(Array)
427
+ raise ArgumentError, "packets must be nested array: [['TGT','PKT'],...]"
428
+ end
429
+
430
+ id = nil
431
+ upcase_packets = []
432
+
433
+ # Upper case packet names
434
+ packets.length.times do |index|
435
+ upcase_packets << []
436
+ upcase_packets[index][0] = packets[index][0].upcase
437
+ upcase_packets[index][1] = packets[index][1].upcase
438
+ # Get the packet to ensure it exists
439
+ @@instance.get_tlm_packet(upcase_packets[index][0], upcase_packets[index][1])
440
+ end
441
+
442
+ @@instance.packet_data_queue_mutex.synchronize do
443
+ id = @@instance.next_packet_data_queue_id
444
+ @@instance.packet_data_queues[id] =
445
+ [Queue.new, upcase_packets, queue_size]
446
+ @@instance.next_packet_data_queue_id += 1
447
+ end
448
+ return id
449
+ end
450
+
451
+ # Unsubscribe to telemetry packets.
452
+ #
453
+ # @param id [Integer] The queue ID received from calling
454
+ # {#subscribe_packet_data}.
455
+ def self.unsubscribe_packet_data(id)
456
+ @@instance.packet_data_queue_mutex.synchronize do
457
+ # Remove the queue to stop servicing it. Nil is added to unblock any client threads
458
+ # that might otherwise be left blocking forever for something on the queue
459
+ queue, packets, queue_size = @@instance.packet_data_queues.delete(id)
460
+ queue << nil if queue
461
+ end
462
+ return nil
463
+ end
464
+
465
+ # Get packet data from the queue created by {#subscribe_packet_data}.
466
+ #
467
+ # Each packet data consists of an Array with five elements:
468
+ # \[buffer, target name, packet name, received time sec, received time us]
469
+ #
470
+ # @param id [Integer] The queue ID received from calling
471
+ # {#subscribe_packet_data}
472
+ # @param non_block [Boolean] Whether to wait on the queue for the next
473
+ # packet before returning. Default is to block waiting for the next
474
+ # packet. NOTE: If you pass true and there is no packet on the queue, a
475
+ # ThreadError exception is raised.
476
+ def self.get_packet_data(id, non_block = false)
477
+ queue = nil
478
+ @@instance.packet_data_queue_mutex.synchronize do
479
+ queue, _, _ = @@instance.packet_data_queues[id]
480
+ end
481
+ if queue
482
+ return queue.pop(non_block)
483
+ else
484
+ raise "Packet data queue with id #{id} not found"
485
+ end
486
+ end
487
+
488
+ # Calls clear_counters on the System, interfaces, routers, and sets the
489
+ # request_count on json_drb to 0.
490
+ def self.clear_counters
491
+ System.clear_counters
492
+ self.instance.interfaces.clear_counters
493
+ self.instance.routers.clear_counters
494
+ self.instance.json_drb.request_count = 0
495
+ end
496
+
497
+ protected
498
+
499
+ # Method called by all interfaces when a packet has been identified. It
500
+ # checks the limits of the packet and then posts the packet to any
501
+ # registered subscribers.
502
+ #
503
+ # @param packet [Packet] Packet which has been identified by the interface
504
+ def identified_packet_callback(packet)
505
+ packet.check_limits(System.limits_set)
506
+ post_packet(packet)
507
+ end
508
+
509
+ end # class CmdTlmServer
510
+
511
+ end # module Cosmos