void Event::Dump(Stream *s) const { Broadcaster *broadcaster; Broadcaster::BroadcasterImplSP broadcaster_impl_sp(m_broadcaster_wp.lock()); if (broadcaster_impl_sp) broadcaster = broadcaster_impl_sp->GetBroadcaster(); else broadcaster = nullptr; if (broadcaster) { StreamString event_name; if (broadcaster->GetEventNames(event_name, m_type, false)) s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x (%s), data = ", static_cast<const void *>(this), static_cast<void *>(broadcaster), broadcaster->GetBroadcasterName().GetCString(), m_type, event_name.GetString().c_str()); else s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x, data = ", static_cast<const void *>(this), static_cast<void *>(broadcaster), broadcaster->GetBroadcasterName().GetCString(), m_type); } else s->Printf("%p Event: broadcaster = NULL, type = 0x%8.8x, data = ", static_cast<const void *>(this), m_type); if (m_data_sp) { s->PutChar('{'); m_data_sp->Dump(s); s->PutChar('}'); } else s->Printf("<NULL>"); }
int main(int argc, char **argv) { ros::init(argc, argv, "imu_tf_broadcaster"); ros::NodeHandle n; ros::Rate loop_rate(1000); // Hz Broadcaster broadcaster; ros::Subscriber accelSub = n.subscribe("accel", 1000, &Broadcaster::accelCallback, &broadcaster); ros::Subscriber magnetSub = n.subscribe("magnet", 1000, &Broadcaster::magnetCallback, &broadcaster); ros::Subscriber headingSub = n.subscribe("heading", 1000, &Broadcaster::headingCallback, &broadcaster); ros::Subscriber gyroSub = n.subscribe("gyro", 1000, &Broadcaster::gyroCallback, &broadcaster); while(n.ok()) { //broadcaster.updateTimers(); //broadcaster.updateRotation(); broadcaster.tfBroadcaster->sendTransform( tf::StampedTransform( tf::Transform(broadcaster.getQ(), tf::Vector3(0.0, 0.0, 0.0)), ros::Time::now(), "odom", "imu_link") ); ros::spinOnce(); loop_rate.sleep(); // std::cout << "dt: " << broadcaster.getDt() << std::endl; // std::cout << "q.x: " << broadcaster.getQ().x() << std::endl; // std::cout << "q.y: " << broadcaster.getQ().y() << std::endl; // std::cout << "q.z: " << broadcaster.getQ().z() << std::endl; // std::cout << "q.w: " << broadcaster.getQ().w() << std::endl; // std::cout << "----" << std::endl; } return 0; }
void LUABroadcaster::RemoveServer(lua_State* pState, Broadcaster& broadcaster, const string& address) { if (Script::FromObject(pState, broadcaster)) { Script::Collection(pState, -1, "|items", broadcaster.count()); lua_pushstring(pState, address.c_str()); lua_pushnil(pState); lua_rawset(pState, -3); // rawset cause NewIndexProhibited lua_pop(pState, 2); } }
size_t Listener::HandleBroadcastEvent(EventSP &event_sp) { size_t num_handled = 0; std::lock_guard<std::recursive_mutex> guard(m_broadcasters_mutex); Broadcaster *broadcaster = event_sp->GetBroadcaster(); if (!broadcaster) return 0; broadcaster_collection::iterator pos; broadcaster_collection::iterator end = m_broadcasters.end(); Broadcaster::BroadcasterImplSP broadcaster_impl_sp( broadcaster->GetBroadcasterImpl()); for (pos = m_broadcasters.find(broadcaster_impl_sp); pos != end && pos->first.lock() == broadcaster_impl_sp; ++pos) { BroadcasterInfo info = pos->second; if (event_sp->GetType() & info.event_mask) { if (info.callback != nullptr) { info.callback(event_sp, info.callback_user_data); ++num_handled; } } } return num_handled; }
int main( int argc, char **argv ) { // use an ArgumentParser object to manage the program arguments. osg::ArgumentParser arguments(&argc,argv); // set up the usage document, in case we need to print out how to use this program. arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName()); arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the application for presenting 3D interactive slide shows."); arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ..."); arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information"); arguments.getApplicationUsage()->addCommandLineOption("-a","Turn auto stepping on by default"); arguments.getApplicationUsage()->addCommandLineOption("-d <float>","Time duration in seconds between layers/slides"); arguments.getApplicationUsage()->addCommandLineOption("-s <float> <float> <float>","width, height, distance and of the screen away from the viewer"); arguments.getApplicationUsage()->addCommandLineOption("--viewer","Start Present3D as the viewer version."); arguments.getApplicationUsage()->addCommandLineOption("--authoring","Start Present3D as the authoring version, license required."); arguments.getApplicationUsage()->addCommandLineOption("--master","Start Present3D as the master version, license required."); arguments.getApplicationUsage()->addCommandLineOption("--slave","Start Present3D as the slave version, license required."); arguments.getApplicationUsage()->addCommandLineOption("--publishing","Start Present3D as the publishing version, license required."); arguments.getApplicationUsage()->addCommandLineOption("--timeDelayOnNewSlideWithMovies","Set the time delay on new slide with movies, done to allow movie threads to get in sync with rendering thread."); arguments.getApplicationUsage()->addCommandLineOption("--targetFrameRate","Set the target frame rate, defaults to 80Hz."); arguments.getApplicationUsage()->addCommandLineOption("--version","Report the Present3D version."); arguments.getApplicationUsage()->addCommandLineOption("--print <filename>","Print out slides to a series of image files."); arguments.getApplicationUsage()->addCommandLineOption("--html <filename>","Print out slides to a series of html & image files."); arguments.getApplicationUsage()->addCommandLineOption("--loop","Switch on looping of presentation."); arguments.getApplicationUsage()->addCommandLineOption("--devices","Print the Video input capability via QuickTime and exit."); // add alias from xml to p3d to provide backwards compatibility for old p3d files. osgDB::Registry::instance()->addFileExtensionAlias("xml","p3d"); // if user requests devices video capability. if (arguments.read("-devices") || arguments.read("--devices")) { // Force load QuickTime plugin, probe video capability, exit osgDB::readImageFile("devices.live"); return 1; } // read any env vars from presentations before we create viewer to make sure the viewer // utilises these env vars if (p3d::readEnvVars(arguments)) { osg::DisplaySettings::instance()->readEnvironmentalVariables(); } // set up any logins required for http access std::string url, username, password; while(arguments.read("--login",url, username, password)) { if (!osgDB::Registry::instance()->getAuthenticationMap()) { osgDB::Registry::instance()->setAuthenticationMap(new osgDB::AuthenticationMap); osgDB::Registry::instance()->getAuthenticationMap()->addAuthenticationDetails( url, new osgDB::AuthenticationDetails(username, password) ); } } #ifdef USE_SDL SDLIntegration sdlIntegration; osg::notify(osg::INFO)<<"USE_SDL"<<std::endl; #endif bool doSetViewer = true; std::string configurationFile; // check env vars for configuration file const char* str = getenv("PRESENT3D_CONFIG_FILE"); if (!str) str = getenv("OSG_CONFIG_FILE"); if (str) configurationFile = str; // check command line parameters for configuration file. while (arguments.read("-c",configurationFile)) {} osg::Vec4 clearColor(0.0f,0.0f,0.0f,0.0f); while (arguments.read("--clear-color",clearColor[0],clearColor[1],clearColor[2],clearColor[3])) {} std::string filename; if (arguments.read("--spell-check",filename)) { p3d::SpellChecker spellChecker; spellChecker.checkP3dXml(filename); return 1; } if (arguments.read("--strip-text",filename)) { p3d::XmlPatcher patcher; // patcher.stripP3dXml(filename, osg::notify(osg::NOTICE)); osg::ref_ptr<osgDB::XmlNode> newNode = patcher.simplifyP3dXml(filename); if (newNode.valid()) { newNode->write(std::cout); } return 1; } std::string lhs_filename, rhs_filename; if (arguments.read("--merge",lhs_filename, rhs_filename)) { p3d::XmlPatcher patcher; osg::ref_ptr<osgDB::XmlNode> newNode = patcher.mergeP3dXml(lhs_filename, rhs_filename); if (newNode.valid()) { newNode->write(std::cout); } return 1; } // construct the viewer. osgViewer::Viewer viewer(arguments); // set clear colour to black by default. viewer.getCamera()->setClearColor(clearColor); if (!configurationFile.empty()) { viewer.readConfiguration(configurationFile); doSetViewer = false; } const char* p3dDevice = getenv("P3D_DEVICE"); if (p3dDevice) { osgDB::StringList devices; osgDB::split(p3dDevice, devices); for(osgDB::StringList::iterator i = devices.begin(); i != devices.end(); ++i) { addDeviceTo(viewer, *i); } } std::string device; while (arguments.read("--device", device)) { addDeviceTo(viewer, device); } if (arguments.read("--http-control")) { std::string server_address = "localhost"; std::string server_port = "8080"; std::string document_root = "htdocs"; while (arguments.read("--http-server-address", server_address)) {} while (arguments.read("--http-server-port", server_port)) {} while (arguments.read("--http-document-root", document_root)) {} osg::ref_ptr<osgDB::Options> device_options = new osgDB::Options("documentRegisteredHandlers"); osg::ref_ptr<osgGA::Device> rest_http_device = osgDB::readFile<osgGA::Device>(server_address+":"+server_port+"/"+document_root+".resthttp", device_options.get()); if (rest_http_device.valid()) { viewer.addDevice(rest_http_device.get()); } } // set up stereo masks viewer.getCamera()->setCullMask(0xffffffff); viewer.getCamera()->setCullMaskLeft(0x00000001); viewer.getCamera()->setCullMaskRight(0x00000002); // set up the camera manipulators. { osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator; keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() ); keyswitchManipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() ); keyswitchManipulator->addMatrixManipulator( '3', "Drive", new osgGA::DriveManipulator() ); keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new osgGA::TerrainManipulator() ); std::string pathfile; char keyForAnimationPath = '5'; while (arguments.read("-p",pathfile)) { osgGA::AnimationPathManipulator* apm = new osgGA::AnimationPathManipulator(pathfile); if (apm || !apm->valid()) { unsigned int num = keyswitchManipulator->getNumMatrixManipulators(); keyswitchManipulator->addMatrixManipulator( keyForAnimationPath, "Path", apm ); keyswitchManipulator->selectMatrixManipulator(num); ++keyForAnimationPath; } } viewer.setCameraManipulator( keyswitchManipulator.get() ); } // add the state manipulator osg::ref_ptr<osgGA::StateSetManipulator> ssManipulator = new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()); ssManipulator->setKeyEventToggleTexturing('e'); viewer.addEventHandler( ssManipulator.get() ); // add the state manipulator viewer.addEventHandler( new osgViewer::StatsHandler() ); viewer.addEventHandler( new osgViewer::WindowSizeHandler() ); // neeed to address. // viewer.getScene()->getUpdateVisitor()->setTraversalMode(osg::NodeVisitor::TRAVERSE_ACTIVE_CHILDREN); const char* p3dCursor = getenv("P3D_CURSOR"); std::string cursorFileName( p3dCursor ? p3dCursor : ""); while (arguments.read("--cursor",cursorFileName)) {} while (arguments.read("--set-viewer")) { doSetViewer = true; } while (arguments.read("--no-set-viewer")) { doSetViewer = false; } // cluster related entries. int socketNumber=8100; while (arguments.read("-n",socketNumber)) {} float camera_fov=-1.0f; while (arguments.read("-f",camera_fov)) {} float camera_offset=45.0f; while (arguments.read("-o",camera_offset)) {} std::string exportName; while (arguments.read("--print",exportName)) {} while (arguments.read("--html",exportName)) {} // read any time delay argument. float timeDelayBetweenSlides = 1.0f; while (arguments.read("-d",timeDelayBetweenSlides)) {} bool autoSteppingActive = false; while (arguments.read("-a")) autoSteppingActive = true; bool loopPresentation = false; while (arguments.read("--loop")) loopPresentation = true; { // set update hte default traversal mode settings for update visitor // default to osg::NodeVisitor::TRAVERSE_ACTIVE_CHILDREN. osg::NodeVisitor::TraversalMode updateTraversalMode = osg::NodeVisitor::TRAVERSE_ACTIVE_CHILDREN; // viewer.getUpdateVisitor()->getTraversalMode(); const char* p3dUpdateStr = getenv("P3D_UPDATE"); if (p3dUpdateStr) { std::string updateStr(p3dUpdateStr); if (updateStr=="active" || updateStr=="Active" || updateStr=="ACTIVE") updateTraversalMode = osg::NodeVisitor::TRAVERSE_ACTIVE_CHILDREN; else if (updateStr=="all" || updateStr=="All" || updateStr=="ALL") updateTraversalMode = osg::NodeVisitor::TRAVERSE_ALL_CHILDREN; } while(arguments.read("--update-active")) updateTraversalMode = osg::NodeVisitor::TRAVERSE_ACTIVE_CHILDREN; while(arguments.read("--update-all")) updateTraversalMode = osg::NodeVisitor::TRAVERSE_ALL_CHILDREN; viewer.getUpdateVisitor()->setTraversalMode(updateTraversalMode); } // register the slide event handler - which moves the presentation from slide to slide, layer to layer. osg::ref_ptr<osgPresentation::SlideEventHandler> seh = new osgPresentation::SlideEventHandler(&viewer); viewer.addEventHandler(seh.get()); seh->setAutoSteppingActive(autoSteppingActive); seh->setTimeDelayBetweenSlides(timeDelayBetweenSlides); seh->setLoopPresentation(loopPresentation); double targetFrameRate = 80.0; while (arguments.read("--targetFrameRate",targetFrameRate)) {} // set the time delay float timeDelayOnNewSlideWithMovies = 0.4f; while (arguments.read("--timeDelayOnNewSlideWithMovies",timeDelayOnNewSlideWithMovies)) {} seh->setTimeDelayOnNewSlideWithMovies(timeDelayOnNewSlideWithMovies); // set up optimizer options unsigned int optimizer_options = osgUtil::Optimizer::DEFAULT_OPTIMIZATIONS; bool relase_and_compile = false; while (arguments.read("--release-and-compile")) { relase_and_compile = true; } seh->setReleaseAndCompileOnEachNewSlide(relase_and_compile); if (relase_and_compile) { // make sure that imagery stays around after being applied to textures. viewer.getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true,false); optimizer_options &= ~osgUtil::Optimizer::OPTIMIZE_TEXTURE_SETTINGS; } // // osgDB::Registry::instance()->getOrCreateDatabasePager()->setUnrefImageDataAfterApplyPolicy(true,false); // optimizer_options &= ~osgUtil::Optimizer::OPTIMIZE_TEXTURE_SETTINGS; // osg::Texture::getTextureObjectManager()->setExpiryDelay(0.0f); // osgDB::Registry::instance()->getOrCreateDatabasePager()->setExpiryDelay(1.0f); // register the handler for modifying the point size osg::ref_ptr<PointsEventHandler> peh = new PointsEventHandler; viewer.addEventHandler(peh.get()); // add the screen capture handler std::string screenCaptureFilename = "screen_shot.jpg"; while(arguments.read("--screenshot", screenCaptureFilename)) {} osg::ref_ptr<osgViewer::ScreenCaptureHandler::WriteToFile> writeFile = new osgViewer::ScreenCaptureHandler::WriteToFile( osgDB::getNameLessExtension(screenCaptureFilename), osgDB::getFileExtension(screenCaptureFilename) ); osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler = new osgViewer::ScreenCaptureHandler(writeFile.get()); screenCaptureHandler->setKeyEventTakeScreenShot('m');//osgGA::GUIEventAdapter::KEY_Print); screenCaptureHandler->setKeyEventToggleContinuousCapture('M'); viewer.addEventHandler(screenCaptureHandler.get()); // osg::DisplaySettings::instance()->setSplitStereoAutoAjustAspectRatio(false); float width = osg::DisplaySettings::instance()->getScreenWidth(); float height = osg::DisplaySettings::instance()->getScreenHeight(); float distance = osg::DisplaySettings::instance()->getScreenDistance(); while (arguments.read("-s", width, height, distance)) { osg::DisplaySettings::instance()->setScreenDistance(distance); osg::DisplaySettings::instance()->setScreenHeight(height); osg::DisplaySettings::instance()->setScreenWidth(width); } std::string outputFileName; while(arguments.read("--output",outputFileName)) {} // get details on keyboard and mouse bindings used by the viewer. viewer.getUsage(*arguments.getApplicationUsage()); // if user request help write it out to cout. if (arguments.read("-h") || arguments.read("--help")) { arguments.getApplicationUsage()->write(osg::notify(osg::NOTICE)); return 1; } P3DApplicationType P3DApplicationType = VIEWER; str = getenv("PRESENT3D_TYPE"); if (str) { if (strcmp(str,"viewer")==0) P3DApplicationType = VIEWER; else if (strcmp(str,"master")==0) P3DApplicationType = MASTER; else if (strcmp(str,"slave")==0) P3DApplicationType = SLAVE; } while (arguments.read("--viewer")) { P3DApplicationType = VIEWER; } while (arguments.read("--master")) { P3DApplicationType = MASTER; } while (arguments.read("--slave")) { P3DApplicationType = SLAVE; } while (arguments.read("--version")) { std::string appTypeName = "invalid"; switch(P3DApplicationType) { case(VIEWER): appTypeName = "viewer"; break; case(MASTER): appTypeName = "master"; break; case(SLAVE): appTypeName = "slave"; break; } osg::notify(osg::NOTICE)<<std::endl; osg::notify(osg::NOTICE)<<"Present3D "<<appTypeName<<" version : "<<s_version<<std::endl; osg::notify(osg::NOTICE)<<std::endl; return 0; } // any option left unread are converted into errors to write out later. //arguments.reportRemainingOptionsAsUnrecognized(); // report any errors if they have ocured when parsing the program aguments. if (arguments.errors()) { arguments.writeErrorMessages(osg::notify(osg::INFO)); return 1; } // read files name from arguments. p3d::FileNameList xmlFiles, normalFiles; if (!p3d::getFileNames(arguments, xmlFiles, normalFiles)) { osg::notify(osg::NOTICE)<<std::endl; osg::notify(osg::NOTICE)<<"No file specified, please specify and file to load."<<std::endl; osg::notify(osg::NOTICE)<<std::endl; return 1; } bool viewerInitialized = false; if (!xmlFiles.empty()) { osg::ref_ptr<osg::Node> holdingModel = p3d::readHoldingSlide(xmlFiles.front()); if (holdingModel.valid()) { viewer.setSceneData(holdingModel.get()); seh->selectSlide(0); if (!viewerInitialized) { // pass the global stateset to the point event handler so that it can // alter the point size of all points in the scene. peh->setStateSet(viewer.getCamera()->getOrCreateStateSet()); // create the windows and run the threads. viewer.realize(); if (doSetViewer) setViewer(viewer, width, height, distance); viewerInitialized = true; } seh->home(); // render a frame viewer.frame(); } } osg::Timer timer; osg::Timer_t start_tick = timer.tick(); osg::ref_ptr<osgDB::ReaderWriter::Options> cacheAllOption = new osgDB::ReaderWriter::Options; cacheAllOption->setObjectCacheHint(osgDB::ReaderWriter::Options::CACHE_ALL); osgDB::Registry::instance()->setOptions(cacheAllOption.get()); // read the scene from the list of file specified commandline args. osg::ref_ptr<osg::Node> loadedModel = p3d::readShowFiles(arguments,cacheAllOption.get()); // osgDB::readNodeFiles(arguments, cacheAllOption.get()); osgDB::Registry::instance()->setOptions( 0 ); // if no model has been successfully loaded report failure. if (!loadedModel) { osg::notify(osg::INFO) << arguments.getApplicationName() <<": No data loaded" << std::endl; return 1; } osg::Timer_t end_tick = timer.tick(); osg::notify(osg::INFO) << "Time to load = "<<timer.delta_s(start_tick,end_tick)<<std::endl; if (loadedModel->getNumDescriptions()>0) { for(unsigned int i=0; i<loadedModel->getNumDescriptions(); ++i) { const std::string& desc = loadedModel->getDescription(i); if (desc=="loop") { osg::notify(osg::NOTICE)<<"Enabling looping"<<std::endl; seh->setLoopPresentation(true); } else if (desc=="auto") { osg::notify(osg::NOTICE)<<"Enabling auto run"<<std::endl; seh->setAutoSteppingActive(true); } } } processLoadedModel(loadedModel, optimizer_options, cursorFileName); // set the scene to render viewer.setSceneData(loadedModel.get()); if (!viewerInitialized) { // pass the global stateset to the point event handler so that it can // alter the point size of all points in the scene. peh->setStateSet(viewer.getCamera()->getOrCreateStateSet()); // create the windows and run the threads. viewer.realize(); if (doSetViewer) setViewer(viewer, width, height, distance); viewerInitialized = true; } // pass the model to the slide event handler so it knows which to manipulate. seh->set(loadedModel.get()); seh->selectSlide(0); seh->home(); if (!outputFileName.empty()) { osgDB::writeNodeFile(*loadedModel,outputFileName); return 0; } if (!cursorFileName.empty()) { // have to add a frame in here to avoid problems with X11 threading issue on switching off the cursor // not yet sure why it makes a difference, but it at least fixes the crash that would otherwise occur // under X11. viewer.frame(); // switch off the cursor osgViewer::Viewer::Windows windows; viewer.getWindows(windows); for(osgViewer::Viewer::Windows::iterator itr = windows.begin(); itr != windows.end(); ++itr) { (*itr)->useCursor(false); } } osg::Timer_t startOfFrameTick = osg::Timer::instance()->tick(); double targetFrameTime = 1.0/targetFrameRate; if (exportName.empty()) { // objects for managing the broadcasting and recieving of camera packets. CameraPacket cp; Broadcaster bc; Receiver rc; bc.setPort(static_cast<short int>(socketNumber)); rc.setPort(static_cast<short int>(socketNumber)); bool masterKilled = false; DataConverter scratchPad(1024); while( !viewer.done() && !masterKilled) { // wait for all cull and draw threads to complete. viewer.advance(); osg::Timer_t currentTick = osg::Timer::instance()->tick(); double deltaTime = osg::Timer::instance()->delta_s(startOfFrameTick, currentTick); if (deltaTime<targetFrameTime) { OpenThreads::Thread::microSleep(static_cast<unsigned int>((targetFrameTime-deltaTime)*1000000.0)); } startOfFrameTick = osg::Timer::instance()->tick(); #if 0 if (kmcb) { double time = kmcb->getTime(); viewer.getFrameStamp()->setReferenceTime(time); } #endif #ifdef USE_SDL sdlIntegration.update(viewer); #endif if (P3DApplicationType==MASTER) { // take camera zero as the guide. osg::Matrix modelview(viewer.getCamera()->getViewMatrix()); cp.setPacket(modelview,viewer.getFrameStamp()); // cp.readEventQueue(viewer); scratchPad.reset(); scratchPad.write(cp); scratchPad.reset(); scratchPad.read(cp); bc.setBuffer(scratchPad.startPtr(), scratchPad.numBytes()); std::cout << "bc.sync()"<<scratchPad.numBytes()<<std::endl; bc.sync(); } else if (P3DApplicationType==SLAVE) { rc.setBuffer(scratchPad.startPtr(), scratchPad.numBytes()); rc.sync(); scratchPad.reset(); scratchPad.read(cp); // cp.writeEventQueue(viewer); if (cp.getMasterKilled()) { std::cout << "Received master killed."<<std::endl; // break out of while (!done) loop since we've now want to shut down. masterKilled = true; } } // update the scene by traversing it with the the update visitor which will // call all node update callbacks and animations. viewer.eventTraversal(); if (seh->getRequestReload()) { OSG_INFO<<"Reload requested"<<std::endl; seh->setRequestReload(false); int previous_ActiveSlide = seh->getActiveSlide(); int previous_ActiveLayer = seh->getActiveLayer(); // reset time so any event key generate loadedModel = p3d::readShowFiles(arguments,cacheAllOption.get()); processLoadedModel(loadedModel, optimizer_options, cursorFileName); if (!loadedModel) { return 0; } viewer.setSceneData(loadedModel.get()); seh->set(loadedModel.get()); seh->selectSlide(previous_ActiveSlide, previous_ActiveLayer); continue; } // update the scene by traversing it with the the update visitor which will // call all node update callbacks and animations. viewer.updateTraversal(); if (P3DApplicationType==SLAVE) { osg::Matrix modelview; cp.getModelView(modelview,camera_offset); viewer.getCamera()->setViewMatrix(modelview); } // fire off the cull and draw traversals of the scene. if(!masterKilled) viewer.renderingTraversals(); } } else { ExportHTML::write(seh.get(), viewer, exportName); } return 0; }
int main( int argc, char **argv ) { // use an ArgumentParser object to manage the program arguments. osg::ArgumentParser arguments(&argc,argv); // set up the usage document, in case we need to print out how to use this program. arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the example which demonstrates how to approach implementation of clustering."); arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ..."); arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information"); arguments.getApplicationUsage()->addCommandLineOption("-m","Set viewer to MASTER mode, sending view via packets."); arguments.getApplicationUsage()->addCommandLineOption("-s","Set viewer to SLAVE mode, receiving view via packets."); arguments.getApplicationUsage()->addCommandLineOption("-n <int>","Socket number to transmit packets"); arguments.getApplicationUsage()->addCommandLineOption("-f <float>","Field of view of camera"); arguments.getApplicationUsage()->addCommandLineOption("-o <float>","Offset angle of camera"); // construct the viewer. osgViewer::Viewer viewer; // read up the osgcluster specific arguments. ViewerMode viewerMode = STAND_ALONE; while (arguments.read("-m")) viewerMode = MASTER; while (arguments.read("-s")) viewerMode = SLAVE; int socketNumber=8100; while (arguments.read("-n",socketNumber)) ; float camera_fov=-1.0f; while (arguments.read("-f",camera_fov)) { } float camera_offset=45.0f; while (arguments.read("-o",camera_offset)) ; // if user request help write it out to cout. if (arguments.read("-h") || arguments.read("--help")) { arguments.getApplicationUsage()->write(std::cout); return 1; } // any option left unread are converted into errors to write out later. arguments.reportRemainingOptionsAsUnrecognized(); // report any errors if they have occured when parsing the program aguments. if (arguments.errors()) { arguments.writeErrorMessages(std::cout); return 1; } if (arguments.argc()<=1) { arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION); return 1; } // load model. osg::ref_ptr<osg::Node> rootnode = osgDB::readNodeFiles(arguments); // set the scene to render viewer.setSceneData(rootnode.get()); if (camera_fov>0.0f) { double fovy, aspectRatio, zNear, zFar; viewer.getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio,zNear, zFar); double original_fov = atan(tan(osg::DegreesToRadians(fovy)*0.5)*aspectRatio)*2.0; std::cout << "setting lens perspective : original "<<original_fov<<" "<<fovy<<std::endl; fovy = atan(tan(osg::DegreesToRadians(camera_fov)*0.5)/aspectRatio)*2.0; viewer.getCamera()->setProjectionMatrixAsPerspective(fovy, aspectRatio,zNear, zFar); viewer.getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio,zNear, zFar); original_fov = atan(tan(osg::DegreesToRadians(fovy)*0.5)*aspectRatio)*2.0; std::cout << "setting lens perspective : new "<<original_fov<<" "<<fovy<<std::endl; } viewer.setCameraManipulator(new osgGA::TrackballManipulator()); // add the stats handler viewer.addEventHandler(new osgViewer::StatsHandler); // add the state manipulator viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) ); // create the windows and run the threads. viewer.realize(); CameraPacket *cp = new CameraPacket; // objects for managing the broadcasting and recieving of camera packets. Broadcaster bc; Receiver rc; bc.setPort(static_cast<short int>(socketNumber)); rc.setPort(static_cast<short int>(socketNumber)); bool masterKilled = false; DataConverter scratchPad(1024); while( !viewer.done() && !masterKilled ) { osg::Timer_t startTick = osg::Timer::instance()->tick(); viewer.advance(); // special handling for working as a cluster. switch (viewerMode) { case(MASTER): { // take camera zero as the guide. osg::Matrix modelview(viewer.getCamera()->getViewMatrix()); cp->setPacket(modelview,viewer.getFrameStamp()); cp->readEventQueue(viewer); scratchPad.reset(); scratchPad.write(*cp); scratchPad.reset(); scratchPad.read(*cp); bc.setBuffer(scratchPad._startPtr, scratchPad._numBytes); std::cout << "bc.sync()"<<scratchPad._numBytes<<std::endl; bc.sync(); } break; case(SLAVE): { rc.setBuffer(scratchPad._startPtr, scratchPad._numBytes); rc.sync(); scratchPad.reset(); scratchPad.read(*cp); cp->writeEventQueue(viewer); if (cp->getMasterKilled()) { std::cout << "Received master killed."<<std::endl; // break out of while (!done) loop since we've now want to shut down. masterKilled = true; } } break; default: // no need to anything here, just a normal interactive viewer. break; } osg::Timer_t endTick = osg::Timer::instance()->tick(); osg::notify(osg::INFO)<<"Time to do cluster sync "<<osg::Timer::instance()->delta_m(startTick,endTick)<<std::endl; // update the scene by traversing it with the update visitor which will // call all node update callbacks and animations. viewer.eventTraversal(); viewer.updateTraversal(); if (viewerMode==SLAVE) { osg::Matrix modelview; cp->getModelView(modelview,camera_offset); viewer.getCamera()->setViewMatrix(modelview); } // fire off the cull and draw traversals of the scene. if(!masterKilled) viewer.renderingTraversals(); } // if we are master clean up by telling all slaves that we're going down. if (viewerMode==MASTER) { // need to broadcast my death. cp->setPacket(osg::Matrix::identity(),viewer.getFrameStamp()); cp->setMasterKilled(true); scratchPad.reset(); scratchPad.write(*cp); bc.setBuffer(scratchPad._startPtr, scratchPad._numBytes); bc.sync(); std::cout << "Broadcasting death."<<std::endl; } return 0; }
int main(int argc,char **argv) { //Set default values bool forking = false; int port = 8080; int rtmpPort = 1935; const char *logfile = "mcu.log"; const char *pidfile = "mcu.pid"; //Get all for(int i=1;i<argc;i++) { //Check options if (strcmp(argv[i],"-h")==0 || strcmp(argv[i],"--help")==0) { //Show usage printf("Usage: mcu [-h] [--help] [--mcu-log logfile] [--mcu-pid pidfile] [--http-port port] [--rtmp-port port]\r\n\r\n" "Options:\r\n" " -h,--help Print help\r\n" " -f Run as daemon in safe mode\r\n" " --mcu-log Set mcu log file path (default: mcu.log)\r\n" " --mcu-pid Set mcu pid file path (default: mcu.pid)\r\n" " --http-port Set HTTP xmlrpc api port\r\n" " --rtmp-port Set RTMP xmlrpc api port\r\n"); //Exit return 0; } else if (strcmp(argv[i],"-f")==0) //Fork forking = true; else if (strcmp(argv[i],"--http-port")==0 && (i+1<argc)) //Get port port = atoi(argv[++i]); else if (strcmp(argv[i],"--rtmp-port")==0 && (i+1<argc)) //Get rtmp port rtmpPort = atoi(argv[++i]); else if (strcmp(argv[i],"--mcu-log")==0 && (i+1<argc)) //Get rtmp port logfile = argv[++i]; else if (strcmp(argv[i],"--mcu-pid")==0 && (i+1<argc)) //Get rtmp port pidfile = argv[++i]; } //Loop while(forking) { //Create the chld pid_t pid = fork(); // fork error if (pid<0) exit(1); // parent exits if (pid>0) exit(0); //Log printf("MCU started\r\n"); //Create the safe child pid = fork(); //Check pid if (pid==0) { //It is the child obtain a new process group setsid(); //for each descriptor for (int i=getdtablesize();i>=0;--i) //Close it close(i); //Redirect stdout and stderr int fd = open(logfile, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); dup(fd); dup2(1,2); close(fd); //And continule break; } else if (pid<0) //Error return 0; //Pid string char spid[16]; //Print it sprintf(spid,"%d",pid); //Write pid to file int pfd = open(pidfile, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); //Write it write(pfd,spid,strlen(spid)); //Close it close(pfd); int status; do { //Wait for child if (waitpid(pid, &status, WUNTRACED | WCONTINUED)<0) return -1; //If it has exited or stopped if (WIFEXITED(status) || WIFSTOPPED(status)) //Exit return 0; //If we have been killed if (WIFSIGNALED(status) && WTERMSIG(status)==9) //Exit return 0; } while (!WIFEXITED(status) && !WIFSIGNALED(status)); } //Dump core on fault rlimit l = {RLIM_INFINITY,RLIM_INFINITY}; //Set new limit setrlimit(RLIMIT_CORE, &l); //Register mutext for ffmpeg av_lockmgr_register(lock_ffmpeg); //Set log level av_log_set_callback(log_ffmpeg); //Ignore SIGPIPE signal( SIGPIPE, SIG_IGN ); //Create servers XmlRpcServer server(port); RTMPServer rtmpServer; // Live555MediaServer* rtspServer = Live555MediaServer::Instance(); //Create services MCU mcu; Broadcaster broadcaster; MediaGateway mediaGateway; JSR309Manager jsr309Manager; //Create xml cmd handlers for the mcu and broadcaster XmlHandler xmlrpcmcu(mcuCmdList,(void*)&mcu); XmlHandler xmlrpcbroadcaster(broadcasterCmdList,(void*)&broadcaster); XmlHandler xmlrpcmediagateway(mediagatewayCmdList,(void*)&mediaGateway); XmlHandler xmlrpcjsr309(jsr309CmdList,(void*)&jsr309Manager); //Create http streaming for service events XmlStreamingHandler xmleventjsr309; XmlStreamingHandler xmleventmcu; //And default status hanlder StatusHandler status; //Init de mcu mcu.Init(&xmleventmcu); //Init the broadcaster broadcaster.Init(); //Init the media gateway mediaGateway.Init(); //INit the jsr309 jsr309Manager.Init(&xmleventjsr309); //Add the rtmp application from the mcu to the rtmp server rtmpServer.AddApplication(L"mcu/",&mcu); //Add the rtmp applications from the broadcaster to the rmtp server rtmpServer.AddApplication(L"broadcaster/publish",&broadcaster); rtmpServer.AddApplication(L"broadcaster",&broadcaster); rtmpServer.AddApplication(L"streamer/mp4",&broadcaster); rtmpServer.AddApplication(L"streamer/flv",&broadcaster); //Add the rtmp applications from the media gateway rtmpServer.AddApplication(L"bridge/input",&mediaGateway); rtmpServer.AddApplication(L"bridge/output",&mediaGateway); //Append mcu cmd handler to the http server server.AddHandler(string("/mcu"),&xmlrpcmcu); server.AddHandler(string("/broadcaster"),&xmlrpcbroadcaster); server.AddHandler(string("/mediagateway"),&xmlrpcmediagateway); server.AddHandler(string("/jsr309"),&xmlrpcjsr309); server.AddHandler(string("/events/jsr309"),&xmleventjsr309); server.AddHandler(string("/events/mcu"),&xmleventmcu); #ifdef FLASHSTREAMER Flash flash; flash.Init(); XmlHandler xmlrpcFlash(flashCmdList,(void*)&flash); //Append flash cmldhandler server.AddHandler(string("/flash"),&xmlrpcFlash); #endif //Add the html status handler server.AddHandler(string("/status"),&status); //Init the rtmp server rtmpServer.Init(rtmpPort); // rtsp addon by liuhong // Init and start rtsp server //rtspServer->Init(); //Run it server.Start(); //End the rtmp server rtmpServer.End(); //End the mcu mcu.End(); //End the broadcaster broadcaster.End(); //End the media gateway mediaGateway.End(); //End the jsr309 jsr309Manager.End(); #ifdef FLASHSTREAMER //End flash player flash.End(); #endif }
void *StartBroadcasterThread(void *data) { Broadcaster *broadcaster = static_cast<Broadcaster *>(data); broadcaster->Thread(); return nullptr; }
int main(int argc, char* argv[]) { thread simulate, broadcast, receive, render; Queue<State> simulateBroadcast, receiveRender; unsigned simulateBroadcastWasFull = 0; unsigned simulateBroadcastWasEmpty = 0; unsigned receiveRenderWasFull = 0; unsigned receiveRenderWasEmpty = 0; bool waitingToStart = true, done = false; simulate = thread([&]() { Timestamp<> t; // Checksum c; State state; state.zero(); while (waitingToStart) usleep(1000); while (!done) { sprintf(state.data, "%lf | %u", t.stamp(), state.n); // c.checksum((unsigned char*)&state, sizeof(State)); // c.print(); // printf("\n"); if (simulateBroadcast.push(state)) { state.n++; } else simulateBroadcastWasFull++; usleep(16666); } }); broadcast = thread([&]() { // Stopwatch<> stopwatch; Broadcaster broadcaster; broadcaster.init(PACKET_SIZE, "192.168.1.255", 8888); // broadcaster.init(PACKET_SIZE, "127.0.0.1", 8888); Packet<PACKET_SIZE> p; State state; int frame = 0; while (waitingToStart) usleep(1000); while (!done) { if (simulateBroadcast.pop(state)) { // XXX while() for greed // stopwatch.tic(); PacketMaker<State, Packet<PACKET_SIZE> > packetMaker(state, frame); while (packetMaker.fill(p)) broadcaster.send((unsigned char*)&p); // printf("frame %u took %f seconds to broadcast\n", frame, // stopwatch.toc()); frame++; } else { simulateBroadcastWasEmpty++; usleep(1000); } } }); receive = thread([&]() { // Stopwatch<> stopwatch; Receiver receiver; receiver.init(8888); Packet<PACKET_SIZE> p; State state; while (waitingToStart) usleep(1000); while (!done) { /* if (p.header.frameNumber > 0) printf("frame %u took %f seconds to receive\n", p.header.frameNumber, stopwatch.toc()); */ if (!receiver.receive((unsigned char*)&p, PACKET_SIZE, 0.2f)) { usleep(1000); continue; } // wait until we're at the begining of a frame if (p.header.partNumber != 0) continue; // stopwatch.tic(); PacketTaker<State, Packet<PACKET_SIZE> > packetTaker( state, p.header.frameNumber); packetTaker.take(p); while (!packetTaker.isComplete()) { if (receiver.receive((unsigned char*)&p, PACKET_SIZE, 0.2f)) { if (!packetTaker.take(p)) { // got a part from an unexpected frame before we finished this frame printf("lost frame\n"); goto ABORT_FRAME; } } else { usleep(1000); } } // we're all done, try to push if (!receiveRender.push(state)) receiveRenderWasFull++; ABORT_FRAME: ; } }); render = thread([&]() { Timestamp<> t; // Checksum c; State state; while (waitingToStart) usleep(1000); while (!done) { while (receiveRender.pop(state)) ; // if (receiveRender.pop(state)) { double delta = t.stamp() - atof(state.data); printf("%s | R | %lf\n", state.data, delta); // printf("%s | R | %lf\n", state.data, t.stamp()); // c.checksum((unsigned char*)&state, sizeof(State)); // c.print(); // printf("\n"); //} else // receiveRenderWasEmpty++; usleep(16665); } }); waitingToStart = false; getchar(); done = true; simulate.join(); broadcast.join(); receive.join(); render.join(); cout << "simulateBroadcastWasFull:" << simulateBroadcastWasFull << endl; cout << "simulateBroadcastWasEmpty:" << simulateBroadcastWasEmpty << endl; cout << "receiveRenderWasFull:" << receiveRenderWasFull << endl; cout << "receiveRenderWasEmpty:" << receiveRenderWasEmpty << endl; }