481c0ac42b93c1e6506dc9f1df91a10989b8a4c7
[smartthings-infrastructure.git] / MusicPlayer / MusicPlayer.groovy
1 //Create a class for music player
2 package MusicPlayer
3 import SmartThing.SmartThing
4
5 //Importing mutable integer class
6 import MutableInteger.MutableInteger
7
8 public class MusicPlayer extends SmartThing {
9         // id, label, and display name of the device
10         StringBuilder id = new StringBuilder()
11         StringBuilder label = new StringBuilder()
12         StringBuilder displayName = new StringBuilder()
13         // Features with numberical values
14         MutableInteger currentLevel = new MutableInteger()
15         // Features with string values
16         StringBuilder currentMute = new StringBuilder()
17         StringBuilder currentStatus = new StringBuilder()
18         StringBuilder currentTrackData = new StringBuilder()
19         StringBuilder currentTrackDescription = new StringBuilder()
20         // Maps from features to values
21         HashMap<String, StringBuilder> deviceValuesMap = new HashMap<String, StringBuilder>()
22         HashMap<String, MutableInteger> deviceIntValuesMap = new HashMap<String, MutableInteger>()
23         // Possible values for eventsSince method
24         List<StringBuilder> possibleValues = new ArrayList<StringBuilder>();
25         
26         MusicPlayer(Closure sendEvent, StringBuilder id, StringBuilder label, StringBuilder displayName, MutableInteger currentLevel, 
27                     StringBuilder currentMute, StringBuilder currentStatus, StringBuilder currentTrackData, StringBuilder currentTrackDescription) {
28                 deviceValuesMap = deviceValueSmartThing
29                 deviceIntValuesMap = deviceIntValueSmartThing
30                 idSmartThing = id
31                 labelSmartThing = label
32                 displayNameSmartThing = displayName
33                 sendEventSmartThings = sendEvent
34                 possibleValuesSmartThings = possibleValues
35
36                 // Initialization
37                 this.id = id
38                 this.label = label
39                 this.currentLevel = currentLevel
40                 this.currentMute = currentMute
41                 this.currentStatus = currentStatus
42                 this.currentTrackData = currentTrackData
43                 this.currentTrackDescription = currentTrackDescription
44                 possibleValues.add("on")
45                 possibleValues.add("off")
46
47                 deviceValuesMap.put("status", currentStatus)
48                 deviceValuesMap.put("playpause", currentStatus)
49                 deviceValuesMap.put("trackDescription", currentTrackDescription)
50                 deviceValuesMap.put("mute", currentMute)
51                 deviceValuesMap.put("trackData", currentTrackData)
52                 deviceIntValuesMap.put("level", currentLevel)
53         }
54
55         // Methods to set values
56         def on(LinkedHashMap metaData) {
57                 on()
58         }
59
60         def on() {
61                 action(currentStatus, "on", "status")
62         }
63
64         def off(LinkedHashMap metaData) {
65                 off()
66         }
67
68         def off() {
69                 action(currentStatus, "off", "status")
70         }
71
72         def mute(LinkedHashMap metaData) {
73                 mute()
74         }
75
76         def mute() {
77                 action(currentMute, "muted", "mute")
78         }
79
80         def unmute(LinkedHashMap metaData) {
81                 unmute()
82         }
83
84         def unmute() {
85                 action(currentMute, "unmuted", "mute")
86         }
87
88         def nextTrack(LinkedHashMap metaData) {
89                 nextTrack()
90         }
91
92         def nextTrack() {
93                 play()
94                 musicChangeEvents()
95         }
96
97         def pause(LinkedHashMap metaData) {
98                 pause()
99         }
100
101         def pause() {
102                 action(currentStatus, "pause", "status")
103         }
104
105         def play(LinkedHashMap metaData) {
106                 play()
107         }
108
109         def play() {
110                 action(currentStatus, "play", "status")
111         }
112
113         def playTrack(LinkedHashMap metaData) {
114                 playTrack()
115         }
116
117         def playTrack(String trackToPlay) {
118                 play()
119                 musicChangeEvents()
120         }
121
122         def previousTrack(LinkedHashMap metaData) {
123                 previousTrack()
124         }
125
126         def previousTrack() {
127                 play()
128                 musicChangeEvents()
129         }
130         
131         def resumeTrack(LinkedHashMap metaData) {
132                 resumeTrack()
133         }
134
135         def resumeTrack(String trackToResume) {
136                 play()
137         }
138
139         def restoreTrack(LinkedHashMap metaData) {
140                 restoreTrack()
141         }
142
143         def restoreTrack(String trackToRestore) {
144                 play()
145                 musicChangeEvents()
146         }
147
148         def setLevel(LinkedHashMap metaData) {
149                 setLevel()
150         }
151
152         def setLevel(int level) {
153                 action(currentLevel, level, "level")
154         }
155
156         def setTrack(LinkedHashMap metaData) {
157                 setTrack()
158         }
159
160         def setTrack(String trackToSet) {
161                 play()
162                 
163         }
164
165         def stop(LinkedHashMap metaData) {
166                 stop()
167         }
168
169         def stop() {
170                 action(currentStatus, "stop", "status")
171         }
172
173         def action(StringBuilder variable, String newValue, String feature) {
174                 if (!variable.toString().equals(newValue)) {
175                         String tmpID = id.toString()
176                         variable.replace(0, variable.length(), newValue)
177                         println("$feature of the music player with id:$tmpID is changed to $newValue!")
178                         sendEvent([name: feature, value: newValue, deviceId: tmpID, descriptionText: "",
179                                    displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
180                 }
181         }
182
183         def action(MutableInteger variable, int newValue, String feature) {
184                 if (!variable.getValue().equals(newValue)) {
185                         String tmpID = id.toString()
186                         variable.setValue(newValue)
187                         println("$feature for the thermostat with id:$tmpID is changed to $newValue!")
188                         sendEvent([name: feature, value: newValue, deviceId: tmpID, descriptionText: "",
189                                    displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
190                 }
191         }
192
193         def musicChangeEvents() {
194                 sendEvent([name: "trackDescription", value: "someDescriptions", deviceId: id.toString(), descriptionText: "",
195                            displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
196                 sendEvent([name: "trackData", value: "someTrack", deviceId: id.toString(), descriptionText: "",
197                            displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
198         }
199
200         // Methods to return values
201         def getCurrentLevel() {
202                 return currentLevel.getValue()
203         }
204
205         def getCurrentMute() {
206                 return currentMute.toString()
207         }
208         
209         def getCurrentStatus() {
210                 return currentStatus.toString()
211         }
212
213         def getCurrentTrackData() {
214                 return currentTrackData.toString()
215         }
216
217         def getCurrentTrackDescription() {
218                 return currentTrackDescription.toString()
219         }
220 }