mirror of
https://github.com/3cky/mbusd.git
synced 2024-12-25 16:47:36 +01:00
Merge pull request #13 from aprsworld/master
add file based RS-485 direction control
This commit is contained in:
commit
fa5a950171
@ -48,6 +48,12 @@ Usage:
|
|||||||
-h Usage help.
|
-h Usage help.
|
||||||
-d Instruct mbusd not to fork itself (non-daemonize).
|
-d Instruct mbusd not to fork itself (non-daemonize).
|
||||||
-t Enable RTS RS-485 data direction control (if not disabled while compile).
|
-t Enable RTS RS-485 data direction control (if not disabled while compile).
|
||||||
|
-y file
|
||||||
|
Enable RS-485 direction data direction control by writing '1' to file
|
||||||
|
for transmitter enable and '0' to file for transmitter disable
|
||||||
|
-Y file
|
||||||
|
Enable RS-485 direction data direction control by writing '0' to file
|
||||||
|
for transmitter enable and '1' to file for transmitter disable
|
||||||
-v level
|
-v level
|
||||||
Specifies log verbosity level (0 for errors only, 1 for warnings
|
Specifies log verbosity level (0 for errors only, 1 for warnings
|
||||||
and 2 for also information messages.) If mbusd was compiled in debug mode,
|
and 2 for also information messages.) If mbusd was compiled in debug mode,
|
||||||
@ -107,6 +113,9 @@ Andrew Denysenko (<nitr0@seti.kr.ua>):
|
|||||||
- RTS RS-485 data direction control
|
- RTS RS-485 data direction control
|
||||||
- RTU response receiving by length
|
- RTU response receiving by length
|
||||||
|
|
||||||
|
James Jarvis (<jj@aprsworld.com>):
|
||||||
|
- file based RS-485 data direction control
|
||||||
|
|
||||||
License:
|
License:
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@ -6,6 +6,10 @@ mbusd \- MODBUS/TCP to MODBUS/RTU gateway.
|
|||||||
.RB [ -h ]
|
.RB [ -h ]
|
||||||
.RB [ -d ]
|
.RB [ -d ]
|
||||||
.RB [ -t ]
|
.RB [ -t ]
|
||||||
|
.RB [ -y
|
||||||
|
.IR file ]
|
||||||
|
.RB [ -Y
|
||||||
|
.IR file ]
|
||||||
.RB [ -v
|
.RB [ -v
|
||||||
.IR level ]
|
.IR level ]
|
||||||
.RB [ -L
|
.RB [ -L
|
||||||
@ -37,6 +41,12 @@ Usage help.
|
|||||||
Instruct \fImbusd\fR not to fork itself (non-daemonize).
|
Instruct \fImbusd\fR not to fork itself (non-daemonize).
|
||||||
.IP \fB-t\fR
|
.IP \fB-t\fR
|
||||||
Enable RTS RS-485 data direction control (if not disabled while compile).
|
Enable RTS RS-485 data direction control (if not disabled while compile).
|
||||||
|
.IP "\fB-y \fIfile\fR"
|
||||||
|
Enable RS-485 direction data direction control by writing '1' to file
|
||||||
|
for transmitter enable and '0' to file for transmitter disable
|
||||||
|
.IP "\fB-Y \fIfile\fR"
|
||||||
|
Enable RS-485 direction data direction control by writing '0' to file
|
||||||
|
for transmitter enable and '1' to file for transmitter disable
|
||||||
.IP "\fB-v \fIlevel\fR"
|
.IP "\fB-v \fIlevel\fR"
|
||||||
Specifies log verbosity level. 0 enables logging of errors only,
|
Specifies log verbosity level. 0 enables logging of errors only,
|
||||||
1 also enables warnings and 2 enables information messages.
|
1 also enables warnings and 2 enables information messages.
|
||||||
|
@ -54,8 +54,10 @@ typedef struct
|
|||||||
int ttyspeed;
|
int ttyspeed;
|
||||||
/* tty mode */
|
/* tty mode */
|
||||||
char *ttymode;
|
char *ttymode;
|
||||||
/* trx control type (0 - ADDC, 1 - by RTS) */
|
/* trx control type (0 - ADDC, 1 - by RTS, 2 - by sysfs GPIO with 1 activating transmit, 3 - by sysfs GPIO with 0 activating transmit) */
|
||||||
int trxcntl;
|
int trxcntl;
|
||||||
|
/* trx control sysfs file */
|
||||||
|
char trxcntl_file[INTBUFSIZE + 1];
|
||||||
/* TCP server port number */
|
/* TCP server port number */
|
||||||
int serverport;
|
int serverport;
|
||||||
/* maximum number of connections */
|
/* maximum number of connections */
|
||||||
|
@ -248,7 +248,7 @@ conn_write(int d, void *buf, size_t nbytes, int istty)
|
|||||||
long delay;
|
long delay;
|
||||||
#ifdef TRXCTL
|
#ifdef TRXCTL
|
||||||
if (istty) {
|
if (istty) {
|
||||||
if (cfg.trxcntl == TRX_RTS)
|
if (cfg.trxcntl != TRX_ADDC )
|
||||||
tty_set_rts(d);
|
tty_set_rts(d);
|
||||||
usleep(35000000l/cfg.ttyspeed);
|
usleep(35000000l/cfg.ttyspeed);
|
||||||
}
|
}
|
||||||
@ -278,7 +278,7 @@ conn_write(int d, void *buf, size_t nbytes, int istty)
|
|||||||
usleep(delay);
|
usleep(delay);
|
||||||
#endif
|
#endif
|
||||||
/* tcdrain(d); - hangs sometimes, so make calculated delay */
|
/* tcdrain(d); - hangs sometimes, so make calculated delay */
|
||||||
if (cfg.trxcntl == TRX_RTS) {
|
if (cfg.trxcntl != TRX_ADDC ) {
|
||||||
tty_clr_rts(d);
|
tty_clr_rts(d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
16
src/main.c
16
src/main.c
@ -104,7 +104,7 @@ usage(char *exename)
|
|||||||
"Andrew Denysenko <nitr0@seti.kr.ua>\n\n"
|
"Andrew Denysenko <nitr0@seti.kr.ua>\n\n"
|
||||||
"Usage: %s [-h] [-d] "
|
"Usage: %s [-h] [-d] "
|
||||||
#ifdef TRXCTL
|
#ifdef TRXCTL
|
||||||
"[-t] "
|
"[-t] [-y sysfsfile] [-Y sysfsfile]\n"
|
||||||
#endif
|
#endif
|
||||||
"[-v level] [-L logfile] [-p device] [-s speed] [-m mode] [-P port]\n"
|
"[-v level] [-L logfile] [-p device] [-s speed] [-m mode] [-P port]\n"
|
||||||
" [-C maxconn] [-N retries] [-R pause] [-W wait] [-T timeout]\n\n"
|
" [-C maxconn] [-N retries] [-R pause] [-W wait] [-T timeout]\n\n"
|
||||||
@ -112,7 +112,9 @@ usage(char *exename)
|
|||||||
" -h : this help\n"
|
" -h : this help\n"
|
||||||
" -d : don't daemonize\n"
|
" -d : don't daemonize\n"
|
||||||
#ifdef TRXCTL
|
#ifdef TRXCTL
|
||||||
" -t : enable RTS RS-485 data direction control\n"
|
" -t : enable RTS RS-485 data direction control using RTS\n"
|
||||||
|
" -y : enable RTS RS-485 data direction control using sysfs file, active transmit\n"
|
||||||
|
" -Y : enable RTS RS-485 data direction control using sysfs file, active receive\n"
|
||||||
#endif
|
#endif
|
||||||
#ifdef LOG
|
#ifdef LOG
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -165,7 +167,7 @@ main(int argc, char *argv[])
|
|||||||
while ((rc = getopt(argc, argv,
|
while ((rc = getopt(argc, argv,
|
||||||
"dh"
|
"dh"
|
||||||
#ifdef TRXCTL
|
#ifdef TRXCTL
|
||||||
"t"
|
"ty:Y:"
|
||||||
#endif
|
#endif
|
||||||
#ifdef LOG
|
#ifdef LOG
|
||||||
"v:L:"
|
"v:L:"
|
||||||
@ -183,6 +185,14 @@ main(int argc, char *argv[])
|
|||||||
case 't':
|
case 't':
|
||||||
cfg.trxcntl = TRX_RTS;
|
cfg.trxcntl = TRX_RTS;
|
||||||
break;
|
break;
|
||||||
|
case 'y':
|
||||||
|
cfg.trxcntl = TRX_SYSFS_1;
|
||||||
|
strncpy(cfg.trxcntl_file, optarg, INTBUFSIZE);
|
||||||
|
break;
|
||||||
|
case 'Y':
|
||||||
|
cfg.trxcntl = TRX_SYSFS_0;
|
||||||
|
strncpy(cfg.trxcntl_file, optarg, INTBUFSIZE);
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef LOG
|
#ifdef LOG
|
||||||
case 'v':
|
case 'v':
|
||||||
|
24
src/tty.c
24
src/tty.c
@ -362,20 +362,44 @@ tty_close(ttydata_t *mod)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TRXCTL
|
#ifdef TRXCTL
|
||||||
|
void sysfs_gpio_set(char *filename, char *value) {
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = open(filename, O_WRONLY);
|
||||||
|
/* write first byte. Should only be 0 or 1 */
|
||||||
|
write(fd, value, 1);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
logw(9, "tty: sysfs_gpio_set(%s,%s)\n",filename,value);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* Set RTS line to active state */
|
/* Set RTS line to active state */
|
||||||
void
|
void
|
||||||
tty_set_rts(int fd)
|
tty_set_rts(int fd)
|
||||||
{
|
{
|
||||||
|
if ( TRX_RTS == cfg.trxcntl ) {
|
||||||
int mstat = TIOCM_RTS;
|
int mstat = TIOCM_RTS;
|
||||||
ioctl(fd, TIOCMBIS, &mstat);
|
ioctl(fd, TIOCMBIS, &mstat);
|
||||||
|
} else if ( TRX_SYSFS_1 == cfg.trxcntl) {
|
||||||
|
sysfs_gpio_set(cfg.trxcntl_file,"1");
|
||||||
|
} else if ( TRX_SYSFS_0 == cfg.trxcntl) {
|
||||||
|
sysfs_gpio_set(cfg.trxcntl_file,"0");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set RTS line to passive state */
|
/* Set RTS line to passive state */
|
||||||
void
|
void
|
||||||
tty_clr_rts(int fd)
|
tty_clr_rts(int fd)
|
||||||
{
|
{
|
||||||
|
if ( TRX_RTS == cfg.trxcntl ) {
|
||||||
int mstat = TIOCM_RTS;
|
int mstat = TIOCM_RTS;
|
||||||
ioctl(fd, TIOCMBIC, &mstat);
|
ioctl(fd, TIOCMBIC, &mstat);
|
||||||
|
} else if ( TRX_SYSFS_1 == cfg.trxcntl) {
|
||||||
|
sysfs_gpio_set(cfg.trxcntl_file,"0");
|
||||||
|
} else if ( TRX_SYSFS_0 == cfg.trxcntl) {
|
||||||
|
sysfs_gpio_set(cfg.trxcntl_file,"1");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -69,6 +69,8 @@
|
|||||||
#ifdef TRXCTL
|
#ifdef TRXCTL
|
||||||
#define TRX_ADDC 0
|
#define TRX_ADDC 0
|
||||||
#define TRX_RTS 1
|
#define TRX_RTS 1
|
||||||
|
#define TRX_SYSFS_1 2
|
||||||
|
#define TRX_SYSFS_0 3
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -89,7 +91,7 @@ typedef struct
|
|||||||
int speed; /* serial port speed */
|
int speed; /* serial port speed */
|
||||||
char *port; /* serial port device name */
|
char *port; /* serial port device name */
|
||||||
#ifdef TRXCTL
|
#ifdef TRXCTL
|
||||||
int trxcntl; /* trx control type (0 - Automatic Data Direction Control (ADDC), 1 - by RTS) */
|
int trxcntl; /* trx control type (enum - see values in config.h) */
|
||||||
#endif
|
#endif
|
||||||
struct termios tios; /* working termios structure */
|
struct termios tios; /* working termios structure */
|
||||||
struct termios savedtios; /* saved termios structure */
|
struct termios savedtios; /* saved termios structure */
|
||||||
|
Loading…
Reference in New Issue
Block a user