bool PipelineElement::dataAvailableOnInputPins() const { QMutexLocker lock( &m_pleMutex ); for( InputPinMap::const_iterator itr = m_inputPins.begin(); itr != m_inputPins.end(); ++itr ) { IInputPin* in = itr->second.getPtr(); // only automatically check synchronous connections if( in->isConnected() && in->isSynchronous() ) { // check for data if( !in->hasData() ) { return false; } } } return true; }
bool PipelineElement::dataAvailableOnInputPins( unsigned int& nextSerial ) { // synchronous processor if( m_hasSynchronousPin ) { std::vector<unsigned int> serials; for( InputPinMap::const_iterator itr = m_inputPins.begin(); itr != m_inputPins.end(); ++itr ) { IInputPin* in = itr->second.getPtr(); // only check synchronous connections if( in->isConnected() ) { if( in->isSynchronous() ) { if( in->hasData() ) { unsigned int serial; bool isNull; in->peekNext(serial, isNull); serials.push_back( serial ); } else { return false; } } } } // check if all serials are the same (which should be the case) bool valid = true; for( unsigned int i=0; i<serials.size() && valid; ++i) { valid = (serials[0] == serials[i]); } // the model should guarantee that // this should never happen obviously if( !valid ) { setError( PlvPipelineRuntimeError, "Input corrupted" ); return false; } // save the serial nextSerial = serials[0]; return true; } // asynchronous processor, only has asynchronous pins else if( m_hasAsynchronousPin ) { std::vector<unsigned int> serials; for( InputPinMap::const_iterator itr = m_inputPins.begin(); itr != m_inputPins.end(); ++itr ) { IInputPin* in = itr->second.getPtr(); // only check asynchronous connections if( in->isConnected() ) //&& in->isAsynchronous() ) { if( in->hasData() ) { unsigned int serial; bool isNull; in->peekNext(serial, isNull); serials.push_back(serial); } } } if( serials.size() > 0 ) { std::sort( serials.begin(), serials.end() ); // return smallest serial nextSerial = serials[0]; return true; } } return false; }