aca-device-modules 1.0.3 → 1.0.4
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/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
|
+
|