Tony Abbey
/
Morse-buddy-JohnF
Random morse code at 4 different speeds. Originally posted by John Fisher on the AQRP Yahoo group.
Revision 0:8c725fbd8e0e, committed 2013-06-22
- 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
diff -r 000000000000 -r 8c725fbd8e0e Goodies.cpp --- /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; + + } + + } + +//============================================================== + +
diff -r 000000000000 -r 8c725fbd8e0e Goodies.h --- /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 + + + +
diff -r 000000000000 -r 8c725fbd8e0e Morse_Code.cpp --- /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 ); + + } + +//============================================================= + + + +
diff -r 000000000000 -r 8c725fbd8e0e Morse_Code.h --- /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 + +//=================================================================== + +
diff -r 000000000000 -r 8c725fbd8e0e main.cpp --- /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(); + + } + + } + +//=============================================================
diff -r 000000000000 -r 8c725fbd8e0e main.h --- /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
diff -r 000000000000 -r 8c725fbd8e0e mbed.bld --- /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