mirror of https://github.com/saitohirga/WSJT-X.git
Many changes toward GUI support for JT65B2 and JT65C2 sub-modes.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/map65@2547 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
025a4a3473
commit
fce75f9d07
|
@ -6,9 +6,9 @@
|
||||||
|
|
||||||
extern qint16 id[4*60*96000];
|
extern qint16 id[4*60*96000];
|
||||||
|
|
||||||
void getfile(QString fname, bool xpol, int dbDgrd)
|
void getfile(QString fname, bool xpol, int dbDgrd, int nfast)
|
||||||
{
|
{
|
||||||
int npts=2*52*96000;
|
int npts=2*52*96000/nfast;
|
||||||
if(xpol) npts=2*npts;
|
if(xpol) npts=2*npts;
|
||||||
|
|
||||||
// Degrade S/N by dbDgrd dB -- for tests only!!
|
// Degrade S/N by dbDgrd dB -- for tests only!!
|
||||||
|
@ -52,9 +52,9 @@ void getfile(QString fname, bool xpol, int dbDgrd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void savetf2(QString fname, bool xpol)
|
void savetf2(QString fname, bool xpol, int nfast)
|
||||||
{
|
{
|
||||||
int npts=2*52*96000;
|
int npts=2*52*96000/nfast;
|
||||||
if(xpol) npts=2*npts;
|
if(xpol) npts=2*npts;
|
||||||
|
|
||||||
qint16* buf=(qint16*)malloc(2*npts);
|
qint16* buf=(qint16*)malloc(2*npts);
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include "commons.h"
|
#include "commons.h"
|
||||||
|
|
||||||
void getfile(QString fname, bool xpol, int dbDgrd);
|
void getfile(QString fname, bool xpol, int dbDgrd, int nfast);
|
||||||
void savetf2(QString fname, bool xpol);
|
void savetf2(QString fname, bool xpol, int nfast);
|
||||||
float gran();
|
float gran();
|
||||||
|
|
||||||
#endif // GETFILE_H
|
#endif // GETFILE_H
|
||||||
|
|
|
@ -53,6 +53,7 @@ program mapsim
|
||||||
if(mode(1:1).eq.'C') mode65=4
|
if(mode(1:1).eq.'C') mode65=4
|
||||||
nfast=1
|
nfast=1
|
||||||
if(mode(2:2).eq.'2') nfast=2
|
if(mode(2:2).eq.'2') nfast=2
|
||||||
|
npts=NMAX/nfast
|
||||||
open(12,file='msgs.txt',status='old')
|
open(12,file='msgs.txt',status='old')
|
||||||
|
|
||||||
write(*,1000)
|
write(*,1000)
|
||||||
|
@ -67,7 +68,7 @@ program mapsim
|
||||||
open(10,file=fname//'.iq',access='stream',status='unknown')
|
open(10,file=fname//'.iq',access='stream',status='unknown')
|
||||||
open(11,file=fname//'.tf2',access='stream',status='unknown')
|
open(11,file=fname//'.tf2',access='stream',status='unknown')
|
||||||
|
|
||||||
call noisegen(d4,NMAX) !Generate Gaussuian noise
|
call noisegen(d4,npts) !Generate Gaussuian noise
|
||||||
|
|
||||||
if(msg0.ne.' ') then
|
if(msg0.ne.' ') then
|
||||||
call cgen65(message,mode65,nfast,samfac,nsendingsh,msgsent,cwave,nwave)
|
call cgen65(message,mode65,nfast,samfac,nsendingsh,msgsent,cwave,nwave)
|
||||||
|
@ -113,7 +114,7 @@ program mapsim
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
do i=1,NMAX
|
do i=1,npts
|
||||||
id4(1,i)=nint(rms*d4(1,i))
|
id4(1,i)=nint(rms*d4(1,i))
|
||||||
id4(2,i)=nint(rms*d4(2,i))
|
id4(2,i)=nint(rms*d4(2,i))
|
||||||
id4(3,i)=nint(rms*d4(3,i))
|
id4(3,i)=nint(rms*d4(3,i))
|
||||||
|
@ -122,8 +123,8 @@ program mapsim
|
||||||
id2(2,i)=id4(2,i)
|
id2(2,i)=id4(2,i)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
write(10) fcenter,id2
|
write(10) fcenter,id2(1:2,1:npts)
|
||||||
write(11) fcenter,id4
|
write(11) fcenter,id4(1:4,1:npts)
|
||||||
close(10)
|
close(10)
|
||||||
close(11)
|
close(11)
|
||||||
enddo
|
enddo
|
||||||
|
|
|
@ -57,6 +57,8 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||||
ui->actionJT65A->setActionGroup(modeGroup);
|
ui->actionJT65A->setActionGroup(modeGroup);
|
||||||
ui->actionJT65B->setActionGroup(modeGroup);
|
ui->actionJT65B->setActionGroup(modeGroup);
|
||||||
ui->actionJT65C->setActionGroup(modeGroup);
|
ui->actionJT65C->setActionGroup(modeGroup);
|
||||||
|
ui->actionJT65B2->setActionGroup(modeGroup);
|
||||||
|
ui->actionJT65C2->setActionGroup(modeGroup);
|
||||||
|
|
||||||
QActionGroup* saveGroup = new QActionGroup(this);
|
QActionGroup* saveGroup = new QActionGroup(this);
|
||||||
ui->actionSave_all->setActionGroup(saveGroup);
|
ui->actionSave_all->setActionGroup(saveGroup);
|
||||||
|
@ -199,6 +201,8 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||||
if(m_mode=="JT65A") on_actionJT65A_triggered();
|
if(m_mode=="JT65A") on_actionJT65A_triggered();
|
||||||
if(m_mode=="JT65B") on_actionJT65B_triggered();
|
if(m_mode=="JT65B") on_actionJT65B_triggered();
|
||||||
if(m_mode=="JT65C") on_actionJT65C_triggered();
|
if(m_mode=="JT65C") on_actionJT65C_triggered();
|
||||||
|
if(m_mode=="JT65B2") on_actionJT65B2_triggered();
|
||||||
|
if(m_mode=="JT65C2") on_actionJT65C2_triggered();
|
||||||
|
|
||||||
future1 = new QFuture<void>;
|
future1 = new QFuture<void>;
|
||||||
watcher1 = new QFutureWatcher<void>;
|
watcher1 = new QFutureWatcher<void>;
|
||||||
|
@ -461,7 +465,7 @@ void MainWindow::dataSink(int k)
|
||||||
static int n=0;
|
static int n=0;
|
||||||
static int ihsym=0;
|
static int ihsym=0;
|
||||||
static int nzap=0;
|
static int nzap=0;
|
||||||
static int n60z=0;
|
static int ntrz=0;
|
||||||
static int nkhz;
|
static int nkhz;
|
||||||
static int nfsample=96000;
|
static int nfsample=96000;
|
||||||
static int nxpol=0;
|
static int nxpol=0;
|
||||||
|
@ -536,27 +540,34 @@ void MainWindow::dataSink(int k)
|
||||||
|
|
||||||
// Time according to this computer
|
// Time according to this computer
|
||||||
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
||||||
int n60 = (ms/1000) % 60;
|
int ntr = (ms/1000) % m_TRperiod;
|
||||||
if((m_diskData && ihsym <= m_waterfallAvg) || (!m_diskData && n60<n60z)) {
|
if((m_diskData && ihsym <= m_waterfallAvg) || (!m_diskData && ntr<ntrz)) {
|
||||||
for (int i=0; i<NFFT; i++) {
|
for (int i=0; i<NFFT; i++) {
|
||||||
splot[i] = 1.e30;
|
splot[i] = 1.e30;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
n60z=n60;
|
ntrz=ntr;
|
||||||
n=0;
|
n=0;
|
||||||
}
|
}
|
||||||
if(ihsym == 279) {
|
if(ihsym == 279/m_nfast) {
|
||||||
datcom_.newdat=1;
|
datcom_.newdat=1;
|
||||||
datcom_.nagain=0;
|
datcom_.nagain=0;
|
||||||
QDateTime t = QDateTime::currentDateTimeUtc();
|
QDateTime t = QDateTime::currentDateTimeUtc();
|
||||||
m_dateTime=t.toString("yyyy-MMM-dd hh:mm");
|
m_dateTime=t.toString("yyyy-MMM-dd hh:mm");
|
||||||
decode(); //Start the decoder
|
decode(); //Start the decoder
|
||||||
if(m_saveAll) {
|
if(m_saveAll and !m_diskData) {
|
||||||
QString fname=m_saveDir + "/" + t.date().toString("yyMMdd") + "_" +
|
QString fname=m_saveDir + "/" + t.date().toString("yyMMdd") + "_" +
|
||||||
t.time().toString("hhmm");
|
t.time().toString("hhmm");
|
||||||
|
if(m_nfast==2) {
|
||||||
|
if(t.time().second() < 30) {
|
||||||
|
fname += "00";
|
||||||
|
} else {
|
||||||
|
fname += "30";
|
||||||
|
}
|
||||||
|
}
|
||||||
if(m_xpol) fname += ".tf2";
|
if(m_xpol) fname += ".tf2";
|
||||||
if(!m_xpol) fname += ".iq";
|
if(!m_xpol) fname += ".iq";
|
||||||
*future2 = QtConcurrent::run(savetf2, fname, m_xpol);
|
*future2 = QtConcurrent::run(savetf2, fname, m_xpol, m_nfast);
|
||||||
watcher2->setFuture(*future2);
|
watcher2->setFuture(*future2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -970,7 +981,7 @@ void MainWindow::on_actionOpen_triggered() //Open File
|
||||||
m_diskData=true;
|
m_diskData=true;
|
||||||
int dbDgrd=0;
|
int dbDgrd=0;
|
||||||
if(m_myCall=="K1JT" and m_idInt<0) dbDgrd=m_idInt;
|
if(m_myCall=="K1JT" and m_idInt<0) dbDgrd=m_idInt;
|
||||||
*future1 = QtConcurrent::run(getfile, fname, m_xpol, dbDgrd);
|
*future1 = QtConcurrent::run(getfile, fname, m_xpol, dbDgrd, m_nfast);
|
||||||
watcher1->setFuture(*future1);
|
watcher1->setFuture(*future1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1005,7 +1016,7 @@ void MainWindow::on_actionOpen_next_in_directory_triggered() //Open Next
|
||||||
m_diskData=true;
|
m_diskData=true;
|
||||||
int dbDgrd=0;
|
int dbDgrd=0;
|
||||||
if(m_myCall=="K1JT" and m_idInt<0) dbDgrd=m_idInt;
|
if(m_myCall=="K1JT" and m_idInt<0) dbDgrd=m_idInt;
|
||||||
*future1 = QtConcurrent::run(getfile, fname, m_xpol, dbDgrd);
|
*future1 = QtConcurrent::run(getfile, fname, m_xpol, dbDgrd, m_nfast);
|
||||||
watcher1->setFuture(*future1);
|
watcher1->setFuture(*future1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1027,14 +1038,14 @@ void MainWindow::diskDat() //diskDat()
|
||||||
|
|
||||||
if(m_fs96000) hsym=2048.0*96000.0/11025.0; //Samples per JT65 half-symbol
|
if(m_fs96000) hsym=2048.0*96000.0/11025.0; //Samples per JT65 half-symbol
|
||||||
if(!m_fs96000) hsym=2048.0*95238.1/11025.0;
|
if(!m_fs96000) hsym=2048.0*95238.1/11025.0;
|
||||||
for(int i=0; i<281; i++) { // Do the half-symbol FFTs
|
for(int i=0; i<282/m_nfast; i++) { // Do the half-symbol FFTs
|
||||||
int k = i*hsym + 2048.5;
|
int k = i*hsym + 2048.5;
|
||||||
dataSink(k);
|
dataSink(k);
|
||||||
if(i%10 == 0) qApp->processEvents(); //Keep the GUI responsive
|
if(i%10 == 0) qApp->processEvents(); //Keep the GUI responsive
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::diskWriteFinished() //diskWriteFinished
|
void MainWindow::diskWriteFinished() //diskWriteFinished
|
||||||
{
|
{
|
||||||
// qDebug() << "diskWriteFinished";
|
// qDebug() << "diskWriteFinished";
|
||||||
}
|
}
|
||||||
|
@ -1133,8 +1144,11 @@ void MainWindow::on_actionAvailable_suffixes_and_add_on_prefixes_triggered()
|
||||||
|
|
||||||
void MainWindow::on_DecodeButton_clicked() //Decode request
|
void MainWindow::on_DecodeButton_clicked() //Decode request
|
||||||
{
|
{
|
||||||
int n=m_sec0%60;
|
int n=m_sec0%m_TRperiod;
|
||||||
if(m_monitoring and n>47 and (n<52 or m_decoderBusy)) return;
|
if(m_nfast==1) {
|
||||||
|
if(m_monitoring and n>47 and (n<52 or m_decoderBusy)) return;
|
||||||
|
} else {
|
||||||
|
if(m_monitoring and n>21 and (n<26 or m_decoderBusy)) return; }
|
||||||
if(!m_decoderBusy) {
|
if(!m_decoderBusy) {
|
||||||
datcom_.newdat=0;
|
datcom_.newdat=0;
|
||||||
datcom_.nagain=1;
|
datcom_.nagain=1;
|
||||||
|
@ -1343,8 +1357,8 @@ void MainWindow::guiUpdate()
|
||||||
double tx2=126.0*4096.0/11025.0 + 1.8; //### depend on TxDelay? ###
|
double tx2=126.0*4096.0/11025.0 + 1.8; //### depend on TxDelay? ###
|
||||||
|
|
||||||
if(!m_txFirst) {
|
if(!m_txFirst) {
|
||||||
tx1 += 60.0;
|
tx1 += m_TRperiod;
|
||||||
tx2 += 60.0;
|
tx2 += m_TRperiod;
|
||||||
}
|
}
|
||||||
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
||||||
int nsec=ms/1000;
|
int nsec=ms/1000;
|
||||||
|
@ -1900,7 +1914,7 @@ void MainWindow::on_logQSOButton_clicked() //Log QSO button
|
||||||
QDateTime t = QDateTime::currentDateTimeUtc();
|
QDateTime t = QDateTime::currentDateTimeUtc();
|
||||||
QString logEntry=t.date().toString("yyyy-MMM-dd,") +
|
QString logEntry=t.date().toString("yyyy-MMM-dd,") +
|
||||||
t.time().toString("hh:mm,") + m_hisCall + "," + m_hisGrid + "," +
|
t.time().toString("hh:mm,") + m_hisCall + "," + m_hisGrid + "," +
|
||||||
QString::number(nMHz) + ",JT65B\n";
|
QString::number(nMHz) + "," + m_mode;
|
||||||
QFile f("wsjt.log");
|
QFile f("wsjt.log");
|
||||||
if(!f.open(QFile::Append)) {
|
if(!f.open(QFile::Append)) {
|
||||||
msgBox("Cannot open file \"wsjt.log\".");
|
msgBox("Cannot open file \"wsjt.log\".");
|
||||||
|
@ -1937,6 +1951,9 @@ void MainWindow::on_actionJT65A_triggered()
|
||||||
{
|
{
|
||||||
m_mode="JT65A";
|
m_mode="JT65A";
|
||||||
m_mode65=1;
|
m_mode65=1;
|
||||||
|
m_nfast=1;
|
||||||
|
m_TRperiod=60;
|
||||||
|
soundInThread.setPeriod(m_TRperiod);
|
||||||
g_pWideGraph->setMode65(m_mode65);
|
g_pWideGraph->setMode65(m_mode65);
|
||||||
lab5->setText(m_mode);
|
lab5->setText(m_mode);
|
||||||
ui->actionJT65A->setChecked(true);
|
ui->actionJT65A->setChecked(true);
|
||||||
|
@ -1946,6 +1963,9 @@ void MainWindow::on_actionJT65B_triggered()
|
||||||
{
|
{
|
||||||
m_mode="JT65B";
|
m_mode="JT65B";
|
||||||
m_mode65=2;
|
m_mode65=2;
|
||||||
|
m_nfast=1;
|
||||||
|
m_TRperiod=60;
|
||||||
|
soundInThread.setPeriod(m_TRperiod);
|
||||||
g_pWideGraph->setMode65(m_mode65);
|
g_pWideGraph->setMode65(m_mode65);
|
||||||
lab5->setText(m_mode);
|
lab5->setText(m_mode);
|
||||||
ui->actionJT65B->setChecked(true);
|
ui->actionJT65B->setChecked(true);
|
||||||
|
@ -1955,11 +1975,38 @@ void MainWindow::on_actionJT65C_triggered()
|
||||||
{
|
{
|
||||||
m_mode="JT65C";
|
m_mode="JT65C";
|
||||||
m_mode65=4;
|
m_mode65=4;
|
||||||
|
m_nfast=1;
|
||||||
|
m_TRperiod=60;
|
||||||
|
soundInThread.setPeriod(m_TRperiod);
|
||||||
g_pWideGraph->setMode65(m_mode65);
|
g_pWideGraph->setMode65(m_mode65);
|
||||||
lab5->setText(m_mode);
|
lab5->setText(m_mode);
|
||||||
ui->actionJT65C->setChecked(true);
|
ui->actionJT65C->setChecked(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_actionJT65B2_triggered()
|
||||||
|
{
|
||||||
|
m_mode="JT65B2";
|
||||||
|
m_mode65=2;
|
||||||
|
m_nfast=2;
|
||||||
|
m_TRperiod=30;
|
||||||
|
soundInThread.setPeriod(m_TRperiod);
|
||||||
|
g_pWideGraph->setMode65(m_mode65);
|
||||||
|
lab5->setText(m_mode);
|
||||||
|
ui->actionJT65B2->setChecked(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_actionJT65C2_triggered()
|
||||||
|
{
|
||||||
|
m_mode="JT65C2";
|
||||||
|
m_mode65=4;
|
||||||
|
m_nfast=2;
|
||||||
|
m_TRperiod=30;
|
||||||
|
soundInThread.setPeriod(m_TRperiod);
|
||||||
|
g_pWideGraph->setMode65(m_mode65);
|
||||||
|
lab5->setText(m_mode);
|
||||||
|
ui->actionJT65C2->setChecked(true);
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::on_NBcheckBox_toggled(bool checked)
|
void MainWindow::on_NBcheckBox_toggled(bool checked)
|
||||||
{
|
{
|
||||||
m_NB=checked;
|
m_NB=checked;
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
#include "getfile.h"
|
||||||
#include "soundin.h"
|
#include "soundin.h"
|
||||||
#include "soundout.h"
|
#include "soundout.h"
|
||||||
#include "commons.h"
|
#include "commons.h"
|
||||||
|
@ -123,6 +124,10 @@ private slots:
|
||||||
|
|
||||||
void on_actionFUNcube_Dongle_triggered();
|
void on_actionFUNcube_Dongle_triggered();
|
||||||
|
|
||||||
|
void on_actionJT65B2_triggered();
|
||||||
|
|
||||||
|
void on_actionJT65C2_triggered();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MainWindow *ui;
|
Ui::MainWindow *ui;
|
||||||
qint32 m_nDevIn;
|
qint32 m_nDevIn;
|
||||||
|
@ -157,6 +162,7 @@ private:
|
||||||
qint32 m_nfast;
|
qint32 m_nfast;
|
||||||
qint32 m_nsum;
|
qint32 m_nsum;
|
||||||
qint32 m_nsave;
|
qint32 m_nsave;
|
||||||
|
qint32 m_TRperiod;
|
||||||
|
|
||||||
double m_fAdd;
|
double m_fAdd;
|
||||||
double m_IQamp;
|
double m_IQamp;
|
||||||
|
|
|
@ -1225,6 +1225,8 @@ p, li { white-space: pre-wrap; }
|
||||||
<addaction name="actionJT65A"/>
|
<addaction name="actionJT65A"/>
|
||||||
<addaction name="actionJT65B"/>
|
<addaction name="actionJT65B"/>
|
||||||
<addaction name="actionJT65C"/>
|
<addaction name="actionJT65C"/>
|
||||||
|
<addaction name="actionJT65B2"/>
|
||||||
|
<addaction name="actionJT65C2"/>
|
||||||
</widget>
|
</widget>
|
||||||
<addaction name="menuFile"/>
|
<addaction name="menuFile"/>
|
||||||
<addaction name="menuSetup"/>
|
<addaction name="menuSetup"/>
|
||||||
|
@ -1568,6 +1570,22 @@ p, li { white-space: pre-wrap; }
|
||||||
<string>FUNcube Dongle Settings</string>
|
<string>FUNcube Dongle Settings</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionJT65B2">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>JT65B2</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionJT65C2">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>JT65C2</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11"/>
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
|
|
25
soundin.cpp
25
soundin.cpp
|
@ -187,10 +187,10 @@ void SoundInThread::run() //SoundInThread::run()
|
||||||
// const PaStreamInfo* p=Pa_GetStreamInfo(inStream);
|
// const PaStreamInfo* p=Pa_GetStreamInfo(inStream);
|
||||||
|
|
||||||
bool qe = quitExecution;
|
bool qe = quitExecution;
|
||||||
int n60z=99;
|
int ntrz=99;
|
||||||
int k=0;
|
int k=0;
|
||||||
int nsec;
|
int nsec;
|
||||||
int n60;
|
int ntr;
|
||||||
int nBusy=0;
|
int nBusy=0;
|
||||||
int nhsym0=0;
|
int nhsym0=0;
|
||||||
|
|
||||||
|
@ -200,10 +200,10 @@ void SoundInThread::run() //SoundInThread::run()
|
||||||
if (qe) break;
|
if (qe) break;
|
||||||
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
||||||
nsec = ms/1000; // Time according to this computer
|
nsec = ms/1000; // Time according to this computer
|
||||||
n60 = nsec % 60;
|
ntr = nsec % m_TRperiod;
|
||||||
|
|
||||||
// Reset buffer pointer and symbol number at start of minute
|
// Reset buffer pointer and symbol number at start of minute
|
||||||
if(n60 < n60z or !m_monitoring) {
|
if(ntr < ntrz or !m_monitoring) {
|
||||||
nhsym0=0;
|
nhsym0=0;
|
||||||
udata.bzero=true;
|
udata.bzero=true;
|
||||||
}
|
}
|
||||||
|
@ -228,7 +228,7 @@ void SoundInThread::run() //SoundInThread::run()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
msleep(100);
|
msleep(100);
|
||||||
n60z=n60;
|
ntrz=ntr;
|
||||||
}
|
}
|
||||||
Pa_StopStream(inStream);
|
Pa_StopStream(inStream);
|
||||||
Pa_CloseStream(inStream);
|
Pa_CloseStream(inStream);
|
||||||
|
@ -314,6 +314,11 @@ int SoundInThread::mhsym()
|
||||||
return m_hsym;
|
return m_hsym;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoundInThread::setPeriod(int n)
|
||||||
|
{
|
||||||
|
m_TRperiod=n;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------- inputUDP()
|
//--------------------------------------------------------------- inputUDP()
|
||||||
void SoundInThread::inputUDP()
|
void SoundInThread::inputUDP()
|
||||||
{
|
{
|
||||||
|
@ -341,10 +346,10 @@ void SoundInThread::inputUDP()
|
||||||
double d8[174];
|
double d8[174];
|
||||||
} b;
|
} b;
|
||||||
|
|
||||||
int n60z=99;
|
int ntrz=99;
|
||||||
int k=0;
|
int k=0;
|
||||||
int nsec;
|
int nsec;
|
||||||
int n60;
|
int ntr;
|
||||||
int nhsym0=0;
|
int nhsym0=0;
|
||||||
int iz=174;
|
int iz=174;
|
||||||
int nBusy=0;
|
int nBusy=0;
|
||||||
|
@ -361,14 +366,14 @@ void SoundInThread::inputUDP()
|
||||||
|
|
||||||
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
||||||
nsec = ms/1000; // Time according to this computer
|
nsec = ms/1000; // Time according to this computer
|
||||||
n60 = nsec % 60;
|
ntr = nsec % m_TRperiod;
|
||||||
|
|
||||||
// Reset buffer pointer and symbol number at start of minute
|
// Reset buffer pointer and symbol number at start of minute
|
||||||
if(n60 < n60z) {
|
if(ntr < ntrz) {
|
||||||
k=0;
|
k=0;
|
||||||
nhsym0=0;
|
nhsym0=0;
|
||||||
}
|
}
|
||||||
n60z=n60;
|
ntrz=ntr;
|
||||||
|
|
||||||
if(m_monitoring) {
|
if(m_monitoring) {
|
||||||
m_nrx=b.nrx;
|
m_nrx=b.nrx;
|
||||||
|
|
|
@ -47,6 +47,7 @@ public:
|
||||||
void setNrx(int n);
|
void setNrx(int n);
|
||||||
void setForceCenterFreqBool(bool b);
|
void setForceCenterFreqBool(bool b);
|
||||||
void setForceCenterFreqMHz(double d);
|
void setForceCenterFreqMHz(double d);
|
||||||
|
void setPeriod(int n);
|
||||||
int nrx();
|
int nrx();
|
||||||
int mhsym();
|
int mhsym();
|
||||||
|
|
||||||
|
@ -73,6 +74,7 @@ private:
|
||||||
qint32 m_hsym;
|
qint32 m_hsym;
|
||||||
qint32 m_nDevIn;
|
qint32 m_nDevIn;
|
||||||
qint32 m_udpPort;
|
qint32 m_udpPort;
|
||||||
|
qint32 m_TRperiod;
|
||||||
|
|
||||||
QUdpSocket *udpSocket;
|
QUdpSocket *udpSocket;
|
||||||
};
|
};
|
||||||
|
|
49
soundout.cpp
49
soundout.cpp
|
@ -15,7 +15,7 @@ extern double outputLatency;
|
||||||
|
|
||||||
typedef struct //Parameters sent to or received from callback function
|
typedef struct //Parameters sent to or received from callback function
|
||||||
{
|
{
|
||||||
int dummy;
|
int nTRperiod;
|
||||||
} paUserData;
|
} paUserData;
|
||||||
|
|
||||||
//--------------------------------------------------------------- d2aCallback
|
//--------------------------------------------------------------- d2aCallback
|
||||||
|
@ -29,14 +29,11 @@ extern "C" int d2aCallback(const void *inputBuffer, void *outputBuffer,
|
||||||
short *wptr = (short*)outputBuffer;
|
short *wptr = (short*)outputBuffer;
|
||||||
unsigned int i,n;
|
unsigned int i,n;
|
||||||
static int ic=0;
|
static int ic=0;
|
||||||
// static int ic0=0;
|
|
||||||
// static int nsec0=-99;
|
|
||||||
static bool btxok0=false;
|
static bool btxok0=false;
|
||||||
static int nminStart=0;
|
static int nminStart=0;
|
||||||
// static t0,t1;
|
|
||||||
double tsec,tstart;
|
double tsec,tstart;
|
||||||
|
|
||||||
int nsec;
|
int nsec;
|
||||||
|
int nTRperiod=udata->nTRperiod;
|
||||||
|
|
||||||
// Get System time
|
// Get System time
|
||||||
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
||||||
|
@ -44,46 +41,21 @@ extern "C" int d2aCallback(const void *inputBuffer, void *outputBuffer,
|
||||||
nsec = ms/1000;
|
nsec = ms/1000;
|
||||||
|
|
||||||
if(btxok and !btxok0) { //Start (or re-start) a transmission
|
if(btxok and !btxok0) { //Start (or re-start) a transmission
|
||||||
n=nsec/60;
|
n=nsec/nTRperiod;
|
||||||
tstart=tsec - n*60.0 - 1.0;
|
tstart=tsec - n*nTRperiod - 1.0;
|
||||||
|
|
||||||
if(tstart<1.0) {
|
if(tstart<1.0) {
|
||||||
ic=0; //Start of minute, set starting index to 0
|
ic=0; //Start of minute, set starting index to 0
|
||||||
// ic0=ic;
|
|
||||||
nminStart=n;
|
nminStart=n;
|
||||||
// t0=timeInfo->currentTime;
|
|
||||||
} else {
|
} else {
|
||||||
if(n != nminStart) { //Late start in new minute: compute starting index
|
if(n != nminStart) { //Late start in new minute: compute starting index
|
||||||
ic=(int)(tstart*11025.0);
|
ic=(int)(tstart*11025.0);
|
||||||
// ic0=ic;
|
|
||||||
// t0=timeInfo->currentTime;
|
|
||||||
// qDebug() << "B" << t0 << ic0;
|
|
||||||
nminStart=n;
|
nminStart=n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
qDebug() << "A" << n << ic
|
|
||||||
<< QString::number( tsec, 'f', 3 )
|
|
||||||
<< QString::number( tstart, 'f', 3 )
|
|
||||||
<< QString::number( timeInfo->currentTime, 'f', 3 )
|
|
||||||
<< QString::number( timeInfo->outputBufferDacTime, 'f', 3 )
|
|
||||||
<< QString::number( timeInfo->outputBufferDacTime -
|
|
||||||
timeInfo->currentTime, 'f', 3 )
|
|
||||||
<< QString::number( timeInfo->currentTime - tsec, 'f', 3 );
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
btxok0=btxok;
|
btxok0=btxok;
|
||||||
|
|
||||||
/*
|
|
||||||
if(nsec!=nsec0) {
|
|
||||||
double txt=timeInfo->currentTime - t0;
|
|
||||||
double r=0.0;
|
|
||||||
if(txt>0.0) r=(ic-ic0)/txt;
|
|
||||||
qDebug() << "C" << txt << ic-ic0 << r;
|
|
||||||
nsec0=nsec;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
if(btxok) {
|
if(btxok) {
|
||||||
for(i=0 ; i<framesToProcess; i++ ) {
|
for(i=0 ; i<framesToProcess; i++ ) {
|
||||||
short int i2=iwave[ic];
|
short int i2=iwave[ic];
|
||||||
|
@ -122,6 +94,8 @@ void SoundOutThread::run()
|
||||||
outParam.suggestedLatency=0.05;
|
outParam.suggestedLatency=0.05;
|
||||||
outParam.hostApiSpecificStreamInfo=NULL;
|
outParam.hostApiSpecificStreamInfo=NULL;
|
||||||
|
|
||||||
|
udata.nTRperiod=m_TRperiod;
|
||||||
|
|
||||||
paerr=Pa_IsFormatSupported(NULL,&outParam,11025.0);
|
paerr=Pa_IsFormatSupported(NULL,&outParam,11025.0);
|
||||||
if(paerr<0) {
|
if(paerr<0) {
|
||||||
qDebug() << "PortAudio says requested output format not supported.";
|
qDebug() << "PortAudio says requested output format not supported.";
|
||||||
|
@ -129,9 +103,6 @@ void SoundOutThread::run()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// udata.nwave=m_nwave;
|
|
||||||
// udata.btxok=false;
|
|
||||||
|
|
||||||
paerr=Pa_OpenStream(&outStream, //Output stream
|
paerr=Pa_OpenStream(&outStream, //Output stream
|
||||||
NULL, //No input parameters
|
NULL, //No input parameters
|
||||||
&outParam, //Output parameters
|
&outParam, //Output parameters
|
||||||
|
@ -154,9 +125,6 @@ void SoundOutThread::run()
|
||||||
while (!qe) {
|
while (!qe) {
|
||||||
qe = quitExecution;
|
qe = quitExecution;
|
||||||
if (qe) break;
|
if (qe) break;
|
||||||
// udata.nwave=m_nwave;
|
|
||||||
// if(m_txOK) udata.btxok=1;
|
|
||||||
// if(!m_txOK) udata.btxok=0;
|
|
||||||
msleep(100);
|
msleep(100);
|
||||||
}
|
}
|
||||||
Pa_StopStream(outStream);
|
Pa_StopStream(outStream);
|
||||||
|
@ -168,3 +136,8 @@ void SoundOutThread::setOutputDevice(int n) //setOutputDevice()
|
||||||
if (isRunning()) return;
|
if (isRunning()) return;
|
||||||
this->m_nDevOut=n;
|
this->m_nDevOut=n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoundOutThread::setPeriod(int n)
|
||||||
|
{
|
||||||
|
m_TRperiod=n;
|
||||||
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ public:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void setOutputDevice(qint32 n);
|
void setOutputDevice(qint32 n);
|
||||||
|
void setPeriod(int n);
|
||||||
bool quitExecution; //If true, thread exits gracefully
|
bool quitExecution; //If true, thread exits gracefully
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,6 +36,7 @@ private:
|
||||||
double m_rate; //Sample rate
|
double m_rate; //Sample rate
|
||||||
qint32 m_nDevOut; //Output device number
|
qint32 m_nDevOut; //Output device number
|
||||||
qint32 m_nwave; //Length of wave file
|
qint32 m_nwave; //Length of wave file
|
||||||
|
qint32 m_TRperiod; //T/R period (30 or 60 s)
|
||||||
bool m_txOK; //Enable Tx audio
|
bool m_txOK; //Enable Tx audio
|
||||||
bool m_txMute; //Mute temporarily
|
bool m_txMute; //Mute temporarily
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue