cosmos 3.5.1 → 3.5.2

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 (1158) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -1
  3. data/.gitattributes +3 -3
  4. data/.gitignore +48 -48
  5. data/.travis.yml +8 -8
  6. data/CONTRIBUTING.txt +50 -50
  7. data/Gemfile +10 -10
  8. data/Guardfile +27 -27
  9. data/LICENSE.txt +879 -879
  10. data/Manifest.txt +1414 -1414
  11. data/README.md +111 -111
  12. data/Rakefile +218 -214
  13. data/autohotkey/config/data/diamond.STL +57 -57
  14. data/autohotkey/config/system/system.txt +34 -34
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  17. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  18. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  20. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +270 -270
  21. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  22. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  23. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -305
  24. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  25. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  26. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  27. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  28. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  29. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  30. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  31. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  32. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  33. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  34. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  37. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  38. data/autohotkey/config/targets/INST/target.txt +26 -26
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  40. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  41. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  42. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  43. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  44. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  45. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  46. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  47. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  48. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  49. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  50. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  51. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  52. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  55. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  57. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  58. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  59. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  60. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  61. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  62. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  63. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  64. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  65. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  66. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  67. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  69. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  70. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  71. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  72. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  75. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  76. data/autohotkey/lib/example_background_task.rb +42 -42
  77. data/autohotkey/lib/user_version.rb +3 -3
  78. data/autohotkey/procedures/clear_util.rb +7 -7
  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 +24 -24
  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/ReplayAHK +17 -17
  101. data/autohotkey/tools/ScriptRunner +14 -14
  102. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  103. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  104. data/autohotkey/tools/TableManager +14 -14
  105. data/autohotkey/tools/TableManagerAHK +30 -30
  106. data/autohotkey/tools/TestRunner +15 -15
  107. data/autohotkey/tools/TestRunnerAHK +17 -17
  108. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  109. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK5 +17 -17
  112. data/autohotkey/tools/TestRunnerAHK6 +17 -17
  113. data/autohotkey/tools/TlmExtractor +15 -15
  114. data/autohotkey/tools/TlmExtractorAHK +19 -19
  115. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  116. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  117. data/autohotkey/tools/TlmGrapher +14 -14
  118. data/autohotkey/tools/TlmGrapherAHK +19 -19
  119. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  120. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  121. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  122. data/autohotkey/tools/TlmViewer +14 -14
  123. data/autohotkey/tools/TlmViewerAHK +28 -28
  124. data/autohotkey/tools/TlmViewerAHK2 +22 -22
  125. data/autohotkey/tools/TlmViewerAHK3 +23 -23
  126. data/autohotkey/tools/TlmViewerAHK4 +22 -22
  127. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  128. data/autohotkey/tools/autohotkey.rb +37 -37
  129. data/autohotkey/tools/cmd_extractor.ahk +33 -33
  130. data/autohotkey/tools/cmd_sender.ahk +182 -182
  131. data/autohotkey/tools/cmd_tlm_server.ahk +90 -90
  132. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  133. data/autohotkey/tools/data_viewer.ahk +141 -141
  134. data/autohotkey/tools/handbook_creator.ahk +32 -32
  135. data/autohotkey/tools/launcher.ahk +41 -41
  136. data/autohotkey/tools/limits_monitor.ahk +123 -123
  137. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  138. data/autohotkey/tools/packet_viewer.ahk +196 -196
  139. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  140. data/autohotkey/tools/replay.ahk +104 -104
  141. data/autohotkey/tools/script_runner.ahk +589 -589
  142. data/autohotkey/tools/script_runner2.ahk +38 -38
  143. data/autohotkey/tools/table_manager.ahk +220 -220
  144. data/autohotkey/tools/test_runner.ahk +262 -262
  145. data/autohotkey/tools/test_runner2.ahk +53 -53
  146. data/autohotkey/tools/test_runner3.ahk +13 -13
  147. data/autohotkey/tools/test_runner5.ahk +8 -8
  148. data/autohotkey/tools/test_runner6.ahk +5 -5
  149. data/autohotkey/tools/tlm_extractor.ahk +296 -296
  150. data/autohotkey/tools/tlm_grapher.ahk +660 -660
  151. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  152. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  153. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  154. data/autohotkey/tools/tlm_viewer2.ahk +50 -50
  155. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  156. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  157. data/bin/cosmos +96 -96
  158. data/bin/cstol_converter +1166 -1166
  159. data/bin/rubysloc +85 -85
  160. data/cosmos.gemspec +99 -99
  161. data/data/about.txt +4 -4
  162. data/data/crc.txt +326 -326
  163. data/data/diamond.STL +57 -57
  164. data/data/legal.txt +9 -9
  165. data/demo/Gemfile +10 -10
  166. data/demo/Launcher +16 -16
  167. data/demo/Launcher.bat +0 -0
  168. data/demo/Rakefile +77 -77
  169. data/demo/config/data/crc.txt +224 -226
  170. data/demo/config/data/diamond.STL +57 -57
  171. data/demo/config/data/meta_init.txt +4 -4
  172. data/demo/config/system/system.txt +35 -35
  173. data/demo/config/system/system2.txt +33 -33
  174. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  175. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  176. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  177. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  178. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  179. data/demo/config/targets/COSMOS/target.txt +11 -11
  180. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  181. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +5 -5
  182. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  183. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  184. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  185. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  186. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  187. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  188. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  189. data/demo/config/targets/INST/lib/sim_inst.rb +305 -305
  190. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  191. data/demo/config/targets/INST/screens/array.txt +15 -15
  192. data/demo/config/targets/INST/screens/block.txt +8 -8
  193. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  194. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  195. data/demo/config/targets/INST/screens/ground.txt +25 -25
  196. data/demo/config/targets/INST/screens/hs.txt +44 -44
  197. data/demo/config/targets/INST/screens/latest.txt +23 -23
  198. data/demo/config/targets/INST/screens/other.txt +29 -29
  199. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  200. data/demo/config/targets/INST/target.txt +33 -33
  201. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  202. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  203. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  204. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  205. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  206. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -13
  207. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  208. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  209. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +56 -56
  210. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  211. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +39 -39
  212. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +34 -34
  213. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  214. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  215. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +88 -88
  216. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  217. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  218. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  219. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  220. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  221. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  222. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  223. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  224. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  225. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +82 -82
  226. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  227. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  228. data/demo/config/tools/launcher/launcher.txt +45 -45
  229. data/demo/config/tools/launcher/launcher2.txt +45 -45
  230. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  231. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  232. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  233. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  234. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  235. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  236. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  237. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  238. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  239. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  240. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  241. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  242. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  243. data/demo/lib/example_background_task.rb +57 -57
  244. data/demo/lib/example_target.rb +113 -113
  245. data/demo/lib/scpi_target.rb +74 -74
  246. data/demo/lib/user_version.rb +3 -3
  247. data/demo/procedures/checks.rb +11 -11
  248. data/demo/procedures/clear_util.rb +7 -7
  249. data/demo/procedures/collect.rb +18 -18
  250. data/demo/procedures/collect_util.rb +14 -14
  251. data/demo/procedures/cosmos_api_test.rb +293 -293
  252. data/demo/procedures/disconnect.rb +29 -29
  253. data/demo/procedures/example_test.rb +183 -183
  254. data/demo/procedures/plot_test.rb +8 -8
  255. data/demo/procedures/run_example_test.rb +3 -3
  256. data/demo/procedures/test.rb +51 -51
  257. data/demo/tools/CmdExtractor +16 -16
  258. data/demo/tools/CmdExtractor.bat +0 -0
  259. data/demo/tools/CmdSender +16 -16
  260. data/demo/tools/CmdSender.bat +0 -0
  261. data/demo/tools/CmdTlmServer +16 -16
  262. data/demo/tools/CmdTlmServer.bat +0 -0
  263. data/demo/tools/DataViewer +16 -16
  264. data/demo/tools/DataViewer.bat +0 -0
  265. data/demo/tools/ExampleTarget +16 -16
  266. data/demo/tools/ExampleTarget.bat +0 -0
  267. data/demo/tools/HandbookCreator +16 -16
  268. data/demo/tools/HandbookCreator.bat +0 -0
  269. data/demo/tools/Launcher +16 -16
  270. data/demo/tools/Launcher.bat +0 -0
  271. data/demo/tools/LimitsMonitor +16 -16
  272. data/demo/tools/LimitsMonitor.bat +0 -0
  273. data/demo/tools/OpenGLBuilder +16 -16
  274. data/demo/tools/OpenGLBuilder.bat +0 -0
  275. data/demo/tools/PacketViewer +16 -16
  276. data/demo/tools/PacketViewer.bat +0 -0
  277. data/demo/tools/Replay +16 -16
  278. data/demo/tools/Replay.bat +0 -0
  279. data/demo/tools/ScpiTarget +16 -16
  280. data/demo/tools/ScpiTarget.bat +0 -0
  281. data/demo/tools/ScriptRunner +16 -16
  282. data/demo/tools/ScriptRunner.bat +0 -0
  283. data/demo/tools/TableManager +16 -16
  284. data/demo/tools/TableManager.bat +0 -0
  285. data/demo/tools/TestRunner +16 -16
  286. data/demo/tools/TestRunner.bat +0 -0
  287. data/demo/tools/TlmExtractor +16 -16
  288. data/demo/tools/TlmExtractor.bat +0 -0
  289. data/demo/tools/TlmGrapher +16 -16
  290. data/demo/tools/TlmGrapher.bat +0 -0
  291. data/demo/tools/TlmViewer +16 -16
  292. data/demo/tools/TlmViewer.bat +0 -0
  293. data/demo/tools/ToolLaunch.bat +14 -5
  294. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  295. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  296. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  297. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  298. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  299. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  300. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  301. data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  302. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  304. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  305. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  306. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  307. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  308. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  309. data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  310. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  311. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  312. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  313. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  314. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  316. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  317. data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  318. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  319. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  320. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  321. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  322. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  323. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  324. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  325. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  326. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  328. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  329. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  330. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  331. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  332. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  333. data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  334. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  335. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  336. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  337. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  338. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  339. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  340. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  341. data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  342. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  343. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  344. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  345. data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  346. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  347. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  348. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  349. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  350. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  351. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  352. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  353. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  354. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  355. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  356. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  357. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  358. data/demo/tools/tool_launch.rb +38 -38
  359. data/ext/cosmos/ext/array/array.c +111 -111
  360. data/ext/cosmos/ext/array/extconf.rb +13 -13
  361. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  362. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  363. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  364. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  365. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  366. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  367. data/ext/cosmos/ext/crc/crc.c +341 -341
  368. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  369. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  370. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  371. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  372. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +265 -265
  373. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  374. data/ext/cosmos/ext/packet/packet.c +339 -339
  375. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  376. data/ext/cosmos/ext/platform/platform.c +101 -101
  377. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  378. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  379. data/ext/cosmos/ext/string/extconf.rb +13 -13
  380. data/ext/cosmos/ext/string/string.c +49 -49
  381. data/ext/cosmos/ext/structure/structure.c +1428 -1428
  382. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  383. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  384. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  385. data/ext/cosmos/ext/telemetry/telemetry.c +307 -307
  386. data/ext/mkrf_conf.rb +40 -40
  387. data/install/Gemfile +10 -10
  388. data/install/Launcher +16 -16
  389. data/install/Launcher.bat +0 -0
  390. data/install/Rakefile +77 -77
  391. data/install/config/data/crc.txt +151 -151
  392. data/install/config/system/system.txt +29 -29
  393. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  394. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  395. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  396. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  397. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  398. data/install/config/targets/COSMOS/target.txt +8 -8
  399. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  400. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  401. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  402. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  403. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  404. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  405. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  406. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  407. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  408. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  409. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  410. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  411. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  412. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  413. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  414. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  415. data/install/config/tools/launcher/launcher.txt +40 -40
  416. data/install/config/tools/script_runner/script_runner.txt +3 -3
  417. data/install/config/tools/test_runner/test_runner.txt +8 -8
  418. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  419. data/install/lib/user_version.rb +3 -3
  420. data/install/tools/CmdExtractor +16 -16
  421. data/install/tools/CmdExtractor.bat +0 -0
  422. data/install/tools/CmdSender +16 -16
  423. data/install/tools/CmdSender.bat +0 -0
  424. data/install/tools/CmdTlmServer +16 -16
  425. data/install/tools/CmdTlmServer.bat +0 -0
  426. data/install/tools/DataViewer +16 -16
  427. data/install/tools/DataViewer.bat +0 -0
  428. data/install/tools/HandbookCreator +16 -16
  429. data/install/tools/HandbookCreator.bat +0 -0
  430. data/install/tools/Launcher +16 -16
  431. data/install/tools/Launcher.bat +0 -0
  432. data/install/tools/LimitsMonitor +16 -16
  433. data/install/tools/LimitsMonitor.bat +0 -0
  434. data/install/tools/OpenGLBuilder +16 -16
  435. data/install/tools/OpenGLBuilder.bat +0 -0
  436. data/install/tools/PacketViewer +16 -16
  437. data/install/tools/PacketViewer.bat +0 -0
  438. data/install/tools/Replay +16 -16
  439. data/install/tools/Replay.bat +0 -0
  440. data/install/tools/ScriptRunner +16 -16
  441. data/install/tools/ScriptRunner.bat +0 -0
  442. data/install/tools/TableManager +16 -16
  443. data/install/tools/TableManager.bat +0 -0
  444. data/install/tools/TestRunner +16 -16
  445. data/install/tools/TestRunner.bat +0 -0
  446. data/install/tools/TlmExtractor +16 -16
  447. data/install/tools/TlmExtractor.bat +0 -0
  448. data/install/tools/TlmGrapher +16 -16
  449. data/install/tools/TlmGrapher.bat +0 -0
  450. data/install/tools/TlmViewer +16 -16
  451. data/install/tools/TlmViewer.bat +0 -0
  452. data/install/tools/ToolLaunch.bat +14 -5
  453. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  454. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  455. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  456. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  457. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  458. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  459. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  460. data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  461. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  463. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  464. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  465. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  466. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  467. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  468. data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  469. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  470. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  471. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  472. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  473. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  475. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  476. data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  477. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  478. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  479. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  480. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  481. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  482. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  483. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  484. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  485. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  486. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  487. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  488. data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  489. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  490. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  491. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  492. data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  493. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  494. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  495. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  496. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  497. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  498. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  499. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  500. data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  501. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  502. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  503. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  504. data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  505. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  506. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  507. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  508. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  509. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  510. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  511. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  512. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  513. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  514. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  515. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  516. data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  517. data/install/tools/tool_launch.rb +38 -38
  518. data/lib/cosmos.rb +63 -63
  519. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  520. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  521. data/lib/cosmos/config/config_parser.rb +324 -324
  522. data/lib/cosmos/conversions.rb +13 -13
  523. data/lib/cosmos/conversions/conversion.rb +47 -47
  524. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  525. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  526. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  527. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  528. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  529. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  530. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  531. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  532. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  533. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  534. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  535. data/lib/cosmos/core_ext.rb +18 -18
  536. data/lib/cosmos/core_ext/array.rb +354 -354
  537. data/lib/cosmos/core_ext/class.rb +51 -51
  538. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  539. data/lib/cosmos/core_ext/exception.rb +52 -52
  540. data/lib/cosmos/core_ext/file.rb +75 -75
  541. data/lib/cosmos/core_ext/hash.rb +28 -28
  542. data/lib/cosmos/core_ext/io.rb +75 -75
  543. data/lib/cosmos/core_ext/kernel.rb +38 -38
  544. data/lib/cosmos/core_ext/math.rb +119 -119
  545. data/lib/cosmos/core_ext/matrix.rb +146 -146
  546. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  547. data/lib/cosmos/core_ext/range.rb +22 -22
  548. data/lib/cosmos/core_ext/socket.rb +32 -32
  549. data/lib/cosmos/core_ext/string.rb +311 -311
  550. data/lib/cosmos/core_ext/stringio.rb +24 -24
  551. data/lib/cosmos/core_ext/time.rb +448 -448
  552. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  553. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  554. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  555. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  556. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  557. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +326 -326
  558. data/lib/cosmos/gui/dialogs/about_dialog.rb +137 -137
  559. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  560. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  561. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  562. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  563. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  564. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  565. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +260 -260
  566. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -169
  567. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  568. data/lib/cosmos/gui/dialogs/progress_dialog.rb +276 -276
  569. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -165
  570. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  571. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  572. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  573. data/lib/cosmos/gui/dialogs/splash.rb +135 -135
  574. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  575. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  576. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  577. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  578. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +473 -473
  579. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  580. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +451 -451
  581. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  582. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  583. data/lib/cosmos/gui/line_graph/overview_graph.rb +469 -469
  584. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  585. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  586. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  587. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  588. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  589. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  590. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -724
  591. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  592. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  593. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  594. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  595. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  596. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  597. data/lib/cosmos/gui/qt.rb +860 -860
  598. data/lib/cosmos/gui/qt_tool.rb +380 -380
  599. data/lib/cosmos/gui/text/completion.rb +381 -381
  600. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  601. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  602. data/lib/cosmos/gui/text/ruby_editor.rb +415 -415
  603. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  604. data/lib/cosmos/gui/utilities/script_module_gui.rb +330 -330
  605. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  606. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  607. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  608. data/lib/cosmos/interfaces.rb +11 -11
  609. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -153
  610. data/lib/cosmos/interfaces/interface.rb +225 -225
  611. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  612. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  613. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -129
  614. data/lib/cosmos/interfaces/stream_interface.rb +136 -136
  615. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  616. data/lib/cosmos/interfaces/tcpip_server_interface.rb +164 -164
  617. data/lib/cosmos/interfaces/udp_interface.rb +161 -161
  618. data/lib/cosmos/io/buffered_file.rb +11 -11
  619. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  620. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  621. data/lib/cosmos/io/json_drb.rb +376 -376
  622. data/lib/cosmos/io/json_drb_object.rb +198 -198
  623. data/lib/cosmos/io/json_rpc.rb +365 -365
  624. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  625. data/lib/cosmos/io/raw_logger.rb +174 -174
  626. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  627. data/lib/cosmos/io/serial_driver.rb +85 -85
  628. data/lib/cosmos/io/stderr.rb +36 -36
  629. data/lib/cosmos/io/stdout.rb +36 -36
  630. data/lib/cosmos/io/tcpip_server.rb +571 -571
  631. data/lib/cosmos/io/udp_sockets.rb +152 -152
  632. data/lib/cosmos/io/win32_serial_driver.rb +145 -145
  633. data/lib/cosmos/packet_logs.rb +7 -7
  634. data/lib/cosmos/packet_logs/ccsds_log_reader.rb +104 -104
  635. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  636. data/lib/cosmos/packet_logs/packet_log_reader.rb +450 -450
  637. data/lib/cosmos/packet_logs/packet_log_writer.rb +323 -323
  638. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  639. data/lib/cosmos/packets/binary_accessor.rb +634 -634
  640. data/lib/cosmos/packets/commands.rb +293 -293
  641. data/lib/cosmos/packets/limits.rb +267 -267
  642. data/lib/cosmos/packets/limits_response.rb +38 -38
  643. data/lib/cosmos/packets/packet.rb +786 -786
  644. data/lib/cosmos/packets/packet_config.rb +482 -482
  645. data/lib/cosmos/packets/packet_item.rb +317 -317
  646. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  647. data/lib/cosmos/packets/parsers/format_string_parser.rb +58 -58
  648. data/lib/cosmos/packets/parsers/limits_parser.rb +146 -146
  649. data/lib/cosmos/packets/parsers/limits_response_parser.rb +52 -52
  650. data/lib/cosmos/packets/parsers/macro_parser.rb +116 -116
  651. data/lib/cosmos/packets/parsers/packet_item_parser.rb +215 -215
  652. data/lib/cosmos/packets/parsers/packet_parser.rb +123 -123
  653. data/lib/cosmos/packets/parsers/processor_parser.rb +63 -63
  654. data/lib/cosmos/packets/parsers/state_parser.rb +116 -116
  655. data/lib/cosmos/packets/structure.rb +458 -458
  656. data/lib/cosmos/packets/structure_item.rb +233 -233
  657. data/lib/cosmos/packets/telemetry.rb +350 -350
  658. data/lib/cosmos/processors.rb +6 -6
  659. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  660. data/lib/cosmos/processors/processor.rb +71 -71
  661. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  662. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  663. data/lib/cosmos/script.rb +9 -9
  664. data/lib/cosmos/script/cmd_tlm_server.rb +110 -110
  665. data/lib/cosmos/script/commands.rb +184 -184
  666. data/lib/cosmos/script/extract.rb +123 -123
  667. data/lib/cosmos/script/limits.rb +114 -114
  668. data/lib/cosmos/script/script.rb +76 -76
  669. data/lib/cosmos/script/scripting.rb +897 -897
  670. data/lib/cosmos/script/telemetry.rb +174 -174
  671. data/lib/cosmos/script/tools.rb +138 -138
  672. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  673. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  674. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  675. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  676. data/lib/cosmos/streams/serial_stream.rb +157 -157
  677. data/lib/cosmos/streams/stream.rb +63 -63
  678. data/lib/cosmos/streams/stream_protocol.rb +373 -373
  679. data/lib/cosmos/streams/tcpip_client_stream.rb +113 -113
  680. data/lib/cosmos/streams/tcpip_socket_stream.rb +143 -143
  681. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  682. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  683. data/lib/cosmos/system.rb +4 -4
  684. data/lib/cosmos/system/system.rb +618 -618
  685. data/lib/cosmos/system/target.rb +197 -197
  686. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +255 -255
  687. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +717 -717
  688. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  689. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  690. data/lib/cosmos/tools/cmd_tlm_server/api.rb +1034 -1034
  691. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  692. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -67
  693. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +515 -515
  694. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +253 -253
  695. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +408 -408
  696. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  697. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +175 -175
  698. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +200 -200
  699. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +176 -176
  700. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +150 -150
  701. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +244 -244
  702. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +90 -90
  703. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +266 -266
  704. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  705. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  706. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  707. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  708. data/lib/cosmos/tools/data_viewer/data_viewer.rb +621 -621
  709. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +134 -134
  710. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  711. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +156 -156
  712. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +382 -382
  713. data/lib/cosmos/tools/launcher/launcher.rb +188 -188
  714. data/lib/cosmos/tools/launcher/launcher_config.rb +256 -256
  715. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -40
  716. data/lib/cosmos/tools/launcher/launcher_tool.rb +116 -116
  717. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +837 -837
  718. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  719. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  720. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +542 -542
  721. data/lib/cosmos/tools/replay/replay.rb +501 -501
  722. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  723. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -147
  724. data/lib/cosmos/tools/script_runner/script_runner.rb +922 -922
  725. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  726. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1798 -1798
  727. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  728. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  729. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  730. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  731. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  732. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  733. data/lib/cosmos/tools/test_runner/test.rb +539 -539
  734. data/lib/cosmos/tools/test_runner/test_runner.rb +1189 -1189
  735. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +341 -341
  736. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  737. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1016 -1016
  738. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  739. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  740. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  741. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  742. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +95 -95
  743. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  744. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +181 -181
  745. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  746. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  747. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +174 -174
  748. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +193 -193
  749. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +407 -407
  750. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  751. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  752. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -323
  753. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  754. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  755. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  756. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  757. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  758. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  759. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  760. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  761. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  762. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  763. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  764. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1291 -1291
  765. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  766. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  767. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +114 -114
  768. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  769. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +78 -78
  770. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  771. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  772. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  773. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -486
  774. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +561 -561
  775. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +290 -290
  776. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  777. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  778. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +66 -66
  779. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +57 -57
  780. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  781. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  782. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  783. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  784. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  785. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  786. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  787. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  788. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  789. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  790. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  791. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  792. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  793. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  794. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  795. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  796. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  797. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  798. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  799. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  800. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  801. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  802. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  803. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  804. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  805. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  806. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  807. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  808. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  809. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  810. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  811. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  812. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  813. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  814. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  815. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  816. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  817. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  818. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  819. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  820. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  821. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  822. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  823. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  824. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  825. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  826. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  827. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  828. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  829. data/lib/cosmos/top_level.rb +759 -759
  830. data/lib/cosmos/utilities.rb +11 -11
  831. data/lib/cosmos/utilities/crc.rb +166 -166
  832. data/lib/cosmos/utilities/csv.rb +83 -83
  833. data/lib/cosmos/utilities/logger.rb +137 -137
  834. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  835. data/lib/cosmos/utilities/message_log.rb +79 -79
  836. data/lib/cosmos/utilities/quaternion.rb +258 -258
  837. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  838. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  839. data/lib/cosmos/utilities/sleeper.rb +44 -44
  840. data/lib/cosmos/version.rb +12 -12
  841. data/lib/cosmos/win32/excel.rb +66 -66
  842. data/lib/cosmos/win32/win32.rb +387 -387
  843. data/lib/cosmos/win32/win32_main.rb +321 -321
  844. data/roodi.yml +24 -24
  845. data/run_gui_tests.bat +0 -0
  846. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  847. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  848. data/spec/config/config_parser_spec.rb +322 -322
  849. data/spec/conversions/conversion_spec.rb +31 -31
  850. data/spec/conversions/generic_conversion_spec.rb +45 -45
  851. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  852. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  853. data/spec/conversions/processor_conversion_spec.rb +45 -45
  854. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  855. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  856. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  857. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  858. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  859. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  860. data/spec/core_ext/array_spec.rb +186 -186
  861. data/spec/core_ext/class_spec.rb +36 -36
  862. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  863. data/spec/core_ext/exception_spec.rb +91 -91
  864. data/spec/core_ext/file_spec.rb +72 -72
  865. data/spec/core_ext/hash_spec.rb +24 -24
  866. data/spec/core_ext/io_spec.rb +46 -46
  867. data/spec/core_ext/kernel_spec.rb +54 -54
  868. data/spec/core_ext/math_spec.rb +116 -116
  869. data/spec/core_ext/matrix_spec.rb +66 -66
  870. data/spec/core_ext/objectspace_spec.rb +29 -29
  871. data/spec/core_ext/range_spec.rb +21 -21
  872. data/spec/core_ext/socket_spec.rb +32 -32
  873. data/spec/core_ext/string_spec.rb +223 -223
  874. data/spec/core_ext/stringio_spec.rb +21 -21
  875. data/spec/core_ext/time_spec.rb +202 -202
  876. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  877. data/spec/gui/qt_spec.rb +102 -102
  878. data/spec/install/config/system/system.txt +33 -33
  879. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  880. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  881. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  882. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  883. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  884. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  885. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  886. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  887. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  888. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  889. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  890. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -305
  891. data/spec/install/config/targets/INST/target.txt +10 -10
  892. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  893. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  894. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  895. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  896. data/spec/interfaces/interface_spec.rb +130 -130
  897. data/spec/interfaces/linc_interface_spec.rb +259 -259
  898. data/spec/interfaces/serial_interface_spec.rb +56 -56
  899. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  900. data/spec/interfaces/stream_interface_spec.rb +157 -157
  901. data/spec/interfaces/tcpip_client_interface_spec.rb +55 -55
  902. data/spec/interfaces/tcpip_server_interface_spec.rb +160 -160
  903. data/spec/interfaces/udp_interface_spec.rb +175 -175
  904. data/spec/io/buffered_file_spec.rb +113 -113
  905. data/spec/io/io_multiplexer_spec.rb +94 -94
  906. data/spec/io/json_drb_object_spec.rb +119 -119
  907. data/spec/io/json_drb_spec.rb +311 -311
  908. data/spec/io/json_rpc_spec.rb +264 -264
  909. data/spec/io/raw_logger_pair_spec.rb +76 -76
  910. data/spec/io/raw_logger_spec.rb +133 -133
  911. data/spec/io/serial_driver_spec.rb +60 -60
  912. data/spec/io/stderr_spec.rb +32 -32
  913. data/spec/io/stdout_spec.rb +32 -32
  914. data/spec/io/tcpip_server_spec.rb +338 -338
  915. data/spec/io/udp_sockets_spec.rb +94 -94
  916. data/spec/io/win32_serial_driver_spec.rb +88 -88
  917. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  918. data/spec/packet_logs/packet_log_reader_spec.rb +468 -468
  919. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  920. data/spec/packet_logs/packet_log_writer_spec.rb +225 -225
  921. data/spec/packets/binary_accessor_spec.rb +2326 -2326
  922. data/spec/packets/commands_spec.rb +369 -369
  923. data/spec/packets/limits_response_spec.rb +25 -25
  924. data/spec/packets/limits_spec.rb +344 -344
  925. data/spec/packets/packet_config_spec.rb +805 -805
  926. data/spec/packets/packet_item_limits_spec.rb +161 -161
  927. data/spec/packets/packet_item_spec.rb +386 -386
  928. data/spec/packets/packet_spec.rb +1317 -1317
  929. data/spec/packets/parsers/format_string_parser_spec.rb +122 -122
  930. data/spec/packets/parsers/limits_parser_spec.rb +282 -282
  931. data/spec/packets/parsers/limits_response_parser_spec.rb +149 -149
  932. data/spec/packets/parsers/macro_parser_spec.rb +212 -212
  933. data/spec/packets/parsers/packet_item_parser_spec.rb +306 -306
  934. data/spec/packets/parsers/packet_parser_spec.rb +99 -99
  935. data/spec/packets/parsers/processor_parser_spec.rb +114 -114
  936. data/spec/packets/parsers/state_parser_spec.rb +156 -156
  937. data/spec/packets/structure_item_spec.rb +195 -195
  938. data/spec/packets/structure_spec.rb +565 -565
  939. data/spec/packets/telemetry_spec.rb +578 -578
  940. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  941. data/spec/processors/processor_spec.rb +55 -55
  942. data/spec/processors/statistics_processor_spec.rb +60 -60
  943. data/spec/processors/watermark_processor_spec.rb +51 -51
  944. data/spec/script/cmd_tlm_server_spec.rb +110 -110
  945. data/spec/script/commands_disconnect_spec.rb +270 -270
  946. data/spec/script/commands_spec.rb +302 -302
  947. data/spec/script/limits_spec.rb +153 -153
  948. data/spec/script/script_spec.rb +86 -86
  949. data/spec/script/scripting_spec.rb +440 -440
  950. data/spec/script/telemetry_spec.rb +165 -165
  951. data/spec/script/tools_spec.rb +117 -117
  952. data/spec/spec_helper.rb +190 -190
  953. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  954. data/spec/streams/fixed_stream_protocol_spec.rb +113 -113
  955. data/spec/streams/length_stream_protocol_spec.rb +300 -300
  956. data/spec/streams/preidentified_stream_protocol_spec.rb +121 -121
  957. data/spec/streams/serial_stream_spec.rb +117 -117
  958. data/spec/streams/stream_protocol_spec.rb +346 -346
  959. data/spec/streams/stream_spec.rb +30 -30
  960. data/spec/streams/tcpip_client_stream_spec.rb +57 -57
  961. data/spec/streams/tcpip_socket_stream_spec.rb +193 -193
  962. data/spec/streams/template_stream_protocol_spec.rb +156 -156
  963. data/spec/streams/terminated_stream_protocol_spec.rb +127 -127
  964. data/spec/system/system_spec.rb +665 -665
  965. data/spec/system/target_spec.rb +250 -250
  966. data/spec/tools/cmd_tlm_server/api_spec.rb +1117 -1117
  967. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  968. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  969. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +453 -453
  970. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  971. data/spec/tools/cmd_tlm_server/commanding_spec.rb +151 -151
  972. data/spec/tools/cmd_tlm_server/connections_spec.rb +235 -235
  973. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  974. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -252
  975. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  976. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +151 -151
  977. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -223
  978. data/spec/tools/launcher/launcher_config_spec.rb +464 -464
  979. data/spec/top_level/top_level_spec.rb +334 -334
  980. data/spec/utilities/crc_spec.rb +45 -45
  981. data/spec/utilities/csv_spec.rb +97 -97
  982. data/spec/utilities/logger_spec.rb +102 -102
  983. data/spec/utilities/message_log_spec.rb +89 -89
  984. data/spec/utilities/quaternion_spec.rb +107 -107
  985. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  986. data/tasks/manifest.rake +22 -22
  987. data/tasks/spec.rake +23 -23
  988. data/test/benchmarks/binary_accessor_benchmark.rb +14 -14
  989. data/test/benchmarks/gsub_benchmark.rb +152 -152
  990. data/test/benchmarks/is_a_benchmark.rb +34 -34
  991. data/test/performance/PACKETS.bat +0 -0
  992. data/test/performance/Rakefile +77 -77
  993. data/test/performance/THREADS.bat +0 -0
  994. data/test/performance/config/data/crc.txt +196 -196
  995. data/test/performance/config/data/diamond.STL +57 -57
  996. data/test/performance/config/data/meta_init.txt +4 -4
  997. data/test/performance/config/system/system_packets.txt +39 -39
  998. data/test/performance/config/system/system_threads.txt +59 -59
  999. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +46 -46
  1000. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  1001. data/test/performance/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  1002. data/test/performance/config/targets/COSMOS/screens/limits_change.txt +20 -20
  1003. data/test/performance/config/targets/COSMOS/screens/version.txt +19 -19
  1004. data/test/performance/config/targets/COSMOS/target.txt +11 -11
  1005. data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -20
  1006. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -98
  1007. data/test/performance/config/targets/PACKET/cmd_tlm_server.txt +6 -6
  1008. data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -22
  1009. data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -24
  1010. data/test/performance/config/targets/PACKET/screens/status.txt +25 -25
  1011. data/test/performance/config/targets/PACKET/target.txt +28 -28
  1012. data/test/performance/config/targets/SYSTEM/screens/status.txt +12 -12
  1013. data/test/performance/config/targets/THREAD/cmd_tlm/thread_cmds.txt +17 -17
  1014. data/test/performance/config/targets/THREAD/cmd_tlm/thread_tlm.txt +18 -18
  1015. data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -6
  1016. data/test/performance/config/targets/THREAD/lib/thread_interface.rb +22 -22
  1017. data/test/performance/config/targets/THREAD/screens/status.txt +25 -25
  1018. data/test/performance/config/targets/THREAD/target.txt +6 -6
  1019. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +28 -28
  1020. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +68 -68
  1021. data/test/performance/config/tools/data_viewer/data_viewer.txt +11 -11
  1022. data/test/performance/config/tools/handbook_creator/handbook_creator.txt +66 -66
  1023. data/test/performance/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  1024. data/test/performance/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  1025. data/test/performance/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  1026. data/test/performance/config/tools/handbook_creator/templates/header.html.erb +25 -25
  1027. data/test/performance/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  1028. data/test/performance/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  1029. data/test/performance/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  1030. data/test/performance/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  1031. data/test/performance/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  1032. data/test/performance/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  1033. data/test/performance/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  1034. data/test/performance/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  1035. data/test/performance/config/tools/handbook_creator/templates/title.html.erb +1 -1
  1036. data/test/performance/config/tools/launcher/launcher_packets.txt +34 -34
  1037. data/test/performance/config/tools/launcher/launcher_threads.txt +83 -83
  1038. data/test/performance/config/tools/script_runner/script_runner.txt +3 -3
  1039. data/test/performance/config/tools/table_manager/ConfigTables_def.txt +8 -8
  1040. data/test/performance/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  1041. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  1042. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  1043. data/test/performance/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  1044. data/test/performance/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  1045. data/test/performance/config/tools/test_runner/test_runner.txt +17 -17
  1046. data/test/performance/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  1047. data/test/performance/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  1048. data/test/performance/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  1049. data/test/performance/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  1050. data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -204
  1051. data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +13 -13
  1052. data/test/performance/lib/packet_target.rb +126 -126
  1053. data/test/performance/lib/thread_target.rb +120 -120
  1054. data/test/performance/lib/user_version.rb +3 -3
  1055. data/test/performance/procedures/checks.rb +11 -11
  1056. data/test/performance/procedures/clear_util.rb +7 -7
  1057. data/test/performance/procedures/collect.rb +18 -18
  1058. data/test/performance/procedures/collect_util.rb +14 -14
  1059. data/test/performance/procedures/cosmos_api_test.rb +293 -293
  1060. data/test/performance/procedures/disconnect.rb +29 -29
  1061. data/test/performance/procedures/example_test.rb +182 -182
  1062. data/test/performance/procedures/plot_test.rb +8 -8
  1063. data/test/performance/procedures/procedure.rb +2 -2
  1064. data/test/performance/procedures/run_example_test.rb +3 -3
  1065. data/test/performance/procedures/test.rb +51 -51
  1066. data/test/performance/tools/CmdExtractor +14 -14
  1067. data/test/performance/tools/CmdExtractor.bat +0 -0
  1068. data/test/performance/tools/CmdSender +14 -14
  1069. data/test/performance/tools/CmdSender.bat +0 -0
  1070. data/test/performance/tools/CmdTlmServer +16 -16
  1071. data/test/performance/tools/CmdTlmServer.bat +0 -0
  1072. data/test/performance/tools/CmdTlmServerMemProf +20 -20
  1073. data/test/performance/tools/CmdTlmServerMemProf.bat +0 -0
  1074. data/test/performance/tools/DataViewer +14 -14
  1075. data/test/performance/tools/DataViewer.bat +0 -0
  1076. data/test/performance/tools/HandbookCreator +14 -14
  1077. data/test/performance/tools/HandbookCreator.bat +0 -0
  1078. data/test/performance/tools/Launcher +14 -14
  1079. data/test/performance/tools/Launcher.bat +0 -0
  1080. data/test/performance/tools/LimitsMonitor +14 -14
  1081. data/test/performance/tools/LimitsMonitor.bat +0 -0
  1082. data/test/performance/tools/OpenGLBuilder +14 -14
  1083. data/test/performance/tools/OpenGLBuilder.bat +0 -0
  1084. data/test/performance/tools/PacketTarget +14 -14
  1085. data/test/performance/tools/PacketTarget.bat +0 -0
  1086. data/test/performance/tools/PacketViewer +14 -14
  1087. data/test/performance/tools/PacketViewer.bat +0 -0
  1088. data/test/performance/tools/Replay +14 -14
  1089. data/test/performance/tools/Replay.bat +0 -0
  1090. data/test/performance/tools/ScpiTarget +14 -14
  1091. data/test/performance/tools/ScpiTarget.bat +0 -0
  1092. data/test/performance/tools/ScriptRunner +14 -14
  1093. data/test/performance/tools/ScriptRunner.bat +0 -0
  1094. data/test/performance/tools/TableManager +14 -14
  1095. data/test/performance/tools/TableManager.bat +0 -0
  1096. data/test/performance/tools/TestRunner +14 -14
  1097. data/test/performance/tools/TestRunner.bat +0 -0
  1098. data/test/performance/tools/ThreadTarget +14 -14
  1099. data/test/performance/tools/ThreadTarget.bat +0 -0
  1100. data/test/performance/tools/TlmExtractor +14 -14
  1101. data/test/performance/tools/TlmExtractor.bat +0 -0
  1102. data/test/performance/tools/TlmGrapher +14 -14
  1103. data/test/performance/tools/TlmGrapher.bat +0 -0
  1104. data/test/performance/tools/TlmGrapherMemProf +19 -19
  1105. data/test/performance/tools/TlmGrapherMemProf.bat +0 -0
  1106. data/test/performance/tools/TlmViewer +14 -14
  1107. data/test/performance/tools/TlmViewer.bat +0 -0
  1108. data/test/performance/tools/TlmViewerMemProf +19 -19
  1109. data/test/performance/tools/TlmViewerMemProf.bat +0 -0
  1110. data/test/performance/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  1111. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  1112. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  1113. data/test/performance/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  1114. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  1115. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  1116. data/test/performance/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  1117. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  1118. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  1119. data/test/performance/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  1120. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  1121. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  1122. data/test/performance/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  1123. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  1124. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  1125. data/test/performance/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  1126. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  1127. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  1128. data/test/performance/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  1129. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  1130. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  1131. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  1132. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  1133. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  1134. data/test/performance/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  1135. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  1136. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  1137. data/test/performance/tools/mac/Replay.app/Contents/Info.plist +38 -38
  1138. data/test/performance/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  1139. data/test/performance/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  1140. data/test/performance/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  1141. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  1142. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  1143. data/test/performance/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  1144. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  1145. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  1146. data/test/performance/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  1147. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  1148. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  1149. data/test/performance/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  1150. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  1151. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  1152. data/test/performance/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  1153. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  1154. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  1155. data/test/performance/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  1156. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  1157. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  1158. metadata +3 -3
@@ -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,67 +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| 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
+ # 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,515 +1,515 @@
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
- stale = System.telemetry.check_stale
201
- stale.each do |packet|
202
- post_limits_event(:STALE_PACKET, [packet.target_name, packet.packet_name])
203
- end
204
- broken = @sleeper.sleep(10)
205
- break if broken
206
- end
207
- rescue Exception => err
208
- Logger.fatal "Staleness Monitor thread unexpectedly died"
209
- Cosmos.handle_fatal_exception(err)
210
- end
211
- end # end Thread.new
212
- end
213
-
214
- # Properly shuts down the command and telemetry server by stoping the
215
- # JSON-RPC server, background tasks, routers, and interfaces. Also kills
216
- # the packet staleness monitor thread.
217
- def stop
218
- # Shutdown DRb
219
- @json_drb.stop_service
220
-
221
- # Shutdown staleness monitor thread
222
- Cosmos.kill_thread(self, @staleness_monitor_thread)
223
-
224
- @background_tasks.stop
225
- @routers.stop
226
- @interfaces.stop
227
- @packet_logging.shutdown
228
- @stop_callback.call if @stop_callback
229
- @message_log.stop if @message_log
230
-
231
- @json_drb = nil
232
- end
233
-
234
- # Set a stop callback
235
- def stop_callback= (stop_callback)
236
- @stop_callback = stop_callback
237
- end
238
-
239
- # Gracefully kill the staleness monitor thread
240
- def graceful_kill
241
- @sleeper.cancel
242
- end
243
-
244
- # Called when an item in any packet changes limits states.
245
- #
246
- # @param packet [Packet] Packet which has had an item change limits state
247
- # @param item [PacketItem] The item which has changed limits state
248
- # @param old_limits_state [Symbol] The previous state of the item. See
249
- # {PacketItemLimits#state}
250
- # @param value [Object] The current value of the item
251
- # @param log_change [Boolean] Whether to log this limits change event
252
- def limits_change_callback(packet, item, old_limits_state, value, log_change)
253
- if log_change
254
- # Write to Server Messages that limits state has changed
255
- tgt_pkt_item_str = "#{packet.target_name} #{packet.packet_name} #{item.name} = #{value} is"
256
- case item.limits.state
257
- when :BLUE
258
- Logger.info "<B>#{tgt_pkt_item_str} #{item.limits.state}"
259
- when :GREEN, :GREEN_LOW, :GREEN_HIGH
260
- Logger.info "<G>#{tgt_pkt_item_str} #{item.limits.state}"
261
- when :YELLOW, :YELLOW_LOW, :YELLOW_HIGH
262
- Logger.warn "<Y>#{tgt_pkt_item_str} #{item.limits.state}"
263
- when :RED, :RED_LOW, :RED_HIGH
264
- Logger.error "<R>#{tgt_pkt_item_str} #{item.limits.state}"
265
- else
266
- Logger.error "#{tgt_pkt_item_str} UNKNOWN"
267
- end
268
- end
269
-
270
- post_limits_event(:LIMITS_CHANGE, [packet.target_name, packet.packet_name, item.name, old_limits_state, item.limits.state])
271
-
272
- if item.limits.response
273
- begin
274
- item.limits.response.call(packet, item, old_limits_state)
275
- rescue Exception => err
276
- Logger.error "#{packet.target_name} #{packet.packet_name} #{item.name} Limits Response Exception!"
277
- Logger.error "Called with old_state = #{old_limits_state}, new_state = #{item.limits.state}"
278
- Logger.error err.formatted
279
- end
280
- end
281
- end
282
-
283
- # Post a limits event to all subscribed limits event listeners.
284
- #
285
- # @param event_type [Symbol] The type of limits event that occurred. Must
286
- # be one of :LIMITS_SET which means the system limits set has changed,
287
- # :LIMITS_CHANGE which means an individual item has changed limits state,
288
- # :LIMITS_SETTINGS which means an individual item has new settings, or
289
- # :STALE_PACKET which means a packet with limits has gone stale
290
- # @param event_data [Symbol|Array<String,String,String,Symbol,Symbol>]
291
- # Returns the current limits set name for event_type == :LIMITS_SET.
292
- # Returns an array containing the target name, packet name, item name,
293
- # old limits state, and current limits state for event_type ==
294
- # :LIMITS_CHANGE.
295
- def post_limits_event(event_type, event_data)
296
- if @limits_event_queues.length > 0
297
- queues_to_drop = []
298
-
299
- @limits_event_queue_mutex.synchronize do
300
- # Post event to active queues
301
- @limits_event_queues.each do |id, data|
302
- queue = data[0]
303
- queue_size = data[1]
304
- queue << [event_type, event_data]
305
- if queue.length > queue_size
306
- # Drop queue
307
- queues_to_drop << id
308
- end
309
- end
310
-
311
- # Drop queues which are not being serviced
312
- queues_to_drop.each do |id|
313
- # Remove the queue to stop servicing it. Nil is added to unblock any client threads
314
- # that might otherwise be left blocking forever for something on the queue
315
- queue, queue_size = @limits_event_queues.delete(id)
316
- queue << nil if queue
317
- end
318
- end
319
- end
320
- end
321
-
322
- # Create a queue on the CmdTlmServer that gets populated with every limits
323
- # event in the system. A limits event occurs when a telemetry item with
324
- # limits changes state. Thus limits events occur on negative transitions
325
- # (:GREEN to :YELLOW_LOW) and positive transitions (:YELLOW_HIGH to
326
- # :GREEN).
327
- #
328
- # @param queue_size [Integer] The number of limit events to accumulate
329
- # before the queue will be dropped due to inactivity.
330
- # @return [Integer] The queue ID returned from the CmdTlmServer. Use this
331
- # ID when calling {#get_limits_event} and {#unsubscribe_limits_events}.
332
- def self.subscribe_limits_events(queue_size = DEFAULT_LIMITS_EVENT_QUEUE_SIZE)
333
- id = nil
334
- @@instance.limits_event_queue_mutex.synchronize do
335
- id = @@instance.next_limits_event_queue_id
336
- @@instance.limits_event_queues[id] = [Queue.new, queue_size]
337
- @@instance.next_limits_event_queue_id += 1
338
- end
339
- return id
340
- end
341
-
342
- # Unsubscribe from being notified for every limits event in the system.
343
- # This deletes the queue and further calls to {#get_limits_event} will
344
- # raise an exception.
345
- #
346
- # @param id [Integer] The queue ID received from calling
347
- # {#subscribe_limits_events}
348
- def self.unsubscribe_limits_events(id)
349
- queue = nil
350
- @@instance.limits_event_queue_mutex.synchronize do
351
- # Remove the queue to stop servicing it. Nil is added to unblock any client threads
352
- # that might otherwise be left blocking forever for something on the queue
353
- queue, queue_size = @@instance.limits_event_queues.delete(id)
354
- queue << nil if queue
355
- end
356
- end
357
-
358
- # Get a limits event from the queue created by {#subscribe_limits_events}.
359
- #
360
- # Each limits event consists of an Array with two elements:
361
- # The Symbol name of the event and an Array of data
362
- #
363
- # @param id [Integer] The queue ID received from calling
364
- # {#subscribe_limits_events}
365
- # @param non_block [Boolean] Whether to wait on the queue for the next
366
- # limits event before returning. Default is to block waiting for the next
367
- # event. NOTE: If you pass true and there is no data on the queue, a
368
- # ThreadError exception is raised.
369
- def self.get_limits_event(id, non_block = false)
370
- queue = nil
371
- @@instance.limits_event_queue_mutex.synchronize do
372
- queue, _ = @@instance.limits_event_queues[id]
373
- end
374
- if queue
375
- return queue.pop(non_block)
376
- else
377
- raise "Limits event queue with id #{id} not found"
378
- end
379
- end
380
-
381
- # Post packet data to all subscribed packet data listeners.
382
- #
383
- # @param packet [Packet]
384
- def post_packet(packet)
385
- if @packet_data_queues.length > 0
386
- queues_to_drop = []
387
-
388
- @packet_data_queue_mutex.synchronize do
389
- # Post event to active queues
390
- @packet_data_queues.each do |id, data|
391
- queue = data[0]
392
- packets = data[1]
393
- queue_size = data[2]
394
-
395
- packets.each do |target_name, packet_name|
396
- if packet.target_name == target_name and packet.packet_name == packet_name
397
- received_time = packet.received_time
398
- received_time ||= Time.now
399
- queue << [packet.buffer, target_name, packet_name,
400
- received_time.tv_sec, received_time.tv_usec, packet.received_count]
401
- if queue.length > queue_size
402
- # Drop queue
403
- queues_to_drop << id
404
- end
405
- break
406
- end
407
- end
408
- end
409
-
410
- # Drop queues which are not being serviced
411
- queues_to_drop.each do |id|
412
- # Remove the queue to stop servicing it. Nil is added to unblock any client threads
413
- # that might otherwise be left blocking forever for something on the queue
414
- queue, packets, queue_size = @packet_data_queues.delete(id)
415
- queue << nil if queue
416
- end
417
- end
418
- end
419
- end
420
-
421
- # Subscribe to one or more telemetry packets.
422
- #
423
- # @param packets [Array<Array<String,String>>] List of packets where the
424
- # Strings are target name, packet name.
425
- # @param queue_size [Integer] The size of the queue to store packet data
426
- # @return [Integer] The queue ID returned from CmdTlmServer. Use this ID
427
- # when calling {#get_packet_data} and {#unsubscribe_packet_data}.
428
- def self.subscribe_packet_data(packets,
429
- queue_size = CmdTlmServer::DEFAULT_PACKET_DATA_QUEUE_SIZE)
430
- if !packets.is_a?(Array) || !packets[0].is_a?(Array)
431
- raise ArgumentError, "packets must be nested array: [['TGT','PKT'],...]"
432
- end
433
-
434
- id = nil
435
- upcase_packets = []
436
-
437
- # Upper case packet names
438
- packets.length.times do |index|
439
- upcase_packets << []
440
- upcase_packets[index][0] = packets[index][0].upcase
441
- upcase_packets[index][1] = packets[index][1].upcase
442
- # Get the packet to ensure it exists
443
- @@instance.get_tlm_packet(upcase_packets[index][0], upcase_packets[index][1])
444
- end
445
-
446
- @@instance.packet_data_queue_mutex.synchronize do
447
- id = @@instance.next_packet_data_queue_id
448
- @@instance.packet_data_queues[id] =
449
- [Queue.new, upcase_packets, queue_size]
450
- @@instance.next_packet_data_queue_id += 1
451
- end
452
- return id
453
- end
454
-
455
- # Unsubscribe to telemetry packets.
456
- #
457
- # @param id [Integer] The queue ID received from calling
458
- # {#subscribe_packet_data}.
459
- def self.unsubscribe_packet_data(id)
460
- @@instance.packet_data_queue_mutex.synchronize do
461
- # Remove the queue to stop servicing it. Nil is added to unblock any client threads
462
- # that might otherwise be left blocking forever for something on the queue
463
- queue, packets, queue_size = @@instance.packet_data_queues.delete(id)
464
- queue << nil if queue
465
- end
466
- return nil
467
- end
468
-
469
- # Get packet data from the queue created by {#subscribe_packet_data}.
470
- #
471
- # Each packet data consists of an Array with five elements:
472
- # \[buffer, target name, packet name, received time sec, received time us]
473
- #
474
- # @param id [Integer] The queue ID received from calling
475
- # {#subscribe_packet_data}
476
- # @param non_block [Boolean] Whether to wait on the queue for the next
477
- # packet before returning. Default is to block waiting for the next
478
- # packet. NOTE: If you pass true and there is no packet on the queue, a
479
- # ThreadError exception is raised.
480
- def self.get_packet_data(id, non_block = false)
481
- queue = nil
482
- @@instance.packet_data_queue_mutex.synchronize do
483
- queue, _, _ = @@instance.packet_data_queues[id]
484
- end
485
- if queue
486
- return queue.pop(non_block)
487
- else
488
- raise "Packet data queue with id #{id} not found"
489
- end
490
- end
491
-
492
- # Calls clear_counters on the System, interfaces, routers, and sets the
493
- # request_count on json_drb to 0.
494
- def self.clear_counters
495
- System.clear_counters
496
- self.instance.interfaces.clear_counters
497
- self.instance.routers.clear_counters
498
- self.instance.json_drb.request_count = 0
499
- end
500
-
501
- protected
502
-
503
- # Method called by all interfaces when a packet has been identified. It
504
- # checks the limits of the packet and then posts the packet to any
505
- # registered subscribers.
506
- #
507
- # @param packet [Packet] Packet which has been identified by the interface
508
- def identified_packet_callback(packet)
509
- packet.check_limits(System.limits_set)
510
- post_packet(packet)
511
- end
512
-
513
- end # class CmdTlmServer
514
-
515
- 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
+ stale = System.telemetry.check_stale
201
+ stale.each do |packet|
202
+ post_limits_event(:STALE_PACKET, [packet.target_name, packet.packet_name])
203
+ end
204
+ broken = @sleeper.sleep(10)
205
+ break if broken
206
+ end
207
+ rescue Exception => err
208
+ Logger.fatal "Staleness Monitor thread unexpectedly died"
209
+ Cosmos.handle_fatal_exception(err)
210
+ end
211
+ end # end Thread.new
212
+ end
213
+
214
+ # Properly shuts down the command and telemetry server by stoping the
215
+ # JSON-RPC server, background tasks, routers, and interfaces. Also kills
216
+ # the packet staleness monitor thread.
217
+ def stop
218
+ # Shutdown DRb
219
+ @json_drb.stop_service
220
+
221
+ # Shutdown staleness monitor thread
222
+ Cosmos.kill_thread(self, @staleness_monitor_thread)
223
+
224
+ @background_tasks.stop
225
+ @routers.stop
226
+ @interfaces.stop
227
+ @packet_logging.shutdown
228
+ @stop_callback.call if @stop_callback
229
+ @message_log.stop if @message_log
230
+
231
+ @json_drb = nil
232
+ end
233
+
234
+ # Set a stop callback
235
+ def stop_callback= (stop_callback)
236
+ @stop_callback = stop_callback
237
+ end
238
+
239
+ # Gracefully kill the staleness monitor thread
240
+ def graceful_kill
241
+ @sleeper.cancel
242
+ end
243
+
244
+ # Called when an item in any packet changes limits states.
245
+ #
246
+ # @param packet [Packet] Packet which has had an item change limits state
247
+ # @param item [PacketItem] The item which has changed limits state
248
+ # @param old_limits_state [Symbol] The previous state of the item. See
249
+ # {PacketItemLimits#state}
250
+ # @param value [Object] The current value of the item
251
+ # @param log_change [Boolean] Whether to log this limits change event
252
+ def limits_change_callback(packet, item, old_limits_state, value, log_change)
253
+ if log_change
254
+ # Write to Server Messages that limits state has changed
255
+ tgt_pkt_item_str = "#{packet.target_name} #{packet.packet_name} #{item.name} = #{value} is"
256
+ case item.limits.state
257
+ when :BLUE
258
+ Logger.info "<B>#{tgt_pkt_item_str} #{item.limits.state}"
259
+ when :GREEN, :GREEN_LOW, :GREEN_HIGH
260
+ Logger.info "<G>#{tgt_pkt_item_str} #{item.limits.state}"
261
+ when :YELLOW, :YELLOW_LOW, :YELLOW_HIGH
262
+ Logger.warn "<Y>#{tgt_pkt_item_str} #{item.limits.state}"
263
+ when :RED, :RED_LOW, :RED_HIGH
264
+ Logger.error "<R>#{tgt_pkt_item_str} #{item.limits.state}"
265
+ else
266
+ Logger.error "#{tgt_pkt_item_str} UNKNOWN"
267
+ end
268
+ end
269
+
270
+ post_limits_event(:LIMITS_CHANGE, [packet.target_name, packet.packet_name, item.name, old_limits_state, item.limits.state])
271
+
272
+ if item.limits.response
273
+ begin
274
+ item.limits.response.call(packet, item, old_limits_state)
275
+ rescue Exception => err
276
+ Logger.error "#{packet.target_name} #{packet.packet_name} #{item.name} Limits Response Exception!"
277
+ Logger.error "Called with old_state = #{old_limits_state}, new_state = #{item.limits.state}"
278
+ Logger.error err.formatted
279
+ end
280
+ end
281
+ end
282
+
283
+ # Post a limits event to all subscribed limits event listeners.
284
+ #
285
+ # @param event_type [Symbol] The type of limits event that occurred. Must
286
+ # be one of :LIMITS_SET which means the system limits set has changed,
287
+ # :LIMITS_CHANGE which means an individual item has changed limits state,
288
+ # :LIMITS_SETTINGS which means an individual item has new settings, or
289
+ # :STALE_PACKET which means a packet with limits has gone stale
290
+ # @param event_data [Symbol|Array<String,String,String,Symbol,Symbol>]
291
+ # Returns the current limits set name for event_type == :LIMITS_SET.
292
+ # Returns an array containing the target name, packet name, item name,
293
+ # old limits state, and current limits state for event_type ==
294
+ # :LIMITS_CHANGE.
295
+ def post_limits_event(event_type, event_data)
296
+ if @limits_event_queues.length > 0
297
+ queues_to_drop = []
298
+
299
+ @limits_event_queue_mutex.synchronize do
300
+ # Post event to active queues
301
+ @limits_event_queues.each do |id, data|
302
+ queue = data[0]
303
+ queue_size = data[1]
304
+ queue << [event_type, event_data]
305
+ if queue.length > queue_size
306
+ # Drop queue
307
+ queues_to_drop << id
308
+ end
309
+ end
310
+
311
+ # Drop queues which are not being serviced
312
+ queues_to_drop.each do |id|
313
+ # Remove the queue to stop servicing it. Nil is added to unblock any client threads
314
+ # that might otherwise be left blocking forever for something on the queue
315
+ queue, queue_size = @limits_event_queues.delete(id)
316
+ queue << nil if queue
317
+ end
318
+ end
319
+ end
320
+ end
321
+
322
+ # Create a queue on the CmdTlmServer that gets populated with every limits
323
+ # event in the system. A limits event occurs when a telemetry item with
324
+ # limits changes state. Thus limits events occur on negative transitions
325
+ # (:GREEN to :YELLOW_LOW) and positive transitions (:YELLOW_HIGH to
326
+ # :GREEN).
327
+ #
328
+ # @param queue_size [Integer] The number of limit events to accumulate
329
+ # before the queue will be dropped due to inactivity.
330
+ # @return [Integer] The queue ID returned from the CmdTlmServer. Use this
331
+ # ID when calling {#get_limits_event} and {#unsubscribe_limits_events}.
332
+ def self.subscribe_limits_events(queue_size = DEFAULT_LIMITS_EVENT_QUEUE_SIZE)
333
+ id = nil
334
+ @@instance.limits_event_queue_mutex.synchronize do
335
+ id = @@instance.next_limits_event_queue_id
336
+ @@instance.limits_event_queues[id] = [Queue.new, queue_size]
337
+ @@instance.next_limits_event_queue_id += 1
338
+ end
339
+ return id
340
+ end
341
+
342
+ # Unsubscribe from being notified for every limits event in the system.
343
+ # This deletes the queue and further calls to {#get_limits_event} will
344
+ # raise an exception.
345
+ #
346
+ # @param id [Integer] The queue ID received from calling
347
+ # {#subscribe_limits_events}
348
+ def self.unsubscribe_limits_events(id)
349
+ queue = nil
350
+ @@instance.limits_event_queue_mutex.synchronize do
351
+ # Remove the queue to stop servicing it. Nil is added to unblock any client threads
352
+ # that might otherwise be left blocking forever for something on the queue
353
+ queue, queue_size = @@instance.limits_event_queues.delete(id)
354
+ queue << nil if queue
355
+ end
356
+ end
357
+
358
+ # Get a limits event from the queue created by {#subscribe_limits_events}.
359
+ #
360
+ # Each limits event consists of an Array with two elements:
361
+ # The Symbol name of the event and an Array of data
362
+ #
363
+ # @param id [Integer] The queue ID received from calling
364
+ # {#subscribe_limits_events}
365
+ # @param non_block [Boolean] Whether to wait on the queue for the next
366
+ # limits event before returning. Default is to block waiting for the next
367
+ # event. NOTE: If you pass true and there is no data on the queue, a
368
+ # ThreadError exception is raised.
369
+ def self.get_limits_event(id, non_block = false)
370
+ queue = nil
371
+ @@instance.limits_event_queue_mutex.synchronize do
372
+ queue, _ = @@instance.limits_event_queues[id]
373
+ end
374
+ if queue
375
+ return queue.pop(non_block)
376
+ else
377
+ raise "Limits event queue with id #{id} not found"
378
+ end
379
+ end
380
+
381
+ # Post packet data to all subscribed packet data listeners.
382
+ #
383
+ # @param packet [Packet]
384
+ def post_packet(packet)
385
+ if @packet_data_queues.length > 0
386
+ queues_to_drop = []
387
+
388
+ @packet_data_queue_mutex.synchronize do
389
+ # Post event to active queues
390
+ @packet_data_queues.each do |id, data|
391
+ queue = data[0]
392
+ packets = data[1]
393
+ queue_size = data[2]
394
+
395
+ packets.each do |target_name, packet_name|
396
+ if packet.target_name == target_name and packet.packet_name == packet_name
397
+ received_time = packet.received_time
398
+ received_time ||= Time.now
399
+ queue << [packet.buffer, target_name, packet_name,
400
+ received_time.tv_sec, received_time.tv_usec, packet.received_count]
401
+ if queue.length > queue_size
402
+ # Drop queue
403
+ queues_to_drop << id
404
+ end
405
+ break
406
+ end
407
+ end
408
+ end
409
+
410
+ # Drop queues which are not being serviced
411
+ queues_to_drop.each do |id|
412
+ # Remove the queue to stop servicing it. Nil is added to unblock any client threads
413
+ # that might otherwise be left blocking forever for something on the queue
414
+ queue, packets, queue_size = @packet_data_queues.delete(id)
415
+ queue << nil if queue
416
+ end
417
+ end
418
+ end
419
+ end
420
+
421
+ # Subscribe to one or more telemetry packets.
422
+ #
423
+ # @param packets [Array<Array<String,String>>] List of packets where the
424
+ # Strings are target name, packet name.
425
+ # @param queue_size [Integer] The size of the queue to store packet data
426
+ # @return [Integer] The queue ID returned from CmdTlmServer. Use this ID
427
+ # when calling {#get_packet_data} and {#unsubscribe_packet_data}.
428
+ def self.subscribe_packet_data(packets,
429
+ queue_size = CmdTlmServer::DEFAULT_PACKET_DATA_QUEUE_SIZE)
430
+ if !packets.is_a?(Array) || !packets[0].is_a?(Array)
431
+ raise ArgumentError, "packets must be nested array: [['TGT','PKT'],...]"
432
+ end
433
+
434
+ id = nil
435
+ upcase_packets = []
436
+
437
+ # Upper case packet names
438
+ packets.length.times do |index|
439
+ upcase_packets << []
440
+ upcase_packets[index][0] = packets[index][0].upcase
441
+ upcase_packets[index][1] = packets[index][1].upcase
442
+ # Get the packet to ensure it exists
443
+ @@instance.get_tlm_packet(upcase_packets[index][0], upcase_packets[index][1])
444
+ end
445
+
446
+ @@instance.packet_data_queue_mutex.synchronize do
447
+ id = @@instance.next_packet_data_queue_id
448
+ @@instance.packet_data_queues[id] =
449
+ [Queue.new, upcase_packets, queue_size]
450
+ @@instance.next_packet_data_queue_id += 1
451
+ end
452
+ return id
453
+ end
454
+
455
+ # Unsubscribe to telemetry packets.
456
+ #
457
+ # @param id [Integer] The queue ID received from calling
458
+ # {#subscribe_packet_data}.
459
+ def self.unsubscribe_packet_data(id)
460
+ @@instance.packet_data_queue_mutex.synchronize do
461
+ # Remove the queue to stop servicing it. Nil is added to unblock any client threads
462
+ # that might otherwise be left blocking forever for something on the queue
463
+ queue, packets, queue_size = @@instance.packet_data_queues.delete(id)
464
+ queue << nil if queue
465
+ end
466
+ return nil
467
+ end
468
+
469
+ # Get packet data from the queue created by {#subscribe_packet_data}.
470
+ #
471
+ # Each packet data consists of an Array with five elements:
472
+ # \[buffer, target name, packet name, received time sec, received time us]
473
+ #
474
+ # @param id [Integer] The queue ID received from calling
475
+ # {#subscribe_packet_data}
476
+ # @param non_block [Boolean] Whether to wait on the queue for the next
477
+ # packet before returning. Default is to block waiting for the next
478
+ # packet. NOTE: If you pass true and there is no packet on the queue, a
479
+ # ThreadError exception is raised.
480
+ def self.get_packet_data(id, non_block = false)
481
+ queue = nil
482
+ @@instance.packet_data_queue_mutex.synchronize do
483
+ queue, _, _ = @@instance.packet_data_queues[id]
484
+ end
485
+ if queue
486
+ return queue.pop(non_block)
487
+ else
488
+ raise "Packet data queue with id #{id} not found"
489
+ end
490
+ end
491
+
492
+ # Calls clear_counters on the System, interfaces, routers, and sets the
493
+ # request_count on json_drb to 0.
494
+ def self.clear_counters
495
+ System.clear_counters
496
+ self.instance.interfaces.clear_counters
497
+ self.instance.routers.clear_counters
498
+ self.instance.json_drb.request_count = 0
499
+ end
500
+
501
+ protected
502
+
503
+ # Method called by all interfaces when a packet has been identified. It
504
+ # checks the limits of the packet and then posts the packet to any
505
+ # registered subscribers.
506
+ #
507
+ # @param packet [Packet] Packet which has been identified by the interface
508
+ def identified_packet_callback(packet)
509
+ packet.check_limits(System.limits_set)
510
+ post_packet(packet)
511
+ end
512
+
513
+ end # class CmdTlmServer
514
+
515
+ end # module Cosmos