Morse code encoder library
morse.cpp@4:e0cc0df745ef, 2014-12-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |