aca-device-modules 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/aca-device-modules/version.rb +1 -1
- data/modules/biamp/nexia.rb +45 -26
- data/modules/bss/blu100.rb +49 -31
- data/modules/chiyu/cyt.rb +183 -0
- data/modules/epson/projector/esc_vp21.rb +5 -0
- data/modules/kramer/switcher/protocol3000.rb +243 -0
- data/modules/nec/display/all.rb +482 -0
- data/modules/nec/projector/np_series.rb +648 -0
- data/modules/panasonic/projector/tcp.rb +250 -0
- data/modules/screen_technics/connect.rb +73 -0
- data/modules/sony/display/{gdx_and_fwd.rb → id_talk.rb} +38 -7
- data/modules/sony/projector/pj_talk.rb +300 -0
- data/modules/transmitsms/api.rb +52 -0
- data/modules/vaddio/camera/clear_view_ptz_telnet.rb +3 -3
- metadata +11 -4
- data/modules/panasonic/projector/pj_link.rb +0 -266
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b69086f2a1f7cedc0f6ee28a9dba6f771233396
|
4
|
+
data.tar.gz: 6080121ffbf65e399205c885be16959f7b7603d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38add061a9db39ec6ed34d2cfb9bba11c2d7c395f0498c1f74a2089c3a606cfafc4b0e4df7f9e62b460567dbb03108cc66507b4d573fcf8cbdd654c5b10d00ee
|
7
|
+
data.tar.gz: 7a5c4ecc2012e09c552bb0a48f6af767d33a1e61c47a7a850463653c4d972695e2de8ba2f7e7a6fde05d59a87d65d4094684e0a0f0b02c1ab335e841987e08a9
|
data/modules/biamp/nexia.rb
CHANGED
@@ -51,38 +51,59 @@ class Biamp::Nexia
|
|
51
51
|
#
|
52
52
|
do_send('RECALL', 0, 'PRESET', number)
|
53
53
|
end
|
54
|
+
|
55
|
+
# {1 => [2,3,5], 2 => [2,3,6]}, true
|
56
|
+
# Supports Matrix and Automixers
|
57
|
+
def mixer(id, inouts, mute = false)
|
58
|
+
value = is_affirmative?(mute) ?
|
59
|
+
|
60
|
+
if inouts.is_a? Hash
|
61
|
+
inouts.each_key do |input|
|
62
|
+
outputs = inouts[input]
|
63
|
+
outs = outputs.is_a?(Array) ? outputs : [outputs]
|
64
|
+
|
65
|
+
outs.each do |output|
|
66
|
+
do_send('SETD', self[:device_id], 'MMMUTEXP', id, input, output, value)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
else # assume array (auto-mixer)
|
70
|
+
inouts.each do |input|
|
71
|
+
do_send('SETD', self[:device_id], 'AMMUTEXP', id, input, value)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
54
75
|
|
55
|
-
def fader(fader_id, level)
|
76
|
+
def fader(fader_id, level, index = 1)
|
56
77
|
# value range: -100 ~ 12
|
57
|
-
do_send('SETD', self[:device_id], 'FDRLVL', fader_id,
|
78
|
+
do_send('SETD', self[:device_id], 'FDRLVL', fader_id, index, level)
|
58
79
|
end
|
59
80
|
|
60
|
-
def mute(fader_id, val = true)
|
81
|
+
def mute(fader_id, val = true, index = 1)
|
61
82
|
actual = val ? 1 : 0
|
62
|
-
do_send('SETD', self[:device_id], 'FDRMUTE', fader_id,
|
83
|
+
do_send('SETD', self[:device_id], 'FDRMUTE', fader_id, index, actual)
|
63
84
|
end
|
64
85
|
|
65
|
-
def unmute(fader_id)
|
66
|
-
|
86
|
+
def unmute(fader_id, index = 1)
|
87
|
+
mute(fader_id, false, index)
|
67
88
|
end
|
68
89
|
|
69
|
-
def query_fader(fader_id)
|
70
|
-
send("GET #{self[:device_id]} FDRLVL #{fader_id}
|
71
|
-
if data
|
90
|
+
def query_fader(fader_id, index = 1)
|
91
|
+
send("GET #{self[:device_id]} FDRLVL #{fader_id} #{index} \n") do |data|
|
92
|
+
if data.start_with?('-ERR')
|
72
93
|
:abort
|
73
94
|
else
|
74
|
-
self[:"
|
95
|
+
self[:"fader#{fader_id}_#{index}"] = data.to_i
|
75
96
|
:success
|
76
97
|
end
|
77
98
|
end
|
78
99
|
end
|
79
100
|
|
80
|
-
def query_mute(fader_id)
|
81
|
-
send("GET #{self[:device_id]} FDRMUTE #{fader_id}
|
82
|
-
if data
|
101
|
+
def query_mute(fader_id, index = 1)
|
102
|
+
send("GET #{self[:device_id]} FDRMUTE #{fader_id} #{index} \n") do |data|
|
103
|
+
if data.start_with?('-ERR')
|
83
104
|
:abort
|
84
105
|
else
|
85
|
-
self[:"
|
106
|
+
self[:"fader#{fader_id}_#{index}_mute"] = data.to_i == 1
|
86
107
|
:success
|
87
108
|
end
|
88
109
|
end
|
@@ -90,23 +111,21 @@ class Biamp::Nexia
|
|
90
111
|
|
91
112
|
|
92
113
|
def received(data, resolve, command)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
if data[-1] == "-ERR"
|
97
|
-
logger.debug "Nexia Invalid Command sent #{command[:data]}" if !!command
|
98
|
-
return :abort
|
99
|
-
end
|
100
|
-
return :success # data[-1] == "+OK" || data == "" # Echo off
|
114
|
+
if data.start_with?('-ERR')
|
115
|
+
logger.debug "Nexia returned #{data} for #{command[:data]}" if command
|
116
|
+
return :abort
|
101
117
|
end
|
102
118
|
|
119
|
+
#--> "#SETD 0 FDRLVL 29 1 0.000000 +OK"
|
120
|
+
data = data.split(' ')
|
103
121
|
unless data[2].nil?
|
104
122
|
case data[2].to_sym
|
105
|
-
when :FDRLVL
|
106
|
-
self[:"
|
123
|
+
when :FDRLVL, :VL
|
124
|
+
self[:"fader#{data[3]}_#{data[4]}"] = data[5].to_i
|
107
125
|
when :FDRMUTE
|
108
|
-
self[:"
|
126
|
+
self[:"fader#{data[3]}_#{data[4]}_mute"] = data[5] == "1"
|
109
127
|
when :DEVID
|
128
|
+
# "#GETD 0 DEVID 1 "
|
110
129
|
self[:device_id] = data[-2].to_i
|
111
130
|
end
|
112
131
|
end
|
@@ -120,7 +139,7 @@ class Biamp::Nexia
|
|
120
139
|
|
121
140
|
|
122
141
|
def do_send(*args)
|
123
|
-
send("#{args.join(' ')}\n")
|
142
|
+
send("#{args.join(' ')} \n")
|
124
143
|
end
|
125
144
|
end
|
126
145
|
|
data/modules/bss/blu100.rb
CHANGED
@@ -15,12 +15,15 @@ class Bss::Blu100
|
|
15
15
|
delimiter: "\x03",
|
16
16
|
indicator: "\x02"
|
17
17
|
})
|
18
|
+
|
19
|
+
on_update
|
18
20
|
end
|
19
21
|
|
20
22
|
def on_unload
|
21
23
|
end
|
22
24
|
|
23
25
|
def on_update
|
26
|
+
@type_lookup ||= {}
|
24
27
|
end
|
25
28
|
|
26
29
|
def connected
|
@@ -64,69 +67,82 @@ class Bss::Blu100
|
|
64
67
|
#
|
65
68
|
# Level controls
|
66
69
|
#
|
67
|
-
def fader(fader, percent)
|
70
|
+
def fader(fader, percent, index = 0)
|
71
|
+
index_data = id_to_array(index, :gain)
|
72
|
+
|
68
73
|
percent = percent.to_i
|
69
74
|
percent = 6553600 if percent > 6553600
|
70
75
|
percent = 0 if percent < 0
|
71
76
|
|
72
77
|
percent = number_to_data(percent)
|
73
78
|
|
74
|
-
do_send([OPERATION_CODE[:set_percent]] + NODE + VIRTUAL + number_to_object(fader.to_i) +
|
79
|
+
do_send([OPERATION_CODE[:set_percent]] + NODE + VIRTUAL + number_to_object(fader.to_i) + index_data + percent)
|
75
80
|
subscribe_percent(fader)
|
76
81
|
end
|
77
82
|
|
78
|
-
def mute(fader)
|
79
|
-
|
83
|
+
def mute(fader, val = true, index = 1)
|
84
|
+
actual = val ? 1 : 0
|
85
|
+
|
86
|
+
index_data = id_to_array(index, :mute)
|
87
|
+
|
88
|
+
do_send([OPERATION_CODE[:set_state]] + NODE + VIRTUAL + number_to_object(fader.to_i) + index_data + number_to_data(actual))
|
80
89
|
subscribe_state(fader)
|
81
90
|
end
|
82
91
|
|
83
|
-
def unmute(fader)
|
84
|
-
|
85
|
-
subscribe_state(fader)
|
92
|
+
def unmute(fader, index = 1)
|
93
|
+
mute(fader, false, index)
|
86
94
|
end
|
87
95
|
|
88
96
|
|
89
|
-
def query_fader(fader_id)
|
90
|
-
subscribe_percent(fader_id)
|
97
|
+
def query_fader(fader_id, index = 0)
|
98
|
+
subscribe_percent(fader_id, index)
|
91
99
|
end
|
92
100
|
|
93
|
-
def query_mute(fader_id)
|
94
|
-
subscribe_state(fader_id)
|
101
|
+
def query_mute(fader_id, index = 1)
|
102
|
+
subscribe_state(fader_id, index)
|
95
103
|
end
|
96
104
|
|
97
105
|
|
98
106
|
#
|
99
107
|
# Percent controls for relative values
|
100
108
|
#
|
101
|
-
def subscribe_percent(fader,
|
109
|
+
def subscribe_percent(fader, index = 0, rate = 0) # rate must be 0 for non meter controls
|
110
|
+
index_data = id_to_array(index, :gain)
|
111
|
+
|
102
112
|
fader = number_to_object(fader.to_i)
|
103
113
|
rate = number_to_data(rate.to_i)
|
104
114
|
|
105
|
-
do_send([OPERATION_CODE[:subscribe_percent]] + NODE + VIRTUAL + fader +
|
115
|
+
do_send([OPERATION_CODE[:subscribe_percent]] + NODE + VIRTUAL + fader + index_data + rate)
|
106
116
|
end
|
107
117
|
|
108
|
-
def unsubscribe_percent(fader,
|
118
|
+
def unsubscribe_percent(fader, index = 0) # rate must be 0 for non meter controls
|
119
|
+
index_data = id_to_array(index, :gain)
|
120
|
+
|
109
121
|
fader = number_to_object(fader.to_i)
|
110
122
|
rate = number_to_data(0)
|
111
123
|
|
112
|
-
do_send([OPERATION_CODE[:unsubscribe_percent]] + NODE + VIRTUAL + fader +
|
124
|
+
do_send([OPERATION_CODE[:unsubscribe_percent]] + NODE + VIRTUAL + fader + index_data + rate)
|
113
125
|
end
|
114
126
|
|
115
127
|
#
|
116
128
|
# State controls are for discrete values
|
117
129
|
#
|
118
|
-
def subscribe_state(fader,
|
130
|
+
def subscribe_state(fader, index = 1, rate = 0) # 1000 == every second
|
131
|
+
index_data = id_to_array(index, :mute)
|
132
|
+
|
119
133
|
fader = number_to_object(fader.to_i)
|
120
134
|
rate = number_to_data(rate.to_i)
|
121
135
|
|
122
|
-
do_send([OPERATION_CODE[:subscribe_state]] + NODE + VIRTUAL + fader +
|
136
|
+
do_send([OPERATION_CODE[:subscribe_state]] + NODE + VIRTUAL + fader + index_data + rate)
|
123
137
|
end
|
124
138
|
|
125
|
-
def unsubscribe_state(fader,
|
139
|
+
def unsubscribe_state(fader, index = 1) # 1000 == every second
|
140
|
+
index_data = id_to_array(index, :mute)
|
141
|
+
|
126
142
|
fader = number_to_object(fader.to_i)
|
127
143
|
rate = number_to_data(0)
|
128
144
|
|
129
|
-
do_send([OPERATION_CODE[:unsubscribe_state]] + NODE + VIRTUAL + fader +
|
145
|
+
do_send([OPERATION_CODE[:unsubscribe_state]] + NODE + VIRTUAL + fader + index_data + rate)
|
130
146
|
end
|
131
147
|
|
132
148
|
|
@@ -170,10 +186,11 @@ class Bss::Blu100
|
|
170
186
|
case OPERATION_CODE[type]
|
171
187
|
when :set_state # This is the mute response
|
172
188
|
obj = byte_to_hex(array_to_str(obj)).to_i(16)
|
173
|
-
|
174
|
-
|
189
|
+
index = byte_to_hex(array_to_str(cntrl)).to_i(16)
|
190
|
+
if @type_lookup[cntrl] == :mute
|
191
|
+
self[:"fader#{obj}_#{index}_mute"] = data == 1
|
175
192
|
else
|
176
|
-
self[:"
|
193
|
+
self[:"fader#{obj}_#{index}"] = data
|
177
194
|
end
|
178
195
|
when :subscribe_state
|
179
196
|
when :unsubscribe_state
|
@@ -181,7 +198,8 @@ class Bss::Blu100
|
|
181
198
|
when :param_preset
|
182
199
|
when :set_percent # This is the fader response
|
183
200
|
obj = byte_to_hex(array_to_str(obj)).to_i(16)
|
184
|
-
|
201
|
+
index = byte_to_hex(array_to_str(cntrl)).to_i(16)
|
202
|
+
self[:"fader#{obj}_#{index}"] = data
|
185
203
|
when :subscribe_percent
|
186
204
|
when :unsubscribe_percent
|
187
205
|
when :set_relative_percent
|
@@ -198,12 +216,18 @@ class Bss::Blu100
|
|
198
216
|
protected
|
199
217
|
|
200
218
|
|
219
|
+
def id_to_array(id, type)
|
220
|
+
data = str_to_array(hex_to_byte(id.to_s(16).rjust(4, '0')))
|
221
|
+
@type_lookup[data] = type
|
222
|
+
data
|
223
|
+
end
|
224
|
+
|
201
225
|
def number_to_data(num)
|
202
|
-
str_to_array(hex_to_byte(num.to_s(16).
|
226
|
+
str_to_array(hex_to_byte(num.to_s(16).rjust(8, '0')))
|
203
227
|
end
|
204
228
|
|
205
229
|
def number_to_object(num)
|
206
|
-
str_to_array(hex_to_byte(num.to_s(16).
|
230
|
+
str_to_array(hex_to_byte(num.to_s(16).rjust(6, '0')))
|
207
231
|
end
|
208
232
|
|
209
233
|
|
@@ -211,12 +235,6 @@ class Bss::Blu100
|
|
211
235
|
NODE = [0,0] # node we are connected to
|
212
236
|
VIRTUAL = [3] # virtual device is always 3 for audio devices
|
213
237
|
|
214
|
-
CONTROLS = {
|
215
|
-
:gain => [0,0],
|
216
|
-
:mute => [0,1]
|
217
|
-
}
|
218
|
-
CONTROLS.merge!(CONTROLS.invert)
|
219
|
-
|
220
238
|
|
221
239
|
def check_checksum(data)
|
222
240
|
#
|
@@ -0,0 +1,183 @@
|
|
1
|
+
module Chiyu; end
|
2
|
+
|
3
|
+
|
4
|
+
# Normal state for inputs == open
|
5
|
+
# IO Operations mode TCP server
|
6
|
+
# Periodically every second
|
7
|
+
|
8
|
+
|
9
|
+
# Default port: 50001
|
10
|
+
class Chiyu::Cyt
|
11
|
+
include ::Orchestrator::Constants
|
12
|
+
include ::Orchestrator::Transcoder
|
13
|
+
|
14
|
+
|
15
|
+
def on_load
|
16
|
+
@outputs = Array.new(32, 1)
|
17
|
+
|
18
|
+
config({
|
19
|
+
tokenize: true,
|
20
|
+
delimiter: "\xF0\xF0",
|
21
|
+
min_length: 2, # this will ignore the CRC check byte
|
22
|
+
encoding: "ASCII-8BIT"
|
23
|
+
})
|
24
|
+
|
25
|
+
defaults({
|
26
|
+
delay_on_receive: 500
|
27
|
+
})
|
28
|
+
end
|
29
|
+
|
30
|
+
def on_update
|
31
|
+
end
|
32
|
+
|
33
|
+
# No keep alive required as the device polls us
|
34
|
+
def connected
|
35
|
+
do_send(:state)
|
36
|
+
do_send(:auto_report)
|
37
|
+
end
|
38
|
+
|
39
|
+
def disconnected
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
COMMANDS = {
|
45
|
+
state: [0x00, 0x01],
|
46
|
+
trigger: [0x00, 0x03],
|
47
|
+
auto_report: [0x00, 0x05],
|
48
|
+
ack_keepalive: [0x00, 0x08]
|
49
|
+
}
|
50
|
+
|
51
|
+
RESPONSES = {
|
52
|
+
[0x00, 0x02] => :state,
|
53
|
+
[0x00, 0x04] => :trigger,
|
54
|
+
[0x00, 0x06] => :emailed,
|
55
|
+
[0x00, 0x10] => :report,
|
56
|
+
[0x00, 0x07] => :keepalive,
|
57
|
+
[0x00, 0x08] => :keepalive
|
58
|
+
}
|
59
|
+
|
60
|
+
ERRORS = {
|
61
|
+
0xFC => 'Flag error, incorrect Start Flag or End Flag'.freeze,
|
62
|
+
0xFD => 'Length error, the length of command packet is invalid'.freeze,
|
63
|
+
0xFE => 'CRC error, incorrect CRC value'.freeze,
|
64
|
+
0xFF => 'Command error, no such command'.freeze
|
65
|
+
}
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
def relay(index, state, time = nil)
|
70
|
+
index = index - 1
|
71
|
+
return if index >= 30 || index < 0
|
72
|
+
|
73
|
+
@outputs[index] = is_affirmative?(state) ? 0 : 1
|
74
|
+
opts = {
|
75
|
+
data1: @outputs
|
76
|
+
}
|
77
|
+
|
78
|
+
if time
|
79
|
+
time = time.to_i
|
80
|
+
times = Array.new(32, 0)
|
81
|
+
times[index] = time
|
82
|
+
opts[:data2] = times
|
83
|
+
opts[:delay_on_receive] = time * 1000 + 1200
|
84
|
+
end
|
85
|
+
|
86
|
+
do_send(:trigger, opts)
|
87
|
+
self[:"relay#{index + 1}"] = true
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
def received(data_str, resolve, command)
|
93
|
+
data = str_to_array(data_str)
|
94
|
+
logger.debug "Chiyu sent #{data}"
|
95
|
+
|
96
|
+
cmd = data[0..1]
|
97
|
+
data1 = data[2..33]
|
98
|
+
data2 = data[34..65]
|
99
|
+
|
100
|
+
if cmd[0] != 0xFF
|
101
|
+
case RESPONSES[cmd]
|
102
|
+
when :state, :report
|
103
|
+
data1.each_index do |index|
|
104
|
+
next if index >= 30
|
105
|
+
byte = data1[index]
|
106
|
+
if byte < 2
|
107
|
+
self[:"sensor#{index + 1}"] = byte == 1
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
@outputs = data2
|
112
|
+
data2.each_index do |index|
|
113
|
+
next if index >= 30
|
114
|
+
byte = data2[index]
|
115
|
+
if byte < 2
|
116
|
+
self[:"relay#{index + 1}"] = byte == 0
|
117
|
+
end
|
118
|
+
end
|
119
|
+
when :keepalive
|
120
|
+
do_send(:ack_keepalive)
|
121
|
+
end
|
122
|
+
|
123
|
+
:success
|
124
|
+
else
|
125
|
+
# Error
|
126
|
+
error = ERRORS[cmd[1]]
|
127
|
+
self[:last_error] = error
|
128
|
+
logger.debug "Chiyu error #{error}"
|
129
|
+
:abort
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
# Pulse Lifter Logic
|
136
|
+
#
|
137
|
+
# Automatically creates a callable function for each command
|
138
|
+
# http://blog.jayfields.com/2007/10/ruby-defining-class-methods.html
|
139
|
+
# http://blog.jayfields.com/2008/02/ruby-dynamically-define-method.html
|
140
|
+
#
|
141
|
+
[:up, :down, :left, :right].each do |helper|
|
142
|
+
define_method helper do |*args|
|
143
|
+
index = args[0] || setting(helper) || 1
|
144
|
+
index = index.to_i
|
145
|
+
|
146
|
+
relay(index, true, 2)
|
147
|
+
relay(index, true, 2)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
protected
|
154
|
+
|
155
|
+
|
156
|
+
def checksum!(command)
|
157
|
+
check = 0
|
158
|
+
command.each do |byte|
|
159
|
+
check = check + byte
|
160
|
+
end
|
161
|
+
check = (0 - check) & 0xFF
|
162
|
+
command << check
|
163
|
+
end
|
164
|
+
|
165
|
+
|
166
|
+
FLAG = [0xF0, 0xF0]
|
167
|
+
EMPTY = Array.new(32, 0)
|
168
|
+
|
169
|
+
|
170
|
+
def do_send(command, options = {})
|
171
|
+
cmd = FLAG + COMMANDS[command]
|
172
|
+
cmd += options.delete(:data1) || EMPTY
|
173
|
+
cmd += options.delete(:data2) || EMPTY
|
174
|
+
cmd += FLAG
|
175
|
+
checksum!(cmd)
|
176
|
+
|
177
|
+
options[:name] = command unless options[:name]
|
178
|
+
|
179
|
+
send(cmd, options)
|
180
|
+
logger.debug "-- CYT, sending: #{command}"
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|