Morse code encoder library
morse.cpp@3:9c975c0e2342, 2014-08-07 (annotated)
- 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?
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 | 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 | } |