void Meter::stepNonLogic() { if (b_firstRun) { p_displayText->setText(displayText()); updateAttachedPositioning(); setChanged(); property("0-minValue")->setUnit(m_unit); property("1-maxValue")->setUnit(m_unit); b_firstRun = false; } const double v = meterValue(); if ( !b_timerStarted && std::abs(((v-m_old_value)/m_old_value)) > 1e-6 ) { b_timerStarted = true; } if (b_timerStarted) { m_timeSinceUpdate += LINEAR_UPDATE_PERIOD; m_avgValue += v * LINEAR_UPDATE_PERIOD; // setChanged(); if ( m_timeSinceUpdate > 0.05 ) { if ( p_displayText->setText(displayText()) ) updateAttachedPositioning(); } } }
void Spectrum::paintEvent(QPaintEvent*) { QPainter painter(this); int filterLeft; int filterRight; QString text; float step=(float)sampleRate/(float)width(); int offset=(int)((float)LO_offset/step); QLinearGradient gradient(0, 0, 0,height()); gradient.setColorAt(0, Qt::black); gradient.setColorAt(1, Qt::gray); painter.setBrush(gradient); painter.drawRect(0, 0, width(), height()); if(sampleRate==0) { qDebug() << "sampleRate is 0"; return; } float zoom_factor = 1.0f + zoom/25.0f; // draw cursor painter.setPen(QPen(Qt::red, 1)); painter.drawLine((width()/2)+offset*zoom_factor,0,(width()/2)+offset*zoom_factor,height()); // draw filter filterLeft = width()/2 + (float)(filterLow+LO_offset)* (float)width()*zoom_factor/(float)sampleRate; filterRight = width()/2 + (float)(filterHigh+LO_offset)*(float)width()*zoom_factor/(float)sampleRate; painter.setBrush(Qt::SolidPattern); painter.setOpacity(0.5); painter.fillRect(filterLeft,0,filterRight-filterLeft,height(),Qt::gray); // draw sub rx filter and cursor if(subRx) { //int cursor=((subRxFrequency-(frequency-(sampleRate/2))) * width() / sampleRate)+offset; int cursor = width()/2 + (float)(subRxFrequency-frequency+LO_offset) * (float)width()*zoom_factor/(float)sampleRate; filterLeft = width()/2 + (float)(filterLow+LO_offset+subRxFrequency-frequency) * (float)width()*zoom_factor/(float)sampleRate; filterRight = width()/2 + (float)(filterHigh+LO_offset+subRxFrequency-frequency) * (float)width()*zoom_factor/(float)sampleRate; painter.setBrush(Qt::SolidPattern); painter.setOpacity(0.5); painter.fillRect(filterLeft, 0, filterRight - filterLeft, height(), Qt::lightGray); painter.setPen(QPen(Qt::red, 1)); painter.drawLine(cursor,0,cursor,height()); } // plot horizontal dBm lines int V = spectrumHigh - spectrumLow; int numSteps = V / 20; for (int i = 1; i < numSteps; i++) { int num = spectrumHigh - i * 20; int y = (int) floor((spectrumHigh - num) * height() / V); painter.setOpacity(0.5); painter.setPen(QPen(Qt::white, 1,Qt::DotLine)); painter.drawLine(0, y, width(), y); painter.setOpacity(1.0); painter.setPen(QPen(Qt::green, 1)); painter.setFont(QFont("Arial", 10)); painter.drawText(3,y,QString::number(num)+" dBm"); } // plot the vertical frequency lines float hzPerPixel=(float)sampleRate/(float)width()/zoom_factor; long long lineStep = 10000; if (sampleRate > 1000000) lineStep = 100000; else if (sampleRate > 500000) lineStep = 50000; else if (sampleRate > 200000) lineStep = 20000; for(int i=0;i<width();i++) { long long f=frequency-((float)sampleRate/zoom_factor/2.0)-(float)LO_offset+(long long)(hzPerPixel*(float)i); if(f>0) { if((f % lineStep)<(long long)hzPerPixel) { painter.setOpacity(0.5); painter.setPen(QPen(Qt::white, 1,Qt::DotLine)); painter.drawLine(i, 0, i, height()); painter.setOpacity(1.0); painter.setPen(QPen(Qt::black, 1)); painter.setFont(QFont("Arial", 10)); text.sprintf("%lld.%02lld",f/1000000,f%1000000/10000); painter.drawText(i,height(),text); } } } // draw the band limits long long min_display=frequency-((float)sampleRate/zoom_factor/2.0); long long max_display=frequency+((float)sampleRate/zoom_factor/2.0); if(band_min!=0LL && band_max!=0LL) { int i; painter.setPen(QPen(Qt::red, 2)); if((min_display<band_min)&&(max_display>band_min)) { i=(band_min-min_display)/(long long)hzPerPixel; painter.drawLine(i,0,i,height()); } if((min_display<band_max)&&(max_display>band_max)) { i=(band_max-min_display)/(long long)hzPerPixel; painter.drawLine(i+1,0,i+1,height()); } } // draw the squelch if(settingSquelch || showSquelchControl) { squelchY=(int) floor(((float) spectrumHigh - squelchVal)*(float) height() / (float) (spectrumHigh - spectrumLow)); painter.setPen(QPen(Qt::red, 1,Qt::DashLine)); painter.drawLine(0,squelchY,width(),squelchY); painter.setFont(QFont("Arial", 10)); text.sprintf("%s","Squelch"); painter.drawText(width()-48,squelchY,text); } else if(squelch) { squelchY=(int) floor(((float) spectrumHigh - squelchVal)*(float) height() / (float) (spectrumHigh - spectrumLow)); painter.setPen(QPen(Qt::red, 1)); painter.drawLine(0,squelchY,width(),squelchY); painter.setFont(QFont("Arial", 10)); text.sprintf("%s","Squelch"); painter.drawText(width()-48,squelchY,text); } emit meterValue(meter, subrx_meter); // plot Spectrum painter.setOpacity(0.9); painter.setPen(QPen(Qt::yellow, 1)); if(plot.count()==width()) { painter.drawPolyline(plot.constData(),plot.count()); } // show the subrx frequency if(subRx) { // show the frequency painter.setPen(QPen(Qt::green,1)); painter.setFont(QFont("Verdana", 30)); } }
void Spectrum::paintEvent(QPaintEvent*) { QPainter painter(this); int filterLeft; int filterRight; QString text; QLinearGradient gradient(0, 0, 0,height()); gradient.setColorAt(0, Qt::black); gradient.setColorAt(1, Qt::gray); painter.setBrush(gradient); painter.drawRect(0, 0, width(), height()); if(sampleRate==0) { qDebug() << "sampleRate is 0"; return; } // draw filter filterLeft = (filterLow - (-sampleRate / 2)) * width() / sampleRate; filterRight = (filterHigh - (-sampleRate / 2)) * width() / sampleRate; painter.setBrush(Qt::SolidPattern); painter.setOpacity(0.5); painter.fillRect(filterLeft,0,filterRight-filterLeft,height(),Qt::gray); // draw sub rx filter and cursor if(subRx) { int cursor=(subRxFrequency-(frequency-(sampleRate/2))) * width() / sampleRate; filterLeft = (filterLow - (-sampleRate / 2) + (subRxFrequency-frequency)) * width() / sampleRate; filterRight = (filterHigh - (-sampleRate / 2) + (subRxFrequency-frequency)) * width() / sampleRate; painter.setBrush(Qt::SolidPattern); painter.setOpacity(0.5); painter.fillRect(filterLeft, 0, filterRight - filterLeft, height(), Qt::lightGray); painter.setPen(QPen(Qt::red, 1)); painter.drawLine(cursor,0,cursor,height()); } // plot horizontal dBm lines int V = spectrumHigh - spectrumLow; int numSteps = V / 20; for (int i = 1; i < numSteps; i++) { int num = spectrumHigh - i * 20; int y = (int) floor((spectrumHigh - num) * height() / V); painter.setOpacity(0.5); painter.setPen(QPen(Qt::white, 1,Qt::DotLine)); painter.drawLine(0, y, width(), y); painter.setOpacity(1.0); painter.setPen(QPen(Qt::green, 1)); painter.setFont(QFont("Arial", 10)); painter.drawText(3,y,QString::number(num)+" dBm"); } // plot the vertical frequency lines float hzPerPixel=(float)sampleRate/(float)width(); long long f=frequency-(sampleRate/2); for(int i=0;i<width();i++) { f=frequency-(sampleRate/2)+(long long)(hzPerPixel*(float)i); if(f>0) { if((f%10000)<(long long)hzPerPixel) { painter.setOpacity(0.5); painter.setPen(QPen(Qt::white, 1,Qt::DotLine)); painter.drawLine(i, 0, i, height()); painter.setOpacity(1.0); painter.setPen(QPen(Qt::black, 1)); painter.setFont(QFont("Arial", 10)); text.sprintf("%lld.%02lld",f/1000000,f%1000000/10000); painter.drawText(i,height(),text); } } } // draw the band limits long long min_display=frequency-(sampleRate/2); long long max_display=frequency+(sampleRate/2); if(band_min!=0LL && band_max!=0LL) { int i; painter.setPen(QPen(Qt::red, 2)); if((min_display<band_min)&&(max_display>band_min)) { i=(band_min-min_display)/(long long)hzPerPixel; painter.drawLine(i,0,i,height()); } if((min_display<band_max)&&(max_display>band_max)) { i=(band_max-min_display)/(long long)hzPerPixel; painter.drawLine(i+1,0,i+1,height()); } } // draw cursor painter.setPen(QPen(Qt::red, 1)); painter.drawLine(width()/2,0,width()/2,height()); // show the frequency painter.setPen(QPen(Qt::green,1)); painter.setFont(QFont("Verdana", 30)); painter.drawText(width()/2,30,strFrequency); // show the band and mode and filter painter.setFont(QFont("Arial", 12)); text=band+" "+mode+" "+filter+"Hz"; painter.drawText((width()/2),50,text); // show the server and receiver text="Server:"+host+" Rx:"+QString::number(receiver); painter.drawText(5,15,text); // draw the analog meters // painter.setOpacity(0.8); // QImage image=sMeterMain->getImage(meter); // painter.drawImage(width()-image.width()-5,0,image); emit meterValue(meter, subrx_meter); // qDebug() << "Spectrum meter value = " << meter; if(subRx) { // image=sMeterSub->getImage(subrx_meter); // painter.drawImage(width()-image.width()-5,image.height()+5,image); // emit meterValue(subrx_meter); } // plot Spectrum painter.setOpacity(0.9); painter.setPen(QPen(Qt::yellow, 1)); if(plot.count()==width()) { painter.drawPolyline(plot.constData(),plot.count()); } // show the subrx frequency if(subRx) { /* filterRight = (filterHigh - (-sampleRate / 2) + (subRxFrequency-frequency)) * width() / sampleRate; painter.setPen(QPen(Qt::black,1)); painter.setFont(QFont("Arial", 12)); painter.drawText(filterRight,height()-20,strSubRxFrequency); */ // show the frequency painter.setPen(QPen(Qt::green,1)); painter.setFont(QFont("Verdana", 30)); // painter.drawText(width()/2,image.height()+5+30,strSubRxFrequency); } }