CHANGES: Update changes log to include r403414 entry
[asterisk/asterisk.git] / apps / app_morsecode.c
index 459b676..2d7c117 100644 (file)
  * \ingroup applications
  */
 
  * \ingroup applications
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
+/*** MODULEINFO
+       <support_level>extended</support_level>
+ ***/
 
 #include "asterisk.h"
 
 
 #include "asterisk.h"
 
-ASTERISK_FILE_VERSION(__FILE__, "$Revision: 7221 $")
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
 #include "asterisk/file.h"
 
 #include "asterisk/file.h"
-#include "asterisk/logger.h"
-#include "asterisk/options.h"
 #include "asterisk/channel.h"
 #include "asterisk/pbx.h"
 #include "asterisk/module.h"
 #include "asterisk/indications.h"
 
 #include "asterisk/channel.h"
 #include "asterisk/pbx.h"
 #include "asterisk/module.h"
 #include "asterisk/indications.h"
 
-static char *tdesc = "Morse code";
-
-static char *app_morsecode = "Morsecode";
-
-static char *morsecode_synopsis = "Plays morse code";
-
-static char *morsecode_descrip =
-"Usage: Morsecode(<string>)\n"
-"Plays the Morse code equivalent of the passed string\n";
-
-STANDARD_LOCAL_USER;
-
-LOCAL_USER_DECL;
-
-#define        TONE    800
-#define        DITLEN  80
-
-static char *morsecode[] = {
+/*** DOCUMENTATION
+       <application name="Morsecode" language="en_US">
+               <synopsis>
+                       Plays morse code.
+               </synopsis>
+               <syntax>
+                       <parameter name="string" required="true">
+                               <para>String to playback as morse code to channel</para>
+                       </parameter>
+               </syntax>
+               <description>
+                       <para>Plays the Morse code equivalent of the passed string.</para>
+                       <para>This application does not automatically answer and should be preceeded by
+                       an application such as Answer() or Progress().</para>
+                       <para>This application uses the following variables:</para>
+                       <variablelist>
+                               <variable name="MORSEDITLEN">
+                                       <para>Use this value in (ms) for length of dit</para>
+                               </variable>
+                               <variable name="MORSETONE">
+                                       <para>The pitch of the tone in (Hz), default is 800</para>
+                               </variable>
+                       </variablelist>
+               </description>
+               <see-also>
+                       <ref type="application">SayAlpha</ref>
+                       <ref type="application">SayPhonetic</ref>
+               </see-also>
+       </application>
+ ***/  
+static const char app_morsecode[] = "Morsecode";
+
+static const char * const morsecode[] = {
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /*  0-15 */
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /* 16-31 */
        " ",      /* 32 - <space> */
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /*  0-15 */
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /* 16-31 */
        " ",      /* 32 - <space> */
@@ -76,10 +88,10 @@ static char *morsecode[] = {
        "--..--", /* 44 - , */
        "-....-", /* 45 - - */
        ".-.-.-", /* 46 - . */
        "--..--", /* 44 - , */
        "-....-", /* 45 - - */
        ".-.-.-", /* 46 - . */
-       "-··-·",  /* 47 - / */
+       "-..-.",  /* 47 - / */
        "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", /* 48-57 - 0-9 */
        "---...", /* 58 - : */
        "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", /* 48-57 - 0-9 */
        "---...", /* 58 - : */
-       "-·-·-·", /* 59 - ; */
+       "-.-.-.", /* 59 - ; */
        "",       /* 60 - < */
        "-...-",  /* 61 - = */
        "",       /* 62 - > */
        "",       /* 60 - < */
        "-...-",  /* 61 - = */
        "",       /* 62 - > */
@@ -88,98 +100,90 @@ static char *morsecode[] = {
        ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
        "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",
        "-.--.-", /* 91 - [ (really '(') */
        ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
        "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",
        "-.--.-", /* 91 - [ (really '(') */
-       "-··-·",  /* 92 - \ (really '/') */
+       "-..-.",  /* 92 - \ (really '/') */
        "-.--.-", /* 93 - ] (really ')') */
        "",       /* 94 - ^ */
        "-.--.-", /* 93 - ] (really ')') */
        "",       /* 94 - ^ */
-       "··--·-", /* 95 - _ */
+       "..--.-", /* 95 - _ */
        ".----.", /* 96 - ` */
        ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
        "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",
        "-.--.-", /* 123 - { (really '(') */
        "",       /* 124 - | */
        "-.--.-", /* 125 - } (really ')') */
        ".----.", /* 96 - ` */
        ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
        "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..",
        "-.--.-", /* 123 - { (really '(') */
        "",       /* 124 - | */
        "-.--.-", /* 125 - } (really ')') */
-       "-··-·",  /* 126 - ~ (really bar) */
-       "· · ·",  /* 127 - <del> (error) */
+       "-..-.",  /* 126 - ~ (really bar) */
+       ". . .",  /* 127 - <del> (error) */
 };
 
 static void playtone(struct ast_channel *chan, int tone, int len)
 {
        char dtmf[20];
 };
 
 static void playtone(struct ast_channel *chan, int tone, int len)
 {
        char dtmf[20];
-       snprintf(dtmf, sizeof(dtmf), "%d/%d", tone, DITLEN * len);
+       snprintf(dtmf, sizeof(dtmf), "%d/%d", tone, len);
        ast_playtones_start(chan, 0, dtmf, 0);
        ast_playtones_start(chan, 0, dtmf, 0);
-       ast_safe_sleep(chan, DITLEN * len);
+       ast_safe_sleep(chan, len);
        ast_playtones_stop(chan);
 }
 
        ast_playtones_stop(chan);
 }
 
-static int morsecode_exec(struct ast_channel *chan, void *data)
+static int morsecode_exec(struct ast_channel *chan, const char *data)
 {
 {
-       int res=0;
-       char *digit;
-       struct localuser *u;
-
-       LOCAL_USER_ADD(u);
+       int res=0, ditlen, tone;
+       const char *digit;
+       const char *ditlenc, *tonec;
 
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "Syntax: Morsecode(<string>) - no argument found\n");
 
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "Syntax: Morsecode(<string>) - no argument found\n");
-               LOCAL_USER_REMOVE(u);
                return 0;
        }
 
                return 0;
        }
 
+       /* Use variable MORESEDITLEN, if set (else 80) */
+       ast_channel_lock(chan);
+       ditlenc = pbx_builtin_getvar_helper(chan, "MORSEDITLEN");
+       if (ast_strlen_zero(ditlenc) || (sscanf(ditlenc, "%30d", &ditlen) != 1)) {
+               ditlen = 80;
+       }
+       ast_channel_unlock(chan);
+
+       /* Use variable MORSETONE, if set (else 800) */
+       ast_channel_lock(chan);
+       tonec = pbx_builtin_getvar_helper(chan, "MORSETONE");
+       if (ast_strlen_zero(tonec) || (sscanf(tonec, "%30d", &tone) != 1)) {
+               tone = 800;
+       }
+       ast_channel_unlock(chan);
+
        for (digit = data; *digit; digit++) {
        for (digit = data; *digit; digit++) {
-               char *dahdit;
-               if (*digit < 0) {
+               int digit2 = *digit;
+               const char *dahdit;
+               if (digit2 < 0) {
                        continue;
                }
                        continue;
                }
-               for (dahdit = morsecode[(int)*digit]; *dahdit; dahdit++) {
+               for (dahdit = morsecode[digit2]; *dahdit; dahdit++) {
                        if (*dahdit == '-') {
                        if (*dahdit == '-') {
-                               playtone(chan, TONE, 3);
+                               playtone(chan, tone, 3 * ditlen);
                        } else if (*dahdit == '.') {
                        } else if (*dahdit == '.') {
-                               playtone(chan, TONE, 1);
+                               playtone(chan, tone, 1 * ditlen);
                        } else {
                                /* Account for ditlen of silence immediately following */
                        } else {
                                /* Account for ditlen of silence immediately following */
-                               playtone(chan, 0, 2);
+                               playtone(chan, 0, 2 * ditlen);
                        }
 
                        /* Pause slightly between each dit and dah */
                        }
 
                        /* Pause slightly between each dit and dah */
-                       playtone(chan, 0, 1);
+                       playtone(chan, 0, 1 * ditlen);
                }
                /* Pause between characters */
                }
                /* Pause between characters */
-               playtone(chan, 0, 2);
+               playtone(chan, 0, 2 * ditlen);
        }
 
        }
 
-       LOCAL_USER_REMOVE(u);
        return res;
 }
 
        return res;
 }
 
-int unload_module(void)
+static int unload_module(void)
 {
 {
-       int res;
-
-       res = ast_unregister_application(app_morsecode);
-
-       STANDARD_HANGUP_LOCALUSERS;
-
-       return res;
-}
-
-int load_module(void)
-{
-       return ast_register_application(app_morsecode, morsecode_exec, morsecode_synopsis, morsecode_descrip);
+       return ast_unregister_application(app_morsecode);
 }
 
 }
 
-char *description(void)
+static int load_module(void)
 {
 {
-       return tdesc;
+       return ast_register_application_xml(app_morsecode, morsecode_exec);
 }
 
 }
 
-int usecount(void)
-{
-       int res;
-       STANDARD_USECOUNT(res);
-       return res;
-}
-
-char *key()
-{
-       return ASTERISK_GPL_KEY;
-}
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Morse code");