More changes related to EME Echo mode.

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@5542 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Joe Taylor 2015-06-06 00:02:02 +00:00
parent 4f6904943b
commit 1b0ba09639
5 changed files with 88 additions and 155 deletions

View File

@ -52,8 +52,6 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol,
// Time according to this computer which becomes our base time
qint64 ms0 = QDateTime::currentMSecsSinceEpoch() % 86400000;
// qDebug () << "Modulator: Using soft keying for CW is " << SOFT_KEYING;;
if (m_state != Idle)
{
stop ();
@ -87,9 +85,6 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol,
m_silentFrames = m_ic + m_frameRate - (mstr * m_frameRate / 1000);
}
// qDebug () << "Modulator: starting at " << m_ic / m_frameRate
// << " sec, sending " << m_silentFrames << " silent frames";
initialize (QIODevice::ReadOnly, channel);
Q_EMIT stateChanged ((m_state = (synchronize && m_silentFrames) ?
Synchronizing : Active));
@ -144,8 +139,6 @@ qint64 Modulator::readData (char * data, qint64 maxSize)
qint16 * end (samples + numFrames * (bytesPerFrame () / sizeof (qint16)));
qint64 framesGenerated (0);
// qDebug () << "Modulator: " << numFrames << " requested, m_ic = " << m_ic << ", tune mode is " << m_tuning;
// qDebug() << "C" << maxSize << numFrames << bytesPerFrame();
switch (m_state)
{
case Synchronizing:
@ -234,6 +227,7 @@ qint64 Modulator::readData (char * data, qint64 maxSize)
}
m_dphi = m_twoPi * toneFrequency0 / m_frameRate;
m_isym0 = isym;
m_frequency0 = m_frequency; //???
}
int j=m_ic/480;
@ -263,14 +257,8 @@ qint64 Modulator::readData (char * data, qint64 maxSize)
}
m_phi = 0.0;
}
/*
if(m_frequency != m_frequency0 or itone[0] != m_itone0) qDebug() << "Modulator B:" << itone[0] << m_frequency
<< m_dphi*m_frameRate/m_twoPi ;
m_itone0=itone[0];
*/
m_frequency0 = m_frequency;
// qDebug() << "a" << m_frequency << m_nsps << m_toneSpacing << toneFrequency0 << baud << isym;
m_frequency0 = m_frequency;
// done for this chunk - continue on next call
return framesGenerated * bytesPerFrame ();
}

View File

@ -569,7 +569,7 @@ MainWindow::MainWindow(bool multiple, QSettings * settings, QSharedMemory *shdme
m_hsymStop=173;
if(m_config.decode_at_52s()) m_hsymStop=181;
}
m_modulator.setPeriod(60);
m_modulator.setPeriod(m_TRperiod);
m_dialFreqRxWSPR=0;
wsprNet = new WSPRNet(this);
connect( wsprNet, SIGNAL(uploadStatus(QString)), this, SLOT(uploadResponse(QString)));
@ -943,6 +943,7 @@ void MainWindow::monitor (bool state)
{
ui->monitorButton->setChecked (state);
if (state) {
// qDebug() << "monitor" << fmod(0.001*QDateTime::currentMSecsSinceEpoch(),6.0);
if (!m_monitoring) Q_EMIT resumeAudioInputStream ();
} else {
Q_EMIT suspendAudioInputStream ();
@ -958,8 +959,6 @@ void MainWindow::on_actionAbout_triggered() //Display "About"
void MainWindow::on_autoButton_clicked (bool checked)
{
m_auto = checked;
qDebug() << "autoButton_clicked" << m_auto << m_tuneup;
m_messageClient->status_update (m_dialFreq, m_mode, m_hisCall,
QString::number (ui->rptSpinBox->value ()),
m_modeTx, ui->autoButton->isChecked (),
@ -978,7 +977,6 @@ void MainWindow::on_autoButton_clicked (bool checked)
void MainWindow::auto_tx_mode (bool state)
{
// qDebug() << "auto_tx_mode" << state << m_tuneup;
ui->autoButton->setChecked (state);
on_autoButton_clicked (state);
}
@ -1801,8 +1799,6 @@ void MainWindow::guiUpdate()
static double onAirFreq0=0.0;
QString rt;
if(m_mode=="Echo") echoUpdate();
double txDuration=1.0 + 85.0*m_nsps/12000.0; // JT9
if(m_modeTx=="JT65") txDuration=1.0 + 126*4096/11025.0; // JT65
if(m_mode=="WSPR-2") txDuration=2.0 + 162*8192/12000.0; // WSPR
@ -1814,34 +1810,29 @@ void MainWindow::guiUpdate()
tx1 += m_TRperiod;
tx2 += m_TRperiod;
}
if(m_mode=="Echo") {
txDuration=2.5;
tx1=0.0;
tx2=txDuration;
}
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
int nsec=ms/1000;
double tsec=0.001*ms;
double t2p=fmod(tsec,2*m_TRperiod);
m_s6=fmod(tsec,6.0);
m_nseq = nsec % m_TRperiod;
if(m_mode=="Echo") goto ApplyDoppler;
if(m_mode.mid(0,4)=="WSPR") {
if(m_nseq==0 and m_ntr==0) { //Decide whether to Tx or Rx
m_tuneup=false; //This is not an ATU tuneup
if(m_pctx==0) m_nrx=1; //Don't transmit if m_pctx=0
bool btx = m_auto and (m_nrx<=0); //To Tx, we need m_auto and Rx sequsnce finished
// if(m_bHaveTransmitted) btx=false; //Normally, no two consecutive transmissions
if(m_auto and m_txNext) btx=true; //TxNext button overrides
if(m_auto and m_pctx==100) btx=true; //Always transmit
// qDebug() << "B" << m_pctx << m_auto << m_nrx << m_ntr << m_txNext;
if(btx) {
// This will be a WSPR Tx sequence. Compute # of Rx's that should follow.
// float x=(float)rand()/RAND_MAX;
// if(m_pctx<50) {
// m_nrx=int(m_rxavg + 3.0*(x-0.5) + 0.5);
// } else {
// m_nrx=0;
// if(x<m_rxavg) m_nrx=1;
// }
m_ntr=-1; //This says we will have transmitted
m_bHaveTransmitted=true;
m_txNext=false;
@ -1856,20 +1847,21 @@ void MainWindow::guiUpdate()
}
} else {
m_bTxTime = (t2p >= tx1) and (t2p < tx2); // For all modes other than WSPR
// For all modes other than WSPR
m_bTxTime = (t2p >= tx1) and (t2p < tx2);
}
if(m_tune) m_bTxTime=true; //"Tune" takes precedence
if(m_transmitting or m_auto or m_tune) {
// Check for "txboth" (testing purposes only)
QFile f(m_appDir + "/txboth");
if(f.exists() and fmod(tsec,m_TRperiod) < (1.0 + 85.0*m_nsps/12000.0)) {
m_bTxTime=true;
}
if(f.exists() and
fmod(tsec,m_TRperiod)<(1.0 + 85.0*m_nsps/12000.0)) m_bTxTime=true;
// Don't transmit another mode in the 30 m WSPR sub-band
Frequency onAirFreq = m_dialFreq + ui->TxFreqSpinBox->value();
if ((onAirFreq > 10139900 and onAirFreq < 10140320) and m_mode.mid(0,4)!="WSPR") {
if ((onAirFreq > 10139900 and onAirFreq < 10140320) and
m_mode.mid(0,4)!="WSPR") {
m_bTxTime=false;
if (m_tune) stop_tuning ();
if (m_auto) auto_tx_mode (false);
@ -1905,16 +1897,14 @@ void MainWindow::guiUpdate()
m_btxok=false;
}
if(m_ntr==1) {
// if(ui->band_hopping_group_box->isChecked ()) {
// qDebug() << "Call bandHopping after Rx" << m_nseq << m_ntr << m_nrx << m_rxDone;
bandHopping();
// }
bandHopping();
m_ntr=0; //This WSPR Rx sequence is complete
}
}
// Calculate Tx tones when needed
if((g_iptt==1 && iptt0==0) || m_restart) {
//----------------------------------------------------------------------
QByteArray ba;
if(m_mode.mid(0,4)=="WSPR") {
@ -2030,47 +2020,45 @@ void MainWindow::guiUpdate()
}
if (m_currentMessageType < 6 && msg_parts.length() >= 3
&& (msg_parts[1] == m_config.my_callsign () || msg_parts[1] == m_baseCall))
&& (msg_parts[1] == m_config.my_callsign () ||
msg_parts[1] == m_baseCall))
{
int i1;
bool ok;
i1 = msg_parts[2].toInt(&ok);
if(ok and i1>=-50 and i1<50)
{
int i1;
bool ok;
i1 = msg_parts[2].toInt(&ok);
if(ok and i1>=-50 and i1<50)
m_rptSent = msg_parts[2];
m_qsoStart = t2;
} else {
if (msg_parts[2].mid (0, 1) == "R")
{
i1 = msg_parts[2].mid (1).toInt (&ok);
if (ok and i1 >= -50 and i1 < 50)
{
m_rptSent = msg_parts[2];
m_rptSent = msg_parts[2].mid (1);
m_qsoStart = t2;
}
else
{
if (msg_parts[2].mid (0, 1) == "R")
{
i1 = msg_parts[2].mid (1).toInt (&ok);
if (ok and i1 >= -50 and i1 < 50)
{
m_rptSent = msg_parts[2].mid (1);
m_qsoStart = t2;
}
}
}
}
m_restart=false;
} else {
if (!m_auto && m_sentFirst73)
{
m_sentFirst73 = false;
if (1 == ui->tabWidget->currentIndex())
{
ui->genMsg->setText(ui->tx6->text());
m_ntx=7;
ui->rbGenMsg->setChecked(true);
}
else
{
m_ntx=6;
ui->txrb6->setChecked(true);
}
}
}
}
m_restart=false;
//----------------------------------------------------------------------
} else {
if (!m_auto && m_sentFirst73)
{
m_sentFirst73 = false;
if (1 == ui->tabWidget->currentIndex())
{
ui->genMsg->setText(ui->tx6->text());
m_ntx=7;
ui->rbGenMsg->setChecked(true);
} else {
m_ntx=6;
ui->txrb6->setChecked(true);
}
}
}
if (g_iptt == 1 && iptt0 == 0)
{
@ -2115,7 +2103,6 @@ void MainWindow::guiUpdate()
on_actionOpen_next_in_directory_triggered();
}
ApplyDoppler:
Frequency f;
if(m_astroWidget) {
m_bDopplerTracking = m_astroWidget->m_bDopplerTracking;
@ -2136,11 +2123,14 @@ ApplyDoppler:
m_DopplerMethod0 = m_DopplerMethod;
}
if(m_auto and m_mode=="Echo") progressBar->setValue(int(100*m_s6/6.0));
if(nsec != m_sec0) { //Once per second
// qDebug() << "A" << nsec << m_pctx << m_rxavg << m_ntr << m_nrx;
int ipct=0;
if(m_monitoring or m_transmitting) ipct=int(100*m_nseq/txDuration);
progressBar->setValue(ipct);
if(m_mode!="Echo") {
int ipct=0;
if(m_monitoring or m_transmitting) ipct=int(100*m_nseq/txDuration);
progressBar->setValue(ipct);
}
QDateTime t = QDateTime::currentDateTimeUtc();
if(m_astroWidget) {
m_freqMoon=m_dialFreq + 1000*m_astroWidget->m_kHz + m_astroWidget->m_Hz;
@ -2192,7 +2182,11 @@ ApplyDoppler:
if(m_tune) {
tx_status_label->setText("Tx: TUNE");
} else {
tx_status_label->setText(s);
if(m_mode=="Echo") {
tx_status_label->setText("Tx: ECHO");
} else {
tx_status_label->setText(s);
}
}
} else if(m_monitoring) {
tx_status_label->setStyleSheet("QLabel{background-color: #00ff00}");
@ -2233,6 +2227,8 @@ void MainWindow::startTx2()
if(snr>0.0 or snr < -50.0) snr=99.0;
transmit (snr);
signalMeter->setValue(0);
if(m_mode=="Echo" and !m_tune) m_bTransmittedEcho=true;
if(m_mode.mid(0,4)=="WSPR" and !m_tune) {
if (m_config.TX_messages ()) {
t = " Transmitting " + m_mode + " ----------------------- " +
@ -2262,6 +2258,7 @@ void MainWindow::stopTx()
g_iptt=0;
tx_status_label->setStyleSheet("");
tx_status_label->setText("");
// qDebug() << "StopTx" << fmod(0.001*QDateTime::currentMSecsSinceEpoch(),6.0);
ptt0Timer->start(200); //Sequencer delay
monitor (true);
m_messageClient->status_update (m_dialFreq, m_mode, m_hisCall,
@ -2272,8 +2269,9 @@ void MainWindow::stopTx()
void MainWindow::stopTx2()
{
// qDebug() << "StopTx2" << fmod(0.001*QDateTime::currentMSecsSinceEpoch(),6.0);
Q_EMIT m_config.transceiver_ptt (false); //Lower PTT
if (m_mode.mid(0,4)!="WSPR" and m_config.watchdog() and
if (m_mode.mid(0,4)!="WSPR" and m_mode!="Echo" and m_config.watchdog() and
m_repeatMsg>=m_watchdogLimit-1) {
on_stopTxButton_clicked();
msgBox("Runaway Tx watchdog");
@ -2281,10 +2279,7 @@ void MainWindow::stopTx2()
}
if(m_mode.mid(0,4)=="WSPR" and m_ntr==-1 and !m_tuneup) {
m_wideGraph->setWSPRtransmitted();
// if(ui->band_hopping_group_box->isChecked ()) {
// qDebug () << "Call bandHopping after Tx" << m_tuneup;
bandHopping();
// }
bandHopping();
m_ntr=0;
}
}
@ -3182,6 +3177,13 @@ void MainWindow::on_actionWSPR_15_triggered()
void MainWindow::on_actionEcho_triggered()
{
m_mode="Echo";
ui->actionEcho->setChecked(true);
m_TRperiod=3;
m_modulator.setPeriod(m_TRperiod);
m_detector.setPeriod(m_TRperiod);
m_nsps=6912; //For symspec only
m_hsymStop=9;
m_toneSpacing=1.0;
switch_mode(Modes::Echo);
m_modeTx="Echo";
statusChanged();
@ -3732,6 +3734,12 @@ void MainWindow::transmit (double snr)
&m_soundOutput, m_config.audio_output_channel(),
true, snr);
}
if(m_mode=="Echo") {
// qDebug() << "Start Echo Tx" << fmod(0.001*QDateTime::currentMSecsSinceEpoch(),6.0);
// Q_EMIT tune(true);
Q_EMIT sendMessage (27, 1024.0, 1500.0, 0.0, &m_soundOutput,
m_config.audio_output_channel(),false, snr);
}
}
void MainWindow::on_outAttenuation_valueChanged (int a)
@ -4223,7 +4231,6 @@ void MainWindow::uploadResponse(QString response)
} else if (response == "Upload Failed") {
m_uploading=false;
}
// qDebug() << "uploadResponse" << response;
}
@ -4296,7 +4303,8 @@ void MainWindow::bandHopping()
<< "tune:" << hop_data.tune_required_
<< "tx:" << hop_data.tx_next_;
if (m_auto &&hop_data.tx_next_) {
// if (m_auto &&hop_data.tx_next_) {
if ( m_auto && next_tx_state(m_pctx) ) {
m_nrx = 0;
} else {
m_nrx = 1;
@ -4341,67 +4349,3 @@ void MainWindow::on_tabWidget_currentChanged (int new_value)
m_nonWSPRTab = new_value;
}
}
void MainWindow::echoUpdate()
{
// ### Some of this stuff is temporary ###
static double s6z=-99.0;
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
double tsec=0.001*ms;
// int nsec=tsec;
m_s6=fmod(tsec,6.0);
// When m_s6 has wrapped back to zero, start a new cycle.
if(m_auto and m_s6<s6z) {
QDateTime t = QDateTime::currentDateTimeUtc();
/*
if(m_fname=="") {
m_fname=m_saveDir + "/" + t.date().toString("yyMMdd") + "_" +
t.time().toString("hhmmss") + ".eco";
}
int nhr=t.time().hour();
int nmin=t.time().minute();
int nsec=t.time().second();
r4com_.nutc=10000*nhr+100*nmin+nsec;
*/
qDebug() << "Assert PTT";
Q_EMIT m_config.transceiver_ptt (true); //Assert the PTT
//Wait 0.2 s, then send a 2.304 s Tx pulse
// ptt1Timer->start(200); //Sequencer delay
tx_status_label->setStyleSheet("QLabel{background-color: #ff0000}");
tx_status_label->setText("Tx Echo");
signalMeter->setValue(0);
}
if(m_bTransmittedEcho and m_s6 > 5.4) {
m_bTransmittedEcho=false;
qDebug() << "Compute Echo Spectrum";
// dataSinkEcho();
}
/*
// float px=20.0*log10(datcom_.rms);
// signalMeter->setValue(px); // Update signalmeter
if(nsec != m_sec0) {
QDateTime t = QDateTime::currentDateTimeUtc();
QString utc = t.date().toString("yyyy MMM dd") + " \n " +
t.time().toString();
ui->labUTC->setText(utc);
if(m_astroWidget) {
m_freqMoon=m_dialFreq + 1000*m_astroWidget->m_kHz + m_astroWidget->m_Hz;
int ndop,ndop00;
m_astroWidget->astroUpdate(t, m_config.my_grid (),
m_hisGrid,m_freqMoon, &ndop, &ndop00, m_transmitting,
m_config.data_dir().absoluteFilePath("JPLEPH"));
}
m_sec0=nsec;
qDebug() << "A" << nsec << m_s6;
}
*/
s6z=m_s6;
} //End of echoUpdate()

View File

@ -511,7 +511,6 @@ private:
void enable_DXCC_entity (bool on);
void switch_mode (Mode);
void bandHopping();
void echoUpdate();
};
extern void getfile(QString fname, int ntrperiod);

View File

@ -99,6 +99,7 @@ void SoundInput::suspend ()
void SoundInput::resume ()
{
// qDebug() << "Resume" << fmod(0.001*QDateTime::currentMSecsSinceEpoch(),6.0);
if (m_sink)
{
m_sink->reset ();

View File

@ -4,6 +4,7 @@
#include <QObject>
#include <QString>
#include <QDateTime>
#include <QScopedPointer>
#include <QAudioInput>