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,116 +1,116 @@
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
- module Cosmos
12
-
13
- # LineGraph class continued
14
- class LineGraph < Qt::Widget
15
-
16
- # Builds popups associated with an x value
17
- def build_popups_from_x_value(x_value)
18
- # Clear any existing popups
19
- @popups = []
20
-
21
- if x_value <= @x_max and x_value >= @x_min
22
- # Determine how near in x value that the cursor must be to a point
23
- value_delta = ((@x_max - @x_min).to_f / (@graph_right_x - @graph_left_x)) * 3.0 # within 3 pixels
24
-
25
- # Add the popups
26
- add_popups_for_lines(x_value, value_delta)
27
-
28
- # Make sure popups don't overlap
29
- adjust_popup_positions()
30
- end
31
- end # def build_popups_from_x_value
32
-
33
- # Add popups for the lines on one axis
34
- def add_popups_for_lines(x_value, value_delta)
35
- popup_values = @lines.get_left_popup_data(x_value, value_delta, @ordered_x_values, @left_y_min, @left_y_max)
36
- popup_values.concat(@lines.get_right_popup_data(x_value, value_delta, @ordered_x_values, @right_y_min, @right_y_max))
37
- popup_values.each do |x, y, x_text, y_text, item, color, axis|
38
- # The get_xxx_popup_data routine can return an empty array if there are
39
- # no values for the axis so skip any empty arrays (x is nil)
40
- next unless x
41
-
42
- # Determine position in graph coordinates
43
- graph_x = scale_value_to_graph_x(x)
44
- graph_y = scale_value_to_graph_y(y, axis)
45
-
46
- x_text = convert_x_value_to_text(x_text.to_f, @max_x_characters)
47
- if @left_button_pressed
48
- popup_text = "(#{item}) #{x_text}, #{y_text}"
49
- else
50
- popup_text = "#{x_text}, #{y_text}"
51
- end
52
-
53
- # Determine popup's width and height based on width/height of text
54
- metrics = Qt::FontMetrics.new(@font)
55
- popup_width = metrics.width(popup_text) + 10
56
- popup_height = metrics.height + 10
57
-
58
- # Make sure that the popup stays in the graph window on the x axis.
59
- graph_x_adjusted = popup_width + graph_x
60
- if graph_x_adjusted > self.width
61
- graph_x -= popup_width
62
- graph_x = 0 if graph_x < 0
63
- end
64
-
65
- # Make sure that the popup stays in the graph window on the y axis.
66
- graph_y_adjusted = popup_height + graph_y
67
- if graph_y_adjusted > (self.height - 1)
68
- graph_y = self.height - 1 - popup_height
69
- else
70
- graph_y -= popup_height
71
- end
72
- graph_y = 1 if graph_y < 1
73
-
74
- # Add popup
75
- @popups << [popup_text, graph_x, graph_y, popup_width, popup_height, color]
76
- end
77
- end # def add_popups_for_line
78
-
79
- # Algorithm to not overlap popups
80
- def adjust_popup_positions
81
- # Sort popups by graph_y
82
- @popups.sort! {|a,b| a[2] <=> b[2]}
83
-
84
- # Determine if any popups overlap vertically
85
- overlap = false
86
- index = 0
87
- max_index = @popups.length - 1
88
- @popups.each do |popup_text, graph_x, graph_y, popup_width, popup_height, color|
89
- break if index == max_index
90
- if (graph_y + popup_height) > @popups[index + 1][2] # graph_y of next popup
91
- overlap = true
92
- break
93
- end
94
- index += 1
95
- end
96
-
97
- # Handle overlap case
98
- if overlap
99
- # Determine needed statistics
100
- combined_height = 0
101
- @popups.each do |popup_text, graph_x, graph_y, popup_width, popup_height, color|
102
- combined_height += popup_height + 1
103
- end
104
-
105
- # Stack popups around center of canvas
106
- next_graph_y = ((self.height / 2) - (combined_height / 2)).to_i
107
- @popups.length.times do |popup_index|
108
- @popups[popup_index][2] = next_graph_y
109
- next_graph_y += @popups[popup_index][4] + 2
110
- end
111
- end
112
- end # def adjust_popup_positions
113
-
114
- end # class LineGraph
115
- end # module Cosmos
116
-
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
+ module Cosmos
12
+
13
+ # LineGraph class continued
14
+ class LineGraph < Qt::Widget
15
+
16
+ # Builds popups associated with an x value
17
+ def build_popups_from_x_value(x_value)
18
+ # Clear any existing popups
19
+ @popups = []
20
+
21
+ if x_value <= @x_max and x_value >= @x_min
22
+ # Determine how near in x value that the cursor must be to a point
23
+ value_delta = ((@x_max - @x_min).to_f / (@graph_right_x - @graph_left_x)) * 3.0 # within 3 pixels
24
+
25
+ # Add the popups
26
+ add_popups_for_lines(x_value, value_delta)
27
+
28
+ # Make sure popups don't overlap
29
+ adjust_popup_positions()
30
+ end
31
+ end # def build_popups_from_x_value
32
+
33
+ # Add popups for the lines on one axis
34
+ def add_popups_for_lines(x_value, value_delta)
35
+ popup_values = @lines.get_left_popup_data(x_value, value_delta, @ordered_x_values, @left_y_min, @left_y_max)
36
+ popup_values.concat(@lines.get_right_popup_data(x_value, value_delta, @ordered_x_values, @right_y_min, @right_y_max))
37
+ popup_values.each do |x, y, x_text, y_text, item, color, axis|
38
+ # The get_xxx_popup_data routine can return an empty array if there are
39
+ # no values for the axis so skip any empty arrays (x is nil)
40
+ next unless x
41
+
42
+ # Determine position in graph coordinates
43
+ graph_x = scale_value_to_graph_x(x)
44
+ graph_y = scale_value_to_graph_y(y, axis)
45
+
46
+ x_text = convert_x_value_to_text(x_text.to_f, @max_x_characters)
47
+ if @left_button_pressed
48
+ popup_text = "(#{item}) #{x_text}, #{y_text}"
49
+ else
50
+ popup_text = "#{x_text}, #{y_text}"
51
+ end
52
+
53
+ # Determine popup's width and height based on width/height of text
54
+ metrics = Qt::FontMetrics.new(@font)
55
+ popup_width = metrics.width(popup_text) + 10
56
+ popup_height = metrics.height + 10
57
+
58
+ # Make sure that the popup stays in the graph window on the x axis.
59
+ graph_x_adjusted = popup_width + graph_x
60
+ if graph_x_adjusted > self.width
61
+ graph_x -= popup_width
62
+ graph_x = 0 if graph_x < 0
63
+ end
64
+
65
+ # Make sure that the popup stays in the graph window on the y axis.
66
+ graph_y_adjusted = popup_height + graph_y
67
+ if graph_y_adjusted > (self.height - 1)
68
+ graph_y = self.height - 1 - popup_height
69
+ else
70
+ graph_y -= popup_height
71
+ end
72
+ graph_y = 1 if graph_y < 1
73
+
74
+ # Add popup
75
+ @popups << [popup_text, graph_x, graph_y, popup_width, popup_height, color]
76
+ end
77
+ end # def add_popups_for_line
78
+
79
+ # Algorithm to not overlap popups
80
+ def adjust_popup_positions
81
+ # Sort popups by graph_y
82
+ @popups.sort! {|a,b| a[2] <=> b[2]}
83
+
84
+ # Determine if any popups overlap vertically
85
+ overlap = false
86
+ index = 0
87
+ max_index = @popups.length - 1
88
+ @popups.each do |popup_text, graph_x, graph_y, popup_width, popup_height, color|
89
+ break if index == max_index
90
+ if (graph_y + popup_height) > @popups[index + 1][2] # graph_y of next popup
91
+ overlap = true
92
+ break
93
+ end
94
+ index += 1
95
+ end
96
+
97
+ # Handle overlap case
98
+ if overlap
99
+ # Determine needed statistics
100
+ combined_height = 0
101
+ @popups.each do |popup_text, graph_x, graph_y, popup_width, popup_height, color|
102
+ combined_height += popup_height + 1
103
+ end
104
+
105
+ # Stack popups around center of canvas
106
+ next_graph_y = ((self.height / 2) - (combined_height / 2)).to_i
107
+ @popups.length.times do |popup_index|
108
+ @popups[popup_index][2] = next_graph_y
109
+ next_graph_y += @popups[popup_index][4] + 2
110
+ end
111
+ end
112
+ end # def adjust_popup_positions
113
+
114
+ end # class LineGraph
115
+ end # module Cosmos
116
+
@@ -1,460 +1,460 @@
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
- module Cosmos
12
-
13
- # LineGraph class continued
14
- class LineGraph < Qt::Widget
15
-
16
- # Spacer between items
17
- GRAPH_SPACER = 5
18
-
19
- # Determine the size of the actual graph area
20
- def determine_graph_size
21
- metrics = Cosmos.getFontMetrics(@font)
22
-
23
- @graph_left_x = 4 * GRAPH_SPACER
24
- if @left_y_axis_title
25
- @graph_left_x += metrics.width('W') + GRAPH_SPACER
26
- end
27
-
28
- # Determine number of pixels to the right side of graph
29
- @graph_right_x = self.width - 6 * GRAPH_SPACER
30
- if @right_y_axis_title
31
- @graph_right_x -= (metrics.width('W') + GRAPH_SPACER)
32
- end
33
-
34
- # Determine number of pixels above top of graph
35
- if @title
36
- title_metrics = Cosmos.getFontMetrics(@title_font)
37
- title_height = title_metrics.height
38
- else
39
- title_height = 0
40
- end
41
- half_y_max_label_height = (metrics.height / 2)
42
- @graph_top_y = title_height + half_y_max_label_height + GRAPH_SPACER
43
-
44
- # Determine number of pixels below bottom of graph
45
- if @x_axis_title
46
- x_axis_title_height = metrics.height + GRAPH_SPACER / 2
47
- else
48
- x_axis_title_height = 0
49
- end
50
- x_axis_label_height = metrics.height + GRAPH_SPACER
51
- legend_height = 0
52
- if @show_legend && !@lines.empty?
53
- text_y = self.height - 1 - (GRAPH_SPACER * 2)
54
- text_height = metrics.height
55
- if @lines.axes == :BOTH
56
- left_text_y = text_y
57
- right_text_y = text_y
58
- @lines.legend.each do |text, color, axis|
59
- if axis == :LEFT
60
- left_text_y -= text_height
61
- else
62
- right_text_y -= text_height
63
- end
64
- end
65
- if left_text_y < right_text_y
66
- text_y = left_text_y
67
- else
68
- text_y = right_text_y
69
- end
70
- else
71
- @lines.legend.each do |text, color, axis|
72
- text_y -= text_height
73
- end
74
- end
75
- legend_height = self.height - text_y - GRAPH_SPACER
76
- end
77
-
78
- @graph_bottom_y = self.height - 1 - (x_axis_title_height + x_axis_label_height + legend_height) - GRAPH_SPACER - GRAPH_SPACER
79
- end # def determine_graph_size
80
-
81
- # Calculate scaling factors between value and graph coordinates
82
- def calculate_scaling_factors
83
- # Determine the x conversion factor between value coordinates and graph coordinates
84
- if @x_max != @x_min
85
- @x_scale = (@graph_right_x - @graph_left_x).to_f / (@x_max - @x_min).to_f
86
- else
87
- @x_scale = 0.0
88
- end
89
-
90
- # Determine the y conversion factor between value coordinates and graph coordinates
91
- if @left_y_max != @left_y_min
92
- @left_y_scale = (@graph_bottom_y - @graph_top_y).to_f / (@left_y_max - @left_y_min).to_f
93
- else
94
- @left_y_scale = 0.0
95
- end
96
- if @right_y_max != @right_y_min
97
- @right_y_scale = (@graph_bottom_y - @graph_top_y).to_f / (@right_y_max - @right_y_min).to_f
98
- else
99
- @right_y_scale = 0.0
100
- end
101
- end # def calculate_scaling_factors
102
-
103
- # Determine the scale of the graph, either manually or automatically
104
- def scale_graph
105
- if @x_auto_scale
106
- @x_min, @x_max, @x_min_label, @x_max_label = @lines.x_min_max_labels
107
- end
108
- scale = @manual_y_grid_line_scale
109
- if @left_y_auto_scale
110
- @left_y_min, @left_y_max = auto_scale_y_axis(@lines.left_y_value_range, scale)
111
- end
112
- if @right_y_auto_scale
113
- # scale is nil if there are no left lines to allow for autoscalling
114
- scale = nil unless @lines.left_y_axis?
115
- @right_y_min, @right_y_max = auto_scale_y_axis(@lines.right_y_value_range, scale)
116
- end # def scale_graph
117
- end
118
-
119
- # Determine the y minimum and maximum values for the given lines and given
120
- # grid line scale
121
- #
122
- # @param lines [Array] Array of lines containing the x and y values
123
- # @param manual_y_grid_line_scale [Float] Whether there is a manual grid
124
- # line scale. The return values will be multiples of this scale if given.
125
- # @return [Float, Float] The minimum and maximum values
126
- def auto_scale_y_axis(value_range, manual_y_grid_line_scale)
127
- y_max = 1
128
- y_min = -1
129
-
130
- # Ensure we have a valid range of values
131
- if value_range.size
132
- y_min = value_range.first
133
- y_max = value_range.last
134
-
135
- # Add space between values and edges of graph
136
- diff = y_max - y_min
137
- if diff == 0.0 and y_min == 0.0
138
- # Values are all zero so simply add/subtract 1
139
- y_max = 1
140
- y_min = -1
141
- elsif diff == 0.0
142
- # Values are the same but not zero, so separate them by a multiple of their value
143
- y_max = y_max + y_max.abs
144
- y_min = y_min - y_min.abs
145
- else
146
- # Give a 5% margin
147
- y_max += (diff * 0.05)
148
- y_min -= (diff * 0.05)
149
- end
150
-
151
- # Determine rough grid line scale
152
- if manual_y_grid_line_scale
153
- y_grid_line_scale = manual_y_grid_line_scale
154
- else
155
- diff = y_max - y_min
156
- y_grid_line_scale = calculate_base(diff)
157
- end
158
-
159
- # Enforce non-zero scale
160
- y_grid_line_scale = 0.1 if y_grid_line_scale == 0
161
-
162
- # Now move the max and min values so they are multiples of the scale.
163
- y_min = y_min - (y_min % y_grid_line_scale)
164
- y_min -= y_grid_line_scale if y_min == 0
165
- y_max = y_max - (y_max % y_grid_line_scale) + y_grid_line_scale
166
- end
167
-
168
- return y_min, y_max
169
- end # def auto_scale_y_axis
170
-
171
- # Builds y gridlines for an axis
172
- def build_y_grid_lines(axis)
173
- @y_grid_lines = []
174
-
175
- case axis
176
- when :NONE
177
- return # Nothing to do if there are no lines
178
- when :LEFT, :BOTH
179
- y_max = @left_y_max
180
- y_min = @left_y_min
181
- y_auto_scale = @left_y_auto_scale
182
- axis = :LEFT
183
- when :RIGHT
184
- y_max = @right_y_max
185
- y_min = @right_y_min
186
- y_auto_scale = @right_y_auto_scale
187
- end
188
-
189
- @y_grid_line_scale = determine_grid_line_scale(@manual_y_grid_line_scale, y_min, y_max)
190
- if @show_y_grid_lines
191
- states = @lines.unique_y_states(axis)
192
- if states
193
- states.each do |state_name, state_value|
194
- state_value_float = state_value.to_f
195
- max_length = 0
196
- if state_value_float <= y_max and state_value_float >= y_min
197
- # Add gridline for state
198
- @y_grid_lines << state_value
199
- max_length = state_name.length if state_name.length > max_length
200
- end
201
- if (max_length + 1) > @max_y_characters
202
- @max_y_characters = max_length + 1
203
- determine_graph_size()
204
- end
205
- end
206
- else
207
- calculate_y_grid_lines(y_min, y_max)
208
- end
209
- else
210
- # Just show max and min
211
- @y_grid_lines << y_max
212
- @y_grid_lines << y_min
213
- end
214
- end
215
-
216
- def calculate_y_grid_lines(y_min, y_max)
217
- if @manual_y_grid_line_scale
218
- # With manual grid lines, draw them all regardless of whether it will look nice
219
- @y_grid_lines << y_min
220
- grid_value = y_min + @y_grid_line_scale
221
- if grid_value != y_min
222
- while grid_value < (y_max - (@y_grid_line_scale / 2.0))
223
- @y_grid_lines << grid_value
224
- grid_value += @y_grid_line_scale
225
- end
226
- end
227
- @y_grid_lines << y_max
228
- else
229
- # Determine a nice number of gridlines to show not including edges
230
- metrics = Cosmos.getFontMetrics(@font)
231
- label_size = metrics.height
232
- # Calculate the maximum nubmer of grid lines based on the number of
233
- # labels that can fit. Then add one because the top line can choose
234
- # not to display its label.
235
- max_grid_lines = (@graph_bottom_y - @graph_top_y) / label_size + 1
236
- max_grid_lines = 2 if max_grid_lines < 2
237
-
238
- # Calculate all the possible values between the y minimum and y
239
- # maximum based on the y scale. These are all possible grid lines.
240
- possible_grid_lines = []
241
- possible_grid_lines << y_min
242
- grid_value = y_min + @y_grid_line_scale
243
- if grid_value != y_min
244
- while grid_value < (y_max - (@y_grid_line_scale / 2.0))
245
- possible_grid_lines << grid_value
246
- grid_value += @y_grid_line_scale
247
- end
248
- end
249
- possible_grid_lines << y_max
250
-
251
- # Calculate the index through the possible grid lines by dividing
252
- # the total possible by the maximum that will fit on the graph.
253
- # Round up the integer math by adding 1.
254
- num_possible = possible_grid_lines.length
255
- increment = (num_possible / max_grid_lines) + 1
256
-
257
- @y_grid_lines << y_min
258
- if increment > 0
259
- index = increment
260
- while index < (num_possible - increment)
261
- @y_grid_lines << possible_grid_lines[index]
262
- index += increment
263
- end
264
- # Add the final increment as long as it doesn't reach the max
265
- if possible_grid_lines[index] != y_max
266
- @y_grid_lines << possible_grid_lines[index]
267
- end
268
- end
269
- @y_grid_lines << y_max
270
- end
271
- end
272
-
273
- # Builds x gridlines
274
- def build_x_grid_lines
275
- @x_grid_lines = []
276
-
277
- @x_grid_line_scale = determine_grid_line_scale(@manual_x_grid_line_scale, @x_min, @x_max)
278
- if @manual_x_grid_line_scale
279
- @x_grid_line_scale = @manual_x_grid_line_scale
280
- else
281
- diff = @x_max - @x_min
282
- @x_grid_line_scale = calculate_base(diff)
283
- end
284
- @x_grid_line_scale = 1.0 if @x_grid_line_scale < 1
285
-
286
- if @show_x_grid_lines
287
- states = @lines.single_line_with_x_states
288
- if states
289
- states.each do |state_name, state_value|
290
- state_value_float = state_value.to_f
291
- max_length = 0
292
- if state_value_float <= @x_max and state_value_float >= @x_min
293
- # Add gridline for state
294
- @x_grid_lines << [state_value, state_name]
295
- max_length = state_name.length if state_name.length > max_length
296
- end
297
- if (max_length + 1) > @max_x_characters
298
- @max_x_characters = max_length + 1
299
- determine_graph_size()
300
- end
301
- end
302
- else
303
- calculate_x_grid_lines()
304
- end
305
- else
306
- if @x_max_label or @x_min_label
307
- x_max_length = @x_max_label.to_s.length
308
- x_min_length = @x_min_label.to_s.length
309
- if x_max_length > x_min_length
310
- max_length = x_max_length
311
- else
312
- max_length = x_min_length
313
- end
314
- if (max_length + 1) > @max_x_characters
315
- @max_x_characters = max_length + 1
316
- determine_graph_size()
317
- end
318
- end
319
-
320
- # Just show max and min
321
- @x_grid_lines << [@x_max, @x_max_label]
322
- @x_grid_lines << [@x_min, @x_min_label]
323
- end
324
- end # def build_x_grid_lines
325
-
326
- # Calculate the x gride lines for the graph
327
- def calculate_x_grid_lines
328
- if @manual_x_grid_line_scale
329
- # With manual grid lines, draw them all regardless of whether it will look nice
330
- @x_grid_lines << [@x_min, nil]
331
- grid_value = @x_min + @x_grid_line_scale
332
- if grid_value != @x_min
333
- while grid_value < (@x_max - (@x_grid_line_scale / 2.0))
334
- @x_grid_lines << [grid_value, nil]
335
- grid_value += @x_grid_line_scale
336
- end
337
- end
338
- @x_grid_lines << [@x_max, nil]
339
- else
340
- # Determine a nice number of gridlines to show not including edges
341
- metrics = Cosmos.getFontMetrics(@font)
342
- label_size = metrics.width("HH:MM:SS:XXX")
343
- # Calculate the maximum number of grid lines based on the number
344
- # of labels that can fit. Then add one because the far right line
345
- # can choose not to display its label.
346
- max_grid_lines = (@graph_right_x - @graph_left_x) / label_size + 1
347
- max_grid_lines = 2 if max_grid_lines < 2
348
-
349
- # Calculate all the possible values between the x minimum and x
350
- # maximum based on the x scale. These are all possible grid lines.
351
- possible_grid_lines = []
352
- possible_grid_lines << @x_min
353
- grid_value = @x_min + @x_grid_line_scale
354
- if grid_value != @x_min
355
- while grid_value < (@x_max - (@x_grid_line_scale / 2.0))
356
- possible_grid_lines << grid_value
357
- grid_value += @x_grid_line_scale
358
- end
359
- end
360
- possible_grid_lines << @x_max
361
-
362
- # Calculate the index through the possible grid lines by dividing
363
- # the total possible by the maximum that will fit on the graph.
364
- # Round up the integer math by adding 1.
365
- num_possible = possible_grid_lines.length
366
- increment = (num_possible / max_grid_lines) + 1
367
-
368
- # Store off all the grid lines that will be displayed
369
- @x_grid_lines << [@x_min, nil] # far left line
370
- if increment > 0
371
- index = increment
372
- while index < (num_possible - increment)
373
- @x_grid_lines << [possible_grid_lines[index], nil]
374
- index += increment
375
- end
376
- # Add the final increment as long as it doesn't reach the max
377
- if possible_grid_lines[index] != @x_max
378
- @x_grid_lines << [possible_grid_lines[index], nil]
379
- end
380
- end
381
- @x_grid_lines << [@x_max, nil] # far right line
382
- end
383
- end
384
-
385
- # This function is used to calculate the "base" for a value. In this case,
386
- # the base is defined to be the largest power of 10 that can be used to
387
- # create a scale from 0 to the value with at least 10 values.
388
- # Ex: calculate_base(100) = 10
389
- # calculate_base(99) = 1
390
- # calculate_base(10) = 1
391
- # calculate_base(9) = 0.1
392
- # calculate_base(1) = 0.1
393
- # calculate_base(0.9) = 0.01
394
- # calculate_base(0.1) = 0.01
395
- # calculate_base(0) = 1 # this one is arbitrary but we don't want to return 0
396
- def calculate_base(value)
397
- base = value.abs
398
- operations = 0
399
- if base >= 1
400
- while (true)
401
- base = base / 10
402
- if base < 1
403
- break
404
- end
405
- operations += 1
406
- end
407
- elsif base != 0
408
- operations = -1
409
- while (true)
410
- base = base * 10
411
- if base >= 1
412
- break
413
- end
414
- operations -= 1
415
- end
416
- else
417
- operations = 1
418
- end
419
- return (10**(operations - 1)).to_f
420
- end # def calculate_base
421
-
422
- # This function converts an x coordinate on the graph to an x value
423
- def scale_graph_to_value_x(x)
424
- if (@x_min - @x_max) != 0
425
- x_scaled = ((x - @graph_left_x).to_f / @x_scale) + @x_min
426
- else
427
- x_scaled = 0
428
- end
429
- return x_scaled
430
- end # def scale_graph_to_value_x
431
-
432
- # This function converts an x value to an x coordinate on the graph
433
- # def scale_value_to_graph_x(x)
434
-
435
- # This function converts a y value to a y coordinate on the graph
436
- # def scale_value_to_graph_y(y, axis = :LEFT)
437
-
438
- # This function converts a left axis y value to a right axis y value
439
- def scale_left_to_right_y(left_y)
440
- slope = (@right_y_max - @right_y_min) / (@left_y_max - @left_y_min)
441
- offset = @right_y_max - (@left_y_max * slope)
442
- return ((left_y * slope) + offset)
443
- end
444
-
445
- protected
446
-
447
- def determine_grid_line_scale(manual_grid_line_scale, min, max)
448
- if manual_grid_line_scale
449
- scale = manual_grid_line_scale
450
- else
451
- diff = max - min
452
- scale = calculate_base(diff)
453
- end
454
- scale = 1.0 if scale < 1
455
- return scale
456
- end
457
-
458
- end # class LineGraph
459
-
460
- 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
+ module Cosmos
12
+
13
+ # LineGraph class continued
14
+ class LineGraph < Qt::Widget
15
+
16
+ # Spacer between items
17
+ GRAPH_SPACER = 5
18
+
19
+ # Determine the size of the actual graph area
20
+ def determine_graph_size
21
+ metrics = Cosmos.getFontMetrics(@font)
22
+
23
+ @graph_left_x = 4 * GRAPH_SPACER
24
+ if @left_y_axis_title
25
+ @graph_left_x += metrics.width('W') + GRAPH_SPACER
26
+ end
27
+
28
+ # Determine number of pixels to the right side of graph
29
+ @graph_right_x = self.width - 6 * GRAPH_SPACER
30
+ if @right_y_axis_title
31
+ @graph_right_x -= (metrics.width('W') + GRAPH_SPACER)
32
+ end
33
+
34
+ # Determine number of pixels above top of graph
35
+ if @title
36
+ title_metrics = Cosmos.getFontMetrics(@title_font)
37
+ title_height = title_metrics.height
38
+ else
39
+ title_height = 0
40
+ end
41
+ half_y_max_label_height = (metrics.height / 2)
42
+ @graph_top_y = title_height + half_y_max_label_height + GRAPH_SPACER
43
+
44
+ # Determine number of pixels below bottom of graph
45
+ if @x_axis_title
46
+ x_axis_title_height = metrics.height + GRAPH_SPACER / 2
47
+ else
48
+ x_axis_title_height = 0
49
+ end
50
+ x_axis_label_height = metrics.height + GRAPH_SPACER
51
+ legend_height = 0
52
+ if @show_legend && !@lines.empty?
53
+ text_y = self.height - 1 - (GRAPH_SPACER * 2)
54
+ text_height = metrics.height
55
+ if @lines.axes == :BOTH
56
+ left_text_y = text_y
57
+ right_text_y = text_y
58
+ @lines.legend.each do |text, color, axis|
59
+ if axis == :LEFT
60
+ left_text_y -= text_height
61
+ else
62
+ right_text_y -= text_height
63
+ end
64
+ end
65
+ if left_text_y < right_text_y
66
+ text_y = left_text_y
67
+ else
68
+ text_y = right_text_y
69
+ end
70
+ else
71
+ @lines.legend.each do |text, color, axis|
72
+ text_y -= text_height
73
+ end
74
+ end
75
+ legend_height = self.height - text_y - GRAPH_SPACER
76
+ end
77
+
78
+ @graph_bottom_y = self.height - 1 - (x_axis_title_height + x_axis_label_height + legend_height) - GRAPH_SPACER - GRAPH_SPACER
79
+ end # def determine_graph_size
80
+
81
+ # Calculate scaling factors between value and graph coordinates
82
+ def calculate_scaling_factors
83
+ # Determine the x conversion factor between value coordinates and graph coordinates
84
+ if @x_max != @x_min
85
+ @x_scale = (@graph_right_x - @graph_left_x).to_f / (@x_max - @x_min).to_f
86
+ else
87
+ @x_scale = 0.0
88
+ end
89
+
90
+ # Determine the y conversion factor between value coordinates and graph coordinates
91
+ if @left_y_max != @left_y_min
92
+ @left_y_scale = (@graph_bottom_y - @graph_top_y).to_f / (@left_y_max - @left_y_min).to_f
93
+ else
94
+ @left_y_scale = 0.0
95
+ end
96
+ if @right_y_max != @right_y_min
97
+ @right_y_scale = (@graph_bottom_y - @graph_top_y).to_f / (@right_y_max - @right_y_min).to_f
98
+ else
99
+ @right_y_scale = 0.0
100
+ end
101
+ end # def calculate_scaling_factors
102
+
103
+ # Determine the scale of the graph, either manually or automatically
104
+ def scale_graph
105
+ if @x_auto_scale
106
+ @x_min, @x_max, @x_min_label, @x_max_label = @lines.x_min_max_labels
107
+ end
108
+ scale = @manual_y_grid_line_scale
109
+ if @left_y_auto_scale
110
+ @left_y_min, @left_y_max = auto_scale_y_axis(@lines.left_y_value_range, scale)
111
+ end
112
+ if @right_y_auto_scale
113
+ # scale is nil if there are no left lines to allow for autoscalling
114
+ scale = nil unless @lines.left_y_axis?
115
+ @right_y_min, @right_y_max = auto_scale_y_axis(@lines.right_y_value_range, scale)
116
+ end # def scale_graph
117
+ end
118
+
119
+ # Determine the y minimum and maximum values for the given lines and given
120
+ # grid line scale
121
+ #
122
+ # @param lines [Array] Array of lines containing the x and y values
123
+ # @param manual_y_grid_line_scale [Float] Whether there is a manual grid
124
+ # line scale. The return values will be multiples of this scale if given.
125
+ # @return [Float, Float] The minimum and maximum values
126
+ def auto_scale_y_axis(value_range, manual_y_grid_line_scale)
127
+ y_max = 1
128
+ y_min = -1
129
+
130
+ # Ensure we have a valid range of values
131
+ if value_range.size
132
+ y_min = value_range.first
133
+ y_max = value_range.last
134
+
135
+ # Add space between values and edges of graph
136
+ diff = y_max - y_min
137
+ if diff == 0.0 and y_min == 0.0
138
+ # Values are all zero so simply add/subtract 1
139
+ y_max = 1
140
+ y_min = -1
141
+ elsif diff == 0.0
142
+ # Values are the same but not zero, so separate them by a multiple of their value
143
+ y_max = y_max + y_max.abs
144
+ y_min = y_min - y_min.abs
145
+ else
146
+ # Give a 5% margin
147
+ y_max += (diff * 0.05)
148
+ y_min -= (diff * 0.05)
149
+ end
150
+
151
+ # Determine rough grid line scale
152
+ if manual_y_grid_line_scale
153
+ y_grid_line_scale = manual_y_grid_line_scale
154
+ else
155
+ diff = y_max - y_min
156
+ y_grid_line_scale = calculate_base(diff)
157
+ end
158
+
159
+ # Enforce non-zero scale
160
+ y_grid_line_scale = 0.1 if y_grid_line_scale == 0
161
+
162
+ # Now move the max and min values so they are multiples of the scale.
163
+ y_min = y_min - (y_min % y_grid_line_scale)
164
+ y_min -= y_grid_line_scale if y_min == 0
165
+ y_max = y_max - (y_max % y_grid_line_scale) + y_grid_line_scale
166
+ end
167
+
168
+ return y_min, y_max
169
+ end # def auto_scale_y_axis
170
+
171
+ # Builds y gridlines for an axis
172
+ def build_y_grid_lines(axis)
173
+ @y_grid_lines = []
174
+
175
+ case axis
176
+ when :NONE
177
+ return # Nothing to do if there are no lines
178
+ when :LEFT, :BOTH
179
+ y_max = @left_y_max
180
+ y_min = @left_y_min
181
+ y_auto_scale = @left_y_auto_scale
182
+ axis = :LEFT
183
+ when :RIGHT
184
+ y_max = @right_y_max
185
+ y_min = @right_y_min
186
+ y_auto_scale = @right_y_auto_scale
187
+ end
188
+
189
+ @y_grid_line_scale = determine_grid_line_scale(@manual_y_grid_line_scale, y_min, y_max)
190
+ if @show_y_grid_lines
191
+ states = @lines.unique_y_states(axis)
192
+ if states
193
+ states.each do |state_name, state_value|
194
+ state_value_float = state_value.to_f
195
+ max_length = 0
196
+ if state_value_float <= y_max and state_value_float >= y_min
197
+ # Add gridline for state
198
+ @y_grid_lines << state_value
199
+ max_length = state_name.length if state_name.length > max_length
200
+ end
201
+ if (max_length + 1) > @max_y_characters
202
+ @max_y_characters = max_length + 1
203
+ determine_graph_size()
204
+ end
205
+ end
206
+ else
207
+ calculate_y_grid_lines(y_min, y_max)
208
+ end
209
+ else
210
+ # Just show max and min
211
+ @y_grid_lines << y_max
212
+ @y_grid_lines << y_min
213
+ end
214
+ end
215
+
216
+ def calculate_y_grid_lines(y_min, y_max)
217
+ if @manual_y_grid_line_scale
218
+ # With manual grid lines, draw them all regardless of whether it will look nice
219
+ @y_grid_lines << y_min
220
+ grid_value = y_min + @y_grid_line_scale
221
+ if grid_value != y_min
222
+ while grid_value < (y_max - (@y_grid_line_scale / 2.0))
223
+ @y_grid_lines << grid_value
224
+ grid_value += @y_grid_line_scale
225
+ end
226
+ end
227
+ @y_grid_lines << y_max
228
+ else
229
+ # Determine a nice number of gridlines to show not including edges
230
+ metrics = Cosmos.getFontMetrics(@font)
231
+ label_size = metrics.height
232
+ # Calculate the maximum nubmer of grid lines based on the number of
233
+ # labels that can fit. Then add one because the top line can choose
234
+ # not to display its label.
235
+ max_grid_lines = (@graph_bottom_y - @graph_top_y) / label_size + 1
236
+ max_grid_lines = 2 if max_grid_lines < 2
237
+
238
+ # Calculate all the possible values between the y minimum and y
239
+ # maximum based on the y scale. These are all possible grid lines.
240
+ possible_grid_lines = []
241
+ possible_grid_lines << y_min
242
+ grid_value = y_min + @y_grid_line_scale
243
+ if grid_value != y_min
244
+ while grid_value < (y_max - (@y_grid_line_scale / 2.0))
245
+ possible_grid_lines << grid_value
246
+ grid_value += @y_grid_line_scale
247
+ end
248
+ end
249
+ possible_grid_lines << y_max
250
+
251
+ # Calculate the index through the possible grid lines by dividing
252
+ # the total possible by the maximum that will fit on the graph.
253
+ # Round up the integer math by adding 1.
254
+ num_possible = possible_grid_lines.length
255
+ increment = (num_possible / max_grid_lines) + 1
256
+
257
+ @y_grid_lines << y_min
258
+ if increment > 0
259
+ index = increment
260
+ while index < (num_possible - increment)
261
+ @y_grid_lines << possible_grid_lines[index]
262
+ index += increment
263
+ end
264
+ # Add the final increment as long as it doesn't reach the max
265
+ if possible_grid_lines[index] != y_max
266
+ @y_grid_lines << possible_grid_lines[index]
267
+ end
268
+ end
269
+ @y_grid_lines << y_max
270
+ end
271
+ end
272
+
273
+ # Builds x gridlines
274
+ def build_x_grid_lines
275
+ @x_grid_lines = []
276
+
277
+ @x_grid_line_scale = determine_grid_line_scale(@manual_x_grid_line_scale, @x_min, @x_max)
278
+ if @manual_x_grid_line_scale
279
+ @x_grid_line_scale = @manual_x_grid_line_scale
280
+ else
281
+ diff = @x_max - @x_min
282
+ @x_grid_line_scale = calculate_base(diff)
283
+ end
284
+ @x_grid_line_scale = 1.0 if @x_grid_line_scale < 1
285
+
286
+ if @show_x_grid_lines
287
+ states = @lines.single_line_with_x_states
288
+ if states
289
+ states.each do |state_name, state_value|
290
+ state_value_float = state_value.to_f
291
+ max_length = 0
292
+ if state_value_float <= @x_max and state_value_float >= @x_min
293
+ # Add gridline for state
294
+ @x_grid_lines << [state_value, state_name]
295
+ max_length = state_name.length if state_name.length > max_length
296
+ end
297
+ if (max_length + 1) > @max_x_characters
298
+ @max_x_characters = max_length + 1
299
+ determine_graph_size()
300
+ end
301
+ end
302
+ else
303
+ calculate_x_grid_lines()
304
+ end
305
+ else
306
+ if @x_max_label or @x_min_label
307
+ x_max_length = @x_max_label.to_s.length
308
+ x_min_length = @x_min_label.to_s.length
309
+ if x_max_length > x_min_length
310
+ max_length = x_max_length
311
+ else
312
+ max_length = x_min_length
313
+ end
314
+ if (max_length + 1) > @max_x_characters
315
+ @max_x_characters = max_length + 1
316
+ determine_graph_size()
317
+ end
318
+ end
319
+
320
+ # Just show max and min
321
+ @x_grid_lines << [@x_max, @x_max_label]
322
+ @x_grid_lines << [@x_min, @x_min_label]
323
+ end
324
+ end # def build_x_grid_lines
325
+
326
+ # Calculate the x gride lines for the graph
327
+ def calculate_x_grid_lines
328
+ if @manual_x_grid_line_scale
329
+ # With manual grid lines, draw them all regardless of whether it will look nice
330
+ @x_grid_lines << [@x_min, nil]
331
+ grid_value = @x_min + @x_grid_line_scale
332
+ if grid_value != @x_min
333
+ while grid_value < (@x_max - (@x_grid_line_scale / 2.0))
334
+ @x_grid_lines << [grid_value, nil]
335
+ grid_value += @x_grid_line_scale
336
+ end
337
+ end
338
+ @x_grid_lines << [@x_max, nil]
339
+ else
340
+ # Determine a nice number of gridlines to show not including edges
341
+ metrics = Cosmos.getFontMetrics(@font)
342
+ label_size = metrics.width("HH:MM:SS:XXX")
343
+ # Calculate the maximum number of grid lines based on the number
344
+ # of labels that can fit. Then add one because the far right line
345
+ # can choose not to display its label.
346
+ max_grid_lines = (@graph_right_x - @graph_left_x) / label_size + 1
347
+ max_grid_lines = 2 if max_grid_lines < 2
348
+
349
+ # Calculate all the possible values between the x minimum and x
350
+ # maximum based on the x scale. These are all possible grid lines.
351
+ possible_grid_lines = []
352
+ possible_grid_lines << @x_min
353
+ grid_value = @x_min + @x_grid_line_scale
354
+ if grid_value != @x_min
355
+ while grid_value < (@x_max - (@x_grid_line_scale / 2.0))
356
+ possible_grid_lines << grid_value
357
+ grid_value += @x_grid_line_scale
358
+ end
359
+ end
360
+ possible_grid_lines << @x_max
361
+
362
+ # Calculate the index through the possible grid lines by dividing
363
+ # the total possible by the maximum that will fit on the graph.
364
+ # Round up the integer math by adding 1.
365
+ num_possible = possible_grid_lines.length
366
+ increment = (num_possible / max_grid_lines) + 1
367
+
368
+ # Store off all the grid lines that will be displayed
369
+ @x_grid_lines << [@x_min, nil] # far left line
370
+ if increment > 0
371
+ index = increment
372
+ while index < (num_possible - increment)
373
+ @x_grid_lines << [possible_grid_lines[index], nil]
374
+ index += increment
375
+ end
376
+ # Add the final increment as long as it doesn't reach the max
377
+ if possible_grid_lines[index] != @x_max
378
+ @x_grid_lines << [possible_grid_lines[index], nil]
379
+ end
380
+ end
381
+ @x_grid_lines << [@x_max, nil] # far right line
382
+ end
383
+ end
384
+
385
+ # This function is used to calculate the "base" for a value. In this case,
386
+ # the base is defined to be the largest power of 10 that can be used to
387
+ # create a scale from 0 to the value with at least 10 values.
388
+ # Ex: calculate_base(100) = 10
389
+ # calculate_base(99) = 1
390
+ # calculate_base(10) = 1
391
+ # calculate_base(9) = 0.1
392
+ # calculate_base(1) = 0.1
393
+ # calculate_base(0.9) = 0.01
394
+ # calculate_base(0.1) = 0.01
395
+ # calculate_base(0) = 1 # this one is arbitrary but we don't want to return 0
396
+ def calculate_base(value)
397
+ base = value.abs
398
+ operations = 0
399
+ if base >= 1
400
+ while (true)
401
+ base = base / 10
402
+ if base < 1
403
+ break
404
+ end
405
+ operations += 1
406
+ end
407
+ elsif base != 0
408
+ operations = -1
409
+ while (true)
410
+ base = base * 10
411
+ if base >= 1
412
+ break
413
+ end
414
+ operations -= 1
415
+ end
416
+ else
417
+ operations = 1
418
+ end
419
+ return (10**(operations - 1)).to_f
420
+ end # def calculate_base
421
+
422
+ # This function converts an x coordinate on the graph to an x value
423
+ def scale_graph_to_value_x(x)
424
+ if (@x_min - @x_max) != 0
425
+ x_scaled = ((x - @graph_left_x).to_f / @x_scale) + @x_min
426
+ else
427
+ x_scaled = 0
428
+ end
429
+ return x_scaled
430
+ end # def scale_graph_to_value_x
431
+
432
+ # This function converts an x value to an x coordinate on the graph
433
+ # def scale_value_to_graph_x(x)
434
+
435
+ # This function converts a y value to a y coordinate on the graph
436
+ # def scale_value_to_graph_y(y, axis = :LEFT)
437
+
438
+ # This function converts a left axis y value to a right axis y value
439
+ def scale_left_to_right_y(left_y)
440
+ slope = (@right_y_max - @right_y_min) / (@left_y_max - @left_y_min)
441
+ offset = @right_y_max - (@left_y_max * slope)
442
+ return ((left_y * slope) + offset)
443
+ end
444
+
445
+ protected
446
+
447
+ def determine_grid_line_scale(manual_grid_line_scale, min, max)
448
+ if manual_grid_line_scale
449
+ scale = manual_grid_line_scale
450
+ else
451
+ diff = max - min
452
+ scale = calculate_base(diff)
453
+ end
454
+ scale = 1.0 if scale < 1
455
+ return scale
456
+ end
457
+
458
+ end # class LineGraph
459
+
460
+ end # module Cosmos