SVN r8748
This commit is contained in:
Binary file not shown.
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,721 @@
|
||||
// -*- Mode: C++ -*-
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
#ifdef QT5
|
||||
#include <QtWidgets>
|
||||
#else
|
||||
#include <QtGui>
|
||||
#endif
|
||||
#include <QThread>
|
||||
#include <QTimer>
|
||||
#include <QDateTime>
|
||||
#include <QList>
|
||||
#include <QAudioDeviceInfo>
|
||||
#include <QScopedPointer>
|
||||
#include <QDir>
|
||||
#include <QProgressDialog>
|
||||
#include <QAbstractSocket>
|
||||
#include <QHostAddress>
|
||||
#include <QPointer>
|
||||
#include <QSet>
|
||||
#include <QVector>
|
||||
#include <QFuture>
|
||||
#include <QFutureWatcher>
|
||||
|
||||
#include "AudioDevice.hpp"
|
||||
#include "commons.h"
|
||||
#include "Radio.hpp"
|
||||
#include "Modes.hpp"
|
||||
#include "FrequencyList.hpp"
|
||||
#include "Configuration.hpp"
|
||||
#include "WSPRBandHopping.hpp"
|
||||
#include "Transceiver.hpp"
|
||||
#include "DisplayManual.hpp"
|
||||
#include "psk_reporter.h"
|
||||
#include "logbook/logbook.h"
|
||||
#include "commons.h"
|
||||
#include "astro.h"
|
||||
#include "MessageBox.hpp"
|
||||
#include "NetworkAccessManager.hpp"
|
||||
|
||||
#define NUM_JT4_SYMBOLS 206 //(72+31)*2, embedded sync
|
||||
#define NUM_JT65_SYMBOLS 126 //63 data + 63 sync
|
||||
#define NUM_JT9_SYMBOLS 85 //69 data + 16 sync
|
||||
#define NUM_WSPR_SYMBOLS 162 //(50+31)*2, embedded sync
|
||||
#define NUM_WSPR_LF_SYMBOLS 412 //300 data + 109 sync + 3 ramp
|
||||
#define NUM_ISCAT_SYMBOLS 1291 //30*11025/256
|
||||
#define NUM_MSK144_SYMBOLS 144 //s8 + d48 + s8 + d80
|
||||
#define NUM_QRA64_SYMBOLS 84 //63 data + 21 sync
|
||||
#define NUM_FT8_SYMBOLS 79
|
||||
#define NUM_CW_SYMBOLS 250
|
||||
#define TX_SAMPLE_RATE 48000
|
||||
#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
|
||||
|
||||
//--------------------------------------------------------------- MainWindow
|
||||
namespace Ui {
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
class QSettings;
|
||||
class QLineEdit;
|
||||
class QFont;
|
||||
class QHostInfo;
|
||||
class EchoGraph;
|
||||
class FastGraph;
|
||||
class WideGraph;
|
||||
class LogQSO;
|
||||
class Transceiver;
|
||||
class MessageAveraging;
|
||||
class MessageClient;
|
||||
class QTime;
|
||||
class WSPRBandHopping;
|
||||
class HelpTextWindow;
|
||||
class WSPRNet;
|
||||
class SoundOutput;
|
||||
class Modulator;
|
||||
class SoundInput;
|
||||
class Detector;
|
||||
class SampleDownloader;
|
||||
class MultiSettings;
|
||||
class EqualizationToolsDialog;
|
||||
class DecodedText;
|
||||
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT;
|
||||
|
||||
public:
|
||||
using Frequency = Radio::Frequency;
|
||||
using FrequencyDelta = Radio::FrequencyDelta;
|
||||
using Mode = Modes::Mode;
|
||||
|
||||
explicit MainWindow(QDir const& temp_directory, bool multiple, MultiSettings *,
|
||||
QSharedMemory *shdmem, unsigned downSampleFactor,
|
||||
QSplashScreen *,
|
||||
QWidget *parent = nullptr);
|
||||
~MainWindow();
|
||||
|
||||
public slots:
|
||||
void showSoundInError(const QString& errorMsg);
|
||||
void showSoundOutError(const QString& errorMsg);
|
||||
void showStatusMessage(const QString& statusMsg);
|
||||
void dataSink(qint64 frames);
|
||||
void fastSink(qint64 frames);
|
||||
void diskDat();
|
||||
void freezeDecode(int n);
|
||||
void guiUpdate();
|
||||
void doubleClickOnCall (Qt::KeyboardModifiers);
|
||||
void doubleClickOnCall2(Qt::KeyboardModifiers);
|
||||
void doubleClickOnFoxQueue(Qt::KeyboardModifiers);
|
||||
void readFromStdout();
|
||||
void p1ReadFromStdout();
|
||||
void setXIT(int n, Frequency base = 0u);
|
||||
void setFreq4(int rxFreq, int txFreq);
|
||||
void msgAvgDecode2();
|
||||
void fastPick(int x0, int x1, int y);
|
||||
|
||||
protected:
|
||||
void keyPressEvent (QKeyEvent *) override;
|
||||
void closeEvent(QCloseEvent *) override;
|
||||
void childEvent(QChildEvent *) override;
|
||||
bool eventFilter(QObject *, QEvent *) override;
|
||||
|
||||
private slots:
|
||||
void initialize_fonts ();
|
||||
void on_tx1_editingFinished();
|
||||
void on_tx2_editingFinished();
|
||||
void on_tx3_editingFinished();
|
||||
void on_tx4_editingFinished();
|
||||
void on_tx5_currentTextChanged (QString const&);
|
||||
void on_tx6_editingFinished();
|
||||
void on_actionSettings_triggered();
|
||||
void on_monitorButton_clicked (bool);
|
||||
void on_actionAbout_triggered();
|
||||
void on_autoButton_clicked (bool);
|
||||
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();
|
||||
void on_actionOpen_triggered();
|
||||
void on_actionOpen_next_in_directory_triggered();
|
||||
void on_actionDecode_remaining_files_in_directory_triggered();
|
||||
void on_actionDelete_all_wav_files_in_SaveDir_triggered();
|
||||
void on_actionOpen_log_directory_triggered ();
|
||||
void on_actionNone_triggered();
|
||||
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);
|
||||
void on_txrb1_toggled(bool status);
|
||||
void on_txrb1_doubleClicked ();
|
||||
void on_txrb2_toggled(bool status);
|
||||
void on_txrb3_toggled(bool status);
|
||||
void on_txrb4_toggled(bool status);
|
||||
void on_txrb4_doubleClicked ();
|
||||
void on_txrb5_toggled(bool status);
|
||||
void on_txrb5_doubleClicked ();
|
||||
void on_txrb6_toggled(bool status);
|
||||
void on_txb1_clicked();
|
||||
void on_txb1_doubleClicked ();
|
||||
void on_txb2_clicked();
|
||||
void on_txb3_clicked();
|
||||
void on_txb4_clicked();
|
||||
void on_txb4_doubleClicked ();
|
||||
void on_txb5_clicked();
|
||||
void on_txb5_doubleClicked ();
|
||||
void on_txb6_clicked();
|
||||
void on_lookupButton_clicked();
|
||||
void on_addButton_clicked();
|
||||
void on_dxCallEntry_textChanged (QString const&);
|
||||
void on_dxGridEntry_textChanged (QString const&);
|
||||
void on_dxCallEntry_returnPressed ();
|
||||
void on_genStdMsgsPushButton_clicked();
|
||||
void on_logQSOButton_clicked();
|
||||
void on_actionJT9_triggered();
|
||||
void on_actionJT65_triggered();
|
||||
void on_actionJT9_JT65_triggered();
|
||||
void on_actionJT4_triggered();
|
||||
void on_actionFT8_triggered();
|
||||
void on_TxFreqSpinBox_valueChanged(int arg1);
|
||||
void on_actionSave_decoded_triggered();
|
||||
void on_actionQuickDecode_toggled (bool);
|
||||
void on_actionMediumDecode_toggled (bool);
|
||||
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();
|
||||
void stopTx();
|
||||
void stopTx2();
|
||||
void on_pbCallCQ_clicked();
|
||||
void on_pbAnswerCaller_clicked();
|
||||
void on_pbSendRRR_clicked();
|
||||
void on_pbAnswerCQ_clicked();
|
||||
void on_pbSendReport_clicked();
|
||||
void on_pbSend73_clicked();
|
||||
void on_rbGenMsg_clicked(bool checked);
|
||||
void on_rbFreeText_clicked(bool checked);
|
||||
void on_freeTextMsg_currentTextChanged (QString const&);
|
||||
void on_rptSpinBox_valueChanged(int n);
|
||||
void killFile();
|
||||
void on_tuneButton_clicked (bool);
|
||||
void on_pbR2T_clicked();
|
||||
void on_pbT2R_clicked();
|
||||
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& 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_outAttenuation_valueChanged (int);
|
||||
void rigOpen ();
|
||||
void handle_transceiver_update (Transceiver::TransceiverState const&);
|
||||
void handle_transceiver_failure (QString const& reason);
|
||||
void on_actionAstronomical_data_toggled (bool);
|
||||
void on_actionShort_list_of_add_on_prefixes_and_suffixes_triggered();
|
||||
void band_changed (Frequency);
|
||||
void monitor (bool);
|
||||
void stop_tuning ();
|
||||
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);
|
||||
void VHF_features_enabled(bool b);
|
||||
void on_sbSubmode_valueChanged(int n);
|
||||
void on_cbShMsgs_toggled(bool b);
|
||||
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_cbAutoSeq_toggled(bool b);
|
||||
void networkError (QString const&);
|
||||
void on_ClrAvgButton_clicked();
|
||||
void on_actionWSPR_triggered();
|
||||
void on_actionWSPR_LF_triggered();
|
||||
void on_syncSpinBox_valueChanged(int n);
|
||||
void on_TxPowerComboBox_currentIndexChanged(const QString &arg1);
|
||||
void on_sbTxPercent_valueChanged(int n);
|
||||
void on_cbUploadWSPR_Spots_toggled(bool b);
|
||||
void WSPR_config(bool b);
|
||||
void uploadSpots();
|
||||
void TxAgain();
|
||||
void uploadResponse(QString response);
|
||||
void on_WSPRfreqSpinBox_valueChanged(int n);
|
||||
void on_pbTxNext_clicked(bool b);
|
||||
void on_actionEcho_Graph_triggered();
|
||||
void on_actionEcho_triggered();
|
||||
void on_actionISCAT_triggered();
|
||||
void on_actionFast_Graph_triggered();
|
||||
void fast_decode_done();
|
||||
void on_actionMeasure_reference_spectrum_triggered();
|
||||
void on_actionErase_reference_spectrum_triggered();
|
||||
void on_actionMeasure_phase_response_triggered();
|
||||
void on_sbTR_valueChanged (int);
|
||||
void on_sbFtol_valueChanged (int);
|
||||
void on_cbFast9_clicked(bool b);
|
||||
void on_sbCQTxFreq_valueChanged(int n);
|
||||
void on_cbCQTx_toggled(bool b);
|
||||
void on_actionMSK144_triggered();
|
||||
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,
|
||||
unsigned channels, unsigned msBuffered) const;
|
||||
Q_SIGNAL void stopAudioOutputStream () const;
|
||||
Q_SIGNAL void startAudioInputStream (QAudioDeviceInfo const&,
|
||||
int framesPerBuffer, AudioDevice * sink,
|
||||
unsigned downSampleFactor, AudioDevice::Channel) const;
|
||||
Q_SIGNAL void suspendAudioInputStream () const;
|
||||
Q_SIGNAL void resumeAudioInputStream () const;
|
||||
Q_SIGNAL void startDetector (AudioDevice::Channel) const;
|
||||
Q_SIGNAL void FFTSize (unsigned) const;
|
||||
Q_SIGNAL void detectorClose () const;
|
||||
Q_SIGNAL void finished () const;
|
||||
Q_SIGNAL void transmitFrequency (double) const;
|
||||
Q_SIGNAL void endTransmitMessage (bool quick = false) const;
|
||||
Q_SIGNAL void tune (bool = true) const;
|
||||
Q_SIGNAL void sendMessage (unsigned symbolsLength, double framesPerSymbol,
|
||||
double frequency, double toneSpacing,
|
||||
SoundOutput *, AudioDevice::Channel = AudioDevice::Mono,
|
||||
bool synchronize = true, bool fastMode = false, double dBSNR = 99.,
|
||||
int TRperiod=60) const;
|
||||
Q_SIGNAL void outAttenuationChanged (qreal) const;
|
||||
Q_SIGNAL void toggleShorthand () const;
|
||||
|
||||
private:
|
||||
void astroUpdate ();
|
||||
void writeAllTxt(QString message);
|
||||
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;
|
||||
QSplashScreen * m_splash;
|
||||
QString m_revision;
|
||||
bool m_multiple;
|
||||
MultiSettings * m_multi_settings;
|
||||
QPushButton * m_configurations_button;
|
||||
QSettings * m_settings;
|
||||
QScopedPointer<Ui::MainWindow> ui;
|
||||
|
||||
// other windows
|
||||
Configuration m_config;
|
||||
WSPRBandHopping m_WSPR_band_hopping;
|
||||
bool m_WSPR_tx_next;
|
||||
MessageBox m_rigErrorMessageBox;
|
||||
QScopedPointer<SampleDownloader> m_sampleDownloader;
|
||||
QScopedPointer<EqualizationToolsDialog> m_equalizationToolsDialog;
|
||||
|
||||
QScopedPointer<WideGraph> m_wideGraph;
|
||||
QScopedPointer<EchoGraph> m_echoGraph;
|
||||
QScopedPointer<FastGraph> m_fastGraph;
|
||||
QScopedPointer<LogQSO> m_logDlg;
|
||||
QScopedPointer<Astro> m_astroWidget;
|
||||
QScopedPointer<HelpTextWindow> m_shortcuts;
|
||||
QScopedPointer<HelpTextWindow> m_prefixes;
|
||||
QScopedPointer<HelpTextWindow> m_mouseCmnds;
|
||||
QScopedPointer<MessageAveraging> m_msgAvgWidget;
|
||||
|
||||
Transceiver::TransceiverState m_rigState;
|
||||
Frequency m_lastDialFreq;
|
||||
QString m_lastBand;
|
||||
QString m_lastCallsign;
|
||||
Frequency m_dialFreqRxWSPR; // best guess at WSPR QRG
|
||||
|
||||
Detector * m_detector;
|
||||
unsigned m_FFTSize;
|
||||
SoundInput * m_soundInput;
|
||||
Modulator * m_modulator;
|
||||
SoundOutput * m_soundOutput;
|
||||
QThread m_audioThread;
|
||||
|
||||
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;
|
||||
|
||||
double m_s6;
|
||||
double m_tRemaining;
|
||||
|
||||
float m_DTtol;
|
||||
float m_t0;
|
||||
float m_t1;
|
||||
float m_t0Pick;
|
||||
float m_t1Pick;
|
||||
float m_fCPUmskrtd;
|
||||
|
||||
qint32 m_waterfallAvg;
|
||||
qint32 m_ntx;
|
||||
bool m_gen_message_is_cq;
|
||||
bool m_send_RR73;
|
||||
qint32 m_timeout;
|
||||
qint32 m_XIT;
|
||||
qint32 m_setftx;
|
||||
qint32 m_ndepth;
|
||||
qint32 m_sec0;
|
||||
qint32 m_RxLog;
|
||||
qint32 m_nutc0;
|
||||
qint32 m_ntr;
|
||||
qint32 m_tx;
|
||||
qint32 m_hsym;
|
||||
qint32 m_TRperiod;
|
||||
qint32 m_nsps;
|
||||
qint32 m_hsymStop;
|
||||
qint32 m_inGain;
|
||||
qint32 m_ncw;
|
||||
qint32 m_secID;
|
||||
qint32 m_idleMinutes;
|
||||
qint32 m_nSubMode;
|
||||
qint32 m_nclearave;
|
||||
qint32 m_minSync;
|
||||
qint32 m_dBm;
|
||||
qint32 m_pctx;
|
||||
qint32 m_nseq;
|
||||
qint32 m_nWSPRdecodes;
|
||||
qint32 m_k0;
|
||||
qint32 m_kdone;
|
||||
qint32 m_nPick;
|
||||
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;
|
||||
bool m_loopall;
|
||||
bool m_decoderBusy;
|
||||
bool m_txFirst;
|
||||
bool m_auto;
|
||||
bool m_restart;
|
||||
bool m_startAnother;
|
||||
bool m_saveDecoded;
|
||||
bool m_saveAll;
|
||||
bool m_widebandDecode;
|
||||
bool m_call3Modified;
|
||||
bool m_dataAvailable;
|
||||
bool m_bDecoded;
|
||||
bool m_noSuffix;
|
||||
bool m_blankLine;
|
||||
bool m_decodedText2;
|
||||
bool m_freeText;
|
||||
bool m_sentFirst73;
|
||||
int m_currentMessageType;
|
||||
QString m_currentMessage;
|
||||
int m_lastMessageType;
|
||||
QString m_lastMessageSent;
|
||||
bool m_bShMsgs;
|
||||
bool m_bSWL;
|
||||
bool m_uploadSpots;
|
||||
bool m_uploading;
|
||||
bool m_txNext;
|
||||
bool m_grid6;
|
||||
bool m_tuneup;
|
||||
bool m_bTxTime;
|
||||
bool m_rxDone;
|
||||
bool m_bSimplex; // not using split even if it is available
|
||||
bool m_bEchoTxOK;
|
||||
bool m_bTransmittedEcho;
|
||||
bool m_bEchoTxed;
|
||||
bool m_bFastMode;
|
||||
bool m_bFast9;
|
||||
bool m_bFastDecodeCalled;
|
||||
bool m_bDoubleClickAfterCQnnn;
|
||||
bool m_bRefSpec;
|
||||
bool m_bClearRefSpec;
|
||||
bool m_bTrain;
|
||||
bool m_bUseRef;
|
||||
bool m_bFastDone;
|
||||
bool m_bAltV;
|
||||
bool m_bNoMoreFiles;
|
||||
bool m_bQRAsyncWarned;
|
||||
bool m_bDoubleClicked;
|
||||
bool m_bCallingCQ;
|
||||
bool m_bAutoReply;
|
||||
bool m_bCheckedContest;
|
||||
bool m_bWarnedSplit=false;
|
||||
bool m_bWarnedHound=false;
|
||||
|
||||
enum
|
||||
{
|
||||
CALLING,
|
||||
REPLYING,
|
||||
REPORT,
|
||||
ROGER_REPORT,
|
||||
ROGERS,
|
||||
SIGNOFF
|
||||
}
|
||||
m_QSOProgress;
|
||||
|
||||
int m_ihsym;
|
||||
int m_nzap;
|
||||
int m_npts8;
|
||||
float m_px;
|
||||
float m_pxmax;
|
||||
float m_df3;
|
||||
int m_iptt0;
|
||||
bool m_btxok0;
|
||||
int m_nsendingsh;
|
||||
double m_onAirFreq0;
|
||||
bool m_first_error;
|
||||
|
||||
char m_msg[100][80];
|
||||
|
||||
// labels in status bar
|
||||
QLabel tx_status_label;
|
||||
QLabel config_label;
|
||||
QLabel mode_label;
|
||||
QLabel last_tx_label;
|
||||
QLabel auto_tx_label;
|
||||
QLabel band_hopping_label;
|
||||
QProgressBar progressBar;
|
||||
QLabel watchdog_label;
|
||||
|
||||
QFuture<void> m_wav_future;
|
||||
QFutureWatcher<void> m_wav_future_watcher;
|
||||
QFutureWatcher<void> watcher3;
|
||||
QFutureWatcher<QString> m_saveWAVWatcher;
|
||||
|
||||
QProcess proc_jt9;
|
||||
QProcess p1;
|
||||
QProcess p3;
|
||||
|
||||
WSPRNet *wsprNet;
|
||||
|
||||
QTimer m_guiTimer;
|
||||
QTimer ptt1Timer; //StartTx delay
|
||||
QTimer ptt0Timer; //StopTx delay
|
||||
QTimer logQSOTimer;
|
||||
QTimer killFileTimer;
|
||||
QTimer tuneButtonTimer;
|
||||
QTimer uploadTimer;
|
||||
QTimer tuneATU_Timer;
|
||||
QTimer TxAgainTimer;
|
||||
QTimer minuteTimer;
|
||||
QTimer splashTimer;
|
||||
QTimer p1Timer;
|
||||
|
||||
QString m_path;
|
||||
QString m_baseCall;
|
||||
QString m_hisCall;
|
||||
QString m_hisGrid;
|
||||
QString m_appDir;
|
||||
QString m_palette;
|
||||
QString m_dateTime;
|
||||
QString m_mode;
|
||||
QString m_modeTx;
|
||||
QString m_fnameWE; // save path without extension
|
||||
QString m_rpt;
|
||||
QString m_rptSent;
|
||||
QString m_rptRcvd;
|
||||
QString m_qsoStart;
|
||||
QString m_qsoStop;
|
||||
QString m_cmnd;
|
||||
QString m_cmndP1;
|
||||
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;
|
||||
QString m_QSOText;
|
||||
unsigned m_msAudioOutputBuffered;
|
||||
unsigned m_framesAudioInputBuffered;
|
||||
unsigned m_downSampleFactor;
|
||||
QThread::Priority m_audioThreadPriority;
|
||||
bool m_bandEdited;
|
||||
bool m_splitMode;
|
||||
bool m_monitoring;
|
||||
bool m_tx_when_ready;
|
||||
bool m_transmitting;
|
||||
bool m_tune;
|
||||
bool m_tx_watchdog; // true when watchdog triggered
|
||||
bool m_block_pwr_tooltip;
|
||||
bool m_PwrBandSetOK;
|
||||
bool m_bVHFwarned;
|
||||
bool m_bDisplayedOnce;
|
||||
Frequency m_lastMonitoredFrequency;
|
||||
double m_toneSpacing;
|
||||
int m_firstDecode;
|
||||
QProgressDialog m_optimizingProgress;
|
||||
QTimer m_heartbeat;
|
||||
MessageClient * m_messageClient;
|
||||
PSK_Reporter *psk_Reporter;
|
||||
DisplayManual m_manual;
|
||||
QHash<QString, QVariant> m_pwrBandTxMemory; // Remembers power level by band
|
||||
QHash<QString, QVariant> m_pwrBandTuneMemory; // Remembers power level by band for tuning
|
||||
QByteArray m_geometryNoControls;
|
||||
QVector<double> m_phaseEqCoefficients;
|
||||
|
||||
//---------------------------------------------------- private functions
|
||||
void readSettings();
|
||||
void set_application_font (QFont const&);
|
||||
void setDecodedTextFont (QFont const&);
|
||||
void writeSettings();
|
||||
void createStatusBar();
|
||||
void updateStatusBar();
|
||||
void genStdMsgs(QString rpt, bool unconditional = false);
|
||||
void genCQMsg();
|
||||
void clearDX ();
|
||||
void lookup();
|
||||
void ba2msg(QByteArray ba, char* message);
|
||||
void msgtype(QString t, QLineEdit* tx);
|
||||
void stub();
|
||||
void statusChanged();
|
||||
void fixStop();
|
||||
bool shortList(QString callsign);
|
||||
void transmit (double snr = 99.);
|
||||
void rigFailure (QString const& reason);
|
||||
void pskSetLocal ();
|
||||
void pskPost(DecodedText const& decodedtext);
|
||||
void displayDialFrequency ();
|
||||
void transmitDisplay (bool);
|
||||
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);
|
||||
void enable_DXCC_entity (bool on);
|
||||
void switch_mode (Mode);
|
||||
void WSPR_scheduling ();
|
||||
void freqCalStep();
|
||||
void setRig (Frequency = 0); // zero frequency means no change
|
||||
void WSPR_history(Frequency dialFreq, int ndecodes);
|
||||
QString WSPR_hhmm(int n);
|
||||
void fast_config(bool b);
|
||||
void CQTxFreq();
|
||||
QString save_wave_file (QString const& name
|
||||
, short const * data
|
||||
, int seconds
|
||||
, QString const& my_callsign
|
||||
, QString const& my_grid
|
||||
, QString const& mode
|
||||
, qint32 sub_mode
|
||||
, 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);
|
||||
void subProcessError (QProcess *, QProcess::ProcessError);
|
||||
void statusUpdate () const;
|
||||
void update_watchdog_label ();
|
||||
void on_the_minute ();
|
||||
void add_child_to_event_filter (QObject *);
|
||||
void remove_child_from_event_filter (QObject *);
|
||||
void setup_status_bar (bool vhf);
|
||||
void tx_watchdog (bool triggered);
|
||||
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);
|
||||
extern void getDev(int* numDevices,char hostAPI_DeviceName[][50],
|
||||
int minChan[], int maxChan[],
|
||||
int minSpeed[], int maxSpeed[]);
|
||||
extern int next_tx_state(int pctx);
|
||||
|
||||
#endif // MAINWINDOW_H
|
||||
Reference in New Issue
Block a user