bool DirectorElement::makeUnitVector() { double modulus = calculateModulus(); if(modulus ==0) { //can't do divide by zero return false; } else { /* R vector * |R| modulus of vector R * r unit vector of vector R * R=|R|r * * so r = R/|r| */ x /= modulus; y /= modulus; //Try to sort rounding errors for vector aligned with axes if(x==1 || x==-1) y=0; if(y==1 || y==-1) x=0; return true; } }
void monitorThreadWorker(void* param) { if (param==0) { return; } BACIThreadParameter* baciParameter_p = static_cast<BACIThreadParameter*>(param); BACIThread* myself_p = baciParameter_p->getBACIThread(); BACIComponent* component_p = (BACIComponent*)baciParameter_p->getParameter(); if (BACIThread::InitThread) { BACIThread::InitThread(myself_p->getName().c_str()); } ACS_TRACE("baci::monitorThreadWorker"); ACS::TimeInterval pollInterval, time, lastPollTime; BACIValue value; bool timeTriggered; BACIProperty* property_p=0; CBDescOut descOut; ACS_DEBUG_PARAM("baci::monitorThreadWorker", "%s", component_p->getName()); // already in getPropertAt ?!!! //ThreadSyncGuard guard(component_p->&property_mpVectorMutex); while (myself_p->check()==true && component_p->isInDestructionState()==false) { if (myself_p->isSuspended()==false) { // sync. monitors time = getTimeStamp(); //guard.acquire(); for (int n=0; component_p->isInDestructionState()==false && n < component_p->getPropertyCount() && myself_p->exitRequested()==false; n++) { property_p = component_p->getPropertyAt(n); if (property_p==0 || property_p->isInDestructionState()==true) { continue; } if ((property_p->getMonitorCount() > 0) && ((property_p->getPollInterval() > 0) || property_p->hasTriggerOnValueMonitor()==true || property_p->hasTriggerOnValuePercentMonitor()==true)) { pollInterval = property_p->getPollInterval(); //if we're dealing with a property containing trigger by value monitors AND //the minimum monitor time is NOT default AND //it's less than the main polling interval... if ((property_p->hasTriggerOnValueMonitor()==true || property_p->hasTriggerOnValuePercentMonitor()==true) && (property_p->getMonMinTriggerTime()!=0) && (property_p->getMonMinTriggerTime()<pollInterval)) { pollInterval = property_p->getMonMinTriggerTime(); } lastPollTime = property_p->getLastPollTime(); //time = getTimeStamp(); // time fix ACS::TimeInterval etime = time; if (pollInterval!=0) { etime -= calculateModulus(time-lastPollTime, pollInterval); timeTriggered = (etime-lastPollTime)>=pollInterval; } else { timeTriggered = false; } //timeTriggered = (time-lastPollTime)>=pollInterval; //if (timeTriggered==true)//property_p->hasTriggerOnValueMonitor() || timeTriggered) if (property_p->hasTriggerOnValueMonitor() || property_p->hasTriggerOnValuePercentMonitor() || timeTriggered == true) { CompletionImpl co; value.reset(); property_p->getValue(property_p, (BACIValue*)&value, co, descOut); property_p->setLastValue(value); // !!! //property_p->setLastCompletion(completion); // !!! if (timeTriggered==true) { property_p->setLastPollTime(etime); // !!! do not set in case of error } //property_p->setLastPollTime(time); // !!! do not set in case of error if( co.isErrorFree() ) { property_p->dispatchMonitors(co, descOut); } else { CanNotGetValueCompletion errComp(co, __FILE__, __LINE__, "baci::monitorThreadWorker"); property_p->dispatchMonitors(errComp, descOut); }//if-else } } } //guard.release(); } if (myself_p->exitRequested()==false) { myself_p->sleep(); } } delete baciParameter_p; myself_p->setStopped(); if (BACIThread::DoneThread) { BACIThread::DoneThread(); } }