include "logger.h" and errno.h from asterisk.h - usage shows that they
[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/options.h"
33 #include "asterisk/channel.h"
34 #include "asterisk/pbx.h"
35 #include "asterisk/module.h"
36 #include "asterisk/indications.h"
37
38 static char *app_morsecode = "Morsecode";
39
40 static char *morsecode_synopsis = "Plays morse code";
41
42 static char *morsecode_descrip =
43 "  Morsecode(<string>):\n"
44 "Plays the Morse code equivalent of the passed string.  If the variable\n"
45 "MORSEDITLEN is set, it will use that value for the length (in ms) of the dit\n"
46 "(defaults to 80).  Additionally, if MORSETONE is set, it will use that tone\n"
47 "(in Hz).  The tone default is 800.\n";
48
49
50 static char *morsecode[] = {
51         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /*  0-15 */
52         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /* 16-31 */
53         " ",      /* 32 - <space> */
54         ".-.-.-", /* 33 - ! */
55         ".-..-.", /* 34 - " */
56         "",       /* 35 - # */
57         "",       /* 36 - $ */
58         "",       /* 37 - % */
59         "",       /* 38 - & */
60         ".----.", /* 39 - ' */
61         "-.--.-", /* 40 - ( */
62         "-.--.-", /* 41 - ) */
63         "",       /* 42 - * */
64         "",       /* 43 - + */
65         "--..--", /* 44 - , */
66         "-....-", /* 45 - - */
67         ".-.-.-", /* 46 - . */
68         "-..-.",  /* 47 - / */
69         "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", /* 48-57 - 0-9 */
70         "---...", /* 58 - : */
71         "-.-.-.", /* 59 - ; */
72         "",       /* 60 - < */
73         "-...-",  /* 61 - = */
74         "",       /* 62 - > */
75         "..--..", /* 63 - ? */
76         ".--.-.", /* 64 - @ */
77         ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
78         "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",
79         "-.--.-", /* 91 - [ (really '(') */
80         "-..-.",  /* 92 - \ (really '/') */
81         "-.--.-", /* 93 - ] (really ')') */
82         "",       /* 94 - ^ */
83         "..--.-", /* 95 - _ */
84         ".----.", /* 96 - ` */
85         ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
86         "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",
87         "-.--.-", /* 123 - { (really '(') */
88         "",       /* 124 - | */
89         "-.--.-", /* 125 - } (really ')') */
90         "-..-.",  /* 126 - ~ (really bar) */
91         ". . .",  /* 127 - <del> (error) */
92 };
93
94 static void playtone(struct ast_channel *chan, int tone, int len)
95 {
96         char dtmf[20];
97         snprintf(dtmf, sizeof(dtmf), "%d/%d", tone, len);
98         ast_playtones_start(chan, 0, dtmf, 0);
99         ast_safe_sleep(chan, len);
100         ast_playtones_stop(chan);
101 }
102
103 static int morsecode_exec(struct ast_channel *chan, void *data)
104 {
105         int res=0, ditlen, tone;
106         char *digit;
107         const char *ditlenc, *tonec;
108
109         if (ast_strlen_zero(data)) {
110                 ast_log(LOG_WARNING, "Syntax: Morsecode(<string>) - no argument found\n");
111                 return 0;
112         }
113
114         /* Use variable MORESEDITLEN, if set (else 80) */
115         ditlenc = pbx_builtin_getvar_helper(chan, "MORSEDITLEN");
116         if (ast_strlen_zero(ditlenc) || (sscanf(ditlenc, "%d", &ditlen) != 1)) {
117                 ditlen = 80;
118         }
119
120         /* Use variable MORSETONE, if set (else 800) */
121         tonec = pbx_builtin_getvar_helper(chan, "MORSETONE");
122         if (ast_strlen_zero(tonec) || (sscanf(tonec, "%d", &tone) != 1)) {
123                 tone = 800;
124         }
125
126         for (digit = data; *digit; digit++) {
127                 int digit2 = *digit;
128                 char *dahdit;
129                 if (digit2 < 0) {
130                         continue;
131                 }
132                 for (dahdit = morsecode[digit2]; *dahdit; dahdit++) {
133                         if (*dahdit == '-') {
134                                 playtone(chan, tone, 3 * ditlen);
135                         } else if (*dahdit == '.') {
136                                 playtone(chan, tone, 1 * ditlen);
137                         } else {
138                                 /* Account for ditlen of silence immediately following */
139                                 playtone(chan, 0, 2 * ditlen);
140                         }
141
142                         /* Pause slightly between each dit and dah */
143                         playtone(chan, 0, 1 * ditlen);
144                 }
145                 /* Pause between characters */
146                 playtone(chan, 0, 2 * ditlen);
147         }
148
149         return res;
150 }
151
152 static int unload_module(void)
153 {
154         return ast_unregister_application(app_morsecode);
155 }
156
157 static int load_module(void)
158 {
159         return ast_register_application(app_morsecode, morsecode_exec, morsecode_synopsis, morsecode_descrip);
160 }
161
162 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Morse code");