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,146 +1,146 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'cosmos'
12
- require 'cosmos/gui/opengl/opengl'
13
-
14
- module Cosmos
15
-
16
- class GlShape
17
- attr_accessor :base_color
18
- attr_accessor :click_handler
19
- attr_accessor :doubleclick_handler
20
- attr_reader :color
21
- attr_accessor :position
22
- attr_reader :rotation_x
23
- attr_reader :rotation_y
24
- attr_reader :rotation_z
25
- attr_accessor :tipText
26
- attr_accessor :dragable
27
-
28
- #Constructor for the StlShape class
29
- def initialize(x, y, z)
30
- @color = [0.5, 0.5, 0.5, 1.0]
31
- @base_color = [0.5, 0.5, 0.5, 1.0]
32
- @position = [x, y, z]
33
- @rotation_x = nil
34
- @rotation_y = nil
35
- @rotation_z = nil
36
- @viewer = nil
37
- @front_material = GlMaterial.new
38
- @back_material = nil
39
- @tipText = nil
40
- @dragable = true
41
- end
42
-
43
- def draw(viewer)
44
- GL.PushAttrib(GL::CURRENT_BIT | GL::LIGHTING_BIT | GL::POINT_BIT | GL::LINE_BIT)
45
- GL.PushMatrix
46
-
47
- # Object position
48
- GL::Translatef(@position[0], @position[1], @position[2])
49
-
50
- # Shading
51
- GL.Enable(GL::LIGHTING)
52
- GL.Enable(GL::AUTO_NORMAL)
53
- GL.ShadeModel(GL::SMOOTH)
54
-
55
- # Material
56
- if @back_material
57
- GL.Material(GL::FRONT, GL::AMBIENT, @front_material.ambient)
58
- GL.Material(GL::FRONT, GL::DIFFUSE, @front_material.diffuse)
59
- GL.Material(GL::FRONT, GL::SPECULAR, @front_material.specular)
60
- GL.Material(GL::FRONT, GL::EMISSION, @front_material.emission)
61
- GL.Materialf(GL::FRONT, GL::SHININESS, @front_material.shininess)
62
- GL.Material(GL::BACK, GL::AMBIENT, @back_material.ambient)
63
- GL.Material(GL::BACK, GL::DIFFUSE, @back_material.diffuse)
64
- GL.Material(GL::BACK, GL::SPECULAR, @back_material.specular)
65
- GL.Material(GL::BACK, GL::EMISSION, @back_material.emission)
66
- GL.Materialf(GL::BACK, GL::SHININESS, @back_material.shininess)
67
- else
68
- GL.Material(GL::FRONT_AND_BACK, GL::AMBIENT, @front_material.ambient)
69
- GL.Material(GL::FRONT_AND_BACK, GL::DIFFUSE, @front_material.diffuse)
70
- GL.Material(GL::FRONT_AND_BACK, GL::SPECULAR, @front_material.specular)
71
- GL.Material(GL::FRONT_AND_BACK, GL::EMISSION, @front_material.emission)
72
- GL.Materialf(GL::FRONT_AND_BACK, GL::SHININESS, @front_material.shininess)
73
- end
74
-
75
- # Surface
76
- GL.PolygonMode(GL::FRONT_AND_BACK, GL::FILL)
77
- GL.Disable(GL::CULL_FACE);
78
- drawshape(viewer)
79
-
80
- # Restore attributes and matrix
81
- GL.PopMatrix
82
- GL.PopAttrib
83
- end
84
-
85
- # Draw the StlShape
86
- def drawshape(viewer)
87
- raise "drawshape must be implemented by subclass"
88
- end
89
-
90
- def hit(viewer)
91
- draw(viewer)
92
- end
93
-
94
- def identify
95
- return self
96
- end
97
-
98
- def drag(viewer, fx, fy, tx, ty)
99
- if @dragable
100
- zz = viewer.worldToEyeZ(@position)
101
- wf = viewer.eyeToWorld(viewer.screenToEye(fx, fy, zz))
102
- wt = viewer.eyeToWorld(viewer.screenToEye(tx, ty, zz))
103
- wt_minus_wf = [wt[0] - wf[0], wt[1] - wf[1], wt[2] - wf[2]]
104
- @position = [@position[0] + wt_minus_wf[0], @position[1] + wt_minus_wf[1], @position[2] + wt_minus_wf[2]]
105
- return true
106
- else
107
- return false
108
- end
109
- end
110
-
111
- def handle_click
112
- @click_handler.call() if @click_handler
113
- end
114
-
115
- def handle_doubleclick
116
- @doubleclick_handler.call() if @doubleclick_handler
117
- end
118
-
119
- def color= (new_color)
120
- new_color[3] = 1.0 unless new_color[3]
121
- @color = new_color
122
- @viewer.update if @viewer
123
- end
124
-
125
- def rotation_x= (rotation)
126
- @rotation_x = rotation
127
- @viewer.update if @viewer
128
- end
129
-
130
- def rotation_y= (rotation)
131
- @rotation_y = rotation
132
- @viewer.update if @viewer
133
- end
134
-
135
- def rotation_z= (rotation)
136
- @rotation_z = rotation
137
- @viewer.update if @viewer
138
- end
139
-
140
- def export
141
- raise "export must be defined by subclass"
142
- end
143
-
144
- end # Shape
145
-
146
- end # module Cosmos
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'cosmos'
12
+ require 'cosmos/gui/opengl/opengl'
13
+
14
+ module Cosmos
15
+
16
+ class GlShape
17
+ attr_accessor :base_color
18
+ attr_accessor :click_handler
19
+ attr_accessor :doubleclick_handler
20
+ attr_reader :color
21
+ attr_accessor :position
22
+ attr_reader :rotation_x
23
+ attr_reader :rotation_y
24
+ attr_reader :rotation_z
25
+ attr_accessor :tipText
26
+ attr_accessor :dragable
27
+
28
+ #Constructor for the StlShape class
29
+ def initialize(x, y, z)
30
+ @color = [0.5, 0.5, 0.5, 1.0]
31
+ @base_color = [0.5, 0.5, 0.5, 1.0]
32
+ @position = [x, y, z]
33
+ @rotation_x = nil
34
+ @rotation_y = nil
35
+ @rotation_z = nil
36
+ @viewer = nil
37
+ @front_material = GlMaterial.new
38
+ @back_material = nil
39
+ @tipText = nil
40
+ @dragable = true
41
+ end
42
+
43
+ def draw(viewer)
44
+ GL.PushAttrib(GL::CURRENT_BIT | GL::LIGHTING_BIT | GL::POINT_BIT | GL::LINE_BIT)
45
+ GL.PushMatrix
46
+
47
+ # Object position
48
+ GL::Translatef(@position[0], @position[1], @position[2])
49
+
50
+ # Shading
51
+ GL.Enable(GL::LIGHTING)
52
+ GL.Enable(GL::AUTO_NORMAL)
53
+ GL.ShadeModel(GL::SMOOTH)
54
+
55
+ # Material
56
+ if @back_material
57
+ GL.Material(GL::FRONT, GL::AMBIENT, @front_material.ambient)
58
+ GL.Material(GL::FRONT, GL::DIFFUSE, @front_material.diffuse)
59
+ GL.Material(GL::FRONT, GL::SPECULAR, @front_material.specular)
60
+ GL.Material(GL::FRONT, GL::EMISSION, @front_material.emission)
61
+ GL.Materialf(GL::FRONT, GL::SHININESS, @front_material.shininess)
62
+ GL.Material(GL::BACK, GL::AMBIENT, @back_material.ambient)
63
+ GL.Material(GL::BACK, GL::DIFFUSE, @back_material.diffuse)
64
+ GL.Material(GL::BACK, GL::SPECULAR, @back_material.specular)
65
+ GL.Material(GL::BACK, GL::EMISSION, @back_material.emission)
66
+ GL.Materialf(GL::BACK, GL::SHININESS, @back_material.shininess)
67
+ else
68
+ GL.Material(GL::FRONT_AND_BACK, GL::AMBIENT, @front_material.ambient)
69
+ GL.Material(GL::FRONT_AND_BACK, GL::DIFFUSE, @front_material.diffuse)
70
+ GL.Material(GL::FRONT_AND_BACK, GL::SPECULAR, @front_material.specular)
71
+ GL.Material(GL::FRONT_AND_BACK, GL::EMISSION, @front_material.emission)
72
+ GL.Materialf(GL::FRONT_AND_BACK, GL::SHININESS, @front_material.shininess)
73
+ end
74
+
75
+ # Surface
76
+ GL.PolygonMode(GL::FRONT_AND_BACK, GL::FILL)
77
+ GL.Disable(GL::CULL_FACE);
78
+ drawshape(viewer)
79
+
80
+ # Restore attributes and matrix
81
+ GL.PopMatrix
82
+ GL.PopAttrib
83
+ end
84
+
85
+ # Draw the StlShape
86
+ def drawshape(viewer)
87
+ raise "drawshape must be implemented by subclass"
88
+ end
89
+
90
+ def hit(viewer)
91
+ draw(viewer)
92
+ end
93
+
94
+ def identify
95
+ return self
96
+ end
97
+
98
+ def drag(viewer, fx, fy, tx, ty)
99
+ if @dragable
100
+ zz = viewer.worldToEyeZ(@position)
101
+ wf = viewer.eyeToWorld(viewer.screenToEye(fx, fy, zz))
102
+ wt = viewer.eyeToWorld(viewer.screenToEye(tx, ty, zz))
103
+ wt_minus_wf = [wt[0] - wf[0], wt[1] - wf[1], wt[2] - wf[2]]
104
+ @position = [@position[0] + wt_minus_wf[0], @position[1] + wt_minus_wf[1], @position[2] + wt_minus_wf[2]]
105
+ return true
106
+ else
107
+ return false
108
+ end
109
+ end
110
+
111
+ def handle_click
112
+ @click_handler.call() if @click_handler
113
+ end
114
+
115
+ def handle_doubleclick
116
+ @doubleclick_handler.call() if @doubleclick_handler
117
+ end
118
+
119
+ def color= (new_color)
120
+ new_color[3] = 1.0 unless new_color[3]
121
+ @color = new_color
122
+ @viewer.update if @viewer
123
+ end
124
+
125
+ def rotation_x= (rotation)
126
+ @rotation_x = rotation
127
+ @viewer.update if @viewer
128
+ end
129
+
130
+ def rotation_y= (rotation)
131
+ @rotation_y = rotation
132
+ @viewer.update if @viewer
133
+ end
134
+
135
+ def rotation_z= (rotation)
136
+ @rotation_z = rotation
137
+ @viewer.update if @viewer
138
+ end
139
+
140
+ def export
141
+ raise "export must be defined by subclass"
142
+ end
143
+
144
+ end # Shape
145
+
146
+ end # module Cosmos
@@ -1,712 +1,724 @@
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
- # This file is inspired by the FOX Gui toolkit's FXGLViewer class
12
-
13
- require 'cosmos'
14
- require 'cosmos/gui/qt'
15
- require 'cosmos/gui/opengl/opengl'
16
-
17
- module Cosmos
18
-
19
- class GlViewer < Qt::GLWidget
20
- MAX_PICKBUF = 1024
21
- MAX_SELPATH = 64
22
- EPS = 1.0e-2
23
- PICK_TOL = 3
24
- DTOR = 0.0174532925199432957692369077
25
- RTOD = 57.295779513082320876798154814
26
-
27
- attr_accessor :projection # :PARALLEL or :PERSPECTIVE
28
- attr_reader :zoom
29
- attr_reader :fov
30
- attr_reader :wvt
31
- attr_reader :diameter
32
- attr_reader :distance
33
- attr_reader :orientation
34
- attr_reader :center
35
- attr_reader :scale
36
- attr_reader :transform
37
- attr_reader :itransform
38
- attr_reader :maxhits
39
- attr_reader :top_background
40
- attr_reader :bottom_background
41
- attr_reader :ambient
42
- attr_reader :light
43
- attr_reader :material
44
- attr_reader :dropped
45
- attr_reader :selection
46
- attr_reader :scene
47
- attr_reader :smode
48
- attr_reader :options
49
-
50
- attr_accessor :selection_callback
51
- attr_accessor :draw_axis
52
- def initialize(parent)
53
- super(parent)
54
-
55
- @defaultCursor = nil
56
- @dragCursor = nil
57
- @projection = :PERSPECTIVE
58
- @zoom = 1.0
59
- @fov = 30.0
60
- @wvt = GlViewport.new
61
- @diameter = 2.0;
62
- @distance = 7.464116;
63
- @orientation = Quaternion.new([0.0, 0.0, 0.0, 1.0])
64
- @center = [0.0, 0.0, 0.0]
65
- @scale = [1.0, 1.0, 1.0]
66
- updateProjection()
67
- updateTransform()
68
- @maxhits = 512;
69
- @top_background = [0.5, 0.5, 1.0, 1.0]
70
- @bottom_background = [1.0, 1.0, 1.0, 1.0]
71
- @ambient = [0.2, 0.2, 0.2, 1.0]
72
- @light = GlLight.new
73
- @material = GlMaterial.new
74
- @dial = [0, 0, 0]
75
- @dropped = nil
76
- @selection = nil
77
- @scene = nil
78
- @mode = :HOVERING
79
- @draw_axis = nil
80
- @options = []
81
-
82
- @selection_callback = nil
83
- end
84
-
85
- def minimumSizeHint
86
- return Qt::Size.new(100, 100)
87
- end
88
-
89
- def sizeHint
90
- return Qt::Size.new(400, 400)
91
- end
92
-
93
- def scene=(scene)
94
- @scene = scene
95
- @scale = [1.0, 1.0, 1.0]
96
- if @scene
97
- self.bounds = @scene.bounds
98
- @zoom = @scene.zoom
99
- @orientation = @scene.orientation
100
- @center = @scene.center
101
- @projection = @scene.projection
102
- end
103
- updateProjection()
104
- updateTransform()
105
- updateGL()
106
- end
107
-
108
- def fov=(fov)
109
- fov = 2.0 if fov < 2.0
110
- fov = 90.0 if fov > 90.0
111
- @fov = fov
112
- tn = tan(0.5 * DTOR * @fov)
113
- @distance = @diameter / tn
114
- updateProjection()
115
- updateTransform()
116
- updateGL()
117
- end
118
-
119
- def distance=(distance)
120
- distance = @diameter if distance < @diameter
121
- distance = 114.0 * @diameter if distance > (114.0 * @diameter)
122
- if distance != @distance
123
- @distance = distance
124
- @fov = 2.0 * RTOD * atan2(@diameter, @distance)
125
- updateProjection()
126
- updateTransform()
127
- updateGL()
128
- end
129
- end
130
-
131
- def zoom=(zoom)
132
- zoom = 1.0e-30 if zoom < 1.0e-30
133
- if zoom != @zoom
134
- @zoom = zoom
135
- updateProjection()
136
- updateGL()
137
- end
138
- end
139
-
140
- def scale= (scale)
141
- scale[0] = 0.000001 if scale[0] < 0.000001
142
- scale[1] = 0.000001 if scale[1] < 0.000001
143
- scale[2] = 0.000001 if scale[2] < 0.000001
144
- if scale != @scale
145
- @scale = scale
146
- updateTransform()
147
- updateGL()
148
- end
149
- end
150
-
151
- def orientation= (orientation)
152
- if (orientation.q0 != @orientation.q0) or (orientation.q1 != @orientation.q1) or (orientation.q2 != @orientation.q2) or (orientation.q3 != @orientation.q3)
153
- @orientation = orientation.clone.normalize
154
- updateTransform()
155
- update()
156
- end
157
- end
158
-
159
- def bounds= (bounds)
160
- # Model center
161
- @center = bounds.center
162
-
163
- # Model size
164
- @diameter = bounds.longest
165
-
166
- # Fix zero size model
167
- @diameter = 1.0 if @diameter < 1.0e-30
168
-
169
- # Set equal scaling initially
170
- @scale = [1.0, 1.0, 1.0]
171
-
172
- # Reset distance (and thus field of view)
173
- self.distance = 1.1 * @diameter
174
- end
175
-
176
- def center= (center)
177
- if center != @center
178
- @center = center
179
- updateTransform()
180
- updateGL()
181
- end
182
- end
183
-
184
- def selection= (shape)
185
- @selection = shape
186
- @selection_callback.call(shape) if @selection_callback
187
- updateGL()
188
- end
189
-
190
- def translate(vector)
191
- @center[0] += vector[0]
192
- @center[1] += vector[1]
193
- @center[2] += vector[2]
194
- updateTransform()
195
- updateGL()
196
- end
197
-
198
- def selectHits(x, y, w, h)
199
- mh = @maxhits
200
- nhits = 0
201
- makeCurrent()
202
-
203
- # Where to pick
204
- pickx = (@wvt.w - 2.0*x - w) / w.to_f
205
- picky = (2.0*y + h - @wvt.h) / h.to_f
206
- pickw = @wvt.w / w.to_f
207
- pickh = @wvt.h / h.to_f
208
-
209
- # Set pick projection matrix
210
- GL.MatrixMode(GL::PROJECTION);
211
- GL.LoadIdentity()
212
- GL.Translatef(pickx, picky, 0.0)
213
- GL.Scalef(pickw, pickh, 1.0)
214
- case projection
215
- when :PARALLEL
216
- GL.Ortho(@wvt.left, @wvt.right, @wvt.bottom, @wvt.top, @wvt.hither, @wvt.yon)
217
- when :PERSPECTIVE
218
- GL.Frustum(@wvt.left, @wvt.right, @wvt.bottom, @wvt.top, @wvt.hither, @wvt.yon)
219
- end
220
-
221
- # Model matrix
222
- GL.MatrixMode(GL::MODELVIEW);
223
- GL.LoadMatrixf(@transform)
224
-
225
- # Loop until room enough to fit
226
- while true
227
- nhits = 0
228
- buffer = GL.SelectBuffer(mh)
229
- GL.RenderMode(GL::SELECT);
230
- GL.InitNames()
231
- GL.PushName(0)
232
- @scene.hit(self) if @scene
233
- GL.PopName()
234
- nhits = GL.RenderMode(GL::RENDER)
235
- mh <<= 1
236
- break if nhits >= 0
237
- end
238
- doneCurrent()
239
- return buffer.unpack("L*"), nhits
240
- end
241
-
242
- def processHits(pickbuffer, nhits)
243
- if nhits > 0
244
- zmin = 4294967295
245
- zmax = 4294967295
246
- i = 0
247
- while nhits > 0
248
- n = pickbuffer[i]
249
- d1 = pickbuffer[1+i]
250
- d2 = pickbuffer[2+i]
251
- if ((d1 < zmin) || ((d1 == zmin) && (d2<=zmax)))
252
- zmin = d1
253
- zmax = d2
254
- sel = i
255
- end
256
- i += n + 3
257
- nhits -= 1
258
- end
259
- return @scene.identify(pickbuffer[4 + sel])
260
- end
261
- return nil
262
- end
263
-
264
- def pick(x, y)
265
- obj = nil
266
- if @scene and @maxhits
267
- pickbuffer, nhits = selectHits(x-PICK_TOL, y-PICK_TOL, PICK_TOL*2, PICK_TOL*2)
268
- obj = processHits(pickbuffer, nhits) if nhits > 0
269
- end
270
- return obj;
271
- end
272
-
273
- def initializeGL
274
- GL.GetError()
275
-
276
- # Initialize GL context
277
- GL.RenderMode(GL::RENDER)
278
-
279
- # Fast hints
280
- GL.Hint(GL::POLYGON_SMOOTH_HINT, GL::FASTEST)
281
- GL.Hint(GL::PERSPECTIVE_CORRECTION_HINT, GL::FASTEST)
282
- GL.Hint(GL::FOG_HINT, GL::FASTEST)
283
- GL.Hint(GL::LINE_SMOOTH_HINT, GL::FASTEST)
284
- GL.Hint(GL::POINT_SMOOTH_HINT, GL::FASTEST)
285
-
286
- # Z-buffer test on
287
- GL.Enable(GL::DEPTH_TEST)
288
- GL.DepthFunc(GL::LESS)
289
- GL.DepthRange(0.0, 1.0)
290
- GL.ClearDepth(1.0)
291
- GL.ClearColor(@top_background[0], @top_background[1], @top_background[2], @top_background[3])
292
-
293
- # No face culling
294
- GL.Disable(GL::CULL_FACE)
295
- GL.CullFace(GL::BACK)
296
- GL.FrontFace(GL::CCW)
297
-
298
- # Two sided lighting
299
- GL.LightModeli(GL::LIGHT_MODEL_TWO_SIDE, 1)
300
- GL.LightModel(GL::LIGHT_MODEL_AMBIENT, @ambient)
301
-
302
- # Preferred blend over background
303
- GL.BlendFunc(GL::SRC_ALPHA, GL::ONE_MINUS_SRC_ALPHA)
304
-
305
- # Light on
306
- GL.Enable(GL::LIGHT0)
307
- GL.Light(GL::LIGHT0, GL::AMBIENT, @light.ambient)
308
- GL.Light(GL::LIGHT0, GL::DIFFUSE, @light.diffuse)
309
- GL.Light(GL::LIGHT0, GL::SPECULAR, @light.specular)
310
- GL.Light(GL::LIGHT0, GL::POSITION, @light.position)
311
- GL.Light(GL::LIGHT0, GL::SPOT_DIRECTION, @light.direction)
312
- GL.Lightf(GL::LIGHT0, GL::SPOT_EXPONENT, @light.exponent)
313
- GL.Lightf(GL::LIGHT0, GL::SPOT_CUTOFF, @light.cutoff)
314
- GL.Lightf(GL::LIGHT0, GL::CONSTANT_ATTENUATION, @light.c_attn)
315
- GL.Lightf(GL::LIGHT0, GL::LINEAR_ATTENUATION, @light.l_attn)
316
- GL.Lightf(GL::LIGHT0, GL::QUADRATIC_ATTENUATION, @light.q_attn)
317
-
318
- # Viewer is close
319
- GL.LightModeli(GL::LIGHT_MODEL_LOCAL_VIEWER, 1)
320
-
321
- # Material colors
322
- GL.Material(GL::FRONT_AND_BACK, GL::AMBIENT, @material.ambient)
323
- GL.Material(GL::FRONT_AND_BACK, GL::DIFFUSE, @material.diffuse)
324
- GL.Material(GL::FRONT_AND_BACK, GL::SPECULAR, @material.specular)
325
- GL.Material(GL::FRONT_AND_BACK, GL::EMISSION, @material.emission)
326
- GL.Materialf(GL::FRONT_AND_BACK, GL::SHININESS, @material.shininess)
327
-
328
- # Vertex colors change both diffuse and ambient
329
- GL.ColorMaterial(GL::FRONT_AND_BACK, GL::AMBIENT_AND_DIFFUSE)
330
- GL.Disable(GL::COLOR_MATERIAL)
331
-
332
- # Simplest and fastest drawing is default
333
- GL.ShadeModel(GL::FLAT)
334
- GL.Disable(GL::BLEND)
335
- GL.Disable(GL::LINE_SMOOTH)
336
- GL.Disable(GL::POINT_SMOOTH)
337
- GL.Disable(GL::COLOR_MATERIAL)
338
-
339
- # Lighting
340
- GL.Disable(GL::LIGHTING)
341
-
342
- # No normalization of normals (it's broken on some machines anyway)
343
- GL.Disable(GL::NORMALIZE)
344
-
345
- # Dithering if needed
346
- GL.Disable(GL::DITHER)
347
- end
348
-
349
- def paintGL
350
- # Set viewport
351
- GL.Viewport(0, 0, @wvt.w, @wvt.h)
352
-
353
- # Reset important stuff
354
- GL.ShadeModel(GL::SMOOTH)
355
- GL.PolygonMode(GL::FRONT_AND_BACK, GL::FILL)
356
- GL.Disable(GL::LIGHTING)
357
- GL.Disable(GL::ALPHA_TEST)
358
- GL.Disable(GL::BLEND)
359
- GL.Disable(GL::DITHER)
360
- GL.Disable(GL::FOG)
361
- GL.Disable(GL::LOGIC_OP)
362
- GL.Disable(GL::POLYGON_SMOOTH)
363
- GL.Disable(GL::POLYGON_STIPPLE)
364
- GL.Disable(GL::STENCIL_TEST)
365
- GL.Disable(GL::CULL_FACE)
366
- GL.Disable(GL::COLOR_MATERIAL)
367
-
368
- # Reset matrices
369
- GL.MatrixMode(GL::PROJECTION)
370
- GL.LoadIdentity
371
- GL.MatrixMode(GL::MODELVIEW)
372
- GL.LoadIdentity
373
-
374
- # Clear to solid background
375
- GL.ClearDepth(1.0)
376
- GL.ClearColor(@top_background[0], @top_background[1], @top_background[2], @top_background[3])
377
- if @top_background == @bottom_background
378
- begin
379
- GL.Clear(GL::COLOR_BUFFER_BIT | GL::DEPTH_BUFFER_BIT)
380
- rescue
381
- # Raises false error on Mac
382
- end
383
- else # Clear to gradient background
384
- begin
385
- GL.Clear(GL::DEPTH_BUFFER_BIT)
386
- rescue
387
- # Raises false error on Mac
388
- end
389
- GL.Disable(GL::DEPTH_TEST)
390
- GL.DepthMask(GL::FALSE)
391
- GL.Begin(GL::TRIANGLE_STRIP)
392
- GL.Color(@bottom_background); GL.Vertex3f(-1.0, -1.0, 0.0); GL.Vertex3f(1.0, -1.0, 0.0)
393
- GL.Color(@top_background); GL.Vertex3f(-1.0, 1.0, 0.0); GL.Vertex3f(1.0, 1.0, 0.0)
394
- begin
395
- GL.End
396
- rescue
397
- # Raises false error on Mac
398
- end
399
- end
400
-
401
- # Depth test on by default
402
- GL.DepthMask(GL::TRUE)
403
- GL.Enable(GL::DEPTH_TEST)
404
-
405
- # Switch to projection matrix
406
- GL.MatrixMode(GL::PROJECTION)
407
- GL.LoadIdentity
408
- case @projection
409
- when :PARALLEL
410
- GL.Ortho(@wvt.left, @wvt.right, @wvt.bottom, @wvt.top, @wvt.hither, @wvt.yon)
411
- when :PERSPECTIVE
412
- GL.Frustum(@wvt.left, @wvt.right, @wvt.bottom, @wvt.top, @wvt.hither, @wvt.yon)
413
- end
414
-
415
- # Switch to model matrix
416
- GL.MatrixMode(GL::MODELVIEW)
417
- GL.LoadIdentity
418
-
419
- # Set light parameters
420
- GL.Enable(GL::LIGHT0)
421
- GL.Light(GL::LIGHT0, GL::AMBIENT, @light.ambient)
422
- GL.Light(GL::LIGHT0, GL::DIFFUSE, @light.diffuse)
423
- GL.Light(GL::LIGHT0, GL::SPECULAR, @light.specular)
424
- GL.Light(GL::LIGHT0, GL::POSITION, @light.position)
425
- GL.Light(GL::LIGHT0, GL::SPOT_DIRECTION, @light.direction)
426
- GL.Lightf(GL::LIGHT0, GL::SPOT_EXPONENT, @light.exponent)
427
- GL.Lightf(GL::LIGHT0, GL::SPOT_CUTOFF, @light.cutoff)
428
- GL.Lightf(GL::LIGHT0, GL::CONSTANT_ATTENUATION, @light.c_attn)
429
- GL.Lightf(GL::LIGHT0, GL::LINEAR_ATTENUATION, @light.l_attn)
430
- GL.Lightf(GL::LIGHT0, GL::QUADRATIC_ATTENUATION, @light.q_attn)
431
-
432
- # Default material colors
433
- GL.Material(GL::FRONT_AND_BACK, GL::AMBIENT, @material.ambient)
434
- GL.Material(GL::FRONT_AND_BACK, GL::DIFFUSE, @material.diffuse)
435
- GL.Material(GL::FRONT_AND_BACK, GL::SPECULAR, @material.specular)
436
- GL.Material(GL::FRONT_AND_BACK, GL::EMISSION, @material.emission)
437
- GL.Materialf(GL::FRONT_AND_BACK, GL::SHININESS, @material.shininess)
438
-
439
- # Color commands change both
440
- GL.ColorMaterial(GL::FRONT_AND_BACK, GL::AMBIENT_AND_DIFFUSE)
441
-
442
- # Global ambient light
443
- GL.LightModel(GL::LIGHT_MODEL_AMBIENT, @ambient)
444
-
445
- # Enable fog
446
- if @options.include?(:VIEWER_FOG)
447
- GL.Enable(GL::FOG)
448
- GL.Fog(GL::FOG_COLOR, @top_background) # Disappear into the background
449
- GL.Fogf(GL::FOG_START, (@distance - @diameter).to_f) # Range tight around model position
450
- GL.Fogf(GL::FOG_END, (@distance + @diameter).to_f) # Far place same as clip plane:- clipped stuff is in the mist!
451
- GL.Fogi(GL::FOG_MODE, GL::LINEAR) # Simple linear depth cueing
452
- end
453
-
454
- # Dithering
455
- GL.Enable(GL::DITHER) if @options.include?(:VIEWER_DITHER)
456
-
457
- # Enable lighting
458
- GL.Enable(GL::LIGHTING) if @options.include?(:VIEWER_LIGHTING)
459
-
460
- # Set model matrix
461
- GL.LoadMatrixf(@transform)
462
-
463
- if (@draw_axis and @draw_axis > 0)
464
- # Draw axis
465
- GL.PushMatrix
466
- GL.LineWidth(2.5)
467
- GL.Color3f(1.0, 0.0, 0.0)
468
- GL.Begin(GL::LINES)
469
- GL.Vertex3f(-@draw_axis, 0.0, 0.0)
470
- GL.Vertex3f(@draw_axis, 0, 0)
471
- GL.End
472
- GL.Color3f(0.0, 1.0, 0.0)
473
- GL.Begin(GL::LINES)
474
- GL.Vertex3f(0, -@draw_axis, 0.0)
475
- GL.Vertex3f(0, @draw_axis, 0)
476
- GL.End
477
- GL.Color3f(0.0, 0.0, 1.0)
478
- GL.Begin(GL::LINES)
479
- GL.Vertex3f(0, 0, -@draw_axis)
480
- GL.Vertex3f(0, 0, @draw_axis)
481
- GL.End
482
- GL.PopMatrix
483
- end
484
-
485
- # Draw what's visible
486
- @scene.draw(self) if @scene
487
- end
488
-
489
- def resizeGL(width, height)
490
- @wvt.w = width;
491
- @wvt.h = height;
492
- updateProjection()
493
- end
494
-
495
- def screenToEye(sx, sy, eyez)
496
- e = [0.0, 0.0, 0.0]
497
- xp = (@worldpx*sx + @ax).to_f
498
- yp = (@ay - @worldpx*sy).to_f
499
- if @projection == :PERSPECTIVE
500
- if @distance != 0.0
501
- e.x = [((-eyez*xp) / @distance).to_f, ((-eyez*yp) / @distance).to_f, eyez]
502
- end
503
- else
504
- e = [xp, yp, eyez]
505
- end
506
- return e;
507
- end
508
-
509
- def screenToTarget(sx, sy)
510
- [@worldpx*sx.to_f + @ax, @ay - @worldpx*sy.to_f, -@distance.to_f]
511
- end
512
-
513
- def eyeToWorld(e)
514
- [e[0]*@itransform[0][0] + e[1]*@itransform[1][0] + e[2]*@itransform[2][0] + @itransform[3][0],
515
- e[0]*@itransform[0][1] + e[1]*@itransform[1][1] + e[2]*@itransform[2][1] + @itransform[3][1],
516
- e[0]*@itransform[0][2] + e[1]*@itransform[1][2] + e[2]*@itransform[2][2] + @itransform[3][2]]
517
- end
518
-
519
- def worldToEyeZ(w)
520
- w[0]*@transform[0][2] + w[1]*@transform[1][2] + w[2]*@transform[2][2] + @transform[3][2]
521
- end
522
-
523
- def worldVector(fx, fy, tx, ty)
524
- wfm = screenToTarget(fx, fy)
525
- wto = screenToTarget(tx, ty)
526
- wfm_prime = [wfm[0]*@itransform[0][0] + wfm[1]*@itransform[1][0] + wfm[2]*@itransform[2][0] + @itransform[3][0],
527
- wfm[0]*@itransform[0][1] + wfm[1]*@itransform[1][1] + wfm[2]*@itransform[2][1] + @itransform[3][1],
528
- wfm[0]*@itransform[0][2] + wfm[1]*@itransform[1][2] + wfm[2]*@itransform[2][2] + @itransform[3][2]]
529
- wto_prime = [wto[0]*@itransform[0][0] + wto[1]*@itransform[1][0] + wto[2]*@itransform[2][0] + @itransform[3][0],
530
- wto[0]*@itransform[0][1] + wto[1]*@itransform[1][1] + wto[2]*@itransform[2][1] + @itransform[3][1],
531
- wto[0]*@itransform[0][2] + wto[1]*@itransform[1][2] + wto[2]*@itransform[2][2] + @itransform[3][2]]
532
- return [wto_prime[0] - wfm_prime[0], wto_prime[1] - wfm_prime[1], wto_prime[2] - wfm_prime[2]]
533
- end
534
-
535
- def spherePoint(x, y)
536
- if @wvt.w > @wvt.h
537
- screenmin = wvt.h.to_f
538
- else
539
- screenmin = wvt.w.to_f
540
- end
541
- v = []
542
- v[0] = 2.0 * (x - 0.5*@wvt.w) / screenmin
543
- v[1] = 2.0 * (0.5 * @wvt.h - y) / screenmin
544
- d = v[0]*v[0] + v[1]*v[1]
545
-
546
- if d < 0.75
547
- v[2] = sqrt(1.0-d)
548
- elsif d < 3.0
549
- d = 1.7320508008 - sqrt(d)
550
- t = 1.0 - d*d
551
- t = 0.0 if t < 0.0
552
- v[2] = 1.0 - sqrt(t)
553
- else
554
- v[2] = 0.0
555
- end
556
-
557
- length = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2])
558
- if length > 0.0
559
- return [v[0] / length, v[1] / length, v[2] / length]
560
- else
561
- return [0.0, 0.0, 0.0]
562
- end
563
- end
564
-
565
- def turn(fx, fy, tx, ty)
566
- return Quaternion.arc(spherePoint(fx,fy), spherePoint(tx,ty))
567
- end
568
-
569
- def mode=(mode)
570
- @mode = mode
571
- case @mode
572
- when :ZOOMING
573
- Qt::Application.setOverrideCursor(Cosmos.getCursor(Qt::SizeVerCursor))
574
- when :DRAGGING
575
- Qt::Application.setOverrideCursor(Cosmos.getCursor(Qt::ClosedHandCursor))
576
- when :ROTATING
577
- Qt::Application.setOverrideCursor(Cosmos.getCursor(Qt::CrossCursor))
578
- when :TRANSLATING
579
- Qt::Application.setOverrideCursor(Cosmos.getCursor(Qt::SizeAllCursor))
580
- else
581
- Qt::Application.restoreOverrideCursor
582
- end
583
- end
584
-
585
- def mousePressEvent(event)
586
- case event.button
587
- when Qt::LeftButton
588
- self.mode = :PICKING
589
- if (event.buttons & Qt::RightButton.to_i) != 0
590
- self.mode = :ZOOMING
591
- elsif (@selection and @selection.dragable and @selection == pick(event.x, event.y))
592
- self.mode = :DRAGGING
593
- end
594
- when Qt::RightButton
595
- if (event.buttons & Qt::LeftButton.to_i) != 0
596
- self.mode = :ZOOMING
597
- else
598
- self.mode = :POSTING
599
- end
600
- when Qt::MidButton
601
- self.mode = :ZOOMING
602
- end
603
- @lastPos = event.pos
604
- end
605
-
606
- def mouseReleaseEvent(event)
607
- case @mode
608
- when :PICKING
609
- self.selection = pick(event.x, event.y)
610
- end
611
-
612
- if (((event.buttons & Qt::RightButton.to_i) != 0) and ((event.buttons & Qt::LeftButton.to_i) != 0)) or ((event.buttons & Qt::MidButton.to_i) != 0)
613
- self.mode = :ZOOMING
614
- elsif (event.buttons & Qt::LeftButton.to_i) != 0
615
- self.mode = :ROTATING
616
- elsif (event.buttons & Qt::RightButton.to_i) != 0
617
- self.mode = :TRANSLATING
618
- else
619
- self.mode = :HOVERING
620
- end
621
- end
622
-
623
- def mouseMoveEvent(event)
624
- dx = event.x - @lastPos.x
625
- dy = event.y - @lastPos.y
626
-
627
- case @mode
628
- when :PICKING, :POSTING
629
- if dx.abs > 0 or dy.abs > 0
630
- if @mode == :PICKING
631
- self.mode = :ROTATING
632
- else
633
- self.mode = :TRANSLATING
634
- end
635
- end
636
- when :TRANSLATING
637
- vector = worldVector(@lastPos.x, @lastPos.y, event.x, event.y)
638
- translate([-vector[0], -vector[1], -vector[2]])
639
- when :DRAGGING
640
- if @selection and @selection.drag(self, @lastPos.x, @lastPos.y, event.x, event.y)
641
- updateGL()
642
- end
643
- when :ROTATING
644
- self.orientation = turn(@lastPos.x, @lastPos.y, event.x, event.y) * @orientation
645
- when :ZOOMING
646
- delta = 0.005 * dy
647
- self.zoom = @zoom * (2.0 ** delta)
648
- end
649
-
650
- @lastPos = event.pos
651
- end
652
-
653
- def wheelEvent(event)
654
- self.zoom = @zoom * (2.0 ** (-0.1 * event.delta / 120.0))
655
- end
656
-
657
- protected
658
-
659
- def updateProjection
660
- # Should be non-0 size viewport
661
- if @wvt.w > 0 and @wvt.h > 0
662
- # Aspect ratio of viewer
663
- aspect = @wvt.h.to_f / @wvt.w.to_f
664
-
665
- # Get world box
666
- r = 0.5 * @diameter / @zoom
667
- if @wvt.w <= @wvt.h
668
- @wvt.left = -r
669
- @wvt.right = r
670
- @wvt.bottom = -r * aspect
671
- @wvt.top = r * aspect
672
- else
673
- @wvt.left = -r / aspect
674
- @wvt.right = r / aspect
675
- @wvt.bottom = -r
676
- @wvt.top = r
677
- end
678
-
679
- @wvt.yon = @distance + @diameter
680
- @wvt.hither = 0.1 * @wvt.yon
681
-
682
- # Size of a pixel in world and model
683
- @worldpx = (@wvt.right - @wvt.left) / @wvt.w
684
- @modelpx = @worldpx * @diameter
685
-
686
- # Precalc stuff for view->world backmapping
687
- @ax = @wvt.left
688
- @ay = @wvt.top - @worldpx
689
-
690
- # Correction for perspective
691
- if @projection == :PERSPECTIVE
692
- hither_fac= @wvt.hither / @distance
693
- @wvt.left *= hither_fac
694
- @wvt.right *= hither_fac
695
- @wvt.top *= hither_fac
696
- @wvt.bottom *= hither_fac
697
- end
698
- end
699
- end
700
-
701
- def updateTransform
702
- @transform = Matrix.identity(4)
703
- @transform.trans4(0.0, 0.0, -@distance.to_f)
704
- @transform.rot4(@orientation);
705
- @transform.scale4(@scale[0], @scale[1], @scale[2]);
706
- @transform.trans4(-@center[0], -@center[1], -@center[2]);
707
- @itransform = @transform.inverse
708
- end
709
-
710
- end # class OpenGLViewer
711
-
712
- 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
+ # This file is inspired by the FOX Gui toolkit's FXGLViewer class
12
+
13
+ require 'cosmos'
14
+ require 'cosmos/gui/qt'
15
+ require 'cosmos/gui/opengl/opengl'
16
+
17
+ module Cosmos
18
+
19
+ class GlViewer < Qt::GLWidget
20
+ MAX_PICKBUF = 1024
21
+ MAX_SELPATH = 64
22
+ EPS = 1.0e-2
23
+ PICK_TOL = 3
24
+ DTOR = 0.0174532925199432957692369077
25
+ RTOD = 57.295779513082320876798154814
26
+
27
+ attr_accessor :projection # :PARALLEL or :PERSPECTIVE
28
+ attr_reader :zoom
29
+ attr_reader :fov
30
+ attr_reader :wvt
31
+ attr_reader :diameter
32
+ attr_reader :distance
33
+ attr_reader :orientation
34
+ attr_reader :center
35
+ attr_reader :scale
36
+ attr_reader :transform
37
+ attr_reader :itransform
38
+ attr_reader :maxhits
39
+ attr_reader :top_background
40
+ attr_reader :bottom_background
41
+ attr_reader :ambient
42
+ attr_reader :light
43
+ attr_reader :material
44
+ attr_reader :dropped
45
+ attr_reader :selection
46
+ attr_reader :scene
47
+ attr_reader :smode
48
+ attr_reader :options
49
+
50
+ attr_accessor :selection_callback
51
+ attr_accessor :draw_axis
52
+ def initialize(parent)
53
+ super(parent)
54
+
55
+ @defaultCursor = nil
56
+ @dragCursor = nil
57
+ @projection = :PERSPECTIVE
58
+ @zoom = 1.0
59
+ @fov = 30.0
60
+ @wvt = GlViewport.new
61
+ @diameter = 2.0;
62
+ @distance = 7.464116;
63
+ @orientation = Quaternion.new([0.0, 0.0, 0.0, 1.0])
64
+ @center = [0.0, 0.0, 0.0]
65
+ @scale = [1.0, 1.0, 1.0]
66
+ updateProjection()
67
+ updateTransform()
68
+ @maxhits = 512;
69
+ @top_background = [0.5, 0.5, 1.0, 1.0]
70
+ @bottom_background = [1.0, 1.0, 1.0, 1.0]
71
+ @ambient = [0.2, 0.2, 0.2, 1.0]
72
+ @light = GlLight.new
73
+ @material = GlMaterial.new
74
+ @dial = [0, 0, 0]
75
+ @dropped = nil
76
+ @selection = nil
77
+ @scene = nil
78
+ @mode = :HOVERING
79
+ @draw_axis = nil
80
+ @options = []
81
+
82
+ @selection_callback = nil
83
+ end
84
+
85
+ def minimumSizeHint
86
+ return Qt::Size.new(100, 100)
87
+ end
88
+
89
+ def sizeHint
90
+ return Qt::Size.new(400, 400)
91
+ end
92
+
93
+ def scene=(scene)
94
+ @scene = scene
95
+ @scale = [1.0, 1.0, 1.0]
96
+ if @scene
97
+ self.bounds = @scene.bounds
98
+ @zoom = @scene.zoom
99
+ @orientation = @scene.orientation
100
+ @center = @scene.center
101
+ @projection = @scene.projection
102
+ end
103
+ updateProjection()
104
+ updateTransform()
105
+ updateGL()
106
+ end
107
+
108
+ def fov=(fov)
109
+ fov = 2.0 if fov < 2.0
110
+ fov = 90.0 if fov > 90.0
111
+ @fov = fov
112
+ tn = tan(0.5 * DTOR * @fov)
113
+ @distance = @diameter / tn
114
+ updateProjection()
115
+ updateTransform()
116
+ updateGL()
117
+ end
118
+
119
+ def distance=(distance)
120
+ distance = @diameter if distance < @diameter
121
+ distance = 114.0 * @diameter if distance > (114.0 * @diameter)
122
+ if distance != @distance
123
+ @distance = distance
124
+ @fov = 2.0 * RTOD * atan2(@diameter, @distance)
125
+ updateProjection()
126
+ updateTransform()
127
+ updateGL()
128
+ end
129
+ end
130
+
131
+ def zoom=(zoom)
132
+ zoom = 1.0e-30 if zoom < 1.0e-30
133
+ if zoom != @zoom
134
+ @zoom = zoom
135
+ updateProjection()
136
+ updateGL()
137
+ end
138
+ end
139
+
140
+ def scale= (scale)
141
+ scale[0] = 0.000001 if scale[0] < 0.000001
142
+ scale[1] = 0.000001 if scale[1] < 0.000001
143
+ scale[2] = 0.000001 if scale[2] < 0.000001
144
+ if scale != @scale
145
+ @scale = scale
146
+ updateTransform()
147
+ updateGL()
148
+ end
149
+ end
150
+
151
+ def orientation= (orientation)
152
+ if (orientation.q0 != @orientation.q0) or (orientation.q1 != @orientation.q1) or (orientation.q2 != @orientation.q2) or (orientation.q3 != @orientation.q3)
153
+ @orientation = orientation.clone.normalize
154
+ updateTransform()
155
+ update()
156
+ end
157
+ end
158
+
159
+ def bounds= (bounds)
160
+ # Model center
161
+ @center = bounds.center
162
+
163
+ # Model size
164
+ @diameter = bounds.longest
165
+
166
+ # Fix zero size model
167
+ @diameter = 1.0 if @diameter < 1.0e-30
168
+
169
+ # Set equal scaling initially
170
+ @scale = [1.0, 1.0, 1.0]
171
+
172
+ # Reset distance (and thus field of view)
173
+ self.distance = 1.1 * @diameter
174
+ end
175
+
176
+ def center= (center)
177
+ if center != @center
178
+ @center = center
179
+ updateTransform()
180
+ updateGL()
181
+ end
182
+ end
183
+
184
+ def selection= (shape)
185
+ @selection = shape
186
+ @selection_callback.call(shape) if @selection_callback
187
+ updateGL()
188
+ end
189
+
190
+ def translate(vector)
191
+ @center[0] += vector[0]
192
+ @center[1] += vector[1]
193
+ @center[2] += vector[2]
194
+ updateTransform()
195
+ updateGL()
196
+ end
197
+
198
+ def selectHits(x, y, w, h)
199
+ mh = @maxhits
200
+ nhits = 0
201
+ makeCurrent()
202
+
203
+ # Where to pick
204
+ pickx = (@wvt.w - 2.0*x - w) / w.to_f
205
+ picky = (2.0*y + h - @wvt.h) / h.to_f
206
+ pickw = @wvt.w / w.to_f
207
+ pickh = @wvt.h / h.to_f
208
+
209
+ # Set pick projection matrix
210
+ GL.MatrixMode(GL::PROJECTION);
211
+ GL.LoadIdentity()
212
+ GL.Translatef(pickx, picky, 0.0)
213
+ GL.Scalef(pickw, pickh, 1.0)
214
+ case projection
215
+ when :PARALLEL
216
+ GL.Ortho(@wvt.left, @wvt.right, @wvt.bottom, @wvt.top, @wvt.hither, @wvt.yon)
217
+ when :PERSPECTIVE
218
+ GL.Frustum(@wvt.left, @wvt.right, @wvt.bottom, @wvt.top, @wvt.hither, @wvt.yon)
219
+ end
220
+
221
+ # Model matrix
222
+ GL.MatrixMode(GL::MODELVIEW);
223
+ GL.LoadMatrixf(@transform)
224
+
225
+ # Loop until room enough to fit
226
+ while true
227
+ nhits = 0
228
+ buffer = GL.SelectBuffer(mh)
229
+ GL.RenderMode(GL::SELECT);
230
+ GL.InitNames()
231
+ GL.PushName(0)
232
+ @scene.hit(self) if @scene
233
+ GL.PopName()
234
+ nhits = GL.RenderMode(GL::RENDER)
235
+ mh <<= 1
236
+ break if nhits >= 0
237
+ end
238
+ doneCurrent()
239
+ return buffer.unpack("L*"), nhits
240
+ end
241
+
242
+ def processHits(pickbuffer, nhits)
243
+ if nhits > 0
244
+ zmin = 4294967295
245
+ zmax = 4294967295
246
+ i = 0
247
+ while nhits > 0
248
+ n = pickbuffer[i]
249
+ d1 = pickbuffer[1+i]
250
+ d2 = pickbuffer[2+i]
251
+ if ((d1 < zmin) || ((d1 == zmin) && (d2<=zmax)))
252
+ zmin = d1
253
+ zmax = d2
254
+ sel = i
255
+ end
256
+ i += n + 3
257
+ nhits -= 1
258
+ end
259
+ return @scene.identify(pickbuffer[4 + sel])
260
+ end
261
+ return nil
262
+ end
263
+
264
+ def pick(x, y)
265
+ obj = nil
266
+ if @scene and @maxhits
267
+ pickbuffer, nhits = selectHits(x-PICK_TOL, y-PICK_TOL, PICK_TOL*2, PICK_TOL*2)
268
+ obj = processHits(pickbuffer, nhits) if nhits > 0
269
+ end
270
+ return obj;
271
+ end
272
+
273
+ def initializeGL
274
+ GL.GetError()
275
+
276
+ # Initialize GL context
277
+ GL.RenderMode(GL::RENDER)
278
+
279
+ # Fast hints
280
+ GL.Hint(GL::POLYGON_SMOOTH_HINT, GL::FASTEST)
281
+ GL.Hint(GL::PERSPECTIVE_CORRECTION_HINT, GL::FASTEST)
282
+ GL.Hint(GL::FOG_HINT, GL::FASTEST)
283
+ GL.Hint(GL::LINE_SMOOTH_HINT, GL::FASTEST)
284
+ GL.Hint(GL::POINT_SMOOTH_HINT, GL::FASTEST)
285
+
286
+ # Z-buffer test on
287
+ GL.Enable(GL::DEPTH_TEST)
288
+ GL.DepthFunc(GL::LESS)
289
+ GL.DepthRange(0.0, 1.0)
290
+ GL.ClearDepth(1.0)
291
+ GL.ClearColor(@top_background[0], @top_background[1], @top_background[2], @top_background[3])
292
+
293
+ # No face culling
294
+ GL.Disable(GL::CULL_FACE)
295
+ GL.CullFace(GL::BACK)
296
+ GL.FrontFace(GL::CCW)
297
+
298
+ # Two sided lighting
299
+ GL.LightModeli(GL::LIGHT_MODEL_TWO_SIDE, 1)
300
+ GL.LightModel(GL::LIGHT_MODEL_AMBIENT, @ambient)
301
+
302
+ # Preferred blend over background
303
+ GL.BlendFunc(GL::SRC_ALPHA, GL::ONE_MINUS_SRC_ALPHA)
304
+
305
+ # Light on
306
+ GL.Enable(GL::LIGHT0)
307
+ GL.Light(GL::LIGHT0, GL::AMBIENT, @light.ambient)
308
+ GL.Light(GL::LIGHT0, GL::DIFFUSE, @light.diffuse)
309
+ GL.Light(GL::LIGHT0, GL::SPECULAR, @light.specular)
310
+ GL.Light(GL::LIGHT0, GL::POSITION, @light.position)
311
+ GL.Light(GL::LIGHT0, GL::SPOT_DIRECTION, @light.direction)
312
+ GL.Lightf(GL::LIGHT0, GL::SPOT_EXPONENT, @light.exponent)
313
+ GL.Lightf(GL::LIGHT0, GL::SPOT_CUTOFF, @light.cutoff)
314
+ GL.Lightf(GL::LIGHT0, GL::CONSTANT_ATTENUATION, @light.c_attn)
315
+ GL.Lightf(GL::LIGHT0, GL::LINEAR_ATTENUATION, @light.l_attn)
316
+ GL.Lightf(GL::LIGHT0, GL::QUADRATIC_ATTENUATION, @light.q_attn)
317
+
318
+ # Viewer is close
319
+ GL.LightModeli(GL::LIGHT_MODEL_LOCAL_VIEWER, 1)
320
+
321
+ # Material colors
322
+ GL.Material(GL::FRONT_AND_BACK, GL::AMBIENT, @material.ambient)
323
+ GL.Material(GL::FRONT_AND_BACK, GL::DIFFUSE, @material.diffuse)
324
+ GL.Material(GL::FRONT_AND_BACK, GL::SPECULAR, @material.specular)
325
+ GL.Material(GL::FRONT_AND_BACK, GL::EMISSION, @material.emission)
326
+ GL.Materialf(GL::FRONT_AND_BACK, GL::SHININESS, @material.shininess)
327
+
328
+ # Vertex colors change both diffuse and ambient
329
+ GL.ColorMaterial(GL::FRONT_AND_BACK, GL::AMBIENT_AND_DIFFUSE)
330
+ GL.Disable(GL::COLOR_MATERIAL)
331
+
332
+ # Simplest and fastest drawing is default
333
+ GL.ShadeModel(GL::FLAT)
334
+ GL.Disable(GL::BLEND)
335
+ GL.Disable(GL::LINE_SMOOTH)
336
+ GL.Disable(GL::POINT_SMOOTH)
337
+ GL.Disable(GL::COLOR_MATERIAL)
338
+
339
+ # Lighting
340
+ GL.Disable(GL::LIGHTING)
341
+
342
+ # No normalization of normals (it's broken on some machines anyway)
343
+ GL.Disable(GL::NORMALIZE)
344
+
345
+ # Dithering if needed
346
+ GL.Disable(GL::DITHER)
347
+ end
348
+
349
+ def paintGL
350
+ # Set viewport
351
+ GL.Viewport(0, 0, @wvt.w, @wvt.h)
352
+
353
+ # Reset important stuff
354
+ GL.ShadeModel(GL::SMOOTH)
355
+ GL.PolygonMode(GL::FRONT_AND_BACK, GL::FILL)
356
+ GL.Disable(GL::LIGHTING)
357
+ GL.Disable(GL::ALPHA_TEST)
358
+ GL.Disable(GL::BLEND)
359
+ GL.Disable(GL::DITHER)
360
+ GL.Disable(GL::FOG)
361
+ GL.Disable(GL::LOGIC_OP)
362
+ GL.Disable(GL::POLYGON_SMOOTH)
363
+ GL.Disable(GL::POLYGON_STIPPLE)
364
+ GL.Disable(GL::STENCIL_TEST)
365
+ GL.Disable(GL::CULL_FACE)
366
+ GL.Disable(GL::COLOR_MATERIAL)
367
+
368
+ # Reset matrices
369
+ GL.MatrixMode(GL::PROJECTION)
370
+ GL.LoadIdentity
371
+ GL.MatrixMode(GL::MODELVIEW)
372
+ GL.LoadIdentity
373
+
374
+ # Clear to solid background
375
+ GL.ClearDepth(1.0)
376
+ GL.ClearColor(@top_background[0], @top_background[1], @top_background[2], @top_background[3])
377
+ if @top_background == @bottom_background
378
+ begin
379
+ GL.Clear(GL::COLOR_BUFFER_BIT | GL::DEPTH_BUFFER_BIT)
380
+ rescue
381
+ # Raises false error on Mac
382
+ end
383
+ else # Clear to gradient background
384
+ begin
385
+ GL.Clear(GL::DEPTH_BUFFER_BIT)
386
+ rescue
387
+ # Raises false error on Mac
388
+ end
389
+ GL.Disable(GL::DEPTH_TEST)
390
+ GL.DepthMask(GL::FALSE)
391
+ GL.Begin(GL::TRIANGLE_STRIP)
392
+ GL.Color(@bottom_background); GL.Vertex3f(-1.0, -1.0, 0.0); GL.Vertex3f(1.0, -1.0, 0.0)
393
+ GL.Color(@top_background); GL.Vertex3f(-1.0, 1.0, 0.0); GL.Vertex3f(1.0, 1.0, 0.0)
394
+ begin
395
+ GL.End
396
+ rescue
397
+ # Raises false error on Mac
398
+ end
399
+ end
400
+
401
+ # Depth test on by default
402
+ GL.DepthMask(GL::TRUE)
403
+ GL.Enable(GL::DEPTH_TEST)
404
+
405
+ # Switch to projection matrix
406
+ GL.MatrixMode(GL::PROJECTION)
407
+ GL.LoadIdentity
408
+ case @projection
409
+ when :PARALLEL
410
+ GL.Ortho(@wvt.left, @wvt.right, @wvt.bottom, @wvt.top, @wvt.hither, @wvt.yon)
411
+ when :PERSPECTIVE
412
+ GL.Frustum(@wvt.left, @wvt.right, @wvt.bottom, @wvt.top, @wvt.hither, @wvt.yon)
413
+ end
414
+
415
+ # Switch to model matrix
416
+ GL.MatrixMode(GL::MODELVIEW)
417
+ GL.LoadIdentity
418
+
419
+ # Set light parameters
420
+ GL.Enable(GL::LIGHT0)
421
+ GL.Light(GL::LIGHT0, GL::AMBIENT, @light.ambient)
422
+ GL.Light(GL::LIGHT0, GL::DIFFUSE, @light.diffuse)
423
+ GL.Light(GL::LIGHT0, GL::SPECULAR, @light.specular)
424
+ GL.Light(GL::LIGHT0, GL::POSITION, @light.position)
425
+ GL.Light(GL::LIGHT0, GL::SPOT_DIRECTION, @light.direction)
426
+ GL.Lightf(GL::LIGHT0, GL::SPOT_EXPONENT, @light.exponent)
427
+ GL.Lightf(GL::LIGHT0, GL::SPOT_CUTOFF, @light.cutoff)
428
+ GL.Lightf(GL::LIGHT0, GL::CONSTANT_ATTENUATION, @light.c_attn)
429
+ GL.Lightf(GL::LIGHT0, GL::LINEAR_ATTENUATION, @light.l_attn)
430
+ GL.Lightf(GL::LIGHT0, GL::QUADRATIC_ATTENUATION, @light.q_attn)
431
+
432
+ # Default material colors
433
+ GL.Material(GL::FRONT_AND_BACK, GL::AMBIENT, @material.ambient)
434
+ GL.Material(GL::FRONT_AND_BACK, GL::DIFFUSE, @material.diffuse)
435
+ GL.Material(GL::FRONT_AND_BACK, GL::SPECULAR, @material.specular)
436
+ GL.Material(GL::FRONT_AND_BACK, GL::EMISSION, @material.emission)
437
+ GL.Materialf(GL::FRONT_AND_BACK, GL::SHININESS, @material.shininess)
438
+
439
+ # Color commands change both
440
+ GL.ColorMaterial(GL::FRONT_AND_BACK, GL::AMBIENT_AND_DIFFUSE)
441
+
442
+ # Global ambient light
443
+ GL.LightModel(GL::LIGHT_MODEL_AMBIENT, @ambient)
444
+
445
+ # Enable fog
446
+ if @options.include?(:VIEWER_FOG)
447
+ GL.Enable(GL::FOG)
448
+ GL.Fog(GL::FOG_COLOR, @top_background) # Disappear into the background
449
+ GL.Fogf(GL::FOG_START, (@distance - @diameter).to_f) # Range tight around model position
450
+ GL.Fogf(GL::FOG_END, (@distance + @diameter).to_f) # Far place same as clip plane:- clipped stuff is in the mist!
451
+ GL.Fogi(GL::FOG_MODE, GL::LINEAR) # Simple linear depth cueing
452
+ end
453
+
454
+ # Dithering
455
+ GL.Enable(GL::DITHER) if @options.include?(:VIEWER_DITHER)
456
+
457
+ # Enable lighting
458
+ GL.Enable(GL::LIGHTING) if @options.include?(:VIEWER_LIGHTING)
459
+
460
+ # Set model matrix
461
+ GL.LoadMatrixf(@transform)
462
+
463
+ if (@draw_axis and @draw_axis > 0)
464
+ # Draw axis
465
+ GL.PushMatrix
466
+ GL.LineWidth(2.5)
467
+ GL.Color3f(1.0, 0.0, 0.0)
468
+ GL.Begin(GL::LINES)
469
+ GL.Vertex3f(-@draw_axis.to_f, 0.0, 0.0)
470
+ GL.Vertex3f(@draw_axis.to_f, 0.0, 0.0)
471
+ begin
472
+ GL.End
473
+ rescue
474
+ # Raises false error on Mac
475
+ end
476
+ GL.Color3f(0.0, 1.0, 0.0)
477
+ GL.Begin(GL::LINES)
478
+ GL.Vertex3f(0, -@draw_axis, 0.0)
479
+ GL.Vertex3f(0, @draw_axis, 0)
480
+ begin
481
+ GL.End
482
+ rescue
483
+ # Raises false error on Mac
484
+ end
485
+ GL.Color3f(0.0, 0.0, 1.0)
486
+ GL.Begin(GL::LINES)
487
+ GL.Vertex3f(0, 0, -@draw_axis)
488
+ GL.Vertex3f(0, 0, @draw_axis)
489
+ begin
490
+ GL.End
491
+ rescue
492
+ # Raises false error on Mac
493
+ end
494
+ GL.PopMatrix
495
+ end
496
+
497
+ # Draw what's visible
498
+ @scene.draw(self) if @scene
499
+ end
500
+
501
+ def resizeGL(width, height)
502
+ @wvt.w = width;
503
+ @wvt.h = height;
504
+ updateProjection()
505
+ end
506
+
507
+ def screenToEye(sx, sy, eyez)
508
+ e = [0.0, 0.0, 0.0]
509
+ xp = (@worldpx*sx + @ax).to_f
510
+ yp = (@ay - @worldpx*sy).to_f
511
+ if @projection == :PERSPECTIVE
512
+ if @distance != 0.0
513
+ e.x = [((-eyez*xp) / @distance).to_f, ((-eyez*yp) / @distance).to_f, eyez]
514
+ end
515
+ else
516
+ e = [xp, yp, eyez]
517
+ end
518
+ return e;
519
+ end
520
+
521
+ def screenToTarget(sx, sy)
522
+ [@worldpx*sx.to_f + @ax, @ay - @worldpx*sy.to_f, -@distance.to_f]
523
+ end
524
+
525
+ def eyeToWorld(e)
526
+ [e[0]*@itransform[0][0] + e[1]*@itransform[1][0] + e[2]*@itransform[2][0] + @itransform[3][0],
527
+ e[0]*@itransform[0][1] + e[1]*@itransform[1][1] + e[2]*@itransform[2][1] + @itransform[3][1],
528
+ e[0]*@itransform[0][2] + e[1]*@itransform[1][2] + e[2]*@itransform[2][2] + @itransform[3][2]]
529
+ end
530
+
531
+ def worldToEyeZ(w)
532
+ w[0]*@transform[0][2] + w[1]*@transform[1][2] + w[2]*@transform[2][2] + @transform[3][2]
533
+ end
534
+
535
+ def worldVector(fx, fy, tx, ty)
536
+ wfm = screenToTarget(fx, fy)
537
+ wto = screenToTarget(tx, ty)
538
+ wfm_prime = [wfm[0]*@itransform[0][0] + wfm[1]*@itransform[1][0] + wfm[2]*@itransform[2][0] + @itransform[3][0],
539
+ wfm[0]*@itransform[0][1] + wfm[1]*@itransform[1][1] + wfm[2]*@itransform[2][1] + @itransform[3][1],
540
+ wfm[0]*@itransform[0][2] + wfm[1]*@itransform[1][2] + wfm[2]*@itransform[2][2] + @itransform[3][2]]
541
+ wto_prime = [wto[0]*@itransform[0][0] + wto[1]*@itransform[1][0] + wto[2]*@itransform[2][0] + @itransform[3][0],
542
+ wto[0]*@itransform[0][1] + wto[1]*@itransform[1][1] + wto[2]*@itransform[2][1] + @itransform[3][1],
543
+ wto[0]*@itransform[0][2] + wto[1]*@itransform[1][2] + wto[2]*@itransform[2][2] + @itransform[3][2]]
544
+ return [wto_prime[0] - wfm_prime[0], wto_prime[1] - wfm_prime[1], wto_prime[2] - wfm_prime[2]]
545
+ end
546
+
547
+ def spherePoint(x, y)
548
+ if @wvt.w > @wvt.h
549
+ screenmin = wvt.h.to_f
550
+ else
551
+ screenmin = wvt.w.to_f
552
+ end
553
+ v = []
554
+ v[0] = 2.0 * (x - 0.5*@wvt.w) / screenmin
555
+ v[1] = 2.0 * (0.5 * @wvt.h - y) / screenmin
556
+ d = v[0]*v[0] + v[1]*v[1]
557
+
558
+ if d < 0.75
559
+ v[2] = sqrt(1.0-d)
560
+ elsif d < 3.0
561
+ d = 1.7320508008 - sqrt(d)
562
+ t = 1.0 - d*d
563
+ t = 0.0 if t < 0.0
564
+ v[2] = 1.0 - sqrt(t)
565
+ else
566
+ v[2] = 0.0
567
+ end
568
+
569
+ length = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2])
570
+ if length > 0.0
571
+ return [v[0] / length, v[1] / length, v[2] / length]
572
+ else
573
+ return [0.0, 0.0, 0.0]
574
+ end
575
+ end
576
+
577
+ def turn(fx, fy, tx, ty)
578
+ return Quaternion.arc(spherePoint(fx,fy), spherePoint(tx,ty))
579
+ end
580
+
581
+ def mode=(mode)
582
+ @mode = mode
583
+ case @mode
584
+ when :ZOOMING
585
+ Qt::Application.setOverrideCursor(Cosmos.getCursor(Qt::SizeVerCursor))
586
+ when :DRAGGING
587
+ Qt::Application.setOverrideCursor(Cosmos.getCursor(Qt::ClosedHandCursor))
588
+ when :ROTATING
589
+ Qt::Application.setOverrideCursor(Cosmos.getCursor(Qt::CrossCursor))
590
+ when :TRANSLATING
591
+ Qt::Application.setOverrideCursor(Cosmos.getCursor(Qt::SizeAllCursor))
592
+ else
593
+ Qt::Application.restoreOverrideCursor
594
+ end
595
+ end
596
+
597
+ def mousePressEvent(event)
598
+ case event.button
599
+ when Qt::LeftButton
600
+ self.mode = :PICKING
601
+ if (event.buttons & Qt::RightButton.to_i) != 0
602
+ self.mode = :ZOOMING
603
+ elsif (@selection and @selection.dragable and @selection == pick(event.x, event.y))
604
+ self.mode = :DRAGGING
605
+ end
606
+ when Qt::RightButton
607
+ if (event.buttons & Qt::LeftButton.to_i) != 0
608
+ self.mode = :ZOOMING
609
+ else
610
+ self.mode = :POSTING
611
+ end
612
+ when Qt::MidButton
613
+ self.mode = :ZOOMING
614
+ end
615
+ @lastPos = event.pos
616
+ end
617
+
618
+ def mouseReleaseEvent(event)
619
+ case @mode
620
+ when :PICKING
621
+ self.selection = pick(event.x, event.y)
622
+ end
623
+
624
+ if (((event.buttons & Qt::RightButton.to_i) != 0) and ((event.buttons & Qt::LeftButton.to_i) != 0)) or ((event.buttons & Qt::MidButton.to_i) != 0)
625
+ self.mode = :ZOOMING
626
+ elsif (event.buttons & Qt::LeftButton.to_i) != 0
627
+ self.mode = :ROTATING
628
+ elsif (event.buttons & Qt::RightButton.to_i) != 0
629
+ self.mode = :TRANSLATING
630
+ else
631
+ self.mode = :HOVERING
632
+ end
633
+ end
634
+
635
+ def mouseMoveEvent(event)
636
+ dx = event.x - @lastPos.x
637
+ dy = event.y - @lastPos.y
638
+
639
+ case @mode
640
+ when :PICKING, :POSTING
641
+ if dx.abs > 0 or dy.abs > 0
642
+ if @mode == :PICKING
643
+ self.mode = :ROTATING
644
+ else
645
+ self.mode = :TRANSLATING
646
+ end
647
+ end
648
+ when :TRANSLATING
649
+ vector = worldVector(@lastPos.x, @lastPos.y, event.x, event.y)
650
+ translate([-vector[0], -vector[1], -vector[2]])
651
+ when :DRAGGING
652
+ if @selection and @selection.drag(self, @lastPos.x, @lastPos.y, event.x, event.y)
653
+ updateGL()
654
+ end
655
+ when :ROTATING
656
+ self.orientation = turn(@lastPos.x, @lastPos.y, event.x, event.y) * @orientation
657
+ when :ZOOMING
658
+ delta = 0.005 * dy
659
+ self.zoom = @zoom * (2.0 ** delta)
660
+ end
661
+
662
+ @lastPos = event.pos
663
+ end
664
+
665
+ def wheelEvent(event)
666
+ self.zoom = @zoom * (2.0 ** (-0.1 * event.delta / 120.0))
667
+ end
668
+
669
+ protected
670
+
671
+ def updateProjection
672
+ # Should be non-0 size viewport
673
+ if @wvt.w > 0 and @wvt.h > 0
674
+ # Aspect ratio of viewer
675
+ aspect = @wvt.h.to_f / @wvt.w.to_f
676
+
677
+ # Get world box
678
+ r = 0.5 * @diameter / @zoom
679
+ if @wvt.w <= @wvt.h
680
+ @wvt.left = -r
681
+ @wvt.right = r
682
+ @wvt.bottom = -r * aspect
683
+ @wvt.top = r * aspect
684
+ else
685
+ @wvt.left = -r / aspect
686
+ @wvt.right = r / aspect
687
+ @wvt.bottom = -r
688
+ @wvt.top = r
689
+ end
690
+
691
+ @wvt.yon = @distance + @diameter
692
+ @wvt.hither = 0.1 * @wvt.yon
693
+
694
+ # Size of a pixel in world and model
695
+ @worldpx = (@wvt.right - @wvt.left) / @wvt.w
696
+ @modelpx = @worldpx * @diameter
697
+
698
+ # Precalc stuff for view->world backmapping
699
+ @ax = @wvt.left
700
+ @ay = @wvt.top - @worldpx
701
+
702
+ # Correction for perspective
703
+ if @projection == :PERSPECTIVE
704
+ hither_fac= @wvt.hither / @distance
705
+ @wvt.left *= hither_fac
706
+ @wvt.right *= hither_fac
707
+ @wvt.top *= hither_fac
708
+ @wvt.bottom *= hither_fac
709
+ end
710
+ end
711
+ end
712
+
713
+ def updateTransform
714
+ @transform = Matrix.identity(4)
715
+ @transform.trans4(0.0, 0.0, -@distance.to_f)
716
+ @transform.rot4(@orientation);
717
+ @transform.scale4(@scale[0], @scale[1], @scale[2]);
718
+ @transform.trans4(-@center[0], -@center[1], -@center[2]);
719
+ @itransform = @transform.inverse
720
+ end
721
+
722
+ end # class OpenGLViewer
723
+
724
+ end # module Cosmos