[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