#include "connectionprofiler.h"
#include <QTimer>
#include <QDebug>

ConnectionProfiler *ConnectionProfiler::m_instance = 0;

ConnectionProfiler::ConnectionProfiler(QObject *parent) : QObject(parent),
    m_audioBytesAccumulator(0),m_bytesReadAccumulator(0),
    m_bytesWrittenAccumulator(0),m_rectsReadAccumulator(0),
    m_fbReadAccumulator(0), m_updateLatencyAccumulator(0),
    m_updateLatencySampleCounter(0), m_paintLatencyAccumulator(0),
    m_paintLatencySampleCounter(0)
{
    m_interval = new QTimer(this);
    m_interval->setInterval(60000);
    connect( m_interval, SIGNAL(timeout()), this, SLOT(updateStats()));
    m_interval->start();
    m_timer.start();
}

ConnectionProfiler *ConnectionProfiler::instance()
{
    if ( m_instance == 0 )
        m_instance = new ConnectionProfiler;
    return m_instance;
}

void ConnectionProfiler::addReadBytes( quint64 bytes )
{
    m_bytesReadAccumulator += bytes;
}

void ConnectionProfiler::addWriteBytes( quint64 bytes)
{
    m_bytesWrittenAccumulator += bytes;
}

void ConnectionProfiler::addRect( quint64 rects )
{
    m_rectsReadAccumulator += rects;
}

void ConnectionProfiler::addAudioBytes( quint64 bytes )
{
    m_audioBytesAccumulator += bytes;
}

void ConnectionProfiler::addUpdateLatencyTime( quint64 ms )
{
    m_updateLatencyAccumulator += ms;
    m_updateLatencySampleCounter++;
}

void ConnectionProfiler::addPaintLatencyTime( quint64 ms )
{
    m_paintLatencyAccumulator += ms;
    m_paintLatencySampleCounter++;
}

void ConnectionProfiler::addFBUpdate()
{
    m_fbReadAccumulator++;
}

void ConnectionProfiler::updateStats()
{
    float time = m_timer.elapsed() / 1000.0;

    qDebug( "Average %5.1f framebuffer updates per second", (float)m_fbReadAccumulator / time );
    qDebug( "Average %5.1f rect updates per second",  (float)m_rectsReadAccumulator / time );
    qDebug( "Average out %5.3f kps", (float)m_bytesWrittenAccumulator / time / 1024.0 );
    qDebug( "Average in %5.3f kps", (float)m_bytesReadAccumulator / time / 1024.0);
    qDebug( "Average audio %5.3f kps", (float)m_audioBytesAccumulator / time / 1024.0);
    if( m_updateLatencySampleCounter != 0 )
    {
        qDebug( "Max rects per second %5.2f", 1000.0 / ((float)m_updateLatencyAccumulator / m_updateLatencySampleCounter));
        qDebug( "Actual rects per second %5.2f", m_updateLatencySampleCounter / time );
    }

    if( m_paintLatencySampleCounter != 0 )
    {
        qDebug( "Max FPS %5.2f", 1000.0 / ((float)m_paintLatencyAccumulator / m_paintLatencySampleCounter));
        qDebug( "Actual FPS %5.2f", m_paintLatencySampleCounter / time );
    }

    //m_timer.restart();
    //m_fbReadAccumulator = 0;
    //m_rectsReadAccumulator = 0;
    //m_bytesReadAccumulator = 0;
    //m_bytesWrittenAccumulator = 0;
    //m_audioBytesAccumulator = 0;
    //m_updateLatencyAccumulator = 0;
    //m_updateLatencySampleCounter = 0;
    //m_paintLatencyAccumulator = 0;
    //m_paintLatencySampleCounter = 0;
}


