View Single Post
  #5   Report Post  
Old January 26th 04, 11:15 PM
S. Sampson
 
Posts: n/a
Default

The rigblaster just uses the DTR and RTS signals of a serial port.

Here's some code I wrote in Linux to play with mine. It basically
just changes the state of the DTR and RTS signals.

Steve

"Jack Twilley" wrote

I've looked over the West Mountain website and I can't see anything
about how to make the RigBlaster run on FreeBSD. It's something I'd
need to know before buying one, obviously. Anyone here have any
experience with something like this?


/*
* repeater.c
*
* This module controls the RTS pin 5 signal of the DB-25,
* or pin 7 of the DB-9 connector, and the DCD pin 8 of the
* DB-25, or pin 1 of the DB-9.
*
* The RTS signal is used to control the Push-To-Talk (PTT),
* and the DCD signal is used to detect the Carrier Operated
* Squelch (COS) of a Radio Repeater.
*
* Tested with Red Hat Linux 6.2 (Kernel 2.2.14)
*
* Compile with: cc -O -s repeater.c -o repeater
*/

/* Includes */

#include stdio.h
#include unistd.h
#include fcntl.h
#include sys/ioctl.h /* TIO stuff in bits/ioctl.h and asm/ioctl.h */
#include sys/time.h
#include sys/types.h
#include termios.h
#include errno.h
#include string.h
#include signal.h

/* Defines */

typedef unsigned char BYTE;

#define FALSE (0)
#define TRUE (!FALSE)

/* Globals */

int fd;
int terminate = FALSE;
int port_signal;
int state_tx;
char portname[16];

/* Subroutines */

void intHandler(int signum)
{
terminate = TRUE;
}

void killHandler(int signum)
{
exit(0);
}

/*
* Wait up to sec seconds for file descriptor fd
* to become readable
*
* if sec is 0, returns immediately
*
* returns:
*
* 0 if descriptor is readable
* 0 if error (errno set by select())
* == 0 if timeout
*/

int timeout(int fd, int sec)
{
struct timeval tv;
fd_set rset;

FD_ZERO(&rset);
FD_SET(fd, &rset);

tv.tv_sec = sec;
tv.tv_usec = 0;

return (select(fd+1, &rset, NULL, NULL, &tv));
}

/* Main Program */

int main(int argc, char **argv)
{
struct timeval tv;
int port;
pid_t pid;

if (argc != 2)
{
fprintf(stderr, "Usage: repeater port\n");
fprintf(stderr, "Where ports 1 through 4 are valid\n");
exit(1);
}

port = atoi(argv[1]) - 1;

if (port 0 || port 3)
{
fprintf(stderr, "Valid ports are 1 through 4\n");
exit(2);
}

sprintf(portname, "/dev/ttyS%d", port);

if ((fd = open(portname, O_RDWR | O_NONBLOCK)) 0)
{
perror(portname);
exit(3);
}

/*
* Don't need these anymore
*/

close(0);close(1);close(2);

port_signal = TIOCM_RTS;

/*
* Bail out on Terminate Signal (kill -15)
*/

signal(SIGTERM, intHandler);

/*
* Daemonize
*/

if ((pid = fork()) 0) /* Error */
{
perror("daemonize");
exit(5);
}

if (pid != 0) {
/*
* Parent Process, so Exit
*/

exit(0);
}

/*
* Child process continues
*
* Fork a second time into control and timer
*/

if ((pid = fork()) 0) /* Error */
{
perror("repeater fork");
exit(6);
}

if (pid == 0) /* Child Process */
{
/*
* Timer process
*
* Set 9 minute, 3 minute, and 30 sec timers
*/

strcpy(argv[0], "Repeater Timer");

signal(SIGTERM, killHandler);

for (;
{
}
}

if (pid != 0 ) /* Parent Process */
{
/*
* While the COS signal on the DCD line is true
* enable the PTT signal on the RTS line.
*/

strcpy(argv[0], "Repeater Control");

for (;
{
int status;

if (terminate) {
state_tx = 0;
ioctl(fd, TIOCMBIC, &port_signal); /* clear */
kill(pid, SIGTERM);
sleep(1);
close(fd);
exit(0);
}

ioctl(fd, TIOCMGET, &status); /* get Modem bits */

if ((status & TIOCM_CAR) && !state_tx)
{
state_tx = 1;
ioctl(fd, TIOCMBIS, &port_signal); /* set */
}

if (!(status & TIOCM_CAR) && state_tx)
{
state_tx = 0;
ioctl(fd, TIOCMBIC, &port_signal); /* clear */
}
}
}
}
/* EOF */