QwtPlotSpectrogram * PlotViewWidget::addSpectrogramData(SpectrogramData *spectrogramData) { QwtPlotSpectrogram *spectrogram = new QwtPlotSpectrogram(); spectrogram->setRenderThreadCount( 0 ); // use system specific thread count QwtLinearColorMap * colorMap = new QwtLinearColorMap(Qt::white, Qt::black); spectrogram->setColorMap(colorMap); spectrogram->setCachePolicy( QwtPlotRasterItem::PaintCache ); spectrogram->setData( spectrogramData ); QRectF r = spectrogramData->boundingRect(); setAxisScale( QwtPlot::yLeft , 0, 5000, 1000); setAxisScale( QwtPlot::yRight , 0, 5000, 1000); setAxisScale( QwtPlot::xBottom , r.left(), r.right(), 0.1); spectrogram->setDisplayMode( QwtPlotSpectrogram::ImageMode, true ); spectrogram->setAlpha(100); maSpectrogramData << spectrogramData; maSpectrograms << spectrogram; spectrogram->attach( this ); repaint(); return spectrogram; }
/** * @brief SpectrogramScopeConfig::loadConfiguration loads the plot configuration into the scope gadget widget * @param scopeGadgetWidget */ void SpectrogramScopeConfig::loadConfiguration(ScopeGadgetWidget *scopeGadgetWidget) { preparePlot(scopeGadgetWidget); scopeGadgetWidget->setScope(this); scopeGadgetWidget->startTimer(m_refreshInterval); //There should be only one spectrogram per plot //TODO: Upgrade this to handle multiple spectrograms on a single axis if ( m_spectrogramSourceConfigs.length() != 1) return; Plot3dCurveConfiguration* spectrogramSourceConfigs = m_spectrogramSourceConfigs.front(); QString uavObjectName = spectrogramSourceConfigs->uavObjectName; QString uavFieldName = spectrogramSourceConfigs->uavFieldName; // Get and store the units units = getUavObjectFieldUnits(uavObjectName, uavFieldName); SpectrogramData* spectrogramData = new SpectrogramData(uavObjectName, uavFieldName, samplingFrequency, windowWidth, timeHorizon); spectrogramData->setXMinimum(0); spectrogramData->setXMaximum(samplingFrequency/2); spectrogramData->setYMinimum(0); spectrogramData->setYMaximum(timeHorizon); spectrogramData->setZMaximum(zMaximum); spectrogramData->setScalePower(spectrogramSourceConfigs->yScalePower); spectrogramData->setMeanSamples(spectrogramSourceConfigs->yMeanSamples); spectrogramData->setMathFunction(spectrogramSourceConfigs->mathFunction); //Generate the waterfall name QString waterfallName = (spectrogramData->getUavoName()) + "." + (spectrogramData->getUavoFieldName()); if(spectrogramData->getHaveSubFieldFlag()) waterfallName = waterfallName.append("." + spectrogramData->getUavoSubFieldName()); //Get the uav object ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); UAVObjectManager *objManager = pm->getObject<UAVObjectManager>(); UAVDataObject* obj = dynamic_cast<UAVDataObject*>(objManager->getObject((spectrogramData->getUavoName()))); if(!obj) { qDebug() << "Object " << spectrogramData->getUavoName() << " is missing"; return; } //Get the units QString units = getUavObjectFieldUnits(spectrogramData->getUavoName(), spectrogramData->getUavoFieldName()); //Generate name with scaling factor appeneded QString waterfallNameScaled; if(spectrogramSourceConfigs->yScalePower == 0) waterfallNameScaled = waterfallName + "(" + units + ")"; else waterfallNameScaled = waterfallName + "(x10^" + QString::number(spectrogramSourceConfigs->yScalePower) + " " + units + ")"; //Create the waterfall plot QwtPlotSpectrogram* plotSpectrogram = new QwtPlotSpectrogram(waterfallNameScaled); plotSpectrogram->setRenderThreadCount( 0 ); // use system specific thread count plotSpectrogram->setRenderHint(QwtPlotItem::RenderAntialiased); plotSpectrogram->setColorMap(new ColorMap(colorMapType) ); // Initial raster data QDateTime NOW = QDateTime::currentDateTime(); //TODO: Upgrade this to show UAVO time and not system time for ( uint i = 0; i < timeHorizon; i++ ){ spectrogramData->timeDataHistory->append(NOW.toTime_t() + NOW.time().msec() / 1000.0 + i); } if (((double) windowWidth) * timeHorizon < (double) 10000000.0 * sizeof(spectrogramData->zDataHistory->front())){ //Don't exceed 10MB for memory for ( uint i = 0; i < windowWidth*timeHorizon; i++ ){ spectrogramData->zDataHistory->append(0); } } else{ qDebug() << "For some reason, we're trying to allocate a gigantic spectrogram. This probably represents a problem in the configuration file. TimeHorizion: "<< timeHorizon << ", windowWidth: "<< windowWidth; Q_ASSERT(0); return; } //Set up colorbar on right axis spectrogramData->rightAxis = scopeGadgetWidget->axisWidget( QwtPlot::yRight ); spectrogramData->rightAxis->setTitle( "Intensity" ); spectrogramData->rightAxis->setColorBarEnabled( true ); spectrogramData->rightAxis->setColorMap( QwtInterval(0, zMaximum), new ColorMap(colorMapType)); scopeGadgetWidget->setAxisScale( QwtPlot::yRight, 0, zMaximum); scopeGadgetWidget->enableAxis( QwtPlot::yRight ); plotSpectrogram->setData(spectrogramData->getRasterData()); plotSpectrogram->attach(scopeGadgetWidget); spectrogramData->setSpectrogram(plotSpectrogram); //Keep the curve details for later scopeGadgetWidget->insertDataSources(waterfallNameScaled, spectrogramData); // Connect the UAVO scopeGadgetWidget->connectUAVO(obj); mutex.lock(); scopeGadgetWidget->replot(); mutex.unlock(); }