From beca9cac8d80318f604784b4f7f7141a868efc69 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 May 2013 12:40:52 -0700 Subject: [PATCH 1/8] update timestamp variables in Agent, use new packet headers for DS --- domain-server/src/main.cpp | 42 +++++++++++++--------------- libraries/shared/src/Agent.cpp | 28 ++++--------------- libraries/shared/src/Agent.h | 12 ++++---- libraries/shared/src/AgentList.cpp | 30 ++++++++++---------- libraries/shared/src/PacketHeaders.h | 3 ++ 5 files changed, 51 insertions(+), 64 deletions(-) diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 8c862fa934..3510ca02c0 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -45,8 +45,6 @@ unsigned char packetData[MAX_PACKET_SIZE]; const int LOGOFF_CHECK_INTERVAL = 5000; -#define DEBUG_TO_SELF 0 - int lastActiveCount = 0; unsigned char* addAgentToBroadcastPacket(unsigned char* currentPosition, Agent* agentToAdd) { @@ -81,13 +79,13 @@ int main(int argc, const char * argv[]) setvbuf(stdout, NULL, _IOLBF, 0); ssize_t receivedBytes = 0; - char agentType; + char agentType = '\0'; - unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE]; - *broadcastPacket = PACKET_HEADER_DOMAIN; + unsigned char broadcastPacket[MAX_PACKET_SIZE]; + broadcastPacket[0] = PACKET_HEADER_DOMAIN; - unsigned char *currentBufferPos; - unsigned char *startPointer; + unsigned char* currentBufferPos; + unsigned char* startPointer; int packetBytesWithoutLeadingChar; sockaddr_in agentPublicAddress, agentLocalAddress; @@ -101,8 +99,8 @@ int main(int argc, const char * argv[]) if (agentList->getAgentSocket().receive((sockaddr *)&agentPublicAddress, packetData, &receivedBytes)) { std::map newestSoloAgents; - agentType = packetData[0]; - unpackSocket(&packetData[1], (sockaddr *)&agentLocalAddress); + agentType = packetData[1]; + unpackSocket(&packetData[2], (sockaddr *)&agentLocalAddress); // check the agent public address // if it matches our local address we're on the same box @@ -115,21 +113,21 @@ int main(int argc, const char * argv[]) } } - if (agentList->addOrUpdateAgent((sockaddr *)&agentPublicAddress, - (sockaddr *)&agentLocalAddress, + if (agentList->addOrUpdateAgent((sockaddr*) &agentPublicAddress, + (sockaddr*) &agentLocalAddress, agentType, agentList->getLastAgentId())) { - agentList->increaseAgentId(); - + } else if (packetData[0] == PACKET_HEADER_DOMAIN_RFD) { + // if this is a previous agent, and they are re-reporting for duty + // then we need to update the first receive time } currentBufferPos = broadcastPacket + 1; startPointer = currentBufferPos; for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { - if (DEBUG_TO_SELF || - !agent->matches((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType)) { + if (!agent->matches((sockaddr*) &agentPublicAddress, (sockaddr*) &agentLocalAddress, agentType)) { if (memchr(SOLO_AGENT_TYPES, agent->getType(), sizeof(SOLO_AGENT_TYPES)) == NULL) { // this is an agent of which there can be multiple, just add them to the packet // don't send avatar agents to other avatars, that will come from avatar mixer @@ -140,26 +138,26 @@ int main(int argc, const char * argv[]) } else { // solo agent, we need to only send newest if (newestSoloAgents[agent->getType()] == NULL || - newestSoloAgents[agent->getType()]->getFirstRecvTimeUsecs() < agent->getFirstRecvTimeUsecs()) { + newestSoloAgents[agent->getType()]->getWakeMicrostamp() < agent->getWakeMicrostamp()) { // we have to set the newer solo agent to add it to the broadcast later newestSoloAgents[agent->getType()] = &(*agent); } } } else { // this is the agent, just update last receive to now - agent->setLastRecvTimeUsecs(usecTimestampNow()); + agent->setLastHeardMicrostamp(usecTimestampNow()); } } - for (std::map::iterator agentIterator = newestSoloAgents.begin(); - agentIterator != newestSoloAgents.end(); - agentIterator++) { + for (std::map::iterator soloAgent = newestSoloAgents.begin(); + soloAgent != newestSoloAgents.end(); + soloAgent++) { // this is the newest alive solo agent, add them to the packet - currentBufferPos = addAgentToBroadcastPacket(currentBufferPos, agentIterator->second); + currentBufferPos = addAgentToBroadcastPacket(currentBufferPos, soloAgent->second); } if ((packetBytesWithoutLeadingChar = (currentBufferPos - startPointer))) { - agentList->getAgentSocket().send((sockaddr *)&agentPublicAddress, + agentList->getAgentSocket().send((sockaddr*) &agentPublicAddress, broadcastPacket, packetBytesWithoutLeadingChar + 1); } diff --git a/libraries/shared/src/Agent.cpp b/libraries/shared/src/Agent.cpp index cd694ccf78..125063e9ec 100644 --- a/libraries/shared/src/Agent.cpp +++ b/libraries/shared/src/Agent.cpp @@ -52,8 +52,8 @@ Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agent type = agentType; agentId = thisAgentId; - firstRecvTimeUsecs = usecTimestampNow(); - lastRecvTimeUsecs = usecTimestampNow(); + _wakeMicrostamp = usecTimestampNow(); + _lastHeardMicrostamp = usecTimestampNow(); activeSocket = NULL; linkedData = NULL; @@ -87,8 +87,8 @@ Agent::Agent(const Agent &otherAgent) { activeSocket = NULL; } - firstRecvTimeUsecs = otherAgent.firstRecvTimeUsecs; - lastRecvTimeUsecs = otherAgent.lastRecvTimeUsecs; + _wakeMicrostamp = otherAgent._wakeMicrostamp; + _lastHeardMicrostamp = otherAgent._lastHeardMicrostamp; type = otherAgent.type; if (otherAgent.linkedData != NULL) { @@ -120,8 +120,8 @@ void Agent::swap(Agent &first, Agent &second) { swap(first.type, second.type); swap(first.linkedData, second.linkedData); swap(first.agentId, second.agentId); - swap(first.firstRecvTimeUsecs, second.firstRecvTimeUsecs); - swap(first.lastRecvTimeUsecs, second.lastRecvTimeUsecs); + swap(first._wakeMicrostamp, second._wakeMicrostamp); + swap(first._lastHeardMicrostamp, second._lastHeardMicrostamp); swap(first._bytesReceivedMovingAverage, second._bytesReceivedMovingAverage); } @@ -178,22 +178,6 @@ void Agent::setAgentId(uint16_t thisAgentId) { agentId = thisAgentId; } -double Agent::getFirstRecvTimeUsecs() { - return firstRecvTimeUsecs; -} - -void Agent::setFirstRecvTimeUsecs(double newTimeUsecs) { - firstRecvTimeUsecs = newTimeUsecs; -} - -double Agent::getLastRecvTimeUsecs() { - return lastRecvTimeUsecs; -} - -void Agent::setLastRecvTimeUsecs(double newTimeUsecs) { - lastRecvTimeUsecs = newTimeUsecs; -} - sockaddr* Agent::getPublicSocket() { return publicSocket; } diff --git a/libraries/shared/src/Agent.h b/libraries/shared/src/Agent.h index 1b8fadfdd8..b611770593 100644 --- a/libraries/shared/src/Agent.h +++ b/libraries/shared/src/Agent.h @@ -38,11 +38,11 @@ public: uint16_t getAgentId(); void setAgentId(uint16_t thisAgentId); - double getFirstRecvTimeUsecs(); - void setFirstRecvTimeUsecs(double newTimeUsecs); + double getWakeMicrostamp() const { return _wakeMicrostamp; } + void setWakeMicrostamp(double wakeMicrostamp) { _wakeMicrostamp = wakeMicrostamp; } - double getLastRecvTimeUsecs(); - void setLastRecvTimeUsecs(double newTimeUsecs); + double getLastHeardMicrostamp() const { return _lastHeardMicrostamp; } + void setLastHeardMicrostamp(double lastHeardMicrostamp) { _lastHeardMicrostamp = lastHeardMicrostamp; } sockaddr* getPublicSocket(); void setPublicSocket(sockaddr *newSocket); @@ -70,8 +70,8 @@ private: sockaddr *publicSocket, *localSocket, *activeSocket; char type; uint16_t agentId; - double firstRecvTimeUsecs; - double lastRecvTimeUsecs; + double _wakeMicrostamp; + double _lastHeardMicrostamp; SimpleMovingAverage* _bytesReceivedMovingAverage; AgentData* linkedData; bool _isAlive; diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index ce312d5eb2..cc9b7b06ed 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -114,7 +114,7 @@ void AgentList::processBulkAgentData(sockaddr *senderAddress, unsigned char *pac Agent* bulkSendAgent = agentWithAddress(senderAddress); if (bulkSendAgent) { - bulkSendAgent->setLastRecvTimeUsecs(usecTimestampNow()); + bulkSendAgent->setLastHeardMicrostamp(usecTimestampNow()); bulkSendAgent->recordBytesReceived(numTotalBytes); } @@ -161,7 +161,7 @@ int AgentList::updateAgentWithData(sockaddr *senderAddress, unsigned char *packe } int AgentList::updateAgentWithData(Agent *agent, unsigned char *packetData, int dataBytes) { - agent->setLastRecvTimeUsecs(usecTimestampNow()); + agent->setLastHeardMicrostamp(usecTimestampNow()); if (agent->getActiveSocket() != NULL) { agent->recordBytesReceived(dataBytes); @@ -273,7 +273,7 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, if (agent->getType() == AGENT_TYPE_AUDIO_MIXER || agent->getType() == AGENT_TYPE_VOXEL) { // until the Audio class also uses our agentList, we need to update // the lastRecvTimeUsecs for the audio mixer so it doesn't get killed and re-added continously - agent->setLastRecvTimeUsecs(usecTimestampNow()); + agent->setLastHeardMicrostamp(usecTimestampNow()); } // we had this agent already, do nothing for now @@ -383,7 +383,7 @@ void *removeSilentAgents(void *args) { for(AgentList::iterator agent = agentList->begin(); agent != agentList->end(); ++agent) { - if ((checkTimeUSecs - agent->getLastRecvTimeUsecs()) > AGENT_SILENCE_THRESHOLD_USECS + if ((checkTimeUSecs - agent->getLastHeardMicrostamp()) > AGENT_SILENCE_THRESHOLD_USECS && agent->getType() != AGENT_TYPE_VOXEL) { printLog("Killing agent - "); @@ -418,13 +418,6 @@ void *checkInWithDomainServer(void *args) { const int DOMAIN_SERVER_CHECK_IN_USECS = 1 * 1000000; - AgentList* parentAgentList = (AgentList*) args; - - timeval lastSend; - unsigned char output[7]; - - in_addr_t localAddress = getLocalAddress(); - // Lookup the IP address of the domain server if we need to if (atoi(DOMAIN_IP) == 0) { struct hostent* pHostInfo; @@ -439,14 +432,23 @@ void *checkInWithDomainServer(void *args) { } } else printLog("Using static domainserver IP: %s\n", DOMAIN_IP); + AgentList* parentAgentList = (AgentList*) args; + + timeval lastSend; + in_addr_t localAddress = getLocalAddress(); + unsigned char packet[8]; + + packet[0] = PACKET_HEADER_DOMAIN_RFD; + packet[1] = parentAgentList->getOwnerType(); while (!domainServerCheckinStopFlag) { gettimeofday(&lastSend, NULL); - output[0] = parentAgentList->getOwnerType(); - packSocket(output + 1, localAddress, htons(parentAgentList->getSocketListenPort())); + packSocket(packet + 2, localAddress, htons(parentAgentList->getSocketListenPort())); - parentAgentList->getAgentSocket().send(DOMAIN_IP, DOMAINSERVER_PORT, output, 7); + parentAgentList->getAgentSocket().send(DOMAIN_IP, DOMAINSERVER_PORT, packet, sizeof(packet)); + + packet[0] = PACKET_HEADER_DOMAIN_LIST_REQUEST; double usecToSleep = DOMAIN_SERVER_CHECK_IN_USECS - (usecTimestampNow() - usecTimestamp(&lastSend)); diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index ed2e5d5638..1ceb3fcc5a 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -1,3 +1,4 @@ + // // PacketHeaders.h // hifi @@ -23,5 +24,7 @@ const char PACKET_HEADER_ERASE_VOXEL = 'E'; const char PACKET_HEADER_VOXEL_DATA = 'V'; const char PACKET_HEADER_BULK_AVATAR_DATA = 'X'; const char PACKET_HEADER_TRANSMITTER_DATA = 't'; +const char PACKET_HEADER_DOMAIN_LIST_REQUEST = 'L'; +const char PACKET_HEADER_DOMAIN_RFD = 'C'; #endif From 9e5f446ba28c58216074c85111a53c7fa2700ed7 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 May 2013 12:51:43 -0700 Subject: [PATCH 2/8] update wake microstamp when receiving an RFD from an agent already in list --- domain-server/src/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 3510ca02c0..b7e43f48bb 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -121,9 +121,11 @@ int main(int argc, const char * argv[]) } else if (packetData[0] == PACKET_HEADER_DOMAIN_RFD) { // if this is a previous agent, and they are re-reporting for duty // then we need to update the first receive time + Agent *refreshedAgent = agentList->agentWithAddress((sockaddr*) &agentLocalAddress); + refreshedAgent->setWakeMicrostamp(usecTimestampNow()); } - currentBufferPos = broadcastPacket + 1; + currentBufferPos = broadcastPacket + 2; startPointer = currentBufferPos; for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { From f3a9dcf7776104a982aa2a2c2376b312f8b00681 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 May 2013 13:08:45 -0700 Subject: [PATCH 3/8] if we fail to open SerialInterface twice then don't keep trying --- interface/src/SerialInterface.cpp | 40 +++++++++++++++++++------------ interface/src/SerialInterface.h | 5 ++-- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/interface/src/SerialInterface.cpp b/interface/src/SerialInterface.cpp index 5878ab672e..2efe487304 100644 --- a/interface/src/SerialInterface.cpp +++ b/interface/src/SerialInterface.cpp @@ -34,6 +34,11 @@ const int GRAVITY_SAMPLES = 200; // Use the first samples to const bool USING_INVENSENSE_MPU9150 = 1; +SerialInterface::SerialInterface() : + active(false), + _failedOpenAttempts(0) { +} + void SerialInterface::pair() { #ifdef __APPLE__ @@ -43,25 +48,29 @@ void SerialInterface::pair() { int matchStatus; regex_t regex; - // for now this only works on OS X, where the usb serial shows up as /dev/tty.usb* - if((devDir = opendir("/dev"))) { - while((entry = readdir(devDir))) { - regcomp(®ex, "tty\\.usb", REG_EXTENDED|REG_NOSUB); - matchStatus = regexec(®ex, entry->d_name, (size_t) 0, NULL, 0); - if (matchStatus == 0) { - char *serialPortname = new char[100]; - sprintf(serialPortname, "/dev/%s", entry->d_name); - - initializePort(serialPortname, 115200); - - delete [] serialPortname; + if (_failedOpenAttempts < 2) { + // if we've already failed to open the detected interface twice then don't try again + + // for now this only works on OS X, where the usb serial shows up as /dev/tty.usb* + if((devDir = opendir("/dev"))) { + while((entry = readdir(devDir))) { + regcomp(®ex, "tty\\.usb", REG_EXTENDED|REG_NOSUB); + matchStatus = regexec(®ex, entry->d_name, (size_t) 0, NULL, 0); + if (matchStatus == 0) { + char *serialPortname = new char[100]; + sprintf(serialPortname, "/dev/%s", entry->d_name); + + initializePort(serialPortname, 115200); + + delete [] serialPortname; + } + regfree(®ex); } - regfree(®ex); + closedir(devDir); } - closedir(devDir); } -#endif +#endif } // connect to the serial port @@ -73,6 +82,7 @@ int SerialInterface::initializePort(char* portname, int baud) { if (serialFd == -1) { printLog("Failed.\n"); + _failedOpenAttempts++; return -1; // Failed to open port } struct termios options; diff --git a/interface/src/SerialInterface.h b/interface/src/SerialInterface.h index 9558a1601f..917c968c3f 100644 --- a/interface/src/SerialInterface.h +++ b/interface/src/SerialInterface.h @@ -36,7 +36,7 @@ extern const bool USING_INVENSENSE_MPU9150; class SerialInterface { public: - SerialInterface() { active = false; }; + SerialInterface(); void pair(); void readData(); @@ -56,7 +56,7 @@ public: glm::vec3 getGravity() {return gravity;}; private: - int initializePort(char * portname, int baud); + int initializePort(char* portname, int baud); void resetSerial(); int lastMeasured[NUM_CHANNELS]; float trailingAverage[NUM_CHANNELS]; @@ -68,6 +68,7 @@ private: int _lastYaw; int _lastPitch; int _lastRoll; + int _failedOpenAttempts; }; #endif From 499899c6e03b697b3ed1cdc39ec1f4477bb38420 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 May 2013 13:11:40 -0700 Subject: [PATCH 4/8] if there are no active agents in list begin() iterator should be end() --- libraries/shared/src/AgentList.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index cc9b7b06ed..51a14d8cb1 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -64,8 +64,7 @@ AgentList::AgentList(char newOwnerType, unsigned int newSocketListenPort) : agentSocket(newSocketListenPort), ownerType(newOwnerType), socketListenPort(newSocketListenPort), - lastAgentId(0) -{ + lastAgentId(0) { pthread_mutex_init(&mutex, 0); } @@ -483,7 +482,8 @@ AgentList::iterator AgentList::begin() const { } } - return AgentListIterator(this, 0); + // there's no alive agent to start from - return the end + return end(); } AgentList::iterator AgentList::end() const { From e8babd6d1eb66591a68f627add4231114109aa64 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 May 2013 13:14:28 -0700 Subject: [PATCH 5/8] type star squish in domain server --- domain-server/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index b7e43f48bb..722a0f2075 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -100,7 +100,7 @@ int main(int argc, const char * argv[]) std::map newestSoloAgents; agentType = packetData[1]; - unpackSocket(&packetData[2], (sockaddr *)&agentLocalAddress); + unpackSocket(&packetData[2], (sockaddr*) &agentLocalAddress); // check the agent public address // if it matches our local address we're on the same box From 2a240f6474c35888f51d710f49f6cc48bb4d8abc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 May 2013 13:14:58 -0700 Subject: [PATCH 6/8] type star squish in domain server --- domain-server/src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 722a0f2075..2ded57b9ae 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -100,7 +100,7 @@ int main(int argc, const char * argv[]) std::map newestSoloAgents; agentType = packetData[1]; - unpackSocket(&packetData[2], (sockaddr*) &agentLocalAddress); + unpackSocket(&packetData[2], (sockaddr*) g&agentLocalAddress); // check the agent public address // if it matches our local address we're on the same box @@ -121,7 +121,7 @@ int main(int argc, const char * argv[]) } else if (packetData[0] == PACKET_HEADER_DOMAIN_RFD) { // if this is a previous agent, and they are re-reporting for duty // then we need to update the first receive time - Agent *refreshedAgent = agentList->agentWithAddress((sockaddr*) &agentLocalAddress); + Agent* refreshedAgent = agentList->agentWithAddress((sockaddr*) &agentLocalAddress); refreshedAgent->setWakeMicrostamp(usecTimestampNow()); } From ee4c55afe7e453e4e0f422fb4442d0cebdf0e332 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 May 2013 13:18:06 -0700 Subject: [PATCH 7/8] move SerialInterface constructor to header file --- interface/src/SerialInterface.cpp | 5 ----- interface/src/SerialInterface.h | 3 ++- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/interface/src/SerialInterface.cpp b/interface/src/SerialInterface.cpp index 2efe487304..3e906552b3 100644 --- a/interface/src/SerialInterface.cpp +++ b/interface/src/SerialInterface.cpp @@ -34,11 +34,6 @@ const int GRAVITY_SAMPLES = 200; // Use the first samples to const bool USING_INVENSENSE_MPU9150 = 1; -SerialInterface::SerialInterface() : - active(false), - _failedOpenAttempts(0) { -} - void SerialInterface::pair() { #ifdef __APPLE__ diff --git a/interface/src/SerialInterface.h b/interface/src/SerialInterface.h index 917c968c3f..7677562c53 100644 --- a/interface/src/SerialInterface.h +++ b/interface/src/SerialInterface.h @@ -36,7 +36,8 @@ extern const bool USING_INVENSENSE_MPU9150; class SerialInterface { public: - SerialInterface(); + SerialInterface() : active(false), + _failedOpenAttempts(0) {} void pair(); void readData(); From 49042046de08fddd4639223e34ff7225f6a6b21e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 May 2013 13:20:13 -0700 Subject: [PATCH 8/8] remove duplicated constructor after merge --- interface/src/SerialInterface.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/interface/src/SerialInterface.cpp b/interface/src/SerialInterface.cpp index 2efe487304..3e906552b3 100644 --- a/interface/src/SerialInterface.cpp +++ b/interface/src/SerialInterface.cpp @@ -34,11 +34,6 @@ const int GRAVITY_SAMPLES = 200; // Use the first samples to const bool USING_INVENSENSE_MPU9150 = 1; -SerialInterface::SerialInterface() : - active(false), - _failedOpenAttempts(0) { -} - void SerialInterface::pair() { #ifdef __APPLE__