459b67640ffce04dd7b4e2d8d81f9f357300643a
[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 <stdio.h>
28 #include <stdlib.h>
29 #include <unistd.h>
30 #include <string.h>
31
32 #include "asterisk.h"
33
34 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 7221 $")
35
36 #include "asterisk/file.h"
37 #include "asterisk/logger.h"
38 #include "asterisk/options.h"
39 #include "asterisk/channel.h"
40 #include "asterisk/pbx.h"
41 #include "asterisk/module.h"
42 #include "asterisk/indications.h"
43
44 static char *tdesc = "Morse code";
45
46 static char *app_morsecode = "Morsecode";
47
48 static char *morsecode_synopsis = "Plays morse code";
49
50 static char *morsecode_descrip =
51 "Usage: Morsecode(<string>)\n"
52 "Plays the Morse code equivalent of the passed string\n";
53
54 STANDARD_LOCAL_USER;
55
56 LOCAL_USER_DECL;
57
58 #define TONE    800
59 #define DITLEN  80
60
61 static char *morsecode[] = {
62         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /*  0-15 */
63         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /* 16-31 */
64         " ",      /* 32 - <space> */
65         ".-.-.-", /* 33 - ! */
66         ".-..-.", /* 34 - " */
67         "",       /* 35 - # */
68         "",       /* 36 - $ */
69         "",       /* 37 - % */
70         "",       /* 38 - & */
71         ".----.", /* 39 - ' */
72         "-.--.-", /* 40 - ( */
73         "-.--.-", /* 41 - ) */
74         "",       /* 42 - * */
75         "",       /* 43 - + */
76         "--..--", /* 44 - , */
77         "-....-", /* 45 - - */
78         ".-.-.-", /* 46 - . */
79         "-··-·",  /* 47 - / */
80         "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", /* 48-57 - 0-9 */
81         "---...", /* 58 - : */
82         "-·-·-·", /* 59 - ; */
83         "",       /* 60 - < */
84         "-...-",  /* 61 - = */
85         "",       /* 62 - > */
86         "..--..", /* 63 - ? */
87         ".--.-.", /* 64 - @ */
88         ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
89         "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",
90         "-.--.-", /* 91 - [ (really '(') */
91         "-··-·",  /* 92 - \ (really '/') */
92         "-.--.-", /* 93 - ] (really ')') */
93         "",       /* 94 - ^ */
94         "··--·-", /* 95 - _ */
95         ".----.", /* 96 - ` */
96         ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
97         "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",
98         "-.--.-", /* 123 - { (really '(') */
99         "",       /* 124 - | */
100         "-.--.-", /* 125 - } (really ')') */
101         "-··-·",  /* 126 - ~ (really bar) */
102         "· · ·",  /* 127 - <del> (error) */
103 };
104
105 static void playtone(struct ast_channel *chan, int tone, int len)
106 {
107         char dtmf[20];
108         snprintf(dtmf, sizeof(dtmf), "%d/%d", tone, DITLEN * len);
109         ast_playtones_start(chan, 0, dtmf, 0);
110         ast_safe_sleep(chan, DITLEN * len);
111         ast_playtones_stop(chan);
112 }
113
114 static int morsecode_exec(struct ast_channel *chan, void *data)
115 {
116         int res=0;
117         char *digit;
118         struct localuser *u;
119
120         LOCAL_USER_ADD(u);
121
122         if (ast_strlen_zero(data)) {
123                 ast_log(LOG_WARNING, "Syntax: Morsecode(<string>) - no argument found\n");
124                 LOCAL_USER_REMOVE(u);
125                 return 0;
126         }
127
128         for (digit = data; *digit; digit++) {
129                 char *dahdit;
130                 if (*digit < 0) {
131                         continue;
132                 }
133                 for (dahdit = morsecode[(int)*digit]; *dahdit; dahdit++) {
134                         if (*dahdit == '-') {
135                                 playtone(chan, TONE, 3);
136                         } else if (*dahdit == '.') {
137                                 playtone(chan, TONE, 1);
138                         } else {
139                                 /* Account for ditlen of silence immediately following */
140                                 playtone(chan, 0, 2);
141                         }
142
143                         /* Pause slightly between each dit and dah */
144                         playtone(chan, 0, 1);
145                 }
146                 /* Pause between characters */
147                 playtone(chan, 0, 2);
148         }
149
150         LOCAL_USER_REMOVE(u);
151         return res;
152 }
153
154 int unload_module(void)
155 {
156         int res;
157
158         res = ast_unregister_application(app_morsecode);
159
160         STANDARD_HANGUP_LOCALUSERS;
161
162         return res;
163 }
164
165 int load_module(void)
166 {
167         return ast_register_application(app_morsecode, morsecode_exec, morsecode_synopsis, morsecode_descrip);
168 }
169
170 char *description(void)
171 {
172         return tdesc;
173 }
174
175 int usecount(void)
176 {
177         int res;
178         STANDARD_USECOUNT(res);
179         return res;
180 }
181
182 char *key()
183 {
184         return ASTERISK_GPL_KEY;
185 }