SVN r8748
This commit is contained in:
@@ -0,0 +1,346 @@
|
||||
subroutine wqenc(msg,ntype,data0)
|
||||
|
||||
! Parse and encode a WSPR message.
|
||||
|
||||
use packjt
|
||||
parameter (MASK15=32767)
|
||||
character*22 msg
|
||||
character*12 call1,call2
|
||||
character*4 grid
|
||||
character*9 name
|
||||
character ccur*4,cxp*2
|
||||
logical lbad1,lbad2
|
||||
integer*1 data0(11)
|
||||
integer nu(0:9)
|
||||
data nu/0,-1,1,0,-1,2,1,0,-1,1/
|
||||
|
||||
read(msg,1001,end=1,err=1) ng,n1
|
||||
1001 format(z4,z7)
|
||||
ntype=62
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0) !Pack 8 bits per byte, add tail
|
||||
go to 900
|
||||
|
||||
1 if(msg(1:6).eq.'73 DE ') go to 80
|
||||
if(index(msg,' W ').gt.0 .and. index(msg,' DBD ').gt.0) go to 90
|
||||
if(msg(1:4).eq.'QRZ ') go to 100
|
||||
if(msg(1:8).eq.'PSE QSY ') go to 110
|
||||
if(msg(1:3).eq.'WX ') go to 120
|
||||
|
||||
! Standard WSPR message (types 0 3 7 10 13 17 ... 60)
|
||||
i1=index(msg,' ')
|
||||
if(i1.lt.4 .or. i1.gt.7) go to 10
|
||||
call1=msg(:i1-1)
|
||||
grid=msg(i1+1:i1+4)
|
||||
call packcall(call1,n1,lbad1)
|
||||
call packgrid(grid,ng,lbad2)
|
||||
if(lbad1 .or. lbad2) go to 10
|
||||
ndbm=0
|
||||
read(msg(i1+5:),*,err=10,end=800) ndbm
|
||||
if(ndbm.lt.0 .or. ndbm.gt.60) go to 800
|
||||
ndbm=ndbm+nu(mod(ndbm,10))
|
||||
n2=128*ng + (ndbm+64)
|
||||
call pack50(n1,n2,data0)
|
||||
ntype=ndbm
|
||||
go to 900
|
||||
|
||||
! "BestDX" automated WSPR reply (type 1)
|
||||
10 if(i1.ne.5 .or. msg(5:8).ne.' DE ') go to 20
|
||||
grid=msg(1:4)
|
||||
call packgrid(grid,ng,lbad2)
|
||||
if(lbad2) go to 800
|
||||
call1=msg(9:)
|
||||
call packcall(call1,n1,lbad1)
|
||||
if(lbad1) go to 800
|
||||
ntype=1
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0) !Pack 8 bits per byte, add tail
|
||||
go to 900
|
||||
|
||||
! CQ (msg #1; types 2, 4, 5)
|
||||
20 if(msg(1:3).ne.'CQ ') go to 30
|
||||
if(index(msg,'/').le.0) then
|
||||
i2=index(msg(4:),' ')
|
||||
call1=msg(4:i2+3)
|
||||
grid=msg(i2+4:)
|
||||
call packcall(call1,n1,lbad1)
|
||||
if(lbad1) go to 30
|
||||
call packgrid(grid,ng,lbad2)
|
||||
if(lbad2) go to 30
|
||||
ntype=2
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
else
|
||||
ntype=4 ! or 5
|
||||
call1=msg(4:)
|
||||
call packpfx(call1,n1,ng,nadd)
|
||||
ntype=ntype+nadd
|
||||
n2=128*ng + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
endif
|
||||
go to 900
|
||||
|
||||
! Reply to CQ (msg #2; types 6,8,9,11)
|
||||
30 if(msg(1:1).ne.'<' .and. msg(1:3).ne.'DE ') go to 40
|
||||
if(index(msg,' RRR ').gt.0) go to 50
|
||||
if(msg(1:1).eq.'<') then
|
||||
ntype=6
|
||||
i1=index(msg,'>')
|
||||
call1=msg(2:i1-1)
|
||||
read(msg(i1+1:),*,err=31,end=31) k,muf,ccur,cxp
|
||||
go to 130
|
||||
31 call2=msg(i1+2:)
|
||||
call hash(call1,i1-2,ih)
|
||||
call packcall(call2,n1,lbad1)
|
||||
n2=128*ih + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
else
|
||||
i1=index(msg(4:),' ')
|
||||
call1=msg(4:i1+2)
|
||||
if(index(msg,'/').le.0) then
|
||||
ntype=8
|
||||
ih=0
|
||||
call packcall(call1,n1,lbad1)
|
||||
grid=msg(i1+4:i1+7)
|
||||
call packgrid(grid,ng,lbad2)
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
else
|
||||
ntype=9 ! or 11
|
||||
call1=msg(4:)
|
||||
call packpfx(call1,n1,ng,nadd)
|
||||
ntype=ntype + 2*nadd
|
||||
n2=128*ng + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
endif
|
||||
endif
|
||||
go to 900
|
||||
|
||||
! Call(s) + report (msg #3; types -1 to -27)
|
||||
! Call(s) + R + report (msg #4; types -28 to -54)
|
||||
40 if(index(msg,' RRR').gt.0) go to 50
|
||||
i1=index(msg,'<')
|
||||
if(i1.gt.0 .and. (i1.lt.5 .or. i1.gt.8)) go to 50
|
||||
i2=index(msg,'/')
|
||||
if(i2.gt.0 .and.i2.le.4) then
|
||||
ntype=-10 ! -10 to -27
|
||||
i0=index(msg,' ')
|
||||
call1=msg(:i0-1)
|
||||
call packpfx(call1,n1,ng,nadd)
|
||||
ntype=ntype - 9*nadd
|
||||
i2=index(msg,' ')
|
||||
i3=index(msg,' R ')
|
||||
if(i3.gt.0) i2=i2+2 !-28 to -36
|
||||
read(msg(i2+2:i2+2),*,end=800,err=800) nrpt
|
||||
ntype=ntype - (nrpt-1)
|
||||
if(i3.gt.0) ntype=ntype-27
|
||||
n2=128*ng + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
else if(i1.eq.0) then
|
||||
go to 50
|
||||
endif
|
||||
call1=msg(:i1-2) !-1 to -9
|
||||
i2=index(msg,'>')
|
||||
call2=msg(i1+1:i2-1)
|
||||
call hash(call2,i2-i1-1,ih)
|
||||
i3=index(msg,' R ')
|
||||
if(i3.gt.0) i2=i2+2 !-28 to -36
|
||||
read(msg(i2+3:i2+3),*,end=42,err=42) nrpt
|
||||
go to 43
|
||||
42 nrpt=1
|
||||
43 ntype=-nrpt
|
||||
if(i3.gt.0) ntype=-(nrpt+27)
|
||||
call packcall(call1,n1,lbad1)
|
||||
n2=128*ih + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
50 i0=index(msg,'<')
|
||||
if(i0.le.0 .and. msg(1:3).ne.'DE ') go to 60
|
||||
i3=index(msg,' RRR')
|
||||
if(i3.le.0) go to 60
|
||||
! Call or calls and RRR (msg#5; type2 12,14,15,16)
|
||||
i0=index(msg,'<')
|
||||
if(i0.eq.1) then
|
||||
if(index(msg,'/').le.0) then
|
||||
ntype=14
|
||||
i1=index(msg,'>')
|
||||
call1=msg(2:i1-1)
|
||||
call2=msg(i1+2:)
|
||||
i2=index(call2,' ')
|
||||
call2=call2(:i2-1)
|
||||
call packcall(call2,n1,lbad1)
|
||||
call hash(call1,i1-2,ih)
|
||||
n2=128*ih + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
else
|
||||
stop '0002'
|
||||
endif
|
||||
else if(i0.ge.5 .and. i0.le.8) then
|
||||
if(index(msg,'/').le.0) then
|
||||
ntype=12
|
||||
i1=index(msg,'>')
|
||||
call1=msg(:i0-2)
|
||||
call2=msg(i0+1:i1-1)
|
||||
call packcall(call1,n1,lbad1)
|
||||
call hash(call2,i1-i0-1,ih)
|
||||
n2=128*ih + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
else
|
||||
stop '0002'
|
||||
endif
|
||||
else
|
||||
i1=index(msg(4:),' ')
|
||||
call1=msg(4:i1+2)
|
||||
if(index(msg,'/').le.0) then
|
||||
ntype=9
|
||||
grid=msg(i1+4:i1+7)
|
||||
else
|
||||
ntype=15 ! or 16
|
||||
call1=msg(4:)
|
||||
i0=index(call1,' ')
|
||||
call1=call1(:i0-1)
|
||||
call packpfx(call1,n1,ng,nadd)
|
||||
ntype=ntype+nadd
|
||||
n2=128*ng + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
endif
|
||||
endif
|
||||
go to 900
|
||||
|
||||
! TNX <name> 73 GL (msg #6; type 18 ...)
|
||||
60 if(msg(1:4).ne.'TNX ') go to 70
|
||||
ntype=18
|
||||
n1=0
|
||||
i2=index(msg(5:),' ')
|
||||
name=msg(5:i2+4)
|
||||
call packname(name,i2-1,n1,ng)
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
! TNX name 73 GL (msg #6; type -56 ...)
|
||||
70 if(msg(1:3).ne.'OP ') go to 80
|
||||
ntype=-56
|
||||
n1=0
|
||||
i2=index(msg(4:),' ')
|
||||
name=msg(4:i2+3)
|
||||
call packname(name,i2-1,n1,ng)
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
! 73 DE call grid (msg #6; type 19)
|
||||
80 if(msg(1:6).ne.'73 DE ') go to 90
|
||||
ntype=19
|
||||
i1=index(msg(7:),' ')
|
||||
call1=msg(7:)
|
||||
if(index(call1,'/').le.0) then
|
||||
i1=index(call1,' ')
|
||||
grid=call1(i1+1:)
|
||||
call1=call1(:i1-1)
|
||||
call packcall(call1,n1,lbad1)
|
||||
call packgrid(grid,ng,lbad2)
|
||||
if(lbad1 .or. lbad2) go to 800
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
else
|
||||
ntype=21 ! or 22
|
||||
call packpfx(call1,n1,ng,nadd)
|
||||
ntype=ntype + nadd
|
||||
n2=128*ng + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
endif
|
||||
|
||||
! [pwr] W [gain] DBD [73 GL] (msg #6; types 24, 25)
|
||||
90 if(index(msg,' W ').le.0) go to 140
|
||||
ntype=25
|
||||
if(index(msg,' DBD 73 GL').gt.0) ntype=24
|
||||
i1=index(msg,' ')
|
||||
read(msg(:i1-1),*,end=800,err=800) watts
|
||||
if(watts.ge.1.0) nwatts=watts
|
||||
if(watts.lt.1.0) nwatts=3000 + nint(1000.*watts)
|
||||
if(index(msg,'DIPOLE').gt.0) then
|
||||
ndbd=30000
|
||||
else if(index(msg,'VERTICAL').gt.0) then
|
||||
ndbd=30001
|
||||
else
|
||||
i2=index(msg(i1+3:),' ')
|
||||
read(msg(i1+3:i1+i2+1),*,end=800,err=800) ndbd
|
||||
endif
|
||||
n1=nwatts
|
||||
ng=ndbd + 32
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
! QRZ call (msg #3; type 26)
|
||||
100 call1=msg(5:)
|
||||
call packcall(call1,n1,lbad1)
|
||||
if(lbad1) go to 800
|
||||
ntype=26
|
||||
n2=ntype+64
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
! PSE QSY [nnn] KHZ (msg #6; type 28)
|
||||
110 ntype=28
|
||||
read(msg(9:),*,end=800,err=800) n1
|
||||
n2=ntype+64
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
! WX wx temp C|F wind (msg #6; type 29)
|
||||
120 ntype=29
|
||||
if(index(msg,' CLEAR ').gt.0) then
|
||||
i1=10
|
||||
n1=10000
|
||||
else if(index(msg,' CLOUDY ').gt.0) then
|
||||
i1=11
|
||||
n1=20000
|
||||
else if(index(msg,' RAIN ').gt.0) then
|
||||
i1=9
|
||||
n1=30000
|
||||
else if(index(msg,' SNOW ').gt.0) then
|
||||
i1=9
|
||||
n1=40000
|
||||
endif
|
||||
read(msg(i1:),*,err=800,end=800) ntemp
|
||||
ntemp=ntemp+100
|
||||
i1=index(msg,' C ')
|
||||
if(i1.gt.0) ntemp=ntemp+1000
|
||||
n1=n1+ntemp
|
||||
if(index(msg,' CALM').gt.0) ng=1
|
||||
if(index(msg,' BREEZES').gt.0) ng=2
|
||||
if(index(msg,' WINDY').gt.0) ng=3
|
||||
if(index(msg,' DRY').gt.0) ng=4
|
||||
if(index(msg,' HUMID').gt.0) ng=5
|
||||
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
|
||||
go to 900
|
||||
|
||||
! Solar/geomagnetic/ionospheric data
|
||||
130 ntype=63
|
||||
call packprop(k,muf,ccur,cxp,n1)
|
||||
call hash(call1,i1-2,ih)
|
||||
n2=128*ih + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
140 continue
|
||||
|
||||
! Plain text
|
||||
800 ntype=-57
|
||||
call packtext2(msg(:8),n1,ng)
|
||||
n2=128*ng + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
900 continue
|
||||
return
|
||||
end subroutine wqenc
|
||||
@@ -1,63 +0,0 @@
|
||||
#ifndef RADIO_HPP__
|
||||
#define RADIO_HPP__
|
||||
|
||||
#include <QObject>
|
||||
#include <QLocale>
|
||||
#include <QList>
|
||||
|
||||
#include "udp_export.h"
|
||||
|
||||
class QVariant;
|
||||
class QString;
|
||||
|
||||
//
|
||||
// Declarations common to radio software.
|
||||
//
|
||||
|
||||
namespace Radio
|
||||
{
|
||||
//
|
||||
// Frequency types
|
||||
//
|
||||
using Frequency = quint64;
|
||||
using Frequencies = QList<Frequency>;
|
||||
using FrequencyDelta = qint64;
|
||||
|
||||
//
|
||||
// Qt type registration
|
||||
//
|
||||
void UDP_NO_EXPORT register_types ();
|
||||
|
||||
//
|
||||
// Frequency type conversion.
|
||||
//
|
||||
// QVariant argument is convertible to double and is assumed to
|
||||
// be scaled by (10 ** -scale).
|
||||
//
|
||||
Frequency UDP_EXPORT frequency (QVariant const&, int scale,
|
||||
bool * ok = nullptr, QLocale const& = QLocale ());
|
||||
FrequencyDelta UDP_EXPORT frequency_delta (QVariant const&, int scale,
|
||||
bool * ok = nullptr, QLocale const& = QLocale ());
|
||||
|
||||
//
|
||||
// Frequency type formatting
|
||||
//
|
||||
QString UDP_EXPORT frequency_MHz_string (Frequency, QLocale const& = QLocale ());
|
||||
QString UDP_EXPORT frequency_MHz_string (FrequencyDelta, QLocale const& = QLocale ());
|
||||
QString UDP_EXPORT pretty_frequency_MHz_string (Frequency, QLocale const& = QLocale ());
|
||||
QString UDP_EXPORT pretty_frequency_MHz_string (double, int scale, QLocale const& = QLocale ());
|
||||
QString UDP_EXPORT pretty_frequency_MHz_string (FrequencyDelta, QLocale const& = QLocale ());
|
||||
|
||||
//
|
||||
// Callsigns
|
||||
//
|
||||
bool UDP_EXPORT is_callsign (QString const&);
|
||||
bool UDP_EXPORT is_compound_callsign (QString const&);
|
||||
QString UDP_EXPORT base_callsign (QString);
|
||||
}
|
||||
|
||||
Q_DECLARE_METATYPE (Radio::Frequency);
|
||||
Q_DECLARE_METATYPE (Radio::Frequencies);
|
||||
Q_DECLARE_METATYPE (Radio::FrequencyDelta);
|
||||
|
||||
#endif
|
||||
@@ -1,112 +0,0 @@
|
||||
/* EXTRACT.C - Extract message bits from coded blocks. */
|
||||
|
||||
/* Copyright (c) 1995-2012 by Radford M. Neal.
|
||||
*
|
||||
* Permission is granted for anyone to copy, use, modify, and distribute
|
||||
* these programs and accompanying documents for any purpose, provided
|
||||
* this copyright notice is retained and prominently displayed, and note
|
||||
* is made of any changes made to these programs. These programs and
|
||||
* documents are distributed without any warranty, express or implied.
|
||||
* As the programs were written for research purposes only, they have not
|
||||
* been tested to the degree that would be advisable in any important
|
||||
* application. All use of these programs is entirely at the user's own
|
||||
* risk.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "alloc.h"
|
||||
#include "blockio.h"
|
||||
#include "open.h"
|
||||
#include "mod2sparse.h"
|
||||
#include "mod2dense.h"
|
||||
#include "mod2convert.h"
|
||||
#include "rcode.h"
|
||||
|
||||
void usage(void);
|
||||
|
||||
|
||||
/* MAIN PROGRAM. */
|
||||
|
||||
int main
|
||||
( int argc,
|
||||
char **argv
|
||||
)
|
||||
{
|
||||
char *gen_file, *coded_file, *ext_file;
|
||||
FILE *codef, *extf;
|
||||
char *cblk;
|
||||
int i;
|
||||
|
||||
/* Look at arguments. */
|
||||
|
||||
if (!(gen_file = argv[1])
|
||||
|| !(coded_file = argv[2])
|
||||
|| !(ext_file = argv[3])
|
||||
|| argv[4])
|
||||
{ usage();
|
||||
}
|
||||
|
||||
if ((strcmp(gen_file,"-")==0) + (strcmp(coded_file,"-")==0) > 1)
|
||||
{ fprintf(stderr,"Can't read more than one stream from standard input\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Read generator matrix file, up to the point of finding out which
|
||||
are the message bits. */
|
||||
|
||||
read_gen(gen_file,1,1);
|
||||
|
||||
/* Open decoded file. */
|
||||
|
||||
codef = open_file_std(coded_file,"r");
|
||||
if (codef==NULL)
|
||||
{ fprintf(stderr,"Can't open coded file: %s\n",coded_file);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Open file to write extracted message bits to. */
|
||||
|
||||
extf = open_file_std(ext_file,"w");
|
||||
if (extf==NULL)
|
||||
{ fprintf(stderr,"Can't create file for extracted bits: %s\n",ext_file);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
cblk = chk_alloc (N, sizeof *cblk);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
/* Read block from coded file. */
|
||||
|
||||
if (blockio_read(codef,cblk,N)==EOF) break;
|
||||
|
||||
/* Extract message bits and write to file, followed by newline to mark
|
||||
block boundary. */
|
||||
|
||||
for (i = M; i<N; i++)
|
||||
{ putc("01"[cblk[cols[i]]],extf);
|
||||
}
|
||||
|
||||
putc('\n',extf);
|
||||
}
|
||||
|
||||
if (ferror(extf) || fclose(extf)!=0)
|
||||
{ fprintf(stderr,"Error writing extracted data to %s\n",ext_file);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* PRINT USAGE MESSAGE AND EXIT. */
|
||||
|
||||
void usage(void)
|
||||
{ fprintf(stderr,
|
||||
"Usage: extract gen-file decoded-file extracted-file\n");
|
||||
exit(1);
|
||||
}
|
||||
Reference in New Issue
Block a user