Release the serial port used for PTT when possible

When  using  separate  serial port  for  PTT  via  RTS  pr DTR  it  is
convienent to close  the port when the PTT line  is not asserted. This
allows other applications to share the PTT serial port.

This has been  achieved by ensuring that file descriptor  for the port
is set to -1 when the port  is closed, this then allows the invalid FD
to be used as a PTT surrogate for the rig_get_ptt API when the port is
only being used for PTT.
Hamlib-3.1
Bill Somerville 2016-08-31 22:34:09 +01:00
rodzic 4e76780242
commit e44566e8a7
3 zmienionych plików z 84 dodań i 11 usunięć

Wyświetl plik

@ -425,9 +425,9 @@ static int dummy_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt)
// as if it had keyed us
switch (rig->state.pttport.type.ptt)
{
case RIG_PTT_SERIAL_DTR: ser_get_dtr (&rig->state.pttport, &status); break;
case RIG_PTT_SERIAL_RTS: ser_get_rts (&rig->state.pttport, &status); break;
case RIG_PTT_PARALLEL: par_ptt_get (&rig->state.pttport, &par_status); break;
case RIG_PTT_SERIAL_DTR: if (rig->state.pttport.fd >= 0) ser_get_dtr (&rig->state.pttport, &status); break;
case RIG_PTT_SERIAL_RTS: if (rig->state.pttport.fd >= 0) ser_get_rts (&rig->state.pttport, &status); break;
case RIG_PTT_PARALLEL: if (rig->state.pttport.fd >= 0) par_ptt_get (&rig->state.pttport, &par_status); break;
default: break;
}
*ptt = *ptt || status || RIG_PTT_ON == par_status;

Wyświetl plik

@ -309,6 +309,9 @@ RIG * HAMLIB_API rig_init(rig_model_t rig_model)
rs = &rig->state;
rs->rigport.fd = -1;
rs->pttport.fd = -1;
rs->pttport.fd = -1;
rs->comm_state = 0;
rs->rigport.type.rig = caps->port_type; /* default from caps */
@ -557,6 +560,7 @@ int HAMLIB_API rig_open(RIG *rig)
status = ser_set_rts(&rs->pttport, 0);
}
}
ser_close(&rs->pttport);
}
break;
case RIG_PTT_PARALLEL:
@ -1282,6 +1286,7 @@ int HAMLIB_API rig_get_vfo(RIG *rig, vfo_t *vfo)
int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt)
{
const struct rig_caps *caps;
struct rig_state * rs = &rig->state;
int retcode, rc2;
vfo_t curr_vfo;
@ -1321,10 +1326,56 @@ 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_OFF);
if (strcmp(rs->pttport.pathname, rs->rigport.pathname)
&& ptt!=RIG_PTT_OFF && rs->pttport.fd < 0)
{
rs->pttport.fd = ser_open(&rs->pttport);
if (rs->pttport.fd < 0)
{
rig_debug(RIG_DEBUG_ERR, "Cannot open PTT device \"%s\"\n",
rs->pttport.pathname);
return -RIG_EIO;
}
/* Needed on Linux because the serial port driver sets RTS/DTR
high on open - set both low since we offer no control of
the non-PTT line and low is better than high */
retcode = ser_set_rts(&rs->pttport, 0);
if (RIG_OK != retcode) return retcode;
}
retcode = ser_set_dtr(&rig->state.pttport, ptt!=RIG_PTT_OFF);
if (strcmp(rs->pttport.pathname, rs->rigport.pathname)
&& ptt==RIG_PTT_OFF)
{
/* free the port */
ser_close(&rs->pttport);
}
return retcode;
case RIG_PTT_SERIAL_RTS:
return ser_set_rts(&rig->state.pttport, ptt!=RIG_PTT_OFF);
if (strcmp(rs->pttport.pathname, rs->rigport.pathname)
&& ptt!=RIG_PTT_OFF && rs->pttport.fd < 0)
{
rs->pttport.fd = ser_open(&rs->pttport);
if (rs->pttport.fd < 0)
{
rig_debug(RIG_DEBUG_ERR, "Cannot open PTT device \"%s\"\n",
rs->pttport.pathname);
return -RIG_EIO;
}
/* Needed on Linux because the serial port driver sets RTS/DTR
high on open - set both low since we offer no control of
the non-PTT line and low is better than high */
retcode = ser_set_dtr(&rs->pttport, 0);
if (RIG_OK != retcode) return retcode;
}
retcode = ser_set_rts(&rig->state.pttport, ptt!=RIG_PTT_OFF);
if (strcmp(rs->pttport.pathname, rs->rigport.pathname)
&& ptt==RIG_PTT_OFF)
{
/* free the port */
ser_close(&rs->pttport);
}
return retcode;
case RIG_PTT_PARALLEL:
return par_ptt_set(&rig->state.pttport, ptt);
@ -1362,7 +1413,9 @@ 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, rc2, status;
struct rig_state * rs = &rig->state;
int retcode = RIG_OK;
int rc2, status;
vfo_t curr_vfo;
if (CHECK_RIG_ARG(rig) || !ptt)
@ -1403,16 +1456,34 @@ int HAMLIB_API rig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt)
if (caps->get_ptt)
return caps->get_ptt(rig, vfo, ptt);
retcode = ser_get_rts(&rig->state.pttport, &status);
*ptt = status ? RIG_PTT_ON : RIG_PTT_OFF;
if (strcmp(rs->pttport.pathname, rs->rigport.pathname)
&& rs->pttport.fd < 0)
{
/* port is closed so assume PTT off */
*ptt = RIG_PTT_OFF;
}
else
{
retcode = ser_get_rts(&rig->state.pttport, &status);
*ptt = status ? RIG_PTT_ON : RIG_PTT_OFF;
}
return retcode;
case RIG_PTT_SERIAL_DTR:
if (caps->get_ptt)
return caps->get_ptt(rig, vfo, ptt);
retcode = ser_get_dtr(&rig->state.pttport, &status);
*ptt = status ? RIG_PTT_ON : RIG_PTT_OFF;
if (strcmp(rs->pttport.pathname, rs->rigport.pathname)
&& rs->pttport.fd < 0)
{
/* port is closed so assume PTT off */
*ptt = RIG_PTT_OFF;
}
else
{
retcode = ser_get_dtr(&rig->state.pttport, &status);
*ptt = status ? RIG_PTT_ON : RIG_PTT_OFF;
}
return retcode;
case RIG_PTT_PARALLEL:

Wyświetl plik

@ -418,7 +418,9 @@ int ser_open(hamlib_port_t *p)
*/
int ser_close(hamlib_port_t *p)
{
return CLOSE(p->fd);
int rc = CLOSE(p->fd);
p->fd = -1;
return rc;
}
/**