- This imports the freebsd branch modifications

- This gets rid of the need to configure for parallel or serial port
- The code picks up the device name from WSJT.INI for ComPort (misnamed now)
  which is actually a device name for either a serial port or parallel port.
  ptt_unix.c then uses the appropriate code to "talk" to a parallel or serial
  port.
- audio in/audio out should work the same way on windows as it did before,
  however it is actually now a string name value, which can be used to open
  the appropriate /dev/dsp on OSS or in future, be passed to the ALSA init
  routines or other audio routines as needed. 



git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/trunk@185 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Diane Bruce 2006-07-05 03:49:02 +00:00
parent 680a9194c9
commit a0a3b799dc
11 changed files with 174 additions and 222 deletions

53
configure vendored
View File

@ -2,7 +2,7 @@
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.59 for wsjt 5.9.2.
#
# $Id: configure.ac 175 2006-04-17 20:43:21Z va3db $
# $Id: configure.ac 184 2006-07-05 03:03:11Z va3db $
#
# Copyright (C) 2003 Free Software Foundation, Inc.
# This configure script is free software; the Free Software Foundation
@ -858,8 +858,6 @@ Optional Features:
--enable-oss Force OSS SOUND usage.
--enable-portaudio Force PORTAUDIO SOUND usage.
--enable-jack Force JACK usage.
--enable-parallel Force PARALLEL port usage for ptt.
--enable-serial Force SERIAL port usage for ptt.
--enable-g95 Use G95 compiler if available.
--enable-gfortran Use gfortran compiler if available.
@ -979,7 +977,7 @@ Copyright (C) 2003 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
$Id: configure.ac 175 2006-04-17 20:43:21Z va3db $
$Id: configure.ac 184 2006-07-05 03:03:11Z va3db $
_ACEOF
exit 0
fi
@ -2356,7 +2354,7 @@ fi
# Provide some information about the compiler.
echo "$as_me:2359:" \
echo "$as_me:2357:" \
"checking for Fortran 77 compiler version" >&5
ac_compiler=`set X $ac_compile; echo $2`
{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
@ -6649,23 +6647,6 @@ else
fi;
# Check whether --enable-parallel or --disable-parallel was given.
if test "${enable_parallel+set}" = set; then
enableval="$enable_parallel"
parallel=$enableval
else
parallel=no
fi;
# Check whether --enable-serial or --disable-serial was given.
if test "${enable_serial+set}" = set; then
enableval="$enable_serial"
serial=$enableval
else
serial=no
fi;
# Check whether --enable-g95 or --disable-g95 was given.
if test "${enable_g95+set}" = set; then
enableval="$enable_g95"
@ -6728,26 +6709,6 @@ FC="${FC}"
if test "$serial" != yes -a "$parallel" != yes; then
serial=yes;
fi
if test "$serial" = yes; then
cat >>confdefs.h <<\_ACEOF
#define USE_SERIAL 1
_ACEOF
fi
if test "$parallel" = yes; then
cat >>confdefs.h <<\_ACEOF
#define USE_PARALLEL 1
_ACEOF
fi
if test "$alsa" != yes -a "$oss" != yes -a \
"$portaudio" != yes -a "$jack" != yes; then
if test $HAS_PORTAUDIO_H -eq 1; then
@ -7859,14 +7820,6 @@ if test $jack == "yes"; then
echo "Using jack.";
fi
if test $serial == "yes"; then
echo "Using serial port for ptt.";
fi
if test $parallel == "yes"; then
echo "Using parallel port for ptt.";
fi
echo
echo "Compiling $PACKAGE_NAME $PACKAGE_VERSION"
echo

View File

@ -240,17 +240,6 @@ AC_ARG_ENABLE(jack,
AC_HELP_STRING([--enable-jack],[Force JACK usage.]),
[jack=$enableval] , [jack=no])
dnl serial or parallel support (temporary until python changes)
dnl ===========================================================
AC_ARG_ENABLE(parallel,
AC_HELP_STRING([--enable-parallel],[Force PARALLEL port usage for ptt.]),
[parallel=$enableval], [parallel=no])
AC_ARG_ENABLE(serial,
AC_HELP_STRING([--enable-serial],[Force SERIAL port usage for ptt.]),
[serial=$enableval], [serial=no])
dnl pick gfortran or g95
dnl ====================
@ -300,18 +289,6 @@ AC_SUBST(FC, "${FC}")
dnl set defaults
dnl ============
if test "$serial" != yes -a "$parallel" != yes; then
[serial=yes];
fi
if test "$serial" = yes; then
AC_DEFINE(USE_SERIAL, 1, [Define if you want Serial port used.])
fi
if test "$parallel" = yes; then
AC_DEFINE(USE_PARALLEL, 1, [Define if you want Serial port used.])
fi
if test "$alsa" != yes -a "$oss" != yes -a \
"$portaudio" != yes -a "$jack" != yes; then
if test $HAS_PORTAUDIO_H -eq 1; then
@ -444,14 +421,6 @@ if test $jack == "yes"; then
echo "Using jack.";
fi
if test $serial == "yes"; then
echo "Using serial port for ptt.";
fi
if test $parallel == "yes"; then
echo "Using parallel port for ptt.";
fi
echo
echo "Compiling $PACKAGE_NAME $PACKAGE_VERSION"
echo

View File

@ -104,11 +104,11 @@ subroutine fivehz
! Switch PTT line and TxOK appropriately
if(lauto.eq.1) then
if(txtime .and. iptt.eq.0 .and. &
mute.eq.0) i1=ptt(nport,1,iptt) !Raise PTT
mute.eq.0) i1=ptt(nport,pttport,1,iptt) !Raise PTT
if(.not.txtime .or. mute.eq.1) TxOK=0 !Lower TxOK
else
if(mantx.eq.1 .and. iptt.eq.0 .and. &
mute.eq.0) i2=ptt(nport,1,iptt) !Raise PTT
mute.eq.0) i2=ptt(nport,1,pttport,iptt) !Raise PTT
if(mantx.eq.0 .or. mute.eq.1) TxOK=0 !Lower TxOK
endif
@ -130,7 +130,7 @@ subroutine fivehz
if(nc0a.lt.5) nc0a=5
if(TxOK.eq.0 .and. TxOKz.eq.1 .and. iptt.eq.1) nc0=-nc0a-1
if(nc0.le.0) nc0=nc0+1
if(nc0.eq.0) i3=ptt(nport,0,iptt)
if(nc0.eq.0) i3=ptt(nport,pttport,0,iptt)
if(iptt.eq.0 .and.TxOK.eq.0) then
sending=" "

View File

@ -24,7 +24,8 @@ subroutine ftn_init
include 'gcom3.f90'
include 'gcom4.f90'
i=ptt(nport,0,iptt) !Clear the PTT line
! print*,'ftn_init.F90 nport=', nport, 'pttport=', pttport
i=ptt(nport,pttport,0,iptt) !Clear the PTT line
addpfx=' '
do i=80,1,-1

View File

@ -40,12 +40,13 @@ integer nx !x coordinate for waterfall pixmap GUI
integer mfsample !Measured sample rate, input SoundIn
integer mfsample2 !Measured sample rate, output SoundOut
integer ns0 !Time at last ALL.TXT date entry Decoder
character*12 devin_name,devout_name ! GUI
common/gcom1/Tbuf(1024),ntrbuf(1024),Tsec,rxdelay,txdelay, &
samfacin,samfacout,txsnrdb,y1(NRXMAX),y2(NRXMAX), &
nmax,iwrite,iread,iwave(NTXMAX),nwave,TxOK,Receiving,Transmitting, &
TxFirst,TRPeriod,ibuf,ibuf0,ave,rms,ngo,level,mute,newdat,ndsec, &
ndevin,ndevout,nx,mfsample,mfsample2,ns0
ndevin,ndevout,nx,mfsample,mfsample2,ns0,devin_name,devout_name
!### volatile /gcom1/

View File

@ -79,6 +79,7 @@ character*24 decodedfile
character*80 AppDir !WSJT installation directory GUI
character*80 filetokilla !Filenames (full path) Decoder
character*80 filetokillb
character*12 pttport
common/gcom2/ps0(431),psavg(450),s2(64,3100),ccf(-5:540), &
green(500),ngreen,dgain,iter,ndecoding,ndecoding0,mousebutton, &
@ -90,6 +91,6 @@ common/gcom2/ps0(431),psavg(450),s2(64,3100),ccf(-5:540), &
idinterval,msmax,lenappdir,ndiskdat,nlines,nflat,ntxreq,ntxnow, &
ndepth,nspecial,ndf,ss1(-224:224),ss2(-224:224), &
mycall,hiscall,hisgrid,txmsg,sending,mode,fname0,fnamea, &
fnameb,decodedfile,AppDir,filetokilla,filetokillb,utcdate
fnameb,decodedfile,AppDir,filetokilla,filetokillb,utcdate,pttport
!### volatile /gcom2/

View File

@ -25,8 +25,11 @@ MyGrid=StringVar()
#TxDelay=StringVar()
IDinterval=IntVar()
ComPort=IntVar()
PttPort=StringVar()
ndevin=IntVar()
ndevout=IntVar()
DevinName=StringVar()
DevoutName=StringVar()
samfacin=DoubleVar()
samfacout=DoubleVar()
Template1=StringVar()
@ -106,12 +109,12 @@ mygrid=Pmw.EntryField(g1.interior(),labelpos=W,label_text='Grid Locator:',
## value='0.2',entry_textvariable=TxDelay)
idinterval=Pmw.EntryField(g1.interior(),labelpos=W,label_text='ID Interval (m):',
value=10,entry_textvariable=IDinterval,entry_width=12)
comport=Pmw.EntryField(g1.interior(),labelpos=W,label_text='COM Port:',
value=1,entry_textvariable=ComPort,entry_width=12)
comport=Pmw.EntryField(g1.interior(),labelpos=W,label_text='PTT Port:',
value='/dev/cuad0',entry_textvariable=PttPort,entry_width=12)
audioin=Pmw.EntryField(g1.interior(),labelpos=W,label_text='Audio In:',
value=0,entry_textvariable=ndevin,entry_width=12)
value='0',entry_textvariable=DevinName,entry_width=12)
audioout=Pmw.EntryField(g1.interior(),labelpos=W,label_text='Audio Out:',
value=0,entry_textvariable=ndevout,entry_width=12)
value='0',entry_textvariable=DevoutName,entry_width=12)
ratein=Pmw.EntryField(g1.interior(),labelpos=W,label_text='Rate In:',
value=1.0000,entry_textvariable=samfacin,entry_width=12)
rateout=Pmw.EntryField(g1.interior(),labelpos=W,label_text='Rate Out:',

2
ptt.c
View File

@ -1,7 +1,7 @@
#include <windows.h>
#include <stdio.h>
int ptt_(int *nport, int *ntx, int *iptt)
int ptt_(int *nport, char *unused, int *ntx, int *iptt)
{
static HANDLE hFile;
static int open=0;

View File

@ -43,80 +43,6 @@
# include <fcntl.h>
#endif
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
#if (defined(__unix__) || defined(unix)) && !defined(USG)
# include <sys/param.h>
#endif
int fd; /* Used for both serial and parallel */
#ifdef USE_SERIAL
/* First cut, note that this only distinguishes Linux from BSDs,
* it will be done better later on using configure. N.B. that OSX
* will come up as BSD but I think this is also the right serial port
* for OSX. -db
*/
#if defined(BSD)
#define TTYNAME "/dev/cuad%d" /* Use non blocking form */
#else
#include <sys/io.h>
#define TTYNAME "/dev/ttyUSB%d"
#endif
/* Not quite right for size but '%d + 1' should be plenty enough -db */
/* As TTYNAME is a string, just at 20 chars do udevd is happier. */
/* E.g. USB serial ports appear as /dev/ttyUSB0 */
#define TTYNAME_SIZE sizeof(TTYNAME)+20
int
ptt_(int *nport, int *ntx, int *iptt)
{
/* Fixme, nport should be a sting and not a number */
static int nopen=0;
int control = TIOCM_RTS | TIOCM_DTR;
char s[TTYNAME_SIZE];
if(*nport < 0) {
*iptt=*ntx;
return(0);
}
if(*ntx && (!nopen)) {
snprintf(s, TTYNAME_SIZE, TTYNAME, (*nport) - 1); /* Comport 1 == dev 0 */
s[TTYNAME_SIZE] = '\0';
/* open the device */
printf("Opening %s\n", s);
if ((fd = open(s, O_RDWR | O_NDELAY)) < 0) {
fprintf(stderr, "Can't open %s.\n", s);
return(1);
}
nopen=1;
return(0);
}
if(*ntx && nopen) {
ioctl(fd, TIOCMBIS, &control); // Set DTR and RTS
*iptt=1;
}
else {
ioctl(fd, TIOCMBIC, &control);
close(fd);
*iptt=0;
nopen=0;
}
return(0);
}
#endif
#ifdef USE_PARALLEL
#ifdef HAVE_LINUX_PPDEV_H
# include <linux/ppdev.h>
# include <linux/parport.h>
@ -124,6 +50,10 @@ ptt_(int *nport, int *ntx, int *iptt)
#ifdef HAVE_DEV_PPBUS_PPI_H
# include <dev/ppbus/ppi.h>
# include <dev/ppbus/ppbconf.h>
int lp_reset (int fd);
int lp_ptt (int fd, int onoff);
#endif
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
@ -132,6 +62,108 @@ ptt_(int *nport, int *ntx, int *iptt)
# include <sys/param.h>
#endif
#ifndef BSD /* #ifdef LINUX ? */
#include <sys/io.h>
#endif
#include <string.h>
/* parport functions */
int dev_is_parport(const char *fname);
int ptt_parallel(int fd, int *ntx, int *iptt);
int ptt_serial(int fd, int *ntx, int *iptt);
int fd=-1; /* Used for both serial and parallel */
char nm[MAXPATHLEN];
/*
* ptt_
*
* generic unix PTT routine called from Fortran
*
* unused - Unused, to satisfy old windows calling convention
* ptt_port - device name serial or parallel
* ntx - pointer to fortran command on or off
* iptt - pointer to fortran command status on or off
*/
/* Tiny state machine */
#define STATE_PORT_CLOSED 0
#define STATE_PORT_OPEN_PARALLEL 1
#define STATE_PORT_OPEN_SERIAL 2
int
ptt_(int unused, char *ptt_port, int *ntx, int *iptt)
{
static int state=0;
char *p;
switch (state) {
case STATE_PORT_CLOSED:
if ((p = strchr(ptt_port, ' ')) != NULL)
*p = '\0';
if (p == NULL || *p == '\0') {
*iptt = *ntx;
return(0);
}
if ((fd = dev_is_parport(ptt_port)) > 0) {
state = STATE_PORT_OPEN_PARALLEL;
lp_reset(fd);
} else {
if ((fd = open(nm, O_RDWR | O_NDELAY)) < 0) {
fprintf(stderr, "Can't open %s.\n", nm);
return(1);
}
else
state = STATE_PORT_OPEN_SERIAL;
}
break;
case STATE_PORT_OPEN_PARALLEL:
ptt_parallel(fd, ntx, iptt);
break;
case STATE_PORT_OPEN_SERIAL:
ptt_serial(fd, ntx, iptt);
break;
default:
close(fd);
fd = -1;
state = STATE_PORT_CLOSED;
break;
}
return(0);
}
/*
* ptt_serial
*
* generic serial unix PTT routine called indirectly from Fortran
*
* fd - already opened file descriptor
* ntx - pointer to fortran command on or off
* iptt - pointer to fortran command status on or off
*/
int
ptt_serial(int fd, int *ntx, int *iptt)
{
int control = TIOCM_RTS | TIOCM_DTR;
if(*ntx) {
ioctl(fd, TIOCMBIS, &control); /* Set DTR and RTS */
*iptt = 1;
} else {
ioctl(fd, TIOCMBIC, &control);
*iptt = 0;
}
return(0);
}
/* parport functions */
int lp_reset (int fd);
@ -149,13 +181,11 @@ int lp_ptt (int fd, int onoff);
int
dev_is_parport(const char *fname)
{
char nm[MAXPATHLEN];
struct stat st;
int fd, m;
int fd;
snprintf(nm, sizeof(nm), "/dev/%s", fname);
m = snprintf(nm, sizeof(nm), "/dev/%s", fname);
if (m >= sizeof(nm))
return (-1);
if ((fd = open(nm, O_RDWR | O_NONBLOCK)) == -1)
return (-1);
if (fstat(fd, &st) == -1)
@ -175,14 +205,16 @@ out:
int
dev_is_parport(const char *fname)
{
char nm[MAXPATHLEN];
struct stat st;
unsigned char c;
int fd, m;
int fd;
char *p;
if ((p = strchr(fname, '/')) != NULL) /* Look for /dev */
snprintf(nm, sizeof(nm), "%s", fname);
else
snprintf(nm, sizeof(nm), "/dev/%s", fname);
m = snprintf(nm, sizeof(nm), "/dev/%s", fname);
if (m >= sizeof(nm))
return (-1);
if ((fd = open(nm, O_RDWR | O_NONBLOCK)) == -1)
return (-1);
if (fstat(fd, &st) == -1)
@ -275,7 +307,6 @@ lp_init (int fd)
{
fprintf(stderr, "Claiming parallel port %s", dev->desc);
debug ("HINT: did you unload the lp kernel module?");
debug ("HINT: perhaps there is another cwdaemon running?");
close (fd);
exit (1);
}
@ -341,47 +372,25 @@ lp_ptt (int fd, int onoff)
return 0;
}
/* XXX I am totally unsure of this, LPNAME should come from
* the WSJT.INI instead but for now this should work -- db
/*
* ptt_parallel
*
* generic parallel unix PTT routine called indirectly from Fortran
*
* fd - already opened file descriptor
* ntx - pointer to fortran command on or off
* iptt - pointer to fortran command status on or off
*/
#ifdef BSD
#define LPNAME "lpt%d"
#else
#define LPNAME "lp%d"
#endif
#define LPNAME_SIZE (sizeof(LPNAME))
int
ptt_(int *nport, int *ntx, int *iptt)
ptt_parallel(int fd, int *ntx, int *iptt)
{
static int nopen=0;
int fd;
char s[LPNAME_SIZE];
if(*nport < 0) {
*iptt=*ntx;
return(0);
}
if(*ntx && (!nopen)) {
snprintf(s, LPNAME_SIZE, LPNAME, (*nport) - 1); /* Comport 1 == dev 0 */
s[LPNAME_SIZE] = '\0';
if ((fd = dev_is_parport(s)) < 0) {
fprintf(stderr, "Can't use %s.", s);
return(1);
}
if(*ntx && nopen) {
lp_ptt(fd, 1);
*iptt=1;
} else {
lp_ptt(fd, 0);
close(fd);
*iptt=0;
nopen=0;
}
if(*ntx) {
lp_ptt(fd, 1);
*iptt=1;
} else {
lp_ptt(fd, 0);
*iptt=0;
}
return(0);
}
#endif

View File

@ -489,11 +489,21 @@ if g.cmap == "AFMHot":
#---------------------------------------------- Display GUI and start mainloop
draw_axis()
Audio.gcom1.ndevin=g.ndevin.get()
Audio.gcom1.ndevout=g.ndevout.get()
ndevin=g.ndevin.get()
ndevout=g.ndevout.get()
try:
ndevin=g.ndevin.get()
except:
ndevin=0
Audio.gcom1.ndevin=ndevin
try:
ndevout=g.ndevout.get()
except:
ndevout=0
Audio.gcom1.ndevout=ndevout
# Only valid for windows
# for now
Audio.audio_init(ndevin,ndevout) #Start the audio stream
ltime.after(200,update)
root.deiconify()

13
wsjt.py
View File

@ -1513,6 +1513,10 @@ def update():
Audio.gcom2.nport=int(options.ComPort.get())
except:
Audio.gcom2.nport=0
# print 'About to init Audio.gcom2.PttPort in save some parameters'
Audio.gcom2.pttport=(options.PttPort.get() + ' ')[:12]
# print Audio.gcom2.pttport
# Queue up the next update
ldate.after(100,update)
@ -2013,7 +2017,8 @@ try:
elif key == 'ComPort':
options.ComPort.set(value)
Audio.gcom2.nport=int(options.ComPort.get())
elif key == 'Mileskm': options.mileskm.set(value)
Audio.gcom2.pttport=(options.PttPort.get()+' ')[:12]
elif key == 'Mileskm': options.mileskm.set(value)
elif key == 'MsgStyle': options.ireport.set(value)
elif key == 'Region': options.iregion.set(value)
elif key == 'AudioIn':
@ -2111,12 +2116,12 @@ f.write("HisGrid " + t + "\n")
#f.write("RxDelay " + str(options.RxDelay.get()) + "\n")
#f.write("TxDelay " + str(options.TxDelay.get()) + "\n")
f.write("IDinterval " + str(options.IDinterval.get()) + "\n")
f.write("ComPort " + str(options.ComPort.get()) + "\n")
f.write("ComPort " + str(options.PttPort.get()) + "\n")
f.write("Mileskm " + str(options.mileskm.get()) + "\n")
f.write("MsgStyle " + str(options.ireport.get()) + "\n")
f.write("Region " + str(options.iregion.get()) + "\n")
f.write("AudioIn " + str(options.ndevin.get()) + "\n")
f.write("AudioOut " + str(options.ndevout.get()) + "\n")
f.write("AudioIn " + str(options.DevinName.get()) + "\n")
f.write("AudioOut " + str(options.DevoutName.get()) + "\n")
f.write("SamFacIn " + str(options.samfacin.get()) + "\n")
f.write("SamFacOut " + str(options.samfacout.get()) + "\n")
if options.Template6.get()=="": options.Template6.set("_")