Tony Abbey
/
Morse-buddy-JohnF
Random morse code at 4 different speeds. Originally posted by John Fisher on the AQRP Yahoo group.
Diff: Morse_Code.cpp
- Revision:
- 0:8c725fbd8e0e
--- /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 ); + + } + +//============================================================= + + + +