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,618 +1,618 @@
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/config/config_parser'
12
- require 'cosmos/packets/packet_config'
13
- require 'cosmos/packets/commands'
14
- require 'cosmos/packets/telemetry'
15
- require 'cosmos/packets/limits'
16
- require 'cosmos/system/target'
17
- require 'cosmos/packet_logs'
18
- require 'fileutils'
19
- require 'drb/acl'
20
- require 'bundler'
21
-
22
- module Cosmos
23
-
24
- # System is the primary entry point into the COSMOS framework. It captures
25
- # system wide configuration items such as the available ports and paths to
26
- # various files used by the system. The #commands, #telemetry, and #limits
27
- # class variables are the primary access points for applications. The
28
- # #targets variable provides access to all the targets defined by the system.
29
- # Its primary responsibily is to load the system configuration file and
30
- # create all the Target instances. It also saves and restores configurations
31
- # using a MD5 checksum over the entire configuration to detect changes.
32
- class System
33
- # @return [Hash<String,Fixnum>] Hash of all the known ports and their values
34
- instance_attr_reader :ports
35
- # @return [Hash<String,String>] Hash of all the known paths and their values
36
- instance_attr_reader :paths
37
- # @return [String] Arbitrary string containing the version
38
- instance_attr_reader :cmd_tlm_version
39
- # @return [PacketLogWriter] Class used to create log files
40
- instance_attr_reader :default_packet_log_writer
41
- # @return [PacketLogReader] Class used to read log files
42
- instance_attr_reader :default_packet_log_reader
43
- # @return [Boolean] Whether to use sound for alerts
44
- instance_attr_reader :sound
45
- # @return [Boolean] Whether to use DNS to lookup IP addresses or not
46
- instance_attr_reader :use_dns
47
- # @return [String] Stores the initial configuration file used when this
48
- # System was initialized
49
- instance_attr_reader :initial_filename
50
- # @return [PacketDefinition] Stores the initial packet list used when this
51
- # System was initialized
52
- instance_attr_reader :initial_config
53
- # @return [ACL] Access control list showing which machines can have access
54
- instance_attr_reader :acl
55
- # @return [Hash<String,Target>] Hash of all the known targets
56
- instance_attr_reader :targets
57
- # @return [Integer] The number of seconds before a telemetry packet is considered stale
58
- instance_attr_reader :staleness_seconds
59
- # @return [Symbol] The current limits set
60
- instance_attr_reader :limits_set
61
-
62
- # Known COSMOS ports
63
- KNOWN_PORTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED']
64
- # Known COSMOS paths
65
- KNOWN_PATHS = ['LOGS', 'TMP', 'SAVED_CONFIG', 'TABLES', 'HANDBOOKS', 'PROCEDURES']
66
-
67
- @@instance = nil
68
- @@instance_mutex = Mutex.new
69
-
70
- # Create a new System object. Note, this should not be called directly but
71
- # you should instead use System.instance and treat this class as a
72
- # singleton.
73
- #
74
- # @param filename [String] Full path to the system configuration file to
75
- # read. Be default this is <Cosmos::USERPATH>/config/system/system.txt
76
- def initialize(filename = nil)
77
- raise "Cosmos::System created twice" unless @@instance.nil?
78
- @targets = {}
79
- @targets['UNKNOWN'] = Target.new('UNKNOWN')
80
- @config = nil
81
- @commands = nil
82
- @telemetry = nil
83
- @limits = nil
84
- @cmd_tlm_version = nil
85
- @default_packet_log_writer = PacketLogWriter
86
- @default_packet_log_reader = PacketLogReader
87
- @sound = false
88
- @use_dns = false
89
- @acl = nil
90
- @staleness_seconds = 30
91
- @limits_set = :DEFAULT
92
-
93
- @ports = {}
94
- @ports['CTS_API'] = 7777
95
- @ports['TLMVIEWER_API'] = 7778
96
- @ports['CTS_PREIDENTIFIED'] = 7779
97
-
98
- @paths = {}
99
- @paths['LOGS'] = File.join(USERPATH, 'outputs', 'logs')
100
- @paths['TMP'] = File.join(USERPATH, 'outputs', 'tmp')
101
- @paths['SAVED_CONFIG'] = File.join(USERPATH, 'outputs', 'saved_config')
102
- @paths['TABLES'] = File.join(USERPATH, 'outputs', 'tables')
103
- @paths['HANDBOOKS'] = File.join(USERPATH, 'outputs', 'handbooks')
104
- @paths['PROCEDURES'] = [File.join(USERPATH, 'procedures')]
105
-
106
- unless filename
107
- system_arg = false
108
- ARGV.each do |arg|
109
- if system_arg
110
- filename = File.join(USERPATH, 'config', 'system', arg)
111
- break
112
- end
113
- system_arg = true if arg == '--system'
114
- end
115
- filename = File.join(USERPATH, 'config', 'system', 'system.txt') unless filename
116
- end
117
- process_file(filename)
118
- ENV['COSMOS_LOGS_DIR'] = @paths['LOGS']
119
-
120
- @initial_filename = filename
121
- @initial_config = nil
122
- @@instance = self
123
- end
124
-
125
- # @return [String] Configuration name
126
- def self.configuration_name
127
- # In order not to make the @config instance variable accessable to the
128
- # outside (using a regular accessor method) we use the ability of the
129
- # object to grab its own instance variable
130
- self.instance.instance_variable_get(:@config).name
131
- end
132
-
133
- # Clear the command and telemetry counters for all the targets as well as
134
- # the counters associated with the Commands and Telemetry instances
135
- def self.clear_counters
136
- self.instance.targets.each do |target_name, target|
137
- target.cmd_cnt = 0
138
- target.tlm_cnt = 0
139
- end
140
- self.instance.telemetry.clear_counters
141
- self.instance.commands.clear_counters
142
- end
143
-
144
- # @return [Commands] Access to the command definiton
145
- def commands
146
- load_packets() unless @config
147
- return @commands
148
- end
149
-
150
- # (see #commands)
151
- def self.commands
152
- return self.instance.commands
153
- end
154
-
155
- # @return [Telemetry] Access to the telemetry definition
156
- def telemetry
157
- load_packets() unless @config
158
- return @telemetry
159
- end
160
-
161
- # (see #telemetry)
162
- def self.telemetry
163
- return self.instance.telemetry
164
- end
165
-
166
- # @return [Limits] Access to the limits definition
167
- def limits
168
- load_packets() unless @config
169
- return @limits
170
- end
171
-
172
- # (see #limits)
173
- def self.limits
174
- return self.instance.limits
175
- end
176
-
177
- # Change the system limits set
178
- #
179
- # @param [Symbol] The name of the limits set. :DEFAULT is always an option
180
- # but limits sets are user defined
181
- def limits_set=(limits_set)
182
- load_packets() unless @config
183
- new_limits_set = limits_set.to_s.upcase.intern
184
- if @limits_set != new_limits_set
185
- if @config.limits_sets.include?(new_limits_set)
186
- @limits_set = new_limits_set
187
- Logger.info("Limits Set Changed to: #{@limits_set}")
188
- CmdTlmServer.instance.post_limits_event(:LIMITS_SET, System.limits_set) if defined? CmdTlmServer and CmdTlmServer.instance
189
- else
190
- raise "Unknown limits set requested: #{new_limits_set}"
191
- end
192
- end
193
- end
194
-
195
- # (see #limits_set=)
196
- def self.limits_set=(limits_set)
197
- self.instance.limits_set = limits_set
198
- end
199
-
200
- # @return [System] The System singleton
201
- def self.instance(filename = nil)
202
- return @@instance if @@instance
203
- @@instance_mutex.synchronize do
204
- @@instance ||= self.new(filename)
205
- return @@instance
206
- end
207
- end
208
-
209
- # Process the system.txt configuration file
210
- #
211
- # @param filename [String] The configuration file
212
- # @param configuration_directory [String] The configuration directory to
213
- # search for the target command and telemetry files. Pass nil to look in
214
- # the default location of <USERPATH>/config/targets.
215
- def process_file(filename, configuration_directory = nil)
216
- @targets = {}
217
- # Set config to nil so things will lazy load later
218
- @config = nil
219
- acl_list = []
220
- all_allowed = false
221
- first_procedures_path = true
222
-
223
- Cosmos.set_working_dir do
224
- parser = ConfigParser.new
225
-
226
- # First pass - Everything except targets
227
- parser.parse_file(filename) do |keyword, parameters|
228
- case keyword
229
- when 'AUTO_DECLARE_TARGETS', 'DECLARE_TARGET', 'DECLARE_GEM_TARGET'
230
- # Will be handled by second pass
231
-
232
- when 'PORT'
233
- usage = "#{keyword} <PORT NAME> <PORT VALUE>"
234
- parser.verify_num_parameters(2, 2, usage)
235
- port_name = parameters[0].to_s.upcase
236
- @ports[port_name] = Integer(parameters[1])
237
- Logger.warn("Unknown port name given: #{port_name}") unless KNOWN_PORTS.include?(port_name)
238
-
239
- when 'PATH'
240
- usage = "#{keyword} <PATH NAME> <PATH>"
241
- parser.verify_num_parameters(2, 2, usage)
242
- path_name = parameters[0].to_s.upcase
243
- path = File.expand_path(parameters[1])
244
- if path_name == 'PROCEDURES'
245
- if first_procedures_path
246
- @paths[path_name] = []
247
- first_procedures_path = false
248
- end
249
- @paths[path_name] << path
250
- else
251
- @paths[path_name] = path
252
- end
253
- unless Dir.exist?(path)
254
- begin
255
- FileUtils.mkdir_p(path)
256
- raise "Path creation failed: #{path}" unless File.exist?(path)
257
- Logger.info "Created PATH #{path_name} #{path}"
258
- rescue Exception => err
259
- Logger.error "Problem creating PATH #{path_name} #{path}\n#{err.formatted}"
260
- end
261
- end
262
- Logger.warn("Unknown path name given: #{path_name}") unless KNOWN_PATHS.include?(path_name)
263
-
264
- when 'DEFAULT_PACKET_LOG_WRITER'
265
- usage = "#{keyword} <FILENAME>"
266
- parser.verify_num_parameters(1, 1, usage)
267
- @default_packet_log_writer = Cosmos.require_class(parameters[0])
268
-
269
- when 'DEFAULT_PACKET_LOG_READER'
270
- usage = "#{keyword} <FILENAME>"
271
- parser.verify_num_parameters(1, 1, usage)
272
- @default_packet_log_reader = Cosmos.require_class(parameters[0])
273
-
274
- when 'ENABLE_SOUND'
275
- usage = "#{keyword}"
276
- parser.verify_num_parameters(0, 0, usage)
277
- @sound = true
278
-
279
- when 'DISABLE_DNS'
280
- usage = "#{keyword}"
281
- parser.verify_num_parameters(0, 0, usage)
282
- @use_dns = false
283
-
284
- when 'ENABLE_DNS'
285
- usage = "#{keyword}"
286
- parser.verify_num_parameters(0, 0, usage)
287
- @use_dns = true
288
-
289
- when 'ALLOW_ACCESS'
290
- parser.verify_num_parameters(1, 1, "#{keyword} <IP Address or Hostname>")
291
- begin
292
- addr = parameters[0].upcase
293
- if addr == 'ALL'
294
- all_allowed = true
295
- acl_list = []
296
- end
297
-
298
- unless all_allowed
299
- first_char = addr[0..0]
300
- if !((first_char =~ /[1234567890]/) or (first_char == '*') or (addr.upcase == 'ALL'))
301
- # Try to lookup IP Address
302
- info = Socket.gethostbyname(addr)
303
- addr = "#{info[3].getbyte(0)}.#{info[3].getbyte(1)}.#{info[3].getbyte(2)}.#{info[3].getbyte(3)}"
304
- if (acl_list.empty?)
305
- acl_list << 'allow'
306
- acl_list << '127.0.0.1'
307
- end
308
- acl_list << 'allow'
309
- acl_list << addr
310
- else
311
- raise "badly formatted address #{addr}" unless /\b(?:\d{1,3}\.){3}\d{1,3}\b/.match(addr)
312
- if (acl_list.empty?)
313
- acl_list << 'allow'
314
- acl_list << '127.0.0.1'
315
- end
316
- acl_list << 'allow'
317
- acl_list << addr
318
- end
319
- end
320
- rescue => err
321
- raise parser.error("Problem with ALLOW_ACCESS due to #{err.message.strip}")
322
- end
323
-
324
- when 'STALENESS_SECONDS'
325
- parser.verify_num_parameters(1, 1, "#{keyword} <Value in Seconds>")
326
- @staleness_seconds = Integer(parameters[0])
327
-
328
- when 'CMD_TLM_VERSION'
329
- usage = "#{keyword} <VERSION>"
330
- parser.verify_num_parameters(1, 1, usage)
331
- @cmd_tlm_version = parameters[0]
332
-
333
- else
334
- # blank lines will have a nil keyword and should not raise an exception
335
- raise parser.error("Unknown keyword '#{keyword}'") if keyword
336
- end # case keyword
337
- end # parser.parse_file
338
-
339
- @acl = ACL.new(acl_list, ACL::ALLOW_DENY) unless acl_list.empty?
340
-
341
- # Second pass - Process targets
342
- process_targets(parser, filename, configuration_directory)
343
-
344
- end # Cosmos.set_working_dir
345
- end # def process_file
346
-
347
- # Parse the system.txt configuration file looking for keywords associated
348
- # with targets and create all the Target instances in the system.
349
- #
350
- # @param parser [ConfigParser] Parser created by process_file
351
- # @param filename (see #process_file)
352
- # @param configuration_directory (see #process_file)
353
- def process_targets(parser, filename, configuration_directory)
354
- parser.parse_file(filename) do |keyword, parameters|
355
- case keyword
356
- when 'AUTO_DECLARE_TARGETS'
357
- usage = "#{keyword}"
358
- parser.verify_num_parameters(0, 0, usage)
359
- path = File.join(USERPATH, 'config', 'targets')
360
- unless File.exist? path
361
- raise parser.error("#{path} must exist", usage)
362
- end
363
- system_found = false
364
- dirs = []
365
- Dir.foreach(File.join(USERPATH, 'config', 'targets')) { |dir_filename| dirs << dir_filename }
366
- dirs.sort!
367
- dirs.each do |dir_filename|
368
- if dir_filename[0] != '.'
369
- if dir_filename == dir_filename.upcase
370
- if dir_filename == 'SYSTEM'
371
- system_found = true
372
- next
373
- end
374
- target = Target.new(dir_filename)
375
- @targets[target.name] = target
376
- else
377
- raise parser.error("Target folder must be uppercase: '#{dir_filename}'")
378
- end
379
- end
380
- end
381
-
382
- auto_detect_gem_based_targets()
383
-
384
- if system_found
385
- target = Target.new('SYSTEM')
386
- @targets[target.name] = target
387
- end
388
-
389
- when 'DECLARE_TARGET'
390
- usage = "#{keyword} <TARGET NAME> <SUBSTITUTE TARGET NAME (Optional)> <TARGET FILENAME (Optional - defaults to target.txt)>"
391
- parser.verify_num_parameters(1, 3, usage)
392
- target_name = parameters[0].to_s.upcase
393
- substitute_name = nil
394
- substitute_name = ConfigParser.handle_nil(parameters[1])
395
- substitute_name.to_s.upcase if substitute_name
396
- if configuration_directory
397
- folder_name = File.join(configuration_directory, target_name)
398
- else
399
- folder_name = File.join(USERPATH, 'config', 'targets', target_name)
400
- end
401
- unless Dir.exist?(folder_name)
402
- raise parser.error("Target folder must exist '#{folder_name}'.")
403
- end
404
- target = Target.new(target_name, substitute_name, configuration_directory, ConfigParser.handle_nil(parameters[2]))
405
- @targets[target.name] = target
406
-
407
- when 'DECLARE_GEM_TARGET'
408
- usage = "#{keyword} <GEM NAME> <SUBSTITUTE TARGET NAME (Optional)> <TARGET FILENAME (Optional - defaults to target.txt)>"
409
- parser.verify_num_parameters(1, 3, usage)
410
- # Remove 'cosmos' from the gem name 'cosmos-power-supply'
411
- target_name = parameters[0].split('-')[1..-1].join('-').to_s.upcase
412
- substitute_name = nil
413
- substitute_name = ConfigParser.handle_nil(parameters[1])
414
- substitute_name.to_s.upcase if substitute_name
415
- gem_dir = Gem::Specification.find_by_name(parameters[0]).gem_dir
416
- target = Target.new(target_name, substitute_name, configuration_directory, ConfigParser.handle_nil(parameters[2]), gem_dir)
417
- @targets[target.name] = target
418
-
419
- end # case keyword
420
- end # parser.parse_file
421
- end
422
-
423
- # Load the specified configuration by iterating through the SAVED_CONFIG
424
- # directory looking for a matching MD5 sum. Updates the internal state so
425
- # subsequent commands and telemetry methods return the new configuration.
426
- #
427
- # @param name [String] MD5 string which identifies the
428
- # configuration. Pass nil to load the default configuration.
429
- # @return [String, Exception/nil] The actual configuration loaded
430
- def load_configuration(name = nil)
431
- if name and @config
432
- # Make sure they're requesting something other than the current
433
- # configuration.
434
- if name != @config.name
435
- # If they want the initial configuration we can just swap out the
436
- # current configuration without doing any file processing
437
- if name == @initial_config.name
438
- update_config(@initial_config)
439
- else
440
- # Look for the requested configuration in the saved configurations
441
- configuration_directory = find_configuration(name)
442
- if configuration_directory
443
- # We found the configuration requested. Reprocess the system.txt
444
- # and reload the packets
445
- begin
446
- process_file(File.join(configuration_directory, 'system.txt'), configuration_directory)
447
- load_packets(name)
448
- rescue Exception => error
449
- # Failed to load - Restore initial
450
- update_config(@initial_config)
451
- return @config.name, error
452
- end
453
- else
454
- # We couldn't find the configuration request. Reload the
455
- # initial configuration
456
- update_config(@initial_config)
457
- end
458
- end
459
- end
460
- else
461
- # Ensure packets have been lazy loaded
462
- System.commands
463
- update_config(@initial_config)
464
- end
465
- return @config.name, nil
466
- end
467
-
468
- # (see #load_configuration)
469
- def self.load_configuration(name = nil)
470
- return self.instance.load_configuration(name)
471
- end
472
-
473
- protected
474
-
475
- def auto_detect_gem_based_targets
476
- Bundler.load.specs.each do |spec|
477
- spec_name_split = spec.name.split('-')
478
- if spec_name_split.length > 1 and spec_name_split[0] == 'cosmos'
479
- # Filter to just targets and not tools and other extensions
480
- if File.exist?(File.join(spec.gem_dir, 'cmd_tlm'))
481
- target_name = spec_name_split[1..-1].join('-').to_s.upcase
482
- target = Target.new(target_name, nil, nil, nil, spec.gem_dir)
483
- @targets[target.name] = target
484
- end
485
- end
486
- end
487
- rescue Bundler::GemfileNotFound
488
- # No Gemfile - so no gem based targets
489
- end
490
-
491
- def update_config(config)
492
- current_config = @config
493
- unless @config
494
- @config = config
495
- @commands = Commands.new(config)
496
- @telemetry = Telemetry.new(config)
497
- @limits = Limits.new(config)
498
- else
499
- @config = config
500
- @commands.config = config
501
- @telemetry.config = config
502
- @limits.config = config
503
- end
504
- @telemetry.reset if current_config != config
505
- end
506
-
507
- def find_configuration(name)
508
- Cosmos.set_working_dir do
509
- Dir.foreach(@paths['SAVED_CONFIG']) do |filename|
510
- full_path = File.join(@paths['SAVED_CONFIG'], filename)
511
- if Dir.exist?(full_path) and filename[-32..-1] == name
512
- return full_path
513
- end
514
- end
515
- end
516
- nil
517
- end
518
-
519
- def save_configuration
520
- Cosmos.set_working_dir do
521
- configuration_directory = find_configuration(@config.name)
522
- configuration_directory = File.join(@paths['SAVED_CONFIG'], File.build_timestamped_filename([@config.name], '')) unless configuration_directory
523
- unless Dir.exist?(configuration_directory)
524
- begin
525
- # Create the directory
526
- FileUtils.mkdir_p(configuration_directory)
527
-
528
- # Copy target files into directory
529
- @targets.each do |target_name, target|
530
- destination_dir = File.join(configuration_directory, target.original_name)
531
- unless Dir.exist?(destination_dir)
532
- FileUtils.cp_r(target.dir, destination_dir)
533
- end
534
- end
535
-
536
- # Create custom system.txt file
537
- File.open(File.join(configuration_directory, 'system.txt'), 'w') do |file|
538
- @targets.each do |target_name, target|
539
- target_filename = File.basename(target.filename)
540
- target_filename = nil unless File.exist?(target.filename)
541
- if target.substitute
542
- file.puts "DECLARE_TARGET #{target.original_name} #{target.name} #{target_filename}"
543
- else
544
- file.puts "DECLARE_TARGET #{target.name} nil #{target_filename}"
545
- end
546
- end
547
- end
548
- rescue Exception => error
549
- Logger.error "Problem saving configuration to #{configuration_directory}: #{error.class}:#{error.message}"
550
- end
551
- end
552
- end
553
- end
554
-
555
- def load_packets(configuration_name = nil)
556
- # Determine MD5 over all targets cmd_tlm files
557
- cmd_tlm_files = []
558
- additional_data = ''
559
- @targets.each do |target_name, target|
560
- cmd_tlm_files << target.filename if File.exist?(target.filename)
561
- cmd_tlm_files.concat(target.cmd_tlm_files)
562
- if target.substitute
563
- additional_data << target.original_name
564
- additional_data << target.name
565
- else
566
- additional_data << target.original_name
567
- end
568
- end
569
-
570
- md5 = Cosmos.md5_files(cmd_tlm_files, additional_data)
571
- md5_string = md5.hexdigest
572
-
573
- # Build filename for marshal file
574
- marshal_filename = File.join(@paths['TMP'], 'marshal_' << md5_string << '.bin')
575
-
576
- # Attempt to load marshal file
577
- config = Cosmos.marshal_load(marshal_filename)
578
- if config
579
- update_config(config)
580
- @config.name = configuration_name if configuration_name
581
-
582
- # Marshal file load successful
583
- Logger.info "Marshal load success: #{marshal_filename}"
584
- @config.warnings.each {|warning| Logger.warn(warning)} if @config.warnings
585
- else
586
- # Marshal file load failed - Manually load configuration
587
- @config = PacketConfig.new
588
- @commands = Commands.new(@config)
589
- @telemetry = Telemetry.new(@config)
590
- @limits = Limits.new(@config)
591
-
592
- @targets.each do |target_name, target|
593
- target.cmd_tlm_files.each do |cmd_tlm_file|
594
- begin
595
- @config.process_file(cmd_tlm_file, target.name)
596
- rescue Exception => err
597
- Logger.error "Problem processing #{cmd_tlm_file}."
598
- raise err
599
- end
600
- end
601
- end
602
-
603
- # Create marshal file for next time
604
- if configuration_name
605
- @config.name = configuration_name
606
- else
607
- @config.name = md5_string
608
- end
609
- Cosmos.marshal_dump(marshal_filename, @config)
610
- end
611
-
612
- @initial_config = @config unless @initial_config
613
- save_configuration()
614
- end
615
-
616
- end # class System
617
-
618
- 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/config/config_parser'
12
+ require 'cosmos/packets/packet_config'
13
+ require 'cosmos/packets/commands'
14
+ require 'cosmos/packets/telemetry'
15
+ require 'cosmos/packets/limits'
16
+ require 'cosmos/system/target'
17
+ require 'cosmos/packet_logs'
18
+ require 'fileutils'
19
+ require 'drb/acl'
20
+ require 'bundler'
21
+
22
+ module Cosmos
23
+
24
+ # System is the primary entry point into the COSMOS framework. It captures
25
+ # system wide configuration items such as the available ports and paths to
26
+ # various files used by the system. The #commands, #telemetry, and #limits
27
+ # class variables are the primary access points for applications. The
28
+ # #targets variable provides access to all the targets defined by the system.
29
+ # Its primary responsibily is to load the system configuration file and
30
+ # create all the Target instances. It also saves and restores configurations
31
+ # using a MD5 checksum over the entire configuration to detect changes.
32
+ class System
33
+ # @return [Hash<String,Fixnum>] Hash of all the known ports and their values
34
+ instance_attr_reader :ports
35
+ # @return [Hash<String,String>] Hash of all the known paths and their values
36
+ instance_attr_reader :paths
37
+ # @return [String] Arbitrary string containing the version
38
+ instance_attr_reader :cmd_tlm_version
39
+ # @return [PacketLogWriter] Class used to create log files
40
+ instance_attr_reader :default_packet_log_writer
41
+ # @return [PacketLogReader] Class used to read log files
42
+ instance_attr_reader :default_packet_log_reader
43
+ # @return [Boolean] Whether to use sound for alerts
44
+ instance_attr_reader :sound
45
+ # @return [Boolean] Whether to use DNS to lookup IP addresses or not
46
+ instance_attr_reader :use_dns
47
+ # @return [String] Stores the initial configuration file used when this
48
+ # System was initialized
49
+ instance_attr_reader :initial_filename
50
+ # @return [PacketDefinition] Stores the initial packet list used when this
51
+ # System was initialized
52
+ instance_attr_reader :initial_config
53
+ # @return [ACL] Access control list showing which machines can have access
54
+ instance_attr_reader :acl
55
+ # @return [Hash<String,Target>] Hash of all the known targets
56
+ instance_attr_reader :targets
57
+ # @return [Integer] The number of seconds before a telemetry packet is considered stale
58
+ instance_attr_reader :staleness_seconds
59
+ # @return [Symbol] The current limits set
60
+ instance_attr_reader :limits_set
61
+
62
+ # Known COSMOS ports
63
+ KNOWN_PORTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED']
64
+ # Known COSMOS paths
65
+ KNOWN_PATHS = ['LOGS', 'TMP', 'SAVED_CONFIG', 'TABLES', 'HANDBOOKS', 'PROCEDURES']
66
+
67
+ @@instance = nil
68
+ @@instance_mutex = Mutex.new
69
+
70
+ # Create a new System object. Note, this should not be called directly but
71
+ # you should instead use System.instance and treat this class as a
72
+ # singleton.
73
+ #
74
+ # @param filename [String] Full path to the system configuration file to
75
+ # read. Be default this is <Cosmos::USERPATH>/config/system/system.txt
76
+ def initialize(filename = nil)
77
+ raise "Cosmos::System created twice" unless @@instance.nil?
78
+ @targets = {}
79
+ @targets['UNKNOWN'] = Target.new('UNKNOWN')
80
+ @config = nil
81
+ @commands = nil
82
+ @telemetry = nil
83
+ @limits = nil
84
+ @cmd_tlm_version = nil
85
+ @default_packet_log_writer = PacketLogWriter
86
+ @default_packet_log_reader = PacketLogReader
87
+ @sound = false
88
+ @use_dns = false
89
+ @acl = nil
90
+ @staleness_seconds = 30
91
+ @limits_set = :DEFAULT
92
+
93
+ @ports = {}
94
+ @ports['CTS_API'] = 7777
95
+ @ports['TLMVIEWER_API'] = 7778
96
+ @ports['CTS_PREIDENTIFIED'] = 7779
97
+
98
+ @paths = {}
99
+ @paths['LOGS'] = File.join(USERPATH, 'outputs', 'logs')
100
+ @paths['TMP'] = File.join(USERPATH, 'outputs', 'tmp')
101
+ @paths['SAVED_CONFIG'] = File.join(USERPATH, 'outputs', 'saved_config')
102
+ @paths['TABLES'] = File.join(USERPATH, 'outputs', 'tables')
103
+ @paths['HANDBOOKS'] = File.join(USERPATH, 'outputs', 'handbooks')
104
+ @paths['PROCEDURES'] = [File.join(USERPATH, 'procedures')]
105
+
106
+ unless filename
107
+ system_arg = false
108
+ ARGV.each do |arg|
109
+ if system_arg
110
+ filename = File.join(USERPATH, 'config', 'system', arg)
111
+ break
112
+ end
113
+ system_arg = true if arg == '--system'
114
+ end
115
+ filename = File.join(USERPATH, 'config', 'system', 'system.txt') unless filename
116
+ end
117
+ process_file(filename)
118
+ ENV['COSMOS_LOGS_DIR'] = @paths['LOGS']
119
+
120
+ @initial_filename = filename
121
+ @initial_config = nil
122
+ @@instance = self
123
+ end
124
+
125
+ # @return [String] Configuration name
126
+ def self.configuration_name
127
+ # In order not to make the @config instance variable accessable to the
128
+ # outside (using a regular accessor method) we use the ability of the
129
+ # object to grab its own instance variable
130
+ self.instance.instance_variable_get(:@config).name
131
+ end
132
+
133
+ # Clear the command and telemetry counters for all the targets as well as
134
+ # the counters associated with the Commands and Telemetry instances
135
+ def self.clear_counters
136
+ self.instance.targets.each do |target_name, target|
137
+ target.cmd_cnt = 0
138
+ target.tlm_cnt = 0
139
+ end
140
+ self.instance.telemetry.clear_counters
141
+ self.instance.commands.clear_counters
142
+ end
143
+
144
+ # @return [Commands] Access to the command definiton
145
+ def commands
146
+ load_packets() unless @config
147
+ return @commands
148
+ end
149
+
150
+ # (see #commands)
151
+ def self.commands
152
+ return self.instance.commands
153
+ end
154
+
155
+ # @return [Telemetry] Access to the telemetry definition
156
+ def telemetry
157
+ load_packets() unless @config
158
+ return @telemetry
159
+ end
160
+
161
+ # (see #telemetry)
162
+ def self.telemetry
163
+ return self.instance.telemetry
164
+ end
165
+
166
+ # @return [Limits] Access to the limits definition
167
+ def limits
168
+ load_packets() unless @config
169
+ return @limits
170
+ end
171
+
172
+ # (see #limits)
173
+ def self.limits
174
+ return self.instance.limits
175
+ end
176
+
177
+ # Change the system limits set
178
+ #
179
+ # @param [Symbol] The name of the limits set. :DEFAULT is always an option
180
+ # but limits sets are user defined
181
+ def limits_set=(limits_set)
182
+ load_packets() unless @config
183
+ new_limits_set = limits_set.to_s.upcase.intern
184
+ if @limits_set != new_limits_set
185
+ if @config.limits_sets.include?(new_limits_set)
186
+ @limits_set = new_limits_set
187
+ Logger.info("Limits Set Changed to: #{@limits_set}")
188
+ CmdTlmServer.instance.post_limits_event(:LIMITS_SET, System.limits_set) if defined? CmdTlmServer and CmdTlmServer.instance
189
+ else
190
+ raise "Unknown limits set requested: #{new_limits_set}"
191
+ end
192
+ end
193
+ end
194
+
195
+ # (see #limits_set=)
196
+ def self.limits_set=(limits_set)
197
+ self.instance.limits_set = limits_set
198
+ end
199
+
200
+ # @return [System] The System singleton
201
+ def self.instance(filename = nil)
202
+ return @@instance if @@instance
203
+ @@instance_mutex.synchronize do
204
+ @@instance ||= self.new(filename)
205
+ return @@instance
206
+ end
207
+ end
208
+
209
+ # Process the system.txt configuration file
210
+ #
211
+ # @param filename [String] The configuration file
212
+ # @param configuration_directory [String] The configuration directory to
213
+ # search for the target command and telemetry files. Pass nil to look in
214
+ # the default location of <USERPATH>/config/targets.
215
+ def process_file(filename, configuration_directory = nil)
216
+ @targets = {}
217
+ # Set config to nil so things will lazy load later
218
+ @config = nil
219
+ acl_list = []
220
+ all_allowed = false
221
+ first_procedures_path = true
222
+
223
+ Cosmos.set_working_dir do
224
+ parser = ConfigParser.new
225
+
226
+ # First pass - Everything except targets
227
+ parser.parse_file(filename) do |keyword, parameters|
228
+ case keyword
229
+ when 'AUTO_DECLARE_TARGETS', 'DECLARE_TARGET', 'DECLARE_GEM_TARGET'
230
+ # Will be handled by second pass
231
+
232
+ when 'PORT'
233
+ usage = "#{keyword} <PORT NAME> <PORT VALUE>"
234
+ parser.verify_num_parameters(2, 2, usage)
235
+ port_name = parameters[0].to_s.upcase
236
+ @ports[port_name] = Integer(parameters[1])
237
+ Logger.warn("Unknown port name given: #{port_name}") unless KNOWN_PORTS.include?(port_name)
238
+
239
+ when 'PATH'
240
+ usage = "#{keyword} <PATH NAME> <PATH>"
241
+ parser.verify_num_parameters(2, 2, usage)
242
+ path_name = parameters[0].to_s.upcase
243
+ path = File.expand_path(parameters[1])
244
+ if path_name == 'PROCEDURES'
245
+ if first_procedures_path
246
+ @paths[path_name] = []
247
+ first_procedures_path = false
248
+ end
249
+ @paths[path_name] << path
250
+ else
251
+ @paths[path_name] = path
252
+ end
253
+ unless Dir.exist?(path)
254
+ begin
255
+ FileUtils.mkdir_p(path)
256
+ raise "Path creation failed: #{path}" unless File.exist?(path)
257
+ Logger.info "Created PATH #{path_name} #{path}"
258
+ rescue Exception => err
259
+ Logger.error "Problem creating PATH #{path_name} #{path}\n#{err.formatted}"
260
+ end
261
+ end
262
+ Logger.warn("Unknown path name given: #{path_name}") unless KNOWN_PATHS.include?(path_name)
263
+
264
+ when 'DEFAULT_PACKET_LOG_WRITER'
265
+ usage = "#{keyword} <FILENAME>"
266
+ parser.verify_num_parameters(1, 1, usage)
267
+ @default_packet_log_writer = Cosmos.require_class(parameters[0])
268
+
269
+ when 'DEFAULT_PACKET_LOG_READER'
270
+ usage = "#{keyword} <FILENAME>"
271
+ parser.verify_num_parameters(1, 1, usage)
272
+ @default_packet_log_reader = Cosmos.require_class(parameters[0])
273
+
274
+ when 'ENABLE_SOUND'
275
+ usage = "#{keyword}"
276
+ parser.verify_num_parameters(0, 0, usage)
277
+ @sound = true
278
+
279
+ when 'DISABLE_DNS'
280
+ usage = "#{keyword}"
281
+ parser.verify_num_parameters(0, 0, usage)
282
+ @use_dns = false
283
+
284
+ when 'ENABLE_DNS'
285
+ usage = "#{keyword}"
286
+ parser.verify_num_parameters(0, 0, usage)
287
+ @use_dns = true
288
+
289
+ when 'ALLOW_ACCESS'
290
+ parser.verify_num_parameters(1, 1, "#{keyword} <IP Address or Hostname>")
291
+ begin
292
+ addr = parameters[0].upcase
293
+ if addr == 'ALL'
294
+ all_allowed = true
295
+ acl_list = []
296
+ end
297
+
298
+ unless all_allowed
299
+ first_char = addr[0..0]
300
+ if !((first_char =~ /[1234567890]/) or (first_char == '*') or (addr.upcase == 'ALL'))
301
+ # Try to lookup IP Address
302
+ info = Socket.gethostbyname(addr)
303
+ addr = "#{info[3].getbyte(0)}.#{info[3].getbyte(1)}.#{info[3].getbyte(2)}.#{info[3].getbyte(3)}"
304
+ if (acl_list.empty?)
305
+ acl_list << 'allow'
306
+ acl_list << '127.0.0.1'
307
+ end
308
+ acl_list << 'allow'
309
+ acl_list << addr
310
+ else
311
+ raise "badly formatted address #{addr}" unless /\b(?:\d{1,3}\.){3}\d{1,3}\b/.match(addr)
312
+ if (acl_list.empty?)
313
+ acl_list << 'allow'
314
+ acl_list << '127.0.0.1'
315
+ end
316
+ acl_list << 'allow'
317
+ acl_list << addr
318
+ end
319
+ end
320
+ rescue => err
321
+ raise parser.error("Problem with ALLOW_ACCESS due to #{err.message.strip}")
322
+ end
323
+
324
+ when 'STALENESS_SECONDS'
325
+ parser.verify_num_parameters(1, 1, "#{keyword} <Value in Seconds>")
326
+ @staleness_seconds = Integer(parameters[0])
327
+
328
+ when 'CMD_TLM_VERSION'
329
+ usage = "#{keyword} <VERSION>"
330
+ parser.verify_num_parameters(1, 1, usage)
331
+ @cmd_tlm_version = parameters[0]
332
+
333
+ else
334
+ # blank lines will have a nil keyword and should not raise an exception
335
+ raise parser.error("Unknown keyword '#{keyword}'") if keyword
336
+ end # case keyword
337
+ end # parser.parse_file
338
+
339
+ @acl = ACL.new(acl_list, ACL::ALLOW_DENY) unless acl_list.empty?
340
+
341
+ # Second pass - Process targets
342
+ process_targets(parser, filename, configuration_directory)
343
+
344
+ end # Cosmos.set_working_dir
345
+ end # def process_file
346
+
347
+ # Parse the system.txt configuration file looking for keywords associated
348
+ # with targets and create all the Target instances in the system.
349
+ #
350
+ # @param parser [ConfigParser] Parser created by process_file
351
+ # @param filename (see #process_file)
352
+ # @param configuration_directory (see #process_file)
353
+ def process_targets(parser, filename, configuration_directory)
354
+ parser.parse_file(filename) do |keyword, parameters|
355
+ case keyword
356
+ when 'AUTO_DECLARE_TARGETS'
357
+ usage = "#{keyword}"
358
+ parser.verify_num_parameters(0, 0, usage)
359
+ path = File.join(USERPATH, 'config', 'targets')
360
+ unless File.exist? path
361
+ raise parser.error("#{path} must exist", usage)
362
+ end
363
+ system_found = false
364
+ dirs = []
365
+ Dir.foreach(File.join(USERPATH, 'config', 'targets')) { |dir_filename| dirs << dir_filename }
366
+ dirs.sort!
367
+ dirs.each do |dir_filename|
368
+ if dir_filename[0] != '.'
369
+ if dir_filename == dir_filename.upcase
370
+ if dir_filename == 'SYSTEM'
371
+ system_found = true
372
+ next
373
+ end
374
+ target = Target.new(dir_filename)
375
+ @targets[target.name] = target
376
+ else
377
+ raise parser.error("Target folder must be uppercase: '#{dir_filename}'")
378
+ end
379
+ end
380
+ end
381
+
382
+ auto_detect_gem_based_targets()
383
+
384
+ if system_found
385
+ target = Target.new('SYSTEM')
386
+ @targets[target.name] = target
387
+ end
388
+
389
+ when 'DECLARE_TARGET'
390
+ usage = "#{keyword} <TARGET NAME> <SUBSTITUTE TARGET NAME (Optional)> <TARGET FILENAME (Optional - defaults to target.txt)>"
391
+ parser.verify_num_parameters(1, 3, usage)
392
+ target_name = parameters[0].to_s.upcase
393
+ substitute_name = nil
394
+ substitute_name = ConfigParser.handle_nil(parameters[1])
395
+ substitute_name.to_s.upcase if substitute_name
396
+ if configuration_directory
397
+ folder_name = File.join(configuration_directory, target_name)
398
+ else
399
+ folder_name = File.join(USERPATH, 'config', 'targets', target_name)
400
+ end
401
+ unless Dir.exist?(folder_name)
402
+ raise parser.error("Target folder must exist '#{folder_name}'.")
403
+ end
404
+ target = Target.new(target_name, substitute_name, configuration_directory, ConfigParser.handle_nil(parameters[2]))
405
+ @targets[target.name] = target
406
+
407
+ when 'DECLARE_GEM_TARGET'
408
+ usage = "#{keyword} <GEM NAME> <SUBSTITUTE TARGET NAME (Optional)> <TARGET FILENAME (Optional - defaults to target.txt)>"
409
+ parser.verify_num_parameters(1, 3, usage)
410
+ # Remove 'cosmos' from the gem name 'cosmos-power-supply'
411
+ target_name = parameters[0].split('-')[1..-1].join('-').to_s.upcase
412
+ substitute_name = nil
413
+ substitute_name = ConfigParser.handle_nil(parameters[1])
414
+ substitute_name.to_s.upcase if substitute_name
415
+ gem_dir = Gem::Specification.find_by_name(parameters[0]).gem_dir
416
+ target = Target.new(target_name, substitute_name, configuration_directory, ConfigParser.handle_nil(parameters[2]), gem_dir)
417
+ @targets[target.name] = target
418
+
419
+ end # case keyword
420
+ end # parser.parse_file
421
+ end
422
+
423
+ # Load the specified configuration by iterating through the SAVED_CONFIG
424
+ # directory looking for a matching MD5 sum. Updates the internal state so
425
+ # subsequent commands and telemetry methods return the new configuration.
426
+ #
427
+ # @param name [String] MD5 string which identifies the
428
+ # configuration. Pass nil to load the default configuration.
429
+ # @return [String, Exception/nil] The actual configuration loaded
430
+ def load_configuration(name = nil)
431
+ if name and @config
432
+ # Make sure they're requesting something other than the current
433
+ # configuration.
434
+ if name != @config.name
435
+ # If they want the initial configuration we can just swap out the
436
+ # current configuration without doing any file processing
437
+ if name == @initial_config.name
438
+ update_config(@initial_config)
439
+ else
440
+ # Look for the requested configuration in the saved configurations
441
+ configuration_directory = find_configuration(name)
442
+ if configuration_directory
443
+ # We found the configuration requested. Reprocess the system.txt
444
+ # and reload the packets
445
+ begin
446
+ process_file(File.join(configuration_directory, 'system.txt'), configuration_directory)
447
+ load_packets(name)
448
+ rescue Exception => error
449
+ # Failed to load - Restore initial
450
+ update_config(@initial_config)
451
+ return @config.name, error
452
+ end
453
+ else
454
+ # We couldn't find the configuration request. Reload the
455
+ # initial configuration
456
+ update_config(@initial_config)
457
+ end
458
+ end
459
+ end
460
+ else
461
+ # Ensure packets have been lazy loaded
462
+ System.commands
463
+ update_config(@initial_config)
464
+ end
465
+ return @config.name, nil
466
+ end
467
+
468
+ # (see #load_configuration)
469
+ def self.load_configuration(name = nil)
470
+ return self.instance.load_configuration(name)
471
+ end
472
+
473
+ protected
474
+
475
+ def auto_detect_gem_based_targets
476
+ Bundler.load.specs.each do |spec|
477
+ spec_name_split = spec.name.split('-')
478
+ if spec_name_split.length > 1 and spec_name_split[0] == 'cosmos'
479
+ # Filter to just targets and not tools and other extensions
480
+ if File.exist?(File.join(spec.gem_dir, 'cmd_tlm'))
481
+ target_name = spec_name_split[1..-1].join('-').to_s.upcase
482
+ target = Target.new(target_name, nil, nil, nil, spec.gem_dir)
483
+ @targets[target.name] = target
484
+ end
485
+ end
486
+ end
487
+ rescue Bundler::GemfileNotFound
488
+ # No Gemfile - so no gem based targets
489
+ end
490
+
491
+ def update_config(config)
492
+ current_config = @config
493
+ unless @config
494
+ @config = config
495
+ @commands = Commands.new(config)
496
+ @telemetry = Telemetry.new(config)
497
+ @limits = Limits.new(config)
498
+ else
499
+ @config = config
500
+ @commands.config = config
501
+ @telemetry.config = config
502
+ @limits.config = config
503
+ end
504
+ @telemetry.reset if current_config != config
505
+ end
506
+
507
+ def find_configuration(name)
508
+ Cosmos.set_working_dir do
509
+ Dir.foreach(@paths['SAVED_CONFIG']) do |filename|
510
+ full_path = File.join(@paths['SAVED_CONFIG'], filename)
511
+ if Dir.exist?(full_path) and filename[-32..-1] == name
512
+ return full_path
513
+ end
514
+ end
515
+ end
516
+ nil
517
+ end
518
+
519
+ def save_configuration
520
+ Cosmos.set_working_dir do
521
+ configuration_directory = find_configuration(@config.name)
522
+ configuration_directory = File.join(@paths['SAVED_CONFIG'], File.build_timestamped_filename([@config.name], '')) unless configuration_directory
523
+ unless Dir.exist?(configuration_directory)
524
+ begin
525
+ # Create the directory
526
+ FileUtils.mkdir_p(configuration_directory)
527
+
528
+ # Copy target files into directory
529
+ @targets.each do |target_name, target|
530
+ destination_dir = File.join(configuration_directory, target.original_name)
531
+ unless Dir.exist?(destination_dir)
532
+ FileUtils.cp_r(target.dir, destination_dir)
533
+ end
534
+ end
535
+
536
+ # Create custom system.txt file
537
+ File.open(File.join(configuration_directory, 'system.txt'), 'w') do |file|
538
+ @targets.each do |target_name, target|
539
+ target_filename = File.basename(target.filename)
540
+ target_filename = nil unless File.exist?(target.filename)
541
+ if target.substitute
542
+ file.puts "DECLARE_TARGET #{target.original_name} #{target.name} #{target_filename}"
543
+ else
544
+ file.puts "DECLARE_TARGET #{target.name} nil #{target_filename}"
545
+ end
546
+ end
547
+ end
548
+ rescue Exception => error
549
+ Logger.error "Problem saving configuration to #{configuration_directory}: #{error.class}:#{error.message}"
550
+ end
551
+ end
552
+ end
553
+ end
554
+
555
+ def load_packets(configuration_name = nil)
556
+ # Determine MD5 over all targets cmd_tlm files
557
+ cmd_tlm_files = []
558
+ additional_data = ''
559
+ @targets.each do |target_name, target|
560
+ cmd_tlm_files << target.filename if File.exist?(target.filename)
561
+ cmd_tlm_files.concat(target.cmd_tlm_files)
562
+ if target.substitute
563
+ additional_data << target.original_name
564
+ additional_data << target.name
565
+ else
566
+ additional_data << target.original_name
567
+ end
568
+ end
569
+
570
+ md5 = Cosmos.md5_files(cmd_tlm_files, additional_data)
571
+ md5_string = md5.hexdigest
572
+
573
+ # Build filename for marshal file
574
+ marshal_filename = File.join(@paths['TMP'], 'marshal_' << md5_string << '.bin')
575
+
576
+ # Attempt to load marshal file
577
+ config = Cosmos.marshal_load(marshal_filename)
578
+ if config
579
+ update_config(config)
580
+ @config.name = configuration_name if configuration_name
581
+
582
+ # Marshal file load successful
583
+ Logger.info "Marshal load success: #{marshal_filename}"
584
+ @config.warnings.each {|warning| Logger.warn(warning)} if @config.warnings
585
+ else
586
+ # Marshal file load failed - Manually load configuration
587
+ @config = PacketConfig.new
588
+ @commands = Commands.new(@config)
589
+ @telemetry = Telemetry.new(@config)
590
+ @limits = Limits.new(@config)
591
+
592
+ @targets.each do |target_name, target|
593
+ target.cmd_tlm_files.each do |cmd_tlm_file|
594
+ begin
595
+ @config.process_file(cmd_tlm_file, target.name)
596
+ rescue Exception => err
597
+ Logger.error "Problem processing #{cmd_tlm_file}."
598
+ raise err
599
+ end
600
+ end
601
+ end
602
+
603
+ # Create marshal file for next time
604
+ if configuration_name
605
+ @config.name = configuration_name
606
+ else
607
+ @config.name = md5_string
608
+ end
609
+ Cosmos.marshal_dump(marshal_filename, @config)
610
+ end
611
+
612
+ @initial_config = @config unless @initial_config
613
+ save_configuration()
614
+ end
615
+
616
+ end # class System
617
+
618
+ end # module Cosmos