Adding remaining devices!
[smartthings-infrastructure.git] / Extractor / Extractor.groovy
index 4c90690d7266816e62564a6e679c21e3e9b30280..cf19c458f1c4857d547bce7c8d4b9a947d3fa311 100644 (file)
@@ -76,10 +76,13 @@ import Button.Button
 import Button.Buttons
 import ThreeAxis.ThreeAxis
 import ThreeAxis.ThreeAxises
+import Momentary.Momentary
+import Momentary.Momentaries
+import RemainingDevices.RemainingDevices
 import Timer.SimulatedTimer
 
 //GlobalVariables
-@Field def location = new LocationVar()
+@Field def location = new LocationVar({}, true)
 //Settings variable defined to settings on purpose
 @Field def settings = [app: "app"]
 //Global variable for state[mode]
@@ -99,15 +102,21 @@ import Timer.SimulatedTimer
 @Field File extractedObjectsConstructorApp1 = new File("Extractor/App1/extractedObjectsConstructorApp1.groovy")
 @Field File extractedObjectsConstructorApp2 = new File("Extractor/App2/extractedObjectsConstructorApp2.groovy")
 
-
+//Set this to true for global-state variable conflict
+@Field assignDifferentModes = true
+@Field chooseMode = 0
 //Empty the files
 if (App == "App1") {
        globalObjects.write("")
        extractedObjectsApp1.write("")
        extractedObjectsConstructorApp1.write("")
+       if (assignDifferentModes)
+               chooseMode = 0
 } else if (App == "App2") {
        extractedObjectsApp2.write("")
        extractedObjectsConstructorApp2.write("")
+       if (assignDifferentModes)
+               chooseMode = 2
 }
 
 
@@ -295,6 +304,11 @@ def timeToday(String time, Object timeZone) {
 @Field def threeAxisObject0
 @Field def threeAxisObject1
 @Field def threeAxisObject2
+//Global Object for class momentary switch device!
+@Field momentaryObjects = 0
+@Field def momentaryObject0
+@Field def momentaryObject1
+@Field def momentaryObject2
 
 
 //Global variables
@@ -404,6 +418,15 @@ def input(LinkedHashMap metaData) {
                println "Options: "+metaData['options']
        }
        def contains = 0
+       def List = ["capability.carbonDioxideMeasurement", "capability.consumable", "capability.pHMeasurement", "capability.shockSensor", 
+                   "capability.signalStrength", "capability.soundSensor", "capability.soundPressureLevel", "capability.tamperAlert",
+                   "capability.ultravioletIndex", "capability.voltageMeasurement", "capability.windowShade", "capability.sensor"]
+       String thisCapability = ""      
+       if (metaData['type'] in List) {
+               int dot = metaData['type'].indexOf('.')
+               thisCapability = metaData['type'].substring(dot + 1)
+               metaData['type'] = "capability.remainingDevices"
+       }
        switch(metaData['type']) {
                case "capability.lock":
                        globalObjects.eachLine { line ->
@@ -895,6 +918,41 @@ def input(LinkedHashMap metaData) {
                                extractedObjectsConstructorApp2.append(metaData['name']+" = obj.accelerationSensorObject\n")
                        }
                        break
+               case "capability.momentary":
+                       globalObjects.eachLine { line ->
+                               if(line.contains("momentoryObject")){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def momentaryObject = new Momentaries(sendEvent, 1)\n")
+
+                       if (momentaryObjects == 0) {
+                               momentaryObject0 = metaData['name']
+                               this[momentaryObject0] = new Momentaries({}, 1)
+                       } else if (momentaryObjects == 1) {
+                               momentaryObject1 = metaData['name']
+                               this[momentaryObject1] = new Momentaries({}, 1)
+                       } else if (momentaryObjects == 2) {
+                               momentaryObject2 = metaData['name']
+                               this[momentaryObject2] = new Momentaries({}, 1)
+                       }
+
+                       momentaryObjects=momentaryObjects+1
+
+                       settings.put(metaData['name'], new Momentaries({}, 1))
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class momentory switch class!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.momentaryObject\n")             
+                       } else {
+                               extractedObjectsApp2.append("//Object for class momentory Sensor!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.momentaryObject\n")
+                       }                       
+                       break
                case "capability.motionSensor":
                        globalObjects.eachLine { line ->
                                if(line.contains("motionSensorObject")){
@@ -1597,7 +1655,17 @@ def input(LinkedHashMap metaData) {
                case "mode":
                        //def randomVariable = Math.abs(new Random().nextInt() % 3)
                        def modes = ["away", "home", "night"]
-                       def userInput = modes[1]
+                       // Always assign a different mode to each app
+                       def userInput
+                       if (assignDifferentModes) {                     
+                               userInput = modes[chooseMode]
+                               if (chooseMode < 3)
+                                       chooseMode++;
+                               else
+                                       chooseMode = chooseMode%3
+                       } else {
+                               userInput = modes[1]
+                       }
 
                        if (modeVariables == 0) {
                                mode0 = metaData['name']
@@ -1993,6 +2061,29 @@ def input(LinkedHashMap metaData) {
                                extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
                        }
                        break
+               case "capability.remainingDevices":
+                       String nameOfObject = thisCapability+"Object"
+                       globalObjects.eachLine { line ->
+                               if(line.contains(nameOfObject)){
+                                       contains = 1
+                               }
+                       }
+
+                       if (contains == 0)
+                               globalObjects.append("@Field def $nameOfObject = new RemainingDevices(sendEvent, 1)\n")
+
+                       settings.put(metaData['name'], new RemainingDevices({}, 1))
+
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class remaining devices!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.$nameOfObject\n")               
+                       } else {
+                               extractedObjectsApp2.append("//Object for class remaining devices!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.$nameOfObject\n")
+                       }
+                       break
                default:
                        break
        }
@@ -2063,7 +2154,7 @@ def preferences(Closure inputData) {
                GlobalVariablesBothApps.write("")
                GlobalVariablesBothApps.append("//Creating Global variables for both apps\n")
                GlobalVariablesBothApps.append("@Field def sendEvent = {eventDataMap -> eventHandler(eventDataMap)}\n")
-               GlobalVariablesBothApps.append("@Field def locationObject = new LocationVar(sendEvent)\n")
+               GlobalVariablesBothApps.append("@Field def locationObject = new LocationVar(sendEvent, init)\n")
                GlobalVariablesBothApps.append("@Field def appObject = new Touched(sendEvent, 0)\n")
                
                globalObjects.withReader { reader ->