852 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			852 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "widegraph.h"
 | |
| 
 | |
| #include <algorithm>
 | |
| #include <QApplication>
 | |
| #include <QSettings>
 | |
| #include "ui_widegraph.h"
 | |
| #include "commons.h"
 | |
| #include "Configuration.hpp"
 | |
| #include "MessageBox.hpp"
 | |
| #include "SettingsGroup.hpp"
 | |
| 
 | |
| #include "DriftingDateTime.h"
 | |
| #include "keyeater.h"
 | |
| 
 | |
| #include "moc_widegraph.cpp"
 | |
| 
 | |
| namespace
 | |
| {
 | |
|   auto user_defined = QObject::tr ("User Defined");
 | |
|   float swide[MAX_SCREENSIZE];
 | |
| }
 | |
| 
 | |
| WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
 | |
|   QDialog(parent),
 | |
|   ui(new Ui::WideGraph),
 | |
|   m_settings (settings),
 | |
|   m_palettes_path {":/Palettes"},
 | |
|   m_ntr0 {0},
 | |
|   m_n {0},
 | |
|   m_filterMinWidth {0},
 | |
|   m_filterMinimum {0},
 | |
|   m_filterMaximum {5000},
 | |
|   m_filterEnabled {false},
 | |
|   m_bHaveTransmitted {false}
 | |
| {
 | |
|   ui->setupUi(this);
 | |
| 
 | |
|   setWindowTitle (QApplication::applicationName () + " - " + tr ("Wide Graph"));
 | |
|   setWindowFlags (Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint);
 | |
|   setMaximumHeight (880);
 | |
| 
 | |
|   ui->splitter->setChildrenCollapsible(false);
 | |
|   ui->splitter->setCollapsible(ui->splitter->indexOf(ui->controls_widget), false);
 | |
|   ui->splitter->updateGeometry();
 | |
| 
 | |
|   auto filterEscapeEater = new KeyPressEater();
 | |
|   connect(filterEscapeEater, &KeyPressEater::keyPressed, this, [this](QObject */*obj*/, QKeyEvent *e, bool *pProcessed){
 | |
|       if(e->key() != Qt::Key_Escape){
 | |
|           return;
 | |
|       }
 | |
|       setFilter(0, 5000);
 | |
|       if(pProcessed) *pProcessed=true;
 | |
|   });
 | |
|   ui->filterMinSpinBox->installEventFilter(filterEscapeEater);
 | |
| 
 | |
|   ui->widePlot->setCursor(Qt::CrossCursor);
 | |
|   ui->widePlot->setMaximumWidth(MAX_SCREENSIZE);
 | |
|   ui->widePlot->setMaximumHeight(800);
 | |
|   ui->widePlot->setCurrent(false);
 | |
| 
 | |
|   ui->widePlot->setContextMenuPolicy(Qt::CustomContextMenu);
 | |
|   connect(ui->widePlot, &CPlotter::customContextMenuRequested, this, [this](const QPoint &pos){
 | |
|       auto menu = new QMenu(this);
 | |
| 
 | |
|       int f = ui->widePlot->frequencyAt(pos.x());
 | |
| 
 | |
|       auto offsetAction = menu->addAction(QString("Set &Offset to %1 Hz").arg(f));
 | |
|       connect(offsetAction, &QAction::triggered, this, [this, f](){
 | |
|         ui->offsetSpinBox->setValue(f);
 | |
|       });
 | |
| 
 | |
|       menu->addSeparator();
 | |
| 
 | |
|       if(m_filterEnabled){
 | |
|           auto disableAction = menu->addAction(QString("&Disable Filter"));
 | |
|           connect(disableAction, &QAction::triggered, this, [this](){
 | |
|             ui->filterCheckBox->setChecked(false);
 | |
|           });
 | |
|       }
 | |
| 
 | |
|       auto centerAction = menu->addAction(QString("Set Filter &Center to %1 Hz").arg(f));
 | |
|       connect(centerAction, &QAction::triggered, this, [this, f](){
 | |
|         ui->filterCenterSpinBox->setValue(f);
 | |
|         ui->filterCheckBox->setChecked(true);
 | |
|       });
 | |
| 
 | |
|       auto widthMenu = menu->addMenu("Set Filter &Width to...");
 | |
|       auto widths = QList<int>{ 25, 50, 75, 100, 250, 500, 750, 1000, 1500, 2000 };
 | |
|       foreach(auto width, widths){
 | |
|         if(width < m_filterMinWidth){ continue; }
 | |
|         auto widthAction = widthMenu->addAction(QString("%1 Hz").arg(width));
 | |
|         connect(widthAction, &QAction::triggered, this, [this, width](){
 | |
|             ui->filterWidthSpinBox->setValue(width);
 | |
|             ui->filterCheckBox->setChecked(true);
 | |
|         });
 | |
|       }
 | |
| 
 | |
|       auto minAction = menu->addAction(QString("Set Filter &Minimum to %1 Hz").arg(f));
 | |
|       connect(minAction, &QAction::triggered, this, [this, f](){
 | |
|         ui->filterMinSpinBox->setValue(f);
 | |
|         ui->filterCheckBox->setChecked(true);
 | |
|       });
 | |
| 
 | |
|       menu->popup(ui->widePlot->mapToGlobal(pos));
 | |
|   });
 | |
| 
 | |
|   connect(ui->widePlot, SIGNAL(freezeDecode1(int)),this,
 | |
|           SLOT(wideFreezeDecode(int)));
 | |
| 
 | |
|   connect(ui->widePlot, SIGNAL(setFreq1(int,int)),this,
 | |
|           SLOT(setFreq2(int,int)));
 | |
| 
 | |
|   connect(ui->widePlot, &CPlotter::qsy, this, [this](int hzDelta){
 | |
|     emit qsy(hzDelta);
 | |
|   });
 | |
| 
 | |
|   {
 | |
| 
 | |
|     //Restore user's settings
 | |
|     SettingsGroup g {m_settings, "WideGraph"};
 | |
|     restoreGeometry (m_settings->value ("geometry", saveGeometry ()).toByteArray ());
 | |
|     ui->widePlot->setPlotZero(m_settings->value("PlotZero", 0).toInt());
 | |
|     ui->widePlot->setPlotGain(m_settings->value("PlotGain", 0).toInt());
 | |
|     ui->widePlot->setPlot2dGain(m_settings->value("Plot2dGain", 0).toInt());
 | |
|     ui->widePlot->setPlot2dZero(m_settings->value("Plot2dZero", 0).toInt());
 | |
|     ui->zeroSlider->setValue(ui->widePlot->plotZero());
 | |
|     ui->gainSlider->setValue(ui->widePlot->plotGain());
 | |
|     ui->gain2dSlider->setValue(ui->widePlot->plot2dGain());
 | |
|     ui->zero2dSlider->setValue(ui->widePlot->plot2dZero());
 | |
|     int n = m_settings->value("BinsPerPixel",2).toInt();
 | |
|     m_bFlatten=m_settings->value("Flatten",true).toBool();
 | |
|     m_bRef=m_settings->value("UseRef",false).toBool();
 | |
|     ui->cbFlatten->setChecked(m_bFlatten);
 | |
|     ui->widePlot->setFlatten(m_bFlatten,m_bRef);
 | |
|     ui->cbRef->setChecked(m_bRef);
 | |
|     ui->widePlot->setBreadth(m_settings->value("PlotWidth",1000).toInt());
 | |
|     ui->bppSpinBox->setValue(n);
 | |
|     m_nsmo=m_settings->value("SmoothYellow",1).toInt();
 | |
|     ui->smoSpinBox->setValue(m_nsmo);
 | |
|     m_Percent2DScreen=m_settings->value("Percent2D", 0).toInt();
 | |
|     m_waterfallAvg = m_settings->value("WaterfallAvg", 1).toInt();
 | |
|     ui->waterfallAvgSpinBox->setValue(m_waterfallAvg);
 | |
|     ui->widePlot->setWaterfallAvg(m_waterfallAvg);
 | |
|     ui->widePlot->setCurrent(m_settings->value("Current",false).toBool());
 | |
|     ui->widePlot->setCumulative(m_settings->value("Cumulative",true).toBool());
 | |
|     ui->widePlot->setLinearAvg(m_settings->value("LinearAvg",false).toBool());
 | |
|     if(ui->widePlot->current()) ui->spec2dComboBox->setCurrentIndex(0);
 | |
|     if(ui->widePlot->cumulative()) ui->spec2dComboBox->setCurrentIndex(1);
 | |
|     if(ui->widePlot->linearAvg()) ui->spec2dComboBox->setCurrentIndex(2);
 | |
| #if JS8_USE_REFSPEC
 | |
|     ui->widePlot->setReference(m_settings->value("Reference",false).toBool());
 | |
|     if(ui->widePlot->Reference()) ui->spec2dComboBox->setCurrentIndex(3);
 | |
| #endif
 | |
|     int nbpp=m_settings->value("BinsPerPixel", 2).toInt();
 | |
|     ui->widePlot->setBinsPerPixel(nbpp);
 | |
|     ui->sbPercent2dPlot->setValue(m_Percent2DScreen);
 | |
|     ui->widePlot->SetPercent2DScreen(m_Percent2DScreen);
 | |
|     ui->widePlot->setStartFreq(m_settings->value("StartFreq", 500).toInt());
 | |
|     ui->centerSpinBox->setValue(m_settings->value("CenterOffset", 1500).toInt());
 | |
|     ui->fStartSpinBox->setValue(ui->widePlot->startFreq());
 | |
|     m_waterfallPalette=m_settings->value("WaterfallPalette","Default").toString();
 | |
|     m_userPalette = WFPalette {m_settings->value("UserPalette").value<WFPalette::Colours> ()};
 | |
|     m_fMinPerBand = m_settings->value ("FminPerBand").toHash ();
 | |
|     setRxRange ();
 | |
|     ui->controls_widget->setVisible(!m_settings->value("HideControls", false).toBool());
 | |
|     ui->cbControls->setChecked(!m_settings->value("HideControls", false).toBool());
 | |
| 
 | |
|     auto splitState = m_settings->value("SplitState").toByteArray();
 | |
|     if(!splitState.isEmpty()){
 | |
|         ui->splitter->restoreState(splitState);
 | |
|     }
 | |
| 
 | |
|     setFilter(m_settings->value("FilterMinimum", 500).toInt(), m_settings->value("FilterMaximum", 2500).toInt());
 | |
|     setFilterOpacityPercent(m_settings->value("FilterOpacityPercent", 50).toInt());
 | |
|     setFilterEnabled(m_settings->value("FilterEnabled", false).toBool());
 | |
|   }
 | |
| 
 | |
|   int index=0;
 | |
|   for (QString const& file:
 | |
|          m_palettes_path.entryList(QDir::NoDotAndDotDot |
 | |
|                                    QDir::System | QDir::Hidden |
 | |
|                                    QDir::AllDirs | QDir::Files,
 | |
|                                    QDir::DirsFirst)) {
 | |
|     QString t=file.mid(0,file.length()-4);
 | |
|     ui->paletteComboBox->addItem(t);
 | |
|     if(t==m_waterfallPalette) ui->paletteComboBox->setCurrentIndex(index);
 | |
|     index++;
 | |
|   }
 | |
|   ui->paletteComboBox->addItem (user_defined);
 | |
|   if (user_defined == m_waterfallPalette) ui->paletteComboBox->setCurrentIndex(index);
 | |
|   readPalette ();
 | |
| }
 | |
| 
 | |
| WideGraph::~WideGraph ()
 | |
| {
 | |
| }
 | |
| 
 | |
| void WideGraph::closeEvent (QCloseEvent * e)
 | |
| {
 | |
|   saveSettings ();
 | |
|   QDialog::closeEvent (e);
 | |
| }
 | |
| 
 | |
| void WideGraph::saveSettings()                                           //saveSettings
 | |
| {
 | |
|   SettingsGroup g {m_settings, "WideGraph"};
 | |
|   m_settings->setValue ("geometry", saveGeometry ());
 | |
|   m_settings->setValue ("PlotZero", ui->widePlot->plotZero());
 | |
|   m_settings->setValue ("PlotGain", ui->widePlot->plotGain());
 | |
|   m_settings->setValue ("Plot2dGain", ui->widePlot->plot2dGain());
 | |
|   m_settings->setValue ("Plot2dZero", ui->widePlot->plot2dZero());
 | |
|   m_settings->setValue ("PlotWidth", ui->widePlot->plotWidth ());
 | |
|   m_settings->setValue ("BinsPerPixel", ui->bppSpinBox->value ());
 | |
|   m_settings->setValue ("SmoothYellow", ui->smoSpinBox->value ());
 | |
|   m_settings->setValue ("Percent2D",m_Percent2DScreen);
 | |
|   m_settings->setValue ("WaterfallAvg", ui->waterfallAvgSpinBox->value ());
 | |
|   m_settings->setValue ("Current", ui->widePlot->current());
 | |
|   m_settings->setValue ("Cumulative", ui->widePlot->cumulative());
 | |
|   m_settings->setValue ("LinearAvg", ui->widePlot->linearAvg());
 | |
| #if JS8_USE_REFSPEC
 | |
|   m_settings->setValue ("Reference", ui->widePlot->Reference());
 | |
| #endif
 | |
|   m_settings->setValue ("BinsPerPixel", ui->widePlot->binsPerPixel ());
 | |
|   m_settings->setValue ("StartFreq", ui->widePlot->startFreq ());
 | |
|   m_settings->setValue ("WaterfallPalette", m_waterfallPalette);
 | |
|   m_settings->setValue ("UserPalette", QVariant::fromValue (m_userPalette.colours ()));
 | |
|   m_settings->setValue ("Flatten",m_bFlatten);
 | |
|   m_settings->setValue ("UseRef",m_bRef);
 | |
|   m_settings->setValue ("HideControls", ui->controls_widget->isHidden ());
 | |
|   m_settings->setValue ("FminPerBand", m_fMinPerBand);
 | |
|   m_settings->setValue ("CenterOffset", ui->centerSpinBox->value());
 | |
|   m_settings->setValue ("FilterMinimum", m_filterMinimum);
 | |
|   m_settings->setValue ("FilterMaximum", m_filterMaximum);
 | |
|   m_settings->setValue ("FilterEnabled", m_filterEnabled);
 | |
|   m_settings->setValue ("FilterOpacityPercent", ui->filterOpacitySpinBox->value());
 | |
|   m_settings->setValue ("SplitState", ui->splitter->saveState());
 | |
| }
 | |
| 
 | |
| void WideGraph::drawRed(int ia, int ib)
 | |
| {
 | |
|   ui->widePlot->drawRed(ia,ib,swide);
 | |
| }
 | |
| 
 | |
| void WideGraph::dataSink2(float s[], float df3, int ihsym, int ndiskdata)  //dataSink2
 | |
| {
 | |
|   static float splot[NSMAX];
 | |
|   int nbpp = ui->widePlot->binsPerPixel();
 | |
| 
 | |
| //Average spectra over specified number, m_waterfallAvg
 | |
|   if (m_n==0) {
 | |
|     for (int i=0; i<NSMAX; i++)
 | |
|       splot[i]=s[i];
 | |
|   } else {
 | |
|     for (int i=0; i<NSMAX; i++)
 | |
|       splot[i] += s[i];
 | |
|   }
 | |
|   m_n++;
 | |
| 
 | |
|   if (m_n>=m_waterfallAvg) {
 | |
|     for (int i=0; i<NSMAX; i++)
 | |
|         splot[i] /= m_n;        //Normalize the average
 | |
|     m_n=0;
 | |
|     int i=int(ui->widePlot->startFreq()/df3 + 0.5);
 | |
|     int jz=5000.0/(nbpp*df3);
 | |
| 		if(jz>MAX_SCREENSIZE) jz=MAX_SCREENSIZE;
 | |
|     m_jz=jz;
 | |
|     for (int j=0; j<jz; j++) {
 | |
|       float ss=0.0;
 | |
|       float smax=0;
 | |
|       for (int k=0; k<nbpp; k++) {
 | |
|         float sp=splot[i++];
 | |
|         ss += sp;
 | |
|         smax=qMax(smax,sp);
 | |
|       }
 | |
| //      swide[j]=nbpp*smax;
 | |
|       swide[j]=nbpp*ss;
 | |
|     }
 | |
| 
 | |
| // Time according to this computer
 | |
|     qint64 ms = DriftingDateTime::currentMSecsSinceEpoch() % 86400000;
 | |
|     int ntr = (ms/1000) % m_TRperiod;
 | |
|     if((ndiskdata && ihsym <= m_waterfallAvg) || (!ndiskdata && ntr<m_ntr0)) {
 | |
|       float flagValue=1.0e30;
 | |
|       if(m_bHaveTransmitted) flagValue=2.0e30;
 | |
|       for(int i=0; i<MAX_SCREENSIZE; i++) {
 | |
|         swide[i] = flagValue;
 | |
|       }
 | |
|       for(int i=0; i<NSMAX; i++) {
 | |
|         splot[i] = flagValue;
 | |
|       }
 | |
|       m_bHaveTransmitted=false;
 | |
|     }
 | |
|     m_ntr0=ntr;
 | |
|     ui->widePlot->draw(swide,true,false);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void WideGraph::on_bppSpinBox_valueChanged(int n)                            //bpp
 | |
| {
 | |
|   ui->widePlot->setBinsPerPixel(n);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_qsyPushButton_clicked(){
 | |
|     int hzDelta = rxFreq() - centerFreq();
 | |
|     emit qsy(hzDelta);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_offsetSpinBox_valueChanged(int n){
 | |
|   if(n == rxFreq()){
 | |
|       return;
 | |
|   }
 | |
| 
 | |
|   // TODO: jsherer - here's where we'd set minimum frequency again (later?)
 | |
|   n = qMax(0, n);
 | |
| 
 | |
|   setRxFreq(n);
 | |
|   setTxFreq(n);
 | |
|   setFreq2(n, n);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_waterfallAvgSpinBox_valueChanged(int n)                  //Navg
 | |
| {
 | |
|   m_waterfallAvg = n;
 | |
|   ui->widePlot->setWaterfallAvg(n);
 | |
| }
 | |
| 
 | |
| void WideGraph::keyPressEvent(QKeyEvent *e)                                 //F11, F12
 | |
| {  
 | |
|   switch(e->key())
 | |
|   {
 | |
|   int n;
 | |
|   case Qt::Key_F11:
 | |
|     n=11;
 | |
|     if(e->modifiers() & Qt::ControlModifier) n+=100;
 | |
|     emit f11f12(n);
 | |
|     break;
 | |
|   case Qt::Key_F12:
 | |
|     n=12;
 | |
|     if(e->modifiers() & Qt::ControlModifier) n+=100;
 | |
|     emit f11f12(n);
 | |
|     break;
 | |
|   default:
 | |
|     QDialog::keyPressEvent (e);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void WideGraph::setRxFreq(int n)                                           //setRxFreq
 | |
| {
 | |
|   ui->widePlot->setRxFreq(n);
 | |
|   ui->widePlot->draw(swide,false,false);
 | |
|   ui->offsetSpinBox->setValue(n);
 | |
| }
 | |
| 
 | |
| int WideGraph::rxFreq()                                                   //rxFreq
 | |
| {
 | |
|   return ui->widePlot->rxFreq();
 | |
| }
 | |
| 
 | |
| int WideGraph::centerFreq()
 | |
| {
 | |
|   return ui->centerSpinBox->value();
 | |
| }
 | |
| 
 | |
| int WideGraph::nStartFreq()                                             //nStartFreq
 | |
| {
 | |
|   return ui->widePlot->startFreq();
 | |
| }
 | |
| 
 | |
| void WideGraph::wideFreezeDecode(int n)                              //wideFreezeDecode
 | |
| {
 | |
|   emit freezeDecode2(n);
 | |
| }
 | |
| 
 | |
| void WideGraph::setRxRange ()
 | |
| {
 | |
|   ui->widePlot->setRxRange (Fmin ());
 | |
|   ui->widePlot->DrawOverlay();
 | |
|   ui->widePlot->update();
 | |
| }
 | |
| 
 | |
| int WideGraph::Fmin()                                              //Fmin
 | |
| {
 | |
|   return "60m" == m_rxBand ? 0 : m_fMinPerBand.value (m_rxBand, 2500).toUInt ();
 | |
| }
 | |
| 
 | |
| int WideGraph::Fmax()                                              //Fmax
 | |
| {
 | |
|   return std::min(5000,ui->widePlot->Fmax());
 | |
| }
 | |
| 
 | |
| int WideGraph::filterMinimum()
 | |
| {
 | |
|     return std::max(0, m_filterMinimum);
 | |
| }
 | |
| 
 | |
| int WideGraph::filterMaximum()
 | |
| {
 | |
|     return std::min(m_filterMaximum, 5000);
 | |
| }
 | |
| 
 | |
| bool WideGraph::filterEnabled()
 | |
| {
 | |
|     return m_filterEnabled;
 | |
| }
 | |
| 
 | |
| void WideGraph::setFilterCenter(int n){
 | |
|     int delta = n - m_filterCenter;
 | |
|     setFilter(m_filterMinimum + delta, m_filterMaximum + delta);
 | |
| }
 | |
| 
 | |
| void WideGraph::setFilter(int a, int b){
 | |
|     int low = std::min(a, b);
 | |
|     int high = std::max(a, b);
 | |
| 
 | |
|     // ensure minimum filter width
 | |
|     if(high-low < m_filterMinWidth){
 | |
|         high = low + m_filterMinWidth;
 | |
|     }
 | |
| 
 | |
|     int width = high - low;
 | |
|     int center = low + width / 2;
 | |
| 
 | |
|     // update the filter history
 | |
|     m_filterMinimum = low;
 | |
|     m_filterMaximum = high;
 | |
|     m_filterCenter = center;
 | |
| 
 | |
|     // update the spinner UI
 | |
|     bool blocked = false;
 | |
|     blocked = ui->filterMinSpinBox->blockSignals(true);
 | |
|     {
 | |
|         ui->filterMinSpinBox->setValue(low);
 | |
|     }
 | |
|     ui->filterMinSpinBox->blockSignals(blocked);
 | |
| 
 | |
|     blocked = ui->filterCenterSpinBox->blockSignals(true);
 | |
|     {
 | |
|         ui->filterCenterSpinBox->setValue(center);
 | |
|     }
 | |
|     ui->filterCenterSpinBox->blockSignals(blocked);
 | |
| 
 | |
|     blocked = ui->filterWidthSpinBox->blockSignals(true);
 | |
|     {
 | |
|         ui->filterWidthSpinBox->setValue(width);
 | |
|     }
 | |
|     ui->filterWidthSpinBox->blockSignals(blocked);
 | |
| 
 | |
|     // update the wide plot UI
 | |
|     ui->widePlot->setFilterCenter(center);
 | |
|     ui->widePlot->setFilterWidth(width);
 | |
| }
 | |
| 
 | |
| void WideGraph::setFilterMinimumBandwidth(int width){
 | |
|     m_filterMinWidth = width;
 | |
|     ui->filterWidthSpinBox->setMinimum(width);
 | |
|     setFilter(m_filterMinimum, std::max(m_filterMinimum+width, m_filterMaximum));
 | |
| }
 | |
| 
 | |
| void WideGraph::setFilterEnabled(bool enabled){
 | |
|     m_filterEnabled = enabled;
 | |
| 
 | |
|     // update the filter ui
 | |
|     ui->filterCenterSpinBox->setEnabled(enabled);
 | |
|     ui->filterCenterSyncButton->setEnabled(enabled);
 | |
|     ui->filterWidthSpinBox->setEnabled(enabled);
 | |
|     ui->filterMinSpinBox->setEnabled(enabled);
 | |
| 
 | |
|     // update the checkbox ui
 | |
|     bool blocked = ui->filterCheckBox->blockSignals(true);
 | |
|     {
 | |
|         ui->filterCheckBox->setChecked(enabled);
 | |
|     }
 | |
|     ui->filterCheckBox->blockSignals(blocked);
 | |
| 
 | |
|     // update the wideplot
 | |
|     ui->widePlot->setFilterEnabled(enabled);
 | |
| }
 | |
| 
 | |
| void WideGraph::setFilterOpacityPercent(int n){
 | |
|     // update the spinbox
 | |
|     bool blocked = ui->filterOpacitySpinBox->blockSignals(true);
 | |
|     {
 | |
|         ui->filterOpacitySpinBox->setValue(n);
 | |
|     }
 | |
|     ui->filterOpacitySpinBox->blockSignals(blocked);
 | |
| 
 | |
|     // update the wide plot
 | |
|     ui->widePlot->setFilterOpacity(int((float(n)/100.0)*255));
 | |
| }
 | |
| 
 | |
| int WideGraph::fSpan()
 | |
| {
 | |
|   return ui->widePlot->fSpan ();
 | |
| }
 | |
| 
 | |
| void WideGraph::setPeriod(int ntrperiod, int nsps)                  //SetPeriod
 | |
| {
 | |
|   m_TRperiod=ntrperiod;
 | |
|   m_nsps=nsps;
 | |
|   ui->widePlot->setNsps(ntrperiod, nsps);
 | |
| }
 | |
| 
 | |
| void WideGraph::setTxFreq(int n)                                   //setTxFreq
 | |
| {
 | |
|   emit setXIT2(n);
 | |
|   ui->widePlot->setTxFreq(n);
 | |
|   ui->offsetSpinBox->setValue(n);
 | |
| }
 | |
| 
 | |
| void WideGraph::setMode(QString mode)                              //setMode
 | |
| {
 | |
|   m_mode=mode;
 | |
|   ui->widePlot->setMode(mode);
 | |
|   ui->widePlot->DrawOverlay();
 | |
|   ui->widePlot->update();
 | |
| }
 | |
| 
 | |
| void WideGraph::setSubMode(int n)                                  //setSubMode
 | |
| {
 | |
|   m_nSubMode=n;
 | |
|   ui->widePlot->setSubMode(n);
 | |
|   ui->widePlot->DrawOverlay();
 | |
|   ui->widePlot->update();
 | |
| }
 | |
| void WideGraph::setModeTx(QString modeTx)                          //setModeTx
 | |
| {
 | |
|   m_modeTx=modeTx;
 | |
|   ui->widePlot->setModeTx(modeTx);
 | |
|   ui->widePlot->DrawOverlay();
 | |
|   ui->widePlot->update();
 | |
| }
 | |
| 
 | |
|                                                         //Current-Cumulative-Yellow
 | |
| void WideGraph::on_spec2dComboBox_currentIndexChanged(const QString &arg1)
 | |
| {
 | |
|   ui->widePlot->setCurrent(false);
 | |
|   ui->widePlot->setCumulative(false);
 | |
|   ui->widePlot->setLinearAvg(false);
 | |
|   ui->smoSpinBox->setEnabled(false);
 | |
|   if(arg1=="Current") ui->widePlot->setCurrent(true);
 | |
|   if(arg1=="Cumulative") ui->widePlot->setCumulative(true);
 | |
|   if(arg1=="Linear Avg") {
 | |
|     ui->widePlot->setLinearAvg(true);
 | |
|     ui->smoSpinBox->setEnabled(true);
 | |
|   }
 | |
| #if JS8_USE_REFSPEC
 | |
|   ui->widePlot->setReference(false);
 | |
|   if(arg1=="Reference") {
 | |
|     ui->widePlot->setReference(true);
 | |
|   }
 | |
| #endif
 | |
|   replot();
 | |
| }
 | |
| 
 | |
| void WideGraph::setFreq2(int rxFreq, int txFreq)                  //setFreq2
 | |
| {
 | |
|   emit setFreq3(rxFreq,txFreq);
 | |
| }
 | |
| 
 | |
| void WideGraph::setDialFreq(double d)                             //setDialFreq
 | |
| {
 | |
|   ui->widePlot->setDialFreq(d);
 | |
| }
 | |
| 
 | |
| void WideGraph::setControlsVisible(bool visible)
 | |
| {
 | |
|   ui->cbControls->setChecked(!visible);
 | |
|   ui->cbControls->setChecked(visible);
 | |
| }
 | |
| 
 | |
| bool WideGraph::controlsVisible(){
 | |
|   auto sizes = ui->splitter->sizes();
 | |
|   return ui->cbControls->isChecked() && sizes.last() > 0;
 | |
| }
 | |
| 
 | |
| void WideGraph::setRxBand (QString const& band)
 | |
| {
 | |
|   m_rxBand = band;
 | |
|   ui->widePlot->setRxBand(band);
 | |
|   setRxRange ();
 | |
| }
 | |
| 
 | |
| 
 | |
| void WideGraph::on_fStartSpinBox_valueChanged(int n)             //fStart
 | |
| {
 | |
|   ui->widePlot->setStartFreq(n);
 | |
| }
 | |
| 
 | |
| void WideGraph::readPalette ()                                   //readPalette
 | |
| {
 | |
|   try
 | |
|     {
 | |
|       if (user_defined == m_waterfallPalette)
 | |
|         {
 | |
|           ui->widePlot->setColours (WFPalette {m_userPalette}.interpolate ());
 | |
|         }
 | |
|       else
 | |
|         {
 | |
|           ui->widePlot->setColours (WFPalette {m_palettes_path.absoluteFilePath (m_waterfallPalette + ".pal")}.interpolate());
 | |
|         }
 | |
|     }
 | |
|   catch (std::exception const& e)
 | |
|     {
 | |
|       MessageBox::warning_message (this, tr ("Read Palette"), e.what ());
 | |
|     }
 | |
| }
 | |
| 
 | |
| void WideGraph::on_paletteComboBox_activated (QString const& palette)    //palette selector
 | |
| {
 | |
|   m_waterfallPalette = palette;
 | |
|   readPalette();
 | |
|   replot();
 | |
| }
 | |
| 
 | |
| void WideGraph::on_cbFlatten_toggled(bool b)                          //Flatten On/Off
 | |
| {
 | |
|   m_bFlatten=b;
 | |
|   if(m_bRef and m_bFlatten) {
 | |
|     m_bRef=false;
 | |
|     ui->cbRef->setChecked(false);
 | |
|   }
 | |
|   ui->widePlot->setFlatten(m_bFlatten,m_bRef);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_cbRef_toggled(bool b)
 | |
| {
 | |
|   m_bRef=b;
 | |
|   if(m_bRef and m_bFlatten) {
 | |
|     m_bFlatten=false;
 | |
|     ui->cbFlatten->setChecked(false);
 | |
|   }
 | |
|   ui->widePlot->setFlatten(m_bFlatten,m_bRef);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_cbControls_toggled(bool b)
 | |
| {
 | |
|   ui->controls_widget->setVisible(b);
 | |
| 
 | |
|   static int lastSize = ui->splitter->width()/4;
 | |
|   auto sizes = ui->splitter->sizes();
 | |
|   if(b){
 | |
|       ui->splitter->setSizes({ sizes.first(), lastSize });
 | |
|   } else {
 | |
|       // keep track of the last size of the control
 | |
|       lastSize = qMax(sizes.last(), 100);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void WideGraph::on_adjust_palette_push_button_clicked (bool)   //Adjust Palette
 | |
| {
 | |
|   try
 | |
|     {
 | |
|       if (m_userPalette.design ())
 | |
|         {
 | |
|           m_waterfallPalette = user_defined;
 | |
|           ui->paletteComboBox->setCurrentText (m_waterfallPalette);
 | |
|           readPalette ();
 | |
|         }
 | |
|     }
 | |
|   catch (std::exception const& e)
 | |
|     {
 | |
|       MessageBox::warning_message (this, tr ("Read Palette"), e.what ());
 | |
|     }
 | |
| }
 | |
| 
 | |
| bool WideGraph::flatten()                                              //Flatten
 | |
| {
 | |
|   return m_bFlatten;
 | |
| }
 | |
| 
 | |
| bool WideGraph::useRef()                                              //Flatten
 | |
| {
 | |
|   return m_bRef;
 | |
| }
 | |
| 
 | |
| void WideGraph::replot()
 | |
| {
 | |
|   if(ui->widePlot->scaleOK()) ui->widePlot->replot();
 | |
| }
 | |
| 
 | |
| void WideGraph::on_gainSlider_valueChanged(int value)                 //Gain
 | |
| {
 | |
|   ui->widePlot->setPlotGain(value);
 | |
|   replot();
 | |
| }
 | |
| 
 | |
| void WideGraph::on_zeroSlider_valueChanged(int value)                 //Zero
 | |
| {
 | |
|   ui->widePlot->setPlotZero(value);
 | |
|   replot();
 | |
| }
 | |
| 
 | |
| void WideGraph::on_gain2dSlider_valueChanged(int value)               //Gain2
 | |
| {
 | |
|   ui->widePlot->setPlot2dGain(value);
 | |
|   if(ui->widePlot->scaleOK ()) {
 | |
|     ui->widePlot->draw(swide,false,false);
 | |
|     if(m_mode=="QRA64") ui->widePlot->draw(swide,false,true);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void WideGraph::on_zero2dSlider_valueChanged(int value)               //Zero2
 | |
| {
 | |
|   ui->widePlot->setPlot2dZero(value);
 | |
|   if(ui->widePlot->scaleOK ()) {
 | |
|     ui->widePlot->draw(swide,false,false);
 | |
|     if(m_mode=="QRA64") ui->widePlot->draw(swide,false,true);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void WideGraph::setTol(int n)                                         //setTol
 | |
| {
 | |
|   ui->widePlot->setTol(n);
 | |
|   ui->widePlot->DrawOverlay();
 | |
|   ui->widePlot->update();
 | |
| }
 | |
| 
 | |
| void WideGraph::on_smoSpinBox_valueChanged(int n)
 | |
| {
 | |
|   m_nsmo=n;
 | |
| }
 | |
| 
 | |
| int WideGraph::smoothYellow()
 | |
| {
 | |
|   return m_nsmo;
 | |
| }
 | |
| 
 | |
| void WideGraph::setWSPRtransmitted()
 | |
| {
 | |
|   m_bHaveTransmitted=true;
 | |
| }
 | |
| 
 | |
| void WideGraph::setVHF(bool bVHF)
 | |
| {
 | |
|   ui->widePlot->setVHF(bVHF);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_sbPercent2dPlot_valueChanged(int n)
 | |
| {
 | |
|   m_Percent2DScreen=n;
 | |
|   ui->widePlot->SetPercent2DScreen(n);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_filterMinSpinBox_valueChanged(int n){
 | |
|     int delta = n - m_filterMinimum;
 | |
|     setFilter(m_filterMinimum + delta, m_filterMaximum + delta);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_filterCenterSpinBox_valueChanged(int n){
 | |
|     setFilterCenter(n);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_filterWidthSpinBox_valueChanged(int n){
 | |
|     setFilter(m_filterCenter - n/2, m_filterCenter - n/2 + n);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_filterCenterSyncButton_clicked(){
 | |
|     setFilterCenter(ui->offsetSpinBox->value());
 | |
| }
 | |
| 
 | |
| void WideGraph::on_filterCheckBox_toggled(bool b){
 | |
|     setFilterEnabled(b);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_filterOpacitySpinBox_valueChanged(int n){
 | |
|     setFilterOpacityPercent(n);
 | |
| }
 | |
| 
 | |
| void WideGraph::setRedFile(QString fRed)
 | |
| {
 | |
|   ui->widePlot->setRedFile(fRed);
 | |
| }
 | |
| 
 | |
| void WideGraph::setTurbo(bool turbo){
 | |
|   ui->widePlot->setTurbo(turbo);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_driftSpinBox_valueChanged(int n){
 | |
|     if(n == DriftingDateTime::drift()){
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     setDrift(n);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_driftSyncButton_clicked(){
 | |
|     auto now = QDateTime::currentDateTimeUtc();
 | |
| 
 | |
|     int n = 0;
 | |
|     int nPos = m_TRperiod - (now.time().second() % m_TRperiod);
 | |
|     int nNeg = (now.time().second() % m_TRperiod) - m_TRperiod;
 | |
| 
 | |
|     if(abs(nNeg) < nPos){
 | |
|         n = nNeg;
 | |
|     } else {
 | |
|         n = nPos;
 | |
|     }
 | |
| 
 | |
|     setDrift(n * 1000);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_driftSyncEndButton_clicked(){
 | |
|     auto now = QDateTime::currentDateTimeUtc();
 | |
| 
 | |
|     int n = 0;
 | |
|     int nPos = m_TRperiod - (now.time().second() % m_TRperiod);
 | |
|     int nNeg = (now.time().second() % m_TRperiod) - m_TRperiod;
 | |
| 
 | |
|     if(abs(nNeg) < nPos){
 | |
|         n = nNeg + 2;
 | |
|     } else {
 | |
|         n = nPos - 2;
 | |
|     }
 | |
| 
 | |
|     setDrift(n * 1000);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_driftSyncMinuteButton_clicked(){
 | |
|     auto now = QDateTime::currentDateTimeUtc();
 | |
|     int n = 0;
 | |
|     int s = now.time().second();
 | |
| 
 | |
|     if(s < 30){
 | |
|         n = -s;
 | |
|     } else {
 | |
|         n = 60 - s;
 | |
|     }
 | |
| 
 | |
|     setDrift(n * 1000);
 | |
| }
 | |
| 
 | |
| void WideGraph::on_driftSyncResetButton_clicked(){
 | |
|     setDrift(0);
 | |
| }
 | |
| 
 | |
| void WideGraph::setDrift(int n){
 | |
|     DriftingDateTime::setDrift(n);
 | |
| 
 | |
|     qDebug() << qSetRealNumberPrecision(12) << "Drift milliseconds:" << n;
 | |
|     qDebug() << qSetRealNumberPrecision(12) << "Clock time:" << QDateTime::currentDateTimeUtc();
 | |
|     qDebug() << qSetRealNumberPrecision(12) << "Drifted time:" << DriftingDateTime::currentDateTimeUtc();
 | |
| 
 | |
|     if(ui->driftSpinBox->value() != n){
 | |
|         ui->driftSpinBox->setValue(n);
 | |
|     }
 | |
| }
 | |
| 
 | |
| void WideGraph::setQSYEnabled(bool enabled){
 | |
|     ui->qsyPushButton->setEnabled(enabled);
 | |
|     ui->centerSpinBox->setEnabled(enabled);
 | |
| }
 | 
