Files
SLikeNet/Samples/StatisticsHistoryTest/StatisticsHistoryTest.cpp
2025-11-24 14:19:51 +05:30

133 lines
3.8 KiB
C++

/*
* Original work: Copyright (c) 2014, Oculus VR, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* RakNet License.txt file in the licenses directory of this source tree. An additional grant
* of patent rights can be found in the RakNet Patents.txt file in the same directory.
*
*
* Modified work: Copyright (c) 2016-2017, SLikeSoft UG (haftungsbeschränkt)
*
* This source code was modified by SLikeSoft. Modifications are licensed under the MIT-style
* license found in the license.txt file in the root directory of this source tree.
*/
// TODO - see PLplot plplot.sourceforge.net/download.phpd for visualization
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include "slikenet/GetTime.h"
#include "slikenet/peerinterface.h"
#include "slikenet/MessageIdentifiers.h"
#include "slikenet/StatisticsHistory.h"
#include <math.h>
#include "slikenet/sleep.h"
using namespace SLNet;
enum HistoryObject
{
HO_SIN_WAVE,
HO_COS_WAVE,
};
static const int numGraphColumns=79;
static const int numGraphRows=5;
void PrintGraph(DataStructures::Queue<StatisticsHistory::TimeAndValue> &histogram, SHValueType highest, SHValueType lowest)
{
if (histogram.Size()==0)
return;
SHValueType range = highest - lowest;
bool drawPoint[numGraphRows][numGraphColumns];
memset(drawPoint, 0, sizeof(drawPoint));
unsigned int numR;
for (unsigned int col = 0; col < histogram.Size() && col < numGraphColumns; col++)
{
double r = (double) numGraphRows * ((histogram[col].val-lowest) / range);
if (r - floor(r)>.5)
r=ceil(r);
else
r=floor(r);
numR = (unsigned int) r;
for (unsigned int row = 0; row < numR && row < numGraphRows; row++)
{
drawPoint[row][col]=true;
}
}
for (int row=numGraphRows-1; row >= 0; row--)
{
for (unsigned int col = 0; col < numGraphColumns; col++)
{
if (drawPoint[row][col])
printf("|");
else
printf(" ");
}
printf("\n");
}
for (unsigned int col = 0; col < numGraphColumns; col++)
printf("-");
printf("\n\n");
}
int main(void)
{
printf("Tests StatisticsHistory in single player.\n");
printf("Difficulty: Intermediate\n\n");
DataStructures::Queue<StatisticsHistory::TimeAndValue> histogram;
StatisticsHistory::TimeAndValueQueue *tav;
StatisticsHistory::TimeAndValueQueue tavInst;
StatisticsHistory statisticsHistory;
statisticsHistory.SetDefaultTimeToTrack(10000);
statisticsHistory.AddObject(StatisticsHistory::TrackedObjectData(HO_SIN_WAVE,0,0));
statisticsHistory.AddObject(StatisticsHistory::TrackedObjectData(HO_COS_WAVE,0,0));
double f;
Time nextPrint=0;
for(;;)
{
f = (double) ((double)GetTime() / (double)1000);
statisticsHistory.AddValueByObjectID(HO_SIN_WAVE,"Waveform",sin(f),GetTime(), false);
statisticsHistory.AddValueByObjectID(HO_COS_WAVE,"Waveform",cos(f),GetTime(), false);
// Show sin wave
if (GetTime()>nextPrint)
{
system("cls");
Time curTime = GetTime();
statisticsHistory.GetHistoryForKey(HO_SIN_WAVE, "Waveform", &tav, curTime);
tav->ResizeSampleSet(numGraphColumns, histogram, StatisticsHistory::DC_CONTINUOUS);
PrintGraph(histogram, 1, -1);
// Show cos wave
statisticsHistory.GetHistoryForKey(HO_COS_WAVE, "Waveform", &tav, curTime);
tav->ResizeSampleSet(numGraphColumns, histogram, StatisticsHistory::DC_CONTINUOUS);
PrintGraph(histogram, 1, -1);
nextPrint = GetTime() + 500;
// Show sin wave + cos wave
statisticsHistory.MergeAllObjectsOnKey("Waveform", &tavInst, StatisticsHistory::DC_CONTINUOUS);
tavInst.ResizeSampleSet(numGraphColumns, histogram, StatisticsHistory::DC_CONTINUOUS);
PrintGraph(histogram, 2, -2);
}
RakSleep(30);
}
return 1;
}