From b163a8a765171982133b765c244eb176dc68783e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 20 Jun 2007 15:53:56 +0000 Subject: [PATCH] Added "Pseudo-Linrad" test programs. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/map65@394 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- plrr.f90 | 23 ++++++++++++++++++ plrr_subs.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++ plrs.f90 | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++ plrs_subs.c | 39 +++++++++++++++++++++++++++++ 4 files changed, 195 insertions(+) create mode 100644 plrr.f90 create mode 100644 plrr_subs.c create mode 100644 plrs.f90 create mode 100644 plrs_subs.c diff --git a/plrr.f90 b/plrr.f90 new file mode 100644 index 000000000..e685f67e8 --- /dev/null +++ b/plrr.f90 @@ -0,0 +1,23 @@ +program plrr + +! Pseudo-Linrad "Receive" program + + integer*1 userx_no,iusb + integer*2 nblock + real*8 center_freq,buf8 + common/plrscom/center_freq,msec,fselect,iptr,nblock,userx_no,iusb,buf8(174) +! 8 4 4 4 2 1 1 1392 + + call setup_rsocket + + npkt=0 + +10 call recv_pkt(center_freq) + npkt=npkt+1 + if(mod(npkt,1000).eq.0) write(*,1010) npkt,center_freq,0.001*msec,fselect +1010 format('npkt:',i10,' f0:',f8.3,' t:',f10.3,' fselect:',f10.3) + go to 10 + +end program plrr + +! To compile: % gfortran -o plrr plrr.f90 plrr_subs.c diff --git a/plrr_subs.c b/plrr_subs.c new file mode 100644 index 000000000..c3fd83736 --- /dev/null +++ b/plrr_subs.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include +#include +#include + +#define HELLO_PORT 50004 +#define HELLO_GROUP "239.255.0.0" +#define MSGBUFSIZE 1416 + +struct sockaddr_in addr; +int fd; + +void setup_rsocket_(void) +{ + struct ip_mreq mreq; + u_int yes=1; + + /* create what looks like an ordinary UDP socket */ + if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) { + perror("socket"); + exit(1); + } + + /* allow multiple sockets to use the same PORT number */ + if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) { + perror("Reusing ADDR failed"); + exit(1); + } + + /* set up destination address */ + memset(&addr,0,sizeof(addr)); + addr.sin_family=AF_INET; + addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */ + addr.sin_port=htons(HELLO_PORT); + + /* bind to receive address */ + if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) { + perror("bind"); + exit(1); + } + + /* use setsockopt() to request that the kernel join a multicast group */ + mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP); + mreq.imr_interface.s_addr=htonl(INADDR_ANY); + if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) { + perror("setsockopt"); + exit(1); + } +} + +void recv_pkt_(char buf[]) +{ + int addrlen,nbytes; + addrlen=sizeof(addr); + if ((nbytes=recvfrom(fd,buf,1416,0, + (struct sockaddr *) &addr,&addrlen)) < 0) { + perror("recvfrom"); + exit(1); + } +} diff --git a/plrs.f90 b/plrs.f90 new file mode 100644 index 000000000..0938d4dd3 --- /dev/null +++ b/plrs.f90 @@ -0,0 +1,70 @@ +program plrs + +! Pseudo-Linrad "Send" program. Reads recorded Linrad data from "*.tf2" +! files, and multicasts it as Linrad would do for timf2 data. + + integer RMODE + parameter(RMODE=0) + parameter (NBPP=1392,NPPR=184) + parameter (NBYTES=NBPP*NPPR,NZ=NBYTES/8) + parameter (NRECS=1979) + integer*1 userx_no,iusb + integer*2 nblock + real*8 d(NZ),buf8 + integer fd + integer open,read,close + character*8 fname + real*8 center_freq,dmsec,dtmspacket + common/plrscom/center_freq,msec,fselect,iptr,nblock,userx_no,iusb,buf8(174) +! 8 4 4 4 2 1 1 1392 + fname="all.tf2"//char(0) + iters=1 + + userx_no=0 + iusb=1 + center_freq=144.125d0 + dtmspacket=1000.d0*NBPP/(8.d0*96000.d0) + fselect=128.0 + 1.6 + 0.220 + npkt=0 + + call setup_ssocket !Open a socket for multicasting + + do iter=1,iters + fd=open(fname,RMODE) !Open file for reading + dmsec=-dtmspacket + nsec0=time() + + do irec=1,NRECS + nr=read(fd,d,NBYTES) + if(nr.ne.NBYTES) then + print*,'Error reading file all.tf2' + go to 999 + endif + + k=0 + do ipacket=1,NPPR + dmsec=dmsec+dtmspacket + msec=nint(dmsec) + do i=1,NBPP/8 + k=k+1 + buf8(i)=d(k) + enddo + call send_pkt(center_freq) + npkt=npkt+1 + if(mod(npkt,100).eq.0) then + nsec=time()-nsec0 + nwait=msec-1000*nsec + if(mod(npkt,1000).eq.0) write(*,1010) npkt,nsec,0.001*msec,nwait +1010 format('npkt:',i10,' nsec:',i6,' t:',f10.3,' nwait:',i8) +! Pace the data at close to its real-time rate + if(nwait.gt.0) call usleep(nwait*1000) + endif + enddo + enddo + i=close(fd) + enddo + + +999 end program plrs + +! To compile: % gfortran -o plrs plrs.f90 plrs_subs.c cutil.c diff --git a/plrs_subs.c b/plrs_subs.c new file mode 100644 index 000000000..2e13d21be --- /dev/null +++ b/plrs_subs.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include +#include + + +#define HELLO_PORT 50004 +#define HELLO_GROUP "239.255.0.0" + +struct sockaddr_in addr; +int fd; + +void setup_ssocket_(void) +{ + struct ip_mreq mreq; + + /* create what looks like an ordinary UDP socket */ + if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) { + perror("socket"); + exit(1); + } + + /* set up destination address */ + memset(&addr,0,sizeof(addr)); + addr.sin_family=AF_INET; + addr.sin_addr.s_addr=inet_addr(HELLO_GROUP); + addr.sin_port=htons(HELLO_PORT); +} + +void send_pkt_(char buf[]) +{ + if (sendto(fd,buf,1416,0,(struct sockaddr *) &addr, + sizeof(addr)) < 0) { + perror("sendto"); + exit(1);} +}