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++; } } } }
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; }
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; }
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 } } } } }