From 7849d6053e6e5cfe2f0a7ab2b46d2fc7979ad7c0 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Tue, 26 Mar 2019 10:28:42 +0100 Subject: [PATCH 01/43] testing --- Middleware/looppcapmiddleware.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Middleware/looppcapmiddleware.cpp b/Middleware/looppcapmiddleware.cpp index a53c5fe..318539c 100644 --- a/Middleware/looppcapmiddleware.cpp +++ b/Middleware/looppcapmiddleware.cpp @@ -31,7 +31,7 @@ quint64 LoopPcapMiddleware::timevalToUsec(timeval time) { quint64 usecs = secs*1000000 + time.tv_usec; return usecs; } - +//test timeval LoopPcapMiddleware::usecToTimeval(quint64 time) { long int seconds = time/1000000; long int usecs = time - seconds*1000000; From 90738047a386ecaf193479582a43abb861a7b2ea Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Tue, 26 Mar 2019 17:04:08 +0100 Subject: [PATCH 02/43] Started on monitoring network jitter --- IPTVUtils.pro | 6 +- Middleware/looppcapmiddleware.cpp | 2 +- Middleware/networkjitter.cpp | 87 ++++++++++++++++++++++++++++ Middleware/networkjitter.h | 47 +++++++++++++++ PacketConsumer/pcapfileconsumer.cpp | 1 + Recorder/networkpcapfilerecorder.cpp | 3 +- Recorder/networkpcapfilerecorder.h | 8 ++- Recorder/pcaptsconverter.cpp | 2 +- 8 files changed, 150 insertions(+), 6 deletions(-) create mode 100644 Middleware/networkjitter.cpp create mode 100644 Middleware/networkjitter.h diff --git a/IPTVUtils.pro b/IPTVUtils.pro index 04b7706..44cbe57 100644 --- a/IPTVUtils.pro +++ b/IPTVUtils.pro @@ -61,7 +61,8 @@ SOURCES += \ Analyzer/tsanalyzer.cpp \ playbackwidget.cpp \ recordwidget.cpp \ - convertwidget.cpp + convertwidget.cpp \ + Middleware/networkjitter.cpp HEADERS += \ mainwindow.h \ @@ -110,7 +111,8 @@ HEADERS += \ recordwidget.h \ convertwidget.h \ Status/streamid.h \ - Status/workerstatus.h + Status/workerstatus.h \ + Middleware/networkjitter.h FORMS += \ mainwindow.ui \ diff --git a/Middleware/looppcapmiddleware.cpp b/Middleware/looppcapmiddleware.cpp index 318539c..a53c5fe 100644 --- a/Middleware/looppcapmiddleware.cpp +++ b/Middleware/looppcapmiddleware.cpp @@ -31,7 +31,7 @@ quint64 LoopPcapMiddleware::timevalToUsec(timeval time) { quint64 usecs = secs*1000000 + time.tv_usec; return usecs; } -//test + timeval LoopPcapMiddleware::usecToTimeval(quint64 time) { long int seconds = time/1000000; long int usecs = time - seconds*1000000; diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp new file mode 100644 index 0000000..fc8961c --- /dev/null +++ b/Middleware/networkjitter.cpp @@ -0,0 +1,87 @@ +#include "networkjitter.h" +#include + +#include +#include + + +void NetworkJitter::init() { + this->moveToThread(&runnerThread); + connect(&runnerThread, &QThread::started, this, &NetworkJitter::run); + connect(this, &NetworkJitter::finished, &runnerThread, &QThread::quit); +} + + + +void NetworkJitter::run(){ + emit started(); + QElapsedTimer statusTimer; + statusTimer.start(); + packetNumber = 0; + + + qint64 inputTs = 0; + qint64 previousInputTs = 0; + qint64 difference = 0; + + + + qint64 bytes = 0; + // AnalyzerStatus::Protocol proto = AnalyzerStatus::UNKNOWN; + + bool hasLooped = false; + + PcapProduct input; + PcapProduct previousInput = prevProvider->getProduct(); + buffer.push(previousInput); + + while (!stopping) { + input = prevProvider->getProduct(); + //if (input.type == PcapProduct::NORMAL && !hasLooped) + { + PacketParser parser((pcap_pkthdr*)input.header.data(), (const u_char*)input.data.data()); + bytes += parser.data_len; + + + inputTs = ((pcap_pkthdr*)input.header.data())->ts.tv_sec * 1000; + inputTs += ((pcap_pkthdr*)input.header.data())->ts.tv_usec/1000; + + previousInputTs = ((pcap_pkthdr*)previousInput.header.data())->ts.tv_sec * 1000; + previousInputTs += ((pcap_pkthdr*)input.header.data())->ts.tv_usec/1000; + + difference = inputTs - previousInputTs; + qInfo() << difference; + + } + previousInput = input; + buffer.push(input); + packetNumber++; + + if (input.type == PcapProduct::END || input.type == PcapProduct::STOP) { + break; + } + + } + +emit finished(); + +} + + + +void NetworkJitter::start() { + runnerThread.start(); +// run(); + +} + + +PcapProduct NetworkJitter::getProduct() { + return buffer.pop(); +} + + +void NetworkJitter::stop() { + stopping = true; + buffer.stop(); +} diff --git a/Middleware/networkjitter.h b/Middleware/networkjitter.h new file mode 100644 index 0000000..f6a7e0d --- /dev/null +++ b/Middleware/networkjitter.h @@ -0,0 +1,47 @@ +#ifndef NETWORKJITTER_H +#define NETWORKJITTER_H + + +#include "pcapmiddleware.h" +#include "concurrentqueue.h" +#include "Status/analyzerstatus.h" +#include "pidinfo.h" +#include "Analyzer/tsanalyzer.h" +#include "Analyzer/tserrors.h" +#include "Status/streaminfo.h" + +#include +#include + + +#include + +class NetworkJitter : public PcapMiddleware +{ +public: + NetworkJitter(WorkerConfiguration config) : + PcapMiddleware(config), + buffer(MIDDLEWARE_BUFFER_SIZE) + { + init(); + } + void init(); + + + PcapProduct getProduct(); +private: + ConcurrentQueue buffer; + qint64 duration; + qint64 packetNumber; +// void bufferProducts(); + QHash streams; + +protected slots: + void run(); + +public slots: + void start(); + void stop(); +}; + +#endif // NETWORKJITTER_H diff --git a/PacketConsumer/pcapfileconsumer.cpp b/PacketConsumer/pcapfileconsumer.cpp index 84f71ae..44b8510 100644 --- a/PacketConsumer/pcapfileconsumer.cpp +++ b/PacketConsumer/pcapfileconsumer.cpp @@ -62,6 +62,7 @@ void PcapFileConsumer::saveToFile() { PacketParser parser; packet = prevProvider->getProduct(); + const u_char *pkt_data; struct pcap_pkthdr *header; diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index 5473d40..6ce3518 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -2,7 +2,7 @@ void NetworkPcapFileRecorder::start() { finalStatus.setAnalysisMode(config.getWorkerMode()); - producer.addNext(&analyzerMiddleware)->addNext(&consumer); + producer.addNext(&analyzerMiddleware)->addNext(&networkJitter)->addNext(&consumer); producer.init(&producerThread); connect(&consumer, &PcapFileConsumer::finished, &producer, &PcapBufferedProducer::stop); @@ -19,6 +19,7 @@ void NetworkPcapFileRecorder::start() { producerThread.start(); analyzerMiddleware.start(); + networkJitter.start(); consumer.start(&consumerThread); emit started(); diff --git a/Recorder/networkpcapfilerecorder.h b/Recorder/networkpcapfilerecorder.h index aca0007..5e0ee64 100644 --- a/Recorder/networkpcapfilerecorder.h +++ b/Recorder/networkpcapfilerecorder.h @@ -5,6 +5,7 @@ #include "PacketProducer/pcapbufferedproducer.h" #include "PacketConsumer/pcapfileconsumer.h" #include "Middleware/analyzerpcapmiddleware.h" +#include "Middleware/networkjitter.h" class NetworkPcapFileRecorder : public Recorder { @@ -12,6 +13,8 @@ class NetworkPcapFileRecorder : public Recorder private: PcapBufferedProducer producer; PcapFileConsumer consumer; + NetworkJitter networkJitter; + AnalyzerPcapMiddleware analyzerMiddleware; public: @@ -19,7 +22,10 @@ class NetworkPcapFileRecorder : public Recorder Recorder(config, parent), producer(config), consumer(config), - analyzerMiddleware(config) {} + networkJitter(config), + analyzerMiddleware(config) { + + } void start(); void stop(); diff --git a/Recorder/pcaptsconverter.cpp b/Recorder/pcaptsconverter.cpp index 607a424..d47050b 100644 --- a/Recorder/pcaptsconverter.cpp +++ b/Recorder/pcaptsconverter.cpp @@ -1,7 +1,7 @@ #include "pcaptsconverter.h" void PcapTsConverter::start() { - producer.addToEnd(&analyzerMiddleware)->addToEnd(&consumer); + producer.addToEnd(&analyzerMiddleware)->addToEnd(&consumer); // Add NetworkJitter after analyzer middleware (Maybe?)s producer.init(&producerThread); connect(&consumer, &TsFileConsumer::finished, &producer, &PcapBufferedProducer::stop); From 5b25632a3c543ac4d75c6020dd819314b8dd8b74 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Thu, 28 Mar 2019 16:37:40 +0100 Subject: [PATCH 03/43] Now measures IAT standard deviation. Working on adding it to UI --- Middleware/networkjitter.cpp | 83 +++++++++++++++++++++++++++--- Recorder/tsnetworkfilerecorder.cpp | 2 + Status/analyzerstatus.h | 20 +++++-- Status/streaminfo.h | 4 ++ Status/workerstatus.h | 1 + 5 files changed, 99 insertions(+), 11 deletions(-) diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp index fc8961c..9999bf7 100644 --- a/Middleware/networkjitter.cpp +++ b/Middleware/networkjitter.cpp @@ -2,8 +2,13 @@ #include #include +#include "Status/streamid.h" +#include "packetparser.h" +#include "tsparser.h" #include +#include +//This class is measuring eventual network jitter void NetworkJitter::init() { this->moveToThread(&runnerThread); @@ -17,49 +22,115 @@ void NetworkJitter::run(){ emit started(); QElapsedTimer statusTimer; statusTimer.start(); + packetNumber = 0; qint64 inputTs = 0; qint64 previousInputTs = 0; qint64 difference = 0; + qint64 differencePerSec = 0; + qint64 packetCounter = 0; + qint16 diffratePerSec = 0; + + qint64 diffSum = 0; + qint64 finalSum = 0; + + + QList distanceList; qint64 bytes = 0; // AnalyzerStatus::Protocol proto = AnalyzerStatus::UNKNOWN; - bool hasLooped = false; +// bool hasLooped = false; PcapProduct input; PcapProduct previousInput = prevProvider->getProduct(); buffer.push(previousInput); + + + while (!stopping) { + PacketParser parser((pcap_pkthdr*)input.header.data(), (const u_char*)input.data.data()); + bytes += parser.data_len; + + + quint64 streamId = StreamId::calcId(parser.ih->daddr, parser.dport); + input = prevProvider->getProduct(); + + + //if (input.type == PcapProduct::NORMAL && !hasLooped) { PacketParser parser((pcap_pkthdr*)input.header.data(), (const u_char*)input.data.data()); bytes += parser.data_len; - inputTs = ((pcap_pkthdr*)input.header.data())->ts.tv_sec * 1000; - inputTs += ((pcap_pkthdr*)input.header.data())->ts.tv_usec/1000; + inputTs = ((pcap_pkthdr*)input.header.data())->ts.tv_sec * 1000000; + inputTs += ((pcap_pkthdr*)input.header.data())->ts.tv_usec; - previousInputTs = ((pcap_pkthdr*)previousInput.header.data())->ts.tv_sec * 1000; - previousInputTs += ((pcap_pkthdr*)input.header.data())->ts.tv_usec/1000; + previousInputTs = ((pcap_pkthdr*)previousInput.header.data())->ts.tv_sec * 1000000; + previousInputTs += ((pcap_pkthdr*)previousInput.header.data())->ts.tv_usec; difference = inputTs - previousInputTs; - qInfo() << difference; + differencePerSec += difference; + distanceList.append(difference); + //qInfo() << difference; + + + + if (difference != 0){ + // qInfo() << difference; + } else { + + } + + + //Calculate average diff per second + + if(statusTimer.elapsed() >= 1000){ + diffratePerSec = differencePerSec/packetCounter; + + + for( int a = 0; a < distanceList.length(); a = a + 1 ) { + + diffSum += ((distanceList[a] - diffratePerSec) * (distanceList[a] - diffratePerSec)); + } + + finalSum = diffSum/ distanceList.length(); + + qInfo() << "Std deviation: " << sqrt(finalSum); + + packetCounter = 0; + diffSum = 0; + finalSum = 0; + distanceList.clear(); + + differencePerSec = 0; + statusTimer.restart(); + + } + + + + + } previousInput = input; buffer.push(input); packetNumber++; + packetCounter ++; + if (input.type == PcapProduct::END || input.type == PcapProduct::STOP) { break; } +#include "Status/streamid.h" } diff --git a/Recorder/tsnetworkfilerecorder.cpp b/Recorder/tsnetworkfilerecorder.cpp index bb7c3fa..55b7bb0 100644 --- a/Recorder/tsnetworkfilerecorder.cpp +++ b/Recorder/tsnetworkfilerecorder.cpp @@ -3,6 +3,7 @@ void TsNetworkFileRecorder::start() { finalStatus.setAnalysisMode(config.getWorkerMode()); producer.addToEnd(&analyzerMiddleware)->addToEnd(&consumer); + producer.init(&producerThread); connect(&consumer, &TsFileConsumer::finished, &producer, &PcapBufferedProducer::stop); @@ -17,6 +18,7 @@ void TsNetworkFileRecorder::start() { connect(&consumer, &TsFileConsumer::status, this, &TsNetworkFileRecorder::gotConsumerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::workerStatus, this, &TsNetworkFileRecorder::workerStatus); + producerThread.start(); analyzerMiddleware.start(); consumer.start(&consumerThread); diff --git a/Status/analyzerstatus.h b/Status/analyzerstatus.h index 15c9c63..7de944f 100644 --- a/Status/analyzerstatus.h +++ b/Status/analyzerstatus.h @@ -23,6 +23,7 @@ class AnalyzerStatus : public Status Protocol proto = UNKNOWN; quint8 tsPerIp = 0; + quint8 networkJitters = 0; public: AnalyzerStatus() : Status() {} @@ -36,13 +37,15 @@ class AnalyzerStatus : public Status QMap pidMap, TsErrors tsErrors, Protocol proto = UNKNOWN, - quint8 tsPerIp = -1) : + quint8 tsPerIp = -1, + quint8 networkJitters = -1) : Status(type), duration(duration), pidMap(pidMap), tsErrors(tsErrors), proto(proto), - tsPerIp(tsPerIp) + tsPerIp(tsPerIp), + networkJitters(networkJitters) {} AnalyzerStatus(StatusType type, qint64 bytes, @@ -52,13 +55,15 @@ class AnalyzerStatus : public Status QMap pidMap, TsErrors tsErrors, Protocol proto = UNKNOWN, - quint8 tsPerIp = -1) : + quint8 tsPerIp = -1, + quint8 networkJitters = -1) : Status(type, bytes, elapsed, bitrate), duration(duration), pidMap(pidMap), tsErrors(tsErrors), proto(proto), - tsPerIp(tsPerIp) + tsPerIp(tsPerIp), + networkJitters(networkJitters) {} ~AnalyzerStatus() {} AnalyzerStatus(AnalyzerStatus const &other) : @@ -67,11 +72,15 @@ class AnalyzerStatus : public Status pidMap(other.pidMap), tsErrors(other.tsErrors), proto(other.proto), - tsPerIp(other.tsPerIp) {} + tsPerIp(other.tsPerIp), + networkJitters(other.networkJitters) + {} void setTsPerIp(quint8 tsPerIp) { this->tsPerIp = tsPerIp; } + void setNetworkJitter(quint8 networkJitters) {this->networkJitters =networkJitters; } void setProtocol(Protocol proto) { this->proto = proto; } + qint64 getDuration() const { return duration; } QMap getPidMap() { @@ -82,6 +91,7 @@ class AnalyzerStatus : public Status } quint8 getTsPerIp() const { return this->tsPerIp; } + quint8 getNetworkJitter() const {return this->networkJitters; } Protocol getProtocol() const { return this->proto; } }; diff --git a/Status/streaminfo.h b/Status/streaminfo.h index fae0d31..4e548d7 100644 --- a/Status/streaminfo.h +++ b/Status/streaminfo.h @@ -29,6 +29,7 @@ class StreamInfo { NetworkProtocol protocol; BitrateMode bitrateMode; quint8 tsPerIp; + quint8 networkJitters; TsErrors tsErrors; QMap pidMap; QString protocolName() const { @@ -62,18 +63,21 @@ class StreamInfo { protocol(NetworkProtocol::UNKNOWN), bitrateMode(BitrateMode::UNKNOWN), tsPerIp(0), + networkJitters(0), tsErrors() {} StreamInfo(StreamId id, quint64 bytes, quint64 bitrate, NetworkProtocol protocol, quint8 tsPerIp, + quint8 networkJitters, TsErrors tsErrors) : id(id), bytes(bytes), bitrate(bitrate), protocol(protocol), tsPerIp(tsPerIp), + networkJitters(networkJitters), tsErrors(tsErrors) {} }; diff --git a/Status/workerstatus.h b/Status/workerstatus.h index 215f555..133fc34 100644 --- a/Status/workerstatus.h +++ b/Status/workerstatus.h @@ -74,6 +74,7 @@ class WorkerStatus : public QObject { parent->addChild(makeItem(QString(tr("protocol %1")).arg(info.protocolName()))); parent->addChild(makeItem(QString(tr("bitrate mode %1")).arg(info.bitrateModeName()))); parent->addChild(makeItem(QString(tr("%1 TS/IP")).arg(info.tsPerIp))); + parent->addChild(makeItem(QString(tr("%1 msec Networkjitter")).arg(info.networkJitters))); parent->addChild(makeItem(QString(tr("%1 PIDs")).arg(info.pidMap.size()))); quint64 tsErrCount = info.tsErrors.totalErrors(); From 503fed6e7869a13dce3c6997a9b588057cfd3585 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Tue, 2 Apr 2019 16:29:00 +0200 Subject: [PATCH 04/43] Now displaying IAT standard deviation, however clears all other streaming info when displayed. Needs to be fixed --- Middleware/networkjitter.cpp | 53 +++++++++++++++------------- Middleware/networkjitter.h | 23 ++++++------ Middleware/pcapmiddleware.h | 7 ---- Recorder/networkpcapfilerecorder.cpp | 26 ++++++++++++++ Recorder/networkpcapfilerecorder.h | 1 + Recorder/pcaptsconverter.cpp | 2 +- Status/analyzerstatus.h | 4 +++ Status/finalstatus.h | 8 +++++ Status/status.h | 3 ++ Status/workerstatus.h | 8 ++++- 10 files changed, 89 insertions(+), 46 deletions(-) diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp index 9999bf7..2fc65eb 100644 --- a/Middleware/networkjitter.cpp +++ b/Middleware/networkjitter.cpp @@ -3,6 +3,7 @@ #include #include "Status/streamid.h" +#include "Status/streaminfo.h" #include "packetparser.h" #include "tsparser.h" #include @@ -17,8 +18,8 @@ void NetworkJitter::init() { } - void NetworkJitter::run(){ + emit started(); QElapsedTimer statusTimer; statusTimer.start(); @@ -38,15 +39,15 @@ void NetworkJitter::run(){ QList distanceList; + qint64 bytes = 0; + PcapProduct input; + + - qint64 bytes = 0; - // AnalyzerStatus::Protocol proto = AnalyzerStatus::UNKNOWN; -// bool hasLooped = false; - PcapProduct input; PcapProduct previousInput = prevProvider->getProduct(); buffer.push(previousInput); @@ -63,13 +64,12 @@ void NetworkJitter::run(){ input = prevProvider->getProduct(); - - //if (input.type == PcapProduct::NORMAL && !hasLooped) { + PacketParser parser((pcap_pkthdr*)input.header.data(), (const u_char*)input.data.data()); bytes += parser.data_len; - + // Takes packet Timestamp and compares it to the previous one to calculate difference. inputTs = ((pcap_pkthdr*)input.header.data())->ts.tv_sec * 1000000; inputTs += ((pcap_pkthdr*)input.header.data())->ts.tv_usec; @@ -82,20 +82,16 @@ void NetworkJitter::run(){ //qInfo() << difference; - if (difference != 0){ // qInfo() << difference; - } else { - } - //Calculate average diff per second + //Calculate average diff per second and IAT standard deviation if(statusTimer.elapsed() >= 1000){ diffratePerSec = differencePerSec/packetCounter; - for( int a = 0; a < distanceList.length(); a = a + 1 ) { diffSum += ((distanceList[a] - diffratePerSec) * (distanceList[a] - diffratePerSec)); @@ -104,46 +100,53 @@ void NetworkJitter::run(){ finalSum = diffSum/ distanceList.length(); qInfo() << "Std deviation: " << sqrt(finalSum); + //&StreamInfo.networkJitters = finalSum; + + + + + + quint64 streamId = StreamId::calcId(parser.ih->daddr, parser.dport); + StreamInfo &stream = streams[streamId]; + + + stream.networkJitters = sqrt(finalSum); + + + emit status(AnalyzerStatus(Status::STATUS_PERIODIC, finalSum)); + emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams)); + + packetCounter = 0; diffSum = 0; finalSum = 0; distanceList.clear(); + differencePerSec = 0; statusTimer.restart(); } - - - - - } previousInput = input; buffer.push(input); packetNumber++; packetCounter ++; - if (input.type == PcapProduct::END || input.type == PcapProduct::STOP) { break; } -#include "Status/streamid.h" } - -emit finished(); - + emit finished(); } void NetworkJitter::start() { runnerThread.start(); -// run(); - } diff --git a/Middleware/networkjitter.h b/Middleware/networkjitter.h index f6a7e0d..328d32f 100644 --- a/Middleware/networkjitter.h +++ b/Middleware/networkjitter.h @@ -13,11 +13,15 @@ #include #include - -#include - class NetworkJitter : public PcapMiddleware { + Q_OBJECT +private: + ConcurrentQueue buffer; + qint64 duration; + qint64 packetNumber; + QHash streams; + public: NetworkJitter(WorkerConfiguration config) : PcapMiddleware(config), @@ -25,16 +29,11 @@ class NetworkJitter : public PcapMiddleware { init(); } - void init(); - + void init(); + PcapProduct getProduct(); - PcapProduct getProduct(); -private: - ConcurrentQueue buffer; - qint64 duration; - qint64 packetNumber; -// void bufferProducts(); - QHash streams; +signals: + void status(AnalyzerStatus status); protected slots: void run(); diff --git a/Middleware/pcapmiddleware.h b/Middleware/pcapmiddleware.h index 343edd4..ca4abd0 100644 --- a/Middleware/pcapmiddleware.h +++ b/Middleware/pcapmiddleware.h @@ -24,13 +24,6 @@ class PcapMiddleware : public QObject, public PcapProductProvider void started(); void finished(); void workerStatus(WorkerStatus status); - -protected slots: - virtual void run() = 0; - -public slots: - virtual void start() = 0; - virtual void stop() { stopping = true; } }; #endif // PCAPMIDDLEWARE_H diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index 6ce3518..c390385 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -11,11 +11,19 @@ void NetworkPcapFileRecorder::start() { connect(&producerThread, &QThread::finished, this, &NetworkPcapFileRecorder::moduleFinished); connect(analyzerMiddleware.thread(), &QThread::finished, this, &NetworkPcapFileRecorder::moduleFinished); connect(&consumerThread, &QThread::finished, this, &NetworkPcapFileRecorder::moduleFinished); + connect(networkJitter.thread(), &QThread::finished, this, &NetworkPcapFileRecorder::moduleFinished); + connect(&producer, &PcapBufferedProducer::status, this, &NetworkPcapFileRecorder::gotProducerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::status, this, &NetworkPcapFileRecorder::gotAnalyzerStatus); + connect(&networkJitter, &NetworkJitter::status, this, &NetworkPcapFileRecorder::gotNetworkStatus); + + + //Worker-status is connected to the right side stream info panel connect(&consumer, &PcapFileConsumer::status, this, &NetworkPcapFileRecorder::gotConsumerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::workerStatus, this, &NetworkPcapFileRecorder::workerStatus); + connect(&networkJitter, &NetworkJitter::workerStatus, this, &NetworkPcapFileRecorder::workerStatus); + producerThread.start(); analyzerMiddleware.start(); @@ -51,6 +59,24 @@ void NetworkPcapFileRecorder::gotAnalyzerStatus(AnalyzerStatus aStatus) { } } + +void NetworkPcapFileRecorder::gotNetworkStatus(AnalyzerStatus dStatus) { + if (dStatus.getType() == Status::STATUS_ERROR) { + finalStatus.setError(dStatus.getError()); + stop(); + emit status(finalStatus); + return; + } + else { + finalStatus.setNetworkJitter(dStatus); + emit status(finalStatus); + } +} + + + + + void NetworkPcapFileRecorder::gotConsumerStatus(Status cStatus) { if (cStatus.getType() == Status::STATUS_ERROR) { finalStatus.setError(cStatus.getError()); diff --git a/Recorder/networkpcapfilerecorder.h b/Recorder/networkpcapfilerecorder.h index 5e0ee64..c70d753 100644 --- a/Recorder/networkpcapfilerecorder.h +++ b/Recorder/networkpcapfilerecorder.h @@ -34,6 +34,7 @@ class NetworkPcapFileRecorder : public Recorder private slots: void gotProducerStatus(Status pStatus); void gotAnalyzerStatus(AnalyzerStatus aStatus); + void gotNetworkStatus(AnalyzerStatus dStatus); void gotConsumerStatus(Status cStatus); void moduleFinished(); }; diff --git a/Recorder/pcaptsconverter.cpp b/Recorder/pcaptsconverter.cpp index d47050b..607a424 100644 --- a/Recorder/pcaptsconverter.cpp +++ b/Recorder/pcaptsconverter.cpp @@ -1,7 +1,7 @@ #include "pcaptsconverter.h" void PcapTsConverter::start() { - producer.addToEnd(&analyzerMiddleware)->addToEnd(&consumer); // Add NetworkJitter after analyzer middleware (Maybe?)s + producer.addToEnd(&analyzerMiddleware)->addToEnd(&consumer); producer.init(&producerThread); connect(&consumer, &TsFileConsumer::finished, &producer, &PcapBufferedProducer::stop); diff --git a/Status/analyzerstatus.h b/Status/analyzerstatus.h index 7de944f..b83e407 100644 --- a/Status/analyzerstatus.h +++ b/Status/analyzerstatus.h @@ -30,6 +30,10 @@ class AnalyzerStatus : public Status AnalyzerStatus(Status::StatusType type) : Status(type) {} AnalyzerStatus(StatusType type, qint64 bytes, qint64 elapsed ) : Status(type, bytes, elapsed) {} + + AnalyzerStatus(StatusType type, qint8 networkJitters) : + Status(type, networkJitters) {} + AnalyzerStatus(StatusType type, qint64 bytes, qint64 elapsed, qint64 bitrate) : Status(type, bytes, elapsed, bitrate) {} AnalyzerStatus(StatusType type, diff --git a/Status/finalstatus.h b/Status/finalstatus.h index 80503f6..84ef22b 100644 --- a/Status/finalstatus.h +++ b/Status/finalstatus.h @@ -17,6 +17,8 @@ class FinalStatus : public AnalyzerStatus { FinalStatus(Status::StatusType type) : AnalyzerStatus(type) {} FinalStatus(StatusType type, qint64 bytes, qint64 elapsed) : AnalyzerStatus(type, bytes, elapsed) {} + FinalStatus(StatusType type, qint8 networkJitters) : + AnalyzerStatus(type, networkJitters) {} FinalStatus(StatusType type, qint64 bytes, qint64 elapsed, qint64 bitrate) : AnalyzerStatus(type, bytes, elapsed, bitrate) {} ~FinalStatus() {} @@ -41,6 +43,12 @@ class FinalStatus : public AnalyzerStatus { this->proto = aStatus.getProtocol(); } + void setNetworkJitter(AnalyzerStatus &aStatus){ + this->networkJitters = aStatus.getNetworkJitter(); + } + + + void setPidInfo(AnalyzerStatus &aStatus) { this->pidMap = aStatus.getPidMap(); this->tsErrors = aStatus.getTsErrors(); diff --git a/Status/status.h b/Status/status.h index e6da1d0..fd6e8af 100644 --- a/Status/status.h +++ b/Status/status.h @@ -19,6 +19,7 @@ class Status : public QObject { qint64 bytes = 0; qint64 elapsed = 0; qint64 bitrate = 0; + qint8 networkJitters = 0; QString error = ""; public: @@ -33,6 +34,8 @@ class Status : public QObject { bytes(bytes), elapsed(elapsed), bitrate(bitrate) {} + Status(StatusType type, qint8 networkJitters) : + type(type), networkJitters(networkJitters){} ~Status() {} Status(Status const &other) : QObject(), diff --git a/Status/workerstatus.h b/Status/workerstatus.h index 133fc34..32e176a 100644 --- a/Status/workerstatus.h +++ b/Status/workerstatus.h @@ -22,6 +22,7 @@ class WorkerStatus : public QObject { protected: StatusType type = STATUS_ERROR; + qint64 networkJitters; QString error = ""; QHash streams; @@ -41,9 +42,14 @@ class WorkerStatus : public QObject { item->setDisabled(true); } + + + public: WorkerStatus() : QObject() {} WorkerStatus(StatusType type) : QObject(), type(type) {} + WorkerStatus(StatusType type, qint64 networkJitters) : + type(type), networkJitters(networkJitters){} WorkerStatus(QString error) : QObject(), type(STATUS_ERROR), error(error) {} WorkerStatus(StatusType type, QHash streams) : QObject(), @@ -74,7 +80,7 @@ class WorkerStatus : public QObject { parent->addChild(makeItem(QString(tr("protocol %1")).arg(info.protocolName()))); parent->addChild(makeItem(QString(tr("bitrate mode %1")).arg(info.bitrateModeName()))); parent->addChild(makeItem(QString(tr("%1 TS/IP")).arg(info.tsPerIp))); - parent->addChild(makeItem(QString(tr("%1 msec Networkjitter")).arg(info.networkJitters))); + parent->addChild(makeItem(QString(tr("%1 std IAT deviation")).arg(info.networkJitters))); parent->addChild(makeItem(QString(tr("%1 PIDs")).arg(info.pidMap.size()))); quint64 tsErrCount = info.tsErrors.totalErrors(); From 162b789ae61098280877cce3605db7bc719fab5b Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 3 Apr 2019 13:55:19 +0200 Subject: [PATCH 05/43] =?UTF-8?q?=C2=B5s=20IAT=20deviation=20now=20visible?= =?UTF-8?q?=20in=20UI=20under=20stream=20info!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Middleware/networkjitter.cpp | 18 +------------- Recorder/networkpcapfilerecorder.cpp | 35 ++++++++++++++++++++++++---- Recorder/networkpcapfilerecorder.h | 2 ++ Status/analyzerstatus.h | 22 ++++------------- Status/finalstatus.h | 8 ------- Status/status.h | 11 ++++++--- Status/streaminfo.h | 2 +- Status/workerstatus.h | 27 +++++++++++++++------ 8 files changed, 68 insertions(+), 57 deletions(-) diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp index 2fc65eb..5959085 100644 --- a/Middleware/networkjitter.cpp +++ b/Middleware/networkjitter.cpp @@ -57,10 +57,6 @@ void NetworkJitter::run(){ while (!stopping) { PacketParser parser((pcap_pkthdr*)input.header.data(), (const u_char*)input.data.data()); bytes += parser.data_len; - - - quint64 streamId = StreamId::calcId(parser.ih->daddr, parser.dport); - input = prevProvider->getProduct(); @@ -79,15 +75,8 @@ void NetworkJitter::run(){ difference = inputTs - previousInputTs; differencePerSec += difference; distanceList.append(difference); - //qInfo() << difference; - - - if (difference != 0){ - // qInfo() << difference; - } - - //Calculate average diff per second and IAT standard deviation + //Calculate average diff per second and IAT standard deviation per microsecond if(statusTimer.elapsed() >= 1000){ diffratePerSec = differencePerSec/packetCounter; @@ -100,10 +89,6 @@ void NetworkJitter::run(){ finalSum = diffSum/ distanceList.length(); qInfo() << "Std deviation: " << sqrt(finalSum); - //&StreamInfo.networkJitters = finalSum; - - - quint64 streamId = StreamId::calcId(parser.ih->daddr, parser.dport); @@ -113,7 +98,6 @@ void NetworkJitter::run(){ stream.networkJitters = sqrt(finalSum); - emit status(AnalyzerStatus(Status::STATUS_PERIODIC, finalSum)); emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams)); diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index c390385..a959917 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -13,7 +13,7 @@ void NetworkPcapFileRecorder::start() { connect(&consumerThread, &QThread::finished, this, &NetworkPcapFileRecorder::moduleFinished); connect(networkJitter.thread(), &QThread::finished, this, &NetworkPcapFileRecorder::moduleFinished); - + //These take care of the bottom info panel connect(&producer, &PcapBufferedProducer::status, this, &NetworkPcapFileRecorder::gotProducerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::status, this, &NetworkPcapFileRecorder::gotAnalyzerStatus); connect(&networkJitter, &NetworkJitter::status, this, &NetworkPcapFileRecorder::gotNetworkStatus); @@ -21,8 +21,8 @@ void NetworkPcapFileRecorder::start() { //Worker-status is connected to the right side stream info panel connect(&consumer, &PcapFileConsumer::status, this, &NetworkPcapFileRecorder::gotConsumerStatus); - connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::workerStatus, this, &NetworkPcapFileRecorder::workerStatus); - connect(&networkJitter, &NetworkJitter::workerStatus, this, &NetworkPcapFileRecorder::workerStatus); + connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::workerStatus, this, &NetworkPcapFileRecorder::joinStreamInfo); + connect(&networkJitter, &NetworkJitter::workerStatus, this, &NetworkPcapFileRecorder::joinStreamInfo); producerThread.start(); @@ -46,6 +46,34 @@ void NetworkPcapFileRecorder::gotProducerStatus(Status pStatus) { } } + +// This function joins the signals coming in from NetworkJitter & AnalyzerPcapMiddleware and emits complete signal +void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus xStatus) { + + if (xStatus.getType() == WorkerStatus::STATUS_ERROR) { + stop(); + return; + } + + for(auto iter = xStatus.getStreams().begin(); iter != xStatus.getStreams().end(); ++iter) { + qint64 streamID = iter.key(); + const StreamInfo &streamInfo= iter.value(); + + if(streamInfo.networkJitters == 0 && streamInfo.bytes != 0){ + previousAnalyzerStream.streams[streamID] = streamInfo; + + + } else if(streamInfo.networkJitters != 0){ + WorkerStatus tempStatus; + tempStatus.setStreams(previousAnalyzerStream.streams); + tempStatus.streams[streamID].networkJitters = streamInfo.networkJitters; + emit workerStatus(tempStatus); + } + } +} + + + void NetworkPcapFileRecorder::gotAnalyzerStatus(AnalyzerStatus aStatus) { if (aStatus.getType() == Status::STATUS_ERROR) { finalStatus.setError(aStatus.getError()); @@ -68,7 +96,6 @@ void NetworkPcapFileRecorder::gotNetworkStatus(AnalyzerStatus dStatus) { return; } else { - finalStatus.setNetworkJitter(dStatus); emit status(finalStatus); } } diff --git a/Recorder/networkpcapfilerecorder.h b/Recorder/networkpcapfilerecorder.h index c70d753..038a112 100644 --- a/Recorder/networkpcapfilerecorder.h +++ b/Recorder/networkpcapfilerecorder.h @@ -14,6 +14,7 @@ class NetworkPcapFileRecorder : public Recorder PcapBufferedProducer producer; PcapFileConsumer consumer; NetworkJitter networkJitter; + WorkerStatus previousAnalyzerStream; AnalyzerPcapMiddleware analyzerMiddleware; @@ -35,6 +36,7 @@ private slots: void gotProducerStatus(Status pStatus); void gotAnalyzerStatus(AnalyzerStatus aStatus); void gotNetworkStatus(AnalyzerStatus dStatus); + void joinStreamInfo(WorkerStatus dStatus); void gotConsumerStatus(Status cStatus); void moduleFinished(); }; diff --git a/Status/analyzerstatus.h b/Status/analyzerstatus.h index b83e407..6780035 100644 --- a/Status/analyzerstatus.h +++ b/Status/analyzerstatus.h @@ -23,17 +23,12 @@ class AnalyzerStatus : public Status Protocol proto = UNKNOWN; quint8 tsPerIp = 0; - quint8 networkJitters = 0; public: AnalyzerStatus() : Status() {} AnalyzerStatus(Status::StatusType type) : Status(type) {} AnalyzerStatus(StatusType type, qint64 bytes, qint64 elapsed ) : Status(type, bytes, elapsed) {} - - AnalyzerStatus(StatusType type, qint8 networkJitters) : - Status(type, networkJitters) {} - AnalyzerStatus(StatusType type, qint64 bytes, qint64 elapsed, qint64 bitrate) : Status(type, bytes, elapsed, bitrate) {} AnalyzerStatus(StatusType type, @@ -41,15 +36,13 @@ class AnalyzerStatus : public Status QMap pidMap, TsErrors tsErrors, Protocol proto = UNKNOWN, - quint8 tsPerIp = -1, - quint8 networkJitters = -1) : + quint8 tsPerIp = -1) : Status(type), duration(duration), pidMap(pidMap), tsErrors(tsErrors), proto(proto), - tsPerIp(tsPerIp), - networkJitters(networkJitters) + tsPerIp(tsPerIp) {} AnalyzerStatus(StatusType type, qint64 bytes, @@ -59,15 +52,13 @@ class AnalyzerStatus : public Status QMap pidMap, TsErrors tsErrors, Protocol proto = UNKNOWN, - quint8 tsPerIp = -1, - quint8 networkJitters = -1) : + quint8 tsPerIp = -1) : Status(type, bytes, elapsed, bitrate), duration(duration), pidMap(pidMap), tsErrors(tsErrors), proto(proto), - tsPerIp(tsPerIp), - networkJitters(networkJitters) + tsPerIp(tsPerIp) {} ~AnalyzerStatus() {} AnalyzerStatus(AnalyzerStatus const &other) : @@ -76,12 +67,10 @@ class AnalyzerStatus : public Status pidMap(other.pidMap), tsErrors(other.tsErrors), proto(other.proto), - tsPerIp(other.tsPerIp), - networkJitters(other.networkJitters) + tsPerIp(other.tsPerIp) {} void setTsPerIp(quint8 tsPerIp) { this->tsPerIp = tsPerIp; } - void setNetworkJitter(quint8 networkJitters) {this->networkJitters =networkJitters; } void setProtocol(Protocol proto) { this->proto = proto; } @@ -95,7 +84,6 @@ class AnalyzerStatus : public Status } quint8 getTsPerIp() const { return this->tsPerIp; } - quint8 getNetworkJitter() const {return this->networkJitters; } Protocol getProtocol() const { return this->proto; } }; diff --git a/Status/finalstatus.h b/Status/finalstatus.h index 84ef22b..80503f6 100644 --- a/Status/finalstatus.h +++ b/Status/finalstatus.h @@ -17,8 +17,6 @@ class FinalStatus : public AnalyzerStatus { FinalStatus(Status::StatusType type) : AnalyzerStatus(type) {} FinalStatus(StatusType type, qint64 bytes, qint64 elapsed) : AnalyzerStatus(type, bytes, elapsed) {} - FinalStatus(StatusType type, qint8 networkJitters) : - AnalyzerStatus(type, networkJitters) {} FinalStatus(StatusType type, qint64 bytes, qint64 elapsed, qint64 bitrate) : AnalyzerStatus(type, bytes, elapsed, bitrate) {} ~FinalStatus() {} @@ -43,12 +41,6 @@ class FinalStatus : public AnalyzerStatus { this->proto = aStatus.getProtocol(); } - void setNetworkJitter(AnalyzerStatus &aStatus){ - this->networkJitters = aStatus.getNetworkJitter(); - } - - - void setPidInfo(AnalyzerStatus &aStatus) { this->pidMap = aStatus.getPidMap(); this->tsErrors = aStatus.getTsErrors(); diff --git a/Status/status.h b/Status/status.h index fd6e8af..46c0eec 100644 --- a/Status/status.h +++ b/Status/status.h @@ -19,7 +19,6 @@ class Status : public QObject { qint64 bytes = 0; qint64 elapsed = 0; qint64 bitrate = 0; - qint8 networkJitters = 0; QString error = ""; public: @@ -34,8 +33,6 @@ class Status : public QObject { bytes(bytes), elapsed(elapsed), bitrate(bitrate) {} - Status(StatusType type, qint8 networkJitters) : - type(type), networkJitters(networkJitters){} ~Status() {} Status(Status const &other) : QObject(), @@ -50,8 +47,16 @@ class Status : public QObject { qint64 getElapsed() { return elapsed; } qint64 getBitrate() { return bitrate; } QString getError() { return error; } + void setType(const StatusType &value); + void setBytes(const qint64 &value); + void setElapsed(const qint64 &value); + void setBitrate(const qint64 &value); }; + + + + Q_DECLARE_METATYPE(Status) #endif // STATUS_H diff --git a/Status/streaminfo.h b/Status/streaminfo.h index 4e548d7..d7b686c 100644 --- a/Status/streaminfo.h +++ b/Status/streaminfo.h @@ -29,7 +29,7 @@ class StreamInfo { NetworkProtocol protocol; BitrateMode bitrateMode; quint8 tsPerIp; - quint8 networkJitters; + quint64 networkJitters; TsErrors tsErrors; QMap pidMap; QString protocolName() const { diff --git a/Status/workerstatus.h b/Status/workerstatus.h index 32e176a..b003bb4 100644 --- a/Status/workerstatus.h +++ b/Status/workerstatus.h @@ -20,12 +20,12 @@ class WorkerStatus : public QObject { STATUS_ANALYZED_ENTIRE }; -protected: StatusType type = STATUS_ERROR; - qint64 networkJitters; - QString error = ""; QHash streams; +protected: + QString error = ""; + QTreeWidgetItem* makeItem(QString text, bool parent = false) { QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0, QStringList(text)); item->setDisabled(!parent); @@ -48,8 +48,6 @@ class WorkerStatus : public QObject { public: WorkerStatus() : QObject() {} WorkerStatus(StatusType type) : QObject(), type(type) {} - WorkerStatus(StatusType type, qint64 networkJitters) : - type(type), networkJitters(networkJitters){} WorkerStatus(QString error) : QObject(), type(STATUS_ERROR), error(error) {} WorkerStatus(StatusType type, QHash streams) : QObject(), @@ -63,7 +61,16 @@ class WorkerStatus : public QObject { StatusType getType() { return type; } QString getError() { return error; } - QHash getStreams() { return streams; } + const QHash& getStreams() const { return streams; } + + + + + void setStreams(const QHash &value) + { + streams = value; + } + void insertIntoTree(QTreeWidget *tree) { tree->clear(); @@ -80,7 +87,9 @@ class WorkerStatus : public QObject { parent->addChild(makeItem(QString(tr("protocol %1")).arg(info.protocolName()))); parent->addChild(makeItem(QString(tr("bitrate mode %1")).arg(info.bitrateModeName()))); parent->addChild(makeItem(QString(tr("%1 TS/IP")).arg(info.tsPerIp))); - parent->addChild(makeItem(QString(tr("%1 std IAT deviation")).arg(info.networkJitters))); + if(info.networkJitters != 0){ + parent->addChild(makeItem(QString(tr("%1 µs IAT deviation ")).arg(info.networkJitters))); + } parent->addChild(makeItem(QString(tr("%1 PIDs")).arg(info.pidMap.size()))); quint64 tsErrCount = info.tsErrors.totalErrors(); @@ -100,8 +109,12 @@ class WorkerStatus : public QObject { } } + }; + + + Q_DECLARE_METATYPE(WorkerStatus) From d2ca29d91197b069c84386afe1440a789f18304e Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 3 Apr 2019 15:55:32 +0200 Subject: [PATCH 06/43] IAT deviation now working for TS --- Middleware/networkjitter.cpp | 3 +-- Recorder/networkpcapfilerecorder.cpp | 17 +------------- Recorder/tsnetworkfilerecorder.cpp | 35 ++++++++++++++++++++++++++-- Recorder/tsnetworkfilerecorder.h | 9 ++++++- 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp index 5959085..ac3a2f5 100644 --- a/Middleware/networkjitter.cpp +++ b/Middleware/networkjitter.cpp @@ -46,9 +46,8 @@ void NetworkJitter::run(){ - - PcapProduct previousInput = prevProvider->getProduct(); + buffer.push(previousInput); diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index a959917..b88172c 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -16,7 +16,7 @@ void NetworkPcapFileRecorder::start() { //These take care of the bottom info panel connect(&producer, &PcapBufferedProducer::status, this, &NetworkPcapFileRecorder::gotProducerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::status, this, &NetworkPcapFileRecorder::gotAnalyzerStatus); - connect(&networkJitter, &NetworkJitter::status, this, &NetworkPcapFileRecorder::gotNetworkStatus); + // connect(&networkJitter, &NetworkJitter::status, this, &NetworkPcapFileRecorder::gotNetworkStatus); //Worker-status is connected to the right side stream info panel @@ -88,21 +88,6 @@ void NetworkPcapFileRecorder::gotAnalyzerStatus(AnalyzerStatus aStatus) { } -void NetworkPcapFileRecorder::gotNetworkStatus(AnalyzerStatus dStatus) { - if (dStatus.getType() == Status::STATUS_ERROR) { - finalStatus.setError(dStatus.getError()); - stop(); - emit status(finalStatus); - return; - } - else { - emit status(finalStatus); - } -} - - - - void NetworkPcapFileRecorder::gotConsumerStatus(Status cStatus) { if (cStatus.getType() == Status::STATUS_ERROR) { diff --git a/Recorder/tsnetworkfilerecorder.cpp b/Recorder/tsnetworkfilerecorder.cpp index 55b7bb0..6e9a424 100644 --- a/Recorder/tsnetworkfilerecorder.cpp +++ b/Recorder/tsnetworkfilerecorder.cpp @@ -2,7 +2,7 @@ void TsNetworkFileRecorder::start() { finalStatus.setAnalysisMode(config.getWorkerMode()); - producer.addToEnd(&analyzerMiddleware)->addToEnd(&consumer); + producer.addNext(&analyzerMiddleware)->addNext(&networkJitter)->addNext(&consumer); producer.init(&producerThread); @@ -11,16 +11,22 @@ void TsNetworkFileRecorder::start() { // Performs waiting for all modules to finish before emitting finished connect(&producerThread, &QThread::finished, this, &TsNetworkFileRecorder::moduleFinished); connect(analyzerMiddleware.thread(), &QThread::finished, this, &TsNetworkFileRecorder::moduleFinished); + connect(networkJitter.thread(), &QThread::finished, this, &TsNetworkFileRecorder::moduleFinished); + connect(&consumerThread, &QThread::finished, this, &TsNetworkFileRecorder::moduleFinished); connect(&producer, &PcapBufferedProducer::status, this, &TsNetworkFileRecorder::gotProducerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::status, this, &TsNetworkFileRecorder::gotAnalyzerStatus); connect(&consumer, &TsFileConsumer::status, this, &TsNetworkFileRecorder::gotConsumerStatus); - connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::workerStatus, this, &TsNetworkFileRecorder::workerStatus); + connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::workerStatus, this, &TsNetworkFileRecorder::joinStreamInfo); + connect(&networkJitter, &NetworkJitter::workerStatus, this, &TsNetworkFileRecorder::joinStreamInfo); + + producerThread.start(); analyzerMiddleware.start(); + networkJitter.start(); consumer.start(&consumerThread); emit started(); @@ -52,6 +58,31 @@ void TsNetworkFileRecorder::gotAnalyzerStatus(AnalyzerStatus aStatus) { } } + +void TsNetworkFileRecorder::joinStreamInfo(WorkerStatus xStatus) { + + if (xStatus.getType() == WorkerStatus::STATUS_ERROR) { + stop(); + return; + } + + for(auto iter = xStatus.getStreams().begin(); iter != xStatus.getStreams().end(); ++iter) { + qint64 streamID = iter.key(); + const StreamInfo &streamInfo= iter.value(); + + if(streamInfo.networkJitters == 0 && streamInfo.bytes != 0){ + previousAnalyzerStream.streams[streamID] = streamInfo; + + + } else if(streamInfo.networkJitters != 0){ + WorkerStatus tempStatus; + tempStatus.setStreams(previousAnalyzerStream.streams); + tempStatus.streams[streamID].networkJitters = streamInfo.networkJitters; + emit workerStatus(tempStatus); + } + } +} + void TsNetworkFileRecorder::gotConsumerStatus(Status cStatus) { if (cStatus.getType() == Status::STATUS_ERROR) { finalStatus.setError(cStatus.getError()); diff --git a/Recorder/tsnetworkfilerecorder.h b/Recorder/tsnetworkfilerecorder.h index f1245f1..62c1ac6 100644 --- a/Recorder/tsnetworkfilerecorder.h +++ b/Recorder/tsnetworkfilerecorder.h @@ -5,6 +5,7 @@ #include "PacketProducer/pcapbufferedproducer.h" #include "PacketConsumer/tsfileconsumer.h" #include "Middleware/analyzerpcapmiddleware.h" +#include "Middleware/networkjitter.h" class TsNetworkFileRecorder : public Recorder { @@ -12,15 +13,20 @@ class TsNetworkFileRecorder : public Recorder PcapBufferedProducer producer; TsFileConsumer consumer; AnalyzerPcapMiddleware analyzerMiddleware; + NetworkJitter networkJitter; + WorkerStatus previousAnalyzerStream; + public: TsNetworkFileRecorder(WorkerConfiguration config, QObject *parent = 0) : Recorder(config, parent), producer(config), consumer(config), - analyzerMiddleware(config) {} + analyzerMiddleware(config), + networkJitter(config){} void stopAndWait(); + public slots: void start(); void stop(); @@ -30,6 +36,7 @@ private slots: void gotAnalyzerStatus(AnalyzerStatus aStatus); void gotConsumerStatus(Status cStatus); void moduleFinished(); + void joinStreamInfo(WorkerStatus dStatus); }; #endif // TSNETWORKFILERECORDER_H From 4b767076e065e4602b34984fefc81b619917477e Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Thu, 11 Apr 2019 10:34:16 +0200 Subject: [PATCH 07/43] Started working on implementing graph on recordwidget. There is now a graph displaying useless data --- IPTVUtils.pro | 7 +++-- mainwindow.ui | 4 +-- recordwidget.cpp | 36 ++++++++++++++++++++++++++ recordwidget.h | 2 ++ recordwidget.ui | 21 +++++++++++++-- recordwidgetgraph.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++ recordwidgetgraph.h | 47 ++++++++++++++++++++++++++++++++++ 7 files changed, 170 insertions(+), 6 deletions(-) create mode 100644 recordwidgetgraph.cpp create mode 100644 recordwidgetgraph.h diff --git a/IPTVUtils.pro b/IPTVUtils.pro index 44cbe57..cc1eca5 100644 --- a/IPTVUtils.pro +++ b/IPTVUtils.pro @@ -5,6 +5,7 @@ #------------------------------------------------- QT += core gui network +QT += core gui charts greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -62,7 +63,8 @@ SOURCES += \ playbackwidget.cpp \ recordwidget.cpp \ convertwidget.cpp \ - Middleware/networkjitter.cpp + Middleware/networkjitter.cpp \ + recordwidgetgraph.cpp HEADERS += \ mainwindow.h \ @@ -112,7 +114,8 @@ HEADERS += \ convertwidget.h \ Status/streamid.h \ Status/workerstatus.h \ - Middleware/networkjitter.h + Middleware/networkjitter.h \ + recordwidgetgraph.h FORMS += \ mainwindow.ui \ diff --git a/mainwindow.ui b/mainwindow.ui index 0188807..0029338 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -22,7 +22,7 @@ true - 2 + 0 @@ -73,7 +73,7 @@ 0 0 800 - 19 + 22 diff --git a/recordwidget.cpp b/recordwidget.cpp index 6023ece..ea57378 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -3,12 +3,33 @@ #include "mainwindow.h" #include "validator.h" #include "pcapfilter.h" +#include "recordwidgetgraph.cpp" #include #include #include #include +#include + + +#include + +// Widget used to display charts +#include + +// Adds categories to the charts axes +#include + +// Used to create stacked bar charts +#include + +// Used to create a line chart +#include + +// Used to change names on axis +#include + #include #include NetworkPcapFileRecorder* RecordWidget::networkPcapFileRecorder; @@ -20,11 +41,13 @@ RecordWidget::RecordWidget(QWidget *parent) : started(false) { ui->setupUi(this); + this->setupGraph(); // Advanced PCAP filter ui->recordPcapFilterContainer->hide(); connect(ui->recordExpandPCAPFilterButton, SIGNAL(toggled(bool)), this, SLOT(on_recordExpandPCAPFilterButton_toggled(bool))); + // File format // connect(ui->recordFileFormatPCAP, SIGNAL(toggled(bool)), this, SLOT(on_recordFileFormatPCAP_toggled(bool))); // connect(ui-> recordFileFormatTS, SIGNAL(toggled(bool)), this, SLOT(on_recordFileFormatTS_toggled(bool))); @@ -34,6 +57,10 @@ RecordWidget::RecordWidget(QWidget *parent) : connect(ui->recordRtpFecCheckBox, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate); connect(ui->recordUnicastCheckBox, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate); + // connect(ui->graphView, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate ); + + + for (int i = 0; i < MainWindow::interfaces.length(); i++) { ui->recordInterfaceSelect->addItem(MainWindow::interfaces.at(i).getName()); ui->recordInterfaceSelect->setItemData(i, MainWindow::interfaces.at(i).getName(), Qt::ToolTipRole); @@ -250,6 +277,15 @@ void RecordWidget::on_recordExpandPCAPFilterButton_toggled(bool checked) } } + +void RecordWidget::setupGraph(){ + + ui->graphView->setChart(RecordWidgetGraph::setupGraph()); + ui->graphView->setRenderHint(QPainter::Antialiasing); + ui->graphView->show(); + ui->graphView->setVisible(true); +} + void RecordWidget::on_recordFileFormatPCAP_toggled(bool checked) { QString newExtension = checked ? "pcap" : "ts"; diff --git a/recordwidget.h b/recordwidget.h index 42e8b09..ddd1098 100644 --- a/recordwidget.h +++ b/recordwidget.h @@ -36,6 +36,8 @@ private slots: bool validateAdressInputs(); bool validatePortInputs(); + void setupGraph(); + diff --git a/recordwidget.ui b/recordwidget.ui index c18b5cf..56c51b5 100644 --- a/recordwidget.ui +++ b/recordwidget.ui @@ -7,7 +7,7 @@ 0 0 644 - 435 + 555 @@ -25,7 +25,7 @@ Record - + @@ -139,6 +139,16 @@ + + + + + 0 + 700 + + + + @@ -272,6 +282,13 @@ QTreeView::branch:open:has-children:has-siblings { + + + QChartView + QGraphicsView +
QtCharts
+
+
diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp new file mode 100644 index 0000000..2d41c80 --- /dev/null +++ b/recordwidgetgraph.cpp @@ -0,0 +1,59 @@ +#include "recordwidgetgraph.h" + +// This class deals with the graph in the recordwidget + +RecordWidgetGraph::RecordWidgetGraph() +{ + +} + + +QChart* RecordWidgetGraph::setupGraph(){ + + QLineSeries *series = new QLineSeries(); + series->append(0, 16); + series->append(1, 25); + series->append(2, 24); + series->append(3, 19); + series->append(4, 33); + series->append(5, 25); + series->append(6, 34); + + // Create chart, add data, hide legend, and add axis + QChart * chart = new QChart(); + chart->legend()->hide(); + chart->addSeries(series); + chart->createDefaultAxes(); + + // Customize the title font + QFont font; + font.setPixelSize(8); + chart->setTitleFont(font); + chart->setTitleBrush(QBrush(Qt::black)); + chart->setTitle("Bitrate per second"); + + // Change the line color and weight + QPen pen(QRgb(0x000000)); + pen.setWidth(5); + series->setPen(pen); + + chart->setAnimationOptions(QChart::AllAnimations); + + /* + // Change the x axis categories + QCategoryAxis *axisX = new QCategoryAxis(); + axisX->append("1986",0); + axisX->append("1987",1); + axisX->append("1988",2); + axisX->append("1989",3); + axisX->append("1990",4); + axisX->append("1991",5); + axisX->append("1992",6); + chart->setAxisX(axisX, series); + */ + + // Used to display the chart + + + return(chart); + } diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h new file mode 100644 index 0000000..55180ef --- /dev/null +++ b/recordwidgetgraph.h @@ -0,0 +1,47 @@ +#ifndef RECORDWIDGETGRAPH_H +#define RECORDWIDGETGRAPH_H + +#include + +#include "mainwindow.h" +#include +#include "recordwidget.h" +#include "ui_recordwidget.h" + +// Manages the applications main settings like +// widget initialization +#include + +// The main window to which you add toolbars, +// menubars, widgets and status bar +#include + +// Widget used to display charts +#include + +// Represents 1 set of bars in a bar chart +#include + +// Displays the color used to represent each +// QBarSet +#include + +// Adds categories to the charts axes +#include + +// Used to create a line chart +#include + +// Used to change names on axis +#include + + + +class RecordWidgetGraph : public QChartView +{ +public: + RecordWidgetGraph(); + static QChart* setupGraph(); +}; + +#endif // RECORDWIDGETGRAPH_H From 51f6c8fc7915599eb94e27b096abb55073ed087d Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Thu, 11 Apr 2019 16:03:07 +0200 Subject: [PATCH 08/43] Graph now generates one new point after it recieves signal. Possible memory leak as well.. Needs work --- recordwidget.cpp | 9 +++-- recordwidget.h | 6 +++ recordwidgetgraph.cpp | 90 ++++++++++++++++++++++++++----------------- recordwidgetgraph.h | 13 ++++++- 4 files changed, 77 insertions(+), 41 deletions(-) diff --git a/recordwidget.cpp b/recordwidget.cpp index ea57378..b86f2f1 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -150,6 +150,7 @@ void RecordWidget::recordingFinished() { + networkPcapFileRecorder = NULL; tsNetworkFileRecorder = NULL; started = false; @@ -215,7 +216,6 @@ void RecordWidget::recordFilterShouldUpdate() { } - bool RecordWidget::startPcapRecord(WorkerConfiguration::WorkerMode mode) { if (networkPcapFileRecorder != NULL) { qWarning("Atempt to start PcapRecord while pointer not released"); @@ -232,6 +232,7 @@ bool RecordWidget::startPcapRecord(WorkerConfiguration::WorkerMode mode) { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::started, this, &RecordWidget::recordingStarted); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, this, &RecordWidget::recordStatusChanged); + connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, &graph, &RecordWidgetGraph::bitrateInfoUpdate); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); ui->recordStartStopBtn->setEnabled(false); @@ -279,11 +280,11 @@ void RecordWidget::on_recordExpandPCAPFilterButton_toggled(bool checked) void RecordWidget::setupGraph(){ - - ui->graphView->setChart(RecordWidgetGraph::setupGraph()); + // RecordWidgetGraph graph; + graph.setupGraph(); + ui->graphView->setChart(graph.chart()); ui->graphView->setRenderHint(QPainter::Antialiasing); ui->graphView->show(); - ui->graphView->setVisible(true); } void RecordWidget::on_recordFileFormatPCAP_toggled(bool checked) diff --git a/recordwidget.h b/recordwidget.h index ddd1098..23cc79c 100644 --- a/recordwidget.h +++ b/recordwidget.h @@ -5,6 +5,10 @@ #include "Recorder/networkpcapfilerecorder.h" #include "Recorder/tsnetworkfilerecorder.h" #include +#include "Status/streaminfo.h" +#include "recordwidgetgraph.h" + + namespace Ui { class RecordWidget; @@ -29,6 +33,8 @@ class RecordWidget : public QWidget bool started; QString currentDirectory; QString currentFilename; + RecordWidgetGraph graph; + private slots: void recordingStarted(); diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 2d41c80..95b40e8 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -1,7 +1,5 @@ #include "recordwidgetgraph.h" -// This class deals with the graph in the recordwidget - RecordWidgetGraph::RecordWidgetGraph() { @@ -10,36 +8,39 @@ RecordWidgetGraph::RecordWidgetGraph() QChart* RecordWidgetGraph::setupGraph(){ - QLineSeries *series = new QLineSeries(); - series->append(0, 16); - series->append(1, 25); - series->append(2, 24); - series->append(3, 19); - series->append(4, 33); - series->append(5, 25); - series->append(6, 34); - - // Create chart, add data, hide legend, and add axis - QChart * chart = new QChart(); - chart->legend()->hide(); - chart->addSeries(series); - chart->createDefaultAxes(); - - // Customize the title font - QFont font; - font.setPixelSize(8); - chart->setTitleFont(font); - chart->setTitleBrush(QBrush(Qt::black)); - chart->setTitle("Bitrate per second"); - - // Change the line color and weight - QPen pen(QRgb(0x000000)); - pen.setWidth(5); - series->setPen(pen); - - chart->setAnimationOptions(QChart::AllAnimations); - - /* + + lineSeries = new QLineSeries(); + lineSeries->append(0, 16); + lineSeries->append(1, 0); + lineSeries->append(2, 24); + lineSeries->append(3, 19); + lineSeries->append(4, 33); + lineSeries->append(5, 25); + lineSeries->append(6, 34); + + + + // Create chart, add data, hide legend, and add axis + QChart * chart = new QChart(); + chart->legend()->hide(); + chart->addSeries(lineSeries); + chart->createDefaultAxes(); + + // Customize the title font + QFont font; + font.setPixelSize(8); + chart->setTitleFont(font); + chart->setTitleBrush(QBrush(Qt::black)); + chart->setTitle("Bitrate per second"); + + // Change the line color and weight + QPen pen(QRgb(0x000000)); + pen.setWidth(5); + lineSeries->setPen(pen); + + chart->setAnimationOptions(QChart::AllAnimations); + + /* // Change the x axis categories QCategoryAxis *axisX = new QCategoryAxis(); axisX->append("1986",0); @@ -52,8 +53,27 @@ QChart* RecordWidgetGraph::setupGraph(){ chart->setAxisX(axisX, series); */ - // Used to display the chart + // Used to display the chart + + this->setChart(chart); + this->chartCounter = 7; + return(chart); +} + + + + +void RecordWidgetGraph::bitrateInfoUpdate (FinalStatus status){ + + quint64 tempInt = status.getBitrate(); + + lineSeries->append(chartCounter, tempInt/ 100000); + this->update(); + // this->chart()-> + chartCounter++; + + +} + - return(chart); - } diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 55180ef..cfa517b 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -40,8 +40,17 @@ class RecordWidgetGraph : public QChartView { public: + QChart GraphChart; RecordWidgetGraph(); - static QChart* setupGraph(); -}; + qint64 chartCounter; + QChart* setupGraph(); + + +public slots: + void bitrateInfoUpdate (FinalStatus status); +private: + QLineSeries *lineSeries; + +}; #endif // RECORDWIDGETGRAPH_H From f969ad24d9e8a4a75ed16e75b417e69f0cd6e4b5 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Mon, 15 Apr 2019 13:56:55 +0200 Subject: [PATCH 09/43] It nows draws a relative line of bitrate with max value as range max. Needs to show absolute value --- IPTVUtils.pro | 6 +++-- Middleware/networkjitter.cpp | 3 +++ recordwidget.cpp | 3 +++ recordwidgetgraph.cpp | 24 +++++++++++++------ yaxis.cpp | 6 +++++ yaxis.h | 45 ++++++++++++++++++++++++++++++++++++ 6 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 yaxis.cpp create mode 100644 yaxis.h diff --git a/IPTVUtils.pro b/IPTVUtils.pro index cc1eca5..4f4c8c4 100644 --- a/IPTVUtils.pro +++ b/IPTVUtils.pro @@ -64,7 +64,8 @@ SOURCES += \ recordwidget.cpp \ convertwidget.cpp \ Middleware/networkjitter.cpp \ - recordwidgetgraph.cpp + recordwidgetgraph.cpp \ + yaxis.cpp HEADERS += \ mainwindow.h \ @@ -115,7 +116,8 @@ HEADERS += \ Status/streamid.h \ Status/workerstatus.h \ Middleware/networkjitter.h \ - recordwidgetgraph.h + recordwidgetgraph.h \ + yaxis.h FORMS += \ mainwindow.ui \ diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp index ac3a2f5..9f3c4fe 100644 --- a/Middleware/networkjitter.cpp +++ b/Middleware/networkjitter.cpp @@ -78,7 +78,10 @@ void NetworkJitter::run(){ //Calculate average diff per second and IAT standard deviation per microsecond if(statusTimer.elapsed() >= 1000){ + // If no packages recieved, wait(?) + if(packetCounter != 0){ diffratePerSec = differencePerSec/packetCounter; + } for( int a = 0; a < distanceList.length(); a = a + 1 ) { diff --git a/recordwidget.cpp b/recordwidget.cpp index b86f2f1..804f378 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -122,6 +122,8 @@ void RecordWidget::recordingStarted() { ui->recordExpandPCAPFilterButton->setEnabled(false); ui->recordPcapFilterContainer->setEnabled(false); ui->recordInterfaceSelect->setEnabled(false); + this->setupGraph(); + @@ -151,6 +153,7 @@ void RecordWidget::recordingFinished() { + networkPcapFileRecorder = NULL; tsNetworkFileRecorder = NULL; started = false; diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 95b40e8..f16e594 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -10,6 +10,7 @@ QChart* RecordWidgetGraph::setupGraph(){ lineSeries = new QLineSeries(); + lineSeries->append(0, 16); lineSeries->append(1, 0); lineSeries->append(2, 24); @@ -20,8 +21,11 @@ QChart* RecordWidgetGraph::setupGraph(){ + // Create chart, add data, hide legend, and add axis QChart * chart = new QChart(); + + chart->setAnimationDuration(0); chart->legend()->hide(); chart->addSeries(lineSeries); chart->createDefaultAxes(); @@ -40,6 +44,13 @@ QChart* RecordWidgetGraph::setupGraph(){ chart->setAnimationOptions(QChart::AllAnimations); + + /* + QValueAxis *axisY = new QValueAxis(); + axisY->setRange(0, 10); + chart->setAxisY(axisY); + */ + /* // Change the x axis categories QCategoryAxis *axisX = new QCategoryAxis(); @@ -65,14 +76,13 @@ QChart* RecordWidgetGraph::setupGraph(){ void RecordWidgetGraph::bitrateInfoUpdate (FinalStatus status){ - quint64 tempInt = status.getBitrate(); - - lineSeries->append(chartCounter, tempInt/ 100000); - this->update(); - // this->chart()-> + double tempInt = status.getBitrate(); + //Appends Mbit/s + lineSeries->append(chartCounter, tempInt/ 1000000); + this->chart()->removeSeries(lineSeries); + this->chart()->addSeries(lineSeries); + this->repaint(); chartCounter++; - - } diff --git a/yaxis.cpp b/yaxis.cpp new file mode 100644 index 0000000..ebbb5c2 --- /dev/null +++ b/yaxis.cpp @@ -0,0 +1,6 @@ +#include "yaxis.h" + +YAxis::YAxis() +{ + +} diff --git a/yaxis.h b/yaxis.h new file mode 100644 index 0000000..f717a53 --- /dev/null +++ b/yaxis.h @@ -0,0 +1,45 @@ +#ifndef YAXIS_H +#define YAXIS_H + +#include + +#include "mainwindow.h" +#include +#include "recordwidget.h" +#include "ui_recordwidget.h" + +// Manages the applications main settings like +// widget initialization +#include + +// The main window to which you add toolbars, +// menubars, widgets and status bar +#include + +// Widget used to display charts +#include + +// Represents 1 set of bars in a bar chart +#include + +// Displays the color used to represent each +// QBarSet +#include + +// Adds categories to the charts axes +#include + +// Used to create a line chart +#include + +// Used to change names on axis +#include + + +class YAxis //: public QAbstractAxis +{ +public: + YAxis(); +}; + +#endif // YAXIS_H From 3fa8561698480c1cfbfa4e635b0746c183557d6a Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Mon, 15 Apr 2019 16:11:26 +0200 Subject: [PATCH 10/43] Bitrate graph now looks OK according to marre914 --- recordwidgetgraph.cpp | 40 +++++++--------------------------------- 1 file changed, 7 insertions(+), 33 deletions(-) diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index f16e594..2256fd0 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -11,21 +11,9 @@ QChart* RecordWidgetGraph::setupGraph(){ lineSeries = new QLineSeries(); - lineSeries->append(0, 16); - lineSeries->append(1, 0); - lineSeries->append(2, 24); - lineSeries->append(3, 19); - lineSeries->append(4, 33); - lineSeries->append(5, 25); - lineSeries->append(6, 34); - - - - // Create chart, add data, hide legend, and add axis QChart * chart = new QChart(); - chart->setAnimationDuration(0); chart->legend()->hide(); chart->addSeries(lineSeries); chart->createDefaultAxes(); @@ -39,35 +27,16 @@ QChart* RecordWidgetGraph::setupGraph(){ // Change the line color and weight QPen pen(QRgb(0x000000)); - pen.setWidth(5); + pen.setWidth(1); lineSeries->setPen(pen); - chart->setAnimationOptions(QChart::AllAnimations); - - /* QValueAxis *axisY = new QValueAxis(); axisY->setRange(0, 10); chart->setAxisY(axisY); - */ - - /* - // Change the x axis categories - QCategoryAxis *axisX = new QCategoryAxis(); - axisX->append("1986",0); - axisX->append("1987",1); - axisX->append("1988",2); - axisX->append("1989",3); - axisX->append("1990",4); - axisX->append("1991",5); - axisX->append("1992",6); - chart->setAxisX(axisX, series); - */ - - // Used to display the chart this->setChart(chart); - this->chartCounter = 7; + this->chartCounter = 0; return(chart); } @@ -78,11 +47,16 @@ void RecordWidgetGraph::bitrateInfoUpdate (FinalStatus status){ double tempInt = status.getBitrate(); //Appends Mbit/s + + if(tempInt != 0 /*&& chartCounter < 65 */){ lineSeries->append(chartCounter, tempInt/ 1000000); this->chart()->removeSeries(lineSeries); this->chart()->addSeries(lineSeries); + this->chart()->createDefaultAxes(); + this->repaint(); chartCounter++; + } } From a2621fdbcbea8a44079f4afc48a597b1db3510a0 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Fri, 3 May 2019 15:29:22 +0200 Subject: [PATCH 11/43] Experimenting with another chart class --- graphchart.cpp | 6 ++++++ graphchart.h | 11 +++++++++++ 2 files changed, 17 insertions(+) create mode 100644 graphchart.cpp create mode 100644 graphchart.h diff --git a/graphchart.cpp b/graphchart.cpp new file mode 100644 index 0000000..aab1507 --- /dev/null +++ b/graphchart.cpp @@ -0,0 +1,6 @@ +#include "graphchart.h" + +GraphChart::GraphChart() +{ + +} diff --git a/graphchart.h b/graphchart.h new file mode 100644 index 0000000..8441f99 --- /dev/null +++ b/graphchart.h @@ -0,0 +1,11 @@ +#ifndef GRAPHCHART_H +#define GRAPHCHART_H + + +class GraphChart +{ +public: + GraphChart(); +}; + +#endif // GRAPHCHART_H \ No newline at end of file From 7146ef9c234d4b52bc0e38b094c30c0b9b861208 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 8 May 2019 14:08:31 +0200 Subject: [PATCH 12/43] Currently graph is working, showing 20 values. Working on implementing zoom & drag funcition. Lots of trash code that needs to be cleaned --- IPTVUtils.pro | 7 ++- Recorder/networkpcapfilerecorder.h | 1 - graphchart.cpp | 50 ++++++++++++++++++- graphchart.h | 33 +++++++++++-- recordwidgetgraph.cpp | 79 +++++++++++++++++++++++++----- recordwidgetgraph.h | 25 +++++----- 6 files changed, 165 insertions(+), 30 deletions(-) diff --git a/IPTVUtils.pro b/IPTVUtils.pro index 4f4c8c4..6888284 100644 --- a/IPTVUtils.pro +++ b/IPTVUtils.pro @@ -65,7 +65,8 @@ SOURCES += \ convertwidget.cpp \ Middleware/networkjitter.cpp \ recordwidgetgraph.cpp \ - yaxis.cpp + yaxis.cpp \ + graphchart.cpp HEADERS += \ mainwindow.h \ @@ -117,7 +118,9 @@ HEADERS += \ Status/workerstatus.h \ Middleware/networkjitter.h \ recordwidgetgraph.h \ - yaxis.h + yaxis.h \ + graphchart.h \ + graphchart.h FORMS += \ mainwindow.ui \ diff --git a/Recorder/networkpcapfilerecorder.h b/Recorder/networkpcapfilerecorder.h index 038a112..1ae1c32 100644 --- a/Recorder/networkpcapfilerecorder.h +++ b/Recorder/networkpcapfilerecorder.h @@ -35,7 +35,6 @@ class NetworkPcapFileRecorder : public Recorder private slots: void gotProducerStatus(Status pStatus); void gotAnalyzerStatus(AnalyzerStatus aStatus); - void gotNetworkStatus(AnalyzerStatus dStatus); void joinStreamInfo(WorkerStatus dStatus); void gotConsumerStatus(Status cStatus); void moduleFinished(); diff --git a/graphchart.cpp b/graphchart.cpp index aab1507..6f2227b 100644 --- a/graphchart.cpp +++ b/graphchart.cpp @@ -1,6 +1,54 @@ #include "graphchart.h" +#include +#include +#include +//#include +#include -GraphChart::GraphChart() +GraphChart::GraphChart(QGraphicsItem *parent, Qt::WindowFlags wFlags): + QChart(QChart::ChartTypeCartesian, parent, wFlags), + m_series(0), + m_axisX(new QValueAxis()), + m_axisY(new QValueAxis()), + m_step(0), + m_x(5), + m_y(1) { + QObject::connect(&m_timer, &QTimer::timeout, this, &GraphChart::handleTimeout); + m_timer.setInterval(1000); + m_series = new QSplineSeries(this); + QPen green(Qt::red); + green.setWidth(3); + m_series->setPen(green); + m_series->append(m_x, m_y); + + addSeries(m_series); + + addAxis(m_axisX,Qt::AlignBottom); + addAxis(m_axisY,Qt::AlignLeft); + m_series->attachAxis(m_axisX); + m_series->attachAxis(m_axisY); + m_axisX->setTickCount(5); + m_axisX->setRange(0, 10); + m_axisY->setRange(-5, 10); + + m_timer.start(); +} + +GraphChart::~GraphChart() +{ + +} + +void GraphChart::handleTimeout() +{ + qreal x = plotArea().width() / m_axisX->tickCount(); + qreal y = (m_axisX->max() - m_axisX->min()) / m_axisX->tickCount(); + m_x += y; + m_y = 2.5; + m_series->append(m_x, m_y); + scroll(x, 0); + if (m_x == 100) + m_timer.stop(); } diff --git a/graphchart.h b/graphchart.h index 8441f99..ba4837b 100644 --- a/graphchart.h +++ b/graphchart.h @@ -2,10 +2,37 @@ #define GRAPHCHART_H -class GraphChart +#include +#include +//#include + + +QT_CHARTS_BEGIN_NAMESPACE +class QSplineSeries; +class QValueAxis; +QT_CHARTS_END_NAMESPACE + +QT_CHARTS_USE_NAMESPACE + +class GraphChart: public QChart { + Q_OBJECT public: - GraphChart(); + GraphChart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0); + virtual ~GraphChart(); + +public slots: + void handleTimeout(); + +private: + QTimer m_timer; + QSplineSeries *m_series; + QStringList m_titles; + QValueAxis *m_axisX; + QValueAxis *m_axisY; + qreal m_step; + qreal m_x; + qreal m_y; }; -#endif // GRAPHCHART_H \ No newline at end of file +#endif /* GRAPHCHART_H */ diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 2256fd0..57d0c3c 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -1,7 +1,16 @@ #include "recordwidgetgraph.h" +#include +#include +#include +#include +#include + RecordWidgetGraph::RecordWidgetGraph() { + setDragMode(QGraphicsView::NoDrag); + this->setMouseTracking(true); + this->setRubberBand(QChartView::RectangleRubberBand); } @@ -23,18 +32,13 @@ QChart* RecordWidgetGraph::setupGraph(){ font.setPixelSize(8); chart->setTitleFont(font); chart->setTitleBrush(QBrush(Qt::black)); - chart->setTitle("Bitrate per second"); + chart->setTitle("Bitrate per second mbps"); // Change the line color and weight QPen pen(QRgb(0x000000)); pen.setWidth(1); lineSeries->setPen(pen); - - QValueAxis *axisY = new QValueAxis(); - axisY->setRange(0, 10); - chart->setAxisY(axisY); - this->setChart(chart); this->chartCounter = 0; return(chart); @@ -45,19 +49,70 @@ QChart* RecordWidgetGraph::setupGraph(){ void RecordWidgetGraph::bitrateInfoUpdate (FinalStatus status){ + // Use status.bytes to calculate new bitrate for every 1000 ms double tempInt = status.getBitrate(); //Appends Mbit/s if(tempInt != 0 /*&& chartCounter < 65 */){ - lineSeries->append(chartCounter, tempInt/ 1000000); - this->chart()->removeSeries(lineSeries); - this->chart()->addSeries(lineSeries); - this->chart()->createDefaultAxes(); + lineSeries->append(chartCounter, tempInt/ 1000000); + this->chart()->removeSeries(lineSeries); + this->chart()->addSeries(lineSeries); + this->chart()->createDefaultAxes(); + - this->repaint(); - chartCounter++; + this->chart()->scroll(chartCounter , 0); + this->chart()->axisX()->setRange(chartCounter- 10, chartCounter + 10); + this->repaint(); + chartCounter++; } } +/* + +void RecordWidgetGraph::keyPressEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Plus: + chart()->zoomIn(); + break; + case Qt::Key_Minus: + chart()->zoomOut(); + break; + } + +void RecordWidgetGraph::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::MiddleButton) + { + QApplication::setOverrideCursor(QCursor(Qt::SizeAllCursor)); + m_lastMousePos = event->pos(); + event->accept(); + } + + QChartView::mousePressEvent(event); +} + +void RecordWidgetGraph::mouseMoveEvent(QMouseEvent *event) +{ + // pan the chart with a middle mouse drag + if (event->buttons() & Qt::MiddleButton) + { + QRectF bounds = QRectF(0,0,0,0); + for(auto series : this->chart()->series()) + bounds.united(series->bounds()) + + auto pos = this->chart()->mapToValue(event->pos()) - this->chart()->mapToValue(m_lastMousePos); + + if (this->rubberBand() == QChartView::RectangleRubberBand) + this->chart()->zoom(bounds.translated(-dPos.x(), -dPos.y())); + else if (this->rubberBand() == QChartView::HorizontalRubberBand) + this->chart()->zoom(bounds.translated(-dPos.x(), 0)); + else if (this->rubberBand() == QChartView::VerticalRubberBand) + this->chart()->zoom(bounds.translated(0, -dPos.y())); + + m_lastMousePos = event->pos(); + event->accept(); + } +*/ diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index cfa517b..d6fde96 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -19,38 +19,41 @@ // Widget used to display charts #include -// Represents 1 set of bars in a bar chart -#include - -// Displays the color used to represent each -// QBarSet -#include - -// Adds categories to the charts axes -#include - // Used to create a line chart #include // Used to change names on axis #include +#include +#include +QT_CHARTS_USE_NAMESPACE + class RecordWidgetGraph : public QChartView { + + public: QChart GraphChart; RecordWidgetGraph(); qint64 chartCounter; + qreal x; QChart* setupGraph(); + void keyPressEvent(QKeyEvent *event); + + +protected: + // virtual void mousePressEvent(QMouseEvent *event) override; + // virtual void mouseMoveEvent(QMouseEvent *event) override; public slots: void bitrateInfoUpdate (FinalStatus status); private: QLineSeries *lineSeries; - + QPointF m_lastMousePos; }; #endif // RECORDWIDGETGRAPH_H From fd1d2836b9dd1488c8f4097bcbae2034ff526bac Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 15 May 2019 14:41:28 +0200 Subject: [PATCH 13/43] Can now scroll and zoom graph. --- chart.cpp | 6 ++++++ chart.h | 11 +++++++++++ graphchart.h | 38 -------------------------------------- yaxis.cpp | 6 ------ yaxis.h | 45 --------------------------------------------- 5 files changed, 17 insertions(+), 89 deletions(-) create mode 100644 chart.cpp create mode 100644 chart.h delete mode 100644 graphchart.h delete mode 100644 yaxis.cpp delete mode 100644 yaxis.h diff --git a/chart.cpp b/chart.cpp new file mode 100644 index 0000000..d787463 --- /dev/null +++ b/chart.cpp @@ -0,0 +1,6 @@ +#include "chart.h" + +Chart::Chart() +{ + +} diff --git a/chart.h b/chart.h new file mode 100644 index 0000000..3c55c47 --- /dev/null +++ b/chart.h @@ -0,0 +1,11 @@ +#ifndef CHART_H +#define CHART_H + + +class Chart : public QChart +{ +public: + Chart(); +}; + +#endif // CHART_H \ No newline at end of file diff --git a/graphchart.h b/graphchart.h deleted file mode 100644 index ba4837b..0000000 --- a/graphchart.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef GRAPHCHART_H -#define GRAPHCHART_H - - -#include -#include -//#include - - -QT_CHARTS_BEGIN_NAMESPACE -class QSplineSeries; -class QValueAxis; -QT_CHARTS_END_NAMESPACE - -QT_CHARTS_USE_NAMESPACE - -class GraphChart: public QChart -{ - Q_OBJECT -public: - GraphChart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0); - virtual ~GraphChart(); - -public slots: - void handleTimeout(); - -private: - QTimer m_timer; - QSplineSeries *m_series; - QStringList m_titles; - QValueAxis *m_axisX; - QValueAxis *m_axisY; - qreal m_step; - qreal m_x; - qreal m_y; -}; - -#endif /* GRAPHCHART_H */ diff --git a/yaxis.cpp b/yaxis.cpp deleted file mode 100644 index ebbb5c2..0000000 --- a/yaxis.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "yaxis.h" - -YAxis::YAxis() -{ - -} diff --git a/yaxis.h b/yaxis.h deleted file mode 100644 index f717a53..0000000 --- a/yaxis.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef YAXIS_H -#define YAXIS_H - -#include - -#include "mainwindow.h" -#include -#include "recordwidget.h" -#include "ui_recordwidget.h" - -// Manages the applications main settings like -// widget initialization -#include - -// The main window to which you add toolbars, -// menubars, widgets and status bar -#include - -// Widget used to display charts -#include - -// Represents 1 set of bars in a bar chart -#include - -// Displays the color used to represent each -// QBarSet -#include - -// Adds categories to the charts axes -#include - -// Used to create a line chart -#include - -// Used to change names on axis -#include - - -class YAxis //: public QAbstractAxis -{ -public: - YAxis(); -}; - -#endif // YAXIS_H From 0b9aba6c42d9b2d45748449076e6beae3f33224c Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 22 May 2019 16:07:30 +0200 Subject: [PATCH 14/43] Graph now updates every 200ms, very nice! --- IPTVUtils.pro | 7 +- Middleware/analyzerpcapmiddleware.cpp | 13 +-- Middleware/analyzerpcapmiddleware.h | 1 + Recorder/networkpcapfilerecorder.cpp | 11 ++- Recorder/networkpcapfilerecorder.h | 1 + Recorder/recorder.h | 1 + chart.cpp | 38 ++++++++- chart.h | 19 ++++- main.cpp | 3 + mainwindow.cpp | 36 +++++++- mainwindow.h | 13 ++- recordwidget.cpp | 7 +- recordwidget.h | 4 +- recordwidgetgraph.cpp | 118 ++++++++++++++++++-------- recordwidgetgraph.h | 26 +++++- 15 files changed, 236 insertions(+), 62 deletions(-) diff --git a/IPTVUtils.pro b/IPTVUtils.pro index 6888284..85b5b92 100644 --- a/IPTVUtils.pro +++ b/IPTVUtils.pro @@ -65,8 +65,7 @@ SOURCES += \ convertwidget.cpp \ Middleware/networkjitter.cpp \ recordwidgetgraph.cpp \ - yaxis.cpp \ - graphchart.cpp + chart.cpp HEADERS += \ mainwindow.h \ @@ -118,9 +117,7 @@ HEADERS += \ Status/workerstatus.h \ Middleware/networkjitter.h \ recordwidgetgraph.h \ - yaxis.h \ - graphchart.h \ - graphchart.h + chart.h FORMS += \ mainwindow.ui \ diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index da17dec..661f4a1 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -72,15 +72,15 @@ void AnalyzerPcapMiddleware::bufferProducts() { duration = endTime - startTime; if (lastDuration == 0) lastDuration = duration; - } - // 1 second of trafic, calculate bitrate for that second + // 1 second of trafic, calculate bitrate for that second - if (duration - lastDuration >= 1000) { - bitrate = (bytes - lastSecondBytes)*8*1000/(duration - lastDuration); - lastSecondBytes = bytes; - lastDuration = duration; + if (duration - lastDuration >= 200) { + bitrate = (bytes - lastSecondBytes)*8*1000/(duration - lastDuration); + lastSecondBytes = bytes; + lastDuration = duration; + } } // sanity check, prevents analyzation of packets that do not contain ts-packets @@ -164,6 +164,7 @@ void AnalyzerPcapMiddleware::bufferProducts() { if (statusTimer.elapsed() >= 200) { emit status(AnalyzerStatus(Status::STATUS_PERIODIC, bytes, duration, bitrate, duration, pidMap, tsErrors, proto, tsPerIp)); + emit bitrateStatus(bitrate); emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams)); statusTimer.restart(); } diff --git a/Middleware/analyzerpcapmiddleware.h b/Middleware/analyzerpcapmiddleware.h index 32bc8db..cdfa9d2 100644 --- a/Middleware/analyzerpcapmiddleware.h +++ b/Middleware/analyzerpcapmiddleware.h @@ -41,6 +41,7 @@ class AnalyzerPcapMiddleware : public PcapMiddleware signals: void status(AnalyzerStatus status); + void bitrateStatus(qint64 bitrate); protected slots: void run(); diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index b88172c..18a06cc 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -16,6 +16,9 @@ void NetworkPcapFileRecorder::start() { //These take care of the bottom info panel connect(&producer, &PcapBufferedProducer::status, this, &NetworkPcapFileRecorder::gotProducerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::status, this, &NetworkPcapFileRecorder::gotAnalyzerStatus); + connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::bitrateStatus, this, &NetworkPcapFileRecorder::gotBitrate); + + // connect(&networkJitter, &NetworkJitter::status, this, &NetworkPcapFileRecorder::gotNetworkStatus); @@ -47,7 +50,7 @@ void NetworkPcapFileRecorder::gotProducerStatus(Status pStatus) { } -// This function joins the signals coming in from NetworkJitter & AnalyzerPcapMiddleware and emits complete signal +// This function joins the signals coming in from NetworkJitter & AnalyzerPcapMiddleware and emits complete signal to be displayed in right-hand info panel void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus xStatus) { if (xStatus.getType() == WorkerStatus::STATUS_ERROR) { @@ -87,6 +90,12 @@ void NetworkPcapFileRecorder::gotAnalyzerStatus(AnalyzerStatus aStatus) { } } +void NetworkPcapFileRecorder::gotBitrate(qint64 bitrate){ + + + emit bitrateStatus(bitrate); +} + void NetworkPcapFileRecorder::gotConsumerStatus(Status cStatus) { diff --git a/Recorder/networkpcapfilerecorder.h b/Recorder/networkpcapfilerecorder.h index 1ae1c32..5442e9b 100644 --- a/Recorder/networkpcapfilerecorder.h +++ b/Recorder/networkpcapfilerecorder.h @@ -37,6 +37,7 @@ private slots: void gotAnalyzerStatus(AnalyzerStatus aStatus); void joinStreamInfo(WorkerStatus dStatus); void gotConsumerStatus(Status cStatus); + void gotBitrate(qint64 bitrate); void moduleFinished(); }; diff --git a/Recorder/recorder.h b/Recorder/recorder.h index 0ea60ed..a8bd012 100644 --- a/Recorder/recorder.h +++ b/Recorder/recorder.h @@ -25,6 +25,7 @@ class Recorder : public QObject void started(); void finished(); void status(FinalStatus status); + void bitrateStatus(qint64 bitrate); void workerStatus(WorkerStatus status); public slots: diff --git a/chart.cpp b/chart.cpp index d787463..ae49f85 100644 --- a/chart.cpp +++ b/chart.cpp @@ -1,6 +1,42 @@ #include "chart.h" -Chart::Chart() +#include +#include +#include + +Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags) + : QChart(QChart::ChartTypeCartesian, parent, wFlags) +{ + // Seems that QGraphicsView (QChartView) does not grab gestures. + // They can only be grabbed here in the QGraphicsWidget (QChart). + grabGesture(Qt::PanGesture); + grabGesture(Qt::PinchGesture); +} + +Chart::~Chart() +{ + +} + +bool Chart::sceneEvent(QEvent *event) +{ + if (event->type() == QEvent::Gesture) + return gestureEvent(static_cast(event)); + return QChart::event(event); +} + +bool Chart::gestureEvent(QGestureEvent *event) { + if (QGesture *gesture = event->gesture(Qt::PanGesture)) { + QPanGesture *pan = static_cast(gesture); + QChart::scroll(-(pan->delta().x()), pan->delta().y()); + } + + if (QGesture *gesture = event->gesture(Qt::PinchGesture)) { + QPinchGesture *pinch = static_cast(gesture); + if (pinch->changeFlags() & QPinchGesture::ScaleFactorChanged) + QChart::zoom(pinch->scaleFactor()); + } + return true; } diff --git a/chart.h b/chart.h index 3c55c47..12d059b 100644 --- a/chart.h +++ b/chart.h @@ -1,11 +1,26 @@ #ifndef CHART_H #define CHART_H +#include + +class QGestureEvent; + +QT_CHARTS_USE_NAMESPACE class Chart : public QChart { public: - Chart(); + explicit Chart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0); + ~Chart(); + +protected: + bool sceneEvent(QEvent *event); + +private: + bool gestureEvent(QGestureEvent *event); + +private: + }; -#endif // CHART_H \ No newline at end of file +#endif // CHART_H diff --git a/main.cpp b/main.cpp index 03fe616..43111af 100644 --- a/main.cpp +++ b/main.cpp @@ -73,6 +73,9 @@ int main(int argc, char *argv[]) #endif // QT_DEBUG MainWindow w; + // w.setCentralWidget(ui); + w.grabGesture(Qt::PanGesture); + w.grabGesture(Qt::PinchGesture); w.show(); qInfo() << QThread::currentThread(); diff --git a/mainwindow.cpp b/mainwindow.cpp index 1739192..38493c4 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2,6 +2,7 @@ #include "ui_mainwindow.h" #include "interface.h" #include "igmp.h" +#include #include "Player/pcapfilenetworkplayer.h" #include "Recorder/networkpcapfilerecorder.h" #include "Recorder/tsnetworkfilerecorder.h" @@ -9,7 +10,6 @@ #include #include - QList MainWindow::interfaces = QList(); MainWindow::MainWindow(QWidget *parent) : @@ -19,12 +19,16 @@ MainWindow::MainWindow(QWidget *parent) : Interface::getInterfaces(&interfaces); ui->setupUi(this); + // Setup strings setWindowTitle(QCoreApplication::applicationName()); ui->actionAbout->setText(tr("About %1...").arg(QCoreApplication::applicationName())); IGMP::init(); loadSettings(); + this->setMouseTracking(true); + // this->setRubberBand(QChartView::RectangleRubberBand); + } MainWindow::~MainWindow() @@ -38,6 +42,8 @@ void MainWindow::loadSettings() { ui->recordWidget->loadSettings(); ui->convertWidget->loadSettings(); + + } void MainWindow::saveSettings() { @@ -69,11 +75,39 @@ void MainWindow::closeEvent(QCloseEvent *event) event->accept(); } +void MainWindow::keyPressEvent(QKeyEvent *event) +{ + + ui->recordWidget->graph.keyPressEvent(event); + QMainWindow::keyPressEvent(event); + +} + + +void MainWindow::mousePressEvent(QMouseEvent *event) +{ + ui->recordWidget->graph.mousePressEvent(event); + + + QMainWindow::mousePressEvent(event); +} + +void MainWindow::mouseMoveEvent(QMouseEvent *event) +{ + ui->recordWidget->graph.mouseMoveEvent(event); + + QMainWindow::mouseMoveEvent(event); +} + + + + void MainWindow::on_actionExit_triggered() { close(); } + void MainWindow::on_actionAbout_triggered() { QMessageBox::about(this, tr("About %1").arg(QCoreApplication::applicationName()), diff --git a/mainwindow.h b/mainwindow.h index 3249990..8626886 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -3,31 +3,42 @@ #include #include +#include #include "Status/finalstatus.h" #include "Configuration/workerconfiguration.h" + namespace Ui { + + class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT - public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); static QList interfaces; +protected : + void keyPressEvent(QKeyEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + + public slots: void closeEvent(QCloseEvent *event); void loadSettings(); void saveSettings(); + private slots: void on_actionExit_triggered(); + void on_actionAbout_triggered(); private: diff --git a/recordwidget.cpp b/recordwidget.cpp index 804f378..b34683c 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -38,7 +38,8 @@ TsNetworkFileRecorder* RecordWidget::tsNetworkFileRecorder; RecordWidget::RecordWidget(QWidget *parent) : QWidget(parent), ui(new Ui::RecordWidget), - started(false) + started(false), + graph(this) { ui->setupUi(this); this->setupGraph(); @@ -235,6 +236,7 @@ bool RecordWidget::startPcapRecord(WorkerConfiguration::WorkerMode mode) { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::started, this, &RecordWidget::recordingStarted); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, this, &RecordWidget::recordStatusChanged); + connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, &graph, &RecordWidgetGraph::bitrateInfoUpdate); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); @@ -262,6 +264,7 @@ bool RecordWidget::startTsRecord(WorkerConfiguration::WorkerMode mode) { connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::started, this, &RecordWidget::recordingStarted); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::status, this, &RecordWidget::recordStatusChanged); + connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::status, &graph, &RecordWidgetGraph::bitrateInfoUpdate); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); ui->recordStartStopBtn->setEnabled(false); @@ -283,7 +286,7 @@ void RecordWidget::on_recordExpandPCAPFilterButton_toggled(bool checked) void RecordWidget::setupGraph(){ - // RecordWidgetGraph graph; + // graph.setParent(this); graph.setupGraph(); ui->graphView->setChart(graph.chart()); ui->graphView->setRenderHint(QPainter::Antialiasing); diff --git a/recordwidget.h b/recordwidget.h index 23cc79c..702e87c 100644 --- a/recordwidget.h +++ b/recordwidget.h @@ -21,6 +21,8 @@ class RecordWidget : public QWidget public: explicit RecordWidget(QWidget *parent = 0); ~RecordWidget(); + RecordWidgetGraph graph; + void loadSettings(); void saveSettings(); @@ -33,8 +35,6 @@ class RecordWidget : public QWidget bool started; QString currentDirectory; QString currentFilename; - RecordWidgetGraph graph; - private slots: void recordingStarted(); diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 57d0c3c..f800162 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -1,4 +1,6 @@ #include "recordwidgetgraph.h" +#include "chart.h" + #include #include #include @@ -6,22 +8,31 @@ #include -RecordWidgetGraph::RecordWidgetGraph() + +RecordWidgetGraph::RecordWidgetGraph( QWidget *parent): + QChartView(parent), + m_isTouching(false) + { - setDragMode(QGraphicsView::NoDrag); - this->setMouseTracking(true); - this->setRubberBand(QChartView::RectangleRubberBand); + m_isTouching = false; + + setDragMode(QGraphicsView::NoDrag); + this->setMouseTracking(true); + this->setRubberBand(QChartView::RectangleRubberBand); + this->setFocusPolicy(Qt::StrongFocus); } -QChart* RecordWidgetGraph::setupGraph(){ + +QChart* RecordWidgetGraph::setupGraph(){ + lineSeries = new QLineSeries(); // Create chart, add data, hide legend, and add axis - QChart * chart = new QChart(); + Chart * chart = new Chart(); chart->legend()->hide(); chart->addSeries(lineSeries); @@ -32,7 +43,7 @@ QChart* RecordWidgetGraph::setupGraph(){ font.setPixelSize(8); chart->setTitleFont(font); chart->setTitleBrush(QBrush(Qt::black)); - chart->setTitle("Bitrate per second mbps"); + // chart->setTitle("Bitrate per second mbps"); // Change the line color and weight QPen pen(QRgb(0x000000)); @@ -40,13 +51,19 @@ QChart* RecordWidgetGraph::setupGraph(){ lineSeries->setPen(pen); this->setChart(chart); + // this->chart()->axisX()->setTitleText("Seconds"); + this->chartCounter = 0; + + bitrateTimer.start(); return(chart); + } + void RecordWidgetGraph::bitrateInfoUpdate (FinalStatus status){ // Use status.bytes to calculate new bitrate for every 1000 ms @@ -54,32 +71,33 @@ void RecordWidgetGraph::bitrateInfoUpdate (FinalStatus status){ //Appends Mbit/s if(tempInt != 0 /*&& chartCounter < 65 */){ - lineSeries->append(chartCounter, tempInt/ 1000000); + + double doubleBit = currentBitrate / 1000000; + + lineSeries->append(bitrateTimer.elapsed(), currentBitrate); this->chart()->removeSeries(lineSeries); this->chart()->addSeries(lineSeries); this->chart()->createDefaultAxes(); - this->chart()->scroll(chartCounter , 0); - this->chart()->axisX()->setRange(chartCounter- 10, chartCounter + 10); + + + this->chart()->scroll(chartCounter /5 , 0); + this->chart()->axisX()->setRange((bitrateTimer.elapsed()) - 2000, bitrateTimer.elapsed()+2000); + this->repaint(); + chartCounter++; + } } -/* +void RecordWidgetGraph::setBitrate (qint64 bitrate){ + this->currentBitrate = bitrate; +} + -void RecordWidgetGraph::keyPressEvent(QKeyEvent *event) -{ - switch (event->key()) { - case Qt::Key_Plus: - chart()->zoomIn(); - break; - case Qt::Key_Minus: - chart()->zoomOut(); - break; - } void RecordWidgetGraph::mousePressEvent(QMouseEvent *event) { @@ -95,24 +113,50 @@ void RecordWidgetGraph::mousePressEvent(QMouseEvent *event) void RecordWidgetGraph::mouseMoveEvent(QMouseEvent *event) { - // pan the chart with a middle mouse drag - if (event->buttons() & Qt::MiddleButton) - { - QRectF bounds = QRectF(0,0,0,0); - for(auto series : this->chart()->series()) - bounds.united(series->bounds()) + if (m_isTouching) + return; + QChartView::mouseMoveEvent(event); +} - auto pos = this->chart()->mapToValue(event->pos()) - this->chart()->mapToValue(m_lastMousePos); +void RecordWidgetGraph::mouseReleaseEvent(QMouseEvent *event) +{ + if (m_isTouching) + m_isTouching = false; - if (this->rubberBand() == QChartView::RectangleRubberBand) - this->chart()->zoom(bounds.translated(-dPos.x(), -dPos.y())); - else if (this->rubberBand() == QChartView::HorizontalRubberBand) - this->chart()->zoom(bounds.translated(-dPos.x(), 0)); - else if (this->rubberBand() == QChartView::VerticalRubberBand) - this->chart()->zoom(bounds.translated(0, -dPos.y())); + // Because we disabled animations when touch event was detected + // we must put them back on. + chart()->setAnimationOptions(QChart::SeriesAnimations); - m_lastMousePos = event->pos(); - event->accept(); + QChartView::mouseReleaseEvent(event); +} + +void RecordWidgetGraph::keyPressEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Plus: + chart()->zoomIn(); + break; + case Qt::Key_Minus: + chart()->zoomOut(); + break; + + case Qt::Key_Left: + chart()->scroll(-10, 0); + + break; + case Qt::Key_Right: + chart()->scroll(10, 0); + + break; + case Qt::Key_Up: + chart()->scroll(0, 10); + break; + case Qt::Key_Down: + chart()->scroll(0, -10); + break; + default: + QGraphicsView::keyPressEvent(event); + break; } -*/ +} diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index d6fde96..27ccd5b 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -7,6 +7,10 @@ #include #include "recordwidget.h" #include "ui_recordwidget.h" +#include "Middleware/analyzerpcapmiddleware.h" +#include + + // Manages the applications main settings like // widget initialization @@ -36,24 +40,38 @@ class RecordWidgetGraph : public QChartView public: + + + RecordWidgetGraph(QWidget *parent); QChart GraphChart; - RecordWidgetGraph(); qint64 chartCounter; - qreal x; QChart* setupGraph(); void keyPressEvent(QKeyEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + + void mousePressEvent(QMouseEvent *event) override; + protected: - // virtual void mousePressEvent(QMouseEvent *event) override; - // virtual void mouseMoveEvent(QMouseEvent *event) override; + public slots: void bitrateInfoUpdate (FinalStatus status); + void setBitrate (qint64 bitrate); + private: + QElapsedTimer bitrateTimer; + qint64 scrollCounter = 0; + qint64 currentBitrate = 0; QLineSeries *lineSeries; QPointF m_lastMousePos; + bool m_isTouching; + bool isScrolling = false; + bool scrollCountIsSet =false; + }; #endif // RECORDWIDGETGRAPH_H From b63f00a837936abfe14f5660b7bb534a80425f0c Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Thu, 23 May 2019 11:52:27 +0200 Subject: [PATCH 15/43] Minor changes for bitrate signal. Lots of things to fix --- Middleware/analyzerpcapmiddleware.cpp | 5 ++++- Middleware/analyzerpcapmiddleware.h | 3 ++- Recorder/networkpcapfilerecorder.cpp | 5 ++--- Recorder/networkpcapfilerecorder.h | 3 ++- Recorder/recorder.h | 2 +- recordwidget.cpp | 8 ++++---- recordwidgetgraph.cpp | 22 +++++++--------------- recordwidgetgraph.h | 7 +++---- 8 files changed, 25 insertions(+), 30 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index 661f4a1..8cc3332 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -36,6 +36,7 @@ void AnalyzerPcapMiddleware::run() { // Buffers packets void AnalyzerPcapMiddleware::bufferProducts() { + QPair bitratePair; QElapsedTimer statusTimer; statusTimer.start(); packetNumber = 0; @@ -80,6 +81,8 @@ void AnalyzerPcapMiddleware::bufferProducts() { lastSecondBytes = bytes; lastDuration = duration; + + } } @@ -164,7 +167,7 @@ void AnalyzerPcapMiddleware::bufferProducts() { if (statusTimer.elapsed() >= 200) { emit status(AnalyzerStatus(Status::STATUS_PERIODIC, bytes, duration, bitrate, duration, pidMap, tsErrors, proto, tsPerIp)); - emit bitrateStatus(bitrate); + emit bitrateStatus(bitrate, duration); emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams)); statusTimer.restart(); } diff --git a/Middleware/analyzerpcapmiddleware.h b/Middleware/analyzerpcapmiddleware.h index cdfa9d2..9863b9c 100644 --- a/Middleware/analyzerpcapmiddleware.h +++ b/Middleware/analyzerpcapmiddleware.h @@ -9,6 +9,7 @@ #include "Analyzer/tserrors.h" #include "Status/streaminfo.h" +#include #include #include @@ -41,7 +42,7 @@ class AnalyzerPcapMiddleware : public PcapMiddleware signals: void status(AnalyzerStatus status); - void bitrateStatus(qint64 bitrate); + void bitrateStatus(qint64 bitrate, qint64 duration); protected slots: void run(); diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index 18a06cc..d6441e1 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -90,10 +90,9 @@ void NetworkPcapFileRecorder::gotAnalyzerStatus(AnalyzerStatus aStatus) { } } -void NetworkPcapFileRecorder::gotBitrate(qint64 bitrate){ +void NetworkPcapFileRecorder::gotBitrate(qint64 bitrate, qint64 duration){ - - emit bitrateStatus(bitrate); + emit bitrateStatus(bitrate, duration); } diff --git a/Recorder/networkpcapfilerecorder.h b/Recorder/networkpcapfilerecorder.h index 5442e9b..435a479 100644 --- a/Recorder/networkpcapfilerecorder.h +++ b/Recorder/networkpcapfilerecorder.h @@ -27,6 +27,7 @@ class NetworkPcapFileRecorder : public Recorder analyzerMiddleware(config) { } + ~NetworkPcapFileRecorder() { printf("DESTRUCT\n"); } void start(); void stop(); @@ -37,7 +38,7 @@ private slots: void gotAnalyzerStatus(AnalyzerStatus aStatus); void joinStreamInfo(WorkerStatus dStatus); void gotConsumerStatus(Status cStatus); - void gotBitrate(qint64 bitrate); + void gotBitrate(qint64 bitrate, qint64 duration); void moduleFinished(); }; diff --git a/Recorder/recorder.h b/Recorder/recorder.h index a8bd012..db8d304 100644 --- a/Recorder/recorder.h +++ b/Recorder/recorder.h @@ -25,7 +25,7 @@ class Recorder : public QObject void started(); void finished(); void status(FinalStatus status); - void bitrateStatus(qint64 bitrate); + void bitrateStatus(qint64 bitrate, qint64 duration); void workerStatus(WorkerStatus status); public slots: diff --git a/recordwidget.cpp b/recordwidget.cpp index b34683c..bf6349b 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -37,9 +37,9 @@ TsNetworkFileRecorder* RecordWidget::tsNetworkFileRecorder; RecordWidget::RecordWidget(QWidget *parent) : QWidget(parent), + graph(this), ui(new Ui::RecordWidget), - started(false), - graph(this) + started(false) { ui->setupUi(this); this->setupGraph(); @@ -237,7 +237,7 @@ bool RecordWidget::startPcapRecord(WorkerConfiguration::WorkerMode mode) { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, this, &RecordWidget::recordStatusChanged); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); - connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, &graph, &RecordWidgetGraph::bitrateInfoUpdate); + // connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, &graph, &RecordWidgetGraph::bitrateInfoUpdate); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); ui->recordStartStopBtn->setEnabled(false); @@ -264,7 +264,7 @@ bool RecordWidget::startTsRecord(WorkerConfiguration::WorkerMode mode) { connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::started, this, &RecordWidget::recordingStarted); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::status, this, &RecordWidget::recordStatusChanged); - connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::status, &graph, &RecordWidgetGraph::bitrateInfoUpdate); + //connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::status, &graph, &RecordWidgetGraph::bitrateInfoUpdate); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); ui->recordStartStopBtn->setEnabled(false); diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index f800162..9f920fb 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -62,19 +62,16 @@ QChart* RecordWidgetGraph::setupGraph(){ +void RecordWidgetGraph::setBitrate (qint64 bitrate, qint64 duration){ + this->currentBitrate = bitrate; + this->bitrateTimestamp = duration; -void RecordWidgetGraph::bitrateInfoUpdate (FinalStatus status){ - - // Use status.bytes to calculate new bitrate for every 1000 ms - double tempInt = status.getBitrate(); - //Appends Mbit/s - - if(tempInt != 0 /*&& chartCounter < 65 */){ + if(bitrate != 0 /*&& chartCounter < 65 */){ - double doubleBit = currentBitrate / 1000000; + double doubleBit = currentBitrate/ 1000000; - lineSeries->append(bitrateTimer.elapsed(), currentBitrate); + lineSeries->append(bitrateTimestamp, currentBitrate); this->chart()->removeSeries(lineSeries); this->chart()->addSeries(lineSeries); this->chart()->createDefaultAxes(); @@ -83,18 +80,13 @@ void RecordWidgetGraph::bitrateInfoUpdate (FinalStatus status){ this->chart()->scroll(chartCounter /5 , 0); - this->chart()->axisX()->setRange((bitrateTimer.elapsed()) - 2000, bitrateTimer.elapsed()+2000); + this->chart()->axisX()->setRange((bitrateTimer.elapsed()) - 2000, bitrateTimer.elapsed()+500); this->repaint(); chartCounter++; - } -} - -void RecordWidgetGraph::setBitrate (qint64 bitrate){ - this->currentBitrate = bitrate; } diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 27ccd5b..10f1e45 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -59,14 +59,13 @@ class RecordWidgetGraph : public QChartView public slots: - void bitrateInfoUpdate (FinalStatus status); - void setBitrate (qint64 bitrate); - + void setBitrate (qint64 bitrate, qint64 duration); private: QElapsedTimer bitrateTimer; qint64 scrollCounter = 0; - qint64 currentBitrate = 0; + qint64 currentBitrate; + qint64 bitrateTimestamp; QLineSeries *lineSeries; QPointF m_lastMousePos; bool m_isTouching; From 954a6cd06023953148a14bc4012f4e1c162cb0ae Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Thu, 23 May 2019 12:07:55 +0200 Subject: [PATCH 16/43] Minor cleanup --- Middleware/analyzerpcapmiddleware.cpp | 1 - Middleware/analyzerpcapmiddleware.h | 1 - recordwidget.cpp | 15 --------------- 3 files changed, 17 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index 8cc3332..003bdc7 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -36,7 +36,6 @@ void AnalyzerPcapMiddleware::run() { // Buffers packets void AnalyzerPcapMiddleware::bufferProducts() { - QPair bitratePair; QElapsedTimer statusTimer; statusTimer.start(); packetNumber = 0; diff --git a/Middleware/analyzerpcapmiddleware.h b/Middleware/analyzerpcapmiddleware.h index 9863b9c..3299af5 100644 --- a/Middleware/analyzerpcapmiddleware.h +++ b/Middleware/analyzerpcapmiddleware.h @@ -9,7 +9,6 @@ #include "Analyzer/tserrors.h" #include "Status/streaminfo.h" -#include #include #include diff --git a/recordwidget.cpp b/recordwidget.cpp index bf6349b..6caabb2 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -15,21 +15,6 @@ #include -// Widget used to display charts -#include - -// Adds categories to the charts axes -#include - -// Used to create stacked bar charts -#include - -// Used to create a line chart -#include - -// Used to change names on axis -#include - #include #include NetworkPcapFileRecorder* RecordWidget::networkPcapFileRecorder; From 85aafe646e9e4ae505f8a404f20ad78e591cbeb1 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Tue, 28 May 2019 11:32:18 +0200 Subject: [PATCH 17/43] Zoom and scroll focus now working properly for keyboard. +- and arrow keys --- Status/workerstatus.h | 2 +- mainwindow.cpp | 5 +++-- mainwindow.ui | 8 +++++++- recordwidget.cpp | 15 ++++++--------- recordwidget.h | 1 + recordwidget.ui | 11 ++++++++++- recordwidgetgraph.cpp | 10 ++++++---- 7 files changed, 34 insertions(+), 18 deletions(-) diff --git a/Status/workerstatus.h b/Status/workerstatus.h index b003bb4..8d6cdb9 100644 --- a/Status/workerstatus.h +++ b/Status/workerstatus.h @@ -74,7 +74,7 @@ class WorkerStatus : public QObject { void insertIntoTree(QTreeWidget *tree) { tree->clear(); - tree->setSelectionMode(QAbstractItemView::SingleSelection); + //tree->setSelectionMode(QAbstractItemView::SingleSelection); for (int i = 0; i < streams.count(); i++) { quint64 key = streams.keys().at(i); const StreamInfo &info = streams.value(key); diff --git a/mainwindow.cpp b/mainwindow.cpp index 38493c4..a24306d 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -41,6 +41,7 @@ void MainWindow::loadSettings() { ui->playbackWidget->loadSettings(); ui->recordWidget->loadSettings(); ui->convertWidget->loadSettings(); + ui->recordWidget->graph.setFocus(); @@ -86,10 +87,10 @@ void MainWindow::keyPressEvent(QKeyEvent *event) void MainWindow::mousePressEvent(QMouseEvent *event) { - ui->recordWidget->graph.mousePressEvent(event); + // ui->recordWidget->graph.mousePressEvent(event); - QMainWindow::mousePressEvent(event); + // QMainWindow::mousePressEvent(event); } void MainWindow::mouseMoveEvent(QMouseEvent *event) diff --git a/mainwindow.ui b/mainwindow.ui index 0029338..e2fa864 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -18,11 +18,17 @@ + + true + + + Qt::NoFocus + true - 0 + 2 diff --git a/recordwidget.cpp b/recordwidget.cpp index 6caabb2..8fc58cc 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -4,15 +4,6 @@ #include "validator.h" #include "pcapfilter.h" #include "recordwidgetgraph.cpp" - -#include -#include -#include -#include - -#include - - #include #include @@ -28,6 +19,7 @@ RecordWidget::RecordWidget(QWidget *parent) : { ui->setupUi(this); this->setupGraph(); + this->setMouseTracking(true); // Advanced PCAP filter ui->recordPcapFilterContainer->hide(); @@ -381,6 +373,11 @@ void RecordWidget::on_recordStartStopBtn_clicked() } } + + + + + void RecordWidget::on_treeWidget_activated(const QModelIndex &index) { diff --git a/recordwidget.h b/recordwidget.h index 702e87c..5e071d1 100644 --- a/recordwidget.h +++ b/recordwidget.h @@ -30,6 +30,7 @@ class RecordWidget : public QWidget static NetworkPcapFileRecorder *networkPcapFileRecorder; static TsNetworkFileRecorder *tsNetworkFileRecorder; + private: Ui::RecordWidget *ui; bool started; diff --git a/recordwidget.ui b/recordwidget.ui index 56c51b5..76cd528 100644 --- a/recordwidget.ui +++ b/recordwidget.ui @@ -7,7 +7,7 @@ 0 0 644 - 555 + 1055 @@ -147,6 +147,12 @@ 700 + + true + + + Qt::StrongFocus + @@ -224,6 +230,9 @@ + + Qt::NoFocus + QTreeView::branch:has-siblings:!adjoins-item { border-image: url(:/img/res/stylesheet-vline.png) 0; diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 9f920fb..e7d78a1 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -2,7 +2,6 @@ #include "chart.h" #include -#include #include #include #include @@ -19,7 +18,7 @@ RecordWidgetGraph::RecordWidgetGraph( QWidget *parent): setDragMode(QGraphicsView::NoDrag); this->setMouseTracking(true); this->setRubberBand(QChartView::RectangleRubberBand); - this->setFocusPolicy(Qt::StrongFocus); + // this->setFocusPolicy(Qt::StrongFocus); } @@ -67,10 +66,13 @@ void RecordWidgetGraph::setBitrate (qint64 bitrate, qint64 duration){ this->bitrateTimestamp = duration; - if(bitrate != 0 /*&& chartCounter < 65 */){ + if(bitrate != 0){ double doubleBit = currentBitrate/ 1000000; + float x = bitrateTimestamp /1000; + float y = currentBitrate /1000000; + lineSeries->append(bitrateTimestamp, currentBitrate); this->chart()->removeSeries(lineSeries); this->chart()->addSeries(lineSeries); @@ -93,7 +95,7 @@ void RecordWidgetGraph::setBitrate (qint64 bitrate, qint64 duration){ void RecordWidgetGraph::mousePressEvent(QMouseEvent *event) { - if (event->button() == Qt::MiddleButton) + if (event->button() == Qt::LeftButton) { QApplication::setOverrideCursor(QCursor(Qt::SizeAllCursor)); m_lastMousePos = event->pos(); From ead04690af05c8bb2a5304ada271cc2b11bb5a7d Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Tue, 28 May 2019 14:07:46 +0200 Subject: [PATCH 18/43] Graph is now pretty ok! Updates properly and you can easily zoom and scroll with keyboard. --- recordwidgetgraph.cpp | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index e7d78a1..3c1b83d 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -62,29 +62,21 @@ QChart* RecordWidgetGraph::setupGraph(){ void RecordWidgetGraph::setBitrate (qint64 bitrate, qint64 duration){ - this->currentBitrate = bitrate; - this->bitrateTimestamp = duration; + // Appends new values and updates graph if(bitrate != 0){ - double doubleBit = currentBitrate/ 1000000; + double timestampDouble = (double) duration /1000; + double bitrateDouble = (double) bitrate /1000000; - float x = bitrateTimestamp /1000; - float y = currentBitrate /1000000; - - lineSeries->append(bitrateTimestamp, currentBitrate); + lineSeries->append(timestampDouble, bitrateDouble); this->chart()->removeSeries(lineSeries); this->chart()->addSeries(lineSeries); this->chart()->createDefaultAxes(); - - - this->chart()->scroll(chartCounter /5 , 0); - this->chart()->axisX()->setRange((bitrateTimer.elapsed()) - 2000, bitrateTimer.elapsed()+500); - - this->repaint(); + this->chart()->axisX()->setRange(timestampDouble - 10, timestampDouble + 2); chartCounter++; } From d73abb085dd05cd56e0581c49f6631597b7d6bcc Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 12 Jun 2019 11:27:31 +0200 Subject: [PATCH 19/43] Now displays time on x-axis in "m:s" format as well as being able to see either iat dev or bitrate on graph. --- Middleware/analyzerpcapmiddleware.cpp | 2 +- Middleware/analyzerpcapmiddleware.h | 2 +- Middleware/networkjitter.cpp | 26 +++++++- Middleware/networkjitter.h | 2 + Recorder/networkpcapfilerecorder.cpp | 9 ++- Recorder/networkpcapfilerecorder.h | 4 +- Recorder/recorder.h | 3 +- Recorder/tsnetworkfilerecorder.cpp | 9 +++ Recorder/tsnetworkfilerecorder.h | 2 + recordwidget.cpp | 30 +++++++-- recordwidget.h | 1 + recordwidget.ui | 95 ++++++++++++++++++++++++++- recordwidgetgraph.cpp | 50 +++++++++----- recordwidgetgraph.h | 6 +- 14 files changed, 211 insertions(+), 30 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index 003bdc7..86ef321 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -166,7 +166,7 @@ void AnalyzerPcapMiddleware::bufferProducts() { if (statusTimer.elapsed() >= 200) { emit status(AnalyzerStatus(Status::STATUS_PERIODIC, bytes, duration, bitrate, duration, pidMap, tsErrors, proto, tsPerIp)); - emit bitrateStatus(bitrate, duration); + emit bitrateStatus((double) bitrate /1000000, duration ); emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams)); statusTimer.restart(); } diff --git a/Middleware/analyzerpcapmiddleware.h b/Middleware/analyzerpcapmiddleware.h index 3299af5..df1b71e 100644 --- a/Middleware/analyzerpcapmiddleware.h +++ b/Middleware/analyzerpcapmiddleware.h @@ -41,7 +41,7 @@ class AnalyzerPcapMiddleware : public PcapMiddleware signals: void status(AnalyzerStatus status); - void bitrateStatus(qint64 bitrate, qint64 duration); + void bitrateStatus(double bitrate, qint64 duration); protected slots: void run(); diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp index 9f3c4fe..2107505 100644 --- a/Middleware/networkjitter.cpp +++ b/Middleware/networkjitter.cpp @@ -9,7 +9,7 @@ #include #include -//This class is measuring eventual network jitter +//This class is for measuring network jitter void NetworkJitter::init() { this->moveToThread(&runnerThread); @@ -36,6 +36,8 @@ void NetworkJitter::run(){ qint64 diffSum = 0; qint64 finalSum = 0; + qint64 startTime = -1; + qint64 endTime = -1; QList distanceList; @@ -71,11 +73,28 @@ void NetworkJitter::run(){ previousInputTs = ((pcap_pkthdr*)previousInput.header.data())->ts.tv_sec * 1000000; previousInputTs += ((pcap_pkthdr*)previousInput.header.data())->ts.tv_usec; + + + if (startTime == -1) { + startTime = ((pcap_pkthdr*)input.header.data())->ts.tv_sec * 1000; // convert to ms + startTime += ((pcap_pkthdr*)input.header.data())->ts.tv_usec/1000; // convert to ms + } + else { + endTime = ((pcap_pkthdr*)input.header.data())->ts.tv_sec*1000; + endTime += ((pcap_pkthdr*)input.header.data())->ts.tv_usec/1000; // convert to ms + duration = endTime - startTime; + + } + + + + + difference = inputTs - previousInputTs; differencePerSec += difference; distanceList.append(difference); - //Calculate average diff per second and IAT standard deviation per microsecond + //Calculate average diff per second and IAT standard deviation per millisecond if(statusTimer.elapsed() >= 1000){ // If no packages recieved, wait(?) @@ -88,6 +107,8 @@ void NetworkJitter::run(){ diffSum += ((distanceList[a] - diffratePerSec) * (distanceList[a] - diffratePerSec)); } + // sqrt of finalSum is equal to the IAT dev + finalSum = diffSum/ distanceList.length(); qInfo() << "Std deviation: " << sqrt(finalSum); @@ -99,6 +120,7 @@ void NetworkJitter::run(){ stream.networkJitters = sqrt(finalSum); + emit iatStatus(sqrt(finalSum), duration); emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams)); diff --git a/Middleware/networkjitter.h b/Middleware/networkjitter.h index 328d32f..976b176 100644 --- a/Middleware/networkjitter.h +++ b/Middleware/networkjitter.h @@ -34,6 +34,8 @@ class NetworkJitter : public PcapMiddleware signals: void status(AnalyzerStatus status); + void iatStatus(double iatDev, qint64 duration); + protected slots: void run(); diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index d6441e1..0687685 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -17,6 +17,7 @@ void NetworkPcapFileRecorder::start() { connect(&producer, &PcapBufferedProducer::status, this, &NetworkPcapFileRecorder::gotProducerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::status, this, &NetworkPcapFileRecorder::gotAnalyzerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::bitrateStatus, this, &NetworkPcapFileRecorder::gotBitrate); + connect(&networkJitter, &NetworkJitter::iatStatus, this, &NetworkPcapFileRecorder::gotIatDev); // connect(&networkJitter, &NetworkJitter::status, this, &NetworkPcapFileRecorder::gotNetworkStatus); @@ -90,11 +91,17 @@ void NetworkPcapFileRecorder::gotAnalyzerStatus(AnalyzerStatus aStatus) { } } -void NetworkPcapFileRecorder::gotBitrate(qint64 bitrate, qint64 duration){ +void NetworkPcapFileRecorder::gotBitrate(double bitrate, qint64 duration){ emit bitrateStatus(bitrate, duration); } +void NetworkPcapFileRecorder::gotIatDev(double iatDev, qint64 duration){ + + emit iatStatus(iatDev, duration); +} + + void NetworkPcapFileRecorder::gotConsumerStatus(Status cStatus) { diff --git a/Recorder/networkpcapfilerecorder.h b/Recorder/networkpcapfilerecorder.h index 435a479..0bdd7c2 100644 --- a/Recorder/networkpcapfilerecorder.h +++ b/Recorder/networkpcapfilerecorder.h @@ -38,7 +38,9 @@ private slots: void gotAnalyzerStatus(AnalyzerStatus aStatus); void joinStreamInfo(WorkerStatus dStatus); void gotConsumerStatus(Status cStatus); - void gotBitrate(qint64 bitrate, qint64 duration); + void gotBitrate(double bitrate, qint64 duration); + void gotIatDev(double iatDev, qint64 duration); + void moduleFinished(); }; diff --git a/Recorder/recorder.h b/Recorder/recorder.h index db8d304..d743aec 100644 --- a/Recorder/recorder.h +++ b/Recorder/recorder.h @@ -25,7 +25,8 @@ class Recorder : public QObject void started(); void finished(); void status(FinalStatus status); - void bitrateStatus(qint64 bitrate, qint64 duration); + void bitrateStatus(double bitrate, qint64 duration); + void iatStatus(double iatDev, qint64 duration); void workerStatus(WorkerStatus status); public slots: diff --git a/Recorder/tsnetworkfilerecorder.cpp b/Recorder/tsnetworkfilerecorder.cpp index 6e9a424..77b697e 100644 --- a/Recorder/tsnetworkfilerecorder.cpp +++ b/Recorder/tsnetworkfilerecorder.cpp @@ -20,6 +20,8 @@ void TsNetworkFileRecorder::start() { connect(&consumer, &TsFileConsumer::status, this, &TsNetworkFileRecorder::gotConsumerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::workerStatus, this, &TsNetworkFileRecorder::joinStreamInfo); connect(&networkJitter, &NetworkJitter::workerStatus, this, &TsNetworkFileRecorder::joinStreamInfo); + connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::bitrateStatus, this, &TsNetworkFileRecorder::gotBitrate); + @@ -92,6 +94,13 @@ void TsNetworkFileRecorder::gotConsumerStatus(Status cStatus) { } } +void TsNetworkFileRecorder::gotBitrate(qint64 bitrate, qint64 duration){ + + emit bitrateStatus(bitrate, duration); +} + + + // Only emit finished when all modules are finished void TsNetworkFileRecorder::moduleFinished() { if (!producerThread.isFinished()) diff --git a/Recorder/tsnetworkfilerecorder.h b/Recorder/tsnetworkfilerecorder.h index 62c1ac6..95f5b5d 100644 --- a/Recorder/tsnetworkfilerecorder.h +++ b/Recorder/tsnetworkfilerecorder.h @@ -37,6 +37,8 @@ private slots: void gotConsumerStatus(Status cStatus); void moduleFinished(); void joinStreamInfo(WorkerStatus dStatus); + void gotBitrate(qint64 bitrate, qint64 duration); + }; #endif // TSNETWORKFILERECORDER_H diff --git a/recordwidget.cpp b/recordwidget.cpp index 8fc58cc..c065b4e 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -21,6 +21,7 @@ RecordWidget::RecordWidget(QWidget *parent) : this->setupGraph(); this->setMouseTracking(true); + // Advanced PCAP filter ui->recordPcapFilterContainer->hide(); connect(ui->recordExpandPCAPFilterButton, SIGNAL(toggled(bool)), this, SLOT(on_recordExpandPCAPFilterButton_toggled(bool))); @@ -213,8 +214,16 @@ bool RecordWidget::startPcapRecord(WorkerConfiguration::WorkerMode mode) { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::started, this, &RecordWidget::recordingStarted); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, this, &RecordWidget::recordStatusChanged); - connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); - // connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, &graph, &RecordWidgetGraph::bitrateInfoUpdate); + + if(ui->bitrateBtn->isChecked()){ + connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); + + } else if(ui->iatDevBtn->isChecked()){ + + connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::iatStatus, &graph, &RecordWidgetGraph::setBitrate); + + } + connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); ui->recordStartStopBtn->setEnabled(false); @@ -241,7 +250,7 @@ bool RecordWidget::startTsRecord(WorkerConfiguration::WorkerMode mode) { connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::started, this, &RecordWidget::recordingStarted); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::status, this, &RecordWidget::recordStatusChanged); - //connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::status, &graph, &RecordWidgetGraph::bitrateInfoUpdate); + connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); ui->recordStartStopBtn->setEnabled(false); @@ -262,6 +271,19 @@ void RecordWidget::on_recordExpandPCAPFilterButton_toggled(bool checked) } +void RecordWidget::setGraphData(){ + + if(ui->bitrateBtn->isChecked()){ + connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); + } else if (ui->iatDevBtn->isChecked()){ + + } else if(ui->pidBtn->isChecked()){ + + } + +} + + void RecordWidget::setupGraph(){ // graph.setParent(this); graph.setupGraph(); @@ -361,7 +383,7 @@ void RecordWidget::on_recordStartStopBtn_clicked() } else { if (networkPcapFileRecorder != Q_NULLPTR) { - qInfo("atempting to stop pcapRecorder"); + ("atempting to stop pcapRecorder"); ui->recordStartStopBtn->setEnabled(false); networkPcapFileRecorder->stop(); } diff --git a/recordwidget.h b/recordwidget.h index 5e071d1..6027d09 100644 --- a/recordwidget.h +++ b/recordwidget.h @@ -56,6 +56,7 @@ private slots: void on_recordFileFormatPCAP_toggled(bool); void on_recordOpenFileDialog_clicked(); void on_recordStartStopBtn_clicked(); + void setGraphData(); void on_treeWidget_activated(const QModelIndex &index); diff --git a/recordwidget.ui b/recordwidget.ui index 76cd528..30cca13 100644 --- a/recordwidget.ui +++ b/recordwidget.ui @@ -7,7 +7,7 @@ 0 0 644 - 1055 + 1092 @@ -136,6 +136,99 @@ + + + + + 16777215 + 37 + + + + + + + + + + + border-color: qlineargradient(spread:pad, x1:0, y1:1, x2:1, y2:0, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255)); + + + Graph Data + + + + + 0 + 20 + 466 + 30 + + + + + 0 + 10 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 70 + 0 + 112 + 16 + + + + Qt::NoFocus + + + Bitrate + + + + + + 160 + 0 + 112 + 16 + + + + Qt::NoFocus + + + Std IAT de&v + + + + + + 280 + 0 + 112 + 16 + + + + Qt::NoFocus + + + PIDS + + + + + diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 3c1b83d..cf1bc8d 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -11,14 +11,10 @@ RecordWidgetGraph::RecordWidgetGraph( QWidget *parent): QChartView(parent), m_isTouching(false) - { - m_isTouching = false; - setDragMode(QGraphicsView::NoDrag); this->setMouseTracking(true); this->setRubberBand(QChartView::RectangleRubberBand); - // this->setFocusPolicy(Qt::StrongFocus); } @@ -39,10 +35,10 @@ QChart* RecordWidgetGraph::setupGraph(){ // Customize the title font QFont font; - font.setPixelSize(8); + font.setPixelSize(3); chart->setTitleFont(font); chart->setTitleBrush(QBrush(Qt::black)); - // chart->setTitle("Bitrate per second mbps"); + // chart->setTitle("Bitrate per second mbps"); // Change the line color and weight QPen pen(QRgb(0x000000)); @@ -50,41 +46,61 @@ QChart* RecordWidgetGraph::setupGraph(){ lineSeries->setPen(pen); this->setChart(chart); - // this->chart()->axisX()->setTitleText("Seconds"); + // this->chart()->axisX()->setTitleText("Seconds"); this->chartCounter = 0; + this->maxBitrate = 0; + this->minBitrate = 5000; + + + + QDateTimeAxis *axisX = new QDateTimeAxis; + axisX->setFormat("m:s"); + axisX->setTickCount(10); + this->chart()->setAxisX(axisX, lineSeries); + lineSeries->attachAxis(axisX); + + + - bitrateTimer.start(); return(chart); + } -void RecordWidgetGraph::setBitrate (qint64 bitrate, qint64 duration){ +void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ // Appends new values and updates graph + if(bitrate != 0){ - double timestampDouble = (double) duration /1000; - double bitrateDouble = (double) bitrate /1000000; + double timestampDouble = (double) duration; + // double bitrateDouble = (double) bitrate /1000000; - lineSeries->append(timestampDouble, bitrateDouble); - this->chart()->removeSeries(lineSeries); - this->chart()->addSeries(lineSeries); - this->chart()->createDefaultAxes(); + lineSeries->append(timestampDouble, bitrate); - this->chart()->scroll(chartCounter /5 , 0); this->chart()->axisX()->setRange(timestampDouble - 10, timestampDouble + 2); + + if(bitrate < this->minBitrate){ + minBitrate = bitrate; + this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); + } + + if (this->maxBitrate < bitrate) { + this->maxBitrate = bitrate; + this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); + } + chartCounter++; } } - void RecordWidgetGraph::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 10f1e45..e0f6fa6 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -45,6 +45,8 @@ class RecordWidgetGraph : public QChartView RecordWidgetGraph(QWidget *parent); QChart GraphChart; qint64 chartCounter; + double maxBitrate; + double minBitrate; QChart* setupGraph(); void keyPressEvent(QKeyEvent *event); @@ -59,7 +61,9 @@ class RecordWidgetGraph : public QChartView public slots: - void setBitrate (qint64 bitrate, qint64 duration); + void setBitrate (double bitrate, qint64 duration); + + private: QElapsedTimer bitrateTimer; From d1112a7818478a5de989cd333022f4169f11aaef Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 12 Jun 2019 13:06:41 +0200 Subject: [PATCH 20/43] Graph window resizes better, focus doesn't get lost. DateTimeAxis now works with setRange --- recordwidget.ui | 43 ++++++++++++++++++++++++++++++++++++++----- recordwidgetgraph.cpp | 3 ++- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/recordwidget.ui b/recordwidget.ui index 30cca13..cadcc28 100644 --- a/recordwidget.ui +++ b/recordwidget.ui @@ -64,7 +64,11 @@ - + + + Qt::ClickFocus + + @@ -81,12 +85,19 @@ - + + + Qt::ClickFocus + + + + Qt::ClickFocus + Unicast @@ -94,6 +105,9 @@ + + Qt::ClickFocus + RTP-FEC @@ -134,13 +148,17 @@ - + + + Qt::NoFocus + + - + - 16777215 + 405 37 @@ -287,6 +305,9 @@ + + Qt::NoFocus + true @@ -294,6 +315,9 @@ + + Qt::ClickFocus + Browse... @@ -305,6 +329,9 @@ + + Qt::NoFocus + Start recording @@ -317,6 +344,12 @@ + + + 340 + 16777215 + + Stream info diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index cf1bc8d..dfdacc3 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -82,7 +82,8 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ lineSeries->append(timestampDouble, bitrate); - this->chart()->axisX()->setRange(timestampDouble - 10, timestampDouble + 2); + + this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(timestampDouble - 20000), QDateTime::fromMSecsSinceEpoch(timestampDouble + 2000)); if(bitrate < this->minBitrate){ From 96ffb05a04fbba1891328a898abaaf1832a2c60c Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Thu, 13 Jun 2019 14:55:04 +0200 Subject: [PATCH 21/43] Working on avg bitrate line for graph. Avg bitrate data over time is now accessible for graph! --- Status/workerstatus.h | 10 +++++++++- recordwidget.cpp | 19 +++++++++++++------ recordwidget.ui | 7 +++++-- recordwidgetgraph.cpp | 32 ++++++++++++++++++++------------ recordwidgetgraph.h | 30 +++++++----------------------- 5 files changed, 54 insertions(+), 44 deletions(-) diff --git a/Status/workerstatus.h b/Status/workerstatus.h index 8d6cdb9..88897b1 100644 --- a/Status/workerstatus.h +++ b/Status/workerstatus.h @@ -32,6 +32,13 @@ class WorkerStatus : public QObject { return item; } + QTreeWidgetItem* makeItems(QString text, QVariant value, bool parent = false) { + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0, QStringList(text)); + item->setData(0, Qt::UserRole, value); + item->setDisabled(!parent); + return item; + } + void makeTsError(QTreeWidgetItem *parent, quint64 count, TsErrors::ErrorType error) { QTreeWidgetItem *item = new QTreeWidgetItem( (QTreeWidget*)0, @@ -83,7 +90,8 @@ class WorkerStatus : public QObject { tree->addTopLevelItem(parent); parent->addChild(makeItem(QString(tr("size %1 MB")).arg(QString::number(info.bytes/1000000.0, 'f', 2)))); parent->addChild(makeItem(QString(tr("duration %1")).arg(QDateTime::fromTime_t(info.currentTime/1000).toUTC().toString("HH:mm:ss")))); - parent->addChild(makeItem(QString(tr("avg bitrate %1 Mbit/s")).arg(QString::number((info.bytes*8*1000.0/info.currentTime)/1000000.0, 'f', 2)))); + auto value = (info.bytes*8*1000.0/info.currentTime)/1000000.0; + parent->addChild(makeItems(QString(tr("avg bitrate %1 Mbit/s")).arg(QString::number(value, 'f', 2)), value)); //Allows avg bitrate to be accessed in other places such as recordwidget parent->addChild(makeItem(QString(tr("protocol %1")).arg(info.protocolName()))); parent->addChild(makeItem(QString(tr("bitrate mode %1")).arg(info.bitrateModeName()))); parent->addChild(makeItem(QString(tr("%1 TS/IP")).arg(info.tsPerIp))); diff --git a/recordwidget.cpp b/recordwidget.cpp index c065b4e..f012508 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -103,6 +103,12 @@ void RecordWidget::recordingStarted() { ui->recordInterfaceSelect->setEnabled(false); this->setupGraph(); + if(ui->bitrateBtn->isChecked()){ + this->graph.setYAxisTitle("Bitrate mbps"); + } else{ + this->graph.setYAxisTitle("Std IAT dev µs/sec"); + } + @@ -115,6 +121,10 @@ void RecordWidget::recordStatusChanged(FinalStatus status) { void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { status.insertIntoTree(ui->treeWidget); + auto item = ui->treeWidget->topLevelItem(0)->child(2); + auto itemData = item->QTreeWidgetItem::data(0, Qt::UserRole); + bool success; + double qp = itemData.toLongLong(&success); } void RecordWidget::recordingFinished() { @@ -215,13 +225,10 @@ bool RecordWidget::startPcapRecord(WorkerConfiguration::WorkerMode mode) { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, this, &RecordWidget::recordStatusChanged); - if(ui->bitrateBtn->isChecked()){ - connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); - - } else if(ui->iatDevBtn->isChecked()){ - + if(ui->iatDevBtn->isChecked()){ connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::iatStatus, &graph, &RecordWidgetGraph::setBitrate); - + } else { + connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); } connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); diff --git a/recordwidget.ui b/recordwidget.ui index cadcc28..ef56f9f 100644 --- a/recordwidget.ui +++ b/recordwidget.ui @@ -22,6 +22,9 @@ 0 + + Qt::StrongFocus + Record @@ -150,7 +153,7 @@ - Qt::NoFocus + Qt::ClickFocus @@ -262,7 +265,7 @@ true - Qt::StrongFocus + Qt::NoFocus diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index dfdacc3..8720de3 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -2,7 +2,6 @@ #include "chart.h" #include -#include #include #include @@ -25,12 +24,15 @@ RecordWidgetGraph::RecordWidgetGraph( QWidget *parent): QChart* RecordWidgetGraph::setupGraph(){ lineSeries = new QLineSeries(); + avgSeries = new QLineSeries(); + // Create chart, add data, hide legend, and add axis Chart * chart = new Chart(); chart->legend()->hide(); chart->addSeries(lineSeries); + chart->addSeries(avgSeries); chart->createDefaultAxes(); // Customize the title font @@ -38,7 +40,7 @@ QChart* RecordWidgetGraph::setupGraph(){ font.setPixelSize(3); chart->setTitleFont(font); chart->setTitleBrush(QBrush(Qt::black)); - // chart->setTitle("Bitrate per second mbps"); + chart->axisY()->setTitleText("Bitrate mbps"); // Change the line color and weight QPen pen(QRgb(0x000000)); @@ -46,19 +48,20 @@ QChart* RecordWidgetGraph::setupGraph(){ lineSeries->setPen(pen); this->setChart(chart); - // this->chart()->axisX()->setTitleText("Seconds"); this->chartCounter = 0; this->maxBitrate = 0; this->minBitrate = 5000; + this->zoomInt = 0; QDateTimeAxis *axisX = new QDateTimeAxis; - axisX->setFormat("m:s"); + axisX->setFormat("m:ss"); axisX->setTickCount(10); + axisX->setTitleText("Time m:s"); this->chart()->setAxisX(axisX, lineSeries); - lineSeries->attachAxis(axisX); + avgSeries->attachAxis(axisX); @@ -70,20 +73,23 @@ QChart* RecordWidgetGraph::setupGraph(){ +void RecordWidgetGraph::setYAxisTitle(QString title){ + chart()->axisY()->setTitleText(title); +} + + void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ // Appends new values and updates graph if(bitrate != 0){ - - double timestampDouble = (double) duration; - // double bitrateDouble = (double) bitrate /1000000; - - lineSeries->append(timestampDouble, bitrate); + this->durations = duration; + lineSeries->append(duration, bitrate); + avgSeries->append(duration, 7); - this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(timestampDouble - 20000), QDateTime::fromMSecsSinceEpoch(timestampDouble + 2000)); + this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(duration - 20000), QDateTime::fromMSecsSinceEpoch(duration + 2000)); if(bitrate < this->minBitrate){ @@ -140,7 +146,9 @@ void RecordWidgetGraph::keyPressEvent(QKeyEvent *event) chart()->zoomIn(); break; case Qt::Key_Minus: - chart()->zoomOut(); + this->zoomInt += 10000; + this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch((durations - 20000) - zoomInt), QDateTime::fromMSecsSinceEpoch(durations + 2000)); + this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); break; case Qt::Key_Left: diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index e0f6fa6..429ab62 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -4,31 +4,13 @@ #include #include "mainwindow.h" -#include #include "recordwidget.h" -#include "ui_recordwidget.h" #include "Middleware/analyzerpcapmiddleware.h" -#include - -// Manages the applications main settings like -// widget initialization -#include - -// The main window to which you add toolbars, -// menubars, widgets and status bar -#include - -// Widget used to display charts #include - -// Used to create a line chart +#include #include - -// Used to change names on axis -#include - #include #include @@ -44,7 +26,7 @@ class RecordWidgetGraph : public QChartView RecordWidgetGraph(QWidget *parent); QChart GraphChart; - qint64 chartCounter; + qint16 chartCounter; double maxBitrate; double minBitrate; QChart* setupGraph(); @@ -62,19 +44,21 @@ class RecordWidgetGraph : public QChartView public slots: void setBitrate (double bitrate, qint64 duration); + void setYAxisTitle(QString title); + private: - QElapsedTimer bitrateTimer; - qint64 scrollCounter = 0; + quint32 zoomInt; + qint64 durations; qint64 currentBitrate; qint64 bitrateTimestamp; QLineSeries *lineSeries; + QLineSeries *avgSeries; QPointF m_lastMousePos; bool m_isTouching; bool isScrolling = false; - bool scrollCountIsSet =false; }; #endif // RECORDWIDGETGRAPH_H From 674b68f864c67a19cfee3e539ba73b4e96c4f047 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Fri, 14 Jun 2019 14:55:08 +0200 Subject: [PATCH 22/43] Changed graph data selection. --- recordwidget.cpp | 15 +- recordwidget.ui | 374 ++++++++++++++++++------------------------ recordwidgetgraph.cpp | 35 ++-- recordwidgetgraph.h | 3 + 4 files changed, 192 insertions(+), 235 deletions(-) diff --git a/recordwidget.cpp b/recordwidget.cpp index f012508..b0df73e 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -103,7 +103,7 @@ void RecordWidget::recordingStarted() { ui->recordInterfaceSelect->setEnabled(false); this->setupGraph(); - if(ui->bitrateBtn->isChecked()){ + if(ui->graphDataBox->currentText()== "Bitrate"){ this->graph.setYAxisTitle("Bitrate mbps"); } else{ this->graph.setYAxisTitle("Std IAT dev µs/sec"); @@ -123,8 +123,8 @@ void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { status.insertIntoTree(ui->treeWidget); auto item = ui->treeWidget->topLevelItem(0)->child(2); auto itemData = item->QTreeWidgetItem::data(0, Qt::UserRole); - bool success; - double qp = itemData.toLongLong(&success); + double avgBit = itemData.toDouble(); + this->graph.setAvgBitrate(avgBit); } void RecordWidget::recordingFinished() { @@ -225,7 +225,7 @@ bool RecordWidget::startPcapRecord(WorkerConfiguration::WorkerMode mode) { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, this, &RecordWidget::recordStatusChanged); - if(ui->iatDevBtn->isChecked()){ + if(ui->graphDataBox->currentText()!= "Bitrate"){ connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::iatStatus, &graph, &RecordWidgetGraph::setBitrate); } else { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); @@ -280,14 +280,9 @@ void RecordWidget::on_recordExpandPCAPFilterButton_toggled(bool checked) void RecordWidget::setGraphData(){ - if(ui->bitrateBtn->isChecked()){ + if(ui->graphDataBox->currentText()== "Bitrate"){ connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); - } else if (ui->iatDevBtn->isChecked()){ - - } else if(ui->pidBtn->isChecked()){ - } - } diff --git a/recordwidget.ui b/recordwidget.ui index ef56f9f..d8fd76a 100644 --- a/recordwidget.ui +++ b/recordwidget.ui @@ -7,7 +7,7 @@ 0 0 644 - 1092 + 1098 @@ -34,8 +34,130 @@ Settings - - + + + + + + 0 + + + + + PCAP filter + + + + + + + + 3 + 0 + + + + + 16777215 + 16777215 + + + + Qt::ClickFocus + + + + + + + + + + + 0 + 700 + + + + true + + + Qt::NoFocus + + + + + + + 0 + + + + + Save to file (.ts or .pcap) + + + + + + + + + Qt::NoFocus + + + true + + + + + + + Qt::ClickFocus + + + Browse... + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::NoFocus + + + Start recording + + + + + + + 0 + + + + + + + 0 @@ -52,7 +174,7 @@ - + @@ -118,228 +240,56 @@ - - - - border: none - - - Advanced - - - true - - - Qt::ToolButtonTextBesideIcon - - - Qt::RightArrow - - - - - - - - 0 - - - - - PCAP filter - - - - - - - Qt::ClickFocus - - - - - - - - 405 - 37 - - - - - - - - - - - border-color: qlineargradient(spread:pad, x1:0, y1:1, x2:1, y2:0, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255)); - - - Graph Data - - - - - 0 - 20 - 466 - 30 - - - - - 0 - 10 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - 70 - 0 - 112 - 16 - - - - Qt::NoFocus - - - Bitrate - - - - - - 160 - 0 - 112 - 16 - - - - Qt::NoFocus - - - Std IAT de&v - - - - - - 280 - 0 - 112 - 16 - - - - Qt::NoFocus - - - PIDS - - - - - - - - - - - - - 0 - 700 - - - - true - - - Qt::NoFocus - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - 0 - + + - + + + + 120 + 50 + + + + border: none + + + Advanced + + + true + + + Qt::ToolButtonTextBesideIcon + + + Qt::RightArrow + + - - - - - - 0 - - - + + - Save to file (.ts or .pcap) + Graph data - + - - - Qt::NoFocus - - - true - - + + Bitrate + - - - Qt::ClickFocus - - - Browse... - - + + IAT deviation + - + - - - - Qt::NoFocus - - - Start recording - - - diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 8720de3..483ca45 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -13,6 +13,7 @@ RecordWidgetGraph::RecordWidgetGraph( QWidget *parent): { setDragMode(QGraphicsView::NoDrag); this->setMouseTracking(true); + this->setRubberBand(QChartView::RectangleRubberBand); } @@ -25,21 +26,20 @@ QChart* RecordWidgetGraph::setupGraph(){ lineSeries = new QLineSeries(); avgSeries = new QLineSeries(); + avgSeries->setName("Avg bitrate"); + lineSeries->setName("Bitrate"); + - // Create chart, add data, hide legend, and add axis + // Create chart and add axis Chart * chart = new Chart(); - chart->legend()->hide(); + // chart->legend()->hide(); chart->addSeries(lineSeries); chart->addSeries(avgSeries); chart->createDefaultAxes(); - // Customize the title font - QFont font; - font.setPixelSize(3); - chart->setTitleFont(font); - chart->setTitleBrush(QBrush(Qt::black)); + chart->axisY()->setTitleText("Bitrate mbps"); // Change the line color and weight @@ -53,6 +53,7 @@ QChart* RecordWidgetGraph::setupGraph(){ this->maxBitrate = 0; this->minBitrate = 5000; this->zoomInt = 0; + this->avgBitrate = 0; @@ -63,18 +64,23 @@ QChart* RecordWidgetGraph::setupGraph(){ this->chart()->setAxisX(axisX, lineSeries); avgSeries->attachAxis(axisX); - - - return(chart); - - } void RecordWidgetGraph::setYAxisTitle(QString title){ chart()->axisY()->setTitleText(title); + + if(title.contains("Std")){ + lineSeries->setName("IAT dev"); + chart()->removeSeries(avgSeries); + } + +} + +void RecordWidgetGraph::setAvgBitrate(double avgBitrate){ + this->avgBitrate = avgBitrate; } @@ -86,7 +92,10 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ if(bitrate != 0){ this->durations = duration; lineSeries->append(duration, bitrate); - avgSeries->append(duration, 7); + + if(avgBitrate != 0){ + avgSeries->append(duration, avgBitrate); + } this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(duration - 20000), QDateTime::fromMSecsSinceEpoch(duration + 2000)); diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 429ab62..6997898 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -31,6 +31,7 @@ class RecordWidgetGraph : public QChartView double minBitrate; QChart* setupGraph(); + void setAvgBitrate(double avgBitrate); void keyPressEvent(QKeyEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); @@ -42,6 +43,7 @@ class RecordWidgetGraph : public QChartView protected: + public slots: void setBitrate (double bitrate, qint64 duration); void setYAxisTitle(QString title); @@ -51,6 +53,7 @@ public slots: private: quint32 zoomInt; + double avgBitrate; qint64 durations; qint64 currentBitrate; qint64 bitrateTimestamp; From 83f97cf130bc925fb1030f1a52122b561ec5f84a Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Mon, 17 Jun 2019 13:38:59 +0200 Subject: [PATCH 23/43] Graph now working for ts files as well --- Middleware/analyzerpcapmiddleware.cpp | 6 +++++- Recorder/tsnetworkfilerecorder.cpp | 12 +++++++++++- Recorder/tsnetworkfilerecorder.h | 4 +++- Status/workerstatus.h | 6 +++--- recordwidget.cpp | 21 +++++++++------------ recordwidget.h | 1 - recordwidgetgraph.cpp | 20 +++++++------------- 7 files changed, 38 insertions(+), 32 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index 86ef321..1c5b475 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -166,7 +166,11 @@ void AnalyzerPcapMiddleware::bufferProducts() { if (statusTimer.elapsed() >= 200) { emit status(AnalyzerStatus(Status::STATUS_PERIODIC, bytes, duration, bitrate, duration, pidMap, tsErrors, proto, tsPerIp)); - emit bitrateStatus((double) bitrate /1000000, duration ); + if(bitrate / 1000000 >!100){ + emit bitrateStatus((double) bitrate /1000000, duration ); + + } + // emit bitrateStatus((double) bitrate /1000000, duration ); emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams)); statusTimer.restart(); } diff --git a/Recorder/tsnetworkfilerecorder.cpp b/Recorder/tsnetworkfilerecorder.cpp index 77b697e..e77a459 100644 --- a/Recorder/tsnetworkfilerecorder.cpp +++ b/Recorder/tsnetworkfilerecorder.cpp @@ -21,6 +21,8 @@ void TsNetworkFileRecorder::start() { connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::workerStatus, this, &TsNetworkFileRecorder::joinStreamInfo); connect(&networkJitter, &NetworkJitter::workerStatus, this, &TsNetworkFileRecorder::joinStreamInfo); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::bitrateStatus, this, &TsNetworkFileRecorder::gotBitrate); + connect(&networkJitter, &NetworkJitter::iatStatus, this, &TsNetworkFileRecorder::gotIatDev); + @@ -94,12 +96,20 @@ void TsNetworkFileRecorder::gotConsumerStatus(Status cStatus) { } } -void TsNetworkFileRecorder::gotBitrate(qint64 bitrate, qint64 duration){ +void TsNetworkFileRecorder::gotBitrate(double bitrate, qint64 duration){ emit bitrateStatus(bitrate, duration); } +void TsNetworkFileRecorder::gotIatDev(double iatDev, qint64 duration){ + + emit iatStatus(iatDev, duration); +} + + + + // Only emit finished when all modules are finished void TsNetworkFileRecorder::moduleFinished() { diff --git a/Recorder/tsnetworkfilerecorder.h b/Recorder/tsnetworkfilerecorder.h index 95f5b5d..9f36777 100644 --- a/Recorder/tsnetworkfilerecorder.h +++ b/Recorder/tsnetworkfilerecorder.h @@ -37,7 +37,9 @@ private slots: void gotConsumerStatus(Status cStatus); void moduleFinished(); void joinStreamInfo(WorkerStatus dStatus); - void gotBitrate(qint64 bitrate, qint64 duration); + void gotBitrate(double bitrate, qint64 duration); + void gotIatDev(double iatDev, qint64 duration); + }; diff --git a/Status/workerstatus.h b/Status/workerstatus.h index 88897b1..78a3340 100644 --- a/Status/workerstatus.h +++ b/Status/workerstatus.h @@ -81,7 +81,7 @@ class WorkerStatus : public QObject { void insertIntoTree(QTreeWidget *tree) { tree->clear(); - //tree->setSelectionMode(QAbstractItemView::SingleSelection); + tree->setSelectionMode(QAbstractItemView::SingleSelection); for (int i = 0; i < streams.count(); i++) { quint64 key = streams.keys().at(i); const StreamInfo &info = streams.value(key); @@ -95,9 +95,9 @@ class WorkerStatus : public QObject { parent->addChild(makeItem(QString(tr("protocol %1")).arg(info.protocolName()))); parent->addChild(makeItem(QString(tr("bitrate mode %1")).arg(info.bitrateModeName()))); parent->addChild(makeItem(QString(tr("%1 TS/IP")).arg(info.tsPerIp))); - if(info.networkJitters != 0){ + // if(info.networkJitters != 0){ parent->addChild(makeItem(QString(tr("%1 µs IAT deviation ")).arg(info.networkJitters))); - } + // } parent->addChild(makeItem(QString(tr("%1 PIDs")).arg(info.pidMap.size()))); quint64 tsErrCount = info.tsErrors.totalErrors(); diff --git a/recordwidget.cpp b/recordwidget.cpp index b0df73e..87de445 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -101,6 +101,7 @@ void RecordWidget::recordingStarted() { ui->recordExpandPCAPFilterButton->setEnabled(false); ui->recordPcapFilterContainer->setEnabled(false); ui->recordInterfaceSelect->setEnabled(false); + ui->graphDataBox->setEnabled(false); this->setupGraph(); if(ui->graphDataBox->currentText()== "Bitrate"){ @@ -138,6 +139,7 @@ void RecordWidget::recordingFinished() { ui->recordExpandPCAPFilterButton->setEnabled(true); ui->recordPcapFilterContainer->setEnabled(true); ui->recordInterfaceSelect->setEnabled(true); + ui->graphDataBox->setEnabled(true); @@ -257,7 +259,13 @@ bool RecordWidget::startTsRecord(WorkerConfiguration::WorkerMode mode) { connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::started, this, &RecordWidget::recordingStarted); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::status, this, &RecordWidget::recordStatusChanged); - connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); + if(ui->graphDataBox->currentText()!= "Bitrate"){ + connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::iatStatus, &graph, &RecordWidgetGraph::setBitrate); + + } else { + connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); + + } connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); ui->recordStartStopBtn->setEnabled(false); @@ -277,21 +285,10 @@ void RecordWidget::on_recordExpandPCAPFilterButton_toggled(bool checked) } } - -void RecordWidget::setGraphData(){ - - if(ui->graphDataBox->currentText()== "Bitrate"){ - connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); - } -} - - void RecordWidget::setupGraph(){ - // graph.setParent(this); graph.setupGraph(); ui->graphView->setChart(graph.chart()); ui->graphView->setRenderHint(QPainter::Antialiasing); - ui->graphView->show(); } void RecordWidget::on_recordFileFormatPCAP_toggled(bool checked) diff --git a/recordwidget.h b/recordwidget.h index 6027d09..5e071d1 100644 --- a/recordwidget.h +++ b/recordwidget.h @@ -56,7 +56,6 @@ private slots: void on_recordFileFormatPCAP_toggled(bool); void on_recordOpenFileDialog_clicked(); void on_recordStartStopBtn_clicked(); - void setGraphData(); void on_treeWidget_activated(const QModelIndex &index); diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 483ca45..9a2224e 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -29,17 +29,14 @@ QChart* RecordWidgetGraph::setupGraph(){ avgSeries->setName("Avg bitrate"); lineSeries->setName("Bitrate"); - - // Create chart and add axis Chart * chart = new Chart(); - // chart->legend()->hide(); + // chart->legend()->hide(); chart->addSeries(lineSeries); chart->addSeries(avgSeries); chart->createDefaultAxes(); - chart->axisY()->setTitleText("Bitrate mbps"); // Change the line color and weight @@ -55,14 +52,12 @@ QChart* RecordWidgetGraph::setupGraph(){ this->zoomInt = 0; this->avgBitrate = 0; - - - QDateTimeAxis *axisX = new QDateTimeAxis; - axisX->setFormat("m:ss"); - axisX->setTickCount(10); - axisX->setTitleText("Time m:s"); - this->chart()->setAxisX(axisX, lineSeries); - avgSeries->attachAxis(axisX); + QDateTimeAxis *axisX = new QDateTimeAxis; + axisX->setFormat("m:ss"); + axisX->setTickCount(10); + axisX->setTitleText("Time m:s"); + this->chart()->setAxisX(axisX, lineSeries); + avgSeries->attachAxis(axisX); return(chart); } @@ -97,7 +92,6 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ avgSeries->append(duration, avgBitrate); } - this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(duration - 20000), QDateTime::fromMSecsSinceEpoch(duration + 2000)); From c489eb8ba46152235a06a01b9ca67edd96e847bc Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 19 Jun 2019 10:54:28 +0200 Subject: [PATCH 24/43] Std iat deviation now kind of works for multiple stream only problem is it only updates it for one stream at a time. --- IPTVUtils.pro | 6 ++++-- Middleware/analyzerpcapmiddleware.cpp | 12 +++++------ Middleware/networkjitter.cpp | 11 ++-------- Middleware/networkjitter.h | 1 + Middleware/pcapmiddleware.h | 2 +- Recorder/networkpcapfilerecorder.cpp | 30 ++++++++++++++++----------- Recorder/networkpcapfilerecorder.h | 6 +++++- Recorder/tsnetworkfilerecorder.cpp | 24 ++++++++++----------- Recorder/tsnetworkfilerecorder.h | 2 +- Status/streaminfo.h | 6 +++--- Status/workerstatus.h | 6 +++--- recordtxtprinter.cpp | 20 ++++++++++++++++++ recordtxtprinter.h | 16 ++++++++++++++ recordwidget.cpp | 5 +---- recordwidget.h | 3 ++- recordwidget.ui | 2 +- 16 files changed, 95 insertions(+), 57 deletions(-) create mode 100644 recordtxtprinter.cpp create mode 100644 recordtxtprinter.h diff --git a/IPTVUtils.pro b/IPTVUtils.pro index 85b5b92..0dc5d0e 100644 --- a/IPTVUtils.pro +++ b/IPTVUtils.pro @@ -65,7 +65,8 @@ SOURCES += \ convertwidget.cpp \ Middleware/networkjitter.cpp \ recordwidgetgraph.cpp \ - chart.cpp + chart.cpp \ + recordtxtprinter.cpp HEADERS += \ mainwindow.h \ @@ -117,7 +118,8 @@ HEADERS += \ Status/workerstatus.h \ Middleware/networkjitter.h \ recordwidgetgraph.h \ - chart.h + chart.h \ + recordtxtprinter.h FORMS += \ mainwindow.ui \ diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index 1c5b475..9fd0250 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -79,9 +79,6 @@ void AnalyzerPcapMiddleware::bufferProducts() { bitrate = (bytes - lastSecondBytes)*8*1000/(duration - lastDuration); lastSecondBytes = bytes; lastDuration = duration; - - - } } @@ -164,14 +161,15 @@ void AnalyzerPcapMiddleware::bufferProducts() { } - if (statusTimer.elapsed() >= 200) { + if (statusTimer.elapsed() >= 1000) { emit status(AnalyzerStatus(Status::STATUS_PERIODIC, bytes, duration, bitrate, duration, pidMap, tsErrors, proto, tsPerIp)); if(bitrate / 1000000 >!100){ emit bitrateStatus((double) bitrate /1000000, duration ); } // emit bitrateStatus((double) bitrate /1000000, duration ); - emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams)); + qInfo() << "bitrate" << (double) bitrate /1000000; + emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams), false); statusTimer.restart(); } @@ -182,12 +180,12 @@ void AnalyzerPcapMiddleware::bufferProducts() { qInfo("Analyzer done, processed %lli packets", packetNumber-1); emit status(AnalyzerStatus(Status::STATUS_FINISHED, bytes, duration, bitrate, duration, pidMap, tsErrors, proto, tsPerIp)); - emit workerStatus(WorkerStatus(WorkerStatus::STATUS_FINISHED, streams)); + emit workerStatus(WorkerStatus(WorkerStatus::STATUS_FINISHED, streams), false); if (input.type == PcapProduct::END && (config.getWorkerMode() == WorkerConfiguration::ANALYSIS_MODE_LIVE || config.getWorkerMode() == WorkerConfiguration::ANALYSIS_MODE_OFFLINE)) { - emit workerStatus(WorkerStatus(WorkerStatus::STATUS_ANALYZED_ENTIRE, streams)); + emit workerStatus(WorkerStatus(WorkerStatus::STATUS_ANALYZED_ENTIRE, streams), false); } } diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp index 2107505..eeb4ce0 100644 --- a/Middleware/networkjitter.cpp +++ b/Middleware/networkjitter.cpp @@ -44,17 +44,10 @@ void NetworkJitter::run(){ qint64 bytes = 0; PcapProduct input; - - - - PcapProduct previousInput = prevProvider->getProduct(); buffer.push(previousInput); - - - while (!stopping) { PacketParser parser((pcap_pkthdr*)input.header.data(), (const u_char*)input.data.data()); bytes += parser.data_len; @@ -118,11 +111,11 @@ void NetworkJitter::run(){ StreamInfo &stream = streams[streamId]; - stream.networkJitters = sqrt(finalSum); + stream.iatDeviation = sqrt(finalSum); emit iatStatus(sqrt(finalSum), duration); - emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams)); + emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams), true); diff --git a/Middleware/networkjitter.h b/Middleware/networkjitter.h index 976b176..f74c58a 100644 --- a/Middleware/networkjitter.h +++ b/Middleware/networkjitter.h @@ -21,6 +21,7 @@ class NetworkJitter : public PcapMiddleware qint64 duration; qint64 packetNumber; QHash streams; + bool signalType; public: NetworkJitter(WorkerConfiguration config) : diff --git a/Middleware/pcapmiddleware.h b/Middleware/pcapmiddleware.h index ca4abd0..7d465af 100644 --- a/Middleware/pcapmiddleware.h +++ b/Middleware/pcapmiddleware.h @@ -23,7 +23,7 @@ class PcapMiddleware : public QObject, public PcapProductProvider signals: void started(); void finished(); - void workerStatus(WorkerStatus status); + void workerStatus(WorkerStatus status, bool signalType); }; #endif // PCAPMIDDLEWARE_H diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index 0687685..f7914f7 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -1,5 +1,8 @@ #include "networkpcapfilerecorder.h" +#include +#include + void NetworkPcapFileRecorder::start() { finalStatus.setAnalysisMode(config.getWorkerMode()); producer.addNext(&analyzerMiddleware)->addNext(&networkJitter)->addNext(&consumer); @@ -51,33 +54,36 @@ void NetworkPcapFileRecorder::gotProducerStatus(Status pStatus) { } -// This function joins the signals coming in from NetworkJitter & AnalyzerPcapMiddleware and emits complete signal to be displayed in right-hand info panel -void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus xStatus) { - if (xStatus.getType() == WorkerStatus::STATUS_ERROR) { - stop(); - return; - } +void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus xStatus, bool isDeviationSignal) { + //Iterates hashmap for(auto iter = xStatus.getStreams().begin(); iter != xStatus.getStreams().end(); ++iter) { qint64 streamID = iter.key(); const StreamInfo &streamInfo= iter.value(); - if(streamInfo.networkJitters == 0 && streamInfo.bytes != 0){ + if(!isDeviationSignal){ previousAnalyzerStream.streams[streamID] = streamInfo; + qInfo("hej"); + } else if(isDeviationSignal){ + previousAnalyzerStream.streams[streamID].iatDeviation = streamInfo.iatDeviation; + qInfo() << "iatDev" << streamID << streamInfo.iatDeviation; + WorkerStatus completeSignal; - } else if(streamInfo.networkJitters != 0){ - WorkerStatus tempStatus; - tempStatus.setStreams(previousAnalyzerStream.streams); - tempStatus.streams[streamID].networkJitters = streamInfo.networkJitters; - emit workerStatus(tempStatus); + completeSignal.setStreams(previousAnalyzerStream.streams); + emit workerStatus(completeSignal); } } } + + + + + void NetworkPcapFileRecorder::gotAnalyzerStatus(AnalyzerStatus aStatus) { if (aStatus.getType() == Status::STATUS_ERROR) { finalStatus.setError(aStatus.getError()); diff --git a/Recorder/networkpcapfilerecorder.h b/Recorder/networkpcapfilerecorder.h index 0bdd7c2..381bbf2 100644 --- a/Recorder/networkpcapfilerecorder.h +++ b/Recorder/networkpcapfilerecorder.h @@ -19,6 +19,9 @@ class NetworkPcapFileRecorder : public Recorder AnalyzerPcapMiddleware analyzerMiddleware; public: + + + NetworkPcapFileRecorder(WorkerConfiguration config, QObject *parent = 0) : Recorder(config, parent), producer(config), @@ -26,6 +29,7 @@ class NetworkPcapFileRecorder : public Recorder networkJitter(config), analyzerMiddleware(config) { + } ~NetworkPcapFileRecorder() { printf("DESTRUCT\n"); } @@ -36,7 +40,7 @@ class NetworkPcapFileRecorder : public Recorder private slots: void gotProducerStatus(Status pStatus); void gotAnalyzerStatus(AnalyzerStatus aStatus); - void joinStreamInfo(WorkerStatus dStatus); + void joinStreamInfo(WorkerStatus dStatus, bool isDeviationSignal); void gotConsumerStatus(Status cStatus); void gotBitrate(double bitrate, qint64 duration); void gotIatDev(double iatDev, qint64 duration); diff --git a/Recorder/tsnetworkfilerecorder.cpp b/Recorder/tsnetworkfilerecorder.cpp index e77a459..ab4eafb 100644 --- a/Recorder/tsnetworkfilerecorder.cpp +++ b/Recorder/tsnetworkfilerecorder.cpp @@ -63,26 +63,26 @@ void TsNetworkFileRecorder::gotAnalyzerStatus(AnalyzerStatus aStatus) { } -void TsNetworkFileRecorder::joinStreamInfo(WorkerStatus xStatus) { - - if (xStatus.getType() == WorkerStatus::STATUS_ERROR) { - stop(); - return; - } +void TsNetworkFileRecorder::joinStreamInfo(WorkerStatus xStatus, bool isDeviationSignal) { + //Iterates hashmap for(auto iter = xStatus.getStreams().begin(); iter != xStatus.getStreams().end(); ++iter) { qint64 streamID = iter.key(); const StreamInfo &streamInfo= iter.value(); - if(streamInfo.networkJitters == 0 && streamInfo.bytes != 0){ + if(!isDeviationSignal){ previousAnalyzerStream.streams[streamID] = streamInfo; + qInfo("hej"); + } else if(isDeviationSignal){ + previousAnalyzerStream.streams[streamID].iatDeviation = streamInfo.iatDeviation; + qInfo("hejhejhejhejhej"); + quint32 test = streamInfo.iatDeviation; + qInfo() << streamID << test; + WorkerStatus completeSignal; - } else if(streamInfo.networkJitters != 0){ - WorkerStatus tempStatus; - tempStatus.setStreams(previousAnalyzerStream.streams); - tempStatus.streams[streamID].networkJitters = streamInfo.networkJitters; - emit workerStatus(tempStatus); + completeSignal.setStreams(previousAnalyzerStream.streams); + emit workerStatus(completeSignal); } } } diff --git a/Recorder/tsnetworkfilerecorder.h b/Recorder/tsnetworkfilerecorder.h index 9f36777..b6d00a7 100644 --- a/Recorder/tsnetworkfilerecorder.h +++ b/Recorder/tsnetworkfilerecorder.h @@ -36,7 +36,7 @@ private slots: void gotAnalyzerStatus(AnalyzerStatus aStatus); void gotConsumerStatus(Status cStatus); void moduleFinished(); - void joinStreamInfo(WorkerStatus dStatus); + void joinStreamInfo(WorkerStatus dStatus, bool signalType); void gotBitrate(double bitrate, qint64 duration); void gotIatDev(double iatDev, qint64 duration); diff --git a/Status/streaminfo.h b/Status/streaminfo.h index d7b686c..b057551 100644 --- a/Status/streaminfo.h +++ b/Status/streaminfo.h @@ -29,7 +29,7 @@ class StreamInfo { NetworkProtocol protocol; BitrateMode bitrateMode; quint8 tsPerIp; - quint64 networkJitters; + quint64 iatDeviation; TsErrors tsErrors; QMap pidMap; QString protocolName() const { @@ -63,7 +63,7 @@ class StreamInfo { protocol(NetworkProtocol::UNKNOWN), bitrateMode(BitrateMode::UNKNOWN), tsPerIp(0), - networkJitters(0), + iatDeviation(0), tsErrors() {} StreamInfo(StreamId id, quint64 bytes, @@ -77,7 +77,7 @@ class StreamInfo { bitrate(bitrate), protocol(protocol), tsPerIp(tsPerIp), - networkJitters(networkJitters), + iatDeviation(networkJitters), tsErrors(tsErrors) {} }; diff --git a/Status/workerstatus.h b/Status/workerstatus.h index 78a3340..89678a2 100644 --- a/Status/workerstatus.h +++ b/Status/workerstatus.h @@ -95,9 +95,9 @@ class WorkerStatus : public QObject { parent->addChild(makeItem(QString(tr("protocol %1")).arg(info.protocolName()))); parent->addChild(makeItem(QString(tr("bitrate mode %1")).arg(info.bitrateModeName()))); parent->addChild(makeItem(QString(tr("%1 TS/IP")).arg(info.tsPerIp))); - // if(info.networkJitters != 0){ - parent->addChild(makeItem(QString(tr("%1 µs IAT deviation ")).arg(info.networkJitters))); - // } + // if(info.networkJitters != 0){ + parent->addChild(makeItem(QString(tr("%1 µs IAT deviation ")).arg(info.iatDeviation))); + // } parent->addChild(makeItem(QString(tr("%1 PIDs")).arg(info.pidMap.size()))); quint64 tsErrCount = info.tsErrors.totalErrors(); diff --git a/recordtxtprinter.cpp b/recordtxtprinter.cpp new file mode 100644 index 0000000..d995d25 --- /dev/null +++ b/recordtxtprinter.cpp @@ -0,0 +1,20 @@ +#include "recordtxtprinter.h" +#include +#include + +RecordTxtPrinter::RecordTxtPrinter() +{ + +} + + + +void RecordTxtPrinter::printToFile(QString text){ + QString filename="/home/marko.marinkovic/Documents/Data.txt"; + QFile file( filename ); + if ( file.open(QIODevice::ReadWrite) ) + { + QTextStream stream( &file ); + stream << text << endl; + } +} diff --git a/recordtxtprinter.h b/recordtxtprinter.h new file mode 100644 index 0000000..e5d4ee3 --- /dev/null +++ b/recordtxtprinter.h @@ -0,0 +1,16 @@ +#ifndef RECORDTXTPRINTER_H +#define RECORDTXTPRINTER_H +#include + + +class RecordTxtPrinter +{ +public: + RecordTxtPrinter(); + void printToFile(QString text); + + +protected: +}; + +#endif // RECORDTXTPRINTER_H diff --git a/recordwidget.cpp b/recordwidget.cpp index 87de445..3d96ea1 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -140,10 +140,7 @@ void RecordWidget::recordingFinished() { ui->recordPcapFilterContainer->setEnabled(true); ui->recordInterfaceSelect->setEnabled(true); ui->graphDataBox->setEnabled(true); - - - - + printer.printToFile("hallå"); networkPcapFileRecorder = NULL; tsNetworkFileRecorder = NULL; diff --git a/recordwidget.h b/recordwidget.h index 5e071d1..7c44f38 100644 --- a/recordwidget.h +++ b/recordwidget.h @@ -7,6 +7,7 @@ #include #include "Status/streaminfo.h" #include "recordwidgetgraph.h" +#include "recordtxtprinter.h" @@ -36,7 +37,7 @@ class RecordWidget : public QWidget bool started; QString currentDirectory; QString currentFilename; - + RecordTxtPrinter printer; private slots: void recordingStarted(); void recordingFinished(); diff --git a/recordwidget.ui b/recordwidget.ui index d8fd76a..f498e34 100644 --- a/recordwidget.ui +++ b/recordwidget.ui @@ -310,7 +310,7 @@ - Qt::NoFocus + Qt::ClickFocus QTreeView::branch:has-siblings:!adjoins-item { From 51451500aecd6aef32296ddb951f4d773c2cc2fd Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Thu, 20 Jun 2019 13:37:06 +0200 Subject: [PATCH 25/43] You can now select in QTreeWidget, sigsev faults occuring randomly and inconsistently. --- Middleware/analyzerpcapmiddleware.cpp | 2 +- Recorder/networkpcapfilerecorder.cpp | 1 + Status/workerstatus.h | 38 ++++++++++++++++++++++++++- recordwidget.cpp | 14 +++++++++- recordwidget.h | 1 + 5 files changed, 53 insertions(+), 3 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index 9fd0250..dc8e7e7 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -161,7 +161,7 @@ void AnalyzerPcapMiddleware::bufferProducts() { } - if (statusTimer.elapsed() >= 1000) { + if (statusTimer.elapsed() >= 200) { emit status(AnalyzerStatus(Status::STATUS_PERIODIC, bytes, duration, bitrate, duration, pidMap, tsErrors, proto, tsPerIp)); if(bitrate / 1000000 >!100){ emit bitrateStatus((double) bitrate /1000000, duration ); diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index f7914f7..bfae310 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -68,6 +68,7 @@ void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus xStatus, bool isDeviat } else if(isDeviationSignal){ previousAnalyzerStream.streams[streamID].iatDeviation = streamInfo.iatDeviation; + qInfo("hejhejhejhejhej"); qInfo() << "iatDev" << streamID << streamInfo.iatDeviation; WorkerStatus completeSignal; diff --git a/Status/workerstatus.h b/Status/workerstatus.h index 89678a2..b20f613 100644 --- a/Status/workerstatus.h +++ b/Status/workerstatus.h @@ -53,6 +53,8 @@ class WorkerStatus : public QObject { public: + double value; + QTreeWidget *treeWidget; WorkerStatus() : QObject() {} WorkerStatus(StatusType type) : QObject(), type(type) {} WorkerStatus(QString error) : QObject(), type(STATUS_ERROR), error(error) {} @@ -79,6 +81,39 @@ class WorkerStatus : public QObject { } + // New method that is meant to update the values in the tree rather than recreate the tree every iteration. + double updateTree(QTreeWidget *tree){ + + quint8 y = 0; + + + double value = 0; + + for (int i = 0; i < streams.count(); i++){ + quint64 key = streams.keys().at(i); + const StreamInfo &info = streams.value(key); + + + tree->topLevelItem(i)->child(y++)->setText(0, QString(tr("size %1 MB")).arg(QString::number(info.bytes/1000000.0, 'f', 2))); + tree->topLevelItem(i)->child(y++)->setText(0, QString(tr("duration %1")).arg(QDateTime::fromTime_t(info.currentTime/1000).toUTC().toString("HH:mm:ss"))); + value = (info.bytes*8*1000.0/info.currentTime)/1000000.0; + tree->topLevelItem(i)->child(y++)->setText(0,QString((tr("avg bitrate %1 Mbit/s")).arg(QString::number(value, 'f', 2)))); + tree->topLevelItem(i)->child(y++)->setText(0,QString(tr("protocol %1")).arg(info.protocolName())); + tree->topLevelItem(i)->child(y++)->setText(0, (QString(tr("bitrate mode %1")).arg(info.bitrateModeName()))); + tree->topLevelItem(i)->child(y++)->setText(0, QString(tr("%1 TS/IP")).arg(info.tsPerIp)); + tree->topLevelItem(i)->child(y++)->setText(0, QString(tr("%1 µs IAT deviation ")).arg(info.iatDeviation)); + tree->topLevelItem(i)->child(y++)->setText(0, QString(tr("%1 PIDs")).arg(info.pidMap.size())); + y= 0; + } + return value; + + } + + + + + + // Keeping this method as the initial tree creator void insertIntoTree(QTreeWidget *tree) { tree->clear(); tree->setSelectionMode(QAbstractItemView::SingleSelection); @@ -88,6 +123,7 @@ class WorkerStatus : public QObject { QTreeWidgetItem* parent = makeItem(StreamId::calcName(key), true); tree->addTopLevelItem(parent); + parent->addChild(makeItem(QString(tr("size %1 MB")).arg(QString::number(info.bytes/1000000.0, 'f', 2)))); parent->addChild(makeItem(QString(tr("duration %1")).arg(QDateTime::fromTime_t(info.currentTime/1000).toUTC().toString("HH:mm:ss")))); auto value = (info.bytes*8*1000.0/info.currentTime)/1000000.0; @@ -111,7 +147,7 @@ class WorkerStatus : public QObject { } parent->setExpanded(true); - + // this->treeWidget = tree; tree->clearSelection(); parent->setSelected(true); } diff --git a/recordwidget.cpp b/recordwidget.cpp index 3d96ea1..6ca62ec 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -20,6 +20,7 @@ RecordWidget::RecordWidget(QWidget *parent) : ui->setupUi(this); this->setupGraph(); this->setMouseTracking(true); + treeWidgetCounter = 0; // Advanced PCAP filter @@ -121,11 +122,23 @@ void RecordWidget::recordStatusChanged(FinalStatus status) { } void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { + + if(treeWidgetCounter == 0){ + status.insertIntoTree(ui->treeWidget); + treeWidgetCounter++; + } else { + double avgBit = status.updateTree(ui->treeWidget); + this->graph.setAvgBitrate(avgBit); + } + + /* status.insertIntoTree(ui->treeWidget); + auto item = ui->treeWidget->topLevelItem(0)->child(2); auto itemData = item->QTreeWidgetItem::data(0, Qt::UserRole); double avgBit = itemData.toDouble(); this->graph.setAvgBitrate(avgBit); + */ } void RecordWidget::recordingFinished() { @@ -140,7 +153,6 @@ void RecordWidget::recordingFinished() { ui->recordPcapFilterContainer->setEnabled(true); ui->recordInterfaceSelect->setEnabled(true); ui->graphDataBox->setEnabled(true); - printer.printToFile("hallå"); networkPcapFileRecorder = NULL; tsNetworkFileRecorder = NULL; diff --git a/recordwidget.h b/recordwidget.h index 7c44f38..797d0eb 100644 --- a/recordwidget.h +++ b/recordwidget.h @@ -37,6 +37,7 @@ class RecordWidget : public QWidget bool started; QString currentDirectory; QString currentFilename; + quint8 treeWidgetCounter; RecordTxtPrinter printer; private slots: void recordingStarted(); From f9e7ad2d2150dc440547e57448b1b003b29f4514 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Tue, 25 Jun 2019 15:13:59 +0200 Subject: [PATCH 26/43] You can now choose which stream to display in graph, crashes need to be fixed. --- Middleware/analyzerpcapmiddleware.cpp | 22 +++++---- Middleware/networkjitter.cpp | 2 +- Recorder/networkpcapfilerecorder.cpp | 7 +-- Recorder/tsnetworkfilerecorder.cpp | 4 +- Status/streaminfo.h | 6 +++ Status/workerstatus.h | 5 +- recordwidget.cpp | 69 ++++++++++++++++++++++----- recordwidget.h | 9 ++++ recordwidgetgraph.cpp | 2 +- 9 files changed, 95 insertions(+), 31 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index dc8e7e7..13062c5 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -85,7 +85,6 @@ void AnalyzerPcapMiddleware::bufferProducts() { // sanity check, prevents analyzation of packets that do not contain ts-packets if (parser.data_len % 188 == 0 && parser.ih->proto == 17 && parser.data_len != 0) { - tsPerIp = parser.data_len/188; // For now, assume the only existing protocols @@ -111,13 +110,14 @@ void AnalyzerPcapMiddleware::bufferProducts() { else stream.bitrateMode = StreamInfo::BitrateMode::VBR; - stream.id = StreamId(streamId); - stream.bytes += parser.data_len; - stream.tsPerIp = tsPerIp; - stream.currentTime = duration; - - tsAnalyzer.setStream(&stream.tsErrors, &stream.pidMap); + //if (duration - stream.lastDuration >= 200) + stream.id = StreamId(streamId); + stream.bytes += parser.data_len; + stream.tsPerIp = tsPerIp; + stream.currentTime = duration; + tsAnalyzer.setStream(&stream.tsErrors, &stream.pidMap); + // } // Analyze every TsPacket for (quint8 i = 0; i < tsPerIp; i++) { tsParser.parse((quint8*)(parser.data+i*188)); @@ -162,12 +162,18 @@ void AnalyzerPcapMiddleware::bufferProducts() { if (statusTimer.elapsed() >= 200) { + for (auto &stream : streams) { + stream.avgBitrate = ((double)stream.bytes*8*1000.0/stream.currentTime) /1000000.0; + stream.currentBitrate = (double)(stream.bytes - stream.lastSecondBytes)*8*1000/(duration - stream.lastDuration) / 1000000; + stream.lastSecondBytes = stream.bytes; + stream.lastDuration = duration; + } + emit status(AnalyzerStatus(Status::STATUS_PERIODIC, bytes, duration, bitrate, duration, pidMap, tsErrors, proto, tsPerIp)); if(bitrate / 1000000 >!100){ emit bitrateStatus((double) bitrate /1000000, duration ); } - // emit bitrateStatus((double) bitrate /1000000, duration ); qInfo() << "bitrate" << (double) bitrate /1000000; emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams), false); statusTimer.restart(); diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp index eeb4ce0..d512dc6 100644 --- a/Middleware/networkjitter.cpp +++ b/Middleware/networkjitter.cpp @@ -89,7 +89,7 @@ void NetworkJitter::run(){ //Calculate average diff per second and IAT standard deviation per millisecond - if(statusTimer.elapsed() >= 1000){ + if(statusTimer.elapsed() >= 200){ // If no packages recieved, wait(?) if(packetCounter != 0){ diffratePerSec = differencePerSec/packetCounter; diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index bfae310..7ce653c 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -64,12 +64,13 @@ void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus xStatus, bool isDeviat if(!isDeviationSignal){ previousAnalyzerStream.streams[streamID] = streamInfo; - qInfo("hej"); + // qInfo("hej"); } else if(isDeviationSignal){ previousAnalyzerStream.streams[streamID].iatDeviation = streamInfo.iatDeviation; - qInfo("hejhejhejhejhej"); - qInfo() << "iatDev" << streamID << streamInfo.iatDeviation; + + //qInfo("hejhejhejhejhej"); + // qInfo() << "iatDev" << streamID streamInfo.iatDeviation; WorkerStatus completeSignal; completeSignal.setStreams(previousAnalyzerStream.streams); diff --git a/Recorder/tsnetworkfilerecorder.cpp b/Recorder/tsnetworkfilerecorder.cpp index ab4eafb..1cd1340 100644 --- a/Recorder/tsnetworkfilerecorder.cpp +++ b/Recorder/tsnetworkfilerecorder.cpp @@ -72,11 +72,11 @@ void TsNetworkFileRecorder::joinStreamInfo(WorkerStatus xStatus, bool isDeviatio if(!isDeviationSignal){ previousAnalyzerStream.streams[streamID] = streamInfo; - qInfo("hej"); + // qInfo("hej"); } else if(isDeviationSignal){ previousAnalyzerStream.streams[streamID].iatDeviation = streamInfo.iatDeviation; - qInfo("hejhejhejhejhej"); + // qInfo("hejhejhejhejhej"); quint32 test = streamInfo.iatDeviation; qInfo() << streamID << test; WorkerStatus completeSignal; diff --git a/Status/streaminfo.h b/Status/streaminfo.h index b057551..0760d23 100644 --- a/Status/streaminfo.h +++ b/Status/streaminfo.h @@ -26,10 +26,14 @@ class StreamInfo { quint64 bytes; quint64 currentTime; quint64 bitrate; + double avgBitrate; + double currentBitrate; NetworkProtocol protocol; BitrateMode bitrateMode; quint8 tsPerIp; quint64 iatDeviation; + quint64 lastSecondBytes; + quint64 lastDuration; TsErrors tsErrors; QMap pidMap; QString protocolName() const { @@ -64,6 +68,8 @@ class StreamInfo { bitrateMode(BitrateMode::UNKNOWN), tsPerIp(0), iatDeviation(0), + lastSecondBytes(0), + lastDuration(0), tsErrors() {} StreamInfo(StreamId id, quint64 bytes, diff --git a/Status/workerstatus.h b/Status/workerstatus.h index b20f613..2782649 100644 --- a/Status/workerstatus.h +++ b/Status/workerstatus.h @@ -82,18 +82,15 @@ class WorkerStatus : public QObject { // New method that is meant to update the values in the tree rather than recreate the tree every iteration. - double updateTree(QTreeWidget *tree){ + void updateTree(QTreeWidget *tree){ quint8 y = 0; - - double value = 0; for (int i = 0; i < streams.count(); i++){ quint64 key = streams.keys().at(i); const StreamInfo &info = streams.value(key); - tree->topLevelItem(i)->child(y++)->setText(0, QString(tr("size %1 MB")).arg(QString::number(info.bytes/1000000.0, 'f', 2))); tree->topLevelItem(i)->child(y++)->setText(0, QString(tr("duration %1")).arg(QDateTime::fromTime_t(info.currentTime/1000).toUTC().toString("HH:mm:ss"))); value = (info.bytes*8*1000.0/info.currentTime)/1000000.0; diff --git a/recordwidget.cpp b/recordwidget.cpp index 6ca62ec..94d90f4 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -21,6 +21,7 @@ RecordWidget::RecordWidget(QWidget *parent) : this->setupGraph(); this->setMouseTracking(true); treeWidgetCounter = 0; + selectedStreamIndex = 0; // Advanced PCAP filter @@ -103,8 +104,11 @@ void RecordWidget::recordingStarted() { ui->recordPcapFilterContainer->setEnabled(false); ui->recordInterfaceSelect->setEnabled(false); ui->graphDataBox->setEnabled(false); + // ui->treeWidget->clear(); this->setupGraph(); + + if(ui->graphDataBox->currentText()== "Bitrate"){ this->graph.setYAxisTitle("Bitrate mbps"); } else{ @@ -121,26 +125,63 @@ void RecordWidget::recordStatusChanged(FinalStatus status) { ui->recordStatus->setText(status.toUiString()); } +void RecordWidget::recordWorkerGraphInfo(WorkerStatus status){ + quint64 key = status.streams.keys().at(selectedStreamIndex); + graph.setBitrate(status.streams[key].currentBitrate, status.streams[key].currentTime); + + + // connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); +} + void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { if(treeWidgetCounter == 0){ status.insertIntoTree(ui->treeWidget); treeWidgetCounter++; } else { - double avgBit = status.updateTree(ui->treeWidget); - this->graph.setAvgBitrate(avgBit); + + + + + QList itemList; + itemList = this->ui->treeWidget->selectedItems(); + + foreach(QTreeWidgetItem *item, itemList) + { + QString str = item->text(0); + selectedStreamIndex = this->ui->treeWidget->indexOfTopLevelItem(item); + qInfo() << ui->treeWidget->selectedItems() << "ojojojojoj" << str << item->child(6)->text(0); + currentTreeStream = str; + + + } + quint64 key = status.streams.keys().at(selectedStreamIndex); + this->graph.setAvgBitrate(status.streams[key].avgBitrate); + recordWorkerGraphInfo(status); + status.updateTree(ui->treeWidget); + } - /* - status.insertIntoTree(ui->treeWidget); - auto item = ui->treeWidget->topLevelItem(0)->child(2); - auto itemData = item->QTreeWidgetItem::data(0, Qt::UserRole); - double avgBit = itemData.toDouble(); - this->graph.setAvgBitrate(avgBit); - */ } +/* +// Would like to return IAT value and bitrate of given stream +void RecordWidget::getTreeData(QString string, QTreeWidget treeWidget){ + + QList itemList; + itemList = treeWidget.selectedItems(); + + foreach(QTreeWidgetItem *item, itemList) + { + QString str = item->text(0); + qInfo() << ui->treeWidget->selectedItems() << "ojojojojoj" << str; +// qInfo() << item->child(6)->text(0); + + currentTreeStream = str; + } +} +*/ void RecordWidget::recordingFinished() { ui->recordStartStopBtn->setText(tr("Start recording")); ui->recordStartStopBtn->setEnabled(true); @@ -153,6 +194,9 @@ void RecordWidget::recordingFinished() { ui->recordPcapFilterContainer->setEnabled(true); ui->recordInterfaceSelect->setEnabled(true); ui->graphDataBox->setEnabled(true); + selectedStreamIndex = 0; + treeWidgetCounter = 0; + networkPcapFileRecorder = NULL; tsNetworkFileRecorder = NULL; @@ -236,13 +280,14 @@ bool RecordWidget::startPcapRecord(WorkerConfiguration::WorkerMode mode) { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, this, &RecordWidget::recordStatusChanged); - if(ui->graphDataBox->currentText()!= "Bitrate"){ + + if(ui->graphDataBox->currentText()!= "Bitrate"){ //Check which stream is marked here? connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::iatStatus, &graph, &RecordWidgetGraph::setBitrate); } else { - connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); + connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); } - connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); + ui->recordStartStopBtn->setEnabled(false); diff --git a/recordwidget.h b/recordwidget.h index 797d0eb..4a470f2 100644 --- a/recordwidget.h +++ b/recordwidget.h @@ -35,10 +35,18 @@ class RecordWidget : public QWidget private: Ui::RecordWidget *ui; bool started; + QString currentTreeStream; QString currentDirectory; QString currentFilename; quint8 treeWidgetCounter; RecordTxtPrinter printer; + QTreeWidgetItem *currentStreamAdress; + quint8 selectedStreamIndex; + + // QString getTreeStream(QTreeWidget widget); + // void getTreeData(QString string, QTreeWidget treeWidget); + + private slots: void recordingStarted(); void recordingFinished(); @@ -66,6 +74,7 @@ private slots: public slots: void recordStatusChanged(FinalStatus status); void recordWorkerStatusChanged(WorkerStatus status); + void recordWorkerGraphInfo (WorkerStatus status); }; diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 9a2224e..2659821 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -84,7 +84,7 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ // Appends new values and updates graph - if(bitrate != 0){ + if(bitrate > 1 && bitrate < 1000){ this->durations = duration; lineSeries->append(duration, bitrate); From 71b6fe8a6bfbf06d2ca2f7970ed9b6f88fc96f5f Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 26 Jun 2019 10:41:25 +0200 Subject: [PATCH 27/43] Fixed crash issue, lag when plotting needs to fixed thou --- Status/workerstatus.h | 2 -- recordwidget.cpp | 46 ++++++++----------------------------------- 2 files changed, 8 insertions(+), 40 deletions(-) diff --git a/Status/workerstatus.h b/Status/workerstatus.h index 2782649..6932ba1 100644 --- a/Status/workerstatus.h +++ b/Status/workerstatus.h @@ -102,8 +102,6 @@ class WorkerStatus : public QObject { tree->topLevelItem(i)->child(y++)->setText(0, QString(tr("%1 PIDs")).arg(info.pidMap.size())); y= 0; } - return value; - } diff --git a/recordwidget.cpp b/recordwidget.cpp index 94d90f4..21dfd59 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -112,7 +112,7 @@ void RecordWidget::recordingStarted() { if(ui->graphDataBox->currentText()== "Bitrate"){ this->graph.setYAxisTitle("Bitrate mbps"); } else{ - this->graph.setYAxisTitle("Std IAT dev µs/sec"); + this->graph.setYAxisTitle("Std IAT dev µs"); } @@ -126,34 +126,22 @@ void RecordWidget::recordStatusChanged(FinalStatus status) { } void RecordWidget::recordWorkerGraphInfo(WorkerStatus status){ - quint64 key = status.streams.keys().at(selectedStreamIndex); - graph.setBitrate(status.streams[key].currentBitrate, status.streams[key].currentTime); - - - // connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); + quint64 hashKey = status.streams.keys().at(selectedStreamIndex); + graph.setBitrate(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); } void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { - if(treeWidgetCounter == 0){ + if(this->treeWidgetCounter == 0 && started){ // Add check here to prevent crash when pressing stop button status.insertIntoTree(ui->treeWidget); treeWidgetCounter++; - } else { - - - - + } else if(this->treeWidgetCounter > 0 && started){ QList itemList; itemList = this->ui->treeWidget->selectedItems(); foreach(QTreeWidgetItem *item, itemList) { - QString str = item->text(0); selectedStreamIndex = this->ui->treeWidget->indexOfTopLevelItem(item); - qInfo() << ui->treeWidget->selectedItems() << "ojojojojoj" << str << item->child(6)->text(0); - currentTreeStream = str; - - } quint64 key = status.streams.keys().at(selectedStreamIndex); this->graph.setAvgBitrate(status.streams[key].avgBitrate); @@ -161,28 +149,10 @@ void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { status.updateTree(ui->treeWidget); } - - } -/* -// Would like to return IAT value and bitrate of given stream -void RecordWidget::getTreeData(QString string, QTreeWidget treeWidget){ - - QList itemList; - itemList = treeWidget.selectedItems(); - - foreach(QTreeWidgetItem *item, itemList) - { - QString str = item->text(0); - qInfo() << ui->treeWidget->selectedItems() << "ojojojojoj" << str; -// qInfo() << item->child(6)->text(0); - - currentTreeStream = str; - } -} -*/ void RecordWidget::recordingFinished() { + started = false; ui->recordStartStopBtn->setText(tr("Start recording")); ui->recordStartStopBtn->setEnabled(true); ui->recordOpenFileDialog->setEnabled(true); @@ -195,12 +165,11 @@ void RecordWidget::recordingFinished() { ui->recordInterfaceSelect->setEnabled(true); ui->graphDataBox->setEnabled(true); selectedStreamIndex = 0; - treeWidgetCounter = 0; + this->treeWidgetCounter = 0; networkPcapFileRecorder = NULL; tsNetworkFileRecorder = NULL; - started = false; } @@ -439,6 +408,7 @@ void RecordWidget::on_recordStartStopBtn_clicked() ("atempting to stop pcapRecorder"); ui->recordStartStopBtn->setEnabled(false); networkPcapFileRecorder->stop(); + recordingFinished(); } if (tsNetworkFileRecorder != NULL) { qInfo("atempting to stop tsRecorder"); From 35af21027bfbb027d5db9e739ea83213a90238f7 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Thu, 27 Jun 2019 14:09:11 +0200 Subject: [PATCH 28/43] Things are working, it's messy thou --- Middleware/analyzerpcapmiddleware.cpp | 2 +- Middleware/networkjitter.cpp | 2 +- Recorder/networkpcapfilerecorder.cpp | 8 ++--- Status/workerstatus.h | 1 + recordwidget.cpp | 26 ++++---------- recordwidgetgraph.cpp | 50 +++++++++++++++++++++++++++ recordwidgetgraph.h | 9 +++++ 7 files changed, 71 insertions(+), 27 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index 13062c5..ba2c555 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -170,7 +170,7 @@ void AnalyzerPcapMiddleware::bufferProducts() { } emit status(AnalyzerStatus(Status::STATUS_PERIODIC, bytes, duration, bitrate, duration, pidMap, tsErrors, proto, tsPerIp)); - if(bitrate / 1000000 >!100){ + if(bitrate / 1000000 < 100){ emit bitrateStatus((double) bitrate /1000000, duration ); } diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp index d512dc6..f7ab9b8 100644 --- a/Middleware/networkjitter.cpp +++ b/Middleware/networkjitter.cpp @@ -115,7 +115,7 @@ void NetworkJitter::run(){ emit iatStatus(sqrt(finalSum), duration); - emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams), true); + // emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams), true); diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index 7ce653c..2c495c3 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -57,25 +57,21 @@ void NetworkPcapFileRecorder::gotProducerStatus(Status pStatus) { void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus xStatus, bool isDeviationSignal) { - //Iterates hashmap for(auto iter = xStatus.getStreams().begin(); iter != xStatus.getStreams().end(); ++iter) { qint64 streamID = iter.key(); const StreamInfo &streamInfo= iter.value(); if(!isDeviationSignal){ previousAnalyzerStream.streams[streamID] = streamInfo; - // qInfo("hej"); - } else if(isDeviationSignal){ + } // } else if(isDeviationSignal){ previousAnalyzerStream.streams[streamID].iatDeviation = streamInfo.iatDeviation; - //qInfo("hejhejhejhejhej"); - // qInfo() << "iatDev" << streamID streamInfo.iatDeviation; WorkerStatus completeSignal; completeSignal.setStreams(previousAnalyzerStream.streams); emit workerStatus(completeSignal); - } + // } } } diff --git a/Status/workerstatus.h b/Status/workerstatus.h index 6932ba1..3a12c46 100644 --- a/Status/workerstatus.h +++ b/Status/workerstatus.h @@ -112,6 +112,7 @@ class WorkerStatus : public QObject { void insertIntoTree(QTreeWidget *tree) { tree->clear(); tree->setSelectionMode(QAbstractItemView::SingleSelection); + qInfo() << "ADDDING " << streams.count() << " NUMBER OF STREAMS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"; for (int i = 0; i < streams.count(); i++) { quint64 key = streams.keys().at(i); const StreamInfo &info = streams.value(key); diff --git a/recordwidget.cpp b/recordwidget.cpp index 21dfd59..67712ca 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -40,8 +40,6 @@ RecordWidget::RecordWidget(QWidget *parent) : // connect(ui->graphView, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate ); - - for (int i = 0; i < MainWindow::interfaces.length(); i++) { ui->recordInterfaceSelect->addItem(MainWindow::interfaces.at(i).getName()); ui->recordInterfaceSelect->setItemData(i, MainWindow::interfaces.at(i).getName(), Qt::ToolTipRole); @@ -104,21 +102,13 @@ void RecordWidget::recordingStarted() { ui->recordPcapFilterContainer->setEnabled(false); ui->recordInterfaceSelect->setEnabled(false); ui->graphDataBox->setEnabled(false); - // ui->treeWidget->clear(); this->setupGraph(); - - if(ui->graphDataBox->currentText()== "Bitrate"){ this->graph.setYAxisTitle("Bitrate mbps"); } else{ this->graph.setYAxisTitle("Std IAT dev µs"); } - - - - - } void RecordWidget::recordStatusChanged(FinalStatus status) { @@ -128,18 +118,20 @@ void RecordWidget::recordStatusChanged(FinalStatus status) { void RecordWidget::recordWorkerGraphInfo(WorkerStatus status){ quint64 hashKey = status.streams.keys().at(selectedStreamIndex); graph.setBitrate(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); + // graph.recordMultipleStreams(status); } void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { - if(this->treeWidgetCounter == 0 && started){ // Add check here to prevent crash when pressing stop button + if(ui->treeWidget->topLevelItemCount() < status.streams.count() && started){ // started prevents crash when pressing stop button + status.insertIntoTree(ui->treeWidget); - treeWidgetCounter++; - } else if(this->treeWidgetCounter > 0 && started){ + // treeWidgetCounter ++; + } else { //if(this->treeWidgetCounter > 0 && started){ QList itemList; itemList = this->ui->treeWidget->selectedItems(); - foreach(QTreeWidgetItem *item, itemList) + foreach(QTreeWidgetItem *item, itemList) // Maybe pass data to graph here if there are multiple streams? { selectedStreamIndex = this->ui->treeWidget->indexOfTopLevelItem(item); } @@ -147,7 +139,6 @@ void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { this->graph.setAvgBitrate(status.streams[key].avgBitrate); recordWorkerGraphInfo(status); status.updateTree(ui->treeWidget); - } } @@ -249,15 +240,12 @@ bool RecordWidget::startPcapRecord(WorkerConfiguration::WorkerMode mode) { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, this, &RecordWidget::recordStatusChanged); - - if(ui->graphDataBox->currentText()!= "Bitrate"){ //Check which stream is marked here? + if(ui->graphDataBox->currentText()!= "Bitrate"){ connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::iatStatus, &graph, &RecordWidgetGraph::setBitrate); } else { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); } - - ui->recordStartStopBtn->setEnabled(false); networkPcapFileRecorder->start(); diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 2659821..f07519d 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -20,6 +20,12 @@ RecordWidgetGraph::RecordWidgetGraph( QWidget *parent): +RecordWidgetGraph::~RecordWidgetGraph() +{ + for (auto ls : this->streamList) { + delete ls; + } +} QChart* RecordWidgetGraph::setupGraph(){ @@ -58,6 +64,7 @@ QChart* RecordWidgetGraph::setupGraph(){ axisX->setTitleText("Time m:s"); this->chart()->setAxisX(axisX, lineSeries); avgSeries->attachAxis(axisX); + // this->axisX = axisX; return(chart); } @@ -107,9 +114,52 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ chartCounter++; } +} + + +void RecordWidgetGraph::changeStream(int selectedStream){ + chart()->removeSeries(lineSeries); + lineSeries = streamList[selectedStream]; +// this->chart()->setAxisX(axisX, lineSeries); } +void RecordWidgetGraph::setNoOfStreams(quint8 noOfStreams){ + this->noOfStreams = noOfStreams; +} + +void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ //Will gather data for lineSeries for multiple streams +/* + if (firstRound){ + + + for(int i = 0; i < status.streams.count(); i++){ + + quint64 hashKey = status.streams.keys().at(i); + + QLineSeries *newLineSeries = new QLineSeries(); + this->streamList.append(newLineSeries); + streamList[i]->append(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); + + } + + this->firstRound = false; + } else { + for(int i = 0; i < status.streams.count(); i++){ + quint64 hashKey = status.streams.keys().at(i); + streamList[i]->append(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); + } + } + */ +} + +void RecordWidgetGraph::updateMultipleStreams(WorkerStatus status){ + /* for(int i = 0; i < status.streams.count(); i++){ + quint64 hashKey = status.streams.keys().at(i); + // streamList[i].append(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); + } + */ +} void RecordWidgetGraph::mousePressEvent(QMouseEvent *event) { diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 6997898..4d8144b 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -25,13 +25,19 @@ class RecordWidgetGraph : public QChartView RecordWidgetGraph(QWidget *parent); + ~RecordWidgetGraph(); QChart GraphChart; qint16 chartCounter; + quint8 noOfStreams; double maxBitrate; double minBitrate; QChart* setupGraph(); void setAvgBitrate(double avgBitrate); + void changeStream(int i); + void recordMultipleStreams(WorkerStatus status); + void updateMultipleStreams(WorkerStatus status); + void setNoOfStreams(quint8 streams); void keyPressEvent(QKeyEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); @@ -41,6 +47,7 @@ class RecordWidgetGraph : public QChartView protected: + QList streamList; @@ -52,6 +59,8 @@ public slots: private: + bool firstRound = true; +// QDateTimeAxis *axisX; quint32 zoomInt; double avgBitrate; qint64 durations; From b2358fa3b5260a1d99a270ac6b2b29a3d4e7f379 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Thu, 27 Jun 2019 15:38:40 +0200 Subject: [PATCH 29/43] Working on changeStream() things are working fine --- recordwidget.cpp | 12 ++++++++++-- recordwidgetgraph.cpp | 23 +++++++++++++---------- recordwidgetgraph.h | 4 +++- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/recordwidget.cpp b/recordwidget.cpp index 67712ca..870d65e 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -118,12 +118,20 @@ void RecordWidget::recordStatusChanged(FinalStatus status) { void RecordWidget::recordWorkerGraphInfo(WorkerStatus status){ quint64 hashKey = status.streams.keys().at(selectedStreamIndex); graph.setBitrate(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); - // graph.recordMultipleStreams(status); + + if(ui->treeWidget->topLevelItemCount() > 1){ + graph.recordMultipleStreams(status); + + + if(selectedStreamIndex != graph.selectedStreamIndex){ + graph.changeStream(selectedStreamIndex); + } +} } void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { - if(ui->treeWidget->topLevelItemCount() < status.streams.count() && started){ // started prevents crash when pressing stop button + if(ui->treeWidget->topLevelItemCount() != status.streams.count() && started){ // started prevents crash when pressing stop button status.insertIntoTree(ui->treeWidget); // treeWidgetCounter ++; diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index f07519d..405a995 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -30,6 +30,7 @@ RecordWidgetGraph::~RecordWidgetGraph() QChart* RecordWidgetGraph::setupGraph(){ + firstRound = true; lineSeries = new QLineSeries(); avgSeries = new QLineSeries(); avgSeries->setName("Avg bitrate"); @@ -64,7 +65,7 @@ QChart* RecordWidgetGraph::setupGraph(){ axisX->setTitleText("Time m:s"); this->chart()->setAxisX(axisX, lineSeries); avgSeries->attachAxis(axisX); - // this->axisX = axisX; + this->axisX = axisX; return(chart); } @@ -118,10 +119,14 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ void RecordWidgetGraph::changeStream(int selectedStream){ - chart()->removeSeries(lineSeries); - lineSeries = streamList[selectedStream]; -// this->chart()->setAxisX(axisX, lineSeries); +// chart()->removeSeries(lineSeries); + // lineSeries = streamList[selectedStream]; + // chart()->addSeries(streamList[selectedStream]); +// chart()->createDefaultAxes(); + + + selectedStreamIndex = selectedStream; } void RecordWidgetGraph::setNoOfStreams(quint8 noOfStreams){ @@ -129,17 +134,15 @@ void RecordWidgetGraph::setNoOfStreams(quint8 noOfStreams){ } void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ //Will gather data for lineSeries for multiple streams -/* - if (firstRound){ - + if (firstRound){ for(int i = 0; i < status.streams.count(); i++){ quint64 hashKey = status.streams.keys().at(i); QLineSeries *newLineSeries = new QLineSeries(); this->streamList.append(newLineSeries); - streamList[i]->append(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); + streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); } @@ -147,10 +150,10 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ //Will gathe } else { for(int i = 0; i < status.streams.count(); i++){ quint64 hashKey = status.streams.keys().at(i); - streamList[i]->append(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); + streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); } } - */ + } void RecordWidgetGraph::updateMultipleStreams(WorkerStatus status){ diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 4d8144b..efc46dd 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -23,6 +23,8 @@ class RecordWidgetGraph : public QChartView public: + quint8 selectedStreamIndex; + RecordWidgetGraph(QWidget *parent); ~RecordWidgetGraph(); @@ -60,7 +62,7 @@ public slots: private: bool firstRound = true; -// QDateTimeAxis *axisX; + QDateTimeAxis *axisX; quint32 zoomInt; double avgBitrate; qint64 durations; From c8508fe7bc9b9d652f0d6287e4ba75d9a283e29c Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Mon, 1 Jul 2019 11:24:02 +0200 Subject: [PATCH 30/43] Multiple streams now working properly for pcap. Able to switch between data sets. --- Status/workerstatus.h | 8 +++-- recordwidget.cpp | 40 ++++++++++++++++--------- recordwidget.h | 4 +++ recordwidgetgraph.cpp | 70 ++++++++++++++++++++++++++++++------------- recordwidgetgraph.h | 3 ++ 5 files changed, 87 insertions(+), 38 deletions(-) diff --git a/Status/workerstatus.h b/Status/workerstatus.h index 3a12c46..a5081e5 100644 --- a/Status/workerstatus.h +++ b/Status/workerstatus.h @@ -143,9 +143,11 @@ class WorkerStatus : public QObject { } parent->setExpanded(true); - // this->treeWidget = tree; - tree->clearSelection(); - parent->setSelected(true); + // this->treeWidget = tree; + if (i==0){ + tree->clearSelection(); + parent->setSelected(true); + } } } diff --git a/recordwidget.cpp b/recordwidget.cpp index 870d65e..b3c0208 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -37,6 +37,7 @@ RecordWidget::RecordWidget(QWidget *parent) : connect(ui->recordPort, &QLineEdit::textChanged, this, &RecordWidget::recordFilterShouldUpdate); connect(ui->recordRtpFecCheckBox, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate); connect(ui->recordUnicastCheckBox, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate); + connect(ui->treeWidget, &QTreeWidget::itemClicked, this, &RecordWidget::changeStream); // connect(ui->graphView, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate ); @@ -120,29 +121,22 @@ void RecordWidget::recordWorkerGraphInfo(WorkerStatus status){ graph.setBitrate(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); if(ui->treeWidget->topLevelItemCount() > 1){ - graph.recordMultipleStreams(status); + graph.recordMultipleStreams(status); - - if(selectedStreamIndex != graph.selectedStreamIndex){ - graph.changeStream(selectedStreamIndex); + if(selectedStreamIndex != graph.selectedStreamIndex){ + graph.changeStream(selectedStreamIndex); + } } } -} void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { if(ui->treeWidget->topLevelItemCount() != status.streams.count() && started){ // started prevents crash when pressing stop button status.insertIntoTree(ui->treeWidget); - // treeWidgetCounter ++; - } else { //if(this->treeWidgetCounter > 0 && started){ - QList itemList; - itemList = this->ui->treeWidget->selectedItems(); - foreach(QTreeWidgetItem *item, itemList) // Maybe pass data to graph here if there are multiple streams? - { - selectedStreamIndex = this->ui->treeWidget->indexOfTopLevelItem(item); - } + } else { //if(this->treeWidgetCounter > 0 && started){ + updateStreamIndex(); quint64 key = status.streams.keys().at(selectedStreamIndex); this->graph.setAvgBitrate(status.streams[key].avgBitrate); recordWorkerGraphInfo(status); @@ -150,6 +144,24 @@ void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { } } +void RecordWidget::changeStream(){ + updateStreamIndex(); + graph.changeStream(selectedStreamIndex); + ui->graphView->setChart(graph.chart()); + ui->graphView->setRenderHint(QPainter::Antialiasing); +} + +void RecordWidget::updateStreamIndex(){ + QList itemList; + + itemList = this->ui->treeWidget->selectedItems(); + + foreach(QTreeWidgetItem *item, itemList) // Maybe pass data to graph here if there are multiple streams? + { + selectedStreamIndex = this->ui->treeWidget->indexOfTopLevelItem(item); + } +} + void RecordWidget::recordingFinished() { started = false; ui->recordStartStopBtn->setText(tr("Start recording")); @@ -187,7 +199,7 @@ bool RecordWidget::validatePortInputs() { bool RecordWidget::validateAdressInputs() { bool valid = true; - // Performs validation on Address + // Performs validation on adress valid = Validator::validateIp(ui->recordHost) && valid; return valid; diff --git a/recordwidget.h b/recordwidget.h index 4a470f2..7343840 100644 --- a/recordwidget.h +++ b/recordwidget.h @@ -33,6 +33,9 @@ class RecordWidget : public QWidget private: + + void updateStreamIndex(); + Ui::RecordWidget *ui; bool started; QString currentTreeStream; @@ -52,6 +55,7 @@ private slots: void recordingFinished(); bool validateAdressInputs(); bool validatePortInputs(); + void changeStream(); void setupGraph(); diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 405a995..31a4ee2 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -31,8 +31,12 @@ RecordWidgetGraph::~RecordWidgetGraph() QChart* RecordWidgetGraph::setupGraph(){ firstRound = true; + streamList.clear(); + avgStreamList.clear(); + lineSeries = new QLineSeries(); avgSeries = new QLineSeries(); + avgSeries->setName("Avg bitrate"); lineSeries->setName("Bitrate"); @@ -65,7 +69,7 @@ QChart* RecordWidgetGraph::setupGraph(){ axisX->setTitleText("Time m:s"); this->chart()->setAxisX(axisX, lineSeries); avgSeries->attachAxis(axisX); - this->axisX = axisX; + // this->axisX = axisX; return(chart); } @@ -90,19 +94,17 @@ void RecordWidgetGraph::setAvgBitrate(double avgBitrate){ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ // Appends new values and updates graph - - if(bitrate > 1 && bitrate < 1000){ this->durations = duration; lineSeries->append(duration, bitrate); + qInfo() << bitrate << "HEJEHEJEHEJEHJEHEJ"; + if(avgBitrate != 0){ avgSeries->append(duration, avgBitrate); } - this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(duration - 20000), QDateTime::fromMSecsSinceEpoch(duration + 2000)); - if(bitrate < this->minBitrate){ minBitrate = bitrate; this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); @@ -120,50 +122,76 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ void RecordWidgetGraph::changeStream(int selectedStream){ -// chart()->removeSeries(lineSeries); - // lineSeries = streamList[selectedStream]; - // chart()->addSeries(streamList[selectedStream]); -// chart()->createDefaultAxes(); + chart()->removeSeries(lineSeries); + chart()->removeSeries(avgSeries); + + lineSeries = streamList[selectedStream]; + avgSeries = avgStreamList[selectedStream]; + + avgSeries->setName("Avg bitrate"); + lineSeries->setName("Bitrate"); + chart()->axisY()->setTitleText("Bitrate mbps"); + + QPen pen(QRgb(0x000000)); + pen.setWidth(1); + lineSeries->setPen(pen); + // lineSeries->setColor("black"); + chart()->addSeries(lineSeries); + chart()->addSeries(avgSeries); - selectedStreamIndex = selectedStream; + chart()->createDefaultAxes(); + + QDateTimeAxis *axisX = new QDateTimeAxis; + axisX->setFormat("m:ss"); + axisX->setTickCount(10); + axisX->setTitleText("Time m:s"); + + this->chart()->setAxisX(axisX, lineSeries); + + avgSeries->attachAxis(chart()->axisX()); + + this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(durations - 20000), QDateTime::fromMSecsSinceEpoch(durations + 2000)); + + selectedStreamIndex = selectedStream; } void RecordWidgetGraph::setNoOfStreams(quint8 noOfStreams){ this->noOfStreams = noOfStreams; } -void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ //Will gather data for lineSeries for multiple streams +void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // Collects data for multiple streams if (firstRound){ for(int i = 0; i < status.streams.count(); i++){ quint64 hashKey = status.streams.keys().at(i); - QLineSeries *newLineSeries = new QLineSeries(); - this->streamList.append(newLineSeries); + + this->streamList.append(new QLineSeries()); + this->avgStreamList.append(new QLineSeries()); streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); + avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); + firstRound = false; } - this->firstRound = false; } else { for(int i = 0; i < status.streams.count(); i++){ quint64 hashKey = status.streams.keys().at(i); + // qInfo() << status.streams[hashKey].currentBitrate << status.streams[hashKey].avgBitrate << i; + streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); + avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); } } } +/* +void RecordWidgetGraph::setupLineSeries(){ -void RecordWidgetGraph::updateMultipleStreams(WorkerStatus status){ - /* for(int i = 0; i < status.streams.count(); i++){ - quint64 hashKey = status.streams.keys().at(i); - // streamList[i].append(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); - } - */ } - +*/ void RecordWidgetGraph::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index efc46dd..691cad5 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -34,6 +34,7 @@ class RecordWidgetGraph : public QChartView double maxBitrate; double minBitrate; QChart* setupGraph(); +// QChart* changeStream(int i); void setAvgBitrate(double avgBitrate); void changeStream(int i); @@ -50,6 +51,8 @@ class RecordWidgetGraph : public QChartView protected: QList streamList; + QList avgStreamList; + From 26e45a45e890b315ce60c4da56330235460fd9ad Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Tue, 2 Jul 2019 15:10:56 +0200 Subject: [PATCH 31/43] Currently graph is working fine for bitrate in pcapfiles. Need to fix Y- axis titles, ts-files, changeStream doesnt work well for IAT dev. --- Middleware/analyzerpcapmiddleware.cpp | 7 ++++ Middleware/analyzerpcapmiddleware.h | 3 ++ Middleware/networkjitter.cpp | 4 +-- Recorder/networkpcapfilerecorder.cpp | 47 +++++++++++++++++---------- Recorder/networkpcapfilerecorder.h | 5 ++- Status/streaminfo.h | 2 +- recordwidget.cpp | 23 +++++++++---- recordwidget.h | 1 + recordwidgetgraph.cpp | 30 +++++++++++------ recordwidgetgraph.h | 3 +- 10 files changed, 86 insertions(+), 39 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index ba2c555..ff8ce76 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -14,6 +14,7 @@ void AnalyzerPcapMiddleware::init() { this->moveToThread(&runnerThread); connect(&runnerThread, &QThread::started, this, &AnalyzerPcapMiddleware::run); connect(this, &AnalyzerPcapMiddleware::finished, &runnerThread, &QThread::quit); + } void AnalyzerPcapMiddleware::start() { @@ -34,6 +35,12 @@ void AnalyzerPcapMiddleware::run() { this->thread()->quit(); } + +void AnalyzerPcapMiddleware::recieveIatDev(double iatDev, qint64 duration){ + currentIatDev = iatDev; + currentIatDevTimestamp = duration; +} + // Buffers packets void AnalyzerPcapMiddleware::bufferProducts() { QElapsedTimer statusTimer; diff --git a/Middleware/analyzerpcapmiddleware.h b/Middleware/analyzerpcapmiddleware.h index df1b71e..c93b922 100644 --- a/Middleware/analyzerpcapmiddleware.h +++ b/Middleware/analyzerpcapmiddleware.h @@ -16,6 +16,8 @@ class AnalyzerPcapMiddleware : public PcapMiddleware { Q_OBJECT private: + double currentIatDev; + qint64 currentIatDevTimestamp; ConcurrentQueue buffer; TsParser tsParser; TsAnalyzer tsAnalyzer; @@ -48,6 +50,7 @@ protected slots: public slots: void start(); + void recieveIatDev(double iatDev, qint64 duration); void stop(); }; diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp index f7ab9b8..4ab5f4c 100644 --- a/Middleware/networkjitter.cpp +++ b/Middleware/networkjitter.cpp @@ -89,7 +89,7 @@ void NetworkJitter::run(){ //Calculate average diff per second and IAT standard deviation per millisecond - if(statusTimer.elapsed() >= 200){ + if(statusTimer.elapsed() >= 199){ // If no packages recieved, wait(?) if(packetCounter != 0){ diffratePerSec = differencePerSec/packetCounter; @@ -115,7 +115,7 @@ void NetworkJitter::run(){ emit iatStatus(sqrt(finalSum), duration); - // emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams), true); + emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams), true); diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index 2c495c3..c649997 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -5,7 +5,7 @@ void NetworkPcapFileRecorder::start() { finalStatus.setAnalysisMode(config.getWorkerMode()); - producer.addNext(&analyzerMiddleware)->addNext(&networkJitter)->addNext(&consumer); + producer.addNext(&networkJitter)->addNext(&analyzerMiddleware)->addNext(&consumer); producer.init(&producerThread); connect(&consumer, &PcapFileConsumer::finished, &producer, &PcapBufferedProducer::stop); @@ -20,7 +20,7 @@ void NetworkPcapFileRecorder::start() { connect(&producer, &PcapBufferedProducer::status, this, &NetworkPcapFileRecorder::gotProducerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::status, this, &NetworkPcapFileRecorder::gotAnalyzerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::bitrateStatus, this, &NetworkPcapFileRecorder::gotBitrate); - connect(&networkJitter, &NetworkJitter::iatStatus, this, &NetworkPcapFileRecorder::gotIatDev); + connect(&networkJitter, &NetworkJitter::workerStatus, this, &NetworkPcapFileRecorder::gotIatDev); // connect(&networkJitter, &NetworkJitter::status, this, &NetworkPcapFileRecorder::gotNetworkStatus); @@ -29,7 +29,7 @@ void NetworkPcapFileRecorder::start() { //Worker-status is connected to the right side stream info panel connect(&consumer, &PcapFileConsumer::status, this, &NetworkPcapFileRecorder::gotConsumerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::workerStatus, this, &NetworkPcapFileRecorder::joinStreamInfo); - connect(&networkJitter, &NetworkJitter::workerStatus, this, &NetworkPcapFileRecorder::joinStreamInfo); + // connect(&networkJitter, &NetworkJitter::workerStatus, this, &NetworkPcapFileRecorder::joinStreamInfo); producerThread.start(); @@ -55,26 +55,43 @@ void NetworkPcapFileRecorder::gotProducerStatus(Status pStatus) { -void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus xStatus, bool isDeviationSignal) { +void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus status, bool isDeviationSignal) { + qint8 counter = 0; - for(auto iter = xStatus.getStreams().begin(); iter != xStatus.getStreams().end(); ++iter) { + for(auto iter = status.getStreams().begin(); iter != status.getStreams().end(); ++iter) { qint64 streamID = iter.key(); const StreamInfo &streamInfo= iter.value(); - if(!isDeviationSignal){ - previousAnalyzerStream.streams[streamID] = streamInfo; + // if(!isDeviationSignal){ + previousAnalyzerStream.streams[streamID] = streamInfo; - } // } else if(isDeviationSignal){ - previousAnalyzerStream.streams[streamID].iatDeviation = streamInfo.iatDeviation; + // Make IAT work for any numer of streams + if(iatVector.size() <= counter){ + previousAnalyzerStream.streams[streamID].iatDeviation = 0; - WorkerStatus completeSignal; + } else { + previousAnalyzerStream.streams[streamID].iatDeviation = (iatVector[counter].last() ); + } + WorkerStatus completeSignal; - completeSignal.setStreams(previousAnalyzerStream.streams); - emit workerStatus(completeSignal); - // } + completeSignal.setStreams(previousAnalyzerStream.streams); + emit workerStatus(completeSignal); + counter++; } } +void NetworkPcapFileRecorder::gotIatDev(WorkerStatus status, bool isDeviationSignal){ + + this->iatVector.resize(status.streams.count()); + + for(int i = 0; i < status.streams.count(); i++) { + quint64 hashKey = status.streams.keys().at(i); + // qInfo() << (status.streams[hashKey].iatDeviation)<< "IATVALUE BEING APPENDED"; + + iatVector[i].append(status.streams[hashKey].iatDeviation); + //qInfo() << iatDevList.last() << "IATLIST VALUE AT INDEX 0"; + } +} @@ -100,10 +117,6 @@ void NetworkPcapFileRecorder::gotBitrate(double bitrate, qint64 duration){ emit bitrateStatus(bitrate, duration); } -void NetworkPcapFileRecorder::gotIatDev(double iatDev, qint64 duration){ - - emit iatStatus(iatDev, duration); -} diff --git a/Recorder/networkpcapfilerecorder.h b/Recorder/networkpcapfilerecorder.h index 381bbf2..9ba0fd1 100644 --- a/Recorder/networkpcapfilerecorder.h +++ b/Recorder/networkpcapfilerecorder.h @@ -11,6 +11,9 @@ class NetworkPcapFileRecorder : public Recorder { Q_OBJECT private: + QVector > iatVector; + QList iatDevList; + QList iatDevdurationList; PcapBufferedProducer producer; PcapFileConsumer consumer; NetworkJitter networkJitter; @@ -43,7 +46,7 @@ private slots: void joinStreamInfo(WorkerStatus dStatus, bool isDeviationSignal); void gotConsumerStatus(Status cStatus); void gotBitrate(double bitrate, qint64 duration); - void gotIatDev(double iatDev, qint64 duration); + void gotIatDev(WorkerStatus dStatus, bool isDeviationSignal); void moduleFinished(); }; diff --git a/Status/streaminfo.h b/Status/streaminfo.h index 0760d23..2879e50 100644 --- a/Status/streaminfo.h +++ b/Status/streaminfo.h @@ -31,7 +31,7 @@ class StreamInfo { NetworkProtocol protocol; BitrateMode bitrateMode; quint8 tsPerIp; - quint64 iatDeviation; + quint16 iatDeviation; quint64 lastSecondBytes; quint64 lastDuration; TsErrors tsErrors; diff --git a/recordwidget.cpp b/recordwidget.cpp index b3c0208..c9b3f48 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -15,7 +15,8 @@ RecordWidget::RecordWidget(QWidget *parent) : QWidget(parent), graph(this), ui(new Ui::RecordWidget), - started(false) + started(false), + isBitrateSignal(true) { ui->setupUi(this); this->setupGraph(); @@ -118,13 +119,18 @@ void RecordWidget::recordStatusChanged(FinalStatus status) { void RecordWidget::recordWorkerGraphInfo(WorkerStatus status){ quint64 hashKey = status.streams.keys().at(selectedStreamIndex); - graph.setBitrate(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); + if(isBitrateSignal){ + graph.setBitrate(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); + } else { + + graph.setBitrate(status.streams[hashKey].iatDeviation, status.streams[hashKey].currentTime); + } if(ui->treeWidget->topLevelItemCount() > 1){ graph.recordMultipleStreams(status); if(selectedStreamIndex != graph.selectedStreamIndex){ - graph.changeStream(selectedStreamIndex); + graph.changeStream(selectedStreamIndex, isBitrateSignal); } } } @@ -138,7 +144,9 @@ void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { } else { //if(this->treeWidgetCounter > 0 && started){ updateStreamIndex(); quint64 key = status.streams.keys().at(selectedStreamIndex); - this->graph.setAvgBitrate(status.streams[key].avgBitrate); + if(isBitrateSignal){ + this->graph.setAvgBitrate(status.streams[key].avgBitrate); + } recordWorkerGraphInfo(status); status.updateTree(ui->treeWidget); } @@ -146,9 +154,8 @@ void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { void RecordWidget::changeStream(){ updateStreamIndex(); - graph.changeStream(selectedStreamIndex); + graph.changeStream(selectedStreamIndex, isBitrateSignal); ui->graphView->setChart(graph.chart()); - ui->graphView->setRenderHint(QPainter::Antialiasing); } void RecordWidget::updateStreamIndex(){ @@ -261,7 +268,8 @@ bool RecordWidget::startPcapRecord(WorkerConfiguration::WorkerMode mode) { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, this, &RecordWidget::recordStatusChanged); if(ui->graphDataBox->currentText()!= "Bitrate"){ - connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::iatStatus, &graph, &RecordWidgetGraph::setBitrate); + connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); + isBitrateSignal = false; } else { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); } @@ -292,6 +300,7 @@ bool RecordWidget::startTsRecord(WorkerConfiguration::WorkerMode mode) { connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::status, this, &RecordWidget::recordStatusChanged); if(ui->graphDataBox->currentText()!= "Bitrate"){ connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::iatStatus, &graph, &RecordWidgetGraph::setBitrate); + isBitrateSignal = false; } else { connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); diff --git a/recordwidget.h b/recordwidget.h index 7343840..d9cd096 100644 --- a/recordwidget.h +++ b/recordwidget.h @@ -38,6 +38,7 @@ class RecordWidget : public QWidget Ui::RecordWidget *ui; bool started; + bool isBitrateSignal; QString currentTreeStream; QString currentDirectory; QString currentFilename; diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 31a4ee2..200d428 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -120,25 +120,33 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ } -void RecordWidgetGraph::changeStream(int selectedStream){ +void RecordWidgetGraph::changeStream(int selectedStream, bool isBitrateSignal){ chart()->removeSeries(lineSeries); chart()->removeSeries(avgSeries); - lineSeries = streamList[selectedStream]; - avgSeries = avgStreamList[selectedStream]; + if(isBitrateSignal){ - avgSeries->setName("Avg bitrate"); - lineSeries->setName("Bitrate"); - chart()->axisY()->setTitleText("Bitrate mbps"); + lineSeries = streamList[selectedStream]; + avgSeries = avgStreamList[selectedStream]; + + chart()->addSeries(lineSeries); + chart()->addSeries(avgSeries); + } else { + + lineSeries = iatDevList[selectedStream]; + chart()->addSeries(lineSeries); + } QPen pen(QRgb(0x000000)); pen.setWidth(1); lineSeries->setPen(pen); // lineSeries->setColor("black"); - chart()->addSeries(lineSeries); - chart()->addSeries(avgSeries); + + avgSeries->setName("Avg bitrate"); + lineSeries->setName("Bitrate"); + chart()->axisY()->setTitleText("Bitrate mbps"); chart()->createDefaultAxes(); @@ -167,11 +175,12 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // Collects quint64 hashKey = status.streams.keys().at(i); - this->streamList.append(new QLineSeries()); this->avgStreamList.append(new QLineSeries()); + this->iatDevList.append(new QLineSeries()); streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); + iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); firstRound = false; } @@ -179,10 +188,11 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // Collects } else { for(int i = 0; i < status.streams.count(); i++){ quint64 hashKey = status.streams.keys().at(i); - // qInfo() << status.streams[hashKey].currentBitrate << status.streams[hashKey].avgBitrate << i; streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); + iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); + } } diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 691cad5..f8124d0 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -37,7 +37,7 @@ class RecordWidgetGraph : public QChartView // QChart* changeStream(int i); void setAvgBitrate(double avgBitrate); - void changeStream(int i); + void changeStream(int i, bool isBitrateSignal); void recordMultipleStreams(WorkerStatus status); void updateMultipleStreams(WorkerStatus status); void setNoOfStreams(quint8 streams); @@ -52,6 +52,7 @@ class RecordWidgetGraph : public QChartView protected: QList streamList; QList avgStreamList; + QList iatDevList; From 2457816c690445c72d8c393c9a6ffa5ee4732ae4 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 3 Jul 2019 10:55:02 +0200 Subject: [PATCH 32/43] Graph is now working for ts files as well. IAT now works with changeStream --- Middleware/analyzerpcapmiddleware.cpp | 5 --- Middleware/analyzerpcapmiddleware.h | 1 - Recorder/networkpcapfilerecorder.h | 2 -- Recorder/tsnetworkfilerecorder.cpp | 49 +++++++++++++++------------ Recorder/tsnetworkfilerecorder.h | 3 +- recordwidget.cpp | 24 +++++++++---- recordwidgetgraph.cpp | 28 +++++++++++---- 7 files changed, 69 insertions(+), 43 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index ff8ce76..3272233 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -36,11 +36,6 @@ void AnalyzerPcapMiddleware::run() { } -void AnalyzerPcapMiddleware::recieveIatDev(double iatDev, qint64 duration){ - currentIatDev = iatDev; - currentIatDevTimestamp = duration; -} - // Buffers packets void AnalyzerPcapMiddleware::bufferProducts() { QElapsedTimer statusTimer; diff --git a/Middleware/analyzerpcapmiddleware.h b/Middleware/analyzerpcapmiddleware.h index c93b922..fbb32f5 100644 --- a/Middleware/analyzerpcapmiddleware.h +++ b/Middleware/analyzerpcapmiddleware.h @@ -50,7 +50,6 @@ protected slots: public slots: void start(); - void recieveIatDev(double iatDev, qint64 duration); void stop(); }; diff --git a/Recorder/networkpcapfilerecorder.h b/Recorder/networkpcapfilerecorder.h index 9ba0fd1..8fca5d1 100644 --- a/Recorder/networkpcapfilerecorder.h +++ b/Recorder/networkpcapfilerecorder.h @@ -12,8 +12,6 @@ class NetworkPcapFileRecorder : public Recorder Q_OBJECT private: QVector > iatVector; - QList iatDevList; - QList iatDevdurationList; PcapBufferedProducer producer; PcapFileConsumer consumer; NetworkJitter networkJitter; diff --git a/Recorder/tsnetworkfilerecorder.cpp b/Recorder/tsnetworkfilerecorder.cpp index 1cd1340..10f83eb 100644 --- a/Recorder/tsnetworkfilerecorder.cpp +++ b/Recorder/tsnetworkfilerecorder.cpp @@ -2,7 +2,7 @@ void TsNetworkFileRecorder::start() { finalStatus.setAnalysisMode(config.getWorkerMode()); - producer.addNext(&analyzerMiddleware)->addNext(&networkJitter)->addNext(&consumer); + producer.addNext(&networkJitter)->addNext(&analyzerMiddleware)->addNext(&consumer); producer.init(&producerThread); @@ -19,9 +19,8 @@ void TsNetworkFileRecorder::start() { connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::status, this, &TsNetworkFileRecorder::gotAnalyzerStatus); connect(&consumer, &TsFileConsumer::status, this, &TsNetworkFileRecorder::gotConsumerStatus); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::workerStatus, this, &TsNetworkFileRecorder::joinStreamInfo); - connect(&networkJitter, &NetworkJitter::workerStatus, this, &TsNetworkFileRecorder::joinStreamInfo); connect(&analyzerMiddleware, &AnalyzerPcapMiddleware::bitrateStatus, this, &TsNetworkFileRecorder::gotBitrate); - connect(&networkJitter, &NetworkJitter::iatStatus, this, &TsNetworkFileRecorder::gotIatDev); + connect(&networkJitter, &NetworkJitter::workerStatus, this, &TsNetworkFileRecorder::gotIatDev); @@ -62,28 +61,28 @@ void TsNetworkFileRecorder::gotAnalyzerStatus(AnalyzerStatus aStatus) { } } +void TsNetworkFileRecorder::joinStreamInfo(WorkerStatus status, bool isDeviationSignal) { + qint8 counter = 0; -void TsNetworkFileRecorder::joinStreamInfo(WorkerStatus xStatus, bool isDeviationSignal) { - - //Iterates hashmap - for(auto iter = xStatus.getStreams().begin(); iter != xStatus.getStreams().end(); ++iter) { + for(auto iter = status.getStreams().begin(); iter != status.getStreams().end(); ++iter) { qint64 streamID = iter.key(); const StreamInfo &streamInfo= iter.value(); - if(!isDeviationSignal){ - previousAnalyzerStream.streams[streamID] = streamInfo; - // qInfo("hej"); + // if(!isDeviationSignal){ + previousAnalyzerStream.streams[streamID] = streamInfo; - } else if(isDeviationSignal){ - previousAnalyzerStream.streams[streamID].iatDeviation = streamInfo.iatDeviation; - // qInfo("hejhejhejhejhej"); - quint32 test = streamInfo.iatDeviation; - qInfo() << streamID << test; - WorkerStatus completeSignal; + // Make IAT work for any numer of streams + if(iatVector.size() <= counter){ + previousAnalyzerStream.streams[streamID].iatDeviation = 0; - completeSignal.setStreams(previousAnalyzerStream.streams); - emit workerStatus(completeSignal); + } else { + previousAnalyzerStream.streams[streamID].iatDeviation = (iatVector[counter].last() ); } + WorkerStatus completeSignal; + + completeSignal.setStreams(previousAnalyzerStream.streams); + emit workerStatus(completeSignal); + counter++; } } @@ -102,11 +101,19 @@ void TsNetworkFileRecorder::gotBitrate(double bitrate, qint64 duration){ } -void TsNetworkFileRecorder::gotIatDev(double iatDev, qint64 duration){ - emit iatStatus(iatDev, duration); -} +void TsNetworkFileRecorder::gotIatDev(WorkerStatus status, bool isDeviationSignal){ + + this->iatVector.resize(status.streams.count()); + for(int i = 0; i < status.streams.count(); i++) { + quint64 hashKey = status.streams.keys().at(i); + // qInfo() << (status.streams[hashKey].iatDeviation)<< "IATVALUE BEING APPENDED"; + + iatVector[i].append(status.streams[hashKey].iatDeviation); + //qInfo() << iatDevList.last() << "IATLIST VALUE AT INDEX 0"; + } +} diff --git a/Recorder/tsnetworkfilerecorder.h b/Recorder/tsnetworkfilerecorder.h index b6d00a7..8f0f97e 100644 --- a/Recorder/tsnetworkfilerecorder.h +++ b/Recorder/tsnetworkfilerecorder.h @@ -10,6 +10,7 @@ class TsNetworkFileRecorder : public Recorder { private: + QVector > iatVector; PcapBufferedProducer producer; TsFileConsumer consumer; AnalyzerPcapMiddleware analyzerMiddleware; @@ -38,7 +39,7 @@ private slots: void moduleFinished(); void joinStreamInfo(WorkerStatus dStatus, bool signalType); void gotBitrate(double bitrate, qint64 duration); - void gotIatDev(double iatDev, qint64 duration); + void gotIatDev(WorkerStatus status, bool isDeviationSignal); }; diff --git a/recordwidget.cpp b/recordwidget.cpp index c9b3f48..4fdedc9 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -39,6 +39,7 @@ RecordWidget::RecordWidget(QWidget *parent) : connect(ui->recordRtpFecCheckBox, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate); connect(ui->recordUnicastCheckBox, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate); connect(ui->treeWidget, &QTreeWidget::itemClicked, this, &RecordWidget::changeStream); +// connect(ui->graphDataBox, &QComboBox::currentTextChanged, this, &RecordWidget::changeStream); // connect(ui->graphView, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate ); @@ -153,7 +154,15 @@ void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { } void RecordWidget::changeStream(){ + updateStreamIndex(); +/* + if (ui->graphDataBox->currentText().contains("IAT")){ + isBitrateSignal = false; + } else { + isBitrateSignal = true; + } +*/ graph.changeStream(selectedStreamIndex, isBitrateSignal); ui->graphView->setChart(graph.chart()); } @@ -182,7 +191,7 @@ void RecordWidget::recordingFinished() { ui->recordPcapFilterContainer->setEnabled(true); ui->recordInterfaceSelect->setEnabled(true); ui->graphDataBox->setEnabled(true); - selectedStreamIndex = 0; + // selectedStreamIndex = 0; this->treeWidgetCounter = 0; @@ -268,9 +277,10 @@ bool RecordWidget::startPcapRecord(WorkerConfiguration::WorkerMode mode) { connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::status, this, &RecordWidget::recordStatusChanged); if(ui->graphDataBox->currentText()!= "Bitrate"){ - connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); isBitrateSignal = false; + connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); } else { + isBitrateSignal = true; connect(networkPcapFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); } @@ -298,15 +308,15 @@ bool RecordWidget::startTsRecord(WorkerConfiguration::WorkerMode mode) { connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::started, this, &RecordWidget::recordingStarted); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::finished, this, &RecordWidget::recordingFinished); connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::status, this, &RecordWidget::recordStatusChanged); + if(ui->graphDataBox->currentText()!= "Bitrate"){ - connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::iatStatus, &graph, &RecordWidgetGraph::setBitrate); isBitrateSignal = false; - + connect(tsNetworkFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); } else { - connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::bitrateStatus, &graph, &RecordWidgetGraph::setBitrate); - + isBitrateSignal = true; + connect(tsNetworkFileRecorder, &NetworkPcapFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); } - connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); + // connect(tsNetworkFileRecorder, &TsNetworkFileRecorder::workerStatus, this, &RecordWidget::recordWorkerStatusChanged); ui->recordStartStopBtn->setEnabled(false); tsNetworkFileRecorder->start(); diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 200d428..8f7f08e 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -25,6 +25,14 @@ RecordWidgetGraph::~RecordWidgetGraph() for (auto ls : this->streamList) { delete ls; } + + for (auto ls : this->avgStreamList) { + delete ls; + } + + for (auto ls : this->iatDevList) { + delete ls; + } } @@ -33,6 +41,7 @@ QChart* RecordWidgetGraph::setupGraph(){ firstRound = true; streamList.clear(); avgStreamList.clear(); + iatDevList.clear(); lineSeries = new QLineSeries(); avgSeries = new QLineSeries(); @@ -126,16 +135,21 @@ void RecordWidgetGraph::changeStream(int selectedStream, bool isBitrateSignal){ chart()->removeSeries(avgSeries); if(isBitrateSignal){ - lineSeries = streamList[selectedStream]; avgSeries = avgStreamList[selectedStream]; chart()->addSeries(lineSeries); chart()->addSeries(avgSeries); + + + avgSeries->setName("Avg bitrate"); + lineSeries->setName("Bitrate"); } else { - lineSeries = iatDevList[selectedStream]; + lineSeries = iatDevList[selectedStream]; chart()->addSeries(lineSeries); + + lineSeries->setName("IAT dev"); } QPen pen(QRgb(0x000000)); @@ -144,9 +158,6 @@ void RecordWidgetGraph::changeStream(int selectedStream, bool isBitrateSignal){ // lineSeries->setColor("black"); - avgSeries->setName("Avg bitrate"); - lineSeries->setName("Bitrate"); - chart()->axisY()->setTitleText("Bitrate mbps"); chart()->createDefaultAxes(); @@ -157,7 +168,12 @@ void RecordWidgetGraph::changeStream(int selectedStream, bool isBitrateSignal){ this->chart()->setAxisX(axisX, lineSeries); - avgSeries->attachAxis(chart()->axisX()); + if(isBitrateSignal){ + avgSeries->attachAxis(chart()->axisX()); + chart()->axisY()->setTitleText("Bitrate mbps"); + } else { + chart()->axisY()->setTitleText("Std IAT dev µs"); + } this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(durations - 20000), QDateTime::fromMSecsSinceEpoch(durations + 2000)); From 10cb2ebd7d82a59584ff9d7d9993fbf0decf3a12 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 3 Jul 2019 15:07:07 +0200 Subject: [PATCH 33/43] Going to start messing around with playbackwidget, this state is actually working pretty well. --- Middleware/analyzerpcapmiddleware.cpp | 3 --- Recorder/networkpcapfilerecorder.cpp | 13 ++++++++++--- recordwidgetgraph.cpp | 19 +------------------ 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index 3272233..60cb8d2 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -136,15 +136,12 @@ void AnalyzerPcapMiddleware::bufferProducts() { } else { - } } // case 1: sanity check true buffer.push(input); packetNumber++; - - } else { diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index c649997..081bf5a 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -60,10 +60,12 @@ void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus status, bool isDeviati for(auto iter = status.getStreams().begin(); iter != status.getStreams().end(); ++iter) { qint64 streamID = iter.key(); - const StreamInfo &streamInfo= iter.value(); + const StreamInfo &streamInfo = iter.value(); // if(!isDeviationSignal){ - previousAnalyzerStream.streams[streamID] = streamInfo; + if (previousAnalyzerStream.streams.count(streamID) > 0) { + previousAnalyzerStream.streams[streamID] = streamInfo; + } // Make IAT work for any numer of streams if(iatVector.size() <= counter){ @@ -71,13 +73,18 @@ void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus status, bool isDeviati } else { previousAnalyzerStream.streams[streamID].iatDeviation = (iatVector[counter].last() ); + qDebug() << streamInfo.currentTime << "IAT dev timestamp + " << previousAnalyzerStream.streams[streamID].iatDeviation; } - WorkerStatus completeSignal; + WorkerStatus completeSignal; completeSignal.setStreams(previousAnalyzerStream.streams); emit workerStatus(completeSignal); + + counter++; } + + } void NetworkPcapFileRecorder::gotIatDev(WorkerStatus status, bool isDeviationSignal){ diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 8f7f08e..4874188 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -25,14 +25,6 @@ RecordWidgetGraph::~RecordWidgetGraph() for (auto ls : this->streamList) { delete ls; } - - for (auto ls : this->avgStreamList) { - delete ls; - } - - for (auto ls : this->iatDevList) { - delete ls; - } } @@ -107,7 +99,6 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ this->durations = duration; lineSeries->append(duration, bitrate); - qInfo() << bitrate << "HEJEHEJEHEJEHJEHEJ"; if(avgBitrate != 0){ avgSeries->append(duration, avgBitrate); @@ -141,14 +132,11 @@ void RecordWidgetGraph::changeStream(int selectedStream, bool isBitrateSignal){ chart()->addSeries(lineSeries); chart()->addSeries(avgSeries); - avgSeries->setName("Avg bitrate"); lineSeries->setName("Bitrate"); } else { - lineSeries = iatDevList[selectedStream]; chart()->addSeries(lineSeries); - lineSeries->setName("IAT dev"); } @@ -156,15 +144,13 @@ void RecordWidgetGraph::changeStream(int selectedStream, bool isBitrateSignal){ pen.setWidth(1); lineSeries->setPen(pen); - // lineSeries->setColor("black"); - chart()->createDefaultAxes(); QDateTimeAxis *axisX = new QDateTimeAxis; axisX->setFormat("m:ss"); axisX->setTickCount(10); - axisX->setTitleText("Time m:s"); + axisX->setTitleText("Time m:ss"); this->chart()->setAxisX(axisX, lineSeries); @@ -188,7 +174,6 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // Collects if (firstRound){ for(int i = 0; i < status.streams.count(); i++){ - quint64 hashKey = status.streams.keys().at(i); this->streamList.append(new QLineSeries()); @@ -204,14 +189,12 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // Collects } else { for(int i = 0; i < status.streams.count(); i++){ quint64 hashKey = status.streams.keys().at(i); - streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); } } - } /* void RecordWidgetGraph::setupLineSeries(){ From f602a7f05004375d03816fd336b24057e8242ad4 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Mon, 8 Jul 2019 11:02:30 +0200 Subject: [PATCH 34/43] Fixed some bugs for RecordWidgetGraph. --- Recorder/networkpcapfilerecorder.cpp | 4 +-- Recorder/networkpcapfilerecorder.h | 4 +-- mainwindow.cpp | 2 +- playbackwidget.cpp | 8 ++++- playbackwidget.h | 3 ++ playbackwidget.ui | 50 +++++++++++++++++++--------- recordwidget.cpp | 31 ++++++++++------- recordwidget.h | 1 + recordwidgetgraph.cpp | 28 +++++++++------- recordwidgetgraph.h | 4 --- 10 files changed, 86 insertions(+), 49 deletions(-) diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index 081bf5a..18f4694 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -55,7 +55,7 @@ void NetworkPcapFileRecorder::gotProducerStatus(Status pStatus) { -void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus status, bool isDeviationSignal) { +void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus status) { qint8 counter = 0; for(auto iter = status.getStreams().begin(); iter != status.getStreams().end(); ++iter) { @@ -87,7 +87,7 @@ void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus status, bool isDeviati } -void NetworkPcapFileRecorder::gotIatDev(WorkerStatus status, bool isDeviationSignal){ +void NetworkPcapFileRecorder::gotIatDev(WorkerStatus status){ this->iatVector.resize(status.streams.count()); diff --git a/Recorder/networkpcapfilerecorder.h b/Recorder/networkpcapfilerecorder.h index 8fca5d1..a074357 100644 --- a/Recorder/networkpcapfilerecorder.h +++ b/Recorder/networkpcapfilerecorder.h @@ -41,10 +41,10 @@ class NetworkPcapFileRecorder : public Recorder private slots: void gotProducerStatus(Status pStatus); void gotAnalyzerStatus(AnalyzerStatus aStatus); - void joinStreamInfo(WorkerStatus dStatus, bool isDeviationSignal); + void joinStreamInfo(WorkerStatus dStatus); void gotConsumerStatus(Status cStatus); void gotBitrate(double bitrate, qint64 duration); - void gotIatDev(WorkerStatus dStatus, bool isDeviationSignal); + void gotIatDev(WorkerStatus dStatus); void moduleFinished(); }; diff --git a/mainwindow.cpp b/mainwindow.cpp index a24306d..70db3fe 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -41,7 +41,7 @@ void MainWindow::loadSettings() { ui->playbackWidget->loadSettings(); ui->recordWidget->loadSettings(); ui->convertWidget->loadSettings(); - ui->recordWidget->graph.setFocus(); + //ui->recordWidget->graph.setFocus(); diff --git a/playbackwidget.cpp b/playbackwidget.cpp index c372eef..e536fbe 100644 --- a/playbackwidget.cpp +++ b/playbackwidget.cpp @@ -20,9 +20,13 @@ StreamId selectedStreamId; PlaybackWidget::PlaybackWidget(QWidget *parent) : QWidget(parent), ui(new Ui::PlaybackWidget), - started(false) + started(false), + graph(this) { ui->setupUi(this); + graph.setupGraph(); + ui->graphView->setChart(graph.chart()); + ui->graphView->setRenderHint(QPainter::Antialiasing); // Advanced PCAP filter ui->playbackPcapFilterContainer->hide(); @@ -31,9 +35,11 @@ PlaybackWidget::PlaybackWidget(QWidget *parent) : connect(ui->playbackHost, &QLineEdit::textChanged, this, &PlaybackWidget::playbackInputChanged); connect(ui->playbackPort, &QLineEdit::textChanged, this, &PlaybackWidget::playbackInputChanged); + for (int i = 0; i < MainWindow::interfaces.length(); i++) { ui->playbackInterfaceSelect->addItem(MainWindow::interfaces.at(i).getName()); ui->playbackInterfaceSelect->setItemData(i, MainWindow::interfaces.at(i).getName(), Qt::ToolTipRole); + } diff --git a/playbackwidget.h b/playbackwidget.h index ee5c546..787eec6 100644 --- a/playbackwidget.h +++ b/playbackwidget.h @@ -4,6 +4,8 @@ #include "Configuration/workerconfiguration.h" #include "Player/pcapfilenetworkplayer.h" #include +#include +#include namespace Ui { class PlaybackWidget; @@ -24,6 +26,7 @@ class PlaybackWidget : public QWidget private: Ui::PlaybackWidget *ui; + RecordWidgetGraph graph; bool started; bool validatePlaybackInputs(); bool startPcapPlayback(WorkerConfiguration::WorkerMode mode = WorkerConfiguration::NORMAL_MODE); diff --git a/playbackwidget.ui b/playbackwidget.ui index c07ad4c..da1163d 100644 --- a/playbackwidget.ui +++ b/playbackwidget.ui @@ -6,8 +6,8 @@ 0 0 - 730 - 389 + 764 + 700 @@ -31,8 +31,8 @@ Settings - - + + 0 @@ -60,7 +60,7 @@ - + 0 @@ -77,7 +77,7 @@ - + @@ -115,7 +115,7 @@ - + border: none @@ -134,7 +134,7 @@ - + @@ -153,7 +153,23 @@ - + + + + + 0 + 300 + + + + true + + + Qt::NoFocus + + + + Qt::Vertical @@ -166,7 +182,7 @@ - + @@ -176,11 +192,11 @@ - + - + Play @@ -255,9 +271,13 @@ QTreeView::branch:open:has-children:has-siblings { + + + QChartView + QGraphicsView +
QtCharts
+
+
- - - diff --git a/recordwidget.cpp b/recordwidget.cpp index 4fdedc9..119c9c5 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -16,7 +16,8 @@ RecordWidget::RecordWidget(QWidget *parent) : graph(this), ui(new Ui::RecordWidget), started(false), - isBitrateSignal(true) + isBitrateSignal(true), + didRun(false) { ui->setupUi(this); this->setupGraph(); @@ -25,6 +26,7 @@ RecordWidget::RecordWidget(QWidget *parent) : selectedStreamIndex = 0; + // Advanced PCAP filter ui->recordPcapFilterContainer->hide(); connect(ui->recordExpandPCAPFilterButton, SIGNAL(toggled(bool)), this, SLOT(on_recordExpandPCAPFilterButton_toggled(bool))); @@ -39,7 +41,8 @@ RecordWidget::RecordWidget(QWidget *parent) : connect(ui->recordRtpFecCheckBox, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate); connect(ui->recordUnicastCheckBox, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate); connect(ui->treeWidget, &QTreeWidget::itemClicked, this, &RecordWidget::changeStream); -// connect(ui->graphDataBox, &QComboBox::currentTextChanged, this, &RecordWidget::changeStream); + + connect(ui->graphDataBox, &QComboBox::currentTextChanged, this, &RecordWidget::changeStream); // connect(ui->graphView, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate ); @@ -106,6 +109,7 @@ void RecordWidget::recordingStarted() { ui->recordInterfaceSelect->setEnabled(false); ui->graphDataBox->setEnabled(false); this->setupGraph(); + didRun = true; if(ui->graphDataBox->currentText()== "Bitrate"){ this->graph.setYAxisTitle("Bitrate mbps"); @@ -127,7 +131,7 @@ void RecordWidget::recordWorkerGraphInfo(WorkerStatus status){ graph.setBitrate(status.streams[hashKey].iatDeviation, status.streams[hashKey].currentTime); } - if(ui->treeWidget->topLevelItemCount() > 1){ + if(ui->treeWidget->topLevelItemCount() > 0){ graph.recordMultipleStreams(status); if(selectedStreamIndex != graph.selectedStreamIndex){ @@ -155,16 +159,19 @@ void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { void RecordWidget::changeStream(){ - updateStreamIndex(); -/* - if (ui->graphDataBox->currentText().contains("IAT")){ - isBitrateSignal = false; - } else { - isBitrateSignal = true; + if(didRun){ + updateStreamIndex(); + + if (ui->graphDataBox->currentText().contains("IAT")){ + isBitrateSignal = false; + } else { + isBitrateSignal = true; + } + + graph.changeStream(selectedStreamIndex, isBitrateSignal); + ui->graphView->setChart(graph.chart()); + } -*/ - graph.changeStream(selectedStreamIndex, isBitrateSignal); - ui->graphView->setChart(graph.chart()); } void RecordWidget::updateStreamIndex(){ diff --git a/recordwidget.h b/recordwidget.h index d9cd096..b24f04b 100644 --- a/recordwidget.h +++ b/recordwidget.h @@ -39,6 +39,7 @@ class RecordWidget : public QWidget Ui::RecordWidget *ui; bool started; bool isBitrateSignal; + bool didRun; QString currentTreeStream; QString currentDirectory; QString currentFilename; diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 4874188..7cb5e73 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -170,7 +170,7 @@ void RecordWidgetGraph::setNoOfStreams(quint8 noOfStreams){ this->noOfStreams = noOfStreams; } -void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // Collects data for multiple streams +void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This should probably be made more generic, it's not optimal if (firstRound){ for(int i = 0; i < status.streams.count(); i++){ @@ -179,28 +179,32 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // Collects this->streamList.append(new QLineSeries()); this->avgStreamList.append(new QLineSeries()); this->iatDevList.append(new QLineSeries()); - streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); - avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); - iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); - firstRound = false; + if(status.streams[hashKey].currentBitrate != 0 && status.streams[hashKey].avgBitrate != 0 && status.streams[hashKey].iatDeviation ){ + streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); + avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); + iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); + + firstRound = false; + } } } else { for(int i = 0; i < status.streams.count(); i++){ + quint64 hashKey = status.streams.keys().at(i); - streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); - avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); - iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); + if(status.streams[hashKey].currentBitrate != 0 && status.streams[hashKey].avgBitrate != 0 && status.streams[hashKey].iatDeviation){ + + streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); + avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); + iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); + } } } } -/* -void RecordWidgetGraph::setupLineSeries(){ -} -*/ + void RecordWidgetGraph::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index f8124d0..130889f 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -5,7 +5,6 @@ #include "mainwindow.h" #include "recordwidget.h" -#include "Middleware/analyzerpcapmiddleware.h" #include @@ -20,12 +19,10 @@ QT_CHARTS_USE_NAMESPACE class RecordWidgetGraph : public QChartView { - public: quint8 selectedStreamIndex; - RecordWidgetGraph(QWidget *parent); ~RecordWidgetGraph(); QChart GraphChart; @@ -39,7 +36,6 @@ class RecordWidgetGraph : public QChartView void setAvgBitrate(double avgBitrate); void changeStream(int i, bool isBitrateSignal); void recordMultipleStreams(WorkerStatus status); - void updateMultipleStreams(WorkerStatus status); void setNoOfStreams(quint8 streams); void keyPressEvent(QKeyEvent *event); void mouseMoveEvent(QMouseEvent *event); From d802e0f2b0315658c15a3b290d53ad669e44e0e3 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Thu, 11 Jul 2019 11:47:02 +0200 Subject: [PATCH 35/43] Now printing csv file --- Middleware/analyzerpcapmiddleware.cpp | 38 ++++- Middleware/networkjitter.cpp | 3 +- Middleware/pcapmiddleware.h | 3 + PacketConsumer/tsfileconsumer.cpp | 1 - PacketProducer/pcapbufferedproducer.cpp | 2 + Recorder/networkpcapfilerecorder.cpp | 9 +- playbackwidget.cpp | 11 +- playbackwidget.h | 5 +- recordtxtprinter.cpp | 29 +++- recordtxtprinter.h | 6 +- recordwidget.cpp | 5 +- recordwidget.ui | 184 ++++++++++++------------ recordwidgetgraph.cpp | 52 ++++++- recordwidgetgraph.h | 11 ++ 14 files changed, 230 insertions(+), 129 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index 60cb8d2..fc94fcb 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -38,7 +38,7 @@ void AnalyzerPcapMiddleware::run() { // Buffers packets void AnalyzerPcapMiddleware::bufferProducts() { - QElapsedTimer statusTimer; + QTime statusTimer; statusTimer.start(); packetNumber = 0; @@ -58,7 +58,10 @@ void AnalyzerPcapMiddleware::bufferProducts() { PcapProduct input; + while (!stopping) { + + input = prevProvider->getProduct(); if (input.type == PcapProduct::NORMAL && !hasLooped) { PacketParser parser((pcap_pkthdr*)input.header.data(), (const u_char*)input.data.data()); @@ -67,6 +70,7 @@ void AnalyzerPcapMiddleware::bufferProducts() { if (startTime == -1) { startTime = ((pcap_pkthdr*)input.header.data())->ts.tv_sec * 1000; // convert to ms startTime += ((pcap_pkthdr*)input.header.data())->ts.tv_usec/1000; // convert to ms + lastDuration = 0; } else { endTime = ((pcap_pkthdr*)input.header.data())->ts.tv_sec*1000; @@ -77,10 +81,10 @@ void AnalyzerPcapMiddleware::bufferProducts() { // 1 second of trafic, calculate bitrate for that second - if (duration - lastDuration >= 200) { + if (duration - lastDuration >= emitFrequency) { bitrate = (bytes - lastSecondBytes)*8*1000/(duration - lastDuration); lastSecondBytes = bytes; - lastDuration = duration; + // lastDuration = duration; } } @@ -151,7 +155,7 @@ void AnalyzerPcapMiddleware::bufferProducts() { } } - else if (input.type == PcapProduct::LOOP) { + else if (input.type == PcapProduct::LOOP || input.type == PcapProduct::END) { hasLooped = true; buffer.push(input); @@ -160,8 +164,28 @@ void AnalyzerPcapMiddleware::bufferProducts() { } - if (statusTimer.elapsed() >= 200) { + + + + qInfo() << statusTimer.currentTime() << " OUTSIDE"; + + if (lastDuration > 10000000000){ + lastDuration = 0; + } + + + if (duration - lastDuration >= emitFrequency) { + + qInfo() << "STATUSTIMER.ELAPSED APM" << statusTimer.elapsed(); + + + + lastDuration = duration; + + + for (auto &stream : streams) { + stream.avgBitrate = ((double)stream.bytes*8*1000.0/stream.currentTime) /1000000.0; stream.currentBitrate = (double)(stream.bytes - stream.lastSecondBytes)*8*1000/(duration - stream.lastDuration) / 1000000; stream.lastSecondBytes = stream.bytes; @@ -174,8 +198,10 @@ void AnalyzerPcapMiddleware::bufferProducts() { } qInfo() << "bitrate" << (double) bitrate /1000000; - emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams), false); + statusTimer.restart(); + qInfo() << statusTimer.currentTime() << "KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK"; + emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams), false); } if (input.type == PcapProduct::END || input.type == PcapProduct::STOP) { diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp index 4ab5f4c..8d0983f 100644 --- a/Middleware/networkjitter.cpp +++ b/Middleware/networkjitter.cpp @@ -53,7 +53,6 @@ void NetworkJitter::run(){ bytes += parser.data_len; input = prevProvider->getProduct(); - { PacketParser parser((pcap_pkthdr*)input.header.data(), (const u_char*)input.data.data()); @@ -89,7 +88,7 @@ void NetworkJitter::run(){ //Calculate average diff per second and IAT standard deviation per millisecond - if(statusTimer.elapsed() >= 199){ + if(statusTimer.elapsed() >= emitFrequency){ // If no packages recieved, wait(?) if(packetCounter != 0){ diffratePerSec = differencePerSec/packetCounter; diff --git a/Middleware/pcapmiddleware.h b/Middleware/pcapmiddleware.h index 7d465af..0ad88c7 100644 --- a/Middleware/pcapmiddleware.h +++ b/Middleware/pcapmiddleware.h @@ -20,6 +20,9 @@ class PcapMiddleware : public QObject, public PcapProductProvider PcapMiddleware(WorkerConfiguration config) : QObject(), config(config) {} + + quint16 emitFrequency = 100; + signals: void started(); void finished(); diff --git a/PacketConsumer/tsfileconsumer.cpp b/PacketConsumer/tsfileconsumer.cpp index e16e395..5271ba2 100644 --- a/PacketConsumer/tsfileconsumer.cpp +++ b/PacketConsumer/tsfileconsumer.cpp @@ -14,7 +14,6 @@ void TsFileConsumer::start(QThread *thread) { connect(this, &TsFileConsumer::finished, thread, &QThread::quit); //connect(this, &TsFileConsumer::finished, &QThread::deleteLater); //connect(thread, &QThread::finished, thread, &QThread::deleteLater); - thread->start(); } diff --git a/PacketProducer/pcapbufferedproducer.cpp b/PacketProducer/pcapbufferedproducer.cpp index 243835b..45318ef 100644 --- a/PacketProducer/pcapbufferedproducer.cpp +++ b/PacketProducer/pcapbufferedproducer.cpp @@ -291,6 +291,8 @@ int PcapBufferedProducer::bufferFromNetworkSetup() { statusLastTime = 0; elapsedTimer.start(); + qInfo() << "TIME JITTER " << QTime::currentTime(); + #ifndef Q_OS_WIN // Setup no data timer diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index 18f4694..0a7be91 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -66,25 +66,20 @@ void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus status) { if (previousAnalyzerStream.streams.count(streamID) > 0) { previousAnalyzerStream.streams[streamID] = streamInfo; } - // Make IAT work for any numer of streams if(iatVector.size() <= counter){ previousAnalyzerStream.streams[streamID].iatDeviation = 0; } else { previousAnalyzerStream.streams[streamID].iatDeviation = (iatVector[counter].last() ); - qDebug() << streamInfo.currentTime << "IAT dev timestamp + " << previousAnalyzerStream.streams[streamID].iatDeviation; } WorkerStatus completeSignal; completeSignal.setStreams(previousAnalyzerStream.streams); emit workerStatus(completeSignal); - - + qInfo() << "HUR OFTA TAR SIGNALEN EMOT I NPFR" << counter; counter++; } - - } void NetworkPcapFileRecorder::gotIatDev(WorkerStatus status){ @@ -93,10 +88,8 @@ void NetworkPcapFileRecorder::gotIatDev(WorkerStatus status){ for(int i = 0; i < status.streams.count(); i++) { quint64 hashKey = status.streams.keys().at(i); - // qInfo() << (status.streams[hashKey].iatDeviation)<< "IATVALUE BEING APPENDED"; iatVector[i].append(status.streams[hashKey].iatDeviation); - //qInfo() << iatDevList.last() << "IATLIST VALUE AT INDEX 0"; } } diff --git a/playbackwidget.cpp b/playbackwidget.cpp index e536fbe..465a51b 100644 --- a/playbackwidget.cpp +++ b/playbackwidget.cpp @@ -20,14 +20,16 @@ StreamId selectedStreamId; PlaybackWidget::PlaybackWidget(QWidget *parent) : QWidget(parent), ui(new Ui::PlaybackWidget), - started(false), - graph(this) + started(false) + // graph(this) { ui->setupUi(this); + + /* graph.setupGraph(); ui->graphView->setChart(graph.chart()); ui->graphView->setRenderHint(QPainter::Antialiasing); - +*/ // Advanced PCAP filter ui->playbackPcapFilterContainer->hide(); connect(ui->playbackExpandPCAPFilterButton, SIGNAL(toggled(bool)), this, SLOT(on_playbackExpandPCAPFilterButton_toggled(bool))); @@ -110,7 +112,8 @@ void PlaybackWidget::playbackStarted() { } -void PlaybackWidget::playbackStatusChanged(FinalStatus status) { +void PlaybackWidget::playbackStatusChanged(FinalStatus status) { //Kolla in det här, troligen anledningen till att det ej markeras som finished längre. + ui->playbackStatus->setText(status.toUiString()); } diff --git a/playbackwidget.h b/playbackwidget.h index 787eec6..546290b 100644 --- a/playbackwidget.h +++ b/playbackwidget.h @@ -4,8 +4,7 @@ #include "Configuration/workerconfiguration.h" #include "Player/pcapfilenetworkplayer.h" #include -#include -#include +// #include namespace Ui { class PlaybackWidget; @@ -26,7 +25,7 @@ class PlaybackWidget : public QWidget private: Ui::PlaybackWidget *ui; - RecordWidgetGraph graph; + // RecordWidgetGraph graph; bool started; bool validatePlaybackInputs(); bool startPcapPlayback(WorkerConfiguration::WorkerMode mode = WorkerConfiguration::NORMAL_MODE); diff --git a/recordtxtprinter.cpp b/recordtxtprinter.cpp index d995d25..a08b051 100644 --- a/recordtxtprinter.cpp +++ b/recordtxtprinter.cpp @@ -5,14 +5,35 @@ RecordTxtPrinter::RecordTxtPrinter() { + } -void RecordTxtPrinter::printToFile(QString text){ - QString filename="/home/marko.marinkovic/Documents/Data.txt"; - QFile file( filename ); - if ( file.open(QIODevice::ReadWrite) ) +void RecordTxtPrinter::printToFile( QString text, bool firstRound, QString currentFilename){ + + QString filename = currentFilename; + filename.replace(".pcap", ".csv"); + QFile file(filename); + + if(firstRound){ + file.resize(0); + + if ( file.open(QIODevice::Append) ) + { + QTextStream stream( &file ); + + QString s1 = "Timestamp,"; + QString s2 = "Bitrate," ; + QString s3 = "IAT deviation"; + + QString string = ( s1+ s2 + s3 ); + stream << string << endl; + } + + } + + if ( file.open(QIODevice::Append) ) { QTextStream stream( &file ); stream << text << endl; diff --git a/recordtxtprinter.h b/recordtxtprinter.h index e5d4ee3..55b0f1f 100644 --- a/recordtxtprinter.h +++ b/recordtxtprinter.h @@ -2,13 +2,15 @@ #define RECORDTXTPRINTER_H #include +#include +#include + class RecordTxtPrinter { public: RecordTxtPrinter(); - void printToFile(QString text); - + void printToFile(QString text, bool firstRound, QString currentFilename); protected: }; diff --git a/recordwidget.cpp b/recordwidget.cpp index 119c9c5..78920d8 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -27,6 +27,7 @@ RecordWidget::RecordWidget(QWidget *parent) : + // Advanced PCAP filter ui->recordPcapFilterContainer->hide(); connect(ui->recordExpandPCAPFilterButton, SIGNAL(toggled(bool)), this, SLOT(on_recordExpandPCAPFilterButton_toggled(bool))); @@ -87,7 +88,7 @@ void RecordWidget::saveSettings() { settings.beginGroup("record"); settings.setValue("interface", MainWindow::interfaces.at(ui->recordInterfaceSelect->currentIndex()).getId()); settings.setValue("host", ui->recordHost->text()); - settings.setValue("port", ui->recordPort->text()); + settings.setValue("port", ui->recordPort->text());https://stackoverflow.com/questions/32446189/qt-from-unsigned-long-long-to-qjsonobject settings.setValue("rtp-fec", ui->recordRtpFecCheckBox->isChecked()); settings.setValue("unicast", ui->recordUnicastCheckBox->isChecked()); settings.setValue("filename", currentFilename); @@ -109,6 +110,8 @@ void RecordWidget::recordingStarted() { ui->recordInterfaceSelect->setEnabled(false); ui->graphDataBox->setEnabled(false); this->setupGraph(); + graph.setCurrentFileName(currentFilename); + didRun = true; if(ui->graphDataBox->currentText()== "Bitrate"){ diff --git a/recordwidget.ui b/recordwidget.ui index f498e34..378f0d5 100644 --- a/recordwidget.ui +++ b/recordwidget.ui @@ -35,55 +35,54 @@ Settings - - - - - 0 - - - - - PCAP filter - - - - - - - - 3 - 0 - - - - - 16777215 - 16777215 - - - - Qt::ClickFocus - - - - - - - - - + + + + Qt::Vertical + + - 0 - 700 + 20 + 40 - - true + + + + + + 0 + + + + Network interface + + + + + + + + + + + + 0 + + + + + + + + Qt::NoFocus + + Start recording + @@ -124,56 +123,6 @@
- - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::NoFocus - - - Start recording - - - - - - - 0 - - - - - - - - - - 0 - - - - - Network interface - - - - - - - - @@ -240,6 +189,41 @@ + + + + + 0 + + + + + PCAP filter + + + + + + + + 3 + 0 + + + + + 16777215 + 16777215 + + + + Qt::ClickFocus + + + + + + @@ -290,6 +274,22 @@ + + + + + 0 + 200 + + + + true + + + Qt::NoFocus + + +
diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 7cb5e73..ed59e08 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -15,6 +15,8 @@ RecordWidgetGraph::RecordWidgetGraph( QWidget *parent): this->setMouseTracking(true); this->setRubberBand(QChartView::RectangleRubberBand); + dataRefreshCounter = 0; + } @@ -38,6 +40,9 @@ QChart* RecordWidgetGraph::setupGraph(){ lineSeries = new QLineSeries(); avgSeries = new QLineSeries(); + // lineSeries->setUseOpenGL(true); + + avgSeries->setName("Avg bitrate"); lineSeries->setName("Bitrate"); @@ -59,6 +64,8 @@ QChart* RecordWidgetGraph::setupGraph(){ this->setChart(chart); this->chartCounter = 0; + durations = 0; + dataRefreshCounter = 0; this->maxBitrate = 0; this->minBitrate = 5000; this->zoomInt = 0; @@ -70,7 +77,6 @@ QChart* RecordWidgetGraph::setupGraph(){ axisX->setTitleText("Time m:s"); this->chart()->setAxisX(axisX, lineSeries); avgSeries->attachAxis(axisX); - // this->axisX = axisX; return(chart); } @@ -84,7 +90,6 @@ void RecordWidgetGraph::setYAxisTitle(QString title){ lineSeries->setName("IAT dev"); chart()->removeSeries(avgSeries); } - } void RecordWidgetGraph::setAvgBitrate(double avgBitrate){ @@ -97,11 +102,13 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ // Appends new values and updates graph if(bitrate > 1 && bitrate < 1000){ this->durations = duration; + + lineSeries->append(duration, bitrate); if(avgBitrate != 0){ - avgSeries->append(duration, avgBitrate); + avgSeries->append(duration, avgBitrate); } this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(duration - 20000), QDateTime::fromMSecsSinceEpoch(duration + 2000)); @@ -172,7 +179,7 @@ void RecordWidgetGraph::setNoOfStreams(quint8 noOfStreams){ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This should probably be made more generic, it's not optimal - if (firstRound){ + if (streamList.count() < status.streams.count()){ for(int i = 0; i < status.streams.count(); i++){ quint64 hashKey = status.streams.keys().at(i); @@ -185,10 +192,10 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This shou avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); - firstRound = false; + // printer->printToFile(((QString::number(status.streams[hashKey].currentTime))) + "," + (QString::number(status.streams[hashKey].currentBitrate)) + "," + (QString::number(status.streams[hashKey].iatDeviation)), firstRound, currentFileName); } } - + firstRound = false; } else { for(int i = 0; i < status.streams.count(); i++){ @@ -199,12 +206,45 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This shou streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); + + printer->printToFile(((QString::number(status.streams[hashKey].currentTime))) + "," + (QString::number(status.streams[hashKey].currentBitrate)) + "," + (QString::number(status.streams[hashKey].iatDeviation)), firstRound, currentFileName); + } + } + + if(durations > 300000){ + for(int i = 0; i < status.streams.count(); i++){ + + streamList[i]->remove(0); + avgStreamList[i]->remove(0); + iatDevList[i]->remove(0); } + lineSeries->remove(0); + avgSeries->remove(0); } } } +void RecordWidgetGraph::refreshData(WorkerStatus status){ + + for(int i = 0; i < status.streams.count(); i++){ + + streamList[i]->remove(dataRefreshCounter); + avgStreamList[i]->remove(dataRefreshCounter); + iatDevList[i]->remove(dataRefreshCounter); + + } + //lineSeries->replace(dataRefreshCounter); + avgSeries->remove(dataRefreshCounter); + // dataRefreshCounter++; +} + + +void RecordWidgetGraph::setCurrentFileName(QString string){ + currentFileName = string; +} + + void RecordWidgetGraph::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 130889f..246d41f 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -5,6 +5,7 @@ #include "mainwindow.h" #include "recordwidget.h" +#include "recordtxtprinter.h" #include @@ -25,6 +26,7 @@ class RecordWidgetGraph : public QChartView RecordWidgetGraph(QWidget *parent); ~RecordWidgetGraph(); + RecordTxtPrinter* printer; QChart GraphChart; qint16 chartCounter; quint8 noOfStreams; @@ -34,6 +36,7 @@ class RecordWidgetGraph : public QChartView // QChart* changeStream(int i); void setAvgBitrate(double avgBitrate); + void setCurrentFileName(QString string); void changeStream(int i, bool isBitrateSignal); void recordMultipleStreams(WorkerStatus status); void setNoOfStreams(quint8 streams); @@ -61,18 +64,26 @@ public slots: private: + + QString currentFileName; bool firstRound = true; QDateTimeAxis *axisX; + QString filename="/home/marko.marinkovic/Documents/Data.txt"; + QFile txtFile; quint32 zoomInt; double avgBitrate; qint64 durations; qint64 currentBitrate; qint64 bitrateTimestamp; + quint64 dataRefreshCounter; QLineSeries *lineSeries; QLineSeries *avgSeries; QPointF m_lastMousePos; bool m_isTouching; bool isScrolling = false; + void refreshData(WorkerStatus status); + + }; #endif // RECORDWIDGETGRAPH_H From 67fd4edbadf61dc2cedc782bdec1011d394dd105 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Thu, 11 Jul 2019 13:55:00 +0200 Subject: [PATCH 36/43] Now generates csv file per stream --- recordtxtprinter.cpp | 12 +++++++++--- recordtxtprinter.h | 2 +- recordwidgetgraph.cpp | 9 +++++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/recordtxtprinter.cpp b/recordtxtprinter.cpp index a08b051..b225dc6 100644 --- a/recordtxtprinter.cpp +++ b/recordtxtprinter.cpp @@ -10,12 +10,18 @@ RecordTxtPrinter::RecordTxtPrinter() -void RecordTxtPrinter::printToFile( QString text, bool firstRound, QString currentFilename){ +void RecordTxtPrinter::printToFile( QString text, bool firstRound, QString currentFileName, QString streamIpAdress){ + + QString filename = currentFileName; + + streamIpAdress.replace('.', '_'); + filename.remove(".pcap"); + filename.append("_" +streamIpAdress); + filename.append(".csv"); - QString filename = currentFilename; - filename.replace(".pcap", ".csv"); QFile file(filename); + if(firstRound){ file.resize(0); diff --git a/recordtxtprinter.h b/recordtxtprinter.h index 55b0f1f..261ef3e 100644 --- a/recordtxtprinter.h +++ b/recordtxtprinter.h @@ -10,7 +10,7 @@ class RecordTxtPrinter { public: RecordTxtPrinter(); - void printToFile(QString text, bool firstRound, QString currentFilename); + void printToFile(QString text, bool firstRound, QString currentFilename, QString streamIpAdress); protected: }; diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index ed59e08..dc5d378 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -192,7 +192,10 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This shou avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); - // printer->printToFile(((QString::number(status.streams[hashKey].currentTime))) + "," + (QString::number(status.streams[hashKey].currentBitrate)) + "," + (QString::number(status.streams[hashKey].iatDeviation)), firstRound, currentFileName); + + QString streamIpAdress = StreamId::calcName(hashKey); + + printer->printToFile(((QString::number(status.streams[hashKey].currentTime))) + "," + (QString::number(status.streams[hashKey].currentBitrate)) + "," + (QString::number(status.streams[hashKey].iatDeviation)), firstRound, currentFileName, streamIpAdress); } } firstRound = false; @@ -207,7 +210,9 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This shou avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); - printer->printToFile(((QString::number(status.streams[hashKey].currentTime))) + "," + (QString::number(status.streams[hashKey].currentBitrate)) + "," + (QString::number(status.streams[hashKey].iatDeviation)), firstRound, currentFileName); + QString streamIpAdress = StreamId::calcName(hashKey); + + printer->printToFile(((QString::number(status.streams[hashKey].currentTime))) + "," + (QString::number(status.streams[hashKey].currentBitrate)) + "," + (QString::number(status.streams[hashKey].iatDeviation)), firstRound, currentFileName, streamIpAdress); } } From b9ab2bacd92c9bde78f5cdd1e1007ffd7f9ac849 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Fri, 12 Jul 2019 10:47:35 +0200 Subject: [PATCH 37/43] CSV files working properly. --- recordtxtprinter.cpp | 33 +++++++++++++++++++-------------- recordtxtprinter.h | 6 +++++- recordwidgetgraph.cpp | 34 ++++++++++++++-------------------- recordwidgetgraph.h | 4 ++-- 4 files changed, 40 insertions(+), 37 deletions(-) diff --git a/recordtxtprinter.cpp b/recordtxtprinter.cpp index b225dc6..85f7066 100644 --- a/recordtxtprinter.cpp +++ b/recordtxtprinter.cpp @@ -4,30 +4,30 @@ RecordTxtPrinter::RecordTxtPrinter() { - +numberOfFiles = 0; } -void RecordTxtPrinter::printToFile( QString text, bool firstRound, QString currentFileName, QString streamIpAdress){ +void RecordTxtPrinter::printToFile(QFile *file, QString text, QString currentFileName, QString streamIpAdress, quint8 currentIterationIndex){ + - QString filename = currentFileName; - streamIpAdress.replace('.', '_'); - filename.remove(".pcap"); - filename.append("_" +streamIpAdress); - filename.append(".csv"); + if(!containedIndexes.contains(currentIterationIndex)){ - QFile file(filename); + QString filename = currentFileName; + streamIpAdress.replace('.', '_'); + filename.remove(".pcap"); + filename.append("_" +streamIpAdress); + filename.append(".csv"); - if(firstRound){ - file.resize(0); + file->setFileName(filename); - if ( file.open(QIODevice::Append) ) + if ( file->open(QIODevice::Truncate | QIODevice::Text | QIODevice::WriteOnly) ) { - QTextStream stream( &file ); + QTextStream stream( file ); QString s1 = "Timestamp,"; QString s2 = "Bitrate," ; @@ -35,13 +35,18 @@ void RecordTxtPrinter::printToFile( QString text, bool firstRound, QString curre QString string = ( s1+ s2 + s3 ); stream << string << endl; + + numberOfFiles++; + containedIndexes.append(currentIterationIndex); } + + } - if ( file.open(QIODevice::Append) ) +// if ( file.open(QIODevice::Append) ) { - QTextStream stream( &file ); + QTextStream stream( file ); stream << text << endl; } } diff --git a/recordtxtprinter.h b/recordtxtprinter.h index 261ef3e..8cff096 100644 --- a/recordtxtprinter.h +++ b/recordtxtprinter.h @@ -9,8 +9,12 @@ class RecordTxtPrinter { public: + + // QFile file; RecordTxtPrinter(); - void printToFile(QString text, bool firstRound, QString currentFilename, QString streamIpAdress); + void printToFile(QFile *file, QString text, QString currentFilename, QString streamIpAdress,quint8 currentIterationIndex); + quint8 numberOfFiles; + QList containedIndexes; protected: }; diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index dc5d378..f1f277b 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -27,20 +27,24 @@ RecordWidgetGraph::~RecordWidgetGraph() for (auto ls : this->streamList) { delete ls; } + + delete printer; } QChart* RecordWidgetGraph::setupGraph(){ - firstRound = true; + fileList.clear(); streamList.clear(); avgStreamList.clear(); iatDevList.clear(); + + printer = new RecordTxtPrinter(); lineSeries = new QLineSeries(); avgSeries = new QLineSeries(); - // lineSeries->setUseOpenGL(true); + // lineSeries->setUseOpenGL(true); avgSeries->setName("Avg bitrate"); @@ -108,7 +112,7 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ if(avgBitrate != 0){ - avgSeries->append(duration, avgBitrate); + avgSeries->append(duration, avgBitrate); } this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(duration - 20000), QDateTime::fromMSecsSinceEpoch(duration + 2000)); @@ -180,26 +184,16 @@ void RecordWidgetGraph::setNoOfStreams(quint8 noOfStreams){ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This should probably be made more generic, it's not optimal if (streamList.count() < status.streams.count()){ - for(int i = 0; i < status.streams.count(); i++){ - quint64 hashKey = status.streams.keys().at(i); + + for(int i = streamList.count(); i < status.streams.count(); i++){ this->streamList.append(new QLineSeries()); this->avgStreamList.append(new QLineSeries()); this->iatDevList.append(new QLineSeries()); - - if(status.streams[hashKey].currentBitrate != 0 && status.streams[hashKey].avgBitrate != 0 && status.streams[hashKey].iatDeviation ){ - streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); - avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); - iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); - - - QString streamIpAdress = StreamId::calcName(hashKey); - - printer->printToFile(((QString::number(status.streams[hashKey].currentTime))) + "," + (QString::number(status.streams[hashKey].currentBitrate)) + "," + (QString::number(status.streams[hashKey].iatDeviation)), firstRound, currentFileName, streamIpAdress); - } + this->fileList.append(new QFile()); } - firstRound = false; - } else { + } + for(int i = 0; i < status.streams.count(); i++){ quint64 hashKey = status.streams.keys().at(i); @@ -212,7 +206,7 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This shou QString streamIpAdress = StreamId::calcName(hashKey); - printer->printToFile(((QString::number(status.streams[hashKey].currentTime))) + "," + (QString::number(status.streams[hashKey].currentBitrate)) + "," + (QString::number(status.streams[hashKey].iatDeviation)), firstRound, currentFileName, streamIpAdress); + printer->printToFile(fileList[i], ((QString::number(status.streams[hashKey].currentTime))) + "," + (QString::number(status.streams[hashKey].currentBitrate)) + "," + (QString::number(status.streams[hashKey].iatDeviation)), currentFileName, streamIpAdress, i); } } @@ -227,7 +221,7 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This shou avgSeries->remove(0); } } -} + void RecordWidgetGraph::refreshData(WorkerStatus status){ diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 246d41f..4908505 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -26,7 +26,7 @@ class RecordWidgetGraph : public QChartView RecordWidgetGraph(QWidget *parent); ~RecordWidgetGraph(); - RecordTxtPrinter* printer; + RecordTxtPrinter *printer; QChart GraphChart; qint16 chartCounter; quint8 noOfStreams; @@ -52,6 +52,7 @@ class RecordWidgetGraph : public QChartView QList streamList; QList avgStreamList; QList iatDevList; + QList fileList; @@ -66,7 +67,6 @@ public slots: private: QString currentFileName; - bool firstRound = true; QDateTimeAxis *axisX; QString filename="/home/marko.marinkovic/Documents/Data.txt"; QFile txtFile; From 8502c32dde84e816fd8fdbf35df557f357dc887c Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Fri, 12 Jul 2019 14:47:15 +0200 Subject: [PATCH 38/43] Now exits program when closing window. Minor cleanup and working on fixing scaling --- Middleware/analyzerpcapmiddleware.cpp | 12 +--- Middleware/networkjitter.cpp | 1 - Recorder/networkpcapfilerecorder.cpp | 1 - Recorder/tsnetworkfilerecorder.cpp | 2 - mainwindow.cpp | 4 +- mainwindow.ui | 10 ++++ recordtxtprinter.cpp | 4 +- recordtxtprinter.h | 1 - recordwidget.cpp | 4 +- recordwidgetgraph.cpp | 83 +++++++++++++++++++-------- recordwidgetgraph.h | 5 +- 11 files changed, 79 insertions(+), 48 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index fc94fcb..524c1d4 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -167,23 +167,17 @@ void AnalyzerPcapMiddleware::bufferProducts() { - qInfo() << statusTimer.currentTime() << " OUTSIDE"; - if (lastDuration > 10000000000){ + + if (lastDuration > 1000000000){ lastDuration = 0; } if (duration - lastDuration >= emitFrequency) { - qInfo() << "STATUSTIMER.ELAPSED APM" << statusTimer.elapsed(); - - - lastDuration = duration; - - for (auto &stream : streams) { stream.avgBitrate = ((double)stream.bytes*8*1000.0/stream.currentTime) /1000000.0; @@ -197,10 +191,8 @@ void AnalyzerPcapMiddleware::bufferProducts() { emit bitrateStatus((double) bitrate /1000000, duration ); } - qInfo() << "bitrate" << (double) bitrate /1000000; statusTimer.restart(); - qInfo() << statusTimer.currentTime() << "KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK"; emit workerStatus(WorkerStatus(WorkerStatus::STATUS_PERIODIC, streams), false); } diff --git a/Middleware/networkjitter.cpp b/Middleware/networkjitter.cpp index 8d0983f..18f1541 100644 --- a/Middleware/networkjitter.cpp +++ b/Middleware/networkjitter.cpp @@ -103,7 +103,6 @@ void NetworkJitter::run(){ finalSum = diffSum/ distanceList.length(); - qInfo() << "Std deviation: " << sqrt(finalSum); quint64 streamId = StreamId::calcId(parser.ih->daddr, parser.dport); diff --git a/Recorder/networkpcapfilerecorder.cpp b/Recorder/networkpcapfilerecorder.cpp index 0a7be91..d081e97 100644 --- a/Recorder/networkpcapfilerecorder.cpp +++ b/Recorder/networkpcapfilerecorder.cpp @@ -77,7 +77,6 @@ void NetworkPcapFileRecorder::joinStreamInfo(WorkerStatus status) { WorkerStatus completeSignal; completeSignal.setStreams(previousAnalyzerStream.streams); emit workerStatus(completeSignal); - qInfo() << "HUR OFTA TAR SIGNALEN EMOT I NPFR" << counter; counter++; } } diff --git a/Recorder/tsnetworkfilerecorder.cpp b/Recorder/tsnetworkfilerecorder.cpp index 10f83eb..9b6775a 100644 --- a/Recorder/tsnetworkfilerecorder.cpp +++ b/Recorder/tsnetworkfilerecorder.cpp @@ -108,10 +108,8 @@ void TsNetworkFileRecorder::gotIatDev(WorkerStatus status, bool isDeviationSigna for(int i = 0; i < status.streams.count(); i++) { quint64 hashKey = status.streams.keys().at(i); - // qInfo() << (status.streams[hashKey].iatDeviation)<< "IATVALUE BEING APPENDED"; iatVector[i].append(status.streams[hashKey].iatDeviation); - //qInfo() << iatDevList.last() << "IATLIST VALUE AT INDEX 0"; } } diff --git a/mainwindow.cpp b/mainwindow.cpp index 70db3fe..4134428 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -101,14 +101,14 @@ void MainWindow::mouseMoveEvent(QMouseEvent *event) } - - void MainWindow::on_actionExit_triggered() { close(); + QApplication::quit(); } + void MainWindow::on_actionAbout_triggered() { QMessageBox::about(this, tr("About %1").arg(QCoreApplication::applicationName()), diff --git a/mainwindow.ui b/mainwindow.ui index e2fa864..959a9b5 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -118,6 +118,16 @@ &About... + + + + :/icons/pngicon + + + + How to navigate graph + + diff --git a/recordtxtprinter.cpp b/recordtxtprinter.cpp index 85f7066..8986c74 100644 --- a/recordtxtprinter.cpp +++ b/recordtxtprinter.cpp @@ -4,7 +4,6 @@ RecordTxtPrinter::RecordTxtPrinter() { -numberOfFiles = 0; } @@ -13,13 +12,13 @@ numberOfFiles = 0; void RecordTxtPrinter::printToFile(QFile *file, QString text, QString currentFileName, QString streamIpAdress, quint8 currentIterationIndex){ - if(!containedIndexes.contains(currentIterationIndex)){ QString filename = currentFileName; streamIpAdress.replace('.', '_'); filename.remove(".pcap"); + filename.remove(".ts"); filename.append("_" +streamIpAdress); filename.append(".csv"); @@ -36,7 +35,6 @@ void RecordTxtPrinter::printToFile(QFile *file, QString text, QString currentFil QString string = ( s1+ s2 + s3 ); stream << string << endl; - numberOfFiles++; containedIndexes.append(currentIterationIndex); } diff --git a/recordtxtprinter.h b/recordtxtprinter.h index 8cff096..a4d94cd 100644 --- a/recordtxtprinter.h +++ b/recordtxtprinter.h @@ -13,7 +13,6 @@ class RecordTxtPrinter // QFile file; RecordTxtPrinter(); void printToFile(QFile *file, QString text, QString currentFilename, QString streamIpAdress,quint8 currentIterationIndex); - quint8 numberOfFiles; QList containedIndexes; protected: diff --git a/recordwidget.cpp b/recordwidget.cpp index 78920d8..d3a00bb 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -128,10 +128,10 @@ void RecordWidget::recordStatusChanged(FinalStatus status) { void RecordWidget::recordWorkerGraphInfo(WorkerStatus status){ quint64 hashKey = status.streams.keys().at(selectedStreamIndex); if(isBitrateSignal){ - graph.setBitrate(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime); + graph.setBitrate(status.streams[hashKey].currentBitrate, status.streams[hashKey].currentTime, isBitrateSignal); } else { - graph.setBitrate(status.streams[hashKey].iatDeviation, status.streams[hashKey].currentTime); + graph.setBitrate(status.streams[hashKey].iatDeviation, status.streams[hashKey].currentTime, isBitrateSignal); } if(ui->treeWidget->topLevelItemCount() > 0){ diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index f1f277b..896a488 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -72,6 +72,8 @@ QChart* RecordWidgetGraph::setupGraph(){ dataRefreshCounter = 0; this->maxBitrate = 0; this->minBitrate = 5000; + this->maxIatDev = 0; + this->minIatDev = 5000; this->zoomInt = 0; this->avgBitrate = 0; @@ -101,13 +103,12 @@ void RecordWidgetGraph::setAvgBitrate(double avgBitrate){ } -void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ +void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration, bool isBitrateSignal){ // Appends new values and updates graph - if(bitrate > 1 && bitrate < 1000){ + if(bitrate > (double) 1 && bitrate < 1000){ this->durations = duration; - lineSeries->append(duration, bitrate); @@ -116,6 +117,7 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ } this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(duration - 20000), QDateTime::fromMSecsSinceEpoch(duration + 2000)); + if(bitrate < this->minBitrate){ minBitrate = bitrate; this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); @@ -126,11 +128,42 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration){ this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); } + // setAxisRange(isBitrateSignal, bitrate); + chartCounter++; } } +void RecordWidgetGraph::setAxisRange(bool isBitrateSignal, double bitrate){ // Work in progress.... + + if(isBitrateSignal){ + + if(bitrate < this->minBitrate){ + minBitrate = bitrate; + this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); + } + + if (this->maxBitrate < bitrate) { + this->maxBitrate = bitrate; + this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); + } } else { + + if(bitrate < this->minIatDev){ + minIatDev= bitrate; + this->chart()->axisY()->setRange(minIatDev - 0.5, this->maxIatDev + 0.5); + } + + if (this->maxIatDev < bitrate) { + this->maxIatDev = bitrate; + this->chart()->axisY()->setRange(minIatDev - 0.5, this->maxIatDev + 0.5); + + } + } +} + + + void RecordWidgetGraph::changeStream(int selectedStream, bool isBitrateSignal){ chart()->removeSeries(lineSeries); @@ -168,12 +201,13 @@ void RecordWidgetGraph::changeStream(int selectedStream, bool isBitrateSignal){ if(isBitrateSignal){ avgSeries->attachAxis(chart()->axisX()); chart()->axisY()->setTitleText("Bitrate mbps"); + // this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); } else { chart()->axisY()->setTitleText("Std IAT dev µs"); + // this->chart()->axisY()->setRange(minIatDev - 0.5, this->maxIatDev + 0.5); } this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(durations - 20000), QDateTime::fromMSecsSinceEpoch(durations + 2000)); - selectedStreamIndex = selectedStream; } @@ -181,7 +215,7 @@ void RecordWidgetGraph::setNoOfStreams(quint8 noOfStreams){ this->noOfStreams = noOfStreams; } -void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This should probably be made more generic, it's not optimal +void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This could probably be made more generic, it's not optimal. Records all streams coming in and prints them to CSV file. if (streamList.count() < status.streams.count()){ @@ -233,9 +267,7 @@ void RecordWidgetGraph::refreshData(WorkerStatus status){ iatDevList[i]->remove(dataRefreshCounter); } - //lineSeries->replace(dataRefreshCounter); avgSeries->remove(dataRefreshCounter); - // dataRefreshCounter++; } @@ -256,24 +288,6 @@ void RecordWidgetGraph::mousePressEvent(QMouseEvent *event) QChartView::mousePressEvent(event); } -void RecordWidgetGraph::mouseMoveEvent(QMouseEvent *event) -{ - if (m_isTouching) - return; - QChartView::mouseMoveEvent(event); -} - -void RecordWidgetGraph::mouseReleaseEvent(QMouseEvent *event) -{ - if (m_isTouching) - m_isTouching = false; - - // Because we disabled animations when touch event was detected - // we must put them back on. - chart()->setAnimationOptions(QChart::SeriesAnimations); - - QChartView::mouseReleaseEvent(event); -} void RecordWidgetGraph::keyPressEvent(QKeyEvent *event) { @@ -307,3 +321,22 @@ void RecordWidgetGraph::keyPressEvent(QKeyEvent *event) } } +// The code below is not used, may be nice to implement mouse scroll in future. +void RecordWidgetGraph::mouseMoveEvent(QMouseEvent *event) +{ + if (m_isTouching) + return; + QChartView::mouseMoveEvent(event); +} + +void RecordWidgetGraph::mouseReleaseEvent(QMouseEvent *event) +{ + if (m_isTouching) + m_isTouching = false; + + // Because we disabled animations when touch event was detected + // we must put them back on. + chart()->setAnimationOptions(QChart::SeriesAnimations); + + QChartView::mouseReleaseEvent(event); +} diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 4908505..5f54bf9 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -32,6 +32,8 @@ class RecordWidgetGraph : public QChartView quint8 noOfStreams; double maxBitrate; double minBitrate; + double maxIatDev; + double minIatDev; QChart* setupGraph(); // QChart* changeStream(int i); @@ -58,7 +60,7 @@ class RecordWidgetGraph : public QChartView public slots: - void setBitrate (double bitrate, qint64 duration); + void setBitrate (double bitrate, qint64 duration, bool isBitrateSignal); void setYAxisTitle(QString title); @@ -83,6 +85,7 @@ public slots: bool isScrolling = false; void refreshData(WorkerStatus status); + void setAxisRange(bool isBitrateSignal, double bitrate); }; From 467c78a47154ce5dc4ded3ab628731c0ac4ab91f Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Fri, 12 Jul 2019 14:51:35 +0200 Subject: [PATCH 39/43] fixes issue #33 --- recordwidgetgraph.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 896a488..83ff809 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -232,7 +232,7 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This coul quint64 hashKey = status.streams.keys().at(i); - if(status.streams[hashKey].currentBitrate != 0 && status.streams[hashKey].avgBitrate != 0 && status.streams[hashKey].iatDeviation){ + if(status.streams[hashKey].currentBitrate > 0.1 && status.streams[hashKey].avgBitrate != 0 && status.streams[hashKey].iatDeviation){ streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); From cb3269c7627c4fa3615c68e6cf84d89680174558 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Mon, 12 Aug 2019 12:12:25 +0200 Subject: [PATCH 40/43] Bug fixing, dropping off some redundant/ non realized features for increased functonality. --- IPTVUtils.pro | 2 -- chart.cpp | 42 ------------------------------------ chart.h | 26 ---------------------- playbackwidget.ui | 50 +++++++++++++------------------------------ recordwidget.cpp | 5 ++--- recordwidgetgraph.cpp | 12 +++++------ recordwidgetgraph.h | 1 - 7 files changed, 22 insertions(+), 116 deletions(-) delete mode 100644 chart.cpp delete mode 100644 chart.h diff --git a/IPTVUtils.pro b/IPTVUtils.pro index 0dc5d0e..60a75f4 100644 --- a/IPTVUtils.pro +++ b/IPTVUtils.pro @@ -65,7 +65,6 @@ SOURCES += \ convertwidget.cpp \ Middleware/networkjitter.cpp \ recordwidgetgraph.cpp \ - chart.cpp \ recordtxtprinter.cpp HEADERS += \ @@ -118,7 +117,6 @@ HEADERS += \ Status/workerstatus.h \ Middleware/networkjitter.h \ recordwidgetgraph.h \ - chart.h \ recordtxtprinter.h FORMS += \ diff --git a/chart.cpp b/chart.cpp deleted file mode 100644 index ae49f85..0000000 --- a/chart.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "chart.h" - -#include -#include -#include - -Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags) - : QChart(QChart::ChartTypeCartesian, parent, wFlags) -{ - // Seems that QGraphicsView (QChartView) does not grab gestures. - // They can only be grabbed here in the QGraphicsWidget (QChart). - grabGesture(Qt::PanGesture); - grabGesture(Qt::PinchGesture); -} - -Chart::~Chart() -{ - -} - -bool Chart::sceneEvent(QEvent *event) -{ - if (event->type() == QEvent::Gesture) - return gestureEvent(static_cast(event)); - return QChart::event(event); -} - -bool Chart::gestureEvent(QGestureEvent *event) -{ - if (QGesture *gesture = event->gesture(Qt::PanGesture)) { - QPanGesture *pan = static_cast(gesture); - QChart::scroll(-(pan->delta().x()), pan->delta().y()); - } - - if (QGesture *gesture = event->gesture(Qt::PinchGesture)) { - QPinchGesture *pinch = static_cast(gesture); - if (pinch->changeFlags() & QPinchGesture::ScaleFactorChanged) - QChart::zoom(pinch->scaleFactor()); - } - - return true; -} diff --git a/chart.h b/chart.h deleted file mode 100644 index 12d059b..0000000 --- a/chart.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef CHART_H -#define CHART_H - -#include - -class QGestureEvent; - -QT_CHARTS_USE_NAMESPACE - -class Chart : public QChart -{ -public: - explicit Chart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0); - ~Chart(); - -protected: - bool sceneEvent(QEvent *event); - -private: - bool gestureEvent(QGestureEvent *event); - -private: - -}; - -#endif // CHART_H diff --git a/playbackwidget.ui b/playbackwidget.ui index da1163d..c07ad4c 100644 --- a/playbackwidget.ui +++ b/playbackwidget.ui @@ -6,8 +6,8 @@ 0 0 - 764 - 700 + 730 + 389 @@ -31,8 +31,8 @@ Settings - - + + 0 @@ -60,7 +60,7 @@ - + 0 @@ -77,7 +77,7 @@ - + @@ -115,7 +115,7 @@ - + border: none @@ -134,7 +134,7 @@ - + @@ -153,23 +153,7 @@ - - - - - 0 - 300 - - - - true - - - Qt::NoFocus - - - - + Qt::Vertical @@ -182,7 +166,7 @@ - + @@ -192,11 +176,11 @@ - + - + Play @@ -271,13 +255,9 @@ QTreeView::branch:open:has-children:has-siblings { - - - QChartView - QGraphicsView -
QtCharts
-
-
+ + + diff --git a/recordwidget.cpp b/recordwidget.cpp index d3a00bb..acba255 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -88,7 +88,7 @@ void RecordWidget::saveSettings() { settings.beginGroup("record"); settings.setValue("interface", MainWindow::interfaces.at(ui->recordInterfaceSelect->currentIndex()).getId()); settings.setValue("host", ui->recordHost->text()); - settings.setValue("port", ui->recordPort->text());https://stackoverflow.com/questions/32446189/qt-from-unsigned-long-long-to-qjsonobject + settings.setValue("port", ui->recordPort->text()); settings.setValue("rtp-fec", ui->recordRtpFecCheckBox->isChecked()); settings.setValue("unicast", ui->recordUnicastCheckBox->isChecked()); settings.setValue("filename", currentFilename); @@ -201,7 +201,6 @@ void RecordWidget::recordingFinished() { ui->recordPcapFilterContainer->setEnabled(true); ui->recordInterfaceSelect->setEnabled(true); ui->graphDataBox->setEnabled(true); - // selectedStreamIndex = 0; this->treeWidgetCounter = 0; @@ -442,7 +441,7 @@ void RecordWidget::on_recordStartStopBtn_clicked() } else { if (networkPcapFileRecorder != Q_NULLPTR) { - ("atempting to stop pcapRecorder"); + qInfo("atempting to stop pcapRecorder"); ui->recordStartStopBtn->setEnabled(false); networkPcapFileRecorder->stop(); recordingFinished(); diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 83ff809..aa5f02b 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -1,5 +1,4 @@ #include "recordwidgetgraph.h" -#include "chart.h" #include #include @@ -16,6 +15,8 @@ RecordWidgetGraph::RecordWidgetGraph( QWidget *parent): this->setRubberBand(QChartView::RectangleRubberBand); dataRefreshCounter = 0; + printer = new RecordTxtPrinter(); + } @@ -40,7 +41,6 @@ QChart* RecordWidgetGraph::setupGraph(){ iatDevList.clear(); - printer = new RecordTxtPrinter(); lineSeries = new QLineSeries(); avgSeries = new QLineSeries(); @@ -51,14 +51,14 @@ QChart* RecordWidgetGraph::setupGraph(){ lineSeries->setName("Bitrate"); // Create chart and add axis - Chart * chart = new Chart(); + QChart * chart = new QChart(); // chart->legend()->hide(); chart->addSeries(lineSeries); chart->addSeries(avgSeries); chart->createDefaultAxes(); - chart->axisY()->setTitleText("Bitrate mbps"); + chart->axisY()->setTitleText("Bitrate Mbps"); // Change the line color and weight QPen pen(QRgb(0x000000)); @@ -106,7 +106,7 @@ void RecordWidgetGraph::setAvgBitrate(double avgBitrate){ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration, bool isBitrateSignal){ // Appends new values and updates graph - if(bitrate > (double) 1 && bitrate < 1000){ + if(bitrate > (double) 0.1 && bitrate < 1000){ this->durations = duration; lineSeries->append(duration, bitrate); @@ -128,8 +128,6 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration, bool isBitr this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); } - // setAxisRange(isBitrateSignal, bitrate); - chartCounter++; } } diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 5f54bf9..72bb362 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -35,7 +35,6 @@ class RecordWidgetGraph : public QChartView double maxIatDev; double minIatDev; QChart* setupGraph(); -// QChart* changeStream(int i); void setAvgBitrate(double avgBitrate); void setCurrentFileName(QString string); From cb5058a2f2d3a1d20a607007e14ce790f8ac532c Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 14 Aug 2019 12:56:38 +0200 Subject: [PATCH 41/43] Fixed scaling when switching between data sets --- recordwidgetgraph.cpp | 98 ++++++++++++++++++++++++++----------------- recordwidgetgraph.h | 9 ++++ 2 files changed, 68 insertions(+), 39 deletions(-) diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index aa5f02b..f9acdfb 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -3,6 +3,7 @@ #include #include #include +#include @@ -21,8 +22,6 @@ RecordWidgetGraph::RecordWidgetGraph( QWidget *parent): } - - RecordWidgetGraph::~RecordWidgetGraph() { for (auto ls : this->streamList) { @@ -39,6 +38,10 @@ QChart* RecordWidgetGraph::setupGraph(){ streamList.clear(); avgStreamList.clear(); iatDevList.clear(); + maxBitrateList.clear(); + minBitrateList.clear(); + minIatList.clear(); + maxIatList.clear(); lineSeries = new QLineSeries(); @@ -53,11 +56,21 @@ QChart* RecordWidgetGraph::setupGraph(){ // Create chart and add axis QChart * chart = new QChart(); + + + // chart->legend()->hide(); chart->addSeries(lineSeries); chart->addSeries(avgSeries); chart->createDefaultAxes(); + /* + QValueAxis *axisY = new QValueAxis; + this->chart()->setAxisY(axisY); + lineSeries->attachAxis(axisY); + avgSeries->attachAxis(axisY); +*/ + chart->axisY()->setTitleText("Bitrate Mbps"); // Change the line color and weight @@ -133,33 +146,6 @@ void RecordWidgetGraph::setBitrate (double bitrate, qint64 duration, bool isBitr } -void RecordWidgetGraph::setAxisRange(bool isBitrateSignal, double bitrate){ // Work in progress.... - - if(isBitrateSignal){ - - if(bitrate < this->minBitrate){ - minBitrate = bitrate; - this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); - } - - if (this->maxBitrate < bitrate) { - this->maxBitrate = bitrate; - this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); - } } else { - - if(bitrate < this->minIatDev){ - minIatDev= bitrate; - this->chart()->axisY()->setRange(minIatDev - 0.5, this->maxIatDev + 0.5); - } - - if (this->maxIatDev < bitrate) { - this->maxIatDev = bitrate; - this->chart()->axisY()->setRange(minIatDev - 0.5, this->maxIatDev + 0.5); - - } - } -} - void RecordWidgetGraph::changeStream(int selectedStream, bool isBitrateSignal){ @@ -171,6 +157,7 @@ void RecordWidgetGraph::changeStream(int selectedStream, bool isBitrateSignal){ lineSeries = streamList[selectedStream]; avgSeries = avgStreamList[selectedStream]; + chart()->addSeries(lineSeries); chart()->addSeries(avgSeries); @@ -199,10 +186,12 @@ void RecordWidgetGraph::changeStream(int selectedStream, bool isBitrateSignal){ if(isBitrateSignal){ avgSeries->attachAxis(chart()->axisX()); chart()->axisY()->setTitleText("Bitrate mbps"); - // this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); + this->chart()->axisY()->setRange(minBitrateList[selectedStream] - 0.5 , maxBitrateList[selectedStream] + 0.5); + } else { + isBitrateSignal = false; chart()->axisY()->setTitleText("Std IAT dev µs"); - // this->chart()->axisY()->setRange(minIatDev - 0.5, this->maxIatDev + 0.5); + this->chart()->axisY()->setRange(minIatList[selectedStream] - 10, maxIatList[selectedStream] + 10); } this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch(durations - 20000), QDateTime::fromMSecsSinceEpoch(durations + 2000)); @@ -223,24 +212,55 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This coul this->avgStreamList.append(new QLineSeries()); this->iatDevList.append(new QLineSeries()); this->fileList.append(new QFile()); + + this->maxBitrateList.append(0); + this->minBitrateList.append(2000); + + this->minIatList.append(3000); + this->maxIatList.append(0); + } } - for(int i = 0; i < status.streams.count(); i++){ + for(int i = 0; i < status.streams.count(); i++){ + + quint64 hashKey = status.streams.keys().at(i); + + if(status.streams[hashKey].currentBitrate > 0.1 && status.streams[hashKey].avgBitrate != 0 && status.streams[hashKey].iatDeviation){ + + double bitrate = status.streams[hashKey].currentBitrate; + quint16 iatDev = status.streams[hashKey].iatDeviation; - quint64 hashKey = status.streams.keys().at(i); + streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); + avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); + iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); - if(status.streams[hashKey].currentBitrate > 0.1 && status.streams[hashKey].avgBitrate != 0 && status.streams[hashKey].iatDeviation){ + QString streamIpAdress = StreamId::calcName(hashKey); - streamList[i]->append( status.streams[hashKey].currentTime, status.streams[hashKey].currentBitrate); - avgStreamList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].avgBitrate); - iatDevList[i]->append(status.streams[hashKey].currentTime, status.streams[hashKey].iatDeviation); + printer->printToFile(fileList[i], ((QString::number(status.streams[hashKey].currentTime))) + "," + (QString::number(status.streams[hashKey].currentBitrate)) + "," + (QString::number(status.streams[hashKey].iatDeviation)), currentFileName, streamIpAdress, i); - QString streamIpAdress = StreamId::calcName(hashKey); + if( bitrate < minBitrateList[i]){ + minBitrateList[i] = bitrate; - printer->printToFile(fileList[i], ((QString::number(status.streams[hashKey].currentTime))) + "," + (QString::number(status.streams[hashKey].currentBitrate)) + "," + (QString::number(status.streams[hashKey].iatDeviation)), currentFileName, streamIpAdress, i); } + if (maxBitrateList[i] < bitrate) { + maxBitrateList[i] = bitrate; + } + + + if(iatDev < minIatList[i]){ + minIatList[i] = iatDev; + } + + if(maxIatList[i] < iatDev){ + + maxIatList[i] = iatDev; + } + + + } + } if(durations > 300000){ for(int i = 0; i < status.streams.count(); i++){ diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 72bb362..6fd0900 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -56,6 +56,15 @@ class RecordWidgetGraph : public QChartView QList fileList; + QList maxBitrateList; + QList minBitrateList; + + QList maxIatList; + QList minIatList; + + + + public slots: From 879e8f566a9ca8c859866b989906f326b283f12d Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Wed, 14 Aug 2019 13:06:32 +0200 Subject: [PATCH 42/43] Changed default size of window --- playbackwidget.ui | 7 ++----- recordwidget.ui | 2 +- recordwidgetgraph.cpp | 12 ------------ 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/playbackwidget.ui b/playbackwidget.ui index c07ad4c..f50c30c 100644 --- a/playbackwidget.ui +++ b/playbackwidget.ui @@ -7,7 +7,7 @@ 0 0 730 - 389 + 396
@@ -176,7 +176,7 @@ - + @@ -257,7 +257,4 @@ QTreeView::branch:open:has-children:has-siblings { - - - diff --git a/recordwidget.ui b/recordwidget.ui index 378f0d5..5124579 100644 --- a/recordwidget.ui +++ b/recordwidget.ui @@ -7,7 +7,7 @@ 0 0 644 - 1098 + 556 diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index f9acdfb..2db1c29 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -18,8 +18,6 @@ RecordWidgetGraph::RecordWidgetGraph( QWidget *parent): dataRefreshCounter = 0; printer = new RecordTxtPrinter(); - - } RecordWidgetGraph::~RecordWidgetGraph() @@ -47,7 +45,6 @@ QChart* RecordWidgetGraph::setupGraph(){ lineSeries = new QLineSeries(); avgSeries = new QLineSeries(); - // lineSeries->setUseOpenGL(true); avgSeries->setName("Avg bitrate"); @@ -59,18 +56,9 @@ QChart* RecordWidgetGraph::setupGraph(){ - // chart->legend()->hide(); chart->addSeries(lineSeries); chart->addSeries(avgSeries); chart->createDefaultAxes(); - - /* - QValueAxis *axisY = new QValueAxis; - this->chart()->setAxisY(axisY); - lineSeries->attachAxis(axisY); - avgSeries->attachAxis(axisY); -*/ - chart->axisY()->setTitleText("Bitrate Mbps"); // Change the line color and weight From e08aec3a14af8234de7df74c8c9fe4066c9b6209 Mon Sep 17 00:00:00 2001 From: Marko Marinkovic Date: Thu, 15 Aug 2019 11:03:31 +0200 Subject: [PATCH 43/43] Bug fixing --- Middleware/analyzerpcapmiddleware.cpp | 2 +- Status/streaminfo.h | 2 +- playbackwidget.cpp | 6 ------ playbackwidget.h | 1 - recordtxtprinter.h | 2 -- recordwidget.cpp | 9 +-------- recordwidgetgraph.cpp | 19 ++++++++++--------- recordwidgetgraph.h | 3 +-- 8 files changed, 14 insertions(+), 30 deletions(-) diff --git a/Middleware/analyzerpcapmiddleware.cpp b/Middleware/analyzerpcapmiddleware.cpp index 524c1d4..d5fe357 100644 --- a/Middleware/analyzerpcapmiddleware.cpp +++ b/Middleware/analyzerpcapmiddleware.cpp @@ -15,6 +15,7 @@ void AnalyzerPcapMiddleware::init() { connect(&runnerThread, &QThread::started, this, &AnalyzerPcapMiddleware::run); connect(this, &AnalyzerPcapMiddleware::finished, &runnerThread, &QThread::quit); + } void AnalyzerPcapMiddleware::start() { @@ -84,7 +85,6 @@ void AnalyzerPcapMiddleware::bufferProducts() { if (duration - lastDuration >= emitFrequency) { bitrate = (bytes - lastSecondBytes)*8*1000/(duration - lastDuration); lastSecondBytes = bytes; - // lastDuration = duration; } } diff --git a/Status/streaminfo.h b/Status/streaminfo.h index 2879e50..f1d613b 100644 --- a/Status/streaminfo.h +++ b/Status/streaminfo.h @@ -31,7 +31,7 @@ class StreamInfo { NetworkProtocol protocol; BitrateMode bitrateMode; quint8 tsPerIp; - quint16 iatDeviation; + quint32 iatDeviation; quint64 lastSecondBytes; quint64 lastDuration; TsErrors tsErrors; diff --git a/playbackwidget.cpp b/playbackwidget.cpp index 465a51b..bbe6324 100644 --- a/playbackwidget.cpp +++ b/playbackwidget.cpp @@ -21,15 +21,9 @@ PlaybackWidget::PlaybackWidget(QWidget *parent) : QWidget(parent), ui(new Ui::PlaybackWidget), started(false) - // graph(this) { ui->setupUi(this); - /* - graph.setupGraph(); - ui->graphView->setChart(graph.chart()); - ui->graphView->setRenderHint(QPainter::Antialiasing); -*/ // Advanced PCAP filter ui->playbackPcapFilterContainer->hide(); connect(ui->playbackExpandPCAPFilterButton, SIGNAL(toggled(bool)), this, SLOT(on_playbackExpandPCAPFilterButton_toggled(bool))); diff --git a/playbackwidget.h b/playbackwidget.h index 546290b..36913e9 100644 --- a/playbackwidget.h +++ b/playbackwidget.h @@ -25,7 +25,6 @@ class PlaybackWidget : public QWidget private: Ui::PlaybackWidget *ui; - // RecordWidgetGraph graph; bool started; bool validatePlaybackInputs(); bool startPcapPlayback(WorkerConfiguration::WorkerMode mode = WorkerConfiguration::NORMAL_MODE); diff --git a/recordtxtprinter.h b/recordtxtprinter.h index a4d94cd..eff63ab 100644 --- a/recordtxtprinter.h +++ b/recordtxtprinter.h @@ -9,8 +9,6 @@ class RecordTxtPrinter { public: - - // QFile file; RecordTxtPrinter(); void printToFile(QFile *file, QString text, QString currentFilename, QString streamIpAdress,quint8 currentIterationIndex); QList containedIndexes; diff --git a/recordwidget.cpp b/recordwidget.cpp index acba255..a4c1c77 100644 --- a/recordwidget.cpp +++ b/recordwidget.cpp @@ -32,11 +32,6 @@ RecordWidget::RecordWidget(QWidget *parent) : ui->recordPcapFilterContainer->hide(); connect(ui->recordExpandPCAPFilterButton, SIGNAL(toggled(bool)), this, SLOT(on_recordExpandPCAPFilterButton_toggled(bool))); - - // File format - // connect(ui->recordFileFormatPCAP, SIGNAL(toggled(bool)), this, SLOT(on_recordFileFormatPCAP_toggled(bool))); - // connect(ui-> recordFileFormatTS, SIGNAL(toggled(bool)), this, SLOT(on_recordFileFormatTS_toggled(bool))); - connect(ui->recordHost, &QLineEdit::textChanged, this, &RecordWidget::recordFilterShouldUpdate); connect(ui->recordPort, &QLineEdit::textChanged, this, &RecordWidget::recordFilterShouldUpdate); connect(ui->recordRtpFecCheckBox, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate); @@ -45,8 +40,6 @@ RecordWidget::RecordWidget(QWidget *parent) : connect(ui->graphDataBox, &QComboBox::currentTextChanged, this, &RecordWidget::changeStream); - // connect(ui->graphView, &QCheckBox::stateChanged, this, &RecordWidget::recordFilterShouldUpdate ); - for (int i = 0; i < MainWindow::interfaces.length(); i++) { ui->recordInterfaceSelect->addItem(MainWindow::interfaces.at(i).getName()); ui->recordInterfaceSelect->setItemData(i, MainWindow::interfaces.at(i).getName(), Qt::ToolTipRole); @@ -149,7 +142,7 @@ void RecordWidget::recordWorkerStatusChanged(WorkerStatus status) { status.insertIntoTree(ui->treeWidget); - } else { //if(this->treeWidgetCounter > 0 && started){ + } else { updateStreamIndex(); quint64 key = status.streams.keys().at(selectedStreamIndex); if(isBitrateSignal){ diff --git a/recordwidgetgraph.cpp b/recordwidgetgraph.cpp index 2db1c29..ea36e97 100644 --- a/recordwidgetgraph.cpp +++ b/recordwidgetgraph.cpp @@ -17,6 +17,7 @@ RecordWidgetGraph::RecordWidgetGraph( QWidget *parent): this->setRubberBand(QChartView::RectangleRubberBand); dataRefreshCounter = 0; printer = new RecordTxtPrinter(); + bitrateSelected = true; } @@ -73,8 +74,6 @@ QChart* RecordWidgetGraph::setupGraph(){ dataRefreshCounter = 0; this->maxBitrate = 0; this->minBitrate = 5000; - this->maxIatDev = 0; - this->minIatDev = 5000; this->zoomInt = 0; this->avgBitrate = 0; @@ -93,9 +92,10 @@ QChart* RecordWidgetGraph::setupGraph(){ void RecordWidgetGraph::setYAxisTitle(QString title){ chart()->axisY()->setTitleText(title); - if(title.contains("Std")){ + if(title == "Std IAT dev µs"){ lineSeries->setName("IAT dev"); chart()->removeSeries(avgSeries); + bitrateSelected = false; } } @@ -175,9 +175,9 @@ void RecordWidgetGraph::changeStream(int selectedStream, bool isBitrateSignal){ avgSeries->attachAxis(chart()->axisX()); chart()->axisY()->setTitleText("Bitrate mbps"); this->chart()->axisY()->setRange(minBitrateList[selectedStream] - 0.5 , maxBitrateList[selectedStream] + 0.5); - + bitrateSelected = true; } else { - isBitrateSignal = false; + bitrateSelected = false; chart()->axisY()->setTitleText("Std IAT dev µs"); this->chart()->axisY()->setRange(minIatList[selectedStream] - 10, maxIatList[selectedStream] + 10); } @@ -244,9 +244,6 @@ void RecordWidgetGraph::recordMultipleStreams(WorkerStatus status){ // This coul maxIatList[i] = iatDev; } - - - } } @@ -304,7 +301,11 @@ void RecordWidgetGraph::keyPressEvent(QKeyEvent *event) case Qt::Key_Minus: this->zoomInt += 10000; this->chart()->axisX()->setRange(QDateTime::fromMSecsSinceEpoch((durations - 20000) - zoomInt), QDateTime::fromMSecsSinceEpoch(durations + 2000)); - this->chart()->axisY()->setRange(minBitrate - 0.5, this->maxBitrate + 0.5); + if(bitrateSelected){ + this->chart()->axisY()->setRange(minBitrateList[selectedStreamIndex] - 0.5, maxBitrateList[selectedStreamIndex] + 0.5); + } else { + this->chart()->axisY()->setRange(minIatList[selectedStreamIndex] - 10, maxIatList[selectedStreamIndex] + 10); + } break; case Qt::Key_Left: diff --git a/recordwidgetgraph.h b/recordwidgetgraph.h index 6fd0900..be9c164 100644 --- a/recordwidgetgraph.h +++ b/recordwidgetgraph.h @@ -32,8 +32,6 @@ class RecordWidgetGraph : public QChartView quint8 noOfStreams; double maxBitrate; double minBitrate; - double maxIatDev; - double minIatDev; QChart* setupGraph(); void setAvgBitrate(double avgBitrate); @@ -91,6 +89,7 @@ public slots: QPointF m_lastMousePos; bool m_isTouching; bool isScrolling = false; + bool bitrateSelected; void refreshData(WorkerStatus status); void setAxisRange(bool isBitrateSignal, double bitrate);