cosmos 3.8.2 → 3.8.3

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 (87) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +5 -5
  3. data/Rakefile +8 -2
  4. data/autohotkey/tools/autohotkey.rb +3 -3
  5. data/data/crc.txt +27 -27
  6. data/demo/Launcher.bat +3 -3
  7. data/demo/config/data/crc.txt +27 -27
  8. data/demo/{procedures → config/targets/INST/procedures}/checks.rb +0 -0
  9. data/demo/{procedures → config/targets/INST/procedures}/collect.rb +2 -2
  10. data/demo/{procedures → config/targets/INST/procedures}/disconnect.rb +0 -0
  11. data/demo/{procedures/clear_util.rb → config/targets/INST/procedures/utilities/clear.rb} +0 -0
  12. data/demo/{procedures/collect_util.rb → config/targets/INST/procedures/utilities/collect.rb} +2 -2
  13. data/demo/config/targets/INST/screens/commanding.txt +3 -3
  14. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +7 -7
  15. data/demo/procedures/plot_test.rb +1 -1
  16. data/demo/tools/CmdExtractor.bat +3 -3
  17. data/demo/tools/CmdSender.bat +3 -3
  18. data/demo/tools/CmdTlmServer.bat +3 -3
  19. data/demo/tools/DataViewer.bat +3 -3
  20. data/demo/tools/ExampleTarget.bat +3 -3
  21. data/demo/tools/HandbookCreator.bat +3 -3
  22. data/demo/tools/Launcher.bat +3 -3
  23. data/demo/tools/LimitsMonitor.bat +3 -3
  24. data/demo/tools/OpenGLBuilder.bat +3 -3
  25. data/demo/tools/PacketViewer.bat +3 -3
  26. data/demo/tools/Replay.bat +3 -3
  27. data/demo/tools/ScpiTarget.bat +3 -3
  28. data/demo/tools/ScriptRunner.bat +3 -3
  29. data/demo/tools/TableManager.bat +3 -3
  30. data/demo/tools/TestRunner.bat +3 -3
  31. data/demo/tools/TlmExtractor.bat +3 -3
  32. data/demo/tools/TlmGrapher.bat +3 -3
  33. data/demo/tools/TlmViewer.bat +3 -3
  34. data/demo/tools/ToolLaunch.bat +3 -6
  35. data/ext/cosmos/ext/packet/packet.c +10 -0
  36. data/install/config/data/crc.txt +17 -17
  37. data/install/tools/CmdExtractor.bat +3 -3
  38. data/install/tools/CmdSender.bat +3 -3
  39. data/install/tools/CmdTlmServer.bat +3 -3
  40. data/install/tools/DataViewer.bat +3 -3
  41. data/install/tools/HandbookCreator.bat +3 -3
  42. data/install/tools/Launcher.bat +3 -3
  43. data/install/tools/LimitsMonitor.bat +3 -3
  44. data/install/tools/OpenGLBuilder.bat +3 -3
  45. data/install/tools/PacketViewer.bat +3 -3
  46. data/install/tools/Replay.bat +3 -3
  47. data/install/tools/ScriptRunner.bat +3 -3
  48. data/install/tools/TableManager.bat +3 -3
  49. data/install/tools/TestRunner.bat +3 -3
  50. data/install/tools/TlmExtractor.bat +3 -3
  51. data/install/tools/TlmGrapher.bat +3 -3
  52. data/install/tools/TlmViewer.bat +3 -3
  53. data/install/tools/ToolLaunch.bat +3 -6
  54. data/lib/cosmos/config/config_parser.rb +10 -2
  55. data/lib/cosmos/gui/qt_tool.rb +6 -0
  56. data/lib/cosmos/gui/utilities/screenshot.rb +8 -0
  57. data/lib/cosmos/gui/utilities/script_module_gui.rb +37 -11
  58. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +3 -3
  59. data/lib/cosmos/interfaces/udp_interface.rb +9 -2
  60. data/lib/cosmos/packet_logs/packet_log_reader.rb +1 -0
  61. data/lib/cosmos/packets/commands.rb +70 -74
  62. data/lib/cosmos/packets/packet.rb +14 -7
  63. data/lib/cosmos/script/scripting.rb +9 -7
  64. data/lib/cosmos/system/system.rb +4 -0
  65. data/lib/cosmos/system/target.rb +2 -0
  66. data/lib/cosmos/tools/cmd_tlm_server/api.rb +10 -10
  67. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +2 -2
  68. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +1 -1
  69. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +5 -15
  70. data/lib/cosmos/tools/script_runner/script_runner.rb +40 -21
  71. data/lib/cosmos/tools/table_manager/table.rb +2 -2
  72. data/lib/cosmos/tools/table_manager/table_config.rb +18 -10
  73. data/lib/cosmos/tools/table_manager/table_manager.rb +61 -59
  74. data/lib/cosmos/tools/table_manager/table_manager_core.rb +24 -56
  75. data/lib/cosmos/tools/test_runner/test_runner.rb +15 -10
  76. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +9 -2
  77. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +1 -1
  78. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +9 -1
  79. data/lib/cosmos/top_level.rb +5 -5
  80. data/lib/cosmos/version.rb +4 -4
  81. data/spec/config/config_parser_spec.rb +40 -2
  82. data/spec/packet_logs/packet_log_reader_spec.rb +66 -2
  83. data/spec/packets/packet_spec.rb +27 -0
  84. data/spec/script/scripting_spec.rb +7 -2
  85. data/spec/spec_helper.rb +4 -5
  86. data/spec/system/system_spec.rb +18 -0
  87. metadata +7 -7
@@ -1,9 +1,9 @@
1
1
  @ECHO OFF
2
2
 
3
- IF NOT EXIST %~dp0ToolLaunch.bat (
4
- echo %~dp0ToolLaunch.bat does not exist
3
+ IF NOT EXIST "%~dp0ToolLaunch.bat" (
4
+ echo "%~dp0ToolLaunch.bat" does not exist
5
5
  pause
6
6
  exit /b
7
7
  )
8
8
 
9
- call %~dp0ToolLaunch.bat rubyw.exe %~n0 %*
9
+ call "%~dp0ToolLaunch.bat" rubyw.exe %~n0 %*
@@ -1,9 +1,9 @@
1
1
  @ECHO OFF
2
2
 
3
- IF NOT EXIST %~dp0ToolLaunch.bat (
4
- echo %~dp0ToolLaunch.bat does not exist
3
+ IF NOT EXIST "%~dp0ToolLaunch.bat" (
4
+ echo "%~dp0ToolLaunch.bat" does not exist
5
5
  pause
6
6
  exit /b
7
7
  )
8
8
 
9
- call %~dp0ToolLaunch.bat rubyw.exe %~n0 %*
9
+ call "%~dp0ToolLaunch.bat" rubyw.exe %~n0 %*
@@ -1,9 +1,9 @@
1
1
  @ECHO OFF
2
2
 
3
- IF NOT EXIST %~dp0ToolLaunch.bat (
4
- echo %~dp0ToolLaunch.bat does not exist
3
+ IF NOT EXIST "%~dp0ToolLaunch.bat" (
4
+ echo "%~dp0ToolLaunch.bat" does not exist
5
5
  pause
6
6
  exit /b
7
7
  )
8
8
 
9
- call %~dp0ToolLaunch.bat rubyw.exe %~n0 %*
9
+ call "%~dp0ToolLaunch.bat" rubyw.exe %~n0 %*
@@ -1,9 +1,9 @@
1
1
  @ECHO OFF
2
2
 
3
- IF NOT EXIST %~dp0ToolLaunch.bat (
4
- echo %~dp0ToolLaunch.bat does not exist
3
+ IF NOT EXIST "%~dp0ToolLaunch.bat" (
4
+ echo "%~dp0ToolLaunch.bat" does not exist
5
5
  pause
6
6
  exit /b
7
7
  )
8
8
 
9
- call %~dp0ToolLaunch.bat rubyw.exe %~n0 %*
9
+ call "%~dp0ToolLaunch.bat" rubyw.exe %~n0 %*
@@ -1,9 +1,9 @@
1
1
  @ECHO OFF
2
2
 
3
- IF NOT EXIST %~dp0ToolLaunch.bat (
4
- echo %~dp0ToolLaunch.bat does not exist
3
+ IF NOT EXIST "%~dp0ToolLaunch.bat" (
4
+ echo "%~dp0ToolLaunch.bat" does not exist
5
5
  pause
6
6
  exit /b
7
7
  )
8
8
 
9
- call %~dp0ToolLaunch.bat rubyw.exe %~n0 %*
9
+ call "%~dp0ToolLaunch.bat" rubyw.exe %~n0 %*
@@ -1,9 +1,9 @@
1
1
  @ECHO OFF
2
2
 
3
- IF NOT EXIST %~dp0ToolLaunch.bat (
4
- echo %~dp0ToolLaunch.bat does not exist
3
+ IF NOT EXIST "%~dp0ToolLaunch.bat" (
4
+ echo "%~dp0ToolLaunch.bat" does not exist
5
5
  pause
6
6
  exit /b
7
7
  )
8
8
 
9
- call %~dp0ToolLaunch.bat rubyw.exe %~n0 %*
9
+ call "%~dp0ToolLaunch.bat" rubyw.exe %~n0 %*
@@ -1,9 +1,9 @@
1
1
  @ECHO OFF
2
2
 
3
- IF NOT EXIST %~dp0ToolLaunch.bat (
4
- echo %~dp0ToolLaunch.bat does not exist
3
+ IF NOT EXIST "%~dp0ToolLaunch.bat" (
4
+ echo "%~dp0ToolLaunch.bat" does not exist
5
5
  pause
6
6
  exit /b
7
7
  )
8
8
 
9
- call %~dp0ToolLaunch.bat rubyw.exe %~n0 %*
9
+ call "%~dp0ToolLaunch.bat" rubyw.exe %~n0 %*
@@ -1,9 +1,9 @@
1
1
  @ECHO OFF
2
2
 
3
- IF NOT EXIST %~dp0ToolLaunch.bat (
4
- echo %~dp0ToolLaunch.bat does not exist
3
+ IF NOT EXIST "%~dp0ToolLaunch.bat" (
4
+ echo "%~dp0ToolLaunch.bat" does not exist
5
5
  pause
6
6
  exit /b
7
7
  )
8
8
 
9
- call %~dp0ToolLaunch.bat rubyw.exe %~n0 %*
9
+ call "%~dp0ToolLaunch.bat" rubyw.exe %~n0 %*
@@ -1,9 +1,9 @@
1
1
  @ECHO OFF
2
2
 
3
- IF NOT EXIST %~dp0ToolLaunch.bat (
4
- echo %~dp0ToolLaunch.bat does not exist
3
+ IF NOT EXIST "%~dp0ToolLaunch.bat" (
4
+ echo "%~dp0ToolLaunch.bat" does not exist
5
5
  pause
6
6
  exit /b
7
7
  )
8
8
 
9
- call %~dp0ToolLaunch.bat rubyw.exe %~n0 %*
9
+ call "%~dp0ToolLaunch.bat" rubyw.exe %~n0 %*
@@ -10,8 +10,8 @@ IF NOT EXIST !TOOL! (
10
10
  exit /b
11
11
  )
12
12
 
13
- IF NOT EXIST %~dp0tool_launch.rb (
14
- echo %~dp0tool_launch.rb does not exist
13
+ IF NOT EXIST "%~dp0tool_launch.rb" (
14
+ echo "%~dp0tool_launch.rb" does not exist
15
15
  pause
16
16
  exit /b
17
17
  )
@@ -42,11 +42,9 @@ goto loop
42
42
 
43
43
  IF EXIST "!DESTINATION_DIR!Vendor\Ruby" (
44
44
  :: Convert DESTINATION_DIR to absolute path
45
- echo !DESTINATION_DIR!
46
45
  pushd !DESTINATION_DIR!
47
46
  SET "DESTINATION_DIR=!CD!\"
48
47
  popd
49
- echo !DESTINATION_DIR!
50
48
 
51
49
  :: Set environmental variables
52
50
  for /f "delims=" %%a in ('dir "!DESTINATION_DIR!Vendor\Ruby\lib\ruby\gems\2*" /on /ad /b') do set RUBY_ABI=%%a
@@ -63,8 +61,7 @@ IF EXIST "!DESTINATION_DIR!Vendor\Ruby" (
63
61
  SET RUBYLIB=
64
62
 
65
63
  :: Run tool using Installer Ruby
66
- ECHO !GEM_HOME!
67
- ECHO Starting tool using installer ruby in !DESTINATION_DIR!
64
+ ECHO Starting tool using installer ruby in "!DESTINATION_DIR!"
68
65
  START "COSMOS" "!DESTINATION_DIR!Vendor\Ruby\bin\!RUBYEXE!" "!TOOL!" !PARAMS!
69
66
  ) else (
70
67
  :: Use System Ruby and Environment
@@ -149,8 +149,16 @@ module Cosmos
149
149
  def render(template_name, options = {})
150
150
  b = binding
151
151
  if options[:locals]
152
- options[:locals].each do |key, value|
153
- eval("#{key} = #{value}", b)
152
+ if RUBY_VERSION.split('.')[0..1].join.to_i >= 21
153
+ options[:locals].each {|key, value| b.local_variable_set(key, value) }
154
+ else
155
+ options[:locals].each do |key, value|
156
+ if value.is_a? String
157
+ b.eval("#{key} = '#{value}'")
158
+ else
159
+ b.eval("#{key} = #{value}")
160
+ end
161
+ end
154
162
  end
155
163
  end
156
164
  # Assume the file is there. If not we raise a pretty obvious error
@@ -62,6 +62,11 @@ module Cosmos
62
62
  @about_action = Qt::Action.new(Cosmos.get_icon('help.png'), tr('&About'), self)
63
63
  @about_action.statusTip = tr('About the application')
64
64
  connect(@about_action, SIGNAL('triggered()'), self, SLOT('about()'))
65
+ @documentation_action = Qt::Action.new(tr('&Documentation'), self)
66
+ @documentation_action.statusTip = tr('COSMOS Online Documentation')
67
+ self.connect(@documentation_action, SIGNAL('triggered()')) do
68
+ Qt::DesktopServices.openUrl(Qt::Url.new("http://cosmosrb.com"))
69
+ end
65
70
  end
66
71
 
67
72
  # Creates the Help menu and adds the @about_action to it. Thus this MUST be
@@ -69,6 +74,7 @@ module Cosmos
69
74
  def initialize_help_menu
70
75
  @help_menu = menuBar().addMenu(tr('&Help'))
71
76
  @help_menu.addAction(@about_action)
77
+ @help_menu.addAction(@documentation_action)
72
78
  end
73
79
 
74
80
  # This should be called after the tool has been completely laid out and all
@@ -15,6 +15,14 @@ module Cosmos
15
15
 
16
16
  # Take a screenshot of the given window
17
17
  def self.screenshot_window (window, filename)
18
+ if !Kernel.is_windows?()
19
+ # Delay for one second to allow any dialogs to fully clear first
20
+ start_time = Time.now
21
+ while ((Time.now - start_time) < 1.0)
22
+ Qt::CoreApplication.processEvents(Qt::EventLoop::AllEvents, 1000)
23
+ end
24
+ end
25
+
18
26
  # Create a Pixmap to save the screenshot into
19
27
  pixmap = Qt::Pixmap::grabWindow(window.winId())
20
28
  pixmap.save(filename)
@@ -194,8 +194,14 @@ module Cosmos
194
194
  msg = Qt::MessageBox.new(window)
195
195
  msg.setText(string)
196
196
  msg.setWindowTitle("Message Box")
197
- buttons.each {|text| msg.addButton(text, Qt::MessageBox::AcceptRole)}
198
- msg.addButton("Cancel", Qt::MessageBox::RejectRole)
197
+ # Check if the last parameter is false which means they don't want
198
+ # the Cancel button to be displayed
199
+ if buttons[-1] == false
200
+ buttons[0..-2].each {|text| msg.addButton(text, Qt::MessageBox::AcceptRole)}
201
+ else
202
+ buttons.each {|text| msg.addButton(text, Qt::MessageBox::AcceptRole)}
203
+ msg.addButton("Cancel", Qt::MessageBox::RejectRole)
204
+ end
199
205
  msg.exec()
200
206
  if msg.clickedButton.text == "Cancel"
201
207
  Logger.warn "User pressed 'Cancel' for '#{string}'"
@@ -219,9 +225,18 @@ module Cosmos
219
225
  Qt.execute_in_main_thread(true, 0.05) do
220
226
  dialog = _build_dialog(string)
221
227
 
228
+ # Check if the last parameter is false which means they don't want
229
+ # the Cancel button to be displayed
230
+ if buttons[-1] == false
231
+ cancel = false
232
+ display_buttons = buttons[0..-2]
233
+ else
234
+ cancel = true
235
+ display_buttons = buttons
236
+ end
222
237
  button_layout = Qt::VBoxLayout.new
223
238
  button_layout.setContentsMargins(11,11,11,11)
224
- buttons.each do |button_text|
239
+ display_buttons.each do |button_text|
225
240
  button = Qt::PushButton.new(button_text)
226
241
  button.connect(SIGNAL('clicked()')) do
227
242
  result = button_text
@@ -230,7 +245,7 @@ module Cosmos
230
245
  button_layout.addWidget(button)
231
246
  end
232
247
  dialog.layout.addLayout(button_layout)
233
- dialog.layout.addWidget(_build_dialog_buttons(dialog, false))
248
+ dialog.layout.addWidget(_build_dialog_buttons(dialog, false, cancel))
234
249
  result = "Cancel" unless _exec_dialog(dialog, string, result)
235
250
  end
236
251
  if result == "Cancel"
@@ -246,11 +261,20 @@ module Cosmos
246
261
  result = options[0]
247
262
  Qt.execute_in_main_thread(true, 0.05) do
248
263
  dialog = _build_dialog(string)
249
- chooser = ComboboxChooser.new(dialog, "Select:", options)
264
+ # Check if the last parameter is false which means they don't want
265
+ # the Cancel button to be displayed
266
+ if options[-1] == false
267
+ cancel = false
268
+ display_options = options[0..-2]
269
+ else
270
+ cancel = true
271
+ display_options = options
272
+ end
273
+ chooser = ComboboxChooser.new(dialog, "Select:", display_options)
250
274
  chooser.setContentsMargins(11,11,11,11)
251
275
  chooser.sel_command_callback = lambda { |value| result = value }
252
276
  dialog.layout.addWidget(chooser)
253
- dialog.layout.addWidget(_build_dialog_buttons(dialog))
277
+ dialog.layout.addWidget(_build_dialog_buttons(dialog, true, cancel))
254
278
  result = "Cancel" unless _exec_dialog(dialog, string, result)
255
279
  end
256
280
  if result == "Cancel"
@@ -287,7 +311,7 @@ module Cosmos
287
311
  result
288
312
  end
289
313
 
290
- def _build_dialog_buttons(dialog, ok_button = true)
314
+ def _build_dialog_buttons(dialog, ok_button = true, cancel_button = true)
291
315
  button_layout = Qt::HBoxLayout.new
292
316
  if ok_button
293
317
  ok = Qt::PushButton.new("Ok")
@@ -296,11 +320,13 @@ module Cosmos
296
320
  end
297
321
  button_layout.addWidget(ok)
298
322
  end
299
- cancel = Qt::PushButton.new("Cancel")
300
- cancel.connect(SIGNAL('clicked()')) do
301
- dialog.reject()
323
+ if cancel_button
324
+ cancel = Qt::PushButton.new("Cancel")
325
+ cancel.connect(SIGNAL('clicked()')) do
326
+ dialog.reject()
327
+ end
328
+ button_layout.addWidget(cancel)
302
329
  end
303
- button_layout.addWidget(cancel)
304
330
 
305
331
  widget = Qt::Widget.new
306
332
  widget.setLayout(button_layout)
@@ -59,7 +59,7 @@ module Cosmos
59
59
  end
60
60
  end
61
61
 
62
- while true
62
+ while connected?
63
63
  begin
64
64
  event = CmdTlmServer.instance.get_limits_event(@limit_id)
65
65
  if event
@@ -89,8 +89,8 @@ module Cosmos
89
89
  break
90
90
  end
91
91
  end
92
- # Block forever
93
- Thread.stop
92
+
93
+ return nil
94
94
  end
95
95
 
96
96
  # Write a packet to the CmdTlmServer to change various settings.
@@ -79,6 +79,7 @@ module Cosmos
79
79
  @ttl,
80
80
  @bind_address) if @write_dest_port
81
81
  @read_socket = UdpReadSocket.new(@read_port, @hostname, @interface_address, @bind_address) if @read_port
82
+ @thread_sleeper = nil
82
83
  end
83
84
 
84
85
  # @return [Boolean] Whether the active ports (read and/or write) have
@@ -100,6 +101,8 @@ module Cosmos
100
101
  @write_socket = nil
101
102
  Cosmos.close_socket(@read_socket)
102
103
  @read_socket = nil
104
+ @thread_sleeper.cancel if @thread_sleeper
105
+ @thread_sleeper = nil
103
106
  end
104
107
 
105
108
  # If the read port was given, the read_socket is read and the data returned
@@ -113,7 +116,7 @@ module Cosmos
113
116
  @raw_logger_pair.read_logger.write(data) if @raw_logger_pair
114
117
  rescue IOError
115
118
  # Disconnected
116
- Thread.stop
119
+ return nil
117
120
  end
118
121
 
119
122
  @bytes_read += data.length
@@ -122,7 +125,11 @@ module Cosmos
122
125
  return Packet.new(nil, nil, :BIG_ENDIAN, nil, data)
123
126
  else
124
127
  # Write only interface so stop the thread which calls read
125
- Thread.stop
128
+ @thread_sleeper = Sleeper.new
129
+ while connected?()
130
+ @thread_sleeper.sleep(1000000)
131
+ end
132
+ return nil
126
133
  end
127
134
  end
128
135
 
@@ -148,6 +148,7 @@ module Cosmos
148
148
  packet.set_received_time_fast(received_time)
149
149
  end
150
150
 
151
+ packet.received_count += 1
151
152
  packet
152
153
  rescue => err
153
154
  close()
@@ -125,7 +125,9 @@ module Cosmos
125
125
  # @param range_checking [Boolean] Whether to perform range checking on the
126
126
  # passed in parameters.
127
127
  # @param raw [Boolean] Indicates whether or not to run conversions on command parameters
128
- def build_cmd(target_name, packet_name, params = {}, range_checking = true, raw = false)
128
+ # @param check_required_params [Boolean] Indicates whether or not to check
129
+ # that the required command parameters are present
130
+ def build_cmd(target_name, packet_name, params = {}, range_checking = true, raw = false, check_required_params = true)
129
131
  target_upcase = target_name.to_s.upcase
130
132
  packet_upcase = packet_name.to_s.upcase
131
133
 
@@ -135,50 +137,11 @@ module Cosmos
135
137
  # Set time, parameters, and restore defaults
136
138
  command.received_time = Time.now
137
139
  command.given_values = params
138
- command.restore_defaults
140
+ command.restore_defaults(command.buffer(false), params.keys)
139
141
  command.raw = raw
140
142
 
141
- # Set any parameters
142
- given_item_names = []
143
- params.each do |item_name, value|
144
- item_upcase = item_name.to_s.upcase
145
- item = command.get_item(item_upcase)
146
- range_check_value = value
147
-
148
- # Convert from state to value if possible
149
- if item.states and item.states[value.to_s.upcase]
150
- range_check_value = item.states[value.to_s.upcase]
151
- end
152
-
153
- if range_checking
154
- range = item.range
155
- if range
156
- # Perform Range Check on command parameter
157
- if not range.include?(range_check_value)
158
- range_check_value = "'#{range_check_value}'" if String === range_check_value
159
- raise "Command parameter '#{target_upcase} #{packet_upcase} #{item_upcase}' = #{range_check_value} not in valid range of #{range.first} to #{range.last}"
160
- end
161
- end
162
- end
163
-
164
- # Update parameter in command
165
- if raw
166
- command.write(item_upcase, value, :RAW)
167
- else
168
- command.write(item_upcase, value, :CONVERTED)
169
- end
170
-
171
- given_item_names << item_upcase
172
- end # cmd_params.each
173
-
174
- # Script Runner could call this command with only some parameters
175
- # so make sure any required parameters were actually passed in.
176
- item_defs = command.items
177
- item_defs.each do |item_name, item_def|
178
- if item_def.required and not given_item_names.include? item_name
179
- raise "Required command parameter '#{target_upcase} #{packet_upcase} #{item_name}' not given"
180
- end
181
- end
143
+ given_item_names = set_parameters(command, params, range_checking)
144
+ check_required_params(command, given_item_names) if check_required_params
182
145
 
183
146
  return command
184
147
  end
@@ -227,39 +190,10 @@ module Cosmos
227
190
  # are set. Thus any given parameter values are first applied to the command
228
191
  # and then checked for hazardous states.
229
192
  #
230
- # @param target_name (see #packet)
231
- # @param packet_name (see #packet)
232
- # @param params (see #build_cmd)
233
- def cmd_hazardous?(target_name, packet_name, params = {})
234
- target_upcase = target_name.to_s.upcase
235
- packet_upcase = packet_name.to_s.upcase
236
-
237
- # Lookup the command
238
- command = packet(target_upcase, packet_upcase)
239
-
240
- # Overall command hazardous check
193
+ # @param command [Packet] The command to check for hazardous
194
+ def cmd_pkt_hazardous?(command)
241
195
  return [true, command.hazardous_description] if command.hazardous
242
196
 
243
- # Create a light weight copy of command
244
- command = command.clone()
245
- # Set given command parameters and restore defaults
246
- command.given_values = params
247
- command.restore_defaults()
248
-
249
- # Set any parameters
250
- params.each do |item_name, value|
251
- item_upcase = item_name.to_s.upcase
252
- item = command.get_item(item_upcase)
253
-
254
- if item.states
255
- state_value = item.states[value.to_s.upcase]
256
- value = state_value if state_value
257
- end
258
-
259
- # Update parameter in command
260
- command.write(item_upcase, value)
261
- end
262
-
263
197
  # Check each item for hazardous states
264
198
  item_defs = command.items
265
199
  item_defs.each do |item_name, item_def|
@@ -276,6 +210,20 @@ module Cosmos
276
210
  return [false, nil]
277
211
  end
278
212
 
213
+ # Returns whether the given command is hazardous. Commands are hazardous
214
+ # if they are marked hazardous overall or if any of their hardardous states
215
+ # are set. Thus any given parameter values are first applied to the command
216
+ # and then checked for hazardous states.
217
+ #
218
+ # @param target_name (see #packet)
219
+ # @param packet_name (see #packet)
220
+ # @param params (see #build_cmd)
221
+ def cmd_hazardous?(target_name, packet_name, params = {})
222
+ # Build a command without range checking, perform conversions, and don't
223
+ # check required parameters since we're not actually using the command.
224
+ cmd_pkt_hazardous?(build_cmd(target_name, packet_name, params, false, false, false))
225
+ end
226
+
279
227
  def clear_counters
280
228
  @config.commands.each do |target_name, target_packets|
281
229
  target_packets.each do |packet_name, packet|
@@ -288,6 +236,54 @@ module Cosmos
288
236
  @config.commands
289
237
  end
290
238
 
239
+ protected
240
+
241
+ def set_parameters(command, params, range_checking)
242
+ given_item_names = []
243
+ params.each do |item_name, value|
244
+ item_upcase = item_name.to_s.upcase
245
+ item = command.get_item(item_upcase)
246
+ range_check_value = value
247
+
248
+ # Convert from state to value if possible
249
+ if item.states and item.states[value.to_s.upcase]
250
+ range_check_value = item.states[value.to_s.upcase]
251
+ end
252
+
253
+ if range_checking
254
+ range = item.range
255
+ if range
256
+ # Perform Range Check on command parameter
257
+ if not range.include?(range_check_value)
258
+ range_check_value = "'#{range_check_value}'" if String === range_check_value
259
+ raise "Command parameter '#{command.target_name} #{command.packet_name} #{item_upcase}' = #{range_check_value} not in valid range of #{range.first} to #{range.last}"
260
+ end
261
+ end
262
+ end
263
+
264
+ # Update parameter in command
265
+ if command.raw
266
+ command.write(item_upcase, value, :RAW)
267
+ else
268
+ command.write(item_upcase, value, :CONVERTED)
269
+ end
270
+
271
+ given_item_names << item_upcase
272
+ end
273
+ given_item_names
274
+ end
275
+
276
+ def check_required_params(command, given_item_names)
277
+ # Script Runner could call this command with only some parameters
278
+ # so make sure any required parameters were actually passed in.
279
+ item_defs = command.items
280
+ item_defs.each do |item_name, item_def|
281
+ if item_def.required and not given_item_names.include? item_name
282
+ raise "Required command parameter '#{command.target_name} #{command.packet_name} #{item_name}' not given"
283
+ end
284
+ end
285
+ end
286
+
291
287
  end # class Commands
292
288
 
293
289
  end # module Cosmos