Morse code encoder library

Dependents:   MIDI_CW

Committer:
ChuckTimber
Date:
Wed Aug 06 23:45:26 2014 +0000
Revision:
2:7dc8528b23da
Parent:
1:e377d081edea
Child:
3:9c975c0e2342
Fixed documents.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ChuckTimber 0:27c38e4d6e4e 1 #include "morse.h"
ChuckTimber 0:27c38e4d6e4e 2 #include "mbed.h"
ChuckTimber 0:27c38e4d6e4e 3
ChuckTimber 0:27c38e4d6e4e 4 /** class to generate Morse code tone and keying signal.
ChuckTimber 0:27c38e4d6e4e 5 * sound with a buzzer, based on a PwmOut,
ChuckTimber 0:27c38e4d6e4e 6 * keying signal base on a DigitalOut
ChuckTimber 0:27c38e4d6e4e 7 *
ChuckTimber 0:27c38e4d6e4e 8 * Example:
ChuckTimber 0:27c38e4d6e4e 9 * @code
ChuckTimber 0:27c38e4d6e4e 10 * // Morse sample
ChuckTimber 0:27c38e4d6e4e 11 * #include "mbed.h"
ChuckTimber 0:27c38e4d6e4e 12 * #include "morse.h"
ChuckTimber 0:27c38e4d6e4e 13 *
ChuckTimber 0:27c38e4d6e4e 14 * char* codes[] = { ".-", "-...", "-.-.", "-..", ".",
ChuckTimber 0:27c38e4d6e4e 15 * "..-.", "--.", "....", "..", ".---",
ChuckTimber 0:27c38e4d6e4e 16 * "-.-", ".-..", "--", "-.", "---",
ChuckTimber 0:27c38e4d6e4e 17 * ".--.", "--.-", ".-.", "...", "-",
ChuckTimber 0:27c38e4d6e4e 18 * "..-", "...-", ".--", "-..-", "-.--", "--..", " "
ChuckTimber 0:27c38e4d6e4e 19 * };
ChuckTimber 0:27c38e4d6e4e 20 *
ChuckTimber 0:27c38e4d6e4e 21 * Morse morse;
ChuckTimber 0:27c38e4d6e4e 22 * //Morse morse(dp24, LED1);
ChuckTimber 0:27c38e4d6e4e 23 * //Morse morse(dp24, LED1, 0.1, 800);
ChuckTimber 0:27c38e4d6e4e 24 *
ChuckTimber 0:27c38e4d6e4e 25 * int main()
ChuckTimber 0:27c38e4d6e4e 26 * {
ChuckTimber 0:27c38e4d6e4e 27 * int i;
ChuckTimber 0:27c38e4d6e4e 28 *
ChuckTimber 0:27c38e4d6e4e 29 * while(1) {
ChuckTimber 0:27c38e4d6e4e 30 * for (i = 0; i < 27; i++) {
ChuckTimber 0:27c38e4d6e4e 31 * morse.code(codes[i]);
ChuckTimber 0:27c38e4d6e4e 32 * }
ChuckTimber 0:27c38e4d6e4e 33 * }
ChuckTimber 0:27c38e4d6e4e 34 * }
ChuckTimber 0:27c38e4d6e4e 35 * @endcode
ChuckTimber 0:27c38e4d6e4e 36 */
ChuckTimber 0:27c38e4d6e4e 37
ChuckTimber 1:e377d081edea 38 //
ChuckTimber 1:e377d081edea 39 // 0to127-value vs CW_tick table
ChuckTimber 1:e377d081edea 40 // =0.03*5^(1-i/128)
ChuckTimber 1:e377d081edea 41 const float Morse::table[] = { 0.15000000 ,0.14812575 ,0.14627491 ,0.14444721 ,0.14264234 ,0.14086002 ,0.13909997 ,0.13736192 ,
ChuckTimber 1:e377d081edea 42 0.13564558 ,0.13395068 ,0.13227697 ,0.13062416 ,0.12899201 ,0.12738026 ,0.12578864 ,0.12421691 ,
ChuckTimber 1:e377d081edea 43 0.12266482 ,0.12113212 ,0.11961857 ,0.11812393 ,0.11664797 ,0.11519045 ,0.11375115 ,0.11232983 ,
ChuckTimber 1:e377d081edea 44 0.11092626 ,0.10954024 ,0.10817153 ,0.10681993 ,0.10548521 ,0.10416717 ,0.10286560 ,0.10158029 ,
ChuckTimber 1:e377d081edea 45 0.10031105 ,0.09905766 ,0.09781993 ,0.09659767 ,0.09539068 ,0.09419877 ,0.09302176 ,0.09185945 ,
ChuckTimber 1:e377d081edea 46 0.09071166 ,0.08957822 ,0.08845894 ,0.08735364 ,0.08626216 ,0.08518431 ,0.08411993 ,0.08306885 ,
ChuckTimber 1:e377d081edea 47 0.08203091 ,0.08100593 ,0.07999376 ,0.07899424 ,0.07800720 ,0.07703250 ,0.07606998 ,0.07511948 ,
ChuckTimber 1:e377d081edea 48 0.07418086 ,0.07325397 ,0.07233866 ,0.07143479 ,0.07054221 ,0.06966079 ,0.06879037 ,0.06793084 ,
ChuckTimber 1:e377d081edea 49 0.06708204 ,0.06624385 ,0.06541613 ,0.06459875 ,0.06379159 ,0.06299452 ,0.06220740 ,0.06143012 ,
ChuckTimber 1:e377d081edea 50 0.06066255 ,0.05990457 ,0.05915606 ,0.05841690 ,0.05768698 ,0.05696618 ,0.05625439 ,0.05555149 ,
ChuckTimber 1:e377d081edea 51 0.05485737 ,0.05417193 ,0.05349505 ,0.05282663 ,0.05216656 ,0.05151474 ,0.05087106 ,0.05023543 ,
ChuckTimber 1:e377d081edea 52 0.04960773 ,0.04898788 ,0.04837578 ,0.04777132 ,0.04717442 ,0.04658497 ,0.04600289 ,0.04542809 ,
ChuckTimber 1:e377d081edea 53 0.04486046 ,0.04429993 ,0.04374640 ,0.04319979 ,0.04266001 ,0.04212697 ,0.04160059 ,0.04108079 ,
ChuckTimber 1:e377d081edea 54 0.04056749 ,0.04006060 ,0.03956004 ,0.03906574 ,0.03857761 ,0.03809558 ,0.03761958 ,0.03714952 ,
ChuckTimber 1:e377d081edea 55 0.03668534 ,0.03622695 ,0.03577430 ,0.03532730 ,0.03488588 ,0.03444998 ,0.03401953 ,0.03359445 ,
ChuckTimber 1:e377d081edea 56 0.03317469 ,0.03276017 ,0.03235083 ,0.03194661 ,0.03154744 ,0.03115325 ,0.03076399 ,0.03037959 };
ChuckTimber 1:e377d081edea 57
ChuckTimber 0:27c38e4d6e4e 58 /** beeping function
ChuckTimber 0:27c38e4d6e4e 59 * this is a private funciton / internal use only
ChuckTimber 0:27c38e4d6e4e 60 */
ChuckTimber 0:27c38e4d6e4e 61 void Morse::beep (int k)
ChuckTimber 0:27c38e4d6e4e 62 {
ChuckTimber 0:27c38e4d6e4e 63 _pwm.write(0.5);
ChuckTimber 2:7dc8528b23da 64 _pout = 1;
ChuckTimber 0:27c38e4d6e4e 65 wait(cw_tick * (float)k);
ChuckTimber 0:27c38e4d6e4e 66 _pwm.write(0.0);
ChuckTimber 2:7dc8528b23da 67 _pout = 0;
ChuckTimber 0:27c38e4d6e4e 68 }
ChuckTimber 0:27c38e4d6e4e 69
ChuckTimber 0:27c38e4d6e4e 70 /** spacing function
ChuckTimber 0:27c38e4d6e4e 71 * this is a private funciton / internal use only
ChuckTimber 0:27c38e4d6e4e 72 */
ChuckTimber 0:27c38e4d6e4e 73 void Morse::space(int k)
ChuckTimber 0:27c38e4d6e4e 74 {
ChuckTimber 0:27c38e4d6e4e 75 wait(cw_tick * (float)k);
ChuckTimber 0:27c38e4d6e4e 76 }
ChuckTimber 0:27c38e4d6e4e 77
ChuckTimber 0:27c38e4d6e4e 78 /** set frequency
ChuckTimber 0:27c38e4d6e4e 79 */
ChuckTimber 0:27c38e4d6e4e 80 void Morse::setfreq(float f)
ChuckTimber 0:27c38e4d6e4e 81 {
ChuckTimber 0:27c38e4d6e4e 82 freq = f;
ChuckTimber 0:27c38e4d6e4e 83 _pwm.period(1.0/freq);
ChuckTimber 0:27c38e4d6e4e 84 _pwm.write(0.0);
ChuckTimber 0:27c38e4d6e4e 85 }
ChuckTimber 0:27c38e4d6e4e 86
ChuckTimber 0:27c38e4d6e4e 87 /** get frequency
ChuckTimber 0:27c38e4d6e4e 88 */
ChuckTimber 0:27c38e4d6e4e 89 float Morse::getfreq()
ChuckTimber 0:27c38e4d6e4e 90 {
ChuckTimber 0:27c38e4d6e4e 91 return freq;
ChuckTimber 0:27c38e4d6e4e 92 }
ChuckTimber 0:27c38e4d6e4e 93
ChuckTimber 0:27c38e4d6e4e 94 /** set morse code speed
ChuckTimber 0:27c38e4d6e4e 95 */
ChuckTimber 0:27c38e4d6e4e 96 void Morse::settick(float t)
ChuckTimber 0:27c38e4d6e4e 97 {
ChuckTimber 0:27c38e4d6e4e 98 if ((t > 0.03) && (t < 0.3))
ChuckTimber 0:27c38e4d6e4e 99 cw_tick = t;
ChuckTimber 0:27c38e4d6e4e 100 }
ChuckTimber 0:27c38e4d6e4e 101
ChuckTimber 0:27c38e4d6e4e 102 /** get morse code speed
ChuckTimber 0:27c38e4d6e4e 103 */
ChuckTimber 0:27c38e4d6e4e 104 float Morse::gettick()
ChuckTimber 0:27c38e4d6e4e 105 {
ChuckTimber 0:27c38e4d6e4e 106 return cw_tick;
ChuckTimber 0:27c38e4d6e4e 107 }
ChuckTimber 0:27c38e4d6e4e 108
ChuckTimber 1:e377d081edea 109 void Morse::setidx(int idx)
ChuckTimber 1:e377d081edea 110 {
ChuckTimber 1:e377d081edea 111 tick_idx = idx;
ChuckTimber 1:e377d081edea 112 settick(table[tick_idx]);
ChuckTimber 1:e377d081edea 113 }
ChuckTimber 1:e377d081edea 114
ChuckTimber 1:e377d081edea 115 int Morse::getidx(void)
ChuckTimber 1:e377d081edea 116 {
ChuckTimber 1:e377d081edea 117 return tick_idx;
ChuckTimber 1:e377d081edea 118 }
ChuckTimber 1:e377d081edea 119
ChuckTimber 1:e377d081edea 120 void Morse::incidx(void)
ChuckTimber 1:e377d081edea 121 {
ChuckTimber 1:e377d081edea 122 tick_idx++;
ChuckTimber 1:e377d081edea 123 if (tick_idx > 127)
ChuckTimber 1:e377d081edea 124 tick_idx = 127;
ChuckTimber 1:e377d081edea 125
ChuckTimber 1:e377d081edea 126 settick(table[tick_idx]);
ChuckTimber 1:e377d081edea 127 }
ChuckTimber 1:e377d081edea 128
ChuckTimber 1:e377d081edea 129 void Morse::decidx(void)
ChuckTimber 1:e377d081edea 130 {
ChuckTimber 1:e377d081edea 131 tick_idx--;
ChuckTimber 1:e377d081edea 132 if (tick_idx < 0)
ChuckTimber 1:e377d081edea 133 tick_idx = 0;
ChuckTimber 1:e377d081edea 134
ChuckTimber 1:e377d081edea 135 settick(table[tick_idx]);
ChuckTimber 1:e377d081edea 136 }
ChuckTimber 1:e377d081edea 137
ChuckTimber 1:e377d081edea 138
ChuckTimber 0:27c38e4d6e4e 139 /** Coding function
ChuckTimber 0:27c38e4d6e4e 140 *
ChuckTimber 0:27c38e4d6e4e 141 * @param code - a pointer to code strings
ChuckTimber 0:27c38e4d6e4e 142 */
ChuckTimber 0:27c38e4d6e4e 143 void Morse::code(char* code)
ChuckTimber 0:27c38e4d6e4e 144 {
ChuckTimber 0:27c38e4d6e4e 145 char* ptr;
ChuckTimber 0:27c38e4d6e4e 146
ChuckTimber 0:27c38e4d6e4e 147 for (ptr = code; *ptr; ptr++, space(1) ) {
ChuckTimber 0:27c38e4d6e4e 148 switch (*ptr) {
ChuckTimber 0:27c38e4d6e4e 149 case '-':
ChuckTimber 0:27c38e4d6e4e 150 beep(3); // dash();
ChuckTimber 0:27c38e4d6e4e 151 break;
ChuckTimber 0:27c38e4d6e4e 152 case '.':
ChuckTimber 0:27c38e4d6e4e 153 beep(1); // dot();
ChuckTimber 0:27c38e4d6e4e 154 break;
ChuckTimber 0:27c38e4d6e4e 155 case ' ':
ChuckTimber 0:27c38e4d6e4e 156 space(7);
ChuckTimber 0:27c38e4d6e4e 157 break;
ChuckTimber 0:27c38e4d6e4e 158 default:
ChuckTimber 0:27c38e4d6e4e 159 continue;
ChuckTimber 0:27c38e4d6e4e 160 }
ChuckTimber 0:27c38e4d6e4e 161 }
ChuckTimber 0:27c38e4d6e4e 162 space(2);
ChuckTimber 0:27c38e4d6e4e 163 }
ChuckTimber 0:27c38e4d6e4e 164
ChuckTimber 0:27c38e4d6e4e 165 // constructors
ChuckTimber 0:27c38e4d6e4e 166 /** Create a Morse object connected to the specified PwmOut pin and DigitalOut pin
ChuckTimber 0:27c38e4d6e4e 167 *
ChuckTimber 0:27c38e4d6e4e 168 * @param pwm - PwmOut pin to connect to (default dp24)
ChuckTimber 0:27c38e4d6e4e 169 * @param led - DigitalOut pin to connect to (default LED1)
ChuckTimber 0:27c38e4d6e4e 170 * @param t - float t, cw tick (default 0.1sec)
ChuckTimber 0:27c38e4d6e4e 171 * @param f - float f, oscillation frequency (default 800Hz)
ChuckTimber 0:27c38e4d6e4e 172 */
ChuckTimber 0:27c38e4d6e4e 173
ChuckTimber 2:7dc8528b23da 174 Morse::Morse() : _pout( LED1 ), _pwm( dp24 )
ChuckTimber 0:27c38e4d6e4e 175 {
ChuckTimber 0:27c38e4d6e4e 176 cw_tick = 0.1;
ChuckTimber 0:27c38e4d6e4e 177 freq = 800;
ChuckTimber 0:27c38e4d6e4e 178 _pwm.period(1.0/freq);
ChuckTimber 0:27c38e4d6e4e 179 _pwm.write(0.0);
ChuckTimber 0:27c38e4d6e4e 180 }
ChuckTimber 0:27c38e4d6e4e 181
ChuckTimber 2:7dc8528b23da 182 Morse::Morse(PinName pwm, PinName led) : _pout( led ), _pwm( pwm )
ChuckTimber 0:27c38e4d6e4e 183 {
ChuckTimber 0:27c38e4d6e4e 184 cw_tick = 0.1;
ChuckTimber 0:27c38e4d6e4e 185 freq = 800;
ChuckTimber 0:27c38e4d6e4e 186 _pwm.period(1.0/freq);
ChuckTimber 0:27c38e4d6e4e 187 _pwm.write(0.0);
ChuckTimber 0:27c38e4d6e4e 188 }
ChuckTimber 0:27c38e4d6e4e 189
ChuckTimber 2:7dc8528b23da 190 Morse::Morse(PinName pwm, PinName led, float t) : _pout( led ), _pwm( pwm )
ChuckTimber 0:27c38e4d6e4e 191 {
ChuckTimber 0:27c38e4d6e4e 192 cw_tick = t;
ChuckTimber 0:27c38e4d6e4e 193 freq = 800;
ChuckTimber 0:27c38e4d6e4e 194 _pwm.period(1.0/freq);
ChuckTimber 0:27c38e4d6e4e 195 _pwm.write(0.0);
ChuckTimber 0:27c38e4d6e4e 196 }
ChuckTimber 0:27c38e4d6e4e 197
ChuckTimber 2:7dc8528b23da 198 Morse::Morse(PinName pwm, PinName led, float t, float f) : _pout( led ), _pwm( pwm )
ChuckTimber 0:27c38e4d6e4e 199 {
ChuckTimber 0:27c38e4d6e4e 200 cw_tick = t;
ChuckTimber 0:27c38e4d6e4e 201 freq = f;
ChuckTimber 0:27c38e4d6e4e 202 _pwm.period(1.0/freq);
ChuckTimber 0:27c38e4d6e4e 203 _pwm.write(0.0);
ChuckTimber 0:27c38e4d6e4e 204 }