seriamp 0.1.3 → 0.1.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/README.md +41 -0
- data/lib/seriamp/sonamp/app.rb +6 -0
- data/lib/seriamp/version.rb +1 -1
- data/lib/seriamp/yamaha/app.rb +33 -0
- data/lib/seriamp/yamaha/client.rb +36 -4
- data/lib/seriamp/yamaha/cmd.rb +26 -15
- data/lib/seriamp/yamaha/protocol/methods.rb +8 -0
- data/seriamp.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e48ad0a8b0c004f0e7a931eed8b923bb06329af40db33c7d89b51831591531a
|
4
|
+
data.tar.gz: 292b04a8dca57285dbfea326a38b86bc6fb8e67e1ebb60215b49bdb236eecc94
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb8b19b6288bfe4b248aaaa1dffe26f801b64729af28923a8501222e05c8978747337c9d61b22d2794c2d6f33ebc16e831272569add01420c24ac9786674c5cd
|
7
|
+
data.tar.gz: f1fe372b20b6bd95f33637c3157d6cc210d03c3cd7e6047061657095ef07abc891c6a38b85c9788d0329898ff7e4506687cc9661ca411de0582c0367a9c5f6df
|
data/README.md
CHANGED
@@ -1,5 +1,46 @@
|
|
1
1
|
# Yamaha Receiver Serial Control Ruby Library
|
2
2
|
|
3
|
+
## Hardware Requirements
|
4
|
+
|
5
|
+
I used USB to serial adapters with both Prolific PL2303 and FTDI chips.
|
6
|
+
Both chipsets work under Linux. The FTDI chipset appears to buffer the
|
7
|
+
incoming data - when reading from the device, it returns more than one
|
8
|
+
character at a time, whereas with the Prolific chipset only one character at
|
9
|
+
a time is returned. This means the FTDI chip can possibly offer faster
|
10
|
+
communication. Adapters based on the FTDI chip are also more expensive.
|
11
|
+
|
12
|
+
On Windows, FTDI provides drivers for at least Windows 7, however they
|
13
|
+
are not signed. Windows can be booted with the option to skip driver
|
14
|
+
signing enforcement, which makes the adapter work. I couldn't locate a
|
15
|
+
working Prolific driver for Windows 7.
|
16
|
+
|
17
|
+
These USB to serial adapters all have male connection on the RS232 end.
|
18
|
+
As such, no additional cable is needed if communicating with a receiver
|
19
|
+
that requires a straight cable and has a female terminal (such as the
|
20
|
+
Denon AVR-2308CI). For other receivers a gender changer or a cable is
|
21
|
+
necessary.
|
22
|
+
|
23
|
+
### Sonance Sonamp 875D / 875D MK II
|
24
|
+
|
25
|
+
- 3-pin cable should be sufficient according to manual
|
26
|
+
- Null-modem cable required
|
27
|
+
- Receiver socket is female
|
28
|
+
|
29
|
+
### Yamaha RX-V**00
|
30
|
+
|
31
|
+
- 5-pin cable required (with RTS pin connected)
|
32
|
+
- Null-modem cable required
|
33
|
+
- Receiver socket is male
|
34
|
+
|
35
|
+
### Denon AVR-2308CI
|
36
|
+
|
37
|
+
- Straight cable required
|
38
|
+
- Receiver socket is female
|
39
|
+
|
40
|
+
### Integra DTR
|
41
|
+
|
42
|
+
- Straight cable required
|
43
|
+
|
3
44
|
## Protocol Notes
|
4
45
|
|
5
46
|
### RX-V1500 Power Values
|
data/lib/seriamp/sonamp/app.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'sinatra/base'
|
4
4
|
require 'seriamp/utils'
|
5
5
|
require 'seriamp/sonamp/client'
|
6
|
+
require 'seriamp/detect'
|
6
7
|
|
7
8
|
module Seriamp
|
8
9
|
module Sonamp
|
@@ -12,6 +13,10 @@ module Seriamp
|
|
12
13
|
set :logger, nil
|
13
14
|
set :client, nil
|
14
15
|
|
16
|
+
get '/' do
|
17
|
+
render_json(client.status)
|
18
|
+
end
|
19
|
+
|
15
20
|
get '/power' do
|
16
21
|
render_json(client.get_zone_power)
|
17
22
|
end
|
@@ -55,6 +60,7 @@ module Seriamp
|
|
55
60
|
end
|
56
61
|
|
57
62
|
def render_json(data)
|
63
|
+
headers['content-type'] = 'application/json'
|
58
64
|
data.to_json
|
59
65
|
end
|
60
66
|
end
|
data/lib/seriamp/version.rb
CHANGED
data/lib/seriamp/yamaha/app.rb
CHANGED
@@ -42,6 +42,34 @@ module Seriamp
|
|
42
42
|
empty_response
|
43
43
|
end
|
44
44
|
|
45
|
+
post "/#{zone}/volume/up" do
|
46
|
+
client.public_send("#{zone}_volume_up")
|
47
|
+
client.public_send("#{zone}_volume_up")
|
48
|
+
plain_response client.main_volume_db
|
49
|
+
end
|
50
|
+
|
51
|
+
post "/#{zone}/volume/up/:step" do |step|
|
52
|
+
client.public_send("#{zone}_volume_up")
|
53
|
+
step.to_i.times do
|
54
|
+
client.public_send("#{zone}_volume_up")
|
55
|
+
end
|
56
|
+
plain_response client.main_volume_db
|
57
|
+
end
|
58
|
+
|
59
|
+
post "/#{zone}/volume/down" do
|
60
|
+
client.public_send("#{zone}_volume_down")
|
61
|
+
client.public_send("#{zone}_volume_down")
|
62
|
+
plain_response client.main_volume_db
|
63
|
+
end
|
64
|
+
|
65
|
+
post "/#{zone}/volume/down/:step" do |step|
|
66
|
+
client.public_send("#{zone}_volume_down")
|
67
|
+
step.to_i.times do
|
68
|
+
client.public_send("#{zone}_volume_down")
|
69
|
+
end
|
70
|
+
plain_response client.main_volume_db
|
71
|
+
end
|
72
|
+
|
45
73
|
put "/#{zone}/input" do
|
46
74
|
value = request.body.read
|
47
75
|
client.public_send("set_#{zone}_input", value)
|
@@ -71,6 +99,11 @@ module Seriamp
|
|
71
99
|
def empty_response
|
72
100
|
render_json({})
|
73
101
|
end
|
102
|
+
|
103
|
+
def plain_response(data)
|
104
|
+
headers['content-type'] = 'text/plain'
|
105
|
+
data.to_s
|
106
|
+
end
|
74
107
|
end
|
75
108
|
end
|
76
109
|
end
|
@@ -7,7 +7,8 @@ require 'seriamp/yamaha/protocol/methods'
|
|
7
7
|
module Seriamp
|
8
8
|
module Yamaha
|
9
9
|
|
10
|
-
|
10
|
+
# The manual says response should be received in 500 ms.
|
11
|
+
RS232_TIMEOUT = 0.75
|
11
12
|
|
12
13
|
class Client
|
13
14
|
include Protocol::Methods
|
@@ -174,6 +175,29 @@ module Seriamp
|
|
174
175
|
'R0178' => 'RX-V2500',
|
175
176
|
}.freeze
|
176
177
|
|
178
|
+
PURE_DIRECT_FIELD = {
|
179
|
+
'R0177' => 28,
|
180
|
+
'R0178' => 126,
|
181
|
+
}.freeze
|
182
|
+
|
183
|
+
INPUT_MODE_R0178 = {
|
184
|
+
'0' => 'Auto',
|
185
|
+
'2' => 'DTS',
|
186
|
+
'4' => 'Analog',
|
187
|
+
'5' => 'Analog Only',
|
188
|
+
}.freeze
|
189
|
+
|
190
|
+
SAMPLE_RATE_R0178 = {
|
191
|
+
'0' => 'Analog',
|
192
|
+
'1' => 32000,
|
193
|
+
'2' => 44100,
|
194
|
+
'3' => 48000,
|
195
|
+
'4' => 64000,
|
196
|
+
'5' => 88200,
|
197
|
+
'6' => 96000,
|
198
|
+
'7' => 'Unknown',
|
199
|
+
}.freeze
|
200
|
+
|
177
201
|
def do_status
|
178
202
|
resp = nil
|
179
203
|
loop do
|
@@ -240,12 +264,20 @@ module Seriamp
|
|
240
264
|
sleep: SLEEP_GET.fetch(data[24]),
|
241
265
|
night: night = data[27],
|
242
266
|
night_name: NIGHT_GET.fetch(night),
|
243
|
-
pure_direct: data[
|
267
|
+
pure_direct: data[PURE_DIRECT_FIELD.fetch(@model_code)] == '1',
|
244
268
|
speaker_a: data[29] == '1',
|
245
269
|
speaker_b: data[30] == '1',
|
246
|
-
|
247
|
-
|
270
|
+
# 2 positions on RX-Vx700
|
271
|
+
#format: data[31..32],
|
272
|
+
#sampling: data[33..34],
|
248
273
|
)
|
274
|
+
if @model_code == 'R0178'
|
275
|
+
@status.update(
|
276
|
+
input_mode: INPUT_MODE_R0178.fetch(data[11]),
|
277
|
+
sampling: data[32],
|
278
|
+
sample_rate: SAMPLE_RATE_R0178.fetch(data[32]),
|
279
|
+
)
|
280
|
+
end
|
249
281
|
end
|
250
282
|
@status
|
251
283
|
end
|
data/lib/seriamp/yamaha/cmd.rb
CHANGED
@@ -74,26 +74,34 @@ module Seriamp
|
|
74
74
|
when 'volume'
|
75
75
|
which = args.shift
|
76
76
|
if %w(main zone2 zone3).include?(which)
|
77
|
-
prefix = "set_#{which}"
|
78
77
|
value = args.shift
|
79
78
|
else
|
80
|
-
prefix = 'set_main'
|
81
79
|
value = which
|
80
|
+
which = 'main'
|
82
81
|
end
|
83
|
-
|
84
|
-
|
85
|
-
|
82
|
+
prefix = "set_#{which}"
|
83
|
+
value = value.downcase
|
84
|
+
if value == 'up'
|
85
|
+
# Just like with remote, the first volume up or down command
|
86
|
+
# doesn't do anything.
|
87
|
+
client.public_send("#{which}_volume_up")
|
88
|
+
client.public_send("#{which}_volume_up")
|
89
|
+
elsif value == 'down'
|
90
|
+
client.public_send("#{which}_volume_down")
|
91
|
+
client.public_send("#{which}_volume_down")
|
86
92
|
else
|
87
|
-
|
88
|
-
|
89
|
-
value =
|
93
|
+
if %w(. -).include?(value)
|
94
|
+
method = "#{prefix}_mute"
|
95
|
+
value = true
|
96
|
+
else
|
97
|
+
method = "#{prefix}_volume_db"
|
98
|
+
if value[0] == ','
|
99
|
+
value = value[1..]
|
100
|
+
end
|
101
|
+
value = Float(value)
|
90
102
|
end
|
91
|
-
|
103
|
+
client.public_send(method, value)
|
92
104
|
end
|
93
|
-
client.public_send(method, value)
|
94
|
-
p client.get_main_volume_text
|
95
|
-
p client.get_zone2_volume_text
|
96
|
-
p client.get_zone3_volume_text
|
97
105
|
when 'input'
|
98
106
|
which = args.shift&.downcase
|
99
107
|
if %w(main zone2 zone3).include?(which)
|
@@ -112,8 +120,11 @@ module Seriamp
|
|
112
120
|
client.set_pure_direct(state)
|
113
121
|
when 'status'
|
114
122
|
pp client.last_status
|
115
|
-
when '
|
116
|
-
|
123
|
+
when 'dev-status'
|
124
|
+
status = client.last_status_string
|
125
|
+
0.upto(status.length-1).each do |i|
|
126
|
+
puts "%3d %s" % [i, status[i]]
|
127
|
+
end
|
117
128
|
when 'test'
|
118
129
|
client.set_power(false)
|
119
130
|
[true, false].each do |main_state|
|
data/seriamp.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seriamp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oleg Pudeyev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: serialport
|