From d93b5fc9083e41f0987badf0408b5afa973f3ed2 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 17 May 2021 19:30:51 +0100 Subject: [PATCH 1/2] Refactor window widget management to fix initialization errors --- map65/astro.cpp | 29 ++++- map65/astro.h | 20 +--- map65/bandmap.cpp | 26 +++-- map65/bandmap.h | 21 ++-- map65/mainwindow.cpp | 266 +++++++++++++++++-------------------------- map65/mainwindow.h | 262 +++++++++++++++++++++--------------------- map65/messages.cpp | 21 +++- map65/messages.h | 27 ++--- map65/widegraph.cpp | 43 +++---- map65/widegraph.h | 27 +++-- 10 files changed, 367 insertions(+), 375 deletions(-) diff --git a/map65/astro.cpp b/map65/astro.cpp index 8b124bb13..b4bf83b67 100644 --- a/map65/astro.cpp +++ b/map65/astro.cpp @@ -1,16 +1,34 @@ #include "astro.h" +#include #include "ui_astro.h" #include #include #include #include +#include "SettingsGroup.hpp" #include "commons.h" -Astro::Astro(QWidget *parent) : +extern "C" { + void astrosub_ (int* nyear, int* month, int* nday, double* uth, int* nfreq, + const char* mygrid, const char* hisgrid, double* azsun, + double* elsun, double* azmoon, double* elmoon, double* azmoondx, + double* elmoondx, int* ntsky, int* ndop, int* ndop00, + double* ramoon, double* decmoon, double* dgrd, double* poloffset, + double* xnr, int len1, int len2); +} + +Astro::Astro (QString const& settings_filename, QWidget *parent) : QWidget(parent), - ui(new Ui::Astro) + ui(new Ui::Astro), + m_settings_filename {settings_filename} { - ui->setupUi(this); + ui->setupUi (this); + setWindowTitle ("Astronomical Data"); + setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; // MainWindow group for + // historical reasons + setGeometry (settings.value ("AstroGeom", QRect {71, 390, 227, 403}).toRect ()); ui->astroTextBrowser->setStyleSheet( "QTextBrowser { background-color : cyan; color : black; }"); ui->astroTextBrowser->clear(); @@ -19,7 +37,10 @@ Astro::Astro(QWidget *parent) : Astro::~Astro() { - delete ui; + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; + settings.setValue ("AstroGeom", geometry ()); + delete ui; } void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, diff --git a/map65/astro.h b/map65/astro.h index 0568a878f..f425f3e73 100644 --- a/map65/astro.h +++ b/map65/astro.h @@ -13,24 +13,16 @@ class Astro : public QWidget Q_OBJECT public: - explicit Astro(QWidget *parent = 0); + explicit Astro (QString const& settings_filename, QWidget *parent = 0); void astroUpdate(QDateTime t, QString mygrid, QString hisgrid, int fQSO, int nsetftx, int ntxFreq, QString azelDir); void setFontSize(int n); - ~Astro(); + ~Astro (); private: - Ui::Astro *ui; - QString m_AzElDir0; + Ui::Astro *ui; + QString m_settings_filename; + QString m_AzElDir0; }; -extern "C" { - void astrosub_(int* nyear, int* month, int* nday, double* uth, int* nfreq, - const char* mygrid, const char* hisgrid, double* azsun, - double* elsun, double* azmoon, double* elmoon, double* azmoondx, - double* elmoondx, int* ntsky, int* ndop, int* ndop00, - double* ramoon, double* decmoon, double* dgrd, double* poloffset, - double* xnr, int len1, int len2); -} - -#endif // ASTRO_H +#endif diff --git a/map65/bandmap.cpp b/map65/bandmap.cpp index 67c73440b..3c4daecb3 100644 --- a/map65/bandmap.cpp +++ b/map65/bandmap.cpp @@ -1,21 +1,31 @@ #include "bandmap.h" +#include #include "ui_bandmap.h" #include "qt_helpers.hpp" +#include "SettingsGroup.hpp" #include -BandMap::BandMap(QWidget *parent) : - QWidget(parent), - ui(new Ui::BandMap) +BandMap::BandMap (QString const& settings_filename, QWidget * parent) + : QWidget {parent}, + ui {new Ui::BandMap}, + m_settings_filename {settings_filename} { - ui->setupUi(this); + ui->setupUi (this); + setWindowTitle ("Band Map"); + setWindowFlags (Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; // MainWindow group for + // historical reasons + setGeometry (settings.value ("BandMapGeom", QRect {280, 400, 142, 400}).toRect ()); ui->bmTextBrowser->setStyleSheet( - "QTextBrowser { background-color : #000066; color : red; }"); - m_bandMapText=""; - ui->bmTextBrowser->clear(); + "QTextBrowser { background-color : #000066; color : red; }"); } -BandMap::~BandMap() +BandMap::~BandMap () { + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; + settings.setValue ("BandMapGeom", geometry ()); delete ui; } diff --git a/map65/bandmap.h b/map65/bandmap.h index 2c3f8a21e..857925800 100644 --- a/map65/bandmap.h +++ b/map65/bandmap.h @@ -9,10 +9,10 @@ namespace Ui { class BandMap : public QWidget { - Q_OBJECT + Q_OBJECT public: - explicit BandMap(QWidget *parent = 0); + explicit BandMap (QString const& settings_filename, QWidget *parent = 0); void setText(QString t); void setColors(QString t); @@ -22,13 +22,14 @@ protected: void resizeEvent(QResizeEvent* event); private: - Ui::BandMap *ui; - QString m_bandMapText; - QString m_colorBackground; - QString m_color0; - QString m_color1; - QString m_color2; - QString m_color3; + Ui::BandMap *ui; + QString m_settings_filename; + QString m_bandMapText; + QString m_colorBackground; + QString m_color0; + QString m_color1; + QString m_color2; + QString m_color3; }; -#endif // BANDMAP_H +#endif diff --git a/map65/mainwindow.cpp b/map65/mainwindow.cpp index 543c30795..3806efc18 100644 --- a/map65/mainwindow.cpp +++ b/map65/mainwindow.cpp @@ -2,7 +2,9 @@ #include "mainwindow.h" #include #include +#include #include "revision_utils.hpp" +#include "SettingsGroup.hpp" #include "widgets/MessageBox.hpp" #include "ui_mainwindow.h" #include "devsetup.h" @@ -29,10 +31,6 @@ int iqAmp; int iqPhase; qint16 id[4*60*96000]; -Astro* g_pAstro = NULL; -WideGraph* g_pWideGraph = NULL; -Messages* g_pMessages = NULL; -BandMap* g_pBandMap = NULL; TxTune* g_pTxTune = NULL; QSharedMemory mem_m65("mem_m65"); @@ -42,10 +40,15 @@ extern const int TxDataFrequency = 11025; //-------------------------------------------------- MainWindow constructor MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), - ui(new Ui::MainWindow) + ui(new Ui::MainWindow), + m_appDir {QApplication::applicationDirPath ()}, + m_settings_filename {m_appDir + "/map65.ini"}, + m_astro_window {new Astro {m_settings_filename}}, + m_band_map_window {new BandMap {m_settings_filename}}, + m_messages_window {new Messages {m_settings_filename}}, + m_wide_graph_window {new WideGraph {m_settings_filename}} { ui->setupUi(this); - on_EraseButton_clicked(); ui->labUTC->setStyleSheet( \ "QLabel { background-color : black; color : yellow; }"); @@ -133,7 +136,6 @@ MainWindow::MainWindow(QWidget *parent) : m_ntx=1; m_myCall="K1JT"; m_myGrid="FN20qi"; - m_appDir = QApplication::applicationDirPath(); m_saveDir="/users/joe/map65/install/save"; m_azelDir="/users/joe/map65/install/"; m_editorCommand="notepad"; @@ -224,9 +226,9 @@ MainWindow::MainWindow(QWidget *parent) : on_actionWide_Waterfall_triggered(); on_actionMessages_triggered(); on_actionBand_Map_triggered(); - g_pMessages->setColors(m_colors); - g_pBandMap->setColors(m_colors); - g_pAstro->setFontSize(m_astroFont); + if (m_messages_window) m_messages_window->setColors(m_colors); + m_band_map_window->setColors(m_colors); + if (m_astro_window) m_astro_window->setFontSize (m_astroFont); if(m_modeQ65==0) on_actionNoQ65_triggered(); if(m_modeQ65==1) on_actionQ65A_triggered(); @@ -266,15 +268,15 @@ MainWindow::MainWindow(QWidget *parent) : soundInThread.setMonitoring(m_monitoring); m_diskData=false; m_tol=500; - g_pWideGraph->setTol(m_tol); - g_pWideGraph->setFcal(m_fCal); - if(m_fs96000) g_pWideGraph->setFsample(96000); - if(!m_fs96000) g_pWideGraph->setFsample(95238); - g_pWideGraph->m_mult570=m_mult570; - g_pWideGraph->m_mult570Tx=m_mult570Tx; - g_pWideGraph->m_cal570=m_cal570; - g_pWideGraph->m_TxOffset=m_TxOffset; - if(m_initIQplus) g_pWideGraph->initIQplus(); + m_wide_graph_window->setTol(m_tol); + m_wide_graph_window->setFcal(m_fCal); + if(m_fs96000) m_wide_graph_window->setFsample(96000); + if(!m_fs96000) m_wide_graph_window->setFsample(95238); + m_wide_graph_window->m_mult570=m_mult570; + m_wide_graph_window->m_mult570Tx=m_mult570Tx; + m_wide_graph_window->m_cal570=m_cal570; + m_wide_graph_window->m_TxOffset=m_TxOffset; + if(m_initIQplus) m_wide_graph_window->initIQplus(); // Create "m_worked", a dictionary of all calls in wsjt.log QFile f("wsjt.log"); @@ -297,6 +299,10 @@ MainWindow::MainWindow(QWidget *parent) : if(ui->actionAFMHot->isChecked()) on_actionAFMHot_triggered(); if(ui->actionBlue->isChecked()) on_actionBlue_triggered(); + connect (m_messages_window, &Messages::click2OnCallsign, this, &MainWindow::doubleClickOnMessages); + connect (m_wide_graph_window, &WideGraph::freezeDecode2, this, &MainWindow::freezeDecode); + connect (m_wide_graph_window, &WideGraph::f11f12, this, &MainWindow::bumpDF); + // only start the guiUpdate timer after this constructor has finished QTimer::singleShot (0, [=] { guiTimer->start(100); //Don't change the 100 ms! @@ -327,36 +333,17 @@ MainWindow::~MainWindow() //-------------------------------------------------------- writeSettings() void MainWindow::writeSettings() { - QString inifile = m_appDir + "/map65.ini"; - QSettings settings(inifile, QSettings::IniFormat); - - settings.beginGroup("MainWindow"); - settings.setValue("geometry", saveGeometry()); - settings.setValue("MRUdir", m_path); - settings.setValue("TxFirst",m_txFirst); - settings.setValue("DXcall",ui->dxCallEntry->text()); - settings.setValue("DXgrid",ui->dxGridEntry->text()); - - if(g_pAstro->isVisible()) { - m_astroGeom = g_pAstro->geometry(); - settings.setValue("AstroGeom",m_astroGeom); + QSettings settings(m_settings_filename, QSettings::IniFormat); + { + SettingsGroup g {&settings, "MainWindow"}; + settings.setValue("geometry", saveGeometry()); + settings.setValue("MRUdir", m_path); + settings.setValue("TxFirst",m_txFirst); + settings.setValue("DXcall",ui->dxCallEntry->text()); + settings.setValue("DXgrid",ui->dxGridEntry->text()); } - if(g_pWideGraph->isVisible()) { - m_wideGraphGeom = g_pWideGraph->geometry(); - settings.setValue("WideGraphGeom",m_wideGraphGeom); - } - if(g_pMessages->isVisible()) { - m_messagesGeom = g_pMessages->geometry(); - settings.setValue("MessagesGeom",m_messagesGeom); - } - if(g_pBandMap->isVisible()) { - m_bandMapGeom = g_pBandMap->geometry(); - settings.setValue("BandMapGeom",m_bandMapGeom); - } - settings.endGroup(); - - settings.beginGroup("Common"); + SettingsGroup g {&settings, "Common"}; settings.setValue("MyCall",m_myCall); settings.setValue("MyGrid",m_myGrid); settings.setValue("IDint",m_idInt); @@ -411,33 +398,23 @@ void MainWindow::writeSettings() settings.setValue("Cal570",m_cal570); settings.setValue("TxOffset",m_TxOffset); settings.setValue("Colors",m_colors); - settings.endGroup(); } //---------------------------------------------------------- readSettings() void MainWindow::readSettings() { - QString inifile = m_appDir + "/map65.ini"; - QSettings settings(inifile, QSettings::IniFormat); - settings.beginGroup("MainWindow"); - restoreGeometry(settings.value("geometry").toByteArray()); - ui->dxCallEntry->setText(settings.value("DXcall","").toString()); - ui->dxGridEntry->setText(settings.value("DXgrid","").toString()); + QSettings settings(m_settings_filename, QSettings::IniFormat); + { + SettingsGroup g {&settings, "MainWindow"}; + restoreGeometry(settings.value("geometry").toByteArray()); + ui->dxCallEntry->setText(settings.value("DXcall","").toString()); + ui->dxGridEntry->setText(settings.value("DXgrid","").toString()); + m_path = settings.value("MRUdir", m_appDir + "/save").toString(); + m_txFirst = settings.value("TxFirst",false).toBool(); + ui->txFirstCheckBox->setChecked(m_txFirst); + } - m_astroGeom = settings.value("AstroGeom", QRect(71,390,227,403)).toRect(); - - m_wideGraphGeom = settings.value("WideGraphGeom", \ - QRect(45,30,1023,340)).toRect(); - m_messagesGeom = settings.value("MessagesGeom", \ - QRect(800,400,381,400)).toRect(); - m_bandMapGeom = settings.value("BandMapGeom", \ - QRect(280,400,142,400)).toRect(); - m_path = settings.value("MRUdir", m_appDir + "/save").toString(); - m_txFirst = settings.value("TxFirst",false).toBool(); - ui->txFirstCheckBox->setChecked(m_txFirst); - settings.endGroup(); - - settings.beginGroup("Common"); + SettingsGroup g {&settings, "Common"}; m_myCall=settings.value("MyCall","").toString(); m_myGrid=settings.value("MyGrid","").toString(); m_idInt=settings.value("IDint",0).toInt(); @@ -517,7 +494,6 @@ void MainWindow::readSettings() m_cal570=settings.value("Cal570",0.0).toDouble(); m_TxOffset=settings.value("TxOffset",130.9).toDouble(); m_colors=settings.value("Colors","000066ff0000ffff00969696646464").toString(); - settings.endGroup(); if(!ui->actionLinrad->isChecked() && !ui->actionCuteSDR->isChecked() && !ui->actionAFMHot->isChecked() && !ui->actionBlue->isChecked()) { @@ -565,7 +541,7 @@ void MainWindow::dataSink(int k) if(!m_fs96000) nfsample=95238; nxpol=0; if(m_xpol) nxpol=1; - fgreen=(float)g_pWideGraph->fGreen(); + fgreen=m_wide_graph_window->fGreen(); nadj++; if(m_adjustIQ==0) nadj=0; symspec_(&k, &nxpol, &ndiskdat, &nb, &m_NBslider, &m_dPhi, @@ -591,7 +567,7 @@ void MainWindow::dataSink(int k) xSignalMeter->setValue(px); // Update the signal meters ySignalMeter->setValue(py); if(m_monitoring || m_diskData) { - g_pWideGraph->dataSink2(s,nkhz,ihsym,m_diskData,lstrong); + m_wide_graph_window->dataSink2(s,nkhz,ihsym,m_diskData,lstrong); } if(nadj == 10) { @@ -705,7 +681,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_idInt=dlg.m_idInt; m_pttPort=dlg.m_pttPort; m_astroFont=dlg.m_astroFont; - if(g_pAstro->isVisible()) g_pAstro->setFontSize(m_astroFont); + if(m_astro_window && m_astro_window->isVisible()) m_astro_window->setFontSize(m_astroFont); m_xpol=dlg.m_xpol; ui->actionFind_Delta_Phi->setEnabled(m_xpol); m_xpolx=dlg.m_xpolx; @@ -717,7 +693,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_dPhi=dlg.m_dPhi; m_fCal=dlg.m_fCal; m_fAdd=dlg.m_fAdd; - g_pWideGraph->setFcal(m_fCal); + m_wide_graph_window->setFcal(m_fCal); m_fs96000=dlg.m_fs96000; m_network=dlg.m_network; m_nDevIn=dlg.m_nDevIn; @@ -730,14 +706,14 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_initIQplus=dlg.m_initIQplus; m_bIQxt=dlg.m_bIQxt; m_colors=dlg.m_colors; - g_pMessages->setColors(m_colors); - g_pBandMap->setColors(m_colors); + m_messages_window->setColors(m_colors); + m_band_map_window->setColors(m_colors); m_cal570=dlg.m_cal570; m_TxOffset=dlg.m_TxOffset; m_mult570Tx=dlg.m_mult570Tx; - g_pWideGraph->m_mult570=m_mult570; - g_pWideGraph->m_mult570Tx=m_mult570Tx; - g_pWideGraph->m_cal570=m_cal570; + m_wide_graph_window->m_mult570=m_mult570; + m_wide_graph_window->m_mult570Tx=m_mult570Tx; + m_wide_graph_window->m_cal570=m_cal570; soundInThread.setSwapIQ(m_IQswap); soundInThread.set10db(m_10db); @@ -771,22 +747,22 @@ void MainWindow::on_monitorButton_clicked() //Monitor } void MainWindow::on_actionLinrad_triggered() //Linrad palette { - if(g_pWideGraph != NULL) g_pWideGraph->setPalette("Linrad"); + if(m_wide_graph_window) m_wide_graph_window->setPalette("Linrad"); } void MainWindow::on_actionCuteSDR_triggered() //CuteSDR palette { - if(g_pWideGraph != NULL) g_pWideGraph->setPalette("CuteSDR"); + if(m_wide_graph_window) m_wide_graph_window->setPalette("CuteSDR"); } void MainWindow::on_actionAFMHot_triggered() { - if(g_pWideGraph != NULL) g_pWideGraph->setPalette("AFMHot"); + if(m_wide_graph_window) m_wide_graph_window->setPalette("AFMHot"); } void MainWindow::on_actionBlue_triggered() { - if(g_pWideGraph != NULL) g_pWideGraph->setPalette("Blue"); + if(m_wide_graph_window) m_wide_graph_window->setPalette("Blue"); } void MainWindow::on_actionAbout_triggered() //Display "About" @@ -838,19 +814,19 @@ void MainWindow::keyPressEvent( QKeyEvent *e ) //keyPressEvent case Qt::Key_F11: if(e->modifiers() & Qt::ShiftModifier) { } else { - int n0=g_pWideGraph->DF(); + int n0=m_wide_graph_window->DF(); int n=(n0 + 10000) % 5; if(n==0) n=5; - g_pWideGraph->setDF(n0-n); + m_wide_graph_window->setDF(n0-n); } break; case Qt::Key_F12: if(e->modifiers() & Qt::ShiftModifier) { } else { - int n0=g_pWideGraph->DF(); + int n0=m_wide_graph_window->DF(); int n=(n0 + 10000) % 5; if(n==0) n=5; - g_pWideGraph->setDF(n0+n); + m_wide_graph_window->setDF(n0+n); } break; case Qt::Key_G: @@ -870,16 +846,16 @@ void MainWindow::keyPressEvent( QKeyEvent *e ) //keyPressEvent void MainWindow::bumpDF(int n) //bumpDF() { if(n==11) { - int n0=g_pWideGraph->DF(); + int n0=m_wide_graph_window->DF(); int n=(n0 + 10000) % 5; if(n==0) n=5; - g_pWideGraph->setDF(n0-n); + m_wide_graph_window->setDF(n0-n); } if(n==12) { - int n0=g_pWideGraph->DF(); + int n0=m_wide_graph_window->DF(); int n=(n0 + 10000) % 5; if(n==0) n=5; - g_pWideGraph->setDF(n0+n); + m_wide_graph_window->setDF(n0+n); } } @@ -944,7 +920,7 @@ void MainWindow::on_tolSpinBox_valueChanged(int i) //tolSpinBox { static int ntol[] = {10,20,50,100,200,500,1000}; m_tol=ntol[i]; - g_pWideGraph->setTol(m_tol); + m_wide_graph_window->setTol(m_tol); ui->labTol1->setText(QString::number(ntol[i])); } @@ -960,9 +936,11 @@ void MainWindow::closeEvent(QCloseEvent*) void MainWindow::OnExit() { - g_pWideGraph->saveSettings(); + m_wide_graph_window->saveSettings(); m_killAll=true; mem_m65.detach(); + proc_m65.closeReadChannel (QProcess::StandardOutput); + proc_m65.closeReadChannel (QProcess::StandardError); QFile quitFile(m_appDir + "/.quit"); quitFile.open(QIODevice::ReadWrite); QFile lockFile(m_appDir + "/.lock"); @@ -1010,60 +988,22 @@ void MainWindow::on_actionQSG_MAP65_v3_triggered() void MainWindow::on_actionAstro_Data_triggered() //Display Astro { - if(g_pAstro==NULL) { - g_pAstro = new Astro(0); - g_pAstro->setWindowTitle("Astronomical Data"); - Qt::WindowFlags flags = Qt::Dialog | Qt::WindowCloseButtonHint | - Qt::WindowMinimizeButtonHint; - g_pAstro->setWindowFlags(flags); - g_pAstro->setGeometry(m_astroGeom); - } - g_pAstro->show(); + if (m_astro_window ) m_astro_window->show(); } void MainWindow::on_actionWide_Waterfall_triggered() //Display Waterfalls { - if(g_pWideGraph==NULL) { - g_pWideGraph = new WideGraph(0); - g_pWideGraph->setWindowTitle("Wide Graph"); - g_pWideGraph->setGeometry(m_wideGraphGeom); - Qt::WindowFlags flags = Qt::WindowCloseButtonHint | - Qt::WindowMinimizeButtonHint; - g_pWideGraph->setWindowFlags(flags); - connect(g_pWideGraph, SIGNAL(freezeDecode2(int)),this, - SLOT(freezeDecode(int))); - connect(g_pWideGraph, SIGNAL(f11f12(int)),this, - SLOT(bumpDF(int))); - } - g_pWideGraph->show(); + m_wide_graph_window->show(); } void MainWindow::on_actionBand_Map_triggered() //Display BandMap { - if(g_pBandMap==NULL) { - g_pBandMap = new BandMap(0); - g_pBandMap->setWindowTitle("Band Map"); - Qt::WindowFlags flags = Qt::Dialog | Qt::WindowCloseButtonHint | - Qt::WindowMinimizeButtonHint; - g_pBandMap->setWindowFlags(flags); - g_pBandMap->setGeometry(m_bandMapGeom); - } - g_pBandMap->show(); + m_band_map_window->show (); } void MainWindow::on_actionMessages_triggered() //Display Messages { - if(g_pMessages==NULL) { - g_pMessages = new Messages(0); - g_pMessages->setWindowTitle("Messages"); - Qt::WindowFlags flags = Qt::Dialog | Qt::WindowCloseButtonHint | - Qt::WindowMinimizeButtonHint; - g_pMessages->setWindowFlags(flags); - g_pMessages->setGeometry(m_messagesGeom); - connect(g_pMessages, SIGNAL(click2OnCallsign(QString, QString)),this, - SLOT(doubleClickOnMessages(QString, QString))); - } - g_pMessages->show(); + m_messages_window->show(); } void MainWindow::on_actionOpen_triggered() //Open File @@ -1181,8 +1121,8 @@ void MainWindow::on_actionDelete_all_tf2_files_in_SaveDir_triggered() //Clear BandMap and Messages windows void MainWindow::on_actionErase_Band_Map_and_Messages_triggered() { - g_pBandMap->setText(""); - g_pMessages->setText("",""); + m_band_map_window->setText(""); + m_messages_window->setText("",""); m_map65RxLog |= 4; } @@ -1289,18 +1229,18 @@ void MainWindow::decode() //decode() } datcom_.idphi=m_dPhi; - datcom_.mousedf=g_pWideGraph->DF(); - datcom_.mousefqso=g_pWideGraph->QSOfreq(); + datcom_.mousedf=m_wide_graph_window->DF(); + datcom_.mousefqso=m_wide_graph_window->QSOfreq(); datcom_.ndepth=m_ndepth; datcom_.ndiskdat=0; if(m_diskData) datcom_.ndiskdat=1; datcom_.neme=0; if(ui->actionOnly_EME_calls->isChecked()) datcom_.neme=1; - int ispan=int(g_pWideGraph->fSpan()); + int ispan=int(m_wide_graph_window->fSpan()); if(ispan%2 == 1) ispan++; int ifc=int(1000.0*(datcom_.fcenter - int(datcom_.fcenter))+0.5); - int nfa=g_pWideGraph->nStartFreq(); + int nfa=m_wide_graph_window->nStartFreq(); int nfb=nfa+ispan; int nfshift=nfa + ispan/2 - ifc; @@ -1404,12 +1344,12 @@ void MainWindow::readFromStdout() //readFromStdout m_nsum=t.mid(17,4).toInt(); m_nsave=t.mid(21,4).toInt(); lab7->setText (QString {"Avg: %1"}.arg (m_nsum)); - if(m_modeQ65>0) g_pWideGraph->setDecodeFinished(); + if(m_modeQ65>0) m_wide_graph_window->setDecodeFinished(); } if(t.indexOf("") >= 0) { if(m_widebandDecode) { - g_pMessages->setText(m_messagesText,m_bandmapText); - g_pBandMap->setText(m_bandmapText); + m_messages_window->setText(m_messagesText,m_bandmapText); + m_band_map_window->setText(m_bandmapText); m_widebandDecode=false; } QFile lockFile(m_appDir + "/.lock"); @@ -1527,7 +1467,7 @@ void MainWindow::guiUpdate() msgBox(s); } - if(m_bIQxt) g_pWideGraph->tx570(); // Set Si570 to Tx Freq + if(m_bIQxt) m_wide_graph_window->tx570(); // Set Si570 to Tx Freq if(!soundOutThread.isRunning()) { soundOutThread.start(QThread::HighPriority); @@ -1593,7 +1533,7 @@ void MainWindow::guiUpdate() soundInThread.setMonitoring(false); btxok=true; m_transmitting=true; - g_pWideGraph->enableSetRxHardware(false); + m_wide_graph_window->enableSetRxHardware(false); QFile f("map65_tx.log"); f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append); @@ -1614,14 +1554,14 @@ void MainWindow::guiUpdate() btxok0=btxok; if(nc0 <= 0) nc0++; if(nc0 == 0) { - if(m_bIQxt) g_pWideGraph->rx570(); // Set Si570 back to Rx Freq + if(m_bIQxt) m_wide_graph_window->rx570(); // Set Si570 back to Rx Freq int itx=0; ptt_(&m_pttPort,&itx,&iptt); // Lower PTT if(!m_txMute) { soundOutThread.quitExecution=true;\ } m_transmitting=false; - g_pWideGraph->enableSetRxHardware(true); + m_wide_graph_window->enableSetRxHardware(true); if(m_auto) { m_monitoring=true; soundInThread.setMonitoring(m_monitoring); @@ -1639,10 +1579,10 @@ void MainWindow::guiUpdate() ui->monitorButton->setStyleSheet(""); } - lab2->setText("QSO Freq: " + QString::number(g_pWideGraph->QSOfreq())); - lab3->setText("QSO DF: " + QString::number(g_pWideGraph->DF())); + lab2->setText("QSO Freq: " + QString::number(m_wide_graph_window->QSOfreq())); + lab3->setText("QSO DF: " + QString::number(m_wide_graph_window->DF())); - g_pWideGraph->updateFreqLabel(); + m_wide_graph_window->updateFreqLabel(); if(m_startAnother) { m_startAnother=false; @@ -1653,8 +1593,8 @@ void MainWindow::guiUpdate() if(nsec != m_sec0) { //Once per second // qDebug() << "A" << nsec%60 << m_mode65 << m_modeQ65 << m_modeTx; - soundInThread.setForceCenterFreqMHz(g_pWideGraph->m_dForceCenterFreq); - soundInThread.setForceCenterFreqBool(g_pWideGraph->m_bForceCenterFreq); + soundInThread.setForceCenterFreqMHz(m_wide_graph_window->m_dForceCenterFreq); + soundInThread.setForceCenterFreqBool(m_wide_graph_window->m_bForceCenterFreq); if(m_pctZap>30.0 and !m_transmitting) { lab4->setStyleSheet("QLabel{background-color: #ff0000}"); @@ -1700,8 +1640,8 @@ void MainWindow::guiUpdate() } QDateTime t = QDateTime::currentDateTimeUtc(); - int fQSO=g_pWideGraph->QSOfreq(); - g_pAstro->astroUpdate(t, m_myGrid, m_hisGrid, fQSO, m_setftx, + int fQSO=m_wide_graph_window->QSOfreq(); + m_astro_window->astroUpdate(t, m_myGrid, m_hisGrid, fQSO, m_setftx, m_txFreq, m_azelDir); m_setftx=0; QString utc = t.date().toString(" yyyy MMM dd \n") + t.time().toString(); @@ -2087,7 +2027,7 @@ void MainWindow::on_tx6_editingFinished() //tx6 edited void MainWindow::on_setTxFreqButton_clicked() //Set Tx Freq { m_setftx=1; - m_txFreq=g_pWideGraph->QSOfreq(); + m_txFreq=m_wide_graph_window->QSOfreq(); } void MainWindow::on_dxCallEntry_textChanged(const QString &t) //dxCall changed @@ -2164,8 +2104,8 @@ void MainWindow::on_actionNoJT65_triggered() m_TRperiod=60; soundInThread.setPeriod(m_TRperiod); soundOutThread.setPeriod(m_TRperiod); - g_pWideGraph->setMode65(m_mode65); - g_pWideGraph->setPeriod(m_TRperiod); + m_wide_graph_window->setMode65(m_mode65); + m_wide_graph_window->setPeriod(m_TRperiod); lab5->setStyleSheet(""); lab5->setText(""); } @@ -2178,8 +2118,8 @@ void MainWindow::on_actionJT65A_triggered() m_TRperiod=60; soundInThread.setPeriod(m_TRperiod); soundOutThread.setPeriod(m_TRperiod); - g_pWideGraph->setMode65(m_mode65); - g_pWideGraph->setPeriod(m_TRperiod); + m_wide_graph_window->setMode65(m_mode65); + m_wide_graph_window->setPeriod(m_TRperiod); lab5->setStyleSheet("QLabel{background-color: #ff6666}"); lab5->setText("JT65A"); ui->actionJT65A->setChecked(true); @@ -2194,8 +2134,8 @@ void MainWindow::on_actionJT65B_triggered() m_TRperiod=60; soundInThread.setPeriod(m_TRperiod); soundOutThread.setPeriod(m_TRperiod); - g_pWideGraph->setMode65(m_mode65); - g_pWideGraph->setPeriod(m_TRperiod); + m_wide_graph_window->setMode65(m_mode65); + m_wide_graph_window->setPeriod(m_TRperiod); lab5->setStyleSheet("QLabel{background-color: #ffff66}"); lab5->setText("JT65B"); ui->actionJT65B->setChecked(true); @@ -2209,8 +2149,8 @@ void MainWindow::on_actionJT65C_triggered() m_TRperiod=60; soundInThread.setPeriod(m_TRperiod); soundOutThread.setPeriod(m_TRperiod); - g_pWideGraph->setMode65(m_mode65); - g_pWideGraph->setPeriod(m_TRperiod); + m_wide_graph_window->setMode65(m_mode65); + m_wide_graph_window->setPeriod(m_TRperiod); lab5->setStyleSheet("QLabel{background-color: #66ffb2}"); lab5->setText("JT65C"); ui->actionJT65C->setChecked(true); diff --git a/map65/mainwindow.h b/map65/mainwindow.h index 2165ac619..16687d208 100644 --- a/map65/mainwindow.h +++ b/map65/mainwindow.h @@ -2,6 +2,7 @@ #define MAINWINDOW_H #include #include +#include #include #include #include @@ -20,9 +21,14 @@ //--------------------------------------------------------------- MainWindow namespace Ui { - class MainWindow; + class MainWindow; } +class Astro; +class BandMap; +class Messages; +class WideGraph; + class MainWindow : public QMainWindow { Q_OBJECT @@ -139,147 +145,149 @@ private slots: void on_pbTxMode_clicked(); private: - Ui::MainWindow *ui; - qint64 m_msErase; - qint32 m_nDevIn; - qint32 m_nDevOut; - qint32 m_idInt; - qint32 m_waterfallAvg; - qint32 m_DF; - qint32 m_tol; - qint32 m_QSOfreq0; - qint32 m_ntx; - qint32 m_pttPort; - qint32 m_astroFont; - qint32 m_timeout; - qint32 m_dPhi; - qint32 m_fCal; - qint32 m_txFreq; - qint32 m_setftx; - qint32 m_ndepth; - qint32 m_sec0; - qint32 m_map65RxLog; - qint32 m_nutc0; - qint32 m_mode65; - qint32 m_nrx; - qint32 m_hsym0; - qint32 m_paInDevice; - qint32 m_paOutDevice; - qint32 m_udpPort; - qint32 m_NBslider; - qint32 m_adjustIQ; - qint32 m_applyIQcal; - qint32 m_mult570; - qint32 m_mult570Tx; - qint32 m_nsum; - qint32 m_nsave; - qint32 m_TRperiod; - qint32 m_modeJT65; - qint32 m_modeQ65; + Ui::MainWindow *ui; + QString m_appDir; + QString m_settings_filename; + QPointer m_astro_window; + QPointer m_band_map_window; + QPointer m_messages_window; + QPointer m_wide_graph_window; + qint64 m_msErase; + qint32 m_nDevIn; + qint32 m_nDevOut; + qint32 m_idInt; + qint32 m_waterfallAvg; + qint32 m_DF; + qint32 m_tol; + qint32 m_QSOfreq0; + qint32 m_ntx; + qint32 m_pttPort; + qint32 m_astroFont; + qint32 m_timeout; + qint32 m_dPhi; + qint32 m_fCal; + qint32 m_txFreq; + qint32 m_setftx; + qint32 m_ndepth; + qint32 m_sec0; + qint32 m_map65RxLog; + qint32 m_nutc0; + qint32 m_mode65; + qint32 m_nrx; + qint32 m_hsym0; + qint32 m_paInDevice; + qint32 m_paOutDevice; + qint32 m_udpPort; + qint32 m_NBslider; + qint32 m_adjustIQ; + qint32 m_applyIQcal; + qint32 m_mult570; + qint32 m_mult570Tx; + qint32 m_nsum; + qint32 m_nsave; + qint32 m_TRperiod; + qint32 m_modeJT65; + qint32 m_modeQ65; - double m_fAdd; -// double m_IQamp; -// double m_IQphase; - double m_cal570; - double m_TxOffset; + double m_fAdd; + // double m_IQamp; + // double m_IQphase; + double m_cal570; + double m_TxOffset; - bool m_monitoring; - bool m_transmitting; - bool m_diskData; - bool m_loopall; - bool m_decoderBusy; - bool m_txFirst; - bool m_auto; - bool m_txMute; - bool m_restart; - bool m_killAll; - bool m_xpol; - bool m_xpolx; - bool m_call3Modified; - bool m_startAnother; - bool m_saveAll; - bool m_onlyEME; - bool m_widebandDecode; - bool m_kb8rq; - bool m_NB; - bool m_fs96000; - bool m_IQswap; - bool m_10db; - bool m_initIQplus; - bool m_bIQxt; + bool m_monitoring; + bool m_transmitting; + bool m_diskData; + bool m_loopall; + bool m_decoderBusy; + bool m_txFirst; + bool m_auto; + bool m_txMute; + bool m_restart; + bool m_killAll; + bool m_xpol; + bool m_xpolx; + bool m_call3Modified; + bool m_startAnother; + bool m_saveAll; + bool m_onlyEME; + bool m_widebandDecode; + bool m_kb8rq; + bool m_NB; + bool m_fs96000; + bool m_IQswap; + bool m_10db; + bool m_initIQplus; + bool m_bIQxt; - float m_gainx; - float m_gainy; - float m_phasex; - float m_phasey; - float m_pctZap; + float m_gainx; + float m_gainy; + float m_phasex; + float m_phasey; + float m_pctZap; - QRect m_astroGeom; - QRect m_wideGraphGeom; - QRect m_messagesGeom; - QRect m_bandMapGeom; + QRect m_wideGraphGeom; - QLabel* lab1; // labels in status bar - QLabel* lab2; - QLabel* lab3; - QLabel* lab4; - QLabel* lab5; - QLabel* lab6; - QLabel* lab7; + QLabel* lab1; // labels in status bar + QLabel* lab2; + QLabel* lab3; + QLabel* lab4; + QLabel* lab5; + QLabel* lab6; + QLabel* lab7; - QMessageBox msgBox0; + QMessageBox msgBox0; - QFuture* future1; - QFuture* future2; - QFutureWatcher* watcher1; - QFutureWatcher* watcher2; + QFuture* future1; + QFuture* future2; + QFutureWatcher* watcher1; + QFutureWatcher* watcher2; - QProcess proc_m65; - QProcess proc_qthid; - QProcess proc_editor; + QProcess proc_m65; + QProcess proc_qthid; + QProcess proc_editor; - QString m_path; - QString m_pbdecoding_style1; - QString m_pbmonitor_style; - QString m_pbAutoOn_style; - QString m_messagesText; - QString m_bandmapText; - QString m_myCall; - QString m_myGrid; - QString m_hisCall; - QString m_hisGrid; - QString m_appDir; - QString m_saveDir; - QString m_azelDir; - QString m_dxccPfx; - QString m_palette; - QString m_dateTime; - QString m_mode; - QString m_colors; - QString m_editorCommand; - QString m_modeTx; + QString m_path; + QString m_pbdecoding_style1; + QString m_pbmonitor_style; + QString m_pbAutoOn_style; + QString m_messagesText; + QString m_bandmapText; + QString m_myCall; + QString m_myGrid; + QString m_hisCall; + QString m_hisGrid; + QString m_saveDir; + QString m_azelDir; + QString m_dxccPfx; + QString m_palette; + QString m_dateTime; + QString m_mode; + QString m_colors; + QString m_editorCommand; + QString m_modeTx; - QHash m_worked; + QHash m_worked; - SignalMeter *xSignalMeter; - SignalMeter *ySignalMeter; + SignalMeter *xSignalMeter; + SignalMeter *ySignalMeter; - SoundInThread soundInThread; //Instantiate the audio threads - SoundOutThread soundOutThread; + SoundInThread soundInThread; //Instantiate the audio threads + SoundOutThread soundOutThread; -//---------------------------------------------------- private functions - void readSettings(); - void writeSettings(); - void createStatusBar(); - void updateStatusBar(); - void msgBox(QString t); - void genStdMsgs(QString rpt); - void lookup(); - void ba2msg(QByteArray ba, char* message); - void msgtype(QString t, QLineEdit* tx); - void stub(); + //---------------------------------------------------- private functions + void readSettings(); + void writeSettings(); + void createStatusBar(); + void updateStatusBar(); + void msgBox(QString t); + void genStdMsgs(QString rpt); + void lookup(); + void ba2msg(QByteArray ba, char* message); + void msgtype(QString t, QLineEdit* tx); + void stub(); bool subProcessFailed (QProcess *, int exit_code, QProcess::ExitStatus); }; diff --git a/map65/messages.cpp b/map65/messages.cpp index f89393025..177b7fb56 100644 --- a/map65/messages.cpp +++ b/map65/messages.cpp @@ -1,24 +1,35 @@ #include "messages.h" +#include +#include "SettingsGroup.hpp" #include "ui_messages.h" #include "mainwindow.h" #include "qt_helpers.hpp" -Messages::Messages(QWidget *parent) : - QDialog(parent), - ui(new Ui::Messages) +Messages::Messages (QString const& settings_filename, QWidget * parent) : + QDialog {parent}, + ui {new Ui::Messages}, + m_settings_filename {settings_filename} { ui->setupUi(this); + setWindowTitle("Messages"); + setWindowFlags (Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; // MainWindow group for + // historical reasons + setGeometry (settings.value ("MessagesGeom", QRect {800, 400, 381, 400}).toRect ()); ui->messagesTextBrowser->setStyleSheet( \ "QTextBrowser { background-color : #000066; color : red; }"); ui->messagesTextBrowser->clear(); m_cqOnly=false; m_cqStarOnly=false; - connect(ui->messagesTextBrowser,SIGNAL(selectCallsign(bool)),this, - SLOT(selectCallsign2(bool))); + connect (ui->messagesTextBrowser, &DisplayText::selectCallsign, this, &Messages::selectCallsign2); } Messages::~Messages() { + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; + settings.setValue ("MessagesGeom", geometry ()); delete ui; } diff --git a/map65/messages.h b/map65/messages.h index de9073904..f80de11b0 100644 --- a/map65/messages.h +++ b/map65/messages.h @@ -12,11 +12,11 @@ class Messages : public QDialog Q_OBJECT public: - explicit Messages(QWidget *parent = 0); + explicit Messages (QString const& settings_filename, QWidget * parent = nullptr); void setText(QString t, QString t2); void setColors(QString t); - ~Messages(); + ~Messages(); signals: void click2OnCallsign(QString hiscall, QString t2); @@ -27,17 +27,18 @@ private slots: void on_cbCQstar_toggled(bool checked); private: - Ui::Messages *ui; - QString m_t; - QString m_t2; - QString m_colorBackground; - QString m_color0; - QString m_color1; - QString m_color2; - QString m_color3; + Ui::Messages *ui; + QString m_settings_filename; + QString m_t; + QString m_t2; + QString m_colorBackground; + QString m_color0; + QString m_color1; + QString m_color2; + QString m_color3; - bool m_cqOnly; - bool m_cqStarOnly; + bool m_cqOnly; + bool m_cqStarOnly; }; -#endif // MESSAGES_H +#endif diff --git a/map65/widegraph.cpp b/map65/widegraph.cpp index ae1e3db08..265b00fa3 100644 --- a/map65/widegraph.cpp +++ b/map65/widegraph.cpp @@ -1,29 +1,35 @@ #include "widegraph.h" +#include +#include +#include "SettingsGroup.hpp" #include "ui_widegraph.h" #define NFFT 32768 -WideGraph::WideGraph(QWidget *parent) : - QDialog(parent), - ui(new Ui::WideGraph) +WideGraph::WideGraph (QString const& settings_filename, QWidget * parent) + : QDialog {parent}, + ui {new Ui::WideGraph}, + m_settings_filename {settings_filename} { ui->setupUi(this); - this->setWindowFlags(Qt::Dialog); - this->installEventFilter(parent); //Installing the filter + setWindowTitle("Wide Graph"); + setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + installEventFilter(parent); //Installing the filter ui->widePlot->setCursor(Qt::CrossCursor); - this->setMaximumWidth(2048); - this->setMaximumHeight(880); + setMaximumWidth(2048); + setMaximumHeight(880); ui->widePlot->setMaximumHeight(800); m_bIQxt=false; connect(ui->widePlot, SIGNAL(freezeDecode1(int)),this, SLOT(wideFreezeDecode(int))); //Restore user's settings - QString inifile(QApplication::applicationDirPath()); - inifile += "/map65.ini"; - QSettings settings(inifile, QSettings::IniFormat); - - settings.beginGroup("WideGraph"); + QSettings settings {m_settings_filename, QSettings::IniFormat}; + { + SettingsGroup g {&settings, "MainWindow"}; // historical reasons + setGeometry (settings.value ("WideGraphGeom", QRect {45,30,1023,340}).toRect ()); + } + SettingsGroup g {&settings, "WideGraph"}; ui->widePlot->setPlotZero(settings.value("PlotZero", 20).toInt()); ui->widePlot->setPlotGain(settings.value("PlotGain", 0).toInt()); ui->zeroSpinBox->setValue(ui->widePlot->getPlotZero()); @@ -44,7 +50,6 @@ WideGraph::WideGraph(QWidget *parent) : ui->fCenterLineEdit->setText(QString::number(m_dForceCenterFreq)); m_bLockTxRx=settings.value("LockTxRx",false).toBool(); ui->cbLockTxRx->setChecked(m_bLockTxRx); - settings.endGroup(); } WideGraph::~WideGraph() @@ -64,11 +69,12 @@ void WideGraph::resizeEvent(QResizeEvent* ) //resizeEvent() void WideGraph::saveSettings() { //Save user's settings - QString inifile(QApplication::applicationDirPath()); - inifile += "/map65.ini"; - QSettings settings(inifile, QSettings::IniFormat); - - settings.beginGroup("WideGraph"); + QSettings settings {m_settings_filename, QSettings::IniFormat}; + { + SettingsGroup g {&settings, "MainWindow"}; // for historical reasons + settings.setValue ("WideGraphGeom", geometry()); + } + SettingsGroup g {&settings, "WideGraph"}; settings.setValue("PlotZero",ui->widePlot->m_plotZero); settings.setValue("PlotGain",ui->widePlot->m_plotGain); settings.setValue("PlotWidth",ui->widePlot->plotWidth()); @@ -78,7 +84,6 @@ void WideGraph::saveSettings() settings.setValue("ForceCenterFreqBool",m_bForceCenterFreq); settings.setValue("ForceCenterFreqMHz",m_dForceCenterFreq); settings.setValue("LockTxRx",m_bLockTxRx); - settings.endGroup(); } void WideGraph::dataSink2(float s[], int nkhz, int ihsym, int ndiskdata, diff --git a/map65/widegraph.h b/map65/widegraph.h index c4e201ab0..1e330cfde 100644 --- a/map65/widegraph.h +++ b/map65/widegraph.h @@ -1,6 +1,6 @@ #ifndef WIDEGRAPH_H #define WIDEGRAPH_H -#include + #include namespace Ui { @@ -12,17 +12,9 @@ class WideGraph : public QDialog Q_OBJECT public: - explicit WideGraph(QWidget *parent = 0); + explicit WideGraph (QString const& settings_filename, QWidget * parent = nullptr); ~WideGraph(); - bool m_bForceCenterFreq; - bool m_bLockTxRx; - qint32 m_mult570; - qint32 m_mult570Tx; - double m_dForceCenterFreq; - double m_cal570; - double m_TxOffset; - void dataSink2(float s[], int nkhz, int ihsym, int ndiskdata, uchar lstrong[]); int QSOfreq(); @@ -73,6 +65,19 @@ private slots: void on_cbSpec2d_toggled(bool checked); void on_cbLockTxRx_stateChanged(int arg1); +private: + Ui::WideGraph * ui; + QString m_settings_filename; +public: + bool m_bForceCenterFreq; +private: + bool m_bLockTxRx; +public: + qint32 m_mult570; + qint32 m_mult570Tx; + double m_dForceCenterFreq; + double m_cal570; + double m_TxOffset; private: bool m_bIQxt; qint32 m_waterfallAvg; @@ -80,8 +85,6 @@ private: qint32 m_fSample; qint32 m_mode65; qint32 m_TRperiod=60; - - Ui::WideGraph *ui; }; extern int set570(double freq_MHz); From cc240681061f3221c36a4538a300d0001c3efbff Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Mon, 17 May 2021 22:18:52 +0100 Subject: [PATCH 2/2] Graceful shutdown of MAP65 May wait for current decoding cycle to complete. --- map65/libm65/m65a.f90 | 7 ++--- map65/main.cpp | 13 +-------- map65/mainwindow.cpp | 64 +++++++++++++++++++++++-------------------- map65/mainwindow.h | 22 +++++++-------- 4 files changed, 48 insertions(+), 58 deletions(-) diff --git a/map65/libm65/m65a.f90 b/map65/libm65/m65a.f90 index 17104b2ce..e84685591 100644 --- a/map65/libm65/m65a.f90 +++ b/map65/libm65/m65a.f90 @@ -54,11 +54,8 @@ subroutine m65a endif p_m65=>address_m65() call m65b(p_m65,nbytes) - -100 inquire(file=trim(cwd)//'/.lock',exist=fileExists) - if(fileExists) go to 10 - call sleep_msec(100) - go to 100 + call sleep_msec(500) ! wait for .lock to be recreated + go to 10 999 return end subroutine m65a diff --git a/map65/main.cpp b/map65/main.cpp index c1a420d0a..cb140be48 100644 --- a/map65/main.cpp +++ b/map65/main.cpp @@ -14,26 +14,15 @@ extern "C" { void four2a_ (_Complex float *, int * nfft, int * ndim, int * isign, int * iform, int len); } -static QtMessageHandler default_message_handler; - -void my_message_handler (QtMsgType type, QMessageLogContext const& context, QString const& msg) -{ - // Handle the messages! - - // Call the default handler. - (*default_message_handler) (type, context, msg); -} - int main(int argc, char *argv[]) { - default_message_handler = qInstallMessageHandler (my_message_handler); - QApplication a {argc, argv}; // Override programs executable basename as application name. a.setApplicationName ("MAP65"); a.setApplicationVersion ("3.0.0-devel"); MainWindow w; w.show (); + QObject::connect (&a, &QApplication::lastWindowClosed, &a, &QApplication::quit); auto result = a.exec (); // clean up lazily initialized FFTW3 resources diff --git a/map65/mainwindow.cpp b/map65/mainwindow.cpp index 3806efc18..4fdf458c4 100644 --- a/map65/mainwindow.cpp +++ b/map65/mainwindow.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "revision_utils.hpp" #include "SettingsGroup.hpp" #include "widgets/MessageBox.hpp" @@ -46,7 +47,8 @@ MainWindow::MainWindow(QWidget *parent) : m_astro_window {new Astro {m_settings_filename}}, m_band_map_window {new BandMap {m_settings_filename}}, m_messages_window {new Messages {m_settings_filename}}, - m_wide_graph_window {new WideGraph {m_settings_filename}} + m_wide_graph_window {new WideGraph {m_settings_filename}}, + m_gui_timer {new QTimer {this}} { ui->setupUi(this); on_EraseButton_clicked(); @@ -120,8 +122,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(&proc_editor, SIGNAL(error(QProcess::ProcessError)), this, SLOT(editor_error())); - QTimer *guiTimer = new QTimer(this); - connect(guiTimer, SIGNAL(timeout()), this, SLOT(guiUpdate())); + connect(m_gui_timer, &QTimer::timeout, this, &MainWindow::guiUpdate); m_auto=false; m_waterfallAvg = 1; @@ -131,7 +132,6 @@ MainWindow::MainWindow(QWidget *parent) : btxok=false; m_restart=false; m_transmitting=false; - m_killAll=false; m_widebandDecode=false; m_ntx=1; m_myCall="K1JT"; @@ -299,13 +299,13 @@ MainWindow::MainWindow(QWidget *parent) : if(ui->actionAFMHot->isChecked()) on_actionAFMHot_triggered(); if(ui->actionBlue->isChecked()) on_actionBlue_triggered(); - connect (m_messages_window, &Messages::click2OnCallsign, this, &MainWindow::doubleClickOnMessages); - connect (m_wide_graph_window, &WideGraph::freezeDecode2, this, &MainWindow::freezeDecode); - connect (m_wide_graph_window, &WideGraph::f11f12, this, &MainWindow::bumpDF); + connect (m_messages_window.get (), &Messages::click2OnCallsign, this, &MainWindow::doubleClickOnMessages); + connect (m_wide_graph_window.get (), &WideGraph::freezeDecode2, this, &MainWindow::freezeDecode); + connect (m_wide_graph_window.get (), &WideGraph::f11f12, this, &MainWindow::bumpDF); // only start the guiUpdate timer after this constructor has finished QTimer::singleShot (0, [=] { - guiTimer->start(100); //Don't change the 100 ms! + m_gui_timer->start(100); //Don't change the 100 ms! }); } @@ -926,29 +926,37 @@ void MainWindow::on_tolSpinBox_valueChanged(int i) //tolSpinBox void MainWindow::on_actionExit_triggered() //Exit() { - OnExit(); + close (); } -void MainWindow::closeEvent(QCloseEvent*) -{ - OnExit(); -} - -void MainWindow::OnExit() +void MainWindow::closeEvent (QCloseEvent * e) { + if (m_gui_timer) m_gui_timer->stop (); m_wide_graph_window->saveSettings(); - m_killAll=true; - mem_m65.detach(); - proc_m65.closeReadChannel (QProcess::StandardOutput); - proc_m65.closeReadChannel (QProcess::StandardError); QFile quitFile(m_appDir + "/.quit"); quitFile.open(QIODevice::ReadWrite); QFile lockFile(m_appDir + "/.lock"); lockFile.remove(); // Allow m65 to terminate - bool b=proc_m65.waitForFinished(1000); - if(!b) proc_m65.kill(); + + // close pipes + proc_m65.closeReadChannel (QProcess::StandardOutput); + proc_m65.closeReadChannel (QProcess::StandardError); + + // flush all input + proc_m65.setReadChannel (QProcess::StandardOutput); + proc_m65.readAll (); + proc_m65.setReadChannel (QProcess::StandardError); + proc_m65.readAll (); + + // allow time for any decode cycle to finish + if (!proc_m65.waitForFinished ()) proc_m65.kill(); quitFile.remove(); - qApp->exit(0); // Exit the event loop + mem_m65.detach(); + if (m_astro_window) m_astro_window->close (); + if (m_band_map_window) m_band_map_window->close (); + if (m_messages_window) m_messages_window->close (); + if (m_wide_graph_window) m_wide_graph_window->close (); + QMainWindow::closeEvent (e); } void MainWindow::on_stopButton_clicked() //stopButton @@ -1321,18 +1329,14 @@ bool MainWindow::subProcessFailed (QProcess * process, int exit_code, QProcess:: void MainWindow::m65_error (QProcess::ProcessError) { - if(!m_killAll) { - msgBox("Error starting or running\n" + m_appDir + "/m65 -s\n\n" - + proc_m65.errorString ()); - QTimer::singleShot (0, this, SLOT (close ())); - } + msgBox("Error starting or running\n" + m_appDir + "/m65 -s\n\n" + + proc_m65.errorString ()); + QTimer::singleShot (0, this, SLOT (close ())); } void MainWindow::editor_error() //editor_error { - if(!m_killAll) { - msgBox("Error starting or running\n" + m_appDir + "/" + m_editorCommand); - } + msgBox("Error starting or running\n" + m_appDir + "/" + m_editorCommand); } void MainWindow::readFromStdout() //readFromStdout diff --git a/map65/mainwindow.h b/map65/mainwindow.h index 16687d208..b38de2430 100644 --- a/map65/mainwindow.h +++ b/map65/mainwindow.h @@ -3,8 +3,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -24,6 +24,7 @@ namespace Ui { class MainWindow; } +class QTimer; class Astro; class BandMap; class Messages; @@ -52,10 +53,10 @@ public slots: void doubleClickOnCall(QString hiscall, bool ctrl); void doubleClickOnMessages(QString hiscall, QString t2); -protected: - virtual void keyPressEvent( QKeyEvent *e ); - void closeEvent(QCloseEvent*); - virtual bool eventFilter(QObject *object, QEvent *event); +private: + virtual void keyPressEvent (QKeyEvent *) override; + virtual bool eventFilter (QObject *, QEvent *) override; + virtual void closeEvent (QCloseEvent *) override; private slots: void on_tx1_editingFinished(); @@ -68,7 +69,6 @@ private slots: void on_monitorButton_clicked(); void on_actionExit_triggered(); void on_actionAbout_triggered(); - void OnExit(); void on_actionLinrad_triggered(); void on_actionCuteSDR_triggered(); void on_autoButton_clicked(); @@ -148,10 +148,11 @@ private: Ui::MainWindow *ui; QString m_appDir; QString m_settings_filename; - QPointer m_astro_window; - QPointer m_band_map_window; - QPointer m_messages_window; - QPointer m_wide_graph_window; + QScopedPointer m_astro_window; + QScopedPointer m_band_map_window; + QScopedPointer m_messages_window; + QScopedPointer m_wide_graph_window; + QPointer m_gui_timer; qint64 m_msErase; qint32 m_nDevIn; qint32 m_nDevOut; @@ -204,7 +205,6 @@ private: bool m_auto; bool m_txMute; bool m_restart; - bool m_killAll; bool m_xpol; bool m_xpolx; bool m_call3Modified;