Add Farnsworth support to morse(6).

(For those interested: this is intented to extend the space between
characters to help people learning morse code by giving the brain some
extra time for acoustical pattern recognition.)

Note: I slightly cleaned up the submitted patch for minor stylistic
issues, and changed the default for the new -c option to be identical
to -w.

Submitted by:	"Stephen P. Cravey" <cravey@gotbrains.org> N5UUU
MFC after:	2 weeks
PR:		bin/81831
This commit is contained in:
Joerg Wunsch 2005-06-07 19:01:41 +00:00
parent a8d23252b6
commit bc48d6e6c9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=147110
2 changed files with 41 additions and 11 deletions

View File

@ -33,7 +33,7 @@
.\" @(#)bcd.6 8.1 (Berkeley) 5/31/93
.\" $FreeBSD$
.\"
.Dd May 11, 2004
.Dd June 7, 2005
.Dt MORSE 6
.Os
.Sh NAME
@ -44,6 +44,7 @@
.Op Fl elps
.Op Fl d Ar device
.Op Fl w Ar speed
.Op Fl c Ar speed
.Op Fl f Ar frequency
.Op Ar string ...
.Sh DESCRIPTION
@ -73,6 +74,14 @@ support.
Set the sending speed in words per minute.
If not specified, the default
speed of 20 WPM is used.
.It Fl c Ar speed
Farnsworth support.
Set the spacing between characters in words per minute.
This is independent of the speed
that the individual characters are sent.
If not specified, defaults to the effective value of the
.Fl w
option.
.It Fl f Ar frequency
Set the sidetone frequency to something other than the default 600 Hz.
.It Fl d Ar device
@ -91,6 +100,8 @@ or
.Pp
The
.Fl w
,
.Fl c
and
.Fl f
flags only work in conjunction with either the
@ -176,6 +187,11 @@ added by
Ability to key an external device added by
.An J\(:org Wunsch
(DL8DTL).
.Pp
Farnsworth support for
.Nm
added by
.An Stephen Cravey (N5UUU).
.Sh BUGS
Only understands a few European characters
(German and French),

View File

@ -266,12 +266,14 @@ void show(const char *), play(const char *), morse(char);
void ttyout(const char *);
void sighandler(int);
#define GETOPTOPTS "d:ef:lsw:"
#define GETOPTOPTS "c:d:ef:lsw:"
#define USAGE \
"usage: morse [-els] [-d device] [-w speed] [-f frequency] [string ...]\n"
"usage: morse [-els] [-d device] [-w speed] [-c speed] [-f frequency] [string ...]\n"
static int pflag, lflag, sflag, eflag;
static int wpm = 20; /* words per minute */
static int wpm = 20; /* effective words per minute */
static int cpm; /* effective words per minute between
* characters */
#define FREQUENCY 600
static int freq = FREQUENCY;
static char *device; /* for tty-controlled generator */
@ -280,6 +282,7 @@ static char *device; /* for tty-controlled generator */
#define CHAR_SPACE 3
#define WORD_SPACE (7 - CHAR_SPACE - 1)
static float dot_clock;
static float cdot_clock;
int spkr, line;
struct termios otty, ntty;
int olflags;
@ -287,10 +290,10 @@ int olflags;
#ifdef SPEAKER
tone_t sound;
#undef GETOPTOPTS
#define GETOPTOPTS "d:ef:lpsw:"
#define GETOPTOPTS "c:d:ef:lpsw:"
#undef USAGE
#define USAGE \
"usage: morse [-elps] [-d device] [-w speed] [-f frequency] [string ...]\n"
"usage: morse [-elps] [-d device] [-w speed] [-c speed] [-f frequency] [string ...]\n"
#endif
static const struct morsetab *hightab;
@ -303,6 +306,9 @@ main(int argc, char **argv)
while ((ch = getopt(argc, argv, GETOPTOPTS)) != -1)
switch ((char) ch) {
case 'c':
cpm = atoi(optarg);
break;
case 'd':
device = optarg;
break;
@ -340,7 +346,9 @@ main(int argc, char **argv)
fputs("morse: only one of -p, -d and -l, -s allowed\n", stderr);
exit(1);
}
if ((pflag || device) && ((wpm < 1) || (wpm > 60))) {
if (cpm == 0)
cpm = wpm;
if ((pflag || device) && ((wpm < 1) || (wpm > 60) || (cpm < 1) || (cpm > 60))) {
fputs("morse: insane speed\n", stderr);
exit(1);
}
@ -385,6 +393,12 @@ main(int argc, char **argv)
dot_clock = dot_clock / 2; /* dot_clock runs at twice */
/* the dot rate */
dot_clock = dot_clock * 100; /* scale for ioctl */
cdot_clock = cpm / 2.4; /* dots/sec */
cdot_clock = 1 / cdot_clock; /* duration of a dot */
cdot_clock = cdot_clock / 2; /* dot_clock runs at twice */
/* the dot rate */
cdot_clock = cdot_clock * 100; /* scale for ioctl */
}
argc -= optind;
@ -492,7 +506,7 @@ play(const char *s)
break;
case ' ':
sound.frequency = 0;
sound.duration = dot_clock * WORD_SPACE;
sound.duration = cdot_clock * WORD_SPACE;
break;
default:
sound.duration = 0;
@ -511,7 +525,7 @@ play(const char *s)
}
}
sound.frequency = 0;
sound.duration = dot_clock * CHAR_SPACE;
sound.duration = cdot_clock * CHAR_SPACE;
ioctl(spkr, SPKRTONE, &sound);
#endif
}
@ -534,7 +548,7 @@ ttyout(const char *s)
break;
case ' ':
on = 0;
duration = dot_clock * WORD_SPACE;
duration = cdot_clock * WORD_SPACE;
break;
default:
on = 0;
@ -554,7 +568,7 @@ ttyout(const char *s)
duration = dot_clock * 10000;
usleep(duration);
}
duration = dot_clock * CHAR_SPACE * 10000;
duration = cdot_clock * CHAR_SPACE * 10000;
usleep(duration);
}