[Orxonox-commit 2135] r6851 - code/trunk/src/modules/objects/triggers
dafrick at orxonox.net
dafrick at orxonox.net
Mon May 3 21:52:45 CEST 2010
Author: dafrick
Date: 2010-05-03 21:52:45 +0200 (Mon, 03 May 2010)
New Revision: 6851
Modified:
code/trunk/src/modules/objects/triggers/MultiTrigger.cc
code/trunk/src/modules/objects/triggers/MultiTrigger.h
Log:
Some bugfixes in MultiTrigger.
All MultiTrigger features should work now, but testing has not been done as rigorously as could be desired.
Modified: code/trunk/src/modules/objects/triggers/MultiTrigger.cc
===================================================================
--- code/trunk/src/modules/objects/triggers/MultiTrigger.cc 2010-05-03 16:41:43 UTC (rev 6850)
+++ code/trunk/src/modules/objects/triggers/MultiTrigger.cc 2010-05-03 19:52:45 UTC (rev 6851)
@@ -77,7 +77,7 @@
}
}
- //TODO: Clean up?
+ //TODO: Document.
void MultiTrigger::XMLPort(Element& xmlelement, XMLPort::Mode mode)
{
SUPER(MultiTrigger, XMLPort, xmlelement, mode);
@@ -93,7 +93,7 @@
XMLPortObject(MultiTrigger, MultiTrigger, "", addTrigger, getTrigger, xmlelement, mode);
- COUT(4) << "MultiTrigger &" << this << " created." << std::endl;
+ COUT(4) << "MultiTrigger '" << this->getName() << "' (&" << this << ") created." << std::endl;
}
//TODO: Document
@@ -112,8 +112,6 @@
SUPER(MultiTrigger, tick, dt);
std::queue<MultiTriggerState*>* queue = this->letTrigger();
- if(queue != NULL)
- COUT(4) << "MultiTrigger &" << this << ": " << queue->size() << " new states to state queue." << std::endl;
if(queue != NULL)
{
@@ -123,13 +121,15 @@
MultiTriggerState* state = queue->front();
if(state == NULL)
break;
-
- this->addState(state->bTriggered & this->isModeTriggered(state->originator), state->originator);
+
+ bool bTriggered = (state->bTriggered & this->isModeTriggered(state->originator)) ^ this->bInvertMode_;
+ if(bTriggered ^ this->isTriggered(state->originator))
+ this->addState(bTriggered, state->originator);
queue->pop();
delete state;
}
delete queue;
- }
+ }
if (this->stateQueue_.size() > 0)
{
@@ -171,7 +171,7 @@
// Remove the state from the state queue.
this->stateQueue_.pop_front();
- COUT(4) << "MultiTrigger &" << this << ": State processed, removing from state queue. originator: " << state->originator->getIdentifier()->getName() << " (&" << state->originator << "), active: " << state->bActive << "|" << this->isActive(state->originator) << ", triggered: " << state->bTriggered << "|" << this->isTriggered(state->originator) << "." << std::endl;
+ COUT(4) << "MultiTrigger '" << this->getName() << "' &" << this << ": State processed, removing from state queue. originator: " << state->originator->getIdentifier()->getName() << " (&" << state->originator << "), active: " << state->bActive << "|" << this->isActive(state->originator) << ", triggered: " << state->bTriggered << "|" << this->isTriggered(state->originator) << "." << std::endl;
delete state;
size -= 1;
}
@@ -179,7 +179,7 @@
{
this->stateQueue_.push_back(std::pair<float, MultiTriggerState*>(timeRemaining-dt, state));
this->stateQueue_.pop_front();
- COUT(4) << "MultiTrigger &" << this << ": State processed, decreasing time remaining. originator: " << state->originator->getIdentifier()->getName() << " (&" << state->originator << "), active: " << state->bActive << ", triggered: " << state->bTriggered << ", time remaining: " << timeRemaining-dt << "." << std::endl;
+ COUT(4) << "MultiTrigger '" << this->getName() << "' &" << this << ": State processed, decreasing time remaining. originator: " << state->originator->getIdentifier()->getName() << " (&" << state->originator << "), active: " << state->bActive << ", triggered: " << state->bTriggered << ", time remaining: " << timeRemaining-dt << "." << std::endl;
}
}
}
@@ -217,11 +217,38 @@
//TODO: Document
std::queue<MultiTriggerState*>* MultiTrigger::letTrigger(void)
{
+ // Goes through all trigger children and gets the objects triggering them.
+ std::set<BaseObject*>* triggerers = new std::set<BaseObject*>();
+ std::set<BaseObject*>::iterator objIt;
+ for(std::set<MultiTrigger*>::iterator it = this->children_.begin(); it != this->children_.end(); it ++)
+ {
+ std::set<BaseObject*> set = (*it)->getActive();
+ for(objIt = set.begin(); objIt != set.end(); objIt++)
+ {
+ triggerers->insert(*objIt);
+ }
+ }
+
+ // Goes through all the triggerers of this trigger.
+ for(objIt = this->active_.begin(); objIt != this->active_.end(); objIt++)
+ {
+ triggerers->insert(*objIt);
+ }
+
+ if(triggerers->size() == 0)
+ return NULL;
+
std::queue<MultiTriggerState*>* queue = new std::queue<MultiTriggerState*>();
- MultiTriggerState* state = new MultiTriggerState;
- state->bTriggered = true;
- state->originator = NULL;
- queue->push(state);
+ MultiTriggerState* state = NULL;
+ for(std::set<BaseObject*>::iterator it = triggerers->begin(); it != triggerers->end(); it++)
+ {
+ state = new MultiTriggerState;
+ state->bTriggered = true;
+ state->originator = *it;
+ queue->push(state);
+ }
+ delete triggerers;
+
return queue;
}
@@ -279,7 +306,6 @@
if(!this->isTarget(originator))
return false;
- bTriggered ^= this->bInvertMode_;
// If the state doesn't change.
if(this->isTriggered() && bTriggered)
return false;
@@ -288,10 +314,11 @@
// If the MultiTrigger is in switch mode.
if(this->bSwitch_ && !bTriggered)
- return false;
-
+ {
+ bActive = this->isActive(originator);
+ }
// If the state changes to active.
- if(this->remainingActivations_ != INF_s && bActive)
+ else if(this->remainingActivations_ != INF_s && bActive)
{
if(this->remainingActivations_ == 0)
return false;
@@ -299,12 +326,13 @@
}
else
{
- // If the MultiTrigger should stay active and there are no more remaining activations.
+ // If the MultiTrigger should stay active if there are no more remaining activations.
+ //TODO: Find out how this applies to infinitely many activations.
if(this->bStayActive_ && this->remainingActivations_ == 0)
return false;
}
- COUT(4) << "MultiTrigger &" << this << ": State added to state queue. originator: " << originator->getIdentifier()->getName() << " (&" << originator << "), active: " << bActive << "|" << this->isActive(originator) << ", triggered: " << bTriggered << "|" << this->isTriggered(originator) << "." << std::endl;
+ COUT(4) << "MultiTrigger &" << this << ": State added to state queue. originator: " << originator->getIdentifier()->getName() << " (&" << originator << "), active: " << bActive << "|" << this->isActive(originator) << ", triggered: " << bTriggered << "|" << this->isTriggered(originator) << ", remaining activations: " << this->remainingActivations_ << "." << std::endl;
// Create state.
MultiTriggerState* state = new MultiTriggerState;
Modified: code/trunk/src/modules/objects/triggers/MultiTrigger.h
===================================================================
--- code/trunk/src/modules/objects/triggers/MultiTrigger.h 2010-05-03 16:41:43 UTC (rev 6850)
+++ code/trunk/src/modules/objects/triggers/MultiTrigger.h 2010-05-03 19:52:45 UTC (rev 6851)
@@ -59,7 +59,11 @@
bool bActive;
bool bTriggered;
};
-
+
+ /**
+ @brief
+ The MultiTrigger class implements a trigger that has a distinct state for each object triggering it.
+ */
class _ObjectsExport MultiTrigger : public StaticEntity, public Tickable
{
public:
@@ -139,6 +143,9 @@
bool checkOr(BaseObject* triggerer);
bool checkXor(BaseObject* triggerer);
+ std::set<BaseObject*>& getActive(void)
+ { return this->active_; }
+
bool bFirstTick_;
MultiTriggerMode::Value mode_;
More information about the Orxonox-commit
mailing list