diff --git a/icom/optoscan.c b/icom/optoscan.c index 459320a1e..95ee911a7 100644 --- a/icom/optoscan.c +++ b/icom/optoscan.c @@ -2,7 +2,7 @@ * Hamlib CI-V backend - OptoScan extensions * Copyright (c) 2000-2004 by Stephane Fillod * - * $Id: optoscan.c,v 1.11 2004-09-26 08:35:03 fillods Exp $ + * $Id: optoscan.c,v 1.12 2004-10-02 20:18:16 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -595,7 +595,7 @@ int optoscan_scan(RIG *rig, vfo_t vfo, scan_t scan, int ch) optoscan_wait_timer(rig,state); /*Step 5*/ - ser_get_dcd(&rs->rigport,&pin_state); + ser_get_car(&rs->rigport,&pin_state); if( pin_state ) /*Step 6*/ { return RIG_OK; /* we've broken squelch - return(). caller can */ diff --git a/src/rig.c b/src/rig.c index 8ba999259..805aed908 100644 --- a/src/rig.c +++ b/src/rig.c @@ -2,7 +2,7 @@ * Hamlib Interface - main file * Copyright (c) 2000-2004 by Stephane Fillod and Frank Singleton * - * $Id: rig.c,v 1.81 2004-10-02 10:32:08 fillods Exp $ + * $Id: rig.c,v 1.82 2004-10-02 20:18:16 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -1137,12 +1137,13 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) break; case RIG_PTT_SERIAL_DTR: + return ser_set_dtr(&rig->state.pttport, ptt==RIG_PTT_ON); + case RIG_PTT_SERIAL_RTS: - ser_ptt_set(&rig->state.pttport, ptt); - break; + return ser_set_rts(&rig->state.pttport, ptt==RIG_PTT_ON); + case RIG_PTT_PARALLEL: - par_ptt_set(&rig->state.pttport, ptt); - break; + return par_ptt_set(&rig->state.pttport, ptt); case RIG_PTT_NONE: return -RIG_ENAVAIL; /* not available */ @@ -1170,7 +1171,7 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) int HAMLIB_API rig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) { const struct rig_caps *caps; - int retcode; + int retcode, status; vfo_t curr_vfo; if (CHECK_RIG_ARG(rig) || !ptt) @@ -1201,12 +1202,17 @@ int HAMLIB_API rig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) break; case RIG_PTT_SERIAL_RTS: + retcode = ser_get_rts(&rig->state.pttport, &status); + *ptt = status ? RIG_PTT_ON : RIG_PTT_OFF; + return retcode; + case RIG_PTT_SERIAL_DTR: - ser_ptt_get(&rig->state.pttport, ptt); - break; + retcode = ser_get_dtr(&rig->state.pttport, &status); + *ptt = status ? RIG_PTT_ON : RIG_PTT_OFF; + return retcode; + case RIG_PTT_PARALLEL: - par_ptt_get(&rig->state.pttport, ptt); - break; + return par_ptt_get(&rig->state.pttport, ptt); case RIG_PTT_NONE: return -RIG_ENAVAIL; /* not available */ @@ -1234,7 +1240,7 @@ int HAMLIB_API rig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) int HAMLIB_API rig_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd) { const struct rig_caps *caps; - int retcode; + int retcode, status; vfo_t curr_vfo; if (CHECK_RIG_ARG(rig) || !dcd) @@ -1265,13 +1271,23 @@ int HAMLIB_API rig_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd) break; case RIG_DCD_SERIAL_CTS: + retcode = ser_get_cts(&rig->state.dcdport, &status); + *dcd = status ? RIG_DCD_ON : RIG_DCD_OFF; + return retcode; + case RIG_DCD_SERIAL_DSR: + retcode = ser_get_dsr(&rig->state.dcdport, &status); + *dcd = status ? RIG_DCD_ON : RIG_DCD_OFF; + return retcode; + case RIG_DCD_SERIAL_CAR: - ser_dcd_get(&rig->state.dcdport, dcd); - break; + retcode = ser_get_car(&rig->state.dcdport, &status); + *dcd = status ? RIG_DCD_ON : RIG_DCD_OFF; + return retcode; + + case RIG_DCD_PARALLEL: - par_dcd_get(&rig->state.dcdport, dcd); - break; + return par_dcd_get(&rig->state.dcdport, dcd); case RIG_DCD_NONE: return -RIG_ENAVAIL; /* not available */ diff --git a/src/serial.c b/src/serial.c index dcc3af18e..7ce01bfeb 100644 --- a/src/serial.c +++ b/src/serial.c @@ -4,7 +4,7 @@ * Parts of the PTT handling are derived from soundmodem, an excellent * ham packet softmodem written by Thomas Sailer, HB9JNX. * - * $Id: serial.c,v 1.41 2004-10-02 10:32:08 fillods Exp $ + * $Id: serial.c,v 1.42 2004-10-02 20:18:16 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -414,7 +414,8 @@ int HAMLIB_API ser_set_rts(port_t *p, int state) unsigned int y = TIOCM_RTS; #if defined(TIOCMBIS) && defined(TIOCMBIC) - return IOCTL(p->fd, state ? TIOCMBIS : TIOCMBIC, &y); + return IOCTL(p->fd, state ? TIOCMBIS : TIOCMBIC, &y) < 0 ? + -RIG_EIO : RIG_OK; #else if (IOCTL(p->fd, TIOCMGET, &y) < 0) { return -RIG_EIO; @@ -423,7 +424,7 @@ int HAMLIB_API ser_set_rts(port_t *p, int state) y |= TIOCM_RTS; else y &= ~TIOCM_RTS; - return IOCTL(p->fd, TIOCMSET, &y); + return IOCTL(p->fd, TIOCMSET, &y) < 0 ? -RIG_EIO : RIG_OK; #endif } @@ -433,11 +434,13 @@ int HAMLIB_API ser_set_rts(port_t *p, int state) */ int HAMLIB_API ser_get_rts(port_t *p, int *state) { - int status; + int retcode; unsigned int y; - status = IOCTL(p->fd, TIOCMGET, &y); - *state = (y & TIOCM_RTS) ? RIG_PTT_ON:RIG_PTT_OFF; - return RIG_OK; + + retcode = IOCTL(p->fd, TIOCMGET, &y); + *state = (y & TIOCM_RTS) == TIOCM_RTS; + + return retcode < 0 ? -RIG_EIO : RIG_OK; } int HAMLIB_API ser_set_dtr(port_t *p, int state) @@ -445,7 +448,8 @@ int HAMLIB_API ser_set_dtr(port_t *p, int state) unsigned int y = TIOCM_DTR; #if defined(TIOCMBIS) && defined(TIOCMBIC) - return IOCTL(p->fd, state ? TIOCMBIS : TIOCMBIC, &y); + return IOCTL(p->fd, state ? TIOCMBIS : TIOCMBIC, &y) < 0 ? + -RIG_EIO : RIG_OK; #else if (IOCTL(p->fd, TIOCMGET, &y) < 0) { return -RIG_EIO; @@ -454,23 +458,26 @@ int HAMLIB_API ser_set_dtr(port_t *p, int state) y |= TIOCM_DTR; else y &= ~TIOCM_DTR; - return IOCTL(p->fd, TIOCMSET, &y); + return IOCTL(p->fd, TIOCMSET, &y) < 0 ? -RIG_EIO : RIG_OK; #endif } int HAMLIB_API ser_get_dtr(port_t *p, int *state) { - int status; + int retcode; unsigned int y; - status = IOCTL(p->fd, TIOCMGET, &y); - *state = (y & TIOCM_DTR) ? RIG_PTT_ON:RIG_PTT_OFF; - return status; + + retcode = IOCTL(p->fd, TIOCMGET, &y); + *state = (y & TIOCM_DTR) == TIOCM_DTR; + + return retcode < 0 ? -RIG_EIO : RIG_OK; } int HAMLIB_API ser_set_brk(port_t *p, int state) { #if defined(TIOCSBRK) && defined(TIOCCBRK) - return IOCTL(p->fd, state ? TIOCSBRK : TIOCCBRK, 0 ); + return IOCTL(p->fd, state ? TIOCSBRK : TIOCCBRK, 0 ) < 0 ? + -RIG_EIO : RIG_OK; #else return -RIG_ENIMPL; #endif @@ -480,87 +487,37 @@ int HAMLIB_API ser_set_brk(port_t *p, int state) * assumes state not NULL * p is supposed to be &rig->state.rigport */ -int HAMLIB_API ser_get_dcd(port_t *p, int *state) +int HAMLIB_API ser_get_car(port_t *p, int *state) { - int status; + int retcode; unsigned int y; - status = IOCTL(p->fd, TIOCMGET, &y); - *state = (y & TIOCM_CAR) ? RIG_DCD_ON:RIG_DCD_OFF; - return RIG_OK; + + retcode = IOCTL(p->fd, TIOCMGET, &y); + *state = (y & TIOCM_CAR) == TIOCM_CAR; + + return retcode < 0 ? -RIG_EIO : RIG_OK; } -/* - * p is supposed to be &rig->state.pttport - */ -int ser_ptt_set(port_t *p, ptt_t pttx) +int HAMLIB_API ser_get_cts(port_t *p, int *state) { - switch(p->type.ptt) { - case RIG_PTT_SERIAL_RTS: - return ser_set_rts(p, pttx==RIG_PTT_ON); - case RIG_PTT_SERIAL_DTR: - return ser_set_dtr(p, pttx==RIG_PTT_ON); - default: - rig_debug(RIG_DEBUG_ERR,"Unsupported PTT type %d\n", - p->type.ptt); - return -RIG_EINVAL; - } - return RIG_OK; + int retcode; + unsigned int y; + + retcode = IOCTL(p->fd, TIOCMGET, &y); + *state = (y & TIOCM_CTS) == TIOCM_CTS; + + return retcode < 0 ? -RIG_EIO : RIG_OK; } -/* - * assumes pttx not NULL - */ -int ser_ptt_get(port_t *p, ptt_t *pttx) +int HAMLIB_API ser_get_dsr(port_t *p, int *state) { + int retcode; + unsigned int y; - switch(p->type.ptt) { - case RIG_PTT_SERIAL_RTS: - return ser_get_rts(p, &pttx); - case RIG_PTT_SERIAL_DTR: - return ser_get_dtr(p, &pttx); - default: - rig_debug(RIG_DEBUG_ERR,"Unsupported PTT type %d\n", - p->type.ptt); - return -RIG_EINVAL; - } - return RIG_OK; -} + retcode = IOCTL(p->fd, TIOCMGET, &y); + *state = (y & TIOCM_DSR) == TIOCM_DSR; -/* - * assumes dcdx not NULL - * p is supposed to be &rig->state.dcdport - */ -int ser_dcd_get(port_t *p, dcd_t *dcdx) -{ - - switch(p->type.dcd) { - case RIG_DCD_SERIAL_CTS: - { - unsigned int y; - int status; - - status = IOCTL(p->fd, TIOCMGET, &y); - *dcdx = y & TIOCM_CTS ? RIG_DCD_ON:RIG_DCD_OFF; - return status; - } - - case RIG_DCD_SERIAL_DSR: - { - unsigned int y; - int status; - - status = IOCTL(p->fd, TIOCMGET, &y); - *dcdx = y & TIOCM_DSR ? RIG_DCD_ON:RIG_DCD_OFF; - return status; - } - case RIG_DCD_SERIAL_CAR: - return ser_get_dcd(p, &dcdx); - default: - rig_debug(RIG_DEBUG_ERR,"Unsupported DCD type %d\n", - p->type.dcd); - return -RIG_EINVAL; - } - return RIG_OK; + return retcode < 0 ? -RIG_EIO : RIG_OK; } diff --git a/src/serial.h b/src/serial.h index 9536dc148..3026b9d95 100644 --- a/src/serial.h +++ b/src/serial.h @@ -2,7 +2,7 @@ * Hamlib Interface - serial communication header * Copyright (c) 2000-2004 by Stephane Fillod and Frank Singleton * - * $Id: serial.h,v 1.24 2004-10-02 10:32:09 fillods Exp $ + * $Id: serial.h,v 1.25 2004-10-02 20:18:16 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -35,15 +35,14 @@ extern HAMLIB_EXPORT(int) serial_flush(port_t *p); /* Hamlib internal use, see rig.c */ int ser_open(port_t *p); int ser_close(port_t *p); -int ser_ptt_set(port_t *p, ptt_t pttx); -int ser_ptt_get(port_t *p, ptt_t *pttx); -int ser_dcd_get(port_t *p, dcd_t *dcdx); extern HAMLIB_EXPORT(int) ser_set_rts(port_t *p, int state); extern HAMLIB_EXPORT(int) ser_get_rts(port_t *p, int *state); extern HAMLIB_EXPORT(int) ser_set_brk(port_t *p, int state); extern HAMLIB_EXPORT(int) ser_set_dtr(port_t *p, int state); extern HAMLIB_EXPORT(int) ser_get_dtr(port_t *p, int *state); -extern HAMLIB_EXPORT(int) ser_get_dcd(port_t *p, int *state); +extern HAMLIB_EXPORT(int) ser_get_cts(port_t *p, int *state); +extern HAMLIB_EXPORT(int) ser_get_dsr(port_t *p, int *state); +extern HAMLIB_EXPORT(int) ser_get_car(port_t *p, int *state); int par_open(port_t *p); int par_close(port_t *p); int par_ptt_set(port_t *p, ptt_t pttx);