08a4ec844d33a4122075263220052aeb22538205
[asterisk/asterisk.git] / apps / app_morsecode.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (c) 2006, Tilghman Lesher.  All rights reserved.
5  *
6  * Tilghman Lesher <app_morsecode__v001@the-tilghman.com>
7  *
8  * This code is released by the author with no restrictions on usage.
9  *
10  * See http://www.asterisk.org for more information about
11  * the Asterisk project. Please do not directly contact
12  * any of the maintainers of this project for assistance;
13  * the project provides a web site, mailing lists and IRC
14  * channels for your use.
15  *
16  */
17
18 /*! \file
19  *
20  * \brief Morsecode application
21  *
22  * \author Tilghman Lesher <app_morsecode__v001@the-tilghman.com>
23  *
24  * \ingroup applications
25  */
26
27 #include "asterisk.h"
28
29 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
30
31 #include "asterisk/file.h"
32 #include "asterisk/logger.h"
33 #include "asterisk/options.h"
34 #include "asterisk/channel.h"
35 #include "asterisk/pbx.h"
36 #include "asterisk/module.h"
37 #include "asterisk/indications.h"
38
39 static char *app_morsecode = "Morsecode";
40
41 static char *morsecode_synopsis = "Plays morse code";
42
43 static char *morsecode_descrip =
44 "  Morsecode(<string>):\n"
45 "Plays the Morse code equivalent of the passed string.  If the variable\n"
46 "MORSEDITLEN is set, it will use that value for the length (in ms) of the dit\n"
47 "(defaults to 80).  Additionally, if MORSETONE is set, it will use that tone\n"
48 "(in Hz).  The tone default is 800.\n";
49
50
51 static char *morsecode[] = {
52         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /*  0-15 */
53         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /* 16-31 */
54         " ",      /* 32 - <space> */
55         ".-.-.-", /* 33 - ! */
56         ".-..-.", /* 34 - " */
57         "",       /* 35 - # */
58         "",       /* 36 - $ */
59         "",       /* 37 - % */
60         "",       /* 38 - & */
61         ".----.", /* 39 - ' */
62         "-.--.-", /* 40 - ( */
63         "-.--.-", /* 41 - ) */
64         "",       /* 42 - * */
65         "",       /* 43 - + */
66         "--..--", /* 44 - , */
67         "-....-", /* 45 - - */
68         ".-.-.-", /* 46 - . */
69         "-..-.",  /* 47 - / */
70         "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", /* 48-57 - 0-9 */
71         "---...", /* 58 - : */
72         "-.-.-.", /* 59 - ; */
73         "",       /* 60 - < */
74         "-...-",  /* 61 - = */
75         "",       /* 62 - > */
76         "..--..", /* 63 - ? */
77         ".--.-.", /* 64 - @ */
78         ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
79         "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",
80         "-.--.-", /* 91 - [ (really '(') */
81         "-..-.",  /* 92 - \ (really '/') */
82         "-.--.-", /* 93 - ] (really ')') */
83         "",       /* 94 - ^ */
84         "..--.-", /* 95 - _ */
85         ".----.", /* 96 - ` */
86         ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
87         "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",
88         "-.--.-", /* 123 - { (really '(') */
89         "",       /* 124 - | */
90         "-.--.-", /* 125 - } (really ')') */
91         "-..-.",  /* 126 - ~ (really bar) */
92         ". . .",  /* 127 - <del> (error) */
93 };
94
95 static void playtone(struct ast_channel *chan, int tone, int len)
96 {
97         char dtmf[20];
98         snprintf(dtmf, sizeof(dtmf), "%d/%d", tone, len);
99         ast_playtones_start(chan, 0, dtmf, 0);
100         ast_safe_sleep(chan, len);
101         ast_playtones_stop(chan);
102 }
103
104 static int morsecode_exec(struct ast_channel *chan, void *data)
105 {
106         int res=0, ditlen, tone;
107         char *digit;
108         const char *ditlenc, *tonec;
109
110         if (ast_strlen_zero(data)) {
111                 ast_log(LOG_WARNING, "Syntax: Morsecode(<string>) - no argument found\n");
112                 return 0;
113         }
114
115         /* Use variable MORESEDITLEN, if set (else 80) */
116         ditlenc = pbx_builtin_getvar_helper(chan, "MORSEDITLEN");
117         if (ast_strlen_zero(ditlenc) || (sscanf(ditlenc, "%d", &ditlen) != 1)) {
118                 ditlen = 80;
119         }
120
121         /* Use variable MORSETONE, if set (else 800) */
122         tonec = pbx_builtin_getvar_helper(chan, "MORSETONE");
123         if (ast_strlen_zero(tonec) || (sscanf(tonec, "%d", &tone) != 1)) {
124                 tone = 800;
125         }
126
127         for (digit = data; *digit; digit++) {
128                 int digit2 = *digit;
129                 char *dahdit;
130                 if (digit2 < 0) {
131                         continue;
132                 }
133                 for (dahdit = morsecode[digit2]; *dahdit; dahdit++) {
134                         if (*dahdit == '-') {
135                                 playtone(chan, tone, 3 * ditlen);
136                         } else if (*dahdit == '.') {
137                                 playtone(chan, tone, 1 * ditlen);
138                         } else {
139                                 /* Account for ditlen of silence immediately following */
140                                 playtone(chan, 0, 2 * ditlen);
141                         }
142
143                         /* Pause slightly between each dit and dah */
144                         playtone(chan, 0, 1 * ditlen);
145                 }
146                 /* Pause between characters */
147                 playtone(chan, 0, 2 * ditlen);
148         }
149
150         return res;
151 }
152
153 static int unload_module(void)
154 {
155         return ast_unregister_application(app_morsecode);
156 }
157
158 static int load_module(void)
159 {
160         return ast_register_application(app_morsecode, morsecode_exec, morsecode_synopsis, morsecode_descrip);
161 }
162
163 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Morse code");