Merged master 8748

This commit is contained in:
Jordan Sherer
2018-08-05 11:33:30 -04:00
parent 8f8772f1bd
commit 62899069bf
1222 changed files with 70382 additions and 406763 deletions
@@ -1,59 +0,0 @@
#ifndef DETECTOR_HPP__
#define DETECTOR_HPP__
#include "AudioDevice.hpp"
#include <QScopedArrayPointer>
//
// output device that distributes data in predefined chunks via a signal
//
// the underlying device for this abstraction is just the buffer that
// stores samples throughout a receiving period
//
class Detector : public AudioDevice
{
Q_OBJECT;
public:
//
// if the data buffer were not global storage and fixed size then we
// might want maximum size passed as constructor arguments
//
// we down sample by a factor of 4
//
// the samplesPerFFT argument is the number after down sampling
//
Detector (unsigned frameRate, unsigned periodLengthInSeconds, unsigned downSampleFactor = 4u, QObject * parent = 0);
void setPeriod(unsigned p) {m_period=p;}
bool reset () override;
Q_SIGNAL void framesWritten (qint64) const;
Q_SLOT void setBlockSize (unsigned);
protected:
qint64 readData (char * /* data */, qint64 /* maxSize */) override
{
return -1; // we don't produce data
}
qint64 writeData (char const * data, qint64 maxSize) override;
private:
void clear (); // discard buffer contents
unsigned secondInPeriod () const;
unsigned m_frameRate;
unsigned m_period;
unsigned m_downSampleFactor;
qint32 m_samplesPerFFT; // after any down sampling
qint32 m_ns;
static size_t const max_buffer_size {7 * 512};
QScopedArrayPointer<short> m_buffer; // de-interleaved sample buffer
// big enough for all the
// samples for one increment of
// data (a signals worth) at
// the input sample rate
unsigned m_bufferPos;
};
#endif
@@ -1,573 +0,0 @@
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include "BigGirth.h"
#include "Random.h"
using namespace std;
NodesInGraph::NodesInGraph(void) {
connectionParityBit=NULL;
connectionSymbolBit=NULL;
}
void NodesInGraph::setNumOfConnectionSymbolBit(int deg) {
if(deg<=0) {cout<<"Wrong NodesInGraph::setNumOfConnectionSymbolBit()"<<endl;exit(-1);}
numOfConnectionSymbolBit=deg;
connectionSymbolBit=new int[deg];
}
void NodesInGraph::initConnectionParityBit(void) {
maxDegParity=10000;
numOfConnectionParityBit=0;
connectionParityBit=new int[1];//dummy memory, actually not used
}
void NodesInGraph::initConnectionParityBit(int deg) {
maxDegParity=deg;
numOfConnectionParityBit=0;
connectionParityBit=new int[1];//dummy memory, actually not used
}
NodesInGraph::~NodesInGraph(void) {
delete [] connectionParityBit;
delete [] connectionSymbolBit;
}
BigGirth::BigGirth(void) : H(NULL), verbose(true) { }
BigGirth::BigGirth(int M, int N, int *symbolDegSequence, const char *filename, int sglConcent, int tgtGirth, bool verbose_) : H(NULL), verbose(verbose_) {
int i, j, k, m, index, localDepth=100;
int *mid;
EXPAND_DEPTH=(tgtGirth-4)/2;
if(EXPAND_DEPTH<0) EXPAND_DEPTH=0;
// corresponds to depth l in the PEG paper;
// the target girth = 2*EXPAND_DEPTH+4
// if set large, then GREEDY algorithm
myrandom=new Random(); //(12345678l, 987654321lu);
this->M=M;
this->N=N;
this->filename=filename;
mid=new int[M];
localGirth=new int[N];
nodesInGraph=new NodesInGraph [N];
for(i=0;i<N;i++)
nodesInGraph[i].setNumOfConnectionSymbolBit(symbolDegSequence[i]);
j=0;
for(k=0;k<N;k++) j+=symbolDegSequence[k];
k=j/M;
for(i=0;i<M;i++) mid[i]=k;
for(i=0;i<j-k*M;i++) mid[i]++;
k=0; for(i=0;i<M;i++) k+=mid[i];
if(k!=j) {cout<<"Wrong in computing maxDegParity!"<<endl;exit(-1);}
for(i=0;i<M;i++) {
if(sglConcent==0) nodesInGraph[i].initConnectionParityBit(mid[i]);
else nodesInGraph[i].initConnectionParityBit();
}
for(k=0;k<N;k++){
m=1000000;index=-1;
for(i=0;i<M;i++){
if(nodesInGraph[i].numOfConnectionParityBit<m && nodesInGraph[i].numOfConnectionParityBit<nodesInGraph[i].maxDegParity) {
m=nodesInGraph[i].numOfConnectionParityBit;
index=i;
}
}
nodesInGraph[k].connectionSymbolBit[0]=index;//least connections of parity bit
int iter=0;
ITER:
localGirth[k]=100;
for(m=1;m<nodesInGraph[k].numOfConnectionSymbolBit;m++){
nodesInGraph[k].connectionSymbolBit[m]=selectParityConnect(k, m, localDepth);
localGirth[k]=(localGirth[k]>localDepth)?localDepth:localGirth[k];
if(k>0 && localGirth[k]<localGirth[k-1] && iter<20) {iter++; goto ITER;}
if(localGirth[k]==0 && iter<30) {iter++; goto ITER;}
}
//if((k+1)%100==0) {
if(verbose) {
cout<<"k="<<k<<" ";
for(m=0;m<nodesInGraph[k].numOfConnectionSymbolBit;m++)
cout<<nodesInGraph[k].connectionSymbolBit[m]<<" ";
cout<<"LocalGirth="<<2*localGirth[k]+4;
cout<<endl;
}
updateConnection(k);
}
if(verbose) {
cout<<"Showing the row weight distribution..."<<endl;
for(i=0;i<M;i++)
cout<<nodesInGraph[i].numOfConnectionParityBit<<" ";
cout<<endl;
}
delete [] mid;
ofstream cycleFile;
cycleFile.open("leftHandGirth.log", ios::out);
localDepth=100;
for(k=0;k<N;k++) {
if(localGirth[k]<localDepth) localDepth=localGirth[k];
if(localDepth==100) cycleFile<<"inf ";
else cycleFile<<2*localDepth+4<<" ";
}
cycleFile<<endl;
cycleFile.close();
if(verbose) {
cout<<"*************************************************************"<<endl;
cout<<" The global girth of the PEG Tanner graph :="<< 2*localDepth+4<<endl;
cout<<"*************************************************************"<<endl;
}
loadH();
}
BigGirth::~BigGirth(void) {
if(H!=NULL) {
for(int i=0;i<M;i++)
delete [] H[i];
delete [] H;
H=NULL;
}
delete [] localGirth;
delete [] nodesInGraph;
nodesInGraph=NULL;
delete myrandom;
}
int BigGirth::selectParityConnect(int kthSymbol, int mthConnection, int & cycle) {
int i, j, k, index, mincycles, numCur, cpNumCur;
int *tmp, *med;
int *current;//take note of the covering parity bits
mincycles=0;
tmp=new int[M]; med=new int[M];
numCur=mthConnection;
current=new int[mthConnection];
for(i=0;i<mthConnection;i++) current[i]=nodesInGraph[kthSymbol].connectionSymbolBit[i];
LOOP:
mincycles++;
for(i=0;i<M;i++) tmp[i]=0;
//maintain
for(i=0;i<mthConnection;i++) tmp[nodesInGraph[kthSymbol].connectionSymbolBit[i]]=1;
for(i=0;i<numCur;i++){
for(j=0;j<nodesInGraph[current[i]].numOfConnectionParityBit;j++){
for(k=0;k<nodesInGraph[nodesInGraph[current[i]].connectionParityBit[j]].numOfConnectionSymbolBit;k++){
tmp[nodesInGraph[nodesInGraph[current[i]].connectionParityBit[j]].connectionSymbolBit[k]]=1;
}
}
}
index=0; cpNumCur=0;
for(i=0;i<M;i++) {
if(tmp[i]==1) cpNumCur++;
if(tmp[i]==1 || nodesInGraph[i].numOfConnectionParityBit>=nodesInGraph[i].maxDegParity)
index++;
}
if(cpNumCur==numCur) {//can not expand any more
//additional handlement to select one having least connections
j=10000000; //dummy number
for(i=0;i<M;i++){
if(tmp[i]==0 && nodesInGraph[i].numOfConnectionParityBit<j && nodesInGraph[i].numOfConnectionParityBit<nodesInGraph[i].maxDegParity)
j=nodesInGraph[i].numOfConnectionParityBit;
}
for(i=0;i<M;i++){
if(tmp[i]==0){
if(nodesInGraph[i].numOfConnectionParityBit!=j || nodesInGraph[i].numOfConnectionParityBit>=nodesInGraph[i].maxDegParity){
tmp[i]=1;
}
}
}
index=0;
for(i=0;i<M;i++) if(tmp[i]==1) index++;
//----------------------------------------------------------------
j=(*myrandom).uniform(0, M-index)+1; //randomly selected
index=0;
for(i=0;i<M;i++){
if(tmp[i]==0) index++;
if(index==j) break;
}
delete [] tmp; tmp=NULL;
delete [] current; current=NULL;
return(i);
}
else if(index==M || mincycles>EXPAND_DEPTH){//covering all parity nodes or meet the upper bound on cycles
cycle=mincycles-1;
for(i=0;i<M;i++) tmp[i]=0;
for(i=0;i<numCur;i++) tmp[current[i]]=1;
index=0;
for(i=0;i<M;i++) if(tmp[i]==1) index++;
if(index!=numCur) {cout<<"Error in the case of (index==M)"<<endl;exit(-1);}
//additional handlement to select one having least connections
j=10000000;
for(i=0;i<M;i++){
if(tmp[i]==0 && nodesInGraph[i].numOfConnectionParityBit<j && nodesInGraph[i].numOfConnectionParityBit<nodesInGraph[i].maxDegParity)
j=nodesInGraph[i].numOfConnectionParityBit;
}
for(i=0;i<M;i++){
if(tmp[i]==0){
if(nodesInGraph[i].numOfConnectionParityBit!=j || nodesInGraph[i].numOfConnectionParityBit>=nodesInGraph[i].maxDegParity){
tmp[i]=1;
}
}
}
index=0;
for(i=0;i<M;i++) if(tmp[i]==1) index++;
j=(*myrandom).uniform(0, M-index)+1;
index=0;
for(i=0;i<M;i++){
if(tmp[i]==0) index++;
if(index==j) break;
}
delete [] tmp; tmp=NULL;
delete [] current; current=NULL;
return(i);
}
else if(cpNumCur>numCur && index!=M){
delete [] current;
current=NULL;
numCur=cpNumCur;
current=new int[numCur];
index=0;
for(i=0;i<M;i++) {
if(tmp[i]==1) {current[index]=i; index++;}
}
goto LOOP;
}
else {
cout<<"Should not come to this point..."<<endl;
cout<<"Error in BigGirth::selectParityConnect()"<<endl;
return(-1);
}
}
void BigGirth::updateConnection(int kthSymbol){
int i, j, m;
int *tmp;
for(i=0;i<nodesInGraph[kthSymbol].numOfConnectionSymbolBit;i++){
m=nodesInGraph[kthSymbol].connectionSymbolBit[i];//m [0, M) parity node
tmp=new int[nodesInGraph[m].numOfConnectionParityBit+1];
for(j=0;j<nodesInGraph[m].numOfConnectionParityBit;j++)
tmp[j]=nodesInGraph[m].connectionParityBit[j];
tmp[nodesInGraph[m].numOfConnectionParityBit]=kthSymbol;
delete [] nodesInGraph[m].connectionParityBit;
nodesInGraph[m].connectionParityBit=NULL;
nodesInGraph[m].numOfConnectionParityBit++; //increase by 1
nodesInGraph[m].connectionParityBit=new int[nodesInGraph[m].numOfConnectionParityBit];
for(j=0;j<nodesInGraph[m].numOfConnectionParityBit;j++)
nodesInGraph[m].connectionParityBit[j]=tmp[j];
delete [] tmp;
tmp=NULL;
}
}
void BigGirth::loadH(void){
int i, j;
if(H==NULL) {
H=new int*[M];
for(i=0;i<M;i++) H[i]=new int[N];
}
for(i=0;i<M;i++){
for(j=0;j<N;j++){
H[i][j]=0;
}
}
for(i=0;i<M;i++){
for(j=0;j<nodesInGraph[i].numOfConnectionParityBit;j++){
H[i][nodesInGraph[i].connectionParityBit[j]]=1;
}
}
}
void BigGirth::writeToFile_Hmatrix(void){
int i, j;
loadH();
//cout<<"---------------code format--------------------------"<<endl;
//cout<<"- Block length N -"<<endl;
//cout<<"- Num of Check Nodex M -"<<endl;
//cout<<"- H matrix -"<<endl;
//cout<<"----------------------------------------------------"<<endl;
ofstream codefile;
codefile.open(filename,ios::out);
codefile<<N<<" "<<M<<endl;
for(i=0;i<M;i++){
for(j=0;j<N;j++){
codefile<<H[i][j]<<" ";
}
codefile<<endl;
}
codefile.close();
}
void BigGirth::writeToFile_Hcompressed(void){
int i, j, max_col;
int *(*parityCheck_compressed);
//cout<<"---------------code format--------------------------"<<endl;
//cout<<"- Block length N -"<<endl;
//cout<<"- Num of Check Nodex M -"<<endl;
//cout<<"- Num of column in the compressed H -"<<endl;
//cout<<"- H matrix (compressed) -"<<endl;
//cout<<"----------------------------------------------------"<<endl;
//finding the num of columns, l, of the compressed parity-check matrix
max_col=0;
for(i=0;i<M;i++)
if(nodesInGraph[i].numOfConnectionParityBit>max_col)
max_col=nodesInGraph[i].numOfConnectionParityBit;
parityCheck_compressed=new int * [M];
for(i=0;i<M;i++)
parityCheck_compressed[i]=new int[max_col];
for(i=0;i<M;i++){
for(j=0;j<max_col;j++) parityCheck_compressed[i][j]=0;
for(j=0;j<nodesInGraph[i].numOfConnectionParityBit;j++){
parityCheck_compressed[i][j]=nodesInGraph[i].connectionParityBit[j]+1;
}
}
ofstream codefile;
codefile.open(filename,ios::out);
codefile<<N<<endl;
codefile<<M<<endl;
codefile<<max_col<<endl;
for(i=0;i<M;i++){
for(j=0;j<max_col;j++)
codefile<<parityCheck_compressed[i][j]<<" ";
codefile<<endl;
}
codefile.close();
for(i=0;i<M;i++){
delete [] parityCheck_compressed[i];
parityCheck_compressed[i]=NULL;
}
delete [] parityCheck_compressed;
parityCheck_compressed=NULL;
}
void BigGirth::writeToFile(void){
int i, j, k, d, redun;
int imed, max_row, index, max_col;
int *Index, *J, *itmp, *(*generator), *(*generator_compressed), *(*parityCheck_compressed);
//Gaussian Ellimination
Index=new int[M];
J=new int[N];
itmp=new int[N];
for(i=0;i<M;i++) Index[i]=0; //indicator of redudant rows
for(j=0;j<N;j++) J[j]=j; //column permutation
redun=0;//the number of redundant rows
loadH();
for(k=0;k<M;k++){
if(H[k][J[k-redun]]==0) {
d=k;
for(i=k+1-redun;i<N;i++)
if(H[k][J[i]]!=0) {d=i;break;}
if(d==k) {//full-zero row:delete this row
redun++;
Index[k]=1;
continue;
}
else {//SWAP d column and k column in H matrix
imed=J[k-redun];
J[k-redun]=J[d];
J[d]=imed;
}
}
if(H[k][J[k-redun]]==0) {
cout<<"ERROR: should not come to this point"<<endl;
exit(-1);
}
else {
for(i=k+1;i<M;i++){
if(H[i][J[k-redun]]!=0){
for(j=k-redun;j<N;j++)
H[i][J[j]]=(H[i][J[j]]+H[k][J[j]])%2;
}
}
}
}
if(verbose)
cout<<"Row rank of parity check matrix="<<M-redun<<endl;
K=N-M+redun;//num of the information bits
index=0;
for(i=0;i<M;i++){
if(Index[i]==0){ // all-zero row
for(j=0;j<N;j++)
itmp[j]=H[i][J[j]];
for(j=0;j<N;j++)
H[index][j]=itmp[j]; //Note: itmp can not be omitted here!!!
index++;
}
}
if(index!=M-redun) {cout<<"ERROR...if(index!=M-redun)"<<endl;exit(-1);}
for(k=index-1;k>0;k--){
for(i=k-1;i>=0;i--){
if(H[i][k]==1)
for(j=k;j<N;j++)
H[i][j]=(H[i][j]+H[k][j])%2;
}
}
if(verbose) {
cout<<"****************************************************"<<endl;
cout<<" Computing the compressed generator"<<endl;
cout<<"****************************************************"<<endl;
}
generator=new int * [K];
for(i=0;i<K;i++)
generator[i]=new int[N-K];
for(i=0;i<K;i++){
for(j=0;j<N-K;j++)
generator[i][j]=H[j][i+N-K];
//for(j=N-K;j<N;j++)
//generator[i][j]=0;
//generator[i][i+N-K]=1;
}
max_row=0;
for(j=0;j<N-K;j++){
imed=0;
for(i=0;i<K;i++)
imed+=generator[i][j];
if(imed>max_row) max_row=imed;
}
generator_compressed=new int * [max_row];
for(i=0;i<max_row;i++)
generator_compressed[i]=new int[N];
for(j=0;j<N-K;j++){
index=0;
for(i=0;i<max_row;i++) generator_compressed[i][j]=0;
for(i=0;i<K;i++){
if(generator[i][j]==1) {
generator_compressed[index][j]=i+1;
if(index>=max_row-1) break;
index++;
}
}
}
for(j=0;j<K;j++){
for(i=0;i<max_row;i++) generator_compressed[i][j+N-K]=0;
generator_compressed[0][j+N-K]=j+1;
}
if(verbose) {
cout<<"*****************************************************"<<endl;
cout<<" Computing the compressed parity-check matrix"<<endl;
cout<<"*****************************************************"<<endl;
}
//finding the num of columns, l, of the compressed parity-check matrix
loadH(); //loading parity check matrix again
max_col=0;
for(i=0;i<M;i++){
imed=0;
for(j=0;j<N;j++)
imed+=H[i][j];
if(imed>max_col) max_col=imed;
}
parityCheck_compressed=new int * [M];
for(i=0;i<M;i++)
parityCheck_compressed[i]=new int[max_col];
for(i=0;i<M;i++){
for(j=0;j<max_col;j++) parityCheck_compressed[i][j]=0;
index=0;
for(j=0;j<N;j++){
if(H[i][J[j]]==1) {
parityCheck_compressed[i][index]=j+1;
if(index>=max_col-1) break;
index++;
}
}
}
if(verbose) {
cout<<"****************************************************"<<endl;
cout<<" Write to file (TEXT!) "<<endl;
cout<<"****************************************************"<<endl;
}
ofstream codefile;
codefile.open(filename,ios::out);
codefile<<N<<endl;
codefile<<K<<endl;
codefile<<M<<endl;
codefile<<max_row<<endl;
codefile<<max_col<<endl;
for(i=0;i<max_row;i++){
for(j=0;j<N;j++)
codefile<<generator_compressed[i][j]<<" ";
codefile<<endl;
}
for(i=0;i<M;i++){
for(j=0;j<max_col;j++)
codefile<<parityCheck_compressed[i][j]<<" ";
codefile<<endl;
}
for(i=N-K;i<N;i++)
codefile<<i+1<<" ";
codefile<<endl;
codefile.close();
if(verbose) {
cout<<"****************************************************"<<endl;
cout<<" Free memory"<<endl;
cout<<"****************************************************"<<endl;
}
delete [] Index;
Index=NULL;
delete [] J;
J=NULL;
delete [] itmp;
itmp=NULL;
for(i=0;i<M;i++){
delete [] parityCheck_compressed[i];
parityCheck_compressed[i]=NULL;
}
delete [] parityCheck_compressed;
parityCheck_compressed=NULL;
for(i=0;i<max_row;i++){
delete [] generator_compressed[i];
generator_compressed[i]=NULL;
}
delete [] generator_compressed;
generator_compressed=NULL;
for(i=0;i<K;i++){
delete [] generator[i];
generator[i]=NULL;
}
delete [] generator;
generator=NULL;
if(verbose) {
cout<<"****************************************************"<<endl;
cout<<" OK!"<<endl;
cout<<"****************************************************"<<endl;
}
}
File diff suppressed because it is too large Load Diff
@@ -33,7 +33,6 @@
#include "DisplayManual.hpp"
#include "psk_reporter.h"
#include "logbook/logbook.h"
#include "decodedtext.h"
#include "commons.h"
#include "astro.h"
#include "MessageBox.hpp"
@@ -50,7 +49,7 @@
#define NUM_FT8_SYMBOLS 79
#define NUM_CW_SYMBOLS 250
#define TX_SAMPLE_RATE 48000
#define N_WIDGETS 24
#define N_WIDGETS 33
extern int volatile itone[NUM_ISCAT_SYMBOLS]; //Audio tones for all Tx symbols
extern int volatile icw[NUM_CW_SYMBOLS]; //Dits for CW ID
@@ -82,6 +81,7 @@ class Detector;
class SampleDownloader;
class MultiSettings;
class EqualizationToolsDialog;
class DecodedText;
class MainWindow : public QMainWindow
{
@@ -107,8 +107,9 @@ public slots:
void diskDat();
void freezeDecode(int n);
void guiUpdate();
void doubleClickOnCall(bool shift, bool ctrl);
void doubleClickOnCall2(bool shift, bool ctrl);
void doubleClickOnCall (Qt::KeyboardModifiers);
void doubleClickOnCall2(Qt::KeyboardModifiers);
void doubleClickOnFoxQueue(Qt::KeyboardModifiers);
void readFromStdout();
void p1ReadFromStdout();
void setXIT(int n, Frequency base = 0u);
@@ -123,6 +124,7 @@ protected:
bool eventFilter(QObject *, QEvent *) override;
private slots:
void initialize_fonts ();
void on_tx1_editingFinished();
void on_tx2_editingFinished();
void on_tx3_editingFinished();
@@ -136,6 +138,7 @@ private slots:
void on_stopTxButton_clicked();
void on_stopButton_clicked();
void on_actionRelease_Notes_triggered ();
void on_actionFT8_DXpedition_Mode_User_Guide_triggered();
void on_actionOnline_User_Guide_triggered();
void on_actionLocal_User_Guide_triggered();
void on_actionWide_Waterfall_triggered();
@@ -148,10 +151,14 @@ private slots:
void on_actionSave_all_triggered();
void on_actionKeyboard_shortcuts_triggered();
void on_actionSpecial_mouse_commands_triggered();
void on_actionSolve_FreqCal_triggered();
void on_actionCopyright_Notice_triggered();
void on_DecodeButton_clicked (bool);
void decode();
void decodeBusy(bool b);
void on_EraseButton_clicked();
void band_activity_cleared ();
void rx_frequency_activity_cleared ();
void on_txFirstCheckBox_stateChanged(int arg1);
void set_dateTimeQSO(int m_ntx);
void set_ntx(int n);
@@ -192,6 +199,7 @@ private slots:
void on_actionDeepestDecode_toggled (bool);
void bumpFqso(int n);
void on_actionErase_ALL_TXT_triggered();
void on_actionErase_FoxQSO_txt_triggered();
void on_actionErase_wsjtx_log_adi_triggered();
void startTx2();
void startP1();
@@ -211,17 +219,17 @@ private slots:
void on_tuneButton_clicked (bool);
void on_pbR2T_clicked();
void on_pbT2R_clicked();
void acceptQSO2(QDateTime const&, QString const& call, QString const& grid
void acceptQSO (QDateTime const&, QString const& call, QString const& grid
, Frequency dial_freq, QString const& mode
, QString const& rpt_sent, QString const& rpt_received
, QString const& tx_power, QString const& comments
, QString const& name, QDateTime const&);
, QString const& name, QDateTime const& QSO_date_on, QString const& operator_call
, QString const& my_call, QString const& my_grid, QByteArray const& ADIF);
void on_bandComboBox_currentIndexChanged (int index);
void on_bandComboBox_activated (int index);
void on_readFreq_clicked();
void on_pbTxMode_clicked();
void on_RxFreqSpinBox_valueChanged(int n);
void on_cbTxLock_clicked(bool checked);
void on_outAttenuation_valueChanged (int);
void rigOpen ();
void handle_transceiver_update (Transceiver::TransceiverState const&);
@@ -234,6 +242,7 @@ private slots:
void stopTuneATU();
void auto_tx_mode(bool);
void on_actionMessage_averaging_triggered();
void on_actionFox_Log_triggered();
void on_actionInclude_averaging_toggled (bool);
void on_actionInclude_correlation_toggled (bool);
void on_actionEnable_AP_DXcall_toggled (bool);
@@ -243,8 +252,8 @@ private slots:
void on_cbSWL_toggled(bool b);
void on_cbTx6_toggled(bool b);
void on_cbMenus_toggled(bool b);
void on_cbCQonly_toggled(bool b);
void on_cbFirst_toggled(bool b);
void on_cbWeak_toggled(bool b);
void on_cbAutoSeq_toggled(bool b);
void networkError (QString const&);
void on_ClrAvgButton_clicked();
@@ -277,6 +286,13 @@ private slots:
void on_actionQRA64_triggered();
void on_actionFreqCal_triggered();
void splash_done ();
void on_measure_check_box_stateChanged (int);
void on_sbNlist_valueChanged(int n);
void on_sbNslots_valueChanged(int n);
void on_sbMax_dB_valueChanged(int n);
void on_pbFoxReset_clicked();
void on_comboBoxHoundSort_activated (int index);
void not_GA_warning_message ();
private:
Q_SIGNAL void initializeAudioOutputStream (QAudioDeviceInfo,
@@ -305,8 +321,9 @@ private:
private:
void astroUpdate ();
void writeAllTxt(QString message);
void auto_sequence (QString const& message, unsigned tolerance);
void auto_sequence (DecodedText const& message, unsigned start_tolerance, unsigned stop_tolerance);
void hideMenus(bool b);
void foxTest();
NetworkAccessManager m_network_manager;
bool m_valid;
@@ -352,6 +369,9 @@ private:
qint64 m_msErase;
qint64 m_secBandChanged;
qint64 m_freqMoon;
qint64 m_msec0;
qint64 m_fullFoxCallTime;
Frequency m_freqNominal;
Frequency m_freqTxNominal;
Astro::Correction m_astroCorrection;
@@ -397,10 +417,29 @@ private:
qint32 m_k0;
qint32 m_kdone;
qint32 m_nPick;
FrequencyList::const_iterator m_frequency_list_fcal_iter;
FrequencyList_v2::const_iterator m_frequency_list_fcal_iter;
qint32 m_nTx73;
qint32 m_UTCdisk;
qint32 m_wait;
qint32 m_i3bit;
qint32 m_isort;
qint32 m_max_dB;
qint32 m_nDXped=0;
qint32 m_nSortedHounds=0;
qint32 m_nHoundsCalling=0;
qint32 m_Nlist=12;
qint32 m_Nslots=5;
qint32 m_nFoxMsgTimes[5]={0,0,0,0,0};
qint32 m_tAutoOn;
// qint32 m_maxQSOs;
qint32 m_tFoxTx=0;
qint32 m_tFoxTx0=0;
qint32 m_maxStrikes=3; //Max # of repeats: 3 strikes and you're out
qint32 m_maxFoxWait=3; //Max wait time for expected Hound replies
qint32 m_foxCQtime=10; //CQs at least every 5 minutes
qint32 m_tFoxTxSinceCQ=999; //Fox Tx cycles since most recent CQ
qint32 m_nFoxFreq; //Audio freq at which Hound received a call from Fox
qint32 m_nSentFoxRrpt=0; //Serial number for next R+rpt Hound will send to Fox
bool m_btxok; //True if OK to transmit
bool m_diskData;
@@ -425,7 +464,6 @@ private:
QString m_currentMessage;
int m_lastMessageType;
QString m_lastMessageSent;
bool m_lockTxFreq;
bool m_bShMsgs;
bool m_bSWL;
bool m_uploadSpots;
@@ -454,6 +492,10 @@ private:
bool m_bDoubleClicked;
bool m_bCallingCQ;
bool m_bAutoReply;
bool m_bCheckedContest;
bool m_bWarnedSplit=false;
bool m_bWarnedHound=false;
enum
{
CALLING,
@@ -533,15 +575,39 @@ private:
QString m_msgSent0;
QString m_fileToSave;
QString m_calls;
QString m_CQtype;
QString m_opCall;
QString m_houndCallers; //Sorted list of Hound callers
QString m_fm0;
QString m_fm1;
QSet<QString> m_pfx;
QSet<QString> m_sfx;
struct FoxQSO //Everything we need to know about QSOs in progress (or recently logged).
{
QString grid; //Hound's declared locator
QString sent; //Report sent to Hound
QString rcvd; //Report received from Hound
qint32 ncall; //Number of times report sent to Hound
qint32 nRR73; //Number of times RR73 sent to Hound
qint32 tFoxRrpt; //m_tFoxTx (Fox Tx cycle counter) when R+rpt was received from Hound
qint32 tFoxTxRR73; //m_tFoxTx when RR73 was sent to Hound
};
QMap<QString,FoxQSO> m_foxQSO; //Key = HoundCall, value = parameters for QSO in progress
QMap<QString,QString> m_loggedByFox; //Key = HoundCall, value = logged band
QQueue<QString> m_houndQueue; //Selected Hounds available for starting a QSO
QQueue<QString> m_foxQSOinProgress; //QSOs in progress: Fox has sent a report
QQueue<qint64> m_foxRateQueue;
QDateTime m_dateTimeQSOOn;
QDateTime m_dateTimeLastTX;
QSharedMemory *mem_jt9;
LogBook m_logBook;
DecodedText m_QSOText;
QString m_QSOText;
unsigned m_msAudioOutputBuffered;
unsigned m_framesAudioInputBuffered;
unsigned m_downSampleFactor;
@@ -556,6 +622,7 @@ private:
bool m_block_pwr_tooltip;
bool m_PwrBandSetOK;
bool m_bVHFwarned;
bool m_bDisplayedOnce;
Frequency m_lastMonitoredFrequency;
double m_toneSpacing;
int m_firstDecode;
@@ -571,6 +638,7 @@ private:
//---------------------------------------------------- private functions
void readSettings();
void set_application_font (QFont const&);
void setDecodedTextFont (QFont const&);
void writeSettings();
void createStatusBar();
@@ -578,8 +646,7 @@ private:
void genStdMsgs(QString rpt, bool unconditional = false);
void genCQMsg();
void clearDX ();
void lookup (bool extend_grid = false); // extend_grid will fetch a
// 6-digit grid if available
void lookup();
void ba2msg(QByteArray ba, char* message);
void msgtype(QString t, QLineEdit* tx);
void stub();
@@ -589,11 +656,12 @@ private:
void transmit (double snr = 99.);
void rigFailure (QString const& reason);
void pskSetLocal ();
void pskPost(DecodedText decodedtext);
void pskPost(DecodedText const& decodedtext);
void displayDialFrequency ();
void transmitDisplay (bool);
void processMessage(QString const& messages, qint32 position, bool ctrl = false, bool alt = false);
void replyToCQ (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode, QString const& message_text);
void processMessage(DecodedText const&, Qt::KeyboardModifiers = 0);
void replyToCQ (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode, QString const& message_text, bool low_confidence, quint8 modifiers);
void locationChange(QString const& location);
void replayDecodes ();
void postDecode (bool is_new, QString const& message);
void postWSPRDecode (bool is_new, QStringList message_parts);
@@ -616,6 +684,9 @@ private:
, Frequency frequency
, QString const& his_call
, QString const& his_grid) const;
void hound_reply ();
QString sortHoundCalls(QString t, int isort, int max_dB);
void rm_tb4(QString houndCall);
void read_wav_file (QString const& fname);
void decodeDone ();
void subProcessFailed (QProcess *, int exit_code, QProcess::ExitStatus);
@@ -627,12 +698,18 @@ private:
void remove_child_from_event_filter (QObject *);
void setup_status_bar (bool vhf);
void tx_watchdog (bool triggered);
int nWidgets(QString t);
void displayWidgets(int n);
qint64 nWidgets(QString t);
void displayWidgets(qint64 n);
void vhfWarning();
QChar current_submode () const; // returns QChar {0} if sub mode is
// not appropriate
void write_transmit_entry (QString const& file_name);
void selectHound(QString t);
void houndCallers();
void foxRxSequencer(QString msg, QString houndCall, QString rptRcvd);
void foxTxSequencer();
void foxGenWaveform(int i,QString fm);
void writeFoxQSO(QString msg);
};
extern int killbyname(const char* progName);