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:
wangyix 2014-06-03 16:18:40 -07:00
parent 6061330826
commit c851edd0ef
5 changed files with 142 additions and 6 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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() {

View 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");
*/
}

View 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