From 1bac443ac1ed2689852ef846c6332865374e2b36 Mon Sep 17 00:00:00 2001 From: rtrimana Date: Wed, 27 Sep 2017 15:08:21 -0700 Subject: [PATCH 1/1] Adding doorlock to the fourth benchmark --- .../HomeSecurityController.java | 138 +++----- .../Java/HomeSecurityController/Makefile | 4 +- .../SmartthingsActuatorCallback_Skeleton.java | 116 +++++++ .../SmartthingsActuatorSmart_Stub.java | 193 +++++++++++ .../DoorlockActuator/DoorlockActuator.config | 7 + .../DoorlockActuator/DoorlockActuator.java | 300 ++++++++++++++++ ...SmartthingsActuatorSmartCallback_Stub.java | 47 +++ .../SmartthingsActuator_Skeleton.java | 323 ++++++++++++++++++ benchmarks/drivers/Java/Makefile | 16 +- .../interfaces/SmartthingsActuator.java | 16 + .../SmartthingsActuatorCallback.java | 8 + .../interfaces/SmartthingsActuatorSmart.java | 17 + .../SmartthingsActuatorSmartCallback.java | 9 + iotjava/Makefile | 6 + .../smartthingsactuator.pol | 39 +++ .../smartthingsactuator.req | 3 + .../smartthingsactuatorcallback.pol | 11 + .../smartthingsactuatorcallback.req | 3 + .../mysql/doorlockActuatorUdpAddress.config | 5 + .../doorlockActuatorZigbeeAddress.config | 5 + localconfig/mysql/doorlockSet.config | 3 + others/Mysql/IoTMain.gz | Bin 5220 -> 5397 bytes others/lede-gui/.idea/misc.xml | 2 +- others/lede-gui/.idea/workspace.xml | 227 +++--------- others/lede-gui/lede-gui.iml | 18 - 25 files changed, 1232 insertions(+), 284 deletions(-) create mode 100644 benchmarks/Java/HomeSecurityController/SmartthingsActuatorCallback_Skeleton.java create mode 100644 benchmarks/Java/HomeSecurityController/SmartthingsActuatorSmart_Stub.java create mode 100644 benchmarks/drivers/Java/DoorlockActuator/DoorlockActuator.config create mode 100644 benchmarks/drivers/Java/DoorlockActuator/DoorlockActuator.java create mode 100644 benchmarks/drivers/Java/DoorlockActuator/SmartthingsActuatorSmartCallback_Stub.java create mode 100644 benchmarks/drivers/Java/DoorlockActuator/SmartthingsActuator_Skeleton.java create mode 100644 benchmarks/interfaces/SmartthingsActuator.java create mode 100644 benchmarks/interfaces/SmartthingsActuatorCallback.java create mode 100644 benchmarks/interfaces/SmartthingsActuatorSmart.java create mode 100644 benchmarks/interfaces/SmartthingsActuatorSmartCallback.java create mode 100644 localconfig/iotpolicy/SmartthingsActuator/smartthingsactuator.pol create mode 100644 localconfig/iotpolicy/SmartthingsActuator/smartthingsactuator.req create mode 100644 localconfig/iotpolicy/SmartthingsActuator/smartthingsactuatorcallback.pol create mode 100644 localconfig/iotpolicy/SmartthingsActuator/smartthingsactuatorcallback.req create mode 100644 localconfig/mysql/doorlockActuatorUdpAddress.config create mode 100644 localconfig/mysql/doorlockActuatorZigbeeAddress.config create mode 100644 localconfig/mysql/doorlockSet.config diff --git a/benchmarks/Java/HomeSecurityController/HomeSecurityController.java b/benchmarks/Java/HomeSecurityController/HomeSecurityController.java index 68cf0fb..c87eece 100644 --- a/benchmarks/Java/HomeSecurityController/HomeSecurityController.java +++ b/benchmarks/Java/HomeSecurityController/HomeSecurityController.java @@ -8,6 +8,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.HashSet; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.ConcurrentHashMap; @@ -33,7 +34,7 @@ import iotcode.interfaces.*; * @version 1.0 * @since 2016-12-14 */ -public class HomeSecurityController implements SmartthingsSensorCallback { +public class HomeSecurityController implements SmartthingsSensorCallback, SmartthingsActuatorCallback { /* * Constants @@ -43,6 +44,8 @@ public class HomeSecurityController implements SmartthingsSensorCallback { private static final int CHECK_TIME_WAIT = 1; // in seconds private static final int SECOND_TO_TURN_ON = 60; // in seconds private static final int SECOND_TO_TURN_OFF = 1; // in seconds + private static final int LOCK_DOOR = 0; + private static final int UNLOCK_DOOR = 1; /** * IoT Sets and Relations @@ -54,24 +57,17 @@ public class HomeSecurityController implements SmartthingsSensorCallback { * 4) Camera (detect motion) * 5) Alarm (using ESP board) - assuming 1 house alarm * 6) Room (object as place of device) - * - * Additionals (for more extensive home management) * 7) Doorlock (detect open/locked) - * 8) Power outlet (detect on/off, monitor watt) */ - // This comprises multipurpose, motion, and water leak sensors - // TODO: Per 01/2017, doorlock and outlet are not ready, ESP board will be used for alarm @config private IoTSet smartSensorsSet; @config private IoTSet camSet; @config private IoTSet alarmSet; @config private IoTSet roomSet; - //@config private IoTSet doorlockSet; - //@config private IoTSet outletSet; + @config private IoTSet doorlockSet; @config private IoTRelation roomSensorRelation; @config private IoTRelation roomCameraRelation; //@config private IoTRelation roomDoorLockRelation; - //@config private IoTRelation roomOutletRelation; /******************************************************************************************************************************************* ** @@ -81,6 +77,7 @@ public class HomeSecurityController implements SmartthingsSensorCallback { long lastTimeChecked = 0; private static int sensorId = 0; + private static int doorlockId = 0; /******************************************************************************************************************************************* ** @@ -96,12 +93,9 @@ public class HomeSecurityController implements SmartthingsSensorCallback { // Camera (true = motion) private Map camDetectStatus = new HashMap(); - // Doorlock (true = open - not locked) - //private Map doorlockStatus = - // new HashMap(); - // Outlet (true = on - outlet is used) - //private Map outletStatus = - // new HashMap(); + // Doorlock (true = locked) + private Map doorlockStatus = + new HashMap(); // Alarm status private Map alarmStatus = @@ -211,41 +205,25 @@ public class HomeSecurityController implements SmartthingsSensorCallback { * * @return [void] None. */ - private void initDoorLocks(RoomSmart rm) { + private void initDoorLocks() { - // Get and init the doorlocks for this specific room - /*HashSet doorlocks = roomDoorLockRelation.get(rm); - for (DoorLock doorlock : doorlocks) { + // Get and init the doorlocks (we only assume 1 main doorlock) + Set doorlocks = doorlockSet.values(); + for (SmartthingsActuatorSmart doorlock : doorlocks) { try { // Initialize doorlocks doorlock.init(); - System.out.println("DEBUG: Initialized doorlock!"); + System.out.println("DEBUG: Initialized doorlock! ID: " + doorlockId); + doorlockStatus.put(doorlockId, false); + System.out.println("DEBUG: Initialized doorlock status to false!"); + doorlock.setId(doorlockId++); + doorlock.registerCallback(this); + System.out.println("DEBUG: Registered doorlock callback!"); } catch (Exception e) { e.printStackTrace(); } - }*/ - } - - - /** Method to initialize power outlets - * - * @return [void] None. - */ - private void initOutlets(RoomSmart rm) { - - // Get and init the outlets for this specific room - /*HashSet outlets = roomOutletRelation.get(rm); - for (Outlet outlet : outlets) { - - try { - // Initialize outlets - outlet.init(); - System.out.println("DEBUG: Initialized outlet!"); - } catch (Exception e) { - e.printStackTrace(); - } - }*/ + } } @@ -303,48 +281,21 @@ public class HomeSecurityController implements SmartthingsSensorCallback { } } - - /** Method to update state data structures for doorlocks - * - * @return [void] None. - */ - private void updateDoorLockStatus(RoomSmart rm) { - - // Get and init the outlets for this specific room - /*HashSet doorlocks = roomDoorLockRelation.get(rm); - for (DoorLock doorlock : doorlocks) { - - // Change is detected! Set to true for report... - if(isChangeDetected()) { - - doorlockStatus.put(doorlock, true); - } else { - - doorlockStatus.put(doorlock, false); - } - }*/ - } - - - /** Method to update state data structures for outlets + /** Method to update state data structures for Smartthings actuators * * @return [void] None. */ - private void updateOutletStatus(RoomSmart rm) { - - // Get and init the outlets for this specific room - /*HashSet outlets = roomOutletRelation.get(rm); - for (Outlet outlet : outlets) { - - // Change is detected! Set to true for report... - if(isChangeDetected()) { + public void newActuatorReadingAvailable(int _sensorId, int _value, boolean _activeValue) { - outletStatus.put(outlet, true); - } else { + System.out.println("DEBUG: Actuator reading value: " + _value); + if(_activeValue) { + System.out.println("DEBUG: Actuator is detecting something: " + _activeValue); + doorlockStatus.put(_sensorId, true); - outletStatus.put(outlet, false); - } - }*/ + } else { + //System.out.println("DEBUG: Sensor is not detecting something: " + _activeValue); + doorlockStatus.put(_sensorId, false); + } } @@ -360,11 +311,8 @@ public class HomeSecurityController implements SmartthingsSensorCallback { // Update status of camera updateCameraStatus(room); - // Update status of doorlocks - //updateDoorLockStatus(room); - - // Update status of outlets - //updateOutletStatus(room); + // Update status of other devices if any + // ... } } @@ -418,6 +366,22 @@ public class HomeSecurityController implements SmartthingsSensorCallback { } + /** Method to lock doors + * + * @return [void] None. + */ + private void lockDoors() { + + // Get and lock the doorlocks (we only assume 1 main doorlock) + Set doorlocks = doorlockSet.values(); + for (SmartthingsActuatorSmart doorlock : doorlocks) { + + doorlock.actuate(LOCK_DOOR); + System.out.println("DEBUG: Lock doorlock! ID: " + doorlock.getId()); + } + } + + /** Check status of devices and turn on alarm accordingly *

* Simple rule is whenever any sensor or camera detect something unusual @@ -441,6 +405,7 @@ public class HomeSecurityController implements SmartthingsSensorCallback { zoneId = room.getRoomID(); turnOnAlarms(zoneId); System.out.println("DETECTION: Camera active in room: " + zoneId); + lockDoors(); } } @@ -454,6 +419,7 @@ public class HomeSecurityController implements SmartthingsSensorCallback { turnOnAlarms(zoneId); System.out.println("DETECTION: Sensor active in room: " + zoneId); System.out.println("DETECTION: Detection by sensor: " + sensor.getId()); + lockDoors(); } } } @@ -534,10 +500,8 @@ public class HomeSecurityController implements SmartthingsSensorCallback { initCameras(rm); // Init all doorlocks - //initDoorLocks(); + initDoorLocks(); - // Init all outlets - //initOutlets(); } // Init all alarms diff --git a/benchmarks/Java/HomeSecurityController/Makefile b/benchmarks/Java/HomeSecurityController/Makefile index 460b10a..7e9a569 100644 --- a/benchmarks/Java/HomeSecurityController/Makefile +++ b/benchmarks/Java/HomeSecurityController/Makefile @@ -22,12 +22,12 @@ PHONY += homesecurity homesecurity: $(JAVAC) $(JFLAGS) *.java cp HomeSecurityController.config $(BIN_DIR)/HomeSecurityController - cd $(BIN_DIR)/HomeSecurityController; $(JAR) $(JARFLAGS) HomeSecurityController.jar ../HomeSecurityController/HomeSecurityController*.class ../HomeSecurityController/*.class ../iotcode/interfaces/SmartthingsSensor*.class ../iotcode/interfaces/Camera*.class ../iotcode/interfaces/Alarm*.class ../iotcode/interfaces/Room*.class ../iotcode/interfaces/ZoneState*.class ../iotcode/interfaces/Resolution*.class + cd $(BIN_DIR)/HomeSecurityController; $(JAR) $(JARFLAGS) HomeSecurityController.jar ../HomeSecurityController/HomeSecurityController*.class ../HomeSecurityController/*.class ../iotcode/interfaces/SmartthingsSensor*.class ../iotcode/interfaces/SmartthingsActuator*.class ../iotcode/interfaces/Camera*.class ../iotcode/interfaces/Alarm*.class ../iotcode/interfaces/Room*.class ../iotcode/interfaces/ZoneState*.class ../iotcode/interfaces/Resolution*.class PHONY += check-homesecurity check-homesecurity: $(JAVAC) $(JFLAGS) $(CHECKER_OPT) $(ASTUBS) *.java cp HomeSecurityController.config $(BIN_DIR)/HomeSecurityController - cd $(BIN_DIR)/HomeSecurityController; $(JAR) $(JARFLAGS) HomeSecurityController.jar ../HomeSecurityController/HomeSecurityController*.class ../HomeSecurityController/*.class ../iotcode/interfaces/SmartthingsSensor*.class ../iotcode/interfaces/Camera*.class ../iotcode/interfaces/Alarm*.class ../iotcode/interfaces/Room*.class ../iotcode/interfaces/ZoneState*.class ../iotcode/interfaces/Resolution*.class + cd $(BIN_DIR)/HomeSecurityController; $(JAR) $(JARFLAGS) HomeSecurityController.jar ../HomeSecurityController/HomeSecurityController*.class ../HomeSecurityController/*.class ../iotcode/interfaces/SmartthingsSensor*.class ../iotcode/interfaces/SmartthingsActuator*.class ../iotcode/interfaces/Camera*.class ../iotcode/interfaces/Alarm*.class ../iotcode/interfaces/Room*.class ../iotcode/interfaces/ZoneState*.class ../iotcode/interfaces/Resolution*.class .PHONY: $(PHONY) diff --git a/benchmarks/Java/HomeSecurityController/SmartthingsActuatorCallback_Skeleton.java b/benchmarks/Java/HomeSecurityController/SmartthingsActuatorCallback_Skeleton.java new file mode 100644 index 0000000..e76e39e --- /dev/null +++ b/benchmarks/Java/HomeSecurityController/SmartthingsActuatorCallback_Skeleton.java @@ -0,0 +1,116 @@ +package HomeSecurityController; + +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; +import java.util.HashMap; +import java.util.concurrent.atomic.AtomicBoolean; +import iotrmi.Java.IoTRMIComm; +import iotrmi.Java.IoTRMICommClient; +import iotrmi.Java.IoTRMICommServer; +import iotrmi.Java.IoTRMIUtil; + +import iotcode.interfaces.*; + +public class SmartthingsActuatorCallback_Skeleton implements SmartthingsActuatorCallback { + + private SmartthingsActuatorCallback mainObj; + private int objectId = 2; + // Communications and synchronizations + private IoTRMIComm rmiComm; + private AtomicBoolean didAlreadyInitWaitInvoke; + private AtomicBoolean methodReceived; + private byte[] methodBytes = null; + // Permissions + private static Integer[] object2Permission = { 0 }; + private static List set2Allowed; + + + public SmartthingsActuatorCallback_Skeleton(SmartthingsActuatorCallback _mainObj, int _portSend, int _portRecv) throws Exception { + mainObj = _mainObj; + rmiComm = new IoTRMICommServer(_portSend, _portRecv); + set2Allowed = new ArrayList(Arrays.asList(object2Permission)); + IoTRMIUtil.mapSkel.put(_mainObj, this); + IoTRMIUtil.mapSkelId.put(_mainObj, objectId); + didAlreadyInitWaitInvoke = new AtomicBoolean(false); + methodReceived = new AtomicBoolean(false); + rmiComm.registerSkeleton(objectId, methodReceived); + Thread thread1 = new Thread() { + public void run() { + try { + ___waitRequestInvokeMethod(); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + } + }; + thread1.start(); + } + + public SmartthingsActuatorCallback_Skeleton(SmartthingsActuatorCallback _mainObj, IoTRMIComm _rmiComm, int _objectId) throws Exception { + mainObj = _mainObj; + rmiComm = _rmiComm; + objectId = _objectId; + set2Allowed = new ArrayList(Arrays.asList(object2Permission)); + didAlreadyInitWaitInvoke = new AtomicBoolean(false); + methodReceived = new AtomicBoolean(false); + rmiComm.registerSkeleton(objectId, methodReceived); + } + + public boolean didAlreadyInitWaitInvoke() { + return didAlreadyInitWaitInvoke.get(); + } + + public void newActuatorReadingAvailable(int _sensorId, int _value, boolean _activeValue) { + mainObj.newActuatorReadingAvailable(_sensorId, _value, _activeValue); + } + + public void ___newActuatorReadingAvailable() { + byte[] localMethodBytes = methodBytes; + rmiComm.setGetMethodBytes(); + Object[] paramObj = rmiComm.getMethodParams(new Class[] { int.class, int.class, boolean.class }, new Class[] { null, null, null }, localMethodBytes); + newActuatorReadingAvailable((int) paramObj[0], (int) paramObj[1], (boolean) paramObj[2]); + } + + public void ___waitRequestInvokeMethod() throws IOException { + didAlreadyInitWaitInvoke.compareAndSet(false, true); + while (true) { + if (!methodReceived.get()) { + continue; + } + methodBytes = rmiComm.getMethodBytes(); + methodReceived.set(false); + int _objectId = IoTRMIComm.getObjectId(methodBytes); + int methodId = IoTRMIComm.getMethodId(methodBytes); + if (_objectId == objectId) { + if (!set2Allowed.contains(methodId)) { + throw new Error("Object with object Id: " + _objectId + " is not allowed to access method: " + methodId); + } + } + else { + continue; + } + switch (methodId) { + case 0: + new Thread() { + public void run() { + try { + ___newActuatorReadingAvailable(); + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + }.start(); + break; + default: + throw new Error("Method Id " + methodId + " not recognized!"); + } + } + } + +} diff --git a/benchmarks/Java/HomeSecurityController/SmartthingsActuatorSmart_Stub.java b/benchmarks/Java/HomeSecurityController/SmartthingsActuatorSmart_Stub.java new file mode 100644 index 0000000..db5b85b --- /dev/null +++ b/benchmarks/Java/HomeSecurityController/SmartthingsActuatorSmart_Stub.java @@ -0,0 +1,193 @@ +package HomeSecurityController; + +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; +import java.util.HashMap; +import java.util.concurrent.atomic.AtomicBoolean; +import iotrmi.Java.IoTRMIComm; +import iotrmi.Java.IoTRMICommClient; +import iotrmi.Java.IoTRMICommServer; +import iotrmi.Java.IoTRMIUtil; + +import iotcode.interfaces.*; + +public class SmartthingsActuatorSmart_Stub implements SmartthingsActuatorSmart { + + private int objectId = 1; + private IoTRMIComm rmiComm; + // Synchronization variables + private AtomicBoolean retValueReceived5 = new AtomicBoolean(false); + private AtomicBoolean retValueReceived7 = new AtomicBoolean(false); + private AtomicBoolean retValueReceived4 = new AtomicBoolean(false); + private AtomicBoolean retValueReceived3 = new AtomicBoolean(false); + private AtomicBoolean retValueReceived1 = new AtomicBoolean(false); + + + public SmartthingsActuatorSmart_Stub(int _localPortSend, int _localPortRecv, int _portSend, int _portRecv, String _skeletonAddress, int _rev) throws Exception { + if (_localPortSend != 0 && _localPortRecv != 0) { + rmiComm = new IoTRMICommClient(_localPortSend, _localPortRecv, _portSend, _portRecv, _skeletonAddress, _rev); + } else + { + rmiComm = new IoTRMICommClient(_portSend, _portRecv, _skeletonAddress, _rev); + } + rmiComm.registerStub(objectId, 5, retValueReceived5); + rmiComm.registerStub(objectId, 7, retValueReceived7); + rmiComm.registerStub(objectId, 4, retValueReceived4); + rmiComm.registerStub(objectId, 3, retValueReceived3); + rmiComm.registerStub(objectId, 1, retValueReceived1); + IoTRMIUtil.mapStub.put(objectId, this); + } + + public SmartthingsActuatorSmart_Stub(IoTRMIComm _rmiComm, int _objectId) throws Exception { + rmiComm = _rmiComm; + objectId = _objectId; + rmiComm.registerStub(objectId, 5, retValueReceived5); + rmiComm.registerStub(objectId, 7, retValueReceived7); + rmiComm.registerStub(objectId, 4, retValueReceived4); + rmiComm.registerStub(objectId, 3, retValueReceived3); + rmiComm.registerStub(objectId, 1, retValueReceived1); + } + + public long getTimestampOfLastReading() { + int methodId = 5; + Class retType = long.class; + Class[] paramCls = new Class[] { }; + Object[] paramObj = new Object[] { }; + rmiComm.remoteCall(objectId, methodId, paramCls, paramObj); + // Waiting for return value + while (!retValueReceived5.get()); + Object retObj = rmiComm.getReturnValue(retType, null); + retValueReceived5.set(false); + rmiComm.setGetReturnBytes(); + + return (long)retObj; + } + + public int getId() { + int methodId = 7; + Class retType = int.class; + Class[] paramCls = new Class[] { }; + Object[] paramObj = new Object[] { }; + rmiComm.remoteCall(objectId, methodId, paramCls, paramObj); + // Waiting for return value + while (!retValueReceived7.get()); + Object retObj = rmiComm.getReturnValue(retType, null); + retValueReceived7.set(false); + rmiComm.setGetReturnBytes(); + + return (int)retObj; + } + + public void registerCallback(SmartthingsActuatorCallback _callbackTo) { + int[] objIdSent0 = new int[1]; + try { + if (!IoTRMIUtil.mapSkel.containsKey(_callbackTo)) { + int newObjIdSent = rmiComm.getObjectIdCounter(); + objIdSent0[0] = newObjIdSent; + rmiComm.decrementObjectIdCounter(); + SmartthingsActuatorCallback_Skeleton skel0 = new SmartthingsActuatorCallback_Skeleton(_callbackTo, rmiComm, newObjIdSent); + IoTRMIUtil.mapSkel.put(_callbackTo, skel0); + IoTRMIUtil.mapSkelId.put(_callbackTo, newObjIdSent); + Thread thread = new Thread() { + public void run() { + try { + skel0.___waitRequestInvokeMethod(); + } catch (Exception ex) { + ex.printStackTrace(); + throw new Error("Exception when trying to run ___waitRequestInvokeMethod() for SmartthingsActuatorCallback_Skeleton!"); + } + } + }; + thread.start(); + while(!skel0.didAlreadyInitWaitInvoke()); + } + else + { + int newObjIdSent = IoTRMIUtil.mapSkelId.get(_callbackTo); + objIdSent0[0] = newObjIdSent; + } + } catch (Exception ex) { + ex.printStackTrace(); + throw new Error("Exception when generating skeleton objects!"); + } + + int methodId = 8; + Class retType = void.class; + Class[] paramCls = new Class[] { int[].class }; + Object[] paramObj = new Object[] { objIdSent0 }; + rmiComm.remoteCall(objectId, methodId, paramCls, paramObj); + } + + public void requestStatus() { + int methodId = 2; + Class retType = void.class; + Class[] paramCls = new Class[] { }; + Object[] paramObj = new Object[] { }; + rmiComm.remoteCall(objectId, methodId, paramCls, paramObj); + } + + public void setId(int id) { + int methodId = 6; + Class retType = void.class; + Class[] paramCls = new Class[] { int.class }; + Object[] paramObj = new Object[] { id }; + rmiComm.remoteCall(objectId, methodId, paramCls, paramObj); + } + + public boolean isActiveStatus() { + int methodId = 4; + Class retType = boolean.class; + Class[] paramCls = new Class[] { }; + Object[] paramObj = new Object[] { }; + rmiComm.remoteCall(objectId, methodId, paramCls, paramObj); + // Waiting for return value + while (!retValueReceived4.get()); + Object retObj = rmiComm.getReturnValue(retType, null); + retValueReceived4.set(false); + rmiComm.setGetReturnBytes(); + + return (boolean)retObj; + } + + public int getStatus() { + int methodId = 3; + Class retType = int.class; + Class[] paramCls = new Class[] { }; + Object[] paramObj = new Object[] { }; + rmiComm.remoteCall(objectId, methodId, paramCls, paramObj); + // Waiting for return value + while (!retValueReceived3.get()); + Object retObj = rmiComm.getReturnValue(retType, null); + retValueReceived3.set(false); + rmiComm.setGetReturnBytes(); + + return (int)retObj; + } + + public void init() { + int methodId = 0; + Class retType = void.class; + Class[] paramCls = new Class[] { }; + Object[] paramObj = new Object[] { }; + rmiComm.remoteCall(objectId, methodId, paramCls, paramObj); + } + + public boolean actuate(int value) { + int methodId = 1; + Class retType = boolean.class; + Class[] paramCls = new Class[] { int.class }; + Object[] paramObj = new Object[] { value }; + rmiComm.remoteCall(objectId, methodId, paramCls, paramObj); + // Waiting for return value + while (!retValueReceived1.get()); + Object retObj = rmiComm.getReturnValue(retType, null); + retValueReceived1.set(false); + rmiComm.setGetReturnBytes(); + + return (boolean)retObj; + } + +} diff --git a/benchmarks/drivers/Java/DoorlockActuator/DoorlockActuator.config b/benchmarks/drivers/Java/DoorlockActuator/DoorlockActuator.config new file mode 100644 index 0000000..6925867 --- /dev/null +++ b/benchmarks/drivers/Java/DoorlockActuator/DoorlockActuator.config @@ -0,0 +1,7 @@ +# Skeleton/original interface +INTERFACE_CLASS=SmartthingsActuator +# Stub +INTERFACE_STUB_CLASS=SmartthingsActuatorSmart + +# Language +LANGUAGE=Java diff --git a/benchmarks/drivers/Java/DoorlockActuator/DoorlockActuator.java b/benchmarks/drivers/Java/DoorlockActuator/DoorlockActuator.java new file mode 100644 index 0000000..09eb539 --- /dev/null +++ b/benchmarks/drivers/Java/DoorlockActuator/DoorlockActuator.java @@ -0,0 +1,300 @@ +package iotcode.DoorlockActuator; + +// Standard Java Packages +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.Semaphore; + +// Checker annotations +//import iotchecker.qual.*; +import iotcode.annotation.*; + +// IoT Packages +import iotruntime.slave.*; +import iotcode.interfaces.*; +import iotruntime.zigbee.*; + +/** Class Smartthings sensor driver for Smartthings sensor devices. + * + * @author Changwoo Lee, Rahmadi Trimananda + * @version 1.0 + * @since 2016-12-01 + */ +public class DoorlockActuator implements IoTZigbeeCallback, SmartthingsActuator { + + private final int TIMEOUT_FOR_RESEND_MSEC = 900; + + private IoTZigbee zigConnection = null; + private boolean didClose; // make sure that the clean up was done correctly + private boolean detectStatus = false; + + private int detectedValue = 0; + private Date timestampOfLastDetecting = null; + + private AtomicBoolean didAlreadyClose = new AtomicBoolean(true); + private AtomicBoolean didAlreadyInit = new AtomicBoolean(false); + private AtomicBoolean didWriteAttrb = new AtomicBoolean(false); + private AtomicBoolean didMatchDscr = new AtomicBoolean(false); + private AtomicBoolean didBind = new AtomicBoolean(false); + private AtomicBoolean didDoorLockConfigureReporting = new AtomicBoolean(false); //made by Jiawei + static Semaphore gettingLatestDataMutex = new Semaphore(1); + + private List < SmartthingsActuatorSmartCallback > callbackList = new CopyOnWriteArrayList < SmartthingsActuatorSmartCallback > (); + + private int sensorId = 0; + + @config private IoTSet doorlockActuatorUdpAddress; + @config private IoTSet doorlockActuatorZigbeeAddress; + + public DoorlockActuator(IoTSet dSet, IoTSet zigSet) { + doorlockActuatorUdpAddress = dSet; + doorlockActuatorZigbeeAddress = zigSet; + } + + public DoorlockActuator() { + } + + public void init() { + + if (didAlreadyInit.compareAndSet(false, true) == false) { + return; // already init + } + + didAlreadyClose.set(false); + + try { + Iterator itrUdp = doorlockActuatorUdpAddress.iterator(); + Iterator itrZig = doorlockActuatorZigbeeAddress.iterator(); + + zigConnection = new IoTZigbee((IoTDeviceAddress)itrUdp.next(), (IoTZigbeeAddress)itrZig.next()); + + // DEBUG + System.out.println("DEBUG: Allocate iterators to print out addresses!"); + Iterator itrDebugUdp = doorlockActuatorUdpAddress.iterator(); + IoTDeviceAddress iotaddDebug = (IoTDeviceAddress)itrDebugUdp.next(); + System.out.println("IP address: " + iotaddDebug.getCompleteAddress()); + System.out.println("Source port: " + iotaddDebug.getSourcePortNumber()); + System.out.println("Destination port: " + iotaddDebug.getDestinationPortNumber()); + + Iterator itrDebugZig = doorlockActuatorZigbeeAddress.iterator(); + IoTZigbeeAddress iotzbaddDebug = (IoTZigbeeAddress)itrDebugZig.next(); + System.out.println("Zigbee address: " + iotzbaddDebug.getAddress()); + + zigConnection.registerCallback(this); + System.out.println("Register callback!"); + zigConnection.init(); + System.out.println("Initialized!"); + + + + //made by changwoo + sleep(10); + + // System.out.println("BroadcastingRouteRecordRequest "); + // zigConnection.sendBroadcastingRouteRecordRequest(0x0001); + // sleep(6); + + System.out.println("Sending Management Permit Joining Request"); + // for(int z=0; z<3; z++){ + zigConnection.sendManagementPermitJoiningRequest(0x0002, 0x0036, 0x00); + sleep(0); + // } + + + while(!didBind.get()){ + System.out.println("Sending Bind Request"); + zigConnection.sendBindRequest(0x0003, 0x0101, 0x02); + sleep(0); + } + + while(!didDoorLockConfigureReporting.get()){ + System.out.println("Sending Door Lock: Configure Reporting"); + zigConnection.sendConfigureReportingCommand(0x0004, 0x0101, 0x0104, 0x01, 0x02, 0x0000, 0x30, 0x0000, 0x100E, null); + sleep(0); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * actuate() method + * + * @param value Integer value for actuation + * @return boolean Status of sending actuate command + */ + public boolean actuate(int value) { + + // Value check + if (value == 0) + System.out.println("Doorlock: Is locking!"); + else if(value == 1) + System.out.println("Doorlock: Is unlocking!"); + else { // Failed to send command because of invalid value + throw new Error("Doorlock: Actuate value " + value + " is not recognized (only 0 or 1)! Please check your method call..."); + } + try { + zigConnection.sendLockOrUnlockDoorRequest(0x0005, 0x0101, 0x0104, 0x02, value); + sleep(0); + } catch (Exception e) { + e.printStackTrace(); + } + return true; + } + + /** + * requestStatus() method + * + * @return void + */ + public void requestStatus() { + System.out.println("Doorlock: Requesting status... Receiving answer through callback..."); + try { + zigConnection.sendReadDoorStatusRequest(0x0005, 0x0101, 0x0104, 0x02, 0x10, 0x00, 0x0000); + sleep(0); + } catch (Exception e) { + e.printStackTrace(); + } + } + + //made by changwoo + private void sleep(int multipleTime){ + if(multipleTime<=0){ + multipleTime=1; + } + try{ + Thread.sleep(TIMEOUT_FOR_RESEND_MSEC*multipleTime); + } catch(Exception e){ + e.printStackTrace(); + } + } + + // made by Jiawei + public int getStatus() { + + int tmp = 0; + + try { + gettingLatestDataMutex.acquire(); + tmp = detectedValue; + + } catch (Exception e) { + e.printStackTrace(); + } + gettingLatestDataMutex.release(); + + return tmp; + } + + public boolean isActiveStatus() { + + int tmp = getStatus(); + if (tmp == 1) + detectStatus = true; // ACTIVE == Door is locked + else + detectStatus = false; // NOT ACTIVE == Door is not locked/not fully locked + return detectStatus; + } + + public void close() { + + if (didAlreadyClose.compareAndSet(false, true) == false) { + return; // already init + } + + didAlreadyInit.set(false); + + + try { + zigConnection.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void Finalize() { + if (!didClose) { + close(); + } + } + + public void setId(int id) { + + sensorId = id; + + } + + public int getId() { + + return sensorId; + + } + + + public long getTimestampOfLastReading() { + + Date tmp = null; + try { + gettingLatestDataMutex.acquire(); + tmp = (Date)timestampOfLastDetecting.clone(); + + } catch (Exception e) { + e.printStackTrace(); + } + gettingLatestDataMutex.release(); + long retLong = tmp.getTime(); + + return retLong; + } + + public void newMessageAvailable(IoTZigbeeMessage _zm) { + + //made by yuting + if (_zm instanceof IoTZigbeeMessageZdoBindResponse) { + IoTZigbeeMessageZdoBindResponse message = (IoTZigbeeMessageZdoBindResponse)_zm; + if (message.getSucceeded()) { + didBind.set(true); + } + } + else if (_zm instanceof IoTZigbeeMessageZclConfigureReportingResponse){ + IoTZigbeeMessageZclConfigureReportingResponse message = (IoTZigbeeMessageZclConfigureReportingResponse)_zm; + if (message.getAllSuccess()) { + didDoorLockConfigureReporting.set(true); + } + } + else if (_zm instanceof IoTZigbeeMessageZclReadAttributesResponse) { + IoTZigbeeMessageZclReadAttributesResponse message = (IoTZigbeeMessageZclReadAttributesResponse)_zm; + List attrList = message.getAttributes(); + + if (attrList.size() == 1) { + if(attrList.get(0).getAttributeId() == 0) { + byte[] data = attrList.get(0).getData(); + int value = data[0]; + + try { + gettingLatestDataMutex.acquire(); + detectedValue = value; + timestampOfLastDetecting = new Date(); + } catch (Exception e) { + e.printStackTrace(); + } + gettingLatestDataMutex.release(); + + try { + for (SmartthingsActuatorSmartCallback cb : callbackList) { + cb.newActuatorReadingAvailable(this.getId(), this.getStatus(), this.isActiveStatus()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } + + public void registerCallback(SmartthingsActuatorSmartCallback _callbackTo) { + callbackList.add(_callbackTo); + } +} diff --git a/benchmarks/drivers/Java/DoorlockActuator/SmartthingsActuatorSmartCallback_Stub.java b/benchmarks/drivers/Java/DoorlockActuator/SmartthingsActuatorSmartCallback_Stub.java new file mode 100644 index 0000000..9a2f912 --- /dev/null +++ b/benchmarks/drivers/Java/DoorlockActuator/SmartthingsActuatorSmartCallback_Stub.java @@ -0,0 +1,47 @@ +package iotcode.DoorlockActuator; + +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; +import java.util.HashMap; +import java.util.concurrent.atomic.AtomicBoolean; +import iotrmi.Java.IoTRMIComm; +import iotrmi.Java.IoTRMICommClient; +import iotrmi.Java.IoTRMICommServer; +import iotrmi.Java.IoTRMIUtil; + +import iotcode.interfaces.*; + +public class SmartthingsActuatorSmartCallback_Stub implements SmartthingsActuatorSmartCallback { + + private int objectId = 2; + private IoTRMIComm rmiComm; + // Synchronization variables + + + public SmartthingsActuatorSmartCallback_Stub(int _localPortSend, int _localPortRecv, int _portSend, int _portRecv, String _skeletonAddress, int _rev) throws Exception { + if (_localPortSend != 0 && _localPortRecv != 0) { + rmiComm = new IoTRMICommClient(_localPortSend, _localPortRecv, _portSend, _portRecv, _skeletonAddress, _rev); + } else + { + rmiComm = new IoTRMICommClient(_portSend, _portRecv, _skeletonAddress, _rev); + } + IoTRMIUtil.mapStub.put(objectId, this); + } + + public SmartthingsActuatorSmartCallback_Stub(IoTRMIComm _rmiComm, int _objectId) throws Exception { + rmiComm = _rmiComm; + objectId = _objectId; + } + + public void newActuatorReadingAvailable(int _sensorId, int _value, boolean _activeValue) { + int methodId = 0; + Class retType = void.class; + Class[] paramCls = new Class[] { int.class, int.class, boolean.class }; + Object[] paramObj = new Object[] { _sensorId, _value, _activeValue }; + rmiComm.remoteCall(objectId, methodId, paramCls, paramObj); + } + +} diff --git a/benchmarks/drivers/Java/DoorlockActuator/SmartthingsActuator_Skeleton.java b/benchmarks/drivers/Java/DoorlockActuator/SmartthingsActuator_Skeleton.java new file mode 100644 index 0000000..41ca279 --- /dev/null +++ b/benchmarks/drivers/Java/DoorlockActuator/SmartthingsActuator_Skeleton.java @@ -0,0 +1,323 @@ +package iotcode.DoorlockActuator; + +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; +import java.util.HashMap; +import java.util.concurrent.atomic.AtomicBoolean; +import iotrmi.Java.IoTRMIComm; +import iotrmi.Java.IoTRMICommClient; +import iotrmi.Java.IoTRMICommServer; +import iotrmi.Java.IoTRMIUtil; + +import iotcode.interfaces.*; + +public class SmartthingsActuator_Skeleton implements SmartthingsActuator { + + private SmartthingsActuator mainObj; + private int objectId = 1; + // Communications and synchronizations + private IoTRMIComm rmiComm; + private AtomicBoolean didAlreadyInitWaitInvoke; + private AtomicBoolean methodReceived; + private byte[] methodBytes = null; + // Permissions + private static Integer[] object1Permission = { 5, 7, 8, 2, 6, 4, 3, 0, 1 }; + private static List set1Allowed; + + + public SmartthingsActuator_Skeleton(SmartthingsActuator _mainObj, int _portSend, int _portRecv) throws Exception { + mainObj = _mainObj; + rmiComm = new IoTRMICommServer(_portSend, _portRecv); + set1Allowed = new ArrayList(Arrays.asList(object1Permission)); + IoTRMIUtil.mapSkel.put(_mainObj, this); + IoTRMIUtil.mapSkelId.put(_mainObj, objectId); + didAlreadyInitWaitInvoke = new AtomicBoolean(false); + methodReceived = new AtomicBoolean(false); + rmiComm.registerSkeleton(objectId, methodReceived); + Thread thread1 = new Thread() { + public void run() { + try { + ___waitRequestInvokeMethod(); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + } + }; + thread1.start(); + } + + public SmartthingsActuator_Skeleton(SmartthingsActuator _mainObj, IoTRMIComm _rmiComm, int _objectId) throws Exception { + mainObj = _mainObj; + rmiComm = _rmiComm; + objectId = _objectId; + set1Allowed = new ArrayList(Arrays.asList(object1Permission)); + didAlreadyInitWaitInvoke = new AtomicBoolean(false); + methodReceived = new AtomicBoolean(false); + rmiComm.registerSkeleton(objectId, methodReceived); + } + + public boolean didAlreadyInitWaitInvoke() { + return didAlreadyInitWaitInvoke.get(); + } + + public void init() { + mainObj.init(); + } + + public boolean actuate(int value) { + return mainObj.actuate(value); + } + + public void requestStatus() { + mainObj.requestStatus(); + } + + public int getStatus() { + return mainObj.getStatus(); + } + + public boolean isActiveStatus() { + return mainObj.isActiveStatus(); + } + + public long getTimestampOfLastReading() { + return mainObj.getTimestampOfLastReading(); + } + + public void setId(int id) { + mainObj.setId(id); + } + + public int getId() { + return mainObj.getId(); + } + + public void registerCallback(SmartthingsActuatorSmartCallback _callbackTo) { + mainObj.registerCallback(_callbackTo); + } + + public void ___init() { + byte[] localMethodBytes = methodBytes; + rmiComm.setGetMethodBytes(); + Object[] paramObj = rmiComm.getMethodParams(new Class[] { }, new Class[] { }, localMethodBytes); + init(); + } + + public void ___actuate() throws IOException { + byte[] localMethodBytes = methodBytes; + rmiComm.setGetMethodBytes(); + Object[] paramObj = rmiComm.getMethodParams(new Class[] { int.class }, new Class[] { null }, localMethodBytes); + Object retObj = actuate((int) paramObj[0]); + rmiComm.sendReturnObj(retObj, localMethodBytes); + } + + public void ___requestStatus() { + byte[] localMethodBytes = methodBytes; + rmiComm.setGetMethodBytes(); + Object[] paramObj = rmiComm.getMethodParams(new Class[] { }, new Class[] { }, localMethodBytes); + requestStatus(); + } + + public void ___getStatus() throws IOException { + byte[] localMethodBytes = methodBytes; + rmiComm.setGetMethodBytes(); + Object[] paramObj = rmiComm.getMethodParams(new Class[] { }, new Class[] { }, localMethodBytes); + Object retObj = getStatus(); + rmiComm.sendReturnObj(retObj, localMethodBytes); + } + + public void ___isActiveStatus() throws IOException { + byte[] localMethodBytes = methodBytes; + rmiComm.setGetMethodBytes(); + Object[] paramObj = rmiComm.getMethodParams(new Class[] { }, new Class[] { }, localMethodBytes); + Object retObj = isActiveStatus(); + rmiComm.sendReturnObj(retObj, localMethodBytes); + } + + public void ___getTimestampOfLastReading() throws IOException { + byte[] localMethodBytes = methodBytes; + rmiComm.setGetMethodBytes(); + Object[] paramObj = rmiComm.getMethodParams(new Class[] { }, new Class[] { }, localMethodBytes); + Object retObj = getTimestampOfLastReading(); + rmiComm.sendReturnObj(retObj, localMethodBytes); + } + + public void ___setId() { + byte[] localMethodBytes = methodBytes; + rmiComm.setGetMethodBytes(); + Object[] paramObj = rmiComm.getMethodParams(new Class[] { int.class }, new Class[] { null }, localMethodBytes); + setId((int) paramObj[0]); + } + + public void ___getId() throws IOException { + byte[] localMethodBytes = methodBytes; + rmiComm.setGetMethodBytes(); + Object[] paramObj = rmiComm.getMethodParams(new Class[] { }, new Class[] { }, localMethodBytes); + Object retObj = getId(); + rmiComm.sendReturnObj(retObj, localMethodBytes); + } + + public void ___registerCallback() { + byte[] localMethodBytes = methodBytes; + rmiComm.setGetMethodBytes(); + Object[] paramObj = rmiComm.getMethodParams(new Class[] { int[].class }, new Class[] { null }, localMethodBytes); + try { + int[] stubIdArray0 = (int[]) paramObj[0]; + int objIdRecv0 = stubIdArray0[0]; + SmartthingsActuatorSmartCallback newStub0 = null; + if(!IoTRMIUtil.mapStub.containsKey(objIdRecv0)) { + newStub0 = new SmartthingsActuatorSmartCallback_Stub(rmiComm, objIdRecv0); + IoTRMIUtil.mapStub.put(objIdRecv0, newStub0); + rmiComm.setObjectIdCounter(objIdRecv0); + rmiComm.decrementObjectIdCounter(); + } + else { + newStub0 = (SmartthingsActuatorSmartCallback_Stub) IoTRMIUtil.mapStub.get(objIdRecv0); + } + SmartthingsActuatorSmartCallback stub0 = newStub0; + registerCallback(stub0); + } catch(Exception ex) { + ex.printStackTrace(); + throw new Error("Exception from callback object instantiation!"); + } + } + + public void ___waitRequestInvokeMethod() throws IOException { + didAlreadyInitWaitInvoke.compareAndSet(false, true); + while (true) { + if (!methodReceived.get()) { + continue; + } + methodBytes = rmiComm.getMethodBytes(); + methodReceived.set(false); + int _objectId = IoTRMIComm.getObjectId(methodBytes); + int methodId = IoTRMIComm.getMethodId(methodBytes); + if (_objectId == objectId) { + if (!set1Allowed.contains(methodId)) { + throw new Error("Object with object Id: " + _objectId + " is not allowed to access method: " + methodId); + } + } + else { + continue; + } + switch (methodId) { + case 0: + new Thread() { + public void run() { + try { + ___init(); + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + }.start(); + break; + case 1: + new Thread() { + public void run() { + try { + ___actuate(); + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + }.start(); + break; + case 2: + new Thread() { + public void run() { + try { + ___requestStatus(); + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + }.start(); + break; + case 3: + new Thread() { + public void run() { + try { + ___getStatus(); + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + }.start(); + break; + case 4: + new Thread() { + public void run() { + try { + ___isActiveStatus(); + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + }.start(); + break; + case 5: + new Thread() { + public void run() { + try { + ___getTimestampOfLastReading(); + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + }.start(); + break; + case 6: + new Thread() { + public void run() { + try { + ___setId(); + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + }.start(); + break; + case 7: + new Thread() { + public void run() { + try { + ___getId(); + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + }.start(); + break; + case 8: + new Thread() { + public void run() { + try { + ___registerCallback(); + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + }.start(); + break; + default: + throw new Error("Method Id " + methodId + " not recognized!"); + } + } + } + +} diff --git a/benchmarks/drivers/Java/Makefile b/benchmarks/drivers/Java/Makefile index 92ab192..ce21238 100644 --- a/benchmarks/drivers/Java/Makefile +++ b/benchmarks/drivers/Java/Makefile @@ -16,8 +16,8 @@ CHECKER_OPT = -processor iotchecker.IoTJavaChecker -AprintErrorStack ASTUBS = -Astubs=../../../checker/astubs/ -all: light camera labroom greenlawn sprinkler moisture weathergateway audioroom gpsgateway ihome homeroom alarm motion multipurpose waterleak -check-all: check-light check-camera check-labroom check-greenlawn check-sprinkler check-moisture check-weathergateway check-audioroom check-gpsgateway check-ihome check-homeroom check-alarm check-motion check-multipurpose check-waterleak +all: light camera labroom greenlawn sprinkler moisture weathergateway audioroom gpsgateway ihome homeroom alarm motion multipurpose waterleak doorlock doorlockactuator +check-all: check-light check-camera check-labroom check-greenlawn check-sprinkler check-moisture check-weathergateway check-audioroom check-gpsgateway check-ihome check-homeroom check-alarm check-motion check-multipurpose check-waterleak check-doorlock check-doorlockactuator # Compile - without checker # @@ -121,6 +121,12 @@ doorlock: cp DoorlockSensor/DoorlockSensor.config $(BIN_DIR)/iotcode/DoorlockSensor cd $(BIN_DIR)/iotcode/DoorlockSensor; $(JAR) $(JARFLAGS) DoorlockSensor.jar ../../iotcode/DoorlockSensor/*.class ../../iotcode/interfaces/SmartthingsSensor*.class ../../iotcode/interfaces/Camera*.class +PHONY += doorlockactuator +doorlockactuator: + $(JAVAC) $(JFLAGS) DoorlockActuator/*.java + cp DoorlockActuator/DoorlockActuator.config $(BIN_DIR)/iotcode/DoorlockActuator + cd $(BIN_DIR)/iotcode/DoorlockActuator; $(JAR) $(JARFLAGS) DoorlockActuator.jar ../../iotcode/DoorlockActuator/*.class ../../iotcode/interfaces/SmartthingsActuator*.class ../../iotcode/interfaces/Camera*.class + # Compile - with checker # PHONY += check-light @@ -220,4 +226,10 @@ check-doorlock: cp DoorlockSensor/DoorlockSensor.config $(BIN_DIR)/iotcode/DoorlockSensor cd $(BIN_DIR)/iotcode/DoorlockSensor; $(JAR) $(JARFLAGS) DoorlockSensor.jar ../../iotcode/DoorlockSensor/*.class ../../iotcode/interfaces/SmartthingsSensor*.class ../../iotcode/interfaces/Camera*.class +PHONY += check-doorlockactuator +check-doorlockactuator: + $(JAVAC) $(JFLAGS) $(CHECKER_OPT) $(ASTUBS) DoorlockActuator/*.java + cp DoorlockActuator/DoorlockActuator.config $(BIN_DIR)/iotcode/DoorlockActuator + cd $(BIN_DIR)/iotcode/DoorlockActuator; $(JAR) $(JARFLAGS) DoorlockActuator.jar ../../iotcode/DoorlockActuator/*.class ../../iotcode/interfaces/SmartthingsActuator*.class ../../iotcode/interfaces/Camera*.class + .PHONY: $(PHONY) diff --git a/benchmarks/interfaces/SmartthingsActuator.java b/benchmarks/interfaces/SmartthingsActuator.java new file mode 100644 index 0000000..4eda11b --- /dev/null +++ b/benchmarks/interfaces/SmartthingsActuator.java @@ -0,0 +1,16 @@ +package iotcode.interfaces; + +import java.util.List; +import java.util.ArrayList; + +public interface SmartthingsActuator { + public void init(); + public boolean actuate(int value); + public void requestStatus(); + public int getStatus(); + public boolean isActiveStatus(); + public long getTimestampOfLastReading(); + public void setId(int id); + public int getId(); + public void registerCallback(SmartthingsActuatorSmartCallback _callbackTo); +} diff --git a/benchmarks/interfaces/SmartthingsActuatorCallback.java b/benchmarks/interfaces/SmartthingsActuatorCallback.java new file mode 100644 index 0000000..df151de --- /dev/null +++ b/benchmarks/interfaces/SmartthingsActuatorCallback.java @@ -0,0 +1,8 @@ +package iotcode.interfaces; + +import java.util.List; +import java.util.ArrayList; + +public interface SmartthingsActuatorCallback { + public void newActuatorReadingAvailable(int _sensorId, int _value, boolean _activeValue); +} diff --git a/benchmarks/interfaces/SmartthingsActuatorSmart.java b/benchmarks/interfaces/SmartthingsActuatorSmart.java new file mode 100644 index 0000000..6a5f790 --- /dev/null +++ b/benchmarks/interfaces/SmartthingsActuatorSmart.java @@ -0,0 +1,17 @@ +package iotcode.interfaces; + +import java.util.List; +import java.util.ArrayList; + +public interface SmartthingsActuatorSmart { + + public long getTimestampOfLastReading(); + public int getId(); + public void registerCallback(SmartthingsActuatorCallback _callbackTo); + public void requestStatus(); + public void setId(int id); + public boolean isActiveStatus(); + public int getStatus(); + public void init(); + public boolean actuate(int value); +} diff --git a/benchmarks/interfaces/SmartthingsActuatorSmartCallback.java b/benchmarks/interfaces/SmartthingsActuatorSmartCallback.java new file mode 100644 index 0000000..45e9607 --- /dev/null +++ b/benchmarks/interfaces/SmartthingsActuatorSmartCallback.java @@ -0,0 +1,9 @@ +package iotcode.interfaces; + +import java.util.List; +import java.util.ArrayList; + +public interface SmartthingsActuatorSmartCallback { + + public void newActuatorReadingAvailable(int _sensorId, int _value, boolean _activeValue); +} diff --git a/iotjava/Makefile b/iotjava/Makefile index c3d55c4..e1e8f08 100644 --- a/iotjava/Makefile +++ b/iotjava/Makefile @@ -133,6 +133,12 @@ run-compiler-smart: cp ../localconfig/iotpolicy/SmartthingsSensor/*.req $(BIN_DIR)/iotpolicy/ cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler smartthingssensor.pol smartthingssensor.req smartthingssensorcallback.pol smartthingssensorcallback.req -java Java +PHONY += run-compiler-actuate +run-compiler-actuate: + cp ../localconfig/iotpolicy/SmartthingsActuator/*.pol $(BIN_DIR)/iotpolicy/ + cp ../localconfig/iotpolicy/SmartthingsActuator/*.req $(BIN_DIR)/iotpolicy/ + cd $(BIN_DIR)/iotpolicy; $(JAVA) -cp .:..:../$(PARSERJARS):../$(BIN_DIR) iotpolicy.IoTCompiler smartthingsactuator.pol smartthingsactuator.req smartthingsactuatorcallback.pol smartthingsactuatorcallback.req -java Java + # TODO: Can remove this later - just to test-compile the resulted files from the compiler PHONY += compile compile: diff --git a/localconfig/iotpolicy/SmartthingsActuator/smartthingsactuator.pol b/localconfig/iotpolicy/SmartthingsActuator/smartthingsactuator.pol new file mode 100644 index 0000000..a271924 --- /dev/null +++ b/localconfig/iotpolicy/SmartthingsActuator/smartthingsactuator.pol @@ -0,0 +1,39 @@ +public interface SmartthingsActuator { + + public void init(); + public boolean actuate(int value); + public void requestStatus(); + public int getStatus(); + public boolean isActiveStatus(); + public long getTimestampOfLastReading(); + public void setId(int id); + public int getId(); + public void registerCallback(SmartthingsActuatorCallback _callbackTo); + + capability Initialize { + description = "Initialize object"; + method = "init()"; + method = "registerCallback(SmartthingsActuatorCallback _callbackTo)"; + } + + capability Actuate { + description = "Actuate device"; + method = "actuate(int value)"; + } + + capability Status { + description = "Handle status"; + method = "requestStatus()"; + method = "getStatus()"; + method = "isActiveStatus()"; + method = "getTimestampOfLastReading()"; + } + + capability ActuatorId { + description = "Manage actuator Id"; + method = "setId(int id)"; + method = "getId()"; + } +} + + diff --git a/localconfig/iotpolicy/SmartthingsActuator/smartthingsactuator.req b/localconfig/iotpolicy/SmartthingsActuator/smartthingsactuator.req new file mode 100644 index 0000000..ef11b8a --- /dev/null +++ b/localconfig/iotpolicy/SmartthingsActuator/smartthingsactuator.req @@ -0,0 +1,3 @@ + +requires SmartthingsSensor with Initialize, Actuate, Status, ActuatorId as interface SmartthingsActuatorSmart; + diff --git a/localconfig/iotpolicy/SmartthingsActuator/smartthingsactuatorcallback.pol b/localconfig/iotpolicy/SmartthingsActuator/smartthingsactuatorcallback.pol new file mode 100644 index 0000000..67ef033 --- /dev/null +++ b/localconfig/iotpolicy/SmartthingsActuator/smartthingsactuatorcallback.pol @@ -0,0 +1,11 @@ +public interface SmartthingsActuatorCallback { + + public void newActuatorReadingAvailable(int _sensorId, int _value, boolean _activeValue); + + capability Callback { + description = "Callback method"; + method = "newActuatorReadingAvailable(int _sensorId, int _value, boolean _activeValue)"; + } +} + + diff --git a/localconfig/iotpolicy/SmartthingsActuator/smartthingsactuatorcallback.req b/localconfig/iotpolicy/SmartthingsActuator/smartthingsactuatorcallback.req new file mode 100644 index 0000000..65f9f0e --- /dev/null +++ b/localconfig/iotpolicy/SmartthingsActuator/smartthingsactuatorcallback.req @@ -0,0 +1,3 @@ + +requires SmartthingsActuatorCallback with Callback as interface SmartthingsActuatorSmartCallback; + diff --git a/localconfig/mysql/doorlockActuatorUdpAddress.config b/localconfig/mysql/doorlockActuatorUdpAddress.config new file mode 100644 index 0000000..eaec2e4 --- /dev/null +++ b/localconfig/mysql/doorlockActuatorUdpAddress.config @@ -0,0 +1,5 @@ +SELECT * FROM +IoTDeviceAddress +WHERE +TYPE='DoorlockActuatorAdd' +; diff --git a/localconfig/mysql/doorlockActuatorZigbeeAddress.config b/localconfig/mysql/doorlockActuatorZigbeeAddress.config new file mode 100644 index 0000000..e9f2d7e --- /dev/null +++ b/localconfig/mysql/doorlockActuatorZigbeeAddress.config @@ -0,0 +1,5 @@ +SELECT * FROM +IoTZigbeeAddress +WHERE +TYPE='DoorlockActuatorZBAdd' +; diff --git a/localconfig/mysql/doorlockSet.config b/localconfig/mysql/doorlockSet.config new file mode 100644 index 0000000..49b24c1 --- /dev/null +++ b/localconfig/mysql/doorlockSet.config @@ -0,0 +1,3 @@ +SELECT * FROM +SmartthingsActuatorSmart +; diff --git a/others/Mysql/IoTMain.gz b/others/Mysql/IoTMain.gz index a8d18adc4e2200a76afb062870448813d38e9912..4b9fe78d7d01e5d5c9963a3391eb23d7abce388b 100644 GIT binary patch literal 5397 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 literal 5220 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 - + diff --git a/others/lede-gui/.idea/workspace.xml b/others/lede-gui/.idea/workspace.xml index be99b55..d764ed2 100644 --- a/others/lede-gui/.idea/workspace.xml +++ b/others/lede-gui/.idea/workspace.xml @@ -50,12 +50,10 @@ - + - - - + @@ -64,12 +62,9 @@ - + - - - - + @@ -77,54 +72,25 @@ - + - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1244,11 +1210,6 @@ - - - - - @@ -1416,6 +1377,11 @@ + + + + + @@ -2036,24 +2002,21 @@ - + - - - - - + + @@ -2066,7 +2029,10 @@ + + + @@ -2148,63 +2114,18 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - + + @@ -2230,7 +2151,6 @@ - @@ -2238,7 +2158,6 @@ - @@ -2268,7 +2187,6 @@ - @@ -2282,28 +2200,8 @@ - - - - - - - - - - - - - - - - - - - - - - + + @@ -2315,14 +2213,7 @@ - - - - - - - - + @@ -2367,7 +2258,6 @@ - @@ -2384,61 +2274,29 @@ - + - - - + - + - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2466,5 +2324,26 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/others/lede-gui/lede-gui.iml b/others/lede-gui/lede-gui.iml index 74baa3e..288756d 100644 --- a/others/lede-gui/lede-gui.iml +++ b/others/lede-gui/lede-gui.iml @@ -77,31 +77,13 @@ - - - - - - - - - - - - - - - - - - -- 2.34.1