cosmos 3.9.2 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +23 -0
  3. data/.travis.yml +1 -0
  4. data/.yardopts +3 -0
  5. data/Gemfile +1 -1
  6. data/Manifest.txt +137 -52
  7. data/Rakefile +50 -44
  8. data/autohotkey/config/system/system.txt +0 -5
  9. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +6 -1
  10. data/autohotkey/config/targets/INST/screens/extra.txt +19 -0
  11. data/autohotkey/config/targets/INST/sequences/run_sequence.txt +1 -0
  12. data/autohotkey/config/targets/META/screens/data.txt +12 -0
  13. data/autohotkey/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  14. data/autohotkey/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  15. data/autohotkey/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  16. data/autohotkey/config/targets/SYSTEM/screens/limits_change.txt +14 -0
  17. data/autohotkey/config/targets/SYSTEM/screens/meta.txt +14 -0
  18. data/autohotkey/config/targets/SYSTEM/target.txt +12 -0
  19. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  20. data/autohotkey/config/tools/test_runner/test_runner2.txt +1 -1
  21. data/autohotkey/tools/CmdSequence +14 -0
  22. data/autohotkey/tools/CmdSequenceAHK +23 -0
  23. data/autohotkey/tools/CmdSequenceAHK2 +16 -0
  24. data/autohotkey/tools/cmd_extractor.ahk +2 -2
  25. data/autohotkey/tools/cmd_sender.ahk +4 -6
  26. data/autohotkey/tools/cmd_sequence.ahk +215 -0
  27. data/autohotkey/tools/cmd_sequence2.ahk +23 -0
  28. data/autohotkey/tools/data_viewer.ahk +2 -3
  29. data/autohotkey/tools/limits_monitor.ahk +9 -11
  30. data/autohotkey/tools/open_gl_builder.ahk +1 -2
  31. data/autohotkey/tools/packet_viewer.ahk +51 -35
  32. data/autohotkey/tools/replay.ahk +1 -2
  33. data/autohotkey/tools/script_runner.ahk +1 -2
  34. data/autohotkey/tools/script_runner2.ahk +1 -2
  35. data/autohotkey/tools/test_runner2.ahk +1 -5
  36. data/autohotkey/tools/test_runner3.ahk +1 -3
  37. data/autohotkey/tools/tlm_grapher.ahk +1 -3
  38. data/autohotkey/tools/tlm_grapher3.ahk +1 -2
  39. data/autohotkey/tools/tlm_viewer.ahk +8 -3
  40. data/autohotkey/tools/tlm_viewer2.ahk +2 -3
  41. data/autohotkey/tools/tlm_viewer5.ahk +1 -2
  42. data/cosmos.gemspec +26 -20
  43. data/data/cmd_sequence.png +0 -0
  44. data/data/config/_array_params.yaml +23 -0
  45. data/data/config/_id_items.yaml +24 -0
  46. data/data/config/_id_params.yaml +58 -0
  47. data/data/config/_interfaces.yaml +206 -0
  48. data/data/config/_items.yaml +20 -0
  49. data/data/config/_params.yaml +58 -0
  50. data/data/config/cmd_tlm_server.yaml +110 -0
  51. data/data/config/command.yaml +38 -0
  52. data/data/config/command_modifiers.yaml +127 -0
  53. data/data/config/command_telemetry.yaml +3 -0
  54. data/data/config/data_viewer.yaml +43 -0
  55. data/data/config/handbook_creator.yaml +23 -0
  56. data/data/config/housekeeping_params.yaml +71 -0
  57. data/data/config/interface_modifiers.yaml +44 -0
  58. data/data/config/item_modifiers.yaml +172 -0
  59. data/data/config/launcher.yaml +117 -0
  60. data/data/config/limits_monitor.yaml +53 -0
  61. data/data/config/linegraph_params.yaml +30 -0
  62. data/data/config/linegraph_plot.yaml +106 -0
  63. data/data/config/page_modifiers.yaml +128 -0
  64. data/data/config/param_item_modifiers.yaml +41 -0
  65. data/data/config/parameter_modifiers.yaml +144 -0
  66. data/data/config/protocols.yaml +257 -0
  67. data/data/config/screen.yaml +151 -0
  68. data/data/config/script_runner.yaml +15 -0
  69. data/data/config/system.yaml +153 -0
  70. data/data/config/table_manager.yaml +76 -0
  71. data/data/config/table_parameter_modifiers.yaml +9 -0
  72. data/data/config/target.yaml +71 -0
  73. data/data/config/telemetry.yaml +73 -0
  74. data/data/config/telemetry_modifiers.yaml +129 -0
  75. data/data/config/test_runner.yaml +118 -0
  76. data/data/config/tlm_extractor.yaml +109 -0
  77. data/data/config/tlm_grapher.yaml +78 -0
  78. data/data/config/tlm_viewer.yaml +107 -0
  79. data/data/config/unknown.yaml +3 -0
  80. data/data/config/widgets.yaml +1339 -0
  81. data/data/config/xy_params.yaml +50 -0
  82. data/data/config/xy_plot.yaml +12 -0
  83. data/data/config_editor.png +0 -0
  84. data/data/crc.txt +172 -161
  85. data/data/delete.png +0 -0
  86. data/demo/config/data/crc.txt +56 -36
  87. data/demo/config/data/meta_init.txt +1 -4
  88. data/demo/config/system/system.txt +15 -3
  89. data/demo/config/system/system2.txt +13 -3
  90. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +2 -6
  91. data/demo/config/targets/EXAMPLE/target.txt +3 -1
  92. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +1 -0
  93. data/demo/config/targets/INST/lib/inst_dump_component.rb +34 -0
  94. data/demo/config/targets/INST/screens/adcs.txt +39 -15
  95. data/demo/config/targets/INST/screens/commanding.txt +26 -19
  96. data/demo/config/targets/INST/screens/spacing_box.txt +44 -0
  97. data/demo/config/targets/INST/screens/spacing_grid.txt +78 -0
  98. data/demo/config/targets/INST/screens/tabs.txt +0 -2
  99. data/demo/config/targets/INST/sequences/sequence.tsv +3 -0
  100. data/demo/config/targets/INST/tables/EventAction.csv +9 -0
  101. data/demo/config/targets/INST/tables/EventAction.dat +0 -0
  102. data/demo/config/targets/INST/tables/McConfigTable.csv +20 -0
  103. data/demo/config/targets/INST/tables/McConfigTable.dat +0 -0
  104. data/demo/config/targets/INST/target.txt +4 -0
  105. data/demo/config/targets/INST/tools/data_viewer/data_viewer.txt +2 -0
  106. data/demo/config/targets/INST/tools/data_viewer/data_viewer2.txt +2 -0
  107. data/demo/config/targets/INST/tools/table_manager/EventAction_def.txt +6 -0
  108. data/demo/config/targets/INST/tools/table_manager/McConfigTable_def.txt +38 -0
  109. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -3
  110. data/demo/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  111. data/demo/config/targets/{COSMOS/cmd_tlm/cosmos_server_cmds.txt → SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  112. data/demo/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  113. data/demo/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
  114. data/demo/config/targets/SYSTEM/lib/limits_groups.rb +39 -0
  115. data/demo/config/targets/SYSTEM/screens/status.txt +1 -1
  116. data/demo/config/targets/SYSTEM/target.txt +12 -0
  117. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +1 -1
  118. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +8 -5
  119. data/demo/config/targets/TEMPLATED/target.txt +2 -0
  120. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +15 -6
  121. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +13 -5
  122. data/demo/config/tools/data_viewer/data_viewer.txt +9 -0
  123. data/demo/config/tools/launcher/launcher.txt +9 -6
  124. data/demo/config/tools/launcher/launcher2.txt +16 -13
  125. data/demo/config/tools/launcher/launcher_mini.txt +45 -0
  126. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +12 -11
  127. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +12 -11
  128. data/demo/config/tools/test_runner/test_runner.txt +1 -1
  129. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  130. data/demo/lib/example_background_task.rb +9 -5
  131. data/demo/lib/example_target.rb +5 -15
  132. data/demo/lib/scpi_target.rb +4 -10
  133. data/demo/procedures/cosmos_api_test.rb +17 -0
  134. data/demo/tools/CmdSequence +16 -0
  135. data/demo/tools/CmdSequence.bat +9 -0
  136. data/demo/tools/ConfigEditor +16 -0
  137. data/demo/tools/ConfigEditor.bat +9 -0
  138. data/demo/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
  139. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
  140. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
  141. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
  142. data/demo/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
  143. data/ext/cosmos/ext/packet/packet.c +5 -5
  144. data/install/config/data/crc.txt +12 -8
  145. data/install/config/system/system.txt +13 -3
  146. data/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +14 -0
  147. data/install/config/targets/SYSTEM/target.txt +12 -0
  148. data/install/tools/CmdSequence +16 -0
  149. data/install/tools/CmdSequence.bat +9 -0
  150. data/install/tools/ConfigEditor +16 -0
  151. data/install/tools/ConfigEditor.bat +9 -0
  152. data/install/tools/mac/CmdSequence.app/Contents/Info.plist +38 -0
  153. data/install/tools/mac/CmdSequence.app/Contents/MacOS/CmdSequence.rb +16 -0
  154. data/install/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +10 -0
  155. data/install/tools/mac/CmdSequence.app/Contents/MacOS/tool_launch.rb +38 -0
  156. data/install/tools/mac/CmdSequence.app/Contents/Resources/appIcon.icns +0 -0
  157. data/lib/cosmos.rb +1 -1
  158. data/lib/cosmos/config/config_parser.rb +147 -59
  159. data/lib/cosmos/config/meta_config_parser.rb +57 -0
  160. data/lib/cosmos/conversions/polynomial_conversion.rb +20 -4
  161. data/lib/cosmos/conversions/unix_time_conversion.rb +4 -4
  162. data/lib/cosmos/core_ext/array.rb +45 -5
  163. data/lib/cosmos/core_ext/cosmos_io.rb +31 -15
  164. data/lib/cosmos/core_ext/file.rb +2 -2
  165. data/lib/cosmos/core_ext/kernel.rb +1 -6
  166. data/lib/cosmos/core_ext/objectspace.rb +0 -2
  167. data/lib/cosmos/core_ext/string.rb +27 -4
  168. data/lib/cosmos/core_ext/time.rb +39 -10
  169. data/lib/cosmos/gui/choosers/combobox_chooser.rb +37 -26
  170. data/lib/cosmos/gui/choosers/file_chooser.rb +23 -6
  171. data/lib/cosmos/gui/choosers/float_chooser.rb +13 -11
  172. data/lib/cosmos/gui/choosers/integer_chooser.rb +13 -11
  173. data/lib/cosmos/gui/choosers/string_chooser.rb +18 -36
  174. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +64 -64
  175. data/lib/cosmos/gui/choosers/value_chooser.rb +15 -15
  176. data/lib/cosmos/gui/dialogs/about_dialog.rb +18 -13
  177. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +11 -3
  178. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +1 -1
  179. data/lib/cosmos/gui/dialogs/details_dialog.rb +1 -1
  180. data/lib/cosmos/gui/dialogs/exception_dialog.rb +7 -7
  181. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +20 -15
  182. data/lib/cosmos/gui/dialogs/interface_raw_dialog.rb +143 -0
  183. data/lib/cosmos/gui/dialogs/legal_dialog.rb +6 -5
  184. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +5 -2
  185. data/lib/cosmos/gui/dialogs/progress_dialog.rb +1 -1
  186. data/lib/cosmos/gui/dialogs/pry_dialog.rb +4 -4
  187. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +3 -0
  188. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +7 -6
  189. data/lib/cosmos/gui/dialogs/splash.rb +1 -1
  190. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +1 -1
  191. data/lib/cosmos/gui/dialogs/tlm_graph_dialog.rb +114 -0
  192. data/lib/cosmos/gui/line_graph/line_graph.rb +9 -10
  193. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +7 -5
  194. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +3 -7
  195. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +3 -8
  196. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +2 -7
  197. data/lib/cosmos/gui/line_graph/overview_graph.rb +6 -1
  198. data/lib/cosmos/gui/opengl/earth_model.rb +6 -3
  199. data/lib/cosmos/gui/opengl/gl_bounds.rb +11 -23
  200. data/lib/cosmos/gui/opengl/gl_light.rb +3 -4
  201. data/lib/cosmos/gui/opengl/gl_material.rb +3 -4
  202. data/lib/cosmos/gui/opengl/gl_scene.rb +10 -4
  203. data/lib/cosmos/gui/opengl/gl_shape.rb +6 -2
  204. data/lib/cosmos/gui/opengl/gl_viewer.rb +5 -5
  205. data/lib/cosmos/gui/opengl/gl_viewport.rb +11 -12
  206. data/lib/cosmos/gui/opengl/moon_model.rb +6 -3
  207. data/lib/cosmos/gui/opengl/stl_reader.rb +8 -9
  208. data/lib/cosmos/gui/opengl/stl_shape.rb +4 -5
  209. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +7 -7
  210. data/lib/cosmos/gui/qt.rb +1 -1
  211. data/lib/cosmos/gui/qt_tool.rb +21 -10
  212. data/lib/cosmos/gui/text/completion.rb +23 -2
  213. data/lib/cosmos/gui/text/completion_text_edit.rb +38 -23
  214. data/lib/cosmos/gui/utilities/analyze_log.rb +1 -1
  215. data/lib/cosmos/gui/utilities/screenshot.rb +2 -2
  216. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +11 -1
  217. data/lib/cosmos/gui/widgets/packet_log_frame.rb +19 -6
  218. data/lib/cosmos/interfaces.rb +10 -0
  219. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +28 -47
  220. data/lib/cosmos/interfaces/interface.rb +240 -22
  221. data/lib/cosmos/interfaces/linc_interface.rb +3 -5
  222. data/lib/cosmos/interfaces/protocols/burst_protocol.rb +173 -0
  223. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +141 -0
  224. data/lib/cosmos/{streams/fixed_stream_protocol.rb → interfaces/protocols/fixed_protocol.rb} +40 -37
  225. data/lib/cosmos/{streams/length_stream_protocol.rb → interfaces/protocols/length_protocol.rb} +55 -48
  226. data/lib/cosmos/interfaces/protocols/override_protocol.rb +52 -0
  227. data/lib/cosmos/interfaces/protocols/preidentified_protocol.rb +141 -0
  228. data/lib/cosmos/interfaces/protocols/protocol.rb +60 -0
  229. data/lib/cosmos/interfaces/protocols/template_protocol.rb +209 -0
  230. data/lib/cosmos/interfaces/protocols/terminated_protocol.rb +81 -0
  231. data/lib/cosmos/interfaces/serial_interface.rb +28 -23
  232. data/lib/cosmos/interfaces/simulated_target_interface.rb +27 -16
  233. data/lib/cosmos/interfaces/stream_interface.rb +36 -108
  234. data/lib/cosmos/interfaces/tcpip_client_interface.rb +21 -21
  235. data/lib/cosmos/interfaces/tcpip_server_interface.rb +555 -94
  236. data/lib/cosmos/interfaces/udp_interface.rb +51 -83
  237. data/lib/cosmos/io/buffered_file.rb +92 -2
  238. data/lib/cosmos/io/json_drb.rb +2 -2
  239. data/lib/cosmos/io/posix_serial_driver.rb +3 -1
  240. data/lib/cosmos/io/raw_logger.rb +3 -3
  241. data/lib/cosmos/io/serial_driver.rb +14 -5
  242. data/lib/cosmos/io/win32_serial_driver.rb +16 -4
  243. data/lib/cosmos/packet_logs.rb +0 -1
  244. data/lib/cosmos/packet_logs/packet_log_reader.rb +11 -1
  245. data/lib/cosmos/packet_logs/packet_log_writer.rb +31 -13
  246. data/lib/cosmos/packets/binary_accessor.rb +599 -32
  247. data/lib/cosmos/packets/commands.rb +48 -24
  248. data/lib/cosmos/packets/packet.rb +140 -54
  249. data/lib/cosmos/packets/packet_config.rb +0 -2
  250. data/lib/cosmos/packets/parsers/packet_item_parser.rb +10 -2
  251. data/lib/cosmos/packets/structure.rb +81 -33
  252. data/lib/cosmos/packets/structure_item.rb +45 -5
  253. data/lib/cosmos/packets/telemetry.rb +149 -55
  254. data/lib/cosmos/script/api_shared.rb +1000 -0
  255. data/lib/cosmos/script/commands.rb +2 -2
  256. data/lib/cosmos/script/extract.rb +19 -4
  257. data/lib/cosmos/script/limits.rb +2 -0
  258. data/lib/cosmos/script/script.rb +1 -1
  259. data/lib/cosmos/script/scripting.rb +4 -784
  260. data/lib/cosmos/script/telemetry.rb +44 -23
  261. data/lib/cosmos/script/tools.rb +15 -69
  262. data/lib/cosmos/streams/serial_stream.rb +12 -19
  263. data/lib/cosmos/streams/stream.rb +2 -11
  264. data/lib/cosmos/streams/tcpip_socket_stream.rb +3 -13
  265. data/lib/cosmos/system/system.rb +187 -31
  266. data/lib/cosmos/system/target.rb +11 -2
  267. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +12 -11
  268. data/lib/cosmos/tools/cmd_sender/{cmd_sender_item_delegate.rb → cmd_param_table_item_delegate.rb} +11 -10
  269. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +209 -164
  270. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +652 -0
  271. data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +510 -0
  272. data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +194 -0
  273. data/lib/cosmos/tools/cmd_tlm_server/api.rb +179 -5
  274. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +31 -14
  275. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +23 -16
  276. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +92 -20
  277. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +1 -1
  278. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +17 -4
  279. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +0 -5
  280. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +1 -2
  281. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +4 -4
  282. data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +121 -0
  283. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +8 -4
  284. data/lib/cosmos/tools/config_editor/config_editor.rb +720 -0
  285. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +675 -0
  286. data/lib/cosmos/tools/data_viewer/data_viewer.rb +44 -27
  287. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +8 -22
  288. data/lib/cosmos/tools/launcher/launcher.rb +29 -12
  289. data/lib/cosmos/tools/launcher/launcher_config.rb +1 -1
  290. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +153 -42
  291. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +44 -6
  292. data/lib/cosmos/tools/replay/replay.rb +36 -20
  293. data/lib/cosmos/tools/replay/replay_server.rb +1 -1
  294. data/lib/cosmos/tools/script_runner/script_runner_config.rb +1 -1
  295. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +31 -21
  296. data/lib/cosmos/tools/table_manager/table_config.rb +9 -3
  297. data/lib/cosmos/tools/table_manager/table_manager.rb +27 -7
  298. data/lib/cosmos/tools/test_runner/results_writer.rb +6 -6
  299. data/lib/cosmos/tools/test_runner/test_runner.rb +4 -6
  300. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +4 -5
  301. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +1 -1
  302. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +1 -1
  303. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +23 -6
  304. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +44 -3
  305. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +20 -7
  306. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1 -1
  307. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +11 -4
  308. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +2 -2
  309. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +1 -1
  310. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +16 -0
  311. data/lib/cosmos/tools/tlm_viewer/screen.rb +36 -32
  312. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +59 -50
  313. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +2 -2
  314. data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
  315. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +1 -0
  316. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +22 -4
  317. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +9 -0
  318. data/lib/cosmos/tools/tlm_viewer/widgets/spacer_widget.rb +55 -0
  319. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +3 -2
  320. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +3 -2
  321. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +12 -12
  322. data/lib/cosmos/top_level.rb +34 -24
  323. data/lib/cosmos/utilities/crc.rb +108 -6
  324. data/lib/cosmos/utilities/csv.rb +68 -14
  325. data/lib/cosmos/utilities/logger.rb +2 -2
  326. data/lib/cosmos/utilities/low_fragmentation_array.rb +9 -1
  327. data/lib/cosmos/version.rb +6 -6
  328. data/lib/cosmos/win32/win32_main.rb +50 -46
  329. data/run_gui_tests.bat +3 -1
  330. data/spec/conversions/unix_time_formatted_conversion_spec.rb +2 -2
  331. data/spec/conversions/unix_time_seconds_conversion_spec.rb +2 -2
  332. data/spec/core_ext/file_spec.rb +1 -1
  333. data/spec/core_ext/objectspace_spec.rb +12 -9
  334. data/spec/core_ext/string_spec.rb +6 -0
  335. data/spec/core_ext/time_spec.rb +10 -0
  336. data/spec/gui/line_graph/line_clip_spec.rb +226 -224
  337. data/spec/gui/qt_spec.rb +81 -79
  338. data/spec/install/config/system/system.txt +0 -6
  339. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +5 -5
  340. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +8 -8
  341. data/spec/install/config/targets/SYSTEM/cmd_tlm/meta_cmd_tlm.txt +16 -0
  342. data/{install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt → spec/install/config/targets/SYSTEM/cmd_tlm/system_cmds.txt} +8 -8
  343. data/spec/install/config/targets/SYSTEM/cmd_tlm/system_tlm.txt +7 -0
  344. data/spec/install/config/targets/{COSMOS → SYSTEM}/cmd_tlm_server.txt +2 -2
  345. data/spec/install/config/targets/SYSTEM/screens/status.txt +12 -0
  346. data/spec/install/config/targets/SYSTEM/target.txt +12 -0
  347. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +9 -13
  348. data/spec/interfaces/interface_spec.rb +402 -18
  349. data/spec/interfaces/linc_interface_spec.rb +37 -39
  350. data/spec/interfaces/protocols/burst_protocol_spec.rb +300 -0
  351. data/spec/interfaces/protocols/crc_protocol_spec.rb +709 -0
  352. data/spec/interfaces/protocols/fixed_protocol_spec.rb +119 -0
  353. data/spec/interfaces/protocols/length_protocol_spec.rb +499 -0
  354. data/spec/interfaces/protocols/override_protocol_spec.rb +158 -0
  355. data/spec/interfaces/protocols/preidentified_protocol_spec.rb +149 -0
  356. data/spec/interfaces/protocols/template_protocol_spec.rb +218 -0
  357. data/spec/interfaces/protocols/terminated_protocol_spec.rb +174 -0
  358. data/spec/interfaces/serial_interface_spec.rb +35 -34
  359. data/spec/interfaces/simulated_target_interface_spec.rb +13 -13
  360. data/spec/interfaces/tcpip_client_interface_spec.rb +21 -16
  361. data/spec/interfaces/tcpip_server_interface_spec.rb +66 -69
  362. data/spec/interfaces/udp_interface_spec.rb +120 -55
  363. data/spec/io/serial_driver_spec.rb +41 -39
  364. data/spec/io/udp_sockets_spec.rb +13 -8
  365. data/spec/io/win32_serial_driver_spec.rb +62 -59
  366. data/spec/packet_logs/packet_log_reader_spec.rb +68 -47
  367. data/spec/packet_logs/packet_log_writer_spec.rb +7 -5
  368. data/spec/packets/commands_spec.rb +5 -5
  369. data/spec/packets/packet_spec.rb +2 -14
  370. data/spec/script/extract_spec.rb +21 -7
  371. data/spec/script/scripting_spec.rb +261 -6
  372. data/spec/script/telemetry_spec.rb +17 -9
  373. data/spec/spec_helper.rb +26 -10
  374. data/spec/streams/serial_stream_spec.rb +87 -82
  375. data/spec/streams/tcpip_client_stream_spec.rb +12 -4
  376. data/spec/streams/tcpip_socket_stream_spec.rb +5 -0
  377. data/spec/system/system_spec.rb +66 -50
  378. data/spec/system/target_spec.rb +33 -11
  379. data/spec/tools/cmd_tlm_server/api_spec.rb +5 -5
  380. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +75 -15
  381. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +125 -5
  382. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +244 -232
  383. data/spec/tools/cmd_tlm_server/commanding_spec.rb +18 -18
  384. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +124 -29
  385. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +2 -2
  386. data/spec/tools/cmd_tlm_server/limits_groups_background_task_spec.rb +145 -0
  387. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +50 -10
  388. data/spec/tools/table_manager/tablemanager_core_spec.rb +0 -1
  389. data/spec/top_level/top_level_spec.rb +39 -11
  390. data/spec/utilities/csv_spec.rb +62 -20
  391. data/tasks/gemfile_stats.rake +6 -3
  392. data/test/performance/config/system/system_packets.txt +0 -1
  393. data/test/performance/config/system/system_threads.txt +0 -1
  394. metadata +177 -92
  395. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  396. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
  397. data/autohotkey/config/targets/COSMOS/target.txt +0 -5
  398. data/autohotkey/userpath.txt +0 -1
  399. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  400. data/demo/config/targets/COSMOS/screens/limits_change.txt +0 -20
  401. data/demo/config/targets/COSMOS/screens/version.txt +0 -19
  402. data/demo/config/targets/COSMOS/target.txt +0 -11
  403. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +0 -10
  404. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +0 -13
  405. data/demo/userpath.txt +0 -1
  406. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  407. data/install/config/targets/COSMOS/cmd_tlm_server.txt +0 -6
  408. data/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
  409. data/install/config/targets/COSMOS/screens/version.txt +0 -19
  410. data/install/config/targets/COSMOS/target.txt +0 -9
  411. data/install/config/targets/SYSTEM/README.txt +0 -1
  412. data/install/userpath.txt +0 -1
  413. data/lib/cosmos/io/tcpip_server.rb +0 -571
  414. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +0 -107
  415. data/lib/cosmos/streams/burst_stream_protocol.rb +0 -25
  416. data/lib/cosmos/streams/preidentified_stream_protocol.rb +0 -118
  417. data/lib/cosmos/streams/stream_protocol.rb +0 -373
  418. data/lib/cosmos/streams/template_stream_protocol.rb +0 -140
  419. data/lib/cosmos/streams/terminated_stream_protocol.rb +0 -85
  420. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +0 -41
  421. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +0 -15
  422. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +0 -20
  423. data/spec/install/config/targets/COSMOS/screens/version.txt +0 -19
  424. data/spec/install/config/targets/COSMOS/target.txt +0 -5
  425. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +0 -4
  426. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +0 -4
  427. data/spec/install/userpath.txt +0 -1
  428. data/spec/interfaces/stream_interface_spec.rb +0 -157
  429. data/spec/io/tcpip_server_spec.rb +0 -338
  430. data/spec/packet_logs/meta_packet_log_writer_spec.rb +0 -170
  431. data/spec/streams/burst_stream_protocol_spec.rb +0 -32
  432. data/spec/streams/fixed_stream_protocol_spec.rb +0 -113
  433. data/spec/streams/length_stream_protocol_spec.rb +0 -300
  434. data/spec/streams/preidentified_stream_protocol_spec.rb +0 -121
  435. data/spec/streams/stream_protocol_spec.rb +0 -346
  436. data/spec/streams/template_stream_protocol_spec.rb +0 -156
  437. data/spec/streams/terminated_stream_protocol_spec.rb +0 -127
  438. data/test/performance/userpath.txt +0 -1
@@ -0,0 +1,675 @@
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/script'
13
+ require 'cosmos/config/config_parser'
14
+ require 'cosmos/gui/utilities/script_module_gui'
15
+ require 'cosmos/gui/dialogs/splash'
16
+ require 'cosmos/gui/dialogs/exception_dialog'
17
+ require 'cosmos/gui/text/completion'
18
+ require 'cosmos/gui/text/completion_line_edit'
19
+ require 'cosmos/gui/text/ruby_editor'
20
+ require 'cosmos/gui/dialogs/progress_dialog'
21
+ require 'cosmos/gui/dialogs/find_replace_dialog'
22
+ require 'cosmos/gui/choosers/file_chooser'
23
+ require 'cosmos/config/meta_config_parser'
24
+
25
+ module Cosmos
26
+ class ConfigEditorFrame < Qt::Widget
27
+ slots 'context_menu(const QPoint&)'
28
+ slots 'undo_available(bool)'
29
+ slots 'cursor_position_changed()'
30
+ signals 'undoAvailable(bool)'
31
+ signals 'modificationChanged(bool)'
32
+ signals 'cursorPositionChanged()'
33
+ signals 'file_type_changed()'
34
+
35
+ attr_reader :filename, :editor, :file_type
36
+
37
+ @@file_number = 1
38
+ # Parsing Regex which captures ERB delimited values: <%= code %>
39
+ # Double quotes: "String with space" and single quotes: 'Another one'
40
+ PARSING_REGEX = %r{ (?:\S*<%(?:[^%>]|\\.)*%>\S*) | (?:"(?:[^\\"]|\\.)*") | (?:'(?:[^\\']|\\.)*') | \S+ }x #"
41
+
42
+ def initialize(parent, default_tab_text = 'Untitled')
43
+ super(parent)
44
+ @default_tab_text = ' ' + default_tab_text + ' '
45
+ # Keep track of whether this frame has been fully initialized
46
+ @initialized = false
47
+
48
+ # Keep track of a unique file number so we can differentiate untitled tabs
49
+ @file_number = @@file_number
50
+ @@file_number += 1
51
+ @filename = ''
52
+
53
+ @layout = Qt::VBoxLayout.new
54
+ @layout.setContentsMargins(0,0,0,0)
55
+ setLayout(@layout)
56
+
57
+ # Create a splitter to hold the config text area and the config GUI help
58
+ @splitter = Qt::Splitter.new(Qt::Horizontal, self)
59
+ @layout.addWidget(@splitter)
60
+
61
+ @top_widget = Qt::Widget.new(@splitter)
62
+ @top_widget.setContentsMargins(0,0,0,0)
63
+ @top_frame = Qt::VBoxLayout.new(@top_widget)
64
+ @top_frame.setContentsMargins(0,0,0,0)
65
+
66
+ # Add Initial Text Window
67
+ @editor = create_ruby_editor()
68
+ @editor.filename = unique_filename()
69
+ @editor.connect(SIGNAL('modificationChanged(bool)')) do |changed|
70
+ emit modificationChanged(changed)
71
+ end
72
+ @editor.connect(SIGNAL('undoAvailable(bool)')) { |bool| undo_available(bool) }
73
+ @editor.connect(SIGNAL('cursorPositionChanged()')) { cursor_position_changed() }
74
+ @top_frame.addWidget(@editor)
75
+
76
+ # Set self as the gui window to allow prompts and other popups to appear
77
+ set_cmd_tlm_gui_window(self)
78
+
79
+ # Add GUI Frame
80
+ @gui_area = Qt::ScrollArea.new
81
+ @gui_area.setWidgetResizable(true) # Key to allow sub widget to resize
82
+ @gui_area.setWidget(@gui_widget)
83
+ @splitter.addWidget(@gui_area)
84
+ @splitter.setSizes([700, 300]) # Rough split of the widget
85
+
86
+ @gui_widget = Qt::Widget.new
87
+ build_unknown_help()
88
+
89
+ # Configure Variables
90
+ @key_press_callback = nil
91
+ @output_time = Time.now.sys
92
+ initialize_variables()
93
+
94
+ # Create Tabbook
95
+ @tab_book = Qt::TabWidget.new
96
+ @tab_book_shown = false
97
+
98
+ @find_dialog = nil
99
+ @replace_dialog = nil
100
+ end
101
+
102
+ def unique_filename
103
+ if @filename and !@filename.empty?
104
+ return @filename
105
+ else
106
+ return @default_tab_text.strip + @file_number.to_s
107
+ end
108
+ end
109
+
110
+ def create_ruby_editor
111
+ editor = RubyEditor.new(self)
112
+ # Add right click menu
113
+ editor.setContextMenuPolicy(Qt::CustomContextMenu)
114
+ connect(editor,
115
+ SIGNAL('customContextMenuRequested(const QPoint&)'),
116
+ self,
117
+ SLOT('context_menu(const QPoint&)'))
118
+ editor
119
+ end
120
+
121
+ def filename=(filename)
122
+ @filename = filename
123
+ determine_file_type()
124
+ end
125
+
126
+ def set_file_type(type)
127
+ @file_type = type
128
+ load_meta_data()
129
+ end
130
+
131
+ def modified
132
+ @editor.document.isModified()
133
+ end
134
+
135
+ def modified=(bool)
136
+ @editor.document.setModified(bool)
137
+ end
138
+
139
+ def undo_available(bool)
140
+ emit undoAvailable(bool)
141
+ end
142
+
143
+ def cursor_position_changed()
144
+ emit cursorPositionChanged()
145
+ display_keyword_help()
146
+ end
147
+
148
+ def key_press_callback=(callback)
149
+ @editor.keyPressCallback = callback
150
+ end
151
+
152
+ def setFocus
153
+ @editor.setFocus
154
+ end
155
+
156
+ def clear
157
+ self.set_text('')
158
+ self.filename = ''
159
+ @editor.filename = unique_filename()
160
+ self.modified = false
161
+ end
162
+
163
+ def text
164
+ @editor.toPlainText.gsub("\r", '')
165
+ end
166
+
167
+ def set_text(text, filename = '')
168
+ @editor.setPlainText(text)
169
+ @filename = filename
170
+ @editor.filename = unique_filename()
171
+ end
172
+
173
+ def set_text_from_file(filename)
174
+ load_file_into_script(filename)
175
+ @filename = filename
176
+ end
177
+
178
+ ######################################
179
+ # Implement edit functionality in the frame (cut, copy, paste, etc)
180
+ ######################################
181
+ def undo
182
+ @editor.undo
183
+ end
184
+
185
+ def redo
186
+ @editor.redo
187
+ end
188
+
189
+ def cut
190
+ @editor.cut
191
+ end
192
+
193
+ def copy
194
+ @editor.copy
195
+ end
196
+
197
+ def paste
198
+ @editor.paste
199
+ end
200
+
201
+ def select_all
202
+ @editor.select_all
203
+ end
204
+
205
+ def comment_or_uncomment_lines
206
+ @editor.comment_or_uncomment_lines
207
+ end
208
+
209
+ def cursor
210
+ @editor.textCursor
211
+ end
212
+
213
+ def line_number
214
+ @editor.line_number
215
+ end
216
+
217
+ def column_number
218
+ @editor.column_number
219
+ end
220
+
221
+ def current_line
222
+ @editor.current_line
223
+ end
224
+
225
+ def line_keyword(line = current_line())
226
+ return '' if line.nil? || line.strip.empty? || line.strip[0] == '#'
227
+ line.strip.split(" ")[0]
228
+ end
229
+
230
+ def previous_keyword(lines_back = 1)
231
+ previous_line = @editor.previous_line(lines_back)
232
+ line_keyword(previous_line)
233
+ end
234
+
235
+ def graceful_kill
236
+ # Just to avoid warning
237
+ end
238
+
239
+ protected
240
+
241
+ def determine_file_type
242
+ if @filename.empty?
243
+ @file_type = "Unknown File Type"
244
+ else
245
+ if @filename.include?('/config/system/')
246
+ @file_type = 'System Configuration'
247
+ elsif @filename.include?('/config/tools/')
248
+ if @filename.include?('cmd_tlm_server')
249
+ @file_type = "Server Configuration"
250
+ elsif @filename.include?('data_viewer')
251
+ @file_type = "Data Viewer Configuration"
252
+ elsif @filename.include?('handbook_creator')
253
+ @file_type = "Handbook Creator Configuration"
254
+ elsif @filename.include?('launcher')
255
+ @file_type = "Launcher Configuration"
256
+ elsif @filename.include?('limits_monitor')
257
+ @file_type = "Limits Monitor Configuration"
258
+ elsif @filename.include?('script_runner')
259
+ @file_type = "Script Runner Configuration"
260
+ elsif @filename.include?('table_manager')
261
+ @file_type = "Table Manager Configuration"
262
+ elsif @filename.include?('test_runner')
263
+ @file_type = "Test Runner Configuration"
264
+ elsif @filename.include?('tlm_extractor')
265
+ @file_type = "Telemetry Extractor Configuration"
266
+ elsif @filename.include?('tlm_grapher')
267
+ @file_type = "Telemetry Grapher Configuration"
268
+ elsif @filename.include?('tlm_viewer')
269
+ @file_type = "Telemetry Viewer Configuration"
270
+ end
271
+ elsif @filename.include?('/config/targets/')
272
+ if @filename.split('/')[-3] == 'targets'
273
+ if File.basename(@filename).include?('cmd_tlm_server')
274
+ @file_type = "Server Configuration"
275
+ elsif File.basename(@filename).include?('target')
276
+ @file_type = 'Target Configuration'
277
+ end
278
+ else
279
+ if @filename.include?('/cmd_tlm/')
280
+ @file_type = "Command and Telemetry Configuration"
281
+ elsif @filename.include?('/screens/')
282
+ @file_type = "Screen Definition"
283
+ end
284
+ end
285
+ end
286
+ end
287
+ emit file_type_changed # Tell ConfigEditor about the file type
288
+ load_meta_data()
289
+ display_keyword_help()
290
+ end
291
+
292
+ def load_meta_data
293
+ begin
294
+ type = ConfigEditor::CONFIGURATION_FILES[@file_type][0]
295
+ @file_meta = MetaConfigParser.load("#{type}.yaml")
296
+ rescue => error
297
+ Kernel.raise $! if error.is_a? Psych::SyntaxError
298
+ @file_meta = nil
299
+ end
300
+ display_keyword_help()
301
+ end
302
+
303
+ def display_keyword_help
304
+ unless @file_meta
305
+ build_unknown_help()
306
+ else
307
+ keyword = line_keyword()
308
+ unless keyword.empty?
309
+
310
+ previous = nil
311
+ # Some keywords are different depending on higher order keywords
312
+ # We handle those special cases here
313
+ if keyword == 'STATE'
314
+ previous = previous_keyword(1)
315
+ (2..line_number).each do |index|
316
+ break if previous.include?('COMMAND') || previous.include?('TELEMETRY') || previous.include?('TABLE')
317
+ previous = previous_keyword(index)
318
+ end
319
+ meta = find_meta_keyword(@file_meta, keyword, previous)
320
+ elsif keyword == 'TOOL'
321
+ previous = previous_keyword(1)
322
+ (2..line_number).each do |index|
323
+ break if previous.include?('MULTITOOL_START') || previous.include?('MULTITOOL_END')
324
+ previous = previous_keyword(index)
325
+ end
326
+ if previous == 'MULTITOOL_START'
327
+ meta = find_meta_keyword(@file_meta, 'MULTITOOL_START')
328
+ meta = meta['modifiers']['TOOL']
329
+ else
330
+ meta = find_meta_keyword(@file_meta, keyword)
331
+ end
332
+ else
333
+ meta = find_meta_keyword(@file_meta, keyword)
334
+ end
335
+ build_help_frame(meta)
336
+ else
337
+ keyword = previous_keyword()
338
+ if keyword.empty?
339
+ build_blank_help(@file_meta)
340
+ else
341
+ meta = find_meta_keyword(@file_meta, keyword)
342
+ @modifiers = meta['modifiers'] if meta && meta['modifiers']
343
+ if @modifiers
344
+ build_blank_help(@modifiers)
345
+ @modifiers = nil
346
+ else
347
+ build_blank_help(@file_meta)
348
+ end
349
+ end
350
+ end
351
+ end
352
+ end
353
+
354
+ def find_meta_keyword(meta, keyword, previous = nil)
355
+ result = nil
356
+ meta.each do |meta_keyword, data|
357
+ if meta_keyword == keyword
358
+ result = meta[keyword]
359
+ break
360
+ elsif data["modifiers"]
361
+ if previous
362
+ next unless meta_keyword == previous
363
+ end
364
+ @modifiers = data['modifiers']
365
+ result = find_meta_keyword(data["modifiers"], keyword)
366
+ break if result
367
+ end
368
+ end
369
+ result
370
+ end
371
+
372
+ def build_warning_widget(text)
373
+ warning = Qt::Widget.new
374
+ warning_layout = Qt::VBoxLayout.new
375
+ warning_layout.setContentsMargins(0, 0, 0, 0)
376
+ warning.setLayout(warning_layout)
377
+ warning_label = Qt::Label.new('Warning:')
378
+ warning_label.setFont(Cosmos.getFont("Arial", 12))
379
+ warning_label.setStyleSheet("color: red; font: bold")
380
+ warning_layout.addWidget(warning_label)
381
+ @warning_text = Qt::Label.new(text)
382
+ @warning_text.setFont(Cosmos.getFont("Arial", 9))
383
+ @warning_text.setWordWrap(true)
384
+ warning_layout.addWidget(@warning_text)
385
+ warning
386
+ end
387
+
388
+ def build_since_widget(text)
389
+ since = Qt::Label.new("Since: #{text}")
390
+ since.setStyleSheet("font: bold")
391
+ since.setFont(Cosmos.getFont("Arial", 9))
392
+ since.setWordWrap(true)
393
+ since
394
+ end
395
+
396
+ def build_unknown_help
397
+ @gui_widget.dispose()
398
+ @gui_widget = Qt::Widget.new
399
+ @gui_layout = Qt::VBoxLayout.new
400
+ @gui_widget.setLayout(@gui_layout)
401
+
402
+ title = Qt::Label.new("COSMOS Config File Help")
403
+ title.setFont(Cosmos.getFont("Arial", 16, Qt::Font::Bold))
404
+ @gui_layout.addWidget(title)
405
+ description = Qt::Label.new("Open a COSMOS configuration file and context "\
406
+ "specific help will appear in this pane. If the configuration file type "\
407
+ "can't be automatically detected (or is detected incorrectly) you can manually "\
408
+ "set the configuration file type with the File Type menu.")
409
+ description.setFont(Cosmos.getFont("Arial", 12))
410
+ description.setWordWrap(true)
411
+ @gui_layout.addWidget(description)
412
+ @gui_layout.addStretch
413
+ @gui_area.setWidget(@gui_widget)
414
+ end
415
+
416
+ def build_blank_help(meta)
417
+ @gui_widget.dispose()
418
+ @gui_widget = Qt::Widget.new
419
+ @gui_layout = Qt::VBoxLayout.new
420
+ @gui_widget.setLayout(@gui_layout)
421
+
422
+ info = Qt::Label.new("Available Keywords")
423
+ info.setFont(Cosmos.getFont("Arial", 16, Qt::Font::Bold))
424
+ @gui_layout.addWidget(info)
425
+
426
+ keys = meta.keys
427
+ value_widget = Qt::ComboBox.new()
428
+ value_widget.addItems(keys)
429
+ @gui_layout.addWidget(value_widget)
430
+
431
+ summary = Qt::Label.new(meta[keys[0]]['summary'])
432
+ summary.setFont(Cosmos.getFont("Arial", 12))
433
+ summary.setWordWrap(true)
434
+ @gui_layout.addWidget(summary)
435
+
436
+ description = Qt::Label.new(meta[keys[0]]['description'])
437
+ description.setFont(Cosmos.getFont("Arial", 9))
438
+ description.setWordWrap(true)
439
+ @gui_layout.addWidget(description)
440
+
441
+ warning = build_warning_widget(meta[keys[0]]['warning'])
442
+ @gui_layout.addWidget(warning)
443
+ warning.hide unless meta[keys[0]]['warning']
444
+
445
+ since = build_since_widget(meta[keys[0]]['since'])
446
+ @gui_layout.addWidget(since)
447
+ since.hide unless meta[keys[0]]['since']
448
+
449
+ value_widget.connect(SIGNAL('currentIndexChanged(const QString&)')) do |word|
450
+ if meta[word]['warning']
451
+ @warning_text.setText(meta[word]['warning'])
452
+ warning.show
453
+ else
454
+ warning.hide
455
+ end
456
+ if meta[word]['since']
457
+ since.setText("Since: #{meta[word]['since']}")
458
+ since.show
459
+ else
460
+ since.hide
461
+ end
462
+ summary.setText(meta[word]['summary'])
463
+ description.setText(meta[word]['description'])
464
+ end
465
+
466
+ add_keyword = Qt::PushButton.new("Add Keyword")
467
+ add_keyword.connect(SIGNAL('clicked()')) do
468
+ insert_word(value_widget.text, nil) # nil means prepend
469
+ Qt.execute_in_main_thread(false, 0.001, true) do
470
+ display_keyword_help() # Regenerate the help
471
+ end
472
+ end
473
+ @gui_layout.addWidget(add_keyword)
474
+
475
+ @gui_layout.addStretch
476
+ @gui_area.setWidget(@gui_widget)
477
+ end
478
+
479
+ def build_help_frame(meta)
480
+ unless meta
481
+ build_blank_help(@file_meta)
482
+ return
483
+ end
484
+ @gui_widget.dispose()
485
+ @gui_widget = Qt::Widget.new
486
+ @gui_layout = Qt::VBoxLayout.new
487
+ @gui_widget.setLayout(@gui_layout)
488
+
489
+ keyword = Qt::Label.new(line_keyword())
490
+ keyword.setFont(Cosmos.getFont("Arial", 16, Qt::Font::Bold))
491
+ @gui_layout.addWidget(keyword)
492
+
493
+ meta.each do |attribute_name, attribute_value|
494
+ if attribute_name != 'parameters'
495
+ case attribute_name
496
+ when 'summary'
497
+ summary = Qt::Label.new(attribute_value)
498
+ summary.setFont(Cosmos.getFont("Arial", 12))
499
+ summary.setWordWrap(true)
500
+ @gui_layout.addWidget(summary)
501
+ when 'description'
502
+ description = Qt::Label.new(attribute_value)
503
+ description.setFont(Cosmos.getFont("Arial", 9))
504
+ description.setWordWrap(true)
505
+ @gui_layout.addWidget(description)
506
+ when 'warning'
507
+ warning = build_warning_widget(attribute_value)
508
+ @gui_layout.addWidget(warning)
509
+ when 'since'
510
+ since = build_since_widget(attribute_value)
511
+ @gui_layout.addWidget(since)
512
+ end
513
+ else # Process parameters
514
+ next if attribute_value.empty?
515
+ line = Qt::Frame.new(@gui_widget)
516
+ line.setFrameStyle(Qt::Frame::HLine | Qt::Frame::Sunken)
517
+ @gui_layout.addWidget(line)
518
+ param = Qt::Label.new("Parameters:")
519
+ param.setFont(Cosmos.getFont("Arial", 14, Qt::Font::Bold))
520
+ @gui_layout.addWidget(param)
521
+ process_parameters(attribute_value)
522
+ end
523
+ end
524
+ @gui_layout.addStretch
525
+ @gui_area.setWidget(@gui_widget)
526
+ end
527
+
528
+ def process_parameters(parameters, parameter_offset = 1)
529
+ line_parts = current_line.scan(PARSING_REGEX)
530
+ parameters.each_with_index do |parameter, parameter_index|
531
+ parameter_index += parameter_offset
532
+ name_layout = Qt::HBoxLayout.new
533
+ description = Qt::Label.new()
534
+ value_widget = Qt::Widget.new
535
+ required = false
536
+ parameter.each do |attribute_name, attribute_value|
537
+ case attribute_name
538
+ when 'name'
539
+ param = Qt::Label.new(attribute_value)
540
+ param.setFont(Cosmos.getFont("Arial", 12, Qt::Font::Bold))
541
+ param.setWordWrap(true)
542
+ name_layout.addWidget(param)
543
+ when 'description'
544
+ description.text = attribute_value
545
+ description.setFont(Cosmos.getFont("Arial", 9))
546
+ description.setWordWrap(true)
547
+ @gui_layout.addWidget(description)
548
+ when 'required'
549
+ if attribute_value == true
550
+ required = true
551
+ required_label = Qt::Label.new("(Required)")
552
+ else
553
+ required = false
554
+ required_label = Qt::Label.new("(Optional)")
555
+ end
556
+ required_label.setFont(Cosmos.getFont("Arial", 10))
557
+ name_layout.addWidget(required_label)
558
+ @gui_layout.addLayout(name_layout)
559
+ when 'values'
560
+ current_value = line_parts[parameter_index]
561
+ if attribute_value.is_a? Hash
562
+ # If the value is a Hash then we have parameter specific
563
+ # parameters embedded in this parameter we have to parse
564
+ value_widget = Qt::ComboBox.new()
565
+ value_widget.addItem(current_value) unless attribute_value.keys.include?(current_value)
566
+ value_widget.addItems(attribute_value.keys)
567
+ value_widget.setCurrentText(current_value)
568
+ value_widget.connect(SIGNAL('currentIndexChanged(const QString&)')) do |word|
569
+ insert_word(word, parameter_index, -1)
570
+ Qt.execute_in_main_thread(false, 0.001, true) do
571
+ display_keyword_help() # Rebuild the GUI since we may have new parameters
572
+ end
573
+ end
574
+ @gui_layout.addWidget(value_widget)
575
+ if current_value && attribute_value[current_value] && attribute_value[current_value]['parameters']
576
+ process_parameters(attribute_value[current_value]['parameters'], parameter_index + 1)
577
+ end
578
+ elsif attribute_value.is_a? Array # Just a bunch of strings
579
+ value_widget = Qt::ComboBox.new()
580
+ value_widget.addItems(attribute_value)
581
+ if required && current_value.nil?
582
+ value_widget.setStyleSheet("border: 1px solid red")
583
+ end
584
+ if current_value
585
+ value_widget.addItem(current_value) unless attribute_value.include?(current_value)
586
+ value_widget.setCurrentText(current_value)
587
+ end
588
+ value_widget.connect(SIGNAL('currentIndexChanged(const QString&)')) do |word|
589
+ value_widget.setStyleSheet("")
590
+ insert_word(word, parameter_index)
591
+ end
592
+ @gui_layout.addWidget(value_widget)
593
+ else
594
+ value_widget = Qt::LineEdit.new(current_value)
595
+ if required && current_value.nil?
596
+ value_widget.setStyleSheet("border: 1px solid red")
597
+ end
598
+ value_widget.connect(SIGNAL('editingFinished()')) do
599
+ if value_widget.text =~ Regexp.new("^#{attribute_value}$")
600
+ value_widget.setStyleSheet("")
601
+ insert_word(value_widget.text, parameter_index)
602
+ else
603
+ value_widget.setStyleSheet("border: 1px solid red")
604
+ end
605
+ end
606
+ @gui_layout.addWidget(value_widget)
607
+ end
608
+ end
609
+ end
610
+ end
611
+ end
612
+
613
+ def insert_word(word, start_index, end_index = nil)
614
+ @editor.blockSignals(true)
615
+ c = @editor.textCursor
616
+ current = @editor.current_line
617
+ line_parts = current_line.scan(PARSING_REGEX)
618
+ indentation = current.length - current.lstrip.length
619
+ if start_index.nil?
620
+ c.insertText(word)
621
+ elsif start_index < line_parts.length
622
+ end_index = start_index unless end_index
623
+ line_parts[start_index..end_index] = word
624
+ c.movePosition(Qt::TextCursor::StartOfLine)
625
+ c.movePosition(Qt::TextCursor::EndOfLine, Qt::TextCursor::KeepAnchor)
626
+ c.insertText("#{' '*indentation}#{line_parts.join(' ')}")
627
+ elsif start_index >= line_parts.length || start_index == -1
628
+ c.movePosition(Qt::TextCursor::EndOfLine)
629
+ c.insertText(" #{word}")
630
+ end
631
+ @editor.blockSignals(false)
632
+ end
633
+
634
+ def initialize_variables
635
+ @active_script = @editor
636
+ @current_file = @filename
637
+ @current_filename = nil
638
+ end
639
+
640
+ def show_active_tab
641
+ @tab_book.setCurrentIndex(@call_stack.length - 1) if @tab_book_shown
642
+ end
643
+
644
+ # Right click context_menu for the file
645
+ def context_menu(point)
646
+ if @tab_book_shown
647
+ current_script = @tab_book.widget(@tab_book.currentIndex)
648
+ else
649
+ current_script = @editor
650
+ end
651
+ menu = current_script.context_menu(point)
652
+ menu.exec(current_script.mapToGlobal(point))
653
+ menu.dispose
654
+ end
655
+
656
+ def load_file_into_script(filename)
657
+ @active_script.setPlainText(File.read(filename).gsub("\r", ''))
658
+ end
659
+
660
+ def create_tabs
661
+ tab_text = @default_tab_text
662
+ tab_text = ' ' + File.basename(@filename) + ' ' unless @filename.empty?
663
+ @tab_book.addTab(@editor, tab_text)
664
+ @top_frame.insertWidget(0, @tab_book)
665
+ @tab_book_shown = true
666
+ end
667
+
668
+ def remove_tabs
669
+ @top_frame.takeAt(0) # Remove the @tab_book from the layout
670
+ @top_frame.addWidget(@editor) # Add back the editor
671
+ @editor.show
672
+ @tab_book_shown = false
673
+ end
674
+ end
675
+ end