kopia lustrzana https://github.com/Hamlib/Hamlib
* started some wider term control support (termios, termio, sgtty),
still not OK on win32 git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@385 7ae35d74-ebe9-4afe-98af-79ac388436b8Hamlib-1.1.1
rodzic
8c9880b0dd
commit
0f2d6fd179
119
src/serial.c
119
src/serial.c
|
@ -10,7 +10,7 @@
|
||||||
* packet softmodem written by Thomas Sailer, HB9JNX.
|
* packet softmodem written by Thomas Sailer, HB9JNX.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* $Id: serial.c,v 1.7 2001-02-11 23:16:07 f4cfe Exp $
|
* $Id: serial.c,v 1.8 2001-02-14 01:09:57 f4cfe Exp $
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -39,12 +39,25 @@
|
||||||
#include <unistd.h> /* UNIX standard function definitions */
|
#include <unistd.h> /* UNIX standard function definitions */
|
||||||
#include <fcntl.h> /* File control definitions */
|
#include <fcntl.h> /* File control definitions */
|
||||||
#include <errno.h> /* Error number definitions */
|
#include <errno.h> /* Error number definitions */
|
||||||
#include <termios.h> /* POSIX terminal control definitions */
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_TERMIOS_H
|
||||||
|
#include <termios.h> /* POSIX terminal control definitions */
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_TERMIO_H
|
||||||
|
#include <termio.h>
|
||||||
|
#else /* sgtty */
|
||||||
|
#include <sgtty.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __CYGWIN32__
|
||||||
|
/* include <winsock.h> for FIONREAD?? */
|
||||||
|
/* TODO: have a look in <winbase.h> for CTS/RTS and DTR/DSR control --SF */
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <hamlib/rig.h>
|
#include <hamlib/rig.h>
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
@ -74,9 +87,18 @@
|
||||||
int serial_open(struct rig_state *rs) {
|
int serial_open(struct rig_state *rs) {
|
||||||
|
|
||||||
int fd; /* File descriptor for the port */
|
int fd; /* File descriptor for the port */
|
||||||
struct termios options;
|
|
||||||
speed_t speed; /* serial comm speed */
|
speed_t speed; /* serial comm speed */
|
||||||
|
|
||||||
|
#ifdef HAVE_TERMIOS_H
|
||||||
|
struct termios options;
|
||||||
|
#elif defined(HAVE_TERMIO_H)
|
||||||
|
struct termio options;
|
||||||
|
#elif defined(HAVE_SGTTY_H)
|
||||||
|
struct sgttyb sg;
|
||||||
|
#else
|
||||||
|
#error "No term control supported!"
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!rs)
|
if (!rs)
|
||||||
return -RIG_EINVAL;
|
return -RIG_EINVAL;
|
||||||
|
|
||||||
|
@ -98,7 +120,13 @@ int serial_open(struct rig_state *rs) {
|
||||||
* Get the current options for the port...
|
* Get the current options for the port...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_TERMIOS_H
|
||||||
tcgetattr(fd, &options);
|
tcgetattr(fd, &options);
|
||||||
|
#elif defined(HAVE_TERMIO_H)
|
||||||
|
ioctl (fd, TCGETA, &options);
|
||||||
|
#else /* sgtty */
|
||||||
|
ioctl (fd, TIOCGETP, &sg);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the baud rates to requested values
|
* Set the baud rates to requested values
|
||||||
|
@ -135,6 +163,7 @@ int serial_open(struct rig_state *rs) {
|
||||||
close(fd);
|
close(fd);
|
||||||
return -RIG_ECONF;
|
return -RIG_ECONF;
|
||||||
}
|
}
|
||||||
|
/* TODO */
|
||||||
cfsetispeed(&options, speed);
|
cfsetispeed(&options, speed);
|
||||||
cfsetospeed(&options, speed);
|
cfsetospeed(&options, speed);
|
||||||
|
|
||||||
|
@ -243,6 +272,7 @@ int serial_open(struct rig_state *rs) {
|
||||||
* Choose raw input, no preprocessing please ..
|
* Choose raw input, no preprocessing please ..
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if defined(HAVE_TERMIOS_H) || defined(HAVE_TERMIO_H)
|
||||||
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
|
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -251,6 +281,11 @@ int serial_open(struct rig_state *rs) {
|
||||||
|
|
||||||
options.c_oflag &= ~OPOST;
|
options.c_oflag &= ~OPOST;
|
||||||
|
|
||||||
|
#else /* sgtty */
|
||||||
|
sg.sg_flags = RAW;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Flush serial port
|
* Flush serial port
|
||||||
*/
|
*/
|
||||||
|
@ -261,12 +296,29 @@ int serial_open(struct rig_state *rs) {
|
||||||
* Finally, set the new options for the port...
|
* Finally, set the new options for the port...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_TERMIOS_H
|
||||||
if (tcsetattr(fd, TCSANOW, &options) == -1) {
|
if (tcsetattr(fd, TCSANOW, &options) == -1) {
|
||||||
rig_debug(RIG_DEBUG_ERR, "open_serial: tcsetattr failed: %s\n",
|
rig_debug(RIG_DEBUG_ERR, "open_serial: tcsetattr failed: %s\n",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
close(fd);
|
close(fd);
|
||||||
return -RIG_ECONF; /* arg, so close! */
|
return -RIG_ECONF; /* arg, so close! */
|
||||||
}
|
}
|
||||||
|
#elif defined(HAVE_TERMIO_H)
|
||||||
|
if (ioctl(fd, TCSETA, &options) == -1) {
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "open_serial: ioctl(TCSETA) failed: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
close(fd);
|
||||||
|
return -RIG_ECONF; /* arg, so close! */
|
||||||
|
}
|
||||||
|
#else /* sgtty */
|
||||||
|
if (ioctl(fd, TIOCSETP, &sg) == -1) {
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "open_serial: ioctl(TIOCSETP) failed: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
close(fd);
|
||||||
|
return -RIG_ECONF; /* arg, so close! */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
rs->fd = fd;
|
rs->fd = fd;
|
||||||
|
|
||||||
|
@ -628,13 +680,13 @@ int ser_ptt_get(struct rig_state *rs, ptt_t *pttx)
|
||||||
*/
|
*/
|
||||||
int par_ptt_get(struct rig_state *rs, ptt_t *pttx)
|
int par_ptt_get(struct rig_state *rs, ptt_t *pttx)
|
||||||
{
|
{
|
||||||
int status;
|
|
||||||
|
|
||||||
switch(rs->ptt_type) {
|
switch(rs->ptt_type) {
|
||||||
#ifdef HAVE_LINUX_PPDEV_H
|
#ifdef HAVE_LINUX_PPDEV_H
|
||||||
case RIG_PTT_PARALLEL:
|
case RIG_PTT_PARALLEL:
|
||||||
{
|
{
|
||||||
unsigned char reg;
|
unsigned char reg;
|
||||||
|
int status;
|
||||||
|
|
||||||
status = ioctl(rs->ptt_fd, PPRDATA, ®);
|
status = ioctl(rs->ptt_fd, PPRDATA, ®);
|
||||||
*pttx = reg & 0x01 ? RIG_PTT_ON:RIG_PTT_OFF;
|
*pttx = reg & 0x01 ? RIG_PTT_ON:RIG_PTT_OFF;
|
||||||
|
@ -649,6 +701,65 @@ int par_ptt_get(struct rig_state *rs, ptt_t *pttx)
|
||||||
return RIG_OK;
|
return RIG_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This is a WIP */
|
||||||
|
|
||||||
|
#ifdef WANT_RIG_DCD
|
||||||
|
/*
|
||||||
|
* assumes dcdx not NULL
|
||||||
|
* REM: currently using state.ptt_fd. Should dcd_fd be opened instead?
|
||||||
|
*/
|
||||||
|
int ser_dcd_get(struct rig_state *rs, dcd_t *dcdx)
|
||||||
|
{
|
||||||
|
unsigned char y;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
switch(rs->dcd_type) {
|
||||||
|
case RIG_DCD_SERIAL_CTS:
|
||||||
|
status = ioctl(rs->ptt_fd, TIOCMGET, &y);
|
||||||
|
*dcdx = y & TIOCM_CTS ? RIG_DCD_ON:RIG_DCD_OFF;
|
||||||
|
return status;
|
||||||
|
|
||||||
|
case RIG_DCD_SERIAL_DSR:
|
||||||
|
return -RIG_ENIMPL;
|
||||||
|
status = ioctl(rs->ptt_fd, TIOCMGET, &y);
|
||||||
|
*dcdx = y & TIOCM_DSR ? RIG_DCD_ON:RIG_DCD_OFF;
|
||||||
|
return status;
|
||||||
|
|
||||||
|
default:
|
||||||
|
rig_debug(RIG_DEBUG_ERR,"Unsupported PTT type %d\n",
|
||||||
|
rs->dcd_type);
|
||||||
|
return -RIG_EINVAL;
|
||||||
|
}
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* assumes dcdx not NULL
|
||||||
|
* REM: currently using state.ptt_fd. Should dcd_fd be opened instead?
|
||||||
|
*/
|
||||||
|
int par_dcd_get(struct rig_state *rs, dcd_t *dcdx)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch(rs->dcd_type) {
|
||||||
|
#ifdef HAVE_LINUX_PPDEV_H
|
||||||
|
case RIG_PTT_PARALLEL:
|
||||||
|
{
|
||||||
|
unsigned char reg;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
status = ioctl(rs->ptt_fd, PPRDATA, ®);
|
||||||
|
*dcdx = reg & 0x01 ? RIG_PTT_ON:RIG_PTT_OFF;
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
rig_debug(RIG_DEBUG_ERR,"Unsupported PTT type %d\n",
|
||||||
|
rs->dcd_type);
|
||||||
|
return -RIG_ENAVAIL;
|
||||||
|
}
|
||||||
|
return RIG_OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int ser_ptt_close(struct rig_state *rs)
|
int ser_ptt_close(struct rig_state *rs)
|
||||||
{
|
{
|
||||||
|
|
Ładowanie…
Reference in New Issue