bool ImageDisplayComponent::addDisplaySource(std::string tag, std::string type, DataSourceBase::shared_ptr orig) { // creates a copy of the data and an update command to // update the copy from the original. // // Added IplImage type Logger::In in("ImageDisplayComponent"); // Check if the type is IplImage, if this fail if(orig->getTypeName()!="IplImage"){ log(Error) << "Could not display '"<< tag <<"': This is not a IplImage type, it the Vision tookkit loaded?" << endlog(); return false; } DataSourceBase::shared_ptr clone = orig->getTypeInfo()->buildValue(); if ( !clone ) { log(Error) << "Could not display '"<< tag <<"' : unknown type." << endlog(); return false; } try { boost::shared_ptr<CommandInterface> comm( clone->updateCommand( orig.get() ) ); assert( comm ); root.push_back( boost::make_tuple( tag, orig, comm, clone, type ) ); } catch ( bad_assignment& ba ) { log(Error) << "Could not display '"<< tag <<"' : failed to create Command." << endlog(); return false; } return true; }
bool ImageDisplayComponent::configureHook(){ Logger::In in("ImageDisplayComponent"); // Load config file if ( this->marshalling()->readProperties( this->getName() + ".cpf" ) == false) return false; log(Info) << "Loading Ports to display from file." <<endlog(); PropertyDemarshaller dem( config.get() ); PropertyBag bag; if (dem.deserialize( bag ) == false ) { log(Error) << "Reading file "<< config.get() << " failed."<<endlog(); return false; } bool ok = true; PropertyBag::const_iterator it = bag.getProperties().begin(); while ( it != bag.getProperties().end() ){ Property<std::string>* compName = dynamic_cast<Property<std::string>* >( *it ); if ( !compName ) log(Error) << "Expected Property \"" << (*it)->getName() <<"\" to be of type string."<< endlog(); else if ( compName->getName() == "ImagePort" ) { string cname = compName->value().substr(0, compName->value().find(".")); string pname = compName->value().substr( compName->value().find(".")+1, string::npos); ok &= this->addDisplayPort(cname, pname); } else { log(Error) << "Expected \"Component\", \"Port\" or \"Data\", got " << compName->getName() << endlog(); ok = false; } ++it; } deleteProperties( bag ); // Create window for every dataport for(Reports::iterator it = root.begin(); it != root.end(); ++it ) { // Update the dataport (it->get<2>())->execute(); // Get the base dataport DataSourceBase::shared_ptr source = it->get<3>(); // Convert to Dataport<IplImage> DataSource<IplImage>::shared_ptr clone = AdaptDataSource<IplImage>()( source.get() ); IplImage localImage = clone->get(); string dataportName = it->get<0>(); cvNamedWindow(dataportName.data(),CV_WINDOW_AUTOSIZE); cvShowImage(dataportName.data(),&localImage); } // Enter main loop of the window, and update the window if needed int key; key = cvWaitKey(3); // Magic number 3 return ok; }
void ImageDisplayComponent::updateHook() { // For every dataport for(Reports::iterator it = root.begin(); it != root.end(); ++it ) { // Update the dataport (it->get<2>())->execute(); // Get the base dataport DataSourceBase::shared_ptr source = it->get<3>(); // Convert to Dataport<IplImage> DataSource<IplImage>::shared_ptr clone = AdaptDataSource<IplImage>()( source.get() ); IplImage localImage = clone->get(); string dataportName = it->get<0>(); cvShowImage(dataportName.data(),&localImage); } // Enter main loop of the window, and update the window if needed int key; key = cvWaitKey(3); // Magic number 3 }
void ConditionParser::seenexpression() { // get the datasource parsed by the ExpressionParser.. DataSourceBase::shared_ptr mcurdata = expressionparser.getResult(); expressionparser.dropResult(); // The reference count is stored in the DataSource itself ! // so the ref cnt information is not lost in this cast ds_bool = dynamic_cast<DataSource<bool>*>( mcurdata.get() ); if ( ds_bool ) { mcurdata = 0; } else { // we only want boolean expressions.. throw parse_exception_semantic_error( "Attempt to use a non-boolean value as a condition." ); } }
void doPrint( DataSourceBase* ds, bool recurse) { // this is needed for ds's that rely on initialision. // e.g. eval true once or time measurements. // becomes only really handy for 'watches' (todo). ds->reset(); /** * If this list of types gets to long, we can still add a virtual * printOut( std::ostream& ) = 0 to DataSourceBase. */ // this method can print some primitive DataSource<>'s. DataSource<bool>* dsb = DataSource<bool>::narrow(ds); if (dsb) { Logger::log() << dsb->get(); return; } DataSource<int>* dsi = DataSource<int>::narrow(ds); if (dsi) { Logger::log() << dsi->get() ; return; } #if 0 // does not work yet with CORBA layer. DataSource<long>* dsl = DataSource<long>::narrow(ds); if (dsl) { Logger::log() << dsl->get() ; return; } #endif DataSource<unsigned int>* dsui = DataSource<unsigned int>::narrow(ds); if (dsui) { Logger::log() << dsui->get() ; return; } DataSource<std::string>* dss = DataSource<std::string>::narrow(ds); if (dss) { Logger::log() <<'"'<< dss->get() << '"' ; return; } #if 0 DataSource<std::vector<double> >* dsvval = DataSource< std::vector<double> >::narrow(ds); if (dsvval) { Logger::log() << dsvval->get() ; return; } DataSource< Double6D >* ds6d = DataSource<Double6D>::narrow(ds); if (ds6d) { Logger::log() << ds6d->get() ; return; } #endif DataSource<double>* dsd = DataSource<double>::narrow(ds); if (dsd) { Logger::log() << dsd->get() ; return; } DataSource<char>* dsc = DataSource<char>::narrow(ds); if (dsc) { Logger::log() <<'\''<< dsc->get()<<'\'' ; return; } DataSource<PropertyBag>* dspbag = DataSource<PropertyBag>::narrow(ds); if (dspbag) { PropertyBag bag( dspbag->get() ); if (!recurse) { int siz = bag.getProperties().size(); Logger::log() << siz <<" Properties"; } else { if ( ! bag.empty() ) { Logger::log() <<Logger::nl; for( PropertyBag::iterator it= bag.getProperties().begin(); it!=bag.getProperties().end(); ++it) { Logger::log() <<(*it)->getType()<<" "<< (*it)->getName(); DataSourceBase::shared_ptr propds = (*it)->getDataSource(); this->printResult( propds.get(), false ); Logger::log() <<" ("<<(*it)->getDescription()<<')' << Logger::nl; } } else { Logger::log() <<"(empty PropertyBag)"; } } return; } // Leave void as last since any DS is convertible to void ! DataSource<void>* dsvd = DataSource<void>::narrow(ds); if (dsvd) { dsvd->get(); Logger::log() << "(void)" ; return; } if (ds) { ds->evaluate(); Logger::log() << "( result type '"+ds->getType()+"' not known to TaskBrowser )" ; } }
int StatementProcessor::execute(const std::string& comm) { Logger::In in("StatementProcessor"); TaskContext* taskcontext = d->tc; // Minor hack : also check if it was an attribute of current TC, for example, // if both the object and attribute with that name exist. the if // statement after this one would return and not give the expr parser // time to evaluate 'comm'. if ( taskcontext->provides()->getValue( comm ) ) { d->printResult( taskcontext->provides()->getValue( comm )->getDataSource().get(), true ); return 0; } Parser _parser; Logger::log() <<Logger::Debug << "Trying ValueChange..."; try { // Check if it was a method or datasource : DataSourceBase::shared_ptr ds = _parser.parseValueChange( comm, taskcontext ); // methods and DS'es are processed immediately. if ( ds.get() != 0 ) { Logger::log() << "ok" << Logger::endl; d->printResult( ds.get(), false ); return 0; // done here } else Logger::log() <<Logger::Debug << "no"<<Logger::endl; } catch ( fatal_semantic_parse_exception& pe ) { // incorr args, ... // way to fatal, must be reported immediately Logger::log() << Logger::Debug << "fatal_semantic_parse_exception: "; Logger::log() << Logger::Error << pe.what() <<Logger::nl; return -1; } catch ( syntactic_parse_exception& pe ) { // wrong content after = sign etc.. // syntactic errors must be reported immediately Logger::log() << Logger::Error << "syntactic_parse_exception: "; Logger::log() << Logger::Error << pe.what() <<Logger::nl; return -1; } catch ( parse_exception_parser_fail &pe ) { // ignore, try next parser Logger::log() << Logger::Debug << "Ignoring ValueChange exception :"<<Logger::nl; Logger::log() << Logger::Debug << pe.what() <<Logger::nl; } catch ( parse_exception& pe ) { // syntactic errors must be reported immediately Logger::log() << Logger::Error << "parse_exception :"; Logger::log() << Logger::Error << pe.what() <<Logger::nl; return -1; } Logger::log() << Logger::Debug << "Trying Expression..."<<Logger::nl; try { // Check if it was a method or datasource : DataSourceBase::shared_ptr ds = _parser.parseExpression( comm, taskcontext ); // methods and DS'es are processed immediately. if ( ds.get() != 0 ) { d->printResult( ds.get(), true ); return 0; // done here } else Logger::log() << Logger::Error << "returned zero !"<<Logger::nl; } catch ( syntactic_parse_exception& pe ) { // missing brace etc // syntactic errors must be reported immediately Logger::log() << Logger::Error << "syntactic_parse_exception :"; Logger::log() << Logger::Error << pe.what() <<Logger::nl; return -1; } catch ( fatal_semantic_parse_exception& pe ) { // incorr args, ... // way to fatal, must be reported immediately Logger::log() << Logger::Error << "fatal_semantic_parse_exception :"; Logger::log() << Logger::Error << pe.what() <<Logger::nl; return -1; } catch ( parse_exception_parser_fail &pe ) { // ignore, try next parser Logger::log() << Logger::Debug << "Ignoring Expression exception :"<<Logger::nl; Logger::log() << Logger::Debug << pe.what() <<Logger::nl; } catch ( parse_exception& pe ) { // ignore, try next parser Logger::log() << Logger::Debug << "Ignoring Expression parse_exception :"<<Logger::nl; Logger::log() << Logger::Debug << pe.what() <<Logger::nl; } return -1; }