mirror of
https://github.com/JulianGro/overte.git
synced 2025-08-12 16:35:14 +02:00
added MovingMedian class, but not using it
added packet type/time data collection to DatagramProcessor and post-execution prints of that info.
This commit is contained in:
parent
6061330826
commit
c851edd0ef
5 changed files with 142 additions and 6 deletions
|
@ -57,7 +57,9 @@ Node::Node(const QUuid& uuid, NodeType_t type, const HifiSockAddr& publicSocket,
|
||||||
_linkedData(NULL),
|
_linkedData(NULL),
|
||||||
_isAlive(true),
|
_isAlive(true),
|
||||||
_clockSkewUsec(0),
|
_clockSkewUsec(0),
|
||||||
_mutex()
|
_mutex(),
|
||||||
|
|
||||||
|
_clockSkewMovingMedian(31)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -133,6 +135,13 @@ float Node::getAverageKilobitsPerSecond() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Node::setClockSkewUsec(int clockSkew) {
|
||||||
|
//_clockSkewMovingMedian.updateMedian((float)clockSkew);
|
||||||
|
//_clockSkewUsec = (int)_clockSkewMovingMedian.getMedian();
|
||||||
|
|
||||||
|
_clockSkewUsec = clockSkew;
|
||||||
|
}
|
||||||
|
|
||||||
QDataStream& operator<<(QDataStream& out, const Node& node) {
|
QDataStream& operator<<(QDataStream& out, const Node& node) {
|
||||||
out << node._type;
|
out << node._type;
|
||||||
out << node._uuid;
|
out << node._uuid;
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
#include "NodeData.h"
|
#include "NodeData.h"
|
||||||
#include "SimpleMovingAverage.h"
|
#include "SimpleMovingAverage.h"
|
||||||
|
|
||||||
|
#include "MovingMedian.h"
|
||||||
|
|
||||||
typedef quint8 NodeType_t;
|
typedef quint8 NodeType_t;
|
||||||
|
|
||||||
namespace NodeType {
|
namespace NodeType {
|
||||||
|
@ -94,7 +96,7 @@ public:
|
||||||
void setPingMs(int pingMs) { _pingMs = pingMs; }
|
void setPingMs(int pingMs) { _pingMs = pingMs; }
|
||||||
|
|
||||||
int getClockSkewUsec() const { return _clockSkewUsec; }
|
int getClockSkewUsec() const { return _clockSkewUsec; }
|
||||||
void setClockSkewUsec(int clockSkew) { _clockSkewUsec = clockSkew; }
|
void setClockSkewUsec(int clockSkew);
|
||||||
QMutex& getMutex() { return _mutex; }
|
QMutex& getMutex() { return _mutex; }
|
||||||
|
|
||||||
friend QDataStream& operator<<(QDataStream& out, const Node& node);
|
friend QDataStream& operator<<(QDataStream& out, const Node& node);
|
||||||
|
@ -120,6 +122,8 @@ private:
|
||||||
int _pingMs;
|
int _pingMs;
|
||||||
int _clockSkewUsec;
|
int _clockSkewUsec;
|
||||||
QMutex _mutex;
|
QMutex _mutex;
|
||||||
|
|
||||||
|
MovingMedian _clockSkewMovingMedian;
|
||||||
};
|
};
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, const Node &message);
|
QDebug operator<<(QDebug debug, const Node &message);
|
||||||
|
|
|
@ -77,7 +77,7 @@ qint64 NodeList::sendStatsToDomainServer(const QJsonObject& statsObject) {
|
||||||
return writeUnverifiedDatagram(statsPacket, _domainHandler.getSockAddr());
|
return writeUnverifiedDatagram(statsPacket, _domainHandler.getSockAddr());
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer& sendingNode) {
|
int NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer& sendingNode) {
|
||||||
QDataStream packetStream(packet);
|
QDataStream packetStream(packet);
|
||||||
packetStream.skipRawData(numBytesForPacketHeader(packet));
|
packetStream.skipRawData(numBytesForPacketHeader(packet));
|
||||||
|
|
||||||
|
@ -97,7 +97,10 @@ void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer&
|
||||||
|
|
||||||
sendingNode->setPingMs(pingTime / 1000);
|
sendingNode->setPingMs(pingTime / 1000);
|
||||||
sendingNode->setClockSkewUsec(clockSkew);
|
sendingNode->setClockSkewUsec(clockSkew);
|
||||||
|
|
||||||
|
//printf("\t\t clock skew sample: %d median: %d\n", clockSkew, sendingNode->getClockSkewUsec());
|
||||||
|
|
||||||
|
|
||||||
const bool wantDebug = false;
|
const bool wantDebug = false;
|
||||||
|
|
||||||
if (wantDebug) {
|
if (wantDebug) {
|
||||||
|
@ -110,9 +113,14 @@ void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer&
|
||||||
" othersExprectedReply: " << othersExprectedReply << "\n" <<
|
" othersExprectedReply: " << othersExprectedReply << "\n" <<
|
||||||
" clockSkew: " << clockSkew;
|
" clockSkew: " << clockSkew;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (abs(clockSkew) > 1000)
|
||||||
|
printf("clockskew = %d \n", clockSkew);
|
||||||
|
|
||||||
|
return clockSkew;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet) {
|
int NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet) {
|
||||||
switch (packetTypeForPacket(packet)) {
|
switch (packetTypeForPacket(packet)) {
|
||||||
case PacketTypeDomainList: {
|
case PacketTypeDomainList: {
|
||||||
processDomainServerList(packet);
|
processDomainServerList(packet);
|
||||||
|
@ -152,7 +160,8 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr
|
||||||
activateSocketFromNodeCommunication(packet, sendingNode);
|
activateSocketFromNodeCommunication(packet, sendingNode);
|
||||||
|
|
||||||
// set the ping time for this node for stat collection
|
// set the ping time for this node for stat collection
|
||||||
timePingReply(packet, sendingNode);
|
return timePingReply(packet, sendingNode);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -167,6 +176,7 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr
|
||||||
LimitedNodeList::processNodeData(senderSockAddr, packet);
|
LimitedNodeList::processNodeData(senderSockAddr, packet);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return 1234567890;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeList::reset() {
|
void NodeList::reset() {
|
||||||
|
|
87
libraries/shared/src/MovingMedian.cpp
Normal file
87
libraries/shared/src/MovingMedian.cpp
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
#include "MovingMedian.h"
|
||||||
|
//#include "stdio.h"// DEBUG
|
||||||
|
|
||||||
|
MovingMedian::MovingMedian(int numSamples)
|
||||||
|
: _numSamples(numSamples),
|
||||||
|
_numExistingSamples(0),
|
||||||
|
_median(0.0f)
|
||||||
|
{
|
||||||
|
_samplesSorted = new float[numSamples];
|
||||||
|
_sampleAges = new int[numSamples];
|
||||||
|
}
|
||||||
|
|
||||||
|
MovingMedian::~MovingMedian() {
|
||||||
|
delete[] _samplesSorted;
|
||||||
|
delete[] _sampleAges;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MovingMedian::updateMedian(float sample) {
|
||||||
|
|
||||||
|
//printf("\nnew sample: %2.2f ", sample);
|
||||||
|
|
||||||
|
// find index in _samplesSorted to insert new sample.
|
||||||
|
// if samples have not been filled yet, this will be the next empty spot
|
||||||
|
// otherwise, it will be the spot of the oldest sample
|
||||||
|
int newSampleIndex;
|
||||||
|
if (_numExistingSamples < _numSamples) {
|
||||||
|
newSampleIndex = _numExistingSamples;
|
||||||
|
_numExistingSamples++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (int i = 0; i < _numExistingSamples; i++) {
|
||||||
|
if (_sampleAges[i] == _numExistingSamples - 1) {
|
||||||
|
newSampleIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//printf("will be inserted at index %d\n", newSampleIndex);
|
||||||
|
|
||||||
|
// update _sampleAges to reflect new sample (age all samples by 1)
|
||||||
|
for (int i = 0; i < _numExistingSamples; i++) {
|
||||||
|
_sampleAges[i]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// insert new sample at that index
|
||||||
|
_samplesSorted[newSampleIndex] = sample;
|
||||||
|
_sampleAges[newSampleIndex] = 0;
|
||||||
|
|
||||||
|
// swap new sample with neighboring elements in _samplesSorted until it's in sorted order
|
||||||
|
// try swapping up first, then down. element will only be swapped one direction.
|
||||||
|
|
||||||
|
float neighborSample;
|
||||||
|
while (newSampleIndex < _numExistingSamples-1 && sample > (neighborSample = _samplesSorted[newSampleIndex+1])) {
|
||||||
|
//printf("\t swapping up...\n");
|
||||||
|
_samplesSorted[newSampleIndex] = neighborSample;
|
||||||
|
_samplesSorted[newSampleIndex+1] = sample;
|
||||||
|
|
||||||
|
_sampleAges[newSampleIndex] = _sampleAges[newSampleIndex+1];
|
||||||
|
_sampleAges[newSampleIndex+1] = 0;
|
||||||
|
|
||||||
|
newSampleIndex++;
|
||||||
|
}
|
||||||
|
while (newSampleIndex > 0 && sample < (neighborSample = _samplesSorted[newSampleIndex - 1])) {
|
||||||
|
//printf("\t swapping down...\n");
|
||||||
|
_samplesSorted[newSampleIndex] = neighborSample;
|
||||||
|
_samplesSorted[newSampleIndex - 1] = sample;
|
||||||
|
|
||||||
|
_sampleAges[newSampleIndex] = _sampleAges[newSampleIndex - 1];
|
||||||
|
_sampleAges[newSampleIndex - 1] = 0;
|
||||||
|
|
||||||
|
newSampleIndex--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// find new median
|
||||||
|
_median = _samplesSorted[_numExistingSamples/2];
|
||||||
|
/*
|
||||||
|
printf(" new median: %f\n", _median);
|
||||||
|
|
||||||
|
// debug:
|
||||||
|
for (int i = 0; i < _numExistingSamples; i++) {
|
||||||
|
printf("%2.2f (%d), ", _samplesSorted[i], _sampleAges[i]);
|
||||||
|
}
|
||||||
|
printf("\n\n");
|
||||||
|
*/
|
||||||
|
}
|
26
libraries/shared/src/MovingMedian.h
Normal file
26
libraries/shared/src/MovingMedian.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
#ifndef hifi_MovingMedian_h
|
||||||
|
#define hifi_MovingMedian_h
|
||||||
|
|
||||||
|
|
||||||
|
class MovingMedian {
|
||||||
|
|
||||||
|
public:
|
||||||
|
MovingMedian(int numSamples = 11);
|
||||||
|
~MovingMedian();
|
||||||
|
|
||||||
|
void updateMedian(float sample);
|
||||||
|
float getMedian() const { return _median; }
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
float* _samplesSorted;
|
||||||
|
int _numSamples;
|
||||||
|
|
||||||
|
int* _sampleAges; // _sampleAges[i] is the "age" of the sample _sampleSorted[i] (higher means older)
|
||||||
|
int _numExistingSamples;
|
||||||
|
|
||||||
|
float _median;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue