cosmos 3.0.1 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
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