From a9c5c0707f7a925a38ddfbdd3d27752c237fff36 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 8 Nov 2013 10:32:46 -0800 Subject: [PATCH] added sentAt timestamps to voxel edit packets so we can measure transit time --- libraries/shared/src/PacketHeaders.cpp | 5 +++ libraries/shared/src/SharedUtil.cpp | 11 +++++-- .../src/VoxelServerPacketProcessor.cpp | 31 +++++++++++++++---- .../voxels/src/VoxelEditPacketSender.cpp | 11 ++++++- libraries/voxels/src/VoxelTree.cpp | 10 ++++-- 5 files changed, 56 insertions(+), 12 deletions(-) diff --git a/libraries/shared/src/PacketHeaders.cpp b/libraries/shared/src/PacketHeaders.cpp index dc953b6b80..b03daeec05 100644 --- a/libraries/shared/src/PacketHeaders.cpp +++ b/libraries/shared/src/PacketHeaders.cpp @@ -38,6 +38,11 @@ PACKET_VERSION versionForPacketType(PACKET_TYPE type) { case PACKET_TYPE_VOXEL_QUERY: return 1; + + case PACKET_TYPE_SET_VOXEL: + case PACKET_TYPE_SET_VOXEL_DESTRUCTIVE: + case PACKET_TYPE_ERASE_VOXEL: + return 1; default: return 0; diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index 0b8af8b48b..99b24979cc 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -250,10 +250,15 @@ bool createVoxelEditMessage(unsigned char command, short int sequence, int numBytesPacketHeader = populateTypeAndVersion(messageBuffer, command); unsigned short int* sequenceAt = (unsigned short int*) &messageBuffer[numBytesPacketHeader]; - *sequenceAt = sequence; - unsigned char* copyAt = &messageBuffer[numBytesPacketHeader + sizeof(sequence)]; - int actualMessageSize = numBytesPacketHeader + sizeof(sequence); + + // pack in timestamp + uint64_t now = usecTimestampNow(); + uint64_t* timeAt = (uint64_t*)&messageBuffer[numBytesPacketHeader + sizeof(sequence)]; + *timeAt = now; + + unsigned char* copyAt = &messageBuffer[numBytesPacketHeader + sizeof(sequence) + sizeof(now)]; + int actualMessageSize = numBytesPacketHeader + sizeof(sequence) + sizeof(now); for (int i = 0; i < voxelCount && success; i++) { // get the coded voxel diff --git a/libraries/voxel-server-library/src/VoxelServerPacketProcessor.cpp b/libraries/voxel-server-library/src/VoxelServerPacketProcessor.cpp index 5cbc942d16..a86dead1d0 100644 --- a/libraries/voxel-server-library/src/VoxelServerPacketProcessor.cpp +++ b/libraries/voxel-server-library/src/VoxelServerPacketProcessor.cpp @@ -40,19 +40,22 @@ void VoxelServerPacketProcessor::processPacket(sockaddr& senderAddress, unsigned _receivedPacketCount++; - unsigned short int itemNumber = (*((unsigned short int*)(packetData + numBytesPacketHeader))); + unsigned short int sequence = (*((unsigned short int*)(packetData + numBytesPacketHeader))); + uint64_t sentAt = (*((uint64_t*)(packetData + numBytesPacketHeader + sizeof(sequence)))); + uint64_t arrivedAt = usecTimestampNow(); + uint64_t transitTime = arrivedAt - sentAt; if (_myServer->wantShowAnimationDebug()) { - printf("got %s - command from client receivedBytes=%ld itemNumber=%d\n", + printf("got %s - command from client receivedBytes=%ld sequence=%d transitTime=%llu usecs\n", destructive ? "PACKET_TYPE_SET_VOXEL_DESTRUCTIVE" : "PACKET_TYPE_SET_VOXEL", - packetLength, itemNumber); + packetLength, sequence, transitTime); } if (_myServer->wantsDebugVoxelReceiving()) { - printf("got %s - %d command from client receivedBytes=%ld itemNumber=%d\n", + printf("got %s - %d command from client receivedBytes=%ld sequence=%d transitTime=%llu usecs\n", destructive ? "PACKET_TYPE_SET_VOXEL_DESTRUCTIVE" : "PACKET_TYPE_SET_VOXEL", - _receivedPacketCount, packetLength, itemNumber); + _receivedPacketCount, packetLength, sequence, transitTime); } - int atByte = numBytesPacketHeader + sizeof(itemNumber); + int atByte = numBytesPacketHeader + sizeof(sequence) + sizeof(sentAt); unsigned char* voxelData = (unsigned char*)&packetData[atByte]; while (atByte < packetLength) { int maxSize = packetLength - atByte; @@ -113,6 +116,22 @@ void VoxelServerPacketProcessor::processPacket(sockaddr& senderAddress, unsigned } else if (packetData[0] == PACKET_TYPE_ERASE_VOXEL) { + _receivedPacketCount++; + + unsigned short int sequence = (*((unsigned short int*)(packetData + numBytesPacketHeader))); + uint64_t sentAt = (*((uint64_t*)(packetData + numBytesPacketHeader + sizeof(sequence)))); + uint64_t arrivedAt = usecTimestampNow(); + uint64_t transitTime = arrivedAt - sentAt; + if (_myServer->wantShowAnimationDebug()) { + printf("got PACKET_TYPE_ERASE_VOXEL - command from client receivedBytes=%ld sequence=%d transitTime=%llu usecs\n", + packetLength, sequence, transitTime); + } + + if (_myServer->wantsDebugVoxelReceiving()) { + printf("got PACKET_TYPE_ERASE_VOXEL - %d command from client receivedBytes=%ld sequence=%d transitTime=%llu usecs\n", + _receivedPacketCount, packetLength, sequence, transitTime); + } + // Send these bits off to the VoxelTree class to process them _myServer->getServerTree().lockForWrite(); _myServer->getServerTree().processRemoveVoxelBitstream((unsigned char*)packetData, packetLength); diff --git a/libraries/voxels/src/VoxelEditPacketSender.cpp b/libraries/voxels/src/VoxelEditPacketSender.cpp index d1ba513c4d..125d80e61a 100644 --- a/libraries/voxels/src/VoxelEditPacketSender.cpp +++ b/libraries/voxels/src/VoxelEditPacketSender.cpp @@ -274,10 +274,19 @@ void VoxelEditPacketSender::releaseQueuedPacket(EditPacketBuffer& packetBuffer) void VoxelEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PACKET_TYPE type) { packetBuffer._currentSize = populateTypeAndVersion(&packetBuffer._currentBuffer[0], type); + + // pack in sequence number unsigned short int* sequenceAt = (unsigned short int*)&packetBuffer._currentBuffer[packetBuffer._currentSize]; *sequenceAt = _sequenceNumber; + packetBuffer._currentSize += sizeof(unsigned short int); // nudge past sequence _sequenceNumber++; - packetBuffer._currentSize += sizeof(unsigned short int); // set to command + sequence + + // pack in timestamp + uint64_t now = usecTimestampNow(); + uint64_t* timeAt = (uint64_t*)&packetBuffer._currentBuffer[packetBuffer._currentSize]; + *timeAt = now; + packetBuffer._currentSize += sizeof(uint64_t); // nudge past timestamp + packetBuffer._currentType = type; } diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index e0e1ac5367..2681742437 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -576,9 +576,15 @@ void VoxelTree::readCodeColorBufferToTreeRecursion(VoxelNode* node, void* extraD } } -void VoxelTree::processRemoveVoxelBitstream(unsigned char * bitstream, int bufferSizeBytes) { +void VoxelTree::processRemoveVoxelBitstream(unsigned char* bitstream, int bufferSizeBytes) { //unsigned short int itemNumber = (*((unsigned short int*)&bitstream[sizeof(PACKET_HEADER)])); - int atByte = sizeof(short int) + numBytesForPacketHeader(bitstream); + + int numBytesPacketHeader = numBytesForPacketHeader(bitstream); + unsigned short int sequence = (*((unsigned short int*)(bitstream + numBytesPacketHeader))); + uint64_t sentAt = (*((uint64_t*)(bitstream + numBytesPacketHeader + sizeof(sequence)))); + + int atByte = numBytesPacketHeader + sizeof(sequence) + sizeof(sentAt); + unsigned char* voxelCode = (unsigned char*)&bitstream[atByte]; while (atByte < bufferSizeBytes) { int maxSize = bufferSizeBytes - atByte;