cosmos 3.0.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (912) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +48 -48
  4. data/.travis.yml +7 -7
  5. data/CONTRIBUTING.txt +50 -50
  6. data/Gemfile +6 -6
  7. data/Guardfile +27 -27
  8. data/LICENSE.txt +879 -879
  9. data/Manifest.txt +1116 -1114
  10. data/README.md +109 -107
  11. data/Rakefile +214 -214
  12. data/autohotkey/config/data/diamond.STL +57 -57
  13. data/autohotkey/config/system/system.txt +34 -34
  14. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  17. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  18. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  20. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  21. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  22. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -294
  23. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  24. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  25. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  26. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  27. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  28. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  29. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  30. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  31. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  32. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  33. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  34. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  37. data/autohotkey/config/targets/INST/target.txt +26 -26
  38. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  40. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  41. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  42. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  43. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  44. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  45. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  46. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  47. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  48. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  49. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  50. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  51. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  52. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  55. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  57. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  58. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  59. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  60. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  61. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  62. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  63. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  64. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  65. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  66. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  67. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  69. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  70. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  71. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  72. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  75. data/autohotkey/lib/example_background_task.rb +42 -42
  76. data/autohotkey/lib/user_version.rb +3 -3
  77. data/autohotkey/procedures/clear_util.rb +7 -7
  78. data/autohotkey/procedures/collect.rb +18 -18
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +20 -20
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/Replay.bat +59 -59
  101. data/autohotkey/tools/ReplayAHK +17 -17
  102. data/autohotkey/tools/ScriptRunner +14 -14
  103. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  104. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  105. data/autohotkey/tools/TableManager +14 -14
  106. data/autohotkey/tools/TableManagerAHK +30 -30
  107. data/autohotkey/tools/TestRunner +15 -15
  108. data/autohotkey/tools/TestRunnerAHK +17 -17
  109. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  112. data/autohotkey/tools/TlmExtractor +15 -15
  113. data/autohotkey/tools/TlmExtractorAHK +19 -19
  114. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  115. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  116. data/autohotkey/tools/TlmGrapher +14 -14
  117. data/autohotkey/tools/TlmGrapherAHK +19 -19
  118. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  119. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  120. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  121. data/autohotkey/tools/TlmViewer +14 -14
  122. data/autohotkey/tools/TlmViewerAHK +28 -28
  123. data/autohotkey/tools/TlmViewerAHK2 +18 -18
  124. data/autohotkey/tools/TlmViewerAHK3 +18 -18
  125. data/autohotkey/tools/TlmViewerAHK4 +18 -18
  126. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  127. data/autohotkey/tools/autohotkey.rb +37 -37
  128. data/autohotkey/tools/cmd_extractor.ahk +27 -27
  129. data/autohotkey/tools/cmd_sender.ahk +182 -162
  130. data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
  131. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  132. data/autohotkey/tools/data_viewer.ahk +135 -135
  133. data/autohotkey/tools/handbook_creator.ahk +23 -23
  134. data/autohotkey/tools/launcher.ahk +41 -41
  135. data/autohotkey/tools/limits_monitor.ahk +70 -70
  136. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  137. data/autohotkey/tools/packet_viewer.ahk +143 -143
  138. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  139. data/autohotkey/tools/replay.ahk +98 -98
  140. data/autohotkey/tools/script_runner.ahk +589 -589
  141. data/autohotkey/tools/script_runner2.ahk +34 -31
  142. data/autohotkey/tools/table_manager.ahk +220 -220
  143. data/autohotkey/tools/test_runner.ahk +262 -259
  144. data/autohotkey/tools/test_runner2.ahk +52 -52
  145. data/autohotkey/tools/test_runner3.ahk +13 -13
  146. data/autohotkey/tools/tlm_extractor.ahk +272 -272
  147. data/autohotkey/tools/tlm_grapher.ahk +642 -642
  148. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  149. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  150. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  151. data/autohotkey/tools/tlm_viewer2.ahk +50 -49
  152. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  153. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  154. data/bin/cosmos +96 -96
  155. data/bin/cstol_converter +1166 -1166
  156. data/bin/rubysloc +85 -85
  157. data/cosmos.gemspec +98 -97
  158. data/data/about.txt +4 -4
  159. data/data/crc.txt +306 -305
  160. data/data/diamond.STL +57 -57
  161. data/data/legal.txt +9 -9
  162. data/demo/Gemfile +6 -6
  163. data/demo/Launcher +15 -15
  164. data/demo/Launcher.bat +59 -59
  165. data/demo/Rakefile +61 -61
  166. data/demo/config/data/crc.txt +222 -206
  167. data/demo/config/data/diamond.STL +57 -57
  168. data/demo/config/data/meta_init.txt +4 -4
  169. data/demo/config/system/system.txt +34 -34
  170. data/demo/config/system/system2.txt +33 -33
  171. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  172. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  173. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  174. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  175. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  176. data/demo/config/targets/COSMOS/target.txt +11 -11
  177. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  178. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -3
  179. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  180. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  181. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  182. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  183. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  184. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  185. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  186. data/demo/config/targets/INST/lib/sim_inst.rb +305 -294
  187. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  188. data/demo/config/targets/INST/screens/array.txt +15 -15
  189. data/demo/config/targets/INST/screens/block.txt +8 -8
  190. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  191. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  192. data/demo/config/targets/INST/screens/ground.txt +25 -25
  193. data/demo/config/targets/INST/screens/hs.txt +44 -44
  194. data/demo/config/targets/INST/screens/latest.txt +23 -23
  195. data/demo/config/targets/INST/screens/other.txt +29 -29
  196. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  197. data/demo/config/targets/INST/target.txt +33 -33
  198. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  199. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  200. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  201. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  202. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  203. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -12
  204. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  205. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  206. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +54 -48
  207. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  208. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
  209. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
  210. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  211. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  212. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  213. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  214. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  215. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  216. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  217. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  218. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  219. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  220. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  221. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  222. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  223. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  224. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  225. data/demo/config/tools/launcher/launcher.txt +45 -45
  226. data/demo/config/tools/launcher/launcher2.txt +45 -45
  227. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  228. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  229. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  230. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  231. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  232. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  233. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  234. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  235. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  236. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  237. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  238. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  239. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  240. data/demo/lib/example_background_task.rb +57 -52
  241. data/demo/lib/example_target.rb +113 -108
  242. data/demo/lib/scpi_target.rb +74 -74
  243. data/demo/lib/user_version.rb +3 -3
  244. data/demo/procedures/checks.rb +11 -11
  245. data/demo/procedures/clear_util.rb +7 -7
  246. data/demo/procedures/collect.rb +18 -18
  247. data/demo/procedures/collect_util.rb +14 -14
  248. data/demo/procedures/cosmos_api_test.rb +293 -293
  249. data/demo/procedures/disconnect.rb +29 -29
  250. data/demo/procedures/example_test.rb +182 -182
  251. data/demo/procedures/plot_test.rb +8 -8
  252. data/demo/procedures/run_example_test.rb +3 -3
  253. data/demo/procedures/test.rb +51 -51
  254. data/demo/tools/CmdExtractor +15 -15
  255. data/demo/tools/CmdExtractor.bat +59 -59
  256. data/demo/tools/CmdSender +15 -15
  257. data/demo/tools/CmdSender.bat +59 -59
  258. data/demo/tools/CmdTlmServer +15 -15
  259. data/demo/tools/CmdTlmServer.bat +59 -59
  260. data/demo/tools/DataViewer +15 -15
  261. data/demo/tools/DataViewer.bat +59 -59
  262. data/demo/tools/ExampleTarget +15 -15
  263. data/demo/tools/ExampleTarget.bat +59 -59
  264. data/demo/tools/HandbookCreator +15 -15
  265. data/demo/tools/HandbookCreator.bat +61 -61
  266. data/demo/tools/Launcher +15 -15
  267. data/demo/tools/Launcher.bat +59 -59
  268. data/demo/tools/LimitsMonitor +15 -15
  269. data/demo/tools/LimitsMonitor.bat +59 -59
  270. data/demo/tools/OpenGLBuilder +15 -15
  271. data/demo/tools/OpenGLBuilder.bat +59 -59
  272. data/demo/tools/PacketViewer +15 -15
  273. data/demo/tools/PacketViewer.bat +59 -59
  274. data/demo/tools/Replay +15 -15
  275. data/demo/tools/Replay.bat +59 -59
  276. data/demo/tools/ScpiTarget +15 -15
  277. data/demo/tools/ScpiTarget.bat +59 -59
  278. data/demo/tools/ScriptRunner +15 -15
  279. data/demo/tools/ScriptRunner.bat +59 -59
  280. data/demo/tools/TableManager +15 -15
  281. data/demo/tools/TableManager.bat +59 -59
  282. data/demo/tools/TestRunner +15 -15
  283. data/demo/tools/TestRunner.bat +59 -59
  284. data/demo/tools/TlmExtractor +15 -15
  285. data/demo/tools/TlmExtractor.bat +59 -59
  286. data/demo/tools/TlmGrapher +15 -15
  287. data/demo/tools/TlmGrapher.bat +59 -59
  288. data/demo/tools/TlmViewer +15 -15
  289. data/demo/tools/TlmViewer.bat +59 -59
  290. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  291. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  292. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  293. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  294. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  295. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  296. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  297. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  298. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  299. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  300. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  301. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  302. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  304. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  305. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  306. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  307. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  308. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  309. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  310. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  311. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  312. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  313. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  314. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  316. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  317. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  318. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  319. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  320. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  321. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  322. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  323. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  324. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  325. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  326. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  328. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  329. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  330. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  331. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  332. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  333. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  334. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  335. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  336. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  337. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  338. data/ext/cosmos/ext/array/array.c +111 -111
  339. data/ext/cosmos/ext/array/extconf.rb +13 -13
  340. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  341. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  342. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  343. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  344. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  345. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  346. data/ext/cosmos/ext/crc/crc.c +341 -341
  347. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  348. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  349. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  350. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  351. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -261
  352. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  353. data/ext/cosmos/ext/packet/packet.c +339 -339
  354. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  355. data/ext/cosmos/ext/platform/platform.c +81 -81
  356. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  357. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  358. data/ext/cosmos/ext/string/extconf.rb +13 -13
  359. data/ext/cosmos/ext/string/string.c +49 -49
  360. data/ext/cosmos/ext/structure/structure.c +894 -894
  361. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  362. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  363. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  364. data/ext/cosmos/ext/telemetry/telemetry.c +306 -306
  365. data/ext/mkrf_conf.rb +40 -40
  366. data/install/Gemfile +6 -6
  367. data/install/Launcher +14 -14
  368. data/install/Launcher.bat +59 -59
  369. data/install/Rakefile +61 -61
  370. data/install/config/data/crc.txt +134 -133
  371. data/install/config/system/system.txt +29 -29
  372. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  373. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  374. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  375. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  376. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  377. data/install/config/targets/COSMOS/target.txt +8 -8
  378. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  379. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  380. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  381. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  382. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  383. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  384. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  385. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  386. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  387. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  388. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  389. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  390. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  391. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  392. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  393. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  394. data/install/config/tools/launcher/launcher.txt +39 -39
  395. data/install/config/tools/script_runner/script_runner.txt +3 -3
  396. data/install/config/tools/test_runner/test_runner.txt +8 -8
  397. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  398. data/install/lib/user_version.rb +3 -3
  399. data/install/tools/CmdExtractor +15 -15
  400. data/install/tools/CmdExtractor.bat +59 -59
  401. data/install/tools/CmdSender +15 -15
  402. data/install/tools/CmdSender.bat +59 -59
  403. data/install/tools/CmdTlmServer +15 -15
  404. data/install/tools/CmdTlmServer.bat +59 -59
  405. data/install/tools/DataViewer +15 -15
  406. data/install/tools/DataViewer.bat +59 -59
  407. data/install/tools/HandbookCreator +15 -15
  408. data/install/tools/HandbookCreator.bat +61 -61
  409. data/install/tools/Launcher +15 -15
  410. data/install/tools/Launcher.bat +59 -59
  411. data/install/tools/LimitsMonitor +15 -15
  412. data/install/tools/LimitsMonitor.bat +59 -59
  413. data/install/tools/OpenGLBuilder +15 -15
  414. data/install/tools/OpenGLBuilder.bat +59 -59
  415. data/install/tools/PacketViewer +15 -15
  416. data/install/tools/PacketViewer.bat +59 -59
  417. data/install/tools/Replay +15 -15
  418. data/install/tools/Replay.bat +59 -59
  419. data/install/tools/ScriptRunner +15 -15
  420. data/install/tools/ScriptRunner.bat +59 -59
  421. data/install/tools/TableManager +15 -15
  422. data/install/tools/TableManager.bat +59 -59
  423. data/install/tools/TestRunner +15 -15
  424. data/install/tools/TestRunner.bat +59 -59
  425. data/install/tools/TlmExtractor +15 -15
  426. data/install/tools/TlmExtractor.bat +59 -59
  427. data/install/tools/TlmGrapher +15 -15
  428. data/install/tools/TlmGrapher.bat +59 -59
  429. data/install/tools/TlmViewer +15 -15
  430. data/install/tools/TlmViewer.bat +59 -59
  431. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  432. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  433. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  434. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  435. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  436. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  437. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  438. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  439. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  440. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  441. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  442. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  443. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  444. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  445. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  446. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  447. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  448. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  449. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  450. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  451. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  452. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  453. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  454. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  455. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  456. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  457. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  458. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  459. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  460. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  461. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  463. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  464. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  465. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  466. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  467. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  468. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  469. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  470. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  471. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  472. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  473. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  475. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  476. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  477. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  478. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  479. data/lib/cosmos.rb +63 -63
  480. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  481. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  482. data/lib/cosmos/config/config_parser.rb +324 -324
  483. data/lib/cosmos/conversions.rb +13 -13
  484. data/lib/cosmos/conversions/conversion.rb +47 -47
  485. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  486. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  487. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  488. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  489. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  490. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  491. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  492. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  493. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  494. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  495. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  496. data/lib/cosmos/core_ext.rb +18 -18
  497. data/lib/cosmos/core_ext/array.rb +354 -354
  498. data/lib/cosmos/core_ext/class.rb +51 -51
  499. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  500. data/lib/cosmos/core_ext/exception.rb +52 -52
  501. data/lib/cosmos/core_ext/file.rb +75 -75
  502. data/lib/cosmos/core_ext/hash.rb +28 -28
  503. data/lib/cosmos/core_ext/io.rb +75 -75
  504. data/lib/cosmos/core_ext/kernel.rb +38 -38
  505. data/lib/cosmos/core_ext/math.rb +119 -119
  506. data/lib/cosmos/core_ext/matrix.rb +146 -146
  507. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  508. data/lib/cosmos/core_ext/range.rb +22 -22
  509. data/lib/cosmos/core_ext/socket.rb +32 -32
  510. data/lib/cosmos/core_ext/string.rb +310 -310
  511. data/lib/cosmos/core_ext/stringio.rb +24 -24
  512. data/lib/cosmos/core_ext/time.rb +446 -446
  513. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  514. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  515. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  516. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  517. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  518. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -317
  519. data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
  520. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  521. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  522. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  523. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  524. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  525. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  526. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -196
  527. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
  528. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  529. data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
  530. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
  531. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  532. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  533. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  534. data/lib/cosmos/gui/dialogs/splash.rb +113 -113
  535. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  536. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  537. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  538. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  539. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -494
  540. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  541. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
  542. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  543. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  544. data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -459
  545. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  546. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  547. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  548. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  549. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  550. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  551. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -712
  552. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  553. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  554. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  555. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  556. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  557. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  558. data/lib/cosmos/gui/qt.rb +813 -786
  559. data/lib/cosmos/gui/qt_tool.rb +378 -373
  560. data/lib/cosmos/gui/text/completion.rb +381 -381
  561. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  562. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  563. data/lib/cosmos/gui/text/ruby_editor.rb +395 -395
  564. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  565. data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
  566. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  567. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  568. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  569. data/lib/cosmos/interfaces.rb +11 -11
  570. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -149
  571. data/lib/cosmos/interfaces/interface.rb +213 -213
  572. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  573. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  574. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -128
  575. data/lib/cosmos/interfaces/stream_interface.rb +156 -156
  576. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  577. data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
  578. data/lib/cosmos/interfaces/udp_interface.rb +173 -173
  579. data/lib/cosmos/io/buffered_file.rb +11 -11
  580. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  581. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  582. data/lib/cosmos/io/json_drb.rb +344 -320
  583. data/lib/cosmos/io/json_drb_object.rb +137 -137
  584. data/lib/cosmos/io/json_rpc.rb +365 -365
  585. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  586. data/lib/cosmos/io/raw_logger.rb +174 -174
  587. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  588. data/lib/cosmos/io/serial_driver.rb +85 -85
  589. data/lib/cosmos/io/stderr.rb +36 -36
  590. data/lib/cosmos/io/stdout.rb +36 -36
  591. data/lib/cosmos/io/tcpip_server.rb +583 -532
  592. data/lib/cosmos/io/udp_sockets.rb +152 -152
  593. data/lib/cosmos/io/win32_serial_driver.rb +147 -147
  594. data/lib/cosmos/packet_logs.rb +6 -6
  595. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  596. data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
  597. data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
  598. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  599. data/lib/cosmos/packets/binary_accessor.rb +921 -921
  600. data/lib/cosmos/packets/commands.rb +291 -291
  601. data/lib/cosmos/packets/limits.rb +263 -263
  602. data/lib/cosmos/packets/limits_response.rb +38 -38
  603. data/lib/cosmos/packets/packet.rb +714 -699
  604. data/lib/cosmos/packets/packet_config.rb +1034 -1034
  605. data/lib/cosmos/packets/packet_item.rb +317 -317
  606. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  607. data/lib/cosmos/packets/structure.rb +421 -386
  608. data/lib/cosmos/packets/structure_item.rb +233 -233
  609. data/lib/cosmos/packets/telemetry.rb +317 -317
  610. data/lib/cosmos/processors.rb +6 -6
  611. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  612. data/lib/cosmos/processors/processor.rb +71 -71
  613. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  614. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  615. data/lib/cosmos/script.rb +9 -9
  616. data/lib/cosmos/script/extract.rb +115 -115
  617. data/lib/cosmos/script/script.rb +1513 -1493
  618. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  619. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  620. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  621. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  622. data/lib/cosmos/streams/serial_stream.rb +152 -143
  623. data/lib/cosmos/streams/stream.rb +57 -57
  624. data/lib/cosmos/streams/stream_protocol.rb +369 -369
  625. data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
  626. data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
  627. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  628. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  629. data/lib/cosmos/system.rb +4 -4
  630. data/lib/cosmos/system/system.rb +558 -558
  631. data/lib/cosmos/system/target.rb +178 -178
  632. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
  633. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
  634. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  635. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  636. data/lib/cosmos/tools/cmd_tlm_server/api.rb +936 -940
  637. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  638. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
  639. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
  640. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
  641. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
  642. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  643. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
  644. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
  645. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  646. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  647. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  648. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  649. data/lib/cosmos/tools/data_viewer/data_viewer.rb +628 -600
  650. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
  651. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  652. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
  653. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
  654. data/lib/cosmos/tools/launcher/launcher.rb +184 -184
  655. data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
  656. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
  657. data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
  658. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
  659. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  660. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  661. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -525
  662. data/lib/cosmos/tools/replay/replay.rb +495 -488
  663. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  664. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
  665. data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
  666. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  667. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
  668. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  669. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  670. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  671. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  672. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  673. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  674. data/lib/cosmos/tools/test_runner/test.rb +480 -480
  675. data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
  676. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
  677. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  678. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
  679. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  680. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  681. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  682. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  683. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -94
  684. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  685. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -180
  686. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  687. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  688. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -173
  689. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
  690. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
  691. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  692. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  693. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -320
  694. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  695. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  696. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  697. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  698. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  699. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  700. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  701. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  702. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  703. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  704. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  705. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -1278
  706. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  707. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  708. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +111 -95
  709. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  710. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +72 -66
  711. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  712. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  713. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  714. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -458
  715. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
  716. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
  717. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  718. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  719. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -70
  720. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
  721. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  722. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  723. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  724. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  725. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  726. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  727. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  728. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  729. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  730. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  731. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  732. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  733. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  734. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  735. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  736. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  737. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  738. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  739. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  740. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  741. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  742. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  743. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  744. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  745. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  746. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  747. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  748. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  749. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  750. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  751. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  752. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  753. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  754. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  755. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  756. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  757. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  758. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  759. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  760. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  761. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  762. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  763. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  764. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  765. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  766. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  767. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  768. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  769. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  770. data/lib/cosmos/top_level.rb +647 -596
  771. data/lib/cosmos/utilities.rb +11 -10
  772. data/lib/cosmos/utilities/crc.rb +166 -166
  773. data/lib/cosmos/utilities/csv.rb +83 -83
  774. data/lib/cosmos/utilities/logger.rb +137 -137
  775. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  776. data/lib/cosmos/utilities/message_log.rb +74 -74
  777. data/lib/cosmos/utilities/quaternion.rb +258 -258
  778. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  779. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  780. data/lib/cosmos/utilities/sleeper.rb +44 -0
  781. data/lib/cosmos/version.rb +12 -12
  782. data/lib/cosmos/win32/excel.rb +66 -66
  783. data/lib/cosmos/win32/win32.rb +387 -387
  784. data/lib/cosmos/win32/win32_main.rb +311 -311
  785. data/roodi.yml +24 -24
  786. data/run_gui_tests.bat +32 -32
  787. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  788. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  789. data/spec/config/config_parser_spec.rb +322 -322
  790. data/spec/conversions/conversion_spec.rb +31 -31
  791. data/spec/conversions/generic_conversion_spec.rb +45 -45
  792. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  793. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  794. data/spec/conversions/processor_conversion_spec.rb +45 -45
  795. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  796. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  797. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  798. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  799. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  800. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  801. data/spec/core_ext/array_spec.rb +186 -186
  802. data/spec/core_ext/class_spec.rb +36 -36
  803. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  804. data/spec/core_ext/exception_spec.rb +91 -91
  805. data/spec/core_ext/file_spec.rb +72 -72
  806. data/spec/core_ext/hash_spec.rb +24 -24
  807. data/spec/core_ext/io_spec.rb +46 -46
  808. data/spec/core_ext/kernel_spec.rb +54 -54
  809. data/spec/core_ext/math_spec.rb +116 -116
  810. data/spec/core_ext/matrix_spec.rb +66 -66
  811. data/spec/core_ext/objectspace_spec.rb +29 -29
  812. data/spec/core_ext/range_spec.rb +21 -21
  813. data/spec/core_ext/socket_spec.rb +32 -32
  814. data/spec/core_ext/string_spec.rb +223 -223
  815. data/spec/core_ext/stringio_spec.rb +21 -21
  816. data/spec/core_ext/time_spec.rb +151 -151
  817. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  818. data/spec/install/config/system/system.txt +33 -33
  819. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  820. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  821. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  822. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  823. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  824. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  825. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  826. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  827. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  828. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  829. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  830. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -294
  831. data/spec/install/config/targets/INST/target.txt +10 -10
  832. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  833. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  834. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  835. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  836. data/spec/interfaces/interface_spec.rb +130 -131
  837. data/spec/interfaces/linc_interface_spec.rb +199 -199
  838. data/spec/interfaces/serial_interface_spec.rb +56 -56
  839. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  840. data/spec/interfaces/stream_interface_spec.rb +157 -157
  841. data/spec/interfaces/tcpip_client_interface_spec.rb +54 -54
  842. data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
  843. data/spec/interfaces/udp_interface_spec.rb +175 -177
  844. data/spec/io/buffered_file_spec.rb +113 -113
  845. data/spec/io/io_multiplexer_spec.rb +94 -94
  846. data/spec/io/json_drb_object_spec.rb +99 -99
  847. data/spec/io/json_drb_spec.rb +311 -311
  848. data/spec/io/json_rpc_spec.rb +264 -264
  849. data/spec/io/raw_logger_pair_spec.rb +76 -76
  850. data/spec/io/raw_logger_spec.rb +133 -133
  851. data/spec/io/serial_driver_spec.rb +61 -61
  852. data/spec/io/stderr_spec.rb +32 -32
  853. data/spec/io/stdout_spec.rb +32 -32
  854. data/spec/io/tcpip_server_spec.rb +338 -338
  855. data/spec/io/udp_sockets_spec.rb +94 -94
  856. data/spec/io/win32_serial_driver_spec.rb +88 -88
  857. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  858. data/spec/packet_logs/packet_log_reader_spec.rb +408 -408
  859. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  860. data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
  861. data/spec/packets/binary_accessor_spec.rb +2073 -2073
  862. data/spec/packets/commands_spec.rb +369 -369
  863. data/spec/packets/limits_response_spec.rb +25 -25
  864. data/spec/packets/limits_spec.rb +326 -326
  865. data/spec/packets/packet_config_spec.rb +1620 -1620
  866. data/spec/packets/packet_item_limits_spec.rb +161 -161
  867. data/spec/packets/packet_item_spec.rb +386 -386
  868. data/spec/packets/packet_spec.rb +1057 -949
  869. data/spec/packets/structure_item_spec.rb +195 -195
  870. data/spec/packets/structure_spec.rb +419 -419
  871. data/spec/packets/telemetry_spec.rb +535 -535
  872. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  873. data/spec/processors/processor_spec.rb +55 -55
  874. data/spec/processors/statistics_processor_spec.rb +60 -60
  875. data/spec/processors/watermark_processor_spec.rb +51 -51
  876. data/spec/script/script_spec.rb +654 -654
  877. data/spec/spec_helper.rb +154 -148
  878. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  879. data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
  880. data/spec/streams/length_stream_protocol_spec.rb +297 -297
  881. data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
  882. data/spec/streams/serial_stream_spec.rb +105 -105
  883. data/spec/streams/stream_protocol_spec.rb +332 -332
  884. data/spec/streams/stream_spec.rb +29 -29
  885. data/spec/streams/tcpip_client_stream_spec.rb +54 -54
  886. data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
  887. data/spec/streams/template_stream_protocol_spec.rb +151 -151
  888. data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
  889. data/spec/system/system_spec.rb +645 -645
  890. data/spec/system/target_spec.rb +248 -248
  891. data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
  892. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  893. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  894. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +411 -411
  895. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  896. data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
  897. data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
  898. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  899. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
  900. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  901. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
  902. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
  903. data/spec/top_level/top_level_spec.rb +334 -321
  904. data/spec/utilities/crc_spec.rb +45 -45
  905. data/spec/utilities/csv_spec.rb +97 -97
  906. data/spec/utilities/logger_spec.rb +102 -102
  907. data/spec/utilities/message_log_spec.rb +89 -89
  908. data/spec/utilities/quaternion_spec.rb +107 -107
  909. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  910. data/tasks/manifest.rake +22 -22
  911. data/tasks/spec.rake +23 -23
  912. metadata +18 -2
@@ -1,81 +1,81 @@
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/streams/stream_protocol'
13
-
14
- module Cosmos
15
-
16
- # This StreamProtocol delineates packets using termination characters at
17
- # the end of the stream.
18
- class TerminatedStreamProtocol < StreamProtocol
19
-
20
- # @param write_termination_characters [String] The characters to write to
21
- # the stream after writing the Packet buffer. Must be given as a
22
- # hexadecimal string such as '0xABCD'.
23
- # @param read_termination_characters [String] The characters at the end of
24
- # the stream which delineate the end of a Packet. Must be given as a
25
- # hexadecimal string such as '0xABCD'.
26
- # @param strip_read_termination [Boolean] Whether to remove the
27
- # read_termination_characters before turning the stream data into a
28
- # Packet.
29
- # @param discard_leading_bytes (see StreamProtocol#initialize)
30
- # @param sync_pattern (see StreamProtocol#initialize)
31
- # @param fill_sync_pattern (see StreamProtocol#initialize)
32
- def initialize(write_termination_characters,
33
- read_termination_characters,
34
- strip_read_termination = true,
35
- discard_leading_bytes = 0,
36
- sync_pattern = nil,
37
- fill_sync_pattern = false)
38
- @write_termination_characters = write_termination_characters.hex_to_byte_string
39
- @read_termination_characters = read_termination_characters.hex_to_byte_string
40
- @strip_read_termination = ConfigParser.handle_true_false(strip_read_termination)
41
-
42
- super(discard_leading_bytes, sync_pattern, fill_sync_pattern)
43
- end
44
-
45
- # See StreamProtocol#pre_write_packet
46
- def pre_write_packet(packet)
47
- data = super(packet)
48
- raise "Packet contains termination characters!" if data.index(@write_termination_characters)
49
-
50
- data = data.clone # Don't want to modify the actual packet buffer with the termination characters
51
- @write_termination_characters.each_byte do |byte|
52
- data << byte
53
- end
54
- data
55
- end
56
-
57
- protected
58
-
59
- def reduce_to_single_packet
60
- while true
61
- index = @data.index(@read_termination_characters)
62
-
63
- # Reduce to packet data and setup current_data for next packet
64
- if index
65
- if @strip_read_termination
66
- packet_data = @data[0..(index - 1)]
67
- else
68
- packet_data = @data[0..(index + @read_termination_characters.length - 1)]
69
- end
70
- @data.replace(@data[(index + @read_termination_characters.length)..-1])
71
- return packet_data
72
- else
73
- read_and_handle_timeout()
74
- return nil if @data.length <= 0
75
- end
76
- end
77
- end
78
-
79
- end # class TerminatedStreamProtocol
80
-
81
- 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/streams/stream_protocol'
13
+
14
+ module Cosmos
15
+
16
+ # This StreamProtocol delineates packets using termination characters at
17
+ # the end of the stream.
18
+ class TerminatedStreamProtocol < StreamProtocol
19
+
20
+ # @param write_termination_characters [String] The characters to write to
21
+ # the stream after writing the Packet buffer. Must be given as a
22
+ # hexadecimal string such as '0xABCD'.
23
+ # @param read_termination_characters [String] The characters at the end of
24
+ # the stream which delineate the end of a Packet. Must be given as a
25
+ # hexadecimal string such as '0xABCD'.
26
+ # @param strip_read_termination [Boolean] Whether to remove the
27
+ # read_termination_characters before turning the stream data into a
28
+ # Packet.
29
+ # @param discard_leading_bytes (see StreamProtocol#initialize)
30
+ # @param sync_pattern (see StreamProtocol#initialize)
31
+ # @param fill_sync_pattern (see StreamProtocol#initialize)
32
+ def initialize(write_termination_characters,
33
+ read_termination_characters,
34
+ strip_read_termination = true,
35
+ discard_leading_bytes = 0,
36
+ sync_pattern = nil,
37
+ fill_sync_pattern = false)
38
+ @write_termination_characters = write_termination_characters.hex_to_byte_string
39
+ @read_termination_characters = read_termination_characters.hex_to_byte_string
40
+ @strip_read_termination = ConfigParser.handle_true_false(strip_read_termination)
41
+
42
+ super(discard_leading_bytes, sync_pattern, fill_sync_pattern)
43
+ end
44
+
45
+ # See StreamProtocol#pre_write_packet
46
+ def pre_write_packet(packet)
47
+ data = super(packet)
48
+ raise "Packet contains termination characters!" if data.index(@write_termination_characters)
49
+
50
+ data = data.clone # Don't want to modify the actual packet buffer with the termination characters
51
+ @write_termination_characters.each_byte do |byte|
52
+ data << byte
53
+ end
54
+ data
55
+ end
56
+
57
+ protected
58
+
59
+ def reduce_to_single_packet
60
+ while true
61
+ index = @data.index(@read_termination_characters)
62
+
63
+ # Reduce to packet data and setup current_data for next packet
64
+ if index
65
+ if @strip_read_termination
66
+ packet_data = @data[0..(index - 1)]
67
+ else
68
+ packet_data = @data[0..(index + @read_termination_characters.length - 1)]
69
+ end
70
+ @data.replace(@data[(index + @read_termination_characters.length)..-1])
71
+ return packet_data
72
+ else
73
+ read_and_handle_timeout()
74
+ return nil if @data.length <= 0
75
+ end
76
+ end
77
+ end
78
+
79
+ end # class TerminatedStreamProtocol
80
+
81
+ end # module Cosmos
@@ -1,4 +1,4 @@
1
- # encoding: ascii-8bit
2
-
3
- require 'cosmos/system/target'
4
- require 'cosmos/system/system'
1
+ # encoding: ascii-8bit
2
+
3
+ require 'cosmos/system/target'
4
+ require 'cosmos/system/system'
@@ -1,558 +1,558 @@
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
-
21
- module Cosmos
22
-
23
- # System is the primary entry point into the COSMOS framework. It captures
24
- # system wide configuration items such as the available ports and paths to
25
- # various files used by the system. The #commands, #telemetry, and #limits
26
- # class variables are the primary access points for applications. The
27
- # #targets variable provides access to all the targets defined by the system.
28
- # Its primary responsibily is to load the system configuration file and
29
- # create all the Target instances. It also saves and restores configurations
30
- # using a MD5 checksum over the entire configuration to detect changes.
31
- class System
32
- # @return [Hash<String,Fixnum>] Hash of all the known ports and their values
33
- instance_attr_reader :ports
34
- # @return [Hash<String,String>] Hash of all the known paths and their values
35
- instance_attr_reader :paths
36
- # @return [String] Arbitrary string containing the version
37
- instance_attr_reader :cmd_tlm_version
38
- # @return [PacketLogWriter] Class used to create log files
39
- instance_attr_reader :default_packet_log_writer
40
- # @return [PacketLogReader] Class used to read log files
41
- instance_attr_reader :default_packet_log_reader
42
- # @return [Boolean] Whether to use DNS to lookup IP addresses or not
43
- instance_attr_reader :use_dns
44
- # @return [String] Stores the initial configuration file used when this
45
- # System was initialized
46
- instance_attr_reader :initial_filename
47
- # @return [PacketDefinition] Stores the initial packet list used when this
48
- # System was initialized
49
- instance_attr_reader :initial_config
50
- # @return [ACL] Access control list showing which machines can have access
51
- instance_attr_reader :acl
52
- # @return [Hash<String,Target>] Hash of all the known targets
53
- instance_attr_reader :targets
54
- # @return [Integer] The number of seconds before a telemetry packet is considered stale
55
- instance_attr_reader :staleness_seconds
56
- # @return [Symbol] The current limits set
57
- instance_attr_reader :limits_set
58
-
59
- # Known COSMOS ports
60
- KNOWN_PORTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED']
61
- # Known COSMOS paths
62
- KNOWN_PATHS = ['LOGS', 'TMP', 'SAVED_CONFIG', 'TABLES', 'HANDBOOKS', 'PROCEDURES']
63
-
64
- @@instance = nil
65
-
66
- # Create a new System object. Note, this should not be called directly but
67
- # you should instead use System.instance and treat this class as a
68
- # singleton.
69
- #
70
- # @param filename [String] Full path to the system configuration file to
71
- # read. Be default this is <Cosmos::USERPATH>/config/system/system.txt
72
- def initialize(filename = nil)
73
- raise "Cosmos::System created twice" unless @@instance.nil?
74
- @@instance = self
75
- @targets = {}
76
- @targets['UNKNOWN'] = Target.new('UNKNOWN')
77
- @config = nil
78
- @commands = nil
79
- @telemetry = nil
80
- @limits = nil
81
- @cmd_tlm_version = nil
82
- @default_packet_log_writer = PacketLogWriter
83
- @default_packet_log_reader = PacketLogReader
84
- @use_dns = true
85
- @acl = nil
86
- @staleness_seconds = 30
87
- @limits_set = :DEFAULT
88
-
89
- @ports = {}
90
- @ports['CTS_API'] = 7777
91
- @ports['TLMVIEWER_API'] = 7778
92
- @ports['CTS_PREIDENTIFIED'] = 7779
93
-
94
- @paths = {}
95
- @paths['LOGS'] = File.join(USERPATH, 'outputs', 'logs')
96
- @paths['TMP'] = File.join(USERPATH, 'outputs', 'tmp')
97
- @paths['SAVED_CONFIG'] = File.join(USERPATH, 'outputs', 'saved_config')
98
- @paths['TABLES'] = File.join(USERPATH, 'outputs', 'tables')
99
- @paths['HANDBOOKS'] = File.join(USERPATH, 'outputs', 'handbooks')
100
- @paths['PROCEDURES'] = [File.join(USERPATH, 'procedures')]
101
-
102
- unless filename
103
- system_arg = false
104
- ARGV.each do |arg|
105
- if system_arg
106
- filename = File.join(USERPATH, 'config', 'system', arg)
107
- break
108
- end
109
- system_arg = true if arg == '--system'
110
- end
111
- filename = File.join(USERPATH, 'config', 'system', 'system.txt') unless filename
112
- end
113
- process_file(filename)
114
- ENV['COSMOS_LOGS_DIR'] = @paths['LOGS']
115
-
116
- @initial_filename = filename
117
- @initial_config = nil
118
- end
119
-
120
- # @return [String] Configuration name
121
- def self.configuration_name
122
- # In order not to make the @config instance variable accessable to the
123
- # outside (using a regular accessor method) we use the ability of the
124
- # object to grab its own instance variable
125
- self.instance.instance_variable_get(:@config).name
126
- end
127
-
128
- # Clear the command and telemetry counters for all the targets as well as
129
- # the counters associated with the Commands and Telemetry instances
130
- def self.clear_counters
131
- self.instance.targets.each do |target_name, target|
132
- target.cmd_cnt = 0
133
- target.tlm_cnt = 0
134
- end
135
- self.instance.telemetry.clear_counters
136
- self.instance.commands.clear_counters
137
- end
138
-
139
- # @return [Commands] Access to the command definiton
140
- def commands
141
- load_packets() unless @config
142
- return @commands
143
- end
144
-
145
- # (see #commands)
146
- def self.commands
147
- return self.instance.commands
148
- end
149
-
150
- # @return [Telemetry] Access to the telemetry definition
151
- def telemetry
152
- load_packets() unless @config
153
- return @telemetry
154
- end
155
-
156
- # (see #telemetry)
157
- def self.telemetry
158
- return self.instance.telemetry
159
- end
160
-
161
- # @return [Limits] Access to the limits definition
162
- def limits
163
- load_packets() unless @config
164
- return @limits
165
- end
166
-
167
- # (see #limits)
168
- def self.limits
169
- return self.instance.limits
170
- end
171
-
172
- # Change the system limits set
173
- #
174
- # @param [Symbol] The name of the limits set. :DEFAULT is always an option
175
- # but limits sets are user defined
176
- def limits_set=(limits_set)
177
- load_packets() unless @config
178
- new_limits_set = limits_set.to_s.upcase.intern
179
- if @limits_set != new_limits_set
180
- if @config.limits_sets.include?(new_limits_set)
181
- @limits_set = new_limits_set
182
- Logger.info("Limits Set Changed to: #{@limits_set}")
183
- CmdTlmServer.instance.post_limits_event(:LIMITS_SET, System.limits_set) if defined? CmdTlmServer and CmdTlmServer.instance
184
- else
185
- raise "Unknown limits set requested: #{new_limits_set}"
186
- end
187
- end
188
- end
189
-
190
- # (see #limits_set=)
191
- def self.limits_set=(limits_set)
192
- self.instance.limits_set = limits_set
193
- end
194
-
195
- # @return [System] The System singleton
196
- def self.instance(filename = nil)
197
- @@instance ||= self.new(filename)
198
- return @@instance
199
- end
200
-
201
- # Process the system.txt configuration file
202
- #
203
- # @param filename [String] The configuration file
204
- # @param configuration_directory [String] The configuration directory to
205
- # search for the target command and telemetry files. Pass nil to look in
206
- # the default location of <USERPATH>/config/targets.
207
- def process_file(filename, configuration_directory = nil)
208
- @targets = {}
209
- # Set config to nil so things will lazy load later
210
- @config = nil
211
- acl_list = []
212
- all_allowed = false
213
- first_procedures_path = true
214
-
215
- Cosmos.set_working_dir do
216
- parser = ConfigParser.new
217
-
218
- # First pass - Everything except targets
219
- parser.parse_file(filename) do |keyword, parameters|
220
- case keyword
221
- when 'AUTO_DECLARE_TARGETS', 'DECLARE_TARGET'
222
- # Will be handled by second pass
223
-
224
- when 'PORT'
225
- usage = "#{keyword} <PORT NAME> <PORT VALUE>"
226
- parser.verify_num_parameters(2, 2, usage)
227
- port_name = parameters[0].to_s.upcase
228
- @ports[port_name] = Integer(parameters[1])
229
- Logger.warn("Unknown port name given: #{port_name}") unless KNOWN_PORTS.include?(port_name)
230
-
231
- when 'PATH'
232
- usage = "#{keyword} <PATH NAME> <PATH>"
233
- parser.verify_num_parameters(2, 2, usage)
234
- path_name = parameters[0].to_s.upcase
235
- path = File.expand_path(parameters[1])
236
- if path_name == 'PROCEDURES'
237
- if first_procedures_path
238
- @paths[path_name] = []
239
- first_procedures_path = false
240
- end
241
- @paths[path_name] << path
242
- else
243
- @paths[path_name] = path
244
- end
245
- unless Dir.exist?(path)
246
- begin
247
- FileUtils.mkdir_p(path)
248
- raise "Path creation failed: #{path}" unless File.exist?(path)
249
- Logger.info "Created PATH #{path_name} #{path}"
250
- rescue Exception => err
251
- Logger.error "Problem creating PATH #{path_name} #{path}\n#{err.formatted}"
252
- end
253
- end
254
- Logger.warn("Unknown path name given: #{path_name}") unless KNOWN_PATHS.include?(path_name)
255
-
256
- when 'DEFAULT_PACKET_LOG_WRITER'
257
- usage = "#{keyword} <FILENAME>"
258
- parser.verify_num_parameters(1, 1, usage)
259
- @default_packet_log_writer = Cosmos.require_class(parameters[0])
260
-
261
- when 'DEFAULT_PACKET_LOG_READER'
262
- usage = "#{keyword} <FILENAME>"
263
- parser.verify_num_parameters(1, 1, usage)
264
- @default_packet_log_reader = Cosmos.require_class(parameters[0])
265
-
266
- when 'DISABLE_DNS'
267
- usage = "#{keyword}"
268
- parser.verify_num_parameters(0, 0, usage)
269
- @use_dns = false
270
-
271
- when 'ALLOW_ACCESS'
272
- parser.verify_num_parameters(1, 1, "#{keyword} <IP Address or Hostname>")
273
- begin
274
- addr = parameters[0].upcase
275
- if addr == 'ALL'
276
- all_allowed = true
277
- acl_list = []
278
- end
279
-
280
- unless all_allowed
281
- first_char = addr[0..0]
282
- if !((first_char =~ /[1234567890]/) or (first_char == '*') or (addr.upcase == 'ALL'))
283
- # Try to lookup IP Address
284
- info = Socket.gethostbyname(addr)
285
- addr = "#{info[3].getbyte(0)}.#{info[3].getbyte(1)}.#{info[3].getbyte(2)}.#{info[3].getbyte(3)}"
286
- if (acl_list.empty?)
287
- acl_list << 'allow'
288
- acl_list << '127.0.0.1'
289
- end
290
- acl_list << 'allow'
291
- acl_list << addr
292
- else
293
- raise "badly formatted address #{addr}" unless /\b(?:\d{1,3}\.){3}\d{1,3}\b/.match(addr)
294
- if (acl_list.empty?)
295
- acl_list << 'allow'
296
- acl_list << '127.0.0.1'
297
- end
298
- acl_list << 'allow'
299
- acl_list << addr
300
- end
301
- end
302
- rescue => err
303
- raise parser.error("Problem with ALLOW_ACCESS due to #{err.message.strip}")
304
- end
305
-
306
- when 'STALENESS_SECONDS'
307
- parser.verify_num_parameters(1, 1, "#{keyword} <Value in Seconds>")
308
- @staleness_seconds = Integer(parameters[0])
309
-
310
- when 'CMD_TLM_VERSION'
311
- usage = "#{keyword} <VERSION>"
312
- parser.verify_num_parameters(1, 1, usage)
313
- @cmd_tlm_version = parameters[0]
314
-
315
- else
316
- # blank lines will have a nil keyword and should not raise an exception
317
- raise parser.error("Unknown keyword '#{keyword}'") if keyword
318
- end # case keyword
319
- end # parser.parse_file
320
-
321
- @acl = ACL.new(acl_list, ACL::ALLOW_DENY) unless acl_list.empty?
322
-
323
- # Second pass - Process targets
324
- process_targets(parser, filename, configuration_directory)
325
-
326
- end # Cosmos.set_working_dir
327
- end # def process_file
328
-
329
- # Parse the system.txt configuration file looking for keywords associated
330
- # with targets and create all the Target instances in the system.
331
- #
332
- # @param parser [ConfigParser] Parser created by process_file
333
- # @param filename (see #process_file)
334
- # @param configuration_directory (see #process_file)
335
- def process_targets(parser, filename, configuration_directory)
336
- parser.parse_file(filename) do |keyword, parameters|
337
- case keyword
338
- when 'AUTO_DECLARE_TARGETS'
339
- usage = "#{keyword}"
340
- parser.verify_num_parameters(0, 0, usage)
341
- path = File.join(USERPATH, 'config', 'targets')
342
- unless File.exist? path
343
- raise parser.error("#{path} must exist", usage)
344
- end
345
- system_found = false
346
- dirs = []
347
- Dir.foreach(File.join(USERPATH, 'config', 'targets')) { |dir_filename| dirs << dir_filename }
348
- dirs.sort!
349
- dirs.each do |dir_filename|
350
- if dir_filename[0] != '.'
351
- if dir_filename == dir_filename.upcase
352
- if dir_filename == 'SYSTEM'
353
- system_found = true
354
- next
355
- end
356
- target = Target.new(dir_filename)
357
- @targets[target.name] = target
358
- else
359
- raise parser.error("Target folder must be uppercase: '#{dir_filename}'")
360
- end
361
- end
362
- end
363
- if system_found
364
- target = Target.new('SYSTEM')
365
- @targets[target.name] = target
366
- end
367
-
368
- when 'DECLARE_TARGET'
369
- usage = "#{keyword} <TARGET NAME> <SUBSTITUTE TARGET NAME (Optional)> <TARGET FILENAME (Optional - defaults to target.txt)>"
370
- parser.verify_num_parameters(1, 3, usage)
371
- target_name = parameters[0].to_s.upcase
372
- substitute_name = nil
373
- substitute_name = ConfigParser.handle_nil(parameters[1])
374
- substitute_name.to_s.upcase if substitute_name
375
- if configuration_directory
376
- folder_name = File.join(configuration_directory, target_name)
377
- else
378
- folder_name = File.join(USERPATH, 'config', 'targets', target_name)
379
- end
380
- unless Dir.exist?(folder_name)
381
- raise parser.error("Target folder must exist '#{folder_name}'.")
382
- end
383
- target = Target.new(target_name, substitute_name, configuration_directory, ConfigParser.handle_nil(parameters[2]))
384
- @targets[target.name] = target
385
- end # case keyword
386
- end # parser.parse_file
387
- end
388
-
389
- # Load the specified configuration by iterating through the SAVED_CONFIG
390
- # directory looking for a matching MD5 sum. Updates the internal state so
391
- # subsequent commands and telemetry methods return the new configuration.
392
- #
393
- # @param name [String] MD5 string which identifies the
394
- # configuration. Pass nil to load the default configuration.
395
- # @return [String] The actual configuration loaded
396
- def load_configuration(name = nil)
397
- if name and @config
398
- # Make sure they're requesting something other than the current
399
- # configuration.
400
- if name != @config.name
401
- # If they want the initial configuration we can just swap out the
402
- # current configuration without doing any file processing
403
- if name == @initial_config.name
404
- update_config(@initial_config)
405
- else
406
- # Look for the requested configuration in the saved configurations
407
- configuration_directory = find_configuration(name)
408
- if configuration_directory
409
- # We found the configuration requested. Reprocess the system.txt
410
- # and reload the packets
411
- process_file(File.join(configuration_directory, 'system.txt'), configuration_directory)
412
- load_packets()
413
- else
414
- # We couldn't find the configuration request. Reload the
415
- # initial configuration
416
- update_config(@initial_config)
417
- end
418
- end
419
- @telemetry.reset
420
- end
421
- else
422
- # Ensure packets have been lazy loaded
423
- System.commands()
424
- current_config = @config
425
- @config = @initial_config
426
- @telemetry.reset if current_config != @initial_config
427
- end
428
- return @config.name
429
- end
430
-
431
- # (see #load_configuration)
432
- def self.load_configuration(name = nil)
433
- return self.instance.load_configuration(name)
434
- end
435
-
436
- protected
437
-
438
- def update_config(config)
439
- unless @config
440
- @config = config
441
- @commands = Commands.new(config)
442
- @telemetry = Telemetry.new(config)
443
- @limits = Limits.new(config)
444
- else
445
- @config = config
446
- @commands.config = config
447
- @telemetry.config = config
448
- @limits.config = config
449
- end
450
- end
451
-
452
- def find_configuration(name)
453
- Cosmos.set_working_dir do
454
- Dir.foreach(@paths['SAVED_CONFIG']) do |filename|
455
- full_path = File.join(@paths['SAVED_CONFIG'], filename)
456
- if Dir.exist?(full_path) and filename[-32..-1] == name
457
- return full_path
458
- end
459
- end
460
- end
461
- nil
462
- end
463
-
464
- def save_configuration
465
- Cosmos.set_working_dir do
466
- configuration_directory = find_configuration(@config.name)
467
- configuration_directory = File.join(@paths['SAVED_CONFIG'], File.build_timestamped_filename([@config.name], '')) unless configuration_directory
468
- unless Dir.exist?(configuration_directory)
469
- begin
470
- # Create the directory
471
- FileUtils.mkdir_p(configuration_directory)
472
-
473
- # Copy target files into directory
474
- @targets.each do |target_name, target|
475
- source_dir = File.join(USERPATH, 'config', 'targets', target.original_name)
476
- destination_dir = File.join(configuration_directory, target.original_name)
477
- unless Dir.exist?(destination_dir)
478
- FileUtils.cp_r(source_dir, destination_dir)
479
- end
480
- end
481
-
482
- # Create custom system.txt file
483
- File.open(File.join(configuration_directory, 'system.txt'), 'w') do |file|
484
- @targets.each do |target_name, target|
485
- target_filename = File.basename(target.filename)
486
- target_filename = nil unless File.exist?(target.filename)
487
- if target.substitute
488
- file.puts "DECLARE_TARGET #{target.original_name} #{target.name} #{target_filename}"
489
- else
490
- file.puts "DECLARE_TARGET #{target.name} nil #{target_filename}"
491
- end
492
- end
493
- end
494
- rescue Exception => error
495
- Logger.error "Problem saving configuration to #{configuration_directory}: #{error.class}:#{error.message}"
496
- end
497
- end
498
- end
499
- end
500
-
501
- def load_packets
502
- # Determine MD5 over all targets cmd_tlm files
503
- cmd_tlm_files = [System.initial_filename]
504
- additional_data = ''
505
- @targets.each do |target_name, target|
506
- cmd_tlm_files << target.filename if File.exist?(target.filename)
507
- cmd_tlm_files.concat(target.cmd_tlm_files)
508
- if target.substitute
509
- additional_data << target.original_name
510
- additional_data << target.name
511
- else
512
- additional_data << target.original_name
513
- end
514
- end
515
- md5 = Cosmos.md5_files(cmd_tlm_files, additional_data)
516
- md5_string = md5.hexdigest
517
-
518
- # Build filename for marshal file
519
- marshal_filename = File.join(@paths['TMP'], 'marshal_' << md5_string << '.bin')
520
-
521
- # Attempt to load marshal file
522
- config = Cosmos.marshal_load(marshal_filename)
523
- if config
524
- update_config(config)
525
- # Marshal file load successful
526
- Logger.info "Marshal load success: #{marshal_filename}"
527
- @config.warnings.each {|warning| Logger.warn(warning)} if @config.warnings
528
- else
529
- # Marshal file load failed - Manually load configuration
530
- @config = PacketConfig.new
531
- @commands = Commands.new(@config)
532
- @telemetry = Telemetry.new(@config)
533
- @limits = Limits.new(@config)
534
-
535
- @targets.each do |target_name, target|
536
- target.cmd_tlm_files.each do |cmd_tlm_file|
537
- begin
538
- @config.process_file(cmd_tlm_file, target.name)
539
- rescue Exception => err
540
- Logger.error "Problem processing #{cmd_tlm_file}."
541
- raise err
542
- end
543
- end
544
- end
545
-
546
- # Create marshal file for next time
547
- @config.name = md5_string
548
- Cosmos.marshal_dump(marshal_filename, @config)
549
- end
550
-
551
- # Save configuration
552
- @initial_config = @config unless @initial_config
553
- save_configuration()
554
- end
555
-
556
- end # class System
557
-
558
- 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
+
21
+ module Cosmos
22
+
23
+ # System is the primary entry point into the COSMOS framework. It captures
24
+ # system wide configuration items such as the available ports and paths to
25
+ # various files used by the system. The #commands, #telemetry, and #limits
26
+ # class variables are the primary access points for applications. The
27
+ # #targets variable provides access to all the targets defined by the system.
28
+ # Its primary responsibily is to load the system configuration file and
29
+ # create all the Target instances. It also saves and restores configurations
30
+ # using a MD5 checksum over the entire configuration to detect changes.
31
+ class System
32
+ # @return [Hash<String,Fixnum>] Hash of all the known ports and their values
33
+ instance_attr_reader :ports
34
+ # @return [Hash<String,String>] Hash of all the known paths and their values
35
+ instance_attr_reader :paths
36
+ # @return [String] Arbitrary string containing the version
37
+ instance_attr_reader :cmd_tlm_version
38
+ # @return [PacketLogWriter] Class used to create log files
39
+ instance_attr_reader :default_packet_log_writer
40
+ # @return [PacketLogReader] Class used to read log files
41
+ instance_attr_reader :default_packet_log_reader
42
+ # @return [Boolean] Whether to use DNS to lookup IP addresses or not
43
+ instance_attr_reader :use_dns
44
+ # @return [String] Stores the initial configuration file used when this
45
+ # System was initialized
46
+ instance_attr_reader :initial_filename
47
+ # @return [PacketDefinition] Stores the initial packet list used when this
48
+ # System was initialized
49
+ instance_attr_reader :initial_config
50
+ # @return [ACL] Access control list showing which machines can have access
51
+ instance_attr_reader :acl
52
+ # @return [Hash<String,Target>] Hash of all the known targets
53
+ instance_attr_reader :targets
54
+ # @return [Integer] The number of seconds before a telemetry packet is considered stale
55
+ instance_attr_reader :staleness_seconds
56
+ # @return [Symbol] The current limits set
57
+ instance_attr_reader :limits_set
58
+
59
+ # Known COSMOS ports
60
+ KNOWN_PORTS = ['CTS_API', 'TLMVIEWER_API', 'CTS_PREIDENTIFIED']
61
+ # Known COSMOS paths
62
+ KNOWN_PATHS = ['LOGS', 'TMP', 'SAVED_CONFIG', 'TABLES', 'HANDBOOKS', 'PROCEDURES']
63
+
64
+ @@instance = nil
65
+
66
+ # Create a new System object. Note, this should not be called directly but
67
+ # you should instead use System.instance and treat this class as a
68
+ # singleton.
69
+ #
70
+ # @param filename [String] Full path to the system configuration file to
71
+ # read. Be default this is <Cosmos::USERPATH>/config/system/system.txt
72
+ def initialize(filename = nil)
73
+ raise "Cosmos::System created twice" unless @@instance.nil?
74
+ @@instance = self
75
+ @targets = {}
76
+ @targets['UNKNOWN'] = Target.new('UNKNOWN')
77
+ @config = nil
78
+ @commands = nil
79
+ @telemetry = nil
80
+ @limits = nil
81
+ @cmd_tlm_version = nil
82
+ @default_packet_log_writer = PacketLogWriter
83
+ @default_packet_log_reader = PacketLogReader
84
+ @use_dns = true
85
+ @acl = nil
86
+ @staleness_seconds = 30
87
+ @limits_set = :DEFAULT
88
+
89
+ @ports = {}
90
+ @ports['CTS_API'] = 7777
91
+ @ports['TLMVIEWER_API'] = 7778
92
+ @ports['CTS_PREIDENTIFIED'] = 7779
93
+
94
+ @paths = {}
95
+ @paths['LOGS'] = File.join(USERPATH, 'outputs', 'logs')
96
+ @paths['TMP'] = File.join(USERPATH, 'outputs', 'tmp')
97
+ @paths['SAVED_CONFIG'] = File.join(USERPATH, 'outputs', 'saved_config')
98
+ @paths['TABLES'] = File.join(USERPATH, 'outputs', 'tables')
99
+ @paths['HANDBOOKS'] = File.join(USERPATH, 'outputs', 'handbooks')
100
+ @paths['PROCEDURES'] = [File.join(USERPATH, 'procedures')]
101
+
102
+ unless filename
103
+ system_arg = false
104
+ ARGV.each do |arg|
105
+ if system_arg
106
+ filename = File.join(USERPATH, 'config', 'system', arg)
107
+ break
108
+ end
109
+ system_arg = true if arg == '--system'
110
+ end
111
+ filename = File.join(USERPATH, 'config', 'system', 'system.txt') unless filename
112
+ end
113
+ process_file(filename)
114
+ ENV['COSMOS_LOGS_DIR'] = @paths['LOGS']
115
+
116
+ @initial_filename = filename
117
+ @initial_config = nil
118
+ end
119
+
120
+ # @return [String] Configuration name
121
+ def self.configuration_name
122
+ # In order not to make the @config instance variable accessable to the
123
+ # outside (using a regular accessor method) we use the ability of the
124
+ # object to grab its own instance variable
125
+ self.instance.instance_variable_get(:@config).name
126
+ end
127
+
128
+ # Clear the command and telemetry counters for all the targets as well as
129
+ # the counters associated with the Commands and Telemetry instances
130
+ def self.clear_counters
131
+ self.instance.targets.each do |target_name, target|
132
+ target.cmd_cnt = 0
133
+ target.tlm_cnt = 0
134
+ end
135
+ self.instance.telemetry.clear_counters
136
+ self.instance.commands.clear_counters
137
+ end
138
+
139
+ # @return [Commands] Access to the command definiton
140
+ def commands
141
+ load_packets() unless @config
142
+ return @commands
143
+ end
144
+
145
+ # (see #commands)
146
+ def self.commands
147
+ return self.instance.commands
148
+ end
149
+
150
+ # @return [Telemetry] Access to the telemetry definition
151
+ def telemetry
152
+ load_packets() unless @config
153
+ return @telemetry
154
+ end
155
+
156
+ # (see #telemetry)
157
+ def self.telemetry
158
+ return self.instance.telemetry
159
+ end
160
+
161
+ # @return [Limits] Access to the limits definition
162
+ def limits
163
+ load_packets() unless @config
164
+ return @limits
165
+ end
166
+
167
+ # (see #limits)
168
+ def self.limits
169
+ return self.instance.limits
170
+ end
171
+
172
+ # Change the system limits set
173
+ #
174
+ # @param [Symbol] The name of the limits set. :DEFAULT is always an option
175
+ # but limits sets are user defined
176
+ def limits_set=(limits_set)
177
+ load_packets() unless @config
178
+ new_limits_set = limits_set.to_s.upcase.intern
179
+ if @limits_set != new_limits_set
180
+ if @config.limits_sets.include?(new_limits_set)
181
+ @limits_set = new_limits_set
182
+ Logger.info("Limits Set Changed to: #{@limits_set}")
183
+ CmdTlmServer.instance.post_limits_event(:LIMITS_SET, System.limits_set) if defined? CmdTlmServer and CmdTlmServer.instance
184
+ else
185
+ raise "Unknown limits set requested: #{new_limits_set}"
186
+ end
187
+ end
188
+ end
189
+
190
+ # (see #limits_set=)
191
+ def self.limits_set=(limits_set)
192
+ self.instance.limits_set = limits_set
193
+ end
194
+
195
+ # @return [System] The System singleton
196
+ def self.instance(filename = nil)
197
+ @@instance ||= self.new(filename)
198
+ return @@instance
199
+ end
200
+
201
+ # Process the system.txt configuration file
202
+ #
203
+ # @param filename [String] The configuration file
204
+ # @param configuration_directory [String] The configuration directory to
205
+ # search for the target command and telemetry files. Pass nil to look in
206
+ # the default location of <USERPATH>/config/targets.
207
+ def process_file(filename, configuration_directory = nil)
208
+ @targets = {}
209
+ # Set config to nil so things will lazy load later
210
+ @config = nil
211
+ acl_list = []
212
+ all_allowed = false
213
+ first_procedures_path = true
214
+
215
+ Cosmos.set_working_dir do
216
+ parser = ConfigParser.new
217
+
218
+ # First pass - Everything except targets
219
+ parser.parse_file(filename) do |keyword, parameters|
220
+ case keyword
221
+ when 'AUTO_DECLARE_TARGETS', 'DECLARE_TARGET'
222
+ # Will be handled by second pass
223
+
224
+ when 'PORT'
225
+ usage = "#{keyword} <PORT NAME> <PORT VALUE>"
226
+ parser.verify_num_parameters(2, 2, usage)
227
+ port_name = parameters[0].to_s.upcase
228
+ @ports[port_name] = Integer(parameters[1])
229
+ Logger.warn("Unknown port name given: #{port_name}") unless KNOWN_PORTS.include?(port_name)
230
+
231
+ when 'PATH'
232
+ usage = "#{keyword} <PATH NAME> <PATH>"
233
+ parser.verify_num_parameters(2, 2, usage)
234
+ path_name = parameters[0].to_s.upcase
235
+ path = File.expand_path(parameters[1])
236
+ if path_name == 'PROCEDURES'
237
+ if first_procedures_path
238
+ @paths[path_name] = []
239
+ first_procedures_path = false
240
+ end
241
+ @paths[path_name] << path
242
+ else
243
+ @paths[path_name] = path
244
+ end
245
+ unless Dir.exist?(path)
246
+ begin
247
+ FileUtils.mkdir_p(path)
248
+ raise "Path creation failed: #{path}" unless File.exist?(path)
249
+ Logger.info "Created PATH #{path_name} #{path}"
250
+ rescue Exception => err
251
+ Logger.error "Problem creating PATH #{path_name} #{path}\n#{err.formatted}"
252
+ end
253
+ end
254
+ Logger.warn("Unknown path name given: #{path_name}") unless KNOWN_PATHS.include?(path_name)
255
+
256
+ when 'DEFAULT_PACKET_LOG_WRITER'
257
+ usage = "#{keyword} <FILENAME>"
258
+ parser.verify_num_parameters(1, 1, usage)
259
+ @default_packet_log_writer = Cosmos.require_class(parameters[0])
260
+
261
+ when 'DEFAULT_PACKET_LOG_READER'
262
+ usage = "#{keyword} <FILENAME>"
263
+ parser.verify_num_parameters(1, 1, usage)
264
+ @default_packet_log_reader = Cosmos.require_class(parameters[0])
265
+
266
+ when 'DISABLE_DNS'
267
+ usage = "#{keyword}"
268
+ parser.verify_num_parameters(0, 0, usage)
269
+ @use_dns = false
270
+
271
+ when 'ALLOW_ACCESS'
272
+ parser.verify_num_parameters(1, 1, "#{keyword} <IP Address or Hostname>")
273
+ begin
274
+ addr = parameters[0].upcase
275
+ if addr == 'ALL'
276
+ all_allowed = true
277
+ acl_list = []
278
+ end
279
+
280
+ unless all_allowed
281
+ first_char = addr[0..0]
282
+ if !((first_char =~ /[1234567890]/) or (first_char == '*') or (addr.upcase == 'ALL'))
283
+ # Try to lookup IP Address
284
+ info = Socket.gethostbyname(addr)
285
+ addr = "#{info[3].getbyte(0)}.#{info[3].getbyte(1)}.#{info[3].getbyte(2)}.#{info[3].getbyte(3)}"
286
+ if (acl_list.empty?)
287
+ acl_list << 'allow'
288
+ acl_list << '127.0.0.1'
289
+ end
290
+ acl_list << 'allow'
291
+ acl_list << addr
292
+ else
293
+ raise "badly formatted address #{addr}" unless /\b(?:\d{1,3}\.){3}\d{1,3}\b/.match(addr)
294
+ if (acl_list.empty?)
295
+ acl_list << 'allow'
296
+ acl_list << '127.0.0.1'
297
+ end
298
+ acl_list << 'allow'
299
+ acl_list << addr
300
+ end
301
+ end
302
+ rescue => err
303
+ raise parser.error("Problem with ALLOW_ACCESS due to #{err.message.strip}")
304
+ end
305
+
306
+ when 'STALENESS_SECONDS'
307
+ parser.verify_num_parameters(1, 1, "#{keyword} <Value in Seconds>")
308
+ @staleness_seconds = Integer(parameters[0])
309
+
310
+ when 'CMD_TLM_VERSION'
311
+ usage = "#{keyword} <VERSION>"
312
+ parser.verify_num_parameters(1, 1, usage)
313
+ @cmd_tlm_version = parameters[0]
314
+
315
+ else
316
+ # blank lines will have a nil keyword and should not raise an exception
317
+ raise parser.error("Unknown keyword '#{keyword}'") if keyword
318
+ end # case keyword
319
+ end # parser.parse_file
320
+
321
+ @acl = ACL.new(acl_list, ACL::ALLOW_DENY) unless acl_list.empty?
322
+
323
+ # Second pass - Process targets
324
+ process_targets(parser, filename, configuration_directory)
325
+
326
+ end # Cosmos.set_working_dir
327
+ end # def process_file
328
+
329
+ # Parse the system.txt configuration file looking for keywords associated
330
+ # with targets and create all the Target instances in the system.
331
+ #
332
+ # @param parser [ConfigParser] Parser created by process_file
333
+ # @param filename (see #process_file)
334
+ # @param configuration_directory (see #process_file)
335
+ def process_targets(parser, filename, configuration_directory)
336
+ parser.parse_file(filename) do |keyword, parameters|
337
+ case keyword
338
+ when 'AUTO_DECLARE_TARGETS'
339
+ usage = "#{keyword}"
340
+ parser.verify_num_parameters(0, 0, usage)
341
+ path = File.join(USERPATH, 'config', 'targets')
342
+ unless File.exist? path
343
+ raise parser.error("#{path} must exist", usage)
344
+ end
345
+ system_found = false
346
+ dirs = []
347
+ Dir.foreach(File.join(USERPATH, 'config', 'targets')) { |dir_filename| dirs << dir_filename }
348
+ dirs.sort!
349
+ dirs.each do |dir_filename|
350
+ if dir_filename[0] != '.'
351
+ if dir_filename == dir_filename.upcase
352
+ if dir_filename == 'SYSTEM'
353
+ system_found = true
354
+ next
355
+ end
356
+ target = Target.new(dir_filename)
357
+ @targets[target.name] = target
358
+ else
359
+ raise parser.error("Target folder must be uppercase: '#{dir_filename}'")
360
+ end
361
+ end
362
+ end
363
+ if system_found
364
+ target = Target.new('SYSTEM')
365
+ @targets[target.name] = target
366
+ end
367
+
368
+ when 'DECLARE_TARGET'
369
+ usage = "#{keyword} <TARGET NAME> <SUBSTITUTE TARGET NAME (Optional)> <TARGET FILENAME (Optional - defaults to target.txt)>"
370
+ parser.verify_num_parameters(1, 3, usage)
371
+ target_name = parameters[0].to_s.upcase
372
+ substitute_name = nil
373
+ substitute_name = ConfigParser.handle_nil(parameters[1])
374
+ substitute_name.to_s.upcase if substitute_name
375
+ if configuration_directory
376
+ folder_name = File.join(configuration_directory, target_name)
377
+ else
378
+ folder_name = File.join(USERPATH, 'config', 'targets', target_name)
379
+ end
380
+ unless Dir.exist?(folder_name)
381
+ raise parser.error("Target folder must exist '#{folder_name}'.")
382
+ end
383
+ target = Target.new(target_name, substitute_name, configuration_directory, ConfigParser.handle_nil(parameters[2]))
384
+ @targets[target.name] = target
385
+ end # case keyword
386
+ end # parser.parse_file
387
+ end
388
+
389
+ # Load the specified configuration by iterating through the SAVED_CONFIG
390
+ # directory looking for a matching MD5 sum. Updates the internal state so
391
+ # subsequent commands and telemetry methods return the new configuration.
392
+ #
393
+ # @param name [String] MD5 string which identifies the
394
+ # configuration. Pass nil to load the default configuration.
395
+ # @return [String] The actual configuration loaded
396
+ def load_configuration(name = nil)
397
+ if name and @config
398
+ # Make sure they're requesting something other than the current
399
+ # configuration.
400
+ if name != @config.name
401
+ # If they want the initial configuration we can just swap out the
402
+ # current configuration without doing any file processing
403
+ if name == @initial_config.name
404
+ update_config(@initial_config)
405
+ else
406
+ # Look for the requested configuration in the saved configurations
407
+ configuration_directory = find_configuration(name)
408
+ if configuration_directory
409
+ # We found the configuration requested. Reprocess the system.txt
410
+ # and reload the packets
411
+ process_file(File.join(configuration_directory, 'system.txt'), configuration_directory)
412
+ load_packets()
413
+ else
414
+ # We couldn't find the configuration request. Reload the
415
+ # initial configuration
416
+ update_config(@initial_config)
417
+ end
418
+ end
419
+ @telemetry.reset
420
+ end
421
+ else
422
+ # Ensure packets have been lazy loaded
423
+ System.commands()
424
+ current_config = @config
425
+ @config = @initial_config
426
+ @telemetry.reset if current_config != @initial_config
427
+ end
428
+ return @config.name
429
+ end
430
+
431
+ # (see #load_configuration)
432
+ def self.load_configuration(name = nil)
433
+ return self.instance.load_configuration(name)
434
+ end
435
+
436
+ protected
437
+
438
+ def update_config(config)
439
+ unless @config
440
+ @config = config
441
+ @commands = Commands.new(config)
442
+ @telemetry = Telemetry.new(config)
443
+ @limits = Limits.new(config)
444
+ else
445
+ @config = config
446
+ @commands.config = config
447
+ @telemetry.config = config
448
+ @limits.config = config
449
+ end
450
+ end
451
+
452
+ def find_configuration(name)
453
+ Cosmos.set_working_dir do
454
+ Dir.foreach(@paths['SAVED_CONFIG']) do |filename|
455
+ full_path = File.join(@paths['SAVED_CONFIG'], filename)
456
+ if Dir.exist?(full_path) and filename[-32..-1] == name
457
+ return full_path
458
+ end
459
+ end
460
+ end
461
+ nil
462
+ end
463
+
464
+ def save_configuration
465
+ Cosmos.set_working_dir do
466
+ configuration_directory = find_configuration(@config.name)
467
+ configuration_directory = File.join(@paths['SAVED_CONFIG'], File.build_timestamped_filename([@config.name], '')) unless configuration_directory
468
+ unless Dir.exist?(configuration_directory)
469
+ begin
470
+ # Create the directory
471
+ FileUtils.mkdir_p(configuration_directory)
472
+
473
+ # Copy target files into directory
474
+ @targets.each do |target_name, target|
475
+ source_dir = File.join(USERPATH, 'config', 'targets', target.original_name)
476
+ destination_dir = File.join(configuration_directory, target.original_name)
477
+ unless Dir.exist?(destination_dir)
478
+ FileUtils.cp_r(source_dir, destination_dir)
479
+ end
480
+ end
481
+
482
+ # Create custom system.txt file
483
+ File.open(File.join(configuration_directory, 'system.txt'), 'w') do |file|
484
+ @targets.each do |target_name, target|
485
+ target_filename = File.basename(target.filename)
486
+ target_filename = nil unless File.exist?(target.filename)
487
+ if target.substitute
488
+ file.puts "DECLARE_TARGET #{target.original_name} #{target.name} #{target_filename}"
489
+ else
490
+ file.puts "DECLARE_TARGET #{target.name} nil #{target_filename}"
491
+ end
492
+ end
493
+ end
494
+ rescue Exception => error
495
+ Logger.error "Problem saving configuration to #{configuration_directory}: #{error.class}:#{error.message}"
496
+ end
497
+ end
498
+ end
499
+ end
500
+
501
+ def load_packets
502
+ # Determine MD5 over all targets cmd_tlm files
503
+ cmd_tlm_files = [System.initial_filename]
504
+ additional_data = ''
505
+ @targets.each do |target_name, target|
506
+ cmd_tlm_files << target.filename if File.exist?(target.filename)
507
+ cmd_tlm_files.concat(target.cmd_tlm_files)
508
+ if target.substitute
509
+ additional_data << target.original_name
510
+ additional_data << target.name
511
+ else
512
+ additional_data << target.original_name
513
+ end
514
+ end
515
+ md5 = Cosmos.md5_files(cmd_tlm_files, additional_data)
516
+ md5_string = md5.hexdigest
517
+
518
+ # Build filename for marshal file
519
+ marshal_filename = File.join(@paths['TMP'], 'marshal_' << md5_string << '.bin')
520
+
521
+ # Attempt to load marshal file
522
+ config = Cosmos.marshal_load(marshal_filename)
523
+ if config
524
+ update_config(config)
525
+ # Marshal file load successful
526
+ Logger.info "Marshal load success: #{marshal_filename}"
527
+ @config.warnings.each {|warning| Logger.warn(warning)} if @config.warnings
528
+ else
529
+ # Marshal file load failed - Manually load configuration
530
+ @config = PacketConfig.new
531
+ @commands = Commands.new(@config)
532
+ @telemetry = Telemetry.new(@config)
533
+ @limits = Limits.new(@config)
534
+
535
+ @targets.each do |target_name, target|
536
+ target.cmd_tlm_files.each do |cmd_tlm_file|
537
+ begin
538
+ @config.process_file(cmd_tlm_file, target.name)
539
+ rescue Exception => err
540
+ Logger.error "Problem processing #{cmd_tlm_file}."
541
+ raise err
542
+ end
543
+ end
544
+ end
545
+
546
+ # Create marshal file for next time
547
+ @config.name = md5_string
548
+ Cosmos.marshal_dump(marshal_filename, @config)
549
+ end
550
+
551
+ # Save configuration
552
+ @initial_config = @config unless @initial_config
553
+ save_configuration()
554
+ end
555
+
556
+ end # class System
557
+
558
+ end # module Cosmos