cosmos 3.6.2 → 3.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/data/crc.txt +19 -19
- data/lib/cosmos/core_ext/array.rb +4 -1
- data/lib/cosmos/core_ext/matrix.rb +3 -0
- data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +42 -35
- data/lib/cosmos/gui/line_graph/line_graph.rb +3 -0
- data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +3 -1
- data/lib/cosmos/gui/opengl/gl_viewer.rb +115 -127
- data/lib/cosmos/gui/utilities/script_module_gui.rb +2 -5
- data/lib/cosmos/interfaces/linc_interface.rb +207 -147
- data/lib/cosmos/io/win32_serial_driver.rb +1 -1
- data/lib/cosmos/script/scripting.rb +2 -2
- data/lib/cosmos/script/tools.rb +8 -1
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +12 -17
- data/lib/cosmos/tools/launcher/launcher_config.rb +1 -1
- data/lib/cosmos/tools/script_runner/script_runner.rb +9 -4
- data/lib/cosmos/tools/table_manager/table_manager.rb +3 -1
- data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +11 -1
- data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +1 -0
- data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +8 -0
- data/lib/cosmos/version.rb +4 -4
- data/spec/core_ext/array_spec.rb +62 -1
- data/spec/core_ext/matrix_spec.rb +61 -0
- data/spec/interfaces/linc_interface_spec.rb +0 -9
- data/spec/script/script_spec.rb +7 -3
- data/spec/script/scripting_spec.rb +2 -2
- data/spec/script/tools_spec.rb +2 -0
- data/spec/spec_helper.rb +10 -1
- data/spec/tools/launcher/launcher_config_spec.rb +21 -11
- data/spec/top_level/top_level_spec.rb +1 -1
- metadata +2 -2
@@ -53,12 +53,9 @@ class Qt::MessageBox
|
|
53
53
|
end
|
54
54
|
|
55
55
|
class Qt::InputDialog
|
56
|
-
def self.getText(
|
57
|
-
mode = Qt::LineEdit::Normal,
|
58
|
-
text = '', ok = 0, flags = 0,
|
59
|
-
inputMethodHints = Qt::ImhNone)
|
56
|
+
def self.getText(*args)
|
60
57
|
Cosmos.play_wav_file(Cosmos.data_path('input.wav')) if Cosmos::System.sound
|
61
|
-
super(
|
58
|
+
super(*args)
|
62
59
|
end
|
63
60
|
end
|
64
61
|
|
@@ -15,10 +15,10 @@ module Cosmos
|
|
15
15
|
|
16
16
|
# Interface for connecting to Ball Aerospace LINC Labview targets
|
17
17
|
class LincInterface < TcpipClientInterface
|
18
|
-
# The maximum number of
|
18
|
+
# The maximum number of asynchronous commands we can wait for at a time.
|
19
19
|
# We don't ever expect to get close to this but we need to limit it
|
20
20
|
# to ensure the Array doesn't grow out of control.
|
21
|
-
MAX_CONCURRENT_HANDSHAKES =
|
21
|
+
MAX_CONCURRENT_HANDSHAKES = 1000
|
22
22
|
|
23
23
|
def initialize(
|
24
24
|
hostname,
|
@@ -47,9 +47,8 @@ module Cosmos
|
|
47
47
|
|
48
48
|
# Other instance variables
|
49
49
|
@ignored_error_codes = []
|
50
|
-
@
|
50
|
+
@handshake_cmds = []
|
51
51
|
@handshakes_mutex = Mutex.new
|
52
|
-
@handshakes_resource = ConditionVariable.new
|
53
52
|
|
54
53
|
# Call this once now because the first time is slow
|
55
54
|
UUIDTools::UUID.random_create.raw
|
@@ -83,7 +82,7 @@ module Cosmos
|
|
83
82
|
end
|
84
83
|
|
85
84
|
@handshakes_mutex.synchronize do
|
86
|
-
@
|
85
|
+
@handshake_cmds = []
|
87
86
|
end
|
88
87
|
|
89
88
|
# Actually connect
|
@@ -91,16 +90,41 @@ module Cosmos
|
|
91
90
|
end
|
92
91
|
|
93
92
|
def write(packet)
|
94
|
-
|
95
|
-
|
96
|
-
######################################
|
93
|
+
return if linc_interface_command(packet)
|
94
|
+
raise "Interface not connected" unless connected?()
|
97
95
|
|
96
|
+
# Add a GUID to the GUID field if its defined
|
97
|
+
# A GUID means it's an asychronous packet type.
|
98
|
+
if @fieldname_guid
|
99
|
+
guid = get_guid(packet)
|
100
|
+
else
|
101
|
+
# If @fieldname_guid is not defined (syncronous) we don't care what the
|
102
|
+
# GUID is because we're not trying to match it up with anything.
|
103
|
+
# As soon as we get a response we free the command.
|
104
|
+
guid = 0
|
105
|
+
end
|
106
|
+
|
107
|
+
# Fix the length field to handle the cases where a variable length packet
|
108
|
+
# is defined. COSMOS does not do this automatically.
|
109
|
+
update_length_field(packet) if @fieldname_cmd_length
|
110
|
+
|
111
|
+
# Always take the mutex (even if we aren't handshaking)
|
112
|
+
# We do not want any incoming telemetry to be missed because
|
113
|
+
# it could be the handshake to this command.
|
114
|
+
@handshakes_mutex.synchronize do
|
115
|
+
super(packet) # Send the command
|
116
|
+
wait_for_response(packet, guid) if @handshake_enabled
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def linc_interface_command(packet)
|
121
|
+
result = false
|
98
122
|
if @error_ignore_command and @error_ignore_command.identify?(packet.buffer(false))
|
99
123
|
linc_cmd = @error_ignore_command.clone
|
100
124
|
linc_cmd.buffer = packet.buffer
|
101
125
|
code = linc_cmd.read('CODE')
|
102
126
|
@ignored_error_codes << code unless @ignored_error_codes.include? code
|
103
|
-
|
127
|
+
result = true
|
104
128
|
end
|
105
129
|
|
106
130
|
if @error_handle_command and @error_handle_command.identify?(packet.buffer(false))
|
@@ -108,125 +132,100 @@ module Cosmos
|
|
108
132
|
linc_cmd.buffer = packet.buffer
|
109
133
|
code = linc_cmd.read('CODE')
|
110
134
|
@ignored_error_codes.delete(code) if @ignored_error_codes.include? code
|
111
|
-
|
135
|
+
result = true
|
112
136
|
end
|
113
137
|
|
114
138
|
if @handshake_enable_command and @handshake_enable_command.identify?(packet.buffer(false))
|
115
139
|
@handshake_enabled = true
|
116
|
-
|
140
|
+
result = true
|
117
141
|
end
|
118
142
|
|
119
143
|
if @handshake_disable_command and @handshake_disable_command.identify?(packet.buffer(false))
|
120
144
|
@handshake_enabled = false
|
121
|
-
|
145
|
+
result = true
|
122
146
|
end
|
147
|
+
return result
|
148
|
+
end
|
123
149
|
|
124
|
-
|
125
|
-
if
|
126
|
-
#
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
end
|
136
|
-
end
|
150
|
+
def get_guid(packet)
|
151
|
+
if not packet.read(@fieldname_guid) =~ /[\x01-\xFF]/
|
152
|
+
# The GUID has not been set already (it has all \x00 values), so make a new one.
|
153
|
+
# This enables a router GUI to make the GUIDs so it can process handshakes too.
|
154
|
+
guid = UUIDTools::UUID.random_create.raw
|
155
|
+
packet.write(@fieldname_guid, guid, :RAW)
|
156
|
+
else
|
157
|
+
guid = packet.read(@fieldname_guid)
|
158
|
+
end
|
159
|
+
return guid
|
160
|
+
end
|
137
161
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
162
|
+
def update_length_field(packet)
|
163
|
+
length = packet.length - @length_value_offset
|
164
|
+
packet.write(@fieldname_cmd_length, length, :RAW)
|
165
|
+
end
|
166
|
+
|
167
|
+
def wait_for_response(packet, guid)
|
168
|
+
# Check the number of commands waiting for handshakes. This is just for sanity
|
169
|
+
# If the number of commands waiting for handshakes is very large then it can't be real
|
170
|
+
# So raise an error. Something has gone horribly wrong.
|
171
|
+
if @handshake_cmds.length > MAX_CONCURRENT_HANDSHAKES
|
172
|
+
len = @handshake_cmds.length
|
173
|
+
@handshake_cmds = []
|
174
|
+
raise "The number of commands waiting for handshakes to #{len}. Clearing all commands!"
|
175
|
+
end
|
176
|
+
|
177
|
+
# Create a handshake command object and add it to the list of commands waiting
|
178
|
+
handshake_cmd = LincHandshakeCommand.new(@handshakes_mutex, guid)
|
179
|
+
@handshake_cmds.push(handshake_cmd)
|
180
|
+
|
181
|
+
# wait for that handshake. This releases the mutex so that the telemetry and other commands can start running again.
|
182
|
+
timed_out = handshake_cmd.wait_for_handshake(@response_timeout)
|
183
|
+
# We now have the mutex again. This interface is blocked for the rest of the command handling,
|
184
|
+
# which should be quick because it's just checking variables and logging.
|
185
|
+
# We want to hold the mutex during that so that the commands get logged in order of handshake from here.
|
186
|
+
|
187
|
+
if timed_out
|
188
|
+
# Clean this command out of the array of items that require handshakes.
|
189
|
+
@handshake_cmds.delete_if {|hsc| hsc == handshake_cmd}
|
190
|
+
raise "Timeout waiting for handshake from #{System.commands.format(packet, System.targets[@target_names[0]].ignored_parameters)}"
|
191
|
+
end
|
144
192
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
begin
|
154
|
-
my_handshake = nil
|
155
|
-
|
156
|
-
# The time after which we will give up waiting for a response
|
157
|
-
deadline = Time.now + @response_timeout
|
158
|
-
|
159
|
-
# Loop until we find our response
|
160
|
-
while my_handshake.nil?
|
161
|
-
# How long should we wait in this loop. We could get notified
|
162
|
-
# multiple times for handshakes that aren't ours so we need to
|
163
|
-
# recalculate the wait time each time.
|
164
|
-
to_wait = deadline - Time.now
|
165
|
-
|
166
|
-
# If there is no more time to wait then this is a timeout so we break
|
167
|
-
# out of the loop looking for handshakes
|
168
|
-
if to_wait <= 0
|
169
|
-
raise "Timeout waiting for handshake from #{System.commands.format(packet, System.targets[@target_names[0]].ignored_parameters)}"
|
170
|
-
end
|
171
|
-
|
172
|
-
# Wait until the telemetry side signals that there is a new handshake to check or timeout.
|
173
|
-
# This releases the mutex until the telemetry side signals us
|
174
|
-
@handshakes_resource.wait(@handshakes_mutex, to_wait)
|
175
|
-
# We now have the mutex again
|
176
|
-
|
177
|
-
# Loop if we have timed out so we can handle the timeout with common code
|
178
|
-
next if (deadline - Time.now) <= 0
|
179
|
-
|
180
|
-
if @fieldname_guid
|
181
|
-
# A GUID means it's an asychronous packet type.
|
182
|
-
# So look at the list of incoming handshakes and pick off (deleting)
|
183
|
-
# the handshake from the list if it's for this command.
|
184
|
-
#
|
185
|
-
# The mutex is required because the telemetry task
|
186
|
-
# could enqueue a response between the index lookup and the slice
|
187
|
-
# function which would remove the wrong response. FAIL!
|
188
|
-
my_handshake_index = @handshakes.index {|hs| hs.get_cmd_guid(@fieldname_guid) == my_guid}
|
189
|
-
my_handshake = @handshakes.slice!(my_handshake_index) if my_handshake_index
|
190
|
-
else
|
191
|
-
# This is the synchronous version
|
192
|
-
my_handshake = @handshakes.pop
|
193
|
-
end
|
194
|
-
end # while my_handshake.nil?
|
195
|
-
|
196
|
-
# Handle handshake warnings and errors
|
197
|
-
if my_handshake.handshake.read('STATUS') == "OK" and my_handshake.handshake.read('CODE') != 0
|
198
|
-
unless @ignored_error_codes.include? my_handshake.handshake.read('CODE')
|
199
|
-
Logger.warn "Warning sending command (#{my_handshake.handshake.read('CODE')}): #{my_handshake.error_source}"
|
200
|
-
end
|
201
|
-
elsif my_handshake.handshake.read('STATUS') == "ERROR"
|
202
|
-
unless @ignored_error_codes.include? my_handshake.handshake.read('CODE')
|
203
|
-
raise "Error sending command (#{my_handshake.handshake.read('CODE')}): #{my_handshake.error_source}"
|
204
|
-
end
|
205
|
-
end
|
206
|
-
rescue Exception => err
|
207
|
-
# If anything goes wrong after successfully writing the packet to the LINC target
|
208
|
-
# ensure that the packet gets updated in the CVT and logged to the packet log writer.
|
209
|
-
# COSMOS normally only does this if write returns successfully
|
210
|
-
if packet.identified?
|
211
|
-
command = System.commands.packet(packet.target_name, packet.packet_name)
|
212
|
-
else
|
213
|
-
command = System.commands.packet('UNKNOWN', 'UNKNOWN')
|
214
|
-
end
|
215
|
-
command.buffer = packet.buffer
|
216
|
-
|
217
|
-
@packet_log_writer_pairs.each do |packet_log_writer_pair|
|
218
|
-
packet_log_writer_pair.cmd_log_writer.write(packet)
|
219
|
-
end
|
220
|
-
|
221
|
-
raise err
|
222
|
-
end
|
223
|
-
end # if @handshake_enabled
|
224
|
-
end # @handshakes_mutex.synchronize
|
193
|
+
process_handshake_results(handshake_cmd)
|
194
|
+
|
195
|
+
rescue Exception => err
|
196
|
+
# If anything goes wrong after successfully writing the packet to the LINC target
|
197
|
+
# ensure that the packet gets updated in the CVT and logged to the packet log writer.
|
198
|
+
# COSMOS normally only does this if write returns successfully
|
199
|
+
if packet.identified?
|
200
|
+
command = System.commands.packet(packet.target_name, packet.packet_name)
|
225
201
|
else
|
226
|
-
|
227
|
-
end
|
202
|
+
command = System.commands.packet('UNKNOWN', 'UNKNOWN')
|
203
|
+
end
|
204
|
+
command.buffer = packet.buffer
|
205
|
+
|
206
|
+
@packet_log_writer_pairs.each do |packet_log_writer_pair|
|
207
|
+
packet_log_writer_pair.cmd_log_writer.write(packet)
|
208
|
+
end
|
228
209
|
|
229
|
-
|
210
|
+
raise err
|
211
|
+
end
|
212
|
+
|
213
|
+
def process_handshake_results(handshake_cmd)
|
214
|
+
status = handshake_cmd.handshake.handshake.read('STATUS')
|
215
|
+
code = handshake_cmd.handshake.handshake.read('CODE')
|
216
|
+
source = handshake_cmd.handshake.error_source
|
217
|
+
|
218
|
+
# Handle handshake warnings and errors
|
219
|
+
if status == "OK" and code != 0
|
220
|
+
unless @ignored_error_codes.include? code
|
221
|
+
Logger.warn "Warning sending command (#{code}): #{source}"
|
222
|
+
end
|
223
|
+
elsif status == "ERROR"
|
224
|
+
unless @ignored_error_codes.include? code
|
225
|
+
raise "Error sending command (#{code}): #{source}"
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
230
229
|
|
231
230
|
def read
|
232
231
|
packet = super()
|
@@ -234,40 +233,13 @@ module Cosmos
|
|
234
233
|
if @handshake_packet.identify?(packet.buffer(false))
|
235
234
|
handshake_packet = @handshake_packet.clone
|
236
235
|
handshake_packet.buffer = packet.buffer
|
237
|
-
|
236
|
+
linc_handshake = LincHandshake.new(handshake_packet, @target_names[0])
|
238
237
|
|
238
|
+
# Check for a local handshake
|
239
239
|
if handshake_packet.read('origin') == "LCL"
|
240
|
-
|
241
|
-
command = System.commands.packet(my_handshake.identified_command.target_name, my_handshake.identified_command.packet_name)
|
242
|
-
command.received_time = my_handshake.identified_command.received_time
|
243
|
-
command.buffer = my_handshake.identified_command.buffer
|
244
|
-
command.received_count += 1
|
245
|
-
|
246
|
-
# Put a log of the command onto the server for the user to see
|
247
|
-
Logger.info("External Command: " + System.commands.format(my_handshake.identified_command, System.targets[@target_names[0]].ignored_parameters))
|
248
|
-
|
249
|
-
# Log the command to the command log(s)
|
250
|
-
@packet_log_writer_pairs.each do |packet_log_writer_pair|
|
251
|
-
packet_log_writer_pair.cmd_log_writer.write(my_handshake.identified_command)
|
252
|
-
end
|
240
|
+
handle_local_handshake(linc_handshake)
|
253
241
|
else
|
254
|
-
|
255
|
-
# Add to the array of handshake packet responses (only if handshakes are enabled).
|
256
|
-
# The mutex is required by the command task due to the way it
|
257
|
-
# first looks up the handshake before removing it.
|
258
|
-
if @handshake_enabled
|
259
|
-
@handshakes_mutex.synchronize do
|
260
|
-
@handshakes.push(my_handshake)
|
261
|
-
if @handshakes.length > MAX_CONCURRENT_HANDSHAKES
|
262
|
-
len = @handshakes.length
|
263
|
-
@handshakes = []
|
264
|
-
raise "The handshakes response array has grown to #{len}. Clearing all handshakes!"
|
265
|
-
end
|
266
|
-
# Tell all waiting commands to take a look
|
267
|
-
@handshakes_resource.broadcast
|
268
|
-
end # @handshakes_mutex.synchronize
|
269
|
-
end # if @handshake_enabled
|
270
|
-
|
242
|
+
handle_remote_handshake(linc_handshake) if @handshake_enabled
|
271
243
|
end # if handshake_packet.read('origin') == "LCL"
|
272
244
|
end # @handshake_packet.identify?(packet.buffer(false))
|
273
245
|
end # if packet
|
@@ -275,9 +247,98 @@ module Cosmos
|
|
275
247
|
return packet
|
276
248
|
end
|
277
249
|
|
250
|
+
def handle_local_handshake(linc_handshake)
|
251
|
+
# Update the current value table for this command
|
252
|
+
command = System.commands.packet(linc_handshake.identified_command.target_name, linc_handshake.identified_command.packet_name)
|
253
|
+
command.received_time = linc_handshake.identified_command.received_time
|
254
|
+
command.buffer = linc_handshake.identified_command.buffer
|
255
|
+
command.received_count += 1
|
256
|
+
|
257
|
+
# Put a log of the command onto the server for the user to see
|
258
|
+
Logger.info("External Command: " + System.commands.format(linc_handshake.identified_command, System.targets[@target_names[0]].ignored_parameters))
|
259
|
+
|
260
|
+
# Log the command to the command log(s)
|
261
|
+
@packet_log_writer_pairs.each do |packet_log_writer_pair|
|
262
|
+
packet_log_writer_pair.cmd_log_writer.write(linc_handshake.identified_command)
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
def handle_remote_handshake(linc_handshake)
|
267
|
+
# This is a remote packet (sent from here).
|
268
|
+
# Add to the array of handshake packet responses
|
269
|
+
# The mutex is required by the command task due to the way it
|
270
|
+
# first looks up the handshake before removing it.
|
271
|
+
@handshakes_mutex.synchronize do
|
272
|
+
if @fieldname_guid
|
273
|
+
# A GUID means it's an asychronous packet type.
|
274
|
+
# So look at the list of incoming handshakes and pick off (deleting)
|
275
|
+
# the handshake from the list if it's for this command.
|
276
|
+
#
|
277
|
+
# The mutex is required because the telemetry task
|
278
|
+
# could enqueue a response between the index lookup and the slice
|
279
|
+
# function which would remove the wrong response. FAIL!
|
280
|
+
|
281
|
+
# Loop through all waiting commands to see if this handshake belongs to them
|
282
|
+
this_handshake_guid = linc_handshake.get_cmd_guid(@fieldname_guid)
|
283
|
+
handshake_cmd_index = @handshake_cmds.index {|hsc| hsc.get_cmd_guid == this_handshake_guid}
|
284
|
+
|
285
|
+
# If command was waiting (ie the loop above found one), then remove it from waiters and signal it
|
286
|
+
if handshake_cmd_index
|
287
|
+
handshake_cmd = @handshake_cmds.slice!(handshake_cmd_index)
|
288
|
+
handshake_cmd.got_your_handshake(linc_handshake)
|
289
|
+
else
|
290
|
+
# No command match found! Either it gave up and timed out or this wasn't originated from here.
|
291
|
+
# Ignore this typically. This case here for clarity.
|
292
|
+
end
|
293
|
+
|
294
|
+
else
|
295
|
+
# Synchronous version: just pop the array (pull the command off) and send it the handshake
|
296
|
+
handshake_cmd = @handshakes_cmds.pop
|
297
|
+
handshake_cmd.got_your_handshake(linc_handshake)
|
298
|
+
end # of handshaking type check
|
299
|
+
end # @handshakes_mutex.synchronize
|
300
|
+
end
|
301
|
+
|
278
302
|
end # class LincInterface
|
279
303
|
|
280
|
-
# The
|
304
|
+
# The LincHandshakeCommand class is used only by the LincInterface.
|
305
|
+
# It is the command with other required items that is passed to the telemetry
|
306
|
+
# thread so it can match it with the handshake.
|
307
|
+
class LincHandshakeCommand
|
308
|
+
attr_accessor :handshake
|
309
|
+
|
310
|
+
def initialize(handshakes_mutex,cmd_guid)
|
311
|
+
@cmd_guid = cmd_guid
|
312
|
+
@handshakes_mutex = handshakes_mutex
|
313
|
+
@resource = ConditionVariable.new
|
314
|
+
@handshake = nil
|
315
|
+
end
|
316
|
+
|
317
|
+
def wait_for_handshake(response_timeout)
|
318
|
+
timed_out = false
|
319
|
+
|
320
|
+
@resource.wait(@handshakes_mutex,response_timeout)
|
321
|
+
if @handshake
|
322
|
+
timed_out = false
|
323
|
+
else
|
324
|
+
Logger.warn "No handshake - must be timeout."
|
325
|
+
timed_out = true
|
326
|
+
end
|
327
|
+
|
328
|
+
return timed_out
|
329
|
+
end
|
330
|
+
|
331
|
+
def got_your_handshake(handshake)
|
332
|
+
@handshake = handshake
|
333
|
+
@resource.signal
|
334
|
+
end
|
335
|
+
|
336
|
+
def get_cmd_guid
|
337
|
+
return @cmd_guid
|
338
|
+
end
|
339
|
+
end # class LincHandshakeCommand
|
340
|
+
|
341
|
+
# The LincHandshake class is used only by the LincInterface. It processes the handshake and
|
281
342
|
# helps with finding the information regarding the internal command.
|
282
343
|
class LincHandshake
|
283
344
|
attr_accessor :handshake
|
@@ -354,7 +415,6 @@ module Cosmos
|
|
354
415
|
def get_cmd_guid(fieldname_guid)
|
355
416
|
return @identified_command.read(fieldname_guid)
|
356
417
|
end
|
357
|
-
|
358
418
|
end # class LincHandshake
|
359
419
|
|
360
420
|
end # module Cosmos
|
@@ -29,7 +29,7 @@ module Cosmos
|
|
29
29
|
# Verify Parameters
|
30
30
|
port_name = '\\\\.\\' + port_name if port_name =~ /^COM[0-9]{2,3}$/
|
31
31
|
|
32
|
-
raise(ArgumentError, "Invalid baud rate: #{baud_rate}") unless Win32::BAUD_RATES
|
32
|
+
raise(ArgumentError, "Invalid baud rate: #{baud_rate}") unless baud_rate.between?(Win32::BAUD_RATES[0], Win32::BAUD_RATES[-1])
|
33
33
|
|
34
34
|
raise(ArgumentError, "Invalid parity: #{parity}") if parity and !SerialDriver::VALID_PARITY.include?(parity)
|
35
35
|
case parity
|