diff --git a/devsetup.cpp b/devsetup.cpp index c16f679b1..89674e84f 100644 --- a/devsetup.cpp +++ b/devsetup.cpp @@ -130,6 +130,7 @@ void DevSetup::initDlg() ui.saveDirEntry->setText(m_saveDir); ui.comboBoxSndIn->setCurrentIndex(m_nDevIn); ui.comboBoxSndOut->setCurrentIndex(m_nDevOut); + ui.cbID73->setChecked(m_After73); ui.cbPSKReporter->setChecked(m_pskReporter); m_paInDevice=m_inDevList[m_nDevIn]; m_paOutDevice=m_outDevList[m_nDevOut]; @@ -304,3 +305,8 @@ void DevSetup::on_rigComboBox_activated(int index) QString t=ui.rigComboBox->itemText(index); m_rig=t.mid(0,7).toInt(); } + +void DevSetup::on_cbID73_toggled(bool checked) +{ + m_After73=checked; +} diff --git a/devsetup.h b/devsetup.h index 9753be44b..0c7fd2683 100644 --- a/devsetup.h +++ b/devsetup.h @@ -39,6 +39,7 @@ public: bool m_pskReporter; bool m_firstCall; bool m_catEnabled; + bool m_After73; QString m_myCall; QString m_myGrid; @@ -66,14 +67,11 @@ private slots: void on_catPortComboBox_activated(int index); void on_cbEnableCAT_toggled(bool checked); void on_serialRateComboBox_activated(int index); - void on_handshakeComboBox_activated(int index); - void on_dataBitsComboBox_activated(int index); - void on_stopBitsComboBox_activated(int index); - void on_rigComboBox_activated(int index); + void on_cbID73_toggled(bool checked); private: void msgBox(QString t); diff --git a/devsetup.ui b/devsetup.ui index 115bb3ec2..8fc18ba10 100644 --- a/devsetup.ui +++ b/devsetup.ui @@ -387,7 +387,7 @@ - false + true @@ -403,6 +403,26 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + ID after 73 + + + diff --git a/lib/Makefile.linux b/lib/Makefile.linux index 3fb152fa1..fe3320e5e 100644 --- a/lib/Makefile.linux +++ b/lib/Makefile.linux @@ -29,7 +29,7 @@ OBJS1 = pctile.o graycode.o sort.o ssort.o \ fil3.o redsync.o decoder.o grid2n.o n2grid.o timer.o \ decode9a.o peakdt9.o getlags.o afc9.o fchisq.o \ twkfreq.o downsam9.o symspec2.o ipcomm.o sleep_msec.o \ - stdmsg.o sec_midn.o cutil.o azdist.o geodist.o + stdmsg.o sec_midn.o cutil.o azdist.o geodist.o morse.o libjt9.a: $(OBJS1) ar cr libjt9.a $(OBJS1) diff --git a/mainwindow.cpp b/mainwindow.cpp index b7e57adf7..38535632e 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -11,6 +11,7 @@ #include "logqso.h" int itone[85]; //Tx audio tones for 85 symbols +int icw[250]; //Dits for CW ID int rc; wchar_t buffer[256]; bool btxok; //True if OK to transmit @@ -146,6 +147,7 @@ MainWindow::MainWindow(QWidget *parent) : m_dataAvailable=false; m_iptt=0; m_COMportOpen=0; + m_secID=0; decodeBusy(false); ui->xThermo->setFillBrush(Qt::green); @@ -326,6 +328,7 @@ void MainWindow::writeSettings() settings.setValue("Tol",m_tol); settings.setValue("InGain",m_inGain); settings.setValue("PSKReporter",m_pskReporter); + settings.setValue("After73",m_After73); settings.setValue("Macros",m_macro); settings.setValue("toRTTY",m_toRTTY); settings.setValue("NoSuffix",m_noSuffix); @@ -364,6 +367,7 @@ void MainWindow::readSettings() settings.beginGroup("Common"); m_myCall=settings.value("MyCall","").toString(); + morse_(m_myCall.toAscii().data(),icw,&m_ncw,m_myCall.length()); m_myGrid=settings.value("MyGrid","").toString(); m_idInt=settings.value("IDint",0).toInt(); m_pttMethodIndex=settings.value("PTTmethod",1).toInt(); @@ -407,6 +411,7 @@ void MainWindow::readSettings() m_monitorStartOFF=settings.value("MonitorOFF",false).toBool(); ui->actionMonitor_OFF_at_startup->setChecked(m_monitorStartOFF); m_pskReporter=settings.value("PSKReporter",false).toBool(); + m_After73=settings.value("After73",false).toBool(); m_macro=settings.value("Macros","").toStringList(); m_toRTTY=settings.value("toRTTY",false).toBool(); ui->actionConvert_JT9_x_to_RTTY->setChecked(m_toRTTY); @@ -519,6 +524,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog dlg.m_nDevIn=m_nDevIn; dlg.m_nDevOut=m_nDevOut; dlg.m_pskReporter=m_pskReporter; + dlg.m_After73=m_After73; dlg.m_macro=m_macro; dlg.m_catEnabled=m_catEnabled; dlg.m_rig=m_rig; @@ -578,6 +584,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog } #endif m_pskReporter=dlg.m_pskReporter; + m_After73=dlg.m_After73; if(dlg.m_restartSoundIn) { soundInThread.quit(); @@ -1231,8 +1238,7 @@ void MainWindow::guiUpdate() int khsym=0; double tx1=0.0; -// double tx2=m_TRperiod; - double tx2=1.0 + 85.0*m_nsps/12000.0; + double tx2=1.0 + 85.0*m_nsps/12000.0 + icw[0]*2048.0/48000.0; if(!m_txFirst) { tx1 += m_TRperiod; @@ -1252,6 +1258,7 @@ void MainWindow::guiUpdate() } if(bTxTime and m_iptt==0 and !btxMute) { + icw[0]=m_ncw; #define NEW #ifdef NEW //Raise PTT @@ -1307,10 +1314,21 @@ void MainWindow::guiUpdate() f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append); QTextStream out(&f); out << QDateTime::currentDateTimeUtc().toString("hhmm") - << " Transmitted: " << t << endl; + << " Transmitting: " << t << endl; f.close(); } QStringList w=t.split(" ",QString::SkipEmptyParts); + icw[0]=0; + if(m_After73 and (w[2]=="73" or itext!=0)) icw[0]=m_ncw; + + if(m_idInt>0) { + int nmin=(m_sec0-m_secID)/60; + if(nmin >= m_idInt) { + icw[0]=m_ncw; + m_secID=m_sec0; + } + } + QString t2=QDateTime::currentDateTimeUtc().toString("hhmm"); if(itext==0 and w[1]==m_myCall) { t=w[2]; @@ -1618,8 +1636,11 @@ void MainWindow::doubleClickOnCall(bool shift, bool ctrl) if(rpt.indexOf(" ")==0) rpt="+" + rpt.mid(2,2); if(rpt.indexOf(" -")==0) rpt=rpt.mid(1,2); if(rpt.indexOf(" ")==0) rpt="+" + rpt.mid(1,2); - if(rpt.toInt()<-50) rpt="-50"; - if(rpt.toInt()>49) rpt="+49"; + int nr=rpt.toInt(); + if(nr<-50) rpt="-50"; + if(nr>49) rpt="+49"; + if(nr>=0 and nr<=9) rpt="+0" + rpt; + if(nr>=10) rpt="+" + rpt; genStdMsgs(rpt); if(t2.indexOf(m_myCall)>0) { m_ntx=2; diff --git a/mainwindow.h b/mainwindow.h index 2cde1eba8..57fa5bdb2 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -207,6 +207,7 @@ private: bool m_toRTTY; bool m_dBtoComments; bool m_catEnabled; + bool m_After73; char m_decoded[80]; @@ -304,6 +305,8 @@ bool stdmsg_(const char* msg); void azdist_(char* MyGrid, char* HisGrid, double* utch, int* nAz, int* nEl, int* nDmiles, int* nDkm, int* nHotAz, int* nHotABetter, int len1, int len2); + +void morse_(char* msg, int* icw, int* ncw, int len); } #endif // MAINWINDOW_H diff --git a/soundout.cpp b/soundout.cpp index 2ada27eb1..5ca186c23 100644 --- a/soundout.cpp +++ b/soundout.cpp @@ -8,6 +8,7 @@ extern "C" { extern float gran(); //Noise generator (for tests only) extern int itone[85]; //Tx audio tones for 85 symbols +extern int icw[250]; //Dits for CW ID extern bool btxok; extern bool btxMute; extern double outputLatency; @@ -40,7 +41,7 @@ extern "C" int d2aCallback(const void *inputBuffer, void *outputBuffer, static double freq; static double snr; static double fac; - static int ic=0; + static int ic=0,j=0; static short int i2; int isym; @@ -55,16 +56,46 @@ extern "C" int d2aCallback(const void *inputBuffer, void *outputBuffer, srand(mstr); //Initialize random seed } isym=ic/(4*udata->nsps); //Actual fsample=48000 - if(isym>=85) return 1; - baud=12000.0/udata->nsps; - freq=udata->ntxfreq + itone[isym]*baud; - dphi=twopi*freq/48000.0; if(udata->txsnrdb < 0.0) { snr=pow(10.0,0.05*(udata->txsnrdb-6.0)); fac=3000.0; if(snr>1.0) fac=3000.0/snr; } + if(isym>=85 and icw[0]>0) { //Output the CW ID + freq=udata->ntxfreq; + dphi=twopi*freq/48000.0; +// float wpm=20.0; +// int nspd=1.2*48000.0/wpm; + int nspd=3072; //18.75 wpm + nspd=2048; + int ic0=85*4*udata->nsps; + for(int i=0 ; itwopi) phi -= twopi; + i2=32767.0*sin(phi); + j=(ic-ic0)/nspd; + if(icw[j]==0) i2=0; + if(udata->txsnrdb < 0.0) { + int i4=fac*(gran() + i2*snr/32768.0); + if(i4>32767) i4=32767; + if(i4<-32767) i4=-32767; + i2=i4; + } + if(!btxok or btxMute) i2=0; + *wptr++ = i2; //left +#ifdef unix + *wptr++ = i2; //right +#endif + ic++; + } + return paContinue; + } + + if(isym>=85 and itone[0]>=0) return paComplete; + baud=12000.0/udata->nsps; + freq=udata->ntxfreq + itone[isym]*baud; + dphi=twopi*freq/48000.0; for(uint i=0 ; itwopi) phi -= twopi; @@ -80,11 +111,9 @@ extern "C" int d2aCallback(const void *inputBuffer, void *outputBuffer, #ifdef unix *wptr++ = i2; //right #endif - ic++; } - //qDebug() << "PA Callback"; - return 0; + return paContinue; } void SoundOutThread::run()