Morse code encoder library

Dependents:   MIDI_CW

Committer:
ChuckTimber
Date:
Thu Aug 07 00:15:05 2014 +0000
Revision:
3:9c975c0e2342
Parent:
2:7dc8528b23da
Child:
4:e0cc0df745ef
Modified documentation.

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