cosmos 3.5.1 → 3.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1158) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -1
  3. data/.gitattributes +3 -3
  4. data/.gitignore +48 -48
  5. data/.travis.yml +8 -8
  6. data/CONTRIBUTING.txt +50 -50
  7. data/Gemfile +10 -10
  8. data/Guardfile +27 -27
  9. data/LICENSE.txt +879 -879
  10. data/Manifest.txt +1414 -1414
  11. data/README.md +111 -111
  12. data/Rakefile +218 -214
  13. data/autohotkey/config/data/diamond.STL +57 -57
  14. data/autohotkey/config/system/system.txt +34 -34
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  17. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  18. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  20. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +270 -270
  21. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  22. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  23. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -305
  24. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  25. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  26. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  27. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  28. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  29. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  30. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  31. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  32. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  33. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  34. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  37. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  38. data/autohotkey/config/targets/INST/target.txt +26 -26
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  40. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  41. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  42. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  43. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  44. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  45. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  46. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  47. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  48. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  49. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  50. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  51. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  52. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  55. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  57. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  58. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  59. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  60. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  61. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  62. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  63. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  64. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  65. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  66. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  67. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  69. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  70. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  71. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  72. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  75. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  76. data/autohotkey/lib/example_background_task.rb +42 -42
  77. data/autohotkey/lib/user_version.rb +3 -3
  78. data/autohotkey/procedures/clear_util.rb +7 -7
  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 +24 -24
  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/ReplayAHK +17 -17
  101. data/autohotkey/tools/ScriptRunner +14 -14
  102. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  103. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  104. data/autohotkey/tools/TableManager +14 -14
  105. data/autohotkey/tools/TableManagerAHK +30 -30
  106. data/autohotkey/tools/TestRunner +15 -15
  107. data/autohotkey/tools/TestRunnerAHK +17 -17
  108. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  109. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK5 +17 -17
  112. data/autohotkey/tools/TestRunnerAHK6 +17 -17
  113. data/autohotkey/tools/TlmExtractor +15 -15
  114. data/autohotkey/tools/TlmExtractorAHK +19 -19
  115. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  116. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  117. data/autohotkey/tools/TlmGrapher +14 -14
  118. data/autohotkey/tools/TlmGrapherAHK +19 -19
  119. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  120. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  121. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  122. data/autohotkey/tools/TlmViewer +14 -14
  123. data/autohotkey/tools/TlmViewerAHK +28 -28
  124. data/autohotkey/tools/TlmViewerAHK2 +22 -22
  125. data/autohotkey/tools/TlmViewerAHK3 +23 -23
  126. data/autohotkey/tools/TlmViewerAHK4 +22 -22
  127. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  128. data/autohotkey/tools/autohotkey.rb +37 -37
  129. data/autohotkey/tools/cmd_extractor.ahk +33 -33
  130. data/autohotkey/tools/cmd_sender.ahk +182 -182
  131. data/autohotkey/tools/cmd_tlm_server.ahk +90 -90
  132. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  133. data/autohotkey/tools/data_viewer.ahk +141 -141
  134. data/autohotkey/tools/handbook_creator.ahk +32 -32
  135. data/autohotkey/tools/launcher.ahk +41 -41
  136. data/autohotkey/tools/limits_monitor.ahk +123 -123
  137. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  138. data/autohotkey/tools/packet_viewer.ahk +196 -196
  139. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  140. data/autohotkey/tools/replay.ahk +104 -104
  141. data/autohotkey/tools/script_runner.ahk +589 -589
  142. data/autohotkey/tools/script_runner2.ahk +38 -38
  143. data/autohotkey/tools/table_manager.ahk +220 -220
  144. data/autohotkey/tools/test_runner.ahk +262 -262
  145. data/autohotkey/tools/test_runner2.ahk +53 -53
  146. data/autohotkey/tools/test_runner3.ahk +13 -13
  147. data/autohotkey/tools/test_runner5.ahk +8 -8
  148. data/autohotkey/tools/test_runner6.ahk +5 -5
  149. data/autohotkey/tools/tlm_extractor.ahk +296 -296
  150. data/autohotkey/tools/tlm_grapher.ahk +660 -660
  151. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  152. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  153. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  154. data/autohotkey/tools/tlm_viewer2.ahk +50 -50
  155. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  156. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  157. data/bin/cosmos +96 -96
  158. data/bin/cstol_converter +1166 -1166
  159. data/bin/rubysloc +85 -85
  160. data/cosmos.gemspec +99 -99
  161. data/data/about.txt +4 -4
  162. data/data/crc.txt +326 -326
  163. data/data/diamond.STL +57 -57
  164. data/data/legal.txt +9 -9
  165. data/demo/Gemfile +10 -10
  166. data/demo/Launcher +16 -16
  167. data/demo/Launcher.bat +0 -0
  168. data/demo/Rakefile +77 -77
  169. data/demo/config/data/crc.txt +224 -226
  170. data/demo/config/data/diamond.STL +57 -57
  171. data/demo/config/data/meta_init.txt +4 -4
  172. data/demo/config/system/system.txt +35 -35
  173. data/demo/config/system/system2.txt +33 -33
  174. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  175. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  176. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  177. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  178. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  179. data/demo/config/targets/COSMOS/target.txt +11 -11
  180. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  181. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +5 -5
  182. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  183. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  184. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  185. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  186. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  187. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  188. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  189. data/demo/config/targets/INST/lib/sim_inst.rb +305 -305
  190. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  191. data/demo/config/targets/INST/screens/array.txt +15 -15
  192. data/demo/config/targets/INST/screens/block.txt +8 -8
  193. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  194. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  195. data/demo/config/targets/INST/screens/ground.txt +25 -25
  196. data/demo/config/targets/INST/screens/hs.txt +44 -44
  197. data/demo/config/targets/INST/screens/latest.txt +23 -23
  198. data/demo/config/targets/INST/screens/other.txt +29 -29
  199. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  200. data/demo/config/targets/INST/target.txt +33 -33
  201. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  202. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  203. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  204. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  205. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  206. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -13
  207. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  208. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  209. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +56 -56
  210. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  211. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +39 -39
  212. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +34 -34
  213. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  214. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  215. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +88 -88
  216. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  217. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  218. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  219. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  220. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  221. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  222. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  223. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  224. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  225. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +82 -82
  226. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  227. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  228. data/demo/config/tools/launcher/launcher.txt +45 -45
  229. data/demo/config/tools/launcher/launcher2.txt +45 -45
  230. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  231. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  232. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  233. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  234. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  235. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  236. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  237. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  238. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  239. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  240. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  241. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  242. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  243. data/demo/lib/example_background_task.rb +57 -57
  244. data/demo/lib/example_target.rb +113 -113
  245. data/demo/lib/scpi_target.rb +74 -74
  246. data/demo/lib/user_version.rb +3 -3
  247. data/demo/procedures/checks.rb +11 -11
  248. data/demo/procedures/clear_util.rb +7 -7
  249. data/demo/procedures/collect.rb +18 -18
  250. data/demo/procedures/collect_util.rb +14 -14
  251. data/demo/procedures/cosmos_api_test.rb +293 -293
  252. data/demo/procedures/disconnect.rb +29 -29
  253. data/demo/procedures/example_test.rb +183 -183
  254. data/demo/procedures/plot_test.rb +8 -8
  255. data/demo/procedures/run_example_test.rb +3 -3
  256. data/demo/procedures/test.rb +51 -51
  257. data/demo/tools/CmdExtractor +16 -16
  258. data/demo/tools/CmdExtractor.bat +0 -0
  259. data/demo/tools/CmdSender +16 -16
  260. data/demo/tools/CmdSender.bat +0 -0
  261. data/demo/tools/CmdTlmServer +16 -16
  262. data/demo/tools/CmdTlmServer.bat +0 -0
  263. data/demo/tools/DataViewer +16 -16
  264. data/demo/tools/DataViewer.bat +0 -0
  265. data/demo/tools/ExampleTarget +16 -16
  266. data/demo/tools/ExampleTarget.bat +0 -0
  267. data/demo/tools/HandbookCreator +16 -16
  268. data/demo/tools/HandbookCreator.bat +0 -0
  269. data/demo/tools/Launcher +16 -16
  270. data/demo/tools/Launcher.bat +0 -0
  271. data/demo/tools/LimitsMonitor +16 -16
  272. data/demo/tools/LimitsMonitor.bat +0 -0
  273. data/demo/tools/OpenGLBuilder +16 -16
  274. data/demo/tools/OpenGLBuilder.bat +0 -0
  275. data/demo/tools/PacketViewer +16 -16
  276. data/demo/tools/PacketViewer.bat +0 -0
  277. data/demo/tools/Replay +16 -16
  278. data/demo/tools/Replay.bat +0 -0
  279. data/demo/tools/ScpiTarget +16 -16
  280. data/demo/tools/ScpiTarget.bat +0 -0
  281. data/demo/tools/ScriptRunner +16 -16
  282. data/demo/tools/ScriptRunner.bat +0 -0
  283. data/demo/tools/TableManager +16 -16
  284. data/demo/tools/TableManager.bat +0 -0
  285. data/demo/tools/TestRunner +16 -16
  286. data/demo/tools/TestRunner.bat +0 -0
  287. data/demo/tools/TlmExtractor +16 -16
  288. data/demo/tools/TlmExtractor.bat +0 -0
  289. data/demo/tools/TlmGrapher +16 -16
  290. data/demo/tools/TlmGrapher.bat +0 -0
  291. data/demo/tools/TlmViewer +16 -16
  292. data/demo/tools/TlmViewer.bat +0 -0
  293. data/demo/tools/ToolLaunch.bat +14 -5
  294. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  295. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  296. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  297. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  298. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  299. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  300. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  301. data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  302. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  304. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  305. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  306. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  307. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  308. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  309. data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  310. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  311. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  312. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  313. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  314. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  316. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  317. data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  318. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  319. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  320. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  321. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  322. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  323. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  324. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  325. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  326. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  328. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  329. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  330. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  331. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  332. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  333. data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  334. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  335. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  336. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  337. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  338. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  339. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  340. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  341. data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  342. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  343. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  344. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  345. data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  346. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  347. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  348. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  349. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  350. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  351. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  352. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  353. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  354. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  355. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  356. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  357. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  358. data/demo/tools/tool_launch.rb +38 -38
  359. data/ext/cosmos/ext/array/array.c +111 -111
  360. data/ext/cosmos/ext/array/extconf.rb +13 -13
  361. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  362. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  363. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  364. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  365. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  366. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  367. data/ext/cosmos/ext/crc/crc.c +341 -341
  368. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  369. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  370. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  371. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  372. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +265 -265
  373. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  374. data/ext/cosmos/ext/packet/packet.c +339 -339
  375. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  376. data/ext/cosmos/ext/platform/platform.c +101 -101
  377. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  378. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  379. data/ext/cosmos/ext/string/extconf.rb +13 -13
  380. data/ext/cosmos/ext/string/string.c +49 -49
  381. data/ext/cosmos/ext/structure/structure.c +1428 -1428
  382. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  383. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  384. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  385. data/ext/cosmos/ext/telemetry/telemetry.c +307 -307
  386. data/ext/mkrf_conf.rb +40 -40
  387. data/install/Gemfile +10 -10
  388. data/install/Launcher +16 -16
  389. data/install/Launcher.bat +0 -0
  390. data/install/Rakefile +77 -77
  391. data/install/config/data/crc.txt +151 -151
  392. data/install/config/system/system.txt +29 -29
  393. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  394. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  395. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  396. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  397. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  398. data/install/config/targets/COSMOS/target.txt +8 -8
  399. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  400. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  401. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  402. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  403. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  404. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  405. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  406. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  407. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  408. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  409. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  410. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  411. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  412. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  413. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  414. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  415. data/install/config/tools/launcher/launcher.txt +40 -40
  416. data/install/config/tools/script_runner/script_runner.txt +3 -3
  417. data/install/config/tools/test_runner/test_runner.txt +8 -8
  418. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  419. data/install/lib/user_version.rb +3 -3
  420. data/install/tools/CmdExtractor +16 -16
  421. data/install/tools/CmdExtractor.bat +0 -0
  422. data/install/tools/CmdSender +16 -16
  423. data/install/tools/CmdSender.bat +0 -0
  424. data/install/tools/CmdTlmServer +16 -16
  425. data/install/tools/CmdTlmServer.bat +0 -0
  426. data/install/tools/DataViewer +16 -16
  427. data/install/tools/DataViewer.bat +0 -0
  428. data/install/tools/HandbookCreator +16 -16
  429. data/install/tools/HandbookCreator.bat +0 -0
  430. data/install/tools/Launcher +16 -16
  431. data/install/tools/Launcher.bat +0 -0
  432. data/install/tools/LimitsMonitor +16 -16
  433. data/install/tools/LimitsMonitor.bat +0 -0
  434. data/install/tools/OpenGLBuilder +16 -16
  435. data/install/tools/OpenGLBuilder.bat +0 -0
  436. data/install/tools/PacketViewer +16 -16
  437. data/install/tools/PacketViewer.bat +0 -0
  438. data/install/tools/Replay +16 -16
  439. data/install/tools/Replay.bat +0 -0
  440. data/install/tools/ScriptRunner +16 -16
  441. data/install/tools/ScriptRunner.bat +0 -0
  442. data/install/tools/TableManager +16 -16
  443. data/install/tools/TableManager.bat +0 -0
  444. data/install/tools/TestRunner +16 -16
  445. data/install/tools/TestRunner.bat +0 -0
  446. data/install/tools/TlmExtractor +16 -16
  447. data/install/tools/TlmExtractor.bat +0 -0
  448. data/install/tools/TlmGrapher +16 -16
  449. data/install/tools/TlmGrapher.bat +0 -0
  450. data/install/tools/TlmViewer +16 -16
  451. data/install/tools/TlmViewer.bat +0 -0
  452. data/install/tools/ToolLaunch.bat +14 -5
  453. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  454. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +16 -16
  455. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +10 -10
  456. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  457. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  458. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +16 -16
  459. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +10 -10
  460. data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -38
  461. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +16 -16
  463. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +10 -10
  464. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -38
  465. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  466. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +16 -16
  467. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +10 -10
  468. data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  469. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  470. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +16 -16
  471. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +10 -10
  472. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -38
  473. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +16 -16
  475. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +10 -10
  476. data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -38
  477. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  478. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +16 -16
  479. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +10 -10
  480. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -38
  481. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  482. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +16 -16
  483. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +10 -10
  484. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -38
  485. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  486. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +16 -16
  487. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +10 -10
  488. data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  489. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  490. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +16 -16
  491. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +10 -10
  492. data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -38
  493. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  494. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +16 -16
  495. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +10 -10
  496. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  497. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  498. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +16 -16
  499. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +10 -10
  500. data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -38
  501. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  502. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +16 -16
  503. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +10 -10
  504. data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -38
  505. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  506. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +16 -16
  507. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +10 -10
  508. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -38
  509. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  510. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +16 -16
  511. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +10 -10
  512. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -38
  513. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  514. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +16 -16
  515. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +10 -10
  516. data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -38
  517. data/install/tools/tool_launch.rb +38 -38
  518. data/lib/cosmos.rb +63 -63
  519. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  520. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  521. data/lib/cosmos/config/config_parser.rb +324 -324
  522. data/lib/cosmos/conversions.rb +13 -13
  523. data/lib/cosmos/conversions/conversion.rb +47 -47
  524. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  525. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  526. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  527. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  528. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  529. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  530. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  531. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  532. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  533. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  534. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  535. data/lib/cosmos/core_ext.rb +18 -18
  536. data/lib/cosmos/core_ext/array.rb +354 -354
  537. data/lib/cosmos/core_ext/class.rb +51 -51
  538. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  539. data/lib/cosmos/core_ext/exception.rb +52 -52
  540. data/lib/cosmos/core_ext/file.rb +75 -75
  541. data/lib/cosmos/core_ext/hash.rb +28 -28
  542. data/lib/cosmos/core_ext/io.rb +75 -75
  543. data/lib/cosmos/core_ext/kernel.rb +38 -38
  544. data/lib/cosmos/core_ext/math.rb +119 -119
  545. data/lib/cosmos/core_ext/matrix.rb +146 -146
  546. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  547. data/lib/cosmos/core_ext/range.rb +22 -22
  548. data/lib/cosmos/core_ext/socket.rb +32 -32
  549. data/lib/cosmos/core_ext/string.rb +311 -311
  550. data/lib/cosmos/core_ext/stringio.rb +24 -24
  551. data/lib/cosmos/core_ext/time.rb +448 -448
  552. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  553. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  554. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  555. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  556. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  557. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +326 -326
  558. data/lib/cosmos/gui/dialogs/about_dialog.rb +137 -137
  559. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  560. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  561. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  562. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  563. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  564. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  565. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +260 -260
  566. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -169
  567. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  568. data/lib/cosmos/gui/dialogs/progress_dialog.rb +276 -276
  569. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -165
  570. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  571. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  572. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  573. data/lib/cosmos/gui/dialogs/splash.rb +135 -135
  574. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  575. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  576. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  577. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  578. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +473 -473
  579. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  580. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +451 -451
  581. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  582. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  583. data/lib/cosmos/gui/line_graph/overview_graph.rb +469 -469
  584. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  585. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  586. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  587. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  588. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  589. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  590. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -724
  591. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  592. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  593. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  594. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  595. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  596. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  597. data/lib/cosmos/gui/qt.rb +860 -860
  598. data/lib/cosmos/gui/qt_tool.rb +380 -380
  599. data/lib/cosmos/gui/text/completion.rb +381 -381
  600. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  601. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  602. data/lib/cosmos/gui/text/ruby_editor.rb +415 -415
  603. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  604. data/lib/cosmos/gui/utilities/script_module_gui.rb +330 -330
  605. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  606. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  607. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  608. data/lib/cosmos/interfaces.rb +11 -11
  609. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -153
  610. data/lib/cosmos/interfaces/interface.rb +225 -225
  611. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  612. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  613. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -129
  614. data/lib/cosmos/interfaces/stream_interface.rb +136 -136
  615. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  616. data/lib/cosmos/interfaces/tcpip_server_interface.rb +164 -164
  617. data/lib/cosmos/interfaces/udp_interface.rb +161 -161
  618. data/lib/cosmos/io/buffered_file.rb +11 -11
  619. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  620. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  621. data/lib/cosmos/io/json_drb.rb +376 -376
  622. data/lib/cosmos/io/json_drb_object.rb +198 -198
  623. data/lib/cosmos/io/json_rpc.rb +365 -365
  624. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  625. data/lib/cosmos/io/raw_logger.rb +174 -174
  626. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  627. data/lib/cosmos/io/serial_driver.rb +85 -85
  628. data/lib/cosmos/io/stderr.rb +36 -36
  629. data/lib/cosmos/io/stdout.rb +36 -36
  630. data/lib/cosmos/io/tcpip_server.rb +571 -571
  631. data/lib/cosmos/io/udp_sockets.rb +152 -152
  632. data/lib/cosmos/io/win32_serial_driver.rb +145 -145
  633. data/lib/cosmos/packet_logs.rb +7 -7
  634. data/lib/cosmos/packet_logs/ccsds_log_reader.rb +104 -104
  635. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  636. data/lib/cosmos/packet_logs/packet_log_reader.rb +450 -450
  637. data/lib/cosmos/packet_logs/packet_log_writer.rb +323 -323
  638. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  639. data/lib/cosmos/packets/binary_accessor.rb +634 -634
  640. data/lib/cosmos/packets/commands.rb +293 -293
  641. data/lib/cosmos/packets/limits.rb +267 -267
  642. data/lib/cosmos/packets/limits_response.rb +38 -38
  643. data/lib/cosmos/packets/packet.rb +786 -786
  644. data/lib/cosmos/packets/packet_config.rb +482 -482
  645. data/lib/cosmos/packets/packet_item.rb +317 -317
  646. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  647. data/lib/cosmos/packets/parsers/format_string_parser.rb +58 -58
  648. data/lib/cosmos/packets/parsers/limits_parser.rb +146 -146
  649. data/lib/cosmos/packets/parsers/limits_response_parser.rb +52 -52
  650. data/lib/cosmos/packets/parsers/macro_parser.rb +116 -116
  651. data/lib/cosmos/packets/parsers/packet_item_parser.rb +215 -215
  652. data/lib/cosmos/packets/parsers/packet_parser.rb +123 -123
  653. data/lib/cosmos/packets/parsers/processor_parser.rb +63 -63
  654. data/lib/cosmos/packets/parsers/state_parser.rb +116 -116
  655. data/lib/cosmos/packets/structure.rb +458 -458
  656. data/lib/cosmos/packets/structure_item.rb +233 -233
  657. data/lib/cosmos/packets/telemetry.rb +350 -350
  658. data/lib/cosmos/processors.rb +6 -6
  659. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  660. data/lib/cosmos/processors/processor.rb +71 -71
  661. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  662. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  663. data/lib/cosmos/script.rb +9 -9
  664. data/lib/cosmos/script/cmd_tlm_server.rb +110 -110
  665. data/lib/cosmos/script/commands.rb +184 -184
  666. data/lib/cosmos/script/extract.rb +123 -123
  667. data/lib/cosmos/script/limits.rb +114 -114
  668. data/lib/cosmos/script/script.rb +76 -76
  669. data/lib/cosmos/script/scripting.rb +897 -897
  670. data/lib/cosmos/script/telemetry.rb +174 -174
  671. data/lib/cosmos/script/tools.rb +138 -138
  672. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  673. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  674. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  675. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  676. data/lib/cosmos/streams/serial_stream.rb +157 -157
  677. data/lib/cosmos/streams/stream.rb +63 -63
  678. data/lib/cosmos/streams/stream_protocol.rb +373 -373
  679. data/lib/cosmos/streams/tcpip_client_stream.rb +113 -113
  680. data/lib/cosmos/streams/tcpip_socket_stream.rb +143 -143
  681. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  682. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  683. data/lib/cosmos/system.rb +4 -4
  684. data/lib/cosmos/system/system.rb +618 -618
  685. data/lib/cosmos/system/target.rb +197 -197
  686. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +255 -255
  687. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +717 -717
  688. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  689. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  690. data/lib/cosmos/tools/cmd_tlm_server/api.rb +1034 -1034
  691. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  692. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -67
  693. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +515 -515
  694. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +253 -253
  695. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +408 -408
  696. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  697. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +175 -175
  698. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +200 -200
  699. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +176 -176
  700. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +150 -150
  701. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +244 -244
  702. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +90 -90
  703. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +266 -266
  704. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  705. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  706. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  707. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  708. data/lib/cosmos/tools/data_viewer/data_viewer.rb +621 -621
  709. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +134 -134
  710. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  711. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +156 -156
  712. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +382 -382
  713. data/lib/cosmos/tools/launcher/launcher.rb +188 -188
  714. data/lib/cosmos/tools/launcher/launcher_config.rb +256 -256
  715. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -40
  716. data/lib/cosmos/tools/launcher/launcher_tool.rb +116 -116
  717. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +837 -837
  718. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  719. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  720. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +542 -542
  721. data/lib/cosmos/tools/replay/replay.rb +501 -501
  722. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  723. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -147
  724. data/lib/cosmos/tools/script_runner/script_runner.rb +922 -922
  725. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  726. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1798 -1798
  727. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  728. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  729. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  730. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  731. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  732. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  733. data/lib/cosmos/tools/test_runner/test.rb +539 -539
  734. data/lib/cosmos/tools/test_runner/test_runner.rb +1189 -1189
  735. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +341 -341
  736. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  737. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1016 -1016
  738. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  739. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  740. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  741. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  742. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +95 -95
  743. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  744. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +181 -181
  745. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  746. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  747. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +174 -174
  748. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +193 -193
  749. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +407 -407
  750. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  751. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  752. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -323
  753. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  754. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  755. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  756. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  757. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  758. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  759. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  760. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  761. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  762. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  763. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  764. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1291 -1291
  765. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  766. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  767. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +114 -114
  768. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  769. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +78 -78
  770. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  771. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  772. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  773. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -486
  774. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +561 -561
  775. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +290 -290
  776. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  777. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  778. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +66 -66
  779. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +57 -57
  780. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  781. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  782. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  783. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  784. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  785. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  786. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  787. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  788. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  789. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  790. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  791. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  792. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  793. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  794. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  795. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  796. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  797. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  798. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  799. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  800. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  801. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  802. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  803. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  804. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  805. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  806. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  807. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  808. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  809. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  810. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  811. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  812. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  813. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  814. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  815. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  816. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  817. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  818. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  819. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  820. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  821. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  822. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  823. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  824. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  825. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  826. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  827. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  828. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  829. data/lib/cosmos/top_level.rb +759 -759
  830. data/lib/cosmos/utilities.rb +11 -11
  831. data/lib/cosmos/utilities/crc.rb +166 -166
  832. data/lib/cosmos/utilities/csv.rb +83 -83
  833. data/lib/cosmos/utilities/logger.rb +137 -137
  834. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  835. data/lib/cosmos/utilities/message_log.rb +79 -79
  836. data/lib/cosmos/utilities/quaternion.rb +258 -258
  837. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  838. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  839. data/lib/cosmos/utilities/sleeper.rb +44 -44
  840. data/lib/cosmos/version.rb +12 -12
  841. data/lib/cosmos/win32/excel.rb +66 -66
  842. data/lib/cosmos/win32/win32.rb +387 -387
  843. data/lib/cosmos/win32/win32_main.rb +321 -321
  844. data/roodi.yml +24 -24
  845. data/run_gui_tests.bat +0 -0
  846. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  847. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  848. data/spec/config/config_parser_spec.rb +322 -322
  849. data/spec/conversions/conversion_spec.rb +31 -31
  850. data/spec/conversions/generic_conversion_spec.rb +45 -45
  851. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  852. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  853. data/spec/conversions/processor_conversion_spec.rb +45 -45
  854. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  855. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  856. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  857. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  858. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  859. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  860. data/spec/core_ext/array_spec.rb +186 -186
  861. data/spec/core_ext/class_spec.rb +36 -36
  862. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  863. data/spec/core_ext/exception_spec.rb +91 -91
  864. data/spec/core_ext/file_spec.rb +72 -72
  865. data/spec/core_ext/hash_spec.rb +24 -24
  866. data/spec/core_ext/io_spec.rb +46 -46
  867. data/spec/core_ext/kernel_spec.rb +54 -54
  868. data/spec/core_ext/math_spec.rb +116 -116
  869. data/spec/core_ext/matrix_spec.rb +66 -66
  870. data/spec/core_ext/objectspace_spec.rb +29 -29
  871. data/spec/core_ext/range_spec.rb +21 -21
  872. data/spec/core_ext/socket_spec.rb +32 -32
  873. data/spec/core_ext/string_spec.rb +223 -223
  874. data/spec/core_ext/stringio_spec.rb +21 -21
  875. data/spec/core_ext/time_spec.rb +202 -202
  876. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  877. data/spec/gui/qt_spec.rb +102 -102
  878. data/spec/install/config/system/system.txt +33 -33
  879. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  880. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  881. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  882. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  883. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  884. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  885. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  886. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  887. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  888. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  889. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  890. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -305
  891. data/spec/install/config/targets/INST/target.txt +10 -10
  892. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  893. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  894. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  895. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  896. data/spec/interfaces/interface_spec.rb +130 -130
  897. data/spec/interfaces/linc_interface_spec.rb +259 -259
  898. data/spec/interfaces/serial_interface_spec.rb +56 -56
  899. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  900. data/spec/interfaces/stream_interface_spec.rb +157 -157
  901. data/spec/interfaces/tcpip_client_interface_spec.rb +55 -55
  902. data/spec/interfaces/tcpip_server_interface_spec.rb +160 -160
  903. data/spec/interfaces/udp_interface_spec.rb +175 -175
  904. data/spec/io/buffered_file_spec.rb +113 -113
  905. data/spec/io/io_multiplexer_spec.rb +94 -94
  906. data/spec/io/json_drb_object_spec.rb +119 -119
  907. data/spec/io/json_drb_spec.rb +311 -311
  908. data/spec/io/json_rpc_spec.rb +264 -264
  909. data/spec/io/raw_logger_pair_spec.rb +76 -76
  910. data/spec/io/raw_logger_spec.rb +133 -133
  911. data/spec/io/serial_driver_spec.rb +60 -60
  912. data/spec/io/stderr_spec.rb +32 -32
  913. data/spec/io/stdout_spec.rb +32 -32
  914. data/spec/io/tcpip_server_spec.rb +338 -338
  915. data/spec/io/udp_sockets_spec.rb +94 -94
  916. data/spec/io/win32_serial_driver_spec.rb +88 -88
  917. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  918. data/spec/packet_logs/packet_log_reader_spec.rb +468 -468
  919. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  920. data/spec/packet_logs/packet_log_writer_spec.rb +225 -225
  921. data/spec/packets/binary_accessor_spec.rb +2326 -2326
  922. data/spec/packets/commands_spec.rb +369 -369
  923. data/spec/packets/limits_response_spec.rb +25 -25
  924. data/spec/packets/limits_spec.rb +344 -344
  925. data/spec/packets/packet_config_spec.rb +805 -805
  926. data/spec/packets/packet_item_limits_spec.rb +161 -161
  927. data/spec/packets/packet_item_spec.rb +386 -386
  928. data/spec/packets/packet_spec.rb +1317 -1317
  929. data/spec/packets/parsers/format_string_parser_spec.rb +122 -122
  930. data/spec/packets/parsers/limits_parser_spec.rb +282 -282
  931. data/spec/packets/parsers/limits_response_parser_spec.rb +149 -149
  932. data/spec/packets/parsers/macro_parser_spec.rb +212 -212
  933. data/spec/packets/parsers/packet_item_parser_spec.rb +306 -306
  934. data/spec/packets/parsers/packet_parser_spec.rb +99 -99
  935. data/spec/packets/parsers/processor_parser_spec.rb +114 -114
  936. data/spec/packets/parsers/state_parser_spec.rb +156 -156
  937. data/spec/packets/structure_item_spec.rb +195 -195
  938. data/spec/packets/structure_spec.rb +565 -565
  939. data/spec/packets/telemetry_spec.rb +578 -578
  940. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  941. data/spec/processors/processor_spec.rb +55 -55
  942. data/spec/processors/statistics_processor_spec.rb +60 -60
  943. data/spec/processors/watermark_processor_spec.rb +51 -51
  944. data/spec/script/cmd_tlm_server_spec.rb +110 -110
  945. data/spec/script/commands_disconnect_spec.rb +270 -270
  946. data/spec/script/commands_spec.rb +302 -302
  947. data/spec/script/limits_spec.rb +153 -153
  948. data/spec/script/script_spec.rb +86 -86
  949. data/spec/script/scripting_spec.rb +440 -440
  950. data/spec/script/telemetry_spec.rb +165 -165
  951. data/spec/script/tools_spec.rb +117 -117
  952. data/spec/spec_helper.rb +190 -190
  953. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  954. data/spec/streams/fixed_stream_protocol_spec.rb +113 -113
  955. data/spec/streams/length_stream_protocol_spec.rb +300 -300
  956. data/spec/streams/preidentified_stream_protocol_spec.rb +121 -121
  957. data/spec/streams/serial_stream_spec.rb +117 -117
  958. data/spec/streams/stream_protocol_spec.rb +346 -346
  959. data/spec/streams/stream_spec.rb +30 -30
  960. data/spec/streams/tcpip_client_stream_spec.rb +57 -57
  961. data/spec/streams/tcpip_socket_stream_spec.rb +193 -193
  962. data/spec/streams/template_stream_protocol_spec.rb +156 -156
  963. data/spec/streams/terminated_stream_protocol_spec.rb +127 -127
  964. data/spec/system/system_spec.rb +665 -665
  965. data/spec/system/target_spec.rb +250 -250
  966. data/spec/tools/cmd_tlm_server/api_spec.rb +1117 -1117
  967. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  968. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  969. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +453 -453
  970. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  971. data/spec/tools/cmd_tlm_server/commanding_spec.rb +151 -151
  972. data/spec/tools/cmd_tlm_server/connections_spec.rb +235 -235
  973. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  974. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -252
  975. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  976. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +151 -151
  977. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -223
  978. data/spec/tools/launcher/launcher_config_spec.rb +464 -464
  979. data/spec/top_level/top_level_spec.rb +334 -334
  980. data/spec/utilities/crc_spec.rb +45 -45
  981. data/spec/utilities/csv_spec.rb +97 -97
  982. data/spec/utilities/logger_spec.rb +102 -102
  983. data/spec/utilities/message_log_spec.rb +89 -89
  984. data/spec/utilities/quaternion_spec.rb +107 -107
  985. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  986. data/tasks/manifest.rake +22 -22
  987. data/tasks/spec.rake +23 -23
  988. data/test/benchmarks/binary_accessor_benchmark.rb +14 -14
  989. data/test/benchmarks/gsub_benchmark.rb +152 -152
  990. data/test/benchmarks/is_a_benchmark.rb +34 -34
  991. data/test/performance/PACKETS.bat +0 -0
  992. data/test/performance/Rakefile +77 -77
  993. data/test/performance/THREADS.bat +0 -0
  994. data/test/performance/config/data/crc.txt +196 -196
  995. data/test/performance/config/data/diamond.STL +57 -57
  996. data/test/performance/config/data/meta_init.txt +4 -4
  997. data/test/performance/config/system/system_packets.txt +39 -39
  998. data/test/performance/config/system/system_threads.txt +59 -59
  999. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +46 -46
  1000. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  1001. data/test/performance/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  1002. data/test/performance/config/targets/COSMOS/screens/limits_change.txt +20 -20
  1003. data/test/performance/config/targets/COSMOS/screens/version.txt +19 -19
  1004. data/test/performance/config/targets/COSMOS/target.txt +11 -11
  1005. data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -20
  1006. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -98
  1007. data/test/performance/config/targets/PACKET/cmd_tlm_server.txt +6 -6
  1008. data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -22
  1009. data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -24
  1010. data/test/performance/config/targets/PACKET/screens/status.txt +25 -25
  1011. data/test/performance/config/targets/PACKET/target.txt +28 -28
  1012. data/test/performance/config/targets/SYSTEM/screens/status.txt +12 -12
  1013. data/test/performance/config/targets/THREAD/cmd_tlm/thread_cmds.txt +17 -17
  1014. data/test/performance/config/targets/THREAD/cmd_tlm/thread_tlm.txt +18 -18
  1015. data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -6
  1016. data/test/performance/config/targets/THREAD/lib/thread_interface.rb +22 -22
  1017. data/test/performance/config/targets/THREAD/screens/status.txt +25 -25
  1018. data/test/performance/config/targets/THREAD/target.txt +6 -6
  1019. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +28 -28
  1020. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +68 -68
  1021. data/test/performance/config/tools/data_viewer/data_viewer.txt +11 -11
  1022. data/test/performance/config/tools/handbook_creator/handbook_creator.txt +66 -66
  1023. data/test/performance/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  1024. data/test/performance/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  1025. data/test/performance/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  1026. data/test/performance/config/tools/handbook_creator/templates/header.html.erb +25 -25
  1027. data/test/performance/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  1028. data/test/performance/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  1029. data/test/performance/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  1030. data/test/performance/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  1031. data/test/performance/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  1032. data/test/performance/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  1033. data/test/performance/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  1034. data/test/performance/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  1035. data/test/performance/config/tools/handbook_creator/templates/title.html.erb +1 -1
  1036. data/test/performance/config/tools/launcher/launcher_packets.txt +34 -34
  1037. data/test/performance/config/tools/launcher/launcher_threads.txt +83 -83
  1038. data/test/performance/config/tools/script_runner/script_runner.txt +3 -3
  1039. data/test/performance/config/tools/table_manager/ConfigTables_def.txt +8 -8
  1040. data/test/performance/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  1041. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  1042. data/test/performance/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  1043. data/test/performance/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  1044. data/test/performance/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  1045. data/test/performance/config/tools/test_runner/test_runner.txt +17 -17
  1046. data/test/performance/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  1047. data/test/performance/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  1048. data/test/performance/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  1049. data/test/performance/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  1050. data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -204
  1051. data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +13 -13
  1052. data/test/performance/lib/packet_target.rb +126 -126
  1053. data/test/performance/lib/thread_target.rb +120 -120
  1054. data/test/performance/lib/user_version.rb +3 -3
  1055. data/test/performance/procedures/checks.rb +11 -11
  1056. data/test/performance/procedures/clear_util.rb +7 -7
  1057. data/test/performance/procedures/collect.rb +18 -18
  1058. data/test/performance/procedures/collect_util.rb +14 -14
  1059. data/test/performance/procedures/cosmos_api_test.rb +293 -293
  1060. data/test/performance/procedures/disconnect.rb +29 -29
  1061. data/test/performance/procedures/example_test.rb +182 -182
  1062. data/test/performance/procedures/plot_test.rb +8 -8
  1063. data/test/performance/procedures/procedure.rb +2 -2
  1064. data/test/performance/procedures/run_example_test.rb +3 -3
  1065. data/test/performance/procedures/test.rb +51 -51
  1066. data/test/performance/tools/CmdExtractor +14 -14
  1067. data/test/performance/tools/CmdExtractor.bat +0 -0
  1068. data/test/performance/tools/CmdSender +14 -14
  1069. data/test/performance/tools/CmdSender.bat +0 -0
  1070. data/test/performance/tools/CmdTlmServer +16 -16
  1071. data/test/performance/tools/CmdTlmServer.bat +0 -0
  1072. data/test/performance/tools/CmdTlmServerMemProf +20 -20
  1073. data/test/performance/tools/CmdTlmServerMemProf.bat +0 -0
  1074. data/test/performance/tools/DataViewer +14 -14
  1075. data/test/performance/tools/DataViewer.bat +0 -0
  1076. data/test/performance/tools/HandbookCreator +14 -14
  1077. data/test/performance/tools/HandbookCreator.bat +0 -0
  1078. data/test/performance/tools/Launcher +14 -14
  1079. data/test/performance/tools/Launcher.bat +0 -0
  1080. data/test/performance/tools/LimitsMonitor +14 -14
  1081. data/test/performance/tools/LimitsMonitor.bat +0 -0
  1082. data/test/performance/tools/OpenGLBuilder +14 -14
  1083. data/test/performance/tools/OpenGLBuilder.bat +0 -0
  1084. data/test/performance/tools/PacketTarget +14 -14
  1085. data/test/performance/tools/PacketTarget.bat +0 -0
  1086. data/test/performance/tools/PacketViewer +14 -14
  1087. data/test/performance/tools/PacketViewer.bat +0 -0
  1088. data/test/performance/tools/Replay +14 -14
  1089. data/test/performance/tools/Replay.bat +0 -0
  1090. data/test/performance/tools/ScpiTarget +14 -14
  1091. data/test/performance/tools/ScpiTarget.bat +0 -0
  1092. data/test/performance/tools/ScriptRunner +14 -14
  1093. data/test/performance/tools/ScriptRunner.bat +0 -0
  1094. data/test/performance/tools/TableManager +14 -14
  1095. data/test/performance/tools/TableManager.bat +0 -0
  1096. data/test/performance/tools/TestRunner +14 -14
  1097. data/test/performance/tools/TestRunner.bat +0 -0
  1098. data/test/performance/tools/ThreadTarget +14 -14
  1099. data/test/performance/tools/ThreadTarget.bat +0 -0
  1100. data/test/performance/tools/TlmExtractor +14 -14
  1101. data/test/performance/tools/TlmExtractor.bat +0 -0
  1102. data/test/performance/tools/TlmGrapher +14 -14
  1103. data/test/performance/tools/TlmGrapher.bat +0 -0
  1104. data/test/performance/tools/TlmGrapherMemProf +19 -19
  1105. data/test/performance/tools/TlmGrapherMemProf.bat +0 -0
  1106. data/test/performance/tools/TlmViewer +14 -14
  1107. data/test/performance/tools/TlmViewer.bat +0 -0
  1108. data/test/performance/tools/TlmViewerMemProf +19 -19
  1109. data/test/performance/tools/TlmViewerMemProf.bat +0 -0
  1110. data/test/performance/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  1111. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  1112. data/test/performance/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  1113. data/test/performance/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  1114. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  1115. data/test/performance/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  1116. data/test/performance/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  1117. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  1118. data/test/performance/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  1119. data/test/performance/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  1120. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  1121. data/test/performance/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  1122. data/test/performance/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  1123. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  1124. data/test/performance/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  1125. data/test/performance/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  1126. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  1127. data/test/performance/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  1128. data/test/performance/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  1129. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  1130. data/test/performance/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  1131. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  1132. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  1133. data/test/performance/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  1134. data/test/performance/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  1135. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  1136. data/test/performance/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  1137. data/test/performance/tools/mac/Replay.app/Contents/Info.plist +38 -38
  1138. data/test/performance/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  1139. data/test/performance/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  1140. data/test/performance/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  1141. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  1142. data/test/performance/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  1143. data/test/performance/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  1144. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  1145. data/test/performance/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  1146. data/test/performance/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  1147. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  1148. data/test/performance/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  1149. data/test/performance/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  1150. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  1151. data/test/performance/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  1152. data/test/performance/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  1153. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  1154. data/test/performance/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  1155. data/test/performance/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  1156. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  1157. data/test/performance/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  1158. metadata +3 -3
@@ -1,60 +1,60 @@
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/qt'
13
-
14
- module Cosmos
15
-
16
- # Allow entry of a column name and some text
17
- class TextItemChooser < Qt::Widget
18
-
19
- # Callback called when the button is pressed - call(column_name, text)
20
- attr_accessor :button_callback
21
-
22
- # @param parent [Qt::Widget] Parent of this widget
23
- def initialize(parent)
24
-
25
- super(parent)
26
- @overall_frame = Qt::HBoxLayout.new(self)
27
- @overall_frame.setContentsMargins(0,0,0,0)
28
-
29
- # Column Name
30
- @column_name_layout = Qt::HBoxLayout.new
31
- @column_name_label = Qt::Label.new('Column Name:')
32
- @column_name_label.setSizePolicy(Qt::SizePolicy::Fixed, Qt::SizePolicy::Fixed)
33
- @column_name_layout.addWidget(@column_name_label)
34
- @column_name = Qt::LineEdit.new('')
35
- @column_name_layout.addWidget(@column_name)
36
- @overall_frame.addLayout(@column_name_layout)
37
-
38
- # Text
39
- @text_layout = Qt::HBoxLayout.new
40
- @text_label = Qt::Label.new('Text:')
41
- @text_label.setSizePolicy(Qt::SizePolicy::Fixed, Qt::SizePolicy::Fixed)
42
- @text_layout.addWidget(@text_label)
43
- @text = Qt::LineEdit.new('')
44
- @text_layout.addWidget(@text)
45
- @overall_frame.addLayout(@text_layout)
46
-
47
- # Button
48
- @button = Qt::PushButton.new('Add Text')
49
- @button.connect(SIGNAL('clicked()')) do
50
- @button_callback.call(@column_name.text, @text.text) if @button_callback
51
- end
52
- @overall_frame.addWidget(@button)
53
-
54
- # Initialize instance variables
55
- @button_callback = nil
56
- end
57
-
58
- end # class TextItemChooser
59
-
60
- 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/qt'
13
+
14
+ module Cosmos
15
+
16
+ # Allow entry of a column name and some text
17
+ class TextItemChooser < Qt::Widget
18
+
19
+ # Callback called when the button is pressed - call(column_name, text)
20
+ attr_accessor :button_callback
21
+
22
+ # @param parent [Qt::Widget] Parent of this widget
23
+ def initialize(parent)
24
+
25
+ super(parent)
26
+ @overall_frame = Qt::HBoxLayout.new(self)
27
+ @overall_frame.setContentsMargins(0,0,0,0)
28
+
29
+ # Column Name
30
+ @column_name_layout = Qt::HBoxLayout.new
31
+ @column_name_label = Qt::Label.new('Column Name:')
32
+ @column_name_label.setSizePolicy(Qt::SizePolicy::Fixed, Qt::SizePolicy::Fixed)
33
+ @column_name_layout.addWidget(@column_name_label)
34
+ @column_name = Qt::LineEdit.new('')
35
+ @column_name_layout.addWidget(@column_name)
36
+ @overall_frame.addLayout(@column_name_layout)
37
+
38
+ # Text
39
+ @text_layout = Qt::HBoxLayout.new
40
+ @text_label = Qt::Label.new('Text:')
41
+ @text_label.setSizePolicy(Qt::SizePolicy::Fixed, Qt::SizePolicy::Fixed)
42
+ @text_layout.addWidget(@text_label)
43
+ @text = Qt::LineEdit.new('')
44
+ @text_layout.addWidget(@text)
45
+ @overall_frame.addLayout(@text_layout)
46
+
47
+ # Button
48
+ @button = Qt::PushButton.new('Add Text')
49
+ @button.connect(SIGNAL('clicked()')) do
50
+ @button_callback.call(@column_name.text, @text.text) if @button_callback
51
+ end
52
+ @overall_frame.addWidget(@button)
53
+
54
+ # Initialize instance variables
55
+ @button_callback = nil
56
+ end
57
+
58
+ end # class TextItemChooser
59
+
60
+ end # module Cosmos
@@ -1,1016 +1,1016 @@
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
- Cosmos.catch_fatal_exception do
13
- require 'cosmos/tools/tlm_extractor/tlm_extractor_processor'
14
- require 'cosmos/tools/tlm_extractor/text_item_chooser'
15
- require 'cosmos/gui/qt_tool'
16
- require 'cosmos/gui/choosers/telemetry_chooser'
17
- require 'cosmos/gui/choosers/float_chooser'
18
- require 'cosmos/gui/dialogs/splash'
19
- require 'cosmos/gui/widgets/packet_log_frame'
20
- require 'cosmos/gui/dialogs/progress_dialog'
21
- require 'cosmos/gui/widgets/full_text_search_line_edit'
22
- end
23
-
24
- module Cosmos
25
-
26
- # TlmExtractor class
27
- #
28
- # This class implements the TlmExtractor. This application breaks a binary log of telemetry
29
- # into a csv type file
30
- #
31
- class TlmExtractor < QtTool
32
- slots 'context_menu(const QPoint&)'
33
-
34
- FORMATTING_OPTIONS = %w(CONVERTED RAW FORMATTED WITH_UNITS)
35
-
36
- class MyListWidget < Qt::ListWidget
37
- signals 'enterKeyPressed(int)'
38
-
39
- def keyPressEvent(event)
40
- case event.key
41
- when Qt::Key_Delete, Qt::Key_Backspace
42
- remove_selected_items()
43
- when Qt::Key_Return, Qt::Key_Enter
44
- emit enterKeyPressed(currentRow())
45
- end
46
- super(event)
47
- end
48
-
49
- def remove_selected_items
50
- indexes = selected_items()
51
- indexes.reverse_each do |index|
52
- item = takeItem(index)
53
- item.dispose if item
54
- end
55
- end
56
-
57
- # Returns an array with the indexes of the selected items
58
- def selected_items
59
- selected = []
60
- index = 0
61
- self.each do |list_item|
62
- selected << index if list_item.selected?
63
- index += 1
64
- end
65
- selected
66
- end
67
- end
68
-
69
- # Constructor
70
- def initialize(options)
71
- super(options) # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
72
- Cosmos.load_cosmos_icon("tlm_extractor.png")
73
-
74
- # Define instance variables
75
- @input_filenames = []
76
- @log_dir = System.paths['LOGS']
77
- @config_dir = File.join(Cosmos::USERPATH, 'config', 'tools', 'tlm_extractor', '')
78
- @cancel = false
79
-
80
- initialize_actions()
81
- initialize_menus()
82
- initialize_central_widget()
83
- complete_initialize()
84
-
85
- # Bring up slash screen for long duration tasks after creation
86
- Splash.execute(self) do |splash|
87
- # Configure CosmosConfig to interact with splash screen
88
- ConfigParser.splash = splash
89
-
90
- System.telemetry
91
- @search_box.completion_list = System.telemetry.all_item_strings(true, splash)
92
- @tlm_extractor_config = TlmExtractorConfig.new(options.config_file)
93
- @tlm_extractor_processor = TlmExtractorProcessor.new
94
- Qt.execute_in_main_thread(true) do
95
- @telemetry_chooser.update
96
- sync_config_to_gui()
97
- end
98
-
99
- # Unconfigure CosmosConfig to interact with splash screen
100
- ConfigParser.splash = nil
101
- end
102
- end
103
-
104
- def initialize_actions
105
- super()
106
-
107
- # File Menu Actions
108
- @open_config = Qt::Action.new(tr('Open &Config'), self)
109
- @open_config.statusTip = tr('Open configuration file')
110
- @open_config.connect(SIGNAL('triggered()')) { handle_browse_button() }
111
-
112
- @save_config = Qt::Action.new(tr('&Save Config'), self)
113
- @save_config_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
114
- @save_config.shortcut = @save_config_keyseq
115
- @save_config.statusTip = tr('Save current configuration')
116
- @save_config.connect(SIGNAL('triggered()')) { handle_save_button() }
117
-
118
- @file_options = Qt::Action.new(tr('O&ptions'), self)
119
- @file_options.statusTip = tr('Open the options dialog')
120
- @file_options.connect(SIGNAL('triggered()')) { handle_options() }
121
-
122
- # Mode Menu Actions
123
- @fill_down_check = Qt::Action.new(tr('&Fill Down'), self)
124
- @fill_down_check_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
125
- @fill_down_check.shortcut = @fill_down_check_keyseq
126
- @fill_down_check.statusTip = tr('Fill Down')
127
- @fill_down_check.setCheckable(true)
128
-
129
- @matlab_header_check = Qt::Action.new(tr('&Matlab Header'), self)
130
- @matlab_header_check_keyseq = Qt::KeySequence.new(tr('Ctrl+M'))
131
- @matlab_header_check.shortcut = @matlab_header_check_keyseq
132
- @matlab_header_check.statusTip = tr('Add a Matlab header to the output data')
133
- @matlab_header_check.setCheckable(true)
134
-
135
- @share_columns_check = Qt::Action.new(tr('&Share Columns'), self)
136
- @share_columns_check.statusTip = tr('Share columns for items with the same name')
137
- @share_columns_check.setCheckable(true)
138
-
139
- @unique_only_check = Qt::Action.new(tr('&Unique Only'), self)
140
- @unique_only_check_keyseq = Qt::KeySequence.new(tr('Ctrl+U'))
141
- @unique_only_check.shortcut = @unique_only_check_keyseq
142
- @unique_only_check.statusTip = tr('Only output rows where data has changed')
143
- @unique_only_check.setCheckable(true)
144
-
145
- @batch_mode_check = Qt::Action.new(tr('&Batch Mode'), self)
146
- @batch_mode_check_keyseq = Qt::KeySequence.new(tr('Ctrl+B'))
147
- @batch_mode_check.shortcut = @batch_mode_check_keyseq
148
- @batch_mode_check.statusTip = tr('Process multiple config files with the same input files')
149
- @batch_mode_check.setCheckable(true)
150
- @batch_mode_check.connect(SIGNAL('triggered()')) { batch_mode_changed() }
151
-
152
- # Item Menu Actions
153
- @item_edit = Qt::Action.new(tr('&Edit Items'), self)
154
- @item_edit_keyseq = Qt::KeySequence.new(tr('Ctrl+E'))
155
- @item_edit.shortcut = @item_edit_keyseq
156
- @item_edit.statusTip = tr('Options')
157
- @item_edit.connect(SIGNAL('triggered()')) { item_edit() }
158
-
159
- @item_delete = Qt::Action.new(tr('&Delete Items'), self)
160
- @item_delete.statusTip = tr('Options')
161
- @item_delete.connect(SIGNAL('triggered()')) { item_delete() }
162
- end
163
-
164
- def initialize_menus
165
- # File Menu
166
- @file_menu = menuBar.addMenu(tr('&File'))
167
- @file_menu.addAction(@open_config)
168
- @file_menu.addAction(@save_config)
169
- @file_menu.addSeparator()
170
- @file_menu.addAction(@file_options)
171
- @file_menu.addSeparator()
172
- @file_menu.addAction(@exit_action)
173
-
174
- # Mode Menu
175
- @mode_menu = menuBar.addMenu(tr('&Mode'))
176
- @mode_menu.addAction(@fill_down_check)
177
- @mode_menu.addAction(@matlab_header_check)
178
- @mode_menu.addAction(@share_columns_check)
179
- @mode_menu.addAction(@unique_only_check)
180
- @mode_menu.addAction(@batch_mode_check)
181
-
182
- # Item Menu
183
- @item_menu = menuBar.addMenu(tr('&Item'))
184
- @item_menu.addAction(@item_edit)
185
- @item_menu.addAction(@item_delete)
186
-
187
- # Help Menu
188
- @about_string = "COSMOS Telemetry Extractor allows processing of telemetry log files and breaking out specified items."
189
- initialize_help_menu()
190
- end
191
-
192
- def initialize_central_widget
193
- # Create the central widget
194
- @central_widget = Qt::Widget.new
195
- setCentralWidget(@central_widget)
196
-
197
- @top_layout = Qt::VBoxLayout.new
198
-
199
- @config_box = Qt::GroupBox.new("Configuration")
200
- @config_box_layout = Qt::VBoxLayout.new
201
- @config_box.setLayout(@config_box_layout)
202
- @top_layout.addWidget(@config_box)
203
-
204
- # Configuration File Selector
205
- @config_layout = Qt::HBoxLayout.new
206
- @config_layout_label = Qt::Label.new('Configuration File:')
207
- @config_layout.addWidget(@config_layout_label)
208
- @config_field = Qt::LineEdit.new
209
- @config_field.setReadOnly(true)
210
- @config_layout.addWidget(@config_field)
211
- @save_button = Qt::PushButton.new('Save...')
212
- @config_layout.addWidget(@save_button)
213
- @save_button.connect(SIGNAL('clicked()')) { handle_save_button() }
214
- @browse_button = Qt::PushButton.new('Browse...')
215
- @config_layout.addWidget(@browse_button)
216
- @browse_button.connect(SIGNAL('clicked()')) { handle_browse_button() }
217
- @config_box_layout.addLayout(@config_layout)
218
-
219
- # Separator before editor
220
- @sep1 = Qt::Frame.new(@central_widget)
221
- @sep1.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
222
- @config_box_layout.addWidget(@sep1)
223
-
224
- # Configuration File Editor
225
- @config_item_list = MyListWidget.new(self)
226
- @config_item_list.setContextMenuPolicy(Qt::CustomContextMenu)
227
- @config_item_list.setDragDropMode(Qt::AbstractItemView::InternalMove)
228
- @config_item_list.setSelectionMode(Qt::AbstractItemView::ExtendedSelection)
229
- @config_item_list.setMinimumHeight(150)
230
- # Allow either double click or enter / return key to bring up the item editor
231
- @config_item_list.connect(SIGNAL('itemDoubleClicked(QListWidgetItem*)')) { item_list_editor() }
232
- @config_item_list.connect(SIGNAL('enterKeyPressed(int)')) { item_list_editor() }
233
- connect(@config_item_list, SIGNAL('customContextMenuRequested(const QPoint&)'), self, SLOT('context_menu(const QPoint&)'))
234
- @config_box_layout.addWidget(@config_item_list)
235
-
236
- # Telemetry Search
237
- @search_layout = Qt::HBoxLayout.new
238
- @search_box = FullTextSearchLineEdit.new(self)
239
- @search_box.setStyleSheet("padding-right: 20px;padding-left: 5px;background: url(#{File.join(Cosmos::PATH, 'data', 'search-14.png')});background-position: right;background-repeat: no-repeat;")
240
- @search_add_item_button = Qt::PushButton.new('Add Item')
241
- @search_add_item_button.connect(SIGNAL('clicked()')) do
242
- split_tlm = @search_box.text.to_s.split(" ")
243
- if split_tlm.length == 3
244
- target_name = split_tlm[0].to_s.upcase
245
- packet_name = split_tlm[1].to_s.upcase
246
- item_name = split_tlm[2].to_s.upcase
247
- begin
248
- System.telemetry.packet_and_item(target_name, packet_name, item_name)
249
- add_item_callback(target_name, packet_name, item_name)
250
- rescue
251
- # Does not exist
252
- end
253
- end
254
- end
255
- @search_add_packet_button = Qt::PushButton.new('Add Packet')
256
- @search_add_packet_button.connect(SIGNAL('clicked()')) do
257
- split_tlm = @search_box.text.to_s.split(" ")
258
- if split_tlm.length >= 2
259
- target_name = split_tlm[0].to_s.upcase
260
- packet_name = split_tlm[1].to_s.upcase
261
- begin
262
- System.telemetry.packet(target_name, packet_name)
263
- add_packet_callback(target_name, packet_name)
264
- rescue
265
- # Does not exist
266
- end
267
- end
268
- end
269
- @search_add_target_button = Qt::PushButton.new('Add Target')
270
- @search_add_target_button.connect(SIGNAL('clicked()')) do
271
- split_tlm = @search_box.text.to_s.split(" ")
272
- if split_tlm.length >= 1
273
- target_name = split_tlm[0].to_s.upcase
274
- if System.telemetry.target_names.include?(target_name)
275
- add_target_callback(target_name)
276
- end
277
- end
278
- end
279
- @search_layout.addWidget(@search_box)
280
- @search_layout.addWidget(@search_add_item_button)
281
- @search_layout.addWidget(@search_add_packet_button)
282
- @search_layout.addWidget(@search_add_target_button)
283
- @config_box_layout.addLayout(@search_layout)
284
-
285
- # Telemetry Chooser
286
- tlm_chooser_layout = Qt::BoxLayout.new(Qt::Horizontal)
287
- add_target_button = Qt::PushButton.new('Add Target')
288
- add_target_button.connect(SIGNAL('clicked()')) do
289
- add_target_callback(@telemetry_chooser.target_name)
290
- end
291
- tlm_chooser_layout.addWidget(add_target_button)
292
- add_packet_button = Qt::PushButton.new('Add Packet')
293
- add_packet_button.connect(SIGNAL('clicked()')) do
294
- add_packet_callback(@telemetry_chooser.target_name, @telemetry_chooser.packet_name)
295
- end
296
- tlm_chooser_layout.addWidget(add_packet_button)
297
- @telemetry_chooser = TelemetryChooser.new(self, Qt::Horizontal, true, true, false, true)
298
- @telemetry_chooser.button_text = 'Add Item'
299
- @telemetry_chooser.select_button_callback = method(:add_item_callback)
300
- tlm_chooser_layout.addWidget(@telemetry_chooser)
301
- @config_box_layout.addLayout(tlm_chooser_layout)
302
-
303
- # Text Item Chooser
304
- @text_item_chooser = TextItemChooser.new(self)
305
- @text_item_chooser.button_callback = method(:add_text_item_callback)
306
- @config_box_layout.addWidget(@text_item_chooser)
307
-
308
- # Downsample
309
- @downsample_entry = FloatChooser.new(self, 'Downsample Seconds:', 0.0, 0.0, nil, 20, true)
310
- @config_box_layout.addWidget(@downsample_entry)
311
-
312
- # Batch Configuration
313
- @batch_config_box = Qt::GroupBox.new("Batch Configuration")
314
- @batch_config_layout = Qt::GridLayout.new
315
- @batch_config_layout.setColumnStretch(1, 1)
316
- @batch_config_box.setLayout(@batch_config_layout)
317
- @top_layout.addWidget(@batch_config_box)
318
-
319
- row = 0
320
-
321
- # Chooser for Log Files
322
- label = Qt::Label.new('Config Files:')
323
- @batch_config_layout.addWidget(label, row, 0)
324
- @batch_fill_widget = Qt::Widget.new
325
- @batch_fill_widget.setMinimumWidth(360)
326
- @batch_config_layout.addWidget(@batch_fill_widget, row, 1, 0, 3)
327
- @batch_browse_button = Qt::PushButton.new('Browse...')
328
- @batch_browse_button.connect(SIGNAL('clicked()')) { handle_batch_browse_button() }
329
- @batch_config_layout.addWidget(@batch_browse_button, row, 2)
330
- @batch_remove_button = Qt::PushButton.new('Remove')
331
- @batch_remove_button.connect(SIGNAL('clicked()')) { handle_batch_remove_button() }
332
- @batch_config_layout.addWidget(@batch_remove_button, row, 3)
333
- row += 1
334
-
335
- @batch_filenames_entry = Qt::ListWidget.new(self)
336
- @batch_filenames_entry.setSelectionMode(Qt::AbstractItemView::ExtendedSelection)
337
- @batch_filenames_entry.setSortingEnabled(true)
338
- @batch_filenames_entry.setMinimumHeight(90)
339
- @batch_config_layout.addWidget(@batch_filenames_entry, row, 0, 3, 4)
340
- row += 3
341
-
342
- # Batch Name
343
- @batch_name_label = Qt::Label.new('Batch Name:')
344
- @batch_config_layout.addWidget(@batch_name_label, row, 0)
345
- @batch_name_entry = Qt::LineEdit.new
346
- @batch_name_entry.setMinimumWidth(340)
347
- @batch_config_layout.addWidget(@batch_name_entry, row, 1, 1, 3)
348
- row += 1
349
-
350
- @batch_config_box.hide
351
-
352
- @file_box = Qt::GroupBox.new("File Selection")
353
- @file_box_layout = Qt::VBoxLayout.new
354
- @file_box.setLayout(@file_box_layout)
355
- @top_layout.addWidget(@file_box)
356
-
357
- # Packet Log Frame
358
- @packet_log_frame = PacketLogFrame.new(self, @log_dir, System.default_packet_log_reader.new, @input_filenames, nil, true, true, true, Cosmos::TLM_FILE_PATTERN, Cosmos::TXT_FILE_PATTERN)
359
- @packet_log_frame.change_callback = method(:change_callback)
360
- @file_box_layout.addWidget(@packet_log_frame)
361
-
362
- # Process and Open Buttons
363
- @button_layout = Qt::HBoxLayout.new
364
-
365
- @process_button = Qt::PushButton.new('&Process Files')
366
- @process_button.connect(SIGNAL('clicked()')) { process_log_files() }
367
- @button_layout.addWidget(@process_button)
368
-
369
- @open_button = Qt::PushButton.new('&Open in Text Editor')
370
- @open_button.connect(SIGNAL('clicked()')) { open_button() }
371
- @open_button.setEnabled(false)
372
- @button_layout.addWidget(@open_button)
373
-
374
- if Kernel.is_windows?
375
- @open_excel_button = Qt::PushButton.new('&Open in Excel')
376
- @open_excel_button.connect(SIGNAL('clicked()')) { open_excel_button() }
377
- @open_excel_button.setEnabled(false)
378
- @button_layout.addWidget(@open_excel_button)
379
- end
380
- @top_layout.addLayout(@button_layout)
381
-
382
- @central_widget.setLayout(@top_layout)
383
- end # def initialize
384
-
385
- def self.post_options_parsed_hook(options)
386
- if options.input_files
387
- # Process config file
388
- raise "Configuration File must be specified for command line processing" unless options.config_file
389
-
390
- # Process the input file(s)
391
- tlm_extractor_config = TlmExtractorConfig.new(options.config_file)
392
- tlm_extractor_processor = TlmExtractorProcessor.new
393
- unless options.output_file
394
- filename = options.input_files[0]
395
- extension = File.extname(filename)
396
- filename_no_extension = filename[0..-(extension.length + 1)]
397
- if tlm_extractor_config.delimiter.to_s.strip == ','
398
- filename = filename_no_extension << '.csv'
399
- else
400
- filename = filename_no_extension << '.txt'
401
- end
402
- options.output_file = File.join(System.paths['LOGS'], File.basename(filename))
403
- end
404
-
405
- tlm_extractor_config.output_filename = options.output_file
406
- tlm_extractor_processor.process(options.input_files, [tlm_extractor_config])
407
- puts "Created #{options.output_file}"
408
- return false
409
- else
410
- return true
411
- end
412
- end
413
-
414
- # Runs the application
415
- def self.run(option_parser = nil, options = nil)
416
- Cosmos.catch_fatal_exception do
417
- unless option_parser and options
418
- option_parser, options = create_default_options()
419
- options.width = 700
420
- options.height = 425
421
- options.auto_size = false
422
- options.restore_size = false # always render this the correct size
423
- options.title = "Telemetry Extractor"
424
- option_parser.separator "Telemetry Extractor Specific Options:"
425
- option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
426
- options.config_file = File.join(Cosmos::USERPATH, 'config', 'tools', 'tlm_extractor', arg)
427
- end
428
- option_parser.on("-i", "--input FILE", "Process the specified input file") do |arg|
429
- options.input_files ||= []
430
- if arg[0..0] != '/' and arg[1..1] != ':'
431
- # Relative path to default of log folder
432
- arg = File.join(System.paths['LOGS'], arg)
433
- end
434
- options.input_files << arg
435
- end
436
- option_parser.on("-o", "--output FILE", "Output results to the specified file") do |arg|
437
- options.output_file = arg
438
- end
439
- end
440
-
441
- super(option_parser, options)
442
- end
443
- end # def self.run
444
-
445
- def context_menu(point)
446
- @item_menu.exec(@config_item_list.mapToGlobal(point))
447
- end
448
-
449
- protected
450
-
451
- def sync_gui_to_config
452
- @tlm_extractor_config.matlab_header = @matlab_header_check.checked?
453
- @tlm_extractor_config.fill_down = @fill_down_check.checked?
454
- @tlm_extractor_config.share_columns = @share_columns_check.checked?
455
- @tlm_extractor_config.unique_only = @unique_only_check.checked?
456
- @tlm_extractor_config.downsample_seconds = @downsample_entry.value
457
- @tlm_extractor_config.output_filename = @packet_log_frame.output_filename
458
-
459
- @tlm_extractor_config.clear_items
460
- @config_item_list.each do |item|
461
- split_item = item.text.scan ConfigParser::PARSING_REGEX
462
- item_type = split_item[0]
463
- target_name_or_column_name = split_item[1]
464
- packet_name_or_text = split_item[2]
465
- item_name = split_item[3]
466
- value_type = split_item[4]
467
- if value_type
468
- value_type = value_type.upcase.intern
469
- else
470
- value_type = :CONVERTED
471
- end
472
- if item_type == 'ITEM'
473
- @tlm_extractor_config.add_item(target_name_or_column_name, packet_name_or_text, item_name, value_type)
474
- else
475
- @tlm_extractor_config.add_text(target_name_or_column_name.remove_quotes, packet_name_or_text.remove_quotes)
476
- end
477
- end
478
- end
479
-
480
- def sync_config_to_gui
481
- @matlab_header_check.setChecked(@tlm_extractor_config.matlab_header)
482
- @fill_down_check.setChecked(@tlm_extractor_config.fill_down)
483
- @share_columns_check.setChecked(@tlm_extractor_config.share_columns)
484
- @unique_only_check.setChecked(@tlm_extractor_config.unique_only)
485
- @downsample_entry.value = @tlm_extractor_config.downsample_seconds
486
-
487
- clear_config_item_list()
488
- @tlm_extractor_config.items.each do |item_type, target_name_or_column_name, packet_name_or_text, item_name, value_type|
489
- if item_type == 'ITEM'
490
- if value_type == :CONVERTED
491
- @config_item_list.addItem("#{item_type} #{target_name_or_column_name} #{packet_name_or_text} #{item_name}")
492
- else
493
- @config_item_list.addItem("#{item_type} #{target_name_or_column_name} #{packet_name_or_text} #{item_name} #{value_type}")
494
- end
495
- else
496
- @config_item_list.addItem("#{item_type} \"#{target_name_or_column_name}\" \"#{packet_name_or_text}\"")
497
- end
498
- end
499
- end
500
-
501
- ###############################################################################
502
- # File Menu Handlers
503
- ###############################################################################
504
-
505
- # Handles processing log files
506
- def process_log_files
507
- @cancel = false
508
- begin
509
- @tlm_extractor_processor.packet_log_reader = @packet_log_frame.packet_log_reader
510
- @input_filenames = @packet_log_frame.filenames.sort
511
- @batch_filenames = []
512
- output_extension = '.txt'
513
- batch_name = nil
514
- if @batch_mode_check.checked?
515
- batch_name = @batch_name_entry.text
516
- @batch_filenames_entry.each {|list_item| @batch_filenames << list_item.text}
517
- if @packet_log_frame.output_filename_filter == Cosmos::CSV_FILE_PATTERN
518
- output_extension = '.csv'
519
- else
520
- output_extension = '.txt'
521
- end
522
- end
523
- return unless pre_process_tests()
524
-
525
- # Configure Tlm Extractor Config
526
- sync_gui_to_config()
527
-
528
- start_time = Time.now
529
- ProgressDialog.execute(self, 'Log File Progress', 600, 300) do |progress_dialog|
530
- progress_dialog.cancel_callback = method(:cancel_callback)
531
- progress_dialog.enable_cancel_button
532
-
533
- begin
534
- current_input_file_index = -1
535
- current_config_file_index = -1
536
- start_packet_count = -1
537
- last_packet_count = -1
538
-
539
- if @batch_filenames.empty?
540
- process_method = :process
541
- process_args = [@input_filenames, [@tlm_extractor_config], @packet_log_frame.time_start, @packet_log_frame.time_end]
542
- else
543
- process_method = :process_batch
544
- process_args = [batch_name, @input_filenames, @log_dir, output_extension, @batch_filenames, @packet_log_frame.time_start, @packet_log_frame.time_end]
545
- end
546
-
547
- @tlm_extractor_processor.send(process_method, *process_args) do |input_file_index, packet_count, file_progress|
548
- # Handle Cancel
549
- break if @cancel
550
-
551
- # Handle Input File Change
552
- if input_file_index != current_input_file_index
553
- current_input_file_index = input_file_index
554
-
555
- if start_packet_count >= 0
556
- # Make sure some packets were found in the previous file
557
- if packet_count == start_packet_count
558
- # No packets found in previous file
559
- progress_dialog.append_text(" WARNING: No packets processed in #{File.basename(@input_filenames[input_file_index - 1])}")
560
- end
561
- end
562
- start_packet_count = packet_count
563
-
564
- progress_dialog.append_text("Processing File #{input_file_index + 1}/#{@input_filenames.length}: #{File.basename(@input_filenames[input_file_index])}")
565
- progress_dialog.set_step_progress(0.0)
566
- progress_dialog.set_overall_progress((input_file_index).to_f / @input_filenames.length.to_f)
567
- end
568
-
569
- # Save packet_count
570
- last_packet_count = packet_count
571
-
572
- # Handle Progress Reporting
573
- progress_dialog.set_step_progress(file_progress)
574
- end
575
- # Make sure some packets were found in the previous file
576
- if start_packet_count == last_packet_count
577
- # No packets found in previous file
578
- progress_dialog.append_text(" WARNING: No packets processed in #{File.basename(@input_filenames[-1])}")
579
- end
580
-
581
- rescue => error
582
- progress_dialog.append_text("Error processing:\n#{error.formatted}\n")
583
- ensure
584
- progress_dialog.set_step_progress(1.0) if !@cancel
585
- progress_dialog.set_overall_progress(1.0) if !@cancel
586
- progress_dialog.append_text("Runtime: #{Time.now - start_time} s")
587
- progress_dialog.complete
588
- if @batch_filenames.empty?
589
- Qt.execute_in_main_thread(true) do
590
- @open_button.setEnabled(true)
591
- @open_excel_button.setEnabled(true) if Kernel.is_windows?
592
- end
593
- end
594
- end
595
- end # ProgressDialog.execute
596
- rescue => error
597
- Qt::MessageBox.critical(self, 'Error!', "Error Processing Log File(s)\n#{error.formatted}")
598
- end
599
- end # def process_log_files
600
-
601
- # Handles options dialog
602
- def handle_options
603
- box = Qt::Dialog.new(self)
604
- box.setWindowTitle('Options')
605
- top_layout = Qt::VBoxLayout.new
606
-
607
- delimiter_layout = Qt::HBoxLayout.new
608
- delimiter_label = Qt::Label.new('Delimeter:')
609
- delimiter_layout.addWidget(delimiter_label)
610
- delimiter_field = Qt::LineEdit.new
611
- delimiter_layout.addWidget(delimiter_field)
612
- if @tlm_extractor_config.delimiter != "\t"
613
- delimiter_field.setText(@tlm_extractor_config.delimiter)
614
- else
615
- delimiter_field.setText('tab')
616
- end
617
- top_layout.addLayout(delimiter_layout)
618
-
619
- checkbox_layout = Qt::HBoxLayout.new
620
- checkbox_label = Qt::Label.new('Output filenames')
621
- checkbox_layout.addWidget(checkbox_label)
622
- checkbox_field = Qt::CheckBox.new
623
- if @tlm_extractor_config.print_filenames_to_output
624
- checkbox_field.setChecked(true)
625
- else
626
- checkbox_field.setChecked(false)
627
- end
628
- checkbox_layout.addWidget(checkbox_field)
629
- top_layout.addLayout(checkbox_layout)
630
-
631
- button_layout = Qt::HBoxLayout.new
632
- ok_button = Qt::PushButton.new('OK')
633
- ok_button.connect(SIGNAL('clicked()')) { box.accept }
634
- button_layout.addWidget(ok_button)
635
- button_layout.addStretch
636
- cancel_button = Qt::PushButton.new('CANCEL')
637
- cancel_button.connect(SIGNAL('clicked()')) { box.reject }
638
- button_layout.addWidget(cancel_button)
639
- top_layout.addLayout(button_layout)
640
-
641
- box.setLayout(top_layout)
642
- case box.exec
643
- when Qt::Dialog::Accepted
644
- delimiter = delimiter_field.text
645
- if delimiter == 'tab'
646
- delimiter = "\t"
647
- end
648
- @tlm_extractor_config.print_filenames_to_output = checkbox_field.checked?
649
- @tlm_extractor_config.delimiter = delimiter
650
- if @tlm_extractor_config.delimiter.to_s.strip == ','
651
- @packet_log_frame.output_filename_filter = Cosmos::CSV_FILE_PATTERN
652
- else
653
- @packet_log_frame.output_filename_filter = Cosmos::TXT_FILE_PATTERN
654
- end
655
- end
656
- box.dispose
657
- end
658
-
659
- def batch_mode_changed
660
- if @batch_mode_check.checked?
661
- @config_box.hide
662
- @batch_config_box.show
663
- @open_button.setEnabled(false)
664
- @open_excel_button.setEnabled(false) if Kernel.is_windows?
665
- @fill_down_check.setEnabled(false)
666
- @matlab_header_check.setEnabled(false)
667
- @share_columns_check.setEnabled(false)
668
- @unique_only_check.setEnabled(false)
669
- @open_config.setEnabled(false)
670
- @save_config.setEnabled(false)
671
- @file_options.setEnabled(false)
672
- @item_edit.setEnabled(false)
673
- @item_delete.setEnabled(false)
674
- @packet_log_frame.select_output_dir
675
- @packet_log_frame.output_filename = @log_dir
676
- else
677
- @config_box.show
678
- @batch_config_box.hide
679
- @fill_down_check.setEnabled(true)
680
- @matlab_header_check.setEnabled(true)
681
- @share_columns_check.setEnabled(true)
682
- @unique_only_check.setEnabled(true)
683
- @open_config.setEnabled(true)
684
- @save_config.setEnabled(true)
685
- @file_options.setEnabled(true)
686
- @item_edit.setEnabled(true)
687
- @item_delete.setEnabled(true)
688
- @packet_log_frame.select_output_file
689
- @packet_log_frame.output_filename = ''
690
- end
691
- end
692
-
693
- ###############################################################################
694
- # Item Menu Handlers
695
- ###############################################################################
696
-
697
- def item_edit
698
- item_list_editor()
699
- end
700
-
701
- def item_delete
702
- @config_item_list.remove_selected_items
703
- end
704
-
705
- ###############################################################################
706
- # Handlers
707
- ###############################################################################
708
-
709
- def handle_save_button
710
- filename = nil
711
- begin
712
- if @config_field.text.strip.length > 0
713
- filename = Qt::FileDialog.getSaveFileName(self, "Save Config File", @config_field.text, "Config Files (*.txt);;All Files (*)")
714
- else
715
- filename = Qt::FileDialog.getSaveFileName(self, "Save Config File", @config_dir, "Config Files (*.txt);;All Files (*)")
716
- end
717
- if filename and filename.length != 0
718
- sync_gui_to_config()
719
- @tlm_extractor_config.save(filename)
720
- @config_field.setText(filename)
721
- @config_dir = File.dirname(filename) + '/'
722
- end
723
- rescue => error
724
- Qt::MessageBox.critical(self, 'Error!', "Error Saving Configuration File: #{filename}\n#{error.formatted}")
725
- end
726
- end
727
-
728
- def handle_browse_button
729
- filename = Qt::FileDialog::getOpenFileName(self, "Open Config File:", @config_dir, "Config Files (*.txt);;All Files (*)")
730
- if filename and not filename.empty?
731
- @config_field.setText(filename)
732
- @config_dir = File.dirname(filename) + '/'
733
-
734
- begin
735
- process_config_file(filename)
736
- rescue => error
737
- Qt::MessageBox.critical(self, 'Error', "Error Processing Configuration File: #{filename}\n\n#{error.formatted}")
738
- end
739
- end
740
- end
741
-
742
- def item_list_editor
743
- done_items = false
744
- selected_items = @config_item_list.selected_items()
745
- if @config_item_list.currentItem and !selected_items.empty?
746
- selected_items.each do |item_index|
747
- dialog = Qt::Dialog.new(self)
748
- dialog.setWindowTitle("Edit Item")
749
- layout = Qt::VBoxLayout.new
750
- split_item = @config_item_list.item(item_index).text.scan ConfigParser::PARSING_REGEX
751
-
752
- if split_item[0] == 'ITEM' and !done_items
753
- label = Qt::Label.new("#{split_item[1]} #{split_item[2]} #{split_item[3]}")
754
- layout.addWidget(label)
755
-
756
- label = Qt::Label.new('Value Type:')
757
- layout.addWidget(label)
758
-
759
- box = Qt::ComboBox.new
760
- box.maxCount = FORMATTING_OPTIONS.length
761
- FORMATTING_OPTIONS.each {|item| box.addItem(item) }
762
- current_formatting = split_item[4]
763
- current_formatting = 'CONVERTED' unless current_formatting
764
- if FORMATTING_OPTIONS.index(current_formatting)
765
- box.currentIndex = FORMATTING_OPTIONS.index(current_formatting)
766
- end
767
- layout.addWidget(box)
768
-
769
- check_box = nil
770
- if selected_items.length > 1 and item_index == selected_items[0]
771
- check_box = Qt::CheckBox.new('Apply to All?')
772
- layout.addWidget(check_box)
773
- end
774
-
775
- button_layout = Qt::BoxLayout.new(Qt::Horizontal)
776
- ok = Qt::PushButton.new("Save")
777
- connect(ok, SIGNAL('clicked()'), dialog, SLOT('accept()'))
778
- button_layout.addWidget(ok)
779
- cancel = Qt::PushButton.new("Cancel")
780
- connect(cancel, SIGNAL('clicked()'), dialog, SLOT('reject()'))
781
- button_layout.addWidget(cancel)
782
- layout.addLayout(button_layout)
783
-
784
- dialog.setLayout(layout)
785
- if dialog.exec == Qt::Dialog::Accepted
786
- if box.currentIndex != -1
787
- set_indexes = [item_index]
788
- if check_box and check_box.checked?
789
- set_indexes = selected_items
790
- end
791
-
792
- set_indexes.each do |set_item_index|
793
- split_item = @config_item_list.item(set_item_index).text.scan ConfigParser::PARSING_REGEX
794
- if split_item[0] == 'ITEM'
795
- # Remove any formatting from the item by only keeping the first four strings
796
- @config_item_list.item(set_item_index).text = split_item[0..3].join(' ')
797
-
798
- if box.currentIndex != 0
799
- @config_item_list.item(set_item_index).text = "#{@config_item_list.item(set_item_index).text} #{FORMATTING_OPTIONS[box.currentIndex]}"
800
- end
801
- end
802
- end
803
- if set_indexes.length > 1
804
- done_items = true
805
- end
806
- end
807
- end
808
- elsif split_item[0] == 'TEXT'
809
- label = Qt::Label.new('Column Name:')
810
- layout.addWidget(label)
811
- column_name = Qt::LineEdit.new(split_item[1].remove_quotes)
812
- layout.addWidget(column_name)
813
- label = Qt::Label.new('Text:')
814
- layout.addWidget(label)
815
- text = Qt::LineEdit.new(split_item[2].remove_quotes)
816
- layout.addWidget(text)
817
-
818
- button_layout = Qt::BoxLayout.new(Qt::Horizontal)
819
- ok = Qt::PushButton.new("Save")
820
- connect(ok, SIGNAL('clicked()'), dialog, SLOT('accept()'))
821
- button_layout.addWidget(ok)
822
- cancel = Qt::PushButton.new("Cancel")
823
- connect(cancel, SIGNAL('clicked()'), dialog, SLOT('reject()'))
824
- button_layout.addWidget(cancel)
825
- layout.addLayout(button_layout)
826
-
827
- dialog.setLayout(layout)
828
- if dialog.exec == Qt::Dialog::Accepted
829
- # Remove any formatting from the item by only keeping the first four strings
830
- @config_item_list.item(item_index).text = "#{split_item[0]} \"#{column_name.text}\" \"#{text.text}\""
831
- end
832
- end
833
-
834
- dialog.dispose
835
- end
836
- end
837
- end
838
-
839
- def open_button
840
- Cosmos.open_in_text_editor(@packet_log_frame.output_filename)
841
- end
842
-
843
- def open_excel_button
844
- system("start Excel.exe \"#{@packet_log_frame.output_filename}\"")
845
- end
846
-
847
- def clear_config_item_list
848
- @config_item_list.clearItems
849
- end # def clear_data_object_list
850
-
851
- # Handles removing a selected filename
852
- def handle_batch_remove_button
853
- @batch_filenames_entry.remove_selected_items
854
- end
855
-
856
- # Handles browsing for log files
857
- def handle_batch_browse_button
858
- Cosmos.set_working_dir do
859
- filenames = Qt::FileDialog::getOpenFileNames(
860
- self, "Select Config File(s):", @config_dir, Cosmos::TXT_FILE_PATTERN)
861
- if filenames and not filenames.empty?
862
- @config_dir = File.dirname(filenames[0]) + '/'
863
- filenames.each {|filename| @batch_filenames_entry.addItem(filename) if @batch_filenames_entry.findItems(filename, Qt::MatchExactly).empty? }
864
- end
865
- end
866
- end
867
-
868
- ###############################################################################
869
- # Additional Callbacks
870
- ###############################################################################
871
-
872
- def cancel_callback(progress_dialog = nil)
873
- @cancel = true
874
- return true, false
875
- end
876
-
877
- def add_target_callback(target_name)
878
- packets = System.telemetry.packets(target_name)
879
- packets.each do |packet_name, packet|
880
- packet.sorted_items.each do |item|
881
- @config_item_list.addItem("ITEM #{target_name} #{packet_name} #{item.name}")
882
- end
883
- end
884
- end
885
-
886
- def add_packet_callback(target_name, packet_name)
887
- packet = System.telemetry.packet(target_name, packet_name)
888
- packet.sorted_items.each do |item|
889
- @config_item_list.addItem("ITEM #{target_name} #{packet_name} #{item.name}")
890
- end
891
- end
892
-
893
- def add_item_callback(target_name, packet_name, item_name)
894
- @config_item_list.addItem("ITEM #{target_name} #{packet_name} #{item_name}")
895
- end
896
-
897
- def add_text_item_callback(column_name, text)
898
- @config_item_list.addItem("TEXT \"#{column_name}\" \"#{text}\"")
899
- end
900
-
901
- ###############################################################################
902
- # Helper Methods
903
- ###############################################################################
904
-
905
- def pre_process_tests
906
- if !@batch_mode_check.checked?
907
- # Normal Mode
908
-
909
- if @config_item_list.count < 1
910
- Qt::MessageBox.critical(self, 'Error', 'Please select at least 1 item')
911
- return false
912
- end
913
-
914
- unless @packet_log_frame.output_filename
915
- Qt::MessageBox.critical(self, 'Error', 'No Output File Selected')
916
- return false
917
- end
918
-
919
- if File.exist?(@packet_log_frame.output_filename)
920
- result = Qt::MessageBox.warning(self, 'Warning!', 'Output File Already Exists. Overwrite?', Qt::MessageBox::Yes | Qt::MessageBox::No)
921
- return false if result == Qt::MessageBox::No
922
- end
923
- else
924
- # Batch Mode
925
-
926
- if !@batch_name_entry.text or @batch_name_entry.text.strip.empty?
927
- Qt::MessageBox.critical(self, 'Error', 'Batch Name is Required')
928
- return false
929
- end
930
-
931
- unless @batch_filenames and @batch_filenames[0]
932
- Qt::MessageBox.critical(self, 'Error', 'Please select at least 1 config file')
933
- return false
934
- end
935
- end
936
-
937
- unless @input_filenames and @input_filenames[0]
938
- Qt::MessageBox.critical(self, 'Error', 'Please select at least 1 input file')
939
- return false
940
- end
941
-
942
- # Validate configurations exist for input filenames
943
- @input_filenames.each do |input_filename|
944
- Cosmos.check_log_configuration(@tlm_extractor_processor.packet_log_reader, input_filename)
945
- end
946
-
947
- #Validate config information
948
- @tlm_extractor_processor.packet_log_reader.open(@input_filenames[0])
949
- @tlm_extractor_processor.packet_log_reader.close
950
-
951
- @config_item_list.each do |item|
952
- split_item = item.text.split
953
- item_type = split_item[0]
954
- target_name = split_item[1]
955
- packet_name = split_item[2]
956
- item_name = split_item[3]
957
-
958
- if item_type == 'ITEM'
959
- # Verify Packet
960
- packet = nil
961
- begin
962
- packet = System.telemetry.packet(target_name, packet_name)
963
- rescue
964
- Qt::MessageBox.critical(self, 'Error!', "Unknown Packet #{target_name} #{packet_name} specified")
965
- return false
966
- end
967
-
968
- # Verify Item
969
- begin
970
- packet.get_item(item_name)
971
- rescue
972
- Qt::MessageBox.critical(self, 'Error!', "Item #{item_name} not present in packet")
973
- return false
974
- end
975
- end
976
- end
977
-
978
- true
979
- end
980
-
981
- def process_config_file(filename)
982
- @tlm_extractor_config.restore(filename)
983
- sync_config_to_gui()
984
- end
985
-
986
- def change_callback(item_changed)
987
- if item_changed == :INPUT_FILES
988
- if !@batch_mode_check.checked?
989
- filename = @packet_log_frame.filenames[0]
990
- if filename
991
- extension = File.extname(filename)
992
- filename_no_extension = filename[0..-(extension.length + 1)]
993
- if @packet_log_frame.output_filename_filter == Cosmos::CSV_FILE_PATTERN
994
- filename = filename_no_extension << '.csv'
995
- else
996
- filename = filename_no_extension << '.txt'
997
- end
998
- @packet_log_frame.output_filename = filename
999
- end
1000
- end
1001
- elsif item_changed == :OUTPUT_FILE
1002
- output_filename = @packet_log_frame.output_filename
1003
- if output_filename and !output_filename.to_s.strip.empty?
1004
- @log_dir = File.dirname(output_filename)
1005
- end
1006
- elsif item_changed == :OUTPUT_DIR
1007
- output_filename = @packet_log_frame.output_filename
1008
- if output_filename and !output_filename.to_s.strip.empty?
1009
- @log_dir = output_filename
1010
- end
1011
- end
1012
- end
1013
-
1014
- end # class TlmExtractor
1015
-
1016
- 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
+ Cosmos.catch_fatal_exception do
13
+ require 'cosmos/tools/tlm_extractor/tlm_extractor_processor'
14
+ require 'cosmos/tools/tlm_extractor/text_item_chooser'
15
+ require 'cosmos/gui/qt_tool'
16
+ require 'cosmos/gui/choosers/telemetry_chooser'
17
+ require 'cosmos/gui/choosers/float_chooser'
18
+ require 'cosmos/gui/dialogs/splash'
19
+ require 'cosmos/gui/widgets/packet_log_frame'
20
+ require 'cosmos/gui/dialogs/progress_dialog'
21
+ require 'cosmos/gui/widgets/full_text_search_line_edit'
22
+ end
23
+
24
+ module Cosmos
25
+
26
+ # TlmExtractor class
27
+ #
28
+ # This class implements the TlmExtractor. This application breaks a binary log of telemetry
29
+ # into a csv type file
30
+ #
31
+ class TlmExtractor < QtTool
32
+ slots 'context_menu(const QPoint&)'
33
+
34
+ FORMATTING_OPTIONS = %w(CONVERTED RAW FORMATTED WITH_UNITS)
35
+
36
+ class MyListWidget < Qt::ListWidget
37
+ signals 'enterKeyPressed(int)'
38
+
39
+ def keyPressEvent(event)
40
+ case event.key
41
+ when Qt::Key_Delete, Qt::Key_Backspace
42
+ remove_selected_items()
43
+ when Qt::Key_Return, Qt::Key_Enter
44
+ emit enterKeyPressed(currentRow())
45
+ end
46
+ super(event)
47
+ end
48
+
49
+ def remove_selected_items
50
+ indexes = selected_items()
51
+ indexes.reverse_each do |index|
52
+ item = takeItem(index)
53
+ item.dispose if item
54
+ end
55
+ end
56
+
57
+ # Returns an array with the indexes of the selected items
58
+ def selected_items
59
+ selected = []
60
+ index = 0
61
+ self.each do |list_item|
62
+ selected << index if list_item.selected?
63
+ index += 1
64
+ end
65
+ selected
66
+ end
67
+ end
68
+
69
+ # Constructor
70
+ def initialize(options)
71
+ super(options) # MUST BE FIRST - All code before super is executed twice in RubyQt Based classes
72
+ Cosmos.load_cosmos_icon("tlm_extractor.png")
73
+
74
+ # Define instance variables
75
+ @input_filenames = []
76
+ @log_dir = System.paths['LOGS']
77
+ @config_dir = File.join(Cosmos::USERPATH, 'config', 'tools', 'tlm_extractor', '')
78
+ @cancel = false
79
+
80
+ initialize_actions()
81
+ initialize_menus()
82
+ initialize_central_widget()
83
+ complete_initialize()
84
+
85
+ # Bring up slash screen for long duration tasks after creation
86
+ Splash.execute(self) do |splash|
87
+ # Configure CosmosConfig to interact with splash screen
88
+ ConfigParser.splash = splash
89
+
90
+ System.telemetry
91
+ @search_box.completion_list = System.telemetry.all_item_strings(true, splash)
92
+ @tlm_extractor_config = TlmExtractorConfig.new(options.config_file)
93
+ @tlm_extractor_processor = TlmExtractorProcessor.new
94
+ Qt.execute_in_main_thread(true) do
95
+ @telemetry_chooser.update
96
+ sync_config_to_gui()
97
+ end
98
+
99
+ # Unconfigure CosmosConfig to interact with splash screen
100
+ ConfigParser.splash = nil
101
+ end
102
+ end
103
+
104
+ def initialize_actions
105
+ super()
106
+
107
+ # File Menu Actions
108
+ @open_config = Qt::Action.new(tr('Open &Config'), self)
109
+ @open_config.statusTip = tr('Open configuration file')
110
+ @open_config.connect(SIGNAL('triggered()')) { handle_browse_button() }
111
+
112
+ @save_config = Qt::Action.new(tr('&Save Config'), self)
113
+ @save_config_keyseq = Qt::KeySequence.new(tr('Ctrl+S'))
114
+ @save_config.shortcut = @save_config_keyseq
115
+ @save_config.statusTip = tr('Save current configuration')
116
+ @save_config.connect(SIGNAL('triggered()')) { handle_save_button() }
117
+
118
+ @file_options = Qt::Action.new(tr('O&ptions'), self)
119
+ @file_options.statusTip = tr('Open the options dialog')
120
+ @file_options.connect(SIGNAL('triggered()')) { handle_options() }
121
+
122
+ # Mode Menu Actions
123
+ @fill_down_check = Qt::Action.new(tr('&Fill Down'), self)
124
+ @fill_down_check_keyseq = Qt::KeySequence.new(tr('Ctrl+F'))
125
+ @fill_down_check.shortcut = @fill_down_check_keyseq
126
+ @fill_down_check.statusTip = tr('Fill Down')
127
+ @fill_down_check.setCheckable(true)
128
+
129
+ @matlab_header_check = Qt::Action.new(tr('&Matlab Header'), self)
130
+ @matlab_header_check_keyseq = Qt::KeySequence.new(tr('Ctrl+M'))
131
+ @matlab_header_check.shortcut = @matlab_header_check_keyseq
132
+ @matlab_header_check.statusTip = tr('Add a Matlab header to the output data')
133
+ @matlab_header_check.setCheckable(true)
134
+
135
+ @share_columns_check = Qt::Action.new(tr('&Share Columns'), self)
136
+ @share_columns_check.statusTip = tr('Share columns for items with the same name')
137
+ @share_columns_check.setCheckable(true)
138
+
139
+ @unique_only_check = Qt::Action.new(tr('&Unique Only'), self)
140
+ @unique_only_check_keyseq = Qt::KeySequence.new(tr('Ctrl+U'))
141
+ @unique_only_check.shortcut = @unique_only_check_keyseq
142
+ @unique_only_check.statusTip = tr('Only output rows where data has changed')
143
+ @unique_only_check.setCheckable(true)
144
+
145
+ @batch_mode_check = Qt::Action.new(tr('&Batch Mode'), self)
146
+ @batch_mode_check_keyseq = Qt::KeySequence.new(tr('Ctrl+B'))
147
+ @batch_mode_check.shortcut = @batch_mode_check_keyseq
148
+ @batch_mode_check.statusTip = tr('Process multiple config files with the same input files')
149
+ @batch_mode_check.setCheckable(true)
150
+ @batch_mode_check.connect(SIGNAL('triggered()')) { batch_mode_changed() }
151
+
152
+ # Item Menu Actions
153
+ @item_edit = Qt::Action.new(tr('&Edit Items'), self)
154
+ @item_edit_keyseq = Qt::KeySequence.new(tr('Ctrl+E'))
155
+ @item_edit.shortcut = @item_edit_keyseq
156
+ @item_edit.statusTip = tr('Options')
157
+ @item_edit.connect(SIGNAL('triggered()')) { item_edit() }
158
+
159
+ @item_delete = Qt::Action.new(tr('&Delete Items'), self)
160
+ @item_delete.statusTip = tr('Options')
161
+ @item_delete.connect(SIGNAL('triggered()')) { item_delete() }
162
+ end
163
+
164
+ def initialize_menus
165
+ # File Menu
166
+ @file_menu = menuBar.addMenu(tr('&File'))
167
+ @file_menu.addAction(@open_config)
168
+ @file_menu.addAction(@save_config)
169
+ @file_menu.addSeparator()
170
+ @file_menu.addAction(@file_options)
171
+ @file_menu.addSeparator()
172
+ @file_menu.addAction(@exit_action)
173
+
174
+ # Mode Menu
175
+ @mode_menu = menuBar.addMenu(tr('&Mode'))
176
+ @mode_menu.addAction(@fill_down_check)
177
+ @mode_menu.addAction(@matlab_header_check)
178
+ @mode_menu.addAction(@share_columns_check)
179
+ @mode_menu.addAction(@unique_only_check)
180
+ @mode_menu.addAction(@batch_mode_check)
181
+
182
+ # Item Menu
183
+ @item_menu = menuBar.addMenu(tr('&Item'))
184
+ @item_menu.addAction(@item_edit)
185
+ @item_menu.addAction(@item_delete)
186
+
187
+ # Help Menu
188
+ @about_string = "COSMOS Telemetry Extractor allows processing of telemetry log files and breaking out specified items."
189
+ initialize_help_menu()
190
+ end
191
+
192
+ def initialize_central_widget
193
+ # Create the central widget
194
+ @central_widget = Qt::Widget.new
195
+ setCentralWidget(@central_widget)
196
+
197
+ @top_layout = Qt::VBoxLayout.new
198
+
199
+ @config_box = Qt::GroupBox.new("Configuration")
200
+ @config_box_layout = Qt::VBoxLayout.new
201
+ @config_box.setLayout(@config_box_layout)
202
+ @top_layout.addWidget(@config_box)
203
+
204
+ # Configuration File Selector
205
+ @config_layout = Qt::HBoxLayout.new
206
+ @config_layout_label = Qt::Label.new('Configuration File:')
207
+ @config_layout.addWidget(@config_layout_label)
208
+ @config_field = Qt::LineEdit.new
209
+ @config_field.setReadOnly(true)
210
+ @config_layout.addWidget(@config_field)
211
+ @save_button = Qt::PushButton.new('Save...')
212
+ @config_layout.addWidget(@save_button)
213
+ @save_button.connect(SIGNAL('clicked()')) { handle_save_button() }
214
+ @browse_button = Qt::PushButton.new('Browse...')
215
+ @config_layout.addWidget(@browse_button)
216
+ @browse_button.connect(SIGNAL('clicked()')) { handle_browse_button() }
217
+ @config_box_layout.addLayout(@config_layout)
218
+
219
+ # Separator before editor
220
+ @sep1 = Qt::Frame.new(@central_widget)
221
+ @sep1.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
222
+ @config_box_layout.addWidget(@sep1)
223
+
224
+ # Configuration File Editor
225
+ @config_item_list = MyListWidget.new(self)
226
+ @config_item_list.setContextMenuPolicy(Qt::CustomContextMenu)
227
+ @config_item_list.setDragDropMode(Qt::AbstractItemView::InternalMove)
228
+ @config_item_list.setSelectionMode(Qt::AbstractItemView::ExtendedSelection)
229
+ @config_item_list.setMinimumHeight(150)
230
+ # Allow either double click or enter / return key to bring up the item editor
231
+ @config_item_list.connect(SIGNAL('itemDoubleClicked(QListWidgetItem*)')) { item_list_editor() }
232
+ @config_item_list.connect(SIGNAL('enterKeyPressed(int)')) { item_list_editor() }
233
+ connect(@config_item_list, SIGNAL('customContextMenuRequested(const QPoint&)'), self, SLOT('context_menu(const QPoint&)'))
234
+ @config_box_layout.addWidget(@config_item_list)
235
+
236
+ # Telemetry Search
237
+ @search_layout = Qt::HBoxLayout.new
238
+ @search_box = FullTextSearchLineEdit.new(self)
239
+ @search_box.setStyleSheet("padding-right: 20px;padding-left: 5px;background: url(#{File.join(Cosmos::PATH, 'data', 'search-14.png')});background-position: right;background-repeat: no-repeat;")
240
+ @search_add_item_button = Qt::PushButton.new('Add Item')
241
+ @search_add_item_button.connect(SIGNAL('clicked()')) do
242
+ split_tlm = @search_box.text.to_s.split(" ")
243
+ if split_tlm.length == 3
244
+ target_name = split_tlm[0].to_s.upcase
245
+ packet_name = split_tlm[1].to_s.upcase
246
+ item_name = split_tlm[2].to_s.upcase
247
+ begin
248
+ System.telemetry.packet_and_item(target_name, packet_name, item_name)
249
+ add_item_callback(target_name, packet_name, item_name)
250
+ rescue
251
+ # Does not exist
252
+ end
253
+ end
254
+ end
255
+ @search_add_packet_button = Qt::PushButton.new('Add Packet')
256
+ @search_add_packet_button.connect(SIGNAL('clicked()')) do
257
+ split_tlm = @search_box.text.to_s.split(" ")
258
+ if split_tlm.length >= 2
259
+ target_name = split_tlm[0].to_s.upcase
260
+ packet_name = split_tlm[1].to_s.upcase
261
+ begin
262
+ System.telemetry.packet(target_name, packet_name)
263
+ add_packet_callback(target_name, packet_name)
264
+ rescue
265
+ # Does not exist
266
+ end
267
+ end
268
+ end
269
+ @search_add_target_button = Qt::PushButton.new('Add Target')
270
+ @search_add_target_button.connect(SIGNAL('clicked()')) do
271
+ split_tlm = @search_box.text.to_s.split(" ")
272
+ if split_tlm.length >= 1
273
+ target_name = split_tlm[0].to_s.upcase
274
+ if System.telemetry.target_names.include?(target_name)
275
+ add_target_callback(target_name)
276
+ end
277
+ end
278
+ end
279
+ @search_layout.addWidget(@search_box)
280
+ @search_layout.addWidget(@search_add_item_button)
281
+ @search_layout.addWidget(@search_add_packet_button)
282
+ @search_layout.addWidget(@search_add_target_button)
283
+ @config_box_layout.addLayout(@search_layout)
284
+
285
+ # Telemetry Chooser
286
+ tlm_chooser_layout = Qt::BoxLayout.new(Qt::Horizontal)
287
+ add_target_button = Qt::PushButton.new('Add Target')
288
+ add_target_button.connect(SIGNAL('clicked()')) do
289
+ add_target_callback(@telemetry_chooser.target_name)
290
+ end
291
+ tlm_chooser_layout.addWidget(add_target_button)
292
+ add_packet_button = Qt::PushButton.new('Add Packet')
293
+ add_packet_button.connect(SIGNAL('clicked()')) do
294
+ add_packet_callback(@telemetry_chooser.target_name, @telemetry_chooser.packet_name)
295
+ end
296
+ tlm_chooser_layout.addWidget(add_packet_button)
297
+ @telemetry_chooser = TelemetryChooser.new(self, Qt::Horizontal, true, true, false, true)
298
+ @telemetry_chooser.button_text = 'Add Item'
299
+ @telemetry_chooser.select_button_callback = method(:add_item_callback)
300
+ tlm_chooser_layout.addWidget(@telemetry_chooser)
301
+ @config_box_layout.addLayout(tlm_chooser_layout)
302
+
303
+ # Text Item Chooser
304
+ @text_item_chooser = TextItemChooser.new(self)
305
+ @text_item_chooser.button_callback = method(:add_text_item_callback)
306
+ @config_box_layout.addWidget(@text_item_chooser)
307
+
308
+ # Downsample
309
+ @downsample_entry = FloatChooser.new(self, 'Downsample Seconds:', 0.0, 0.0, nil, 20, true)
310
+ @config_box_layout.addWidget(@downsample_entry)
311
+
312
+ # Batch Configuration
313
+ @batch_config_box = Qt::GroupBox.new("Batch Configuration")
314
+ @batch_config_layout = Qt::GridLayout.new
315
+ @batch_config_layout.setColumnStretch(1, 1)
316
+ @batch_config_box.setLayout(@batch_config_layout)
317
+ @top_layout.addWidget(@batch_config_box)
318
+
319
+ row = 0
320
+
321
+ # Chooser for Log Files
322
+ label = Qt::Label.new('Config Files:')
323
+ @batch_config_layout.addWidget(label, row, 0)
324
+ @batch_fill_widget = Qt::Widget.new
325
+ @batch_fill_widget.setMinimumWidth(360)
326
+ @batch_config_layout.addWidget(@batch_fill_widget, row, 1, 0, 3)
327
+ @batch_browse_button = Qt::PushButton.new('Browse...')
328
+ @batch_browse_button.connect(SIGNAL('clicked()')) { handle_batch_browse_button() }
329
+ @batch_config_layout.addWidget(@batch_browse_button, row, 2)
330
+ @batch_remove_button = Qt::PushButton.new('Remove')
331
+ @batch_remove_button.connect(SIGNAL('clicked()')) { handle_batch_remove_button() }
332
+ @batch_config_layout.addWidget(@batch_remove_button, row, 3)
333
+ row += 1
334
+
335
+ @batch_filenames_entry = Qt::ListWidget.new(self)
336
+ @batch_filenames_entry.setSelectionMode(Qt::AbstractItemView::ExtendedSelection)
337
+ @batch_filenames_entry.setSortingEnabled(true)
338
+ @batch_filenames_entry.setMinimumHeight(90)
339
+ @batch_config_layout.addWidget(@batch_filenames_entry, row, 0, 3, 4)
340
+ row += 3
341
+
342
+ # Batch Name
343
+ @batch_name_label = Qt::Label.new('Batch Name:')
344
+ @batch_config_layout.addWidget(@batch_name_label, row, 0)
345
+ @batch_name_entry = Qt::LineEdit.new
346
+ @batch_name_entry.setMinimumWidth(340)
347
+ @batch_config_layout.addWidget(@batch_name_entry, row, 1, 1, 3)
348
+ row += 1
349
+
350
+ @batch_config_box.hide
351
+
352
+ @file_box = Qt::GroupBox.new("File Selection")
353
+ @file_box_layout = Qt::VBoxLayout.new
354
+ @file_box.setLayout(@file_box_layout)
355
+ @top_layout.addWidget(@file_box)
356
+
357
+ # Packet Log Frame
358
+ @packet_log_frame = PacketLogFrame.new(self, @log_dir, System.default_packet_log_reader.new, @input_filenames, nil, true, true, true, Cosmos::TLM_FILE_PATTERN, Cosmos::TXT_FILE_PATTERN)
359
+ @packet_log_frame.change_callback = method(:change_callback)
360
+ @file_box_layout.addWidget(@packet_log_frame)
361
+
362
+ # Process and Open Buttons
363
+ @button_layout = Qt::HBoxLayout.new
364
+
365
+ @process_button = Qt::PushButton.new('&Process Files')
366
+ @process_button.connect(SIGNAL('clicked()')) { process_log_files() }
367
+ @button_layout.addWidget(@process_button)
368
+
369
+ @open_button = Qt::PushButton.new('&Open in Text Editor')
370
+ @open_button.connect(SIGNAL('clicked()')) { open_button() }
371
+ @open_button.setEnabled(false)
372
+ @button_layout.addWidget(@open_button)
373
+
374
+ if Kernel.is_windows?
375
+ @open_excel_button = Qt::PushButton.new('&Open in Excel')
376
+ @open_excel_button.connect(SIGNAL('clicked()')) { open_excel_button() }
377
+ @open_excel_button.setEnabled(false)
378
+ @button_layout.addWidget(@open_excel_button)
379
+ end
380
+ @top_layout.addLayout(@button_layout)
381
+
382
+ @central_widget.setLayout(@top_layout)
383
+ end # def initialize
384
+
385
+ def self.post_options_parsed_hook(options)
386
+ if options.input_files
387
+ # Process config file
388
+ raise "Configuration File must be specified for command line processing" unless options.config_file
389
+
390
+ # Process the input file(s)
391
+ tlm_extractor_config = TlmExtractorConfig.new(options.config_file)
392
+ tlm_extractor_processor = TlmExtractorProcessor.new
393
+ unless options.output_file
394
+ filename = options.input_files[0]
395
+ extension = File.extname(filename)
396
+ filename_no_extension = filename[0..-(extension.length + 1)]
397
+ if tlm_extractor_config.delimiter.to_s.strip == ','
398
+ filename = filename_no_extension << '.csv'
399
+ else
400
+ filename = filename_no_extension << '.txt'
401
+ end
402
+ options.output_file = File.join(System.paths['LOGS'], File.basename(filename))
403
+ end
404
+
405
+ tlm_extractor_config.output_filename = options.output_file
406
+ tlm_extractor_processor.process(options.input_files, [tlm_extractor_config])
407
+ puts "Created #{options.output_file}"
408
+ return false
409
+ else
410
+ return true
411
+ end
412
+ end
413
+
414
+ # Runs the application
415
+ def self.run(option_parser = nil, options = nil)
416
+ Cosmos.catch_fatal_exception do
417
+ unless option_parser and options
418
+ option_parser, options = create_default_options()
419
+ options.width = 700
420
+ options.height = 425
421
+ options.auto_size = false
422
+ options.restore_size = false # always render this the correct size
423
+ options.title = "Telemetry Extractor"
424
+ option_parser.separator "Telemetry Extractor Specific Options:"
425
+ option_parser.on("-c", "--config FILE", "Use the specified configuration file") do |arg|
426
+ options.config_file = File.join(Cosmos::USERPATH, 'config', 'tools', 'tlm_extractor', arg)
427
+ end
428
+ option_parser.on("-i", "--input FILE", "Process the specified input file") do |arg|
429
+ options.input_files ||= []
430
+ if arg[0..0] != '/' and arg[1..1] != ':'
431
+ # Relative path to default of log folder
432
+ arg = File.join(System.paths['LOGS'], arg)
433
+ end
434
+ options.input_files << arg
435
+ end
436
+ option_parser.on("-o", "--output FILE", "Output results to the specified file") do |arg|
437
+ options.output_file = arg
438
+ end
439
+ end
440
+
441
+ super(option_parser, options)
442
+ end
443
+ end # def self.run
444
+
445
+ def context_menu(point)
446
+ @item_menu.exec(@config_item_list.mapToGlobal(point))
447
+ end
448
+
449
+ protected
450
+
451
+ def sync_gui_to_config
452
+ @tlm_extractor_config.matlab_header = @matlab_header_check.checked?
453
+ @tlm_extractor_config.fill_down = @fill_down_check.checked?
454
+ @tlm_extractor_config.share_columns = @share_columns_check.checked?
455
+ @tlm_extractor_config.unique_only = @unique_only_check.checked?
456
+ @tlm_extractor_config.downsample_seconds = @downsample_entry.value
457
+ @tlm_extractor_config.output_filename = @packet_log_frame.output_filename
458
+
459
+ @tlm_extractor_config.clear_items
460
+ @config_item_list.each do |item|
461
+ split_item = item.text.scan ConfigParser::PARSING_REGEX
462
+ item_type = split_item[0]
463
+ target_name_or_column_name = split_item[1]
464
+ packet_name_or_text = split_item[2]
465
+ item_name = split_item[3]
466
+ value_type = split_item[4]
467
+ if value_type
468
+ value_type = value_type.upcase.intern
469
+ else
470
+ value_type = :CONVERTED
471
+ end
472
+ if item_type == 'ITEM'
473
+ @tlm_extractor_config.add_item(target_name_or_column_name, packet_name_or_text, item_name, value_type)
474
+ else
475
+ @tlm_extractor_config.add_text(target_name_or_column_name.remove_quotes, packet_name_or_text.remove_quotes)
476
+ end
477
+ end
478
+ end
479
+
480
+ def sync_config_to_gui
481
+ @matlab_header_check.setChecked(@tlm_extractor_config.matlab_header)
482
+ @fill_down_check.setChecked(@tlm_extractor_config.fill_down)
483
+ @share_columns_check.setChecked(@tlm_extractor_config.share_columns)
484
+ @unique_only_check.setChecked(@tlm_extractor_config.unique_only)
485
+ @downsample_entry.value = @tlm_extractor_config.downsample_seconds
486
+
487
+ clear_config_item_list()
488
+ @tlm_extractor_config.items.each do |item_type, target_name_or_column_name, packet_name_or_text, item_name, value_type|
489
+ if item_type == 'ITEM'
490
+ if value_type == :CONVERTED
491
+ @config_item_list.addItem("#{item_type} #{target_name_or_column_name} #{packet_name_or_text} #{item_name}")
492
+ else
493
+ @config_item_list.addItem("#{item_type} #{target_name_or_column_name} #{packet_name_or_text} #{item_name} #{value_type}")
494
+ end
495
+ else
496
+ @config_item_list.addItem("#{item_type} \"#{target_name_or_column_name}\" \"#{packet_name_or_text}\"")
497
+ end
498
+ end
499
+ end
500
+
501
+ ###############################################################################
502
+ # File Menu Handlers
503
+ ###############################################################################
504
+
505
+ # Handles processing log files
506
+ def process_log_files
507
+ @cancel = false
508
+ begin
509
+ @tlm_extractor_processor.packet_log_reader = @packet_log_frame.packet_log_reader
510
+ @input_filenames = @packet_log_frame.filenames.sort
511
+ @batch_filenames = []
512
+ output_extension = '.txt'
513
+ batch_name = nil
514
+ if @batch_mode_check.checked?
515
+ batch_name = @batch_name_entry.text
516
+ @batch_filenames_entry.each {|list_item| @batch_filenames << list_item.text}
517
+ if @packet_log_frame.output_filename_filter == Cosmos::CSV_FILE_PATTERN
518
+ output_extension = '.csv'
519
+ else
520
+ output_extension = '.txt'
521
+ end
522
+ end
523
+ return unless pre_process_tests()
524
+
525
+ # Configure Tlm Extractor Config
526
+ sync_gui_to_config()
527
+
528
+ start_time = Time.now
529
+ ProgressDialog.execute(self, 'Log File Progress', 600, 300) do |progress_dialog|
530
+ progress_dialog.cancel_callback = method(:cancel_callback)
531
+ progress_dialog.enable_cancel_button
532
+
533
+ begin
534
+ current_input_file_index = -1
535
+ current_config_file_index = -1
536
+ start_packet_count = -1
537
+ last_packet_count = -1
538
+
539
+ if @batch_filenames.empty?
540
+ process_method = :process
541
+ process_args = [@input_filenames, [@tlm_extractor_config], @packet_log_frame.time_start, @packet_log_frame.time_end]
542
+ else
543
+ process_method = :process_batch
544
+ process_args = [batch_name, @input_filenames, @log_dir, output_extension, @batch_filenames, @packet_log_frame.time_start, @packet_log_frame.time_end]
545
+ end
546
+
547
+ @tlm_extractor_processor.send(process_method, *process_args) do |input_file_index, packet_count, file_progress|
548
+ # Handle Cancel
549
+ break if @cancel
550
+
551
+ # Handle Input File Change
552
+ if input_file_index != current_input_file_index
553
+ current_input_file_index = input_file_index
554
+
555
+ if start_packet_count >= 0
556
+ # Make sure some packets were found in the previous file
557
+ if packet_count == start_packet_count
558
+ # No packets found in previous file
559
+ progress_dialog.append_text(" WARNING: No packets processed in #{File.basename(@input_filenames[input_file_index - 1])}")
560
+ end
561
+ end
562
+ start_packet_count = packet_count
563
+
564
+ progress_dialog.append_text("Processing File #{input_file_index + 1}/#{@input_filenames.length}: #{File.basename(@input_filenames[input_file_index])}")
565
+ progress_dialog.set_step_progress(0.0)
566
+ progress_dialog.set_overall_progress((input_file_index).to_f / @input_filenames.length.to_f)
567
+ end
568
+
569
+ # Save packet_count
570
+ last_packet_count = packet_count
571
+
572
+ # Handle Progress Reporting
573
+ progress_dialog.set_step_progress(file_progress)
574
+ end
575
+ # Make sure some packets were found in the previous file
576
+ if start_packet_count == last_packet_count
577
+ # No packets found in previous file
578
+ progress_dialog.append_text(" WARNING: No packets processed in #{File.basename(@input_filenames[-1])}")
579
+ end
580
+
581
+ rescue => error
582
+ progress_dialog.append_text("Error processing:\n#{error.formatted}\n")
583
+ ensure
584
+ progress_dialog.set_step_progress(1.0) if !@cancel
585
+ progress_dialog.set_overall_progress(1.0) if !@cancel
586
+ progress_dialog.append_text("Runtime: #{Time.now - start_time} s")
587
+ progress_dialog.complete
588
+ if @batch_filenames.empty?
589
+ Qt.execute_in_main_thread(true) do
590
+ @open_button.setEnabled(true)
591
+ @open_excel_button.setEnabled(true) if Kernel.is_windows?
592
+ end
593
+ end
594
+ end
595
+ end # ProgressDialog.execute
596
+ rescue => error
597
+ Qt::MessageBox.critical(self, 'Error!', "Error Processing Log File(s)\n#{error.formatted}")
598
+ end
599
+ end # def process_log_files
600
+
601
+ # Handles options dialog
602
+ def handle_options
603
+ box = Qt::Dialog.new(self)
604
+ box.setWindowTitle('Options')
605
+ top_layout = Qt::VBoxLayout.new
606
+
607
+ delimiter_layout = Qt::HBoxLayout.new
608
+ delimiter_label = Qt::Label.new('Delimeter:')
609
+ delimiter_layout.addWidget(delimiter_label)
610
+ delimiter_field = Qt::LineEdit.new
611
+ delimiter_layout.addWidget(delimiter_field)
612
+ if @tlm_extractor_config.delimiter != "\t"
613
+ delimiter_field.setText(@tlm_extractor_config.delimiter)
614
+ else
615
+ delimiter_field.setText('tab')
616
+ end
617
+ top_layout.addLayout(delimiter_layout)
618
+
619
+ checkbox_layout = Qt::HBoxLayout.new
620
+ checkbox_label = Qt::Label.new('Output filenames')
621
+ checkbox_layout.addWidget(checkbox_label)
622
+ checkbox_field = Qt::CheckBox.new
623
+ if @tlm_extractor_config.print_filenames_to_output
624
+ checkbox_field.setChecked(true)
625
+ else
626
+ checkbox_field.setChecked(false)
627
+ end
628
+ checkbox_layout.addWidget(checkbox_field)
629
+ top_layout.addLayout(checkbox_layout)
630
+
631
+ button_layout = Qt::HBoxLayout.new
632
+ ok_button = Qt::PushButton.new('OK')
633
+ ok_button.connect(SIGNAL('clicked()')) { box.accept }
634
+ button_layout.addWidget(ok_button)
635
+ button_layout.addStretch
636
+ cancel_button = Qt::PushButton.new('CANCEL')
637
+ cancel_button.connect(SIGNAL('clicked()')) { box.reject }
638
+ button_layout.addWidget(cancel_button)
639
+ top_layout.addLayout(button_layout)
640
+
641
+ box.setLayout(top_layout)
642
+ case box.exec
643
+ when Qt::Dialog::Accepted
644
+ delimiter = delimiter_field.text
645
+ if delimiter == 'tab'
646
+ delimiter = "\t"
647
+ end
648
+ @tlm_extractor_config.print_filenames_to_output = checkbox_field.checked?
649
+ @tlm_extractor_config.delimiter = delimiter
650
+ if @tlm_extractor_config.delimiter.to_s.strip == ','
651
+ @packet_log_frame.output_filename_filter = Cosmos::CSV_FILE_PATTERN
652
+ else
653
+ @packet_log_frame.output_filename_filter = Cosmos::TXT_FILE_PATTERN
654
+ end
655
+ end
656
+ box.dispose
657
+ end
658
+
659
+ def batch_mode_changed
660
+ if @batch_mode_check.checked?
661
+ @config_box.hide
662
+ @batch_config_box.show
663
+ @open_button.setEnabled(false)
664
+ @open_excel_button.setEnabled(false) if Kernel.is_windows?
665
+ @fill_down_check.setEnabled(false)
666
+ @matlab_header_check.setEnabled(false)
667
+ @share_columns_check.setEnabled(false)
668
+ @unique_only_check.setEnabled(false)
669
+ @open_config.setEnabled(false)
670
+ @save_config.setEnabled(false)
671
+ @file_options.setEnabled(false)
672
+ @item_edit.setEnabled(false)
673
+ @item_delete.setEnabled(false)
674
+ @packet_log_frame.select_output_dir
675
+ @packet_log_frame.output_filename = @log_dir
676
+ else
677
+ @config_box.show
678
+ @batch_config_box.hide
679
+ @fill_down_check.setEnabled(true)
680
+ @matlab_header_check.setEnabled(true)
681
+ @share_columns_check.setEnabled(true)
682
+ @unique_only_check.setEnabled(true)
683
+ @open_config.setEnabled(true)
684
+ @save_config.setEnabled(true)
685
+ @file_options.setEnabled(true)
686
+ @item_edit.setEnabled(true)
687
+ @item_delete.setEnabled(true)
688
+ @packet_log_frame.select_output_file
689
+ @packet_log_frame.output_filename = ''
690
+ end
691
+ end
692
+
693
+ ###############################################################################
694
+ # Item Menu Handlers
695
+ ###############################################################################
696
+
697
+ def item_edit
698
+ item_list_editor()
699
+ end
700
+
701
+ def item_delete
702
+ @config_item_list.remove_selected_items
703
+ end
704
+
705
+ ###############################################################################
706
+ # Handlers
707
+ ###############################################################################
708
+
709
+ def handle_save_button
710
+ filename = nil
711
+ begin
712
+ if @config_field.text.strip.length > 0
713
+ filename = Qt::FileDialog.getSaveFileName(self, "Save Config File", @config_field.text, "Config Files (*.txt);;All Files (*)")
714
+ else
715
+ filename = Qt::FileDialog.getSaveFileName(self, "Save Config File", @config_dir, "Config Files (*.txt);;All Files (*)")
716
+ end
717
+ if filename and filename.length != 0
718
+ sync_gui_to_config()
719
+ @tlm_extractor_config.save(filename)
720
+ @config_field.setText(filename)
721
+ @config_dir = File.dirname(filename) + '/'
722
+ end
723
+ rescue => error
724
+ Qt::MessageBox.critical(self, 'Error!', "Error Saving Configuration File: #{filename}\n#{error.formatted}")
725
+ end
726
+ end
727
+
728
+ def handle_browse_button
729
+ filename = Qt::FileDialog::getOpenFileName(self, "Open Config File:", @config_dir, "Config Files (*.txt);;All Files (*)")
730
+ if filename and not filename.empty?
731
+ @config_field.setText(filename)
732
+ @config_dir = File.dirname(filename) + '/'
733
+
734
+ begin
735
+ process_config_file(filename)
736
+ rescue => error
737
+ Qt::MessageBox.critical(self, 'Error', "Error Processing Configuration File: #{filename}\n\n#{error.formatted}")
738
+ end
739
+ end
740
+ end
741
+
742
+ def item_list_editor
743
+ done_items = false
744
+ selected_items = @config_item_list.selected_items()
745
+ if @config_item_list.currentItem and !selected_items.empty?
746
+ selected_items.each do |item_index|
747
+ dialog = Qt::Dialog.new(self)
748
+ dialog.setWindowTitle("Edit Item")
749
+ layout = Qt::VBoxLayout.new
750
+ split_item = @config_item_list.item(item_index).text.scan ConfigParser::PARSING_REGEX
751
+
752
+ if split_item[0] == 'ITEM' and !done_items
753
+ label = Qt::Label.new("#{split_item[1]} #{split_item[2]} #{split_item[3]}")
754
+ layout.addWidget(label)
755
+
756
+ label = Qt::Label.new('Value Type:')
757
+ layout.addWidget(label)
758
+
759
+ box = Qt::ComboBox.new
760
+ box.maxCount = FORMATTING_OPTIONS.length
761
+ FORMATTING_OPTIONS.each {|item| box.addItem(item) }
762
+ current_formatting = split_item[4]
763
+ current_formatting = 'CONVERTED' unless current_formatting
764
+ if FORMATTING_OPTIONS.index(current_formatting)
765
+ box.currentIndex = FORMATTING_OPTIONS.index(current_formatting)
766
+ end
767
+ layout.addWidget(box)
768
+
769
+ check_box = nil
770
+ if selected_items.length > 1 and item_index == selected_items[0]
771
+ check_box = Qt::CheckBox.new('Apply to All?')
772
+ layout.addWidget(check_box)
773
+ end
774
+
775
+ button_layout = Qt::BoxLayout.new(Qt::Horizontal)
776
+ ok = Qt::PushButton.new("Save")
777
+ connect(ok, SIGNAL('clicked()'), dialog, SLOT('accept()'))
778
+ button_layout.addWidget(ok)
779
+ cancel = Qt::PushButton.new("Cancel")
780
+ connect(cancel, SIGNAL('clicked()'), dialog, SLOT('reject()'))
781
+ button_layout.addWidget(cancel)
782
+ layout.addLayout(button_layout)
783
+
784
+ dialog.setLayout(layout)
785
+ if dialog.exec == Qt::Dialog::Accepted
786
+ if box.currentIndex != -1
787
+ set_indexes = [item_index]
788
+ if check_box and check_box.checked?
789
+ set_indexes = selected_items
790
+ end
791
+
792
+ set_indexes.each do |set_item_index|
793
+ split_item = @config_item_list.item(set_item_index).text.scan ConfigParser::PARSING_REGEX
794
+ if split_item[0] == 'ITEM'
795
+ # Remove any formatting from the item by only keeping the first four strings
796
+ @config_item_list.item(set_item_index).text = split_item[0..3].join(' ')
797
+
798
+ if box.currentIndex != 0
799
+ @config_item_list.item(set_item_index).text = "#{@config_item_list.item(set_item_index).text} #{FORMATTING_OPTIONS[box.currentIndex]}"
800
+ end
801
+ end
802
+ end
803
+ if set_indexes.length > 1
804
+ done_items = true
805
+ end
806
+ end
807
+ end
808
+ elsif split_item[0] == 'TEXT'
809
+ label = Qt::Label.new('Column Name:')
810
+ layout.addWidget(label)
811
+ column_name = Qt::LineEdit.new(split_item[1].remove_quotes)
812
+ layout.addWidget(column_name)
813
+ label = Qt::Label.new('Text:')
814
+ layout.addWidget(label)
815
+ text = Qt::LineEdit.new(split_item[2].remove_quotes)
816
+ layout.addWidget(text)
817
+
818
+ button_layout = Qt::BoxLayout.new(Qt::Horizontal)
819
+ ok = Qt::PushButton.new("Save")
820
+ connect(ok, SIGNAL('clicked()'), dialog, SLOT('accept()'))
821
+ button_layout.addWidget(ok)
822
+ cancel = Qt::PushButton.new("Cancel")
823
+ connect(cancel, SIGNAL('clicked()'), dialog, SLOT('reject()'))
824
+ button_layout.addWidget(cancel)
825
+ layout.addLayout(button_layout)
826
+
827
+ dialog.setLayout(layout)
828
+ if dialog.exec == Qt::Dialog::Accepted
829
+ # Remove any formatting from the item by only keeping the first four strings
830
+ @config_item_list.item(item_index).text = "#{split_item[0]} \"#{column_name.text}\" \"#{text.text}\""
831
+ end
832
+ end
833
+
834
+ dialog.dispose
835
+ end
836
+ end
837
+ end
838
+
839
+ def open_button
840
+ Cosmos.open_in_text_editor(@packet_log_frame.output_filename)
841
+ end
842
+
843
+ def open_excel_button
844
+ system("start Excel.exe \"#{@packet_log_frame.output_filename}\"")
845
+ end
846
+
847
+ def clear_config_item_list
848
+ @config_item_list.clearItems
849
+ end # def clear_data_object_list
850
+
851
+ # Handles removing a selected filename
852
+ def handle_batch_remove_button
853
+ @batch_filenames_entry.remove_selected_items
854
+ end
855
+
856
+ # Handles browsing for log files
857
+ def handle_batch_browse_button
858
+ Cosmos.set_working_dir do
859
+ filenames = Qt::FileDialog::getOpenFileNames(
860
+ self, "Select Config File(s):", @config_dir, Cosmos::TXT_FILE_PATTERN)
861
+ if filenames and not filenames.empty?
862
+ @config_dir = File.dirname(filenames[0]) + '/'
863
+ filenames.each {|filename| @batch_filenames_entry.addItem(filename) if @batch_filenames_entry.findItems(filename, Qt::MatchExactly).empty? }
864
+ end
865
+ end
866
+ end
867
+
868
+ ###############################################################################
869
+ # Additional Callbacks
870
+ ###############################################################################
871
+
872
+ def cancel_callback(progress_dialog = nil)
873
+ @cancel = true
874
+ return true, false
875
+ end
876
+
877
+ def add_target_callback(target_name)
878
+ packets = System.telemetry.packets(target_name)
879
+ packets.each do |packet_name, packet|
880
+ packet.sorted_items.each do |item|
881
+ @config_item_list.addItem("ITEM #{target_name} #{packet_name} #{item.name}")
882
+ end
883
+ end
884
+ end
885
+
886
+ def add_packet_callback(target_name, packet_name)
887
+ packet = System.telemetry.packet(target_name, packet_name)
888
+ packet.sorted_items.each do |item|
889
+ @config_item_list.addItem("ITEM #{target_name} #{packet_name} #{item.name}")
890
+ end
891
+ end
892
+
893
+ def add_item_callback(target_name, packet_name, item_name)
894
+ @config_item_list.addItem("ITEM #{target_name} #{packet_name} #{item_name}")
895
+ end
896
+
897
+ def add_text_item_callback(column_name, text)
898
+ @config_item_list.addItem("TEXT \"#{column_name}\" \"#{text}\"")
899
+ end
900
+
901
+ ###############################################################################
902
+ # Helper Methods
903
+ ###############################################################################
904
+
905
+ def pre_process_tests
906
+ if !@batch_mode_check.checked?
907
+ # Normal Mode
908
+
909
+ if @config_item_list.count < 1
910
+ Qt::MessageBox.critical(self, 'Error', 'Please select at least 1 item')
911
+ return false
912
+ end
913
+
914
+ unless @packet_log_frame.output_filename
915
+ Qt::MessageBox.critical(self, 'Error', 'No Output File Selected')
916
+ return false
917
+ end
918
+
919
+ if File.exist?(@packet_log_frame.output_filename)
920
+ result = Qt::MessageBox.warning(self, 'Warning!', 'Output File Already Exists. Overwrite?', Qt::MessageBox::Yes | Qt::MessageBox::No)
921
+ return false if result == Qt::MessageBox::No
922
+ end
923
+ else
924
+ # Batch Mode
925
+
926
+ if !@batch_name_entry.text or @batch_name_entry.text.strip.empty?
927
+ Qt::MessageBox.critical(self, 'Error', 'Batch Name is Required')
928
+ return false
929
+ end
930
+
931
+ unless @batch_filenames and @batch_filenames[0]
932
+ Qt::MessageBox.critical(self, 'Error', 'Please select at least 1 config file')
933
+ return false
934
+ end
935
+ end
936
+
937
+ unless @input_filenames and @input_filenames[0]
938
+ Qt::MessageBox.critical(self, 'Error', 'Please select at least 1 input file')
939
+ return false
940
+ end
941
+
942
+ # Validate configurations exist for input filenames
943
+ @input_filenames.each do |input_filename|
944
+ Cosmos.check_log_configuration(@tlm_extractor_processor.packet_log_reader, input_filename)
945
+ end
946
+
947
+ #Validate config information
948
+ @tlm_extractor_processor.packet_log_reader.open(@input_filenames[0])
949
+ @tlm_extractor_processor.packet_log_reader.close
950
+
951
+ @config_item_list.each do |item|
952
+ split_item = item.text.split
953
+ item_type = split_item[0]
954
+ target_name = split_item[1]
955
+ packet_name = split_item[2]
956
+ item_name = split_item[3]
957
+
958
+ if item_type == 'ITEM'
959
+ # Verify Packet
960
+ packet = nil
961
+ begin
962
+ packet = System.telemetry.packet(target_name, packet_name)
963
+ rescue
964
+ Qt::MessageBox.critical(self, 'Error!', "Unknown Packet #{target_name} #{packet_name} specified")
965
+ return false
966
+ end
967
+
968
+ # Verify Item
969
+ begin
970
+ packet.get_item(item_name)
971
+ rescue
972
+ Qt::MessageBox.critical(self, 'Error!', "Item #{item_name} not present in packet")
973
+ return false
974
+ end
975
+ end
976
+ end
977
+
978
+ true
979
+ end
980
+
981
+ def process_config_file(filename)
982
+ @tlm_extractor_config.restore(filename)
983
+ sync_config_to_gui()
984
+ end
985
+
986
+ def change_callback(item_changed)
987
+ if item_changed == :INPUT_FILES
988
+ if !@batch_mode_check.checked?
989
+ filename = @packet_log_frame.filenames[0]
990
+ if filename
991
+ extension = File.extname(filename)
992
+ filename_no_extension = filename[0..-(extension.length + 1)]
993
+ if @packet_log_frame.output_filename_filter == Cosmos::CSV_FILE_PATTERN
994
+ filename = filename_no_extension << '.csv'
995
+ else
996
+ filename = filename_no_extension << '.txt'
997
+ end
998
+ @packet_log_frame.output_filename = filename
999
+ end
1000
+ end
1001
+ elsif item_changed == :OUTPUT_FILE
1002
+ output_filename = @packet_log_frame.output_filename
1003
+ if output_filename and !output_filename.to_s.strip.empty?
1004
+ @log_dir = File.dirname(output_filename)
1005
+ end
1006
+ elsif item_changed == :OUTPUT_DIR
1007
+ output_filename = @packet_log_frame.output_filename
1008
+ if output_filename and !output_filename.to_s.strip.empty?
1009
+ @log_dir = output_filename
1010
+ end
1011
+ end
1012
+ end
1013
+
1014
+ end # class TlmExtractor
1015
+
1016
+ end # module Cosmos