[dss-commits] digitalSTROM Server branch, master, updated. 9995f4656dc4759f5b78b2d902bd1cd51f5c3c17

git version control dss-commits at forum.digitalstrom.org
Thu Dec 10 16:21:10 CET 2009


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "digitalSTROM Server".

The branch, master has been updated
       via  9995f4656dc4759f5b78b2d902bd1cd51f5c3c17 (commit)
       via  c2b51a459dc9981febe3e7eeeae2ba688b62f1fb (commit)
       via  bca8059cb3354ba1f4c4baf5756e88d3add63a99 (commit)
       via  b0599476df81e9d1b57172f72298b92a6aa731c0 (commit)
      from  ffcf55af4195f8493e29c8ef2d9ae80a0513d4b3 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 9995f4656dc4759f5b78b2d902bd1cd51f5c3c17
Author: Patrick Stählin <pstaehlin at futurelab.ch>
Date:   Thu Dec 10 16:19:04 2009 +0100

    Added additional set selectors
    
    New selectors are:
    * byZone
    * byDSMeter
    * byGroup
    * byPresence
    
    Closes #234

commit c2b51a459dc9981febe3e7eeeae2ba688b62f1fb
Author: Patrick Stählin <pstaehlin at futurelab.ch>
Date:   Thu Dec 10 15:29:53 2009 +0100

    Don't assert on user-input
    
    Fixes #230

commit bca8059cb3354ba1f4c4baf5756e88d3add63a99
Author: Patrick Stählin <pstaehlin at futurelab.ch>
Date:   Thu Dec 10 15:26:50 2009 +0100

    Make last called scene available to scripts
    
    The devices last called scene is now accessible through
    @device.lastCalledScene at .
    
    Closes #229

commit b0599476df81e9d1b57172f72298b92a6aa731c0
Author: Patrick Stählin <pstaehlin at futurelab.ch>
Date:   Thu Dec 10 15:06:18 2009 +0100

    Publish JSObject* of ScriptObject

-----------------------------------------------------------------------

Changes:
diff --git a/core/jshandler.h b/core/jshandler.h
index 1d9c17b..1f44770 100644
--- a/core/jshandler.h
+++ b/core/jshandler.h
@@ -215,6 +215,8 @@ namespace dss {
 
     template<class t>
     t callFunctionByReference(jsval _function, ScriptFunctionParameterList& _parameter);
+
+    JSObject* getJSObject() { return m_pObject; }
   }; // ScriptObject
 
   class ScriptContextAttachedObject {
diff --git a/core/scripting/modeljs.cpp b/core/scripting/modeljs.cpp
index fb5ecc6..85a8f76 100644
--- a/core/scripting/modeljs.cpp
+++ b/core/scripting/modeljs.cpp
@@ -234,11 +234,121 @@ namespace dss {
         JSObject* resultObj = ext->createJSSet(*ctx, result);
         *rval = OBJECT_TO_JSVAL(resultObj);
         return JS_TRUE;
+      } else {
+        Logger::getInstance()->log("JS: set_by_functionid: Could not parse parameter1 as integer", lsWarning);
       }
     }
     return JS_FALSE;
   } // set_by_functionid
 
+  JSBool set_by_zone(JSContext* cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
+    ScriptContext* ctx = static_cast<ScriptContext*>(JS_GetContextPrivate(cx));
+    Set* set = static_cast<Set*>(JS_GetPrivate(cx, obj));
+
+    ModelScriptContextExtension* ext = dynamic_cast<ModelScriptContextExtension*>(ctx->getEnvironment().getExtension(ModelScriptcontextExtensionName));
+    if((ext != NULL) && (set != NULL) && (argc >= 1)) {
+      bool ok = false;
+      Set result;
+      try {
+        if(JSVAL_IS_INT(argv[0])) {
+          result = set->getByZone(JSVAL_TO_INT(argv[0]));
+          ok = true;
+        } else {
+          JSString* str = JS_ValueToString(cx, argv[0]);
+          if(str != NULL) {
+            std::string zonename = JS_GetStringBytes(str);
+            result = set->getByZone(zonename);
+            ok = true;
+          }
+        }
+      } catch(ItemNotFoundException&) {
+        ok = true; // return an empty set if the zone hasn't been found
+        Logger::getInstance()->log("JS: set_by_zone: Zone not found", lsWarning);
+      }
+      if(ok) {
+        JSObject* resultObj = ext->createJSSet(*ctx, result);
+        *rval = OBJECT_TO_JSVAL(resultObj);
+      } else {
+        *rval = JSVAL_NULL;
+      }
+      return JS_TRUE;
+    }
+    return JS_FALSE;
+  } // set_by_zone
+
+  JSBool set_by_group(JSContext* cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
+    ScriptContext* ctx = static_cast<ScriptContext*>(JS_GetContextPrivate(cx));
+    Set* set = static_cast<Set*>(JS_GetPrivate(cx, obj));
+
+    ModelScriptContextExtension* ext = dynamic_cast<ModelScriptContextExtension*>(ctx->getEnvironment().getExtension(ModelScriptcontextExtensionName));
+    if((ext != NULL) && (set != NULL) && (argc >= 1)) {
+      bool ok = false;
+      Set result;
+      try {
+        if(JSVAL_IS_INT(argv[0])) {
+          result = set->getByGroup(JSVAL_TO_INT(argv[0]));
+          ok = true;
+        } else {
+          JSString* str = JS_ValueToString(cx, argv[0]);
+          if(str != NULL) {
+            std::string groupname = JS_GetStringBytes(str);
+            result = set->getByGroup(groupname);
+            ok = true;
+          }
+        }
+      } catch(ItemNotFoundException&) {
+        ok = true; // return an empty set if the group hasn't been found
+        Logger::getInstance()->log("JS: set_by_group: Group not found", lsWarning);
+      }
+      if(ok) {
+        JSObject* resultObj = ext->createJSSet(*ctx, result);
+        *rval = OBJECT_TO_JSVAL(resultObj);
+      } else {
+        *rval = JSVAL_NULL;
+      }
+      return JS_TRUE;
+    }
+    return JS_FALSE;
+  } // set_by_group
+
+  JSBool set_by_dsmeter(JSContext* cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
+    ScriptContext* ctx = static_cast<ScriptContext*>(JS_GetContextPrivate(cx));
+    Set* set = static_cast<Set*>(JS_GetPrivate(cx, obj));
+
+    ModelScriptContextExtension* ext = dynamic_cast<ModelScriptContextExtension*>(ctx->getEnvironment().getExtension(ModelScriptcontextExtensionName));
+    if((ext != NULL) && (set != NULL) && (argc >= 1)) {
+      try {
+        int dsmeterID = ctx->convertTo<int>(argv[0]);
+        Set result = set->getByModulator(dsmeterID);
+        JSObject* resultObj = ext->createJSSet(*ctx, result);
+        *rval = OBJECT_TO_JSVAL(resultObj);
+        return JS_TRUE;
+      } catch(ScriptException& e) {
+        Logger::getInstance()->log(std::string("JS: set_by_dsmeter: ") + e.what(), lsWarning);
+      }
+    }
+    return JS_FALSE;
+  } // set_by_dsmeter
+
+  JSBool set_by_presence(JSContext* cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
+    ScriptContext* ctx = static_cast<ScriptContext*>(JS_GetContextPrivate(cx));
+    Set* set = static_cast<Set*>(JS_GetPrivate(cx, obj));
+
+    ModelScriptContextExtension* ext = dynamic_cast<ModelScriptContextExtension*>(ctx->getEnvironment().getExtension(ModelScriptcontextExtensionName));
+    if((ext != NULL) && (set != NULL) && (argc >= 1)) {
+      try {
+        bool presence = ctx->convertTo<bool>(argv[0]);
+        Set result = set->getByPresence(presence);
+        JSObject* resultObj = ext->createJSSet(*ctx, result);
+        *rval = OBJECT_TO_JSVAL(resultObj);
+        return JS_TRUE;
+      } catch(ScriptException& e) {
+        Logger::getInstance()->log(std::string("JS: set_by_presence: ") + e.what(), lsWarning);
+      }
+    }
+    return JS_FALSE;
+  } // set_by_presence
+
   JSBool set_JSGet(JSContext *cx, JSObject *obj, jsval id, jsval *rval) {
     Set* set = static_cast<Set*>(JS_GetPrivate(cx, obj));
 
@@ -267,6 +377,10 @@ namespace dss {
     {"byName", set_by_name, 1, 0, 0},
     {"byDSID", set_by_dsid, 1, 0, 0},
     {"byFunctionID", set_by_functionid, 1, 0, 0},
+    {"byZone", set_by_zone, 1, 0, 0},
+    {"byDSMeter", set_by_dsmeter, 1, 0, 0},
+    {"byGroup", set_by_group, 1, 0, 0},
+    {"byPresence", set_by_presence, 1, 0, 0},
     {NULL},
   };
 
@@ -549,7 +663,7 @@ namespace dss {
     {"saveScene", dev_save_scene, 1, 0, 0},
     {"undoScene", dev_undo_scene, 1, 0, 0},
     {"dSLinkSend", dev_dslink_send, 3, 0, 0},
-    {NULL}
+    {NULL, NULL, 0, 0, 0}
   };
 
   JSObject* ModelScriptContextExtension::createJSSet(ScriptContext& _ctx, Set& _set) {
@@ -591,6 +705,9 @@ namespace dss {
         case 5:
           *rval = INT_TO_JSVAL(dev->getDevice().getFunctionID());
           return JS_TRUE;
+        case 6:
+          *rval = INT_TO_JSVAL(dev->getDevice().getLastCalledScene());
+          return JS_TRUE;
       }
     }
     return JS_FALSE;
@@ -617,7 +734,8 @@ namespace dss {
     {"zoneID", 3, 0, dev_JSGet},
     {"circuitID", 4, 0, dev_JSGet},
     {"functionID", 5, 0, dev_JSGet},
-    {NULL}
+    {"lastCalledScene", 6, 0, dev_JSGet},
+    {NULL, 0, 0, NULL, NULL}
   };
 
   JSObject* ModelScriptContextExtension::createJSDevice(ScriptContext& _ctx, Device& _dev) {
@@ -976,7 +1094,7 @@ namespace dss {
         case vTypeNone:
           *rval = JSVAL_VOID;
         default:
-          assert(false);
+          *rval = JSVAL_NULL;
         }
       }
       return JS_TRUE;
diff --git a/tests/modeljstests.cpp b/tests/modeljstests.cpp
index 359f11d..1e48cb1 100644
--- a/tests/modeljstests.cpp
+++ b/tests/modeljstests.cpp
@@ -63,8 +63,16 @@ BOOST_AUTO_TEST_CASE(testSets) {
 
   Device& dev1 = apt.allocateDevice(dsid_t(0,1));
   dev1.setShortAddress(1);
+  dev1.setModulatorID(1);
+  dev1.addToGroup(1);
+  dev1.setIsPresent(true);
+  dev1.setZoneID(1);
   Device& dev2 = apt.allocateDevice(dsid_t(0,2));
   dev2.setShortAddress(2);
+  dev2.setModulatorID(1);
+  dev2.addToGroup(1);
+  dev2.setIsPresent(false);
+  dev2.setZoneID(2);
 
   boost::scoped_ptr<ScriptEnvironment> env(new ScriptEnvironment());
   env->initialize();
@@ -77,6 +85,37 @@ BOOST_AUTO_TEST_CASE(testSets) {
   BOOST_CHECK_EQUAL(2, length);
 
   ctx->evaluate<void>("var devs = getDevices(); var devs2 = getDevices(); devs.combine(devs2)");
+
+  length = ctx->evaluate<int>("getDevices().byZone(1).length()");
+  BOOST_CHECK_EQUAL(1, length);
+
+  length = ctx->evaluate<int>("getDevices().byZone(2).length()");
+  BOOST_CHECK_EQUAL(1, length);
+
+  length = ctx->evaluate<int>("getDevices().byGroup(1).length()");
+  BOOST_CHECK_EQUAL(2, length);
+
+  length = ctx->evaluate<int>("getDevices().byGroup('yellow').length()");
+  BOOST_CHECK_EQUAL(2, length);
+
+  length = ctx->evaluate<int>("getDevices().byGroup('asdf').length()");
+  BOOST_CHECK_EQUAL(0, length);
+
+  length = ctx->evaluate<int>("getDevices().byDSMeter(1).length()");
+  BOOST_CHECK_EQUAL(2, length);
+
+  length = ctx->evaluate<int>("getDevices().byPresence(false).length()");
+  BOOST_CHECK_EQUAL(1, length);
+
+  length = ctx->evaluate<int>("getDevices().byPresence(true).length()");
+  BOOST_CHECK_EQUAL(1, length);
+
+  // invalid types
+  length = ctx->evaluate<int>("getDevices().byZone(1.1).length()");
+  BOOST_CHECK_EQUAL(0, length);
+
+  length = ctx->evaluate<int>("getDevices().byGroup(1.1).length()");
+  BOOST_CHECK_EQUAL(0, length);
 } // testSets
 
 BOOST_AUTO_TEST_CASE(testDevices) {
@@ -97,7 +136,10 @@ BOOST_AUTO_TEST_CASE(testDevices) {
 
   boost::scoped_ptr<ScriptContext> ctx(env->getContext());
   ctx->evaluate<void>("var devs = getDevices();\n"
-                      "var f = function(dev) { print(dev.name); }\n"
+                      "var f = function(dev) {\n"
+                      "  print(dev.name);\n"
+                      "  print('lastCalledScene: ',dev.lastCalledScene);\n"
+                      "}\n"
                       "devs.perform(f)\n");
 } // testDevices
 


hooks/post-receive
-- 
digitalSTROM Server


More information about the dss-commits mailing list