Infrastructure compatible for all groups instead of switches.
[smartthings-infrastructure.git] / MusicPlayer / MusicPlayers.groovy
1 //Create a class for music player
2 package MusicPlayer
3 import Timer.SimulatedTimer
4
5 //JPF's Verify API
6 import gov.nasa.jpf.vm.Verify
7
8 public class MusicPlayers {
9         private int deviceNumbers
10         private List musicPlayers
11         def sendEvent
12
13         //For one device(We cannot have obj.id)-> We should have obj[0].id
14         private String id = "musicPlayerID0"
15         private String label = "musicPlayer0"
16         private String displayName = "musicPlayer0"
17         private int level = 20
18         private String mute = "unmuted"
19         private String status = "pause"
20         private int trackNumber = 1
21         private String trackData = "someTrack"
22         private String trackDescription = "someDescriptions"
23
24         
25                 
26         MusicPlayers(Closure sendEvent, int deviceNumbers) {
27                 this.sendEvent = sendEvent
28                 this.deviceNumbers = deviceNumbers
29                 this.musicPlayers = []
30
31                 /*def initLevel = Verify.getIntFromList(10, 20, 30)
32                 this.level = initLevel
33                 def initMute = Verify.getBoolean()
34                 if (initMute) {
35                         this.mute = "unmuted"
36                 } else {
37                         this.mute = "muted"
38                 }
39                 def initStatus = Verify.getInt(0,2)
40                 if (initStatus == 0) {
41                         this.status = "paused"
42                 } else if (initStatus == 1) {
43                         this.status = "playing"
44                 } else {
45                         this.status = "stopped"
46                 }
47                 def initTrack = Verify.getIntFromList(1, 2, 3)
48                 this.trackNumber = initTrack 
49                 def initData = Verify.getBoolean()
50                 if (initData) {
51                         this.trackData = "someTrack"
52                 } else {
53                         this.trackData = "someOtherTrack"
54                 }
55                 def initDesc = Verify.getBoolean()
56                 if (initDesc) {
57                         this.trackDescription = "someDescriptions"
58                 } else {
59                         this.trackDescription = "someOtherDescriptions"
60                 }*/
61                 musicPlayers.add(new MusicPlayer(sendEvent, id, label, displayName, this.level, this.mute, this.status, this.trackNumber, this.trackData, this.trackDescription))
62         }
63
64         //By model checker
65         def setValue(LinkedHashMap eventDataMap) {
66                 if (eventDataMap["name"] == "status") {
67                         if (eventDataMap["value"] != musicPlayers[0].status) {
68                                 this.status = eventDataMap["value"]
69                                 musicPlayers[0].setValue(eventDataMap["value"], "status")
70                                 sendEvent(eventDataMap)
71                         }       
72                 } else if (eventDataMap["name"] == "level") {
73                         if (eventDataMap["value"].toInteger() != musicPlayers[0].level) {
74                                 this.level = eventDataMap["value"].toInteger()
75                                 musicPlayers[0].setValue(eventDataMap["value"], "level")
76                                 sendEvent(eventDataMap)
77                         }
78                 } else if (eventDataMap["name"] == "trackDescription") {
79                         if (eventDataMap["value"] != musicPlayers[0].trackDescription) {
80                                 this.trackDescription = eventDataMap["value"]
81                                 musicPlayers[0].setValue(eventDataMap["value"], "trackDescription")
82                                 sendEvent(eventDataMap)
83                         }
84                 } else if (eventDataMap["name"] == "trackData") {
85                         if (eventDataMap["value"] != musicPlayers[0].trackData) {
86                                 this.trackData = eventDataMap["value"]
87                                 musicPlayers[0].setValue(eventDataMap["value"], "trackData")                            
88                                 sendEvent(eventDataMap)
89                         }
90                 } else if (eventDataMap["name"] == "mute") {
91                         if (eventDataMap["value"] != musicPlayers[0].mute) {
92                                 this.mute = eventDataMap["value"]
93                                 musicPlayers[0].setValue(eventDataMap["value"], "mute")
94                                 sendEvent(eventDataMap)
95                         }
96                 }
97         }
98
99         //Methods for closures
100         def count(Closure Input) {
101                 musicPlayers.count(Input)
102         }
103         def size() {
104                 musicPlayers.size()
105         }
106         def each(Closure Input) {
107                 musicPlayers.each(Input)
108         }
109         def find(Closure Input) {
110                 musicPlayers.find(Input)
111         }
112         def sort(Closure Input) {
113                 musicPlayers.sort(Input)
114         }
115         def collect(Closure Input) {
116                 musicPlayers.collect(Input)
117         }
118
119         //methods
120         def on(LinkedHashMap metaData) {
121                 on()
122         }
123         def on() {
124                 if (status != "on") {
125                         this.status = "on"
126                         musicPlayers[0].on()
127                 }
128         }
129         def off(LinkedHashMap metaData) {
130                 off()
131         }
132         def off() {
133                 if (status != "off") {
134                         this.status = "off"
135                         musicPlayers[0].off()
136                 }
137         }
138         def mute(LinkedHashMap metaData) {
139                 mute()
140         }
141         def mute() {
142                 if (mute != "muted") {
143                         this.mute = "muted"
144                         musicPlayers[0].mute()
145                 }
146         }
147         def nextTrack(LinkedHashMap metaData) {
148                 nextTrack()
149         }
150         def nextTrack() {
151                 if (status != "play") {
152                         this.status = "play"
153                 }
154                 this.trackNumber = this.trackNumber+1
155                 musicPlayers[0].nextTrack()
156         }
157         def pause(LinkedHashMap metaData) {
158                 pause()
159         }
160         def pause() {
161                 if (status != "pause") {
162                         this.status = "pause"
163                         musicPlayers[0].pause()                 
164                 }
165         }
166         def play(LinkedHashMap metaData) {
167                 play()
168         }
169         def play() {
170                 if (status != "play") {
171                         this.status = "play"
172                         musicPlayers[0].play()
173                 }
174         }
175         def playTrack(LinkedHashMap metaData) {
176                 playTrack()
177         }
178         def playTrack(String trackToPlay) {
179                 if (status != "play") {
180                         this.status = "play"
181                 }
182                 musicPlayers[0].playTrack(trackToPlay)
183         }
184         def previousTrack(LinkedHashMap metaData) {
185                 previousTrack()
186         }
187         def previousTrack() {
188                 if (status != "play") {
189                         this.status = "play"
190                 }
191                 if (this.trackNumber != 1)
192                         this.trackNumber = this.trackNumber-1
193                 musicPlayers[0].previousTrack()
194         }
195         def restoreTrack(LinkedHashMap metaData) {
196                 restoreTrack()
197         }
198         def restoreTrack(String trackToRestore) {
199                 musicPlayers[0].restoreTrack(trackToRestore)
200         }
201         def resumeTrack(LinkedHashMap metaData) {
202                 resumeTrack()
203         }
204         def resumeTrack(String trackToResume) {
205                 if (status != "play") {
206                         this.status = "play"
207                 }
208                 musicPlayers[0].resumeTrack(trackToResume)
209         }
210         def setLevel(LinkedHashMap metaData) {
211                 setLevel()
212         }
213         def setLevel(int level) {
214                 if (level != this.level) {
215                         this.level = level      
216                         musicPlayers[0].setLevel(level)
217                 }
218         }
219         def setTrack(LinkedHashMap metaData) {
220                 setTrack()
221         }
222         def setTrack(String trackToSet) {
223                 if (status != "play") {
224                         this.status = "play"
225                 }
226                 musicPlayers[0].setTrack(trackToSet)
227         }
228         def stop(LinkedHashMap metaData) {
229                 stop()
230         }
231         def stop() {
232                 if (status != "stop") {
233                         this.status = "stop"
234                         musicPlayers[0].stop()
235                 }
236         }
237         def playText(LinkedHashMap metaData) {
238                 playText()
239         }
240         def playText(String text) {
241                 if (status != "play") {
242                         this.status = "play"
243                 }
244                 musicPlayers[0].playText(text)
245         }
246
247         def currentValue(String deviceFeature) {
248                 musicPlayers[0].currentValue(deviceFeature)
249         }
250
251         def latestValue(String deviceFeature) {
252                 musicPlayers[0].latestValue(deviceFeature)
253         }
254
255         def getAt(int ix) {
256                 musicPlayers[ix]
257         }
258 }