[dss-commits] digitalSTROM Server branch, master, updated. 156a771c54bd8100a53681a5546b914a93dba0f1

git version control dss-commits at forum.digitalstrom.org
Mon Jan 11 00:39:39 CET 2010


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  156a771c54bd8100a53681a5546b914a93dba0f1 (commit)
       via  5810052926da41401f2757d449c333e2cb9e7da8 (commit)
       via  2fc073c65dcb3d9f6413754031e08c0aba8f8ada (commit)
      from  d255b03f00610bd17ef0b04635781c8a5051a062 (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 156a771c54bd8100a53681a5546b914a93dba0f1
Author: Patrick Stählin <pstaehlin at futurelab.ch>
Date:   Mon Jan 11 00:38:23 2010 +0100

    Improved test coverage

commit 5810052926da41401f2757d449c333e2cb9e7da8
Author: Patrick Stählin <pstaehlin at futurelab.ch>
Date:   Fri Jan 8 23:03:51 2010 +0100

    Don't add local root for function values
    
    This causes the tests to crash on xulrunner-dev 1.9.

commit 2fc073c65dcb3d9f6413754031e08c0aba8f8ada
Author: Patrick Stählin <pstaehlin at futurelab.ch>
Date:   Fri Jan 8 22:21:51 2010 +0100

    Removed some dependencies on dss::DSS part 2

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

Changes:
diff --git a/core/ds485/ds485.cpp b/core/ds485/ds485.cpp
index 8aa3e0e..1d54a82 100644
--- a/core/ds485/ds485.cpp
+++ b/core/ds485/ds485.cpp
@@ -58,11 +58,6 @@ namespace dss {
   } // add<devid_t>
 
   template<>
-  void DS485Payload::add(bool _data) {
-    m_Data.push_back(_data);
-  } // add<bool>
-
-  template<>
   void DS485Payload::add(uint32_t _data) {
     add<uint16_t>((_data >>  0) & 0x0000FFFF);
     add<uint16_t>((_data >> 16) & 0x0000FFFF);
diff --git a/core/model/apartment.cpp b/core/model/apartment.cpp
index 6d4223e..36094d5 100644
--- a/core/model/apartment.cpp
+++ b/core/model/apartment.cpp
@@ -108,14 +108,6 @@ namespace dss {
     _zone.addGroup(grp);
   } // addDefaultGroupsToZone
 
-  void Apartment::setPowerConsumption(int _dsMeterBusID, unsigned long _value) {
-    getDSMeterByBusID(_dsMeterBusID).setPowerConsumption(_value);
-  } // powerConsumption
-
-  void Apartment::setEnergyMeterValue(int _dsMeterBusID, unsigned long _value) {
-    getDSMeterByBusID(_dsMeterBusID).setEnergyMeterValue(_value);
-  } // energyMeterValue
-
   Device& Apartment::getDeviceByDSID(const dsid_t _dsid) const {
     foreach(Device* dev, m_Devices) {
       if(dev->getDSID() == _dsid) {
diff --git a/core/model/apartment.h b/core/model/apartment.h
index dcfa358..127773e 100644
--- a/core/model/apartment.h
+++ b/core/model/apartment.h
@@ -136,8 +136,6 @@ namespace dss {
     PropertyNodePtr getPropertyNode() { return m_pPropertyNode; }
     void setModelMaintenance(ModelMaintenance* _value) { m_pModelMaintenance = _value; }
     ModelMaintenance* getModelMaintenance() { return m_pModelMaintenance; }
-    void setPowerConsumption(int _dsMeterBusID, unsigned long _value);
-    void setEnergyMeterValue(int _dsMeterBusID, unsigned long _value);
   }; // Apartment
   
   /** Exception that will be thrown if a given item could not be found */
diff --git a/core/model/modelmaintenance.cpp b/core/model/modelmaintenance.cpp
index a636021..2ef4d39 100644
--- a/core/model/modelmaintenance.cpp
+++ b/core/model/modelmaintenance.cpp
@@ -192,14 +192,20 @@ namespace dss {
         if(event.getParameterCount() != 2) {
           log("Expected exactly 2 parameter for ModelEvent::etPowerConsumption");
         } else {
-          m_pApartment->setPowerConsumption(event.getParameter(0), event.getParameter(1));
+	  int meterID = event.getParameter(0);
+	  int consumption = event.getParameter(1);
+	  DSMeter& meter = m_pApartment->getDSMeterByBusID(meterID);
+	  meter.setPowerConsumption(consumption);
         }
         break;
       case ModelEvent::etEnergyMeterValue:
         if(event.getParameterCount() != 2) {
           log("Expected exactly 2 parameter for ModelEvent::etEnergyMeterValue");
         } else {
-          m_pApartment->setEnergyMeterValue(event.getParameter(0), event.getParameter(1));
+	  int meterID = event.getParameter(0);
+	  int value = event.getParameter(1);
+	  DSMeter& meter = m_pApartment->getDSMeterByBusID(meterID);
+	  meter.setEnergyMeterValue(value);
         }
         break;
       case ModelEvent::etDS485DeviceDiscovered:
diff --git a/core/scripting/modeljs.cpp b/core/scripting/modeljs.cpp
index ffbb67a..9dffe91 100644
--- a/core/scripting/modeljs.cpp
+++ b/core/scripting/modeljs.cpp
@@ -1194,13 +1194,10 @@ namespace dss {
     m_pFunctionObject(_functionObj),
     m_Function(_function),
     m_Identifier(_identifier)
-  {
-    JS_AddRoot(_pContext->getJSContext(), &m_Function);
-  } // ctor
+  { } // ctor
 
   PropertyScriptListener::~PropertyScriptListener() {
     m_pExtension->removeListener(m_Identifier);
-    JS_RemoveRoot(m_pContext->getJSContext(), &m_Function);
   } // dtor
 
   void PropertyScriptListener::createScriptObject() {
diff --git a/core/web/handler/meteringrequesthandler.cpp b/core/web/handler/meteringrequesthandler.cpp
index 3671bcd..26a1f58 100644
--- a/core/web/handler/meteringrequesthandler.cpp
+++ b/core/web/handler/meteringrequesthandler.cpp
@@ -26,7 +26,6 @@
 #include <vector>
 
 #include "core/foreach.h"
-#include "core/dss.h"
 
 #include "core/metering/metering.h"
 #include "core/metering/series.h"
@@ -42,10 +41,16 @@ namespace dss {
 
 
   //=========================================== MeteringRequestHandler
+  
+  MeteringRequestHandler::MeteringRequestHandler(Apartment& _apartment, Metering& _metering)
+  : m_Apartment(_apartment),
+    m_Metering(_metering)
+  { }
+
 
   boost::shared_ptr<JSONObject> MeteringRequestHandler::jsonHandleRequest(const RestfulRequest& _request, Session* _session) {
     if(_request.getMethod() == "getResolutions") {
-      std::vector<boost::shared_ptr<MeteringConfigChain> > meteringConfig = getDSS().getMetering().getConfig();
+      std::vector<boost::shared_ptr<MeteringConfigChain> > meteringConfig = m_Metering.getConfig();
       boost::shared_ptr<JSONObject> resultObj(new JSONObject());
       boost::shared_ptr<JSONArrayBase> resolutions(new JSONArrayBase());
       resultObj->addElement("resolutions", resolutions);
@@ -67,7 +72,7 @@ namespace dss {
       boost::shared_ptr<JSONArrayBase> series(new JSONArrayBase());
       resultObj->addElement("series", series);
 
-      std::vector<DSMeter*>& dsMeters = getDSS().getApartment().getDSMeters();
+      std::vector<DSMeter*>& dsMeters = m_Apartment.getDSMeters();
       foreach(DSMeter* dsMeter, dsMeters) {
         boost::shared_ptr<JSONObject> energyEntry(new JSONObject());
         series->addElement("", energyEntry);
@@ -93,7 +98,7 @@ namespace dss {
         dsid_t deviceDSID = dsid_t::fromString(deviceDSIDString);
         if(!(deviceDSID == NullDSID)) {
           try {
-            getDSS().getApartment().getDSMeterByDSID(deviceDSID);
+            m_Apartment.getDSMeterByDSID(deviceDSID);
           } catch(std::runtime_error& e) {
             return failure("Could not find device with dsid '" + deviceDSIDString + "'");
           }
@@ -119,8 +124,8 @@ namespace dss {
         }
       }
       if(!resolutionString.empty()) {
-        std::vector<boost::shared_ptr<MeteringConfigChain> > meteringConfig = getDSS().getMetering().getConfig();
-        storageLocation = getDSS().getMetering().getStorageLocation();
+        std::vector<boost::shared_ptr<MeteringConfigChain> > meteringConfig = m_Metering.getConfig();
+        storageLocation = m_Metering.getStorageLocation();
         for(unsigned int iConfig = 0; iConfig < meteringConfig.size(); iConfig++) {
           boost::shared_ptr<MeteringConfigChain> cConfig = meteringConfig[iConfig];
           for(int jConfig = 0; jConfig < cConfig->size(); jConfig++) {
diff --git a/core/web/handler/meteringrequesthandler.h b/core/web/handler/meteringrequesthandler.h
index 03b93c4..6d746f1 100644
--- a/core/web/handler/meteringrequesthandler.h
+++ b/core/web/handler/meteringrequesthandler.h
@@ -27,10 +27,17 @@
 #include "core/web/webrequests.h"
 
 namespace dss {
+  
+  class Metering;
+  class Apartment;
 
   class MeteringRequestHandler : public WebServerRequestHandlerJSON {
   public:
+    MeteringRequestHandler(Apartment& _apartment, Metering& _metering);
     virtual boost::shared_ptr<JSONObject> jsonHandleRequest(const RestfulRequest& _request, Session* _session);
+  private:
+    Apartment& m_Apartment;
+    Metering& m_Metering;
   }; // MeteringRequestHandler
 
 } // namespace dss
diff --git a/core/web/handler/propertyrequesthandler.cpp b/core/web/handler/propertyrequesthandler.cpp
index 77eb29a..021dda0 100644
--- a/core/web/handler/propertyrequesthandler.cpp
+++ b/core/web/handler/propertyrequesthandler.cpp
@@ -23,7 +23,6 @@
 #include "propertyrequesthandler.h"
 
 #include "core/propertysystem.h"
-#include "core/dss.h"
 
 #include "core/web/json.h"
 
@@ -31,13 +30,17 @@ namespace dss {
 
 
   //=========================================== PropertyRequestHandler
+  
+  PropertyRequestHandler::PropertyRequestHandler(PropertySystem& _propertySystem)
+  : m_PropertySystem(_propertySystem)
+  { }
 
   boost::shared_ptr<JSONObject> PropertyRequestHandler::jsonHandleRequest(const RestfulRequest& _request, Session* _session) {
     std::string propName = _request.getParameter("path");
     if(propName.empty()) {
       return failure("Need parameter 'path' for property operations");
     }
-    PropertyNodePtr node = getDSS().getPropertySystem().getProperty(propName);
+    PropertyNodePtr node = m_PropertySystem.getProperty(propName);
 
     if(_request.getMethod() == "getString") {
       if(node == NULL) {
@@ -75,7 +78,7 @@ namespace dss {
     } else if(_request.getMethod() == "setString") {
       std::string value = _request.getParameter("value");
       if(node == NULL) {
-        node = getDSS().getPropertySystem().createProperty(propName);
+        node = m_PropertySystem.createProperty(propName);
       }
       try {
         node->setStringValue(value);
@@ -94,7 +97,7 @@ namespace dss {
         return failure("Expected 'true' or 'false' for parameter 'value' but got: '" + strValue + "'");
       }
       if(node == NULL) {
-        node = getDSS().getPropertySystem().createProperty(propName);
+        node = m_PropertySystem.createProperty(propName);
       }
       try {
         node->setBooleanValue(value);
@@ -111,7 +114,7 @@ namespace dss {
         return failure("Could not convert parameter 'value' to std::string. Got: '" + strValue + "'");
       }
       if(node == NULL) {
-        node = getDSS().getPropertySystem().createProperty(propName);
+        node = m_PropertySystem.createProperty(propName);
       }
       try {
         node->setIntegerValue(value);
diff --git a/core/web/handler/propertyrequesthandler.h b/core/web/handler/propertyrequesthandler.h
index f3a412a..8d99ac8 100644
--- a/core/web/handler/propertyrequesthandler.h
+++ b/core/web/handler/propertyrequesthandler.h
@@ -27,9 +27,14 @@
 
 namespace dss {
 
+  class PropertySystem;
+  
   class PropertyRequestHandler : public WebServerRequestHandlerJSON {
   public:
+    PropertyRequestHandler(PropertySystem& _propertySystem);
     virtual boost::shared_ptr<JSONObject> jsonHandleRequest(const RestfulRequest& _request, Session* _session);
+  private:
+    PropertySystem& m_PropertySystem;
   }; // PropertyRequestHandler
 
 } // namespace dss
diff --git a/core/web/handler/setrequesthandler.cpp b/core/web/handler/setrequesthandler.cpp
index fb0abc1..ee91500 100644
--- a/core/web/handler/setrequesthandler.cpp
+++ b/core/web/handler/setrequesthandler.cpp
@@ -26,7 +26,6 @@
 #include "core/model/apartment.h"
 #include "core/model/set.h"
 
-#include "core/dss.h"
 #include "core/setbuilder.h"
 
 #include "jsonhelper.h"
@@ -34,6 +33,10 @@
 namespace dss {
 
   //=========================================== SetRequestHandler
+  
+  SetRequestHandler::SetRequestHandler(Apartment& _apartment)
+  : m_Apartment(_apartment)
+  { }
 
   boost::shared_ptr<JSONObject> SetRequestHandler::jsonHandleRequest(const RestfulRequest& _request, Session* _session) {
     if(_request.getMethod() == "fromApartment") {
@@ -93,7 +96,7 @@ namespace dss {
         resultObj->addProperty("self", self + additionalPart);
         return success(resultObj);
       } else if(_request.getMethod() == "getDevices") {
-        SetBuilder builder(getDSS().getApartment());
+        SetBuilder builder(m_Apartment);
         Set set = builder.buildSet(self, NULL);
         return success(toJSON(set));
       } else if(_request.getMethod() == "add") {
@@ -125,7 +128,7 @@ namespace dss {
         resultObj->addProperty("self", self + additionalPart);
         return success(resultObj);
       } else if(isDeviceInterfaceCall(_request)) {
-        SetBuilder builder(getDSS().getApartment());
+        SetBuilder builder(m_Apartment);
         Set set = builder.buildSet(self, NULL);
         return handleDeviceInterfaceRequest(_request, &set);
       } else {
diff --git a/core/web/handler/setrequesthandler.h b/core/web/handler/setrequesthandler.h
index 13cf58b..db395d9 100644
--- a/core/web/handler/setrequesthandler.h
+++ b/core/web/handler/setrequesthandler.h
@@ -26,10 +26,14 @@
 #include "deviceinterfacerequesthandler.h"
 
 namespace dss {
+  class Apartment;
 
   class SetRequestHandler : public DeviceInterfaceRequestHandler {
   public:
+    SetRequestHandler(Apartment& _apartment);
     virtual boost::shared_ptr<JSONObject> jsonHandleRequest(const RestfulRequest& _request, Session* _session);
+  public:
+    Apartment& m_Apartment;
   }; // SetRequestHandler
 
 } // namespace dss
diff --git a/core/web/handler/simrequesthandler.cpp b/core/web/handler/simrequesthandler.cpp
index f859204..47fe093 100644
--- a/core/web/handler/simrequesthandler.cpp
+++ b/core/web/handler/simrequesthandler.cpp
@@ -22,7 +22,6 @@
 
 #include "simrequesthandler.h"
 
-#include "core/dss.h"
 #include "core/ds485const.h"
 #include "core/model/group.h"
 #include "core/model/zone.h"
@@ -32,6 +31,10 @@ namespace dss {
 
 
   //=========================================== SimRequestHandler
+  
+  SimRequestHandler::SimRequestHandler(Apartment& _apartment)
+  : m_Apartment(_apartment)
+  { }
 
   boost::shared_ptr<JSONObject> SimRequestHandler::jsonHandleRequest(const RestfulRequest& _request, Session* _session) {
     if(_request.getMethod() == "switch") {
@@ -50,7 +53,7 @@ namespace dss {
           return failure("Could not parse groupID");
         }
         try {
-          Zone& zone = getDSS().getApartment().getZone(zoneID);
+          Zone& zone = m_Apartment.getZone(zoneID);
           Group* pGroup = zone.getGroup(groupID);
 
           if(pGroup == NULL) {
@@ -78,9 +81,9 @@ namespace dss {
           case 5:
             {
               if(groupID == GroupIDGreen) {
-                getDSS().getApartment().getGroup(0).callScene(SceneBell);
+                m_Apartment.getGroup(0).callScene(SceneBell);
               } else if(groupID == GroupIDRed){
-                getDSS().getApartment().getGroup(0).callScene(SceneAlarm);
+                m_Apartment.getGroup(0).callScene(SceneAlarm);
               } else {
                 const int lastScene = pGroup->getLastCalledScene();
                 if(lastScene == SceneOff || lastScene == SceneDeepOff ||
diff --git a/core/web/handler/simrequesthandler.h b/core/web/handler/simrequesthandler.h
index 3d3a254..d47eb34 100644
--- a/core/web/handler/simrequesthandler.h
+++ b/core/web/handler/simrequesthandler.h
@@ -27,9 +27,14 @@
 
 namespace dss {
 
+  class Apartment;
+  
   class SimRequestHandler : public WebServerRequestHandlerJSON {
   public:
+    SimRequestHandler(Apartment& _apartment);
     virtual boost::shared_ptr<JSONObject> jsonHandleRequest(const RestfulRequest& _request, Session* _session);
+  private:
+    Apartment& m_Apartment;  
   }; // SimRequestHandler
 
 } // namespace dss
diff --git a/core/web/handler/structurerequesthandler.cpp b/core/web/handler/structurerequesthandler.cpp
index 1e65e4d..d7d15eb 100644
--- a/core/web/handler/structurerequesthandler.cpp
+++ b/core/web/handler/structurerequesthandler.cpp
@@ -24,7 +24,6 @@
 
 #include "core/web/json.h"
 
-#include "core/dss.h"
 #include "core/DS485Interface.h"
 #include "core/structuremanipulator.h"
 
@@ -39,9 +38,15 @@ namespace dss {
 
 
   //=========================================== StructureRequestHandler
+  
+  StructureRequestHandler::StructureRequestHandler(Apartment& _apartment, ModelMaintenance& _modelMaintenance, StructureModifyingBusInterface& _interface)
+  : m_Apartment(_apartment),
+    m_ModelMaintenance(_modelMaintenance),
+    m_Interface(_interface)
+  { }
 
   boost::shared_ptr<JSONObject> StructureRequestHandler::jsonHandleRequest(const RestfulRequest& _request, Session* _session) {
-    StructureManipulator manipulator(*getDSS().getDS485Interface().getStructureModifyingBusInterface(), getDSS().getApartment());
+    StructureManipulator manipulator(m_Interface, m_Apartment);
     if(_request.getMethod() == "zoneAddDevice") {
       std::string devidStr = _request.getParameter("devid");
       if(!devidStr.empty()) {
@@ -58,7 +63,7 @@ namespace dss {
             int zoneID = strToInt(zoneIDStr);
             DeviceReference devRef(dev, &DSS::getInstance()->getApartment());
             try {
-              Zone& zone = getDSS().getApartment().getZone(zoneID);
+              Zone& zone = m_Apartment.getZone(zoneID);
               manipulator.addDeviceToZone(dev, zone);
             } catch(ItemNotFoundException&) {
               return failure("Could not find zone");
@@ -79,7 +84,7 @@ namespace dss {
         zoneID = strToIntDef(zoneIDStr, -1);
       }
       if(zoneID != -1) {
-        getDSS().getApartment().allocateZone(zoneID);
+        m_Apartment.allocateZone(zoneID);
       } else {
         return failure("could not find zone");
       }
@@ -93,15 +98,15 @@ namespace dss {
       }
       if(zoneID != -1) {
         try {
-          Zone& zone = getDSS().getApartment().getZone(zoneID);
+          Zone& zone = m_Apartment.getZone(zoneID);
           if(zone.getFirstZoneOnDSMeter() != -1) {
             return failure("Cannot delete a primary zone");
           }
           if(zone.getDevices().length() > 0) {
             return failure("Cannot delete a non-empty zone");
           }
-          getDSS().getApartment().removeZone(zoneID);
-          getDSS().getModelMaintenance().addModelEvent(new ModelEvent(ModelEvent::etModelDirty));
+          m_Apartment.removeZone(zoneID);
+          m_ModelMaintenance.addModelEvent(new ModelEvent(ModelEvent::etModelDirty));
           return success();
         } catch(ItemNotFoundException&) {
           return failure("Could not find zone");
diff --git a/core/web/handler/structurerequesthandler.h b/core/web/handler/structurerequesthandler.h
index 4e75ae6..0a121f9 100644
--- a/core/web/handler/structurerequesthandler.h
+++ b/core/web/handler/structurerequesthandler.h
@@ -27,9 +27,18 @@
 
 namespace dss {
 
+  class Apartment;
+  class ModelMaintenance;
+  class StructureModifyingBusInterface;
+
   class StructureRequestHandler : public WebServerRequestHandlerJSON {
   public:
+    StructureRequestHandler(Apartment& _apartment, ModelMaintenance& _modelMaintenance, StructureModifyingBusInterface& _interface);
     virtual boost::shared_ptr<JSONObject> jsonHandleRequest(const RestfulRequest& _request, Session* _session);
+  private:
+    Apartment& m_Apartment;
+    ModelMaintenance& m_ModelMaintenance;
+    StructureModifyingBusInterface& m_Interface;
   }; // StructureRequestHandler
 
 } // namespace dss
diff --git a/core/web/handler/zonerequesthandler.cpp b/core/web/handler/zonerequesthandler.cpp
index 91e517f..b9b7694 100644
--- a/core/web/handler/zonerequesthandler.cpp
+++ b/core/web/handler/zonerequesthandler.cpp
@@ -23,8 +23,6 @@
 
 #include "zonerequesthandler.h"
 
-#include "core/dss.h"
-
 #include "core/model/zone.h"
 #include "core/model/apartment.h"
 
@@ -35,6 +33,11 @@ namespace dss {
 
   //=========================================== ZoneRequestHandler
 
+  ZoneRequestHandler::ZoneRequestHandler(Apartment& _apartment)
+  : m_Apartment(_apartment)
+  { }
+
+
   boost::shared_ptr<JSONObject> ZoneRequestHandler::jsonHandleRequest(const RestfulRequest& _request, Session* _session) {
     bool ok = true;
     std::string errorMessage;
@@ -45,7 +48,7 @@ namespace dss {
       int zoneID = strToIntDef(zoneIDString, -1);
       if(zoneID != -1) {
         try {
-          Zone& zone = getDSS().getApartment().getZone(zoneID);
+          Zone& zone = m_Apartment.getZone(zoneID);
           pZone = &zone;
         } catch(std::runtime_error& e) {
           ok = false;
@@ -57,7 +60,7 @@ namespace dss {
       }
     } else if(!zoneName.empty()) {
       try {
-        Zone& zone = getDSS().getApartment().getZone(zoneName);
+        Zone& zone = m_Apartment.getZone(zoneName);
         pZone = &zone;
       } catch(std::runtime_error& e) {
         ok = false;
diff --git a/core/web/handler/zonerequesthandler.h b/core/web/handler/zonerequesthandler.h
index 7088971..dc27e1c 100644
--- a/core/web/handler/zonerequesthandler.h
+++ b/core/web/handler/zonerequesthandler.h
@@ -26,10 +26,15 @@
 #include "deviceinterfacerequesthandler.h"
 
 namespace dss {
+  
+  class Apartment;
 
   class ZoneRequestHandler : public DeviceInterfaceRequestHandler {
   public:
+    ZoneRequestHandler(Apartment& _apartment);
     virtual boost::shared_ptr<JSONObject> jsonHandleRequest(const RestfulRequest& _request, Session* _session);
+  private:
+    Apartment& m_Apartment;
   }; // ZoneRequestHandler
 
 }
diff --git a/core/web/webrequests.h b/core/web/webrequests.h
index 02488d0..bfad777 100644
--- a/core/web/webrequests.h
+++ b/core/web/webrequests.h
@@ -38,11 +38,6 @@ namespace dss {
   
   class WebServerRequestHandler : public RestfulRequestHandler {
   protected:
-
-    DSS& getDSS() {
-      return *DSS::getInstance();
-    }
-
     void log(const std::string& _line, aLogSeverity _severity = lsDebug) {
       Logger::getInstance()->log("RequestHandler: " + _line, _severity);
     }
diff --git a/core/web/webserver.cpp b/core/web/webserver.cpp
index c3db3f4..cefbf99 100644
--- a/core/web/webserver.cpp
+++ b/core/web/webserver.cpp
@@ -46,6 +46,8 @@
 #include "core/web/handler/setrequesthandler.h"
 #include "core/web/handler/zonerequesthandler.h"
 
+#include "core/DS485Interface.h"
+
 #include "webserverapi.h"
 #include "json.h"
 
@@ -186,17 +188,22 @@ namespace dss {
 
   void WebServer::instantiateHandlers() {
     m_Handlers[kHandlerApartment] = new ApartmentRequestHandler(getDSS().getApartment());
-    m_Handlers[kHandlerZone] = new ZoneRequestHandler();
+    m_Handlers[kHandlerZone] = new ZoneRequestHandler(getDSS().getApartment());
     m_Handlers[kHandlerDevice] = new DeviceRequestHandler(getDSS().getApartment());
     m_Handlers[kHandlerCircuit] = new CircuitRequestHandler(getDSS().getApartment());
-    m_Handlers[kHandlerSet] = new SetRequestHandler();
-    m_Handlers[kHandlerProperty] = new PropertyRequestHandler();
+    m_Handlers[kHandlerSet] = new SetRequestHandler(getDSS().getApartment());
+    m_Handlers[kHandlerProperty] = new PropertyRequestHandler(getDSS().getPropertySystem());
     m_Handlers[kHandlerEvent] = new EventRequestHandler(getDSS().getEventQueue());
     m_Handlers[kHandlerSystem] = new SystemRequestHandler();
-    m_Handlers[kHandlerStructure] = new StructureRequestHandler();
-    m_Handlers[kHandlerSim] = new SimRequestHandler();
+    m_Handlers[kHandlerStructure] = 
+      new StructureRequestHandler(
+        getDSS().getApartment(), 
+        getDSS().getModelMaintenance(), 
+        *getDSS().getDS485Interface().getStructureModifyingBusInterface()
+      );
+    m_Handlers[kHandlerSim] = new SimRequestHandler(getDSS().getApartment());
     m_Handlers[kHandlerDebug] = new DebugRequestHandler(getDSS());
-    m_Handlers[kHandlerMetering] = new MeteringRequestHandler();
+    m_Handlers[kHandlerMetering] = new MeteringRequestHandler(getDSS().getApartment(), getDSS().getMetering());
   } // instantiateHandlers
   
   void WebServer::httpPluginCallback(struct mg_connection* _connection,
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 1c4d73d..3556b54 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,10 +1,10 @@
 add_library(tests basetests.cpp  datetoolstests.cpp  ds485tests.cpp
-	eventtests.cpp  modeljstests.cpp  modeltests.cpp
+	eventtests.cpp  modeljstests.cpp  modeltests.cpp devicetests.cpp
 	propertysystemtests.cpp  scriptstest.cpp  seriestests.cpp tests.cpp busrequesttests.cpp restfulapitests.cpp)
 
 add_executable( dsstests EXCLUDE_FROM_ALL testrunner.cpp ../namespaces.cpp
 	basetests.cpp  datetoolstests.cpp  jsontests.cpp ds485tests.cpp
-        eventtests.cpp  modeljstests.cpp  modeltests.cpp
+        eventtests.cpp  modeljstests.cpp  modeltests.cpp devicetests.cpp
         propertysystemtests.cpp  scriptstest.cpp busrequesttests.cpp
 	seriestests.cpp jshandlertests.cpp restfulapitests.cpp)
 
diff --git a/tests/devicetests.cpp b/tests/devicetests.cpp
new file mode 100644
index 0000000..3a1df41
--- /dev/null
+++ b/tests/devicetests.cpp
@@ -0,0 +1,71 @@
+/*
+    Copyright (c) 2010 digitalSTROM.org, Zurich, Switzerland
+
+    Author: Patrick Staehlin, futureLAB AG <pstaehlin at futurelab.ch>
+
+    This file is part of digitalSTROM Server.
+
+    digitalSTROM Server is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    digitalSTROM Server is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with digitalSTROM Server. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#define BOOST_TEST_NO_MAIN
+#define BOOST_TEST_DYN_LINK
+#include <boost/test/unit_test.hpp>
+
+#include <boost/scoped_ptr.hpp>
+
+#include "core/model/device.h"
+#include "core/model/apartment.h"
+
+using namespace dss;
+
+BOOST_AUTO_TEST_SUITE(DeviceTests)
+
+BOOST_AUTO_TEST_CASE(testGroups) {
+  Apartment apt(NULL);
+  Device& dev = apt.allocateDevice(dsid_t(0,1));
+  BOOST_CHECK_EQUAL(dev.getGroupsCount(), 0);
+  dev.resetGroups();
+  BOOST_CHECK_EQUAL(dev.getGroupsCount(), 0);
+  dev.addToGroup(1);
+  BOOST_CHECK_EQUAL(dev.getGroupsCount(), 1);
+  BOOST_CHECK_EQUAL(dev.getGroupIdByIndex(0), 1);
+  BOOST_CHECK_EQUAL(dev.getGroupByIndex(0).getID(), 1);
+  dev.addToGroup(2);
+  BOOST_CHECK_EQUAL(dev.getGroupsCount(), 2);
+  BOOST_CHECK_EQUAL(dev.getGroupIdByIndex(0), 1);
+  BOOST_CHECK_EQUAL(dev.getGroupByIndex(0).getID(), 1);
+  BOOST_CHECK_EQUAL(dev.getGroupIdByIndex(1), 2);
+  BOOST_CHECK_EQUAL(dev.getGroupByIndex(1).getID(), 2);
+  // adding the device to the same groups again shouldn't change a thing
+  dev.addToGroup(1);
+  dev.addToGroup(2);
+  BOOST_CHECK_EQUAL(dev.getGroupsCount(), 2);
+  BOOST_CHECK_EQUAL(dev.getGroupIdByIndex(0), 1);
+  BOOST_CHECK_EQUAL(dev.getGroupByIndex(0).getID(), 1);
+  BOOST_CHECK_EQUAL(dev.getGroupIdByIndex(1), 2);
+  BOOST_CHECK_EQUAL(dev.getGroupByIndex(1).getID(), 2);
+  BOOST_CHECK(dev.getGroupBitmask().test(0));
+  BOOST_CHECK(dev.getGroupBitmask().test(1));
+  
+  dev.removeFromGroup(1);
+  BOOST_CHECK_EQUAL(dev.getGroupsCount(), 1);
+  BOOST_CHECK_EQUAL(dev.getGroupIdByIndex(0), 2);
+  BOOST_CHECK_EQUAL(dev.getGroupByIndex(0).getID(), 2);
+  BOOST_CHECK(!dev.getGroupBitmask().test(0));
+  BOOST_CHECK(dev.getGroupBitmask().test(1));
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/tests/ds485tests.cpp b/tests/ds485tests.cpp
index 3b3a67e..43489d8 100644
--- a/tests/ds485tests.cpp
+++ b/tests/ds485tests.cpp
@@ -26,7 +26,11 @@
 
 #include <boost/scoped_ptr.hpp>
 
+#include "core/foreach.h"
+#include "core/base.h"
+
 #include "core/ds485/ds485.h"
+#include "core/ds485types.h"
 
 using namespace dss;
 
@@ -36,28 +40,6 @@ BOOST_AUTO_TEST_CASE(testFrameReader) {
   boost::scoped_ptr<DS485FrameReader> reader(new DS485FrameReader());
   boost::shared_ptr<SerialComSim> simPort(new SerialComSim());
   std::string frame;
-/*
-  frame.push_back('\xFD');
-  frame.push_back('\x05');
-  frame.push_back('\x00');
-  frame.push_back('\x71');
-  frame.push_back('\x00');
-  frame.push_back('\x99');
-  frame.push_back('\x64');
-*/
-  /* Working frame
-
-  frame.push_back('\xFD');
-  frame.push_back('\x01');
-  frame.push_back('\x00');
-  frame.push_back('\x14');
-  frame.push_back('\xce');
-  frame.push_back('\x01');
-  frame.push_back('\x00');
-  frame.push_back('\x00');
-  frame.push_back('\x39');
-  frame.push_back('\x24');
-   */
 
   /* Captured frames */
   frame.push_back('\xFD');
@@ -127,4 +109,72 @@ BOOST_AUTO_TEST_CASE(testFrameReader) {
   delete reader->getFrame(1000);
 } // testFrameReader
 
+BOOST_AUTO_TEST_CASE(testFrameReadWrite) {
+  DS485CommandFrame cmdFrameOrigin;
+  cmdFrameOrigin.getHeader().setBroadcast(true);
+  cmdFrameOrigin.getHeader().setCounter(0x02);
+  cmdFrameOrigin.getHeader().setDestination(0x03);
+  cmdFrameOrigin.getHeader().setSource(0x04);
+  
+  std::string frameAsString;
+  std::vector<unsigned char> frameAsVector = cmdFrameOrigin.toChar();
+  uint16_t crc = 0x0000;
+  foreach(unsigned char c, frameAsVector) {
+    crc = update_crc(crc, c);
+    frameAsString.push_back(c);
+  }
+  unsigned char c = static_cast<unsigned char>(crc & 0xFF);
+  frameAsString.push_back(c);
+  c = static_cast<unsigned char>((crc >> 8) & 0xFF);
+  frameAsString.push_back(c);
+
+  
+  boost::shared_ptr<SerialComSim> simPort(new SerialComSim);
+  simPort->putSimData(frameAsString);
+  
+  DS485FrameReader reader;
+  reader.setSerialCom(simPort);
+  BOOST_CHECK_EQUAL(reader.getNumberOfCRCErrors(), 0);
+  BOOST_CHECK_EQUAL(reader.getNumberOfFramesReceived(), 0);
+  BOOST_CHECK_EQUAL(reader.getNumberOfIncompleteFramesReceived(), 0);
+  
+  DS485Frame* pFrame = reader.getFrame(1000);
+  DS485CommandFrame* cmdFrame = dynamic_cast<DS485CommandFrame*>(pFrame);
+  BOOST_REQUIRE(cmdFrame != NULL);
+
+  BOOST_CHECK_EQUAL(reader.getNumberOfCRCErrors(), 0);
+  BOOST_CHECK_EQUAL(reader.getNumberOfFramesReceived(), 1);
+  BOOST_CHECK_EQUAL(reader.getNumberOfIncompleteFramesReceived(), 0);
+
+  BOOST_CHECK_EQUAL(cmdFrame->getHeader().isBroadcast(), cmdFrameOrigin.getHeader().isBroadcast());
+  BOOST_CHECK_EQUAL(cmdFrame->getHeader().getCounter(),cmdFrameOrigin.getHeader().getCounter());
+  BOOST_CHECK_EQUAL(cmdFrame->getHeader().getDestination(),cmdFrameOrigin.getHeader().getDestination());
+  BOOST_CHECK_EQUAL(cmdFrame->getHeader().getSource(),cmdFrameOrigin.getHeader().getSource());  
+} // testFrameReadWrite
+
+BOOST_AUTO_TEST_CASE(testPayloadIsEmpty) {
+  DS485Payload payload;
+  BOOST_CHECK_EQUAL(payload.size(), 0);
+} // testFrameReadWrite
+
+BOOST_AUTO_TEST_CASE(testPayload) {
+  DS485Payload payload;
+  payload.add<uint8_t>(0x01);
+  BOOST_CHECK_EQUAL(payload.size(), 1);
+  payload.add<uint16_t>(0xbeef);
+  BOOST_CHECK_EQUAL(payload.size(), 3);
+  payload.add<uint32_t>(0xaabbccdd);
+  BOOST_CHECK_EQUAL(payload.size(), 7);
+  dsid_t dsid(0x001122334455667788ll, 0xeeff9900);
+  payload.add(dsid);
+  BOOST_CHECK_EQUAL(payload.size(), 19);
+  
+  PayloadDissector pd(payload);
+  BOOST_CHECK_EQUAL(pd.get<uint8_t>(), 0x01);
+  BOOST_CHECK_EQUAL(pd.get<uint16_t>(), 0xbeef);
+  BOOST_CHECK_EQUAL(pd.get<uint32_t>(), 0xaabbccdd);
+  BOOST_CHECK_EQUAL(pd.get<dsid_t>().toString(), dsid.toString());
+  BOOST_CHECK(pd.isEmpty());
+} // testPayload
+
 BOOST_AUTO_TEST_SUITE_END()


hooks/post-receive
-- 
digitalSTROM Server


More information about the dss-commits mailing list