forked from DiederikvandenB/nad-controller
-
Notifications
You must be signed in to change notification settings - Fork 0
/
serializer.go
137 lines (113 loc) · 2.57 KB
/
serializer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
package main
import (
"fmt"
"strconv"
"strings"
)
func writePower(message JSONMessage) SerialMessage {
return SerialMessage{
Command: "Power",
Value: serializeBool(message.Value),
}
}
func readPower(message SerialMessage) JSONMessage {
return JSONMessage{
Command: "power",
Value: parseBool(message.Value),
}
}
func readSpeaker(message SerialMessage) JSONMessage {
return JSONMessage{
Command: message.Command,
Value: parseBool(message.Value),
}
}
func writeSpeaker(message JSONMessage) SerialMessage {
return SerialMessage{
Command: message.Command,
Value: serializeBool(message.Value),
}
}
func writeVolume(message JSONMessage) SerialMessage {
decibel := getDecibels(message.Value)
return SerialMessage{
Command: "Volume",
Value: decibel,
}
}
func readVolume(message SerialMessage) JSONMessage {
// For some reason, when the amp starts up, it sends the volume as a percentage
// Probably only when `Main.VolumeDisplayMode=Percent`
if strings.Contains(message.Value, "%") {
str := strings.Replace(message.Value, "%", "", 1)
toFloat, _ := strconv.ParseFloat(str, 32)
percentage := fmt.Sprintf("%.2f", toFloat/100)
return JSONMessage{
Command: "volume",
Value: percentage,
}
}
decibel := message.Value
percentage := getPercentages(decibel)
return JSONMessage{
Command: "volume",
Value: percentage,
}
}
func readVolumeLegacy(message SerialMessage) JSONMessage {
if strings.Contains(message.Value, "+") {
return JSONMessage{
Command: "volume",
Value: "+",
}
} else {
return JSONMessage{
Command: "volume",
Value: "-",
}
}
}
func writeVolumeLegacy(message JSONMessage) SerialMessage {
return SerialMessage{
Command: "Volume" + message.Value,
Value: "",
}
}
func writeMute(message JSONMessage) SerialMessage {
return SerialMessage{
Command: "Mute",
Value: serializeBool(message.Value),
}
}
func readMute(message SerialMessage) JSONMessage {
return JSONMessage{
Command: "mute",
Value: parseBool(message.Value),
}
}
func writeSource(message JSONMessage) SerialMessage {
return SerialMessage{
Command: "Source",
Value: message.Value,
}
}
// It seems like the device does not publish a source change over the serial port when the change is initiated by the
// infrared remote.
func readSource(message SerialMessage) JSONMessage {
return JSONMessage{
Command: "source",
Value: message.Value,
}
}
func parseBool(value string) string {
if value == "On" {
return "1"
}
return "0"
}
func serializeBool(value string) string {
if value == "1" {
return "On"
}
return "Off"
}