Infrastructure that works for all the locks' group!
[smartthings-infrastructure.git] / Lock / Locks.groovy
index d5f97ae8e57e595e91feff1849a8f9978b19e45b..ea75ef3e4863611aa4ed92cd989eebd382cf8c96 100644 (file)
 //Create a class for lock device
 package Lock
+import Timer.SimulatedTimer
 
-public class Locks {
-       private int id
-       private String displayName
-       private String lockCurrentValue
-       private String lockLatestValue
+//JPF's Verify API
+import gov.nasa.jpf.vm.Verify
+
+public class Locks{
+       int deviceNumbers       
+       List locks      
        def sendEvent   
        def timers
 
+       //When we have only one device
+       private String id = "lockID0"
+       private String label = "lock0"
+       private String displayName = "lock0"
+       private String lockState = "locked"
+       private String currentLock = "locked"
+       private String lockLatestValue = "locked"
 
-       Locks(Closure sendEvent, int id, String displayName, String lockCurrentValue, String lockLatestValue) {
-               this.id = id
+       Locks(Closure sendEvent, int deviceNumbers) {
                this.sendEvent = sendEvent
-               this.displayName = displayName
-               this.lockCurrentValue = lockCurrentValue
-               this.lockLatestValue = lockLatestValue
-               this.timers = new Timer()
+               this.timers = new SimulatedTimer()
+               this.deviceNumbers = deviceNumbers
+               this.locks = []
+
+               def init = Verify.getBoolean()
+               if (init) {
+                       this.lockState = "locked"
+                       this.lockLatestValue = "locked"
+               } else {
+                       this.lockState = "unlocked"
+                       this.lockLatestValue = "unlocked"
+               }
+               locks.add(new Lock(sendEvent,id, label, displayName, this.lockState, this.lockLatestValue))
        }
 
        //By Apps
        def lock() {
-               println("the door with id:$id is locked!")
-               this.lockLatestValue = this.lockCurrentValue
-               this.lockCurrentValue = "locked"
-               sendEvent([name: "lock", value: "locked", deviceId: this.id, descriptionText: "",
-                         displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
+               if (lockState != "locked") {
+                       locks[0].lock()
+                       lockLatestValue = lockState
+                       lockState = "locked"
+                       currentLock = "locked"
+               }
        }
 
        def lock(LinkedHashMap metaData) {
-               def task = timers.runAfter(metaData["delay"]) {
-                       println("the door with id:$id is locked!")
-                       this.lockLatestValue = this.lockCurrentValue
-                       this.lockCurrentValue = "locked"
-                       sendEvent([name: "lock", value: "locked", deviceId: this.id, descriptionText: "",
-                                 displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
+               if (lockState != "locked") {
+                       def task = timers.runAfter(metaData["delay"]) {
+                               locks[0].lock()
+                               lockLatestValue = lockState
+                               lockState = "locked"
+                               currentLock = "locked"
+                       }
                }
        }
-       
+
        def unlock() {
-               println("the door with id:$id is unlocked!")
-               this.lockLatestValue = this.lockCurrentValue
-               this.lockCurrentValue = "unlocked"
-               sendEvent([name: "unlock", value: "unlocked", deviceId: this.id, descriptionText: "",
-                         displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
+               if (lockState != "unlocked") {
+                       locks[0].unlock()
+                       lockLatestValue = lockState
+                       lockState = "unlocked"
+                       currentLock = "unlocked"
+               }
        }
 
+
        def unlock(LinkedHashMap metaData) {
-               def task = timers.runAfter(metaData["delay"]) {
-                       println("the door with id:$id is locked!")
-                       this.lockLatestValue = this.lockCurrentValue
-                       this.lockCurrentValue = "locked"
-                       sendEvent([name: "unlock", value: "unlocked", deviceId: this.id, descriptionText: "",
-                                 displayed: true, linkText: "", isStateChange: false, unit: "", data: []])
+               if (lockState != "unlocked") {
+                       def task = timers.runAfter(metaData["delay"]) {
+                               locks[0].unlock()
+                               lockLatestValue = lockState
+                               lockState = "unlocked"
+                               currentLock = "unlocked"
+                       }
                }
        }
 
+       //Methods for closures
+       def count(Closure Input) {
+               locks.count(Input)
+       }
+       def size() {
+               locks.size()
+       }
+       def each(Closure Input) {
+               locks.each(Input)
+       }
+       def find(Closure Input) {
+               locks.find(Input)
+       }
+       def collect(Closure Input) {
+               locks.collect(Input)
+       }
+
        //By Model Checker
-       def setValue(String value) {
-               println("the door with id:$id is $value!")
-               this.lockLatestValue = this.lockCurrentValue
-               this.lockCurrentValue = value
+       def setValue(LinkedHashMap eventDataMap) {
+               if (eventDataMap["value"] != locks[0].lockState) {
+                       locks[0].setValue(eventDataMap["value"])
+                       this.lockState = locks[0].lockState
+                       this.currentLock = locks[0].lockState
+                       this.lockLatestValue = locks[0].lockLatestValue
+                       sendEvent(eventDataMap)
+               }
        }
-       
+
        def currentValue(String deviceFeature) {
-               if (deviceFeature == "lock") {
-                       return lockCurrentValue
-               }
+               locks[0].currentValue(deviceFeature)
        }
 
        def latestValue(String deviceFeature) {
-               if (deviceFeature == "lock") {
-                       return lockLatestValue
-               }
+               locks[0].latestValue(deviceFeature)
+       }
+
+       def getAt(int ix) {
+               locks[ix]
        }
 }
+