Random morse code at 4 different speeds. Originally posted by John Fisher on the AQRP Yahoo group.

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
tony1tf
Date:
Sat Jun 22 21:52:12 2013 +0000
Commit message:
Random morse code practice at 4 different speeds. Written by John Fisher and published on the AQRP Yahoo group.

Changed in this revision

Goodies.cpp Show annotated file Show diff for this revision Revisions of this file
Goodies.h Show annotated file Show diff for this revision Revisions of this file
Morse_Code.cpp Show annotated file Show diff for this revision Revisions of this file
Morse_Code.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Goodies.cpp	Sat Jun 22 21:52:12 2013 +0000
@@ -0,0 +1,68 @@
+
+//==============================================================
+//  Goodies  July 7, 2011  John H. Fisher - K5JHF
+//==============================================================
+
+//#include <WProgram.h>
+
+#include "Goodies.h"
+
+//==============================================================
+
+void    Goodies::Adjust ( int *value, int delta, int limit )    {
+    
+    int    temp;
+    
+    if ( delta == 0 )    return;
+    
+    temp    =    *value + delta;
+    
+    if ( delta > 0 )    {
+        
+        if ( temp < limit ) *value  =  temp;
+      
+        else                *value  =  limit;   
+    
+        }
+    
+    else    {
+        
+        if ( temp > limit ) *value  =  temp;
+      
+        else                *value  =  limit;   
+    
+        }
+
+    }
+
+//==============================================================
+
+void    Goodies::Adjust ( float *value, float delta, float limit )    {
+    
+    float    temp;
+    
+    if ( delta == 0 )    return;
+    
+    temp    =    *value + delta;
+    
+    if ( delta > 0 )    {
+        
+        if ( temp < limit ) *value  =  temp;
+      
+        else                *value  =  limit;   
+    
+        }
+    
+    else    {
+        
+        if ( temp > limit ) *value  =  temp;
+      
+        else                *value  =  limit;   
+    
+        }
+
+    }
+
+//==============================================================
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Goodies.h	Sat Jun 22 21:52:12 2013 +0000
@@ -0,0 +1,23 @@
+
+//==============================================================
+//  Goodies  July 7, 2011  John H. Fisher - K5JHF
+//==============================================================
+
+#ifndef  GOODIES_H
+#define  GOODIES_H
+
+class  Goodies  {
+
+    protected:
+    
+        void  Adjust ( int *value, int delta, int limit );
+        
+        void  Adjust ( float *value, float delta, float limit );     
+    
+    };
+    
+#endif   
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Morse_Code.cpp	Sat Jun 22 21:52:12 2013 +0000
@@ -0,0 +1,606 @@
+
+//==============================================================
+//  Morse Code  June 30, 2011  John H. Fisher - K5JHF
+//==============================================================
+
+#include "mbed.h"
+
+#include "main.h"
+
+#include "Morse_Code.h"
+
+const float sine_wave [ 32 ]    =   {
+    
+    sin (  1 * step ) / 2.0 + 0.5 ,
+    sin (  2 * step ) / 2.0 + 0.5 ,
+    sin (  3 * step ) / 2.0 + 0.5 ,
+    sin (  4 * step ) / 2.0 + 0.5 ,
+    sin (  5 * step ) / 2.0 + 0.5 ,
+    sin (  6 * step ) / 2.0 + 0.5 ,
+    sin (  7 * step ) / 2.0 + 0.5 ,
+    sin (  8 * step ) / 2.0 + 0.5 ,
+    sin (  9 * step ) / 2.0 + 0.5 ,
+    sin ( 10 * step ) / 2.0 + 0.5 ,
+    sin ( 11 * step ) / 2.0 + 0.5 ,
+    sin ( 12 * step ) / 2.0 + 0.5 ,
+    sin ( 13 * step ) / 2.0 + 0.5 ,
+    sin ( 14 * step ) / 2.0 + 0.5 ,
+    sin ( 15 * step ) / 2.0 + 0.5 ,
+    sin ( 16 * step ) / 2.0 + 0.5 ,
+    sin ( 17 * step ) / 2.0 + 0.5 ,
+    sin ( 18 * step ) / 2.0 + 0.5 ,
+    sin ( 19 * step ) / 2.0 + 0.5 ,
+    sin ( 20 * step ) / 2.0 + 0.5 ,
+    sin ( 21 * step ) / 2.0 + 0.5 ,
+    sin ( 22 * step ) / 2.0 + 0.5 ,
+    sin ( 23 * step ) / 2.0 + 0.5 ,
+    sin ( 24 * step ) / 2.0 + 0.5 ,
+    sin ( 25 * step ) / 2.0 + 0.5 ,
+    sin ( 26 * step ) / 2.0 + 0.5 ,
+    sin ( 27 * step ) / 2.0 + 0.5 ,
+    sin ( 28 * step ) / 2.0 + 0.5 ,
+    sin ( 29 * step ) / 2.0 + 0.5 ,
+    sin ( 30 * step ) / 2.0 + 0.5 ,
+    sin ( 31 * step ) / 2.0 + 0.5 ,
+    sin (  0 * step ) / 2.0 + 0.5 
+
+    };
+
+//==============================================================
+
+        Morse_Code::Morse_Code  (   float  WPM_Character,
+                                    float  WPM_Speed,
+                                    int    Tone_Frequency,
+                                    char   LED_Pin,
+                                    char   Speaker_Pin  )  {
+   
+            _WPM_Character  =  WPM_Character;
+
+            _WPM_Speed      =  WPM_Speed;
+           
+            _Tone_Frequency =  Tone_Frequency;
+            
+            _LED_Pin        =  LED_Pin;
+            
+            _Speaker_Pin    =  Speaker_Pin;
+
+            Calculate_Morse_Timing ( _WPM_Speed, _WPM_Character );
+  
+            Practice_On();
+        
+            }
+
+//==============================================================
+
+void    Morse_Code::Sound_On ( void )    {
+
+    Morse_Flag._Sound    =    1;
+
+    }
+
+//==============================================================
+
+void    Morse_Code::Sound_Off ( void )    {
+
+    Morse_Flag._Sound    =    0;
+
+    }
+
+//==============================================================
+
+void    Morse_Code::Sound_Toggle ( void )    {
+
+    Morse_Flag._Sound    ^=    1;
+    
+    }
+
+//==============================================================
+
+void    Morse_Code::Practice_On ( void )    {
+
+    Morse_Flag._Practice    =    1;
+
+    }
+
+//==============================================================
+
+void    Morse_Code::Practice_Off ( void )    {
+
+    Morse_Flag._Practice    =    0;
+
+    }
+
+//==============================================================
+
+void    Morse_Code::Practice_Toggle ( void )    {
+
+    Morse_Flag._Practice    ^=    1;
+    
+ //   Serial.print ( Morse_Flag._Practice );
+    
+    }
+
+//==============================================================
+
+int    Morse_Code::get_Practice ( void )    {
+
+    return    Morse_Flag._Practice;
+    
+    }
+
+//==============================================================
+
+void    Morse_Code::set_Tone ( int    frequency )    {
+
+    _Tone_Frequency    =    frequency;
+
+    }
+
+//==============================================================
+
+int    Morse_Code::get_Tone ( )    {
+
+    return    _Tone_Frequency;
+
+    }
+
+//==============================================================
+
+void    Morse_Code::Tone_Adjust    ( int  delta,  int limit )    {
+
+    Adjust ( &_Tone_Frequency, delta, limit );    
+    
+    }
+
+//==============================================================
+
+void    Morse_Code::set_WPM ( float  WPM_Speed )    {
+
+    _WPM_Speed    =    WPM_Speed;
+
+    }
+
+//==============================================================
+
+float    Morse_Code::get_WPM ( )    {
+
+    return    _WPM_Speed;
+
+    }
+
+//==============================================================
+
+void    Morse_Code::WPM_Adjust  (  float delta, float limit )    {
+    
+    Adjust ( &_WPM_Speed, delta, limit );    
+    
+    Calculate_Morse_Timing ( _WPM_Speed, _WPM_Character );
+    
+    }
+    
+//==============================================================
+
+char    Morse_Code::Morse ( char ASCII )    {
+
+    switch ( ASCII )  {
+      
+        case  'a':
+        case  'A':
+        
+        return  0x05;  //    B'0000 0101'    ;A
+ 
+        case  'b':
+        case  'B':
+        
+        return  0x18;  //    B'0001 1000'    ;B
+
+        case  'c':
+        case  'C':
+    
+            return  0x1A;  //    B'0001 1010'    ;C
+
+        case  'd':
+        case  'D':
+        
+        return  0x0C;  //    B'0000 1100'    ;D
+
+        case  'e':
+        case  'E':
+        
+        return  0x02;  //    B'0000 0010'    ;E
+
+        case  'f':
+        case  'F':
+        
+        return  0x12;  //    B'0001 0010'    ;F
+
+        case  'g':
+        case  'G':
+        
+        return  0x0E;  //    B'0000 1110'    ;G
+
+        case  'h':
+        case  'H':
+        
+        return  0x10;  //    B'0001 0000'    ;H
+
+        case  'i':
+        case  'I':
+        
+        return  0x04;  //    B'0000 0100'    ;I
+
+        case  'j':
+        case  'J':
+        
+        return  0x17;  //    B'0001 0111'    ;J
+
+        case  'k':
+        case  'K':
+        
+        return  0x0D;  //    B'0000 1101'    ;K
+
+        case  'l':
+        case  'L':
+        
+        return  0x14;  //    B'0001 0100'    ;L
+
+        case  'm':
+        case  'M':
+        
+        return  0x07;  //    B'0000 0111'    ;M
+
+        case  'n':
+        case  'N':
+        
+        return  0x06;  //    B'0000 0110'    ;N
+
+        case  'o':
+        case  'O':
+        
+        return  0x0F;  //    B'0000 1111'    ;O
+
+        case  'p':
+        case  'P':
+        
+        return  0x16;  //    B'0001 0110'    ;P
+
+        case  'q':
+        case  'Q':
+        
+        return  0x1D;  //    B'0001 1101'    ;Q
+
+        case  'r':
+        case  'R':
+        
+        return  0x0A;  //    B'0000 1010'    ;R
+
+        case  's':
+        case  'S':
+        
+        return  0x08;  //    B'0000 1000'    ;S
+
+        case  't':
+        case  'T':
+        
+        return  0x03;  //    B'0000 0011'    ;T
+
+        case  'u':
+        case  'U':
+        
+        return  0x09;  //    B'0000 1001'    ;U
+
+        case  'v':
+        case  'V':
+        
+        return  0x11;  //    B'0001 0001'    ;V
+
+        case  'w':
+        case  'W':
+        
+        return  0x0B;  //    B'0000 1011'    ;W
+
+        case  'x':
+        case  'X':
+        
+        return  0x19;  //    B'0001 1001'    ;X
+
+        case  'y':
+        case  'Y':
+        
+        return  0x1B;  //   B'0001 1011'    ;Y
+
+        case  'z':
+        case  'Z':
+        
+        return  0x1C;  //    B'0001 1100'    ;Z
+
+        case  '1':
+
+        return  0x2F;  //    B'0010 1111'    ;1
+
+        case  '2':
+
+        return  0x27;  //    B'0010 0111'    ;2
+
+        case  '3':
+
+        return  0x23;  //    B'0010 0011'    ;3
+
+        case  '4':
+
+        return  0x21;  //    B'0010 0001'    ;4
+
+        case  '5':
+
+        return  0x20;  //    B'0010 0000'    ;5
+
+        case  '6':
+
+        return  0x30;  //    B'0011 0000'    ;6
+
+        case  '7':
+
+        return  0x38;  //    B'0011 1000'    ;7
+
+        case  '8':
+
+        return  0x3C;  //    B'0011 1100'    ;8
+
+        case  '9':
+
+        return  0x3E;  //    B'0011 1110'    ;9
+ 
+        case  '0':
+
+        return  0x3F;  //    B'0011 1111'    ;0
+
+        case  '.':
+
+        return  0x55;  //    B'0101 0101'    ;.
+
+        case  ',':
+
+        return  0x73;  //    B'0111 0011'    ;,
+
+        case  ';':
+
+        return  0x6A;  //   B'0110 1010'    ;;
+
+        case  ':':
+
+        return  0x78;  //    B'0111 1000'    ;:
+
+        case  0x27:
+
+        return  0x5E;  //    B'0101 1110'    ;'
+
+        case  0x22:
+
+        return  0x52;  //    B'0101 0010'    ;"
+
+        case  '/':
+
+        return  0x32;  //   B'0011 0010'    ;/
+
+        case  '?':
+
+        return  0x4C;  //    B'0100 1100'    ;?
+
+        case  '-':
+
+        return  0x61;  //    B'0110 0001'    ;-
+
+        case  '_':
+
+        return  0x4D;  //    B'0100 1101'    ;_
+
+        case  '=':
+
+        return  0x31;  //    B'0011 0001'    ;=
+
+        case  '+':
+
+        return  0x2A;  //    B'0010 1010'    ;+
+
+        case  '!':
+
+        return  0x22;  //    B'0010 0010'    ;!
+
+        case  '@':
+
+        return  0x5A;  //    B'0101 1010'    ;@
+
+        case  '#':
+
+        return  0x54;  //    B'0101 0100'    ;#
+
+        case  '$':
+
+        return  0x89;  //    B'1000 1001'    ;$
+
+        case  '%':
+
+        return  0x35;  //    B'0011 0101'    ;%
+
+        case  '^':
+
+        return  0x0D;  //    B'0000 1101'    ;^
+
+        case  '&':
+
+        return  0x28;  //    B'0010 1000'    ;&
+
+        case  '*':
+
+        return  0x45;  //    B'0100 0101'    ;*
+
+        case  '(':
+
+        return  0x36;  //    B'0011 0110'    ;(
+
+        case  ')':
+
+        return  0x6D;  //    B'0110 1101'    ;)
+
+        case  0x09:
+
+        return  0x54;  //    B'0101 0100'    ;TAB
+
+        case  0x08:
+
+        return  0x80;  //    B'1000 0000'    ;Backspace
+
+        case  ' ':
+
+        return  0x01;  //    B'1000 0000'    ;space
+
+        default:
+        
+      return 0x01;
+
+        }
+    
+    }
+
+//===================================================================
+
+    void    Morse_Code::Send_Morse ( char Morse )    {
+
+        char    bit_counter    =    8;
+
+        while ( !( Morse & 0x80 ) ) {
+
+            Morse <<=    1;
+
+            --bit_counter;
+
+            }
+
+        Morse_Flag.last_bit    =    0;
+
+        while ( --bit_counter )    {
+
+          if ( bit_counter == 1 ) Morse_Flag.last_bit = 1;
+
+          if    ( ( Morse <<= 1 ) & 0x80 )  dah();
+
+          else                              dit();
+
+                  if ( !Morse_Flag.last_bit )       wait ( u );
+
+                  else if ( Morse_Flag.last_char )  wait ( tw );
+                
+                  else                              wait ( tc );        
+
+          }
+
+    }
+
+//===================================================================
+
+char  Morse_Code::Random_Code ( void )  {
+
+    char  ascii; 
+ 
+    static char  count; 
+  
+    ascii  =  32 + rand () % 95;
+  
+    Send_Morse ( Morse ( ascii ) );
+  
+    if ( ( count++ ) % 5 == 0 ) Morse_Flag.last_char = 1;
+
+    else                        Morse_Flag.last_char = 0;
+ 
+    return ascii;
+  
+    }
+
+//==============================================================
+//  The ARRL Morse Transmission Timing Standard
+
+void Morse_Code::Calculate_Morse_Timing ( float s, float c )  {  // In seconds for wait function
+   
+    if ( s >= 18.0 )  {
+ 
+        c   =  s;
+    
+        u   =  1.2 / c;
+    
+        tc  =  3.0 * u;
+ 
+        tw  =  7.0 * u; 
+    
+        }
+  
+    else  {
+    
+        u   = 1.2 / c;
+    
+        ta  =  ( 60.0 * c - 37.2 * s ) / ( s * c );
+    
+        tc  =  3.0 * ta / 19.0;  
+  
+        tw  =  7.0 * ta / 19.0;
+  
+        }
+  
+    }
+
+//==============================================================
+
+void  Morse_Code::dit  ( )  {
+  
+    led =   on;
+
+    Tone ( _Tone_Frequency, u );
+
+    led =   off;
+  
+   }
+  
+//==============================================================
+
+void  Morse_Code::dah  ( )  {
+
+    led =   on;
+
+    Tone ( _Tone_Frequency, 3.0 * u );
+
+    led =   off;
+  
+    }
+  
+//=============================================================
+ 
+void    Morse_Code::Tone ( int freq_factor, float duration )    {
+
+    Timer   timer;
+
+    char i = 0;
+    
+    unsigned int delay;
+
+    timer.start();
+    
+    timer.reset();
+    
+    do  {
+    
+        for ( i = 0; i < 32; i++ )  {
+
+            piezo  =   sine_wave [ i ];
+    
+            for ( delay = 0; delay < freq_factor; delay++ );  
+
+            }
+
+        } while ( timer.read() < duration );
+
+    }
+
+//=============================================================
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Morse_Code.h	Sat Jun 22 21:52:12 2013 +0000
@@ -0,0 +1,103 @@
+
+//==============================================================
+//  Morse Code  June 30, 2011  John H. Fisher - K5JHF
+//==============================================================
+
+#ifndef  MORSE_CODE_H
+#define  MORSE_CODE_H
+
+#include "Goodies.h"
+
+#define PI 3.141592654
+
+#define step PI/16
+
+extern const float sine_wave [ 32 ];
+
+class  Morse_Code : private Goodies  {
+    
+//===================================================================
+
+private:
+
+    float  u, _WPM_Character, _WPM_Speed, ta, tc, tw;
+
+    int    _Tone_Frequency;
+    
+    char   _LED_Pin,  _Speaker_Pin;
+
+//===================================================================
+
+    struct {
+       
+        int  last_bit:1;
+        
+        int  last_char:1;
+        
+        int  _Sound:1;  
+        
+        int  _Practice:1;  
+        
+      } Morse_Flag;
+
+//===================================================================
+
+    public:
+    
+        Morse_Code  (   float  WPM_Character  = 18.0,
+                        float  WPM_Speed      =  5.0,
+                        int    Tone_Frequency =  700,
+                        char   LED_Pin        =   11,
+                        char   Speaker_Pin    =    9  );
+                        
+        void    Sound_On ( void );                
+
+        void    Sound_Off ( void ); 
+
+        void    Sound_Toggle ( void );        
+
+        void    Practice_On ( void );                
+
+        void    Practice_Off ( void ); 
+
+        void    Practice_Toggle ( void ); 
+ 
+        int    get_Practice ( void );       
+
+        char  Morse ( char ASCII );
+
+        void  Send_Morse ( char Morse );
+
+        char  Random_Code ( void );
+        
+        void  set_Tone ( int  frequency );        
+        
+        int   get_Tone ( );        
+        
+        void  Tone_Adjust  ( int  delta,  int limit );
+        
+        void  set_WPM ( float WPM_Speed );        
+        
+        float get_WPM ( );        
+        
+        void  WPM_Adjust  (  float delta, float limit );
+
+    private:
+
+        void  Calculate_Morse_Timing ( float s, float c ) ;
+
+        void  dit  ( );
+
+        void  dah  ( );
+        
+        void  Tone ( int freq_factor, float duration ) ;
+
+    };
+      
+//===================================================================
+
+#endif
+
+//===================================================================
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Jun 22 21:52:12 2013 +0000
@@ -0,0 +1,37 @@
+#include "mbed.h"
+#include "main.h"
+#include "Morse_Code.h"
+
+DigitalOut  led     ( LED_BLUE );
+
+AnalogOut   piezo   ( PTE30 );
+
+Morse_Code  A   =   Morse_Code ( 18.0, 10.0, 400, 9, 11 );
+
+Morse_Code  B   =   Morse_Code ( 18.0, 15.0, 350, 9, 11 );
+
+Morse_Code  C   =   Morse_Code ( 18.0, 20.0, 300, 9, 11 );
+
+Morse_Code  D   =   Morse_Code ( 18.0, 30.0, 250, 9, 11 );
+
+int main() {
+
+    int i;
+
+    led     =   off;
+  
+    while(1) {
+
+        for ( i = 0; i < 10; i++ )  A.Random_Code();
+        
+        for ( i = 0; i < 10; i++ )  B.Random_Code();
+        
+        for ( i = 0; i < 10; i++ )  C.Random_Code();
+        
+        for ( i = 0; i < 10; i++ )  D.Random_Code();
+        
+        }
+
+    }
+
+//=============================================================
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Sat Jun 22 21:52:12 2013 +0000
@@ -0,0 +1,11 @@
+#ifndef  MAIN_H
+#define  MAIN_H
+
+#define on  0;
+#define off 1;
+
+extern  DigitalOut led;
+
+extern  AnalogOut piezo;
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Jun 22 21:52:12 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/3d0ef94e36ec
\ No newline at end of file