Morse code encoder library

Dependents:   MIDI_CW

Committer:
ChuckTimber
Date:
Sat Dec 06 00:00:53 2014 +0000
Revision:
4:e0cc0df745ef
Parent:
3:9c975c0e2342
Analog Synth builders summit 2014 version

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