[dss-commits] r8774 - dss/trunk/core

dss-commits at forum.digitalstrom.org dss-commits at forum.digitalstrom.org
Mon Sep 21 16:48:35 CEST 2009


Author: pstaehlin
Date: 2009-09-21 16:48:35 +0200 (Mon, 21 Sep 2009)
New Revision: 8774

Modified:
   dss/trunk/core/model.cpp
Log:
We need to rescan the bus more often than necessary since the DS485 events turned out to contain bogous information.

Fixes #116

Modified: dss/trunk/core/model.cpp
===================================================================
--- dss/trunk/core/model.cpp	2009-09-21 14:46:08 UTC (rev 8773)
+++ dss/trunk/core/model.cpp	2009-09-21 14:48:35 UTC (rev 8774)
@@ -818,9 +818,23 @@
     }
   } // scanModulator
 
+  class SetNotPresentAction : public IDeviceAction {
+  public:
+    virtual bool perform(Device& _device) {
+      _device.setIsPresent(false);
+      return true;
+    }
+  }; // SetNotPresentAction
+
   void Apartment::initializeFromBus() {
     DS485Interface& interface = DSS::getInstance()->getDS485Interface();
 
+    // mark modulators as not present
+    foreach(Modulator* pModulator, m_Modulators) {
+      pModulator->setIsPresent(false);
+    }
+
+    // mark present modulators as present
     vector<ModulatorSpec_t> modIDs = interface.getModulators();
     log("Found " + intToString(modIDs.size()) + " modulators...");
     foreach(ModulatorSpec_t& modulatorSpec, modIDs) {
@@ -830,43 +844,55 @@
       dsid_t modDSID = interface.getDSIDOfModulator(modulatorID);
       log("  DSID: " + modDSID.toString());
       Modulator& modulator = allocateModulator(modDSID);
+      log("Marking modulator as present");
+      modulator.setIsPresent(true);
+    }
+
+    // scan modulators
+    foreach(ModulatorSpec_t& modulatorSpec, modIDs) {
+      // bus-id, sw-version, hw-version, name, device-id
+      int modulatorID = modulatorSpec.get<0>();
+      log("Found modulator with id: " + intToString(modulatorID));
+      dsid_t modDSID = interface.getDSIDOfModulator(modulatorID);
+      log("  DSID: " + modDSID.toString());
+      Modulator& modulator = allocateModulator(modDSID);
       modulator.setBusID(modulatorID);
       scanModulator(modulator);
     }
+    
+    // mark devices of absent modulators as not present
+    foreach(Modulator* pModulator, m_Modulators) {
+      if(!pModulator->isPresent()) {
+        Set devices = pModulator->getDevices();
+        SetNotPresentAction action;
+        devices.perform(action);        
+      }
+    }
   } // initializeFromBus
   
   void Apartment::newModulator(int _modulatorBusID) {
     DS485Interface& interface = DSS::getInstance()->getDS485Interface();
-    log("Found modulator with id: " + intToString(_modulatorBusID));
-    dsid_t modDSID = interface.getDSIDOfModulator(_modulatorBusID);
-    log("  DSID: " + modDSID.toString());
-    Modulator& modulator = allocateModulator(modDSID);
-    modulator.setBusID(_modulatorBusID);
-    scanModulator(modulator);
-  } // newModulator
 
-  class SetNotPresentAction : public IDeviceAction {
-  public:
-    virtual bool perform(Device& _device) {
-      _device.setIsPresent(false);
-      return true;
+    vector<ModulatorSpec_t> modIDs = interface.getModulators();
+    log("Found " + intToString(modIDs.size()) + " modulators...");
+    foreach(ModulatorSpec_t& modulatorSpec, modIDs) {
+      // bus-id, sw-version, hw-version, name, device-id
+      int modulatorID = modulatorSpec.get<0>();
+      log("Found modulator with id: " + intToString(modulatorID));
+      dsid_t modDSID = interface.getDSIDOfModulator(modulatorID);
+      log("  DSID: " + modDSID.toString());
+      Modulator& modulator = allocateModulator(modDSID);
+      modulator.setBusID(modulatorID);
     }
-  }; // SetNotPresentAction
+  } // newModulator
   
   void Apartment::lostModulator(int _modulatorBusID) {
-    try {
-      Modulator& modulator = getModulatorByBusID(_modulatorBusID);
-      modulator.setIsPresent(false);
-      Set devices = modulator.getDevices();
-      SetNotPresentAction action;
-      devices.perform(action);
-    } catch(ItemNotFoundException& e) {
-      log(std::string("Apartment::lostModulator: ") + e.what(), lsError);
-    }
-  } // lostModulator
+    initializeFromBus();
+  }
   
   void Apartment::modulatorReady(int _modulatorBusID) {
-    newModulator(_modulatorBusID);
+    log("Modulator with id: " + intToString(_modulatorBusID) + " is ready");
+    initializeFromBus();
   } // modulatorReady
 
   void Apartment::handleModelEvents() {



More information about the dss-commits mailing list