//Create a class for music player package MusicPlayer import Timer.SimulatedTimer public class MusicPlayer { def sendEvent private String id private String label private String displayName private int level private String mute private String status private int trackNumber private String trackData private String trackDescription def sendEvent MusicPlayer(Closure sendEvent, String id, String label, String displayName, int level, String mute, String status, int trackNumber, String trackData, String trackDescription) { this.sendEvent = sendEvent this.id = id this.label = label this.displayName = displayName this.level = level this.mute = mute this.status = status this.trackNumber = trackNumber this.trackData = trackData this.trackDescription = trackDescription } //By model checker def setValue(String value, String name) { if ((name == "status") && (value != this.status)) { this.status = value println("the status of the music player with id:$id is changed to $value!") } else if ((name == "level") && (value != this.level)) { this.level = value.toInteger() println("the level sound of the music player with id:$id is changed to $value!") } else if ((name == "trackDescription") && (value != this.trackDescription)) { this.trackDescription = value println("the trackDescription of the music player with id:$id is changed to $value!") } else if ((name == "trackData") && (value != this.trackData)) { this.trackData = value println("the trackData of the music player with id:$id is changed to $value!") } else if ((name == "mute") && (value != this.mute)) { this.mute = value println("the mute state of the music player with id:$id is changed to $value!") } } //methods def mute() { if (mute != "muted") { println("the music player with id:$id is muted!") this.mute = "muted" sendEvent([name: "mute", value: "muted", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "mute.muted", value: "muted", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } } def nextTrack() { trackNumber = trackNumber+1 def trackPlaying = trackData println("the $trackPlaying is selected!") if (status != "playing") { this.status = "playing" sendEvent([name: "status", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "status.playing", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } sendEvent([name: "trackDescription", value: "someDescriptions", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "trackData", value: "someTrack", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } def pause() { if (status != "paused") { println("the music player with id:$id is paused!") this.status = "paused" sendEvent([name: "status", value: "paused", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "status.paused", value: "paused", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } } def play() { if (status != "playing") { println("the music player with id:$id is starting to play!") this.status = "playing" sendEvent([name: "status", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "status.playing", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } } def playTrack(String trackToPlay) { def trackPlaying = trackData println("the $trackPlaying is selected to play!") if (status != "playing") { this.status = "playing" sendEvent([name: "status", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "status.playing", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } sendEvent([name: "trackDescription", value: "someDescriptions", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "trackData", value: "someTrack", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } def previousTrack() { if (trackNumber != 1) trackNumber = trackNumber-1 def trackPlaying = trackData println("the $trackPlaying is selected!") if (status != "playing") { this.status = "playing" sendEvent([name: "status", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "status.playing", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } sendEvent([name: "trackDescription", value: "someDescriptions", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "trackData", value: "someTrack", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } /*def restoreTrack(String trackToRestore) { musicPlayers*.restoreTrack(trackToRestore) }*/ def resumeTrack(String trackToResume) { def trackPlaying = trackData println("the $trackPlaying is resumed!") if (status != "playing") { this.status = "playing" sendEvent([name: "status", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "status.playing", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } } def setLevel(int level) { if (level != this.level) { this.level = level println("the level of sound is changed to $level!") sendEvent([name: "level", value: "$level", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } } def setTrack(String trackToSet) { def trackPlaying = trackData println("the $trackPlaying is set!") if (status != "playing") { this.status = "playing" sendEvent([name: "status", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "status.playing", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } sendEvent([name: "trackDescription", value: "someDescriptions", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "trackData", value: "someTrack", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } def stop() { if (status != "stopped") { println("the music player with id:$id is stopped!") this.status = "stopped" sendEvent([name: "status", value: "stopped", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "status.stopped", value: "stopped", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } } def playText(String text) { println("the music player with id:$id is playing the text:$text!") if (status != "playing") { this.status = "playing" sendEvent([name: "status", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "status.playing", value: "playing", deviceId: this.id, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } } def currentValue(String deviceFeature) { if (deviceFeature == "musicPlayer") { return status } } def latestValue(String deviceFeature) { if (deviceFeature == "musicPlayer") { return status } } }