cosmos 4.4.0 → 4.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. checksums.yaml +5 -5
  2. data/.dockerignore +2 -0
  3. data/.gitignore +1 -0
  4. data/.travis.yml +6 -6
  5. data/Dockerfile +70 -0
  6. data/Manifest.txt +37 -2
  7. data/README.md +9 -0
  8. data/Rakefile +55 -5
  9. data/appveyor.yml +18 -8
  10. data/autohotkey/config/tools/cmd_sequence/cmd_sequence.txt +2 -0
  11. data/autohotkey/lib/cmd_sequence_exporter.rb +52 -0
  12. data/autohotkey/procedures/collect.rb +2 -2
  13. data/autohotkey/procedures/collect_util.rb +1 -1
  14. data/autohotkey/procedures/script_test.rb +1 -1
  15. data/autohotkey/tools/CmdSenderAHK2 +18 -0
  16. data/autohotkey/tools/cmd_extractor.ahk +11 -9
  17. data/autohotkey/tools/cmd_sender.ahk +35 -7
  18. data/autohotkey/tools/cmd_sender2.ahk +4 -0
  19. data/autohotkey/tools/cmd_sequence.ahk +22 -9
  20. data/autohotkey/tools/config_editor.ahk +4 -4
  21. data/autohotkey/tools/data_viewer.ahk +1 -1
  22. data/autohotkey/tools/limits_monitor.ahk +1 -1
  23. data/autohotkey/tools/packet_viewer.ahk +1 -1
  24. data/autohotkey/tools/script_runner.ahk +1 -1
  25. data/autohotkey/tools/test_runner2.ahk +1 -1
  26. data/autohotkey/tools/tlm_grapher.ahk +1 -1
  27. data/autohotkey/tools/tlm_grapher3.ahk +1 -1
  28. data/autohotkey/tools/tlm_viewer.ahk +1 -1
  29. data/autohotkey/tools/tlm_viewer2.ahk +1 -1
  30. data/autohotkey/tools/tlm_viewer5.ahk +1 -1
  31. data/bin/cstol_converter +1 -1
  32. data/bin/rubysloc +73 -28
  33. data/bin/xtce_converter +1 -1
  34. data/cosmos.gemspec +2 -2
  35. data/data/config/command_modifiers.yaml +16 -1
  36. data/data/config/interface_modifiers.yaml +3 -2
  37. data/data/config/param_item_modifiers.yaml +5 -0
  38. data/data/config/system.yaml +110 -23
  39. data/data/config/telemetry_modifiers.yaml +16 -1
  40. data/data/crc.txt +416 -411
  41. data/demo/Rakefile +4 -4
  42. data/demo/config/dart/Gemfile +1 -6
  43. data/demo/config/data/crc.txt +233 -232
  44. data/demo/config/system/system.txt +17 -6
  45. data/demo/config/system/system2.txt +17 -6
  46. data/demo/config/system/system_alt_ports.txt +17 -6
  47. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +4 -4
  48. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +4 -0
  49. data/demo/config/targets/INST/cmd_tlm/inst_tlm_override.txt +12 -0
  50. data/demo/config/targets/INST/lib/sim_inst.rb +2 -2
  51. data/demo/config/targets/INST/target.txt +1 -0
  52. data/demo/config/tools/handbook_creator/default_toc.xsl +59 -59
  53. data/demo/procedures/cosmos_api_test.rb +8 -8
  54. data/ext/cosmos/ext/buffered_file/buffered_file.c +2 -2
  55. data/ext/cosmos/ext/config_parser/config_parser.c +1 -2
  56. data/ext/cosmos/ext/line_graph/line_graph.c +53 -94
  57. data/ext/cosmos/ext/platform/platform.c +56 -21
  58. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +4 -8
  59. data/ext/cosmos/ext/structure/structure.c +12 -0
  60. data/extensions/vscode/.gitignore +4 -0
  61. data/extensions/vscode/.vscode/launch.json +32 -0
  62. data/extensions/vscode/.vscode/settings.json +13 -0
  63. data/extensions/vscode/.vscode/tasks.json +79 -0
  64. data/extensions/vscode/License.txt +879 -0
  65. data/extensions/vscode/README.md +9 -0
  66. data/extensions/vscode/client/License.txt +879 -0
  67. data/extensions/vscode/client/README.md +39 -0
  68. data/extensions/vscode/client/cosmos.configuration.json +23 -0
  69. data/extensions/vscode/client/images/icon.png +0 -0
  70. data/extensions/vscode/client/package-lock.json +414 -0
  71. data/extensions/vscode/client/package.json +105 -0
  72. data/extensions/vscode/client/src/extension.ts +132 -0
  73. data/extensions/vscode/client/src/screen_preview.rb +25 -0
  74. data/extensions/vscode/client/syntaxes/cosmos.tmLanguage.json +219 -0
  75. data/extensions/vscode/client/tsconfig.json +17 -0
  76. data/extensions/vscode/package-lock.json +26 -0
  77. data/extensions/vscode/package.json +35 -0
  78. data/extensions/vscode/server/License.txt +879 -0
  79. data/extensions/vscode/server/package-lock.json +236 -0
  80. data/extensions/vscode/server/package.json +29 -0
  81. data/extensions/vscode/server/src/server.ts +59 -0
  82. data/extensions/vscode/server/tsconfig.json +16 -0
  83. data/install/Rakefile +4 -4
  84. data/install/config/dart/Gemfile +2 -7
  85. data/install/config/data/crc.txt +137 -137
  86. data/install/config/system/system.txt +17 -6
  87. data/install/config/tools/handbook_creator/default_toc.xsl +59 -59
  88. data/lib/cosmos/config/config_parser.rb +2 -10
  89. data/lib/cosmos/core_ext/class.rb +10 -0
  90. data/lib/cosmos/core_ext/time.rb +5 -3
  91. data/lib/cosmos/dart/config/boot.rb +1 -1
  92. data/lib/cosmos/dart/config/database.yml +2 -0
  93. data/lib/cosmos/dart/examples/dart_decom_client.rb +1 -1
  94. data/lib/cosmos/dart/lib/dart_common.rb +12 -5
  95. data/lib/cosmos/dart/lib/dart_constants.rb +15 -0
  96. data/lib/cosmos/dart/lib/dart_decom_query.rb +5 -6
  97. data/lib/cosmos/dart/lib/dart_decommutator.rb +64 -54
  98. data/lib/cosmos/dart/lib/dart_master_query.rb +71 -0
  99. data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +165 -134
  100. data/lib/cosmos/dart/processes/dart.rb +4 -2
  101. data/lib/cosmos/dart/processes/dart_decom_server.rb +3 -3
  102. data/lib/cosmos/dart/processes/dart_ingester.rb +38 -1
  103. data/lib/cosmos/dart/processes/dart_master.rb +44 -0
  104. data/lib/cosmos/dart/processes/dart_util.rb +115 -0
  105. data/lib/cosmos/dart/spec/dart/dart_database_cleaner_spec.rb +2 -2
  106. data/lib/cosmos/gui/qt.rb +10 -10
  107. data/lib/cosmos/gui/qt_tool.rb +17 -12
  108. data/lib/cosmos/gui/text/completion_text_edit.rb +2 -0
  109. data/lib/cosmos/gui/widgets/dart_meta_frame.rb +22 -3
  110. data/lib/cosmos/interfaces/dart_status_interface.rb +1 -1
  111. data/lib/cosmos/interfaces/linc_interface.rb +3 -3
  112. data/lib/cosmos/interfaces/protocols/burst_protocol.rb +1 -1
  113. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +1 -1
  114. data/lib/cosmos/interfaces/protocols/length_protocol.rb +5 -0
  115. data/lib/cosmos/interfaces/protocols/template_protocol.rb +3 -3
  116. data/lib/cosmos/interfaces/serial_interface.rb +7 -1
  117. data/lib/cosmos/interfaces/stream_interface.rb +1 -1
  118. data/lib/cosmos/interfaces/tcpip_server_interface.rb +16 -16
  119. data/lib/cosmos/io/io_multiplexer.rb +6 -2
  120. data/lib/cosmos/io/json_drb.rb +5 -5
  121. data/lib/cosmos/io/json_drb_object.rb +7 -2
  122. data/lib/cosmos/io/json_drb_rack.rb +25 -5
  123. data/lib/cosmos/io/json_rpc.rb +1 -1
  124. data/lib/cosmos/io/posix_serial_driver.rb +60 -22
  125. data/lib/cosmos/io/serial_driver.rb +11 -8
  126. data/lib/cosmos/io/win32_serial_driver.rb +31 -3
  127. data/lib/cosmos/packet_logs/packet_log_reader.rb +2 -2
  128. data/lib/cosmos/packets/packet.rb +9 -9
  129. data/lib/cosmos/packets/packet_config.rb +27 -9
  130. data/lib/cosmos/packets/parsers/xtce_converter.rb +10 -10
  131. data/lib/cosmos/packets/parsers/xtce_parser.rb +3 -0
  132. data/lib/cosmos/packets/structure.rb +35 -5
  133. data/lib/cosmos/packets/structure_item.rb +5 -1
  134. data/lib/cosmos/packets/telemetry.rb +7 -1
  135. data/lib/cosmos/script/api_shared.rb +18 -1
  136. data/lib/cosmos/script/extract.rb +1 -1
  137. data/lib/cosmos/script/script.rb +4 -11
  138. data/lib/cosmos/streams/serial_stream.rb +11 -6
  139. data/lib/cosmos/system/system.rb +155 -57
  140. data/lib/cosmos/tools/cmd_sender/cmd_param_table_item_delegate.rb +15 -0
  141. data/lib/cosmos/tools/cmd_sender/cmd_params.rb +382 -0
  142. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +29 -318
  143. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +14 -17
  144. data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +38 -331
  145. data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +16 -11
  146. data/lib/cosmos/tools/cmd_tlm_server/api.rb +10 -8
  147. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +2 -2
  148. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1 -0
  149. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +1 -1
  150. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +29 -26
  151. data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +1 -1
  152. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +5 -0
  153. data/lib/cosmos/tools/config_editor/config_editor.rb +34 -3
  154. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +8 -9
  155. data/lib/cosmos/tools/config_editor/system_config_dialog.rb +158 -0
  156. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +1 -1
  157. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +1 -1
  158. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +7 -4
  159. data/lib/cosmos/tools/test_runner/test.rb +6 -3
  160. data/lib/cosmos/tools/test_runner/test_runner.rb +6 -6
  161. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +3 -3
  162. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +1 -4
  163. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +20 -16
  164. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +21 -17
  165. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +18 -11
  166. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +17 -6
  167. data/lib/cosmos/tools/tlm_viewer/widgets/canvasdot_widget.rb +2 -0
  168. data/lib/cosmos/top_level.rb +1 -1
  169. data/lib/cosmos/utilities/ruby_lex_utils.rb +34 -30
  170. data/lib/cosmos/utilities/simulated_target.rb +1 -1
  171. data/lib/cosmos/version.rb +5 -5
  172. data/lib/cosmos/win32/excel.rb +23 -17
  173. data/run_gui_tests.bat +1 -0
  174. data/spec/core_ext/class_spec.rb +54 -0
  175. data/spec/core_ext/socket_spec.rb +1 -1
  176. data/spec/core_ext/time_spec.rb +4 -0
  177. data/spec/install/yaml_docs_spec.rb +26 -6
  178. data/spec/interfaces/linc_interface_spec.rb +1 -1
  179. data/spec/interfaces/protocols/length_protocol_spec.rb +39 -0
  180. data/spec/interfaces/serial_interface_spec.rb +1 -5
  181. data/spec/io/json_drb_rack_spec.rb +166 -0
  182. data/spec/io/json_drb_spec.rb +14 -0
  183. data/spec/io/json_rpc_spec.rb +4 -5
  184. data/spec/io/posix_serial_driver_spec.rb +81 -0
  185. data/spec/io/win32_serial_driver_spec.rb +33 -3
  186. data/spec/packet_logs/packet_log_reader_spec.rb +36 -37
  187. data/spec/packets/structure_spec.rb +52 -2
  188. data/spec/packets/telemetry_spec.rb +29 -1
  189. data/spec/script/extract_spec.rb +4 -1
  190. data/spec/system/system_spec.rb +111 -3
  191. data/spec/tools/cmd_tlm_server/api_spec.rb +12 -12
  192. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +2 -2
  193. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +4 -3
  194. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +2 -3
  195. data/spec/utilities/logger_spec.rb +3 -3
  196. data/spec/utilities/message_log_spec.rb +6 -3
  197. data/tasks/gemfile_stats.rake +22 -13
  198. data/test/performance/Rakefile +4 -4
  199. data/test/performance/config/data/crc.txt +67 -48
  200. metadata +52 -11
  201. data/demo/outputs/dart/logs/README.txt +0 -1
  202. data/lib/cosmos/dart/Gemfile +0 -69
@@ -14,6 +14,7 @@ Cosmos.catch_fatal_exception do
14
14
  require 'cosmos/gui/dialogs/progress_dialog'
15
15
  require 'cosmos/gui/dialogs/scroll_text_dialog'
16
16
  require 'cosmos/tools/config_editor/config_editor_frame'
17
+ require 'cosmos/tools/config_editor/system_config_dialog'
17
18
  end
18
19
 
19
20
  module Cosmos
@@ -72,6 +73,12 @@ module Cosmos
72
73
  ["tlm_viewer", "/config/tools/tlm_viewer/tlm_viewer.txt"],
73
74
  }
74
75
 
76
+ # Class instance variable to store all the parsed metadata
77
+ @meta = {}
78
+ class << self
79
+ attr_reader :meta
80
+ end
81
+
75
82
  def initialize(options)
76
83
  # All code before super is executed twice in RubyQt Based classes
77
84
  super(options) # MUST BE FIRST
@@ -86,8 +93,27 @@ module Cosmos
86
93
  initialize_central_widget()
87
94
  complete_initialize()
88
95
 
96
+ # Process all the configuration yaml files up front
97
+ # If they passed in a filename we need to wait for all meta files to be processed
98
+ wait = options.filename ? true : false
99
+ Splash.execute(self, wait) do |splash|
100
+ count = 1.0
101
+ CONFIGURATION_FILES.each do |key, vals|
102
+ type = vals[0]
103
+ next unless type
104
+ splash.message = "Processing #{type}.yaml"
105
+ splash.progress = count / CONFIGURATION_FILES.length
106
+ begin
107
+ ConfigEditor.meta[key] = @file_meta = MetaConfigParser.load("#{type}.yaml")
108
+ rescue => error
109
+ Kernel.raise $! if error.is_a? Psych::SyntaxError
110
+ end
111
+ count += 1.0
112
+ end
113
+ end
114
+
89
115
  if options.filename
90
- file_open(options.filename)
116
+ file_open(File.expand_path(options.filename))
91
117
  else
92
118
  create_tab()
93
119
  end
@@ -227,9 +253,13 @@ module Cosmos
227
253
  update_cursor()
228
254
  end
229
255
 
230
- @create_target = Qt::Action.new('&Create Target', self)
256
+ @create_target = Qt::Action.new('Create &Target', self)
231
257
  @create_target.statusTip = 'Create a new COSMOS target'
232
258
  @create_target.connect(SIGNAL('triggered()')) { create_target() }
259
+
260
+ @create_system_config = Qt::Action.new('Create New &System Config', self)
261
+ @create_system_config.statusTip = 'Create a new system configuration'
262
+ @create_system_config.connect(SIGNAL('triggered()')) { SystemConfigDialog.new(self) }
233
263
  end
234
264
 
235
265
  def initialize_menus
@@ -294,6 +324,7 @@ module Cosmos
294
324
 
295
325
  # Actions Menu
296
326
  actions_menu = menuBar.addMenu('&Actions')
327
+ actions_menu.addAction(@create_system_config)
297
328
  actions_menu.addAction(@create_target)
298
329
 
299
330
  # Help Menu
@@ -622,7 +653,7 @@ module Cosmos
622
653
  end
623
654
  File.open(File.join(target_folder, 'procedures', "#{target.downcase}_noop.rb"), 'w') do |file|
624
655
  file.puts "require 'cosmos'"
625
- file.puts "require '#{File.basename(lib_filename)}'"
656
+ file.puts "load_utility '#{File.basename(lib_filename)}'"
626
657
  file.puts "\n"
627
658
  file.puts "#{target.downcase} = #{lib_filename.filename_to_class_name}.new"
628
659
  file.puts "#{target.downcase}.noop"
@@ -28,6 +28,10 @@ module Cosmos
28
28
  def focusInEvent(event)
29
29
  emit focus_in
30
30
  end
31
+
32
+ def wheelEvent(event)
33
+ event.ignore()
34
+ end
31
35
  end
32
36
 
33
37
  class ConfigEditorFrame < Qt::Widget
@@ -290,17 +294,10 @@ module Cosmos
290
294
  end
291
295
  emit file_type_changed # Tell ConfigEditor about the file type
292
296
  load_meta_data()
293
- display_keyword_help()
294
297
  end
295
298
 
296
299
  def load_meta_data
297
- begin
298
- type = ConfigEditor::CONFIGURATION_FILES[@file_type][0]
299
- @file_meta = MetaConfigParser.load("#{type}.yaml")
300
- rescue => error
301
- Kernel.raise $! if error.is_a? Psych::SyntaxError
302
- @file_meta = nil
303
- end
300
+ @file_meta = ConfigEditor.meta[@file_type]
304
301
  display_keyword_help()
305
302
  end
306
303
 
@@ -565,7 +562,8 @@ module Cosmos
565
562
  if attribute_value.is_a? Hash
566
563
  # If the value is a Hash then we have parameter specific
567
564
  # parameters embedded in this parameter we have to parse
568
- value_widget = Qt::ComboBox.new()
565
+ value_widget = FocusComboBox.new()
566
+ value_widget.setFocusPolicy(Qt::StrongFocus)
569
567
  value_widget.addItem(current_value) unless attribute_value.keys.include?(current_value)
570
568
  value_widget.addItems(attribute_value.keys)
571
569
  value_widget.setCurrentText(current_value)
@@ -581,6 +579,7 @@ module Cosmos
581
579
  end
582
580
  elsif attribute_value.is_a? Array # Just a bunch of strings
583
581
  value_widget = FocusComboBox.new()
582
+ value_widget.setFocusPolicy(Qt::StrongFocus)
584
583
  value_widget.addItems(attribute_value)
585
584
  if required && current_value.nil?
586
585
  value_widget.setStyleSheet("border: 1px solid red")
@@ -0,0 +1,158 @@
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
+ # Creates a dialog asking to create a new system configuration.
16
+ class SystemConfigDialog < Qt::Dialog
17
+ def initialize(parent)
18
+ super(parent) # MUST BE FIRST
19
+ @parent = parent
20
+ Cosmos.load_cosmos_icon
21
+
22
+ self.window_title = 'Create System Configuration'
23
+ layout = Qt::VBoxLayout.new
24
+ self.layout = layout
25
+
26
+ description = Qt::Label.new("Creating a new COSMOS system configuration allows you to reuse "\
27
+ "an existing COSMOS configuration but include different targets and/or change configuration details.")
28
+ description.setWordWrap(true)
29
+ layout.addWidget(description)
30
+
31
+ select = Qt::Label.new("Select an existing system.txt file to base the new configuration on:")
32
+ select.setWordWrap(true)
33
+ layout.addWidget(select)
34
+ @system_combo = Qt::ComboBox.new
35
+ Dir[File.join(::Cosmos::USERPATH, 'config', 'system', '*.txt')].each do |system|
36
+ @system_combo.addItem(File.basename(system))
37
+ end
38
+ layout.addWidget(@system_combo)
39
+ layout.addSpacing(10)
40
+
41
+ name_label = Qt::Label.new("Enter a name for the new system configuration that is descriptive "\
42
+ " but relatively short. For example, 'EMI', 'SW Test', etc:")
43
+ name_label.setWordWrap(true)
44
+ layout.addWidget(name_label)
45
+ @system_name = Qt::LineEdit.new
46
+ layout.addWidget(@system_name)
47
+ layout.addSpacing(10)
48
+
49
+ info = Qt::Label.new("This action will create a new COSMOS system.txt, "\
50
+ "cmd_tlm_server.txt, launcher.txt, and Windows Batch file appended with the specified name. "\
51
+ "For example, system_emi.txt, system_sw_test.txt, launcher_emi.txt, launcher_sw_test.txt, etc.")
52
+ info.setWordWrap(true)
53
+ layout.addWidget(info)
54
+
55
+ ok_button = Qt::PushButton.new('Ok')
56
+ connect(ok_button, SIGNAL('clicked()'), self, SLOT('accept()'))
57
+ cancel_button = Qt::PushButton.new('Cancel')
58
+ connect(cancel_button, SIGNAL('clicked()'), self, SLOT('reject()'))
59
+
60
+ hlayout = Qt::HBoxLayout.new
61
+ hlayout.addWidget(ok_button, 0, Qt::AlignLeft)
62
+ hlayout.addWidget(cancel_button, 0, Qt::AlignRight)
63
+ layout.addLayout(hlayout)
64
+
65
+ resize(500, 300)
66
+
67
+ self.show()
68
+ self.raise()
69
+ if self.exec() == Qt::Dialog::Accepted
70
+ build_system_config()
71
+ end
72
+ self.dispose()
73
+ end
74
+
75
+ def build_system_config
76
+ new_suffix = @system_name.text.downcase.gsub(' ','_')
77
+ existing_system = @system_combo.text
78
+ # Look for system_xxx.txt where we find the 'xxx' as the existing suffix
79
+ if existing = existing_system.scan(/.*?_(.*)\.txt/)[0]
80
+ existing_suffix = existing[0]
81
+ else
82
+ existing_suffix = nil
83
+ end
84
+
85
+ # First determine all the new files and make sure they don't already exist
86
+ new_system = File.join(Cosmos::USERPATH, 'config', 'system', "system_#{new_suffix}.txt")
87
+ return if file_exist?(new_system)
88
+ cmd_tlm_server_path = File.join('config', 'tools', 'cmd_tlm_server')
89
+ new_cmd_tlm_server = File.join(Cosmos::USERPATH, cmd_tlm_server_path, "cmd_tlm_server_#{new_suffix}.txt")
90
+ return if file_exist?(new_cmd_tlm_server)
91
+ launcher_path = File.join('config', 'tools', 'launcher')
92
+ new_launcher = File.join(Cosmos::USERPATH, launcher_path, "launcher_#{new_suffix}.txt")
93
+ return if file_exist?(new_launcher)
94
+ new_batch = File.join(Cosmos::USERPATH, "Launcher#{@system_name.text.gsub(' ','')}.bat")
95
+ return if file_exist?(new_batch)
96
+
97
+ # Create the new system.txt. We know the existing exists so simply copy it.
98
+ File.open(new_system, 'w') do |file|
99
+ file.puts File.read(File.join(::Cosmos::USERPATH, 'config', 'system', existing_system))
100
+ end
101
+
102
+ # Create the new cmd_tlm_server config and update the TITLE
103
+ data = get_config_contents(existing_suffix, cmd_tlm_server_path, 'cmd_tlm_server')
104
+ data.sub!(/\s*TITLE.*/, "TITLE 'COSMOS Command and Telemetry Server - #{@system_name.text} Configuration'")
105
+ File.open(new_cmd_tlm_server, 'w') {|file| file.puts data }
106
+
107
+ # Create the new launcher config and update the TITLE and Server LAUNCH commands
108
+ data = get_config_contents(existing_suffix, launcher_path, 'launcher')
109
+ data.sub!(/\s*TITLE.*/, "TITLE 'Launcher - #{@system_name.text} Configuration'")
110
+ data.gsub!(/LAUNCH\s+(\w+)/, "LAUNCH \\1 --system system_#{new_suffix}.txt")
111
+ # Convert all --config to -c to make it easier to replace in the next step
112
+ data.gsub!(/(.*LAUNCH\s+CmdTlmServer.*)(--config)(.*)/, "\\1-c\\3")
113
+ data.gsub!(/(.*LAUNCH\s+CmdTlmServer.*)-c\s+(\w+)(.*)/, "\\1-c cmd_tlm_server_#{new_suffix}\\3")
114
+ File.open(new_launcher, 'w') {|file| file.puts data }
115
+
116
+ File.open(new_batch, 'w') do |file|
117
+ file.puts "call tools\\Launcher.bat --config launcher_#{new_suffix}.txt --system system_#{new_suffix}.txt"
118
+ end
119
+
120
+ @parent.file_open(new_batch)
121
+ @parent.file_open(new_launcher)
122
+ @parent.file_open(new_cmd_tlm_server)
123
+ @parent.file_open(new_system)
124
+ Qt::MessageBox.information(self, "System Config Creation Success",
125
+ "The new system configuration was successfully created.\n\n"\
126
+ "The newly created files have been opened for further customization.")
127
+ end
128
+
129
+ def file_exist?(path)
130
+ if File.exist?(path)
131
+ Qt::MessageBox.warning(self, "Config file exists!", "#{path} already exists!")
132
+ return true
133
+ else
134
+ return false
135
+ end
136
+ end
137
+
138
+ def get_config_contents(existing_suffix, base_path, file_name)
139
+ contents = ''
140
+ if existing_suffix
141
+ existing_file = File.join(Cosmos::USERPATH, base_path, "#{file_name}_#{existing_suffix}.txt")
142
+ if File.exist?(existing_file)
143
+ contents = File.read(existing_file)
144
+ end
145
+ else
146
+ # Otherwise see if there is a basic one we can copy
147
+ basic_config = File.join(Cosmos::USERPATH, base_path, "#{file_name}.txt")
148
+ if File.exist?(basic_config)
149
+ contents = File.read(basic_config)
150
+ else
151
+ # Otherwise use the install config
152
+ contents = File.read(File.join(Cosmos::PATH, 'install', base_path, "#{file_name}.txt"))
153
+ end
154
+ end
155
+ return contents
156
+ end
157
+ end
158
+ end
@@ -156,7 +156,7 @@ module Cosmos
156
156
  msg << "PDF Handbooks created successfully"
157
157
  progress_dialog.append_text(msg)
158
158
  else
159
- progress_dialog.append_text("\nPDF Handbooks could not be created.\n\nIs wkhtmltopdf in your PATH and are all existing pdfs closed?\n\nUsing version 0.11.0_rc1 of wkhtmltox is recommended which can be found at: http://download.gna.org/wkhtmltopdf/obsolete/\n\nVersion 0.12.x has shown issues with Handbook Creator's default templates.")
159
+ progress_dialog.append_text("\nPDF Handbooks could not be created.\n\nIs wkhtmltopdf in your PATH and are all existing pdfs closed?\n\nwkhtmltopdf can be found at: https://wkhtmltopdf.org/downloads.html.")
160
160
  end
161
161
  rescue => error
162
162
  progress_dialog.append_text("\n\nError processing:\n#{error.formatted}")
@@ -115,7 +115,7 @@ module Cosmos
115
115
  cover, cover_file = make_pdf_detail('cover', @pdf_cover_filename, @pdf_cover_title, target_name)
116
116
  header, header_file = make_pdf_detail('--header-spacing 3 --header-html', @pdf_header_filename, @pdf_header_title, target_name)
117
117
  footer, footer_file = make_pdf_detail('--footer-spacing 3 --footer-html', @pdf_footer_filename, @pdf_footer_title, target_name)
118
- system_call = "wkhtmltopdf -L #{@pdf_side_margin} -R #{@pdf_side_margin} -T #{@pdf_top_margin} -B #{@pdf_bottom_margin} -s Letter #{header} #{footer} #{cover} #{@pdf_toc} \"#{tmp_html_file.path}\" \"#{File.dirname(filename)}/#{File.basename(filename, '.*')}.pdf\""
118
+ system_call = "wkhtmltopdf --enable-local-file-access -L #{@pdf_side_margin} -R #{@pdf_side_margin} -T #{@pdf_top_margin} -B #{@pdf_bottom_margin} -s Letter #{header} #{footer} #{cover} #{@pdf_toc} \"#{tmp_html_file.path}\" \"#{File.dirname(filename)}/#{File.basename(filename, '.*')}.pdf\""
119
119
  status = nil
120
120
  begin
121
121
  Cosmos.set_working_dir(System.paths['HANDBOOKS']) do
@@ -594,12 +594,12 @@ module Cosmos
594
594
  "ScriptRunnerFrame.instance.pre_line_instrumentation('#{filename}', #{line_no}); "
595
595
 
596
596
  # Add the actual line
597
- instrumented_line << "__return_val = "
597
+ instrumented_line << "__return_val = begin; "
598
598
  instrumented_line << segment
599
599
  instrumented_line.chomp!
600
600
 
601
601
  # Add postline instrumentation
602
- instrumented_line << "; ScriptRunnerFrame.instance.post_line_instrumentation('#{filename}', #{line_no}); "
602
+ instrumented_line << " end; ScriptRunnerFrame.instance.post_line_instrumentation('#{filename}', #{line_no}); "
603
603
 
604
604
  # Complete begin block to catch exceptions
605
605
  unless inside_begin
@@ -973,8 +973,10 @@ module Cosmos
973
973
  if debug_text =~ /^@\S+$/ || @script_binding.local_variables.include?(debug_text.to_sym)
974
974
  debug_text = "puts #{debug_text}" # Automatically add puts to print it
975
975
  end
976
+ # Fortify: Dynamic Code Evaluation: Code Injection
976
977
  eval(debug_text, @script_binding, 'debug', 1)
977
978
  else
979
+ # Fortify: Dynamic Code Evaluation: Code Injection
978
980
  Object.class_eval(debug_text, 'debug', 1)
979
981
  end
980
982
  handle_output_io()
@@ -1489,7 +1491,7 @@ module Cosmos
1489
1491
  @@output_thread = nil
1490
1492
  end
1491
1493
 
1492
- @script.setReadOnly(false)
1494
+ @script.setReadOnly(false) unless @script.read_only
1493
1495
  @script.stop_highlight unless uncaught_exception
1494
1496
  select_tab_and_destroy_tabs_after_index(0)
1495
1497
  remove_tabs()
@@ -1722,7 +1724,8 @@ module Cosmos
1722
1724
  @active_script.setPlainText(data)
1723
1725
  end
1724
1726
  mark_breakpoints(filename)
1725
-
1727
+ @active_script.read_only = !File.writable?(filename)
1728
+ @active_script.setReadOnly(@active_script.read_only)
1726
1729
  @active_script.stop_highlight
1727
1730
  end
1728
1731
 
@@ -126,7 +126,7 @@ module Cosmos
126
126
  if result
127
127
  results << result
128
128
  yield result if block_given?
129
- raise StopScript if result.stopped
129
+ raise StopScript if (results[-1].exceptions and @@abort_on_exception) or results[-1].stopped
130
130
  end
131
131
 
132
132
  # Run each test case
@@ -141,7 +141,7 @@ module Cosmos
141
141
  if result
142
142
  results << result
143
143
  yield result if block_given?
144
- raise StopScript if result.stopped
144
+ raise StopScript if (results[-1].exceptions and @@abort_on_exception) or results[-1].stopped
145
145
  end
146
146
 
147
147
  results
@@ -176,7 +176,7 @@ module Cosmos
176
176
  end
177
177
  end
178
178
 
179
- object.send(method_name)
179
+ object.public_send(method_name)
180
180
  result.result = :PASS
181
181
 
182
182
  if defined? ScriptRunnerFrame
@@ -387,17 +387,20 @@ module Cosmos
387
387
  result = run_test_case(test_class, test_case, true)
388
388
  results << result
389
389
  yield result if block_given?
390
+ raise StopScript if (result.exceptions and test_class.abort_on_exception) or result.stopped
390
391
  when :TEST_SETUP
391
392
  result = run_test_setup(test_class, true)
392
393
  if result
393
394
  results << result
394
395
  yield result if block_given?
396
+ raise StopScript if (result.exceptions and test_class.abort_on_exception) or result.stopped
395
397
  end
396
398
  when :TEST_TEARDOWN
397
399
  result = run_test_teardown(test_class, true)
398
400
  if result
399
401
  results << result
400
402
  yield result if block_given?
403
+ raise StopScript if (result.exceptions and test_class.abort_on_exception) or result.stopped
401
404
  end
402
405
  end
403
406
  end
@@ -652,7 +652,7 @@ module Cosmos
652
652
  ScriptRunnerFrame.instance = @script_runner_frame
653
653
  build = false
654
654
  @utilities.each do |utility|
655
- if require_utility(utility)
655
+ if load_utility(utility)
656
656
  build = true
657
657
  end
658
658
  end
@@ -865,13 +865,13 @@ module Cosmos
865
865
  suite = CustomTestSuite.new
866
866
  begin
867
867
  # Remove any previously defined suite setup methods
868
- CustomTestSuite.send(:remove_method, :setup)
868
+ CustomTestSuite.public_send(:remove_method, :setup)
869
869
  rescue NameError
870
870
  # NameError is raised if no setup method was defined
871
871
  end
872
872
  begin
873
873
  # Remove any previously defined suite teardown methods
874
- CustomTestSuite.send(:remove_method, :teardown)
874
+ CustomTestSuite.public_send(:remove_method, :teardown)
875
875
  rescue NameError
876
876
  # NameError is raised if no teardown method was defined
877
877
  end
@@ -884,7 +884,7 @@ module Cosmos
884
884
  inst = @@test_suites.detect {|my_suite| my_suite.class.to_s == suite_node.text}
885
885
  # Create a lambda which will call that one setup method
886
886
  body = lambda { inst.setup }
887
- CustomTestSuite.send(:define_method, :setup, &body)
887
+ CustomTestSuite.public_send(:define_method, :setup, &body)
888
888
  end
889
889
  if test_node.text == 'teardown'
890
890
  cur_suite.teardown = true
@@ -892,7 +892,7 @@ module Cosmos
892
892
  inst = @@test_suites.detect {|my_suite| my_suite.class.to_s == suite_node.text}
893
893
  # Create a lambda which will call that one teardown method
894
894
  body = lambda { inst.teardown}
895
- CustomTestSuite.send(:define_method, :teardown, &body)
895
+ CustomTestSuite.public_send(:define_method, :teardown, &body)
896
896
  end
897
897
  end
898
898
 
@@ -999,7 +999,7 @@ module Cosmos
999
999
  when 'LOAD_UTILITY', 'REQUIRE_UTILITY'
1000
1000
  parser.verify_num_parameters(1, 1, "LOAD_UTILITY <filename>")
1001
1001
  begin
1002
- require_utility params[0]
1002
+ load_utility(params[0])
1003
1003
  @utilities << params[0]
1004
1004
  rescue Exception => err
1005
1005
  require_errors << "<b>#{params[0]}</b>:\n#{err.formatted}\n"
@@ -455,7 +455,7 @@ module Cosmos
455
455
  def self.post_options_parsed_hook(options)
456
456
  if options.input_files or options.dart
457
457
  normalize_config_options(options)
458
-
458
+
459
459
  # Process config file
460
460
  raise "Configuration File must be specified for command line processing" unless options.config_file
461
461
 
@@ -675,7 +675,7 @@ module Cosmos
675
675
  process_args = [batch_name, @input_filenames, @log_dir, output_extension, @batch_filenames, @packet_log_frame.time_start, @packet_log_frame.time_end]
676
676
  end
677
677
 
678
- @tlm_extractor_processor.send(process_method, *process_args) do |input_file_index, packet_count, file_progress|
678
+ @tlm_extractor_processor.public_send(process_method, *process_args) do |input_file_index, packet_count, file_progress|
679
679
  # Handle Cancel
680
680
  break if @cancel
681
681
 
@@ -760,7 +760,7 @@ module Cosmos
760
760
  process_args = [batch_name, @log_dir, output_extension, @batch_filenames, @packet_log_frame.time_start, @packet_log_frame.time_end, @dart_meta_frame.meta_filters]
761
761
  end
762
762
 
763
- @tlm_extractor_processor.send(process_method, *process_args) do |percentage, message|
763
+ @tlm_extractor_processor.public_send(process_method, *process_args) do |percentage, message|
764
764
  # Handle Cancel
765
765
  break if @cancel
766
766
  progress_dialog.append_text(message)
@@ -385,10 +385,7 @@ module Cosmos
385
385
 
386
386
  # Print column headings to output file
387
387
  @output_file.print "%" if @matlab_header
388
- column_names().each do |column_name|
389
- @output_file.print column_name
390
- @output_file.print @delimiter
391
- end
388
+ @output_file.print column_names.join(@delimiter)
392
389
  @output_file.puts ""
393
390
  @row_index += 1
394
391
  end
@@ -10,11 +10,11 @@
10
10
 
11
11
  require 'cosmos'
12
12
  require 'cosmos/tools/tlm_extractor/tlm_extractor_config'
13
+ require 'cosmos/dart/lib/dart_constants'
13
14
 
14
15
  module Cosmos
15
-
16
+ # Process the settings selected in the TlmExtractor to ultimately produce the output file
16
17
  class TlmExtractorProcessor
17
-
18
18
  attr_accessor :packet_log_reader
19
19
 
20
20
  def initialize
@@ -31,7 +31,7 @@ module Cosmos
31
31
  configs[-1].output_filename = File.join(output_dir, batch_name.tr(' ', '_') + '_' + filename_no_extension.tr(' ', '_') + output_extension)
32
32
  end
33
33
  process(input_filenames, configs, time_start, time_end, &block)
34
- end # def process_batch
34
+ end
35
35
 
36
36
  def process(input_filenames, configs, time_start = nil, time_end = nil)
37
37
  Cosmos.set_working_dir do
@@ -50,10 +50,10 @@ module Cosmos
50
50
  end
51
51
  yield input_file_index, packet_count, 1.0 if block_given?
52
52
  end
53
- end # Cosmos.set_working_dir
53
+ end
54
54
  ensure
55
55
  configs.each { |config| config.close_output_file }
56
- end # def process
56
+ end
57
57
 
58
58
  def process_dart_batch(batch_name, output_dir, output_extension, config_filenames, time_start = nil, time_end = nil, meta_filters = [], &block)
59
59
  configs = []
@@ -72,13 +72,13 @@ module Cosmos
72
72
  items = []
73
73
  configs.each { |config| config.mode = :dart; items.concat(config.normal_items); config.open_output_file }
74
74
  items.uniq!
75
-
75
+
76
76
  time_start = Time.utc(1970, 1, 1) unless time_start
77
77
  time_end = Time.now unless time_end
78
78
 
79
79
  results = {}
80
80
  begin
81
- server = JsonDRbObject.new(System.connect_hosts['DART_DECOM'], System.ports['DART_DECOM'])
81
+ server = JsonDRbObject.new(System.connect_hosts['DART_DECOM'], System.ports['DART_DECOM'], 1.0, Cosmos::System.x_csrf_token)
82
82
 
83
83
  index = 0
84
84
  items.each do |item_type, target_name, packet_name, item_name, value_type, dart_reduction, dart_reduced_type|
@@ -96,21 +96,27 @@ module Cosmos
96
96
  request['reduction'] = dart_reduction.to_s
97
97
  request['cmd_tlm'] = 'TLM'
98
98
  request['offset'] = 0
99
- request['limit'] = 10000
99
+ request['limit'] = DartConstants::MAX_DECOM_RESULTS
100
100
  if dart_reduction == :NONE
101
101
  request['value_type'] = value_type.to_s
102
102
  else
103
103
  request['value_type'] = value_type.to_s + "_#{dart_reduced_type}"
104
104
  end
105
105
  request['meta_filters'] = meta_filters if meta_filters.length > 0
106
- result = server.query(request)
107
- results[query_string] = result
106
+ results[query_string] = []
107
+ while true
108
+ result = server.query(request)
109
+ results[query_string].concat(result)
110
+ break if result.length < DartConstants::MAX_DECOM_RESULTS
111
+ yield(index.to_f / items.length, " Total results: #{results[query_string].length}") if block_given?
112
+ request['offset'] += DartConstants::MAX_DECOM_RESULTS
113
+ end
108
114
  index += 1
109
- yield(index.to_f / items.length, " Received #{result.length} values") if block_given?
115
+ yield(index.to_f / items.length, " Total results: #{results[query_string].length}") if block_given?
110
116
  rescue Exception => error
111
117
  yield(index.to_f / items.length, "Error querying #{query_string} : #{error.class}:#{error.message}\n#{error.backtrace.join("\n")}\n") if block_given?
112
118
  return # Bail out because something bad happened
113
- end
119
+ end
114
120
  end
115
121
 
116
122
  configs.each { |config| config.process_dart(results) }
@@ -121,7 +127,5 @@ module Cosmos
121
127
  ensure
122
128
  configs.each { |config| config.close_output_file }
123
129
  end
124
-
125
- end # class TlmExtractorProcessor
126
-
127
- end # module Cosmos
130
+ end
131
+ end
@@ -11,9 +11,9 @@
11
11
  require 'cosmos'
12
12
  require 'cosmos/gui/qt'
13
13
  require 'cosmos/io/json_drb_object'
14
+ require 'cosmos/dart/lib/dart_constants'
14
15
 
15
16
  module Cosmos
16
-
17
17
  # Thread used to gather telemetry from DART and process it using a TabbedPlotsDefinition
18
18
  class TabbedPlotsDartThread
19
19
  # Array of exceptions that occurred
@@ -45,7 +45,7 @@ module Cosmos
45
45
 
46
46
  # Execute each query
47
47
  results = {}
48
- server = JsonDRbObject.new(System.connect_hosts['DART_DECOM'], System.ports['DART_DECOM'])
48
+ server = JsonDRbObject.new(System.connect_hosts['DART_DECOM'], System.ports['DART_DECOM'], 1.0, Cosmos::System.x_csrf_token)
49
49
  time_start = Time.utc(1970, 1, 1) unless time_start
50
50
  time_end = Time.now unless time_end
51
51
  progress_dialog.set_step_progress(0) if progress_dialog
@@ -67,23 +67,29 @@ module Cosmos
67
67
  request['reduction'] = dart_reduction.to_s
68
68
  request['cmd_tlm'] = 'TLM'
69
69
  request['offset'] = 0
70
- request['limit'] = 10000
70
+ request['limit'] = DartConstants::MAX_DECOM_RESULTS
71
71
  if dart_reduction == :NONE
72
72
  request['value_type'] = value_type.to_s
73
73
  else
74
74
  request['value_type'] = value_type.to_s + "_#{dart_reduced_type}"
75
75
  end
76
76
  request['meta_filters'] = meta_filters unless meta_filters.empty?
77
- query_result = server.query(request)
78
- result = query_result
79
- if array_index
80
- result = []
81
- query_result.each do |qr|
82
- result << [qr[0][array_index], qr[1], qr[2], qr[3], qr[4]]
77
+ results[query_string] = []
78
+ while true
79
+ query_result = server.query(request)
80
+ result = query_result
81
+ if array_index
82
+ result = []
83
+ query_result.each do |qr|
84
+ result << [qr[0][array_index], qr[1], qr[2], qr[3], qr[4]]
85
+ end
83
86
  end
87
+ results[query_string].concat(result)
88
+ break if query_result.length < DartConstants::MAX_DECOM_RESULTS
89
+ progress_dialog.append_text(" Total results: #{results[query_string].length}") if progress_dialog
90
+ request['offset'] += DartConstants::MAX_DECOM_RESULTS
84
91
  end
85
- results[query_string] = result
86
- progress_dialog.append_text(" Received #{result.length} values") if progress_dialog
92
+ progress_dialog.append_text(" Total results: #{results[query_string].length}") if progress_dialog
87
93
  progress_dialog.set_step_progress((index + 1).to_f / required_queries.length) if progress_dialog
88
94
  rescue Exception => error
89
95
  @errors << error
@@ -134,7 +140,7 @@ module Cosmos
134
140
  @done = true
135
141
  end
136
142
  end
137
- end # def initialize
143
+ end
138
144
 
139
145
  # Indicates if processing is complete
140
146
  def done?
@@ -149,12 +155,10 @@ module Cosmos
149
155
  @thread = nil
150
156
  @done = true
151
157
  return true, false
152
- end # def kill
158
+ end
153
159
 
154
160
  def graceful_kill
155
161
  # Just to remove warnings
156
162
  end
157
-
158
- end # class TabbedPlotsLogfileThread
159
-
160
- end # module Cosmos
163
+ end
164
+ end