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,177 +1,177 @@
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'
12
-
13
- module Cosmos
14
-
15
- # Represents a data object in a tabbed plots definition
16
- # Designed for use as a base class for custom data objects
17
- class DataObject
18
-
19
- # List of colors to use
20
- COLOR_LIST = %w(blue red green darkorange gold purple hotpink lime cornflowerblue brown coral crimson indigo tan lightblue cyan peru)
21
-
22
- # Used to create large arrays to prevent memory thrashing with large objects
23
- DEFAULT_ARRAY_SIZE = 100000
24
-
25
- # Percent of max seconds saved to achieve hystersis on pruning to
26
- # reduce memory thrashing
27
- PRUNE_HYSTERISIS_PERCENTAGE = 0.10
28
-
29
- # Plot holding this data object (subclass of Plot)
30
- attr_accessor :plot
31
-
32
- # Name of this data object (string or nil)
33
- attr_writer :name
34
-
35
- # Max number of data points saved (integer)
36
- attr_reader :max_points_saved
37
-
38
- # Type of data object (string)
39
- attr_accessor :data_object_type
40
-
41
- # Error associated with this data_object (Exception)
42
- attr_accessor :error
43
-
44
- # Color currently being used to draw the line (string)
45
- attr_accessor :color
46
-
47
- # Assigned Color of the line (string or nil for auto color choice)
48
- attr_accessor :assigned_color
49
-
50
- # This value is the first x value for this data object since reset() was called. It is stored here
51
- # so it can be retrieved even after x values have been pruned.
52
- attr_accessor :first_x_value
53
-
54
- def initialize
55
- @plot = nil
56
- @max_points_saved = nil
57
- @prune_hysterisis = nil
58
- # Start this value at the max float so any x_value will be less than it
59
- @first_x_value = Float::MAX
60
- @error = nil
61
- @assigned_color = nil
62
- @color = COLOR_LIST[0]
63
-
64
- # Type is classname without DataObject
65
- @data_object_type = self.class.to_s[0..-11].upcase
66
- @data_object_type = @data_object_type.split("::")[-1] # remove Cosmos:: if necessary
67
- end # def initialize
68
-
69
- # Returns the configuration lines used to create this data object
70
- def configuration_string
71
- string = " DATA_OBJECT #{@data_object_type}\n"
72
- string << " COLOR #{@assigned_color}\n" if @assigned_color
73
- string
74
- end # def configuration_string
75
-
76
- # Handles data object specific keywords
77
- def handle_keyword(parser, keyword, parameters)
78
- case keyword
79
- when 'COLOR'
80
- # Expect 1 parameter
81
- parser.verify_num_parameters(1, 1, "COLOR <Color Name>")
82
- @assigned_color = parameters[0].downcase
83
- @color = @assigned_color
84
- else
85
- raise ArgumentError, "Unknown keyword received by #{self.class}: #{keyword}"
86
- end
87
- end # def handle_keyword
88
-
89
- # Returns the packets processed by this data object as an array of
90
- # [target_name, packet_name] pairs
91
- def processed_packets
92
- raise "processed_packets must be defined by class #{self.class}"
93
- end
94
-
95
- # Processes a packet associated with this data object
96
- #
97
- # @param packet [Packet] The packet to process
98
- # @param count [Integer] Count which increments for each packet received by
99
- # the higher level process
100
- def process_packet(packet, count)
101
- raise "process_packet must be defined by class #{self.class}"
102
- end
103
-
104
- # Resets the data object's data (everything that is not configuration)
105
- def reset
106
- @error = nil
107
- #Reset this value at the max float so any x_value will be less than it
108
- @first_x_value = Float::MAX
109
- end
110
-
111
- # Supplies text that should be appended to the popup string on mousing over the specified
112
- # x value
113
- def popup_modifier(x_value)
114
- #The default class returns an empty value
115
- return ""
116
- end
117
-
118
- # Exports the data object's data as an array of arrays. Each inner array
119
- # is a column of the output.
120
- def export
121
- raise "export must be defined by class #{self.class}"
122
- end
123
-
124
- # Creates a copy of the data object with settings but without data
125
- def copy
126
- data_object = self.class.new
127
- data_object.assigned_color = @assigned_color.clone if @assigned_color
128
- data_object.color = @color.clone
129
- data_object.max_points_saved = @max_points_saved
130
- data_object
131
- end
132
-
133
- # Edits the data object by updating its settings from another data object
134
- def edit(editted_data_object)
135
- @assigned_color = editted_data_object.assigned_color
136
- @color = editted_data_object.color
137
- self.max_points_saved = editted_data_object.max_points_saved
138
- end
139
-
140
- # Indicates if the changes made to the data object are safe to perform without reseting
141
- # its data
142
- #
143
- # @param edited_data_object [DataObject] The data object which was edited
144
- def edit_safe?(edited_data_object)
145
- true
146
- end
147
-
148
- # Returns the name of this data object
149
- def name
150
- 'Unknown'
151
- end
152
-
153
- # Sets the maximum number of points saved
154
- def max_points_saved=(new_max_points_saved)
155
- @max_points_saved = new_max_points_saved
156
- if @max_points_saved
157
- @prune_hysterisis = (@max_points_saved.to_f * PRUNE_HYSTERISIS_PERCENTAGE).to_i
158
- @prune_hysterisis = 0 if @prune_hysterisis < 0
159
- prune_to_max_points_saved(true) # force prune
160
- else
161
- @prune_hysterisis = nil
162
- end
163
- end
164
-
165
- # Prunes data to max_points_saved
166
- #
167
- # @param force_prune [Boolean] Whether to prune no matter if the
168
- # PRUNE_HYSTERISIS_PERCENTAGE is met. Set to true if the max_points_saved
169
- # is changed to ensure the total is within the new limit.
170
- def prune_to_max_points_saved(force_prune = false)
171
- # Must be implemented by subclasses
172
- return nil
173
- end
174
-
175
- end # class DataObject
176
-
177
- 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'
12
+
13
+ module Cosmos
14
+
15
+ # Represents a data object in a tabbed plots definition
16
+ # Designed for use as a base class for custom data objects
17
+ class DataObject
18
+
19
+ # List of colors to use
20
+ COLOR_LIST = %w(blue red green darkorange gold purple hotpink lime cornflowerblue brown coral crimson indigo tan lightblue cyan peru)
21
+
22
+ # Used to create large arrays to prevent memory thrashing with large objects
23
+ DEFAULT_ARRAY_SIZE = 100000
24
+
25
+ # Percent of max seconds saved to achieve hystersis on pruning to
26
+ # reduce memory thrashing
27
+ PRUNE_HYSTERISIS_PERCENTAGE = 0.10
28
+
29
+ # Plot holding this data object (subclass of Plot)
30
+ attr_accessor :plot
31
+
32
+ # Name of this data object (string or nil)
33
+ attr_writer :name
34
+
35
+ # Max number of data points saved (integer)
36
+ attr_reader :max_points_saved
37
+
38
+ # Type of data object (string)
39
+ attr_accessor :data_object_type
40
+
41
+ # Error associated with this data_object (Exception)
42
+ attr_accessor :error
43
+
44
+ # Color currently being used to draw the line (string)
45
+ attr_accessor :color
46
+
47
+ # Assigned Color of the line (string or nil for auto color choice)
48
+ attr_accessor :assigned_color
49
+
50
+ # This value is the first x value for this data object since reset() was called. It is stored here
51
+ # so it can be retrieved even after x values have been pruned.
52
+ attr_accessor :first_x_value
53
+
54
+ def initialize
55
+ @plot = nil
56
+ @max_points_saved = nil
57
+ @prune_hysterisis = nil
58
+ # Start this value at the max float so any x_value will be less than it
59
+ @first_x_value = Float::MAX
60
+ @error = nil
61
+ @assigned_color = nil
62
+ @color = COLOR_LIST[0]
63
+
64
+ # Type is classname without DataObject
65
+ @data_object_type = self.class.to_s[0..-11].upcase
66
+ @data_object_type = @data_object_type.split("::")[-1] # remove Cosmos:: if necessary
67
+ end # def initialize
68
+
69
+ # Returns the configuration lines used to create this data object
70
+ def configuration_string
71
+ string = " DATA_OBJECT #{@data_object_type}\n"
72
+ string << " COLOR #{@assigned_color}\n" if @assigned_color
73
+ string
74
+ end # def configuration_string
75
+
76
+ # Handles data object specific keywords
77
+ def handle_keyword(parser, keyword, parameters)
78
+ case keyword
79
+ when 'COLOR'
80
+ # Expect 1 parameter
81
+ parser.verify_num_parameters(1, 1, "COLOR <Color Name>")
82
+ @assigned_color = parameters[0].downcase
83
+ @color = @assigned_color
84
+ else
85
+ raise ArgumentError, "Unknown keyword received by #{self.class}: #{keyword}"
86
+ end
87
+ end # def handle_keyword
88
+
89
+ # Returns the packets processed by this data object as an array of
90
+ # [target_name, packet_name] pairs
91
+ def processed_packets
92
+ raise "processed_packets must be defined by class #{self.class}"
93
+ end
94
+
95
+ # Processes a packet associated with this data object
96
+ #
97
+ # @param packet [Packet] The packet to process
98
+ # @param count [Integer] Count which increments for each packet received by
99
+ # the higher level process
100
+ def process_packet(packet, count)
101
+ raise "process_packet must be defined by class #{self.class}"
102
+ end
103
+
104
+ # Resets the data object's data (everything that is not configuration)
105
+ def reset
106
+ @error = nil
107
+ #Reset this value at the max float so any x_value will be less than it
108
+ @first_x_value = Float::MAX
109
+ end
110
+
111
+ # Supplies text that should be appended to the popup string on mousing over the specified
112
+ # x value
113
+ def popup_modifier(x_value)
114
+ #The default class returns an empty value
115
+ return ""
116
+ end
117
+
118
+ # Exports the data object's data as an array of arrays. Each inner array
119
+ # is a column of the output.
120
+ def export
121
+ raise "export must be defined by class #{self.class}"
122
+ end
123
+
124
+ # Creates a copy of the data object with settings but without data
125
+ def copy
126
+ data_object = self.class.new
127
+ data_object.assigned_color = @assigned_color.clone if @assigned_color
128
+ data_object.color = @color.clone
129
+ data_object.max_points_saved = @max_points_saved
130
+ data_object
131
+ end
132
+
133
+ # Edits the data object by updating its settings from another data object
134
+ def edit(editted_data_object)
135
+ @assigned_color = editted_data_object.assigned_color
136
+ @color = editted_data_object.color
137
+ self.max_points_saved = editted_data_object.max_points_saved
138
+ end
139
+
140
+ # Indicates if the changes made to the data object are safe to perform without reseting
141
+ # its data
142
+ #
143
+ # @param edited_data_object [DataObject] The data object which was edited
144
+ def edit_safe?(edited_data_object)
145
+ true
146
+ end
147
+
148
+ # Returns the name of this data object
149
+ def name
150
+ 'Unknown'
151
+ end
152
+
153
+ # Sets the maximum number of points saved
154
+ def max_points_saved=(new_max_points_saved)
155
+ @max_points_saved = new_max_points_saved
156
+ if @max_points_saved
157
+ @prune_hysterisis = (@max_points_saved.to_f * PRUNE_HYSTERISIS_PERCENTAGE).to_i
158
+ @prune_hysterisis = 0 if @prune_hysterisis < 0
159
+ prune_to_max_points_saved(true) # force prune
160
+ else
161
+ @prune_hysterisis = nil
162
+ end
163
+ end
164
+
165
+ # Prunes data to max_points_saved
166
+ #
167
+ # @param force_prune [Boolean] Whether to prune no matter if the
168
+ # PRUNE_HYSTERISIS_PERCENTAGE is met. Set to true if the max_points_saved
169
+ # is changed to ensure the total is within the new limit.
170
+ def prune_to_max_points_saved(force_prune = false)
171
+ # Must be implemented by subclasses
172
+ return nil
173
+ end
174
+
175
+ end # class DataObject
176
+
177
+ end # module Cosmos
@@ -1,409 +1,412 @@
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'
12
- require 'cosmos/tools/tlm_grapher/data_objects/linegraph_data_object'
13
-
14
- module Cosmos
15
-
16
- # Represents a data object on a line graph for a housekeeping telemetry item
17
- class HousekeepingDataObject < LinegraphDataObject
18
-
19
- # Value Types
20
- VALUE_TYPES = [:RAW, :CONVERTED]
21
-
22
- # Analysis Types
23
- ANALYSIS_TYPES = [:NONE, :DIFFERENCE, :WINDOWED_MEAN, :WINDOWED_MEAN_REMOVED, :STD_DEV, :ALLAN_DEV, :MAXIMUM, :MINIMUM, :PEAK_TO_PEAK]
24
-
25
- # The housekeeping telemetry item's target name (string)
26
- attr_reader :target_name
27
-
28
- # The housekeeping telemetry item's packet name (string)
29
- attr_reader :packet_name
30
-
31
- # The housekeeping telemetry item's item name (string)
32
- attr_reader :item_name
33
-
34
- # The housekeeping telemetry item's time item name (string)
35
- attr_accessor :time_item_name
36
-
37
- # The housekeeping telemetry item's formatted time item name (string)
38
- attr_accessor :formatted_time_item_name
39
-
40
- # Type of data to collect - :RAW or :CONVERTED
41
- attr_accessor :value_type
42
-
43
- # The analysis to perform
44
- attr_accessor :analysis
45
-
46
- # The number of samples to use in the analysis (integer)
47
- attr_reader :analysis_samples
48
-
49
- # Automatically show limits line for telemetry item (true or false)
50
- attr_reader :show_limits_lines
51
-
52
- # Limits lines for telemetry item (array)
53
- attr_accessor :limits_lines
54
-
55
- # Create a new data object
56
- def initialize
57
- super()
58
- @target_name = nil
59
- @packet_name = nil
60
- @item_name = nil
61
- @time_item_name = nil
62
- @formatted_time_item_name = nil
63
- @value_type = :CONVERTED
64
- @analysis = :NONE
65
- @analysis_samples = 3
66
- @show_limits_lines = false
67
- @limits_lines = []
68
- @num_samples_ahead = 1
69
- @num_samples_behind = 1
70
- @unprocessed_x_values = LowFragmentationArray.new(DEFAULT_ARRAY_SIZE)
71
- @unprocessed_y_values = LowFragmentationArray.new(DEFAULT_ARRAY_SIZE)
72
- @differenced_y_values = LowFragmentationArray.new(DEFAULT_ARRAY_SIZE)
73
- end # def initialize
74
-
75
- # Returns the configuration lines used to create this data object
76
- def configuration_string
77
- string = super()
78
- string << " ITEM #{@target_name} #{@packet_name} #{@item_name}\n" if @target_name and @packet_name and @item_name
79
- string << " TIME_ITEM #{@time_item_name}\n" if @time_item_name
80
- string << " FORMATTED_TIME_ITEM #{@formatted_time_item_name}\n" if @formatted_time_item_name
81
- string << " VALUE_TYPE #{@value_type}\n"
82
- string << " ANALYSIS #{@analysis}\n"
83
- string << " ANALYSIS_SAMPLES #{@analysis_samples}\n"
84
- string << " SHOW_LIMITS_LINES #{@show_limits_lines.to_s.upcase}\n"
85
- string
86
- end # def configuration_string
87
-
88
- # Handles data object specific keywords
89
- def handle_keyword(parser, keyword, parameters)
90
- case keyword
91
- when 'ITEM'
92
- # Expect 3 parameters
93
- parser.verify_num_parameters(3, 3, "ITEM <Target Name> <Packet Name> <Item Name>")
94
- set_item(parameters[0], parameters[1], parameters[2], true)
95
-
96
- when 'TIME_ITEM'
97
- # Expect 1 parameter
98
- parser.verify_num_parameters(1, 1, "TIME_ITEM <Time Item Name>")
99
- @time_item_name = parameters[0].upcase
100
-
101
- when 'FORMATTED_TIME_ITEM'
102
- # Expect 1 parameter
103
- parser.verify_num_parameters(1, 1, "FORMATTED_TIME_ITEM <Formatted Time Item Name>")
104
- @formatted_time_item_name = parameters[0].upcase
105
-
106
- when 'VALUE_TYPE'
107
- # Expect 1 parameter
108
- parser.verify_num_parameters(1, 1, "VALUE_TYPE <RAW or CONVERTED>")
109
- value_type = parameters[0].upcase.intern
110
- if VALUE_TYPES.include?(value_type)
111
- @value_type = value_type
112
- else
113
- raise ArgumentError, "Unknown VALUE_TYPE value: #{value_type}"
114
- end
115
-
116
- when 'ANALYSIS'
117
- # Expect 1 parameter
118
- parser.verify_num_parameters(1, 1, "ANALYSIS <Analysis Type>")
119
- analysis = parameters[0].upcase.intern
120
- if ANALYSIS_TYPES.include?(analysis)
121
- @analysis = analysis
122
- else
123
- raise ArgumentError, "Unknown ANALYSIS value: #{analysis}"
124
- end
125
-
126
- when 'ANALYSIS_SAMPLES'
127
- # Expect 1 parameter
128
- parser.verify_num_parameters(1, 1, "ANALYSIS_SAMPLES <Number of Samples>")
129
- self.analysis_samples = parameters[0].to_i
130
-
131
- when 'SHOW_LIMITS_LINES'
132
- # Expect 1 parameter
133
- parser.verify_num_parameters(1, 1, "SHOW_LIMITS_LINES <TRUE or FALSE>")
134
- self.show_limits_lines = ConfigParser.handle_true_false(parameters[0])
135
-
136
- else
137
- # Unknown keywords are passed to parent data object
138
- super(parser, keyword, parameters)
139
-
140
- end # case keyword
141
-
142
- end # def handle_keyword
143
-
144
- # Returns the packet processed by this data object
145
- def processed_packets
146
- if @target_name and @packet_name
147
- [[@target_name, @packet_name]]
148
- else
149
- []
150
- end
151
- end
152
-
153
- # (see DataObject#process_packet)
154
- def process_packet(packet, count)
155
- begin
156
- # Retrieve x and y values from packet
157
- x_value = packet.read(@time_item_name)
158
- if @value_type == :RAW
159
- y_value = packet.read(@item_name, :RAW)
160
- else
161
- y_value = packet.read(@item_name)
162
- end
163
- @formatted_x_values << packet.read(@formatted_time_item_name) if @formatted_time_item_name
164
-
165
- upper_index = nil
166
- sample_index = nil
167
- lower_index = nil
168
- if @analysis != :NONE
169
- # Add to unprocessed data
170
- @unprocessed_x_values << x_value
171
- @unprocessed_y_values << y_value
172
-
173
- # Calculate indexes into arrays
174
- upper_index = @unprocessed_y_values.length - 1
175
- sample_index = upper_index - @num_samples_ahead
176
- lower_index = sample_index - @num_samples_behind
177
- end
178
-
179
- case @analysis
180
- when :NONE
181
- @x_values << x_value
182
- @y_values << (y_value + @y_offset)
183
- @plot.redraw_needed = true
184
-
185
- when :DIFFERENCE, :ALLAN_DEV
186
- if @unprocessed_y_values.length > 1
187
- differenced_y_value = y_value - @unprocessed_y_values[-2]
188
-
189
- if @analysis == :DIFFERENCE
190
- @x_values << x_value
191
- @y_values << (differenced_y_value + @y_offset)
192
- @plot.redraw_needed = true
193
- else # @analysis == :ALLAN_DEV
194
- @differenced_y_values[upper_index] = differenced_y_value
195
-
196
- if lower_index >= 1
197
- data = @differenced_y_values[lower_index..upper_index]
198
- @x_values << @unprocessed_x_values[sample_index]
199
- @y_values << (Math.sqrt(data.squared.sum / (@analysis_samples * 2)) + @y_offset)
200
- @plot.redraw_needed = true
201
- end
202
- end
203
- end
204
-
205
- when :WINDOWED_MEAN, :WINDOWED_MEAN_REMOVED, :STD_DEV
206
- if @unprocessed_y_values.length >= @analysis_samples
207
- # Isolate window of data
208
- data = @unprocessed_y_values[lower_index..upper_index]
209
-
210
- # Calculate windowed mean
211
- mean = data.mean
212
-
213
- case @analysis
214
- when :WINDOWED_MEAN
215
- @y_values << (mean + @y_offset)
216
- when :WINDOWED_MEAN_REMOVED
217
- @y_values << (@unprocessed_y_values[sample_index] - mean + @y_offset)
218
- when :STD_DEV
219
- data.map! {|value| value - mean}
220
- @y_values << (Math.sqrt(data.squared.sum / (@analysis_samples - 1)) + @y_offset)
221
- end
222
- @x_values << @unprocessed_x_values[sample_index]
223
- @plot.redraw_needed = true
224
- end
225
-
226
- when :MAXIMUM, :MINIMUM, :PEAK_TO_PEAK
227
- if @unprocessed_y_values.length >= @analysis_samples
228
- case @analysis
229
- when :MAXIMUM
230
- @y_values << (@unprocessed_y_values[lower_index..upper_index].max + @y_offset)
231
- when :MINIMUM
232
- @y_values << (@unprocessed_y_values[lower_index..upper_index].min + @y_offset)
233
- else # :PEAK_TO_PEAK
234
- @y_values << ((@unprocessed_y_values[lower_index..upper_index].max - @unprocessed_y_values[lower_index..upper_index].min) + @y_offset)
235
- end
236
- @x_values << @unprocessed_x_values[sample_index]
237
- @plot.redraw_needed = true
238
- end
239
-
240
- end # case @analysis
241
-
242
- # Make sure the data object's first x value is the smallest x value encountered during packet processing.
243
- # This is the smallest x_value seen since reset() was called, i.e. it doesn't get deleted during pruning.
244
- # We make the assumption that @x_values is ordered, so just check against its first value.
245
- if (@x_values.length > 0) and (@x_values[0] < @first_x_value)
246
- @first_x_value = @x_values[0]
247
- end
248
-
249
- # Prune Data
250
- prune_to_max_points_saved()
251
- rescue Exception => error
252
- raise error if error.class == NoMemoryError
253
- reset()
254
- @error = error
255
- @plot.redraw_needed = true
256
- if error.is_a? TypeError
257
- @error = FatalError.new("Telemetry point #{packet.target_name} #{packet.packet_name} #{@item_name} could not be displayed. This is most likely due to this telemetry point being a String which can't be represented on the graph. Remove the point from the list of telemetry items to cause this exception to go away.\n\n#{error}")
258
- end
259
- end
260
- end # def process_packet
261
-
262
- # Returns the name of this data object
263
- def name
264
- if @target_name and @packet_name and @item_name
265
- if @analysis != :NONE
266
- "#{@target_name} #{@packet_name} #{@item_name} (#{@analysis})"
267
- else
268
- "#{@target_name} #{@packet_name} #{@item_name}"
269
- end
270
- else
271
- ''
272
- end
273
- end
274
-
275
- # Resets the data object
276
- def reset
277
- super()
278
- @unprocessed_x_values = LowFragmentationArray.new(DEFAULT_ARRAY_SIZE)
279
- @unprocessed_y_values = LowFragmentationArray.new(DEFAULT_ARRAY_SIZE)
280
- @differenced_y_values = LowFragmentationArray.new(DEFAULT_ARRAY_SIZE)
281
- end
282
-
283
- # Creates a copy of the data object with settings but without data
284
- def copy
285
- data_object = super()
286
- if @target_name and @packet_name and @item_name
287
- data_object.set_item(@target_name.clone, @packet_name.clone, @item_name.clone)
288
- end
289
- data_object.time_item_name = @time_item_name.clone if @time_item_name
290
- data_object.formatted_time_item_name = @formatted_time_item_name.clone if @formatted_time_item_name
291
- data_object.value_type = @value_type
292
- data_object.analysis = @analysis
293
- data_object.analysis_samples = @analysis_samples
294
- data_object.show_limits_lines = @show_limits_lines
295
- if @target_name
296
- limits_lines = []
297
- get_limits_lines()
298
- @limits_lines.each do |y_value, color|
299
- limits_lines << [y_value, color.clone]
300
- end
301
- data_object.limits_lines = limits_lines
302
- end
303
- data_object
304
- end
305
-
306
- # Edits the data object - show_limits_lines is the only edit_safe? attribute
307
- def edit(editted_data_object)
308
- self.show_limits_lines = editted_data_object.show_limits_lines
309
- super(editted_data_object)
310
- end
311
-
312
- # Determines if changes can be made to the data object without affecting data
313
- #
314
- # @param edited_data_object [DataObject] The data object which was edited
315
- def edit_safe?(editted_data_object)
316
- if @target_name != editted_data_object.target_name or
317
- @packet_name != editted_data_object.packet_name or
318
- @item_name != editted_data_object.item_name or
319
- @time_item_name != editted_data_object.time_item_name or
320
- @formatted_time_item_name != editted_data_object.formatted_time_item_name or
321
- @value_type != editted_data_object.value_type or
322
- @analysis != editted_data_object.analysis or
323
- @analysis_samples != editted_data_object.analysis_samples
324
- false
325
- else
326
- super(editted_data_object)
327
- end
328
- end
329
-
330
- # Sets the housekeeping item
331
- def set_item(target_name, packet_name, item_name, during_configuration = false)
332
- @target_name = target_name
333
- @packet_name = packet_name
334
- @item_name = item_name
335
- _, item = System.telemetry.packet_and_item(@target_name, @packet_name, @item_name)
336
- @y_states = item.states
337
- if @y_states
338
- @value_type = :RAW
339
- else
340
- @value_type = :CONVERTED unless during_configuration
341
- end
342
-
343
- @time_item_name = 'RECEIVED_TIMESECONDS' unless @time_item_name
344
-
345
- # Update limits lines
346
- self.show_limits_lines = @show_limits_lines
347
- end
348
-
349
- # Sets the number of analysis samples
350
- def analysis_samples=(new_analysis_samples)
351
- # Value must be at least 2
352
- if new_analysis_samples <= 1
353
- raise ArgumentError, "Invalid ANALYSIS_SAMPLES value: #{new_analysis_samples}"
354
- else
355
- @analysis_samples = new_analysis_samples
356
- if @analysis_samples % 2 == 0
357
- # Even
358
- @num_samples_ahead = @analysis_samples / 2
359
- @num_samples_behind = @num_samples_ahead - 1
360
- else
361
- # Odd
362
- @num_samples_ahead = (@analysis_samples - 1) / 2
363
- @num_samples_behind = @num_samples_ahead
364
- end
365
- end
366
- end
367
-
368
- # Sets the show limits lines flag
369
- def show_limits_lines=(new_show_limits_lines)
370
- @show_limits_lines = new_show_limits_lines
371
- get_limits_lines()
372
- end
373
-
374
- protected
375
-
376
- def get_limits_lines
377
- if @target_name
378
- _, item = System.telemetry.packet_and_item(@target_name, @packet_name, @item_name)
379
- if item.limits.values
380
- @limits_lines = []
381
- @limits_lines << [item.limits.values[:DEFAULT][0], 'red']
382
- @limits_lines << [item.limits.values[:DEFAULT][1], 'yellow']
383
- if item.limits.values[:DEFAULT].length == 6
384
- @limits_lines << [item.limits.values[:DEFAULT][4], 'green']
385
- @limits_lines << [item.limits.values[:DEFAULT][5], 'green']
386
- end
387
- @limits_lines << [item.limits.values[:DEFAULT][2], 'yellow']
388
- @limits_lines << [item.limits.values[:DEFAULT][3], 'red']
389
- end
390
- end
391
- end
392
-
393
- # (see DataObject#prune_to_max_points_saved)
394
- def prune_to_max_points_saved(force_prune = false)
395
- prune_index = super(force_prune)
396
- if prune_index
397
- # Prune unprocessed
398
- unless @unprocessed_x_values.empty?
399
- @unprocessed_x_values.remove_before!(prune_index)
400
- @unprocessed_y_values.remove_before!(prune_index)
401
- @differenced_y_values.remove_before!(prune_index) if @analysis == :ALLAN_DEV
402
- end
403
- end
404
- prune_index
405
- end
406
-
407
- end # class HousekeepingDataObject
408
-
409
- 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'
12
+ require 'cosmos/tools/tlm_grapher/data_objects/linegraph_data_object'
13
+
14
+ module Cosmos
15
+
16
+ # Represents a data object on a line graph for a housekeeping telemetry item
17
+ class HousekeepingDataObject < LinegraphDataObject
18
+
19
+ # Value Types
20
+ VALUE_TYPES = [:RAW, :CONVERTED]
21
+
22
+ # Analysis Types
23
+ ANALYSIS_TYPES = [:NONE, :DIFFERENCE, :WINDOWED_MEAN, :WINDOWED_MEAN_REMOVED, :STD_DEV, :ALLAN_DEV, :MAXIMUM, :MINIMUM, :PEAK_TO_PEAK]
24
+
25
+ # The housekeeping telemetry item's target name (string)
26
+ attr_reader :target_name
27
+
28
+ # The housekeeping telemetry item's packet name (string)
29
+ attr_reader :packet_name
30
+
31
+ # The housekeeping telemetry item's item name (string)
32
+ attr_reader :item_name
33
+
34
+ # The housekeeping telemetry item's time item name (string)
35
+ attr_accessor :time_item_name
36
+
37
+ # The housekeeping telemetry item's formatted time item name (string)
38
+ attr_accessor :formatted_time_item_name
39
+
40
+ # Type of data to collect - :RAW or :CONVERTED
41
+ attr_accessor :value_type
42
+
43
+ # The analysis to perform
44
+ attr_accessor :analysis
45
+
46
+ # The number of samples to use in the analysis (integer)
47
+ attr_reader :analysis_samples
48
+
49
+ # Automatically show limits line for telemetry item (true or false)
50
+ attr_reader :show_limits_lines
51
+
52
+ # Limits lines for telemetry item (array)
53
+ attr_accessor :limits_lines
54
+
55
+ # Create a new data object
56
+ def initialize
57
+ super()
58
+ @target_name = nil
59
+ @packet_name = nil
60
+ @item_name = nil
61
+ @time_item_name = nil
62
+ @formatted_time_item_name = nil
63
+ @value_type = :CONVERTED
64
+ @analysis = :NONE
65
+ @analysis_samples = 3
66
+ @show_limits_lines = false
67
+ @limits_lines = []
68
+ @num_samples_ahead = 1
69
+ @num_samples_behind = 1
70
+ @unprocessed_x_values = LowFragmentationArray.new(DEFAULT_ARRAY_SIZE)
71
+ @unprocessed_y_values = LowFragmentationArray.new(DEFAULT_ARRAY_SIZE)
72
+ @differenced_y_values = LowFragmentationArray.new(DEFAULT_ARRAY_SIZE)
73
+ end # def initialize
74
+
75
+ # Returns the configuration lines used to create this data object
76
+ def configuration_string
77
+ string = super()
78
+ string << " ITEM #{@target_name} #{@packet_name} #{@item_name}\n" if @target_name and @packet_name and @item_name
79
+ string << " TIME_ITEM #{@time_item_name}\n" if @time_item_name
80
+ string << " FORMATTED_TIME_ITEM #{@formatted_time_item_name}\n" if @formatted_time_item_name
81
+ string << " VALUE_TYPE #{@value_type}\n"
82
+ string << " ANALYSIS #{@analysis}\n"
83
+ string << " ANALYSIS_SAMPLES #{@analysis_samples}\n"
84
+ string << " SHOW_LIMITS_LINES #{@show_limits_lines.to_s.upcase}\n"
85
+ string
86
+ end # def configuration_string
87
+
88
+ # Handles data object specific keywords
89
+ def handle_keyword(parser, keyword, parameters)
90
+ case keyword
91
+ when 'ITEM'
92
+ # Expect 3 parameters
93
+ parser.verify_num_parameters(3, 3, "ITEM <Target Name> <Packet Name> <Item Name>")
94
+ set_item(parameters[0], parameters[1], parameters[2], true)
95
+
96
+ when 'TIME_ITEM'
97
+ # Expect 1 parameter
98
+ parser.verify_num_parameters(1, 1, "TIME_ITEM <Time Item Name>")
99
+ @time_item_name = parameters[0].upcase
100
+
101
+ when 'FORMATTED_TIME_ITEM'
102
+ # Expect 1 parameter
103
+ parser.verify_num_parameters(1, 1, "FORMATTED_TIME_ITEM <Formatted Time Item Name>")
104
+ @formatted_time_item_name = parameters[0].upcase
105
+
106
+ when 'VALUE_TYPE'
107
+ # Expect 1 parameter
108
+ parser.verify_num_parameters(1, 1, "VALUE_TYPE <RAW or CONVERTED>")
109
+ value_type = parameters[0].upcase.intern
110
+ if VALUE_TYPES.include?(value_type)
111
+ @value_type = value_type
112
+ else
113
+ raise ArgumentError, "Unknown VALUE_TYPE value: #{value_type}"
114
+ end
115
+
116
+ when 'ANALYSIS'
117
+ # Expect 1 parameter
118
+ parser.verify_num_parameters(1, 1, "ANALYSIS <Analysis Type>")
119
+ analysis = parameters[0].upcase.intern
120
+ if ANALYSIS_TYPES.include?(analysis)
121
+ @analysis = analysis
122
+ else
123
+ raise ArgumentError, "Unknown ANALYSIS value: #{analysis}"
124
+ end
125
+
126
+ when 'ANALYSIS_SAMPLES'
127
+ # Expect 1 parameter
128
+ parser.verify_num_parameters(1, 1, "ANALYSIS_SAMPLES <Number of Samples>")
129
+ self.analysis_samples = parameters[0].to_i
130
+
131
+ when 'SHOW_LIMITS_LINES'
132
+ # Expect 1 parameter
133
+ parser.verify_num_parameters(1, 1, "SHOW_LIMITS_LINES <TRUE or FALSE>")
134
+ self.show_limits_lines = ConfigParser.handle_true_false(parameters[0])
135
+
136
+ else
137
+ # Unknown keywords are passed to parent data object
138
+ super(parser, keyword, parameters)
139
+
140
+ end # case keyword
141
+
142
+ end # def handle_keyword
143
+
144
+ # Returns the packet processed by this data object
145
+ def processed_packets
146
+ if @target_name and @packet_name
147
+ [[@target_name, @packet_name]]
148
+ else
149
+ []
150
+ end
151
+ end
152
+
153
+ # (see DataObject#process_packet)
154
+ def process_packet(packet, count)
155
+ begin
156
+ # Retrieve x and y values from packet
157
+ x_value = packet.read(@time_item_name)
158
+ if @value_type == :RAW
159
+ y_value = packet.read(@item_name, :RAW)
160
+ else
161
+ y_value = packet.read(@item_name)
162
+ end
163
+ # Bail on the values if they are NaN or nil as we can't graph them
164
+ return if x_value.nan? || y_value.nan? || x_value.nil? || y_value.nil?
165
+
166
+ @formatted_x_values << packet.read(@formatted_time_item_name) if @formatted_time_item_name
167
+
168
+ upper_index = nil
169
+ sample_index = nil
170
+ lower_index = nil
171
+ if @analysis != :NONE
172
+ # Add to unprocessed data
173
+ @unprocessed_x_values << x_value
174
+ @unprocessed_y_values << y_value
175
+
176
+ # Calculate indexes into arrays
177
+ upper_index = @unprocessed_y_values.length - 1
178
+ sample_index = upper_index - @num_samples_ahead
179
+ lower_index = sample_index - @num_samples_behind
180
+ end
181
+
182
+ case @analysis
183
+ when :NONE
184
+ @x_values << x_value
185
+ @y_values << (y_value + @y_offset)
186
+ @plot.redraw_needed = true
187
+
188
+ when :DIFFERENCE, :ALLAN_DEV
189
+ if @unprocessed_y_values.length > 1
190
+ differenced_y_value = y_value - @unprocessed_y_values[-2]
191
+
192
+ if @analysis == :DIFFERENCE
193
+ @x_values << x_value
194
+ @y_values << (differenced_y_value + @y_offset)
195
+ @plot.redraw_needed = true
196
+ else # @analysis == :ALLAN_DEV
197
+ @differenced_y_values[upper_index] = differenced_y_value
198
+
199
+ if lower_index >= 1
200
+ data = @differenced_y_values[lower_index..upper_index]
201
+ @x_values << @unprocessed_x_values[sample_index]
202
+ @y_values << (Math.sqrt(data.squared.sum / (@analysis_samples * 2)) + @y_offset)
203
+ @plot.redraw_needed = true
204
+ end
205
+ end
206
+ end
207
+
208
+ when :WINDOWED_MEAN, :WINDOWED_MEAN_REMOVED, :STD_DEV
209
+ if @unprocessed_y_values.length >= @analysis_samples
210
+ # Isolate window of data
211
+ data = @unprocessed_y_values[lower_index..upper_index]
212
+
213
+ # Calculate windowed mean
214
+ mean = data.mean
215
+
216
+ case @analysis
217
+ when :WINDOWED_MEAN
218
+ @y_values << (mean + @y_offset)
219
+ when :WINDOWED_MEAN_REMOVED
220
+ @y_values << (@unprocessed_y_values[sample_index] - mean + @y_offset)
221
+ when :STD_DEV
222
+ data.map! {|value| value - mean}
223
+ @y_values << (Math.sqrt(data.squared.sum / (@analysis_samples - 1)) + @y_offset)
224
+ end
225
+ @x_values << @unprocessed_x_values[sample_index]
226
+ @plot.redraw_needed = true
227
+ end
228
+
229
+ when :MAXIMUM, :MINIMUM, :PEAK_TO_PEAK
230
+ if @unprocessed_y_values.length >= @analysis_samples
231
+ case @analysis
232
+ when :MAXIMUM
233
+ @y_values << (@unprocessed_y_values[lower_index..upper_index].max + @y_offset)
234
+ when :MINIMUM
235
+ @y_values << (@unprocessed_y_values[lower_index..upper_index].min + @y_offset)
236
+ else # :PEAK_TO_PEAK
237
+ @y_values << ((@unprocessed_y_values[lower_index..upper_index].max - @unprocessed_y_values[lower_index..upper_index].min) + @y_offset)
238
+ end
239
+ @x_values << @unprocessed_x_values[sample_index]
240
+ @plot.redraw_needed = true
241
+ end
242
+
243
+ end # case @analysis
244
+
245
+ # Make sure the data object's first x value is the smallest x value encountered during packet processing.
246
+ # This is the smallest x_value seen since reset() was called, i.e. it doesn't get deleted during pruning.
247
+ # We make the assumption that @x_values is ordered, so just check against its first value.
248
+ if (@x_values.length > 0) and (@x_values[0] < @first_x_value)
249
+ @first_x_value = @x_values[0]
250
+ end
251
+
252
+ # Prune Data
253
+ prune_to_max_points_saved()
254
+ rescue Exception => error
255
+ raise error if error.class == NoMemoryError
256
+ reset()
257
+ @error = error
258
+ @plot.redraw_needed = true
259
+ if error.is_a? TypeError
260
+ @error = FatalError.new("Telemetry point #{packet.target_name} #{packet.packet_name} #{@item_name} could not be displayed. This is most likely due to this telemetry point being a String which can't be represented on the graph. Remove the point from the list of telemetry items to cause this exception to go away.\n\n#{error}")
261
+ end
262
+ end
263
+ end # def process_packet
264
+
265
+ # Returns the name of this data object
266
+ def name
267
+ if @target_name and @packet_name and @item_name
268
+ if @analysis != :NONE
269
+ "#{@target_name} #{@packet_name} #{@item_name} (#{@analysis})"
270
+ else
271
+ "#{@target_name} #{@packet_name} #{@item_name}"
272
+ end
273
+ else
274
+ ''
275
+ end
276
+ end
277
+
278
+ # Resets the data object
279
+ def reset
280
+ super()
281
+ @unprocessed_x_values = LowFragmentationArray.new(DEFAULT_ARRAY_SIZE)
282
+ @unprocessed_y_values = LowFragmentationArray.new(DEFAULT_ARRAY_SIZE)
283
+ @differenced_y_values = LowFragmentationArray.new(DEFAULT_ARRAY_SIZE)
284
+ end
285
+
286
+ # Creates a copy of the data object with settings but without data
287
+ def copy
288
+ data_object = super()
289
+ if @target_name and @packet_name and @item_name
290
+ data_object.set_item(@target_name.clone, @packet_name.clone, @item_name.clone)
291
+ end
292
+ data_object.time_item_name = @time_item_name.clone if @time_item_name
293
+ data_object.formatted_time_item_name = @formatted_time_item_name.clone if @formatted_time_item_name
294
+ data_object.value_type = @value_type
295
+ data_object.analysis = @analysis
296
+ data_object.analysis_samples = @analysis_samples
297
+ data_object.show_limits_lines = @show_limits_lines
298
+ if @target_name
299
+ limits_lines = []
300
+ get_limits_lines()
301
+ @limits_lines.each do |y_value, color|
302
+ limits_lines << [y_value, color.clone]
303
+ end
304
+ data_object.limits_lines = limits_lines
305
+ end
306
+ data_object
307
+ end
308
+
309
+ # Edits the data object - show_limits_lines is the only edit_safe? attribute
310
+ def edit(editted_data_object)
311
+ self.show_limits_lines = editted_data_object.show_limits_lines
312
+ super(editted_data_object)
313
+ end
314
+
315
+ # Determines if changes can be made to the data object without affecting data
316
+ #
317
+ # @param edited_data_object [DataObject] The data object which was edited
318
+ def edit_safe?(editted_data_object)
319
+ if @target_name != editted_data_object.target_name or
320
+ @packet_name != editted_data_object.packet_name or
321
+ @item_name != editted_data_object.item_name or
322
+ @time_item_name != editted_data_object.time_item_name or
323
+ @formatted_time_item_name != editted_data_object.formatted_time_item_name or
324
+ @value_type != editted_data_object.value_type or
325
+ @analysis != editted_data_object.analysis or
326
+ @analysis_samples != editted_data_object.analysis_samples
327
+ false
328
+ else
329
+ super(editted_data_object)
330
+ end
331
+ end
332
+
333
+ # Sets the housekeeping item
334
+ def set_item(target_name, packet_name, item_name, during_configuration = false)
335
+ @target_name = target_name
336
+ @packet_name = packet_name
337
+ @item_name = item_name
338
+ _, item = System.telemetry.packet_and_item(@target_name, @packet_name, @item_name)
339
+ @y_states = item.states
340
+ if @y_states
341
+ @value_type = :RAW
342
+ else
343
+ @value_type = :CONVERTED unless during_configuration
344
+ end
345
+
346
+ @time_item_name = 'RECEIVED_TIMESECONDS' unless @time_item_name
347
+
348
+ # Update limits lines
349
+ self.show_limits_lines = @show_limits_lines
350
+ end
351
+
352
+ # Sets the number of analysis samples
353
+ def analysis_samples=(new_analysis_samples)
354
+ # Value must be at least 2
355
+ if new_analysis_samples <= 1
356
+ raise ArgumentError, "Invalid ANALYSIS_SAMPLES value: #{new_analysis_samples}"
357
+ else
358
+ @analysis_samples = new_analysis_samples
359
+ if @analysis_samples % 2 == 0
360
+ # Even
361
+ @num_samples_ahead = @analysis_samples / 2
362
+ @num_samples_behind = @num_samples_ahead - 1
363
+ else
364
+ # Odd
365
+ @num_samples_ahead = (@analysis_samples - 1) / 2
366
+ @num_samples_behind = @num_samples_ahead
367
+ end
368
+ end
369
+ end
370
+
371
+ # Sets the show limits lines flag
372
+ def show_limits_lines=(new_show_limits_lines)
373
+ @show_limits_lines = new_show_limits_lines
374
+ get_limits_lines()
375
+ end
376
+
377
+ protected
378
+
379
+ def get_limits_lines
380
+ if @target_name
381
+ _, item = System.telemetry.packet_and_item(@target_name, @packet_name, @item_name)
382
+ if item.limits.values
383
+ @limits_lines = []
384
+ @limits_lines << [item.limits.values[:DEFAULT][0], 'red']
385
+ @limits_lines << [item.limits.values[:DEFAULT][1], 'yellow']
386
+ if item.limits.values[:DEFAULT].length == 6
387
+ @limits_lines << [item.limits.values[:DEFAULT][4], 'green']
388
+ @limits_lines << [item.limits.values[:DEFAULT][5], 'green']
389
+ end
390
+ @limits_lines << [item.limits.values[:DEFAULT][2], 'yellow']
391
+ @limits_lines << [item.limits.values[:DEFAULT][3], 'red']
392
+ end
393
+ end
394
+ end
395
+
396
+ # (see DataObject#prune_to_max_points_saved)
397
+ def prune_to_max_points_saved(force_prune = false)
398
+ prune_index = super(force_prune)
399
+ if prune_index
400
+ # Prune unprocessed
401
+ unless @unprocessed_x_values.empty?
402
+ @unprocessed_x_values.remove_before!(prune_index)
403
+ @unprocessed_y_values.remove_before!(prune_index)
404
+ @differenced_y_values.remove_before!(prune_index) if @analysis == :ALLAN_DEV
405
+ end
406
+ end
407
+ prune_index
408
+ end
409
+
410
+ end # class HousekeepingDataObject
411
+
412
+ end # module Cosmos