diff options
author | joerg <joerg@FreeBSD.org> | 1995-08-27 14:06:15 +0000 |
---|---|---|
committer | joerg <joerg@FreeBSD.org> | 1995-08-27 14:06:15 +0000 |
commit | 136398cad8e9e85870c298eb505c9d1cb86b537f (patch) | |
tree | 770a6ce957ee474617fa83bfc9da78fbc7a76661 /games | |
parent | 1d51f50e5a7d95f2963ce8fd2ee91e7e5a2d1a87 (diff) | |
download | FreeBSD-src-136398cad8e9e85870c298eb505c9d1cb86b537f.zip FreeBSD-src-136398cad8e9e85870c298eb505c9d1cb86b537f.tar.gz |
Make morse(6) realling playing the characters on the speaker.
Minor additions by me, mostly taken from the suggestion in PR # bin/709.
Submitted by: lyndon@orthanc.com (Lyndon Nerenberg, VE7TCP/VE6BBM)
Diffstat (limited to 'games')
-rw-r--r-- | games/bcd/bcd.6 | 74 | ||||
-rw-r--r-- | games/morse/Makefile | 2 | ||||
-rw-r--r-- | games/morse/morse.c | 365 |
3 files changed, 365 insertions, 76 deletions
diff --git a/games/bcd/bcd.6 b/games/bcd/bcd.6 index 62b4719..863ae3a 100644 --- a/games/bcd/bcd.6 +++ b/games/bcd/bcd.6 @@ -45,14 +45,18 @@ .Nm ppt .Op Ar string ... .Nm morse -.Op Fl s Ar string ... +.Op Fl p +.Op Fl w Ar speed +.Op Fl f Ar frequency +.Op Fl s +.Op Ar string ... .Sh DESCRIPTION The commands .Nm bcd , .Nm ppt and .Nm morse -reads the given input and reformats it in the form of punched cards, +read the given input and reformat it in the form of punched cards, paper tape or morse code respectively. Acceptable input are command line arguments or the standard input. .Pp @@ -62,6 +66,70 @@ Available option: The .Fl s option for morse produces dots and dashes rather than words. +.It Fl p +Send morse the real way. This only works if your system has sound +support and if the program understands your audio hardware. +.It Fl w Ar speed +Set the sending speed in words per minute. If not specified the default +speed of 20 WPM is used. +.It Fl f Ar frequency +Set the sidetone frequency to something other than the default 600 Hz. .El +.Pp +The +.Fl w +and +.Fl f +flags only work in conjunction with the +.Fl p +flag. +.Pp +Not all prosigns have corresponding characters. Use +.Ql # +for +.Em AS , +.Ql @ +for +.Em SK , +.Ql * +for +.Em VE +and +.Ql % +for +.Em BK . +The more common prosigns are +.Ql = +for +.Em BT , +.Ql ( +for +.Em KN +and +.Ql + +for +.Em AR . .Sh FILES -.SH HISTORY +.Bl -tag -width /dev/speaker -compact +.It Pa /dev/speaker +speaker device file +.El +.Sh ENVIRONMENT +.Bl -tag -width LC_CTYPE +.It Ev LC_CTYPE +.It Ev LANG +If one of these variables is set to a locale ending in +.Ql KOI8-R , +characters with the high-order bit set are being interpreted as +cyrillic characters. In all other cases, they are being interpreted +as belonging to the +.Ql ISO_8859-1 +character set. +.Sh HISTORY +Sound support added by Lyndon Nerenberg (VE7TCP/VE6BBM) <lyndon@orthanc.com>. +.Sh BUGS +Does only understand a few European characters (namely German and +French), but neither Asian ones, or the continental landline code. +.Pp +Sends a bit slower than it should due to system overhead. Some people +would call this a feature. diff --git a/games/morse/Makefile b/games/morse/Makefile index 1d23a0a..4441189 100644 --- a/games/morse/Makefile +++ b/games/morse/Makefile @@ -3,6 +3,6 @@ PROG= morse NOMAN= noman HIDEGAME=hidegame +CFLAGS += -DSPEAKER=\"/dev/speaker\" .include <bsd.prog.mk> - diff --git a/games/morse/morse.c b/games/morse/morse.c index ca8a7a3..a78e29f 100644 --- a/games/morse/morse.c +++ b/games/morse/morse.c @@ -31,6 +31,11 @@ * SUCH DAMAGE. */ +/* + * Taught to send *real* morse by Lyndon Nerenberg (VE7TCP/VE6BBM) + * <lyndon@orthanc.com> + */ + #ifndef lint static char copyright[] = "@(#) Copyright (c) 1988, 1993\n\ @@ -43,103 +48,319 @@ static char sccsid[] = "@(#)morse.c 8.1 (Berkeley) 5/31/93"; #include <stdio.h> #include <ctype.h> +#include <locale.h> +#include <stdlib.h> + +#ifdef SPEAKER +#include <machine/speaker.h> +#include <fcntl.h> +#endif + +struct morsetab { + char inchar; + char *morse; +}; + +static struct morsetab mtab[] = { + + /* letters */ + + 'a', ".-", + 'b', "-...", + 'c', "-.-.", + 'd', "-..", + 'e', ".", + 'f', "..-.", + 'g', "--.", + 'h', "....", + 'i', "..", + 'j', ".---", + 'k', "-.-", + 'l', ".-..", + 'm', "--", + 'n', "-.", + 'o', "---", + 'p', ".--.", + 'q', "--.-", + 'r', ".-.", + 's', "...", + 't', "-", + 'u', "..-", + 'v', "...-", + 'w', ".--", + 'x', "-..-", + 'y', "-.--", + 'z', "--..", + + /* digits */ + + '0', "-----", + '1', ".----", + '2', "..---", + '3', "...--", + '4', "....-", + '5', ".....", + '6', "-....", + '7', "--...", + '8', "---..", + '9', "----.", + + /* punctuation */ -static char - *digit[] = { - "-----", - ".----", - "..---", - "...--", - "....-", - ".....", - "-....", - "--...", - "---..", - "----.", -}, - *alph[] = { - ".-", - "-...", - "-.-.", - "-..", - ".", - "..-.", - "--.", - "....", - "..", - ".---", - "-.-", - ".-..", - "--", - "-.", - "---", - ".--.", - "--.-", - ".-.", - "...", - "-", - "..-", - "...-", - ".--", - "-..-", - "-.--", - "--..", + ',', "--..--", + '.', ".-.-.-", + '?', "..--..", + '/', "-..-.", + '-', "-....-", + '=', "-...-", /* BT */ + ':', "---...", + ';', "-.-.-.", + '(', "-.--.", /* KN */ + ')', "-.--.-", + '$', "...-..-", + '+', ".-.-.", /* AR */ + + /* prosigns without already assigned values */ + + '#', ".-...", /* AS */ + '@', "...-.-", /* SK */ + '*', "...-.", /* VE */ + '%', "-...-.-", /* BK */ + + '\0', "" +}; + + +static struct morsetab iso8859tab[] = { + 'á', ".--.-", + 'à', ".--.-", + 'â', ".--.-", + 'ä', ".-.-", + 'ç', "-.-..", + 'é', "..-..", + 'è', "..-..", + 'ê', "-..-.", + 'ö', "---.", + 'ü', "..--", + + '\0', "" +}; + +static struct morsetab koi8rtab[] = { + /* + * the cyrillic alphabet; you'll need a KOI8R font in order + * to see the actual characters + */ + 'Á', ".-", /* a */ + 'Â', "-...", /* be */ + '×', ".--", /* ve */ + 'Ç', "--.", /* ge */ + 'Ä', "-..", /* de */ + 'Å', ".", /* ye */ + 'Ö', "...-", /* she */ + 'Ú', "--..", /* ze */ + 'É', "..", /* i */ + 'Ê', ".---", /* i kratkoye */ + 'Ë', "-.-", /* ka */ + 'Ì', ".-..", /* el */ + 'Í', "--", /* em */ + 'Î', "-.", /* en */ + 'Ï', "---", /* o */ + 'Ð', ".--.", /* pe */ + 'Ò', ".-.", /* er */ + 'Ó', "...", /* es */ + 'Ô', "-", /* te */ + 'Õ', "..-", /* u */ + 'Æ', "..-.", /* ef */ + 'È', "....", /* kha */ + 'Ã', "-.-.", /* ce */ + 'Þ', "---.", /* che */ + 'Û', "----", /* sha */ + 'Ý', "--.-", /* shcha */ + 'Ù', "-.--", /* yi */ + 'Ø', "-..-", /* myakhkij znak */ + 'Ü', "..-..", /* ae */ + 'À', "..--", /* yu */ + 'Ñ', ".-.-", /* ya */ + + '\0', "" }; -static int sflag; +void show(const char *), play(const char *), morse(char); + +static int pflag, sflag; +static int wpm = 20; /* words per minute */ +#define FREQUENCY 600 +static int freq = FREQUENCY; + +#ifdef SPEAKER +#define DASH_LEN 3 +#define CHAR_SPACE 3 +#define WORD_SPACE (7 - CHAR_SPACE - 1) +static float dot_clock; +int spkr; +tone_t sound; +#endif -main(argc, argv) - int argc; - char **argv; +static struct morsetab *hightab = iso8859tab; + +int +main(int argc, char **argv) { - extern char *optarg; - extern int optind; - register int ch; - register char *p; + extern char *optarg; + extern int optind; + register int ch; + register char *p; - while ((ch = getopt(argc, argv, "s")) != EOF) - switch((char)ch) { + while ((ch = getopt(argc, argv, "spw:f:")) != EOF) + switch ((char) ch) { + case 'f': + freq = atoi(optarg); + break; + case 'p': + pflag = 1; + break; case 's': sflag = 1; break; + case 'w': + wpm = atoi(optarg); + break; case '?': default: - fprintf(stderr, "usage: morse [string ...]"); + fputs("usage: morse [-s] [-p] [-w speed] [-f frequency] [string ...]\n", stderr); + exit(1); + } + if (pflag && sflag) { + fputs("morse: only one of -p and -s allowed\n", stderr); + exit(1); + } + if (pflag && ((wpm < 1) || (wpm > 60))) { + fputs("morse: insane speed\n", stderr); + exit(1); + } + if (pflag && (freq == 0)) + freq = FREQUENCY; + + (void)setuid(getuid()); +#ifdef SPEAKER + if (pflag) { + if ((spkr = open(SPEAKER, O_WRONLY, 0)) == -1) { + perror(SPEAKER); exit(1); } + dot_clock = wpm / 2.4; /* dots/sec */ + dot_clock = 1 / dot_clock; /* duration of a dot */ + dot_clock = dot_clock / 2; /* dot_clock runs at twice */ + /* the dot rate */ + dot_clock = dot_clock * 100; /* scale for ioctl */ + } +#endif argc -= optind; argv += optind; - if (*argv) + if((p = getenv("LC_CTYPE")) || (p = getenv("LANG"))) { + if(strlen(p) >= strlen("KOI8-R") && + strcasecmp(&p[strlen(p) - strlen("KOI8-R")], "KOI8-R") == 0) + hightab = koi8rtab; + setlocale(LC_CTYPE, p); + } else { + setlocale(LC_CTYPE, ""); + } + + if (*argv) { do { - for (p = *argv; *p; ++p) - morse((int)*p); + for (p = *argv; *p; ++p) { + morse((int) *p); + } + morse((int) ' '); } while (*++argv); - else while ((ch = getchar()) != EOF) - morse(ch); + } else { + while ((ch = getchar()) != EOF) + morse(ch); + } + exit(0); } -morse(c) - register int c; +void +morse(char c) { + struct morsetab *m; + if (isalpha(c)) - show(alph[c - (isupper(c) ? 'A' : 'a')]); - else if (isdigit(c)) - show(digit[c - '0']); - else if (c == ',') - show("--..--"); - else if (c == '.') - show(".-.-.-"); - else if (isspace(c)) - show(" ...\n"); + c = tolower(c); + if ((c == '\r') || (c == '\n')) + c = ' '; + if (c == ' ') { + if (pflag) { + play(" "); + return; + } else { + show(""); + return; + } + } + for (m = ((unsigned char)c < 0x80? mtab: hightab); + m->inchar != '\0'; + m++) { + if (m->inchar == c) { + if (pflag) { + play(m->morse); + } else + show(m->morse); + } + } } -show(s) - register char *s; +void +show(const char *s) { if (sflag) printf(" %s", s); - else for (; *s; ++s) - printf(" %s", *s == '.' ? "dit" : "daw"); - printf(",\n"); + else + for (; *s; ++s) + printf(" %s", *s == '.' ? "dit" : "dah"); + printf("\n"); +} + +void +play(const char *s) +{ +#ifdef SPEAKER + const char *c; + + for (c = s; *c != '\0'; c++) { + switch ((int) *c) { + case '.': + sound.frequency = freq; + sound.duration = dot_clock; + break; + case '-': + sound.frequency = freq; + sound.duration = dot_clock * DASH_LEN; + break; + case ' ': + sound.frequency = 0; + sound.duration = dot_clock * WORD_SPACE; + break; + default: + sound.duration = 0; + } + if (sound.duration) { + if (ioctl(spkr, SPKRTONE, &sound) == -1) { + perror("ioctl play"); + exit(1); + } + } + sound.frequency = 0; + sound.duration = dot_clock; + if (ioctl(spkr, SPKRTONE, &sound) == -1) { + perror("ioctl rest"); + exit(1); + } + } + sound.frequency = 0; + sound.duration = dot_clock * CHAR_SPACE; + ioctl(spkr, SPKRTONE, &sound); +#endif } |