#ifndef PLOTWIFIMEASUREMENTS_H #define PLOTWIFIMEASUREMENTS_H #include #include #include #include "../sensors/radio/WiFiMeasurements.h" #include "../sensors/radio/WiFiQualityAnalyzer.h" #include /** * helper-class that plots incoming wifi measurements * one line per AP */ class PlotWifiMeasurements { K::Gnuplot gp; K::GnuplotPlot gplot; K::GnuplotPlotElementLines lineQuality; std::unordered_map lineForMac; WiFiQualityAnalyzer quality; public: PlotWifiMeasurements(const std::string& labelX = "time (sec)", const std::string& labelY = "dBm") { gplot.getAxisX().setLabel(labelX); gplot.getAxisY().setLabel(labelY); // quality indicator using the 2nd y axis gplot.add(&lineQuality); lineQuality.getStroke().setWidth(2); lineQuality.setUseAxis(1, 2); gplot.getAxisY2().setTicsVisible(true); gplot.getAxisY2().setRange(K::GnuplotAxis::Range(0, 1)); } K::Gnuplot& getGP() { return gp; } K::GnuplotPlot& getPlot() { return gplot; } void add(const WiFiMeasurements& mes) { const Timestamp ts = mes.entries.front().getTimestamp(); for (const WiFiMeasurement& m : mes.entries) { const auto& it = lineForMac.find(m.getAP().getMAC()); if (it == lineForMac.end()) { K::GnuplotPlotElementLines* line = new K::GnuplotPlotElementLines(); line->setTitle(m.getAP().getMAC().asString()); line->getStroke().getColor().setAuto(); lineForMac[m.getAP().getMAC()] = line; gplot.add(line); } const K::GnuplotPoint2 gp2(m.getTimestamp().sec(), m.getRSSI()); lineForMac[m.getAP().getMAC()]->add(gp2); } quality.add(mes); lineQuality.add(K::GnuplotPoint2(ts.sec(), quality.getQuality())); } void plot() { gp.draw(gplot); gp.flush(); } }; #endif // PLOTWIFIMEASUREMENTS_H