Hi all, I saw somebody use a keyer interface with TRlog which has a connector for the manipulator itself, to make a "software" automatic key(pins 12 and 13 on the parallel port), and decided to try to do something similar with cwdaemon(0.5). The I/O port programming HOWTO seems to be pretty clear(I happened to have a 1998 book lying at my feet at the moment), although some of the things I just cannot understand there(why did I have to use != instead of == ?). Besides, I'm a very poor C programmer(and not even really a HAM yet), so maybe this is more of a suggestion than solution(also, I don't know if anyone used something similar for the serial port, so I just made a dummy function to prevent it from segfaulting); although it seems to work somehow. Anyways, (please excuse me if this is the wrong place to send it) the patch for cwdaemon-0.5 is attached, just to show what I meant(I'm not exactly sure how to do this with 0.6beta1).
diff -u -r cwdaemon-0.5/cwdaemon.c cwdaemon-0.5-mod/cwdaemon.c --- cwdaemon-0.5/cwdaemon.c 2003-05-19 10:58:40.000000000 -0600 +++ cwdaemon-0.5-mod/cwdaemon.c 2003-07-19 16:02:10.000000000 -0600 @@ -54,6 +54,8 @@ unsigned int ptt_delay = 0; /* default = off*/ int ptt_timer_running = 0; +int keyer_data; /* status of the automatic keyer */ + struct timeval now,end,left; #define MAXMORSE 4000 @@ -125,6 +127,7 @@ init : ttys_init, free : ttys_free, reset : ttys_reset, + status : ttys_status, cw_on : ttys_cw_on, cw_off : ttys_cw_off, ptt_on : ttys_ptt_on, @@ -138,6 +141,7 @@ init : lp_init, free : lp_free, reset : lp_reset, + status : lp_status, cw_on : lp_cw_on, cw_off : lp_cw_off, ptt_on : lp_ptt_on, @@ -900,6 +904,27 @@ while (1) { udelay (1000); /*prevent 100% CPU */ + + keyer_data = cwdev->status(cwdev); + if (keyer_data == 13) /* dash */ + { + debug("dash"); + playbeep(dash); + udelay (eldelay / morse_speed); /* delay after the element */ + continue; /* don't let cwdaemon do anything else if the key is still in use */ + } + else + { + if (keyer_data == 12) /* dot */ + { + debug("dot"); + playbeep(dot); + udelay (eldelay / morse_speed); /* delay after the element */ + continue; /* don't let cwdaemon do anything else if the key is still in use */ + } + } + + if (recv_code ()) playmorsestring (morsetext); /* check for ptt off timer */ diff -u -r cwdaemon-0.5/cwdaemon.h cwdaemon-0.5-mod/cwdaemon.h --- cwdaemon-0.5/cwdaemon.h 2003-05-05 14:09:41.000000000 -0600 +++ cwdaemon-0.5-mod/cwdaemon.h 2003-07-19 16:08:33.000000000 -0600 @@ -90,6 +90,7 @@ int (*init)(struct cwdev_s *); int (*free)(struct cwdev_s *); int (*reset)(struct cwdev_s *); + int (*status)(struct cwdev_s *); int (*cw_on)(struct cwdev_s *); int (*cw_off)(struct cwdev_s *); int (*ptt_on)(struct cwdev_s *); @@ -108,6 +109,7 @@ int lp_init(cwdevice *dev); int lp_free(cwdevice *dev); int lp_reset(cwdevice *dev); +int lp_status(cwdevice *dev); int lp_cw_on(cwdevice *dev); int lp_cw_off(cwdevice *dev); int lp_ptt_on(cwdevice *dev); @@ -120,6 +122,7 @@ int ttys_init(cwdevice *dev); int ttys_free(cwdevice *dev); int ttys_reset(cwdevice *dev); +int ttys_status(cwdevice *dev); int ttys_cw_on(cwdevice *dev); int ttys_cw_off(cwdevice *dev); int ttys_ptt_on(cwdevice *dev); diff -u -r cwdaemon-0.5/lp.c cwdaemon-0.5-mod/lp.c --- cwdaemon-0.5/lp.c 2003-05-05 14:09:41.000000000 -0600 +++ cwdaemon-0.5-mod/lp.c 2003-07-19 16:11:31.000000000 -0600 @@ -3,6 +3,29 @@ /* LP functions */ +int lp_status(cwdevice *dev) +{ + int port_data; + + if (ioperm (dev->base+1, 3, 1) == -1) + { + errmsg ("Open lp port 0x%x, %d", dev->base, dev->base); + exit (1); + } + + + port_data = inb(dev->base+1); + if ((port_data & 0x10) != 0x10) /* Check for pin 13 */ + return 13; /* dash */ + else + { + if ((port_data & 0x20) != 0x20) /* Check for pin 12 */ + return 12; /* dot */ + else + return 0; /* nothing */ + } +} + int lp_init(cwdevice *dev) { if (ioperm (dev->base+2, 1, 1) == -1) diff -u -r cwdaemon-0.5/ttys.c cwdaemon-0.5-mod/ttys.c --- cwdaemon-0.5/ttys.c 2003-05-17 04:24:01.000000000 -0600 +++ cwdaemon-0.5-mod/ttys.c 2003-07-19 16:05:52.000000000 -0600 @@ -21,6 +21,12 @@ /* ttyS functions */ +int ttys_status(cwdevice *dev) +{ + /* Dummy function */ + return 0; +} + int ttys_init(cwdevice *dev) { if (ioperm (dev->base, 8, 1) == -1)
Attachment:
pgpywk0IP58AX.pgp
Description: signature