aca-device-modules 1.0.4 → 1.0.5
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.
- checksums.yaml +4 -4
- data/lib/aca-device-modules/version.rb +1 -1
- data/modules/aca/lifter_logic_auto.rb +71 -0
- data/modules/aca/lifter_logic_manual.rb +105 -0
- data/modules/aca/pc_control.rb +111 -111
- data/modules/axis/camera/vapix.rb +10 -3
- data/modules/biamp/nexia.rb +149 -128
- data/modules/bss/blu100.rb +8 -8
- data/modules/chiyu/cyt.rb +6 -1
- data/modules/clipsal/c_bus.rb +233 -235
- data/modules/epson/projector/esc_vp21.rb +232 -232
- data/modules/extron/mixer/dmp44.rb +174 -174
- data/modules/extron/mixer/dmp64.rb +192 -181
- data/modules/extron/switcher/dxp.rb +210 -210
- data/modules/global_cache/gc100.rb +6 -2
- data/modules/kramer/switcher/protocol3000.rb +209 -209
- data/modules/kramer/switcher/vs_hdmi.rb +111 -110
- data/modules/nec/display/all.rb +440 -443
- data/modules/nec/projector/np_series.rb +609 -597
- data/modules/panasonic/camera/he50.rb +1 -1
- data/modules/panasonic/projector/tcp.rb +239 -234
- data/modules/philips/dynalite.rb +196 -0
- data/modules/samsung/displays/md_series.rb +34 -16
- data/modules/screen_technics/connect.rb +53 -53
- data/modules/sony/display/id_talk.rb +275 -275
- data/modules/sony/projector/pj_talk.rb +257 -257
- data/modules/vaddio/camera/clear_view_ptz_telnet.rb +7 -3
- metadata +6 -3
@@ -32,218 +32,218 @@ module Extron::Switcher; end
|
|
32
32
|
|
33
33
|
|
34
34
|
class Extron::Switcher::Dxp
|
35
|
-
|
35
|
+
include ::Orchestrator::Constants
|
36
36
|
include ::Orchestrator::Transcoder
|
37
37
|
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
39
|
+
def on_load
|
40
|
+
#
|
41
|
+
# Setup constants
|
42
|
+
#
|
43
|
+
defaults({
|
44
|
+
:wait => false
|
45
|
+
})
|
46
|
+
config({
|
47
|
+
:clear_queue_on_disconnect => true # Clear the queue as we may need to send login
|
48
|
+
})
|
49
|
+
end
|
50
|
+
|
51
|
+
def connected
|
52
|
+
@polling_timer = schedule.every('2m') do
|
53
|
+
logger.debug "-- Extron Maintaining Connection"
|
54
|
+
send('Q', :priority => 0) # Low priority poll to maintain connection
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def disconnected
|
59
|
+
#
|
60
|
+
# Disconnected may be called without calling connected
|
61
|
+
# Hence the check if timer is nil here
|
62
|
+
#
|
63
|
+
@polling_timer.cancel unless @polling_timer.nil?
|
64
|
+
@polling_timer = nil
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
def direct(string)
|
69
|
+
send(string, :wait => false)
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
#
|
74
|
+
# No need to wait as commands can be chained
|
75
|
+
#
|
76
|
+
def switch(map)
|
77
|
+
map.each do |input, outputs|
|
78
|
+
input = input.to_s if input.is_a?(Symbol)
|
79
|
+
input = input.to_i if input.is_a?(String)
|
80
|
+
|
81
|
+
outputs = [outputs] unless outputs.is_a?(Array)
|
82
|
+
command = ''
|
83
|
+
outputs.each do |output|
|
84
|
+
command += "#{input}*#{output}!"
|
85
|
+
end
|
86
|
+
send(command)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def switch_video(map)
|
91
|
+
map.each do |input, outputs|
|
92
|
+
input = input.to_s if input.is_a?(Symbol)
|
93
|
+
input = input.to_i if input.is_a?(String)
|
94
|
+
|
95
|
+
|
96
|
+
outputs = [outputs] unless outputs.is_a?(Array)
|
97
|
+
command = ''
|
98
|
+
outputs.each do |output|
|
99
|
+
command += "#{input}*#{output}%"
|
100
|
+
end
|
101
|
+
send(command)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def switch_audio(map)
|
106
|
+
map.each do |input, outputs|
|
107
|
+
input = input.to_s if input.is_a?(Symbol)
|
108
|
+
input = input.to_i if input.is_a?(String)
|
109
|
+
|
110
|
+
outputs = [outputs] unless outputs.is_a?(Array)
|
111
|
+
command = ''
|
112
|
+
outputs.each do |output|
|
113
|
+
command += "#{input}*#{output}$"
|
114
|
+
end
|
115
|
+
send(command)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def mute_video(outputs)
|
120
|
+
outputs = [outputs] unless outputs.is_a?(Array)
|
121
|
+
command = ''
|
122
|
+
outputs.each do |output|
|
123
|
+
command += "#{output}*1B"
|
124
|
+
end
|
125
|
+
send(command)
|
126
|
+
end
|
127
|
+
|
128
|
+
def unmute_video(outputs)
|
129
|
+
outputs = [outputs] unless outputs.is_a?(Array)
|
130
|
+
command = ''
|
131
|
+
outputs.each do |output|
|
132
|
+
command += "#{output}*0B"
|
133
|
+
end
|
134
|
+
send(command)
|
135
|
+
end
|
136
|
+
|
137
|
+
def mute_audio(outputs)
|
138
|
+
outputs = [outputs] unless outputs.is_a?(Array)
|
139
|
+
command = ''
|
140
|
+
outputs.each do |output|
|
141
|
+
command += "#{output}*1Z"
|
142
|
+
end
|
143
|
+
send(command)
|
144
|
+
end
|
145
|
+
|
146
|
+
def unmute_audio(outputs)
|
147
|
+
outputs = [outputs] unless outputs.is_a?(Array)
|
148
|
+
command = ''
|
149
|
+
outputs.each do |output|
|
150
|
+
command += "#{output}*0Z"
|
151
|
+
end
|
152
|
+
send(command)
|
153
|
+
end
|
154
|
+
|
155
|
+
def set_preset(number)
|
156
|
+
send("#{number},")
|
157
|
+
end
|
158
|
+
|
159
|
+
def recall_preset(number)
|
160
|
+
send("#{number}.")
|
161
|
+
end
|
162
|
+
|
163
|
+
|
164
|
+
#def response_delimiter
|
165
|
+
# [0x0D, 0x0A] # Used to interpret the end of a message
|
166
|
+
#end
|
167
|
+
|
168
|
+
|
169
|
+
#
|
170
|
+
# Sends copyright information
|
171
|
+
# Then sends password prompt
|
172
|
+
#
|
173
|
+
def received(data, resolve, command)
|
174
|
+
logger.debug "Extron Matrix sent #{data}"
|
175
|
+
|
176
|
+
if command.nil? && data =~ /Copyright/i
|
177
|
+
pass = setting(:password)
|
178
|
+
if pass.nil?
|
179
|
+
device_ready
|
180
|
+
else
|
181
|
+
do_send(pass) # Password set
|
182
|
+
end
|
183
|
+
elsif data =~ /Login/i
|
184
|
+
device_ready
|
185
|
+
elsif command.present? && command[:command] == :information
|
186
|
+
data = data.split(' ')
|
187
|
+
video = data[0][1..-1].split('X')
|
188
|
+
self[:video_inputs] = video[0].to_i
|
189
|
+
self[:video_outputs] = video[1].to_i
|
190
|
+
|
191
|
+
audio = data[1][1..-1].split('X')
|
192
|
+
self[:audio_inputs] = audio[0].to_i
|
193
|
+
self[:audio_outputs] = audio[1].to_i
|
194
|
+
else
|
195
|
+
case data[0..1].to_sym
|
196
|
+
when :Am # Audio mute
|
197
|
+
data = data[3..-1].split('*')
|
198
|
+
self["audio#{data[0].to_i}_muted"] = data[1] == '1'
|
199
|
+
when :Vm # Video mute
|
200
|
+
data = data[3..-1].split('*')
|
201
|
+
self["video#{data[0].to_i}_muted"] = data[1] == '1'
|
202
|
+
when :In # Input to all outputs
|
203
|
+
data = data[2..-1].split(' ')
|
204
|
+
input = data[0].to_i
|
205
|
+
if data[1] =~ /(All|RGB|Vid)/
|
206
|
+
for i in 1..self[:video_outputs]
|
207
|
+
self["video#{i}"] = input
|
208
|
+
end
|
209
|
+
end
|
210
|
+
if data[1] =~ /(All|Aud)/
|
211
|
+
for i in 1..self[:audio_outputs]
|
212
|
+
self["audio#{i}"] = input
|
213
|
+
end
|
214
|
+
end
|
215
|
+
when :Ou # Output x to input y
|
216
|
+
data = data[3..-1].split(' ')
|
217
|
+
output = data[0].to_i
|
218
|
+
input = data[1][2..-1].to_i
|
219
|
+
if data[2] =~ /(All|RGB|Vid)/
|
220
|
+
self["video#{output}"] = input
|
221
|
+
end
|
222
|
+
if data[2] =~ /(All|Aud)/
|
223
|
+
self["audio#{output}"] = input
|
224
|
+
end
|
225
|
+
else
|
226
|
+
if data == 'E22' # Busy! We should retry this one
|
227
|
+
command[:delay_on_receive] = 1 unless command.nil?
|
228
|
+
return :failed
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
return :success
|
234
|
+
end
|
235
|
+
|
236
|
+
|
237
|
+
private
|
238
|
+
|
239
|
+
|
240
|
+
def device_ready
|
241
|
+
send("I", :wait => true, :command => :information)
|
242
|
+
do_send("\e3CV", :wait => true) # Verbose mode and tagged responses
|
243
|
+
end
|
244
|
+
|
245
|
+
def do_send(data, options = {})
|
246
|
+
send(data << 0x0D, options)
|
247
|
+
end
|
248
248
|
end
|
249
249
|
|
@@ -63,7 +63,9 @@ class GlobalCache::Gc100
|
|
63
63
|
def relay_status?(index, &block)
|
64
64
|
if index < self[:num_relays]
|
65
65
|
connector = self[:config][:relay][index]
|
66
|
-
|
66
|
+
options = {}
|
67
|
+
options[:emit] = block if block_given?
|
68
|
+
do_send("getstate,#{connector}", options)
|
67
69
|
else
|
68
70
|
logger.warn "Attempted to check IO on GlobalCache that does not exist: #{index}"
|
69
71
|
end
|
@@ -72,7 +74,9 @@ class GlobalCache::Gc100
|
|
72
74
|
def io_status?(index, &block)
|
73
75
|
if index < self[:num_ir]
|
74
76
|
connector = self[:config][:ir][index]
|
75
|
-
|
77
|
+
options = {}
|
78
|
+
options[:emit] = block if block_given?
|
79
|
+
do_send("getstate,#{connector}", options)
|
76
80
|
else
|
77
81
|
logger.warn "Attempted to check IO on GlobalCache that does not exist: #{index}"
|
78
82
|
end
|
@@ -24,220 +24,220 @@ module Kramer::Switcher; end
|
|
24
24
|
#
|
25
25
|
|
26
26
|
class Kramer::Switcher::Protocol3000
|
27
|
-
|
27
|
+
include ::Orchestrator::Constants
|
28
28
|
include ::Orchestrator::Transcoder
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
|
30
|
+
def on_load
|
31
|
+
config({
|
32
32
|
tokenize: true,
|
33
33
|
delimiter: "\x0D\x0A",
|
34
34
|
encoding: "ASCII-8BIT"
|
35
35
|
})
|
36
36
|
|
37
37
|
on_update
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
38
|
+
end
|
39
|
+
|
40
|
+
def on_update
|
41
|
+
@device_id = setting(:kramer_id)
|
42
|
+
@destination = "#{@device_id}@" if @device_id
|
43
|
+
|
44
|
+
@login_level = setting(:kramer_login)
|
45
|
+
@password = setting(:kramer_password) if @login_level
|
46
|
+
end
|
47
|
+
|
48
|
+
def connected
|
49
|
+
#
|
50
|
+
# Get current state of the switcher
|
51
|
+
#
|
52
|
+
protocol_handshake
|
53
|
+
login
|
54
|
+
get_machine_info
|
55
|
+
|
56
|
+
@polling_timer = schedule.every('2m') do
|
57
|
+
logger.debug "-- Kramer Maintaining Connection"
|
58
|
+
do_send('MODEL?', {:priority => 0}) # Low priority poll to maintain connection
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def disconnected
|
63
|
+
@polling_timer.cancel unless @polling_timer.nil?
|
64
|
+
@polling_timer = nil
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
#
|
69
|
+
# Starting at input 1, input 0 == disconnect
|
70
|
+
#
|
71
|
+
def switch(map, out = nil)
|
72
|
+
map = {map => out} if out
|
73
|
+
do_send(CMDS[:switch], build_switch_data(map))
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
def switch_video(map, out = nil)
|
78
|
+
map = {map => out} if out
|
79
|
+
do_send(CMDS[:switch_video], build_switch_data(map))
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
def switch_audio(map, out = nil)
|
84
|
+
map = {map => out} if out
|
85
|
+
do_send(CMDS[:switch_audio], build_switch_data(map))
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def mute_video(out, state = true)
|
90
|
+
data = is_affirmative?(state) ? 1 : 0
|
91
|
+
do_send(CMDS[:video_mute], out, data)
|
92
|
+
end
|
93
|
+
|
94
|
+
def mute_audio(out, state = true)
|
95
|
+
data = is_affirmative?(state) ? 1 : 0
|
96
|
+
do_send(CMDS[:audio_mute], out, data)
|
97
|
+
end
|
98
|
+
|
99
|
+
def unmute_video(out)
|
100
|
+
mute_video out, false
|
101
|
+
end
|
102
|
+
|
103
|
+
def unmute_audio(out)
|
104
|
+
mute_audio out, false
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
def received(data, resolve, command)
|
109
|
+
logger.debug "Kramer sent #{data}"
|
110
|
+
|
111
|
+
# Extract and check the machine number if we've defined it
|
112
|
+
components = data.split('@')
|
113
|
+
if components.length > 1
|
114
|
+
machine = components[0]
|
115
|
+
if @device_id && machine != @device_id
|
116
|
+
return :ignore
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
data = components[-1].strip
|
121
|
+
components = data.split(/\s+|,/)
|
122
|
+
|
123
|
+
cmd = components[0]
|
124
|
+
args = components[1..-1]
|
125
|
+
|
126
|
+
if cmd == 'OK'
|
127
|
+
return :success
|
128
|
+
elsif cmd[0..2] == 'ERR' || args[0][0..2] == 'ERR'
|
129
|
+
if cmd[0..2] == 'ERR'
|
130
|
+
error = cmd[3..-1]
|
131
|
+
errfor = nil
|
132
|
+
else
|
133
|
+
error = args[0][3..-1]
|
134
|
+
errfor = " on #{cmd}"
|
135
|
+
end
|
136
|
+
logger.error "Kramer command error #{error}#{errfor}"
|
137
|
+
self[:last_error] = error
|
138
|
+
return :abort
|
139
|
+
end
|
140
|
+
|
141
|
+
case CMDS[cmd.to_sym]
|
142
|
+
when :info
|
143
|
+
self[:video_inputs] = args[1].to_i
|
144
|
+
self[:video_outputs] = args[3].to_i
|
145
|
+
when :route
|
146
|
+
inout = args[0].split(',')
|
147
|
+
layer = inout[0].to_i
|
148
|
+
dest = inout[1].to_i
|
149
|
+
src = inout[2].to_i
|
150
|
+
self[:"#{LAYERS[layer]}#{dest}"] = src
|
151
|
+
when :switch, :switch_audio, :switch_video
|
152
|
+
# return string like "in>out,in>out,in>out"
|
153
|
+
|
154
|
+
type = :av
|
155
|
+
type = :audio if CMDS[cmd] == :switch_audio
|
156
|
+
type = :video if CMDS[cmd] == :switch_video
|
157
|
+
|
158
|
+
mappings = args[0].split(',')
|
159
|
+
mappings.each do |map|
|
160
|
+
inout = map.split('>')
|
161
|
+
self[:"#{type}#{inout[1]}"] = inout[0].to_i
|
162
|
+
end
|
163
|
+
when :audio_mute
|
164
|
+
output, mute = args[0].split(',')
|
165
|
+
self[:"audio#{output}_muted"] = mute == '1'
|
166
|
+
when :video_mute
|
167
|
+
output, mute = args[0].split(',')
|
168
|
+
self[:"video#{output}_muted"] = mute == '1'
|
169
|
+
end
|
170
|
+
|
171
|
+
return :success
|
172
|
+
end
|
173
|
+
|
174
|
+
|
175
|
+
CMDS = {
|
176
|
+
info: :"INFO-IO?",
|
177
|
+
login: :"LOGIN",
|
178
|
+
route: :"ROUTE",
|
179
|
+
switch: :"AV",
|
180
|
+
switch_audio: :"AUD",
|
181
|
+
switch_video: :"VID",
|
182
|
+
audio_mute: :"MUTE",
|
183
|
+
video_mute: :"VMUTE"
|
184
|
+
}
|
185
|
+
CMDS.merge!(CMDS.invert)
|
186
|
+
|
187
|
+
LAYERS = {
|
188
|
+
1 => :video,
|
189
|
+
2 => :audio,
|
190
|
+
2 => :data
|
191
|
+
}
|
192
|
+
|
193
|
+
|
194
|
+
private
|
195
|
+
|
196
|
+
|
197
|
+
def build_switch_data(map)
|
198
|
+
data = ''
|
199
|
+
|
200
|
+
map.each do |input, outputs|
|
201
|
+
outputs = [outputs] unless outputs.class == Array
|
202
|
+
input = input.to_s if input.class == Symbol
|
203
|
+
input = input.to_i if input.class == String
|
204
|
+
outputs.each do |output|
|
205
|
+
data << "#{input}>#{output},"
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
data.chop
|
210
|
+
end
|
211
|
+
|
212
|
+
|
213
|
+
def protocol_handshake
|
214
|
+
do_send('', {priority: 99})
|
215
|
+
end
|
216
|
+
|
217
|
+
def login
|
218
|
+
if @login_level
|
219
|
+
do_send(CMDS[:login], @password, {priority: 99})
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def get_machine_info
|
224
|
+
do_send(CMDS[:info], {priority: 99})
|
225
|
+
end
|
226
|
+
|
227
|
+
|
228
|
+
def do_send(command, *args)
|
229
|
+
options = {}
|
230
|
+
if args[-1].is_a? Hash
|
231
|
+
options = args.pop
|
232
|
+
end
|
233
|
+
|
234
|
+
cmd = "##{@destination}#{command}"
|
235
|
+
|
236
|
+
if args.length > 0
|
237
|
+
cmd << " #{args.join(',')}"
|
238
|
+
end
|
239
|
+
cmd << "\r"
|
240
|
+
|
241
|
+
send(cmd, options)
|
242
|
+
end
|
243
243
|
end
|