Morse code encoder library
morse.cpp@1:e377d081edea, 2014-07-26 (annotated)
- Committer:
- ChuckTimber
- Date:
- Sat Jul 26 22:48:52 2014 +0000
- Revision:
- 1:e377d081edea
- Parent:
- 0:27c38e4d6e4e
- Child:
- 2:7dc8528b23da
Rotary Encoder introduced.
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 | 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 | 0:27c38e4d6e4e | 64 | _pin = 1; |
ChuckTimber | 0:27c38e4d6e4e | 65 | wait(cw_tick * (float)k); |
ChuckTimber | 0:27c38e4d6e4e | 66 | _pwm.write(0.0); |
ChuckTimber | 0:27c38e4d6e4e | 67 | _pin = 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 | 0:27c38e4d6e4e | 174 | Morse::Morse() : _pin( 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 | 0:27c38e4d6e4e | 182 | Morse::Morse(PinName pwm, PinName led) : _pin( 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 | 0:27c38e4d6e4e | 190 | Morse::Morse(PinName pwm, PinName led, float t) : _pin( 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 | 0:27c38e4d6e4e | 198 | Morse::Morse(PinName pwm, PinName led, float t, float f) : _pin( 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 | } |