John's code modified for envelope shaping and different colours

Dependencies:   mbed

Fork of Morse-buddy-JohnF by Tony Abbey

Committer:
tony1tf
Date:
Sat Jun 22 23:13:14 2013 +0000
Revision:
1:ba9c803c7596
Parent:
0:8c725fbd8e0e
Child:
2:260128ae5746
Slowed down attack and decay of sound

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tony1tf 0:8c725fbd8e0e 1
tony1tf 0:8c725fbd8e0e 2 //==============================================================
tony1tf 0:8c725fbd8e0e 3 // Morse Code June 30, 2011 John H. Fisher - K5JHF
tony1tf 0:8c725fbd8e0e 4 //==============================================================
tony1tf 1:ba9c803c7596 5 // mods by Tony Abbey for envelope shaping - 22 June 2013
tony1tf 0:8c725fbd8e0e 6
tony1tf 0:8c725fbd8e0e 7 #include "mbed.h"
tony1tf 0:8c725fbd8e0e 8
tony1tf 0:8c725fbd8e0e 9 #include "main.h"
tony1tf 0:8c725fbd8e0e 10
tony1tf 0:8c725fbd8e0e 11 #include "Morse_Code.h"
tony1tf 0:8c725fbd8e0e 12
tony1tf 0:8c725fbd8e0e 13 const float sine_wave [ 32 ] = {
tony1tf 0:8c725fbd8e0e 14
tony1tf 0:8c725fbd8e0e 15 sin ( 1 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 16 sin ( 2 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 17 sin ( 3 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 18 sin ( 4 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 19 sin ( 5 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 20 sin ( 6 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 21 sin ( 7 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 22 sin ( 8 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 23 sin ( 9 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 24 sin ( 10 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 25 sin ( 11 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 26 sin ( 12 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 27 sin ( 13 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 28 sin ( 14 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 29 sin ( 15 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 30 sin ( 16 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 31 sin ( 17 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 32 sin ( 18 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 33 sin ( 19 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 34 sin ( 20 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 35 sin ( 21 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 36 sin ( 22 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 37 sin ( 23 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 38 sin ( 24 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 39 sin ( 25 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 40 sin ( 26 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 41 sin ( 27 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 42 sin ( 28 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 43 sin ( 29 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 44 sin ( 30 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 45 sin ( 31 * step ) / 2.0 + 0.5 ,
tony1tf 0:8c725fbd8e0e 46 sin ( 0 * step ) / 2.0 + 0.5
tony1tf 0:8c725fbd8e0e 47
tony1tf 0:8c725fbd8e0e 48 };
tony1tf 0:8c725fbd8e0e 49
tony1tf 0:8c725fbd8e0e 50 //==============================================================
tony1tf 0:8c725fbd8e0e 51
tony1tf 0:8c725fbd8e0e 52 Morse_Code::Morse_Code ( float WPM_Character,
tony1tf 0:8c725fbd8e0e 53 float WPM_Speed,
tony1tf 0:8c725fbd8e0e 54 int Tone_Frequency,
tony1tf 0:8c725fbd8e0e 55 char LED_Pin,
tony1tf 0:8c725fbd8e0e 56 char Speaker_Pin ) {
tony1tf 0:8c725fbd8e0e 57
tony1tf 0:8c725fbd8e0e 58 _WPM_Character = WPM_Character;
tony1tf 0:8c725fbd8e0e 59
tony1tf 0:8c725fbd8e0e 60 _WPM_Speed = WPM_Speed;
tony1tf 0:8c725fbd8e0e 61
tony1tf 0:8c725fbd8e0e 62 _Tone_Frequency = Tone_Frequency;
tony1tf 0:8c725fbd8e0e 63
tony1tf 0:8c725fbd8e0e 64 _LED_Pin = LED_Pin;
tony1tf 0:8c725fbd8e0e 65
tony1tf 0:8c725fbd8e0e 66 _Speaker_Pin = Speaker_Pin;
tony1tf 0:8c725fbd8e0e 67
tony1tf 0:8c725fbd8e0e 68 Calculate_Morse_Timing ( _WPM_Speed, _WPM_Character );
tony1tf 0:8c725fbd8e0e 69
tony1tf 0:8c725fbd8e0e 70 Practice_On();
tony1tf 0:8c725fbd8e0e 71
tony1tf 0:8c725fbd8e0e 72 }
tony1tf 0:8c725fbd8e0e 73
tony1tf 0:8c725fbd8e0e 74 //==============================================================
tony1tf 0:8c725fbd8e0e 75
tony1tf 0:8c725fbd8e0e 76 void Morse_Code::Sound_On ( void ) {
tony1tf 0:8c725fbd8e0e 77
tony1tf 0:8c725fbd8e0e 78 Morse_Flag._Sound = 1;
tony1tf 0:8c725fbd8e0e 79
tony1tf 0:8c725fbd8e0e 80 }
tony1tf 0:8c725fbd8e0e 81
tony1tf 0:8c725fbd8e0e 82 //==============================================================
tony1tf 0:8c725fbd8e0e 83
tony1tf 0:8c725fbd8e0e 84 void Morse_Code::Sound_Off ( void ) {
tony1tf 0:8c725fbd8e0e 85
tony1tf 0:8c725fbd8e0e 86 Morse_Flag._Sound = 0;
tony1tf 0:8c725fbd8e0e 87
tony1tf 0:8c725fbd8e0e 88 }
tony1tf 0:8c725fbd8e0e 89
tony1tf 0:8c725fbd8e0e 90 //==============================================================
tony1tf 0:8c725fbd8e0e 91
tony1tf 0:8c725fbd8e0e 92 void Morse_Code::Sound_Toggle ( void ) {
tony1tf 0:8c725fbd8e0e 93
tony1tf 0:8c725fbd8e0e 94 Morse_Flag._Sound ^= 1;
tony1tf 0:8c725fbd8e0e 95
tony1tf 0:8c725fbd8e0e 96 }
tony1tf 0:8c725fbd8e0e 97
tony1tf 0:8c725fbd8e0e 98 //==============================================================
tony1tf 0:8c725fbd8e0e 99
tony1tf 0:8c725fbd8e0e 100 void Morse_Code::Practice_On ( void ) {
tony1tf 0:8c725fbd8e0e 101
tony1tf 0:8c725fbd8e0e 102 Morse_Flag._Practice = 1;
tony1tf 0:8c725fbd8e0e 103
tony1tf 0:8c725fbd8e0e 104 }
tony1tf 0:8c725fbd8e0e 105
tony1tf 0:8c725fbd8e0e 106 //==============================================================
tony1tf 0:8c725fbd8e0e 107
tony1tf 0:8c725fbd8e0e 108 void Morse_Code::Practice_Off ( void ) {
tony1tf 0:8c725fbd8e0e 109
tony1tf 0:8c725fbd8e0e 110 Morse_Flag._Practice = 0;
tony1tf 0:8c725fbd8e0e 111
tony1tf 0:8c725fbd8e0e 112 }
tony1tf 0:8c725fbd8e0e 113
tony1tf 0:8c725fbd8e0e 114 //==============================================================
tony1tf 0:8c725fbd8e0e 115
tony1tf 0:8c725fbd8e0e 116 void Morse_Code::Practice_Toggle ( void ) {
tony1tf 0:8c725fbd8e0e 117
tony1tf 0:8c725fbd8e0e 118 Morse_Flag._Practice ^= 1;
tony1tf 0:8c725fbd8e0e 119
tony1tf 0:8c725fbd8e0e 120 // Serial.print ( Morse_Flag._Practice );
tony1tf 0:8c725fbd8e0e 121
tony1tf 0:8c725fbd8e0e 122 }
tony1tf 0:8c725fbd8e0e 123
tony1tf 0:8c725fbd8e0e 124 //==============================================================
tony1tf 0:8c725fbd8e0e 125
tony1tf 0:8c725fbd8e0e 126 int Morse_Code::get_Practice ( void ) {
tony1tf 0:8c725fbd8e0e 127
tony1tf 0:8c725fbd8e0e 128 return Morse_Flag._Practice;
tony1tf 0:8c725fbd8e0e 129
tony1tf 0:8c725fbd8e0e 130 }
tony1tf 0:8c725fbd8e0e 131
tony1tf 0:8c725fbd8e0e 132 //==============================================================
tony1tf 0:8c725fbd8e0e 133
tony1tf 0:8c725fbd8e0e 134 void Morse_Code::set_Tone ( int frequency ) {
tony1tf 0:8c725fbd8e0e 135
tony1tf 0:8c725fbd8e0e 136 _Tone_Frequency = frequency;
tony1tf 0:8c725fbd8e0e 137
tony1tf 0:8c725fbd8e0e 138 }
tony1tf 0:8c725fbd8e0e 139
tony1tf 0:8c725fbd8e0e 140 //==============================================================
tony1tf 0:8c725fbd8e0e 141
tony1tf 0:8c725fbd8e0e 142 int Morse_Code::get_Tone ( ) {
tony1tf 0:8c725fbd8e0e 143
tony1tf 0:8c725fbd8e0e 144 return _Tone_Frequency;
tony1tf 0:8c725fbd8e0e 145
tony1tf 0:8c725fbd8e0e 146 }
tony1tf 0:8c725fbd8e0e 147
tony1tf 0:8c725fbd8e0e 148 //==============================================================
tony1tf 0:8c725fbd8e0e 149
tony1tf 0:8c725fbd8e0e 150 void Morse_Code::Tone_Adjust ( int delta, int limit ) {
tony1tf 0:8c725fbd8e0e 151
tony1tf 0:8c725fbd8e0e 152 Adjust ( &_Tone_Frequency, delta, limit );
tony1tf 0:8c725fbd8e0e 153
tony1tf 0:8c725fbd8e0e 154 }
tony1tf 0:8c725fbd8e0e 155
tony1tf 0:8c725fbd8e0e 156 //==============================================================
tony1tf 0:8c725fbd8e0e 157
tony1tf 0:8c725fbd8e0e 158 void Morse_Code::set_WPM ( float WPM_Speed ) {
tony1tf 0:8c725fbd8e0e 159
tony1tf 0:8c725fbd8e0e 160 _WPM_Speed = WPM_Speed;
tony1tf 0:8c725fbd8e0e 161
tony1tf 0:8c725fbd8e0e 162 }
tony1tf 0:8c725fbd8e0e 163
tony1tf 0:8c725fbd8e0e 164 //==============================================================
tony1tf 0:8c725fbd8e0e 165
tony1tf 0:8c725fbd8e0e 166 float Morse_Code::get_WPM ( ) {
tony1tf 0:8c725fbd8e0e 167
tony1tf 0:8c725fbd8e0e 168 return _WPM_Speed;
tony1tf 0:8c725fbd8e0e 169
tony1tf 0:8c725fbd8e0e 170 }
tony1tf 0:8c725fbd8e0e 171
tony1tf 0:8c725fbd8e0e 172 //==============================================================
tony1tf 0:8c725fbd8e0e 173
tony1tf 0:8c725fbd8e0e 174 void Morse_Code::WPM_Adjust ( float delta, float limit ) {
tony1tf 0:8c725fbd8e0e 175
tony1tf 0:8c725fbd8e0e 176 Adjust ( &_WPM_Speed, delta, limit );
tony1tf 0:8c725fbd8e0e 177
tony1tf 0:8c725fbd8e0e 178 Calculate_Morse_Timing ( _WPM_Speed, _WPM_Character );
tony1tf 0:8c725fbd8e0e 179
tony1tf 0:8c725fbd8e0e 180 }
tony1tf 0:8c725fbd8e0e 181
tony1tf 0:8c725fbd8e0e 182 //==============================================================
tony1tf 0:8c725fbd8e0e 183
tony1tf 0:8c725fbd8e0e 184 char Morse_Code::Morse ( char ASCII ) {
tony1tf 0:8c725fbd8e0e 185
tony1tf 0:8c725fbd8e0e 186 switch ( ASCII ) {
tony1tf 0:8c725fbd8e0e 187
tony1tf 0:8c725fbd8e0e 188 case 'a':
tony1tf 0:8c725fbd8e0e 189 case 'A':
tony1tf 0:8c725fbd8e0e 190
tony1tf 0:8c725fbd8e0e 191 return 0x05; // B'0000 0101' ;A
tony1tf 0:8c725fbd8e0e 192
tony1tf 0:8c725fbd8e0e 193 case 'b':
tony1tf 0:8c725fbd8e0e 194 case 'B':
tony1tf 0:8c725fbd8e0e 195
tony1tf 0:8c725fbd8e0e 196 return 0x18; // B'0001 1000' ;B
tony1tf 0:8c725fbd8e0e 197
tony1tf 0:8c725fbd8e0e 198 case 'c':
tony1tf 0:8c725fbd8e0e 199 case 'C':
tony1tf 0:8c725fbd8e0e 200
tony1tf 0:8c725fbd8e0e 201 return 0x1A; // B'0001 1010' ;C
tony1tf 0:8c725fbd8e0e 202
tony1tf 0:8c725fbd8e0e 203 case 'd':
tony1tf 0:8c725fbd8e0e 204 case 'D':
tony1tf 0:8c725fbd8e0e 205
tony1tf 0:8c725fbd8e0e 206 return 0x0C; // B'0000 1100' ;D
tony1tf 0:8c725fbd8e0e 207
tony1tf 0:8c725fbd8e0e 208 case 'e':
tony1tf 0:8c725fbd8e0e 209 case 'E':
tony1tf 0:8c725fbd8e0e 210
tony1tf 0:8c725fbd8e0e 211 return 0x02; // B'0000 0010' ;E
tony1tf 0:8c725fbd8e0e 212
tony1tf 0:8c725fbd8e0e 213 case 'f':
tony1tf 0:8c725fbd8e0e 214 case 'F':
tony1tf 0:8c725fbd8e0e 215
tony1tf 0:8c725fbd8e0e 216 return 0x12; // B'0001 0010' ;F
tony1tf 0:8c725fbd8e0e 217
tony1tf 0:8c725fbd8e0e 218 case 'g':
tony1tf 0:8c725fbd8e0e 219 case 'G':
tony1tf 0:8c725fbd8e0e 220
tony1tf 0:8c725fbd8e0e 221 return 0x0E; // B'0000 1110' ;G
tony1tf 0:8c725fbd8e0e 222
tony1tf 0:8c725fbd8e0e 223 case 'h':
tony1tf 0:8c725fbd8e0e 224 case 'H':
tony1tf 0:8c725fbd8e0e 225
tony1tf 0:8c725fbd8e0e 226 return 0x10; // B'0001 0000' ;H
tony1tf 0:8c725fbd8e0e 227
tony1tf 0:8c725fbd8e0e 228 case 'i':
tony1tf 0:8c725fbd8e0e 229 case 'I':
tony1tf 0:8c725fbd8e0e 230
tony1tf 0:8c725fbd8e0e 231 return 0x04; // B'0000 0100' ;I
tony1tf 0:8c725fbd8e0e 232
tony1tf 0:8c725fbd8e0e 233 case 'j':
tony1tf 0:8c725fbd8e0e 234 case 'J':
tony1tf 0:8c725fbd8e0e 235
tony1tf 0:8c725fbd8e0e 236 return 0x17; // B'0001 0111' ;J
tony1tf 0:8c725fbd8e0e 237
tony1tf 0:8c725fbd8e0e 238 case 'k':
tony1tf 0:8c725fbd8e0e 239 case 'K':
tony1tf 0:8c725fbd8e0e 240
tony1tf 0:8c725fbd8e0e 241 return 0x0D; // B'0000 1101' ;K
tony1tf 0:8c725fbd8e0e 242
tony1tf 0:8c725fbd8e0e 243 case 'l':
tony1tf 0:8c725fbd8e0e 244 case 'L':
tony1tf 0:8c725fbd8e0e 245
tony1tf 0:8c725fbd8e0e 246 return 0x14; // B'0001 0100' ;L
tony1tf 0:8c725fbd8e0e 247
tony1tf 0:8c725fbd8e0e 248 case 'm':
tony1tf 0:8c725fbd8e0e 249 case 'M':
tony1tf 0:8c725fbd8e0e 250
tony1tf 0:8c725fbd8e0e 251 return 0x07; // B'0000 0111' ;M
tony1tf 0:8c725fbd8e0e 252
tony1tf 0:8c725fbd8e0e 253 case 'n':
tony1tf 0:8c725fbd8e0e 254 case 'N':
tony1tf 0:8c725fbd8e0e 255
tony1tf 0:8c725fbd8e0e 256 return 0x06; // B'0000 0110' ;N
tony1tf 0:8c725fbd8e0e 257
tony1tf 0:8c725fbd8e0e 258 case 'o':
tony1tf 0:8c725fbd8e0e 259 case 'O':
tony1tf 0:8c725fbd8e0e 260
tony1tf 0:8c725fbd8e0e 261 return 0x0F; // B'0000 1111' ;O
tony1tf 0:8c725fbd8e0e 262
tony1tf 0:8c725fbd8e0e 263 case 'p':
tony1tf 0:8c725fbd8e0e 264 case 'P':
tony1tf 0:8c725fbd8e0e 265
tony1tf 0:8c725fbd8e0e 266 return 0x16; // B'0001 0110' ;P
tony1tf 0:8c725fbd8e0e 267
tony1tf 0:8c725fbd8e0e 268 case 'q':
tony1tf 0:8c725fbd8e0e 269 case 'Q':
tony1tf 0:8c725fbd8e0e 270
tony1tf 0:8c725fbd8e0e 271 return 0x1D; // B'0001 1101' ;Q
tony1tf 0:8c725fbd8e0e 272
tony1tf 0:8c725fbd8e0e 273 case 'r':
tony1tf 0:8c725fbd8e0e 274 case 'R':
tony1tf 0:8c725fbd8e0e 275
tony1tf 0:8c725fbd8e0e 276 return 0x0A; // B'0000 1010' ;R
tony1tf 0:8c725fbd8e0e 277
tony1tf 0:8c725fbd8e0e 278 case 's':
tony1tf 0:8c725fbd8e0e 279 case 'S':
tony1tf 0:8c725fbd8e0e 280
tony1tf 0:8c725fbd8e0e 281 return 0x08; // B'0000 1000' ;S
tony1tf 0:8c725fbd8e0e 282
tony1tf 0:8c725fbd8e0e 283 case 't':
tony1tf 0:8c725fbd8e0e 284 case 'T':
tony1tf 0:8c725fbd8e0e 285
tony1tf 0:8c725fbd8e0e 286 return 0x03; // B'0000 0011' ;T
tony1tf 0:8c725fbd8e0e 287
tony1tf 0:8c725fbd8e0e 288 case 'u':
tony1tf 0:8c725fbd8e0e 289 case 'U':
tony1tf 0:8c725fbd8e0e 290
tony1tf 0:8c725fbd8e0e 291 return 0x09; // B'0000 1001' ;U
tony1tf 0:8c725fbd8e0e 292
tony1tf 0:8c725fbd8e0e 293 case 'v':
tony1tf 0:8c725fbd8e0e 294 case 'V':
tony1tf 0:8c725fbd8e0e 295
tony1tf 0:8c725fbd8e0e 296 return 0x11; // B'0001 0001' ;V
tony1tf 0:8c725fbd8e0e 297
tony1tf 0:8c725fbd8e0e 298 case 'w':
tony1tf 0:8c725fbd8e0e 299 case 'W':
tony1tf 0:8c725fbd8e0e 300
tony1tf 0:8c725fbd8e0e 301 return 0x0B; // B'0000 1011' ;W
tony1tf 0:8c725fbd8e0e 302
tony1tf 0:8c725fbd8e0e 303 case 'x':
tony1tf 0:8c725fbd8e0e 304 case 'X':
tony1tf 0:8c725fbd8e0e 305
tony1tf 0:8c725fbd8e0e 306 return 0x19; // B'0001 1001' ;X
tony1tf 0:8c725fbd8e0e 307
tony1tf 0:8c725fbd8e0e 308 case 'y':
tony1tf 0:8c725fbd8e0e 309 case 'Y':
tony1tf 0:8c725fbd8e0e 310
tony1tf 0:8c725fbd8e0e 311 return 0x1B; // B'0001 1011' ;Y
tony1tf 0:8c725fbd8e0e 312
tony1tf 0:8c725fbd8e0e 313 case 'z':
tony1tf 0:8c725fbd8e0e 314 case 'Z':
tony1tf 0:8c725fbd8e0e 315
tony1tf 0:8c725fbd8e0e 316 return 0x1C; // B'0001 1100' ;Z
tony1tf 0:8c725fbd8e0e 317
tony1tf 0:8c725fbd8e0e 318 case '1':
tony1tf 0:8c725fbd8e0e 319
tony1tf 0:8c725fbd8e0e 320 return 0x2F; // B'0010 1111' ;1
tony1tf 0:8c725fbd8e0e 321
tony1tf 0:8c725fbd8e0e 322 case '2':
tony1tf 0:8c725fbd8e0e 323
tony1tf 0:8c725fbd8e0e 324 return 0x27; // B'0010 0111' ;2
tony1tf 0:8c725fbd8e0e 325
tony1tf 0:8c725fbd8e0e 326 case '3':
tony1tf 0:8c725fbd8e0e 327
tony1tf 0:8c725fbd8e0e 328 return 0x23; // B'0010 0011' ;3
tony1tf 0:8c725fbd8e0e 329
tony1tf 0:8c725fbd8e0e 330 case '4':
tony1tf 0:8c725fbd8e0e 331
tony1tf 0:8c725fbd8e0e 332 return 0x21; // B'0010 0001' ;4
tony1tf 0:8c725fbd8e0e 333
tony1tf 0:8c725fbd8e0e 334 case '5':
tony1tf 0:8c725fbd8e0e 335
tony1tf 0:8c725fbd8e0e 336 return 0x20; // B'0010 0000' ;5
tony1tf 0:8c725fbd8e0e 337
tony1tf 0:8c725fbd8e0e 338 case '6':
tony1tf 0:8c725fbd8e0e 339
tony1tf 0:8c725fbd8e0e 340 return 0x30; // B'0011 0000' ;6
tony1tf 0:8c725fbd8e0e 341
tony1tf 0:8c725fbd8e0e 342 case '7':
tony1tf 0:8c725fbd8e0e 343
tony1tf 0:8c725fbd8e0e 344 return 0x38; // B'0011 1000' ;7
tony1tf 0:8c725fbd8e0e 345
tony1tf 0:8c725fbd8e0e 346 case '8':
tony1tf 0:8c725fbd8e0e 347
tony1tf 0:8c725fbd8e0e 348 return 0x3C; // B'0011 1100' ;8
tony1tf 0:8c725fbd8e0e 349
tony1tf 0:8c725fbd8e0e 350 case '9':
tony1tf 0:8c725fbd8e0e 351
tony1tf 0:8c725fbd8e0e 352 return 0x3E; // B'0011 1110' ;9
tony1tf 0:8c725fbd8e0e 353
tony1tf 0:8c725fbd8e0e 354 case '0':
tony1tf 0:8c725fbd8e0e 355
tony1tf 0:8c725fbd8e0e 356 return 0x3F; // B'0011 1111' ;0
tony1tf 0:8c725fbd8e0e 357
tony1tf 0:8c725fbd8e0e 358 case '.':
tony1tf 0:8c725fbd8e0e 359
tony1tf 0:8c725fbd8e0e 360 return 0x55; // B'0101 0101' ;.
tony1tf 0:8c725fbd8e0e 361
tony1tf 0:8c725fbd8e0e 362 case ',':
tony1tf 0:8c725fbd8e0e 363
tony1tf 0:8c725fbd8e0e 364 return 0x73; // B'0111 0011' ;,
tony1tf 0:8c725fbd8e0e 365
tony1tf 0:8c725fbd8e0e 366 case ';':
tony1tf 0:8c725fbd8e0e 367
tony1tf 0:8c725fbd8e0e 368 return 0x6A; // B'0110 1010' ;;
tony1tf 0:8c725fbd8e0e 369
tony1tf 0:8c725fbd8e0e 370 case ':':
tony1tf 0:8c725fbd8e0e 371
tony1tf 0:8c725fbd8e0e 372 return 0x78; // B'0111 1000' ;:
tony1tf 0:8c725fbd8e0e 373
tony1tf 0:8c725fbd8e0e 374 case 0x27:
tony1tf 0:8c725fbd8e0e 375
tony1tf 0:8c725fbd8e0e 376 return 0x5E; // B'0101 1110' ;'
tony1tf 0:8c725fbd8e0e 377
tony1tf 0:8c725fbd8e0e 378 case 0x22:
tony1tf 0:8c725fbd8e0e 379
tony1tf 0:8c725fbd8e0e 380 return 0x52; // B'0101 0010' ;"
tony1tf 0:8c725fbd8e0e 381
tony1tf 0:8c725fbd8e0e 382 case '/':
tony1tf 0:8c725fbd8e0e 383
tony1tf 0:8c725fbd8e0e 384 return 0x32; // B'0011 0010' ;/
tony1tf 0:8c725fbd8e0e 385
tony1tf 0:8c725fbd8e0e 386 case '?':
tony1tf 0:8c725fbd8e0e 387
tony1tf 0:8c725fbd8e0e 388 return 0x4C; // B'0100 1100' ;?
tony1tf 0:8c725fbd8e0e 389
tony1tf 0:8c725fbd8e0e 390 case '-':
tony1tf 0:8c725fbd8e0e 391
tony1tf 0:8c725fbd8e0e 392 return 0x61; // B'0110 0001' ;-
tony1tf 0:8c725fbd8e0e 393
tony1tf 0:8c725fbd8e0e 394 case '_':
tony1tf 0:8c725fbd8e0e 395
tony1tf 0:8c725fbd8e0e 396 return 0x4D; // B'0100 1101' ;_
tony1tf 0:8c725fbd8e0e 397
tony1tf 0:8c725fbd8e0e 398 case '=':
tony1tf 0:8c725fbd8e0e 399
tony1tf 0:8c725fbd8e0e 400 return 0x31; // B'0011 0001' ;=
tony1tf 0:8c725fbd8e0e 401
tony1tf 0:8c725fbd8e0e 402 case '+':
tony1tf 0:8c725fbd8e0e 403
tony1tf 0:8c725fbd8e0e 404 return 0x2A; // B'0010 1010' ;+
tony1tf 0:8c725fbd8e0e 405
tony1tf 0:8c725fbd8e0e 406 case '!':
tony1tf 0:8c725fbd8e0e 407
tony1tf 0:8c725fbd8e0e 408 return 0x22; // B'0010 0010' ;!
tony1tf 0:8c725fbd8e0e 409
tony1tf 0:8c725fbd8e0e 410 case '@':
tony1tf 0:8c725fbd8e0e 411
tony1tf 0:8c725fbd8e0e 412 return 0x5A; // B'0101 1010' ;@
tony1tf 0:8c725fbd8e0e 413
tony1tf 0:8c725fbd8e0e 414 case '#':
tony1tf 0:8c725fbd8e0e 415
tony1tf 0:8c725fbd8e0e 416 return 0x54; // B'0101 0100' ;#
tony1tf 0:8c725fbd8e0e 417
tony1tf 0:8c725fbd8e0e 418 case '$':
tony1tf 0:8c725fbd8e0e 419
tony1tf 0:8c725fbd8e0e 420 return 0x89; // B'1000 1001' ;$
tony1tf 0:8c725fbd8e0e 421
tony1tf 0:8c725fbd8e0e 422 case '%':
tony1tf 0:8c725fbd8e0e 423
tony1tf 0:8c725fbd8e0e 424 return 0x35; // B'0011 0101' ;%
tony1tf 0:8c725fbd8e0e 425
tony1tf 0:8c725fbd8e0e 426 case '^':
tony1tf 0:8c725fbd8e0e 427
tony1tf 0:8c725fbd8e0e 428 return 0x0D; // B'0000 1101' ;^
tony1tf 0:8c725fbd8e0e 429
tony1tf 0:8c725fbd8e0e 430 case '&':
tony1tf 0:8c725fbd8e0e 431
tony1tf 0:8c725fbd8e0e 432 return 0x28; // B'0010 1000' ;&
tony1tf 0:8c725fbd8e0e 433
tony1tf 0:8c725fbd8e0e 434 case '*':
tony1tf 0:8c725fbd8e0e 435
tony1tf 0:8c725fbd8e0e 436 return 0x45; // B'0100 0101' ;*
tony1tf 0:8c725fbd8e0e 437
tony1tf 0:8c725fbd8e0e 438 case '(':
tony1tf 0:8c725fbd8e0e 439
tony1tf 0:8c725fbd8e0e 440 return 0x36; // B'0011 0110' ;(
tony1tf 0:8c725fbd8e0e 441
tony1tf 0:8c725fbd8e0e 442 case ')':
tony1tf 0:8c725fbd8e0e 443
tony1tf 0:8c725fbd8e0e 444 return 0x6D; // B'0110 1101' ;)
tony1tf 0:8c725fbd8e0e 445
tony1tf 0:8c725fbd8e0e 446 case 0x09:
tony1tf 0:8c725fbd8e0e 447
tony1tf 0:8c725fbd8e0e 448 return 0x54; // B'0101 0100' ;TAB
tony1tf 0:8c725fbd8e0e 449
tony1tf 0:8c725fbd8e0e 450 case 0x08:
tony1tf 0:8c725fbd8e0e 451
tony1tf 0:8c725fbd8e0e 452 return 0x80; // B'1000 0000' ;Backspace
tony1tf 0:8c725fbd8e0e 453
tony1tf 0:8c725fbd8e0e 454 case ' ':
tony1tf 0:8c725fbd8e0e 455
tony1tf 0:8c725fbd8e0e 456 return 0x01; // B'1000 0000' ;space
tony1tf 0:8c725fbd8e0e 457
tony1tf 0:8c725fbd8e0e 458 default:
tony1tf 0:8c725fbd8e0e 459
tony1tf 0:8c725fbd8e0e 460 return 0x01;
tony1tf 0:8c725fbd8e0e 461
tony1tf 0:8c725fbd8e0e 462 }
tony1tf 0:8c725fbd8e0e 463
tony1tf 0:8c725fbd8e0e 464 }
tony1tf 0:8c725fbd8e0e 465
tony1tf 0:8c725fbd8e0e 466 //===================================================================
tony1tf 0:8c725fbd8e0e 467
tony1tf 0:8c725fbd8e0e 468 void Morse_Code::Send_Morse ( char Morse ) {
tony1tf 0:8c725fbd8e0e 469
tony1tf 0:8c725fbd8e0e 470 char bit_counter = 8;
tony1tf 0:8c725fbd8e0e 471
tony1tf 0:8c725fbd8e0e 472 while ( !( Morse & 0x80 ) ) {
tony1tf 0:8c725fbd8e0e 473
tony1tf 0:8c725fbd8e0e 474 Morse <<= 1;
tony1tf 0:8c725fbd8e0e 475
tony1tf 0:8c725fbd8e0e 476 --bit_counter;
tony1tf 0:8c725fbd8e0e 477
tony1tf 0:8c725fbd8e0e 478 }
tony1tf 0:8c725fbd8e0e 479
tony1tf 0:8c725fbd8e0e 480 Morse_Flag.last_bit = 0;
tony1tf 0:8c725fbd8e0e 481
tony1tf 0:8c725fbd8e0e 482 while ( --bit_counter ) {
tony1tf 0:8c725fbd8e0e 483
tony1tf 0:8c725fbd8e0e 484 if ( bit_counter == 1 ) Morse_Flag.last_bit = 1;
tony1tf 0:8c725fbd8e0e 485
tony1tf 0:8c725fbd8e0e 486 if ( ( Morse <<= 1 ) & 0x80 ) dah();
tony1tf 0:8c725fbd8e0e 487
tony1tf 0:8c725fbd8e0e 488 else dit();
tony1tf 0:8c725fbd8e0e 489
tony1tf 0:8c725fbd8e0e 490 if ( !Morse_Flag.last_bit ) wait ( u );
tony1tf 0:8c725fbd8e0e 491
tony1tf 0:8c725fbd8e0e 492 else if ( Morse_Flag.last_char ) wait ( tw );
tony1tf 0:8c725fbd8e0e 493
tony1tf 0:8c725fbd8e0e 494 else wait ( tc );
tony1tf 0:8c725fbd8e0e 495
tony1tf 0:8c725fbd8e0e 496 }
tony1tf 0:8c725fbd8e0e 497
tony1tf 0:8c725fbd8e0e 498 }
tony1tf 0:8c725fbd8e0e 499
tony1tf 0:8c725fbd8e0e 500 //===================================================================
tony1tf 0:8c725fbd8e0e 501
tony1tf 0:8c725fbd8e0e 502 char Morse_Code::Random_Code ( void ) {
tony1tf 0:8c725fbd8e0e 503
tony1tf 0:8c725fbd8e0e 504 char ascii;
tony1tf 0:8c725fbd8e0e 505
tony1tf 0:8c725fbd8e0e 506 static char count;
tony1tf 0:8c725fbd8e0e 507
tony1tf 0:8c725fbd8e0e 508 ascii = 32 + rand () % 95;
tony1tf 0:8c725fbd8e0e 509
tony1tf 0:8c725fbd8e0e 510 Send_Morse ( Morse ( ascii ) );
tony1tf 0:8c725fbd8e0e 511
tony1tf 0:8c725fbd8e0e 512 if ( ( count++ ) % 5 == 0 ) Morse_Flag.last_char = 1;
tony1tf 0:8c725fbd8e0e 513
tony1tf 0:8c725fbd8e0e 514 else Morse_Flag.last_char = 0;
tony1tf 0:8c725fbd8e0e 515
tony1tf 0:8c725fbd8e0e 516 return ascii;
tony1tf 0:8c725fbd8e0e 517
tony1tf 0:8c725fbd8e0e 518 }
tony1tf 0:8c725fbd8e0e 519
tony1tf 0:8c725fbd8e0e 520 //==============================================================
tony1tf 0:8c725fbd8e0e 521 // The ARRL Morse Transmission Timing Standard
tony1tf 0:8c725fbd8e0e 522
tony1tf 0:8c725fbd8e0e 523 void Morse_Code::Calculate_Morse_Timing ( float s, float c ) { // In seconds for wait function
tony1tf 0:8c725fbd8e0e 524
tony1tf 0:8c725fbd8e0e 525 if ( s >= 18.0 ) {
tony1tf 0:8c725fbd8e0e 526
tony1tf 0:8c725fbd8e0e 527 c = s;
tony1tf 0:8c725fbd8e0e 528
tony1tf 0:8c725fbd8e0e 529 u = 1.2 / c;
tony1tf 0:8c725fbd8e0e 530
tony1tf 0:8c725fbd8e0e 531 tc = 3.0 * u;
tony1tf 0:8c725fbd8e0e 532
tony1tf 0:8c725fbd8e0e 533 tw = 7.0 * u;
tony1tf 0:8c725fbd8e0e 534
tony1tf 0:8c725fbd8e0e 535 }
tony1tf 0:8c725fbd8e0e 536
tony1tf 0:8c725fbd8e0e 537 else {
tony1tf 0:8c725fbd8e0e 538
tony1tf 0:8c725fbd8e0e 539 u = 1.2 / c;
tony1tf 0:8c725fbd8e0e 540
tony1tf 0:8c725fbd8e0e 541 ta = ( 60.0 * c - 37.2 * s ) / ( s * c );
tony1tf 0:8c725fbd8e0e 542
tony1tf 0:8c725fbd8e0e 543 tc = 3.0 * ta / 19.0;
tony1tf 0:8c725fbd8e0e 544
tony1tf 0:8c725fbd8e0e 545 tw = 7.0 * ta / 19.0;
tony1tf 0:8c725fbd8e0e 546
tony1tf 0:8c725fbd8e0e 547 }
tony1tf 0:8c725fbd8e0e 548
tony1tf 0:8c725fbd8e0e 549 }
tony1tf 0:8c725fbd8e0e 550
tony1tf 0:8c725fbd8e0e 551 //==============================================================
tony1tf 0:8c725fbd8e0e 552
tony1tf 0:8c725fbd8e0e 553 void Morse_Code::dit ( ) {
tony1tf 0:8c725fbd8e0e 554
tony1tf 0:8c725fbd8e0e 555 led = on;
tony1tf 0:8c725fbd8e0e 556
tony1tf 1:ba9c803c7596 557 Tone ( _Tone_Frequency, u, 1.0 );
tony1tf 0:8c725fbd8e0e 558
tony1tf 0:8c725fbd8e0e 559 led = off;
tony1tf 0:8c725fbd8e0e 560
tony1tf 0:8c725fbd8e0e 561 }
tony1tf 0:8c725fbd8e0e 562
tony1tf 0:8c725fbd8e0e 563 //==============================================================
tony1tf 0:8c725fbd8e0e 564
tony1tf 0:8c725fbd8e0e 565 void Morse_Code::dah ( ) {
tony1tf 0:8c725fbd8e0e 566
tony1tf 0:8c725fbd8e0e 567 led = on;
tony1tf 0:8c725fbd8e0e 568
tony1tf 1:ba9c803c7596 569 Tone ( _Tone_Frequency, u, 3.0 );
tony1tf 0:8c725fbd8e0e 570
tony1tf 0:8c725fbd8e0e 571 led = off;
tony1tf 0:8c725fbd8e0e 572
tony1tf 0:8c725fbd8e0e 573 }
tony1tf 0:8c725fbd8e0e 574
tony1tf 0:8c725fbd8e0e 575 //=============================================================
tony1tf 0:8c725fbd8e0e 576
tony1tf 1:ba9c803c7596 577 void Morse_Code::Tone ( int freq_factor, float duration, float multiplier ) {
tony1tf 0:8c725fbd8e0e 578
tony1tf 0:8c725fbd8e0e 579 Timer timer;
tony1tf 0:8c725fbd8e0e 580
tony1tf 0:8c725fbd8e0e 581 char i = 0;
tony1tf 1:ba9c803c7596 582 float t;
tony1tf 0:8c725fbd8e0e 583
tony1tf 0:8c725fbd8e0e 584 unsigned int delay;
tony1tf 1:ba9c803c7596 585 float amplitude = 0;
tony1tf 0:8c725fbd8e0e 586
tony1tf 0:8c725fbd8e0e 587 timer.start();
tony1tf 0:8c725fbd8e0e 588
tony1tf 0:8c725fbd8e0e 589 timer.reset();
tony1tf 0:8c725fbd8e0e 590
tony1tf 0:8c725fbd8e0e 591 do {
tony1tf 0:8c725fbd8e0e 592
tony1tf 0:8c725fbd8e0e 593 for ( i = 0; i < 32; i++ ) {
tony1tf 0:8c725fbd8e0e 594
tony1tf 1:ba9c803c7596 595 piezo = sine_wave [ i ] * amplitude;
tony1tf 0:8c725fbd8e0e 596
tony1tf 0:8c725fbd8e0e 597 for ( delay = 0; delay < freq_factor; delay++ );
tony1tf 0:8c725fbd8e0e 598
tony1tf 1:ba9c803c7596 599 } t = timer.read() ;
tony1tf 1:ba9c803c7596 600 if ( t < duration/7 ) amplitude = t * 7 / duration ;
tony1tf 1:ba9c803c7596 601 if ( t/multiplier > duration * 0.85 ) amplitude = ( ( duration - t/multiplier ) / duration ) * 8.5 ;
tony1tf 0:8c725fbd8e0e 602
tony1tf 1:ba9c803c7596 603 } while ( timer.read() < duration * multiplier );
tony1tf 0:8c725fbd8e0e 604
tony1tf 0:8c725fbd8e0e 605 }
tony1tf 0:8c725fbd8e0e 606
tony1tf 0:8c725fbd8e0e 607 //=============================================================
tony1tf 0:8c725fbd8e0e 608
tony1tf 0:8c725fbd8e0e 609
tony1tf 0:8c725fbd8e0e 610
tony1tf 0:8c725fbd8e0e 611