Ejemplo n.º 1
0
void VroomView::preFrame()
{
	if(ComController::instance()->isMaster())
	{
		if(_mls)
		{
			CVRSocket * con;
			while((con = _mls->accept()))
			{
				std::cerr << "Adding socket." << std::endl;
				con->setNoDelay(true);
				_clientList.push_back(new VVClient(con));
			}
		}

		for(int i = 0; i < _clientList.size(); ++i)
		{
		    _clientList[i]->preFrame();
		}

		_localSS->preFrame();

		for(std::vector<VVClient*>::iterator it = _clientList.begin(); it != _clientList.end(); )
		{
		    if((*it)->isError())
		    {
			delete (*it);
			it = _clientList.erase(it);
		    }
		    else
		    {
			it++;
		    }
		}

	}
}
Ejemplo n.º 2
0
bool ComController::connectMaster()
{
    CVRSocket * sock;

    sock = new CVRSocket(CONNECT,_masterInterface,_port);

    if(!sock->valid())
    {
        return false;
    }

    sock->setNoDelay(true);

    if(!sock->connect(30))
    {
        std::cerr << "ComController Error: Unable to connect to master."
                << std::endl;
        return false;
    }

    if(!sock->send(&_slaveNum,sizeof(int)))
    {
        std::cerr
                << "ComController Error: Unable to send node number to master."
                << std::endl;
        return false;
    }

    _masterSocket = sock;

    struct InitMsg im;
    im.ok = false;
    readMaster(&im,sizeof(struct InitMsg));

    return im.ok;
}
Ejemplo n.º 3
0
bool ComController::setupConnections()
{
    int baseport = ConfigManager::getInt("port","MultiPC.MasterInterface",
            11000);

    bool found;
    int nodecount = 0;

    if(_numSlaves)
    {
        for(int i = 0; i < 99; i++)
        {
            std::stringstream ss;
            ss << "MultiPC.Startup:" << i;
            std::string startup = ConfigManager::getEntry(ss.str(),"",&found);
            if(found)
            {
                _startupMap[i] = startup;
                nodecount++;
                if(nodecount == _numSlaves)
                {
                    break;
                }
            }
        }
    }

    if(_startupMap.size() != _numSlaves)
    {
        std::cerr << "ComController Error: NumSlaves set to " << _numSlaves
                << ", but only " << _startupMap.size()
                << " Startup entries found." << std::endl;
        return false;
    }

    if(_numSlaves > 0)
    {
        _listenSocket = new MultiListenSocket(baseport,_numSlaves);
        if(!_listenSocket->setup())
        {
            delete _listenSocket;
            _listenSocket = NULL;
            std::cerr << "ComController Error setting up MultiListen Socket."
                    << std::endl;
            std::cerr
                    << "Warning: may be CalVR processes running on slave nodes."
                    << std::endl;
            std::string cleanup;
            cleanup = ConfigManager::getEntry("value","MultiPC.CleanupScript",
                    "NONE");
            if(cleanup == "NONE")
            {
                std::cerr << "No MultiPC.CleanupScript entry found."
                        << std::endl;
            }
            else
            {
                std::cerr << "Running Cleanup Script: " << cleanup << std::endl;
                system(cleanup.c_str());
                _listenSocket = new MultiListenSocket(baseport,_numSlaves);
                if(!_listenSocket->setup())
                {
                    delete _listenSocket;
                    _listenSocket = NULL;
                }
            }

            if(!_listenSocket)
            {
                int rcount = 0;
                while(rcount < 10)
                {
                    baseport += 2;
                    std::cerr << "Trying port: " << baseport << std::endl;

                    _listenSocket = new MultiListenSocket(baseport,_numSlaves);
                    if(!_listenSocket->setup())
                    {
                        delete _listenSocket;
                        _listenSocket = NULL;
                    }
                    else
                    {
                        break;
                    }

                    rcount++;
                }

                if(!_listenSocket)
                {
                    std::cerr
                            << "ComController Failure setting up MultiListen Socket."
                            << std::endl;
                    delete _listenSocket;
                    _listenSocket = NULL;
                    return false;
                }
            }
        }
    }

    for(std::map<int,std::string>::iterator it = _startupMap.begin();
            it != _startupMap.end(); it++)
    {
        std::stringstream ss;
        ss << "CalVR --node-number " << it->first << " --master-interface "
                << _masterInterface << " --master-port " << baseport;
        size_t location = it->second.find("CalVR");
        if(location != std::string::npos)
        {
            it->second.replace(location,5,ss.str());
            continue;
        }
        location = it->second.find("opencover");
        if(location != std::string::npos)
        {
            it->second.replace(location,9,ss.str());
            continue;
        }
        std::cerr << "No CalVR found in startup value for node " << it->first
                << std::endl;
        std::cerr << "Startup line: " << it->second << std::endl;
        return false;
    }

    for(std::map<int,std::string>::iterator it = _startupMap.begin();
            it != _startupMap.end(); it++)
    {
        std::cerr << it->second << std::endl;
        system((it->second + " &").c_str());
    }

    bool ok = true;
    int retryCount = 20;
    std::map<int,bool> connectedMap;

    while(_slaveSockets.size() < _numSlaves)
    {
        CVRSocket * sock;

        while((sock = _listenSocket->accept()))
        {
            sock->setNoDelay(true);

            int nodeNum;
            if(!sock->recv(&nodeNum,sizeof(int)))
            {
                std::cerr
                        << "ComController Error durring socket setup, recv failure."
                        << std::endl;
                ok = false;
                delete sock;
                break;
            }

            _slaveSockets[nodeNum] = sock;
            connectedMap[nodeNum] = true;

            if(sock->getSocketFD() > _maxSocketFD)
            {
                _maxSocketFD = sock->getSocketFD();
            }

            std::cerr << "Connected to Node: " << nodeNum << std::endl;
        }

#ifndef WIN32
        sleep(1);
#else
        Sleep(1000);
#endif
        retryCount--;
        if(!retryCount)
        {
            std::cerr << "ComController Error: Only got connections from "
                    << _slaveSockets.size() << " nodes, " << _numSlaves
                    << " expected." << std::endl;

            for(std::map<int,std::string>::iterator it = _startupMap.begin();
                    it != _startupMap.end(); it++)
            {
                if(!connectedMap[it->first])
                {
                    std::cerr << "Node: " << it->first << " startup: "
                            << it->second << std::endl;
                }
            }
            ok = false;
            break;
        }
    }

    delete _listenSocket;
    _listenSocket = NULL;

    struct InitMsg im;
    im.ok = ok;
    sendSlaves(&im,sizeof(struct InitMsg));

    return ok;
}
Ejemplo n.º 4
0
void TourCave::preFrame()
{
    int numCommands;
    char * commands;
    if(ComController::instance()->isMaster())
    {
	if(_mls)
	{
	    CVRSocket * con;
	    if((con = _mls->accept()))
	    {
		std::cerr << "Adding socket." << std::endl;
		con->setNoDelay(true);
		_socketList.push_back(con);
	    }
	}

	checkSockets();

	numCommands = _commandList.size();

	ComController::instance()->sendSlaves(&numCommands, sizeof(int));

	if(numCommands)
	{
	    commands = new char[numCommands];
	    for(int i = 0; i < numCommands; i++)
	    {
		commands[i] = _commandList[i];
	    }
	    _commandList.clear();
	    ComController::instance()->sendSlaves(commands,numCommands * sizeof(char));
	}
    }
    else
    {
	ComController::instance()->readMaster(&numCommands, sizeof(int));
	if(numCommands)
	{
	    commands = new char[numCommands];
	    ComController::instance()->readMaster(commands,numCommands * sizeof(char));
	}
    }

    if(numCommands)
    {
	processCommands(commands, numCommands);
	delete[] commands;
    }

    if(_mStatus == STARTED)
    {
	PluginManager::instance()->sendMessageByName(PathPlugin,PR_IS_STOPPED,"TourCave");
    }

    if(_currentMode >= 0 && _mStatus == STARTED)
    {
	PluginManager::instance()->sendMessageByName(PathPlugin,PR_GET_TIME,(char *)"TourCave");

	for(int i = 0; i < _modeAudioList[_currentMode].size(); i++)
	{
	    TourAudio * ta = _modeAudioList[_currentMode][i];
	    if(!ta->started)
	    {
		if(_currentTime >= ta->triggerTime)
		{
		    // start audio
		    
		    std::cerr << "Starting audio file " << ta->name << std::endl;

		    if(ComController::instance()->isMaster())
		    {
#ifdef HAS_AUDIO
			if(!ta->distance)
			{
			    //_am->SendUDP((ta->name + "/Volume").c_str(),"f",1.0 * ta->volume);
			}
			else
			{
			    //_am->SendUDP((ta->name + "/Volume").c_str(),"f",0.0);
			}
			_am->SendUDP((ta->name + "/Play").c_str(),"i",1);
#endif
		    }

		    ta->started = true;
		}
	    }
	    else if(ta->distance)
	    {
		osg::Vec3 dist = (ta->pos * PluginHelper::getObjectToWorldTransform()) - PluginHelper::getHeadMat(0).getTrans();
		float f = dist.length();

		if(ComController::instance()->isMaster())
		{
#ifdef HAS_AUDIO
		    float rampup = 0.25;
		    if(ta->distance <= f)
		    {
			//_am->SendUDP((ta->name + "/Volume").c_str(),"f",1.0 * ta->volume);
		    }
		    else if((f - ta->distance) < ta->distance * rampup)
		    {
			float frac = (f - ta->distance) / (ta->distance * rampup);
			frac = 1.0 - frac;
			//_am->SendUDP((ta->name + "/Volume").c_str(),"f",frac * ta->volume); 
		    }

#endif
		}
	    }
	}
    }
}