00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "asterisk.h"
00028
00029 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 211528 $")
00030
00031 #include <stdio.h>
00032 #include <stdlib.h>
00033 #include <unistd.h>
00034 #include <string.h>
00035
00036 #include "asterisk/file.h"
00037 #include "asterisk/logger.h"
00038 #include "asterisk/options.h"
00039 #include "asterisk/channel.h"
00040 #include "asterisk/pbx.h"
00041 #include "asterisk/module.h"
00042 #include "asterisk/indications.h"
00043
00044 static char *app_morsecode = "Morsecode";
00045
00046 static char *morsecode_synopsis = "Plays morse code";
00047
00048 static char *morsecode_descrip =
00049 "Usage: Morsecode(<string>)\n"
00050 "Plays the Morse code equivalent of the passed string. If the variable\n"
00051 "MORSEDITLEN is set, it will use that value for the length (in ms) of the dit\n"
00052 "(defaults to 80). Additionally, if MORSETONE is set, it will use that tone\n"
00053 "(in Hz). The tone default is 800.\n";
00054
00055
00056 static char *morsecode[] = {
00057 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
00058 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
00059 " ",
00060 ".-.-.-",
00061 ".-..-.",
00062 "",
00063 "",
00064 "",
00065 "",
00066 ".----.",
00067 "-.--.-",
00068 "-.--.-",
00069 "",
00070 "",
00071 "--..--",
00072 "-....-",
00073 ".-.-.-",
00074 "-..-.",
00075 "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.",
00076 "---...",
00077 "-.-.-.",
00078 "",
00079 "-...-",
00080 "",
00081 "..--..",
00082 ".--.-.",
00083 ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
00084 "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",
00085 "-.--.-",
00086 "-..-.",
00087 "-.--.-",
00088 "",
00089 "..--.-",
00090 ".----.",
00091 ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
00092 "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",
00093 "-.--.-",
00094 "",
00095 "-.--.-",
00096 "-..-.",
00097 ". . .",
00098 };
00099
00100 static void playtone(struct ast_channel *chan, int tone, int len)
00101 {
00102 char dtmf[20];
00103 snprintf(dtmf, sizeof(dtmf), "%d/%d", tone, len);
00104 ast_playtones_start(chan, 0, dtmf, 0);
00105 ast_safe_sleep(chan, len);
00106 ast_playtones_stop(chan);
00107 }
00108
00109 static int morsecode_exec(struct ast_channel *chan, void *data)
00110 {
00111 int res=0, ditlen, tone;
00112 char *digit;
00113 const char *ditlenc, *tonec;
00114 struct ast_module_user *u;
00115
00116 u = ast_module_user_add(chan);
00117
00118 if (ast_strlen_zero(data)) {
00119 ast_log(LOG_WARNING, "Syntax: Morsecode(<string>) - no argument found\n");
00120 ast_module_user_remove(u);
00121 return 0;
00122 }
00123
00124
00125 ditlenc = pbx_builtin_getvar_helper(chan, "MORSEDITLEN");
00126 if (ast_strlen_zero(ditlenc) || (sscanf(ditlenc, "%30d", &ditlen) != 1)) {
00127 ditlen = 80;
00128 }
00129
00130
00131 tonec = pbx_builtin_getvar_helper(chan, "MORSETONE");
00132 if (ast_strlen_zero(tonec) || (sscanf(tonec, "%30d", &tone) != 1)) {
00133 tone = 800;
00134 }
00135
00136 for (digit = data; *digit; digit++) {
00137 int digit2 = *digit;
00138 char *dahdit;
00139 if (digit2 < 0) {
00140 continue;
00141 }
00142 for (dahdit = morsecode[digit2]; *dahdit; dahdit++) {
00143 if (*dahdit == '-') {
00144 playtone(chan, tone, 3 * ditlen);
00145 } else if (*dahdit == '.') {
00146 playtone(chan, tone, 1 * ditlen);
00147 } else {
00148
00149 playtone(chan, 0, 2 * ditlen);
00150 }
00151
00152
00153 playtone(chan, 0, 1 * ditlen);
00154 }
00155
00156 playtone(chan, 0, 2 * ditlen);
00157 }
00158
00159 ast_module_user_remove(u);
00160 return res;
00161 }
00162
00163 static int unload_module(void)
00164 {
00165 int res;
00166
00167 res = ast_unregister_application(app_morsecode);
00168
00169 ast_module_user_hangup_all();
00170
00171 return res;
00172 }
00173
00174 static int load_module(void)
00175 {
00176 return ast_register_application(app_morsecode, morsecode_exec, morsecode_synopsis, morsecode_descrip);
00177 }
00178
00179 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Morse code");