- misplaced indentation meant fortran copy of pttport never got set

- reworked ptt_unix.c numerous things I did not like anyway.
  removed gotos's (from original cwdaemon; not my fault!)
  commented better what was happening
  refactored code to make it clearer, there was no need to try and do
  both the open and the parallel port test in one function (cwdaemon again)
  this just obsfuscated what was happening.
 


git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/trunk@208 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Diane Bruce 2006-07-26 14:06:27 +00:00
parent 9621999d52
commit 7716b6fc31
2 changed files with 64 additions and 53 deletions

View File

@ -68,15 +68,13 @@ int lp_ptt (int fd, int onoff);
#include <string.h> #include <string.h>
/* parport functions */ /* parport functions */
int dev_is_parport(const char *fname); char *get_dev_name(char *fname);
int dev_is_parport(int fd);
int ptt_parallel(int fd, int *ntx, int *iptt); int ptt_parallel(int fd, int *ntx, int *iptt);
int ptt_serial(int fd, int *ntx, int *iptt); int ptt_serial(int fd, int *ntx, int *iptt);
int fd=-1; /* Used for both serial and parallel */ int fd=-1; /* Used for both serial and parallel */
char nm[MAXPATHLEN];
/* /*
* ptt_ * ptt_
* *
@ -101,26 +99,39 @@ ptt_(int *unused, char *ptt_port, int *ntx, int *iptt)
static int state=0; static int state=0;
char *p; char *p;
/* In the very unlikely event of a NULL pointer, just return.
* Yes, I realise this should not be possible in WSJT.
*/
if (ptt_port == NULL) {
*iptt = *ntx;
return (0);
}
switch (state) { switch (state) {
case STATE_PORT_CLOSED: case STATE_PORT_CLOSED:
/* Remove trailing ' ' */
if ((p = strchr(ptt_port, ' ')) != NULL) if ((p = strchr(ptt_port, ' ')) != NULL)
*p = '\0'; *p = '\0';
if (p == NULL || *p == '\0') {
/* If all that is left is a '\0' then also just return */
if (*ptt_port == '\0') {
*iptt = *ntx; *iptt = *ntx;
return(0); return(0);
} }
if ((fd = dev_is_parport(ptt_port)) > 0) { /* Get ptt_name back or ptt_name with "/dev/" prepended */
ptt_port = get_dev_name(ptt_port);
if ((fd = open(ptt_port, O_RDWR | O_NDELAY)) < 0) {
fprintf(stderr, "Can't open %s.\n", ptt_port);
return (1);
}
if (dev_is_parport(fd)) {
state = STATE_PORT_OPEN_PARALLEL; state = STATE_PORT_OPEN_PARALLEL;
lp_reset(fd); lp_reset(fd);
} else { } else
if ((fd = open(nm, O_RDWR | O_NDELAY)) < 0) { state = STATE_PORT_OPEN_SERIAL;
fprintf(stderr, "Can't open %s.\n", nm);
return(1);
}
else
state = STATE_PORT_OPEN_SERIAL;
}
break; break;
case STATE_PORT_OPEN_PARALLEL: case STATE_PORT_OPEN_PARALLEL:
@ -168,66 +179,66 @@ ptt_serial(int fd, int *ntx, int *iptt)
/* parport functions */ /* parport functions */
/*
* get_dev_name
*
* inputs - device name
* output - pointer to copy or original name or copy of original
* with "/dev/" prepended
* side effects - Uses local storage for result.
*/
char *
get_dev_name(char *fname)
{
static char nm[MAXPATHLEN];
if (strchr(fname, '/') != NULL)
strncpy(nm, fname, sizeof(nm)); /* Assume already has /dev/ */
else
snprintf(nm, sizeof(nm), "/dev/%s", fname);
return(fname);
}
/* /*
* dev_is_parport(name): check to see whether 'name' is a parallel * dev_is_parport(fd):
* port type character device. Returns non-zero if the device is *
* capable of use for a parallel port based keyer, and zero if it * inputs - Already open fd
* is not. Unfortunately, this is platform specific. * output - 1 if parallel port, 0 if not
* side effects - Unfortunately, this is platform specific.
*/ */
#if defined(HAVE_LINUX_PPDEV_H) /* Linux (ppdev) */ #if defined(HAVE_LINUX_PPDEV_H) /* Linux (ppdev) */
int int
dev_is_parport(const char *fname) dev_is_parport(int fd)
{ {
struct stat st; struct stat st;
int fd;
int m; int m;
snprintf(nm, sizeof(nm), "/dev/%s", fname); if ((fstat(fd, &st) == -1) ||
((st.st_mode & S_IFMT) != S_IFCHR) &&
(ioctl(fd, PPGETMODE, &m) == -1))
return(0);
if ((fd = open(nm, O_RDWR | O_NONBLOCK)) == -1) return(1);
return(-1);
if (fstat(fd, &st) == -1)
goto out;
if ((st.st_mode & S_IFMT) != S_IFCHR)
goto out;
if (ioctl(fd, PPGETMODE, &m) == -1)
goto out;
return(fd);
out:
close(fd);
return(-1);
} }
#elif defined(HAVE_DEV_PPBUS_PPI_H) /* FreeBSD (ppbus/ppi) */ #elif defined(HAVE_DEV_PPBUS_PPI_H) /* FreeBSD (ppbus/ppi) */
int int
dev_is_parport(const char *fname) dev_is_parport(int fd)
{ {
struct stat st; struct stat st;
unsigned char c; unsigned char c;
int fd;
char *p;
if ((p = strchr(fname, '/')) != NULL) /* Look for /dev */ if ((fstat(fd, &st) == -1) ||
snprintf(nm, sizeof(nm), "%s", fname); ((st.st_mode & S_IFMT) != S_IFCHR) &&
else (ioctl(fd, PPISSTATUS, &c) == -1))
snprintf(nm, sizeof(nm), "/dev/%s", fname); return(0);
if ((fd = open(nm, O_RDWR | O_NONBLOCK)) == -1) return(1);
return(-1);
if (fstat(fd, &st) == -1)
goto out;
if ((st.st_mode & S_IFMT) != S_IFCHR)
goto out;
if (ioctl(fd, PPISSTATUS, &c) == -1)
goto out;
return(fd);
out:
close(fd);
return(-1);
} }
#else /* Fallback (nothing) */ #else /* Fallback (nothing) */

View File

@ -2026,7 +2026,7 @@ try:
except: except:
options.PttPort.set("/dev/cuad0") options.PttPort.set("/dev/cuad0")
Audio.gcom2.nport=0 Audio.gcom2.nport=0
Audio.gcom2.pttport=(options.PttPort.get()+' ')[:12] Audio.gcom2.pttport=(options.PttPort.get()+' ')[:12]
elif key == 'Mileskm': options.mileskm.set(value) elif key == 'Mileskm': options.mileskm.set(value)
elif key == 'MsgStyle': options.ireport.set(value) elif key == 'MsgStyle': options.ireport.set(value)
elif key == 'Region': options.iregion.set(value) elif key == 'Region': options.iregion.set(value)