mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 19:55:07 +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),
|
||||
_isAlive(true),
|
||||
_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) {
|
||||
out << node._type;
|
||||
out << node._uuid;
|
||||
|
|
|
@ -24,6 +24,8 @@
|
|||
#include "NodeData.h"
|
||||
#include "SimpleMovingAverage.h"
|
||||
|
||||
#include "MovingMedian.h"
|
||||
|
||||
typedef quint8 NodeType_t;
|
||||
|
||||
namespace NodeType {
|
||||
|
@ -94,7 +96,7 @@ public:
|
|||
void setPingMs(int pingMs) { _pingMs = pingMs; }
|
||||
|
||||
int getClockSkewUsec() const { return _clockSkewUsec; }
|
||||
void setClockSkewUsec(int clockSkew) { _clockSkewUsec = clockSkew; }
|
||||
void setClockSkewUsec(int clockSkew);
|
||||
QMutex& getMutex() { return _mutex; }
|
||||
|
||||
friend QDataStream& operator<<(QDataStream& out, const Node& node);
|
||||
|
@ -120,6 +122,8 @@ private:
|
|||
int _pingMs;
|
||||
int _clockSkewUsec;
|
||||
QMutex _mutex;
|
||||
|
||||
MovingMedian _clockSkewMovingMedian;
|
||||
};
|
||||
|
||||
QDebug operator<<(QDebug debug, const Node &message);
|
||||
|
|
|
@ -77,7 +77,7 @@ qint64 NodeList::sendStatsToDomainServer(const QJsonObject& statsObject) {
|
|||
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);
|
||||
packetStream.skipRawData(numBytesForPacketHeader(packet));
|
||||
|
||||
|
@ -97,7 +97,10 @@ void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer&
|
|||
|
||||
sendingNode->setPingMs(pingTime / 1000);
|
||||
sendingNode->setClockSkewUsec(clockSkew);
|
||||
|
||||
|
||||
//printf("\t\t clock skew sample: %d median: %d\n", clockSkew, sendingNode->getClockSkewUsec());
|
||||
|
||||
|
||||
const bool wantDebug = false;
|
||||
|
||||
if (wantDebug) {
|
||||
|
@ -110,9 +113,14 @@ void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer&
|
|||
" othersExprectedReply: " << othersExprectedReply << "\n" <<
|
||||
" 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)) {
|
||||
case PacketTypeDomainList: {
|
||||
processDomainServerList(packet);
|
||||
|
@ -152,7 +160,8 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr
|
|||
activateSocketFromNodeCommunication(packet, sendingNode);
|
||||
|
||||
// set the ping time for this node for stat collection
|
||||
timePingReply(packet, sendingNode);
|
||||
return timePingReply(packet, sendingNode);
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -167,6 +176,7 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr
|
|||
LimitedNodeList::processNodeData(senderSockAddr, packet);
|
||||
break;
|
||||
}
|
||||
return 1234567890;
|
||||
}
|
||||
|
||||
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