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$")
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, "%d", &ditlen) != 1)) {
00127 ditlen = 80;
00128 }
00129
00130
00131 tonec = pbx_builtin_getvar_helper(chan, "MORSETONE");
00132 if (ast_strlen_zero(tonec) || (sscanf(tonec, "%d", &tone) != 1)) {
00133 tone = 800;
00134 }
00135
00136 for (digit = data; *digit; digit++) {
00137 char *dahdit;
00138 if (*digit < 0) {
00139 continue;
00140 }
00141 for (dahdit = morsecode[(int)*digit]; *dahdit; dahdit++) {
00142 if (*dahdit == '-') {
00143 playtone(chan, tone, 3 * ditlen);
00144 } else if (*dahdit == '.') {
00145 playtone(chan, tone, 1 * ditlen);
00146 } else {
00147
00148 playtone(chan, 0, 2 * ditlen);
00149 }
00150
00151
00152 playtone(chan, 0, 1 * ditlen);
00153 }
00154
00155 playtone(chan, 0, 2 * ditlen);
00156 }
00157
00158 ast_module_user_remove(u);
00159 return res;
00160 }
00161
00162 static int unload_module(void)
00163 {
00164 int res;
00165
00166 res = ast_unregister_application(app_morsecode);
00167
00168 ast_module_user_hangup_all();
00169
00170 return res;
00171 }
00172
00173 static int load_module(void)
00174 {
00175 return ast_register_application(app_morsecode, morsecode_exec, morsecode_synopsis, morsecode_descrip);
00176 }
00177
00178 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Morse code");